Add checks on event constructor arguments to type checker
This commit is contained in:
@@ -10,15 +10,10 @@
|
||||
|
||||
-include_lib("eunit/include/eunit.hrl").
|
||||
|
||||
%% simple_compile_test_() -> ok.
|
||||
%% Very simply test compile the given contracts. Only basic checks
|
||||
%% are made on the output, just that it is a binary which indicates
|
||||
%% that the compilation worked.
|
||||
|
||||
simple_compile_test_() ->
|
||||
{setup,
|
||||
fun () -> ok end, %Setup
|
||||
fun (_) -> ok end, %Cleanup
|
||||
[ {"Testing the " ++ ContractName ++ " contract",
|
||||
fun() ->
|
||||
#{byte_code := ByteCode,
|
||||
@@ -31,8 +26,7 @@ simple_compile_test_() ->
|
||||
<<"Type errors\n",ErrorString/binary>> = compile(ContractName),
|
||||
check_errors(lists:sort(ExpectedErrors), ErrorString)
|
||||
end} ||
|
||||
{ContractName, ExpectedErrors} <- failing_contracts() ]
|
||||
}.
|
||||
{ContractName, ExpectedErrors} <- failing_contracts() ].
|
||||
|
||||
check_errors(Expect, ErrorString) ->
|
||||
%% This removes the final single \n as well.
|
||||
@@ -168,4 +162,12 @@ failing_contracts() ->
|
||||
<<"The fields y, z are missing when constructing an element of type r('a) (at line 6, column 40)">>]}
|
||||
, {"namespace_clash",
|
||||
[<<"The contract Call (at line 4, column 10) has the same name as a namespace at (builtin location)">>]}
|
||||
, {"bad_events",
|
||||
[<<"The payload type int (at line 10, column 30) should be string">>,
|
||||
<<"The payload type alias_address (at line 12, column 30) equals address but it should be string">>,
|
||||
<<"The indexed type string (at line 9, column 25) is not a word type">>,
|
||||
<<"The indexed type alias_string (at line 11, column 25) equals string which is not a word type">>]}
|
||||
, {"bad_events2",
|
||||
[<<"The event constructor BadEvent1 (at line 9, column 7) has too many string values (max 1)">>,
|
||||
<<"The event constructor BadEvent2 (at line 10, column 7) has too many indexed values (max 3)">>]}
|
||||
].
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
-module(contract_tests).
|
||||
|
||||
-include_lib("eunit/include/eunit.hrl").
|
||||
|
||||
make_cmd() -> "make -C " ++ aeso_test_utils:contract_path().
|
||||
|
||||
contracts_test_() ->
|
||||
{setup,
|
||||
fun() -> os:cmd(make_cmd()) end,
|
||||
fun(_) -> os:cmd(make_cmd() ++ " clean") end,
|
||||
[ {"Testing the " ++ Contract ++ " contract",
|
||||
fun() ->
|
||||
?assertCmdOutput(Expected, filename:join(aeso_test_utils:contract_path(), Contract ++ "_test"))
|
||||
end} || {Contract, Expected} <- contracts() ]}.
|
||||
|
||||
contracts() ->
|
||||
[].
|
||||
%% [{"voting",
|
||||
%% "Delegate before vote\n"
|
||||
%% "Cake: 1\n"
|
||||
%% "Beer: 2\n"
|
||||
%% "Winner: Beer\n"
|
||||
%% "Delegate after vote\n"
|
||||
%% "Cake: 1\n"
|
||||
%% "Beer: 2\n"
|
||||
%% "Winner: Beer\n"
|
||||
%% }].
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
contract Events =
|
||||
type alias_int = int
|
||||
type alias_address = address
|
||||
type alias_string = string
|
||||
|
||||
datatype event =
|
||||
Event1(indexed alias_int, indexed int, string)
|
||||
| Event2(alias_string, indexed alias_address)
|
||||
| BadEvent1(indexed string, string)
|
||||
| BadEvent2(indexed int, int)
|
||||
| BadEvent3(indexed alias_string, string)
|
||||
| BadEvent4(indexed int, alias_address)
|
||||
|
||||
function f1(x : int, y : string) =
|
||||
Chain.event(Event1(x, x+1, y))
|
||||
|
||||
function f2(s : string) =
|
||||
Chain.event(Event2(s, Call.caller))
|
||||
|
||||
function f3(x : int) =
|
||||
Chain.event(Event1(x, x + 2, Int.to_str(x + 7)))
|
||||
|
||||
function i2s(i : int) = Int.to_str(i)
|
||||
function a2s(a : address) = Address.to_str(a)
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
contract Events =
|
||||
type alias_int = int
|
||||
type alias_address = address
|
||||
type alias_string = string
|
||||
|
||||
datatype event =
|
||||
Event1(indexed alias_int, indexed int, string)
|
||||
| Event2(alias_string, indexed alias_address)
|
||||
| BadEvent1(string, string)
|
||||
| BadEvent2(indexed int, indexed int, indexed int, indexed address)
|
||||
|
||||
function f1(x : int, y : string) =
|
||||
Chain.event(Event1(x, x+1, y))
|
||||
|
||||
function f2(s : string) =
|
||||
Chain.event(Event2(s, Call.caller))
|
||||
|
||||
function f3(x : int) =
|
||||
Chain.event(Event1(x, x + 2, Int.to_str(x + 7)))
|
||||
|
||||
function i2s(i : int) = Int.to_str(i)
|
||||
function a2s(a : address) = Address.to_str(a)
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
|
||||
contract SimpleStorage =
|
||||
|
||||
type event = int
|
||||
record state = { data : int }
|
||||
|
||||
function init(value : int) : state = { data = value }
|
||||
|
||||
Reference in New Issue
Block a user