goscript 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cmd/goscript/cmd-test.go +104 -11
- package/cmd/goscript/cmd-test_test.go +1 -1
- package/cmd/goscript/cmd_compile.go +9 -0
- package/compiler/compile-request.go +31 -0
- package/compiler/compiler.go +1 -1
- package/compiler/compliance_test.go +0 -2
- package/compiler/config.go +2 -0
- package/compiler/gotest/package-result.go +2 -0
- package/compiler/gotest/request.go +85 -20
- package/compiler/gotest/runner.go +733 -96
- package/compiler/gotest/runner_test.go +647 -3
- package/compiler/lowered-program.go +9 -2
- package/compiler/lowering.go +2001 -345
- package/compiler/override-facts.go +77 -27
- package/compiler/override-registry.go +5 -4
- package/compiler/override-registry_test.go +135 -0
- package/compiler/package-graph_test.go +62 -7
- package/compiler/package-test-graph-variant.go +40 -16
- package/compiler/package-test-graph.go +0 -5
- package/compiler/package-test-graph_test.go +61 -3
- package/compiler/runtime-contract.go +40 -0
- package/compiler/semantic-model-types.go +16 -0
- package/compiler/semantic-model.go +336 -91
- package/compiler/semantic-model_test.go +50 -1
- package/compiler/service.go +9 -3
- package/compiler/skeleton_test.go +1921 -298
- package/compiler/tsworkspace/owner-process-unix_test.go +72 -0
- package/compiler/tsworkspace/owner.go +8 -0
- package/compiler/tsworkspace/tool-process-other.go +14 -0
- package/compiler/tsworkspace/tool-process-unix.go +19 -0
- package/compiler/typescript-emitter.go +122 -9
- package/dist/gs/builtin/builtin.d.ts +20 -1
- package/dist/gs/builtin/builtin.js +246 -26
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/channel.d.ts +24 -10
- package/dist/gs/builtin/channel.js +107 -25
- package/dist/gs/builtin/channel.js.map +1 -1
- package/dist/gs/builtin/defer.d.ts +1 -0
- package/dist/gs/builtin/defer.js +12 -2
- package/dist/gs/builtin/defer.js.map +1 -1
- package/dist/gs/builtin/hostio.d.ts +9 -0
- package/dist/gs/builtin/hostio.js +25 -0
- package/dist/gs/builtin/hostio.js.map +1 -1
- package/dist/gs/builtin/map.js +40 -6
- package/dist/gs/builtin/map.js.map +1 -1
- package/dist/gs/builtin/print.js.map +1 -1
- package/dist/gs/builtin/slice.d.ts +43 -9
- package/dist/gs/builtin/slice.js +437 -234
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/builtin/type.d.ts +2 -0
- package/dist/gs/builtin/type.js +47 -7
- package/dist/gs/builtin/type.js.map +1 -1
- package/dist/gs/builtin/varRef.d.ts +2 -0
- package/dist/gs/builtin/varRef.js.map +1 -1
- package/dist/gs/bytes/buffer.gs.js +28 -28
- package/dist/gs/bytes/buffer.gs.js.map +1 -1
- package/dist/gs/bytes/iter.gs.js +13 -13
- package/dist/gs/bytes/iter.gs.js.map +1 -1
- package/dist/gs/compress/zlib/index.d.ts +26 -0
- package/dist/gs/compress/zlib/index.js +168 -0
- package/dist/gs/compress/zlib/index.js.map +1 -0
- package/dist/gs/context/context.d.ts +1 -1
- package/dist/gs/context/context.js +8 -3
- package/dist/gs/context/context.js.map +1 -1
- package/dist/gs/crypto/ecdh/index.d.ts +52 -0
- package/dist/gs/crypto/ecdh/index.js +226 -0
- package/dist/gs/crypto/ecdh/index.js.map +1 -0
- package/dist/gs/crypto/ed25519/index.d.ts +34 -0
- package/dist/gs/crypto/ed25519/index.js +160 -0
- package/dist/gs/crypto/ed25519/index.js.map +1 -0
- package/dist/gs/crypto/internal/constanttime/index.d.ts +4 -0
- package/dist/gs/crypto/internal/constanttime/index.js +18 -0
- package/dist/gs/crypto/internal/constanttime/index.js.map +1 -0
- package/dist/gs/crypto/rand/index.d.ts +2 -0
- package/dist/gs/crypto/rand/index.js +85 -0
- package/dist/gs/crypto/rand/index.js.map +1 -1
- package/dist/gs/crypto/sha256/index.d.ts +8 -0
- package/dist/gs/crypto/sha256/index.js +118 -0
- package/dist/gs/crypto/sha256/index.js.map +1 -0
- package/dist/gs/crypto/sha512/index.d.ts +14 -0
- package/dist/gs/crypto/sha512/index.js +129 -0
- package/dist/gs/crypto/sha512/index.js.map +1 -0
- package/dist/gs/encoding/json/index.d.ts +3 -0
- package/dist/gs/encoding/json/index.js +15 -0
- package/dist/gs/encoding/json/index.js.map +1 -1
- package/dist/gs/errors/errors.js +29 -6
- package/dist/gs/errors/errors.js.map +1 -1
- package/dist/gs/fmt/fmt.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +7 -7
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +52 -18
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +56 -20
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +57 -3
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +366 -1
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/util/conc/index.d.ts +20 -0
- package/dist/gs/github.com/aperturerobotics/util/conc/index.js +134 -0
- package/dist/gs/github.com/aperturerobotics/util/conc/index.js.map +1 -0
- package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
- package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.d.ts +3 -0
- package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js +50 -0
- package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js.map +1 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js +3 -2
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -1
- package/dist/gs/github.com/mr-tron/base58/base58/index.d.ts +27 -0
- package/dist/gs/github.com/mr-tron/base58/base58/index.js +172 -0
- package/dist/gs/github.com/mr-tron/base58/base58/index.js.map +1 -0
- package/dist/gs/github.com/zeebo/blake3/internal/consts/index.d.ts +21 -0
- package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js +22 -0
- package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js.map +1 -0
- package/dist/gs/go/token/index.js +11 -4
- package/dist/gs/go/token/index.js.map +1 -1
- package/dist/gs/hash/fnv/index.d.ts +57 -0
- package/dist/gs/hash/fnv/index.js +299 -0
- package/dist/gs/hash/fnv/index.js.map +1 -0
- package/dist/gs/hash/index.d.ts +17 -0
- package/dist/gs/hash/index.js +94 -0
- package/dist/gs/hash/index.js.map +1 -0
- package/dist/gs/io/fs/readlink.js +2 -6
- package/dist/gs/io/fs/readlink.js.map +1 -1
- package/dist/gs/io/fs/walk.js.map +1 -1
- package/dist/gs/io/io.js.map +1 -1
- package/dist/gs/iter/iter.d.ts +3 -2
- package/dist/gs/iter/iter.js.map +1 -1
- package/dist/gs/maps/iter.d.ts +5 -5
- package/dist/gs/maps/iter.js +48 -21
- package/dist/gs/maps/iter.js.map +1 -1
- package/dist/gs/maps/maps.d.ts +6 -6
- package/dist/gs/math/bits/index.js +14 -24
- package/dist/gs/math/bits/index.js.map +1 -1
- package/dist/gs/mime/index.js +3 -1
- package/dist/gs/mime/index.js.map +1 -1
- package/dist/gs/net/http/httptest/index.d.ts +20 -1
- package/dist/gs/net/http/httptest/index.js +83 -3
- package/dist/gs/net/http/httptest/index.js.map +1 -1
- package/dist/gs/net/http/index.d.ts +110 -6
- package/dist/gs/net/http/index.js +262 -16
- package/dist/gs/net/http/index.js.map +1 -1
- package/dist/gs/net/http/pprof/index.d.ts +8 -0
- package/dist/gs/net/http/pprof/index.js +59 -0
- package/dist/gs/net/http/pprof/index.js.map +1 -0
- package/dist/gs/os/error.gs.js +9 -7
- package/dist/gs/os/error.gs.js.map +1 -1
- package/dist/gs/os/types_js.gs.js +95 -15
- package/dist/gs/os/types_js.gs.js.map +1 -1
- package/dist/gs/path/filepath/match.js.map +1 -1
- package/dist/gs/path/filepath/path.d.ts +5 -3
- package/dist/gs/path/filepath/path.js +65 -10
- package/dist/gs/path/filepath/path.js.map +1 -1
- package/dist/gs/reflect/index.d.ts +3 -2
- package/dist/gs/reflect/index.js +2 -1
- package/dist/gs/reflect/index.js.map +1 -1
- package/dist/gs/reflect/iter.js +2 -2
- package/dist/gs/reflect/iter.js.map +1 -1
- package/dist/gs/reflect/map.js +26 -0
- package/dist/gs/reflect/map.js.map +1 -1
- package/dist/gs/reflect/type.d.ts +24 -5
- package/dist/gs/reflect/type.js +390 -38
- package/dist/gs/reflect/type.js.map +1 -1
- package/dist/gs/reflect/types.d.ts +1 -0
- package/dist/gs/reflect/types.js +3 -1
- package/dist/gs/reflect/types.js.map +1 -1
- package/dist/gs/reflect/value.d.ts +4 -1
- package/dist/gs/reflect/value.js +39 -1
- package/dist/gs/reflect/value.js.map +1 -1
- package/dist/gs/reflect/visiblefields.js +1 -1
- package/dist/gs/reflect/visiblefields.js.map +1 -1
- package/dist/gs/runtime/debug/index.d.ts +39 -0
- package/dist/gs/runtime/debug/index.js +58 -0
- package/dist/gs/runtime/debug/index.js.map +1 -1
- package/dist/gs/runtime/pprof/index.d.ts +20 -0
- package/dist/gs/runtime/pprof/index.js +85 -0
- package/dist/gs/runtime/pprof/index.js.map +1 -0
- package/dist/gs/runtime/trace/index.d.ts +19 -0
- package/dist/gs/runtime/trace/index.js +64 -0
- package/dist/gs/runtime/trace/index.js.map +1 -0
- package/dist/gs/slices/slices.d.ts +24 -9
- package/dist/gs/slices/slices.js +229 -24
- package/dist/gs/slices/slices.js.map +1 -1
- package/dist/gs/sort/slice.gs.d.ts +5 -3
- package/dist/gs/sort/slice.gs.js +55 -17
- package/dist/gs/sort/slice.gs.js.map +1 -1
- package/dist/gs/strings/builder.js +26 -17
- package/dist/gs/strings/builder.js.map +1 -1
- package/dist/gs/strings/iter.js +140 -75
- package/dist/gs/strings/iter.js.map +1 -1
- package/dist/gs/strings/replace.js +2 -2
- package/dist/gs/strings/replace.js.map +1 -1
- package/dist/gs/strings/strings.js +52 -6
- package/dist/gs/strings/strings.js.map +1 -1
- package/dist/gs/sync/sync.d.ts +6 -3
- package/dist/gs/sync/sync.js +39 -11
- package/dist/gs/sync/sync.js.map +1 -1
- package/dist/gs/syscall/errors.d.ts +116 -112
- package/dist/gs/syscall/errors.js +38 -1
- package/dist/gs/syscall/errors.js.map +1 -1
- package/dist/gs/syscall/fs.d.ts +2 -8
- package/dist/gs/syscall/fs.js.map +1 -1
- package/dist/gs/syscall/js/index.js +20 -12
- package/dist/gs/syscall/js/index.js.map +1 -1
- package/dist/gs/syscall/types.d.ts +4 -1
- package/dist/gs/syscall/types.js.map +1 -1
- package/dist/gs/testing/testing.d.ts +4 -3
- package/dist/gs/testing/testing.js +21 -4
- package/dist/gs/testing/testing.js.map +1 -1
- package/dist/gs/time/time.js +22 -0
- package/dist/gs/time/time.js.map +1 -1
- package/dist/gs/unicode/unicode.js.map +1 -1
- package/dist/gs/unique/index.js +7 -2
- package/dist/gs/unique/index.js.map +1 -1
- package/go.mod +8 -8
- package/go.sum +14 -23
- package/gs/builtin/builtin.ts +364 -37
- package/gs/builtin/channel.ts +161 -29
- package/gs/builtin/defer.ts +13 -2
- package/gs/builtin/hostio.test.ts +1 -0
- package/gs/builtin/hostio.ts +38 -0
- package/gs/builtin/map.ts +46 -6
- package/gs/builtin/print.ts +12 -3
- package/gs/builtin/runtime-contract.test.ts +257 -10
- package/gs/builtin/slice.test.ts +70 -0
- package/gs/builtin/slice.ts +566 -255
- package/gs/builtin/type.ts +53 -9
- package/gs/builtin/varRef.ts +2 -0
- package/gs/bytes/buffer.gs.ts +28 -28
- package/gs/bytes/iter.gs.ts +13 -14
- package/gs/compress/zlib/index.test.ts +28 -0
- package/gs/compress/zlib/index.ts +200 -0
- package/gs/compress/zlib/meta.json +3 -0
- package/gs/context/context.test.ts +31 -1
- package/gs/context/context.ts +9 -4
- package/gs/crypto/ecdh/index.test.ts +43 -0
- package/gs/crypto/ecdh/index.ts +274 -0
- package/gs/crypto/ed25519/index.test.ts +41 -0
- package/gs/crypto/ed25519/index.ts +238 -0
- package/gs/crypto/ed25519/meta.json +13 -0
- package/gs/crypto/internal/constanttime/index.test.ts +25 -0
- package/gs/crypto/internal/constanttime/index.ts +22 -0
- package/gs/crypto/rand/index.test.ts +89 -1
- package/gs/crypto/rand/index.ts +103 -1
- package/gs/crypto/rand/meta.json +4 -1
- package/gs/crypto/sha256/index.test.ts +78 -0
- package/gs/crypto/sha256/index.ts +150 -0
- package/gs/crypto/sha256/meta.json +9 -0
- package/gs/crypto/sha512/index.test.ts +31 -0
- package/gs/crypto/sha512/index.ts +161 -0
- package/gs/crypto/sha512/meta.json +11 -0
- package/gs/encoding/json/index.test.ts +25 -3
- package/gs/encoding/json/index.ts +21 -3
- package/gs/errors/errors.test.ts +4 -1
- package/gs/errors/errors.ts +32 -8
- package/gs/fmt/fmt.test.ts +3 -1
- package/gs/fmt/fmt.ts +1 -5
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +62 -7
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +78 -36
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +32 -11
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +122 -43
- package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +31 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +518 -4
- package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +6 -0
- package/gs/github.com/aperturerobotics/util/conc/index.test.ts +30 -0
- package/gs/github.com/aperturerobotics/util/conc/index.ts +172 -0
- package/gs/github.com/aperturerobotics/util/conc/meta.json +9 -0
- package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.ts +1 -4
- package/gs/github.com/hack-pad/safejs/internal/catch/index.test.ts +35 -0
- package/gs/github.com/hack-pad/safejs/internal/catch/index.ts +65 -0
- package/gs/github.com/hack-pad/safejs/internal/catch/meta.json +9 -0
- package/gs/github.com/klauspost/compress/internal/le/index.test.ts +2 -1
- package/gs/github.com/klauspost/compress/internal/le/index.ts +6 -5
- package/gs/github.com/mr-tron/base58/base58/index.test.ts +70 -0
- package/gs/github.com/mr-tron/base58/base58/index.ts +231 -0
- package/gs/github.com/mr-tron/base58/base58/meta.json +3 -0
- package/gs/github.com/zeebo/blake3/internal/consts/index.test.ts +46 -0
- package/gs/github.com/zeebo/blake3/internal/consts/index.ts +26 -0
- package/gs/go/token/index.ts +17 -4
- package/gs/hash/fnv/index.test.ts +67 -0
- package/gs/hash/fnv/index.ts +351 -0
- package/gs/hash/fnv/meta.json +3 -0
- package/gs/hash/index.test.ts +37 -0
- package/gs/hash/index.ts +118 -0
- package/gs/hash/meta.json +5 -0
- package/gs/internal/byteorder/index.test.ts +6 -6
- package/gs/io/fs/readlink.ts +40 -48
- package/gs/io/fs/walk.ts +10 -2
- package/gs/io/io.ts +4 -1
- package/gs/iter/iter.ts +8 -2
- package/gs/maps/iter.ts +69 -26
- package/gs/maps/maps.test.ts +23 -0
- package/gs/maps/maps.ts +6 -6
- package/gs/math/bits/index.test.ts +20 -0
- package/gs/math/bits/index.ts +15 -28
- package/gs/mime/index.ts +8 -2
- package/gs/net/http/httptest/index.test.ts +53 -0
- package/gs/net/http/httptest/index.ts +98 -3
- package/gs/net/http/index.test.ts +129 -1
- package/gs/net/http/index.ts +370 -19
- package/gs/net/http/meta.json +6 -0
- package/gs/net/http/pprof/index.test.ts +47 -0
- package/gs/net/http/pprof/index.ts +65 -0
- package/gs/os/error.gs.ts +9 -10
- package/gs/os/error.test.ts +41 -0
- package/gs/os/file_unix_js.test.ts +55 -0
- package/gs/os/tempfile.gs.test.ts +37 -10
- package/gs/os/types_js.gs.ts +94 -15
- package/gs/path/filepath/match.ts +4 -1
- package/gs/path/filepath/meta.json +6 -0
- package/gs/path/filepath/path.test.ts +57 -2
- package/gs/path/filepath/path.ts +91 -12
- package/gs/reflect/field.test.ts +63 -0
- package/gs/reflect/index.ts +4 -1
- package/gs/reflect/iter.ts +2 -2
- package/gs/reflect/map.test.ts +24 -2
- package/gs/reflect/map.ts +35 -0
- package/gs/reflect/type.ts +543 -60
- package/gs/reflect/typefor.test.ts +100 -0
- package/gs/reflect/types.ts +3 -1
- package/gs/reflect/value.ts +50 -1
- package/gs/reflect/visiblefields.ts +1 -1
- package/gs/runtime/debug/index.test.ts +22 -1
- package/gs/runtime/debug/index.ts +88 -0
- package/gs/runtime/pprof/index.test.ts +36 -0
- package/gs/runtime/pprof/index.ts +104 -0
- package/gs/runtime/pprof/meta.json +6 -0
- package/gs/runtime/trace/index.test.ts +45 -0
- package/gs/runtime/trace/index.ts +97 -0
- package/gs/runtime/trace/meta.json +7 -0
- package/gs/slices/meta.json +2 -1
- package/gs/slices/slices.test.ts +86 -0
- package/gs/slices/slices.ts +284 -37
- package/gs/sort/slice.gs.ts +73 -23
- package/gs/sort/slice.test.ts +40 -0
- package/gs/strings/builder.test.ts +8 -0
- package/gs/strings/builder.ts +29 -17
- package/gs/strings/iter.test.ts +5 -7
- package/gs/strings/iter.ts +146 -71
- package/gs/strings/replace.test.ts +1 -4
- package/gs/strings/replace.ts +6 -6
- package/gs/strings/strings.test.ts +4 -0
- package/gs/strings/strings.ts +54 -6
- package/gs/sync/sync.test.ts +57 -1
- package/gs/sync/sync.ts +45 -13
- package/gs/syscall/errors.ts +158 -115
- package/gs/syscall/fs.ts +8 -8
- package/gs/syscall/js/index.ts +49 -22
- package/gs/syscall/net.test.ts +26 -0
- package/gs/syscall/types.ts +7 -2
- package/gs/testing/testing.test.ts +56 -0
- package/gs/testing/testing.ts +27 -10
- package/gs/time/meta.json +2 -2
- package/gs/time/time.test.ts +4 -0
- package/gs/time/time.ts +33 -2
- package/gs/unicode/unicode.test.ts +14 -3
- package/gs/unicode/unicode.ts +1 -5
- package/gs/unique/index.ts +9 -2
- package/package.json +3 -3
|
@@ -4,6 +4,9 @@ import (
|
|
|
4
4
|
"context"
|
|
5
5
|
"os"
|
|
6
6
|
"path/filepath"
|
|
7
|
+
"runtime"
|
|
8
|
+
"slices"
|
|
9
|
+
"strconv"
|
|
7
10
|
"strings"
|
|
8
11
|
"testing"
|
|
9
12
|
"time"
|
|
@@ -158,6 +161,55 @@ func TestRunnerAwaitsAsyncDependencyCallsInTests(t *testing.T) {
|
|
|
158
161
|
}
|
|
159
162
|
}
|
|
160
163
|
|
|
164
|
+
func TestRunnerEvaluatesStructLiteralCallsBeforeFieldCopies(t *testing.T) {
|
|
165
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
166
|
+
"go.mod": "module example.test/literalorder\n\ngo 1.25.3\n",
|
|
167
|
+
"value_test.go": strings.Join([]string{
|
|
168
|
+
"package literalorder",
|
|
169
|
+
"",
|
|
170
|
+
"import \"testing\"",
|
|
171
|
+
"",
|
|
172
|
+
"type result struct {",
|
|
173
|
+
"\tvalue int",
|
|
174
|
+
"\terr error",
|
|
175
|
+
"}",
|
|
176
|
+
"",
|
|
177
|
+
"func fill(value *int) error {",
|
|
178
|
+
"\t*value = 7",
|
|
179
|
+
"\treturn nil",
|
|
180
|
+
"}",
|
|
181
|
+
"",
|
|
182
|
+
"func recv() result {",
|
|
183
|
+
"\tvar value int",
|
|
184
|
+
"\treturn result{value: value, err: fill(&value)}",
|
|
185
|
+
"}",
|
|
186
|
+
"",
|
|
187
|
+
"func TestLiteralOrder(t *testing.T) {",
|
|
188
|
+
"\tres := recv()",
|
|
189
|
+
"\tif res.err != nil {",
|
|
190
|
+
"\t\tt.Fatalf(\"unexpected error: %v\", res.err)",
|
|
191
|
+
"\t}",
|
|
192
|
+
"\tif res.value != 7 {",
|
|
193
|
+
"\t\tt.Fatalf(\"unexpected value: %d\", res.value)",
|
|
194
|
+
"\t}",
|
|
195
|
+
"}",
|
|
196
|
+
"",
|
|
197
|
+
}, "\n"),
|
|
198
|
+
})
|
|
199
|
+
|
|
200
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
201
|
+
Dir: moduleDir,
|
|
202
|
+
Patterns: []string{"."},
|
|
203
|
+
Timeout: 30 * time.Second,
|
|
204
|
+
})
|
|
205
|
+
if err != nil {
|
|
206
|
+
t.Fatalf("run literal order package: %v", err)
|
|
207
|
+
}
|
|
208
|
+
if !result.Passed() {
|
|
209
|
+
t.Fatalf("expected literal order package to pass: %#v", result.Packages)
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
161
213
|
func TestRunnerRunsExternalPackageTest(t *testing.T) {
|
|
162
214
|
moduleDir := writeFixture(t, map[string]string{
|
|
163
215
|
"go.mod": "module example.test/external\n\ngo 1.25.3\n",
|
|
@@ -206,6 +258,63 @@ func TestRunnerRunsExternalPackageTest(t *testing.T) {
|
|
|
206
258
|
}
|
|
207
259
|
}
|
|
208
260
|
|
|
261
|
+
func TestRunnerAppliesOverridesToTestImports(t *testing.T) {
|
|
262
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
263
|
+
"go.mod": "module example.test/testoverride\n\ngo 1.25.3\n",
|
|
264
|
+
"dep/value.go": strings.Join([]string{
|
|
265
|
+
"package dep",
|
|
266
|
+
"",
|
|
267
|
+
"func Value() int {",
|
|
268
|
+
"\tx := 41",
|
|
269
|
+
"\t_ = &x",
|
|
270
|
+
"\treturn x + 1",
|
|
271
|
+
"}",
|
|
272
|
+
"",
|
|
273
|
+
}, "\n"),
|
|
274
|
+
"app/value.go": "package app\n",
|
|
275
|
+
"app/value_test.go": strings.Join([]string{
|
|
276
|
+
"package app",
|
|
277
|
+
"",
|
|
278
|
+
"import (",
|
|
279
|
+
"\t\"testing\"",
|
|
280
|
+
"",
|
|
281
|
+
"\t\"example.test/testoverride/dep\"",
|
|
282
|
+
")",
|
|
283
|
+
"",
|
|
284
|
+
"func TestOverrideImport(t *testing.T) {",
|
|
285
|
+
"\tif dep.Value() != 42 {",
|
|
286
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
287
|
+
"\t}",
|
|
288
|
+
"}",
|
|
289
|
+
"",
|
|
290
|
+
}, "\n"),
|
|
291
|
+
})
|
|
292
|
+
overrideDir := filepath.Join(moduleDir, "gs")
|
|
293
|
+
if err := os.MkdirAll(filepath.Join(overrideDir, "example.test", "testoverride", "dep"), 0o755); err != nil {
|
|
294
|
+
t.Fatal(err.Error())
|
|
295
|
+
}
|
|
296
|
+
if err := os.WriteFile(
|
|
297
|
+
filepath.Join(overrideDir, "example.test", "testoverride", "dep", "index.ts"),
|
|
298
|
+
[]byte("export function Value(): number { return 42 }\n"),
|
|
299
|
+
0o644,
|
|
300
|
+
); err != nil {
|
|
301
|
+
t.Fatal(err.Error())
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
305
|
+
Dir: moduleDir,
|
|
306
|
+
Patterns: []string{"./app"},
|
|
307
|
+
OverrideDirs: []string{overrideDir},
|
|
308
|
+
Timeout: 30 * time.Second,
|
|
309
|
+
})
|
|
310
|
+
if err != nil {
|
|
311
|
+
t.Fatalf("run override import package: %v", err)
|
|
312
|
+
}
|
|
313
|
+
if !result.Passed() {
|
|
314
|
+
t.Fatalf("expected package test to pass with override import: %#v", result.Packages)
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
209
318
|
func TestRunnerRejectsInvalidRunPattern(t *testing.T) {
|
|
210
319
|
moduleDir := writeFixture(t, map[string]string{
|
|
211
320
|
"go.mod": "module example.test/badrun\n\ngo 1.25.3\n",
|
|
@@ -374,7 +483,8 @@ func TestRunnerScopesPackageCompileErrors(t *testing.T) {
|
|
|
374
483
|
"",
|
|
375
484
|
"func Value() int {",
|
|
376
485
|
"\tx := 1",
|
|
377
|
-
"\
|
|
486
|
+
"\tp := &x",
|
|
487
|
+
"\t_ = &(*p)",
|
|
378
488
|
"\treturn x",
|
|
379
489
|
"}",
|
|
380
490
|
"",
|
|
@@ -524,6 +634,13 @@ func TestRunnerScopesPackageTypecheckErrors(t *testing.T) {
|
|
|
524
634
|
"\tfi",
|
|
525
635
|
"\tshift || break",
|
|
526
636
|
"done",
|
|
637
|
+
"if [ \"$project\" = \"tsconfig.json\" ]; then",
|
|
638
|
+
"\tif grep -q 'example.test/mixedtypecheck/bad' runner-*.ts; then",
|
|
639
|
+
"\t\techo 'TypeScript TS9000: bad package'",
|
|
640
|
+
"\t\texit 1",
|
|
641
|
+
"\tfi",
|
|
642
|
+
"\texit 0",
|
|
643
|
+
"fi",
|
|
527
644
|
"runner=$(sed -n 's/.*\"\\(runner-[0-9][0-9]*\\.ts\\)\".*/\\1/p' \"$project\" | head -n 1)",
|
|
528
645
|
"if grep -q 'example.test/mixedtypecheck/bad' \"$runner\"; then",
|
|
529
646
|
"\techo 'TypeScript TS9000: bad package'",
|
|
@@ -560,18 +677,503 @@ func TestRunnerScopesPackageTypecheckErrors(t *testing.T) {
|
|
|
560
677
|
}
|
|
561
678
|
}
|
|
562
679
|
|
|
680
|
+
func TestRunnerDoesNotRepeatSharedOverrideTypecheckFailure(t *testing.T) {
|
|
681
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
682
|
+
"go.mod": "module example.test/sharedoverride\n\ngo 1.25.3\n",
|
|
683
|
+
"one/value.go": strings.Join([]string{
|
|
684
|
+
"package one",
|
|
685
|
+
"",
|
|
686
|
+
"func Value() int { return 1 }",
|
|
687
|
+
"",
|
|
688
|
+
}, "\n"),
|
|
689
|
+
"one/value_test.go": strings.Join([]string{
|
|
690
|
+
"package one",
|
|
691
|
+
"",
|
|
692
|
+
"import \"testing\"",
|
|
693
|
+
"",
|
|
694
|
+
"func TestOne(t *testing.T) {",
|
|
695
|
+
"\tif Value() != 1 {",
|
|
696
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
697
|
+
"\t}",
|
|
698
|
+
"}",
|
|
699
|
+
"",
|
|
700
|
+
}, "\n"),
|
|
701
|
+
"two/value.go": strings.Join([]string{
|
|
702
|
+
"package two",
|
|
703
|
+
"",
|
|
704
|
+
"func Value() int { return 2 }",
|
|
705
|
+
"",
|
|
706
|
+
}, "\n"),
|
|
707
|
+
"two/value_test.go": strings.Join([]string{
|
|
708
|
+
"package two",
|
|
709
|
+
"",
|
|
710
|
+
"import \"testing\"",
|
|
711
|
+
"",
|
|
712
|
+
"func TestTwo(t *testing.T) {",
|
|
713
|
+
"\tif Value() != 2 {",
|
|
714
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
715
|
+
"\t}",
|
|
716
|
+
"}",
|
|
717
|
+
"",
|
|
718
|
+
}, "\n"),
|
|
719
|
+
})
|
|
720
|
+
workDir := filepath.Join(moduleDir, "work")
|
|
721
|
+
projectLog := filepath.Join(moduleDir, "projects.log")
|
|
722
|
+
writeExecutable(t, filepath.Join(moduleDir, "node_modules", ".bin", "tsgo"), strings.Join([]string{
|
|
723
|
+
"#!/bin/sh",
|
|
724
|
+
"project=",
|
|
725
|
+
"while [ \"$#\" -gt 0 ]; do",
|
|
726
|
+
"\tif [ \"$1\" = \"--project\" ]; then",
|
|
727
|
+
"\t\tshift",
|
|
728
|
+
"\t\tproject=\"$1\"",
|
|
729
|
+
"\tfi",
|
|
730
|
+
"\tshift || break",
|
|
731
|
+
"done",
|
|
732
|
+
"printf '%s\\n' \"$project\" >> " + strconv.Quote(projectLog),
|
|
733
|
+
"echo 'output/@goscript/example.test/override/index.ts(1,1): error TS2305: Module has no exported member Thing'",
|
|
734
|
+
"exit 1",
|
|
735
|
+
"",
|
|
736
|
+
}, "\n"))
|
|
737
|
+
writeExecutable(t, filepath.Join(moduleDir, "node_modules", ".bin", "bun"), strings.Join([]string{
|
|
738
|
+
"#!/bin/sh",
|
|
739
|
+
"exit 0",
|
|
740
|
+
"",
|
|
741
|
+
}, "\n"))
|
|
742
|
+
|
|
743
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
744
|
+
Dir: moduleDir,
|
|
745
|
+
Patterns: []string{"./..."},
|
|
746
|
+
Timeout: 30 * time.Second,
|
|
747
|
+
WorkDir: workDir,
|
|
748
|
+
})
|
|
749
|
+
if err != nil {
|
|
750
|
+
t.Fatalf("run shared override typecheck fixture: %v", err)
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
one := requirePackageResult(t, result, "example.test/sharedoverride/one")
|
|
754
|
+
two := requirePackageResult(t, result, "example.test/sharedoverride/two")
|
|
755
|
+
for _, pkg := range []PackageResult{one, two} {
|
|
756
|
+
if pkg.Action != ActionFail || pkg.Owner != OwnerOverridePackage {
|
|
757
|
+
t.Fatalf("package should carry aggregate override failure: %#v", pkg)
|
|
758
|
+
}
|
|
759
|
+
if pkg.Phases.TypeCheck != PhaseStatusFail || pkg.Phases.Runtime != PhaseStatusSkip {
|
|
760
|
+
t.Fatalf("package should fail at aggregate typecheck without runtime: %#v", pkg)
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
data, err := os.ReadFile(projectLog)
|
|
764
|
+
if err != nil {
|
|
765
|
+
t.Fatalf("read project log: %v", err)
|
|
766
|
+
}
|
|
767
|
+
projects := strings.Fields(string(data))
|
|
768
|
+
if len(projects) != 1 || projects[0] != "tsconfig.json" {
|
|
769
|
+
t.Fatalf("expected only aggregate typecheck, got:\n%s", data)
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
func TestRunnerUsesBatchTypeScriptProject(t *testing.T) {
|
|
774
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
775
|
+
"go.mod": "module example.test/packageprojects\n\ngo 1.25.3\n",
|
|
776
|
+
"one/value.go": strings.Join([]string{
|
|
777
|
+
"package one",
|
|
778
|
+
"",
|
|
779
|
+
"func Value() int { return 1 }",
|
|
780
|
+
"",
|
|
781
|
+
}, "\n"),
|
|
782
|
+
"one/value_test.go": strings.Join([]string{
|
|
783
|
+
"package one",
|
|
784
|
+
"",
|
|
785
|
+
"import \"testing\"",
|
|
786
|
+
"",
|
|
787
|
+
"func TestOne(t *testing.T) {",
|
|
788
|
+
"\tif Value() != 1 {",
|
|
789
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
790
|
+
"\t}",
|
|
791
|
+
"}",
|
|
792
|
+
"",
|
|
793
|
+
}, "\n"),
|
|
794
|
+
"two/value.go": strings.Join([]string{
|
|
795
|
+
"package two",
|
|
796
|
+
"",
|
|
797
|
+
"func Value() int { return 2 }",
|
|
798
|
+
"",
|
|
799
|
+
}, "\n"),
|
|
800
|
+
"two/value_test.go": strings.Join([]string{
|
|
801
|
+
"package two",
|
|
802
|
+
"",
|
|
803
|
+
"import \"testing\"",
|
|
804
|
+
"",
|
|
805
|
+
"func TestTwo(t *testing.T) {",
|
|
806
|
+
"\tif Value() != 2 {",
|
|
807
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
808
|
+
"\t}",
|
|
809
|
+
"}",
|
|
810
|
+
"",
|
|
811
|
+
}, "\n"),
|
|
812
|
+
})
|
|
813
|
+
workDir := filepath.Join(moduleDir, ".tmp", "package-projects")
|
|
814
|
+
projectLog := filepath.Join(moduleDir, "projects.log")
|
|
815
|
+
writeExecutable(t, filepath.Join(moduleDir, "node_modules", ".bin", "tsgo"), strings.Join([]string{
|
|
816
|
+
"#!/bin/sh",
|
|
817
|
+
"project=",
|
|
818
|
+
"while [ \"$#\" -gt 0 ]; do",
|
|
819
|
+
"\tif [ \"$1\" = \"--project\" ]; then",
|
|
820
|
+
"\t\tshift",
|
|
821
|
+
"\t\tproject=\"$1\"",
|
|
822
|
+
"\tfi",
|
|
823
|
+
"\tshift || break",
|
|
824
|
+
"done",
|
|
825
|
+
"printf '%s\\n' \"$project\" >> " + strconv.Quote(projectLog),
|
|
826
|
+
"exit 0",
|
|
827
|
+
"",
|
|
828
|
+
}, "\n"))
|
|
829
|
+
writeExecutable(t, filepath.Join(moduleDir, "node_modules", ".bin", "bun"), strings.Join([]string{
|
|
830
|
+
"#!/bin/sh",
|
|
831
|
+
"exit 0",
|
|
832
|
+
"",
|
|
833
|
+
}, "\n"))
|
|
834
|
+
|
|
835
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
836
|
+
Dir: moduleDir,
|
|
837
|
+
Patterns: []string{"./..."},
|
|
838
|
+
Timeout: 30 * time.Second,
|
|
839
|
+
WorkDir: workDir,
|
|
840
|
+
Parallelism: 2,
|
|
841
|
+
})
|
|
842
|
+
if err != nil {
|
|
843
|
+
t.Fatalf("run package projects fixture: %v", err)
|
|
844
|
+
}
|
|
845
|
+
if !result.Passed() {
|
|
846
|
+
t.Fatalf("expected package projects fixture to pass: %#v", result.Packages)
|
|
847
|
+
}
|
|
848
|
+
data, err := os.ReadFile(projectLog)
|
|
849
|
+
if err != nil {
|
|
850
|
+
t.Fatalf("read project log: %v", err)
|
|
851
|
+
}
|
|
852
|
+
projects := string(data)
|
|
853
|
+
if strings.TrimSpace(projects) != "tsconfig.json" {
|
|
854
|
+
t.Fatalf("expected aggregate tsconfig project, got:\n%s", projects)
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
func TestRunnerRunsCombinedRuntimeChunks(t *testing.T) {
|
|
859
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
860
|
+
"go.mod": "module example.test/runtimechunks\n\ngo 1.25.3\n",
|
|
861
|
+
"one/value.go": strings.Join([]string{
|
|
862
|
+
"package one",
|
|
863
|
+
"",
|
|
864
|
+
"func Value() int { return 1 }",
|
|
865
|
+
"",
|
|
866
|
+
}, "\n"),
|
|
867
|
+
"one/value_test.go": strings.Join([]string{
|
|
868
|
+
"package one",
|
|
869
|
+
"",
|
|
870
|
+
"import \"testing\"",
|
|
871
|
+
"",
|
|
872
|
+
"func TestOne(t *testing.T) {",
|
|
873
|
+
"\tif Value() != 1 {",
|
|
874
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
875
|
+
"\t}",
|
|
876
|
+
"}",
|
|
877
|
+
"",
|
|
878
|
+
}, "\n"),
|
|
879
|
+
"two/value.go": strings.Join([]string{
|
|
880
|
+
"package two",
|
|
881
|
+
"",
|
|
882
|
+
"func Value() int { return 2 }",
|
|
883
|
+
"",
|
|
884
|
+
}, "\n"),
|
|
885
|
+
"two/value_test.go": strings.Join([]string{
|
|
886
|
+
"package two",
|
|
887
|
+
"",
|
|
888
|
+
"import \"testing\"",
|
|
889
|
+
"",
|
|
890
|
+
"func TestTwo(t *testing.T) {",
|
|
891
|
+
"\tif Value() != 2 {",
|
|
892
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
893
|
+
"\t}",
|
|
894
|
+
"}",
|
|
895
|
+
"",
|
|
896
|
+
}, "\n"),
|
|
897
|
+
})
|
|
898
|
+
workDir := filepath.Join(moduleDir, ".tmp", "runtime-chunks")
|
|
899
|
+
runtimeLog := filepath.Join(moduleDir, "runtime.log")
|
|
900
|
+
writeExecutable(t, filepath.Join(moduleDir, "node_modules", ".bin", "tsgo"), strings.Join([]string{
|
|
901
|
+
"#!/bin/sh",
|
|
902
|
+
"exit 0",
|
|
903
|
+
"",
|
|
904
|
+
}, "\n"))
|
|
905
|
+
writeExecutable(t, filepath.Join(moduleDir, "node_modules", ".bin", "bun"), strings.Join([]string{
|
|
906
|
+
"#!/bin/sh",
|
|
907
|
+
"runner=\"$1\"",
|
|
908
|
+
"printf '%s\\n' \"$runner\" >> " + strconv.Quote(runtimeLog),
|
|
909
|
+
"case \"$runner\" in",
|
|
910
|
+
"runner-all-*)",
|
|
911
|
+
"\tsed -n 's/.*await __goscriptRunPackage(\"\\([^\"]*\\)\".*/\\1/p' \"$runner\" | while IFS= read -r pkg; do",
|
|
912
|
+
"\t\tprintf '" + combinedRuntimeResultPrefix + "{\"packagePath\":\"%s\",\"ok\":true,\"elapsedMs\":1,\"output\":\"\"}\\n' \"$pkg\"",
|
|
913
|
+
"\tdone",
|
|
914
|
+
"\texit 0",
|
|
915
|
+
"\t;;",
|
|
916
|
+
"*)",
|
|
917
|
+
"\texit 1",
|
|
918
|
+
"\t;;",
|
|
919
|
+
"esac",
|
|
920
|
+
"",
|
|
921
|
+
}, "\n"))
|
|
922
|
+
|
|
923
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
924
|
+
Dir: moduleDir,
|
|
925
|
+
Patterns: []string{"./..."},
|
|
926
|
+
Timeout: 30 * time.Second,
|
|
927
|
+
WorkDir: workDir,
|
|
928
|
+
Parallelism: 2,
|
|
929
|
+
RuntimeGroups: true,
|
|
930
|
+
})
|
|
931
|
+
if err != nil {
|
|
932
|
+
t.Fatalf("run runtime chunks fixture: %v", err)
|
|
933
|
+
}
|
|
934
|
+
if !result.Passed() {
|
|
935
|
+
t.Fatalf("expected runtime chunks fixture to pass: %#v", result.Packages)
|
|
936
|
+
}
|
|
937
|
+
data, err := os.ReadFile(runtimeLog)
|
|
938
|
+
if err != nil {
|
|
939
|
+
t.Fatalf("read runtime log: %v", err)
|
|
940
|
+
}
|
|
941
|
+
runners := strings.Fields(string(data))
|
|
942
|
+
slices.Sort(runners)
|
|
943
|
+
if strings.Join(runners, "\n") != "runner-all-0.ts\nrunner-all-1.ts" {
|
|
944
|
+
t.Fatalf("expected chunked combined runners, got:\n%s", data)
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
func TestRunnerFallsBackToPackageScopedTypeScriptProjects(t *testing.T) {
|
|
949
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
950
|
+
"go.mod": "module example.test/packageprojects\n\ngo 1.25.3\n",
|
|
951
|
+
"one/value.go": strings.Join([]string{
|
|
952
|
+
"package one",
|
|
953
|
+
"",
|
|
954
|
+
"func Value() int { return 1 }",
|
|
955
|
+
"",
|
|
956
|
+
}, "\n"),
|
|
957
|
+
"one/value_test.go": strings.Join([]string{
|
|
958
|
+
"package one",
|
|
959
|
+
"",
|
|
960
|
+
"import \"testing\"",
|
|
961
|
+
"",
|
|
962
|
+
"func TestOne(t *testing.T) {",
|
|
963
|
+
"\tif Value() != 1 {",
|
|
964
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
965
|
+
"\t}",
|
|
966
|
+
"}",
|
|
967
|
+
"",
|
|
968
|
+
}, "\n"),
|
|
969
|
+
"two/value.go": strings.Join([]string{
|
|
970
|
+
"package two",
|
|
971
|
+
"",
|
|
972
|
+
"func Value() int { return 2 }",
|
|
973
|
+
"",
|
|
974
|
+
}, "\n"),
|
|
975
|
+
"two/value_test.go": strings.Join([]string{
|
|
976
|
+
"package two",
|
|
977
|
+
"",
|
|
978
|
+
"import \"testing\"",
|
|
979
|
+
"",
|
|
980
|
+
"func TestTwo(t *testing.T) {",
|
|
981
|
+
"\tif Value() != 2 {",
|
|
982
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
983
|
+
"\t}",
|
|
984
|
+
"}",
|
|
985
|
+
"",
|
|
986
|
+
}, "\n"),
|
|
987
|
+
})
|
|
988
|
+
workDir := filepath.Join(moduleDir, ".tmp", "package-projects")
|
|
989
|
+
projectLog := filepath.Join(moduleDir, "projects.log")
|
|
990
|
+
writeExecutable(t, filepath.Join(moduleDir, "node_modules", ".bin", "tsgo"), strings.Join([]string{
|
|
991
|
+
"#!/bin/sh",
|
|
992
|
+
"project=",
|
|
993
|
+
"while [ \"$#\" -gt 0 ]; do",
|
|
994
|
+
"\tif [ \"$1\" = \"--project\" ]; then",
|
|
995
|
+
"\t\tshift",
|
|
996
|
+
"\t\tproject=\"$1\"",
|
|
997
|
+
"\tfi",
|
|
998
|
+
"\tshift || break",
|
|
999
|
+
"done",
|
|
1000
|
+
"printf '%s\\n' \"$project\" >> " + strconv.Quote(projectLog),
|
|
1001
|
+
"if [ \"$project\" = \"tsconfig.json\" ]; then",
|
|
1002
|
+
"\texit 1",
|
|
1003
|
+
"fi",
|
|
1004
|
+
"exit 0",
|
|
1005
|
+
"",
|
|
1006
|
+
}, "\n"))
|
|
1007
|
+
writeExecutable(t, filepath.Join(moduleDir, "node_modules", ".bin", "bun"), strings.Join([]string{
|
|
1008
|
+
"#!/bin/sh",
|
|
1009
|
+
"exit 0",
|
|
1010
|
+
"",
|
|
1011
|
+
}, "\n"))
|
|
1012
|
+
|
|
1013
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
1014
|
+
Dir: moduleDir,
|
|
1015
|
+
Patterns: []string{"./..."},
|
|
1016
|
+
Timeout: 30 * time.Second,
|
|
1017
|
+
WorkDir: workDir,
|
|
1018
|
+
Parallelism: 2,
|
|
1019
|
+
})
|
|
1020
|
+
if err != nil {
|
|
1021
|
+
t.Fatalf("run package projects fixture: %v", err)
|
|
1022
|
+
}
|
|
1023
|
+
if !result.Passed() {
|
|
1024
|
+
t.Fatalf("expected package projects fixture to pass: %#v", result.Packages)
|
|
1025
|
+
}
|
|
1026
|
+
data, err := os.ReadFile(projectLog)
|
|
1027
|
+
if err != nil {
|
|
1028
|
+
t.Fatalf("read project log: %v", err)
|
|
1029
|
+
}
|
|
1030
|
+
projects := string(data)
|
|
1031
|
+
if !strings.Contains(projects, "tsconfig.json") ||
|
|
1032
|
+
!strings.Contains(projects, "tsconfig-0.json") ||
|
|
1033
|
+
!strings.Contains(projects, "tsconfig-1.json") {
|
|
1034
|
+
t.Fatalf("expected aggregate project and package-scoped fallback, got:\n%s", projects)
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
func TestDefaultParallelismCapsAtEight(t *testing.T) {
|
|
1039
|
+
previous := runtime.GOMAXPROCS(16)
|
|
1040
|
+
t.Cleanup(func() { runtime.GOMAXPROCS(previous) })
|
|
1041
|
+
|
|
1042
|
+
if got := DefaultParallelism(); got != 8 {
|
|
1043
|
+
t.Fatalf("expected default parallelism cap 8, got %d", got)
|
|
1044
|
+
}
|
|
1045
|
+
}
|
|
1046
|
+
|
|
1047
|
+
func TestNormalizeKeepsIncrementalTypeCheckExplicit(t *testing.T) {
|
|
1048
|
+
norm, err := (&Request{
|
|
1049
|
+
Patterns: []string{"./..."},
|
|
1050
|
+
WorkDir: t.TempDir(),
|
|
1051
|
+
}).normalize()
|
|
1052
|
+
if err != nil {
|
|
1053
|
+
t.Fatalf("normalize request: %v", err)
|
|
1054
|
+
}
|
|
1055
|
+
if norm.IncrementalTypeCheck {
|
|
1056
|
+
t.Fatalf("expected explicit workdir alone to skip incremental typecheck cache")
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
norm, err = (&Request{
|
|
1060
|
+
Patterns: []string{"./..."},
|
|
1061
|
+
IncrementalTypeCheck: true,
|
|
1062
|
+
}).normalize()
|
|
1063
|
+
if err != nil {
|
|
1064
|
+
t.Fatalf("normalize incremental request: %v", err)
|
|
1065
|
+
}
|
|
1066
|
+
if !norm.IncrementalTypeCheck {
|
|
1067
|
+
t.Fatalf("expected incremental flag to enable typecheck cache")
|
|
1068
|
+
}
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
func TestPackageExecutionIndexesPrioritizesLargerTestPackages(t *testing.T) {
|
|
1072
|
+
result := &Result{Packages: []PackageResult{
|
|
1073
|
+
{
|
|
1074
|
+
PackagePath: "example.test/small",
|
|
1075
|
+
Tests: []Test{{Name: "TestSmall"}},
|
|
1076
|
+
},
|
|
1077
|
+
{
|
|
1078
|
+
PackagePath: "example.test/large",
|
|
1079
|
+
Tests: []Test{
|
|
1080
|
+
{Name: "TestLargeA"},
|
|
1081
|
+
{Name: "TestLargeB"},
|
|
1082
|
+
{Name: "TestLargeC"},
|
|
1083
|
+
},
|
|
1084
|
+
},
|
|
1085
|
+
{
|
|
1086
|
+
PackagePath: "example.test/medium-b",
|
|
1087
|
+
Tests: []Test{
|
|
1088
|
+
{Name: "TestMediumB1"},
|
|
1089
|
+
{Name: "TestMediumB2"},
|
|
1090
|
+
},
|
|
1091
|
+
},
|
|
1092
|
+
{
|
|
1093
|
+
PackagePath: "example.test/medium-a",
|
|
1094
|
+
Tests: []Test{
|
|
1095
|
+
{Name: "TestMediumA1"},
|
|
1096
|
+
{Name: "TestMediumA2"},
|
|
1097
|
+
},
|
|
1098
|
+
},
|
|
1099
|
+
}}
|
|
1100
|
+
|
|
1101
|
+
got := packageExecutionIndexes(result, []int{0, 1, 2, 3})
|
|
1102
|
+
want := []int{1, 3, 2, 0}
|
|
1103
|
+
if !slices.Equal(got, want) {
|
|
1104
|
+
t.Fatalf("expected execution indexes %v, got %v", want, got)
|
|
1105
|
+
}
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
func TestRenderRunnerChangesToPackageSourceDir(t *testing.T) {
|
|
1109
|
+
req := &normalizedRequest{}
|
|
1110
|
+
runner := renderRunner(PackageResult{
|
|
1111
|
+
PackagePath: "example.test/pkg",
|
|
1112
|
+
SourceDir: "/workspace/pkg",
|
|
1113
|
+
Tests: []Test{{
|
|
1114
|
+
Name: "TestCwd",
|
|
1115
|
+
PackagePath: "example.test/pkg",
|
|
1116
|
+
}},
|
|
1117
|
+
}, req)
|
|
1118
|
+
|
|
1119
|
+
if !strings.Contains(runner, "process.chdir(\"/workspace/pkg\")") {
|
|
1120
|
+
t.Fatalf("expected runner to chdir to package source dir: %s", runner)
|
|
1121
|
+
}
|
|
1122
|
+
if !strings.Contains(runner, "await runTests(\"example.test/pkg\"") {
|
|
1123
|
+
t.Fatalf("expected runner to execute package tests: %s", runner)
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
|
|
1127
|
+
func TestRenderCombinedRunnerChangesToEachPackageSourceDir(t *testing.T) {
|
|
1128
|
+
req := &normalizedRequest{}
|
|
1129
|
+
runner := renderCombinedRunner(&Result{Packages: []PackageResult{
|
|
1130
|
+
{
|
|
1131
|
+
PackagePath: "example.test/one",
|
|
1132
|
+
SourceDir: "/workspace/one",
|
|
1133
|
+
Tests: []Test{{
|
|
1134
|
+
Name: "TestOne",
|
|
1135
|
+
PackagePath: "example.test/one",
|
|
1136
|
+
}},
|
|
1137
|
+
},
|
|
1138
|
+
{
|
|
1139
|
+
PackagePath: "example.test/two",
|
|
1140
|
+
SourceDir: "/workspace/two",
|
|
1141
|
+
Tests: []Test{{
|
|
1142
|
+
Name: "TestTwo",
|
|
1143
|
+
PackagePath: "example.test/two",
|
|
1144
|
+
}},
|
|
1145
|
+
},
|
|
1146
|
+
}}, []int{0, 1}, req)
|
|
1147
|
+
|
|
1148
|
+
if !strings.Contains(runner, "await __goscriptRunPackage(\"example.test/one\", \"/workspace/one\"") {
|
|
1149
|
+
t.Fatalf("expected combined runner to pass first package source dir: %s", runner)
|
|
1150
|
+
}
|
|
1151
|
+
if !strings.Contains(runner, "await __goscriptRunPackage(\"example.test/two\", \"/workspace/two\"") {
|
|
1152
|
+
t.Fatalf("expected combined runner to pass second package source dir: %s", runner)
|
|
1153
|
+
}
|
|
1154
|
+
if !strings.Contains(runner, "process.chdir(packageDir)") {
|
|
1155
|
+
t.Fatalf("expected combined runner to chdir before each package: %s", runner)
|
|
1156
|
+
}
|
|
1157
|
+
}
|
|
1158
|
+
|
|
563
1159
|
func TestRenderTypeScriptProjectDisablesAmbientTypePackages(t *testing.T) {
|
|
564
1160
|
req := &normalizedRequest{
|
|
565
1161
|
WorkDir: "/work",
|
|
566
1162
|
}
|
|
567
1163
|
|
|
568
|
-
tsconfig := renderTypeScriptProject(req, "/work/output/package-0", "runner-0.ts", false)
|
|
1164
|
+
tsconfig := renderTypeScriptProject(req, "/work/output/package-0", "runner-0.ts", "tsconfig-0.json", false)
|
|
569
1165
|
if !strings.Contains(tsconfig, "\"types\": []") {
|
|
570
1166
|
t.Fatalf("expected generated tsconfig to disable ambient @types packages: %s", tsconfig)
|
|
571
1167
|
}
|
|
572
1168
|
if !strings.Contains(tsconfig, "\"goscript-node.d.ts\"") {
|
|
573
1169
|
t.Fatalf("expected generated tsconfig to include GoScript node ambient declarations: %s", tsconfig)
|
|
574
1170
|
}
|
|
1171
|
+
if strings.Contains(tsconfig, "\"incremental\": true") || strings.Contains(tsconfig, "\"tsBuildInfoFile\"") {
|
|
1172
|
+
t.Fatalf("expected generated tsconfig to keep one-shot typecheck by default: %s", tsconfig)
|
|
1173
|
+
}
|
|
1174
|
+
if strings.Contains(tsconfig, "output/package-0/**/*.ts") {
|
|
1175
|
+
t.Fatalf("expected generated tsconfig to typecheck from runner roots, not output globs: %s", tsconfig)
|
|
1176
|
+
}
|
|
575
1177
|
}
|
|
576
1178
|
|
|
577
1179
|
func TestRenderTypeScriptProjectUsesNodeTypesWhenAvailable(t *testing.T) {
|
|
@@ -579,12 +1181,54 @@ func TestRenderTypeScriptProjectUsesNodeTypesWhenAvailable(t *testing.T) {
|
|
|
579
1181
|
WorkDir: "/work",
|
|
580
1182
|
}
|
|
581
1183
|
|
|
582
|
-
tsconfig := renderTypeScriptProject(req, "/work/output/package-0", "runner-0.ts", true)
|
|
1184
|
+
tsconfig := renderTypeScriptProject(req, "/work/output/package-0", "runner-0.ts", "tsconfig-0.json", true)
|
|
583
1185
|
if !strings.Contains(tsconfig, "\"types\": [\"node\"]") {
|
|
584
1186
|
t.Fatalf("expected generated tsconfig to opt into node types: %s", tsconfig)
|
|
585
1187
|
}
|
|
586
1188
|
}
|
|
587
1189
|
|
|
1190
|
+
func TestRenderRuntimeTypeScriptProjectDisablesEmit(t *testing.T) {
|
|
1191
|
+
req := &normalizedRequest{
|
|
1192
|
+
WorkDir: "/work",
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
tsconfig := renderRuntimeTypeScriptProject(req, []string{"/work/output"}, false)
|
|
1196
|
+
if !strings.Contains(tsconfig, "\"noEmit\": true") {
|
|
1197
|
+
t.Fatalf("expected aggregate tsconfig to disable emit: %s", tsconfig)
|
|
1198
|
+
}
|
|
1199
|
+
if strings.Contains(tsconfig, "\"incremental\": true") || strings.Contains(tsconfig, "\"tsBuildInfoFile\"") {
|
|
1200
|
+
t.Fatalf("expected aggregate tsconfig to keep one-shot typecheck by default: %s", tsconfig)
|
|
1201
|
+
}
|
|
1202
|
+
if !strings.Contains(tsconfig, "\"runner-*.ts\"") {
|
|
1203
|
+
t.Fatalf("expected aggregate tsconfig to typecheck generated runner roots: %s", tsconfig)
|
|
1204
|
+
}
|
|
1205
|
+
if !strings.Contains(tsconfig, "./output/@goscript/*") {
|
|
1206
|
+
t.Fatalf("expected aggregate tsconfig path aliases to reference output root: %s", tsconfig)
|
|
1207
|
+
}
|
|
1208
|
+
if strings.Contains(tsconfig, "output/**/*.ts") {
|
|
1209
|
+
t.Fatalf("expected aggregate tsconfig to typecheck from runner roots, not output globs: %s", tsconfig)
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1212
|
+
|
|
1213
|
+
func TestRenderTypeScriptProjectsCanUseIncrementalBuildInfo(t *testing.T) {
|
|
1214
|
+
req := &normalizedRequest{
|
|
1215
|
+
WorkDir: "/work",
|
|
1216
|
+
IncrementalTypeCheck: true,
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
packageTSConfig := renderTypeScriptProject(req, "/work/output/package-0", "runner-0.ts", "tsconfig-0.json", false)
|
|
1220
|
+
if !strings.Contains(packageTSConfig, "\"incremental\": true") ||
|
|
1221
|
+
!strings.Contains(packageTSConfig, "\"tsBuildInfoFile\": \".goscript/tsconfig-0.tsbuildinfo\"") {
|
|
1222
|
+
t.Fatalf("expected package tsconfig to cache package typecheck state: %s", packageTSConfig)
|
|
1223
|
+
}
|
|
1224
|
+
|
|
1225
|
+
aggregateTSConfig := renderRuntimeTypeScriptProject(req, []string{"/work/output"}, false)
|
|
1226
|
+
if !strings.Contains(aggregateTSConfig, "\"incremental\": true") ||
|
|
1227
|
+
!strings.Contains(aggregateTSConfig, "\"tsBuildInfoFile\": \".goscript/tsconfig.tsbuildinfo\"") {
|
|
1228
|
+
t.Fatalf("expected aggregate tsconfig to cache typecheck state: %s", aggregateTSConfig)
|
|
1229
|
+
}
|
|
1230
|
+
}
|
|
1231
|
+
|
|
588
1232
|
func requirePackageResult(t *testing.T, result *Result, packagePath string) PackageResult {
|
|
589
1233
|
t.Helper()
|
|
590
1234
|
|