package xturbo_test import ( "bytes" "testing" "bnema.dev/xturbo" "bnema.dev/xturbo/bigreq" "bnema.dev/xturbo/internal/xtest" "bnema.dev/xturbo/xcmisc" "bnema.dev/xturbo/xproto" ) // Root encodes the requests it issues itself; they must match the generated // encoders byte for byte, and the committed goldens where they exist. func TestBootstrapRequestsMatchGenerated(t *testing.T) { newBuf := func() *xturbo.Buf { b := xturbo.NewBuf(0) var ext xturbo.ExtTable ext.Set(xturbo.ExtBigRequests, 133, 0, 0) ext.Set(xturbo.ExtXCMisc, 136, 0, 0) b.Ext = &ext return b } for _, tc := range []struct { name string root, gen func(*xturbo.Buf) xturbo.Seq golden string }{ {"InternAtom", func(b *xturbo.Buf) xturbo.Seq { return xturbo.EncodeInternAtom(b, false, "XTURBO_") }, func(b *xturbo.Buf) xturbo.Seq { return xproto.InternAtom(b, false, "XTURBO_") }, "xproto/InternAtom"}, {"InternAtomOnlyIfExists", func(b *xturbo.Buf) xturbo.Seq { return xturbo.EncodeInternAtom(b, true, "WM_STATE") }, func(b *xturbo.Buf) xturbo.Seq { return xproto.InternAtom(b, true, "WM_STATE") }, ""}, {"QueryExtension", func(b *xturbo.Buf) xturbo.Seq { return xturbo.EncodeQueryExtension(b, "Generic Event Extension") }, func(b *xturbo.Buf) xturbo.Seq { return xproto.QueryExtension(b, "Generic Event Extension") }, ""}, {"QueryExtensionAligned", func(b *xturbo.Buf) xturbo.Seq { return xturbo.EncodeQueryExtension(b, "XFIXES") }, func(b *xturbo.Buf) xturbo.Seq { return xproto.QueryExtension(b, "XFIXES") }, ""}, {"GetInputFocus", xturbo.EncodeGetInputFocus, xproto.GetInputFocus, ""}, {"BigreqEnable", xturbo.EncodeBigreqEnable, bigreq.Enable, ""}, {"GetXIDRange", xturbo.EncodeGetXIDRange, xcmisc.GetXIDRange, ""}, } { t.Run(tc.name, func(t *testing.T) { rb, gb := newBuf(), newBuf() if tc.root(rb) != 1 || tc.gen(gb) != 1 || rb.Err() != nil || gb.Err() != nil { t.Fatal(rb.Err(), gb.Err()) } if !bytes.Equal(rb.Bytes(), gb.Bytes()) { t.Fatalf("root %x, generated %x", rb.Bytes(), gb.Bytes()) } if tc.golden == "" { return } want, err := xtest.LoadHex("testdata/golden/" + tc.golden + ".req.hex") if err != nil { t.Fatal(err) } if !bytes.Equal(rb.Bytes(), want) { t.Fatalf("root %x, golden %x", rb.Bytes(), want) } }) } // Extension requests fail sticky when the extension is absent. b := xturbo.NewBuf(0) b.Ext = &xturbo.ExtTable{} if xturbo.EncodeGetXIDRange(b) != 0 || b.Err() != xturbo.ErrExtMissing { t.Fatal(b.Err()) } }