Add new tests and fix old tests
This commit is contained in:
parent
6003aacdea
commit
d8db908485
@ -83,7 +83,7 @@ from_typed_ast(Type, TypedAst) ->
|
|||||||
string -> do_render_aci_json(JArray)
|
string -> do_render_aci_json(JArray)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
encode_contract(Contract = {Head, _, {con, _, Name}, _}) when ?IS_CONTRACT_HEAD(Head) ->
|
encode_contract(Contract = {Head, _, {con, _, Name}, _, _}) when ?IS_CONTRACT_HEAD(Head) ->
|
||||||
C0 = #{name => encode_name(Name)},
|
C0 = #{name => encode_name(Name)},
|
||||||
|
|
||||||
Tdefs0 = [ encode_typedef(T) || T <- sort_decls(contract_types(Contract)) ],
|
Tdefs0 = [ encode_typedef(T) || T <- sort_decls(contract_types(Contract)) ],
|
||||||
@ -341,10 +341,12 @@ stateful(false) -> "".
|
|||||||
|
|
||||||
%% #contract{Ann, Con, [Declarations]}.
|
%% #contract{Ann, Con, [Declarations]}.
|
||||||
|
|
||||||
contract_funcs({C, _, _, Decls}) when ?IS_CONTRACT_HEAD(C); C == namespace ->
|
contract_funcs({C, _, _, _, Decls}) when ?IS_CONTRACT_HEAD(C) ->
|
||||||
[ D || D <- Decls, is_fun(D)].
|
[ D || D <- Decls, is_fun(D)].
|
||||||
|
|
||||||
contract_types({C, _, _, Decls}) when ?IS_CONTRACT_HEAD(C); C == namespace ->
|
contract_types({namespace, _, _, Decls}) ->
|
||||||
|
[ D || D <- Decls, is_type(D) ];
|
||||||
|
contract_types({C, _, _, _, Decls}) when ?IS_CONTRACT_HEAD(C) ->
|
||||||
[ D || D <- Decls, is_type(D) ].
|
[ D || D <- Decls, is_type(D) ].
|
||||||
|
|
||||||
is_fun({letfun, _, _, _, _, _}) -> true;
|
is_fun({letfun, _, _, _, _, _}) -> true;
|
||||||
|
@ -326,7 +326,7 @@ get_option(Opt, Env, Default) ->
|
|||||||
%% -- Compilation ------------------------------------------------------------
|
%% -- Compilation ------------------------------------------------------------
|
||||||
|
|
||||||
-spec to_fcode(env(), aeso_syntax:ast()) -> {env(), fcode()}.
|
-spec to_fcode(env(), aeso_syntax:ast()) -> {env(), fcode()}.
|
||||||
to_fcode(Env, [{Contract, Attrs, Con = {con, _, Name}, Decls}|Rest])
|
to_fcode(Env, [{Contract, Attrs, Con = {con, _, Name}, _Impls, Decls}|Rest])
|
||||||
when ?IS_CONTRACT_HEAD(Contract) ->
|
when ?IS_CONTRACT_HEAD(Contract) ->
|
||||||
case Contract =:= contract_interface of
|
case Contract =:= contract_interface of
|
||||||
false ->
|
false ->
|
||||||
|
@ -238,8 +238,8 @@ insert_init_function(Code, Options) ->
|
|||||||
|
|
||||||
last_contract_indent(Decls) ->
|
last_contract_indent(Decls) ->
|
||||||
case lists:last(Decls) of
|
case lists:last(Decls) of
|
||||||
{_, _, _, [Decl | _]} -> aeso_syntax:get_ann(col, Decl, 1) - 1;
|
{_, _, _, _, [Decl | _]} -> aeso_syntax:get_ann(col, Decl, 1) - 1;
|
||||||
_ -> 0
|
_ -> 0
|
||||||
end.
|
end.
|
||||||
|
|
||||||
-spec to_sophia_value(string(), string(), ok | error | revert, binary()) ->
|
-spec to_sophia_value(string(), string(), ok | error | revert, binary()) ->
|
||||||
@ -338,7 +338,7 @@ decode_calldata(ContractString, FunName, Calldata, Options0) ->
|
|||||||
end.
|
end.
|
||||||
|
|
||||||
-dialyzer({nowarn_function, get_decode_type/2}).
|
-dialyzer({nowarn_function, get_decode_type/2}).
|
||||||
get_decode_type(FunName, [{Contract, Ann, _, Defs}]) when ?IS_CONTRACT_HEAD(Contract) ->
|
get_decode_type(FunName, [{Contract, Ann, _, _, Defs}]) when ?IS_CONTRACT_HEAD(Contract) ->
|
||||||
GetType = fun({letfun, _, {id, _, Name}, Args, Ret, _}) when Name == FunName -> [{Args, Ret}];
|
GetType = fun({letfun, _, {id, _, Name}, Args, Ret, _}) when Name == FunName -> [{Args, Ret}];
|
||||||
({fun_decl, _, {id, _, Name}, {fun_t, _, _, Args, Ret}}) when Name == FunName -> [{Args, Ret}];
|
({fun_decl, _, {id, _, Name}, {fun_t, _, _, Args, Ret}}) when Name == FunName -> [{Args, Ret}];
|
||||||
(_) -> [] end,
|
(_) -> [] end,
|
||||||
|
@ -39,7 +39,7 @@ calldata_aci_test_() ->
|
|||||||
end} || {ContractName, Fun, Args} <- compilable_contracts()].
|
end} || {ContractName, Fun, Args} <- compilable_contracts()].
|
||||||
|
|
||||||
parse_args(Fun, Args) ->
|
parse_args(Fun, Args) ->
|
||||||
[{contract_main, _, _, [{letfun, _, _, _, _, [{guarded, _, [], {app, _, _, AST}}]}]}] =
|
[{contract_main, _, _, _, [{letfun, _, _, _, _, [{guarded, _, [], {app, _, _, AST}}]}]}] =
|
||||||
aeso_parser:string("main contract Temp = function foo() = " ++ Fun ++ "(" ++ string:join(Args, ", ") ++ ")"),
|
aeso_parser:string("main contract Temp = function foo() = " ++ Fun ++ "(" ++ string:join(Args, ", ") ++ ")"),
|
||||||
strip_ann(AST).
|
strip_ann(AST).
|
||||||
|
|
||||||
|
@ -202,6 +202,8 @@ compilable_contracts() ->
|
|||||||
"assign_patterns",
|
"assign_patterns",
|
||||||
"patterns_guards",
|
"patterns_guards",
|
||||||
"pipe_operator",
|
"pipe_operator",
|
||||||
|
"contract_polymorphism",
|
||||||
|
"contract_interface_polymorphism",
|
||||||
"test" % Custom general-purpose test file. Keep it last on the list.
|
"test" % Custom general-purpose test file. Keep it last on the list.
|
||||||
].
|
].
|
||||||
|
|
||||||
@ -825,6 +827,26 @@ failing_contracts() ->
|
|||||||
<<?Pos(48, 5)
|
<<?Pos(48, 5)
|
||||||
"Unused return value.">>
|
"Unused return value.">>
|
||||||
])
|
])
|
||||||
|
, ?TYPE_ERROR(contract_interface_polymorphism_recursive,
|
||||||
|
[<<?Pos(1,24)
|
||||||
|
"Trying to implement or extend an undefined interface Z at line 1, column 24">>
|
||||||
|
])
|
||||||
|
, ?TYPE_ERROR(contract_interface_polymorphism_same_decl_multi_interface,
|
||||||
|
[<<?Pos(7,10)
|
||||||
|
"Unimplemented function f from the interface I in the contract C">>
|
||||||
|
])
|
||||||
|
, ?TYPE_ERROR(contract_polymorphism_missing_implementation,
|
||||||
|
[<<?Pos(7,10)
|
||||||
|
"Unimplemented function f from the interface I1 in the contract C">>
|
||||||
|
])
|
||||||
|
, ?TYPE_ERROR(contract_polymorphism_same_decl_multi_interface,
|
||||||
|
[<<?Pos(7,10)
|
||||||
|
"Unimplemented function f from the interface J in the contract C">>
|
||||||
|
])
|
||||||
|
, ?TYPE_ERROR(contract_polymorphism_undefined_interface,
|
||||||
|
[<<?Pos(1,24)
|
||||||
|
"Trying to implement or extend an undefined interface H at line 1, column 24">>
|
||||||
|
])
|
||||||
].
|
].
|
||||||
|
|
||||||
-define(Path(File), "code_errors/" ??File).
|
-define(Path(File), "code_errors/" ??File).
|
||||||
|
@ -15,7 +15,7 @@ simple_contracts_test_() ->
|
|||||||
Text = "main contract Identity =\n"
|
Text = "main contract Identity =\n"
|
||||||
" function id(x) = x\n",
|
" function id(x) = x\n",
|
||||||
?assertMatch(
|
?assertMatch(
|
||||||
[{contract_main, _, {con, _, "Identity"},
|
[{contract_main, _, {con, _, "Identity"}, _,
|
||||||
[{letfun, _, {id, _, "id"}, [{id, _, "x"}], {id, _, "_"},
|
[{letfun, _, {id, _, "id"}, [{id, _, "x"}], {id, _, "_"},
|
||||||
[{guarded, _, [], {id, _, "x"}}]}]}], parse_string(Text)),
|
[{guarded, _, [], {id, _, "x"}}]}]}], parse_string(Text)),
|
||||||
ok
|
ok
|
||||||
|
9
test/contracts/contract_interface_polymorphism.aes
Normal file
9
test/contracts/contract_interface_polymorphism.aes
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
contract interface II =
|
||||||
|
entrypoint f : () => int
|
||||||
|
|
||||||
|
contract interface I : II =
|
||||||
|
entrypoint g : () => int
|
||||||
|
|
||||||
|
contract C : I =
|
||||||
|
entrypoint f() = 1
|
||||||
|
entrypoint g() = 2
|
13
test/contracts/contract_interface_polymorphism_recursive.aes
Normal file
13
test/contracts/contract_interface_polymorphism_recursive.aes
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
contract interface X : Z =
|
||||||
|
entrypoint x : () => int
|
||||||
|
|
||||||
|
contract interface Y : X =
|
||||||
|
entrypoint y : () => int
|
||||||
|
|
||||||
|
contract interface Z : Y =
|
||||||
|
entrypoint z : () => int
|
||||||
|
|
||||||
|
contract C : Z =
|
||||||
|
entrypoint x() = 1
|
||||||
|
entrypoint y() = 1
|
||||||
|
entrypoint z() = 1
|
@ -0,0 +1,8 @@
|
|||||||
|
contract interface I =
|
||||||
|
entrypoint f : () => int
|
||||||
|
|
||||||
|
contract interface II : I =
|
||||||
|
entrypoint f : () => int
|
||||||
|
|
||||||
|
contract C : II =
|
||||||
|
entrypoint f() = 1
|
5
test/contracts/contract_polymorphism.aes
Normal file
5
test/contracts/contract_polymorphism.aes
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
contract interface Strokable =
|
||||||
|
entrypoint stroke : () => string
|
||||||
|
|
||||||
|
contract Cat : Strokable =
|
||||||
|
entrypoint stroke() = "Cat stroke"
|
@ -0,0 +1,8 @@
|
|||||||
|
contract interface I1 =
|
||||||
|
entrypoint f : () => int
|
||||||
|
|
||||||
|
contract interface I2 : I1 =
|
||||||
|
entrypoint g : () => int
|
||||||
|
|
||||||
|
contract C : I2 =
|
||||||
|
entrypoint g() = 1
|
@ -0,0 +1,8 @@
|
|||||||
|
contract interface I =
|
||||||
|
entrypoint f : () => int
|
||||||
|
|
||||||
|
contract interface J =
|
||||||
|
entrypoint f : () => int
|
||||||
|
|
||||||
|
contract C : I, J =
|
||||||
|
entrypoint f() = 1
|
@ -0,0 +1,5 @@
|
|||||||
|
contract interface I : H =
|
||||||
|
entrypoint f : () => unit
|
||||||
|
|
||||||
|
contract C =
|
||||||
|
entrypoint g() = ()
|
Loading…
x
Reference in New Issue
Block a user