1 use wasm_bindgen::prelude::*;
2 use wasm_bindgen_test::*;
3 
4 #[wasm_bindgen(module = "tests/wasm/variadic.js")]
5 extern "C" {
6     #[wasm_bindgen(variadic)]
variadic_sum_u8(first: u8, second: u8, rest: &[u8]) -> u87     fn variadic_sum_u8(first: u8, second: u8, rest: &[u8]) -> u8;
8     #[wasm_bindgen(variadic)]
variadic_sum_u16(first: u16, second: u16, rest: &[u16]) -> u169     fn variadic_sum_u16(first: u16, second: u16, rest: &[u16]) -> u16;
10     #[wasm_bindgen(variadic)]
variadic_sum_u32(first: u32, second: u32, rest: &[u32]) -> u3211     fn variadic_sum_u32(first: u32, second: u32, rest: &[u32]) -> u32;
12     #[wasm_bindgen(variadic)]
variadic_sum_u64(first: u64, second: u64, rest: &[u64]) -> u6413     fn variadic_sum_u64(first: u64, second: u64, rest: &[u64]) -> u64;
14     //#[wasm_bindgen(variadic)]
15     //fn variadic_sum_usize(first: usize, second: usize, rest: &[usize]) -> usize;
16     #[wasm_bindgen(variadic)]
variadic_sum_i8(first: i8, second: i8, rest: &[i8]) -> i817     fn variadic_sum_i8(first: i8, second: i8, rest: &[i8]) -> i8;
18     #[wasm_bindgen(variadic)]
variadic_sum_i16(first: i16, second: i16, rest: &[i16]) -> i1619     fn variadic_sum_i16(first: i16, second: i16, rest: &[i16]) -> i16;
20     #[wasm_bindgen(variadic)]
variadic_sum_i32(first: i32, second: i32, rest: &[i32]) -> i3221     fn variadic_sum_i32(first: i32, second: i32, rest: &[i32]) -> i32;
22     #[wasm_bindgen(variadic)]
variadic_sum_i64(first: i64, second: i64, rest: &[i64]) -> i6423     fn variadic_sum_i64(first: i64, second: i64, rest: &[i64]) -> i64;
24     //#[wasm_bindgen(variadic)]
25     //fn variadic_sum_isize(first: isize, second: isize, rest: &[isize]) -> isize;
26     #[wasm_bindgen(variadic)]
variadic_sum_f32(first: f32, second: f32, rest: &[f32]) -> f3227     fn variadic_sum_f32(first: f32, second: f32, rest: &[f32]) -> f32;
28     #[wasm_bindgen(variadic)]
variadic_sum_f64(first: f64, second: f64, rest: &[f64]) -> f6429     fn variadic_sum_f64(first: f64, second: f64, rest: &[f64]) -> f64;
30     //#[wasm_bindgen(variadic)]
31     //fn variadic_sum_opt(first: Option<u32>, second: Option<u32>, rest: &[Option<u32>]) -> u32;
32     //#[wasm_bindgen(variadic)]
33     //fn variadic_concat_str(first: &str, second: &str, rest: &[&str]) -> String;
34     //#[wasm_bindgen(variadic)]
35     //fn variadic_concat_string(first: String,
36     //                          second: String,
37     //                          rest: Vec<String>) -> String;
38     #[wasm_bindgen(variadic)]
variadic_sum_rest_vec(first: u8, second: u8, rest: Vec<u8>) -> u839     fn variadic_sum_rest_vec(first: u8, second: u8, rest: Vec<u8>) -> u8;
40 //#[wasm_bindgen(variadic)]
41 //fn variadic_compare_pairs(first: JsValue, second: JsValue, rest: &[JsValue]);
42 //TODO imported type
43 }
44 
45 // ints
46 
47 macro_rules! variadic_test_int {
48     ($fn_name:ident, $extern_name:ident) => {
49         #[wasm_bindgen_test]
50         fn $fn_name() {
51             assert_eq!($extern_name(1, 2, &[]), 3);
52             assert_eq!($extern_name(1, 2, &[3]), 6);
53             assert_eq!($extern_name(1, 2, &[3, 4]), 10);
54         }
55     };
56 }
57 
58 // The <int>64 tests throw js `Cannot mix BigInt and other types, use explicit conversions`
59 variadic_test_int!(u8, variadic_sum_u8);
60 variadic_test_int!(u16, variadic_sum_u16);
61 variadic_test_int!(u32, variadic_sum_u32);
62 //variadic_test_int!(u64, variadic_sum_u64);
63 //variadic_test_int!(usize, variadic_sum_usize);
64 variadic_test_int!(i8, variadic_sum_i8);
65 variadic_test_int!(i16, variadic_sum_i16);
66 variadic_test_int!(i32, variadic_sum_i32);
67 //variadic_test_int!(i64, variadic_sum_i64);
68 //variadic_test_int!(isize, variadic_sum_isize);
69 
70 // floats
71 
72 macro_rules! variadic_test_float {
73     ($fn_name:ident, $extern_name:ident) => {
74         #[wasm_bindgen_test]
75         fn $fn_name() {
76             assert_eq!($extern_name(1., 2., &[]), 3.);
77             assert_eq!($extern_name(1., 2., &[3.]), 6.);
78             assert_eq!($extern_name(1., 2., &[3., 4.]), 10.);
79         }
80     };
81 }
82 
83 variadic_test_float!(f32, variadic_sum_f32);
84 variadic_test_float!(f64, variadic_sum_f64);
85 
86 // strings
87 
88 // `the trait `wasm_bindgen::convert::IntoWasmAbi` is not implemented for `&[&str]`
89 /*
90 #[wasm_bindgen_test]
91 fn str() {
92     assert_eq!(variadic_concat_str("a ", "test", &[]), "a test");
93     assert_eq!(variadic_concat_str("a", "nother ", &["test"]), "another test");
94     assert_eq!(variadic_concat_str("yet ", "a", &["nother ", "test"]), "yet another test");
95 }
96 
97 #[wasm_bindgen_test]
98 fn string() {
99     assert_eq!(variadic_concat_string("a ".into(), "test".into(), vec![]), "a test");
100     assert_eq!(variadic_concat_string("a".into(), "nother ".into(), vec!["test".into()]),
101                "another test");
102     assert_eq!(variadic_concat_string("yet ".into(),
103                                       "a".into(),
104                                       vec!["nother ".into(), "test".into()]),
105                "yet another test");
106 }
107 */
108 
109 // options
110 
111 /*
112 #[wasm_bindgen_test]
113 fn opt() {
114     assert_eq!(variadic_sum_opt(Some(1), None, &[]), 1);
115     assert_eq!(variadic_sum_opt(Some(1), None, &[Some(2)]), 3);
116     assert_eq!(variadic_sum_opt(Some(1), None, &[None, Some(2)]), 3);
117 }
118 */
119 
120 // vec not slice
121 
122 #[wasm_bindgen_test]
rest_vec()123 fn rest_vec() {
124     assert_eq!(variadic_sum_rest_vec(1, 2, vec![]), 3);
125     assert_eq!(variadic_sum_rest_vec(1, 2, vec![3]), 6);
126     assert_eq!(variadic_sum_rest_vec(1, 2, vec![3, 4]), 10);
127 }
128 
129 // JsValue
130 //#[wasm_bindgen_test]
131 //fn jsvalue() {
132 //    variadic_compare_pairs_jsvalue(true, true, vec![]);
133 //    variadic_compare_pairs_jsvalue(false, false, vec![3, 3]);
134 //}
135