Implement and test `equals`.

The test is also far more in-depth than the `if_eq`/`if_ne` tests, which use the same set of vectors as the strict-equality tests from a while ago. Interestingly, this test passed on first run
This commit is contained in:
David Wendt 2020-07-09 21:46:17 -04:00 committed by Mike Welsh
parent 5da4e2f118
commit 76ab8570e4
6 changed files with 1301 additions and 0 deletions

View File

@ -489,6 +489,7 @@ impl<'a, 'gc, 'gc_context> Activation<'a, 'gc, 'gc_context> {
Op::IfEq { offset } => self.op_if_eq(context, offset, reader),
Op::IfNe { offset } => self.op_if_ne(context, offset, reader),
Op::StrictEquals => self.op_strict_equals(),
Op::Equals => self.op_equals(context),
Op::Not => self.op_not(),
Op::HasNext => self.op_has_next(),
Op::HasNext2 {
@ -1488,6 +1489,20 @@ impl<'a, 'gc, 'gc_context> Activation<'a, 'gc, 'gc_context> {
Ok(FrameControl::Continue)
}
fn op_equals(
&mut self,
context: &mut UpdateContext<'_, 'gc, '_>,
) -> Result<FrameControl<'gc>, Error> {
let value2 = self.avm2.pop();
let value1 = self.avm2.pop();
let result = value1.abstract_eq(&value2, self, context)?;
self.avm2.push(result);
Ok(FrameControl::Continue)
}
fn op_not(&mut self) -> Result<FrameControl<'gc>, Error> {
let value = self.context.avm2.pop().coerce_to_boolean();

View File

@ -283,6 +283,7 @@ swf_tests! {
(as3_coerce_string, "avm2/coerce_string", 1),
(as3_if_eq, "avm2/if_eq", 1),
(as3_if_ne, "avm2/if_ne", 1),
(as3_equals, "avm2/equals", 1),
}
// TODO: These tests have some inaccuracies currently, so we use approx_eq to test that numeric values are close enough.

View File

@ -0,0 +1,773 @@
package {
public class Test {}
}
/// undefined, null, -5, -1, -0, 0, 1, 2, 5, "abc", "2", "true", "false", true, false, NaN
trace("//undefined == undefined");
trace(undefined == undefined);
trace("//undefined == null");
trace(undefined == null);
trace("//undefined == (-5)");
trace(undefined == (-5));
trace("//undefined == (-1)");
trace(undefined == (-1));
trace("//undefined == (-0)");
trace(undefined == (-0));
trace("//undefined == 0");
trace(undefined == 0);
trace("//undefined == 1");
trace(undefined == 1);
trace("//undefined == 2");
trace(undefined == 2);
trace("//undefined == 5");
trace(undefined == 5);
trace("//undefined == \"abc\"");
trace(undefined == "abc");
trace("//undefined == \"2\"");
trace(undefined == "2");
trace("//undefined == \"true\"");
trace(undefined == "true");
trace("//undefined == \"false\"");
trace(undefined == "false");
trace("//undefined == true");
trace(undefined == true);
trace("//undefined == false");
trace(undefined == false);
trace("//undefined == NaN");
trace(undefined == NaN);
trace("//null == undefined");
trace(null == undefined);
trace("//null == null");
trace(null == null);
trace("//null == (-5)");
trace(null == (-5));
trace("//null == (-1)");
trace(null == (-1));
trace("//null == (-0)");
trace(null == (-0));
trace("//null == 0");
trace(null == 0);
trace("//null == 1");
trace(null == 1);
trace("//null == 2");
trace(null == 2);
trace("//null == 5");
trace(null == 5);
trace("//null == \"abc\"");
trace(null == "abc");
trace("//null == \"2\"");
trace(null == "2");
trace("//null == \"true\"");
trace(null == "true");
trace("//null == \"false\"");
trace(null == "false");
trace("//null == true");
trace(null == true);
trace("//null == false");
trace(null == false);
trace("//null == NaN");
trace(null == NaN);
trace("//(-5) == undefined");
trace((-5) == undefined);
trace("//(-5) == null");
trace((-5) == null);
trace("//(-5) == (-5)");
trace((-5) == (-5));
trace("//(-5) == (-1)");
trace((-5) == (-1));
trace("//(-5) == (-0)");
trace((-5) == (-0));
trace("//(-5) == 0");
trace((-5) == 0);
trace("//(-5) == 1");
trace((-5) == 1);
trace("//(-5) == 2");
trace((-5) == 2);
trace("//(-5) == 5");
trace((-5) == 5);
trace("//(-5) == \"abc\"");
trace((-5) == "abc");
trace("//(-5) == \"2\"");
trace((-5) == "2");
trace("//(-5) == \"true\"");
trace((-5) == "true");
trace("//(-5) == \"false\"");
trace((-5) == "false");
trace("//(-5) == true");
trace((-5) == true);
trace("//(-5) == false");
trace((-5) == false);
trace("//(-5) == NaN");
trace((-5) == NaN);
trace("//(-1) == undefined");
trace((-1) == undefined);
trace("//(-1) == null");
trace((-1) == null);
trace("//(-1) == (-5)");
trace((-1) == (-5));
trace("//(-1) == (-1)");
trace((-1) == (-1));
trace("//(-1) == (-0)");
trace((-1) == (-0));
trace("//(-1) == 0");
trace((-1) == 0);
trace("//(-1) == 1");
trace((-1) == 1);
trace("//(-1) == 2");
trace((-1) == 2);
trace("//(-1) == 5");
trace((-1) == 5);
trace("//(-1) == \"abc\"");
trace((-1) == "abc");
trace("//(-1) == \"2\"");
trace((-1) == "2");
trace("//(-1) == \"true\"");
trace((-1) == "true");
trace("//(-1) == \"false\"");
trace((-1) == "false");
trace("//(-1) == true");
trace((-1) == true);
trace("//(-1) == false");
trace((-1) == false);
trace("//(-1) == NaN");
trace((-1) == NaN);
trace("//(-0) == undefined");
trace((-0) == undefined);
trace("//(-0) == null");
trace((-0) == null);
trace("//(-0) == (-5)");
trace((-0) == (-5));
trace("//(-0) == (-1)");
trace((-0) == (-1));
trace("//(-0) == (-0)");
trace((-0) == (-0));
trace("//(-0) == 0");
trace((-0) == 0);
trace("//(-0) == 1");
trace((-0) == 1);
trace("//(-0) == 2");
trace((-0) == 2);
trace("//(-0) == 5");
trace((-0) == 5);
trace("//(-0) == \"abc\"");
trace((-0) == "abc");
trace("//(-0) == \"2\"");
trace((-0) == "2");
trace("//(-0) == \"true\"");
trace((-0) == "true");
trace("//(-0) == \"false\"");
trace((-0) == "false");
trace("//(-0) == true");
trace((-0) == true);
trace("//(-0) == false");
trace((-0) == false);
trace("//(-0) == NaN");
trace((-0) == NaN);
trace("//0 == undefined");
trace(0 == undefined);
trace("//0 == null");
trace(0 == null);
trace("//0 == (-5)");
trace(0 == (-5));
trace("//0 == (-1)");
trace(0 == (-1));
trace("//0 == (-0)");
trace(0 == (-0));
trace("//0 == 0");
trace(0 == 0);
trace("//0 == 1");
trace(0 == 1);
trace("//0 == 2");
trace(0 == 2);
trace("//0 == 5");
trace(0 == 5);
trace("//0 == \"abc\"");
trace(0 == "abc");
trace("//0 == \"2\"");
trace(0 == "2");
trace("//0 == \"true\"");
trace(0 == "true");
trace("//0 == \"false\"");
trace(0 == "false");
trace("//0 == true");
trace(0 == true);
trace("//0 == false");
trace(0 == false);
trace("//0 == NaN");
trace(0 == NaN);
trace("//1 == undefined");
trace(1 == undefined);
trace("//1 == null");
trace(1 == null);
trace("//1 == (-5)");
trace(1 == (-5));
trace("//1 == (-1)");
trace(1 == (-1));
trace("//1 == (-0)");
trace(1 == (-0));
trace("//1 == 0");
trace(1 == 0);
trace("//1 == 1");
trace(1 == 1);
trace("//1 == 2");
trace(1 == 2);
trace("//1 == 5");
trace(1 == 5);
trace("//1 == \"abc\"");
trace(1 == "abc");
trace("//1 == \"2\"");
trace(1 == "2");
trace("//1 == \"true\"");
trace(1 == "true");
trace("//1 == \"false\"");
trace(1 == "false");
trace("//1 == true");
trace(1 == true);
trace("//1 == false");
trace(1 == false);
trace("//1 == NaN");
trace(1 == NaN);
trace("//2 == undefined");
trace(2 == undefined);
trace("//2 == null");
trace(2 == null);
trace("//2 == (-5)");
trace(2 == (-5));
trace("//2 == (-1)");
trace(2 == (-1));
trace("//2 == (-0)");
trace(2 == (-0));
trace("//2 == 0");
trace(2 == 0);
trace("//2 == 1");
trace(2 == 1);
trace("//2 == 2");
trace(2 == 2);
trace("//2 == 5");
trace(2 == 5);
trace("//2 == \"abc\"");
trace(2 == "abc");
trace("//2 == \"2\"");
trace(2 == "2");
trace("//2 == \"true\"");
trace(2 == "true");
trace("//2 == \"false\"");
trace(2 == "false");
trace("//2 == true");
trace(2 == true);
trace("//2 == false");
trace(2 == false);
trace("//2 == NaN");
trace(2 == NaN);
trace("//5 == undefined");
trace(5 == undefined);
trace("//5 == null");
trace(5 == null);
trace("//5 == (-5)");
trace(5 == (-5));
trace("//5 == (-1)");
trace(5 == (-1));
trace("//5 == (-0)");
trace(5 == (-0));
trace("//5 == 0");
trace(5 == 0);
trace("//5 == 1");
trace(5 == 1);
trace("//5 == 2");
trace(5 == 2);
trace("//5 == 5");
trace(5 == 5);
trace("//5 == \"abc\"");
trace(5 == "abc");
trace("//5 == \"2\"");
trace(5 == "2");
trace("//5 == \"true\"");
trace(5 == "true");
trace("//5 == \"false\"");
trace(5 == "false");
trace("//5 == true");
trace(5 == true);
trace("//5 == false");
trace(5 == false);
trace("//5 == NaN");
trace(5 == NaN);
trace("//\"abc\" == undefined");
trace("abc" == undefined);
trace("//\"abc\" == null");
trace("abc" == null);
trace("//\"abc\" == (-5)");
trace("abc" == (-5));
trace("//\"abc\" == (-1)");
trace("abc" == (-1));
trace("//\"abc\" == (-0)");
trace("abc" == (-0));
trace("//\"abc\" == 0");
trace("abc" == 0);
trace("//\"abc\" == 1");
trace("abc" == 1);
trace("//\"abc\" == 2");
trace("abc" == 2);
trace("//\"abc\" == 5");
trace("abc" == 5);
trace("//\"abc\" == \"abc\"");
trace("abc" == "abc");
trace("//\"abc\" == \"2\"");
trace("abc" == "2");
trace("//\"abc\" == \"true\"");
trace("abc" == "true");
trace("//\"abc\" == \"false\"");
trace("abc" == "false");
trace("//\"abc\" == true");
trace("abc" == true);
trace("//\"abc\" == false");
trace("abc" == false);
trace("//\"abc\" == NaN");
trace("abc" == NaN);
trace("//\"2\" == undefined");
trace("2" == undefined);
trace("//\"2\" == null");
trace("2" == null);
trace("//\"2\" == (-5)");
trace("2" == (-5));
trace("//\"2\" == (-1)");
trace("2" == (-1));
trace("//\"2\" == (-0)");
trace("2" == (-0));
trace("//\"2\" == 0");
trace("2" == 0);
trace("//\"2\" == 1");
trace("2" == 1);
trace("//\"2\" == 2");
trace("2" == 2);
trace("//\"2\" == 5");
trace("2" == 5);
trace("//\"2\" == \"abc\"");
trace("2" == "abc");
trace("//\"2\" == \"2\"");
trace("2" == "2");
trace("//\"2\" == \"true\"");
trace("2" == "true");
trace("//\"2\" == \"false\"");
trace("2" == "false");
trace("//\"2\" == true");
trace("2" == true);
trace("//\"2\" == false");
trace("2" == false);
trace("//\"2\" == NaN");
trace("2" == NaN);
trace("//\"true\" == undefined");
trace("true" == undefined);
trace("//\"true\" == null");
trace("true" == null);
trace("//\"true\" == (-5)");
trace("true" == (-5));
trace("//\"true\" == (-1)");
trace("true" == (-1));
trace("//\"true\" == (-0)");
trace("true" == (-0));
trace("//\"true\" == 0");
trace("true" == 0);
trace("//\"true\" == 1");
trace("true" == 1);
trace("//\"true\" == 2");
trace("true" == 2);
trace("//\"true\" == 5");
trace("true" == 5);
trace("//\"true\" == \"abc\"");
trace("true" == "abc");
trace("//\"true\" == \"2\"");
trace("true" == "2");
trace("//\"true\" == \"true\"");
trace("true" == "true");
trace("//\"true\" == \"false\"");
trace("true" == "false");
trace("//\"true\" == true");
trace("true" == true);
trace("//\"true\" == false");
trace("true" == false);
trace("//\"true\" == NaN");
trace("true" == NaN);
trace("//\"false\" == undefined");
trace("false" == undefined);
trace("//\"false\" == null");
trace("false" == null);
trace("//\"false\" == (-5)");
trace("false" == (-5));
trace("//\"false\" == (-1)");
trace("false" == (-1));
trace("//\"false\" == (-0)");
trace("false" == (-0));
trace("//\"false\" == 0");
trace("false" == 0);
trace("//\"false\" == 1");
trace("false" == 1);
trace("//\"false\" == 2");
trace("false" == 2);
trace("//\"false\" == 5");
trace("false" == 5);
trace("//\"false\" == \"abc\"");
trace("false" == "abc");
trace("//\"false\" == \"2\"");
trace("false" == "2");
trace("//\"false\" == \"true\"");
trace("false" == "true");
trace("//\"false\" == \"false\"");
trace("false" == "false");
trace("//\"false\" == true");
trace("false" == true);
trace("//\"false\" == false");
trace("false" == false);
trace("//\"false\" == NaN");
trace("false" == NaN);
trace("//true == undefined");
trace(true == undefined);
trace("//true == null");
trace(true == null);
trace("//true == (-5)");
trace(true == (-5));
trace("//true == (-1)");
trace(true == (-1));
trace("//true == (-0)");
trace(true == (-0));
trace("//true == 0");
trace(true == 0);
trace("//true == 1");
trace(true == 1);
trace("//true == 2");
trace(true == 2);
trace("//true == 5");
trace(true == 5);
trace("//true == \"abc\"");
trace(true == "abc");
trace("//true == \"2\"");
trace(true == "2");
trace("//true == \"true\"");
trace(true == "true");
trace("//true == \"false\"");
trace(true == "false");
trace("//true == true");
trace(true == true);
trace("//true == false");
trace(true == false);
trace("//true == NaN");
trace(true == NaN);
trace("//false == undefined");
trace(false == undefined);
trace("//false == null");
trace(false == null);
trace("//false == (-5)");
trace(false == (-5));
trace("//false == (-1)");
trace(false == (-1));
trace("//false == (-0)");
trace(false == (-0));
trace("//false == 0");
trace(false == 0);
trace("//false == 1");
trace(false == 1);
trace("//false == 2");
trace(false == 2);
trace("//false == 5");
trace(false == 5);
trace("//false == \"abc\"");
trace(false == "abc");
trace("//false == \"2\"");
trace(false == "2");
trace("//false == \"true\"");
trace(false == "true");
trace("//false == \"false\"");
trace(false == "false");
trace("//false == true");
trace(false == true);
trace("//false == false");
trace(false == false);
trace("//false == NaN");
trace(false == NaN);
trace("//NaN == undefined");
trace(NaN == undefined);
trace("//NaN == null");
trace(NaN == null);
trace("//NaN == (-5)");
trace(NaN == (-5));
trace("//NaN == (-1)");
trace(NaN == (-1));
trace("//NaN == (-0)");
trace(NaN == (-0));
trace("//NaN == 0");
trace(NaN == 0);
trace("//NaN == 1");
trace(NaN == 1);
trace("//NaN == 2");
trace(NaN == 2);
trace("//NaN == 5");
trace(NaN == 5);
trace("//NaN == \"abc\"");
trace(NaN == "abc");
trace("//NaN == \"2\"");
trace(NaN == "2");
trace("//NaN == \"true\"");
trace(NaN == "true");
trace("//NaN == \"false\"");
trace(NaN == "false");
trace("//NaN == true");
trace(NaN == true);
trace("//NaN == false");
trace(NaN == false);
trace("//NaN == NaN");
trace(NaN == NaN);

View File

@ -0,0 +1,512 @@
//undefined == undefined
true
//undefined == null
true
//undefined == (-5)
false
//undefined == (-1)
false
//undefined == (-0)
false
//undefined == 0
false
//undefined == 1
false
//undefined == 2
false
//undefined == 5
false
//undefined == "abc"
false
//undefined == "2"
false
//undefined == "true"
false
//undefined == "false"
false
//undefined == true
false
//undefined == false
false
//undefined == NaN
false
//null == undefined
true
//null == null
true
//null == (-5)
false
//null == (-1)
false
//null == (-0)
false
//null == 0
false
//null == 1
false
//null == 2
false
//null == 5
false
//null == "abc"
false
//null == "2"
false
//null == "true"
false
//null == "false"
false
//null == true
false
//null == false
false
//null == NaN
false
//(-5) == undefined
false
//(-5) == null
false
//(-5) == (-5)
true
//(-5) == (-1)
false
//(-5) == (-0)
false
//(-5) == 0
false
//(-5) == 1
false
//(-5) == 2
false
//(-5) == 5
false
//(-5) == "abc"
false
//(-5) == "2"
false
//(-5) == "true"
false
//(-5) == "false"
false
//(-5) == true
false
//(-5) == false
false
//(-5) == NaN
false
//(-1) == undefined
false
//(-1) == null
false
//(-1) == (-5)
false
//(-1) == (-1)
true
//(-1) == (-0)
false
//(-1) == 0
false
//(-1) == 1
false
//(-1) == 2
false
//(-1) == 5
false
//(-1) == "abc"
false
//(-1) == "2"
false
//(-1) == "true"
false
//(-1) == "false"
false
//(-1) == true
false
//(-1) == false
false
//(-1) == NaN
false
//(-0) == undefined
false
//(-0) == null
false
//(-0) == (-5)
false
//(-0) == (-1)
false
//(-0) == (-0)
true
//(-0) == 0
true
//(-0) == 1
false
//(-0) == 2
false
//(-0) == 5
false
//(-0) == "abc"
false
//(-0) == "2"
false
//(-0) == "true"
false
//(-0) == "false"
false
//(-0) == true
false
//(-0) == false
true
//(-0) == NaN
false
//0 == undefined
false
//0 == null
false
//0 == (-5)
false
//0 == (-1)
false
//0 == (-0)
true
//0 == 0
true
//0 == 1
false
//0 == 2
false
//0 == 5
false
//0 == "abc"
false
//0 == "2"
false
//0 == "true"
false
//0 == "false"
false
//0 == true
false
//0 == false
true
//0 == NaN
false
//1 == undefined
false
//1 == null
false
//1 == (-5)
false
//1 == (-1)
false
//1 == (-0)
false
//1 == 0
false
//1 == 1
true
//1 == 2
false
//1 == 5
false
//1 == "abc"
false
//1 == "2"
false
//1 == "true"
false
//1 == "false"
false
//1 == true
true
//1 == false
false
//1 == NaN
false
//2 == undefined
false
//2 == null
false
//2 == (-5)
false
//2 == (-1)
false
//2 == (-0)
false
//2 == 0
false
//2 == 1
false
//2 == 2
true
//2 == 5
false
//2 == "abc"
false
//2 == "2"
true
//2 == "true"
false
//2 == "false"
false
//2 == true
false
//2 == false
false
//2 == NaN
false
//5 == undefined
false
//5 == null
false
//5 == (-5)
false
//5 == (-1)
false
//5 == (-0)
false
//5 == 0
false
//5 == 1
false
//5 == 2
false
//5 == 5
true
//5 == "abc"
false
//5 == "2"
false
//5 == "true"
false
//5 == "false"
false
//5 == true
false
//5 == false
false
//5 == NaN
false
//"abc" == undefined
false
//"abc" == null
false
//"abc" == (-5)
false
//"abc" == (-1)
false
//"abc" == (-0)
false
//"abc" == 0
false
//"abc" == 1
false
//"abc" == 2
false
//"abc" == 5
false
//"abc" == "abc"
true
//"abc" == "2"
false
//"abc" == "true"
false
//"abc" == "false"
false
//"abc" == true
false
//"abc" == false
false
//"abc" == NaN
false
//"2" == undefined
false
//"2" == null
false
//"2" == (-5)
false
//"2" == (-1)
false
//"2" == (-0)
false
//"2" == 0
false
//"2" == 1
false
//"2" == 2
true
//"2" == 5
false
//"2" == "abc"
false
//"2" == "2"
true
//"2" == "true"
false
//"2" == "false"
false
//"2" == true
false
//"2" == false
false
//"2" == NaN
false
//"true" == undefined
false
//"true" == null
false
//"true" == (-5)
false
//"true" == (-1)
false
//"true" == (-0)
false
//"true" == 0
false
//"true" == 1
false
//"true" == 2
false
//"true" == 5
false
//"true" == "abc"
false
//"true" == "2"
false
//"true" == "true"
true
//"true" == "false"
false
//"true" == true
false
//"true" == false
false
//"true" == NaN
false
//"false" == undefined
false
//"false" == null
false
//"false" == (-5)
false
//"false" == (-1)
false
//"false" == (-0)
false
//"false" == 0
false
//"false" == 1
false
//"false" == 2
false
//"false" == 5
false
//"false" == "abc"
false
//"false" == "2"
false
//"false" == "true"
false
//"false" == "false"
true
//"false" == true
false
//"false" == false
false
//"false" == NaN
false
//true == undefined
false
//true == null
false
//true == (-5)
false
//true == (-1)
false
//true == (-0)
false
//true == 0
false
//true == 1
true
//true == 2
false
//true == 5
false
//true == "abc"
false
//true == "2"
false
//true == "true"
false
//true == "false"
false
//true == true
true
//true == false
false
//true == NaN
false
//false == undefined
false
//false == null
false
//false == (-5)
false
//false == (-1)
false
//false == (-0)
true
//false == 0
true
//false == 1
false
//false == 2
false
//false == 5
false
//false == "abc"
false
//false == "2"
false
//false == "true"
false
//false == "false"
false
//false == true
false
//false == false
true
//false == NaN
false
//NaN == undefined
false
//NaN == null
false
//NaN == (-5)
false
//NaN == (-1)
false
//NaN == (-0)
false
//NaN == 0
false
//NaN == 1
false
//NaN == 2
false
//NaN == 5
false
//NaN == "abc"
false
//NaN == "2"
false
//NaN == "true"
false
//NaN == "false"
false
//NaN == true
false
//NaN == false
false
//NaN == NaN
false

Binary file not shown.

Binary file not shown.