1 package vi
2
3 import (
4 "testing"
5 "time"
6
7 . "github.com/go-playground/assert/v2"
8 vietnamese "github.com/go-playground/locales/vi"
9 ut "github.com/go-playground/universal-translator"
10 "github.com/go-playground/validator/v10"
11 )
12
13 func TestTranslations(t *testing.T) {
14 vie := vietnamese.New()
15 uni := ut.New(vie, vie)
16 trans, _ := uni.GetTranslator("vi")
17
18 validate := validator.New()
19
20 err := RegisterDefaultTranslations(validate, trans)
21 Equal(t, err, nil)
22
23 type Inner struct {
24 EqCSFieldString string
25 NeCSFieldString string
26 GtCSFieldString string
27 GteCSFieldString string
28 LtCSFieldString string
29 LteCSFieldString string
30 }
31
32 type Test struct {
33 Inner Inner
34 RequiredString string `validate:"required"`
35 RequiredNumber int `validate:"required"`
36 RequiredMultiple []string `validate:"required"`
37 LenString string `validate:"len=1"`
38 LenNumber float64 `validate:"len=1113.00"`
39 LenMultiple []string `validate:"len=7"`
40 MinString string `validate:"min=1"`
41 MinNumber float64 `validate:"min=1113.00"`
42 MinMultiple []string `validate:"min=7"`
43 MaxString string `validate:"max=3"`
44 MaxNumber float64 `validate:"max=1113.00"`
45 MaxMultiple []string `validate:"max=7"`
46 EqString string `validate:"eq=3"`
47 EqNumber float64 `validate:"eq=2.33"`
48 EqMultiple []string `validate:"eq=7"`
49 NeString string `validate:"ne="`
50 NeNumber float64 `validate:"ne=0.00"`
51 NeMultiple []string `validate:"ne=0"`
52 LtString string `validate:"lt=3"`
53 LtNumber float64 `validate:"lt=5.56"`
54 LtMultiple []string `validate:"lt=2"`
55 LtTime time.Time `validate:"lt"`
56 LteString string `validate:"lte=3"`
57 LteNumber float64 `validate:"lte=5.56"`
58 LteMultiple []string `validate:"lte=2"`
59 LteTime time.Time `validate:"lte"`
60 GtString string `validate:"gt=3"`
61 GtNumber float64 `validate:"gt=5.56"`
62 GtMultiple []string `validate:"gt=2"`
63 GtTime time.Time `validate:"gt"`
64 GteString string `validate:"gte=3"`
65 GteNumber float64 `validate:"gte=5.56"`
66 GteMultiple []string `validate:"gte=2"`
67 GteTime time.Time `validate:"gte"`
68 EqFieldString string `validate:"eqfield=MaxString"`
69 EqCSFieldString string `validate:"eqcsfield=Inner.EqCSFieldString"`
70 NeCSFieldString string `validate:"necsfield=Inner.NeCSFieldString"`
71 GtCSFieldString string `validate:"gtcsfield=Inner.GtCSFieldString"`
72 GteCSFieldString string `validate:"gtecsfield=Inner.GteCSFieldString"`
73 LtCSFieldString string `validate:"ltcsfield=Inner.LtCSFieldString"`
74 LteCSFieldString string `validate:"ltecsfield=Inner.LteCSFieldString"`
75 NeFieldString string `validate:"nefield=EqFieldString"`
76 GtFieldString string `validate:"gtfield=MaxString"`
77 GteFieldString string `validate:"gtefield=MaxString"`
78 LtFieldString string `validate:"ltfield=MaxString"`
79 LteFieldString string `validate:"ltefield=MaxString"`
80 AlphaString string `validate:"alpha"`
81 AlphanumString string `validate:"alphanum"`
82 NumericString string `validate:"numeric"`
83 NumberString string `validate:"number"`
84 HexadecimalString string `validate:"hexadecimal"`
85 HexColorString string `validate:"hexcolor"`
86 RGBColorString string `validate:"rgb"`
87 RGBAColorString string `validate:"rgba"`
88 HSLColorString string `validate:"hsl"`
89 HSLAColorString string `validate:"hsla"`
90 Email string `validate:"email"`
91 URL string `validate:"url"`
92 URI string `validate:"uri"`
93 Base64 string `validate:"base64"`
94 Contains string `validate:"contains=purpose"`
95 ContainsAny string `validate:"containsany=!@#$"`
96 Excludes string `validate:"excludes=text"`
97 ExcludesAll string `validate:"excludesall=!@#$"`
98 ExcludesRune string `validate:"excludesrune=☻"`
99 ISBN string `validate:"isbn"`
100 ISBN10 string `validate:"isbn10"`
101 ISBN13 string `validate:"isbn13"`
102 ISSN string `validate:"issn"`
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"`
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 UniqueSlice []string `validate:"unique"`
142 UniqueArray [3]string `validate:"unique"`
143 UniqueMap map[string]string `validate:"unique"`
144 JSONString string `validate:"json"`
145 JWTString string `validate:"jwt"`
146 LowercaseString string `validate:"lowercase"`
147 UppercaseString string `validate:"uppercase"`
148 Datetime string `validate:"datetime=2006-01-02"`
149 PostCode string `validate:"postcode_iso3166_alpha2=SG"`
150 PostCodeCountry string
151 PostCodeByField string `validate:"postcode_iso3166_alpha2_field=PostCodeCountry"`
152 Image string `validate:"image"`
153 }
154
155 var test Test
156
157 test.Inner.EqCSFieldString = "1234"
158 test.Inner.GtCSFieldString = "1234"
159 test.Inner.GteCSFieldString = "1234"
160
161 test.MaxString = "1234"
162 test.MaxNumber = 2000
163 test.MaxMultiple = make([]string, 9)
164
165 test.LtString = "1234"
166 test.LtNumber = 6
167 test.LtMultiple = make([]string, 3)
168 test.LtTime = time.Now().Add(time.Hour * 24)
169
170 test.LteString = "1234"
171 test.LteNumber = 6
172 test.LteMultiple = make([]string, 3)
173 test.LteTime = time.Now().Add(time.Hour * 24)
174
175 test.LtFieldString = "12345"
176 test.LteFieldString = "12345"
177
178 test.LtCSFieldString = "1234"
179 test.LteCSFieldString = "1234"
180
181 test.AlphaString = "abc3"
182 test.AlphanumString = "abc3!"
183 test.NumericString = "12E.00"
184 test.NumberString = "12E"
185
186 test.Excludes = "this is some test text"
187 test.ExcludesAll = "This is Great!"
188 test.ExcludesRune = "Love it ☻"
189
190 test.ASCII = "カタカナ"
191 test.PrintableASCII = "カタカナ"
192
193 test.MultiByte = "1234feerf"
194
195 test.LowercaseString = "ABCDEFG"
196 test.UppercaseString = "abcdefg"
197
198 s := "toolong"
199 test.StrPtrMaxLen = &s
200 test.StrPtrLen = &s
201
202 test.UniqueSlice = []string{"1234", "1234"}
203 test.UniqueMap = map[string]string{"key1": "1234", "key2": "1234"}
204 test.Datetime = "2008-Feb-01"
205
206 err = validate.Struct(test)
207 NotEqual(t, err, nil)
208
209 errs, ok := err.(validator.ValidationErrors)
210 Equal(t, ok, true)
211
212 tests := []struct {
213 ns string
214 expected string
215 }{
216 {
217 ns: "Test.IsColor",
218 expected: "IsColor phải là màu sắc hợp lệ",
219 },
220 {
221 ns: "Test.MAC",
222 expected: "MAC chỉ được chứa địa chỉ MAC",
223 },
224 {
225 ns: "Test.IPAddr",
226 expected: "IPAddr phải là địa chỉ IP có thể phân giải",
227 },
228 {
229 ns: "Test.IPAddrv4",
230 expected: "IPAddrv4 phải là địa chỉ IPv4 có thể phân giải",
231 },
232 {
233 ns: "Test.IPAddrv6",
234 expected: "IPAddrv6 phải là địa chỉ IPv6 có thể phân giải",
235 },
236 {
237 ns: "Test.UDPAddr",
238 expected: "UDPAddr phải là địa chỉ UDP",
239 },
240 {
241 ns: "Test.UDPAddrv4",
242 expected: "UDPAddrv4 phải là địa chỉ IPv4 UDP",
243 },
244 {
245 ns: "Test.UDPAddrv6",
246 expected: "UDPAddrv6 phải là địa chỉ IPv6 UDP",
247 },
248 {
249 ns: "Test.TCPAddr",
250 expected: "TCPAddr phải là địa chỉ TCP",
251 },
252 {
253 ns: "Test.TCPAddrv4",
254 expected: "TCPAddrv4 phải là địa chỉ IPv4 TCP",
255 },
256 {
257 ns: "Test.TCPAddrv6",
258 expected: "TCPAddrv6 phải là địa chỉ IPv6 TCP",
259 },
260 {
261 ns: "Test.CIDR",
262 expected: "CIDR chỉ được chứa CIDR notation",
263 },
264 {
265 ns: "Test.CIDRv4",
266 expected: "CIDRv4 chỉ được chứa CIDR notation của một địa chỉ IPv4",
267 },
268 {
269 ns: "Test.CIDRv6",
270 expected: "CIDRv6 chỉ được chứa CIDR notation của một địa chỉ IPv6",
271 },
272 {
273 ns: "Test.SSN",
274 expected: "SSN phải là SSN number",
275 },
276 {
277 ns: "Test.IP",
278 expected: "IP phải là địa chỉ IP",
279 },
280 {
281 ns: "Test.IPv4",
282 expected: "IPv4 phải là địa chỉ IPv4",
283 },
284 {
285 ns: "Test.IPv6",
286 expected: "IPv6 phải là địa chỉ IPv6",
287 },
288 {
289 ns: "Test.DataURI",
290 expected: "DataURI chỉ được chứa Data URI",
291 },
292 {
293 ns: "Test.Latitude",
294 expected: "Latitude chỉ được chứa latitude (vỹ độ)",
295 },
296 {
297 ns: "Test.Longitude",
298 expected: "Longitude chỉ được chứa longitude (kinh độ)",
299 },
300 {
301 ns: "Test.MultiByte",
302 expected: "MultiByte chỉ được chứa ký tự multibyte",
303 },
304 {
305 ns: "Test.ASCII",
306 expected: "ASCII chỉ được chứa ký tự ASCII",
307 },
308 {
309 ns: "Test.PrintableASCII",
310 expected: "PrintableASCII chỉ được chứa ký tự ASCII có thể in ấn",
311 },
312 {
313 ns: "Test.UUID",
314 expected: "UUID phải là giá trị UUID",
315 },
316 {
317 ns: "Test.UUID3",
318 expected: "UUID3 phải là giá trị UUID phiên bản 3",
319 },
320 {
321 ns: "Test.UUID4",
322 expected: "UUID4 phải là giá trị UUID phiên bản 4",
323 },
324 {
325 ns: "Test.UUID5",
326 expected: "UUID5 phải là giá trị UUID phiên bản 5",
327 },
328 {
329 ns: "Test.ISBN",
330 expected: "ISBN phải là số ISBN",
331 },
332 {
333 ns: "Test.ISBN10",
334 expected: "ISBN10 phải là số ISBN-10",
335 },
336 {
337 ns: "Test.ISBN13",
338 expected: "ISBN13 phải là số ISBN-13",
339 },
340 {
341 ns: "Test.ISSN",
342 expected: "ISSN phải là số ISSN",
343 },
344 {
345 ns: "Test.Excludes",
346 expected: "Excludes không được chứa chuỗi 'text'",
347 },
348 {
349 ns: "Test.ExcludesAll",
350 expected: "ExcludesAll không được chứa bất kỳ ký tự nào trong nhóm ký tự '!@#$'",
351 },
352 {
353 ns: "Test.ExcludesRune",
354 expected: "ExcludesRune không được chứa '☻'",
355 },
356 {
357 ns: "Test.ContainsAny",
358 expected: "ContainsAny phải chứa ít nhất 1 trong cách ký tự sau '!@#$'",
359 },
360 {
361 ns: "Test.Contains",
362 expected: "Contains phải chứa chuỗi 'purpose'",
363 },
364 {
365 ns: "Test.Base64",
366 expected: "Base64 phải là giá trị chuỗi Base64",
367 },
368 {
369 ns: "Test.Email",
370 expected: "Email phải là giá trị email address",
371 },
372 {
373 ns: "Test.URL",
374 expected: "URL phải là giá trị URL",
375 },
376 {
377 ns: "Test.URI",
378 expected: "URI phải là giá trị URI",
379 },
380 {
381 ns: "Test.RGBColorString",
382 expected: "RGBColorString phải là giá trị RGB color",
383 },
384 {
385 ns: "Test.RGBAColorString",
386 expected: "RGBAColorString phải là giá trị RGBA color",
387 },
388 {
389 ns: "Test.HSLColorString",
390 expected: "HSLColorString phải là giá trị HSL color",
391 },
392 {
393 ns: "Test.HSLAColorString",
394 expected: "HSLAColorString phải là giá trị HSLA color",
395 },
396 {
397 ns: "Test.HexadecimalString",
398 expected: "HexadecimalString phải là giá trị hexadecimal",
399 },
400 {
401 ns: "Test.HexColorString",
402 expected: "HexColorString phải là giá trị HEX color",
403 },
404 {
405 ns: "Test.NumberString",
406 expected: "NumberString chỉ được chứa giá trị số",
407 },
408 {
409 ns: "Test.NumericString",
410 expected: "NumericString chỉ được chứa giá trị số hoặc số dưới dạng chữ",
411 },
412 {
413 ns: "Test.AlphanumString",
414 expected: "AlphanumString chỉ được chứa ký tự dạng alphanumeric",
415 },
416 {
417 ns: "Test.AlphaString",
418 expected: "AlphaString chỉ được chứa ký tự dạng alphabetic",
419 },
420 {
421 ns: "Test.LtFieldString",
422 expected: "LtFieldString chỉ được nhỏ hơn MaxString",
423 },
424 {
425 ns: "Test.LteFieldString",
426 expected: "LteFieldString chỉ được nhỏ hơn hoặc bằng MaxString",
427 },
428 {
429 ns: "Test.GtFieldString",
430 expected: "GtFieldString phải lớn hơn MaxString",
431 },
432 {
433 ns: "Test.GteFieldString",
434 expected: "GteFieldString phải lớn hơn hoặc bằng MaxString",
435 },
436 {
437 ns: "Test.NeFieldString",
438 expected: "NeFieldString không được phép bằng EqFieldString",
439 },
440 {
441 ns: "Test.LtCSFieldString",
442 expected: "LtCSFieldString chỉ được nhỏ hơn Inner.LtCSFieldString",
443 },
444 {
445 ns: "Test.LteCSFieldString",
446 expected: "LteCSFieldString chỉ được nhỏ hơn hoặc bằng Inner.LteCSFieldString",
447 },
448 {
449 ns: "Test.GtCSFieldString",
450 expected: "GtCSFieldString phải lớn hơn Inner.GtCSFieldString",
451 },
452 {
453 ns: "Test.GteCSFieldString",
454 expected: "GteCSFieldString phải lớn hơn hoặc bằng Inner.GteCSFieldString",
455 },
456 {
457 ns: "Test.NeCSFieldString",
458 expected: "NeCSFieldString không được phép bằng Inner.NeCSFieldString",
459 },
460 {
461 ns: "Test.EqCSFieldString",
462 expected: "EqCSFieldString phải bằng Inner.EqCSFieldString",
463 },
464 {
465 ns: "Test.EqFieldString",
466 expected: "EqFieldString phải bằng MaxString",
467 },
468 {
469 ns: "Test.GteString",
470 expected: "GteString phải có độ dài ít nhất 3 ký tự",
471 },
472 {
473 ns: "Test.GteNumber",
474 expected: "GteNumber phải là 5,56 hoặc lớn hơn",
475 },
476 {
477 ns: "Test.GteMultiple",
478 expected: "GteMultiple phải chứa ít nhất 2 phần tử",
479 },
480 {
481 ns: "Test.GteTime",
482 expected: "GteTime phải lớn hơn hoặc bằng Ngày & Giờ hiện tại",
483 },
484 {
485 ns: "Test.GtString",
486 expected: "GtString phải có độ dài lớn hơn 3 ký tự",
487 },
488 {
489 ns: "Test.GtNumber",
490 expected: "GtNumber phải lớn hơn 5,56",
491 },
492 {
493 ns: "Test.GtMultiple",
494 expected: "GtMultiple phải chứa nhiều hơn 2 phần tử",
495 },
496 {
497 ns: "Test.GtTime",
498 expected: "GtTime phải lớn hơn Ngày & Giờ hiện tại",
499 },
500 {
501 ns: "Test.LteString",
502 expected: "LteString chỉ được có độ dài tối đa là 3 ký tự",
503 },
504 {
505 ns: "Test.LteNumber",
506 expected: "LteNumber phải là 5,56 hoặc nhỏ hơn",
507 },
508 {
509 ns: "Test.LteMultiple",
510 expected: "LteMultiple chỉ được chứa nhiều nhất 2 phần tử",
511 },
512 {
513 ns: "Test.LteTime",
514 expected: "LteTime chỉ được nhỏ hơn hoặc bằng Ngày & Giờ hiện tại",
515 },
516 {
517 ns: "Test.LtString",
518 expected: "LtString phải có độ dài nhỏ hơn 3 ký tự",
519 },
520 {
521 ns: "Test.LtNumber",
522 expected: "LtNumber phải nhỏ hơn 5,56",
523 },
524 {
525 ns: "Test.LtMultiple",
526 expected: "LtMultiple chỉ được chứa ít hơn 2 phần tử",
527 },
528 {
529 ns: "Test.LtTime",
530 expected: "LtTime phải nhỏ hơn Ngày & Giờ hiện tại",
531 },
532 {
533 ns: "Test.NeString",
534 expected: "NeString không được bằng ",
535 },
536 {
537 ns: "Test.NeNumber",
538 expected: "NeNumber không được bằng 0.00",
539 },
540 {
541 ns: "Test.NeMultiple",
542 expected: "NeMultiple không được bằng 0",
543 },
544 {
545 ns: "Test.EqString",
546 expected: "EqString không bằng 3",
547 },
548 {
549 ns: "Test.EqNumber",
550 expected: "EqNumber không bằng 2.33",
551 },
552 {
553 ns: "Test.EqMultiple",
554 expected: "EqMultiple không bằng 7",
555 },
556 {
557 ns: "Test.MaxString",
558 expected: "MaxString chỉ được chứa tối đa 3 ký tự",
559 },
560 {
561 ns: "Test.MaxNumber",
562 expected: "MaxNumber phải là 1.113,00 hoặc nhỏ hơn",
563 },
564 {
565 ns: "Test.MaxMultiple",
566 expected: "MaxMultiple chỉ được chứa tối đa 7 phần tử",
567 },
568 {
569 ns: "Test.MinString",
570 expected: "MinString phải chứa ít nhất 1 ký tự",
571 },
572 {
573 ns: "Test.MinNumber",
574 expected: "MinNumber phải bằng 1.113,00 hoặc lớn hơn",
575 },
576 {
577 ns: "Test.MinMultiple",
578 expected: "MinMultiple phải chứa ít nhất 7 phần tử",
579 },
580 {
581 ns: "Test.LenString",
582 expected: "LenString phải có độ dài là 1 ký tự",
583 },
584 {
585 ns: "Test.LenNumber",
586 expected: "LenNumber phải bằng 1.113,00",
587 },
588 {
589 ns: "Test.LenMultiple",
590 expected: "LenMultiple phải chứa 7 phần tử",
591 },
592 {
593 ns: "Test.RequiredString",
594 expected: "RequiredString không được bỏ trống",
595 },
596 {
597 ns: "Test.RequiredNumber",
598 expected: "RequiredNumber không được bỏ trống",
599 },
600 {
601 ns: "Test.RequiredMultiple",
602 expected: "RequiredMultiple không được bỏ trống",
603 },
604 {
605 ns: "Test.StrPtrMinLen",
606 expected: "StrPtrMinLen phải chứa ít nhất 10 ký tự",
607 },
608 {
609 ns: "Test.StrPtrMaxLen",
610 expected: "StrPtrMaxLen chỉ được chứa tối đa 1 ký tự",
611 },
612 {
613 ns: "Test.StrPtrLen",
614 expected: "StrPtrLen phải có độ dài là 2 ký tự",
615 },
616 {
617 ns: "Test.StrPtrLt",
618 expected: "StrPtrLt phải có độ dài nhỏ hơn 1 ký tự",
619 },
620 {
621 ns: "Test.StrPtrLte",
622 expected: "StrPtrLte chỉ được có độ dài tối đa là 1 ký tự",
623 },
624 {
625 ns: "Test.StrPtrGt",
626 expected: "StrPtrGt phải có độ dài lớn hơn 10 ký tự",
627 },
628 {
629 ns: "Test.StrPtrGte",
630 expected: "StrPtrGte phải có độ dài ít nhất 10 ký tự",
631 },
632 {
633 ns: "Test.OneOfString",
634 expected: "OneOfString phải là trong những giá trị [red green]",
635 },
636 {
637 ns: "Test.OneOfInt",
638 expected: "OneOfInt phải là trong những giá trị [5 63]",
639 },
640 {
641 ns: "Test.UniqueSlice",
642 expected: "UniqueSlice chỉ được chứa những giá trị không trùng lặp",
643 },
644 {
645 ns: "Test.UniqueArray",
646 expected: "UniqueArray chỉ được chứa những giá trị không trùng lặp",
647 },
648 {
649 ns: "Test.UniqueMap",
650 expected: "UniqueMap chỉ được chứa những giá trị không trùng lặp",
651 },
652 {
653 ns: "Test.JSONString",
654 expected: "JSONString phải là một chuỗi json hợp lệ",
655 },
656 {
657 ns: "Test.JWTString",
658 expected: "JWTString phải là một chuỗi jwt hợp lệ",
659 },
660 {
661 ns: "Test.LowercaseString",
662 expected: "LowercaseString phải được viết thường",
663 },
664 {
665 ns: "Test.UppercaseString",
666 expected: "UppercaseString phải được viết hoa",
667 },
668 {
669 ns: "Test.Datetime",
670 expected: "Datetime không trùng định dạng ngày tháng 2006-01-02",
671 },
672 {
673 ns: "Test.PostCode",
674 expected: "PostCode sai định dạng postcode của quốc gia SG",
675 },
676 {
677 ns: "Test.PostCodeByField",
678 expected: "PostCodeByField sai định dạng postcode của quốc gia tương ứng thuộc trường PostCodeCountry",
679 },
680 {
681 ns: "Test.Image",
682 expected: "Image phải là một hình ảnh hợp lệ",
683 },
684 }
685
686 for _, tt := range tests {
687
688 var fe validator.FieldError
689
690 for _, e := range errs {
691 if tt.ns == e.Namespace() {
692 fe = e
693 break
694 }
695 }
696
697 NotEqual(t, fe, nil)
698 Equal(t, tt.expected, fe.Translate(trans))
699 }
700 }
701
View as plain text