{-# LANGUAGE OverloadedStrings #-} -- | -- Module : Data.BigNum.Test.BigNumSpec -- Copyright : Aleksandr Krupenkin 2016-2021 -- License : Apache-2.0 -- -- Maintainer : mail@akru.me -- Stability : experimental -- Portability : unportable -- module Data.BigNum.Test.BigNumSpec where import Codec.Scale (decode, encode) import Control.Monad (forM_) import Data.ByteArray.HexString (HexString) import Data.WideWord.Word128 (Word128) import Data.WideWord.Word256 (Word256) import Test.Hspec import Data.BigNum (H160, H256, H512) u128_TEST_VECTORS :: [(Word128, HexString)] u128_TEST_VECTORS = [ (112009765980327865299926170522124675408, "0x50e91990a464634b4fe24828d64b4454") , (284084896039402088792232799153441440599, "0x5783434bc168dc9331cef7fcc3c2b8d5") , (259870372860522542774055759705813848487, "0xa791e84af817d01353bcae32993681c3") , (12195993515186872808127827346567397926, "0x26025bf77f3914a9da0759c0e7dc2c09") , (120025979845686107711254958532305515398, "0x867322183592cf181bfd17c7b1294c5a") , (219406308864564522421661310403439556264, "0xa8f6fcd0af3848558244edc0361e10a5") , (257335103778365857895651839673319875231, "0x9fe2f88b84b84d90e69d81962ef098c1") , (68063227844806979300641114110617889264, "0xf0a9ee1480f359800fba8b7a38803433") , (216514484839331230802109899459159104812, "0x2c9d37bee2fc84f8353ba10f482ce3a2") , (178182877230765595416853642944570021919, "0x1f587d791c7dacaddc9cfd3b1dc60c86") , (290335692238486144820126784978954757396, "0x1425c4fd2f1831eac24a9ef4cf9e6cda") , (165504207802320373299850049582381567447, "0xd78d3e18fb99c252d9f20af572f3827c") , (47856636672191714454008687982296341606, "0x669c2e67a9bea69ff13aef9d5bda0024") , (19215563179501177476867447612060366546, "0xd276ae113fdcf62025309b0669c8740e") , (246485718903164524585854064597022275963, "0x7bf9c3072aaa0ad131067568356c6fb9") , (197733884573414826455307878816376246254, "0xee4ff5745a481cb00cf2d6d63229c294") , (149607475627327219754848974470897887087, "0x6f67a69790aa6b881db0546b0a5a8d70") , (174701307382434508318829001328589289972, "0xf4399c820a79a567d4f390c2773f6e83") , (72595801292461450864588564249737801167, "0xcfaddd2c4b20d8921f24745d58719d36") , (68514076502642919617157448984759680837, "0x45bf3cc99096452a982b6990c6548b33") , (216419667485302883317463919550598457261, "0xada77bf03e963b0fd16727cd6ce9d0a2") , (116229821064613393178522103562599386123, "0x0bccdb74c7f7a3c2afb443bd9d0c7157") , (135932484144247690375718666021027537778, "0x72633955ae336d73c58605dbe7a44366") , (30075132366243141139951812090788233488, "0x10c1c6c0cf467e0fe1630a4a8242a016") , (110760648836374947274219482463927908576, "0xe0b8c1e1f3221e3cbc6b4b439bb95353") , (6493109780355214426871710723177871150, "0x2e7712cb1d7b9819004830580787e204") , (155255127434882774479428817682909336706, "0x8294132da02c8966a7b450e5c50ccd74") , (249558934561135206340751629864009659619, "0xe3f46e4bfe10c0cbcac4d861704dbfbb") , (221130490312110890453383188394454522854, "0xe69bb71f38105bc2ff3c3b27ec2e5ca6") , (330501820625969513409631107753191338114, "0x82f05ac2614f264cae56d056d655a4f8") , (223256840663930369967277834345880002356, "0x349ff07d428288010a9f53c416b4f5a7") , (117046551608311569426455411751697532077, "0xad4480fbf4dceacc06bbc6798a580e58") ] u256_TEST_VECTORS :: [(Word256, HexString)] u256_TEST_VECTORS = [ (115246322816974817869522522728228591410688, "0x009e4a73c70170d062c7cfaacc68b2ad52010000000000000000000000000000") , (135938608309138943912299509830613133361152, "0x00003bcac38e0e88ff4be1b553a2d77c8f010000000000000000000000000000") , (162382544235100656091613459421755842104320, "0x000c62040d9eb5402b77a94756700c33dd010000000000000000000000000000") , (87401399458010888206718906820085474987520, "0x000e25d50cdf0ebc4288bb79603d81d900010000000000000000000000000000") , (138984606683918062873256075229427703132672, "0x00b2865449543d0bc4aee7630795657098010000000000000000000000000000") , (80840810280826333065693090387807395201024, "0x00402505c662fed033657fec8eb9dd91ed000000000000000000000000000000") , (111243980175912604792124852175079091625472, "0x005e221ba2a0291b64cadf565f41abea46010000000000000000000000000000") , (68346726659358296375267195304703356056576, "0x00342cd4bdd4aae9d473a64f56bf5cdac8000000000000000000000000000000") , (106449215354720188380210893871836123739136, "0x00b469f4f9e50e3c9692eca70c247dd338010000000000000000000000000000") , (78137755955119804750893895610892995805184, "0x0040900a46fc58e6681fea1beb6550a0e5000000000000000000000000000000") , (37198705638330423439614376452234760232960, "0x002001f5e1b489daa201e473ae1b32516d000000000000000000000000000000") , (44433624903109480313359576650777141679616, "0x0096d7f1e43651f716e5dc15b5df249482000000000000000000000000000000") , (148514051583354372738620167945095771152896, "0x0062a572ce8903fc0bb00b5c21e98d71b4010000000000000000000000000000") , (60014954218248357909848828065675948796928, "0x002cff0f0bf45b444adacc7a76be3b5eb0000000000000000000000000000000") , (115991051230925873672644713804764031319040, "0x007ca1f34f6509f519e1fe0979e2f7dd54010000000000000000000000000000") , (128993277087652314984111615353153713316352, "0x00a2db3ff8e4ce7452a7afa42c7fc1137b010000000000000000000000000000") , (79341042577632633961867710129661883276800, "0x005e51f8c00556a267f89b85cff89029e9000000000000000000000000000000") , (107155234040248837193602796138479639672832, "0x0038b9433d32cd48b3b6ab8fc264a3e63a010000000000000000000000000000") , (9692096688234458500324617381072327939072, "0x0014383881662b212547f6856fec857b1c000000000000000000000000000000") , (153508611663790194252674464693195110905856, "0x0078e84497d0ae7ee3b3c51745310b1fc3010000000000000000000000000000") , (82797952396630935803342482248562500762624, "0x00fcc41b53fdb9f05f5023d7e0954152f3000000000000000000000000000000") , (42485067285891128074395084374077297656832, "0x00042093afeaf2b88943f460d85336da7c000000000000000000000000000000") , (86450357619452627268531966540825354464768, "0x006e167391f2a026579817c9853e050efe000000000000000000000000000000") , (66917117614349947545091673512474456381440, "0x0058f0bdece2a5fa4d8e9b97800fd8a6c4000000000000000000000000000000") , (41855199301039963483087569366097332165632, "0x005c7e1023c40c3df8c71c308d2a5a007b000000000000000000000000000000") , (79447692753915387681092309048730281646080, "0x00184905865a4f806b933431790ccd79e9000000000000000000000000000000") , (64972869997286725725114985545674517793792, "0x004c362af3a5b3855e591bde0d9727f0be000000000000000000000000000000") , (142291599105260490990206148836714458533888, "0x00500eb253aef52349907156b8274d28a2010000000000000000000000000000") , (131059754944904136287166865738657526588416, "0x00246ac6cc16ea922048cd18bea7662681010000000000000000000000000000") , (86851548177794395407641645798830201528832, "0x00624a9b253533261c8d6a1936bcd73bff000000000000000000000000000000") , (119121986710264787758595765725140587452416, "0x00187946fbafb3f21928d1c1bf1f6c115e010000000000000000000000000000") , (75287059147291008379624862024819049134592, "0x007a9e91c390ec87c0b8e9c1e529b03fdd000000000000000000000000000000") ] h160_TEST_VECTORS :: [(H160, HexString)] h160_TEST_VECTORS = [ ("0x52908400098527886E0F7030069857D2E4169EE7", "0x52908400098527886E0F7030069857D2E4169EE7") , ("0x8617E340B3D01FA5F11F306F4090FD50E238070D", "0x8617E340B3D01FA5F11F306F4090FD50E238070D") , ("0xde709f2102306220921060314715629080e2fb77", "0xde709f2102306220921060314715629080e2fb77") , ("0x27b1fdb04752bbc536007a920d24acb045561c26", "0x27b1fdb04752bbc536007a920d24acb045561c26") , ("0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed", "0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed") , ("0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359", "0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359") , ("0xdbF03B407c01E7cD3CBea99509d93f8DDDC8C6FB", "0xdbF03B407c01E7cD3CBea99509d93f8DDDC8C6FB") , ("0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb", "0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb") ] h256_TEST_VECTORS :: [(H256, HexString)] h256_TEST_VECTORS = [ ("0xfe700a084ea8882a6661724f3f3277ef5ea9df17cd5291f80c492e537b868518", "0xfe700a084ea8882a6661724f3f3277ef5ea9df17cd5291f80c492e537b868518") , ("0xabeedc76bd314edcca6c7fedc0414d05a4979bbd8e17fd4f5d300a9afd953b24", "0xabeedc76bd314edcca6c7fedc0414d05a4979bbd8e17fd4f5d300a9afd953b24") , ("0xf1555b382428aeadafa3b9cf4bbd4811d1dac92941c1d741078923844e867c33", "0xf1555b382428aeadafa3b9cf4bbd4811d1dac92941c1d741078923844e867c33") , ("0xd959976b19068248aa287290ae7f1c363fcab571c1775dfa16291ecf97d38e11", "0xd959976b19068248aa287290ae7f1c363fcab571c1775dfa16291ecf97d38e11") , ("0x2fd7571b66c46c901984e148071b8fe30a5a65cc4a08c3f98b4a753abce3e40b", "0x2fd7571b66c46c901984e148071b8fe30a5a65cc4a08c3f98b4a753abce3e40b") , ("0xb09d4a38b291296c08a1b369ca898bfe594fa64bcc942ee5ce18511edb9bbd42", "0xb09d4a38b291296c08a1b369ca898bfe594fa64bcc942ee5ce18511edb9bbd42") , ("0x9afd0350d2b7c8d3972478bf76c9c782d587ff3918524ed5de7753cf75386253", "0x9afd0350d2b7c8d3972478bf76c9c782d587ff3918524ed5de7753cf75386253") , ("0xebaf4fcbaa6375fa7b6e5fc96166c34ee774221f2f641fdc1b13300306a54b66", "0xebaf4fcbaa6375fa7b6e5fc96166c34ee774221f2f641fdc1b13300306a54b66") , ("0x49f7d9bda63d100a60e72b3b5df09f7b19bbe4bf7bb8fd6009ab3bf74c38b4f5", "0x49f7d9bda63d100a60e72b3b5df09f7b19bbe4bf7bb8fd6009ab3bf74c38b4f5") , ("0x71b4b1615d1c35332d222abd08008c881aa28975e0f4088ba412fcd6b506eb30", "0x71b4b1615d1c35332d222abd08008c881aa28975e0f4088ba412fcd6b506eb30") , ("0xc850252c4c0a14ca0a55bc04077b998139d741ac3ed88db628e02468f3fcc3e6", "0xc850252c4c0a14ca0a55bc04077b998139d741ac3ed88db628e02468f3fcc3e6") , ("0x0ae755268da527700201a1b042655f3fde1d9f4bfe990be1998b683d3d5c6597", "0x0ae755268da527700201a1b042655f3fde1d9f4bfe990be1998b683d3d5c6597") , ("0xf8caf1ee78b44e90d5dfd99cdcbe0f3b0d45b7d964ce93f60ecfa9af0dc4d1ee", "0xf8caf1ee78b44e90d5dfd99cdcbe0f3b0d45b7d964ce93f60ecfa9af0dc4d1ee") , ("0xb9ccbe3823df8602145555f2c6e2e33cfc1cad5c6e053f929c68324a3627d59a", "0xb9ccbe3823df8602145555f2c6e2e33cfc1cad5c6e053f929c68324a3627d59a") ] h512_TEST_VECTORS :: [(H512, HexString)] h512_TEST_VECTORS = [ ("0xfe700a084ea8882a6661724f3f3277ef5ea9df17cd5291f80c492e537b868518fe700a084ea8882a6661724f3f3277ef5ea9df17cd5291f80c492e537b868518", "0xfe700a084ea8882a6661724f3f3277ef5ea9df17cd5291f80c492e537b868518fe700a084ea8882a6661724f3f3277ef5ea9df17cd5291f80c492e537b868518") , ("0xabeedc76bd314edcca6c7fedc0414d05a4979bbd8e17fd4f5d300a9afd953b24abeedc76bd314edcca6c7fedc0414d05a4979bbd8e17fd4f5d300a9afd953b24", "0xabeedc76bd314edcca6c7fedc0414d05a4979bbd8e17fd4f5d300a9afd953b24abeedc76bd314edcca6c7fedc0414d05a4979bbd8e17fd4f5d300a9afd953b24") , ("0xf1555b382428aeadafa3b9cf4bbd4811d1dac92941c1d741078923844e867c33f1555b382428aeadafa3b9cf4bbd4811d1dac92941c1d741078923844e867c33", "0xf1555b382428aeadafa3b9cf4bbd4811d1dac92941c1d741078923844e867c33f1555b382428aeadafa3b9cf4bbd4811d1dac92941c1d741078923844e867c33") , ("0xd959976b19068248aa287290ae7f1c363fcab571c1775dfa16291ecf97d38e11d959976b19068248aa287290ae7f1c363fcab571c1775dfa16291ecf97d38e11", "0xd959976b19068248aa287290ae7f1c363fcab571c1775dfa16291ecf97d38e11d959976b19068248aa287290ae7f1c363fcab571c1775dfa16291ecf97d38e11") , ("0x2fd7571b66c46c901984e148071b8fe30a5a65cc4a08c3f98b4a753abce3e40b2fd7571b66c46c901984e148071b8fe30a5a65cc4a08c3f98b4a753abce3e40b", "0x2fd7571b66c46c901984e148071b8fe30a5a65cc4a08c3f98b4a753abce3e40b2fd7571b66c46c901984e148071b8fe30a5a65cc4a08c3f98b4a753abce3e40b") , ("0xb09d4a38b291296c08a1b369ca898bfe594fa64bcc942ee5ce18511edb9bbd42b09d4a38b291296c08a1b369ca898bfe594fa64bcc942ee5ce18511edb9bbd42", "0xb09d4a38b291296c08a1b369ca898bfe594fa64bcc942ee5ce18511edb9bbd42b09d4a38b291296c08a1b369ca898bfe594fa64bcc942ee5ce18511edb9bbd42") , ("0x9afd0350d2b7c8d3972478bf76c9c782d587ff3918524ed5de7753cf753862539afd0350d2b7c8d3972478bf76c9c782d587ff3918524ed5de7753cf75386253", "0x9afd0350d2b7c8d3972478bf76c9c782d587ff3918524ed5de7753cf753862539afd0350d2b7c8d3972478bf76c9c782d587ff3918524ed5de7753cf75386253") , ("0xebaf4fcbaa6375fa7b6e5fc96166c34ee774221f2f641fdc1b13300306a54b66ebaf4fcbaa6375fa7b6e5fc96166c34ee774221f2f641fdc1b13300306a54b66", "0xebaf4fcbaa6375fa7b6e5fc96166c34ee774221f2f641fdc1b13300306a54b66ebaf4fcbaa6375fa7b6e5fc96166c34ee774221f2f641fdc1b13300306a54b66") , ("0x49f7d9bda63d100a60e72b3b5df09f7b19bbe4bf7bb8fd6009ab3bf74c38b4f549f7d9bda63d100a60e72b3b5df09f7b19bbe4bf7bb8fd6009ab3bf74c38b4f5", "0x49f7d9bda63d100a60e72b3b5df09f7b19bbe4bf7bb8fd6009ab3bf74c38b4f549f7d9bda63d100a60e72b3b5df09f7b19bbe4bf7bb8fd6009ab3bf74c38b4f5") , ("0x71b4b1615d1c35332d222abd08008c881aa28975e0f4088ba412fcd6b506eb3071b4b1615d1c35332d222abd08008c881aa28975e0f4088ba412fcd6b506eb30", "0x71b4b1615d1c35332d222abd08008c881aa28975e0f4088ba412fcd6b506eb3071b4b1615d1c35332d222abd08008c881aa28975e0f4088ba412fcd6b506eb30") , ("0xc850252c4c0a14ca0a55bc04077b998139d741ac3ed88db628e02468f3fcc3e6c850252c4c0a14ca0a55bc04077b998139d741ac3ed88db628e02468f3fcc3e6", "0xc850252c4c0a14ca0a55bc04077b998139d741ac3ed88db628e02468f3fcc3e6c850252c4c0a14ca0a55bc04077b998139d741ac3ed88db628e02468f3fcc3e6") , ("0x0ae755268da527700201a1b042655f3fde1d9f4bfe990be1998b683d3d5c65970ae755268da527700201a1b042655f3fde1d9f4bfe990be1998b683d3d5c6597", "0x0ae755268da527700201a1b042655f3fde1d9f4bfe990be1998b683d3d5c65970ae755268da527700201a1b042655f3fde1d9f4bfe990be1998b683d3d5c6597") , ("0xf8caf1ee78b44e90d5dfd99cdcbe0f3b0d45b7d964ce93f60ecfa9af0dc4d1eef8caf1ee78b44e90d5dfd99cdcbe0f3b0d45b7d964ce93f60ecfa9af0dc4d1ee", "0xf8caf1ee78b44e90d5dfd99cdcbe0f3b0d45b7d964ce93f60ecfa9af0dc4d1eef8caf1ee78b44e90d5dfd99cdcbe0f3b0d45b7d964ce93f60ecfa9af0dc4d1ee") , ("0xb9ccbe3823df8602145555f2c6e2e33cfc1cad5c6e053f929c68324a3627d59ab9ccbe3823df8602145555f2c6e2e33cfc1cad5c6e053f929c68324a3627d59a", "0xb9ccbe3823df8602145555f2c6e2e33cfc1cad5c6e053f929c68324a3627d59ab9ccbe3823df8602145555f2c6e2e33cfc1cad5c6e053f929c68324a3627d59a") ] spec :: Spec spec = parallel $ do describe "SCALE tests" $ do it "u128 test vectors" $ forM_ u128_TEST_VECTORS $ \(x, l) -> do encode x `shouldBe` l decode l `shouldBe` Right x it "u256 test vectors" $ forM_ u256_TEST_VECTORS $ \(x, l) -> do encode x `shouldBe` l decode l `shouldBe` Right x it "H160 test vectors" $ forM_ h160_TEST_VECTORS $ \(x, l) -> do encode x `shouldBe` l decode l `shouldBe` Right x it "H256 test vectors" $ forM_ h256_TEST_VECTORS $ \(x, l) -> do encode x `shouldBe` l decode l `shouldBe` Right x it "H512 test vectors" $ forM_ h512_TEST_VECTORS $ \(x, l) -> do encode x `shouldBe` l decode l `shouldBe` Right x