@@ -11,32 +11,92 @@ import 'dart:typed_data';
1111
1212import 'package:expect/expect.dart' ;
1313
14- void testEqual () {
15- final a = Int32x4 (1 , 2 , 3 , 4 );
14+ // Int32 min and max.
15+ const _min = - 2147483648 ;
16+ const _max = 2147483647 ;
17+
18+ /// Tests Int32x4 equality comparisons.
19+ ///
20+ /// If [testingEqual] is true, tests [Int32x4.equal] .
21+ /// If [testingEqual] is false, tests [Int32x4.notEqual] .
22+ void testEquality (bool testingEqual) {
23+ Int32x4 compare (Int32x4 a, Int32x4 b) =>
24+ testingEqual ? a.equal (b) : a.notEqual (b);
25+
26+ // Checks that:
27+ // - compare produces the expected mask
28+ // - compare is symmetric
29+ // - each operand is reflexive (equals itself in every lane)
30+ // - equal and notEqual are inverses, i.e. never equal to each other
31+ void check (Int32x4 a, Int32x4 b) {
32+ void expectSameLanes (Int32x4 expected, Int32x4 actual) {
33+ Expect .equals (expected.x, actual.x);
34+ Expect .equals (expected.y, actual.y);
35+ Expect .equals (expected.z, actual.z);
36+ Expect .equals (expected.w, actual.w);
37+ }
38+
39+ // -1 where the operator is true for the lane, else 0.
40+ int compareLane (int a, int b) => (a == b) == testingEqual ? - 1 : 0 ;
41+ final r = compare (a, b);
42+ Expect .equals (compareLane (a.x, b.x), r.x);
43+ Expect .equals (compareLane (a.y, b.y), r.y);
44+ Expect .equals (compareLane (a.z, b.z), r.z);
45+ Expect .equals (compareLane (a.w, b.w), r.w);
46+ var sign = 0 ;
47+ if (r.x == - 1 ) sign | = 1 ;
48+ if (r.y == - 1 ) sign | = 2 ;
49+ if (r.z == - 1 ) sign | = 4 ;
50+ if (r.w == - 1 ) sign | = 8 ;
51+ Expect .equals (sign, r.signMask);
52+
53+ // Symmetry: swapping the operands gives the same mask.
54+ expectSameLanes (r, compare (b, a));
55+
56+ // Reflexivity: each operand compares equal to itself in every lane.
57+ void reflexive (Int32x4 v) {
58+ final selfMask = compare (v, v);
59+ final expected = testingEqual ? - 1 : 0 ;
60+ Expect .equals (expected, selfMask.x);
61+ Expect .equals (expected, selfMask.y);
62+ Expect .equals (expected, selfMask.z);
63+ Expect .equals (expected, selfMask.w);
64+ }
65+
66+ reflexive (a);
67+ reflexive (b);
68+
69+ // equal and notEqual are inverses: ~ turns one into the other, and they
70+ // disagree in every lane (eq.notEqual(neq) all true, eq.equal(neq) all
71+ // false).
72+ final eq = a.equal (b);
73+ final neq = a.notEqual (b);
74+ expectSameLanes (neq, ~ eq);
75+ expectSameLanes (eq, ~ neq);
76+ final eqNeq = eq.notEqual (neq);
77+ Expect .equals (- 1 , eqNeq.x);
78+ Expect .equals (- 1 , eqNeq.y);
79+ Expect .equals (- 1 , eqNeq.z);
80+ Expect .equals (- 1 , eqNeq.w);
81+ final eqEq = eq.equal (neq);
82+ Expect .equals (0 , eqEq.x);
83+ Expect .equals (0 , eqEq.y);
84+ Expect .equals (0 , eqEq.z);
85+ Expect .equals (0 , eqEq.w);
86+ }
1687
17- // All lanes equal -> every lane is -1.
18- final all = a.equal (Int32x4 (1 , 2 , 3 , 4 ));
19- Expect .equals (- 1 , all.x);
20- Expect .equals (- 1 , all.y);
21- Expect .equals (- 1 , all.z);
22- Expect .equals (- 1 , all.w);
23- Expect .equals (0xf , all.signMask);
24-
25- // No lanes equal -> every lane is 0.
26- final none = a.equal (Int32x4 (5 , 6 , 7 , 8 ));
27- Expect .equals (0 , none.x);
28- Expect .equals (0 , none.y);
29- Expect .equals (0 , none.z);
30- Expect .equals (0 , none.w);
31- Expect .equals (0x0 , none.signMask);
32-
33- // Per-lane result: only y and w match.
34- final some = a.equal (Int32x4 (0 , 2 , 0 , 4 ));
35- Expect .equals (0 , some.x);
36- Expect .equals (- 1 , some.y);
37- Expect .equals (0 , some.z);
38- Expect .equals (- 1 , some.w);
39- Expect .equals (0xa , some.signMask); // bits 1 and 3.
88+ // All lanes equal.
89+ check (Int32x4 (1 , 2 , 3 , 4 ), Int32x4 (1 , 2 , 3 , 4 ));
90+ check (Int32x4 (- 3 , - 2 , - 1 , 0 ), Int32x4 (- 3 , - 2 , - 1 , 0 ));
91+ check (Int32x4 (_min, _max, 0 , - 1 ), Int32x4 (_min, _max, 0 , - 1 ));
92+ // No lanes equal.
93+ check (Int32x4 (1 , 2 , 3 , 4 ), Int32x4 (5 , 6 , 7 , 8 ));
94+ check (Int32x4 (- 3 , - 2 , - 1 , 0 ), Int32x4 (- 7 , - 6 , - 5 , - 4 ));
95+ check (Int32x4 (_min, _max, 0 , - 1 ), Int32x4 (_max, _min, - 1 , 0 ));
96+ // Only y and w match.
97+ check (Int32x4 (1 , 2 , 3 , 4 ), Int32x4 (0 , 2 , 0 , 4 ));
98+ check (Int32x4 (- 3 , - 2 , - 1 , 0 ), Int32x4 (0 , - 2 , 0 , 0 ));
99+ check (Int32x4 (_min, 2 , _max, 4 ), Int32x4 (0 , 2 , 0 , 4 ));
40100}
41101
42102void testAnyTrue () {
@@ -75,7 +135,8 @@ void testAnyTrue() {
75135
76136void main () {
77137 for (int i = 0 ; i < 20 ; i++ ) {
78- testEqual ();
138+ testEquality (true ); // equal
139+ testEquality (false ); // notEqual
79140 testAnyTrue ();
80141 }
81142}
0 commit comments