From 37cdcb3bce10869ed37355c5fd9db23f41bdbc49 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Sun, 8 Mar 2020 20:12:31 -0400 Subject: [PATCH] Add tests for `toString` on objects, functions, and classes. --- core/tests/regression_tests.rs | 3 +++ core/tests/swfs/avm2/class_to_string/Test.as | 10 ++++++++++ core/tests/swfs/avm2/class_to_string/output.txt | 2 ++ core/tests/swfs/avm2/class_to_string/test.fla | Bin 0 -> 4031 bytes core/tests/swfs/avm2/class_to_string/test.swf | Bin 0 -> 997 bytes core/tests/swfs/avm2/function_to_string/Test.as | 16 ++++++++++++++++ .../swfs/avm2/function_to_string/output.txt | 4 ++++ .../tests/swfs/avm2/function_to_string/test.fla | Bin 0 -> 4031 bytes .../tests/swfs/avm2/function_to_string/test.swf | Bin 0 -> 1031 bytes core/tests/swfs/avm2/object_to_string/Test.as | 6 ++++++ .../tests/swfs/avm2/object_to_string/output.txt | 2 ++ core/tests/swfs/avm2/object_to_string/test.fla | Bin 0 -> 4031 bytes core/tests/swfs/avm2/object_to_string/test.swf | Bin 0 -> 949 bytes 13 files changed, 43 insertions(+) create mode 100644 core/tests/swfs/avm2/class_to_string/Test.as create mode 100644 core/tests/swfs/avm2/class_to_string/output.txt create mode 100644 core/tests/swfs/avm2/class_to_string/test.fla create mode 100644 core/tests/swfs/avm2/class_to_string/test.swf create mode 100644 core/tests/swfs/avm2/function_to_string/Test.as create mode 100644 core/tests/swfs/avm2/function_to_string/output.txt create mode 100644 core/tests/swfs/avm2/function_to_string/test.fla create mode 100644 core/tests/swfs/avm2/function_to_string/test.swf create mode 100644 core/tests/swfs/avm2/object_to_string/Test.as create mode 100644 core/tests/swfs/avm2/object_to_string/output.txt create mode 100644 core/tests/swfs/avm2/object_to_string/test.fla create mode 100644 core/tests/swfs/avm2/object_to_string/test.swf diff --git a/core/tests/regression_tests.rs b/core/tests/regression_tests.rs index 6d06fd6f3..6563a714f 100644 --- a/core/tests/regression_tests.rs +++ b/core/tests/regression_tests.rs @@ -244,6 +244,9 @@ swf_tests! { (as3_has_own_property, "avm2/has_own_property", 1), (as3_property_is_enumerable, "avm2/property_is_enumerable", 1), (as3_set_property_is_enumerable, "avm2/set_property_is_enumerable", 1), + (as3_object_to_string, "avm2/object_to_string", 1), + (as3_function_to_string, "avm2/function_to_string", 1), + (as3_class_to_string, "avm2/class_to_string", 1), } // TODO: These tests have some inaccuracies currently, so we use approx_eq to test that numeric values are close enough. diff --git a/core/tests/swfs/avm2/class_to_string/Test.as b/core/tests/swfs/avm2/class_to_string/Test.as new file mode 100644 index 000000000..d9eccd9a9 --- /dev/null +++ b/core/tests/swfs/avm2/class_to_string/Test.as @@ -0,0 +1,10 @@ +package { + public class Test {} +} + +class ES4Class { + +} + +trace("//ES4Class.toString()"); +trace(ES4Class.toString()); \ No newline at end of file diff --git a/core/tests/swfs/avm2/class_to_string/output.txt b/core/tests/swfs/avm2/class_to_string/output.txt new file mode 100644 index 000000000..9c7c7c864 --- /dev/null +++ b/core/tests/swfs/avm2/class_to_string/output.txt @@ -0,0 +1,2 @@ +//ES4Class.toString() +[class ES4Class] diff --git a/core/tests/swfs/avm2/class_to_string/test.fla b/core/tests/swfs/avm2/class_to_string/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..d382fbe3e8ab454910c617c4d2ff9d879207277d GIT binary patch literal 4031 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 T)A?v{51wK04UhZ<=SJ~twp;hE literal 0 HcmV?d00001 diff --git a/core/tests/swfs/avm2/function_to_string/Test.as b/core/tests/swfs/avm2/function_to_string/Test.as new file mode 100644 index 000000000..0765fb2b1 --- /dev/null +++ b/core/tests/swfs/avm2/function_to_string/Test.as @@ -0,0 +1,16 @@ +package { + public class Test {} +} + +var freeFunction = function() { +}; + +function namedFunction() { + +} + +trace("//freeFunction.toString()"); +trace(freeFunction.toString()); + +trace("//namedFunction.toString()"); +trace(namedFunction.toString()); \ No newline at end of file diff --git a/core/tests/swfs/avm2/function_to_string/output.txt b/core/tests/swfs/avm2/function_to_string/output.txt new file mode 100644 index 000000000..823210c4a --- /dev/null +++ b/core/tests/swfs/avm2/function_to_string/output.txt @@ -0,0 +1,4 @@ +//freeFunction.toString() +function Function() {} +//namedFunction.toString() +function Function() {} diff --git a/core/tests/swfs/avm2/function_to_string/test.fla b/core/tests/swfs/avm2/function_to_string/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..d382fbe3e8ab454910c617c4d2ff9d879207277d GIT binary patch literal 4031 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 B5vTwF literal 0 HcmV?d00001 diff --git a/core/tests/swfs/avm2/object_to_string/Test.as b/core/tests/swfs/avm2/object_to_string/Test.as new file mode 100644 index 000000000..2a3e0b02f --- /dev/null +++ b/core/tests/swfs/avm2/object_to_string/Test.as @@ -0,0 +1,6 @@ +package { + public class Test {} +} + +trace("//(new Object()).toString()"); +trace((new Object()).toString()); \ No newline at end of file diff --git a/core/tests/swfs/avm2/object_to_string/output.txt b/core/tests/swfs/avm2/object_to_string/output.txt new file mode 100644 index 000000000..df1f145f1 --- /dev/null +++ b/core/tests/swfs/avm2/object_to_string/output.txt @@ -0,0 +1,2 @@ +//(new Object()).toString() +[object Object] diff --git a/core/tests/swfs/avm2/object_to_string/test.fla b/core/tests/swfs/avm2/object_to_string/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..d382fbe3e8ab454910c617c4d2ff9d879207277d GIT binary patch literal 4031 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