Native topdata migration summary - Replaced the legacy 2dabuilder runtime path with the native topdata builder. - Native build, validate, compare, and convert flows now cover the canonical topdata pipeline. - compare-topdata is now a native self-check; legacy reference-builder runtime usage was removed. - Parts generation follows the native asset-scan contract and uses sow-assets via project asset resolution. - Generated feat families, class-feat injects, masterfeat/successor expansion, and dataset-derived feat generation were brought to parity and regression-covered. - Remaining mirrored datasets were migrated into native-owned canonical data while preserving lock IDs. - normalize-topdata bridge behavior and migration-era ownership markers were removed. - Documentation was rewritten around the native workflow and active contracts were cleaned up. - Final hardening pass removed stale validator assumptions and cleaned ignored/generated artifacts for PR readiness. Reviewed-on: https://gitea.westgate.pw/ShadowsOverWestgate/sow-tools/pulls/2 Co-authored-by: vickydotbat <vickydotbat@tutamail.com> Co-committed-by: vickydotbat <vickydotbat@tutamail.com>
89 lines
2.1 KiB
Go
89 lines
2.1 KiB
Go
package project
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func TestTopDataAssetsDirDiscoversSiblingRepo(t *testing.T) {
|
|
root := t.TempDir()
|
|
mkdirAll(t, filepath.Join(root, "src"))
|
|
mkdirAll(t, filepath.Join(root, "assets"))
|
|
mkdirAll(t, filepath.Join(root, "build"))
|
|
|
|
parentDir := filepath.Dir(root)
|
|
siblingPath := filepath.Join(parentDir, "sow-assets")
|
|
mkdirAll(t, siblingPath)
|
|
mkdirAll(t, filepath.Join(siblingPath, "assets", "part", "belt"))
|
|
|
|
proj := &Project{
|
|
Root: root,
|
|
Config: Config{
|
|
Module: ModuleConfig{Name: "Test", ResRef: "test"},
|
|
Paths: PathConfig{Source: "src", Assets: "assets", Build: "build"},
|
|
TopData: TopDataConfig{
|
|
Assets: "sow-assets",
|
|
},
|
|
},
|
|
}
|
|
|
|
result := proj.TopDataAssetsDir()
|
|
if result != siblingPath {
|
|
t.Errorf("expected %s, got %s", siblingPath, result)
|
|
}
|
|
}
|
|
|
|
func TestTopDataAssetsDirPrefersExplicitConfig(t *testing.T) {
|
|
root := t.TempDir()
|
|
mkdirAll(t, filepath.Join(root, "src"))
|
|
mkdirAll(t, filepath.Join(root, "assets"))
|
|
mkdirAll(t, filepath.Join(root, "build"))
|
|
mkdirAll(t, filepath.Join(root, "custom-assets"))
|
|
|
|
proj := &Project{
|
|
Root: root,
|
|
Config: Config{
|
|
Module: ModuleConfig{Name: "Test", ResRef: "test"},
|
|
Paths: PathConfig{Source: "src", Assets: "assets", Build: "build"},
|
|
TopData: TopDataConfig{
|
|
Assets: "custom-assets",
|
|
},
|
|
},
|
|
}
|
|
|
|
result := proj.TopDataAssetsDir()
|
|
expected := filepath.Join(root, "custom-assets")
|
|
if result != expected {
|
|
t.Errorf("expected %s, got %s", expected, result)
|
|
}
|
|
}
|
|
|
|
func TestTopDataAssetsDirReturnsEmptyForNoConfig(t *testing.T) {
|
|
root := t.TempDir()
|
|
mkdirAll(t, filepath.Join(root, "src"))
|
|
mkdirAll(t, filepath.Join(root, "assets"))
|
|
mkdirAll(t, filepath.Join(root, "build"))
|
|
|
|
proj := &Project{
|
|
Root: root,
|
|
Config: Config{
|
|
Module: ModuleConfig{Name: "Test", ResRef: "test"},
|
|
Paths: PathConfig{Source: "src", Assets: "assets", Build: "build"},
|
|
TopData: TopDataConfig{},
|
|
},
|
|
}
|
|
|
|
result := proj.TopDataAssetsDir()
|
|
if result != "" {
|
|
t.Errorf("expected empty string, got %s", result)
|
|
}
|
|
}
|
|
|
|
func mkdirAll(t *testing.T, path string) {
|
|
t.Helper()
|
|
if err := os.MkdirAll(path, 0o755); err != nil {
|
|
t.Fatalf("mkdir %s: %v", path, err)
|
|
}
|
|
}
|