diff --git a/text/text_test.go b/text/text_test.go new file mode 100644 index 0000000..0b7ca10 --- /dev/null +++ b/text/text_test.go @@ -0,0 +1,218 @@ +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() = %+v, want %+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) + } + }) + } +}