taler-merchant-demos

Python-based Frontends for the Demonstration Web site
Log | Files | Refs | README | LICENSE

i18n_test.go (3020B)


      1 package web
      2 
      3 import (
      4 	"bufio"
      5 	"strings"
      6 	"testing"
      7 )
      8 
      9 func TestParsePO(t *testing.T) {
     10 	po := `
     11 msgid "Hello "
     12 "world"
     13 msgstr "Hallo "
     14 "Welt"
     15 
     16 #, fuzzy
     17 msgid "Ignored"
     18 msgstr "Ignoriert"
     19 `
     20 	got := parsePO(po)
     21 	if got["Hello world"] != "Hallo Welt" {
     22 		t.Fatalf("translation = %q", got["Hello world"])
     23 	}
     24 	if _, ok := got["Ignored"]; ok {
     25 		t.Fatal("fuzzy translation was loaded")
     26 	}
     27 }
     28 
     29 func TestFormatNamed(t *testing.T) {
     30 	if got := formatNamed("Pay {amount} to {receiver}", "amount", "KUDOS:1", "receiver", "GNUnet"); got != "Pay KUDOS:1 to GNUnet" {
     31 		t.Fatalf("formatted = %q", got)
     32 	}
     33 	if got := formatNamed("Pay {amount} to {receiver}", "amount", "{receiver}", "receiver", "GNUnet"); got != "Pay {receiver} to GNUnet" {
     34 		t.Fatalf("replacement value was formatted again: %q", got)
     35 	}
     36 }
     37 
     38 func TestSamePlaceholders(t *testing.T) {
     39 	for _, test := range []struct {
     40 		message     string
     41 		translation string
     42 		want        bool
     43 	}{
     44 		{"Pay {amount} to {receiver}", "Zahle {amount} an {receiver}", true},
     45 		{"Pay {amount} to {receiver}", "Zahle {betrag} an {receiver}", false},
     46 		{"Use {} twice: {}", "Nutze {} zweimal: {}", true},
     47 		{"Use {} twice: {}", "Nutze {} einmal", false},
     48 	} {
     49 		if got := samePlaceholders(test.message, test.translation); got != test.want {
     50 			t.Errorf("samePlaceholders(%q, %q) = %v, want %v", test.message, test.translation, got, test.want)
     51 		}
     52 	}
     53 }
     54 
     55 func TestSameHTMLTags(t *testing.T) {
     56 	if !sameHTMLTags(`Read <a href="{url}"><em>this</em></a>.`, `Lies <a href="{url}"><em>dies</em></a>.`) {
     57 		t.Fatal("matching HTML tags were rejected")
     58 	}
     59 	if sameHTMLTags(`Read <a href="{url}">this</a>.`, `Lies <a href="{url}">dies.`) {
     60 		t.Fatal("missing closing HTML tag was accepted")
     61 	}
     62 }
     63 
     64 func TestSupportedCatalogsAreComplete(t *testing.T) {
     65 	catalogs, err := loadCatalogs(supportedLocales)
     66 	if err != nil {
     67 		t.Fatal(err)
     68 	}
     69 	if len(catalogs) != len(languages) {
     70 		t.Fatalf("loaded %d catalogs for %d languages", len(catalogs), len(languages))
     71 	}
     72 	pot, err := Assets.ReadFile("assets/translations/messages.pot")
     73 	if err != nil {
     74 		t.Fatal(err)
     75 	}
     76 	reference := make(map[string]bool)
     77 	scanner := bufio.NewScanner(strings.NewReader(string(pot)))
     78 	for scanner.Scan() {
     79 		line := strings.TrimSpace(scanner.Text())
     80 		if !strings.HasPrefix(line, "msgid ") {
     81 			continue
     82 		}
     83 		if message := poString(strings.TrimSpace(strings.TrimPrefix(line, "msgid"))); message != "" {
     84 			reference[message] = true
     85 		}
     86 	}
     87 	if err := scanner.Err(); err != nil {
     88 		t.Fatal(err)
     89 	}
     90 	for _, language := range languages {
     91 		if language.Code == "en" {
     92 			continue
     93 		}
     94 		catalog := catalogs[language.Code]
     95 		if len(catalog) != len(reference) {
     96 			t.Errorf("catalog %s contains %d usable translations, want %d", language.Code, len(catalog), len(reference))
     97 		}
     98 		for message := range reference {
     99 			if catalog[message] == "" {
    100 				t.Errorf("catalog %s does not translate %q", language.Code, message)
    101 			}
    102 		}
    103 	}
    104 	if supportedLocales["ar"] || catalogs["ar"] != nil {
    105 		t.Fatal("unsupported Arabic catalog was loaded")
    106 	}
    107 }