diff --git a/tslang/test/tester/CMakeLists.txt b/tslang/test/tester/CMakeLists.txt index e0af79347..d1a43580d 100644 --- a/tslang/test/tester/CMakeLists.txt +++ b/tslang/test/tester/CMakeLists.txt @@ -885,6 +885,13 @@ add_test(NAME test-compile-export-import-class-static COMMAND test-runner "${PRO add_test(NAME test-compile-export-import-class-generic COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/import_class_generic.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_class_generic.ts") add_test(NAME test-compile-export-import-function-generic COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/import_function_generic.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_function_generic.ts") add_test(NAME test-compile-export-import-type-alias-generic COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/import_type_alias_generic.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_type_alias_generic.ts") +# plain (non-generic) counterparts - every other declaration kind (class, interface, enum, vars) +# already had both a "-generic" and a plain cross-module export/import pair; function and +# type-alias only had "-generic". Confirmed working (not a gap) before adding: default/optional +# params, union/chained-alias/object-shape aliases, and an aliased type used in a function +# signature all round-trip correctly through __decls across all 3 tiers. +add_test(NAME test-compile-export-import-function COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/import_function.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_function.ts") +add_test(NAME test-compile-export-import-type-alias COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/import_type_alias.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_type_alias.ts") add_test(NAME test-compile-export-import-interface-generic COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/import_interface_generic.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_interface_generic.ts") add_test(NAME test-compile-export-import-class-accessor COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/import_class_accessor.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_class_accessor.ts") add_test(NAME test-compile-export-import-class-indexer COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/import_class_indexer.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_class_indexer.ts") @@ -961,6 +968,8 @@ add_test(NAME test-compile-shared-export-import-class-abstract-virtual-dispatch add_test(NAME test-compile-shared-export-import-class-generic COMMAND test-runner -shared "${PROJECT_SOURCE_DIR}/test/tester/tests/import_class_generic.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_class_generic.ts") add_test(NAME test-compile-shared-export-import-function-generic COMMAND test-runner -shared "${PROJECT_SOURCE_DIR}/test/tester/tests/import_function_generic.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_function_generic.ts") add_test(NAME test-compile-shared-export-import-type-alias-generic COMMAND test-runner -shared "${PROJECT_SOURCE_DIR}/test/tester/tests/import_type_alias_generic.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_type_alias_generic.ts") +add_test(NAME test-compile-shared-export-import-function COMMAND test-runner -shared "${PROJECT_SOURCE_DIR}/test/tester/tests/import_function.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_function.ts") +add_test(NAME test-compile-shared-export-import-type-alias COMMAND test-runner -shared "${PROJECT_SOURCE_DIR}/test/tester/tests/import_type_alias.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_type_alias.ts") add_test(NAME test-compile-shared-export-import-interface-generic COMMAND test-runner -shared "${PROJECT_SOURCE_DIR}/test/tester/tests/import_interface_generic.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_interface_generic.ts") # FIXED (2026-07-22): the -shared declaration-reconstruction path never printed real # get/set syntax for a class's accessors, only the underlying get_x/set_x funcOps as @@ -1011,6 +1020,8 @@ add_test(NAME test-jit-shared-export-import-class-abstract-virtual-dispatch COMM add_test(NAME test-jit-shared-export-import-class-generic COMMAND test-runner -jit -shared "${PROJECT_SOURCE_DIR}/test/tester/tests/import_class_generic.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_class_generic.ts") add_test(NAME test-jit-shared-export-import-function-generic COMMAND test-runner -jit -shared "${PROJECT_SOURCE_DIR}/test/tester/tests/import_function_generic.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_function_generic.ts") add_test(NAME test-jit-shared-export-import-type-alias-generic COMMAND test-runner -jit -shared "${PROJECT_SOURCE_DIR}/test/tester/tests/import_type_alias_generic.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_type_alias_generic.ts") +add_test(NAME test-jit-shared-export-import-function COMMAND test-runner -jit -shared "${PROJECT_SOURCE_DIR}/test/tester/tests/import_function.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_function.ts") +add_test(NAME test-jit-shared-export-import-type-alias COMMAND test-runner -jit -shared "${PROJECT_SOURCE_DIR}/test/tester/tests/import_type_alias.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_type_alias.ts") add_test(NAME test-jit-shared-export-import-interface-generic COMMAND test-runner -jit -shared "${PROJECT_SOURCE_DIR}/test/tester/tests/import_interface_generic.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_interface_generic.ts") # FIXED: see the matching test-compile-shared-export-import-class-accessor comment above (2026-07-22). add_test(NAME test-jit-shared-export-import-class-accessor COMMAND test-runner -jit -shared "${PROJECT_SOURCE_DIR}/test/tester/tests/import_class_accessor.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_class_accessor.ts") diff --git a/tslang/test/tester/tests/export_function.ts b/tslang/test/tester/tests/export_function.ts new file mode 100644 index 000000000..ab61e1365 --- /dev/null +++ b/tslang/test/tester/tests/export_function.ts @@ -0,0 +1,34 @@ +namespace M { + + // Cross-module counterpart to 01arguments.ts / 00funcs.ts, but for a plain + // (non-generic) function - every other declaration kind (class, interface, + // enum, vars) has both a "-generic" and a plain cross-module export/import + // test pair; function only had "-generic" (import_function_generic.ts). + // Covers what DeclarationPrinter's printFunction/printParams must round-trip + // correctly through __decls: a required param, an optional param (`?`), a + // default-valued param, and a void return. + + export function add(a: number, b: number): number { + return a + b; + } + + export function greet(name: string, greeting: string = "Hello"): string { + return `${greeting}, ${name}!`; + } + + export function maybeDouble(x: number, factor?: number): number { + if (factor == undefined) factor = 2; + return x * factor; + } + + export function noop(): void { + } + + // a function in the exporting module calling ANOTHER function declared in + // the SAME exporting module - exercises that intra-module calls still + // resolve correctly once this module is compiled as a dynamic-import target + // rather than compiled standalone (distinct from the importer calling in). + export function addTwice(a: number, b: number): number { + return add(a, b) + add(a, b); + } +} diff --git a/tslang/test/tester/tests/export_type_alias.ts b/tslang/test/tester/tests/export_type_alias.ts new file mode 100644 index 000000000..86487c6dd --- /dev/null +++ b/tslang/test/tester/tests/export_type_alias.ts @@ -0,0 +1,25 @@ +namespace M { + + // Cross-module counterpart to decl_type.ts, but broader - every other + // declaration kind has both a "-generic" and a plain cross-module test + // pair; type alias only had "-generic" (import_type_alias_generic.ts). + // Covers a primitive alias, an object-shape alias, a union alias, an + // alias-of-alias chain, and a function whose signature uses one of these + // aliases (so the printed __decls text must resolve the alias by name, + // not just inline its expansion). + + export type Id = number; + + export type UserId = Id; + + export type Point = { + x: number; + y: number; + }; + + export type Status = number | string; + + export function makePoint(x: number, y: number): Point { + return { x: x, y: y }; + } +} diff --git a/tslang/test/tester/tests/import_function.ts b/tslang/test/tester/tests/import_function.ts new file mode 100644 index 000000000..cd4f4fa2a --- /dev/null +++ b/tslang/test/tester/tests/import_function.ts @@ -0,0 +1,17 @@ +import './export_function' + +function main() { + assert(M.add(2, 3) == 5); + + assert(M.greet("World") == "Hello, World!"); + assert(M.greet("World", "Hi") == "Hi, World!"); + + assert(M.maybeDouble(5) == 10); + assert(M.maybeDouble(5, 3) == 15); + + M.noop(); + + assert(M.addTwice(2, 3) == 10); + + print("done."); +} diff --git a/tslang/test/tester/tests/import_type_alias.ts b/tslang/test/tester/tests/import_type_alias.ts new file mode 100644 index 000000000..f0598b933 --- /dev/null +++ b/tslang/test/tester/tests/import_type_alias.ts @@ -0,0 +1,20 @@ +import './export_type_alias' + +function main() { + const id: M.Id = 42; + assert(id == 42); + + const uid: M.UserId = 7; + assert(uid == 7); + + const p: M.Point = M.makePoint(1, 2); + assert(p.x == 1); + assert(p.y == 2); + + let s: M.Status = 5; + assert(s == 5); + s = "error"; + assert(s == "error"); + + print("done."); +}