- Article("") now returns "" for consistency with other grammar
functions (PastTense, Gerund, PluralForm, Label all return "")
- Add doc comment to getMessage() for consistency with other
internal helpers
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
303 lines
5.6 KiB
Go
303 lines
5.6 KiB
Go
package i18n
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestPastTense(t *testing.T) {
|
|
tests := []struct {
|
|
verb string
|
|
expected string
|
|
}{
|
|
// Irregular verbs
|
|
{"be", "was"},
|
|
{"have", "had"},
|
|
{"do", "did"},
|
|
{"go", "went"},
|
|
{"make", "made"},
|
|
{"get", "got"},
|
|
{"run", "ran"},
|
|
{"write", "wrote"},
|
|
{"build", "built"},
|
|
{"find", "found"},
|
|
{"keep", "kept"},
|
|
{"think", "thought"},
|
|
|
|
// Regular verbs - ends in -e
|
|
{"delete", "deleted"},
|
|
{"save", "saved"},
|
|
{"create", "created"},
|
|
{"update", "updated"},
|
|
{"remove", "removed"},
|
|
|
|
// Regular verbs - consonant + y -> ied
|
|
{"copy", "copied"},
|
|
{"carry", "carried"},
|
|
{"try", "tried"},
|
|
|
|
// Regular verbs - vowel + y -> yed
|
|
{"play", "played"},
|
|
{"stay", "stayed"},
|
|
{"enjoy", "enjoyed"},
|
|
|
|
// Regular verbs - CVC doubling
|
|
{"stop", "stopped"},
|
|
{"drop", "dropped"},
|
|
{"plan", "planned"},
|
|
|
|
// Regular verbs - no doubling
|
|
{"install", "installed"},
|
|
{"open", "opened"},
|
|
{"start", "started"},
|
|
|
|
// Edge cases
|
|
{"", ""},
|
|
{" delete ", "deleted"},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.verb, func(t *testing.T) {
|
|
result := PastTense(tt.verb)
|
|
assert.Equal(t, tt.expected, result)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestGerund(t *testing.T) {
|
|
tests := []struct {
|
|
verb string
|
|
expected string
|
|
}{
|
|
// Irregular verbs
|
|
{"be", "being"},
|
|
{"have", "having"},
|
|
{"run", "running"},
|
|
{"write", "writing"},
|
|
|
|
// Regular verbs - drop -e
|
|
{"delete", "deleting"},
|
|
{"save", "saving"},
|
|
{"create", "creating"},
|
|
{"update", "updating"},
|
|
|
|
// Regular verbs - ie -> ying
|
|
{"die", "dying"},
|
|
{"lie", "lying"},
|
|
{"tie", "tying"},
|
|
|
|
// Regular verbs - CVC doubling
|
|
{"stop", "stopping"},
|
|
{"run", "running"},
|
|
{"plan", "planning"},
|
|
|
|
// Regular verbs - no doubling
|
|
{"install", "installing"},
|
|
{"open", "opening"},
|
|
{"start", "starting"},
|
|
{"play", "playing"},
|
|
|
|
// Edge cases
|
|
{"", ""},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.verb, func(t *testing.T) {
|
|
result := Gerund(tt.verb)
|
|
assert.Equal(t, tt.expected, result)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestPluralize(t *testing.T) {
|
|
tests := []struct {
|
|
noun string
|
|
count int
|
|
expected string
|
|
}{
|
|
// Singular (count = 1)
|
|
{"file", 1, "file"},
|
|
{"repo", 1, "repo"},
|
|
|
|
// Regular plurals
|
|
{"file", 2, "files"},
|
|
{"repo", 5, "repos"},
|
|
{"user", 0, "users"},
|
|
|
|
// -s, -ss, -sh, -ch, -x, -z -> -es
|
|
{"bus", 2, "buses"},
|
|
{"class", 3, "classes"},
|
|
{"bush", 2, "bushes"},
|
|
{"match", 2, "matches"},
|
|
{"box", 2, "boxes"},
|
|
|
|
// consonant + y -> -ies
|
|
{"city", 2, "cities"},
|
|
{"repository", 3, "repositories"},
|
|
{"copy", 2, "copies"},
|
|
|
|
// vowel + y -> -ys
|
|
{"key", 2, "keys"},
|
|
{"day", 2, "days"},
|
|
{"toy", 2, "toys"},
|
|
|
|
// Irregular nouns
|
|
{"child", 2, "children"},
|
|
{"person", 3, "people"},
|
|
{"man", 2, "men"},
|
|
{"woman", 2, "women"},
|
|
{"foot", 2, "feet"},
|
|
{"tooth", 2, "teeth"},
|
|
{"mouse", 2, "mice"},
|
|
{"index", 2, "indices"},
|
|
|
|
// Unchanged plurals
|
|
{"fish", 2, "fish"},
|
|
{"sheep", 2, "sheep"},
|
|
{"deer", 2, "deer"},
|
|
{"species", 2, "species"},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.noun, func(t *testing.T) {
|
|
result := Pluralize(tt.noun, tt.count)
|
|
assert.Equal(t, tt.expected, result)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestPluralForm(t *testing.T) {
|
|
tests := []struct {
|
|
noun string
|
|
expected string
|
|
}{
|
|
// Regular
|
|
{"file", "files"},
|
|
{"repo", "repos"},
|
|
|
|
// -es endings
|
|
{"box", "boxes"},
|
|
{"class", "classes"},
|
|
{"bush", "bushes"},
|
|
{"match", "matches"},
|
|
|
|
// -ies endings
|
|
{"city", "cities"},
|
|
{"copy", "copies"},
|
|
|
|
// Irregular
|
|
{"child", "children"},
|
|
{"person", "people"},
|
|
|
|
// Title case preservation
|
|
{"Child", "Children"},
|
|
{"Person", "People"},
|
|
|
|
// Empty
|
|
{"", ""},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.noun, func(t *testing.T) {
|
|
result := PluralForm(tt.noun)
|
|
assert.Equal(t, tt.expected, result)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestArticle(t *testing.T) {
|
|
tests := []struct {
|
|
word string
|
|
expected string
|
|
}{
|
|
// Regular vowels -> "an"
|
|
{"error", "an"},
|
|
{"apple", "an"},
|
|
{"issue", "an"},
|
|
{"update", "an"},
|
|
{"item", "an"},
|
|
{"object", "an"},
|
|
|
|
// Regular consonants -> "a"
|
|
{"file", "a"},
|
|
{"repo", "a"},
|
|
{"commit", "a"},
|
|
{"branch", "a"},
|
|
{"test", "a"},
|
|
|
|
// Consonant sounds despite vowel start -> "a"
|
|
{"user", "a"},
|
|
{"union", "a"},
|
|
{"unique", "a"},
|
|
{"unit", "a"},
|
|
{"universe", "a"},
|
|
{"one", "a"},
|
|
{"once", "a"},
|
|
{"euro", "a"},
|
|
|
|
// Vowel sounds despite consonant start -> "an"
|
|
{"hour", "an"},
|
|
{"honest", "an"},
|
|
{"honour", "an"},
|
|
{"heir", "an"},
|
|
|
|
// Edge cases
|
|
{"", ""},
|
|
{" error ", "an"},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.word, func(t *testing.T) {
|
|
result := Article(tt.word)
|
|
assert.Equal(t, tt.expected, result)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestTitle(t *testing.T) {
|
|
tests := []struct {
|
|
input string
|
|
expected string
|
|
}{
|
|
{"hello world", "Hello World"},
|
|
{"file deleted", "File Deleted"},
|
|
{"ALREADY CAPS", "ALREADY CAPS"},
|
|
{"", ""},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.input, func(t *testing.T) {
|
|
result := Title(tt.input)
|
|
assert.Equal(t, tt.expected, result)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestQuote(t *testing.T) {
|
|
tests := []struct {
|
|
input string
|
|
expected string
|
|
}{
|
|
{"file.txt", `"file.txt"`},
|
|
{"", `""`},
|
|
{"hello world", `"hello world"`},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.input, func(t *testing.T) {
|
|
result := Quote(tt.input)
|
|
assert.Equal(t, tt.expected, result)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestTemplateFuncs(t *testing.T) {
|
|
funcs := TemplateFuncs()
|
|
|
|
// Check all expected functions are present
|
|
expectedFuncs := []string{"title", "lower", "upper", "past", "gerund", "plural", "pluralForm", "article", "quote"}
|
|
for _, name := range expectedFuncs {
|
|
assert.Contains(t, funcs, name, "TemplateFuncs should contain %s", name)
|
|
}
|
|
}
|