@@ -7,7 +7,7 @@ import Cardano.Api.UTxO qualified as UTxO
7
7
import Data.Map.Strict qualified as Map
8
8
import Data.Set qualified as Set
9
9
import Hydra.Cardano.Api (AssetId (.. ), AssetName , Coin (.. ), PolicyAssets (.. ), PolicyId , Quantity (.. ), UTxO , selectLovelace , txOutValue , valueToPolicyAssets )
10
- import Hydra.Tx.Deposit (capUTxO , pickTokensToDeposit , splitTokens )
10
+ import Hydra.Tx.Deposit (capUTxO , diffAssets , pickTokensToDeposit , splitTokens )
11
11
import Test.Hydra.Tx.Fixture (testPolicyId )
12
12
import Test.Hydra.Tx.Gen (genUTxOSized , genUTxOWithAssetsSized )
13
13
import Test.QuickCheck (Property , chooseInteger , counterexample , cover , elements , forAll , frequency , listOf , oneof , property , (===) , (==>) )
@@ -240,6 +240,77 @@ spec =
240
240
prop " monotonic with respect to target" propMonotonicTarget
241
241
prop " no UTxO loss" propNoUTxOLoss
242
242
243
+ describe " diffAssets" $ do
244
+ describe " tests" $ do
245
+ it " returns empty assets when both inputs are empty" $ do
246
+ let assets = diffAssets mempty mempty
247
+ assets `shouldBe` mempty
248
+ it " returns existing assets when lookup input is empty" $
249
+ forAll arbitrary $ \ assetMap -> do
250
+ let assets = diffAssets assetMap mempty
251
+ assets `shouldBe` Map. toList assetMap
252
+ it " returns empty assets if asset input is empty" $
253
+ forAll arbitrary $ \ lookupMap -> do
254
+ let assets = diffAssets mempty lookupMap
255
+ assets `shouldBe` mempty
256
+ it " subracts found values" $
257
+ forAll arbitrary $ \ aPolicy -> do
258
+ let policyAssets =
259
+ Map. fromList [(" SomeTokenA" , 100 ), (" SomeTokenB" , 200 )]
260
+ let policyAssets' =
261
+ Map. fromList [(" SomeTokenA" , 30 ), (" SomeTokenB" , 50 )]
262
+ let expectedAssets =
263
+ Map. fromList [(" SomeTokenA" , 70 ), (" SomeTokenB" , 150 )]
264
+ let expectedResult =
265
+ Map. fromList [(aPolicy, PolicyAssets expectedAssets)]
266
+
267
+ let a = Map. fromList [(aPolicy, PolicyAssets policyAssets)]
268
+ let b = Map. fromList [(aPolicy, PolicyAssets policyAssets')]
269
+ let assets = diffAssets a b
270
+ assets `shouldBe` Map. toList expectedResult
271
+ it " keeps assets not found in the lookup map" $
272
+ forAll arbitrary $ \ aPolicy -> do
273
+ let policyAssets =
274
+ Map. fromList [(" SomeTokenA" , 100 ), (" SomeTokenC" , 2 )]
275
+ let policyAssets' =
276
+ Map. fromList [(" SomeTokenA" , 30 ), (" SomeTokenB" , 50 )]
277
+ let expectedAssets =
278
+ Map. fromList [(" SomeTokenA" , 70 ), (" SomeTokenC" , 2 )]
279
+ let expectedResult =
280
+ Map. fromList [(aPolicy, PolicyAssets expectedAssets)]
281
+
282
+ let a = Map. fromList [(aPolicy, PolicyAssets policyAssets)]
283
+ let b = Map. fromList [(aPolicy, PolicyAssets policyAssets')]
284
+ let assets = diffAssets a b
285
+ assets `shouldBe` Map. toList expectedResult
286
+ it " ignores extra assets in the lookup map" $
287
+ forAll arbitrary $ \ aPolicy -> do
288
+ let policyAssets =
289
+ Map. fromList [(" SomeTokenA" , 100 ), (" SomeTokenB" , 85 )]
290
+ let policyAssets' =
291
+ Map. fromList [(" SomeTokenA" , 30 ), (" SomeTokenB" , 50 ), (" SomeTokenC" , 400 )]
292
+ let expectedAssets =
293
+ Map. fromList [(" SomeTokenA" , 70 ), (" SomeTokenB" , 35 )]
294
+ let expectedResult =
295
+ Map. fromList [(aPolicy, PolicyAssets expectedAssets)]
296
+
297
+ let a = Map. fromList [(aPolicy, PolicyAssets policyAssets)]
298
+ let b = Map. fromList [(aPolicy, PolicyAssets policyAssets')]
299
+ let assets = diffAssets a b
300
+ assets `shouldBe` Map. toList expectedResult
301
+ it " ignores assets with too low values" $
302
+ forAll arbitrary $ \ aPolicy -> do
303
+ let policyAssets =
304
+ Map. fromList [(" SomeTokenA" , 100 ), (" SomeTokenB" , 85 )]
305
+ let policyAssets' =
306
+ Map. fromList [(" SomeTokenA" , 100 ), (" SomeTokenB" , 86 )]
307
+ let expectedResult = [(aPolicy, mempty )]
308
+
309
+ let a = Map. fromList [(aPolicy, PolicyAssets policyAssets)]
310
+ let b = Map. fromList [(aPolicy, PolicyAssets policyAssets')]
311
+ let assets = diffAssets a b
312
+ assets `shouldBe` expectedResult
313
+
243
314
-- | Property: The sum of selected and leftover values equals the input value
244
315
propPreservesTotalValue :: UTxO -> Coin -> Property
245
316
propPreservesTotalValue utxo target =
0 commit comments