use core::str::FromStr; use slipped10::BIP32Path; const HARDEND: u32 = 1 << 31; #[test] fn test_parse_path() { let smaples = vec![ ("", BIP32Path::from(Vec::new())), ("m", BIP32Path::from(Vec::new())), ("m/0H", BIP32Path::from(vec![HARDEND + 0])), ("m/0H/1", BIP32Path::from(vec![HARDEND + 0, 1])), ( "m/0H/1/2H", BIP32Path::from(vec![HARDEND + 0, 1, HARDEND + 2]), ), ( "m/0H/1/2H/2", BIP32Path::from(vec![HARDEND + 0, 1, HARDEND + 2, 2]), ), ( "m/0H/1/2H/2/1000000000", BIP32Path::from(vec![HARDEND + 0, 1, HARDEND + 2, 2, 1000000000]), ), ("0H", BIP32Path::from(vec![HARDEND + 0])), ("0H/1", BIP32Path::from(vec![HARDEND + 0, 1])), ( "0H/1/2H", BIP32Path::from(vec![HARDEND + 0, 1, HARDEND + 2]), ), ( "0H/1/2H/2", BIP32Path::from(vec![HARDEND + 0, 1, HARDEND + 2, 2]), ), ( "0H/1/2H/2/1000000000", BIP32Path::from(vec![HARDEND + 0, 1, HARDEND + 2, 2, 1000000000]), ), ("m/0'", BIP32Path::from(vec![HARDEND + 0])), ("m/0'/1", BIP32Path::from(vec![HARDEND + 0, 1])), ( "m/0'/1/2'", BIP32Path::from(vec![HARDEND + 0, 1, HARDEND + 2]), ), ( "m/0'/1/2'/2", BIP32Path::from(vec![HARDEND + 0, 1, HARDEND + 2, 2]), ), ( "m/0'/1/2'/2/1000000000", BIP32Path::from(vec![HARDEND + 0, 1, HARDEND + 2, 2, 1000000000]), ), ("0'", BIP32Path::from(vec![HARDEND + 0])), ("0'/1", BIP32Path::from(vec![HARDEND + 0, 1])), ( "0'/1/2'", BIP32Path::from(vec![HARDEND + 0, 1, HARDEND + 2]), ), ( "0'/1/2'/2", BIP32Path::from(vec![HARDEND + 0, 1, HARDEND + 2, 2]), ), ( "0'/1/2'/2/1000000000", BIP32Path::from(vec![HARDEND + 0, 1, HARDEND + 2, 2, 1000000000]), ), ( "0/2147483647'/1/2147483646'/2", BIP32Path::from(vec![0, HARDEND + 2147483647, 1, HARDEND + 2147483646, 2]), ), ( "0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0", BIP32Path::from(vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), ), ]; for (bip32_path_str, expected_bip32_path) in smaples { let parsed_bip32_path = BIP32Path::from_str(bip32_path_str).unwrap(); assert_eq!(parsed_bip32_path, expected_bip32_path); let bip32_path_normalized_str = bip32_path_str.replace('H', "'"); let bip32_path_normalized_str = if !bip32_path_normalized_str.starts_with("m/") { if bip32_path_str == "m" { format!("m/") } else { format!("m/{}", bip32_path_normalized_str) } } else { bip32_path_normalized_str }; assert_eq!(parsed_bip32_path.to_string(), bip32_path_normalized_str); } let errors = vec![ "44'/2147483648", "44'/2147483648'", "44'/-1", "44'//0", "/0'/1/2'", "44'/'", "44'/'0", "44'/0h", "44'/0''", "44'/0H'", "wrong", ]; for i in errors { assert!(BIP32Path::from_str(i).is_err()); } }