Optimization Pass

This commit is contained in:
2026-04-18 08:57:33 +02:00
parent 1e9a81a6cf
commit 338b4abf3b
5 changed files with 746 additions and 19 deletions
+160
View File
@@ -44,6 +44,26 @@ func TestValidateProjectAcceptsInlineTLKSchema(t *testing.T) {
}
}
func TestValidateProjectRejectsDuplicateJSONKeys(t *testing.T) {
root := testProjectRoot(t)
mkdirAll(t, filepath.Join(root, "topdata", "data", "repadjust"))
writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n")
writeFile(t, filepath.Join(root, "topdata", "data", "repadjust", "base.json"), `{
"output": "repadjust.2da",
"output": "other.2da",
"columns": ["Label"],
"rows": [{"id": 0, "Label": "TEST_LABEL"}]
}`+"\n")
report := ValidateProject(testProject(root))
if !report.HasErrors() {
t.Fatal("expected duplicate JSON key validation error")
}
if !diagnosticsContain(report.Diagnostics, "duplicate JSON object key") {
t.Fatalf("expected duplicate JSON object key diagnostic, got %#v", report.Diagnostics)
}
}
func TestResolvedTableRegistryRegistersConsistentTables(t *testing.T) {
collected := []nativeCollectedDataset{
{
@@ -9085,6 +9105,72 @@ func TestBuildAndPackageIncludesCompiled2DAAndTopAssets(t *testing.T) {
}
}
func TestBuildAndPackageNoOpsWhenOutputsAreCurrent(t *testing.T) {
root := topPackageTestProject(t)
proj := testProject(root)
proj.Config.TopData.ReferenceBuilder = ""
result, err := BuildAndPackage(proj, nil)
if err != nil {
t.Fatalf("initial BuildAndPackage failed: %v", err)
}
sourceTime := time.Now().Add(-4 * time.Hour)
outputTime := time.Now().Add(-2 * time.Hour)
setTopDataSourceTimes(t, root, sourceTime)
setBuildOutputTimes(t, result, outputTime)
beforeHAK := mustStat(t, result.OutputHAKPath).ModTime()
beforeTLK := mustStat(t, result.OutputTLKPath).ModTime()
incremental, err := BuildAndPackage(proj, nil)
if err != nil {
t.Fatalf("incremental BuildAndPackage failed: %v", err)
}
if incremental.Mode != "incremental-noop" {
t.Fatalf("expected incremental-noop mode, got %q", incremental.Mode)
}
if after := mustStat(t, result.OutputHAKPath).ModTime(); !after.Equal(beforeHAK) {
t.Fatalf("expected hak mtime to be unchanged, got %s want %s", after, beforeHAK)
}
if after := mustStat(t, result.OutputTLKPath).ModTime(); !after.Equal(beforeTLK) {
t.Fatalf("expected tlk mtime to be unchanged, got %s want %s", after, beforeTLK)
}
}
func TestBuildAndPackageRefreshesPackageWhenCompiledOutputsAreCurrent(t *testing.T) {
root := topPackageTestProject(t)
proj := testProject(root)
proj.Config.TopData.ReferenceBuilder = ""
result, err := BuildAndPackage(proj, nil)
if err != nil {
t.Fatalf("initial BuildAndPackage failed: %v", err)
}
sourceTime := time.Now().Add(-6 * time.Hour)
compiledTime := time.Now().Add(-4 * time.Hour)
packageTime := time.Now().Add(-8 * time.Hour)
setTopDataSourceTimes(t, root, sourceTime)
setCompiledOutputTimes(t, result, compiledTime)
setFileTime(t, result.OutputHAKPath, packageTime)
compiled2DA := filepath.Join(result.Output2DADir, "repadjust.2da")
before2DA := mustStat(t, compiled2DA).ModTime()
refreshed, err := BuildAndPackage(proj, nil)
if err != nil {
t.Fatalf("package refresh BuildAndPackage failed: %v", err)
}
if refreshed.Mode != "native" {
t.Fatalf("expected native mode from packaged compiled output, got %q", refreshed.Mode)
}
if after := mustStat(t, compiled2DA).ModTime(); !after.Equal(before2DA) {
t.Fatalf("expected compiled 2da mtime to be unchanged, got %s want %s", after, before2DA)
}
if after := mustStat(t, result.OutputHAKPath).ModTime(); !after.After(packageTime) {
t.Fatalf("expected hak to be refreshed after %s, got %s", packageTime, after)
}
}
func TestNativeCompileGroupStatsCountSourceFragmentsForBaseDatasets(t *testing.T) {
root := testProjectRoot(t)
modulesDir := filepath.Join(root, "placeables", "modules")
@@ -9136,6 +9222,80 @@ func TestNativeCompileGroupStatsCountSourceFragmentsForBaseDatasets(t *testing.T
}
}
func topPackageTestProject(t *testing.T) string {
t.Helper()
root := testProjectRoot(t)
mkdirAll(t, filepath.Join(root, "topdata", "data", "repadjust"))
mkdirAll(t, filepath.Join(root, "topdata", "assets", "gui"))
writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n")
writeFile(t, filepath.Join(root, "topdata", "data", "repadjust", "base.json"), `{
"output": "repadjust.2da",
"columns": ["Label"],
"rows": [{"id": 0, "Label": "TEST_LABEL"}]
}`+"\n")
writeFile(t, filepath.Join(root, "topdata", "assets", "gui", "testicon.png"), "icon-data")
return root
}
func setTopDataSourceTimes(t *testing.T, root string, modTime time.Time) {
t.Helper()
setTreeFileTimes(t, filepath.Join(root, "topdata"), modTime)
}
func setBuildOutputTimes(t *testing.T, result PackageResult, modTime time.Time) {
t.Helper()
setCompiledOutputTimes(t, result, modTime)
setFileTime(t, result.OutputHAKPath, modTime)
setFileTime(t, result.OutputTLKPath, modTime)
}
func setCompiledOutputTimes(t *testing.T, result PackageResult, modTime time.Time) {
t.Helper()
setTreeFileTimes(t, result.Output2DADir, modTime)
setTreeFileTimes(t, result.OutputTLKDir, modTime)
}
func setTreeFileTimes(t *testing.T, root string, modTime time.Time) {
t.Helper()
err := filepath.WalkDir(root, func(path string, d os.DirEntry, walkErr error) error {
if walkErr != nil {
return walkErr
}
if d.IsDir() {
return nil
}
return os.Chtimes(path, modTime, modTime)
})
if err != nil {
t.Fatalf("set file times under %s: %v", root, err)
}
}
func setFileTime(t *testing.T, path string, modTime time.Time) {
t.Helper()
if err := os.Chtimes(path, modTime, modTime); err != nil {
t.Fatalf("set file time %s: %v", path, err)
}
}
func mustStat(t *testing.T, path string) os.FileInfo {
t.Helper()
info, err := os.Stat(path)
if err != nil {
t.Fatalf("stat %s: %v", path, err)
}
return info
}
func diagnosticsContain(diagnostics []Diagnostic, text string) bool {
for _, diagnostic := range diagnostics {
if strings.Contains(diagnostic.Message, text) {
return true
}
}
return false
}
func TestValidateProjectAcceptsPNGTopPackageAsset(t *testing.T) {
root := testProjectRoot(t)
mkdirAll(t, filepath.Join(root, "topdata", "data", "repadjust"))