|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 #include "jsapi-tests/tests.h" |
|
6 |
|
7 static const JSClass ObjectEmulatingUndefinedClass = { |
|
8 "ObjectEmulatingUndefined", |
|
9 JSCLASS_EMULATES_UNDEFINED, |
|
10 JS_PropertyStub, |
|
11 JS_DeletePropertyStub, |
|
12 JS_PropertyStub, |
|
13 JS_StrictPropertyStub, |
|
14 JS_EnumerateStub, |
|
15 JS_ResolveStub, |
|
16 JS_ConvertStub |
|
17 }; |
|
18 |
|
19 static bool |
|
20 ObjectEmulatingUndefinedConstructor(JSContext *cx, unsigned argc, jsval *vp) |
|
21 { |
|
22 JS::CallArgs args = JS::CallArgsFromVp(argc, vp); |
|
23 JSObject *obj = JS_NewObjectForConstructor(cx, &ObjectEmulatingUndefinedClass, args); |
|
24 if (!obj) |
|
25 return false; |
|
26 args.rval().setObject(*obj); |
|
27 return true; |
|
28 } |
|
29 |
|
30 BEGIN_TEST(testObjectEmulatingUndefined_truthy) |
|
31 { |
|
32 CHECK(JS_InitClass(cx, global, js::NullPtr(), &ObjectEmulatingUndefinedClass, |
|
33 ObjectEmulatingUndefinedConstructor, 0, |
|
34 nullptr, nullptr, nullptr, nullptr)); |
|
35 |
|
36 JS::RootedValue result(cx); |
|
37 |
|
38 EVAL("if (new ObjectEmulatingUndefined()) true; else false;", &result); |
|
39 CHECK_SAME(result, JSVAL_FALSE); |
|
40 |
|
41 EVAL("if (!new ObjectEmulatingUndefined()) true; else false;", &result); |
|
42 CHECK_SAME(result, JSVAL_TRUE); |
|
43 |
|
44 EVAL("var obj = new ObjectEmulatingUndefined(); \n" |
|
45 "var res = []; \n" |
|
46 "for (var i = 0; i < 50; i++) \n" |
|
47 " res.push(Boolean(obj)); \n" |
|
48 "res.every(function(v) { return v === false; });", |
|
49 &result); |
|
50 CHECK_SAME(result, JSVAL_TRUE); |
|
51 |
|
52 return true; |
|
53 } |
|
54 END_TEST(testObjectEmulatingUndefined_truthy) |
|
55 |
|
56 BEGIN_TEST(testObjectEmulatingUndefined_equal) |
|
57 { |
|
58 CHECK(JS_InitClass(cx, global, js::NullPtr(), &ObjectEmulatingUndefinedClass, |
|
59 ObjectEmulatingUndefinedConstructor, 0, |
|
60 nullptr, nullptr, nullptr, nullptr)); |
|
61 |
|
62 JS::RootedValue result(cx); |
|
63 |
|
64 EVAL("if (new ObjectEmulatingUndefined() == undefined) true; else false;", &result); |
|
65 CHECK_SAME(result, JSVAL_TRUE); |
|
66 |
|
67 EVAL("if (new ObjectEmulatingUndefined() == null) true; else false;", &result); |
|
68 CHECK_SAME(result, JSVAL_TRUE); |
|
69 |
|
70 EVAL("if (new ObjectEmulatingUndefined() != undefined) true; else false;", &result); |
|
71 CHECK_SAME(result, JSVAL_FALSE); |
|
72 |
|
73 EVAL("if (new ObjectEmulatingUndefined() != null) true; else false;", &result); |
|
74 CHECK_SAME(result, JSVAL_FALSE); |
|
75 |
|
76 EVAL("var obj = new ObjectEmulatingUndefined(); \n" |
|
77 "var res = []; \n" |
|
78 "for (var i = 0; i < 50; i++) \n" |
|
79 " res.push(obj == undefined); \n" |
|
80 "res.every(function(v) { return v === true; });", |
|
81 &result); |
|
82 CHECK_SAME(result, JSVAL_TRUE); |
|
83 |
|
84 EVAL("var obj = new ObjectEmulatingUndefined(); \n" |
|
85 "var res = []; \n" |
|
86 "for (var i = 0; i < 50; i++) \n" |
|
87 " res.push(obj == null); \n" |
|
88 "res.every(function(v) { return v === true; });", |
|
89 &result); |
|
90 CHECK_SAME(result, JSVAL_TRUE); |
|
91 |
|
92 EVAL("var obj = new ObjectEmulatingUndefined(); \n" |
|
93 "var res = []; \n" |
|
94 "for (var i = 0; i < 50; i++) \n" |
|
95 " res.push(obj != undefined); \n" |
|
96 "res.every(function(v) { return v === false; });", |
|
97 &result); |
|
98 CHECK_SAME(result, JSVAL_TRUE); |
|
99 |
|
100 EVAL("var obj = new ObjectEmulatingUndefined(); \n" |
|
101 "var res = []; \n" |
|
102 "for (var i = 0; i < 50; i++) \n" |
|
103 " res.push(obj != null); \n" |
|
104 "res.every(function(v) { return v === false; });", |
|
105 &result); |
|
106 CHECK_SAME(result, JSVAL_TRUE); |
|
107 |
|
108 return true; |
|
109 } |
|
110 END_TEST(testObjectEmulatingUndefined_equal) |