cli/pkg/i18n/context_test.go
Snider 67e7e552f3 refactor(i18n): implement extensible handler chain architecture
Refactor the i18n package for extensibility without breaking changes:

- Add KeyHandler interface for pluggable namespace handlers
- Add Loader interface for format-agnostic translation loading
- Add TranslationContext for translation disambiguation
- Implement 6 built-in handlers (Label, Progress, Count, Done, Fail, Numeric)
- Update T() to use handler chain instead of hardcoded logic
- Add handler management methods (AddHandler, PrependHandler, ClearHandlers)

File reorganisation:
- types.go: all type definitions
- loader.go: Loader interface + FSLoader (from mutate.go, checks.go)
- handler.go: KeyHandler interface + built-in handlers
- context.go: TranslationContext + C() builder
- hooks.go: renamed from actions.go
- service.go: merged interfaces.go content

Deleted: interfaces.go, mode.go, mutate.go, checks.go

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 18:42:41 +00:00

125 lines
3 KiB
Go

package i18n
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestTranslationContext_C(t *testing.T) {
t.Run("creates context", func(t *testing.T) {
ctx := C("navigation")
assert.NotNil(t, ctx)
assert.Equal(t, "navigation", ctx.Context)
})
t.Run("empty context", func(t *testing.T) {
ctx := C("")
assert.NotNil(t, ctx)
assert.Empty(t, ctx.Context)
})
}
func TestTranslationContext_WithGender(t *testing.T) {
t.Run("sets gender", func(t *testing.T) {
ctx := C("context").WithGender("masculine")
assert.Equal(t, "masculine", ctx.Gender)
})
t.Run("nil safety", func(t *testing.T) {
var ctx *TranslationContext
result := ctx.WithGender("masculine")
assert.Nil(t, result)
})
}
func TestTranslationContext_Formality(t *testing.T) {
t.Run("Formal", func(t *testing.T) {
ctx := C("context").Formal()
assert.Equal(t, FormalityFormal, ctx.Formality)
})
t.Run("Informal", func(t *testing.T) {
ctx := C("context").Informal()
assert.Equal(t, FormalityInformal, ctx.Formality)
})
t.Run("WithFormality", func(t *testing.T) {
ctx := C("context").WithFormality(FormalityFormal)
assert.Equal(t, FormalityFormal, ctx.Formality)
})
t.Run("nil safety", func(t *testing.T) {
var ctx *TranslationContext
assert.Nil(t, ctx.Formal())
assert.Nil(t, ctx.Informal())
assert.Nil(t, ctx.WithFormality(FormalityFormal))
})
}
func TestTranslationContext_Extra(t *testing.T) {
t.Run("Set and Get", func(t *testing.T) {
ctx := C("context").Set("key", "value")
assert.Equal(t, "value", ctx.Get("key"))
})
t.Run("Get missing key", func(t *testing.T) {
ctx := C("context")
assert.Nil(t, ctx.Get("missing"))
})
t.Run("nil safety Set", func(t *testing.T) {
var ctx *TranslationContext
result := ctx.Set("key", "value")
assert.Nil(t, result)
})
t.Run("nil safety Get", func(t *testing.T) {
var ctx *TranslationContext
assert.Nil(t, ctx.Get("key"))
})
}
func TestTranslationContext_Getters(t *testing.T) {
t.Run("ContextString", func(t *testing.T) {
ctx := C("navigation")
assert.Equal(t, "navigation", ctx.ContextString())
})
t.Run("ContextString nil", func(t *testing.T) {
var ctx *TranslationContext
assert.Empty(t, ctx.ContextString())
})
t.Run("GenderString", func(t *testing.T) {
ctx := C("context").WithGender("feminine")
assert.Equal(t, "feminine", ctx.GenderString())
})
t.Run("GenderString nil", func(t *testing.T) {
var ctx *TranslationContext
assert.Empty(t, ctx.GenderString())
})
t.Run("FormalityValue", func(t *testing.T) {
ctx := C("context").Formal()
assert.Equal(t, FormalityFormal, ctx.FormalityValue())
})
t.Run("FormalityValue nil", func(t *testing.T) {
var ctx *TranslationContext
assert.Equal(t, FormalityNeutral, ctx.FormalityValue())
})
}
func TestTranslationContext_Chaining(t *testing.T) {
ctx := C("navigation").
WithGender("masculine").
Formal().
Set("locale", "de-DE")
assert.Equal(t, "navigation", ctx.Context)
assert.Equal(t, "masculine", ctx.Gender)
assert.Equal(t, FormalityFormal, ctx.Formality)
assert.Equal(t, "de-DE", ctx.Get("locale"))
}