package text import ( "encoding/json" "reflect" "testing" ) func TestComponent_JSON(t *testing.T) { tests := []struct { name string json string want Component wantErr bool }{ { name: "simple text", json: `"hello"`, want: Component{Text: "hello"}, }, { name: "object text", json: `{"text":"hello","bold":true}`, want: Component{Text: "hello", Bold: ptr(true)}, }, { name: "array of components", json: `["hello", {"text":" world","color":"red"}]`, want: Component{ Text: "hello", Extra: []Component{ {Text: " world", Color: "red"}, }, }, }, { name: "complex translation", json: `{"translate":"chat.type.text","with":["Player",{"text":"hello","italic":true}]}`, want: Component{ Translate: "chat.type.text", With: []Component{ {Text: "Player"}, {Text: "hello", Italic: ptr(true)}, }, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { var got Component if err := json.Unmarshal([]byte(tt.json), &got); (err != nil) != tt.wantErr { t.Fatalf("UnmarshalJSON() error = %v, wantErr %v", err, tt.wantErr) } if !reflect.DeepEqual(got, tt.want) { t.Errorf("UnmarshalJSON() got = %+v, want %+v", got, tt.want) } marshaled, err := json.Marshal(got) if err != nil { t.Fatalf("MarshalJSON() error = %v", err) } var got2 Component if err := json.Unmarshal(marshaled, &got2); err != nil { t.Fatalf("UnmarshalJSON() back error = %v", err) } if !reflect.DeepEqual(got2, tt.want) { t.Errorf("Roundtrip failed: got = %+v, want %+v", got2, tt.want) } }) } } func TestComponent_NBT(t *testing.T) { tests := []struct { name string nbt any want Component }{ { name: "simple text", nbt: "hello", want: Component{Text: "hello"}, }, { name: "object text", nbt: map[string]any{ "text": "hello", "bold": int8(1), }, want: Component{Text: "hello", Bold: ptr(true)}, }, { name: "extra components", nbt: map[string]any{ "text": "hello", "extra": []any{ map[string]any{"text": " world", "color": "red"}, }, }, want: Component{ Text: "hello", Extra: []Component{ {Text: " world", Color: "red"}, }, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { var got Component if err := got.FromNBT(tt.nbt); err != nil { t.Fatalf("FromNBT() error = %v", err) } if !reflect.DeepEqual(got, tt.want) { t.Errorf("FromNBT() got = %+v, want %+v", got, tt.want) } nbtVal := got.ToNBT() var got2 Component if err := got2.FromNBT(nbtVal); err != nil { t.Fatalf("FromNBT() back error = %v", err) } if !reflect.DeepEqual(got2, tt.want) { t.Errorf("Roundtrip failed: got = %+v, want %+v", got2, tt.want) } }) } } func TestPretty(t *testing.T) { tests := []struct { name string s string want Component }{ { name: "simple text", s: "Hello", want: Component{Text: "Hello"}, }, { name: "color and bold", s: "§c§lHello", want: Component{ Extra: []Component{ {Text: "Hello", Color: "red", Bold: ptr(true)}, }, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got := Pretty(tt.s) if got.Text != tt.want.Text { t.Errorf("Pretty().Text = %v, want %v", got.Text, tt.want.Text) } if !reflect.DeepEqual(got.Extra, tt.want.Extra) { t.Errorf("Pretty().Extra = %+v, want %+v", got.Extra, tt.want.Extra) } }) } } func TestPrettyF(t *testing.T) { got := PrettyF("Hello §b%s", "World") want := &Component{ Text: "Hello ", Extra: []Component{ {Text: "World", Color: "aqua"}, }, } if !reflect.DeepEqual(got, want) { t.Errorf("PrettyF() = \n%+v\n, want \n%+v", got, want) } } func TestComponent_String(t *testing.T) { tests := []struct { name string comp Component want string }{ { name: "simple text", comp: Component{Text: "Hello"}, want: "Hello", }, { name: "color and bold", comp: Component{ Extra: []Component{ {Text: "Hello", Color: "red", Bold: ptr(true)}, }, }, want: "§c§lHello", }, { name: "hex color", comp: Component{ Color: "#ff0000", Text: "Red", }, want: "§x§f§f§0§0§0§0Red", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := tt.comp.String(); got != tt.want { t.Errorf("Component.String() = %v, want %v", got, tt.want) } }) } }