161 lines
4.6 KiB
Go
161 lines
4.6 KiB
Go
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"`))
|
|
}
|