Skip to content

Commit 140e32e

Browse files
committed
Add testing of deeper tuple nesting and arrays
1 parent 7ed0918 commit 140e32e

File tree

2 files changed

+121
-0
lines changed

2 files changed

+121
-0
lines changed

tests/core/contracts/conftest.py

+48
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,54 @@
66
event_signature_to_log_topic,
77
)
88

9+
CONTRACT_NESTED_TUPLE_SOURCE = """
10+
pragma solidity >=0.4.19 <0.6.0;
11+
pragma experimental ABIEncoderV2;
12+
13+
contract Tuple {
14+
struct U { int x; int y; }
15+
struct T { U[] u; }
16+
struct S { T[] t; }
17+
18+
function method(S memory s) public pure returns (S memory) {
19+
return s;
20+
}
21+
}
22+
"""
23+
CONTRACT_NESTED_TUPLE_CODE = '0x608060405234801561001057600080fd5b50610575806100206000396000f300608060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632655aef114610046575b600080fd5b34801561005257600080fd5b5061006d600480360361006891908101906102a2565b610083565b60405161007a919061043e565b60405180910390f35b61008b610093565b819050919050565b602060405190810160405280606081525090565b600082601f83011215156100ba57600080fd5b81356100cd6100c88261048d565b610460565b9150818183526020840193506020810190508360005b8381101561011357813586016100f98882610206565b8452602084019350602083019250506001810190506100e3565b5050505092915050565b600082601f830112151561013057600080fd5b813561014361013e826104b5565b610460565b9150818183526020840193506020810190508385604084028201111561016857600080fd5b60005b83811015610198578161017e8882610256565b84526020840193506040830192505060018101905061016b565b5050505092915050565b60006101ae8235610531565b905092915050565b6000602082840312156101c857600080fd5b6101d26020610460565b9050600082013567ffffffffffffffff8111156101ee57600080fd5b6101fa848285016100a7565b60008301525092915050565b60006020828403121561021857600080fd5b6102226020610460565b9050600082013567ffffffffffffffff81111561023e57600080fd5b61024a8482850161011d565b60008301525092915050565b60006040828403121561026857600080fd5b6102726040610460565b90506000610282848285016101a2565b6000830152506020610296848285016101a2565b60208301525092915050565b6000602082840312156102b457600080fd5b600082013567ffffffffffffffff8111156102ce57600080fd5b6102da848285016101b6565b91505092915050565b60006102ee826104f7565b80845260208401935083602082028501610307856104dd565b60005b848110156103405783830388526103228383516103e5565b925061032d8261050d565b915060208801975060018101905061030a565b508196508694505050505092915050565b600061035c82610502565b80845260208401935061036e836104ea565b60005b828110156103a05761038486835161040f565b61038d8261051a565b9150604086019550600181019050610371565b50849250505092915050565b6103b581610527565b82525050565b600060208301600083015184820360008601526103d882826102e3565b9150508091505092915050565b600060208301600083015184820360008601526104028282610351565b9150508091505092915050565b60408201600082015161042560008501826103ac565b50602082015161043860208501826103ac565b50505050565b6000602082019050818103600083015261045881846103bb565b905092915050565b6000604051905081810181811067ffffffffffffffff8211171561048357600080fd5b8060405250919050565b600067ffffffffffffffff8211156104a457600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156104cc57600080fd5b602082029050602081019050919050565b6000602082019050919050565b6000602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000819050919050565b60008190509190505600a265627a7a7230582011dc176b6cffda1d2e58827bca1a16178776c2d8efcd6adf48bc0223f14f891a6c6578706572696d656e74616cf50037' # noqa: E501
24+
CONTRACT_NESTED_TUPLE_RUNTIME = '0x608060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632655aef114610046575b600080fd5b34801561005257600080fd5b5061006d600480360361006891908101906102a2565b610083565b60405161007a919061043e565b60405180910390f35b61008b610093565b819050919050565b602060405190810160405280606081525090565b600082601f83011215156100ba57600080fd5b81356100cd6100c88261048d565b610460565b9150818183526020840193506020810190508360005b8381101561011357813586016100f98882610206565b8452602084019350602083019250506001810190506100e3565b5050505092915050565b600082601f830112151561013057600080fd5b813561014361013e826104b5565b610460565b9150818183526020840193506020810190508385604084028201111561016857600080fd5b60005b83811015610198578161017e8882610256565b84526020840193506040830192505060018101905061016b565b5050505092915050565b60006101ae8235610531565b905092915050565b6000602082840312156101c857600080fd5b6101d26020610460565b9050600082013567ffffffffffffffff8111156101ee57600080fd5b6101fa848285016100a7565b60008301525092915050565b60006020828403121561021857600080fd5b6102226020610460565b9050600082013567ffffffffffffffff81111561023e57600080fd5b61024a8482850161011d565b60008301525092915050565b60006040828403121561026857600080fd5b6102726040610460565b90506000610282848285016101a2565b6000830152506020610296848285016101a2565b60208301525092915050565b6000602082840312156102b457600080fd5b600082013567ffffffffffffffff8111156102ce57600080fd5b6102da848285016101b6565b91505092915050565b60006102ee826104f7565b80845260208401935083602082028501610307856104dd565b60005b848110156103405783830388526103228383516103e5565b925061032d8261050d565b915060208801975060018101905061030a565b508196508694505050505092915050565b600061035c82610502565b80845260208401935061036e836104ea565b60005b828110156103a05761038486835161040f565b61038d8261051a565b9150604086019550600181019050610371565b50849250505092915050565b6103b581610527565b82525050565b600060208301600083015184820360008601526103d882826102e3565b9150508091505092915050565b600060208301600083015184820360008601526104028282610351565b9150508091505092915050565b60408201600082015161042560008501826103ac565b50602082015161043860208501826103ac565b50505050565b6000602082019050818103600083015261045881846103bb565b905092915050565b6000604051905081810181811067ffffffffffffffff8211171561048357600080fd5b8060405250919050565b600067ffffffffffffffff8211156104a457600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156104cc57600080fd5b602082029050602081019050919050565b6000602082019050919050565b6000602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000819050919050565b60008190509190505600a265627a7a7230582011dc176b6cffda1d2e58827bca1a16178776c2d8efcd6adf48bc0223f14f891a6c6578706572696d656e74616cf50037' # noqa: E501
25+
CONTRACT_NESTED_TUPLE_ABI = json.loads('[{"constant":true,"inputs":[{"components":[{"components":[{"components":[{"name":"x","type":"int256"},{"name":"y","type":"int256"}],"name":"u","type":"tuple[]"}],"name":"t","type":"tuple[]"}],"name":"s","type":"tuple"}],"name":"method","outputs":[{"components":[{"components":[{"components":[{"name":"x","type":"int256"},{"name":"y","type":"int256"}],"name":"u","type":"tuple[]"}],"name":"t","type":"tuple[]"}],"name":"","type":"tuple"}],"payable":false,"stateMutability":"pure","type":"function"}]') # noqa: E501
26+
27+
28+
@pytest.fixture()
29+
def NESTED_TUPLE_CODE():
30+
return CONTRACT_NESTED_TUPLE_CODE
31+
32+
33+
@pytest.fixture()
34+
def NESTED_TUPLE_RUNTIME():
35+
return CONTRACT_NESTED_TUPLE_RUNTIME
36+
37+
38+
@pytest.fixture()
39+
def NESTED_TUPLE_ABI():
40+
return CONTRACT_NESTED_TUPLE_ABI
41+
42+
43+
@pytest.fixture()
44+
def NESTED_TUPLE_CONTRACT(NESTED_TUPLE_CODE, NESTED_TUPLE_RUNTIME, NESTED_TUPLE_ABI):
45+
return {
46+
'bytecode': NESTED_TUPLE_CODE,
47+
'bytecode_runtime': NESTED_TUPLE_RUNTIME,
48+
'abi': NESTED_TUPLE_ABI,
49+
}
50+
51+
52+
@pytest.fixture()
53+
def NestedTupleContract(web3, NESTED_TUPLE_CONTRACT):
54+
return web3.eth.contract(**NESTED_TUPLE_CONTRACT)
55+
56+
957
CONTRACT_TUPLE_SOURCE = """
1058
pragma solidity >=0.4.19 <0.6.0;
1159
pragma experimental ABIEncoderV2;

tests/core/contracts/test_contract_call_interface.py

+73
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,11 @@ def tuple_contract(web3, TupleContract, address_conversion_func):
140140
return deploy(web3, TupleContract, address_conversion_func)
141141

142142

143+
@pytest.fixture()
144+
def nested_tuple_contract(web3, NestedTupleContract, address_conversion_func):
145+
return deploy(web3, NestedTupleContract, address_conversion_func)
146+
147+
143148
def test_invalid_address_in_deploy_arg(web3, WithConstructorAddressArgumentsContract):
144149
with pytest.raises(InvalidAddress):
145150
WithConstructorAddressArgumentsContract.constructor(
@@ -675,3 +680,71 @@ def test_invalid_fixed_value_reflections(web3, fixed_reflection_contract, functi
675680
def test_call_tuple_contract(tuple_contract, method_input, expected):
676681
result = tuple_contract.functions.method(method_input).call()
677682
assert result == expected
683+
684+
685+
@pytest.mark.parametrize(
686+
'method_input, expected',
687+
(
688+
(
689+
{'t': [
690+
{'u': [
691+
{'x': 1, 'y': 2},
692+
{'x': 3, 'y': 4},
693+
{'x': 5, 'y': 6},
694+
]},
695+
{'u': [
696+
{'x': 7, 'y': 8},
697+
{'x': 9, 'y': 10},
698+
{'x': 11, 'y': 12},
699+
]},
700+
]},
701+
(
702+
[
703+
([
704+
(1, 2),
705+
(3, 4),
706+
(5, 6),
707+
],),
708+
([
709+
(7, 8),
710+
(9, 10),
711+
(11, 12),
712+
],),
713+
],
714+
),
715+
),
716+
(
717+
(
718+
[
719+
([
720+
(1, 2),
721+
(3, 4),
722+
(5, 6),
723+
],),
724+
([
725+
(7, 8),
726+
(9, 10),
727+
(11, 12),
728+
],),
729+
],
730+
),
731+
(
732+
[
733+
([
734+
(1, 2),
735+
(3, 4),
736+
(5, 6),
737+
],),
738+
([
739+
(7, 8),
740+
(9, 10),
741+
(11, 12),
742+
],),
743+
],
744+
),
745+
),
746+
),
747+
)
748+
def test_call_nested_tuple_contract(nested_tuple_contract, method_input, expected):
749+
result = nested_tuple_contract.functions.method(method_input).call()
750+
assert result == expected

0 commit comments

Comments
 (0)