OSDN Git Service

new repo
[bytom/vapor.git] / vendor / github.com / go-playground / universal-translator / translator_test.go
1 package ut
2
3 import (
4         "fmt"
5         "testing"
6
7         "github.com/go-playground/locales"
8         "github.com/go-playground/locales/en"
9         "github.com/go-playground/locales/en_CA"
10         "github.com/go-playground/locales/nl"
11 )
12
13 // NOTES:
14 // - Run "go test" to run tests
15 // - Run "gocov test | gocov report" to report on test converage by file
16 // - Run "gocov test | gocov annotate -" to report on all code and functions, those ,marked with "MISS" were never called
17 //
18 // or
19 //
20 // -- may be a good idea to change to output path to somewherelike /tmp
21 // go test -coverprofile cover.out && go tool cover -html=cover.out -o cover.html
22 //
23
24 func TestBasicTranslation(t *testing.T) {
25
26         e := en.New()
27         uni := New(e, e)
28         en, found := uni.GetTranslator("en") // or fallback if fails to find 'en'
29         if !found {
30                 t.Fatalf("Expected '%t' Got '%t'", true, found)
31         }
32
33         translations := []struct {
34                 key           interface{}
35                 trans         string
36                 expected      error
37                 expectedError bool
38                 override      bool
39         }{
40                 {
41                         key:      "test_trans",
42                         trans:    "Welcome {0}",
43                         expected: nil,
44                 },
45                 {
46                         key:      -1,
47                         trans:    "Welcome {0}",
48                         expected: nil,
49                 },
50                 {
51                         key:      "test_trans2",
52                         trans:    "{0} to the {1}.",
53                         expected: nil,
54                 },
55                 {
56                         key:      "test_trans3",
57                         trans:    "Welcome {0} to the {1}",
58                         expected: nil,
59                 },
60                 {
61                         key:      "test_trans4",
62                         trans:    "{0}{1}",
63                         expected: nil,
64                 },
65                 {
66                         key:           "test_trans",
67                         trans:         "{0}{1}",
68                         expected:      &ErrConflictingTranslation{locale: en.Locale(), key: "test_trans", text: "{0}{1}"},
69                         expectedError: true,
70                 },
71                 {
72                         key:           -1,
73                         trans:         "{0}{1}",
74                         expected:      &ErrConflictingTranslation{locale: en.Locale(), key: -1, text: "{0}{1}"},
75                         expectedError: true,
76                 },
77                 {
78                         key:      "test_trans",
79                         trans:    "Welcome {0} to the {1}.",
80                         expected: nil,
81                         override: true,
82                 },
83         }
84
85         for _, tt := range translations {
86
87                 err := en.Add(tt.key, tt.trans, tt.override)
88                 if err != tt.expected {
89                         if !tt.expectedError {
90                                 t.Errorf("Expected '%s' Got '%s'", tt.expected, err)
91                         } else {
92                                 if err.Error() != tt.expected.Error() {
93                                         t.Errorf("Expected '%s' Got '%s'", tt.expected.Error(), err.Error())
94                                 }
95                         }
96                 }
97         }
98
99         tests := []struct {
100                 key           interface{}
101                 params        []string
102                 expected      string
103                 expectedError bool
104         }{
105                 {
106                         key:      "test_trans",
107                         params:   []string{"Joeybloggs", "The Test"},
108                         expected: "Welcome Joeybloggs to the The Test.",
109                 },
110                 {
111                         key:      "test_trans2",
112                         params:   []string{"Joeybloggs", "The Test"},
113                         expected: "Joeybloggs to the The Test.",
114                 },
115                 {
116                         key:      "test_trans3",
117                         params:   []string{"Joeybloggs", "The Test"},
118                         expected: "Welcome Joeybloggs to the The Test",
119                 },
120                 {
121                         key:      "test_trans4",
122                         params:   []string{"Joeybloggs", "The Test"},
123                         expected: "JoeybloggsThe Test",
124                 },
125                 // bad translation
126                 {
127                         key:           "non-existant-key",
128                         params:        []string{"Joeybloggs", "The Test"},
129                         expected:      "",
130                         expectedError: true,
131                 },
132         }
133
134         for _, tt := range tests {
135                 s, err := en.T(tt.key, tt.params...)
136                 if s != tt.expected {
137                         if !tt.expectedError && err != ErrUnknowTranslation {
138                                 t.Errorf("Expected '%s' Got '%s'", tt.expected, s)
139                         }
140                 }
141         }
142 }
143
144 func TestCardinalTranslation(t *testing.T) {
145
146         e := en.New()
147         uni := New(e, e)
148         en, found := uni.GetTranslator("en")
149         if !found {
150                 t.Fatalf("Expected '%t' Got '%t'", true, found)
151         }
152
153         translations := []struct {
154                 key           interface{}
155                 trans         string
156                 rule          locales.PluralRule
157                 expected      error
158                 expectedError bool
159                 override      bool
160         }{
161                 // bad translation
162                 {
163                         key:           "cardinal_test",
164                         trans:         "You have a day left.",
165                         rule:          locales.PluralRuleOne,
166                         expected:      &ErrCardinalTranslation{text: fmt.Sprintf("error: parameter '%s' not found, may want to use 'Add' instead of 'AddCardinal'. locale: '%s' key: '%v' text: '%s'", paramZero, en.Locale(), "cardinal_test", "You have a day left.")},
167                         expectedError: true,
168                 },
169                 // bad translation
170                 {
171                         key:           "cardinal_test",
172                         trans:         "You have a day left few.",
173                         rule:          locales.PluralRuleFew,
174                         expected:      &ErrCardinalTranslation{text: fmt.Sprintf("error: cardinal plural rule '%s' does not exist for locale '%s' key: '%s' text: '%s'", locales.PluralRuleFew, en.Locale(), "cardinal_test", "You have a day left few.")},
175                         expectedError: true,
176                 },
177                 {
178                         key:      "cardinal_test",
179                         trans:    "You have {0} day",
180                         rule:     locales.PluralRuleOne,
181                         expected: nil,
182                 },
183                 {
184                         key:      "cardinal_test",
185                         trans:    "You have {0} days left.",
186                         rule:     locales.PluralRuleOther,
187                         expected: nil,
188                 },
189                 {
190                         key:           "cardinal_test",
191                         trans:         "You have {0} days left.",
192                         rule:          locales.PluralRuleOther,
193                         expected:      &ErrConflictingTranslation{locale: en.Locale(), key: "cardinal_test", rule: locales.PluralRuleOther, text: "You have {0} days left."},
194                         expectedError: true,
195                 },
196                 {
197                         key:      "cardinal_test",
198                         trans:    "You have {0} day left.",
199                         rule:     locales.PluralRuleOne,
200                         expected: nil,
201                         override: true,
202                 },
203         }
204
205         for _, tt := range translations {
206
207                 err := en.AddCardinal(tt.key, tt.trans, tt.rule, tt.override)
208                 if err != tt.expected {
209                         if !tt.expectedError || err.Error() != tt.expected.Error() {
210                                 t.Errorf("Expected '<nil>' Got '%s'", err)
211                         }
212                 }
213         }
214
215         tests := []struct {
216                 key           interface{}
217                 num           float64
218                 digits        uint64
219                 param         string
220                 expected      string
221                 expectedError bool
222         }{
223                 {
224                         key:      "cardinal_test",
225                         num:      1,
226                         digits:   0,
227                         param:    string(en.FmtNumber(1, 0)),
228                         expected: "You have 1 day left.",
229                 },
230                 // bad translation key
231                 {
232                         key:           "non-existant",
233                         num:           1,
234                         digits:        0,
235                         param:         string(en.FmtNumber(1, 0)),
236                         expected:      "",
237                         expectedError: true,
238                 },
239         }
240
241         for _, tt := range tests {
242
243                 s, err := en.C(tt.key, tt.num, tt.digits, tt.param)
244                 if err != nil {
245                         if !tt.expectedError && err != ErrUnknowTranslation {
246                                 t.Errorf("Expected '<nil>' Got '%s'", err)
247                         }
248                 }
249
250                 if s != tt.expected {
251                         t.Errorf("Expected '%s' Got '%s'", tt.expected, s)
252                 }
253         }
254 }
255
256 func TestOrdinalTranslation(t *testing.T) {
257
258         e := en.New()
259         uni := New(e, e)
260         en, found := uni.GetTranslator("en")
261         if !found {
262                 t.Fatalf("Expected '%t' Got '%t'", true, found)
263         }
264
265         translations := []struct {
266                 key           interface{}
267                 trans         string
268                 rule          locales.PluralRule
269                 expected      error
270                 expectedError bool
271                 override      bool
272         }{
273                 // bad translation
274                 {
275                         key:           "day",
276                         trans:         "st",
277                         rule:          locales.PluralRuleOne,
278                         expected:      &ErrOrdinalTranslation{text: fmt.Sprintf("error: parameter '%s' not found, may want to use 'Add' instead of 'AddOrdinal'. locale: '%s' key: '%v' text: '%s'", paramZero, en.Locale(), "day", "st")},
279                         expectedError: true,
280                 },
281                 // bad translation
282                 {
283                         key:           "day",
284                         trans:         "st",
285                         rule:          locales.PluralRuleMany,
286                         expected:      &ErrOrdinalTranslation{text: fmt.Sprintf("error: ordinal plural rule '%s' does not exist for locale '%s' key: '%s' text: '%s'", locales.PluralRuleMany, en.Locale(), "day", "st")},
287                         expectedError: true,
288                 },
289                 {
290                         key:      "day",
291                         trans:    "{0}st",
292                         rule:     locales.PluralRuleOne,
293                         expected: nil,
294                 },
295                 {
296                         key:      "day",
297                         trans:    "{0}nd",
298                         rule:     locales.PluralRuleTwo,
299                         expected: nil,
300                 },
301                 {
302                         key:      "day",
303                         trans:    "{0}rd",
304                         rule:     locales.PluralRuleFew,
305                         expected: nil,
306                 },
307                 {
308                         key:      "day",
309                         trans:    "{0}th",
310                         rule:     locales.PluralRuleOther,
311                         expected: nil,
312                 },
313                 // bad translation
314                 {
315                         key:           "day",
316                         trans:         "{0}th",
317                         rule:          locales.PluralRuleOther,
318                         expected:      &ErrConflictingTranslation{locale: en.Locale(), key: "day", rule: locales.PluralRuleOther, text: "{0}th"},
319                         expectedError: true,
320                 },
321                 {
322                         key:      "day",
323                         trans:    "{0}st",
324                         rule:     locales.PluralRuleOne,
325                         expected: nil,
326                         override: true,
327                 },
328         }
329
330         for _, tt := range translations {
331
332                 err := en.AddOrdinal(tt.key, tt.trans, tt.rule, tt.override)
333                 if err != tt.expected {
334                         if !tt.expectedError || err.Error() != tt.expected.Error() {
335                                 t.Errorf("Expected '<nil>' Got '%s'", err)
336                         }
337                 }
338         }
339
340         tests := []struct {
341                 key           interface{}
342                 num           float64
343                 digits        uint64
344                 param         string
345                 expected      string
346                 expectedError bool
347         }{
348                 {
349                         key:      "day",
350                         num:      1,
351                         digits:   0,
352                         param:    string(en.FmtNumber(1, 0)),
353                         expected: "1st",
354                 },
355                 {
356                         key:      "day",
357                         num:      2,
358                         digits:   0,
359                         param:    string(en.FmtNumber(2, 0)),
360                         expected: "2nd",
361                 },
362                 {
363                         key:      "day",
364                         num:      3,
365                         digits:   0,
366                         param:    string(en.FmtNumber(3, 0)),
367                         expected: "3rd",
368                 },
369                 {
370                         key:      "day",
371                         num:      4,
372                         digits:   0,
373                         param:    string(en.FmtNumber(4, 0)),
374                         expected: "4th",
375                 },
376                 {
377                         key:      "day",
378                         num:      10258.43,
379                         digits:   0,
380                         param:    string(en.FmtNumber(10258.43, 0)),
381                         expected: "10,258th",
382                 },
383                 // bad translation
384                 {
385                         key:           "d-day",
386                         num:           10258.43,
387                         digits:        0,
388                         param:         string(en.FmtNumber(10258.43, 0)),
389                         expected:      "",
390                         expectedError: true,
391                 },
392         }
393
394         for _, tt := range tests {
395
396                 s, err := en.O(tt.key, tt.num, tt.digits, tt.param)
397                 if err != nil {
398                         if !tt.expectedError && err != ErrUnknowTranslation {
399                                 t.Errorf("Expected '<nil>' Got '%s'", err)
400                         }
401                 }
402
403                 if s != tt.expected {
404                         t.Errorf("Expected '%s' Got '%s'", tt.expected, s)
405                 }
406         }
407 }
408
409 func TestRangeTranslation(t *testing.T) {
410
411         n := nl.New()
412         uni := New(n, n)
413
414         // dutch
415         nl, found := uni.GetTranslator("nl")
416         if !found {
417                 t.Fatalf("Expected '%t' Got '%t'", true, found)
418         }
419
420         translations := []struct {
421                 key           interface{}
422                 trans         string
423                 rule          locales.PluralRule
424                 expected      error
425                 expectedError bool
426                 override      bool
427         }{
428                 // bad translation
429                 {
430                         key:           "day",
431                         trans:         "er -{1} dag vertrokken",
432                         rule:          locales.PluralRuleOne,
433                         expected:      &ErrRangeTranslation{text: fmt.Sprintf("error: parameter '%s' not found, are you sure you're adding a Range Translation? locale: '%s' key: '%s' text: '%s'", paramZero, nl.Locale(), "day", "er -{1} dag vertrokken")},
434                         expectedError: true,
435                 },
436                 // bad translation
437                 {
438                         key:           "day",
439                         trans:         "er {0}- dag vertrokken",
440                         rule:          locales.PluralRuleMany,
441                         expected:      &ErrRangeTranslation{text: fmt.Sprintf("error: range plural rule '%s' does not exist for locale '%s' key: '%s' text: '%s'", locales.PluralRuleMany, nl.Locale(), "day", "er {0}- dag vertrokken")},
442                         expectedError: true,
443                 },
444                 // bad translation
445                 {
446                         key:           "day",
447                         trans:         "er {0}- dag vertrokken",
448                         rule:          locales.PluralRuleOne,
449                         expected:      &ErrRangeTranslation{text: fmt.Sprintf("error: parameter '%s' not found, a Range Translation requires two parameters. locale: '%s' key: '%s' text: '%s'", paramOne, nl.Locale(), "day", "er {0}- dag vertrokken")},
450                         expectedError: true,
451                 },
452                 {
453                         key:      "day",
454                         trans:    "er {0}-{1} dag",
455                         rule:     locales.PluralRuleOne,
456                         expected: nil,
457                 },
458                 {
459                         key:      "day",
460                         trans:    "er zijn {0}-{1} dagen over",
461                         rule:     locales.PluralRuleOther,
462                         expected: nil,
463                 },
464                 // bad translation
465                 {
466                         key:           "day",
467                         trans:         "er zijn {0}-{1} dagen over",
468                         rule:          locales.PluralRuleOther,
469                         expected:      &ErrConflictingTranslation{locale: nl.Locale(), key: "day", rule: locales.PluralRuleOther, text: "er zijn {0}-{1} dagen over"},
470                         expectedError: true,
471                 },
472                 {
473                         key:      "day",
474                         trans:    "er {0}-{1} dag vertrokken",
475                         rule:     locales.PluralRuleOne,
476                         expected: nil,
477                         override: true,
478                 },
479         }
480
481         for _, tt := range translations {
482
483                 err := nl.AddRange(tt.key, tt.trans, tt.rule, tt.override)
484                 if err != tt.expected {
485                         if !tt.expectedError || err.Error() != tt.expected.Error() {
486                                 t.Errorf("Expected '%#v' Got '%s'", tt.expected, err)
487                         }
488                 }
489         }
490
491         tests := []struct {
492                 key           interface{}
493                 num1          float64
494                 digits1       uint64
495                 num2          float64
496                 digits2       uint64
497                 param1        string
498                 param2        string
499                 expected      string
500                 expectedError bool
501         }{
502                 {
503                         key:      "day",
504                         num1:     1,
505                         digits1:  0,
506                         num2:     2,
507                         digits2:  0,
508                         param1:   string(nl.FmtNumber(1, 0)),
509                         param2:   string(nl.FmtNumber(2, 0)),
510                         expected: "er zijn 1-2 dagen over",
511                 },
512                 {
513                         key:      "day",
514                         num1:     0,
515                         digits1:  0,
516                         num2:     1,
517                         digits2:  0,
518                         param1:   string(nl.FmtNumber(0, 0)),
519                         param2:   string(nl.FmtNumber(1, 0)),
520                         expected: "er 0-1 dag vertrokken",
521                 },
522                 {
523                         key:      "day",
524                         num1:     0,
525                         digits1:  0,
526                         num2:     2,
527                         digits2:  0,
528                         param1:   string(nl.FmtNumber(0, 0)),
529                         param2:   string(nl.FmtNumber(2, 0)),
530                         expected: "er zijn 0-2 dagen over",
531                 },
532                 // bad translations from here
533                 {
534                         key:           "d-day",
535                         num1:          0,
536                         digits1:       0,
537                         num2:          2,
538                         digits2:       0,
539                         param1:        string(nl.FmtNumber(0, 0)),
540                         param2:        string(nl.FmtNumber(2, 0)),
541                         expected:      "",
542                         expectedError: true,
543                 },
544         }
545
546         for _, tt := range tests {
547
548                 s, err := nl.R(tt.key, tt.num1, tt.digits1, tt.num2, tt.digits2, tt.param1, tt.param2)
549                 if err != nil {
550                         if !tt.expectedError && err != ErrUnknowTranslation {
551                                 t.Errorf("Expected '<nil>' Got '%s'", err)
552                         }
553                 }
554
555                 if s != tt.expected {
556                         t.Errorf("Expected '%s' Got '%s'", tt.expected, s)
557                 }
558         }
559 }
560
561 func TestFallbackTranslator(t *testing.T) {
562
563         e := en.New()
564         uni := New(e, e)
565         en, found := uni.GetTranslator("en")
566         if !found {
567                 t.Fatalf("Expected '%t' Got '%t'", true, found)
568         }
569
570         if en.Locale() != "en" {
571                 t.Errorf("Expected '%s' Got '%s'", "en", en.Locale())
572         }
573
574         fallback, _ := uni.GetTranslator("nl")
575         if fallback.Locale() != "en" {
576                 t.Errorf("Expected '%s' Got '%s'", "en", fallback.Locale())
577         }
578
579         en, _ = uni.FindTranslator("nl", "en")
580         if en.Locale() != "en" {
581                 t.Errorf("Expected '%s' Got '%s'", "en", en.Locale())
582         }
583
584         fallback, _ = uni.FindTranslator("nl")
585         if fallback.Locale() != "en" {
586                 t.Errorf("Expected '%s' Got '%s'", "en", fallback.Locale())
587         }
588 }
589
590 func TestAddTranslator(t *testing.T) {
591
592         e := en.New()
593         n := nl.New()
594         uni := New(e, n)
595
596         tests := []struct {
597                 trans         locales.Translator
598                 expected      error
599                 expectedError bool
600                 override      bool
601         }{
602                 {
603                         trans:    en_CA.New(),
604                         expected: nil,
605                         override: false,
606                 },
607                 {
608                         trans:         n,
609                         expected:      &ErrExistingTranslator{locale: n.Locale()},
610                         expectedError: true,
611                         override:      false,
612                 },
613                 {
614                         trans:         e,
615                         expected:      &ErrExistingTranslator{locale: e.Locale()},
616                         expectedError: true,
617                         override:      false,
618                 },
619                 {
620                         trans:    e,
621                         expected: nil,
622                         override: true,
623                 },
624         }
625
626         for _, tt := range tests {
627
628                 err := uni.AddTranslator(tt.trans, tt.override)
629                 if err != tt.expected {
630                         if !tt.expectedError || err.Error() != tt.expected.Error() {
631                                 t.Errorf("Expected '%s' Got '%s'", tt.expected, err)
632                         }
633                 }
634         }
635 }
636
637 func TestVerifyTranslations(t *testing.T) {
638
639         n := nl.New()
640         // dutch
641         uni := New(n, n)
642
643         loc, _ := uni.GetTranslator("nl")
644         if loc.Locale() != "nl" {
645                 t.Errorf("Expected '%s' Got '%s'", "nl", loc.Locale())
646         }
647
648         // cardinal checks
649
650         err := loc.AddCardinal("day", "je {0} dag hebben verlaten", locales.PluralRuleOne, false)
651         if err != nil {
652                 t.Fatalf("Expected '<nil>' Got '%s'", err)
653         }
654
655         // fail cardinal rules
656         expected := &ErrMissingPluralTranslation{locale: loc.Locale(), translationType: "plural", rule: locales.PluralRuleOther, key: "day"}
657         err = loc.VerifyTranslations()
658         if err == nil || err.Error() != expected.Error() {
659                 t.Errorf("Expected '%s' Got '%s'", expected, err)
660         }
661
662         // success cardinal
663         err = loc.AddCardinal("day", "je {0} dagen hebben verlaten", locales.PluralRuleOther, false)
664         if err != nil {
665                 t.Fatalf("Expected '<nil>' Got '%s'", err)
666         }
667
668         err = loc.VerifyTranslations()
669         if err != nil {
670                 t.Fatalf("Expected '<nil>' Got '%s'", err)
671         }
672
673         // range checks
674         err = loc.AddRange("day", "je {0}-{1} dagen hebben verlaten", locales.PluralRuleOther, false)
675         if err != nil {
676                 t.Fatalf("Expected '<nil>' Got '%s'", err)
677         }
678
679         // fail range rules
680         expected = &ErrMissingPluralTranslation{locale: loc.Locale(), translationType: "range", rule: locales.PluralRuleOne, key: "day"}
681         err = loc.VerifyTranslations()
682         if err == nil || err.Error() != expected.Error() {
683                 t.Errorf("Expected '%s' Got '%s'", expected, err)
684         }
685
686         // success range
687         err = loc.AddRange("day", "je {0}-{1} dag hebben verlaten", locales.PluralRuleOne, false)
688         if err != nil {
689                 t.Fatalf("Expected '<nil>' Got '%s'", err)
690         }
691
692         err = loc.VerifyTranslations()
693         if err != nil {
694                 t.Fatalf("Expected '<nil>' Got '%s'", err)
695         }
696
697         // ok so 'nl' aka dutch, ony has one plural rule for ordinals, so going to switch to english from here which has 4
698
699         err = uni.AddTranslator(en.New(), false)
700         if err != nil {
701                 t.Fatalf("Expected '<nil>' Got '%s'", err)
702         }
703
704         loc, _ = uni.GetTranslator("en")
705         if loc.Locale() != "en" {
706                 t.Errorf("Expected '%s' Got '%s'", "en", loc.Locale())
707         }
708
709         // ordinal checks
710
711         err = loc.AddOrdinal("day", "{0}st", locales.PluralRuleOne, false)
712         if err != nil {
713                 t.Fatalf("Expected '<nil>' Got '%s'", err)
714         }
715
716         err = loc.AddOrdinal("day", "{0}rd", locales.PluralRuleFew, false)
717         if err != nil {
718                 t.Fatalf("Expected '<nil>' Got '%s'", err)
719         }
720
721         err = loc.AddOrdinal("day", "{0}th", locales.PluralRuleOther, false)
722         if err != nil {
723                 t.Fatalf("Expected '<nil>' Got '%s'", err)
724         }
725
726         // fail ordinal rules
727         expected = &ErrMissingPluralTranslation{locale: loc.Locale(), translationType: "ordinal", rule: locales.PluralRuleTwo, key: "day"}
728         err = loc.VerifyTranslations()
729         if err == nil || err.Error() != expected.Error() {
730                 t.Errorf("Expected '%s' Got '%s'", expected, err)
731         }
732
733         // success ordinal
734
735         err = loc.AddOrdinal("day", "{0}nd", locales.PluralRuleTwo, false)
736         if err != nil {
737                 t.Fatalf("Expected '<nil>' Got '%s'", err)
738         }
739
740         err = loc.VerifyTranslations()
741         if err != nil {
742                 t.Fatalf("Expected '<nil>' Got '%s'", err)
743         }
744 }
745
746 func TestVerifyTranslationsWithNonStringKeys(t *testing.T) {
747
748         n := nl.New()
749         // dutch
750         uni := New(n, n)
751
752         loc, _ := uni.GetTranslator("nl")
753         if loc.Locale() != "nl" {
754                 t.Errorf("Expected '%s' Got '%s'", "nl", loc.Locale())
755         }
756
757         // cardinal checks
758
759         err := loc.AddCardinal(-1, "je {0} dag hebben verlaten", locales.PluralRuleOne, false)
760         if err != nil {
761                 t.Fatalf("Expected '<nil>' Got '%s'", err)
762         }
763
764         // fail cardinal rules
765         expected := &ErrMissingPluralTranslation{locale: loc.Locale(), translationType: "plural", rule: locales.PluralRuleOther, key: -1}
766         err = loc.VerifyTranslations()
767         if err == nil || err.Error() != expected.Error() {
768                 t.Errorf("Expected '%s' Got '%s'", expected, err)
769         }
770 }
771
772 func TestGetFallback(t *testing.T) {
773
774         // dutch
775         n := nl.New()
776         e := en.New()
777
778         uni := New(e, n)
779
780         trans := uni.GetFallback()
781
782         expected := "en"
783
784         if trans.Locale() != expected {
785                 t.Errorf("Expected '%s' Got '%s'", expected, trans.Locale())
786         }
787 }
788
789 func TestVerifyUTTranslations(t *testing.T) {
790
791         e := en.New()
792         uni := New(e, e)
793         en, found := uni.GetTranslator("en")
794         if !found {
795                 t.Fatalf("Expected '%t' Got '%t'", true, found)
796         }
797
798         translations := []struct {
799                 key           interface{}
800                 trans         string
801                 rule          locales.PluralRule
802                 expected      error
803                 expectedError bool
804                 override      bool
805         }{
806                 {
807                         key:      "day",
808                         trans:    "{0}st",
809                         rule:     locales.PluralRuleOne,
810                         expected: nil,
811                 },
812                 {
813                         key:      "day",
814                         trans:    "{0}nd",
815                         rule:     locales.PluralRuleTwo,
816                         expected: nil,
817                 },
818                 {
819                         key:      "day",
820                         trans:    "{0}rd",
821                         rule:     locales.PluralRuleFew,
822                         expected: nil,
823                 },
824                 // intentionally leaving out plural other
825                 // {
826                 //      key:      "day",
827                 //      trans:    "{0}th",
828                 //      rule:     locales.PluralRuleOther,
829                 //      expected: nil,
830                 // },
831         }
832
833         for _, tt := range translations {
834
835                 err := en.AddOrdinal(tt.key, tt.trans, tt.rule, tt.override)
836                 if err != tt.expected {
837                         if !tt.expectedError || err.Error() != tt.expected.Error() {
838                                 t.Errorf("Expected '<nil>' Got '%s'", err)
839                         }
840                 }
841         }
842
843         expected := "error: missing 'ordinal' plural rule 'Other' for translation with key 'day' and locale 'en'"
844         err := uni.VerifyTranslations()
845         if err == nil || err.Error() != expected {
846                 t.Fatalf("Expected '%s' Got '%s'", expected, err)
847         }
848
849         err = en.AddOrdinal("day", "{0}th", locales.PluralRuleOther, false)
850         if err != nil {
851                 t.Fatalf("Expected '%v' Got '%s'", nil, err)
852         }
853
854         err = uni.VerifyTranslations()
855         if err != nil {
856                 t.Fatalf("Expected '%v' Got '%s'", nil, err)
857         }
858 }