package stanza

import (
	"testing"
)

func TestValidJids(t *testing.T) {
	tests := []struct {
		jidstr   string
		expected Jid
	}{
		{jidstr: "test@domain.com", expected: Jid{"test", "domain.com", ""}},
		{jidstr: "test@domain.com/resource", expected: Jid{"test", "domain.com", "resource"}},
		// resource can contain '/' or '@'
		{jidstr: "test@domain.com/a/b", expected: Jid{"test", "domain.com", "a/b"}},
		{jidstr: "test@domain.com/a@b", expected: Jid{"test", "domain.com", "a@b"}},
		{jidstr: "domain.com", expected: Jid{"", "domain.com", ""}},
	}

	for _, tt := range tests {
		jid, err := NewJid(tt.jidstr)
		if err != nil {
			t.Errorf("could not parse correct jid: %s", tt.jidstr)
			continue
		}

		if jid == nil {
			t.Error("jid should not be nil")
		}

		if jid.Node != tt.expected.Node {
			t.Errorf("incorrect jid Node (%s): %s", tt.expected.Node, jid.Node)
		}

		if jid.Node != tt.expected.Node {
			t.Errorf("incorrect jid domain (%s): %s", tt.expected.Domain, jid.Domain)
		}

		if jid.Resource != tt.expected.Resource {
			t.Errorf("incorrect jid resource (%s): %s", tt.expected.Resource, jid.Resource)
		}
	}
}

func TestIncorrectJids(t *testing.T) {
	badJids := []string{
		"",
		"user@",
		"@domain.com",
		"user:name@domain.com",
		"user<name@domain.com",
		"test@domain.com@otherdomain.com",
		"test@domain com/resource",
	}

	for _, sjid := range badJids {
		if _, err := NewJid(sjid); err == nil {
			t.Error("parsing incorrect jid should return error: " + sjid)
		}
	}
}

func TestFull(t *testing.T) {
	fullJids := []string{
		"test@domain.com/my resource",
		"test@domain.com",
		"domain.com",
	}
	for _, sjid := range fullJids {
		parsedJid, err := NewJid(sjid)
		if err != nil {
			t.Errorf("could not parse jid: %v", err)
		}
		fullJid := parsedJid.Full()
		if fullJid != sjid {
			t.Errorf("incorrect full jid: %s", fullJid)
		}
	}
}

func TestBare(t *testing.T) {
	tests := []struct {
		jidstr   string
		expected string
	}{
		{jidstr: "test@domain.com", expected: "test@domain.com"},
		{jidstr: "test@domain.com/resource", expected: "test@domain.com"},
		{jidstr: "domain.com", expected: "domain.com"},
	}

	for _, tt := range tests {
		parsedJid, err := NewJid(tt.jidstr)
		if err != nil {
			t.Errorf("could not parse jid: %v", err)
		}
		bareJid := parsedJid.Bare()
		if bareJid != tt.expected {
			t.Errorf("incorrect bare jid: %s", bareJid)
		}
	}
}