kittenipc/kitcom/internal/tsgo/sourcemap/generator_test.go
2025-10-15 10:12:44 +03:00

384 lines
14 KiB
Go

package sourcemap
import (
"testing"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/tspath"
"gotest.tools/v3/assert"
)
func TestSourceMapGenerator_Empty(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
sourceMap := gen.RawSourceMap()
assert.DeepEqual(t, sourceMap, &RawSourceMap{
Version: 3,
File: "main.js",
SourceRoot: "/",
Sources: []string{},
Mappings: "",
Names: []string{},
SourcesContent: nil,
})
}
func TestSourceMapGenerator_Empty_Serialized(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
actual := gen.String()
expected := `{"version":3,"file":"main.js","sourceRoot":"/","sources":[],"names":[],"mappings":""}`
assert.Equal(t, actual, expected)
}
func TestSourceMapGenerator_AddSource(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
sourceIndex := gen.AddSource("/main.ts")
sourceMap := gen.RawSourceMap()
assert.Equal(t, int(sourceIndex), 0)
assert.DeepEqual(t, sourceMap, &RawSourceMap{
Version: 3,
File: "main.js",
SourceRoot: "/",
Sources: []string{"main.ts"},
Mappings: "",
Names: []string{},
SourcesContent: nil,
})
}
func TestSourceMapGenerator_SetSourceContent(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
sourceIndex := gen.AddSource("/main.ts")
sourceContent := "foo"
assert.NilError(t, gen.SetSourceContent(sourceIndex, sourceContent))
sourceMap := gen.RawSourceMap()
assert.Equal(t, int(sourceIndex), 0)
assert.DeepEqual(t, sourceMap, &RawSourceMap{
Version: 3,
File: "main.js",
SourceRoot: "/",
Sources: []string{"main.ts"},
Mappings: "",
Names: []string{},
SourcesContent: []*string{&sourceContent},
})
}
func TestSourceMapGenerator_SetSourceContent_ForSecondSourceOnly(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
gen.AddSource("/skipped.ts")
sourceIndex := gen.AddSource("/main.ts")
sourceContent := "foo"
assert.NilError(t, gen.SetSourceContent(sourceIndex, sourceContent))
sourceMap := gen.RawSourceMap()
assert.Equal(t, int(sourceIndex), 1)
assert.DeepEqual(t, sourceMap, &RawSourceMap{
Version: 3,
File: "main.js",
SourceRoot: "/",
Sources: []string{"skipped.ts", "main.ts"},
Mappings: "",
Names: []string{},
SourcesContent: []*string{nil, &sourceContent},
})
}
func TestSourceMapGenerator_SetSourceContent_SourceIndexOutOfRange(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
assert.Error(t, gen.SetSourceContent(-1, ""), "sourceIndex is out of range")
assert.Error(t, gen.SetSourceContent(0, ""), "sourceIndex is out of range")
}
func TestSourceMapGenerator_SetSourceContent_ForSecondSourceOnly_Serialized(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
gen.AddSource("/skipped.ts")
sourceIndex := gen.AddSource("/main.ts")
sourceContent := "foo"
assert.NilError(t, gen.SetSourceContent(sourceIndex, sourceContent))
actual := gen.String()
expected := `{"version":3,"file":"main.js","sourceRoot":"/","sources":["skipped.ts","main.ts"],"names":[],"mappings":"","sourcesContent":[null,"foo"]}`
assert.Equal(t, actual, expected)
}
func TestSourceMapGenerator_AddName(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
nameIndex := gen.AddName("foo")
sourceMap := gen.RawSourceMap()
assert.Equal(t, int(nameIndex), 0)
assert.DeepEqual(t, sourceMap, &RawSourceMap{
Version: 3,
File: "main.js",
SourceRoot: "/",
Sources: []string{},
Mappings: "",
Names: []string{"foo"},
SourcesContent: nil,
})
}
func TestSourceMapGenerator_AddGeneratedMapping(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
assert.NilError(t, gen.AddGeneratedMapping(0, 0))
sourceMap := gen.RawSourceMap()
assert.DeepEqual(t, sourceMap, &RawSourceMap{
Version: 3,
File: "main.js",
SourceRoot: "/",
Sources: []string{},
Mappings: "A",
Names: []string{},
SourcesContent: nil,
})
}
func TestSourceMapGenerator_AddGeneratedMapping_OnSecondLineOnly(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
assert.NilError(t, gen.AddGeneratedMapping(1, 0))
sourceMap := gen.RawSourceMap()
assert.DeepEqual(t, sourceMap, &RawSourceMap{
Version: 3,
File: "main.js",
SourceRoot: "/",
Sources: []string{},
Mappings: ";A",
Names: []string{},
SourcesContent: nil,
})
}
func TestSourceMapGenerator_AddSourceMapping(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
sourceIndex := gen.AddSource("/main.ts")
assert.NilError(t, gen.AddSourceMapping(0, 0, sourceIndex, 0, 0))
sourceMap := gen.RawSourceMap()
assert.DeepEqual(t, sourceMap, &RawSourceMap{
Version: 3,
File: "main.js",
SourceRoot: "/",
Sources: []string{"main.ts"},
Mappings: "AAAA",
Names: []string{},
SourcesContent: nil,
})
}
func TestSourceMapGenerator_AddSourceMapping_NextGeneratedCharacter(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
sourceIndex := gen.AddSource("/main.ts")
assert.NilError(t, gen.AddSourceMapping(0, 0, sourceIndex, 0, 0))
assert.NilError(t, gen.AddSourceMapping(0, 1, sourceIndex, 0, 0))
sourceMap := gen.RawSourceMap()
assert.DeepEqual(t, sourceMap, &RawSourceMap{
Version: 3,
File: "main.js",
SourceRoot: "/",
Sources: []string{"main.ts"},
Mappings: "AAAA,CAAA",
Names: []string{},
SourcesContent: nil,
})
}
func TestSourceMapGenerator_AddSourceMapping_NextGeneratedAndSourceCharacter(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
sourceIndex := gen.AddSource("/main.ts")
assert.NilError(t, gen.AddSourceMapping(0, 0, sourceIndex, 0, 0))
assert.NilError(t, gen.AddSourceMapping(0, 1, sourceIndex, 0, 1))
sourceMap := gen.RawSourceMap()
assert.DeepEqual(t, sourceMap, &RawSourceMap{
Version: 3,
File: "main.js",
SourceRoot: "/",
Sources: []string{"main.ts"},
Mappings: "AAAA,CAAC",
Names: []string{},
SourcesContent: nil,
})
}
func TestSourceMapGenerator_AddSourceMapping_NextGeneratedLine(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
sourceIndex := gen.AddSource("/main.ts")
assert.NilError(t, gen.AddSourceMapping(0, 0, sourceIndex, 0, 0))
assert.NilError(t, gen.AddSourceMapping(1, 0, sourceIndex, 0, 0))
sourceMap := gen.RawSourceMap()
assert.DeepEqual(t, sourceMap, &RawSourceMap{
Version: 3,
File: "main.js",
SourceRoot: "/",
Sources: []string{"main.ts"},
Mappings: "AAAA;AAAA",
Names: []string{},
SourcesContent: nil,
})
}
func TestSourceMapGenerator_AddSourceMapping_PreviousSourceCharacter(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
sourceIndex := gen.AddSource("/main.ts")
assert.NilError(t, gen.AddSourceMapping(0, 0, sourceIndex, 0, 1))
assert.NilError(t, gen.AddSourceMapping(0, 1, sourceIndex, 0, 0))
sourceMap := gen.RawSourceMap()
assert.DeepEqual(t, sourceMap, &RawSourceMap{
Version: 3,
File: "main.js",
SourceRoot: "/",
Sources: []string{"main.ts"},
Mappings: "AAAC,CAAD",
Names: []string{},
SourcesContent: nil,
})
}
func TestSourceMapGenerator_AddNamedSourceMapping(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
sourceIndex := gen.AddSource("/main.ts")
nameIndex := gen.AddName("foo")
assert.NilError(t, gen.AddNamedSourceMapping(0, 0, sourceIndex, 0, 0, nameIndex))
sourceMap := gen.RawSourceMap()
assert.DeepEqual(t, sourceMap, &RawSourceMap{
Version: 3,
File: "main.js",
SourceRoot: "/",
Sources: []string{"main.ts"},
Mappings: "AAAAA",
Names: []string{"foo"},
SourcesContent: nil,
})
}
func TestSourceMapGenerator_AddNamedSourceMapping_WithPreviousName(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
sourceIndex := gen.AddSource("/main.ts")
nameIndex1 := gen.AddName("foo")
nameIndex2 := gen.AddName("bar")
assert.NilError(t, gen.AddNamedSourceMapping(0, 0, sourceIndex, 0, 0, nameIndex2))
assert.NilError(t, gen.AddNamedSourceMapping(0, 1, sourceIndex, 0, 0, nameIndex1))
sourceMap := gen.RawSourceMap()
assert.DeepEqual(t, sourceMap, &RawSourceMap{
Version: 3,
File: "main.js",
SourceRoot: "/",
Sources: []string{"main.ts"},
Mappings: "AAAAC,CAAAD",
Names: []string{"foo", "bar"},
SourcesContent: nil,
})
}
func TestSourceMapGenerator_AddGeneratedMapping_GeneratedLineCannotBacktrack(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
assert.NilError(t, gen.AddGeneratedMapping(1, 0))
assert.Error(t, gen.AddGeneratedMapping(0, 0), "generatedLine cannot backtrack")
}
func TestSourceMapGenerator_AddGeneratedMapping_GeneratedCharacterCannotBeNegative(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
assert.NilError(t, gen.AddGeneratedMapping(0, 0))
assert.Error(t, gen.AddGeneratedMapping(0, -1), "generatedCharacter cannot be negative")
}
func TestSourceMapGenerator_AddSourceMapping_GeneratedLineCannotBacktrack(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
sourceIndex := gen.AddSource("/main.ts")
assert.NilError(t, gen.AddSourceMapping(1, 0, sourceIndex, 0, 0))
assert.Error(t, gen.AddSourceMapping(0, 0, sourceIndex, 0, 0), "generatedLine cannot backtrack")
}
func TestSourceMapGenerator_AddSourceMapping_GeneratedCharacterCannotBeNegative(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
sourceIndex := gen.AddSource("/main.ts")
assert.NilError(t, gen.AddSourceMapping(0, 0, sourceIndex, 0, 0))
assert.Error(t, gen.AddSourceMapping(0, -1, sourceIndex, 0, 0), "generatedCharacter cannot be negative")
}
func TestSourceMapGenerator_AddSourceMapping_SourceIndexIsOutOfRange(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
assert.Error(t, gen.AddSourceMapping(0, 0, -1, 0, 0), "sourceIndex is out of range")
assert.Error(t, gen.AddSourceMapping(0, 0, 0, 0, 0), "sourceIndex is out of range")
}
func TestSourceMapGenerator_AddSourceMapping_SourceLineCannotBeNegative(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
sourceIndex := gen.AddSource("/main.ts")
assert.Error(t, gen.AddSourceMapping(0, 0, sourceIndex, -1, 0), "sourceLine cannot be negative")
}
func TestSourceMapGenerator_AddSourceMapping_SourceCharacterCannotBeNegative(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
sourceIndex := gen.AddSource("/main.ts")
assert.Error(t, gen.AddSourceMapping(0, 0, sourceIndex, 0, -1), "sourceCharacter cannot be negative")
}
func TestSourceMapGenerator_AddNamedSourceMapping_GeneratedLineCannotBacktrack(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
sourceIndex := gen.AddSource("/main.ts")
nameIndex := gen.AddName("foo")
assert.NilError(t, gen.AddNamedSourceMapping(1, 0, sourceIndex, 0, 0, nameIndex))
assert.Error(t, gen.AddNamedSourceMapping(0, 0, sourceIndex, 0, 0, nameIndex), "generatedLine cannot backtrack")
}
func TestSourceMapGenerator_AddNamedSourceMapping_GeneratedCharacterCannotBeNegative(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
sourceIndex := gen.AddSource("/main.ts")
nameIndex := gen.AddName("foo")
assert.NilError(t, gen.AddNamedSourceMapping(0, 0, sourceIndex, 0, 0, nameIndex))
assert.Error(t, gen.AddNamedSourceMapping(0, -1, sourceIndex, 0, 0, nameIndex), "generatedCharacter cannot be negative")
}
func TestSourceMapGenerator_AddNamedSourceMapping_SourceIndexIsOutOfRange(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
nameIndex := gen.AddName("foo")
assert.Error(t, gen.AddNamedSourceMapping(0, 0, -1, 0, 0, nameIndex), "sourceIndex is out of range")
assert.Error(t, gen.AddNamedSourceMapping(0, 0, 0, 0, 0, nameIndex), "sourceIndex is out of range")
}
func TestSourceMapGenerator_AddNamedSourceMapping_SourceLineCannotBeNegative(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
nameIndex := gen.AddName("foo")
sourceIndex := gen.AddSource("/main.ts")
assert.Error(t, gen.AddNamedSourceMapping(0, 0, sourceIndex, -1, 0, nameIndex), "sourceLine cannot be negative")
}
func TestSourceMapGenerator_AddNamedSourceMapping_SourceCharacterCannotBeNegative(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
nameIndex := gen.AddName("foo")
sourceIndex := gen.AddSource("/main.ts")
assert.Error(t, gen.AddNamedSourceMapping(0, 0, sourceIndex, 0, -1, nameIndex), "sourceCharacter cannot be negative")
}
func TestSourceMapGenerator_AddNamedSourceMapping_NameIndexIsOutOfRange(t *testing.T) {
t.Parallel()
gen := NewGenerator("main.js", "/", "/", tspath.ComparePathsOptions{})
sourceIndex := gen.AddSource("/main.ts")
assert.Error(t, gen.AddNamedSourceMapping(0, 0, sourceIndex, 0, 0, -1), "nameIndex is out of range")
assert.Error(t, gen.AddNamedSourceMapping(0, 0, sourceIndex, 0, 0, 0), "nameIndex is out of range")
}