package inflection import ( "strings" "testing" ) var inflections = map[string]string{ "star": "stars", "STAR": "STARS", "Star": "Stars", "bus": "buses", "fish": "fish", "mouse": "mice", "query": "queries", "ability": "abilities", "agency": "agencies", "movie": "movies", "archive": "archives", "index": "indices", "wife": "wives", "safe": "saves", "half": "halves", "move": "moves", "salesperson": "salespeople", "person": "people", "spokesman": "spokesmen", "man": "men", "woman": "women", "basis": "bases", "diagnosis": "diagnoses", "diagnosis_a": "diagnosis_as", "datum": "data", "medium": "media", "stadium": "stadia", "analysis": "analyses", "node_child": "node_children", "child": "children", "experience": "experiences", "day": "days", "comment": "comments", "foobar": "foobars", "newsletter": "newsletters", "old_news": "old_news", "news": "news", "series": "series", "species": "species", "quiz": "quizzes", "perspective": "perspectives", "ox": "oxen", "photo": "photos", "buffalo": "buffaloes", "tomato": "tomatoes", "dwarf": "dwarves", "elf": "elves", "information": "information", "equipment": "equipment", "criterion": "criteria", } // storage is used to restore the state of the global variables // on each test execution, to ensure no global state pollution type storage struct { singulars RegularSlice plurals RegularSlice irregulars IrregularSlice uncountables []string } var backup = storage{} func init() { AddIrregular("criterion", "criteria") copy(backup.singulars, singularInflections) copy(backup.plurals, pluralInflections) copy(backup.irregulars, irregularInflections) copy(backup.uncountables, uncountableInflections) } func restore() { copy(singularInflections, backup.singulars) copy(pluralInflections, backup.plurals) copy(irregularInflections, backup.irregulars) copy(uncountableInflections, backup.uncountables) } func TestPlural(t *testing.T) { for key, value := range inflections { if v := Plural(strings.ToUpper(key)); v != strings.ToUpper(value) { t.Errorf("%v's plural should be %v, but got %v", strings.ToUpper(key), strings.ToUpper(value), v) } if v := Plural(strings.Title(key)); v != strings.Title(value) { t.Errorf("%v's plural should be %v, but got %v", strings.Title(key), strings.Title(value), v) } if v := Plural(key); v != value { t.Errorf("%v's plural should be %v, but got %v", key, value, v) } } } func TestSingular(t *testing.T) { for key, value := range inflections { if v := Singular(strings.ToUpper(value)); v != strings.ToUpper(key) { t.Errorf("%v's singular should be %v, but got %v", strings.ToUpper(value), strings.ToUpper(key), v) } if v := Singular(strings.Title(value)); v != strings.Title(key) { t.Errorf("%v's singular should be %v, but got %v", strings.Title(value), strings.Title(key), v) } if v := Singular(value); v != key { t.Errorf("%v's singular should be %v, but got %v", value, key, v) } } } func TestAddPlural(t *testing.T) { defer restore() ln := len(pluralInflections) AddPlural("", "") if ln+1 != len(pluralInflections) { t.Errorf("Expected len %d, got %d", ln+1, len(pluralInflections)) } } func TestAddSingular(t *testing.T) { defer restore() ln := len(singularInflections) AddSingular("", "") if ln+1 != len(singularInflections) { t.Errorf("Expected len %d, got %d", ln+1, len(singularInflections)) } } func TestAddIrregular(t *testing.T) { defer restore() ln := len(irregularInflections) AddIrregular("", "") if ln+1 != len(irregularInflections) { t.Errorf("Expected len %d, got %d", ln+1, len(irregularInflections)) } } func TestAddUncountable(t *testing.T) { defer restore() ln := len(uncountableInflections) AddUncountable("", "") if ln+2 != len(uncountableInflections) { t.Errorf("Expected len %d, got %d", ln+2, len(uncountableInflections)) } } func TestGetPlural(t *testing.T) { plurals := GetPlural() if len(plurals) != len(pluralInflections) { t.Errorf("Expected len %d, got %d", len(plurals), len(pluralInflections)) } } func TestGetSingular(t *testing.T) { singular := GetSingular() if len(singular) != len(singularInflections) { t.Errorf("Expected len %d, got %d", len(singular), len(singularInflections)) } } func TestGetIrregular(t *testing.T) { irregular := GetIrregular() if len(irregular) != len(irregularInflections) { t.Errorf("Expected len %d, got %d", len(irregular), len(irregularInflections)) } } func TestGetUncountable(t *testing.T) { uncountables := GetUncountable() if len(uncountables) != len(uncountableInflections) { t.Errorf("Expected len %d, got %d", len(uncountables), len(uncountableInflections)) } } func TestSetPlural(t *testing.T) { defer restore() SetPlural(RegularSlice{{}, {}}) if len(pluralInflections) != 2 { t.Errorf("Expected len 2, got %d", len(pluralInflections)) } } func TestSetSingular(t *testing.T) { defer restore() SetSingular(RegularSlice{{}, {}}) if len(singularInflections) != 2 { t.Errorf("Expected len 2, got %d", len(singularInflections)) } } func TestSetIrregular(t *testing.T) { defer restore() SetIrregular(IrregularSlice{{}, {}}) if len(irregularInflections) != 2 { t.Errorf("Expected len 2, got %d", len(irregularInflections)) } } func TestSetUncountable(t *testing.T) { defer restore() SetUncountable([]string{"", ""}) if len(uncountableInflections) != 2 { t.Errorf("Expected len 2, got %d", len(uncountableInflections)) } }