1package i18n
2
3import (
4	"reflect"
5	"testing"
6)
7
8func TestNewMessage(t *testing.T) {
9	tests := []struct {
10		name    string
11		data    interface{}
12		message *Message
13		err     error
14	}{
15		{
16			name: "string",
17			data: "other",
18			message: &Message{
19				Other: "other",
20			},
21		},
22		{
23			name: "nil value",
24			data: map[interface{}]interface{}{
25				"ID":    "id",
26				"Zero":  nil,
27				"Other": "other",
28			},
29			message: &Message{
30				ID:    "id",
31				Other: "other",
32			},
33		},
34		{
35			name: "map[string]string",
36			data: map[string]string{
37				"ID":          "id",
38				"Hash":        "hash",
39				"Description": "description",
40				"LeftDelim":   "leftdelim",
41				"RightDelim":  "rightdelim",
42				"Zero":        "zero",
43				"One":         "one",
44				"Two":         "two",
45				"Few":         "few",
46				"Many":        "many",
47				"Other":       "other",
48			},
49			message: &Message{
50				ID:          "id",
51				Hash:        "hash",
52				Description: "description",
53				LeftDelim:   "leftdelim",
54				RightDelim:  "rightdelim",
55				Zero:        "zero",
56				One:         "one",
57				Two:         "two",
58				Few:         "few",
59				Many:        "many",
60				Other:       "other",
61			},
62		},
63		{
64			name: "map[string]interface{}",
65			data: map[string]interface{}{
66				"ID":          "id",
67				"Hash":        "hash",
68				"Description": "description",
69				"LeftDelim":   "leftdelim",
70				"RightDelim":  "rightdelim",
71				"Zero":        "zero",
72				"One":         "one",
73				"Two":         "two",
74				"Few":         "few",
75				"Many":        "many",
76				"Other":       "other",
77			},
78			message: &Message{
79				ID:          "id",
80				Hash:        "hash",
81				Description: "description",
82				LeftDelim:   "leftdelim",
83				RightDelim:  "rightdelim",
84				Zero:        "zero",
85				One:         "one",
86				Two:         "two",
87				Few:         "few",
88				Many:        "many",
89				Other:       "other",
90			},
91		},
92		{
93			name: "map[interface{}]interface{}",
94			data: map[interface{}]interface{}{
95				"ID":          "id",
96				"Hash":        "hash",
97				"Description": "description",
98				"LeftDelim":   "leftdelim",
99				"RightDelim":  "rightdelim",
100				"Zero":        "zero",
101				"One":         "one",
102				"Two":         "two",
103				"Few":         "few",
104				"Many":        "many",
105				"Other":       "other",
106			},
107			message: &Message{
108				ID:          "id",
109				Hash:        "hash",
110				Description: "description",
111				LeftDelim:   "leftdelim",
112				RightDelim:  "rightdelim",
113				Zero:        "zero",
114				One:         "one",
115				Two:         "two",
116				Few:         "few",
117				Many:        "many",
118				Other:       "other",
119			},
120		},
121		{
122			name: "map[int]int",
123			data: map[interface{}]interface{}{
124				1: 2,
125			},
126			err: &keyTypeErr{key: 1},
127		},
128		{
129			name: "int",
130			data: 1,
131			err:  &valueTypeErr{value: 1},
132		},
133	}
134
135	for _, test := range tests {
136		t.Run(test.name, func(t *testing.T) {
137			actual, err := NewMessage(test.data)
138			if !reflect.DeepEqual(err, test.err) {
139				t.Fatalf("expected %#v; got %#v", test.err, err)
140			}
141			if !reflect.DeepEqual(actual, test.message) {
142				t.Fatalf("\nexpected\n%#v\ngot\n%#v", test.message, actual)
143			}
144		})
145	}
146}
147
148func TestKeyTypeErr(t *testing.T) {
149	expected := "expected key to be a string but got 1"
150	if actual := (&keyTypeErr{key: 1}).Error(); actual != expected {
151		t.Fatalf("expected %#v; got %#v", expected, actual)
152	}
153}
154
155func TestValueTypeErr(t *testing.T) {
156	expected := "unsupported type 1"
157	if actual := (&valueTypeErr{value: 1}).Error(); actual != expected {
158		t.Fatalf("expected %#v; got %#v", expected, actual)
159	}
160}
161