commit 8a647b36107f5da8312c3f992828c276d58bf490
parent 8701b155269e1353824d10530363a8de484dd691
Author: Jared Tobin <jared@jtobin.io>
Date: Sun, 19 Jan 2025 14:16:41 +0400
test: cleanup
Diffstat:
M | test/Main.hs | | | 84 | ++++++++++++++++++++++++++++++++++++++++++++++--------------------------------- |
1 file changed, 49 insertions(+), 35 deletions(-)
diff --git a/test/Main.hs b/test/Main.hs
@@ -29,65 +29,62 @@ bytes k = do
instance Q.Arbitrary BS where
arbitrary = do
- b <- bytes 10_000
+ b <- bytes 20_000
pure (BS b)
instance Q.Arbitrary BA.ByteArray where
arbitrary = do
- b <- bytes 10_000
+ b <- bytes 20_000
pure (bs_to_ba b)
-instance Q.Arbitrary Script where
+-- generated scripts will tend to be pathological due to pushdata
+newtype RawScript = RawScript Script
+ deriving (Eq, Show)
+
+instance Q.Arbitrary RawScript where
+ arbitrary = fmap (RawScript . Script) Q.arbitrary
+
+-- will contain no or carefully-inserted pushdata opcodes
+newtype ValidRedeemScript = ValidRedeemScript Script
+ deriving (Eq, Show)
+
+instance Q.Arbitrary ValidRedeemScript where
arbitrary = do
l <- Q.chooseInt (0, _MAX_REDEEM_SCRIPT_SIZE)
-- pushdata must be added with care; easy to blow up quickcheck
bs <- fmap BS.pack (Q.vectorOf l (Q.chooseEnum (100, 255)))
- pure (Script (bs_to_ba bs))
+ pure (ValidRedeemScript (Script (bs_to_ba bs)))
-- properties -----------------------------------------------------------------
ba_to_bs_inverts_bs_to_ba :: BS -> Bool
ba_to_bs_inverts_bs_to_ba (BS bs) = ba_to_bs (bs_to_ba bs) == bs
-from_base16_inverts_to_base16 :: Script -> Bool
-from_base16_inverts_to_base16 s =
+-- to_base16 should work on every script, pathological or no
+from_base16_inverts_to_base16 :: RawScript -> Bool
+from_base16_inverts_to_base16 (RawScript s) =
let mscript = from_base16 (to_base16 s)
in case mscript of
Nothing -> False
Just script -> script == s
-to_script_inverts_from_script :: Script -> Bool
-to_script_inverts_from_script s =
+-- we can only use 'from_script' on non-pathological scripts
+to_script_inverts_from_script :: ValidRedeemScript -> Bool
+to_script_inverts_from_script (ValidRedeemScript s) =
let !terms = from_script s
!script = to_script terms
in script == s
--- main -----------------------------------------------------------------------
+-- assertions -----------------------------------------------------------------
-main :: IO ()
-main = defaultMain $
- testGroup "ppad-script" [
- testGroup "property tests" [
- Q.testProperty "ba_to_bs . bs_to_ba ~ id" $
- Q.withMaxSuccess 500 ba_to_bs_inverts_bs_to_ba
- , Q.testProperty "from_base16 . to_base16 ~ id" $
- Q.withMaxSuccess 500 from_base16_inverts_to_base16
- , Q.testProperty "to_script . from_script ~ id" $
- Q.withMaxSuccess 500 to_script_inverts_from_script
- ]
- , testGroup "unit tests" [
- H.testCase "base16-encoded script decodes to expected terms" $ do
- let mscript = from_base16 script_base16
- case mscript of
- Nothing -> H.assertFailure "invalid bytestring"
- Just script -> do
- let terms = from_script script
- H.assertEqual mempty terms script_terms
-
- ]
- ]
-
--- p2pkh
+base16_encoded_script_decodes_as_expected :: H.Assertion
+base16_encoded_script_decodes_as_expected = do
+ let mscript = from_base16 script_base16
+ case mscript of
+ Nothing -> H.assertFailure "invalid bytestring"
+ Just script -> do
+ let terms = from_script script
+ H.assertEqual mempty terms script_terms
-- https://en.bitcoin.it/wiki/Script#
-- Standard_Transaction_to_Bitcoin_address_(pay-to-pubkey-hash)
@@ -105,8 +102,25 @@ script_terms = [
, OPCODE OP_CHECKSIG
]
--- p2sh
+-- main -----------------------------------------------------------------------
+
+main :: IO ()
+main = defaultMain $
+ testGroup "ppad-script" [
+ testGroup "property tests" [
+ Q.testProperty "ba_to_bs . bs_to_ba ~ id" $
+ Q.withMaxSuccess 500 ba_to_bs_inverts_bs_to_ba
+ , Q.testProperty "from_base16 . to_base16 ~ id" $
+ Q.withMaxSuccess 500 from_base16_inverts_to_base16
+ , Q.testProperty "to_script . from_script ~ id" $
+ Q.withMaxSuccess 1000 to_script_inverts_from_script
+ ]
+ , testGroup "unit tests" [
+ H.testCase "base16-encoded script decodes to expected terms"
+ base16_encoded_script_decodes_as_expected
+ ]
+ ]
redeemscript_base16 :: BS.ByteString
redeemscript_base16 = "5221038282263212c609d9ea2a6e3e172de238d8c39cabe56f3f9e451d2c4c7739ba8721031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f2102b4632d08485ff1df2db55b9dafd23347d1c47a457072a1e87be26896549a873753ae"
---
+