Optimization Pass
This commit is contained in:
@@ -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"))
|
||||
|
||||
Reference in New Issue
Block a user