Files
aego/app/meta_test.go
sanspie 703510fb19
ci / checks (push) Failing after 19m33s
GitHub / darwin arm64 native GitHub-hosted native CI: success
GitHub / darwin amd64 native GitHub-hosted native CI: failure
GitHub / linux amd64 native GitHub-hosted native CI: success
ci-platforms / darwin amd64 smoke (push) Skipped
ci-platforms / windows amd64 smoke (push) Skipped
ci-platforms / darwin arm64 smoke (push) Skipped
github-native / gitea-pending (push) Skipped
github-native / darwin amd64 native (push) Skipped
github-native / linux amd64 native (push) Skipped
github-native / windows amd64 native (push) Skipped
github-native / darwin arm64 native (push) Skipped
github-native / gitea-result (push) Skipped
GitHub / windows amd64 native GitHub-hosted native CI: success
ci / build (amd64, linux, ubuntu-24.04) (push) Successful in 16m43s
ci / release (push) Skipped
fix: reconcile generated art sub-assets correctly
2026-11-10 01:31:25 +03:00

141 lines
3.7 KiB
Go

package app
import (
"os"
"path/filepath"
"strings"
"testing"
"aego/art"
"aego/asset/importers/artsource"
"aego/asset/pipeline"
"aego/core/ids"
"aego/engine/problems"
"aego/project"
)
func TestMetaProblemsForArtSourcePresence(t *testing.T) {
const rel = "assets/sprites/dust.aeart"
p, err := project.Create(t.TempDir(), "Meta problems", false)
if err != nil {
t.Fatal(err)
}
doc, err := art.New(8, 8, art.RGBA, art.DefaultLimits())
if err != nil {
t.Fatal(err)
}
defer doc.Close()
source, err := doc.Encode()
if err != nil {
t.Fatal(err)
}
full := filepath.Join(p.Root, filepath.FromSlash(rel))
if err := os.MkdirAll(filepath.Dir(full), 0755); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(full, source, 0644); err != nil {
t.Fatal(err)
}
registry := pipeline.NewImporterRegistry()
if err := registry.Register(artsource.New()); err != nil {
t.Fatal(err)
}
pl, err := pipeline.Open(p, registry, nil)
if err != nil {
t.Fatal(err)
}
defer func() {
if pl != nil {
pl.Close()
}
}()
if _, _, err := pl.Scan(); err != nil {
t.Fatal(err)
}
batch, err := pl.ImportAll()
if err != nil || batch == nil || len(batch.Failed) != 0 || len(batch.Retry) != 0 || len(batch.Imported) != 3 {
t.Fatalf("source/frame/animation import: %+v, %v", batch, err)
}
if _, _, err := pl.Scan(); err != nil {
t.Fatal(err)
}
service := problems.New()
service.Add(MetaProblems(pl))
if list, _ := service.Collect(); len(list) != 0 {
t.Fatalf("existing source was reported in Problems: %+v", list)
}
pl.Close()
pl = nil
// The source really disappears while the pipeline is closed. The reporter
// must retain META004, then invalidate its cache if the source returns.
if err := os.Remove(full); err != nil {
t.Fatal(err)
}
reopened, err := pipeline.Open(p, registry, nil)
if err != nil {
t.Fatal(err)
}
defer reopened.Close()
if _, _, err := reopened.Scan(); err != nil {
t.Fatal(err)
}
service = problems.New()
service.Add(MetaProblems(reopened))
list, missingRev := service.Collect()
stale, orphan := 0, 0
for _, diagnostic := range list {
switch {
case diagnostic.Code == "META004" && diagnostic.Subject.File == rel:
stale++
case diagnostic.Code == "META002" && diagnostic.Subject.File == rel+pipeline.MetaSuffix:
orphan++
}
}
// Problems intentionally deduplicates source and sub-assets by path.
if stale != 1 || orphan != 1 || len(list) != 2 {
t.Fatalf("missing source was not reported: %+v", list)
}
if err := os.WriteFile(full, source, 0644); err != nil {
t.Fatal(err)
}
if _, _, err := reopened.Scan(); err != nil {
t.Fatal(err)
}
list, restoredRev := service.Collect()
if len(list) != 0 || restoredRev == missingRev {
t.Fatalf("Problems retained a stale cached warning after restoration: %+v", list)
}
// A present source with a replaced sidecar ID is different from a missing
// file, but its old indexed identity must still appear in Problems.
reopened.Close()
metaPath := full + pipeline.MetaSuffix
metaBytes, err := os.ReadFile(metaPath)
if err != nil {
t.Fatal(err)
}
meta, err := pipeline.ParseMeta(metaBytes, rel+pipeline.MetaSuffix)
if err != nil {
t.Fatal(err)
}
meta.ID = ids.NewAssetID()
if err := os.WriteFile(metaPath, pipeline.WriteMeta(meta), 0644); err != nil {
t.Fatal(err)
}
changed, err := pipeline.Open(p, registry, nil)
if err != nil {
t.Fatal(err)
}
defer changed.Close()
if _, _, err := changed.Scan(); err != nil {
t.Fatal(err)
}
service = problems.New()
service.Add(MetaProblems(changed))
list, _ = service.Collect()
if len(list) != 1 || list[0].Code != "META004" || list[0].Subject.File != rel || !strings.Contains(list[0].Message, "identity") {
t.Fatalf("Problems masked or misreported the old indexed identity: %+v", list)
}
}