]>
git.proxmox.com Git - rustc.git/blob - vendor/js-sys/tests/wasm/Array.rs
2 use std
::iter
::FromIterator
;
3 use wasm_bindgen
::prelude
::*;
4 use wasm_bindgen
::JsCast
;
5 use wasm_bindgen
::JsValue
;
6 use wasm_bindgen_test
::*;
8 macro_rules
! js_array
{
10 let __x
= Array
::new();
11 $
(__x
.push(&JsValue
::from($e
));)*
18 let mut __x
= Vec
::new();
19 $
(__x
.push(JsValue
::from($e
));)*
24 fn to_rust(arr
: &Array
) -> Vec
<JsValue
> {
25 let mut result
= Vec
::with_capacity(arr
.length() as usize);
26 arr
.for_each(&mut |x
, _
, _
| result
.push(x
));
34 &vec
![JsValue
::from("a"), JsValue
::from("b"), JsValue
::from("c"),]
43 &vec
![JsValue
::from("a"), JsValue
::from("b"), JsValue
::from("c"),]
50 let array
= js_array
![1u32, 2u32, 3u32];
53 to_rust(&vec
![array
.clone(),].into_iter().collect()),
54 vec
![JsValue
::from(array
.clone())],
58 to_rust(&vec
![array
.clone(),].iter().collect()),
59 vec
![JsValue
::from(array
)],
63 to_rust(&vec
![5, 10, 20,].into_iter().map(JsValue
::from
).collect()),
68 to_rust(&Array
::from_iter(&[
76 let v
= vec
!["a", "b", "c"];
79 to_rust(&Array
::from_iter(v
.into_iter().map(|s
| JsValue
::from(s
)))),
86 let mut array
= array
!["a", "b"];
87 array
.extend(vec
![JsValue
::from("c"), JsValue
::from("d")]);
88 assert_eq
!(array
, array
!["a", "b", "c", "d"]);
93 let array
= vec
![JsValue
::from("a"), JsValue
::from("b"), JsValue
::from("c")]
95 .collect
::<js_sys
::Array
>();
99 vec
![JsValue
::from("a"), JsValue
::from("b"), JsValue
::from("c")]
105 let array
= vec
![JsValue
::from("a"), JsValue
::from("b"), JsValue
::from("c")]
107 .collect
::<js_sys
::Array
>();
110 array
.iter().collect
::<Vec
<JsValue
>>(),
111 vec
![JsValue
::from("a"), JsValue
::from("b"), JsValue
::from("c")]
114 let mut iter
= array
.iter();
116 assert_eq
!(iter
.size_hint(), (3, Some(3)));
117 assert_eq
!(iter
.next(), Some(JsValue
::from("a")));
119 assert_eq
!(iter
.size_hint(), (2, Some(2)));
120 assert_eq
!(iter
.next_back(), Some(JsValue
::from("c")));
122 assert_eq
!(iter
.size_hint(), (1, Some(1)));
123 assert_eq
!(iter
.next_back(), Some(JsValue
::from("b")));
125 assert_eq
!(iter
.size_hint(), (0, Some(0)));
126 assert_eq
!(iter
.next(), None
);
128 assert_eq
!(iter
.size_hint(), (0, Some(0)));
129 assert_eq
!(iter
.next_back(), None
);
131 let mut iter
= array
.iter();
133 assert_eq
!(iter
.size_hint(), (3, Some(3)));
134 assert_eq
!(iter
.next(), Some(JsValue
::from("a")));
136 assert_eq
!(iter
.size_hint(), (2, Some(2)));
137 assert_eq
!(iter
.next(), Some(JsValue
::from("b")));
139 assert_eq
!(iter
.size_hint(), (1, Some(1)));
140 assert_eq
!(iter
.next(), Some(JsValue
::from("c")));
142 assert_eq
!(iter
.size_hint(), (0, Some(0)));
143 assert_eq
!(iter
.next(), None
);
145 let mut iter
= array
.iter();
147 assert_eq
!(iter
.size_hint(), (3, Some(3)));
148 assert_eq
!(iter
.next_back(), Some(JsValue
::from("c")));
150 assert_eq
!(iter
.size_hint(), (2, Some(2)));
151 assert_eq
!(iter
.next_back(), Some(JsValue
::from("b")));
153 assert_eq
!(iter
.size_hint(), (1, Some(1)));
154 assert_eq
!(iter
.next_back(), Some(JsValue
::from("a")));
156 assert_eq
!(iter
.size_hint(), (0, Some(0)));
157 assert_eq
!(iter
.next_back(), None
);
161 fn new_with_length() {
162 let array
= Array
::new_with_length(5);
163 assert_eq
!(array
.length(), 5);
164 assert_eq
!(array
.get(4), JsValue
::undefined());
165 array
.set(4, JsValue
::from("a"));
166 assert_eq
!(array
.get(4), "a");
167 assert_eq
!(array
.length(), 5);
172 let array
= js_array
!["a", "c", "x", "n"];
173 assert_eq
!(array
.length(), 4);
174 assert_eq
!(array
.get(0), "a");
175 assert_eq
!(array
.get(3), "n");
176 assert_eq
!(array
.get(4), JsValue
::undefined());
181 let array
= js_array
!["a", "c", "x", "n"];
182 assert_eq
!(array
.length(), 4);
183 assert_eq
!(array
.get(0), "a");
184 array
.set(0, JsValue
::from("b"));
185 assert_eq
!(array
.get(0), "b");
187 assert_eq
!(array
.get(4), JsValue
::undefined());
188 assert_eq
!(array
.length(), 4);
189 array
.set(4, JsValue
::from("d"));
190 assert_eq
!(array
.length(), 5);
191 assert_eq
!(array
.get(4), "d");
193 assert_eq
!(array
.get(10), JsValue
::undefined());
194 assert_eq
!(array
.length(), 5);
195 array
.set(10, JsValue
::from("z"));
196 assert_eq
!(array
.length(), 11);
197 assert_eq
!(array
.get(10), "z");
198 assert_eq
!(array
.get(9), JsValue
::undefined());
203 let array
= js_array
!["a", "c", "x", "n"];
204 assert_eq
!(array
.length(), 4);
205 assert_eq
!(array
.get(0), "a");
207 assert_eq
!(array
.get(0), JsValue
::undefined());
212 let array
= js_array
!["a", "c", "x", "n"];
213 assert
!(array
.filter(&mut |x
, _
, _
| x
.as_f64().is_some()).length() == 0);
215 let array
= js_array
![1, 2, 3, 4];
217 array
.filter(&mut |x
, _
, _
| x
.as_f64().is_some()).length(),
221 let array
= js_array
!["a", 1, "b", 2];
223 array
.filter(&mut |x
, _
, _
| x
.as_f64().is_some()).length(),
230 let array
= js_array
![
231 js_array
!["a", "b", "c"],
233 js_array
!["e", js_array
!["f", "g"]]
237 to_rust(&array
.flat(1).slice(0, 5)),
238 vec
!["a", "b", "c", "d", "e"]
241 assert_eq
!(array
.flat(1).length(), 6);
244 to_rust(&array
.flat(2)),
245 vec
!["a", "b", "c", "d", "e", "f", "g"]
251 let array
= js_array
![1, 2, 3, 1];
255 &array
.flat_map(&mut |val
, _
, _
| match val
.as_f64().map(|v
| v
as i32) {
256 Some(1) => vec
![JsString
::from("x").into(), JsString
::from("x").into()],
258 Some(3) => vec
![JsString
::from("z").into()],
259 _
=> panic
!("Unexpected conversion"),
262 vec
!["x", "x", "z", "x", "x"]
268 let chars
= js_array
!["a", "c", "x", "n"];
269 assert_eq
!(chars
.index_of(&"x".into(), 0), 2);
270 assert_eq
!(chars
.index_of(&"z".into(), 0), -1);
271 assert_eq
!(chars
.index_of(&"x".into(), -3), 2);
272 assert_eq
!(chars
.index_of(&"z".into(), -2), -1);
277 assert
!(Array
::is_array(&Array
::new().into()));
278 assert
!(Array
::is_array(&js_array
![1].into()));
279 assert
!(!Array
::is_array(&JsValue
::null()));
280 assert
!(!Array
::is_array(&JsValue
::undefined()));
281 assert
!(!Array
::is_array(&10.into
()));
282 assert
!(!Array
::is_array(&"x".into()));
283 assert
!(!Array
::is_array(&true.into()));
284 assert
!(!Array
::is_array(&false.into()));
289 let array
= js_array
![3, 1, 6, 2];
290 let sorted
= array
.sort();
291 assert_eq
!(to_rust(&sorted
), array
![1, 2, 3, 6]);
296 let array
= js_array
!["z", 1, "y", 2];
297 assert
!(array
.some(&mut |e
| e
== JsValue
::from(2)));
298 assert
!(array
.some(&mut |e
| e
== JsValue
::from("y")));
299 assert
!(!array
.some(&mut |e
| e
== JsValue
::from("nope")));
304 let characters
= js_array
!["a", "x", "c", "x", "n"];
305 assert_eq
!(characters
.last_index_of(&"x".into(), 5), 3);
306 assert_eq
!(characters
.last_index_of(&"z".into(), 5), -1);
307 assert_eq
!(characters
.last_index_of(&"x".into(), 2), 1);
308 assert_eq
!(characters
.last_index_of(&"x".into(), 0), -1);
313 let characters
= js_array
!["a", "c", "x", "n"];
314 assert_eq
!(String
::from(characters
.join(", ")), "a, c, x, n");
315 assert_eq
!(String
::from(characters
.join("/")), "a/c/x/n");
320 let characters
= js_array
!["a", "c", "x", "n", 1, "8"];
321 let subset
= characters
.slice(1, 3);
323 assert_eq
!(to_rust(&subset
), array
!["c", "x"]);
328 let characters
= js_array
!["a", "c", "x", "n", 1, "8"];
329 let removed
= characters
.splice(1, 3, &"b".into());
331 assert_eq
!(to_rust(&removed
), array
!["c", "x", "n"]);
332 assert_eq
!(to_rust(&characters
), array
!["a", "b", 1, "8"]);
337 let characters
= js_array
!["a", "c", "x", "n", 1, "8"];
338 let subset
= characters
.fill(&0.into
(), 0, 3);
340 assert_eq
!(to_rust(&subset
), array
![0, 0, 0, "n", 1, "8"]);
345 let characters
= js_array
![8, 5, 4, 3, 1, 2];
346 characters
.copy_within(1, 4, 5);
348 assert_eq
!(to_rust(&characters
)[1], JsValue
::from(1));
350 // if negatives were used
351 characters
.copy_within(-1, -3, -2);
352 assert_eq
!(to_rust(&characters
)[5], JsValue
::from(3));
357 let a
= JsValue
::from("a");
358 let b
= JsValue
::from("b");
359 let c
= JsValue
::from("c");
360 let arr
= Array
::of3(&a
, &b
, &c
);
361 let vec
= to_rust(&arr
);
362 assert_eq
!(vec
.len(), 3);
363 assert_eq
!(vec
[0], a
);
364 assert_eq
!(vec
[1], b
);
365 assert_eq
!(vec
[2], c
);
370 let characters
= js_array
![8, 5, 4, 3, 1, 2];
371 let item
= characters
.pop();
372 assert_eq
!(item
, JsValue
::from(2));
373 assert_eq
!(characters
.length(), 5);
378 let characters
= js_array
![8, 5, 4, 3, 1, 2];
379 let length
= characters
.push(&"a".into());
380 assert_eq
!(length
, 7);
381 assert_eq
!(to_rust(&characters
)[6], "a");
386 let characters
= js_array
![8, 5, 4, 3, 1, 2];
387 let reversed
= characters
.reverse();
388 assert_eq
!(to_rust(&reversed
), array
![2, 1, 3, 4, 5, 8]);
393 let characters
= js_array
![8, 5, 4, 3, 1, 2];
394 let shiftedItem
= characters
.shift();
396 assert_eq
!(shiftedItem
, 8);
397 assert_eq
!(characters
.length(), 5);
402 let characters
= js_array
![8, 5, 4, 3, 1, 2];
403 let length
= characters
.unshift(&"abba".into());
405 assert_eq
!(length
, 7);
406 assert_eq
!(to_rust(&characters
)[0], "abba");
411 let characters
= js_array
![8, 5, 4, 3, 1, 2];
412 assert_eq
!(String
::from(characters
.to_string()), "8,5,4,3,1,2");
417 let characters
= js_array
![8, 5, 4, 3, 1, 2];
418 assert
!(characters
.includes(&2.into
(), 0));
419 assert
!(!characters
.includes(&9.into
(), 0));
420 assert
!(!characters
.includes(&3.into
(), 4));
425 let arr1
= js_array
![1, 2, 3];
426 let arr2
= js_array
![4, 5, 6];
428 let new_array
= arr1
.concat(&arr2
);
429 assert_eq
!(to_rust(&new_array
), array
![1, 2, 3, 4, 5, 6]);
434 let characters
= js_array
![8, 5, 4, 3, 1, 2];
435 assert_eq
!(characters
.length(), 6);
436 assert_eq
!(Array
::new().length(), 0);
441 let even
= js_array
![2, 4, 6, 8];
442 assert
!(even
.every(&mut |x
, _
, _
| x
.as_f64().unwrap() % 2.0 == 0.0));
443 let odd
= js_array
![1, 3, 5, 7];
444 assert
!(!odd
.every(&mut |x
, _
, _
| x
.as_f64().unwrap() % 2.0 == 0.0));
445 let mixed
= js_array
![2, 3, 4, 5];
446 assert
!(!mixed
.every(&mut |x
, _
, _
| x
.as_f64().unwrap() % 2.0 == 0.0));
451 let even
= js_array
![2, 4, 6, 8];
453 even
.find(&mut |x
, _
, _
| x
.as_f64().unwrap() % 2.0 == 0.0),
456 let odd
= js_array
![1, 3, 5, 7];
458 odd
.find(&mut |x
, _
, _
| x
.as_f64().unwrap() % 2.0 == 0.0),
459 JsValue
::undefined(),
461 let mixed
= js_array
![3, 5, 7, 10];
463 mixed
.find(&mut |x
, _
, _
| x
.as_f64().unwrap() % 2.0 == 0.0),
470 let numbers
= js_array
![1, 4, 9];
471 let sqrt
= numbers
.map(&mut |x
, _
, _
| x
.as_f64().unwrap().sqrt().into());
472 assert_eq
!(to_rust(&sqrt
), array
![1, 2, 3]);
477 let arr
= js_array
!["0", "1", "2", "3", "4"].reduce(
478 &mut |ac
, cr
, _
, _
| {
479 format
!("{}{}", &ac
.as_string().unwrap(), &cr
.as_string().unwrap()).into()
483 assert_eq
!(arr
, "01234");
488 let arr
= js_array
!["0", "1", "2", "3", "4"].reduce_right(
489 &mut |ac
, cr
, _
, _
| {
490 format
!("{}{}", &ac
.as_string().unwrap(), &cr
.as_string().unwrap()).into()
494 assert_eq
!(arr
, "43210");
499 let even
= js_array
![2, 4, 6, 8];
501 even
.find_index(&mut |e
, _
, _
| e
.as_f64().unwrap() % 2. == 0.),
504 let odd
= js_array
![1, 3, 5, 7];
506 odd
.find_index(&mut |e
, _
, _
| e
.as_f64().unwrap() % 2. == 0.),
509 let mixed
= js_array
![3, 5, 7, 10];
511 mixed
.find_index(&mut |e
, _
, _
| e
.as_f64().unwrap() % 2. == 0.),
517 fn to_locale_string() {
518 let output
= js_array
![1, "a", Date
::new(&"21 Dec 1997 14:12:00 UTC".into())]
519 .to_locale_string(&"en".into(), &JsValue
::undefined());
520 assert
!(String
::from(output
).len() > 0);
525 fn sum_indices_of_evens(array
: &Array
) -> u32 {
527 array
.for_each(&mut |elem
: JsValue
, i
, _
| match elem
.as_f64() {
528 Some(val
) if val
% 2. == 0. => res
+= i
,
534 assert_eq
!(sum_indices_of_evens(&js_array
![2, 4, 6, 8]), 0 + 1 + 2 + 3);
535 assert_eq
!(sum_indices_of_evens(&js_array
![1, 3, 5, 7]), 0);
536 assert_eq
!(sum_indices_of_evens(&js_array
![3, 5, 7, 10]), 3);
540 fn array_inheritance() {
541 let array
= Array
::new();
542 assert
!(array
.is_instance_of
::<Array
>());
543 assert
!(array
.is_instance_of
::<Object
>());
544 let _
: &Object
= array
.as_ref();
547 #[wasm_bindgen(module = "tests/wasm/Array.js")]
549 fn populate_array(arr
: JsValue
, start
: JsValue
, len
: JsValue
) -> JsValue
;
552 fn test_array_view_mut_raw
<ElemT
: std
::cmp
::PartialEq
+ std
::fmt
::Debug
, ArrT
>(
553 sut
: unsafe fn(*mut ElemT
, usize) -> ArrT
,
554 u8ToElem
: fn(u8) -> ElemT
,
555 arrToJsValue
: fn(ArrT
) -> JsValue
,
559 let end
: u8 = start
+ len
as u8;
560 let mut buffer
: Vec
<ElemT
> = Vec
::new();
563 let array
: ArrT
= sut(buffer
.as_mut_ptr(), len
);
566 JsValue
::from(start
),
567 JsValue
::from(len
as u32),
571 let expected
: Vec
<ElemT
> = (start
..end
).map(u8ToElem
).collect();
572 assert_eq
!(buffer
, expected
)
576 fn Int8Array_view_mut_raw() {
577 fn u8Toi8_unsafe(x
: u8) -> i8 {
580 test_array_view_mut_raw(
581 js_sys
::Int8Array
::view_mut_raw
,
588 fn Int16Array_view_mut_raw() {
589 test_array_view_mut_raw(js_sys
::Int16Array
::view_mut_raw
, i16::from
, JsValue
::from
);
593 fn Int32Array_view_mut_raw() {
594 test_array_view_mut_raw(js_sys
::Int32Array
::view_mut_raw
, i32::from
, JsValue
::from
);
598 fn BigInt64Array_view_mut_raw() {
599 test_array_view_mut_raw(
600 js_sys
::BigInt64Array
::view_mut_raw
,
607 fn Uint8Array_view_mut_raw() {
608 test_array_view_mut_raw(js_sys
::Uint8Array
::view_mut_raw
, u8::from
, JsValue
::from
);
612 fn Uint8ClampedArray_view_mut_raw() {
613 test_array_view_mut_raw(
614 js_sys
::Uint8ClampedArray
::view_mut_raw
,
621 fn Uint16Array_view_mut_raw() {
622 test_array_view_mut_raw(js_sys
::Uint16Array
::view_mut_raw
, u16::from
, JsValue
::from
);
626 fn Uint32Array_view_mut_raw() {
627 test_array_view_mut_raw(js_sys
::Uint32Array
::view_mut_raw
, u32::from
, JsValue
::from
);
631 fn BigUint64Array_view_mut_raw() {
632 test_array_view_mut_raw(
633 js_sys
::BigUint64Array
::view_mut_raw
,
640 fn Float32Array_view_mut_raw() {
641 test_array_view_mut_raw(js_sys
::Float32Array
::view_mut_raw
, f32::from
, JsValue
::from
);
645 fn Float64Array_view_mut_raw() {
646 test_array_view_mut_raw(js_sys
::Float64Array
::view_mut_raw
, f64::from
, JsValue
::from
);