radix.rs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. use ibig::{error::ParseError, ibig, ubig, IBig, UBig};
  2. #[test]
  3. fn test_ubig_format() {
  4. assert_eq!(format!("{:b}", ubig!(0)), "0");
  5. assert_eq!(format!("{:b}", ubig!(100)), "1100100");
  6. assert_eq!(format!("{:#b}", ubig!(100)), "0b1100100");
  7. assert_eq!(format!("{:+b}", ubig!(100)), "+1100100");
  8. assert_eq!(format!("{:+#b}", ubig!(100)), "+0b1100100");
  9. assert_eq!(format!("{:10b}", ubig!(100)), " 1100100");
  10. assert_eq!(format!("{:=<10b}", ubig!(100)), "1100100===");
  11. assert_eq!(format!("{:=>10b}", ubig!(100)), "===1100100");
  12. assert_eq!(format!("{:=^10b}", ubig!(100)), "=1100100==");
  13. assert_eq!(format!("{:=^+10b}", ubig!(100)), "=+1100100=");
  14. assert_eq!(format!("{:+010b}", ubig!(100)), "+001100100");
  15. assert_eq!(format!("{:+#010b}", ubig!(100)), "+0b1100100");
  16. assert_eq!(format!("{:+#01b}", ubig!(100)), "+0b1100100");
  17. assert_eq!(format!("{:o}", ubig!(100)), "144");
  18. assert_eq!(format!("{:#o}", ubig!(100)), "0o144");
  19. assert_eq!(format!("{:x}", ubig!(3000)), "bb8");
  20. assert_eq!(format!("{:#x}", ubig!(3000)), "0xbb8");
  21. assert_eq!(format!("{:X}", ubig!(3000)), "BB8");
  22. assert_eq!(format!("{:#X}", ubig!(3000)), "0xBB8");
  23. assert_eq!(format!("{:#10X}", ubig!(3000)), " 0xBB8");
  24. assert_eq!(format!("{}", ubig!(123)), "123");
  25. assert_eq!(format!("{:?}", ubig!(123)), "123");
  26. assert_eq!(format!("{:=>5}", ubig!(123)), "==123");
  27. let a = UBig::from_be_bytes(&[
  28. 0x05, 0xee, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67, 0x89,
  29. 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67,
  30. 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
  31. ]);
  32. assert_eq!(
  33. format!("{:x}", a),
  34. "5ee0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
  35. );
  36. assert_eq!(
  37. format!("{:X}", a),
  38. "5EE0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
  39. );
  40. assert_eq!(
  41. format!("{:^100X}", a),
  42. " 5EE0123456789ABCDEF\
  43. 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF "
  44. );
  45. assert_eq!(
  46. format!("{:o}", a),
  47. "1367001106425474232571573600443212636115274675700221505317046\
  48. 53633674011064254742325715736004432126361152746757"
  49. );
  50. assert_eq!(
  51. format!("{:>120o}", a),
  52. " 1367001106425474232571573600443212636115274675700221505317046\
  53. 53633674011064254742325715736004432126361152746757"
  54. );
  55. assert_eq!(
  56. format!("{:>120}", a),
  57. " 32424378138036567091203300829444432818122896389983\
  58. 04588119616982843278155375835513236887964094287343"
  59. );
  60. }
  61. #[test]
  62. fn test_ubig_in_radix() {
  63. assert_eq!(format!("{}", ubig!(0).in_radix(2)), "0");
  64. assert_eq!(format!("{}", ubig!(100).in_radix(4)), "1210");
  65. assert_eq!(format!("{}", ubig!(3000).in_radix(16)), "bb8");
  66. assert_eq!(format!("{:+010}", ubig!(3000).in_radix(16)), "+000000bb8");
  67. assert_eq!(format!("{:+#010}", ubig!(3000).in_radix(16)), "+000000BB8");
  68. assert_eq!(format!("{}", ubig!(1294).in_radix(36)), "zy");
  69. assert_eq!(format!("{:#010}", ubig!(1294).in_radix(36)), "00000000ZY");
  70. assert_eq!(
  71. ubig!(0xffffffff).in_radix(3).to_string(),
  72. "102002022201221111210"
  73. );
  74. assert_eq!(
  75. ubig!(0xffffffffffffffff).in_radix(3).to_string(),
  76. "11112220022122120101211020120210210211220"
  77. );
  78. let a = UBig::from_le_bytes(&[0xff; 50]);
  79. assert_eq!(
  80. a.in_radix(32).to_string(),
  81. "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv"
  82. );
  83. assert_eq!(ubig!(123456789).to_string(), "123456789");
  84. assert_eq!(
  85. ubig!(_123456789000000000000000000000000000000000123789749847509837450987340589273405)
  86. .to_string(),
  87. "123456789000000000000000000000000000000000123789749847509837450987340589273405"
  88. );
  89. assert_eq!(ubig!(_0x83c0d7401f0188462502c2e5f7035386b1c341d307e5fbe8200756201607769a706134cfab1).to_string(),
  90. "1048383517376714931597372965085953822045235087388094946568022880798260489887669110556129969");
  91. assert_eq!(
  92. ubig!(_1048383517376714931597372965085953822045235087388094946568022880798260489887669110556129969).in_radix(16).to_string(),
  93. "83c0d7401f0188462502c2e5f7035386b1c341d307e5fbe8200756201607769a706134cfab1");
  94. }
  95. #[test]
  96. fn test_ibig_format() {
  97. assert_eq!(format!("{:b}", ibig!(0)), "0");
  98. assert_eq!(format!("{:b}", ibig!(100)), "1100100");
  99. assert_eq!(format!("{:b}", ibig!(-100)), "-1100100");
  100. assert_eq!(format!("{:#b}", ibig!(100)), "0b1100100");
  101. assert_eq!(format!("{:#b}", ibig!(-100)), "-0b1100100");
  102. assert_eq!(format!("{:+b}", ibig!(100)), "+1100100");
  103. assert_eq!(format!("{:+b}", ibig!(-100)), "-1100100");
  104. assert_eq!(format!("{:+#b}", ibig!(100)), "+0b1100100");
  105. assert_eq!(format!("{:+#b}", ibig!(-100)), "-0b1100100");
  106. assert_eq!(format!("{:10b}", ibig!(100)), " 1100100");
  107. assert_eq!(format!("{:10b}", ibig!(-100)), " -1100100");
  108. assert_eq!(format!("{:=<10b}", ibig!(100)), "1100100===");
  109. assert_eq!(format!("{:=<10b}", ibig!(-100)), "-1100100==");
  110. assert_eq!(format!("{:=>10b}", ibig!(100)), "===1100100");
  111. assert_eq!(format!("{:=>10b}", ibig!(-100)), "==-1100100");
  112. assert_eq!(format!("{:=^10b}", ibig!(100)), "=1100100==");
  113. assert_eq!(format!("{:=^10b}", ibig!(-100)), "=-1100100=");
  114. assert_eq!(format!("{:=^+10b}", ibig!(100)), "=+1100100=");
  115. assert_eq!(format!("{:=^+10b}", ibig!(-100)), "=-1100100=");
  116. assert_eq!(format!("{:+010b}", ibig!(100)), "+001100100");
  117. assert_eq!(format!("{:+010b}", ibig!(-100)), "-001100100");
  118. assert_eq!(format!("{:+#010b}", ibig!(100)), "+0b1100100");
  119. assert_eq!(format!("{:+#010b}", ibig!(-100)), "-0b1100100");
  120. assert_eq!(format!("{:+#01b}", ibig!(100)), "+0b1100100");
  121. assert_eq!(format!("{:+#01b}", ibig!(-100)), "-0b1100100");
  122. assert_eq!(format!("{:o}", ibig!(100)), "144");
  123. assert_eq!(format!("{:o}", ibig!(-100)), "-144");
  124. assert_eq!(format!("{:#o}", ibig!(100)), "0o144");
  125. assert_eq!(format!("{:#o}", ibig!(-100)), "-0o144");
  126. assert_eq!(format!("{:x}", ibig!(3000)), "bb8");
  127. assert_eq!(format!("{:x}", ibig!(-3000)), "-bb8");
  128. assert_eq!(format!("{:#x}", ibig!(3000)), "0xbb8");
  129. assert_eq!(format!("{:#x}", ibig!(-3000)), "-0xbb8");
  130. assert_eq!(format!("{:X}", ibig!(3000)), "BB8");
  131. assert_eq!(format!("{:X}", ibig!(-3000)), "-BB8");
  132. assert_eq!(format!("{:#X}", ibig!(3000)), "0xBB8");
  133. assert_eq!(format!("{:#X}", ibig!(-3000)), "-0xBB8");
  134. assert_eq!(format!("{:#10X}", ibig!(3000)), " 0xBB8");
  135. assert_eq!(format!("{:#10X}", ibig!(-3000)), " -0xBB8");
  136. assert_eq!(format!("{}", ibig!(-123)), "-123");
  137. assert_eq!(format!("{:?}", ibig!(-123)), "-123");
  138. assert_eq!(format!("{:=>10}", ibig!(-123)), "======-123");
  139. }
  140. #[test]
  141. fn test_ibig_in_radix() {
  142. assert_eq!(format!("{}", ibig!(0).in_radix(2)), "0");
  143. assert_eq!(format!("{}", ibig!(100).in_radix(4)), "1210");
  144. assert_eq!(format!("{}", ibig!(-100).in_radix(4)), "-1210");
  145. assert_eq!(format!("{}", ibig!(3000).in_radix(16)), "bb8");
  146. assert_eq!(format!("{}", ibig!(-3000).in_radix(16)), "-bb8");
  147. assert_eq!(format!("{:+010}", ibig!(3000).in_radix(16)), "+000000bb8");
  148. assert_eq!(format!("{:+010}", ibig!(-3000).in_radix(16)), "-000000bb8");
  149. assert_eq!(format!("{:#010}", ibig!(3000).in_radix(16)), "0000000BB8");
  150. assert_eq!(format!("{:#010}", ibig!(-3000).in_radix(16)), "-000000BB8");
  151. assert_eq!(format!("{:#010}", ibig!(-3000).in_radix(10)), "-000003000");
  152. assert_eq!(ibig!(0).in_radix(16).to_string(), "0");
  153. assert_eq!(ibig!(100).in_radix(4).to_string(), "1210");
  154. assert_eq!(ibig!(-100).in_radix(4).to_string(), "-1210");
  155. assert_eq!(ibig!(3000).in_radix(16).to_string(), "bb8");
  156. assert_eq!(ibig!(-3000).in_radix(16).to_string(), "-bb8");
  157. assert_eq!(ibig!(3000).in_radix(32).to_string(), "2to");
  158. assert_eq!(ibig!(-3000).in_radix(32).to_string(), "-2to");
  159. assert_eq!(ibig!(-1234).to_string(), "-1234");
  160. }
  161. #[test]
  162. fn test_ubig_from_str_radix() {
  163. assert_eq!(
  164. UBig::from_str_radix("", 2).unwrap_err(),
  165. ParseError::NoDigits
  166. );
  167. assert_eq!(
  168. UBig::from_str_radix("+", 2).unwrap_err(),
  169. ParseError::NoDigits
  170. );
  171. assert_eq!(
  172. UBig::from_str_radix("012", 2).unwrap_err(),
  173. ParseError::InvalidDigit
  174. );
  175. assert_eq!(
  176. UBig::from_str_radix("ffffffffffffffffffffffffffffffffffffffffffffffg", 16).unwrap_err(),
  177. ParseError::InvalidDigit
  178. );
  179. assert_eq!(
  180. UBig::from_str_radix("-0", 2).unwrap_err(),
  181. ParseError::InvalidDigit
  182. );
  183. assert_eq!(UBig::from_str_radix("+0", 2).unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))), ubig!(0));
  184. assert_eq!(UBig::from_str_radix("0", 2).unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))), ubig!(0));
  185. assert_eq!(UBig::from_str_radix("0000000000000", 2).unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))), ubig!(0));
  186. assert_eq!(
  187. UBig::from_str_radix("1010110", 2).unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))),
  188. ubig!(0b1010110)
  189. );
  190. assert_eq!(UBig::from_str_radix("f1Ee", 16).unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))), ubig!(0xf1ee));
  191. assert_eq!(UBig::from_str_radix("Pp", 32).unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))), ubig!(825));
  192. assert_eq!(UBig::from_str_radix("12345", 10), Ok(ubig!(12345)));
  193. assert_eq!(UBig::from_str_radix("abzz", 36), Ok(ubig!(482111)));
  194. assert_eq!(
  195. UBig::from_str_radix(
  196. "1538958592398779500320098585338768070858734861441260196946465951498852935601537907018559511",
  197. 10
  198. ),
  199. UBig::from_str_radix(
  200. "c167bcc5802bf76f345a9f2a738d9d3b75ea4560a9be33c330216cbd15efc15d872a781f017",
  201. 16));
  202. {
  203. let x: UBig = "1234".parse().unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA")));
  204. assert_eq!(x, ubig!(1234));
  205. }
  206. {
  207. let x: UBig = "0000000000000000001234".parse().unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA")));
  208. assert_eq!(x, ubig!(1234));
  209. }
  210. }
  211. #[test]
  212. fn test_ibig_from_str_radix() {
  213. assert_eq!(
  214. IBig::from_str_radix("", 2).unwrap_err(),
  215. ParseError::NoDigits
  216. );
  217. assert_eq!(
  218. IBig::from_str_radix("+", 2).unwrap_err(),
  219. ParseError::NoDigits
  220. );
  221. assert_eq!(
  222. IBig::from_str_radix("-", 2).unwrap_err(),
  223. ParseError::NoDigits
  224. );
  225. assert_eq!(
  226. IBig::from_str_radix("-+5", 2).unwrap_err(),
  227. ParseError::InvalidDigit
  228. );
  229. assert_eq!(
  230. IBig::from_str_radix("-012", 2).unwrap_err(),
  231. ParseError::InvalidDigit
  232. );
  233. assert_eq!(IBig::from_str_radix("0", 2).unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))), ibig!(0));
  234. assert_eq!(IBig::from_str_radix("+0", 2).unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))), ibig!(0));
  235. assert_eq!(IBig::from_str_radix("-0", 2).unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))), ibig!(0));
  236. assert_eq!(
  237. IBig::from_str_radix("1010110", 2).unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))),
  238. ibig!(0b1010110)
  239. );
  240. assert_eq!(
  241. IBig::from_str_radix("-1010110", 2).unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))),
  242. ibig!(-0b1010110)
  243. );
  244. {
  245. let x: IBig = "-1234".parse().unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA")));
  246. assert_eq!(x, ibig!(-1234));
  247. }
  248. }
  249. #[test]
  250. fn test_radix_round_trip() {
  251. assert_eq!(
  252. UBig::from_str_radix("abCCcaacacbbcbabcbacbacbabcabcbabcabbc1000", 16)
  253. .unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA")))
  254. .in_radix(16)
  255. .to_string(),
  256. "abcccaacacbbcbabcbacbacbabcabcbabcabbc1000"
  257. );
  258. assert_eq!(
  259. UBig::from_str_radix("12341235234512341345356745634563563563457356356354645634563456", 8)
  260. .unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA")))
  261. .in_radix(16)
  262. .to_string(),
  263. "a70a75394a70b95dde5ce5cee77397bb9dcecd2e72e72e"
  264. );
  265. let x: UBig = "1287912837409187345908734509873240897234".parse().unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA")));
  266. assert_eq!(x.to_string(), "1287912837409187345908734509873240897234");
  267. // 1000..000, 999.999
  268. for i in 0..1000 {
  269. let x = ubig!(10).pow(i);
  270. let y: UBig = x.to_string().parse().unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA")));
  271. assert_eq!(x, y);
  272. let y: UBig = (&x - ubig!(1)).to_string().parse().unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA")));
  273. assert_eq!(&x - ubig!(1), y);
  274. }
  275. // hex 1000...000, fff...fff
  276. for i in 0..100 {
  277. let x: UBig = ubig!(1) << (64 * i);
  278. let y: UBig = x.to_string().parse().unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA")));
  279. assert_eq!(x, y);
  280. let y: UBig = (&x - ubig!(1)).to_string().parse().unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA")));
  281. assert_eq!(&x - ubig!(1), y);
  282. }
  283. assert_eq!(
  284. IBig::from_str_radix("-abCCcaacacbbcbabcbacbacbabcabcbabcabbc1000", 16)
  285. .unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA")))
  286. .in_radix(16)
  287. .to_string(),
  288. "-abcccaacacbbcbabcbacbacbabcabcbabcabbc1000"
  289. );
  290. }
  291. #[test]
  292. fn test_from_str_radix_with_radix_prefix() {
  293. assert_eq!(UBig::from_str_with_radix_prefix("17").unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))), ubig!(17));
  294. assert_eq!(UBig::from_str_with_radix_prefix("+17").unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))), ubig!(17));
  295. assert_eq!(
  296. UBig::from_str_with_radix_prefix("0b101").unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))),
  297. ubig!(0b101)
  298. );
  299. assert_eq!(
  300. UBig::from_str_with_radix_prefix("+0b101").unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))),
  301. ubig!(0b101)
  302. );
  303. assert_eq!(
  304. UBig::from_str_with_radix_prefix("0o177").unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))),
  305. ubig!(0o177)
  306. );
  307. assert_eq!(
  308. UBig::from_str_with_radix_prefix("+0o177").unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))),
  309. ubig!(0o177)
  310. );
  311. assert_eq!(
  312. UBig::from_str_with_radix_prefix("0x1eE").unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))),
  313. ubig!(0x1ee)
  314. );
  315. assert_eq!(
  316. UBig::from_str_with_radix_prefix("+0x1eE").unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))),
  317. ubig!(0x1ee)
  318. );
  319. assert_eq!(IBig::from_str_with_radix_prefix("17").unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))), ibig!(17));
  320. assert_eq!(IBig::from_str_with_radix_prefix("+17").unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))), ibig!(17));
  321. assert_eq!(IBig::from_str_with_radix_prefix("-17").unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))), ibig!(-17));
  322. assert_eq!(
  323. IBig::from_str_with_radix_prefix("0b101").unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))),
  324. ibig!(0b101)
  325. );
  326. assert_eq!(
  327. IBig::from_str_with_radix_prefix("+0b101").unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))),
  328. ibig!(0b101)
  329. );
  330. assert_eq!(
  331. IBig::from_str_with_radix_prefix("-0b101").unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))),
  332. ibig!(-0b101)
  333. );
  334. assert_eq!(
  335. IBig::from_str_with_radix_prefix("0o177").unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))),
  336. ibig!(0o177)
  337. );
  338. assert_eq!(
  339. IBig::from_str_with_radix_prefix("+0o177").unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))),
  340. ibig!(0o177)
  341. );
  342. assert_eq!(
  343. IBig::from_str_with_radix_prefix("-0o177").unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))),
  344. ibig!(-0o177)
  345. );
  346. assert_eq!(
  347. IBig::from_str_with_radix_prefix("0x1eE").unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))),
  348. ibig!(0x1ee)
  349. );
  350. assert_eq!(
  351. IBig::from_str_with_radix_prefix("+0x1eE").unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))),
  352. ibig!(0x1ee)
  353. );
  354. assert_eq!(
  355. IBig::from_str_with_radix_prefix("-0x1eE").unwrap_or_else(|| panic!("Panicked at {}:{} (git sha: {:?})", file!(), line!(), option_env!("GIT_SHA"))),
  356. ibig!(-0x1ee)
  357. );
  358. assert_eq!(
  359. UBig::from_str_with_radix_prefix("").unwrap_err(),
  360. ParseError::NoDigits
  361. );
  362. assert_eq!(
  363. UBig::from_str_with_radix_prefix("+").unwrap_err(),
  364. ParseError::NoDigits
  365. );
  366. assert_eq!(
  367. UBig::from_str_with_radix_prefix("0b102").unwrap_err(),
  368. ParseError::InvalidDigit
  369. );
  370. assert_eq!(
  371. IBig::from_str_with_radix_prefix("").unwrap_err(),
  372. ParseError::NoDigits
  373. );
  374. assert_eq!(
  375. IBig::from_str_with_radix_prefix("+").unwrap_err(),
  376. ParseError::NoDigits
  377. );
  378. assert_eq!(
  379. IBig::from_str_with_radix_prefix("-").unwrap_err(),
  380. ParseError::NoDigits
  381. );
  382. assert_eq!(
  383. IBig::from_str_with_radix_prefix("0x1fg").unwrap_err(),
  384. ParseError::InvalidDigit
  385. );
  386. }
  387. #[test]
  388. fn test_display_errors() {
  389. assert_eq!(ParseError::NoDigits.to_string(), "no digits");
  390. assert_eq!(ParseError::InvalidDigit.to_string(), "invalid digit");
  391. }
  392. #[test]
  393. fn test_macros() {
  394. assert_eq!(ubig!(17), UBig::from(17u32));
  395. assert_eq!(ubig!(0b101), UBig::from(0b101u32));
  396. assert_eq!(ubig!(0o177), UBig::from(0o177u32));
  397. assert_eq!(
  398. format!(
  399. "{:x}",
  400. ubig!(_0x1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)
  401. ),
  402. "1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
  403. );
  404. assert_eq!(ubig!(100 base 32), UBig::from(1024u32));
  405. assert_eq!(
  406. format!("{}", ubig!(ppppppppppppppppppp base 32).in_radix(32)),
  407. "ppppppppppppppppppp"
  408. );
  409. assert_eq!(ibig!(17), IBig::from(17i32));
  410. assert_eq!(ibig!(-17), IBig::from(-17i32));
  411. assert_eq!(ibig!(0b101), IBig::from(0b101i32));
  412. assert_eq!(ibig!(-0b101), IBig::from(-0b101i32));
  413. assert_eq!(ibig!(0o177), IBig::from(0o177i32));
  414. assert_eq!(ibig!(-0o177), IBig::from(-0o177i32));
  415. assert_eq!(ibig!(0x1ff), IBig::from(0x1ffi32));
  416. assert_eq!(ibig!(-0x1ff), IBig::from(-0x1ffi32));
  417. assert_eq!(
  418. format!(
  419. "{:x}",
  420. ibig!(-_0x1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)
  421. ),
  422. "-1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
  423. );
  424. assert_eq!(ibig!(100 base 32), IBig::from(1024i32));
  425. assert_eq!(ibig!(-100 base 32), IBig::from(-1024i32));
  426. assert_eq!(
  427. format!("{}", ibig!(ppppppppppppppppppp base 32).in_radix(32)),
  428. "ppppppppppppppppppp"
  429. );
  430. assert_eq!(
  431. format!("{}", ibig!(-ppppppppppppppppppp base 32).in_radix(32)),
  432. "-ppppppppppppppppppp"
  433. );
  434. }