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; #[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}