1 : #include "tests.h"
2 : #include <limits>
3 : #include <math.h>
4 :
5 : using namespace std;
6 :
7 : struct LooseEqualityFixture : public JSAPITest
8 9 : {
9 : jsval qNaN;
10 : jsval sNaN;
11 : jsval d42;
12 : jsval i42;
13 : jsval undef;
14 : jsval null;
15 : jsval obj;
16 : jsval poszero;
17 : jsval negzero;
18 :
19 9 : virtual ~LooseEqualityFixture() {}
20 :
21 9 : virtual bool init() {
22 9 : if (!JSAPITest::init())
23 0 : return false;
24 9 : qNaN = DOUBLE_TO_JSVAL(numeric_limits<double>::quiet_NaN());
25 9 : sNaN = DOUBLE_TO_JSVAL(numeric_limits<double>::signaling_NaN());
26 9 : d42 = DOUBLE_TO_JSVAL(42.0);
27 9 : i42 = INT_TO_JSVAL(42);
28 9 : undef = JSVAL_VOID;
29 9 : null = JSVAL_NULL;
30 9 : obj = OBJECT_TO_JSVAL(global);
31 9 : poszero = DOUBLE_TO_JSVAL(0.0);
32 9 : negzero = DOUBLE_TO_JSVAL(-0.0);
33 : #ifdef XP_WIN
34 : # define copysign _copysign
35 : #endif
36 9 : JS_ASSERT(copysign(1.0, JSVAL_TO_DOUBLE(poszero)) == 1.0);
37 9 : JS_ASSERT(copysign(1.0, JSVAL_TO_DOUBLE(negzero)) == -1.0);
38 : #ifdef XP_WIN
39 : # undef copysign
40 : #endif
41 9 : return true;
42 : }
43 :
44 10 : bool leq(jsval x, jsval y) {
45 : JSBool equal;
46 10 : CHECK(JS_LooselyEqual(cx, x, y, &equal) && equal);
47 10 : CHECK(JS_LooselyEqual(cx, y, x, &equal) && equal);
48 10 : return true;
49 : }
50 :
51 28 : bool nleq(jsval x, jsval y) {
52 : JSBool equal;
53 28 : CHECK(JS_LooselyEqual(cx, x, y, &equal) && !equal);
54 28 : CHECK(JS_LooselyEqual(cx, y, x, &equal) && !equal);
55 28 : return true;
56 : }
57 : };
58 :
59 : // 11.9.3 1a
60 4 : BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_undef_leq_undef)
61 : {
62 1 : CHECK(leq(JSVAL_VOID, JSVAL_VOID));
63 1 : return true;
64 : }
65 1 : END_FIXTURE_TEST(LooseEqualityFixture, test_undef_leq_undef)
66 :
67 : // 11.9.3 1b
68 4 : BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_null_leq_null)
69 : {
70 1 : CHECK(leq(JSVAL_NULL, JSVAL_NULL));
71 1 : return true;
72 : }
73 1 : END_FIXTURE_TEST(LooseEqualityFixture, test_null_leq_null)
74 :
75 : // 11.9.3 1ci
76 4 : BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_nan_nleq_all)
77 : {
78 1 : CHECK(nleq(qNaN, qNaN));
79 1 : CHECK(nleq(qNaN, sNaN));
80 :
81 1 : CHECK(nleq(sNaN, sNaN));
82 1 : CHECK(nleq(sNaN, qNaN));
83 :
84 1 : CHECK(nleq(qNaN, d42));
85 1 : CHECK(nleq(qNaN, i42));
86 1 : CHECK(nleq(qNaN, undef));
87 1 : CHECK(nleq(qNaN, null));
88 1 : CHECK(nleq(qNaN, obj));
89 :
90 1 : CHECK(nleq(sNaN, d42));
91 1 : CHECK(nleq(sNaN, i42));
92 1 : CHECK(nleq(sNaN, undef));
93 1 : CHECK(nleq(sNaN, null));
94 1 : CHECK(nleq(sNaN, obj));
95 1 : return true;
96 : }
97 1 : END_FIXTURE_TEST(LooseEqualityFixture, test_nan_nleq_all)
98 :
99 : // 11.9.3 1cii
100 4 : BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_all_nleq_nan)
101 : {
102 1 : CHECK(nleq(qNaN, qNaN));
103 1 : CHECK(nleq(qNaN, sNaN));
104 :
105 1 : CHECK(nleq(sNaN, sNaN));
106 1 : CHECK(nleq(sNaN, qNaN));
107 :
108 1 : CHECK(nleq(d42, qNaN));
109 1 : CHECK(nleq(i42, qNaN));
110 1 : CHECK(nleq(undef, qNaN));
111 1 : CHECK(nleq(null, qNaN));
112 1 : CHECK(nleq(obj, qNaN));
113 :
114 1 : CHECK(nleq(d42, sNaN));
115 1 : CHECK(nleq(i42, sNaN));
116 1 : CHECK(nleq(undef, sNaN));
117 1 : CHECK(nleq(null, sNaN));
118 1 : CHECK(nleq(obj, sNaN));
119 1 : return true;
120 : }
121 1 : END_FIXTURE_TEST(LooseEqualityFixture, test_all_nleq_nan)
122 :
123 : // 11.9.3 1ciii
124 4 : BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_leq_same_nums)
125 : {
126 1 : CHECK(leq(d42, d42));
127 1 : CHECK(leq(i42, i42));
128 1 : CHECK(leq(d42, i42));
129 1 : CHECK(leq(i42, d42));
130 1 : return true;
131 : }
132 1 : END_FIXTURE_TEST(LooseEqualityFixture, test_leq_same_nums)
133 :
134 : // 11.9.3 1civ
135 4 : BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_pz_leq_nz)
136 : {
137 1 : CHECK(leq(poszero, negzero));
138 1 : return true;
139 : }
140 1 : END_FIXTURE_TEST(LooseEqualityFixture, test_pz_leq_nz)
141 :
142 : // 11.9.3 1cv
143 4 : BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_nz_leq_pz)
144 : {
145 1 : CHECK(leq(negzero, poszero));
146 1 : return true;
147 : }
148 1 : END_FIXTURE_TEST(LooseEqualityFixture, test_nz_leq_pz)
149 :
150 : // 1cvi onwards NOT TESTED
151 :
152 : // 11.9.3 2
153 4 : BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_null_leq_undef)
154 : {
155 1 : CHECK(leq(null, undef));
156 1 : return true;
157 : }
158 1 : END_FIXTURE_TEST(LooseEqualityFixture, test_null_leq_undef)
159 :
160 : // 11.9.3 3
161 4 : BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_undef_leq_null)
162 : {
163 1 : CHECK(leq(undef, null));
164 1 : return true;
165 : }
166 3 : END_FIXTURE_TEST(LooseEqualityFixture, test_undef_leq_null)
167 :
168 : // 4 onwards NOT TESTED
|