1package zh_tw
2
3import (
4	"testing"
5	"time"
6
7	. "github.com/go-playground/assert/v2"
8	zhongwen "github.com/go-playground/locales/zh_Hant_TW"
9	ut "github.com/go-playground/universal-translator"
10	"github.com/go-playground/validator/v10"
11)
12
13func TestTranslations(t *testing.T) {
14
15	zh := zhongwen.New()
16	uni := ut.New(zh, zh)
17	trans, _ := uni.GetTranslator("zh")
18
19	validate := validator.New()
20
21	err := RegisterDefaultTranslations(validate, trans)
22	Equal(t, err, nil)
23
24	type Inner struct {
25		EqCSFieldString  string
26		NeCSFieldString  string
27		GtCSFieldString  string
28		GteCSFieldString string
29		LtCSFieldString  string
30		LteCSFieldString string
31	}
32
33	type Test struct {
34		Inner             Inner
35		RequiredString    string    `validate:"required"`
36		RequiredNumber    int       `validate:"required"`
37		RequiredMultiple  []string  `validate:"required"`
38		LenString         string    `validate:"len=1"`
39		LenNumber         float64   `validate:"len=1113.00"`
40		LenMultiple       []string  `validate:"len=7"`
41		MinString         string    `validate:"min=1"`
42		MinNumber         float64   `validate:"min=1113.00"`
43		MinMultiple       []string  `validate:"min=7"`
44		MaxString         string    `validate:"max=3"`
45		MaxNumber         float64   `validate:"max=1113.00"`
46		MaxMultiple       []string  `validate:"max=7"`
47		EqString          string    `validate:"eq=3"`
48		EqNumber          float64   `validate:"eq=2.33"`
49		EqMultiple        []string  `validate:"eq=7"`
50		NeString          string    `validate:"ne="`
51		NeNumber          float64   `validate:"ne=0.00"`
52		NeMultiple        []string  `validate:"ne=0"`
53		LtString          string    `validate:"lt=3"`
54		LtNumber          float64   `validate:"lt=5.56"`
55		LtMultiple        []string  `validate:"lt=2"`
56		LtTime            time.Time `validate:"lt"`
57		LteString         string    `validate:"lte=3"`
58		LteNumber         float64   `validate:"lte=5.56"`
59		LteMultiple       []string  `validate:"lte=2"`
60		LteTime           time.Time `validate:"lte"`
61		GtString          string    `validate:"gt=3"`
62		GtNumber          float64   `validate:"gt=5.56"`
63		GtMultiple        []string  `validate:"gt=2"`
64		GtTime            time.Time `validate:"gt"`
65		GteString         string    `validate:"gte=3"`
66		GteNumber         float64   `validate:"gte=5.56"`
67		GteMultiple       []string  `validate:"gte=2"`
68		GteTime           time.Time `validate:"gte"`
69		EqFieldString     string    `validate:"eqfield=MaxString"`
70		EqCSFieldString   string    `validate:"eqcsfield=Inner.EqCSFieldString"`
71		NeCSFieldString   string    `validate:"necsfield=Inner.NeCSFieldString"`
72		GtCSFieldString   string    `validate:"gtcsfield=Inner.GtCSFieldString"`
73		GteCSFieldString  string    `validate:"gtecsfield=Inner.GteCSFieldString"`
74		LtCSFieldString   string    `validate:"ltcsfield=Inner.LtCSFieldString"`
75		LteCSFieldString  string    `validate:"ltecsfield=Inner.LteCSFieldString"`
76		NeFieldString     string    `validate:"nefield=EqFieldString"`
77		GtFieldString     string    `validate:"gtfield=MaxString"`
78		GteFieldString    string    `validate:"gtefield=MaxString"`
79		LtFieldString     string    `validate:"ltfield=MaxString"`
80		LteFieldString    string    `validate:"ltefield=MaxString"`
81		AlphaString       string    `validate:"alpha"`
82		AlphanumString    string    `validate:"alphanum"`
83		NumericString     string    `validate:"numeric"`
84		NumberString      string    `validate:"number"`
85		HexadecimalString string    `validate:"hexadecimal"`
86		HexColorString    string    `validate:"hexcolor"`
87		RGBColorString    string    `validate:"rgb"`
88		RGBAColorString   string    `validate:"rgba"`
89		HSLColorString    string    `validate:"hsl"`
90		HSLAColorString   string    `validate:"hsla"`
91		Email             string    `validate:"email"`
92		URL               string    `validate:"url"`
93		URI               string    `validate:"uri"`
94		Base64            string    `validate:"base64"`
95		Contains          string    `validate:"contains=purpose"`
96		ContainsAny       string    `validate:"containsany=!@#$"`
97		Excludes          string    `validate:"excludes=text"`
98		ExcludesAll       string    `validate:"excludesall=!@#$"`
99		ExcludesRune      string    `validate:"excludesrune=☻"`
100		ISBN              string    `validate:"isbn"`
101		ISBN10            string    `validate:"isbn10"`
102		ISBN13            string    `validate:"isbn13"`
103		UUID              string    `validate:"uuid"`
104		UUID3             string    `validate:"uuid3"`
105		UUID4             string    `validate:"uuid4"`
106		UUID5             string    `validate:"uuid5"`
107		ASCII             string    `validate:"ascii"`
108		PrintableASCII    string    `validate:"printascii"`
109		MultiByte         string    `validate:"multibyte"`
110		DataURI           string    `validate:"datauri"`
111		Latitude          string    `validate:"latitude"`
112		Longitude         string    `validate:"longitude"`
113		SSN               string    `validate:"ssn"`
114		IP                string    `validate:"ip"`
115		IPv4              string    `validate:"ipv4"`
116		IPv6              string    `validate:"ipv6"`
117		CIDR              string    `validate:"cidr"`
118		CIDRv4            string    `validate:"cidrv4"`
119		CIDRv6            string    `validate:"cidrv6"`
120		TCPAddr           string    `validate:"tcp_addr"`
121		TCPAddrv4         string    `validate:"tcp4_addr"`
122		TCPAddrv6         string    `validate:"tcp6_addr"`
123		UDPAddr           string    `validate:"udp_addr"`
124		UDPAddrv4         string    `validate:"udp4_addr"`
125		UDPAddrv6         string    `validate:"udp6_addr"`
126		IPAddr            string    `validate:"ip_addr"`
127		IPAddrv4          string    `validate:"ip4_addr"`
128		IPAddrv6          string    `validate:"ip6_addr"`
129		UinxAddr          string    `validate:"unix_addr"` // can't fail from within Go's net package currently, but maybe in the future
130		MAC               string    `validate:"mac"`
131		IsColor           string    `validate:"iscolor"`
132		StrPtrMinLen      *string   `validate:"min=10"`
133		StrPtrMaxLen      *string   `validate:"max=1"`
134		StrPtrLen         *string   `validate:"len=2"`
135		StrPtrLt          *string   `validate:"lt=1"`
136		StrPtrLte         *string   `validate:"lte=1"`
137		StrPtrGt          *string   `validate:"gt=10"`
138		StrPtrGte         *string   `validate:"gte=10"`
139		OneOfString       string    `validate:"oneof=red green"`
140		OneOfInt          int       `validate:"oneof=5 63"`
141		Datetime          string    `validate:"datetime=2006-01-02"`
142	}
143
144	var test Test
145
146	test.Inner.EqCSFieldString = "1234"
147	test.Inner.GtCSFieldString = "1234"
148	test.Inner.GteCSFieldString = "1234"
149
150	test.MaxString = "1234"
151	test.MaxNumber = 2000
152	test.MaxMultiple = make([]string, 9)
153
154	test.LtString = "1234"
155	test.LtNumber = 6
156	test.LtMultiple = make([]string, 3)
157	test.LtTime = time.Now().Add(time.Hour * 24)
158
159	test.LteString = "1234"
160	test.LteNumber = 6
161	test.LteMultiple = make([]string, 3)
162	test.LteTime = time.Now().Add(time.Hour * 24)
163
164	test.LtFieldString = "12345"
165	test.LteFieldString = "12345"
166
167	test.LtCSFieldString = "1234"
168	test.LteCSFieldString = "1234"
169
170	test.AlphaString = "abc3"
171	test.AlphanumString = "abc3!"
172	test.NumericString = "12E.00"
173	test.NumberString = "12E"
174
175	test.Excludes = "this is some test text"
176	test.ExcludesAll = "This is Great!"
177	test.ExcludesRune = "Love it ☻"
178
179	test.ASCII = "カタカナ"
180	test.PrintableASCII = "カタカナ"
181
182	test.MultiByte = "1234feerf"
183
184	s := "toolong"
185	test.StrPtrMaxLen = &s
186	test.StrPtrLen = &s
187
188	test.Datetime = "2008-Feb-01"
189
190	err = validate.Struct(test)
191	NotEqual(t, err, nil)
192
193	errs, ok := err.(validator.ValidationErrors)
194	Equal(t, ok, true)
195
196	tests := []struct {
197		ns       string
198		expected string
199	}{
200		{
201			ns:       "Test.IsColor",
202			expected: "IsColor必須是一個有效的顏色",
203		},
204		{
205			ns:       "Test.MAC",
206			expected: "MAC必須是一個有效的MAC地址",
207		},
208		{
209			ns:       "Test.IPAddr",
210			expected: "IPAddr必須是一個有效的IP地址",
211		},
212		{
213			ns:       "Test.IPAddrv4",
214			expected: "IPAddrv4必須是一個有效的IPv4地址",
215		},
216		{
217			ns:       "Test.IPAddrv6",
218			expected: "IPAddrv6必須是一個有效的IPv6地址",
219		},
220		{
221			ns:       "Test.UDPAddr",
222			expected: "UDPAddr必須是一個有效的UDP地址",
223		},
224		{
225			ns:       "Test.UDPAddrv4",
226			expected: "UDPAddrv4必須是一個有效的IPv4 UDP地址",
227		},
228		{
229			ns:       "Test.UDPAddrv6",
230			expected: "UDPAddrv6必須是一個有效的IPv6 UDP地址",
231		},
232		{
233			ns:       "Test.TCPAddr",
234			expected: "TCPAddr必須是一個有效的TCP地址",
235		},
236		{
237			ns:       "Test.TCPAddrv4",
238			expected: "TCPAddrv4必須是一個有效的IPv4 TCP地址",
239		},
240		{
241			ns:       "Test.TCPAddrv6",
242			expected: "TCPAddrv6必須是一個有效的IPv6 TCP地址",
243		},
244		{
245			ns:       "Test.CIDR",
246			expected: "CIDR必須是一個有效的無類別域間路由(CIDR)",
247		},
248		{
249			ns:       "Test.CIDRv4",
250			expected: "CIDRv4必須是一个包含IPv4地址的有效無類別域間路由(CIDR)",
251		},
252		{
253			ns:       "Test.CIDRv6",
254			expected: "CIDRv6必須是一个包含IPv6地址的有效無類別域間路由(CIDR)",
255		},
256		{
257			ns:       "Test.SSN",
258			expected: "SSN必須是一個有效的社會安全編號(SSN)",
259		},
260		{
261			ns:       "Test.IP",
262			expected: "IP必須是一個有效的IP地址",
263		},
264		{
265			ns:       "Test.IPv4",
266			expected: "IPv4必須是一個有效的IPv4地址",
267		},
268		{
269			ns:       "Test.IPv6",
270			expected: "IPv6必須是一個有效的IPv6地址",
271		},
272		{
273			ns:       "Test.DataURI",
274			expected: "DataURI必須包含有效的數據URI",
275		},
276		{
277			ns:       "Test.Latitude",
278			expected: "Latitude必須包含有效的緯度座標",
279		},
280		{
281			ns:       "Test.Longitude",
282			expected: "Longitude必須包含有效的經度座標",
283		},
284		{
285			ns:       "Test.MultiByte",
286			expected: "MultiByte必須包含多個字元",
287		},
288		{
289			ns:       "Test.ASCII",
290			expected: "ASCII必須只包含ascii字元",
291		},
292		{
293			ns:       "Test.PrintableASCII",
294			expected: "PrintableASCII必須只包含可輸出的ascii字元",
295		},
296		{
297			ns:       "Test.UUID",
298			expected: "UUID必須是一個有效的UUID",
299		},
300		{
301			ns:       "Test.UUID3",
302			expected: "UUID3必須是一個有效的V3 UUID",
303		},
304		{
305			ns:       "Test.UUID4",
306			expected: "UUID4必須是一個有效的V4 UUID",
307		},
308		{
309			ns:       "Test.UUID5",
310			expected: "UUID5必須是一個有效的V5 UUID",
311		},
312		{
313			ns:       "Test.ISBN",
314			expected: "ISBN必須是一個有效的ISBN編號",
315		},
316		{
317			ns:       "Test.ISBN10",
318			expected: "ISBN10必須是一個有效的ISBN-10編號",
319		},
320		{
321			ns:       "Test.ISBN13",
322			expected: "ISBN13必須是一個有效的ISBN-13編號",
323		},
324		{
325			ns:       "Test.Excludes",
326			expected: "Excludes不能包含文字'text'",
327		},
328		{
329			ns:       "Test.ExcludesAll",
330			expected: "ExcludesAll不能包含以下任何字元'!@#$'",
331		},
332		{
333			ns:       "Test.ExcludesRune",
334			expected: "ExcludesRune不能包含'☻'",
335		},
336		{
337			ns:       "Test.ContainsAny",
338			expected: "ContainsAny必須包含至少一個以下字元'!@#$'",
339		},
340		{
341			ns:       "Test.Contains",
342			expected: "Contains必須包含文字'purpose'",
343		},
344		{
345			ns:       "Test.Base64",
346			expected: "Base64必須是一個有效的Base64字元串",
347		},
348		{
349			ns:       "Test.Email",
350			expected: "Email必須是一個有效的信箱",
351		},
352		{
353			ns:       "Test.URL",
354			expected: "URL必須是一個有效的URL",
355		},
356		{
357			ns:       "Test.URI",
358			expected: "URI必須是一個有效的URI",
359		},
360		{
361			ns:       "Test.RGBColorString",
362			expected: "RGBColorString必須是一個有效的RGB顏色",
363		},
364		{
365			ns:       "Test.RGBAColorString",
366			expected: "RGBAColorString必須是一個有效的RGBA顏色",
367		},
368		{
369			ns:       "Test.HSLColorString",
370			expected: "HSLColorString必須是一個有效的HSL顏色",
371		},
372		{
373			ns:       "Test.HSLAColorString",
374			expected: "HSLAColorString必須是一個有效的HSLA顏色",
375		},
376		{
377			ns:       "Test.HexadecimalString",
378			expected: "HexadecimalString必須是一個有效的十六進制",
379		},
380		{
381			ns:       "Test.HexColorString",
382			expected: "HexColorString必須是一個有效的十六進制顏色",
383		},
384		{
385			ns:       "Test.NumberString",
386			expected: "NumberString必須是一個有效的數字",
387		},
388		{
389			ns:       "Test.NumericString",
390			expected: "NumericString必須是一個有效的數值",
391		},
392		{
393			ns:       "Test.AlphanumString",
394			expected: "AlphanumString只能包含字母和數字",
395		},
396		{
397			ns:       "Test.AlphaString",
398			expected: "AlphaString只能包含字母",
399		},
400		{
401			ns:       "Test.LtFieldString",
402			expected: "LtFieldString必須小於MaxString",
403		},
404		{
405			ns:       "Test.LteFieldString",
406			expected: "LteFieldString必須小於或等於MaxString",
407		},
408		{
409			ns:       "Test.GtFieldString",
410			expected: "GtFieldString必須大於MaxString",
411		},
412		{
413			ns:       "Test.GteFieldString",
414			expected: "GteFieldString必須大於或等於MaxString",
415		},
416		{
417			ns:       "Test.NeFieldString",
418			expected: "NeFieldString不能等於EqFieldString",
419		},
420		{
421			ns:       "Test.LtCSFieldString",
422			expected: "LtCSFieldString必須小於Inner.LtCSFieldString",
423		},
424		{
425			ns:       "Test.LteCSFieldString",
426			expected: "LteCSFieldString必須小於或等於Inner.LteCSFieldString",
427		},
428		{
429			ns:       "Test.GtCSFieldString",
430			expected: "GtCSFieldString必須大於Inner.GtCSFieldString",
431		},
432		{
433			ns:       "Test.GteCSFieldString",
434			expected: "GteCSFieldString必須大於或等於Inner.GteCSFieldString",
435		},
436		{
437			ns:       "Test.NeCSFieldString",
438			expected: "NeCSFieldString不能等於Inner.NeCSFieldString",
439		},
440		{
441			ns:       "Test.EqCSFieldString",
442			expected: "EqCSFieldString必須等於Inner.EqCSFieldString",
443		},
444		{
445			ns:       "Test.EqFieldString",
446			expected: "EqFieldString必須等於MaxString",
447		},
448		{
449			ns:       "Test.GteString",
450			expected: "GteString長度必須至少為3個字元",
451		},
452		{
453			ns:       "Test.GteNumber",
454			expected: "GteNumber必須大於或等於5.56",
455		},
456		{
457			ns:       "Test.GteMultiple",
458			expected: "GteMultiple必須至少包含2項",
459		},
460		{
461			ns:       "Test.GteTime",
462			expected: "GteTime必須大於或等於目前日期和時間",
463		},
464		{
465			ns:       "Test.GtString",
466			expected: "GtString長度必須大於3個字元",
467		},
468		{
469			ns:       "Test.GtNumber",
470			expected: "GtNumber必須大於5.56",
471		},
472		{
473			ns:       "Test.GtMultiple",
474			expected: "GtMultiple必須大於2項",
475		},
476		{
477			ns:       "Test.GtTime",
478			expected: "GtTime必須大於目前日期和時間",
479		},
480		{
481			ns:       "Test.LteString",
482			expected: "LteString長度不能超過3個字元",
483		},
484		{
485			ns:       "Test.LteNumber",
486			expected: "LteNumber必須小於或等於5.56",
487		},
488		{
489			ns:       "Test.LteMultiple",
490			expected: "LteMultiple最多只能包含2項",
491		},
492		{
493			ns:       "Test.LteTime",
494			expected: "LteTime必須小於或等於目前日期和時間",
495		},
496		{
497			ns:       "Test.LtString",
498			expected: "LtString長度必須小於3個字元",
499		},
500		{
501			ns:       "Test.LtNumber",
502			expected: "LtNumber必須小於5.56",
503		},
504		{
505			ns:       "Test.LtMultiple",
506			expected: "LtMultiple必須包含少於2項",
507		},
508		{
509			ns:       "Test.LtTime",
510			expected: "LtTime必須小於目前日期和時間",
511		},
512		{
513			ns:       "Test.NeString",
514			expected: "NeString不能等於",
515		},
516		{
517			ns:       "Test.NeNumber",
518			expected: "NeNumber不能等於0.00",
519		},
520		{
521			ns:       "Test.NeMultiple",
522			expected: "NeMultiple不能等於0",
523		},
524		{
525			ns:       "Test.EqString",
526			expected: "EqString不等於3",
527		},
528		{
529			ns:       "Test.EqNumber",
530			expected: "EqNumber不等於2.33",
531		},
532		{
533			ns:       "Test.EqMultiple",
534			expected: "EqMultiple不等於7",
535		},
536		{
537			ns:       "Test.MaxString",
538			expected: "MaxString長度不能超過3個字元",
539		},
540		{
541			ns:       "Test.MaxNumber",
542			expected: "MaxNumber必須小於或等於1,113.00",
543		},
544		{
545			ns:       "Test.MaxMultiple",
546			expected: "MaxMultiple最多只能包含7項",
547		},
548		{
549			ns:       "Test.MinString",
550			expected: "MinString長度必須至少為1個字元",
551		},
552		{
553			ns:       "Test.MinNumber",
554			expected: "MinNumber最小只能為1,113.00",
555		},
556		{
557			ns:       "Test.MinMultiple",
558			expected: "MinMultiple必須至少包含7項",
559		},
560		{
561			ns:       "Test.LenString",
562			expected: "LenString長度必須為1個字元",
563		},
564		{
565			ns:       "Test.LenNumber",
566			expected: "LenNumber必須等於1,113.00",
567		},
568		{
569			ns:       "Test.LenMultiple",
570			expected: "LenMultiple必須包含7項",
571		},
572		{
573			ns:       "Test.RequiredString",
574			expected: "RequiredString為必填欄位",
575		},
576		{
577			ns:       "Test.RequiredNumber",
578			expected: "RequiredNumber為必填欄位",
579		},
580		{
581			ns:       "Test.RequiredMultiple",
582			expected: "RequiredMultiple為必填欄位",
583		},
584		{
585			ns:       "Test.StrPtrMinLen",
586			expected: "StrPtrMinLen長度必須至少為10個字元",
587		},
588		{
589			ns:       "Test.StrPtrMaxLen",
590			expected: "StrPtrMaxLen長度不能超過1個字元",
591		},
592		{
593			ns:       "Test.StrPtrLen",
594			expected: "StrPtrLen長度必須為2個字元",
595		},
596		{
597			ns:       "Test.StrPtrLt",
598			expected: "StrPtrLt長度必須小於1個字元",
599		},
600		{
601			ns:       "Test.StrPtrLte",
602			expected: "StrPtrLte長度不能超過1個字元",
603		},
604		{
605			ns:       "Test.StrPtrGt",
606			expected: "StrPtrGt長度必須大於10個字元",
607		},
608		{
609			ns:       "Test.StrPtrGte",
610			expected: "StrPtrGte長度必須至少為10個字元",
611		},
612		{
613			ns:       "Test.OneOfString",
614			expected: "OneOfString必須是[red green]中的一個",
615		},
616		{
617			ns:       "Test.OneOfInt",
618			expected: "OneOfInt必須是[5 63]中的一個",
619		},
620		{
621			ns:       "Test.Datetime",
622			expected: "Datetime與2006-01-02格式不匹配",
623		},
624	}
625
626	for _, tt := range tests {
627
628		var fe validator.FieldError
629
630		for _, e := range errs {
631			if tt.ns == e.Namespace() {
632				fe = e
633				break
634			}
635		}
636
637		NotEqual(t, fe, nil)
638		Equal(t, tt.expected, fe.Translate(trans))
639	}
640
641}
642