package server import ( "strings" "testing" "github.com/bnema/go-wayland-bindings/spec" ) func TestUntypedNewIDEvent(t *testing.T) { p := &spec.Protocol{Interfaces: []spec.Interface{{Name: "test_device", Version: 1, Events: []spec.Message{{Name: "created", Args: []spec.Arg{{Name: "id", Type: "new_id"}}}}}}} b, err := Generate(p, Options{Package: "test"}) if err != nil { t.Fatal(err) } s := string(b) if !strings.HasPrefix(s, "// Code generated by wlbgen; DO NOT EDIT.\n") { t.Fatalf("unexpected header:\n%s", s) } if !strings.Contains(s, `Signature: "sun"`) || !strings.Contains(s, `server.String(&p, id.Iface().Name, false), server.Uint(uint32(id.Version())), server.NewID(id)`) { t.Fatalf("untyped new_id event missing wire args:\n%s", s) } } func TestToolHeader(t *testing.T) { p := &spec.Protocol{Interfaces: []spec.Interface{{Name: "test_device", Version: 1}}} b, err := Generate(p, Options{Package: "test", Tool: "wlgen"}) if err != nil { t.Fatal(err) } if !strings.HasPrefix(string(b), "// Code generated by wlgen; DO NOT EDIT.\n") { t.Fatalf("unexpected header:\n%s", b) } } func TestUnknownInterface(t *testing.T) { p := &spec.Protocol{Interfaces: []spec.Interface{{Name: "a", Version: 1, Events: []spec.Message{{Name: "e", Args: []spec.Arg{{Name: "o", Type: "object", Interface: "missing"}}}}}}} if _, err := Generate(p, Options{Package: "test"}); err == nil { t.Fatal("expected error for unknown interface") } } func TestSignature(t *testing.T) { cases := []struct { m spec.Message want string }{ {spec.Message{Name: "bind", Args: []spec.Arg{{Type: "uint"}, {Type: "new_id"}}}, "usun"}, {spec.Message{Since: 2, Args: []spec.Arg{{Type: "object", AllowNull: true}, {Type: "fd"}, {Type: "fixed"}}}, "2?ohf"}, {spec.Message{Args: []spec.Arg{{Type: "new_id", Interface: "wl_surface"}}}, "n"}, } for _, c := range cases { if got := signature(c.m); got != c.want { t.Errorf("signature(%+v)=%q, want %q", c.m, got, c.want) } } } func TestLicenseHeader(t *testing.T) { p := &spec.Protocol{Interfaces: []spec.Interface{{Name: "test_device", Version: 1}}} const copyright = "\n Copyright 2024 Someone\n\n Permission is hereby granted\n" gen := func(o Options) string { o.Package = "test" b, err := Generate(p, o) if err != nil { t.Fatal(err) } return string(b) } got := gen(Options{Copyright: copyright, SPDX: "LGPL-2.1-or-later"}) want := "// Code generated by wlbgen; DO NOT EDIT.\n// SPDX-License-Identifier: LGPL-2.1-or-later\n\n" + "// Upstream protocol copyright and license:\n// Copyright 2024 Someone\n//\n// Permission is hereby granted\n\npackage test\n" if !strings.HasPrefix(got, want) { t.Fatalf("header:\n%s\nwant prefix:\n%s", got, want) } // An SPDX line already inside the copyright text is not repeated. got = gen(Options{Copyright: "Copyright X\nSPDX-License-Identifier: MIT\n", SPDX: "MIT"}) if n := strings.Count(got, "SPDX-License-Identifier: MIT"); n != 1 { t.Fatalf("SPDX line appears %d times:\n%s", n, got) } // Copyright without SPDX. got = gen(Options{Copyright: copyright}) if strings.Contains(got, "SPDX") || !strings.Contains(got, "// Copyright 2024 Someone\n") { t.Fatalf("unexpected header:\n%s", got) } // Neither: the header stays minimal. if got = gen(Options{}); !strings.HasPrefix(got, "// Code generated by wlbgen; DO NOT EDIT.\npackage test\n") { t.Fatalf("unexpected header:\n%s", got) } }