bn_rs/bn/
bindgen.rs

1use wasm_bindgen::prelude::*;
2
3#[wasm_bindgen(module = "bn.js")]
4extern "C" {
5    pub type BN;
6
7    #[wasm_bindgen(constructor)]
8    pub fn new(number: String, base: u32) -> BN;
9
10    #[wasm_bindgen(constructor)]
11    pub fn new_from_array(number: &[u8], base: u32) -> BN;
12
13    #[wasm_bindgen(method, getter)]
14    pub fn negative(this: &BN) -> u8; // positive = 0, negative = 1
15
16    #[wasm_bindgen(method, js_name = byteLength)]
17    pub fn byte_length(this: &BN) -> u32;
18
19    #[wasm_bindgen(catch, method, js_name = toArray)]
20    pub fn to_array(this: &BN, endian: String, length: u32) -> Result<Box<[u8]>, JsValue>;
21
22    #[wasm_bindgen(method)]
23    pub fn toString(this: &BN, base: u32) -> String;
24}
25
26#[cfg(test)]
27mod tests {
28    use wasm_bindgen_test::*;
29
30    use super::BN;
31
32    #[wasm_bindgen_test]
33    fn new() {
34        assert_eq!(BN::new("10".into(), 10).toString(10), "10".to_string());
35        assert_eq!(BN::new("dead".into(), 16).toString(16), "dead".to_string());
36    }
37
38    #[wasm_bindgen_test]
39    fn new_from_array() {
40        assert_eq!(
41            BN::new_from_array(&[0, 10, 0], 10).toString(10),
42            "2560".to_string()
43        );
44        assert_eq!(
45            BN::new_from_array(&[30, 0], 16).toString(16),
46            "1e00".to_string()
47        );
48    }
49
50    #[wasm_bindgen_test]
51    fn negative() {
52        assert_eq!(BN::new("10".into(), 10).negative(), 0);
53        assert_eq!(BN::new("-10".into(), 10).negative(), 1);
54    }
55
56    #[wasm_bindgen_test]
57    fn byte_length() {
58        assert_eq!(BN::new("10".into(), 10).byte_length(), 1);
59        assert_eq!(BN::new("10000".into(), 10).byte_length(), 2);
60    }
61
62    #[wasm_bindgen_test]
63    fn to_array() {
64        assert_eq!(
65            *BN::new("10000".into(), 10)
66                .to_array("le".into(), 5)
67                .unwrap(),
68            [16, 39, 0, 0, 0]
69        );
70        assert_eq!(
71            *BN::new("10000".into(), 10)
72                .to_array("be".into(), 5)
73                .unwrap(),
74            [0, 0, 0, 39, 16]
75        );
76    }
77
78    #[wasm_bindgen_test]
79    fn to_string() {
80        assert_eq!(*BN::new("10".into(), 10).toString(10), "10".to_string());
81        assert_eq!(*BN::new("dead".into(), 16).toString(16), "dead".to_string());
82    }
83}