package xturbo_test import ( "bytes" "encoding/binary" "testing" "bnema.dev/xturbo" "bnema.dev/xturbo/internal/xtest" "bnema.dev/xturbo/xfixes" "bnema.dev/xturbo/xproto" ) func TestRequestGoldens(t *testing.T) { for _, tc := range []struct { name string encode func(*xturbo.Buf, uint32) xturbo.Seq }{ {"xproto/MapWindow", func(b *xturbo.Buf, id uint32) xturbo.Seq { return xproto.MapWindow(b, xproto.Window(id)) }}, {"xproto/GetGeometry", func(b *xturbo.Buf, id uint32) xturbo.Seq { return xproto.GetGeometry(b, xproto.Drawable(id)) }}, {"xfixes/QueryVersion", func(b *xturbo.Buf, _ uint32) xturbo.Seq { return xfixes.QueryVersion(b, 6, 0) }}, } { t.Run(tc.name, func(t *testing.T) { want, err := xtest.LoadHex("testdata/golden/" + tc.name + ".req.hex") if err != nil { t.Fatal(err) } b := xturbo.NewBuf(0) var ext xturbo.ExtTable ext.Set(xturbo.ExtXFixes, want[0], 0, 0) b.Ext = &ext id := binary.LittleEndian.Uint32(want[4:]) if tc.encode(b, id) != 1 || b.Err() != nil { t.Fatalf("seq/err: %v", b.Err()) } if !bytes.Equal(b.Bytes(), want) { t.Fatalf("got %x want %x", b.Bytes(), want) } }) } } func TestMissingExtension(t *testing.T) { for _, table := range []*xturbo.ExtTable{nil, {}} { b := xturbo.NewBuf(0) b.Ext = table if xfixes.QueryVersion(b, 6, 0) != 0 || b.Err() != xturbo.ErrExtMissing || b.Len() != 0 || xproto.MapWindow(b, 1) != 0 { t.Fatal("missing extension must fail sticky") } } } func TestAllocFixedRequests(t *testing.T) { b := xturbo.NewBuf(0) var ext xturbo.ExtTable ext.Set(xturbo.ExtXFixes, 138, 0, 0) b.Ext = &ext if n := testing.AllocsPerRun(1000, func() { b.Reset(); xproto.MapWindow(b, 1); xproto.GetGeometry(b, 1); xfixes.QueryVersion(b, 6, 0) }); n != 0 { t.Fatal(n) } if b.Err() != nil { t.Fatal(b.Err()) } }