From 4e689c6c17dbf62273f611a5fa8bb7d3c00650a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?T=C3=96R=C3=96K=20Attila?= Date: Thu, 14 Dec 2023 00:41:49 +0100 Subject: [PATCH] tests/avm2: Reduce the number of digits in Vector3D tests This makes them pass on aarch64 (for example, Android), it looks nicer (no secret robot math), and more digits are not necessary anyway. Also fix up formatting a bit. --- tests/tests/swfs/avm2/vector3d/Test.as | 100 ++++++++++++---------- tests/tests/swfs/avm2/vector3d/output.txt | 24 +++--- tests/tests/swfs/avm2/vector3d/test.swf | Bin 4276 -> 4431 bytes 3 files changed, 68 insertions(+), 56 deletions(-) diff --git a/tests/tests/swfs/avm2/vector3d/Test.as b/tests/tests/swfs/avm2/vector3d/Test.as index 73abc508eb8a..60eea9d38e6f 100644 --- a/tests/tests/swfs/avm2/vector3d/Test.as +++ b/tests/tests/swfs/avm2/vector3d/Test.as @@ -5,14 +5,22 @@ import flash.geom.Vector3D; +function r(x:Number):Number { + return Math.round(x * Math.pow(10, 12)) / Math.pow(10, 12); +} + +function rv(v:Vector3D):Vector3D { + return new Vector3D(r(v.x), r(v.y), r(v.z), r(v.w)); +} // because toString() does not include w, but we are interested in it function trv(v:Vector3D) { - trace(v + " w=" + v.w); + trace(rv(v) + " w=" + r(v.w)); } trace("/// Constructors"); + trace("// new Vector3D()"); trv(new Vector3D()); trace(""); @@ -64,44 +72,47 @@ trace("// Vector3D.Y_AXIS"); trv(Vector3D.Y_AXIS); trace("// Vector3D.Z_AXIS"); trv(Vector3D.Z_AXIS); -trace("") -trace("") +trace(""); +trace(""); + +trace("/// copyFrom"); -trace("/// copyFrom") trace("// new Vector3D(1, 2, 3, 4).copyFrom(new Vector3D())"); var vector_cf = new Vector3D(1, 2, 3, 4); vector_cf.copyFrom(new Vector3D()); trv(vector_cf); -trace("") +trace(""); trace("// new Vector3D().copyFrom(new Vector3D(4, 5, 6, 7))"); var vector_cf2 = new Vector3D(); vector_cf2.copyFrom(new Vector3D(4, 5, 6, 7)); trv(vector_cf2); -trace("") +trace(""); trace("// new Vector3D(1, 2, 3, 4).copyFrom(new Vector3D(4, 5, 6, 7))"); var vector_cf3 = new Vector3D(1, 2, 3, 4); vector_cf3.copyFrom(new Vector3D(4, 5, 6, 7)); trv(vector_cf3); -trace("") -trace("") +trace(""); +trace(""); + +trace("/// setTo"); -trace("/// setTo") trace("// new Vector3D().setTo(6, 7, 8)"); var vector_st = new Vector3D(); vector_st.setTo(6, 7, 8); trv(vector_st); -trace("") +trace(""); trace("// new Vector3D(1, 2, 3, 4).setTo(6, 7, 8)"); var vector_st2 = new Vector3D(1, 2, 3, 4); vector_st2.setTo(6, 7, 8); trv(vector_st2); -trace("") -trace("") +trace(""); +trace(""); + trace("/// Add"); @@ -123,6 +134,7 @@ trv(new Vector3D(6, -7, 8, -9).add(new Vector3D(-10, 20, -30, 40))); trace(""); trace(""); + trace("/// Subtract"); var vector3 = new Vector3D(); @@ -141,7 +153,7 @@ trace(""); trace("// new Vector3D(6, -7, 8, -9).subtract(new Vector3D(-10, 20, -30, 40))"); trv(new Vector3D(6, -7, 8, -9).subtract(new Vector3D(-10, 20, -30, 40))); trace(""); -trace("") +trace(""); trace("/// incrementBy"); @@ -149,20 +161,20 @@ trace("/// incrementBy"); var vector_ib = new Vector3D(); trace("// new Vector3D().incrementBy(new Vector3D())"); vector_ib.incrementBy(new Vector3D()); -trv(vector_ib) +trv(vector_ib); trace(""); var vector_ib2 = new Vector3D(); trace("// new Vector3D().incrementBy(new Vector3D(1, 2, -3, 4))"); vector_ib2.incrementBy(new Vector3D(1, 2, -3, 4)); -trv(vector_ib2) +trv(vector_ib2); trace(""); var vector_ib3 = new Vector3D(3, -4, 5, 6); trace("// new Vector3D(3, -4, 5, 6).incrementBy(new Vector3D(1, 2, -3, 4))"); vector_ib3.incrementBy(new Vector3D(1, 2, -3, 4)); -trv(vector_ib3) +trv(vector_ib3); trace(""); trace(""); @@ -172,20 +184,20 @@ trace("/// decrementBy"); var vector_db = new Vector3D(); trace("// new Vector3D().decrementBy(new Vector3D())"); vector_db.decrementBy(new Vector3D()); -trv(vector_db) +trv(vector_db); trace(""); var vector_db2 = new Vector3D(); trace("// new Vector3D().decrementBy(new Vector3D(1, 2, -3, 4))"); vector_db2.decrementBy(new Vector3D(1, 2, -3, 4)); -trv(vector_db2) +trv(vector_db2); trace(""); var vector_db3 = new Vector3D(3, -4, 5, 6); trace("// new Vector3D(3, -4, 5, 6).decrementBy(new Vector3D(1, 2, -3, 4))"); vector_db3.decrementBy(new Vector3D(1, 2, -3, 4)); -trv(vector_db3) +trv(vector_db3); trace(""); trace(""); @@ -221,7 +233,7 @@ var vector_sb5 = new Vector3D(); vector_sb5.scaleBy(100); trv(vector_sb5); trace(""); -trace("") +trace(""); trace("/// negate"); @@ -243,7 +255,7 @@ var vector_n3 = new Vector3D(); vector_n3.negate(); trv(vector_n3); trace(""); -trace("") +trace(""); trace("/// Distance"); @@ -342,7 +354,7 @@ trace(new Vector3D(100, 200, 300, 400).nearEquals(new Vector3D(100, 200, 300, 45 trace(""); trace(""); -trace("// buggy case with allFour=true:") +trace("// buggy case with allFour=true:"); trace("// (100, 200, 300, 10).nearEquals((100, 200, 300, 20), 100, true)"); trace(new Vector3D(100, 200, 300, 10).nearEquals(new Vector3D(100, 200, 300, 20), 100, true)); trace("// (100, 200, 300, 210).nearEquals((100, 200, 300, 220), 100, true)"); @@ -451,7 +463,7 @@ trace(""); trace(""); -trace("/// Project") +trace("/// Project"); trace("// new Vector3D().project()"); var vector_p1 = new Vector3D(); vector_p1.project(); @@ -496,87 +508,87 @@ trace(""); trace(""); -trace("/// angleBetween") +trace("/// angleBetween"); trace("// Vector3D.angleBetween(new Vector3D(), new Vector3D())"); -trace(Vector3D.angleBetween(new Vector3D(), new Vector3D())); +trace(r(Vector3D.angleBetween(new Vector3D(), new Vector3D()))); trace(""); trace("// Vector3D.angleBetween(new Vector3D(), new Vector3D(1, 0, 0))"); -trace(Vector3D.angleBetween(new Vector3D(), new Vector3D(1, 0, 0))); +trace(r(Vector3D.angleBetween(new Vector3D(), new Vector3D(1, 0, 0)))); trace(""); trace("// Vector3D.angleBetween(new Vector3D(1, 0, 0), new Vector3D())"); -trace(Vector3D.angleBetween(new Vector3D(1, 0, 0), new Vector3D())); +trace(r(Vector3D.angleBetween(new Vector3D(1, 0, 0), new Vector3D()))); trace(""); trace("// Vector3D.angleBetween(new Vector3D(1, 0, 0), new Vector3D(0, 1, 0))"); -trace(Vector3D.angleBetween(new Vector3D(1, 0, 0), new Vector3D(0, 1, 0))); +trace(r(Vector3D.angleBetween(new Vector3D(1, 0, 0), new Vector3D(0, 1, 0)))); trace(""); trace("// Vector3D.angleBetween(new Vector3D(0, -1, 0), new Vector3D(0, 0, 1))"); -trace(Vector3D.angleBetween(new Vector3D(0, -1, 0), new Vector3D(0, 0, 1))); +trace(r(Vector3D.angleBetween(new Vector3D(0, -1, 0), new Vector3D(0, 0, 1)))); trace(""); trace("// Vector3D.angleBetween(new Vector3D(0, -20, 0), new Vector3D(0, 0, 0.1))"); -trace(Vector3D.angleBetween(new Vector3D(0, -20, 0), new Vector3D(0, 0, 0.1))); +trace(r(Vector3D.angleBetween(new Vector3D(0, -20, 0), new Vector3D(0, 0, 0.1)))); trace(""); trace("// Vector3D.angleBetween(new Vector3D(2, 4, 6), new Vector3D(0.6, 0.5, 0.1))"); -trace(Vector3D.angleBetween(new Vector3D(2, 4, 6), new Vector3D(0.6, 0.5, 0.1))); +trace(r(Vector3D.angleBetween(new Vector3D(2, 4, 6), new Vector3D(0.6, 0.5, 0.1)))); trace(""); trace("// Vector3D.angleBetween(new Vector3D(0.6, 0.5, 0.1), new Vector3D(2, 4, 6))"); -trace(Vector3D.angleBetween(new Vector3D(0.6, 0.5, 0.1), new Vector3D(2, 4, 6))); +trace(r(Vector3D.angleBetween(new Vector3D(0.6, 0.5, 0.1), new Vector3D(2, 4, 6)))); trace(""); trace("// Vector3D.angleBetween(new Vector3D(2, 4, 6, 8), new Vector3D(0.6, 0.5, 0.1, -0.2))"); -trace(Vector3D.angleBetween(new Vector3D(2, 4, 6, 8), new Vector3D(0.6, 0.5, 0.1, -0.2))); +trace(r(Vector3D.angleBetween(new Vector3D(2, 4, 6, 8), new Vector3D(0.6, 0.5, 0.1, -0.2)))); trace(""); trace(""); -trace("/// dotProduct") +trace("/// dotProduct"); trace("// new Vector3D().dotProduct(new Vector3D())"); -trace(new Vector3D().dotProduct(new Vector3D())); +trace(r(new Vector3D().dotProduct(new Vector3D()))); trace(""); trace("// new Vector3D().dotProduct(new Vector3D(1, 0, 0))"); -trace(new Vector3D().dotProduct(new Vector3D(1, 0, 0))); +trace(r(new Vector3D().dotProduct(new Vector3D(1, 0, 0)))); trace(""); trace("// new Vector3D(1, 0, 0).dotProduct(new Vector3D())"); -trace(new Vector3D(1, 0, 0).dotProduct(new Vector3D())); +trace(r(new Vector3D(1, 0, 0).dotProduct(new Vector3D()))); trace(""); trace("// new Vector3D(1, 0, 0).dotProduct(new Vector3D(0, 1, 0))"); -trace(new Vector3D(1, 0, 0).dotProduct(new Vector3D(0, 1, 0))); +trace(r(new Vector3D(1, 0, 0).dotProduct(new Vector3D(0, 1, 0)))); trace(""); trace("// new Vector3D(0, -1, 0).dotProduct(new Vector3D(0, 0, 1))"); -trace(new Vector3D(0, -1, 0).dotProduct(new Vector3D(0, 0, 1))); +trace(r(new Vector3D(0, -1, 0).dotProduct(new Vector3D(0, 0, 1)))); trace(""); trace("// new Vector3D(0, -20, 0).dotProduct(new Vector3D(0, 0, 0.1))"); -trace(new Vector3D(0, -20, 0).dotProduct(new Vector3D(0, 0, 0.1))); +trace(r(new Vector3D(0, -20, 0).dotProduct(new Vector3D(0, 0, 0.1)))); trace(""); trace("// new Vector3D(2, 4, 6).dotProduct(new Vector3D(0.6, 0.5, 0.1))"); -trace(new Vector3D(2, 4, 6).dotProduct(new Vector3D(0.6, 0.5, 0.1))); +trace(r(new Vector3D(2, 4, 6).dotProduct(new Vector3D(0.6, 0.5, 0.1)))); trace(""); trace("// new Vector3D(0.6, 0.5, 0.1).dotProduct(new Vector3D(2, 4, 6))"); -trace(new Vector3D(0.6, 0.5, 0.1).dotProduct(new Vector3D(2, 4, 6))); +trace(r(new Vector3D(0.6, 0.5, 0.1).dotProduct(new Vector3D(2, 4, 6)))); trace(""); trace("// new Vector3D(2, 4, 6, 8).dotProduct(new Vector3D(0.6, 0.5, 0.1, -0.2))"); -trace(new Vector3D(2, 4, 6, 8).dotProduct(new Vector3D(0.6, 0.5, 0.1, -0.2))); +trace(r(new Vector3D(2, 4, 6, 8).dotProduct(new Vector3D(0.6, 0.5, 0.1, -0.2)))); trace(""); trace(""); -trace("/// crossProduct") +trace("/// crossProduct"); trace("// new Vector3D().crossProduct(new Vector3D())"); trv(new Vector3D().crossProduct(new Vector3D())); diff --git a/tests/tests/swfs/avm2/vector3d/output.txt b/tests/tests/swfs/avm2/vector3d/output.txt index db9b16b20048..e2cda55ba861 100644 --- a/tests/tests/swfs/avm2/vector3d/output.txt +++ b/tests/tests/swfs/avm2/vector3d/output.txt @@ -321,22 +321,22 @@ NaN NaN // Vector3D.angleBetween(new Vector3D(1, 0, 0), new Vector3D(0, 1, 0)) -1.5707963267948966 +1.570796326795 // Vector3D.angleBetween(new Vector3D(0, -1, 0), new Vector3D(0, 0, 1)) -1.5707963267948966 +1.570796326795 // Vector3D.angleBetween(new Vector3D(0, -20, 0), new Vector3D(0, 0, 0.1)) -1.5707963267948966 +1.570796326795 // Vector3D.angleBetween(new Vector3D(2, 4, 6), new Vector3D(0.6, 0.5, 0.1)) -0.8699012499232629 +0.869901249923 // Vector3D.angleBetween(new Vector3D(0.6, 0.5, 0.1), new Vector3D(2, 4, 6)) -0.8699012499232629 +0.869901249923 // Vector3D.angleBetween(new Vector3D(2, 4, 6, 8), new Vector3D(0.6, 0.5, 0.1, -0.2)) -0.8699012499232629 +0.869901249923 /// dotProduct @@ -359,13 +359,13 @@ NaN 0 // new Vector3D(2, 4, 6).dotProduct(new Vector3D(0.6, 0.5, 0.1)) -3.8000000000000003 +3.8 // new Vector3D(0.6, 0.5, 0.1).dotProduct(new Vector3D(2, 4, 6)) -3.8000000000000003 +3.8 // new Vector3D(2, 4, 6, 8).dotProduct(new Vector3D(0.6, 0.5, 0.1, -0.2)) -3.8000000000000003 +3.8 /// crossProduct @@ -388,12 +388,12 @@ Vector3D(-1, 0, 0) w=1 Vector3D(-2, 0, 0) w=1 // new Vector3D(2, 4, 6).crossProduct(new Vector3D(0.6, 0.5, 0.1)) -Vector3D(-2.6, 3.3999999999999995, -1.4) w=1 +Vector3D(-2.6, 3.4, -1.4) w=1 // new Vector3D(0.6, 0.5, 0.1).crossProduct(new Vector3D(2, 4, 6)) -Vector3D(2.6, -3.3999999999999995, 1.4) w=1 +Vector3D(2.6, -3.4, 1.4) w=1 // new Vector3D(2, 4, 6, 8).crossProduct(new Vector3D(0.6, 0.5, 0.1, -0.2)) -Vector3D(-2.6, 3.3999999999999995, -1.4) w=1 +Vector3D(-2.6, 3.4, -1.4) w=1 diff --git a/tests/tests/swfs/avm2/vector3d/test.swf b/tests/tests/swfs/avm2/vector3d/test.swf index 07fa54d5cb39b6c972c0ac5d2bc44d29e8ace830..2dc6a9bfccb98ef7953bde6ffd5c0406ca8d6b77 100644 GIT binary patch literal 4431 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 W{_M*9qo=6zkDi$8Q1ky4)mzYDxJZZq