package main import ( "strings" "testing" ) func TestResolvePinnedValues(t *testing.T) { found := map[string]bool{} for _, m := range testModules(t) { rs, err := resolveRequests(m) if err != nil { t.Fatal(err) } for _, r := range rs { if r.Values != nil { found[m.Pkg+"/"+r.Name] = true if len(r.Values.Fields) == 0 { t.Fatal("empty values") } for i, f := range r.Values.Fields { if i > 0 && r.Values.Fields[i-1].Value >= f.Value { t.Fatal("not in bit order") } } for _, p := range r.Params { if p.Param == "valueMask" { t.Fatal("mask leaked into params") } } } } } for _, name := range []string{"xproto/CreateWindow", "xproto/ChangeWindowAttributes", "xproto/ConfigureWindow", "xproto/CreateGC", "xproto/ChangeGC", "xproto/ChangeKeyboardControl", "render/CreatePicture", "render/ChangePicture"} { if !found[name] { t.Error("missing", name) } } if len(found) != 8 { t.Fatal(found) } } func TestResolveValueSwitches(t *testing.T) { prefix := `03` high := `High` low := `Low` good := `value_mask` + high + low + `` for _, tc := range []struct { name, body string valid bool }{ {"sorted", good, true}, {"expression", strings.Replace(good, "value_mask", "value_mask", 1), false}, {"duplicate", strings.Replace(good, low, high, 1), false}, {"unknown bit", strings.Replace(good, ">Low<", ">Missing<", 1), false}, {"non scalar", strings.Replace(good, `type="INT32"`, `type="Pair"`, 1), false}, {"trailing field", good + ``, false}, } { t.Run(tc.name, func(t *testing.T) { xml := strings.Replace(prefix, `` n, err := parseXML("values.xml", strings.NewReader(xml)) if err != nil { t.Fatal(err) } ms, err := resolveModules([]*Node{n}) if err != nil { t.Fatal(err) } rs, err := resolveRequests(ms[0]) if !tc.valid { if err == nil || !strings.Contains(err.Error(), "values.xml:1:") { t.Fatalf("got %v", err) } return } if err != nil { t.Fatal(err) } v := rs[0].Values if v.Fields[0].Field.Name != "Low" || v.Fields[1].Field.Name != "High" { t.Fatal("XML order used instead of bit order") } decl, err := requestDecl(ms[0], rs[0]) if err != nil { t.Fatal(err) } if !strings.Contains(decl, "uint32(v.Low)") || !strings.Contains(decl, "if v.High") { t.Fatal(decl) } }) } }