package bfcodegen import ( "git.blackforestbytes.com/BlackForestBytes/goext/langext" "git.blackforestbytes.com/BlackForestBytes/goext/tst" "os" "path/filepath" "strings" "testing" ) func TestProcessCSIDFileSimple(t *testing.T) { dir := t.TempDir() src := `package mymodels type UserID string // @csid:type [USR] type OrderID string // @csid:type [ORD] ` fp := writeTestFile(t, dir, "models.go", src) ids, pkg, err := processCSIDFile(dir, fp, false) tst.AssertNoErr(t, err) tst.AssertEqual(t, pkg, "mymodels") tst.AssertEqual(t, len(ids), 2) tst.AssertEqual(t, ids[0].Name, "UserID") tst.AssertEqual(t, ids[0].Prefix, "USR") tst.AssertEqual(t, ids[1].Name, "OrderID") tst.AssertEqual(t, ids[1].Prefix, "ORD") tst.AssertEqual(t, ids[0].FileRelative, "models.go") } func TestProcessCSIDFilePrefixMustBeUppercase(t *testing.T) { dir := t.TempDir() // lowercase prefix should not match the regex (only [A-Z0-9]{3}) src := `package x type FooID string // @csid:type [usr] ` fp := writeTestFile(t, dir, "x.go", src) ids, pkg, err := processCSIDFile(dir, fp, false) tst.AssertNoErr(t, err) tst.AssertEqual(t, pkg, "x") tst.AssertEqual(t, len(ids), 0) } func TestProcessCSIDFileGeneratedHeaderSkipped(t *testing.T) { dir := t.TempDir() src := `// Code generated by csid-generate.go DO NOT EDIT. package x type SkipMeID string // @csid:type [SKP] ` fp := writeTestFile(t, dir, "skip.go", src) ids, pkg, err := processCSIDFile(dir, fp, false) tst.AssertNoErr(t, err) tst.AssertEqual(t, pkg, "") tst.AssertEqual(t, len(ids), 0) } func TestGenerateCharsetIDSpecsEndToEnd(t *testing.T) { dir := t.TempDir() src1 := `package models type EntityID string // @csid:type [ENT] type UserID string // @csid:type [USR] ` writeTestFile(t, dir, "a_models.go", src1) src2 := `package models type OrderID string // @csid:type [ORD] ` writeTestFile(t, dir, "b_models.go", src2) dest := filepath.Join(dir, "csid_gen.go") err := GenerateCharsetIDSpecs(dir, dest, CSIDGenOptions{DebugOutput: langext.PFalse}) tst.AssertNoErr(t, err) out, err := os.ReadFile(dest) tst.AssertNoErr(t, err) outStr := string(out) tst.AssertTrue(t, strings.Contains(outStr, "package models")) tst.AssertTrue(t, strings.Contains(outStr, "ChecksumCharsetIDGenerator")) tst.AssertTrue(t, strings.Contains(outStr, "func NewUserID()")) tst.AssertTrue(t, strings.Contains(outStr, "func NewOrderID()")) tst.AssertTrue(t, strings.Contains(outStr, "func NewEntityID()")) tst.AssertTrue(t, strings.Contains(outStr, `prefixUserID`) && strings.Contains(outStr, `"USR"`)) tst.AssertTrue(t, strings.Contains(outStr, `prefixOrderID`) && strings.Contains(outStr, `"ORD"`)) tst.AssertTrue(t, strings.Contains(outStr, `prefixEntityID`) && strings.Contains(outStr, `"ENT"`)) } func TestGenerateCharsetIDSpecsIdempotentWhenUnchanged(t *testing.T) { dir := t.TempDir() src := `package models type SomeID string // @csid:type [SOM] ` writeTestFile(t, dir, "models.go", src) dest := filepath.Join(dir, "csid_gen.go") err := GenerateCharsetIDSpecs(dir, dest, CSIDGenOptions{}) tst.AssertNoErr(t, err) content1, err := os.ReadFile(dest) tst.AssertNoErr(t, err) err = GenerateCharsetIDSpecs(dir, dest, CSIDGenOptions{}) tst.AssertNoErr(t, err) content2, err := os.ReadFile(dest) tst.AssertNoErr(t, err) tst.AssertEqual(t, string(content1), string(content2)) } func TestGenerateCharsetIDSpecsErrorsWithoutPackage(t *testing.T) { dir := t.TempDir() src := `// Code generated by csid-generate.go DO NOT EDIT. package x type SkippedID string // @csid:type [SKP] ` writeTestFile(t, dir, "z.go", src) dest := filepath.Join(dir, "csid_gen.go") err := GenerateCharsetIDSpecs(dir, dest, CSIDGenOptions{}) tst.AssertTrue(t, err != nil) } func TestGenerateCharsetIDSpecsMissingDir(t *testing.T) { dir := filepath.Join(t.TempDir(), "definitely-missing") err := GenerateCharsetIDSpecs(dir, filepath.Join(dir, "csid_gen.go"), CSIDGenOptions{}) tst.AssertTrue(t, err != nil) } func TestFmtCSIDOutputContainsAllNames(t *testing.T) { ids := []CSIDDef{ {File: "a.go", FileRelative: "a.go", Name: "AlphaID", Prefix: "ALP"}, {File: "b.go", FileRelative: "b.go", Name: "BetaID", Prefix: "BET"}, } out := fmtCSIDOutput("CHK_XYZ", ids, "models") tst.AssertTrue(t, strings.Contains(out, "package models")) tst.AssertTrue(t, strings.Contains(out, "CHK_XYZ")) tst.AssertTrue(t, strings.Contains(out, "AlphaID")) tst.AssertTrue(t, strings.Contains(out, "BetaID")) tst.AssertTrue(t, strings.Contains(out, `prefixAlphaID`) && strings.Contains(out, `"ALP"`)) tst.AssertTrue(t, strings.Contains(out, `prefixBetaID`) && strings.Contains(out, `"BET"`)) }