2025-10-15 10:12:44 +03:00

87 lines
3.0 KiB
Go

package tsctests
import (
"fmt"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/collections"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/core"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/execute/incremental"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/testutil/harnessutil"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/tspath"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/vfs"
"github.com/go-json-experiment/json"
)
type testFs struct {
vfs.FS
defaultLibs *collections.SyncSet[string]
writtenFiles collections.SyncSet[string]
}
func (f *testFs) removeIgnoreLibPath(path string) {
if f.defaultLibs != nil && f.defaultLibs.Has(path) {
f.defaultLibs.Delete(path)
}
}
// ReadFile reads the file specified by path and returns the content.
// If the file fails to be read, ok will be false.
func (f *testFs) ReadFile(path string) (contents string, ok bool) {
f.removeIgnoreLibPath(path)
return f.readFileHandlingBuildInfo(path)
}
func (f *testFs) readFileHandlingBuildInfo(path string) (contents string, ok bool) {
contents, ok = f.FS.ReadFile(path)
if ok && tspath.FileExtensionIs(path, tspath.ExtensionTsBuildInfo) {
// read buildinfo and modify version
var buildInfo incremental.BuildInfo
err := json.Unmarshal([]byte(contents), &buildInfo)
if err == nil && buildInfo.Version == harnessutil.FakeTSVersion {
buildInfo.Version = core.Version()
newContents, err := json.Marshal(&buildInfo)
if err != nil {
panic("testFs.ReadFile: failed to marshal build info after fixing version: " + err.Error())
}
contents = string(newContents)
}
}
return contents, ok
}
func (f *testFs) WriteFile(path string, data string, writeByteOrderMark bool) error {
f.removeIgnoreLibPath(path)
f.writtenFiles.Add(path)
return f.writeFileHandlingBuildInfo(path, data, writeByteOrderMark)
}
func (f *testFs) writeFileHandlingBuildInfo(path string, data string, writeByteOrderMark bool) error {
if tspath.FileExtensionIs(path, tspath.ExtensionTsBuildInfo) {
var buildInfo incremental.BuildInfo
if err := json.Unmarshal([]byte(data), &buildInfo); err == nil {
if buildInfo.Version == core.Version() {
// Change it to harnessutil.FakeTSVersion
buildInfo.Version = harnessutil.FakeTSVersion
newData, err := json.Marshal(&buildInfo)
if err != nil {
return fmt.Errorf("testFs.WriteFile: failed to marshal build info after fixing version: %w", err)
}
data = string(newData)
}
// Write readable build info version
if err := f.WriteFile(path+".readable.baseline.txt", toReadableBuildInfo(&buildInfo, data), false); err != nil {
return fmt.Errorf("testFs.WriteFile: failed to write readable build info: %w", err)
}
} else {
panic("testFs.WriteFile: failed to unmarshal build info: - use underlying FS's write method if this is intended use for testcase" + err.Error())
}
}
return f.FS.WriteFile(path, data, writeByteOrderMark)
}
// Removes `path` and all its contents. Will return the first error it encounters.
func (f *testFs) Remove(path string) error {
f.removeIgnoreLibPath(path)
return f.FS.Remove(path)
}