diff --git a/tests/tests/regression_tests.rs b/tests/tests/regression_tests.rs index 0327906a5..0826bf046 100644 --- a/tests/tests/regression_tests.rs +++ b/tests/tests/regression_tests.rs @@ -710,6 +710,7 @@ swf_tests! { (as3_getouterscope, "avm2/getouterscope", 1), (as3_hasownproperty_namespaces, "avm2/hasownproperty_namespaces", 1), (as3_propertyisenumerable_namespaces, "avm2/propertyisenumerable_namespaces", 1), + (as3_interface_namespaces, "avm2/interface_namespaces", 1), } // TODO: These tests have some inaccuracies currently, so we use approx_eq to test that numeric values are close enough. diff --git a/tests/tests/swfs/avm2/interface_namespaces/Test.as b/tests/tests/swfs/avm2/interface_namespaces/Test.as new file mode 100644 index 000000000..dbfb528a0 --- /dev/null +++ b/tests/tests/swfs/avm2/interface_namespaces/Test.as @@ -0,0 +1,152 @@ +package { + public class Test { + } +} + +namespace ruffle = "https://ruffle.rs/AS3/test_ns"; + +interface ITest2 { + function method(); + function method2(); +} + +class Test2 implements ITest2 { + function Test2() { + } + + public function method() { + trace("Instance method"); + } + + public function method2() { + trace("Instance method 2"); + } + + ruffle function method() { + trace("Ruffle-NS instance method"); + } +} + +interface ITest3 extends ITest2 { + function method3() +} + +class Test3 extends Test2 implements ITest3 { + function Test3() { + } + + public override function method() { + trace("Child instance method pre-super"); + super.method(); + trace("Child instance method post-super"); + } + + public function method3() { + trace("Child instance method3 pre-super"); + super.method(); + trace("Child instance method3 post-super"); + } +} + +class Test4 extends Test3 { + function Test4() { + } + + public override function method2() { + trace("Grandchild instance method2 pre-super"); + super.method2(); + trace("Grandchild instance method2 post-super"); + } + + public override function method3() { + trace("Grandchild instance method3 pre-super"); + super.method3(); + trace("Grandchild instance method3 post-super"); + } +} + +interface IConflictTest2 { + function method(); +} + +class ConflictTest implements ITest2, IConflictTest2 { + public function method() { + trace("Conflicting instance method"); + } + + public function method2() { + trace("Nonconflicting instance method 2"); + } +} + +trace("///var x = new Test3();"); +var x = new Test3(); +trace("///var x_as_iface2: ITest2 = x;"); +var x_as_iface2: ITest2 = x; +trace("///var x_as_iface3: ITest3 = x;"); +var x_as_iface3: ITest3 = x; + +trace("///x_as_iface2.method();"); +trace(x_as_iface2.method()); + +trace("///x_as_iface2.method2();"); +trace(x_as_iface2.method2()); + +trace("///x_as_iface2.ruffle::method();"); +trace(x_as_iface2.ruffle::method()); + +trace("///x_as_iface3.method();"); +trace(x_as_iface3.method()); + +trace("///x_as_iface3.method2();"); +trace(x_as_iface3.method2()); + +trace("///x_as_iface3.ruffle::method();"); +trace(x_as_iface3.ruffle::method()); + +trace("///x_as_iface3.method3();"); +trace(x_as_iface3.method3()); + +trace("///var y = new Test4();"); +var y = new Test4(); +trace("///var y_as_iface2: ITest2 = y;"); +var y_as_iface2: ITest2 = y; +trace("///var y_as_iface3: ITest3 = y;"); +var y_as_iface3: ITest3 = y; + +trace("///y_as_iface2.method();"); +trace(y_as_iface2.method()); + +trace("///y_as_iface2.method2();"); +trace(y_as_iface2.method2()); + +trace("///y_as_iface2.ruffle::method();"); +trace(y_as_iface2.ruffle::method()); + +trace("///y_as_iface3.method();"); +trace(y_as_iface3.method()); + +trace("///y_as_iface3.method2();"); +trace(y_as_iface3.method2()); + +trace("///y_as_iface3.method3();"); +trace(y_as_iface3.method3()); + +trace("///y_as_iface3.ruffle::method();"); +trace(y_as_iface3.ruffle::method()); + +trace("///var z = new ConflictTest();"); +var z = new ConflictTest(); +trace("///var z_as_iface2: ITest2 = z;"); +var z_as_iface2: ITest2 = z; +trace("///var z_as_conflict: IConflictTest2 = z;"); +var z_as_conflict: IConflictTest2 = z; + +trace("///z_as_iface2.method();"); +trace(z_as_iface2.method()); + +trace("///z_as_iface2.method2();"); +trace(z_as_iface2.method2()); + +trace("///z_as_conflict.method();"); +trace(z_as_conflict.method()); \ No newline at end of file diff --git a/tests/tests/swfs/avm2/interface_namespaces/output.txt b/tests/tests/swfs/avm2/interface_namespaces/output.txt new file mode 100644 index 000000000..ba0a6380d --- /dev/null +++ b/tests/tests/swfs/avm2/interface_namespaces/output.txt @@ -0,0 +1,78 @@ +///var x = new Test3(); +///var x_as_iface2: ITest2 = x; +///var x_as_iface3: ITest3 = x; +///x_as_iface2.method(); +Child instance method pre-super +Instance method +Child instance method post-super +undefined +///x_as_iface2.method2(); +Instance method 2 +undefined +///x_as_iface2.ruffle::method(); +Ruffle-NS instance method +undefined +///x_as_iface3.method(); +Child instance method pre-super +Instance method +Child instance method post-super +undefined +///x_as_iface3.method2(); +Instance method 2 +undefined +///x_as_iface3.ruffle::method(); +Ruffle-NS instance method +undefined +///x_as_iface3.method3(); +Child instance method3 pre-super +Instance method +Child instance method3 post-super +undefined +///var y = new Test4(); +///var y_as_iface2: ITest2 = y; +///var y_as_iface3: ITest3 = y; +///y_as_iface2.method(); +Child instance method pre-super +Instance method +Child instance method post-super +undefined +///y_as_iface2.method2(); +Grandchild instance method2 pre-super +Instance method 2 +Grandchild instance method2 post-super +undefined +///y_as_iface2.ruffle::method(); +Ruffle-NS instance method +undefined +///y_as_iface3.method(); +Child instance method pre-super +Instance method +Child instance method post-super +undefined +///y_as_iface3.method2(); +Grandchild instance method2 pre-super +Instance method 2 +Grandchild instance method2 post-super +undefined +///y_as_iface3.method3(); +Grandchild instance method3 pre-super +Child instance method3 pre-super +Instance method +Child instance method3 post-super +Grandchild instance method3 post-super +undefined +///y_as_iface3.ruffle::method(); +Ruffle-NS instance method +undefined +///var z = new ConflictTest(); +///var z_as_iface2: ITest2 = z; +///var z_as_conflict: IConflictTest2 = z; +///z_as_iface2.method(); +Conflicting instance method +undefined +///z_as_iface2.method2(); +Nonconflicting instance method 2 +undefined +///z_as_conflict.method(); +Conflicting instance method +undefined diff --git a/tests/tests/swfs/avm2/interface_namespaces/test.fla b/tests/tests/swfs/avm2/interface_namespaces/test.fla new file mode 100644 index 000000000..b93b0f420 Binary files /dev/null and b/tests/tests/swfs/avm2/interface_namespaces/test.fla differ diff --git a/tests/tests/swfs/avm2/interface_namespaces/test.swf b/tests/tests/swfs/avm2/interface_namespaces/test.swf new file mode 100644 index 000000000..3cbf79c5f Binary files /dev/null and b/tests/tests/swfs/avm2/interface_namespaces/test.swf differ