1package shaders
2
3import (
4 "bytes"
5 "os"
6 "os/exec"
7 "path/filepath"
8 "testing"
9)
10
11func TestEmbeddedSPIRV(t *testing.T) {
12 for _, tc := range []struct {
13 name string
14 data []byte
15 }{{"list vertex", ListVertex}, {"list fragment", ListFragment}} {
16 if len(tc.data) < 20 || !bytes.Equal(tc.data[:4], []byte{3, 2, 35, 7}) || len(tc.data)%4 != 0 {
17 t.Fatalf("%s: not SPIR-V", tc.name)
18 }
19 }
20}
21
22func TestShaderFreshness(t *testing.T) {
23 bin, err := exec.LookPath("glslc")
24 if err != nil {
25 t.Skip("glslc not installed; committed SPIR-V remains usable")
26 }
27 for _, tc := range []struct {
28 file, stage string
29 embedded []byte
30 }{{"list.vert", "vertex", ListVertex}, {"list.frag", "fragment", ListFragment}} {
31 out := filepath.Join(t.TempDir(), "shader.spv")
32 cmd := exec.Command(bin, "-O", "-fshader-stage="+tc.stage, "-o", out, tc.file)
33 if log, err := cmd.CombinedOutput(); err != nil {
34 t.Fatalf("compile %s: %v: %s", tc.file, err, log)
35 }
36 actual, err := os.ReadFile(out)
37 if err != nil {
38 t.Fatal(err)
39 }
40 if !bytes.Equal(actual, tc.embedded) {
41 t.Fatalf("%s SPIR-V stale; run go generate ./...", tc.file)
42 }
43 }
44}