1package ja
2
3import (
4	"testing"
5	"time"
6
7	ja_locale "github.com/go-playground/locales/ja"
8	ut "github.com/go-playground/universal-translator"
9	. "github.com/go-playground/assert/v2"
10	"github.com/go-playground/validator/v10"
11)
12
13func TestTranslations(t *testing.T) {
14
15	japanese := ja_locale.New()
16	uni := ut.New(japanese, japanese)
17	trans, _ := uni.GetTranslator("ja")
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	}
142
143	var test Test
144
145	test.Inner.EqCSFieldString = "1234"
146	test.Inner.GtCSFieldString = "1234"
147	test.Inner.GteCSFieldString = "1234"
148
149	test.MaxString = "1234"
150	test.MaxNumber = 2000
151	test.MaxMultiple = make([]string, 9)
152
153	test.LtString = "1234"
154	test.LtNumber = 6
155	test.LtMultiple = make([]string, 3)
156	test.LtTime = time.Now().Add(time.Hour * 24)
157
158	test.LteString = "1234"
159	test.LteNumber = 6
160	test.LteMultiple = make([]string, 3)
161	test.LteTime = time.Now().Add(time.Hour * 24)
162
163	test.LtFieldString = "12345"
164	test.LteFieldString = "12345"
165
166	test.LtCSFieldString = "1234"
167	test.LteCSFieldString = "1234"
168
169	test.AlphaString = "abc3"
170	test.AlphanumString = "abc3!"
171	test.NumericString = "12E.00"
172	test.NumberString = "12E"
173
174	test.Excludes = "this is some test text"
175	test.ExcludesAll = "This is Great!"
176	test.ExcludesRune = "Love it ☻"
177
178	test.ASCII = "カタカナ"
179	test.PrintableASCII = "カタカナ"
180
181	test.MultiByte = "1234feerf"
182
183	s := "toolong"
184	test.StrPtrMaxLen = &s
185	test.StrPtrLen = &s
186
187	err = validate.Struct(test)
188	NotEqual(t, err, nil)
189
190	errs, ok := err.(validator.ValidationErrors)
191	Equal(t, ok, true)
192
193	tests := []struct {
194		ns       string
195		expected string
196	}{
197		{
198			ns:       "Test.IsColor",
199			expected: "IsColorは正しい色でなければなりません",
200		},
201		{
202			ns:       "Test.MAC",
203			expected: "MACは正しいMACアドレスを含まなければなりません",
204		},
205		{
206			ns:       "Test.IPAddr",
207			expected: "IPAddrは解決可能なIPアドレスでなければなりません",
208		},
209		{
210			ns:       "Test.IPAddrv4",
211			expected: "IPAddrv4は解決可能なIPv4アドレスでなければなりません",
212		},
213		{
214			ns:       "Test.IPAddrv6",
215			expected: "IPAddrv6は解決可能なIPv6アドレスでなければなりません",
216		},
217		{
218			ns:       "Test.UDPAddr",
219			expected: "UDPAddrは正しいUDPアドレスでなければなりません",
220		},
221		{
222			ns:       "Test.UDPAddrv4",
223			expected: "UDPAddrv4は正しいIPv4のUDPアドレスでなければなりません",
224		},
225		{
226			ns:       "Test.UDPAddrv6",
227			expected: "UDPAddrv6は正しいIPv6のUDPアドレスでなければなりません",
228		},
229		{
230			ns:       "Test.TCPAddr",
231			expected: "TCPAddrは正しいTCPアドレスでなければなりません",
232		},
233		{
234			ns:       "Test.TCPAddrv4",
235			expected: "TCPAddrv4は正しいIPv4のTCPアドレスでなければなりません",
236		},
237		{
238			ns:       "Test.TCPAddrv6",
239			expected: "TCPAddrv6は正しいIPv6のTCPアドレスでなければなりません",
240		},
241		{
242			ns:       "Test.CIDR",
243			expected: "CIDRは正しいCIDR表記を含まなければなりません",
244		},
245		{
246			ns:       "Test.CIDRv4",
247			expected: "CIDRv4はIPv4アドレスの正しいCIDR表記を含まなければなりません",
248		},
249		{
250			ns:       "Test.CIDRv6",
251			expected: "CIDRv6はIPv6アドレスの正しいCIDR表記を含まなければなりません",
252		},
253		{
254			ns:       "Test.SSN",
255			expected: "SSNは正しい社会保障番号でなければなりません",
256		},
257		{
258			ns:       "Test.IP",
259			expected: "IPは正しいIPアドレスでなければなりません",
260		},
261		{
262			ns:       "Test.IPv4",
263			expected: "IPv4は正しいIPv4アドレスでなければなりません",
264		},
265		{
266			ns:       "Test.IPv6",
267			expected: "IPv6は正しいIPv6アドレスでなければなりません",
268		},
269		{
270			ns:       "Test.DataURI",
271			expected: "DataURIは正しいデータURIを含まなければなりません",
272		},
273		{
274			ns:       "Test.Latitude",
275			expected: "Latitudeは正しい緯度の座標を含まなければなりません",
276		},
277		{
278			ns:       "Test.Longitude",
279			expected: "Longitudeは正しい経度の座標を含まなければなりません",
280		},
281		{
282			ns:       "Test.MultiByte",
283			expected: "MultiByteはマルチバイト文字を含まなければなりません",
284		},
285		{
286			ns:       "Test.ASCII",
287			expected: "ASCIIはASCII文字のみを含まなければなりません",
288		},
289		{
290			ns:       "Test.PrintableASCII",
291			expected: "PrintableASCIIは印刷可能なASCII文字のみを含まなければなりません",
292		},
293		{
294			ns:       "Test.UUID",
295			expected: "UUIDは正しいUUIDでなければなりません",
296		},
297		{
298			ns:       "Test.UUID3",
299			expected: "UUID3はバージョンが3の正しいUUIDでなければなりません",
300		},
301		{
302			ns:       "Test.UUID4",
303			expected: "UUID4はバージョンが4の正しいUUIDでなければなりません",
304		},
305		{
306			ns:       "Test.UUID5",
307			expected: "UUID5はバージョンが4の正しいUUIDでなければなりません",
308		},
309		{
310			ns:       "Test.ISBN",
311			expected: "ISBNは正しいISBN番号でなければなりません",
312		},
313		{
314			ns:       "Test.ISBN10",
315			expected: "ISBN10は正しいISBN-10番号でなければなりません",
316		},
317		{
318			ns:       "Test.ISBN13",
319			expected: "ISBN13は正しいISBN-13番号でなければなりません",
320		},
321		{
322			ns:       "Test.Excludes",
323			expected: "Excludesには'text'というテキストを含むことはできません",
324		},
325		{
326			ns:       "Test.ExcludesAll",
327			expected: "ExcludesAllには'!@#$'のどれも含めることはできません",
328		},
329		{
330			ns:       "Test.ExcludesRune",
331			expected: "ExcludesRuneには'☻'を含めることはできません",
332		},
333		{
334			ns:       "Test.ContainsAny",
335			expected: "ContainsAnyは'!@#$'の少なくとも1つを含まなければなりません",
336		},
337		{
338			ns:       "Test.Contains",
339			expected: "Containsは'purpose'を含まなければなりません",
340		},
341		{
342			ns:       "Test.Base64",
343			expected: "Base64は正しいBase64文字列でなければなりません",
344		},
345		{
346			ns:       "Test.Email",
347			expected: "Emailは正しいメールアドレスでなければなりません",
348		},
349		{
350			ns:       "Test.URL",
351			expected: "URLは正しいURLでなければなりません",
352		},
353		{
354			ns:       "Test.URI",
355			expected: "URIは正しいURIでなければなりません",
356		},
357		{
358			ns:       "Test.RGBColorString",
359			expected: "RGBColorStringは正しいRGBカラーコードでなければなりません",
360		},
361		{
362			ns:       "Test.RGBAColorString",
363			expected: "RGBAColorStringは正しいRGBAカラーコードでなければなりません",
364		},
365		{
366			ns:       "Test.HSLColorString",
367			expected: "HSLColorStringは正しいHSLカラーコードでなければなりません",
368		},
369		{
370			ns:       "Test.HSLAColorString",
371			expected: "HSLAColorStringは正しいHSLAカラーコードでなければなりません",
372		},
373		{
374			ns:       "Test.HexadecimalString",
375			expected: "HexadecimalStringは正しい16進表記でなければなりません",
376		},
377		{
378			ns:       "Test.HexColorString",
379			expected: "HexColorStringは正しいHEXカラーコードでなければなりません",
380		},
381		{
382			ns:       "Test.NumberString",
383			expected: "NumberStringは正しい数でなければなりません",
384		},
385		{
386			ns:       "Test.NumericString",
387			expected: "NumericStringは正しい数字でなければなりません",
388		},
389		{
390			ns:       "Test.AlphanumString",
391			expected: "AlphanumStringはアルファベットと数字のみを含むことができます",
392		},
393		{
394			ns:       "Test.AlphaString",
395			expected: "AlphaStringはアルファベットのみを含むことができます",
396		},
397		{
398			ns:       "Test.LtFieldString",
399			expected: "LtFieldStringはMaxStringよりも小さくなければなりません",
400		},
401		{
402			ns:       "Test.LteFieldString",
403			expected: "LteFieldStringはMaxString以下でなければなりません",
404		},
405		{
406			ns:       "Test.GtFieldString",
407			expected: "GtFieldStringはMaxStringよりも大きくなければなりません",
408		},
409		{
410			ns:       "Test.GteFieldString",
411			expected: "GteFieldStringはMaxString以上でなければなりません",
412		},
413		{
414			ns:       "Test.NeFieldString",
415			expected: "NeFieldStringはEqFieldStringとは異ならなければなりません",
416		},
417		{
418			ns:       "Test.LtCSFieldString",
419			expected: "LtCSFieldStringはInner.LtCSFieldStringよりも小さくなければなりません",
420		},
421		{
422			ns:       "Test.LteCSFieldString",
423			expected: "LteCSFieldStringはInner.LteCSFieldString以下でなければなりません",
424		},
425		{
426			ns:       "Test.GtCSFieldString",
427			expected: "GtCSFieldStringはInner.GtCSFieldStringよりも大きくなければなりません",
428		},
429		{
430			ns:       "Test.GteCSFieldString",
431			expected: "GteCSFieldStringはInner.GteCSFieldString以上でなければなりません",
432		},
433		{
434			ns:       "Test.NeCSFieldString",
435			expected: "NeCSFieldStringはInner.NeCSFieldStringとは異ならなければなりません",
436		},
437		{
438			ns:       "Test.EqCSFieldString",
439			expected: "EqCSFieldStringはInner.EqCSFieldStringと等しくなければなりません",
440		},
441		{
442			ns:       "Test.EqFieldString",
443			expected: "EqFieldStringはMaxStringと等しくなければなりません",
444		},
445		{
446			ns:       "Test.GteString",
447			expected: "GteStringの長さは少なくとも3文字以上はなければなりません",
448		},
449		{
450			ns:       "Test.GteNumber",
451			expected: "GteNumberは5.56かより大きくなければなりません",
452		},
453		{
454			ns:       "Test.GteMultiple",
455			expected: "GteMultipleは少なくとも2つの項目を含まなければなりません",
456		},
457		{
458			ns:       "Test.GteTime",
459			expected: "GteTimeは現時刻以降でなければなりません",
460		},
461		{
462			ns:       "Test.GtString",
463			expected: "GtStringの長さは3文字よりも多くなければなりません",
464		},
465		{
466			ns:       "Test.GtNumber",
467			expected: "GtNumberは5.56よりも大きくなければなりません",
468		},
469		{
470			ns:       "Test.GtMultiple",
471			expected: "GtMultipleは2つの項目よりも多い項目を含まなければなりません",
472		},
473		{
474			ns:       "Test.GtTime",
475			expected: "GtTimeは現時刻よりも後でなければなりません",
476		},
477		{
478			ns:       "Test.LteString",
479			expected: "LteStringの長さは最大でも3文字でなければなりません",
480		},
481		{
482			ns:       "Test.LteNumber",
483			expected: "LteNumberは5.56かより小さくなければなりません",
484		},
485		{
486			ns:       "Test.LteMultiple",
487			expected: "LteMultipleは最大でも2つの項目を含まなければなりません",
488		},
489		{
490			ns:       "Test.LteTime",
491			expected: "LteTimeは現時刻以前でなければなりません",
492		},
493		{
494			ns:       "Test.LtString",
495			expected: "LtStringの長さは3文字よりも少なくなければなりません",
496		},
497		{
498			ns:       "Test.LtNumber",
499			expected: "LtNumberは5.56よりも小さくなければなりません",
500		},
501		{
502			ns:       "Test.LtMultiple",
503			expected: "LtMultipleは2つの項目よりも少ない項目を含まなければなりません",
504		},
505		{
506			ns:       "Test.LtTime",
507			expected: "LtTimeは現時刻よりも前でなければなりません",
508		},
509		{
510			ns:       "Test.NeString",
511			expected: "NeStringはと異ならなければなりません",
512		},
513		{
514			ns:       "Test.NeNumber",
515			expected: "NeNumberは0.00と異ならなければなりません",
516		},
517		{
518			ns:       "Test.NeMultiple",
519			expected: "NeMultipleの項目の数は0個と異ならなければなりません",
520		},
521		{
522			ns:       "Test.EqString",
523			expected: "EqStringは3と等しくありません",
524		},
525		{
526			ns:       "Test.EqNumber",
527			expected: "EqNumberは2.33と等しくありません",
528		},
529		{
530			ns:       "Test.EqMultiple",
531			expected: "EqMultipleは7と等しくありません",
532		},
533		{
534			ns:       "Test.MaxString",
535			expected: "MaxStringの長さは最大でも3文字でなければなりません",
536		},
537		{
538			ns:       "Test.MaxNumber",
539			expected: "MaxNumberは1,113.00かより小さくなければなりません",
540		},
541		{
542			ns:       "Test.MaxMultiple",
543			expected: "MaxMultipleは最大でも7つの項目を含まなければなりません",
544		},
545		{
546			ns:       "Test.MinString",
547			expected: "MinStringの長さは少なくとも1文字はなければなりません",
548		},
549		{
550			ns:       "Test.MinNumber",
551			expected: "MinNumberは1,113.00かより大きくなければなりません",
552		},
553		{
554			ns:       "Test.MinMultiple",
555			expected: "MinMultipleは少なくとも7つの項目を含まなければなりません",
556		},
557		{
558			ns:       "Test.LenString",
559			expected: "LenStringの長さは1文字でなければなりません",
560		},
561		{
562			ns:       "Test.LenNumber",
563			expected: "LenNumberは1,113.00と等しくなければなりません",
564		},
565		{
566			ns:       "Test.LenMultiple",
567			expected: "LenMultipleは7つの項目を含まなければなりません",
568		},
569		{
570			ns:       "Test.RequiredString",
571			expected: "RequiredStringは必須フィールドです",
572		},
573		{
574			ns:       "Test.RequiredNumber",
575			expected: "RequiredNumberは必須フィールドです",
576		},
577		{
578			ns:       "Test.RequiredMultiple",
579			expected: "RequiredMultipleは必須フィールドです",
580		},
581		{
582			ns:       "Test.StrPtrMinLen",
583			expected: "StrPtrMinLenの長さは少なくとも10文字はなければなりません",
584		},
585		{
586			ns:       "Test.StrPtrMaxLen",
587			expected: "StrPtrMaxLenの長さは最大でも1文字でなければなりません",
588		},
589		{
590			ns:       "Test.StrPtrLen",
591			expected: "StrPtrLenの長さは2文字でなければなりません",
592		},
593		{
594			ns:       "Test.StrPtrLt",
595			expected: "StrPtrLtの長さは1文字よりも少なくなければなりません",
596		},
597		{
598			ns:       "Test.StrPtrLte",
599			expected: "StrPtrLteの長さは最大でも1文字でなければなりません",
600		},
601		{
602			ns:       "Test.StrPtrGt",
603			expected: "StrPtrGtの長さは10文字よりも多くなければなりません",
604		},
605		{
606			ns:       "Test.StrPtrGte",
607			expected: "StrPtrGteの長さは少なくとも10文字以上はなければなりません",
608		},
609		{
610			ns:       "Test.OneOfString",
611			expected: "OneOfStringは[red green]のうちのいずれかでなければなりません",
612		},
613		{
614			ns:       "Test.OneOfInt",
615			expected: "OneOfIntは[5 63]のうちのいずれかでなければなりません",
616		},
617	}
618
619	for _, tt := range tests {
620
621		var fe validator.FieldError
622
623		for _, e := range errs {
624			if tt.ns == e.Namespace() {
625				fe = e
626				break
627			}
628		}
629
630		NotEqual(t, fe, nil)
631		Equal(t, tt.expected, fe.Translate(trans))
632	}
633
634}
635