[erlang-questions] PropEr after test clean up

Hynek Vychodil vychodil.hynek@REDACTED
Mon May 25 17:11:34 CEST 2015


Hi,

I bumped in the problem how clean up after property in PropEr. Let's have
simple property where I make ets table:

prop_ets() ->
    ?FORALL(V, integer(),
        begin
            E = ets:new(),
            true = ets:insert(T, {V, ok}),
            equals([{V, ok}], ets:lookup(T, V))
        end
    ).

How am I supposed to delete ets table? It is trickier than looks like. The
problem is when I want use another ?FORALL inside my property. The
conjunction/1 is the same problem. You can`t write

prop_ets() ->
    ?FORALL(V, integer(),
        begin
            E = ets:new(),
            true = ets:insert(T, {V, ok}),
            Res = conjunction([{lookup, equals([{V, ok}], ets:lookup(T,
V))},
                              {lookup_element,
equals(ok, ets:lookup_element(T, V, 2))}]),
            ets:delete(T),
            Res
        end
    ).

Because Res is test(). In this case, you can make calls to the ets:lookup/2
and the ets:lookup_element/3 before conjunction/1 but it doesn't solve
properties like

?FORALL(L, list(...),
    begin
        T = ets:new(),
        ...
        ?FORALL(V, oneof(L),
              ...
        )
     end
)

The solution would be simple is every test case would be run in a separate
process, but it is not! It is very unusual in Erlang word to make such
thing. Processes are cheap and I can they are in a defined state each run
for free. Why is it all running in the same process?

Has anybody solved this problem somehouw?

Hynek Vychodil
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20150525/02e33c9b/attachment.htm>


More information about the erlang-questions mailing list