diff --git a/tslang/test/tester/CMakeLists.txt b/tslang/test/tester/CMakeLists.txt index 51334b11..cc8ff961 100644 --- a/tslang/test/tester/CMakeLists.txt +++ b/tslang/test/tester/CMakeLists.txt @@ -291,6 +291,7 @@ add_test(NAME test-compile-00-object-annotated-method COMMAND test-runner "${PRO add_test(NAME test-compile-00-object-annotated-method-params COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00object_annotated_method_params.ts") add_test(NAME test-compile-00-object-annotated-method-interleaved COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00object_annotated_method_interleaved.ts") add_test(NAME test-compile-00-object-annotated-method-extends-interface COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00object_annotated_method_extends_interface.ts") +add_test(NAME test-compile-00-object-annotated-method-extends-interface-multilevel COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00object_annotated_method_extends_interface_multilevel.ts") add_test(NAME test-compile-00-interface-object-array COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00interface_object_array.ts") add_test(NAME test-compile-00-interface-generic COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00interface_generic.ts") add_test(NAME test-compile-00-interface-new COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00interface_new.ts") @@ -649,6 +650,7 @@ add_test(NAME test-jit-00-object-annotated-method COMMAND test-runner -jit "${PR add_test(NAME test-jit-00-object-annotated-method-params COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00object_annotated_method_params.ts") add_test(NAME test-jit-00-object-annotated-method-interleaved COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00object_annotated_method_interleaved.ts") add_test(NAME test-jit-00-object-annotated-method-extends-interface COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00object_annotated_method_extends_interface.ts") +add_test(NAME test-jit-00-object-annotated-method-extends-interface-multilevel COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00object_annotated_method_extends_interface_multilevel.ts") add_test(NAME test-jit-00-interface-object-array COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00interface_object_array.ts") add_test(NAME test-jit-00-interface-generic COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00interface_generic.ts") add_test(NAME test-jit-00-interface-new COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00interface_new.ts") diff --git a/tslang/test/tester/tests/00object_annotated_method_extends_interface_multilevel.ts b/tslang/test/tester/tests/00object_annotated_method_extends_interface_multilevel.ts new file mode 100644 index 00000000..96308f11 --- /dev/null +++ b/tslang/test/tester/tests/00object_annotated_method_extends_interface_multilevel.ts @@ -0,0 +1,84 @@ +// Extends 00object_annotated_method_extends_interface.ts's coverage (single +// level: Accumulator extends Base) to a 3-level chain (C extends B extends +// A) and an interface with TWO extends targets (Combined extends Left, +// Right) - the "known limitation, not verified" gap flagged when that +// single-level fix landed (PR #266). Both work correctly with the same +// fix: InterfaceInfo::getVirtualTable's extends recursion and +// getAllMethods() are themselves recursive/multi-target already, not +// hardcoded to one level - this test just locks that in. + +function main() { + interface A { + a: number; + addA(n: number): void; + } + interface B extends A { + b: number; + addB(n: number): void; + } + interface C extends B { + c: number; + addC(n: number): void; + } + + let raw = { + a: 1.0, + addA(n: number) { this.a = this.a + n; }, + b: 2.0, + addB(n: number) { this.b = this.b + n; }, + c: 3.0, + addC(n: number) { this.c = this.c + n; }, + }; + + let obj: C = raw; + + obj.addA(10); + assert(obj.a == 11); + print(obj.a); + + obj.addB(20); + assert(obj.b == 22); + print(obj.b); + + obj.addC(30); + assert(obj.c == 33); + print(obj.c); + + interface Left { + left: number; + addLeft(n: number): void; + } + interface Right { + right: number; + addRight(n: number): void; + } + interface Combined extends Left, Right { + combined: number; + addCombined(n: number): void; + } + + let rawCombined = { + left: 1.0, + addLeft(n: number) { this.left = this.left + n; }, + right: 2.0, + addRight(n: number) { this.right = this.right + n; }, + combined: 3.0, + addCombined(n: number) { this.combined = this.combined + n; }, + }; + + let combined: Combined = rawCombined; + + combined.addLeft(10); + assert(combined.left == 11); + print(combined.left); + + combined.addRight(20); + assert(combined.right == 22); + print(combined.right); + + combined.addCombined(30); + assert(combined.combined == 33); + print(combined.combined); + + print("done."); +}