1package xturbo_test
2
3import (
4 "bytes"
5 "encoding/binary"
6 "testing"
7
8 "bnema.dev/xturbo"
9 "bnema.dev/xturbo/internal/xtest"
10 "bnema.dev/xturbo/xfixes"
11 "bnema.dev/xturbo/xproto"
12)
13
14func TestRequestGoldens(t *testing.T) {
15 for _, tc := range []struct {
16 name string
17 encode func(*xturbo.Buf, uint32) xturbo.Seq
18 }{
19 {"xproto/MapWindow", func(b *xturbo.Buf, id uint32) xturbo.Seq { return xproto.MapWindow(b, xproto.Window(id)) }},
20 {"xproto/GetGeometry", func(b *xturbo.Buf, id uint32) xturbo.Seq { return xproto.GetGeometry(b, xproto.Drawable(id)) }},
21 {"xfixes/QueryVersion", func(b *xturbo.Buf, _ uint32) xturbo.Seq { return xfixes.QueryVersion(b, 6, 0) }},
22 } {
23 t.Run(tc.name, func(t *testing.T) {
24 want, err := xtest.LoadHex("testdata/golden/" + tc.name + ".req.hex")
25 if err != nil {
26 t.Fatal(err)
27 }
28 b := xturbo.NewBuf(0)
29 var ext xturbo.ExtTable
30 ext.Set(xturbo.ExtXFixes, want[0], 0, 0)
31 b.Ext = &ext
32 id := binary.LittleEndian.Uint32(want[4:])
33 if tc.encode(b, id) != 1 || b.Err() != nil {
34 t.Fatalf("seq/err: %v", b.Err())
35 }
36 if !bytes.Equal(b.Bytes(), want) {
37 t.Fatalf("got %x want %x", b.Bytes(), want)
38 }
39 })
40 }
41}
42func TestMissingExtension(t *testing.T) {
43 for _, table := range []*xturbo.ExtTable{nil, {}} {
44 b := xturbo.NewBuf(0)
45 b.Ext = table
46 if xfixes.QueryVersion(b, 6, 0) != 0 || b.Err() != xturbo.ErrExtMissing || b.Len() != 0 || xproto.MapWindow(b, 1) != 0 {
47 t.Fatal("missing extension must fail sticky")
48 }
49 }
50}
51func TestAllocFixedRequests(t *testing.T) {
52 b := xturbo.NewBuf(0)
53 var ext xturbo.ExtTable
54 ext.Set(xturbo.ExtXFixes, 138, 0, 0)
55 b.Ext = &ext
56 if n := testing.AllocsPerRun(1000, func() { b.Reset(); xproto.MapWindow(b, 1); xproto.GetGeometry(b, 1); xfixes.QueryVersion(b, 6, 0) }); n != 0 {
57 t.Fatal(n)
58 }
59 if b.Err() != nil {
60 t.Fatal(b.Err())
61 }
62}