Files
strom/mc/proto/smart_convert_test.go
T
2026-06-27 13:54:54 +02:00

69 lines
2.3 KiB
Go

package proto_test
import (
"reflect"
"testing"
proto2 "github.com/admin-else/strom/mc/proto"
"github.com/admin-else/strom/mc/proto_generated/v1_21_11"
"github.com/admin-else/strom/mc/proto_generated/v1_21_8"
"github.com/admin-else/strom/mc/proto_generated/v1_21_9"
)
func TestCanSmartConvert(t *testing.T) {
packet := &v1_21_9.PlayToClientPacketPosition{Flags: v1_21_9.PlayToClientPositionUpdateRelatives{Val: 2}, X: 5}
can := proto2.SmartConvertibleTo(reflect.TypeOf(packet), reflect.TypeFor[*v1_21_8.PlayToClientPacketPosition]())
if !can {
t.Fatal("can't smart convert")
}
ret := proto2.SmartConvert(reflect.ValueOf(packet), reflect.TypeFor[*v1_21_8.PlayToClientPacketPosition]())
t.Logf("%#v", ret)
}
func TestCanSmartConvertTags(t *testing.T) {
packet := &v1_21_9.ConfigurationToClientPacketTags{}
targetType := reflect.TypeFor[*v1_21_8.ConfigurationToClientPacketTags]()
can := proto2.SmartConvertibleTo(reflect.TypeOf(packet), targetType)
if !can {
t.Fatal("can't smart convert")
}
ret := proto2.SmartConvert(reflect.ValueOf(packet), targetType)
t.Logf("%#v", ret)
}
func TestRegisterUntilLatest(t *testing.T) {
conn := proto2.NewConn()
ok := false
conn.RegisterCriticalUntilLatest(func(p *v1_21_8.ConfigurationToServerPacketFinishConfiguration) error {
ok = true
return nil
})
err := conn.Fire(&v1_21_11.ConfigurationToServerPacketFinishConfiguration{})
if err != nil {
t.Errorf("fire failed err: %v", err)
}
if !ok {
t.Errorf("handler not called")
}
}
var TestData = []struct{ V, T, E any }{
{V: &v1_21_9.PlayToClientPacketPosition{Flags: v1_21_9.PlayToClientPositionUpdateRelatives{Val: 2}, X: 5}, T: &v1_21_8.PlayToClientPacketPosition{}},
{V: &v1_21_9.ConfigurationToClientPacketTags{}, T: &v1_21_8.ConfigurationToClientPacketTags{}},
{V: &v1_21_11.PlayToServerPacketChatMessage{Signature: &[256]byte{}}, T: &v1_21_8.PlayToServerPacketChatMessage{}},
}
func TestSmartConvert(t *testing.T) {
for _, d := range TestData {
can := proto2.SmartConvertibleTo(reflect.TypeOf(d.V), reflect.TypeOf(d.T))
if !can {
t.Errorf("can't smart convert %#v to %#v", d.V, d.T)
continue
}
got := proto2.SmartConvert(reflect.ValueOf(d.V), reflect.TypeOf(d.T))
if d.E != nil && !reflect.DeepEqual(got.Interface(), d.E) {
t.Errorf("got %#v, want %#v", got.Interface(), d.E)
}
}
}