package mdl import ( "os" "path/filepath" "testing" ) func writeMDL(t *testing.T, name, body string) string { t.Helper() p := filepath.Join(t.TempDir(), name) if err := os.WriteFile(p, []byte(body), 0o644); err != nil { t.Fatal(err) } return p } func TestIsASCII(t *testing.T) { ascii := writeMDL(t, "foo.mdl", "newmodel foo\nbeginmodelgeom foo\n") if ok, err := IsASCII(ascii); err != nil || !ok { t.Fatalf("ascii: ok=%v err=%v, want true nil", ok, err) } bin := writeMDL(t, "bar.mdl", "\x00\x01binary\x00garbage") if ok, err := IsASCII(bin); err != nil || ok { t.Fatalf("binary: ok=%v err=%v, want false nil", ok, err) } hash := writeMDL(t, "baz.mdl", "# a comment\nnewmodel baz\n") if ok, _ := IsASCII(hash); !ok { t.Fatal("leading # should be ascii") } } func TestExpectedName(t *testing.T) { for in, want := range map[string]string{ "a/b/Foo.MDL": "Foo", "waxbt_b_091.mdl": "waxbt_b_091", "x.mdl": "x", } { if got := ExpectedName(in); got != want { t.Errorf("ExpectedName(%q)=%q want %q", in, got, want) } } } func TestCheckNames(t *testing.T) { // Header token mismatch + base-node mismatch in one file. body := "newmodel wrong\n" + "setsupermodel wrong a_base\n" + "beginmodelgeom foo\n" + " node dummy Wmgst_m_081\n" + " parent null\n" + " endnode\n" + "endmodelgeom foo\n" + "donemodel foo\n" p := writeMDL(t, "foo.mdl", body) got, err := CheckNames(p) if err != nil { t.Fatal(err) } // Expected stem "foo": newmodel(wrong), setsupermodel(wrong), base node(Wmgst_m_081). if len(got) != 3 { t.Fatalf("got %d mismatches, want 3: %+v", len(got), got) } if got[0].What != "newmodel" || got[0].Got != "wrong" || got[0].Line != 1 { t.Errorf("first mismatch = %+v", got[0]) } base := got[len(got)-1] if base.What != "root node" || base.Got != "Wmgst_m_081" || base.Line != 0 { t.Errorf("base mismatch = %+v", base) } // Clean model -> no mismatches. clean := writeMDL(t, "bar.mdl", "newmodel bar\nbeginmodelgeom bar\n node dummy bar\n parent null\n endnode\nendmodelgeom bar\ndonemodel bar\n") if got, _ := CheckNames(clean); len(got) != 0 { t.Fatalf("clean model reported mismatches: %+v", got) } // Binary model -> nil, no error. bin := writeMDL(t, "b.mdl", "\x00\x00binary") if got, _ := CheckNames(bin); got != nil { t.Fatalf("binary reported mismatches: %+v", got) } } func TestFixNamesRoundTrips(t *testing.T) { body := "newmodel wrong\n" + "setsupermodel wrong\n" + "beginmodelgeom wrong\n" + " node dummy Wmgst_m_081\n" + " parent null\n" + " endnode\n" + "endmodelgeom wrong\n" + "donemodel wrong\n" out, changed := FixNames([]byte(body), "foo") if !changed { t.Fatal("expected changed=true") } p := filepath.Join(t.TempDir(), "foo.mdl") if err := os.WriteFile(p, out, 0o644); err != nil { t.Fatal(err) } got, err := CheckNames(p) if err != nil { t.Fatal(err) } if len(got) != 0 { t.Fatalf("fixed model still has mismatches: %+v\n%s", got, out) } // Idempotent: fixing a clean model changes nothing. if _, changed := FixNames(out, "foo"); changed { t.Fatal("second fix reported a change") } }