// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package packet

import (
	"testing"
)

var userIdTests = []struct {
	id                   string
	name, comment, email string
}{
	{"", "", "", ""},
	{"John Smith", "John Smith", "", ""},
	{"John Smith ()", "John Smith", "", ""},
	{"John Smith () <>", "John Smith", "", ""},
	{"(comment", "", "comment", ""},
	{"(comment)", "", "comment", ""},
	{"<email", "", "", "email"},
	{"<email>   sdfk", "", "", "email"},
	{"  John Smith  (  Comment ) asdkflj < email > lksdfj", "John Smith", "Comment", "email"},
	{"  John Smith  < email > lksdfj", "John Smith", "", "email"},
	{"(<foo", "", "<foo", ""},
	{"René Descartes (العربي)", "René Descartes", "العربي", ""},
	{"John@Smith", "", "", "John@Smith"},
}

func TestParseUserId(t *testing.T) {
	for i, test := range userIdTests {
		name, comment, email := parseUserId(test.id)
		if name != test.name {
			t.Errorf("%d: name mismatch got:%s want:%s", i, name, test.name)
		}
		if comment != test.comment {
			t.Errorf("%d: comment mismatch got:%s want:%s", i, comment, test.comment)
		}
		if email != test.email {
			t.Errorf("%d: email mismatch got:%s want:%s", i, email, test.email)
		}
	}
}

var newUserIdTests = []struct {
	name, comment, email, id string
}{
	{"foo", "", "", "foo"},
	{"", "bar", "", "(bar)"},
	{"", "", "baz", "<baz>"},
	{"foo", "bar", "", "foo (bar)"},
	{"foo", "", "baz", "foo <baz>"},
	{"", "bar", "baz", "(bar) <baz>"},
	{"foo", "bar", "baz", "foo (bar) <baz>"},
}

func TestNewUserId(t *testing.T) {
	for i, test := range newUserIdTests {
		uid := NewUserId(test.name, test.comment, test.email)
		if uid == nil {
			t.Errorf("#%d: returned nil", i)
			continue
		}
		if uid.Id != test.id {
			t.Errorf("#%d: got '%s', want '%s'", i, uid.Id, test.id)
		}
	}
}

var invalidNewUserIdTests = []struct {
	name, comment, email string
}{
	{"foo(", "", ""},
	{"foo<", "", ""},
	{"", "bar)", ""},
	{"", "bar<", ""},
	{"", "", "baz>"},
	{"", "", "baz)"},
	{"", "", "baz\x00"},
}

func TestNewUserIdWithInvalidInput(t *testing.T) {
	for i, test := range invalidNewUserIdTests {
		if uid := NewUserId(test.name, test.comment, test.email); uid != nil {
			t.Errorf("#%d: returned non-nil value: %#v", i, uid)
		}
	}
}
