Skip to content

Commit 10b17b4

Browse files
cfflsnielstron
authored andcommitted
Fix failed tests
1 parent 8d9daf1 commit 10b17b4

File tree

3 files changed

+78
-37
lines changed

3 files changed

+78
-37
lines changed

pycardano/serialization.py

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
__all__ = [
5353
"default_encoder",
5454
"IndefiniteList",
55+
"IndefiniteFrozenList",
5556
"Primitive",
5657
"CBORBase",
5758
"CBORSerializable",
@@ -199,7 +200,7 @@ def decode_array(self, subtype: int) -> Sequence[Any]:
199200
length = self._decode_length(subtype, allow_indefinite=True)
200201

201202
if length is None:
202-
ret = IndefiniteFrozenList(cast(Primitive, self.decode_array(subtype=subtype)))
203+
ret = IndefiniteFrozenList(list(self.decode_array(subtype=subtype)))
203204
ret.freeze()
204205
return ret
205206
else:
@@ -325,20 +326,27 @@ def _dfs(value, freeze=False):
325326
return _set
326327
elif isinstance(value, tuple):
327328
return tuple(_dfs(v, freeze) for v in value)
328-
elif isinstance(value, list):
329+
elif isinstance(
330+
value, (IndefiniteFrozenList, FrozenList, IndefiniteList, list)
331+
):
329332
_list = [_dfs(v, freeze) for v in value]
330-
if freeze:
331-
fl = FrozenList(_list)
332-
fl.freeze()
333-
return fl
334-
return _list
335-
elif isinstance(value, IndefiniteList):
336-
_list = [_dfs(v, freeze) for v in value]
337-
if freeze:
338-
fl = IndefiniteFrozenList(_list)
339-
fl.freeze()
340-
return fl
341-
return IndefiniteList(_list)
333+
334+
already_frozen = isinstance(value, (IndefiniteFrozenList, FrozenList))
335+
should_freeze = already_frozen or freeze
336+
337+
if not should_freeze:
338+
return (
339+
IndefiniteList(_list)
340+
if isinstance(value, IndefiniteList)
341+
else _list
342+
)
343+
344+
is_indefinite = isinstance(
345+
value, (IndefiniteFrozenList, IndefiniteList)
346+
)
347+
fl = IndefiniteFrozenList(_list) if is_indefinite else FrozenList(_list)
348+
fl.freeze()
349+
return fl
342350
elif isinstance(value, CBORTag):
343351
return CBORTag(value.tag, _dfs(value.value, freeze))
344352
else:
@@ -1188,7 +1196,10 @@ def __eq__(self, other: object) -> bool:
11881196
def __repr__(self) -> str:
11891197
return f"{self.__class__.__name__}({list(self)})"
11901198

1191-
def to_shallow_primitive(self) -> Union[CBORTag, Union[List[T], IndefiniteList]]:
1199+
def to_shallow_primitive(
1200+
self,
1201+
) -> Union[CBORTag, List[T], IndefiniteList, FrozenList, IndefiniteFrozenList]:
1202+
fields: Union[IndefiniteFrozenList, FrozenList]
11921203
if self._is_indefinite_list:
11931204
fields = IndefiniteFrozenList(list(self))
11941205
else:
@@ -1230,6 +1241,9 @@ def from_primitive(
12301241
def __deepcopy__(self, memo):
12311242
return self.__class__(deepcopy(list(self), memo), use_tag=self._use_tag)
12321243

1244+
def __hash__(self):
1245+
return hash(self.to_shallow_primitive())
1246+
12331247

12341248
class NonEmptyOrderedSet(OrderedSet[T]):
12351249
def __init__(

test/pycardano/test_serialization.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@
2121
import cbor2
2222
import pytest
2323
from cbor2 import CBORTag
24+
from frozenlist import FrozenList
2425

2526
from pycardano import (
2627
CBORBase,
2728
Datum,
29+
IndefiniteFrozenList,
2830
MultiAsset,
2931
Primitive,
3032
RawPlutusData,
@@ -618,8 +620,8 @@ def test_ordered_set():
618620
# Test serialization without tag
619621
s = OrderedSet([1, 2, 3], use_tag=False)
620622
primitive = s.to_primitive()
621-
assert isinstance(primitive, list)
622-
assert primitive == [1, 2, 3]
623+
assert isinstance(primitive, (list, FrozenList))
624+
assert list(primitive) == [1, 2, 3]
623625

624626
# Test serialization with tag
625627
s = OrderedSet([1, 2, 3], use_tag=True)
@@ -695,8 +697,10 @@ def test_non_empty_ordered_set():
695697
# Test serialization without tag
696698
s = NonEmptyOrderedSet([1, 2, 3], use_tag=False)
697699
primitive = s.to_primitive()
698-
assert isinstance(primitive, list)
699-
assert primitive == [1, 2, 3]
700+
from frozenlist import FrozenList
701+
702+
assert isinstance(primitive, (list, FrozenList))
703+
assert list(primitive) == [1, 2, 3]
700704

701705
# Test serialization with tag
702706
s = NonEmptyOrderedSet([1, 2, 3], use_tag=True)
@@ -1050,3 +1054,16 @@ def to_shallow_primitive(self) -> Union[Primitive, CBORSerializable]:
10501054

10511055
with pytest.raises(IOError):
10521056
test1.save(f.name)
1057+
1058+
1059+
def test_ordered_set_as_key_in_dict():
1060+
a = NonEmptyOrderedSet([1, 2, 3])
1061+
1062+
class MyTest(DictCBORSerializable):
1063+
KEY_TYPE = NonEmptyOrderedSet
1064+
VALUE_TYPE = int
1065+
1066+
d = MyTest()
1067+
d[a] = 1
1068+
1069+
check_two_way_cbor(d)

test/pycardano/test_txbuilder.py

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import pytest
1010
from cbor2 import CBORTag
11+
from frozenlist import FrozenList
1112

1213
from pycardano import (
1314
AssetName,
@@ -69,6 +70,13 @@
6970
from pycardano.witness import TransactionWitnessSet, VerificationKeyWitness
7071

7172

73+
def frozen_list(items):
74+
"""Helper function to create a frozen list from items."""
75+
fl = FrozenList(items)
76+
fl.freeze()
77+
return fl
78+
79+
7280
def test_tx_builder(chain_context):
7381
tx_builder = TransactionBuilder(chain_context, [RandomImproveMultiAsset([0, 0])])
7482
sender = "addr_test1vrm9x2zsux7va6w892g38tvchnzahvcd9tykqf3ygnmwtaqyfg52x"
@@ -82,7 +90,7 @@ def test_tx_builder(chain_context):
8290
tx_body = tx_builder.build(change_address=sender_address)
8391

8492
expected = {
85-
0: CBORTag(258, [[b"11111111111111111111111111111111", 0]]),
93+
0: CBORTag(258, frozen_list([[b"11111111111111111111111111111111", 0]])),
8694
1: [
8795
# First output
8896
[sender_address.to_primitive(), 500000],
@@ -126,7 +134,7 @@ def test_tx_builder_with_certain_input(chain_context):
126134
tx_body = tx_builder.build(change_address=sender_address)
127135

128136
expected = {
129-
0: CBORTag(258, [[b"2" * 32, 1]]),
137+
0: CBORTag(258, frozen_list([[b"2" * 32, 1]])),
130138
1: [
131139
# First output
132140
[sender_address.to_primitive(), 500000],
@@ -296,7 +304,7 @@ def test_tx_builder_with_potential_inputs(chain_context):
296304
tx_body = tx_builder.build(change_address=sender_address)
297305

298306
expect = {
299-
0: CBORTag(258, [[b"11111111111111111111111111111111", 3]]),
307+
0: CBORTag(258, frozen_list([[b"11111111111111111111111111111111", 3]])),
300308
1: [
301309
# First output
302310
[sender_address.to_primitive(), 2500000],
@@ -397,10 +405,12 @@ def test_tx_builder_mint_multi_asset(chain_context):
397405
expected = {
398406
0: CBORTag(
399407
258,
400-
[
401-
[b"11111111111111111111111111111111", 0],
402-
[b"22222222222222222222222222222222", 1],
403-
],
408+
frozen_list(
409+
[
410+
[b"11111111111111111111111111111111", 0],
411+
[b"22222222222222222222222222222222", 1],
412+
]
413+
),
404414
),
405415
1: [
406416
# First output
@@ -420,7 +430,7 @@ def test_tx_builder_mint_multi_asset(chain_context):
420430
3: 123456789,
421431
8: 1000,
422432
9: mint,
423-
14: CBORTag(258, [sender_address.payment_part.to_primitive()]),
433+
14: CBORTag(258, frozen_list([sender_address.payment_part.to_primitive()])),
424434
}
425435

426436
assert expected == tx_body.to_primitive()
@@ -1310,7 +1320,7 @@ def test_excluded_input(chain_context):
13101320
tx_body = tx_builder.build(change_address=sender_address)
13111321

13121322
expected = {
1313-
0: CBORTag(258, [[b"22222222222222222222222222222222", 1]]),
1323+
0: CBORTag(258, frozen_list([[b"22222222222222222222222222222222", 1]])),
13141324
1: [
13151325
# First output
13161326
[sender_address.to_primitive(), 500000],
@@ -1448,7 +1458,7 @@ def test_tx_builder_exact_fee_no_change(chain_context):
14481458
tx = tx_builder.build_and_sign([SK])
14491459

14501460
expected = {
1451-
0: CBORTag(258, [[b"11111111111111111111111111111111", 3]]),
1461+
0: CBORTag(258, frozen_list([[b"11111111111111111111111111111111", 3]])),
14521462
1: [
14531463
[sender_address.to_primitive(), 9835951],
14541464
],
@@ -1484,7 +1494,7 @@ def test_tx_builder_certificates(chain_context):
14841494
tx_body = tx_builder.build(change_address=sender_address)
14851495

14861496
expected = {
1487-
0: CBORTag(258, [[b"11111111111111111111111111111111", 0]]),
1497+
0: CBORTag(258, frozen_list([[b"11111111111111111111111111111111", 0]])),
14881498
1: [
14891499
# First output
14901500
[sender_address.to_primitive(), 500000],
@@ -1603,7 +1613,7 @@ def test_tx_builder_stake_pool_registration(chain_context, pool_params):
16031613
tx_body = tx_builder.build(change_address=sender_address)
16041614

16051615
expected = {
1606-
0: CBORTag(258, [[b"22222222222222222222222222222222", 2]]),
1616+
0: CBORTag(258, frozen_list([[b"22222222222222222222222222222222", 2]])),
16071617
1: [
16081618
[
16091619
b"`\xf6S(P\xe1\xbc\xce\xe9\xc7*\x91\x13\xad\x98\xbc\xc5\xdb\xb3\r*\xc9`&$D\xf6\xe5\xf4",
@@ -1659,7 +1669,7 @@ def test_tx_builder_withdrawal(chain_context):
16591669
tx_body = tx_builder.build(change_address=sender_address)
16601670

16611671
expected = {
1662-
0: CBORTag(258, [[b"11111111111111111111111111111111", 0]]),
1672+
0: CBORTag(258, frozen_list([[b"11111111111111111111111111111111", 0]])),
16631673
1: [
16641674
# First output
16651675
[sender_address.to_primitive(), 500000],
@@ -1694,7 +1704,7 @@ def test_tx_builder_no_output(chain_context):
16941704
)
16951705

16961706
expected = {
1697-
0: CBORTag(258, [[b"11111111111111111111111111111111", 3]]),
1707+
0: CBORTag(258, frozen_list([[b"11111111111111111111111111111111", 3]])),
16981708
1: [
16991709
[sender_address.to_primitive(), 9835951],
17001710
],
@@ -1724,7 +1734,7 @@ def test_tx_builder_merge_change_to_output(chain_context):
17241734
)
17251735

17261736
expected = {
1727-
0: CBORTag(258, [[b"11111111111111111111111111111111", 3]]),
1737+
0: CBORTag(258, frozen_list([[b"11111111111111111111111111111111", 3]])),
17281738
1: [
17291739
[sender_address.to_primitive(), 9835951],
17301740
],
@@ -1758,7 +1768,7 @@ def test_tx_builder_merge_change_to_output_2(chain_context):
17581768
)
17591769

17601770
expected = {
1761-
0: CBORTag(258, [[b"11111111111111111111111111111111", 3]]),
1771+
0: CBORTag(258, frozen_list([[b"11111111111111111111111111111111", 3]])),
17621772
1: [
17631773
[sender_address.to_primitive(), 10000],
17641774
[receiver_address.to_primitive(), 10000],
@@ -1790,7 +1800,7 @@ def test_tx_builder_merge_change_to_zero_amount_output(chain_context):
17901800
)
17911801

17921802
expected = {
1793-
0: CBORTag(258, [[b"11111111111111111111111111111111", 3]]),
1803+
0: CBORTag(258, frozen_list([[b"11111111111111111111111111111111", 3]])),
17941804
1: [
17951805
[sender_address.to_primitive(), 9835951],
17961806
],
@@ -1820,7 +1830,7 @@ def test_tx_builder_merge_change_smaller_than_min_utxo(chain_context):
18201830
)
18211831

18221832
expected = {
1823-
0: CBORTag(258, [[b"11111111111111111111111111111111", 3]]),
1833+
0: CBORTag(258, frozen_list([[b"11111111111111111111111111111111", 3]])),
18241834
1: [
18251835
[sender_address.to_primitive(), 9835951],
18261836
],

0 commit comments

Comments
 (0)