Skip to content

Commit 080dc75

Browse files
authored
Add some jsvalue test (#389)
1 parent 76eeeca commit 080dc75

File tree

1 file changed

+148
-0
lines changed

1 file changed

+148
-0
lines changed

rust-mozjs/tests/jsvalue.rs

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
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+
use std::ptr;
6+
7+
use mozjs::jsapi::{JSAutoRealm, JSObject, JS_NewGlobalObject, OnNewGlobalHookOption, Type};
8+
use mozjs::jsval::{
9+
BigIntValue, BooleanValue, DoubleValue, Int32Value, NullValue, ObjectValue, StringValue,
10+
UndefinedValue,
11+
};
12+
use mozjs::rooted;
13+
use mozjs::rust::{
14+
HandleObject, JSEngine, RealmOptions, RootedGuard, Runtime, SIMPLE_GLOBAL_CLASS,
15+
};
16+
use mozjs_sys::jsval::JSVal;
17+
18+
unsafe fn tester<F: Fn(RootedGuard<JSVal>)>(
19+
rt: &Runtime,
20+
global: HandleObject,
21+
// js to be executed that needs to return jsval
22+
js: &str,
23+
// rust constructed jsval
24+
rust: JSVal,
25+
test: F,
26+
) {
27+
let cx = rt.cx();
28+
rooted!(in(cx) let mut rval = UndefinedValue());
29+
assert!(rt
30+
.evaluate_script(global, js, "test", 1, rval.handle_mut())
31+
.is_ok());
32+
test(rval);
33+
34+
rooted!(in(cx) let mut val = rust);
35+
test(val);
36+
}
37+
38+
#[test]
39+
fn jsvalues() {
40+
let engine = JSEngine::init().unwrap();
41+
let runtime = Runtime::new(engine.handle());
42+
let context = runtime.cx();
43+
let h_option = OnNewGlobalHookOption::FireOnNewGlobalHook;
44+
let c_option = RealmOptions::default();
45+
46+
unsafe {
47+
rooted!(in(context) let global = JS_NewGlobalObject(
48+
context,
49+
&SIMPLE_GLOBAL_CLASS,
50+
ptr::null_mut(),
51+
h_option,
52+
&*c_option,
53+
));
54+
55+
tester(
56+
&runtime,
57+
global.handle(),
58+
"undefined",
59+
UndefinedValue(),
60+
|val| {
61+
assert!(val.is_undefined());
62+
assert!(val.is_primitive());
63+
},
64+
);
65+
66+
tester(&runtime, global.handle(), "null", NullValue(), |val| {
67+
assert!(val.is_null());
68+
assert!(val.is_null_or_undefined());
69+
assert!(val.is_object_or_null());
70+
71+
assert!(val.to_object_or_null().is_null())
72+
});
73+
74+
tester(
75+
&runtime,
76+
global.handle(),
77+
"true",
78+
BooleanValue(true),
79+
|val| {
80+
assert!(val.is_boolean());
81+
assert!(val.is_primitive());
82+
83+
assert!(val.to_boolean());
84+
},
85+
);
86+
87+
tester(
88+
&runtime,
89+
global.handle(),
90+
"false",
91+
BooleanValue(false),
92+
|val| {
93+
assert!(val.is_boolean());
94+
assert!(val.is_primitive());
95+
96+
assert!(!val.to_boolean());
97+
},
98+
);
99+
100+
tester(&runtime, global.handle(), "42", Int32Value(42), |val| {
101+
assert!(val.is_int32());
102+
assert!(val.is_primitive());
103+
assert!(val.is_number());
104+
105+
assert_eq!(val.to_int32(), 42);
106+
assert_eq!(val.to_number(), 42.0);
107+
});
108+
109+
tester(&runtime, global.handle(), "-42", Int32Value(-42), |val| {
110+
assert!(val.is_int32());
111+
assert!(val.is_primitive());
112+
assert!(val.is_number());
113+
114+
assert_eq!(val.to_int32(), -42);
115+
assert_eq!(val.to_number(), -42.0);
116+
});
117+
118+
tester(
119+
&runtime,
120+
global.handle(),
121+
"42.5",
122+
DoubleValue(42.5),
123+
|val| {
124+
assert!(val.is_double());
125+
assert!(val.is_primitive());
126+
assert!(val.is_number());
127+
128+
assert_eq!(val.to_double(), 42.5);
129+
assert_eq!(val.to_number(), 42.5);
130+
},
131+
);
132+
133+
tester(
134+
&runtime,
135+
global.handle(),
136+
"-42.5",
137+
DoubleValue(-42.5),
138+
|val| {
139+
assert!(val.is_double());
140+
assert!(val.is_primitive());
141+
assert!(val.is_number());
142+
143+
assert_eq!(val.to_double(), -42.5);
144+
assert_eq!(val.to_number(), -42.5);
145+
},
146+
);
147+
}
148+
}

0 commit comments

Comments
 (0)