1package gen
2
3import (
4 "strings"
5 "testing"
6)
7
8func TestDeclarations(t *testing.T) {
9 h := "/* xkb_fake(void); */\nXKB_EXPORT struct xkb_context *\nxkb_context_new(enum xkb_context_flags flags);"
10 if !declared(h, "xkb_context_new") || declared(h, "xkb_fake") {
11 t.Fatal("incorrect declaration selection")
12 }
13 if declared(h, "xkb_context_unref") {
14 t.Fatal("missing declaration accepted")
15 }
16}
17func TestConstants(t *testing.T) {
18 h := "enum xkb_test { XKB_A = (1 << 2), XKB_B, XKB_C = 0x10 };\n#define XKB_MOD_NAME_SHIFT \"Shift\"\n#define XKB_KEY_dead_acute 0xfe51\n"
19 got := constants(h)
20 for _, want := range []string{"XKB_A = (1 << 2)", "XKB_B = 5", "XKB_C = 0x10", "XKB_MOD_NAME_SHIFT = \"Shift\"", "XKB_KEY_dead_acute = 0xfe51"} {
21 if !strings.Contains(got, want) {
22 t.Fatalf("missing %s in %s", want, got)
23 }
24 }
25}
26
27func TestMethodWhitelist(t *testing.T) {
28 for _, sig := range []string{"func(float64) uint32", "func(bool)", "func(uintptr, ...uintptr) uint32", "func(uint32) float32", "func(uint32) unsafe.Pointer", "func(*int)", "func(uint32) bool"} {
29 if _, err := method("xkb_bad", sig); err == nil {
30 t.Fatalf("accepted %s", sig)
31 }
32 }
33 got, err := method("xkb_ok", "func(uintptr, unsafe.Pointer, int32) uint32")
34 if err != nil {
35 t.Fatal(err)
36 }
37 for _, want := range []string{"purego.Syscall6(f.xkb_ok, a1, uintptr(a2), uintptr(a3), 0, 0, 0)", "return uint32(r)", "a2 unsafe.Pointer"} {
38 if !strings.Contains(got, want) {
39 t.Fatalf("missing %q in %s", want, got)
40 }
41 }
42 if got, _ = method("xkb_seven", "func(uintptr,uint32,uint32,uint32,uint32,uint32,uint32)"); !strings.Contains(got, "purego.Syscall15(") {
43 t.Fatal("seven args must use Syscall15")
44 }
45}