[erlang-questions] first, next, prev, last in gb_trees
John Hughes
john.hughes@REDACTED
Wed Mar 16 20:58:52 CET 2011
?Nice!
Slight typo: you tested prev twice... your prop_next actually tested prev,
it's a copy-and-paste of prop_prev without the renaming to next!
I'd suggest testing all the properties at once with
eqc:module({numtests,1000},gb1). That should work in eqcmini too.
One drawback of your approach is that you only test next and prev on
gb_trees constructed using empty and enter. Conceivably the other functions
could create gb_trees with a different structure that you might fail on.
Here's some code that uses ALL of the constructors to build the test data
(no bugs found though!).
John
%% gb_tree constructors
gb() ->
?SIZED(Size,
frequency([{1,{call,gb_trees,empty,[]}},
{1,{call,gb_trees,from_orddict,[orddict()]}},
{Size,?LAZY(compound_gb())}])).
compound_gb() ->
?LETSHRINK([GB],[gb()],
oneof([{call,gb_trees,Fun,Args++[GB]}
|| [Fun|Args] <-
lists:map(fun tuple_to_list/1,gb_constructors())]
++
[{call,erlang,element,[3,{call,gb_trees,take_smallest,[GB]}]},
{call,erlang,element,[3,{call,gb_trees,take_largest,[GB]}]}])).
gb_constructors() ->
[{balance},
{delete,key()},
{delete_any,key()},
{enter,key(),val()},
{insert,key(),val()},
{update,key(),val()}].
key() ->
nat().
val() ->
int().
orddict() ->
?LET(L,list({key(),val()}),
orddict:from_list(L)).
%% Properties
prop_prev2() ->
?FORALL(GB,eqc_symbolic:well_defined(gb()),
begin
T = eval(GB),
ok == all_prev(lists:reverse(keys(T)), T)
end).
prop_next2() ->
?FORALL(GB,eqc_symbolic:well_defined(gb()),
begin
T = eval(GB),
ok == all_next(keys(T), T)
end).
keys(T) ->
[K || {K,_} <- gb_trees:to_list(T)].
----- Original Message -----
From: "Ulf Wiger" <ulf.wiger@REDACTED>
To: "Erlang Questions" <erlang-questions@REDACTED>
Sent: Wednesday, March 16, 2011 6:13 PM
Subject: [erlang-questions] first, next, prev, last in gb_trees
When I use ordered_set ets over gb_trees it has more than once been due to
the fact that you can do wonderful stuff with first, next, prev and last -
and gb_trees doesn't have them.
I've made a stab at implementing these functions for the gb_trees data
structure, together with a quickcheck spec to verify that they work as
expected (you can use eqc mini to run the tests). I think they are
reasonably efficient, but perhaps someone can think of a way to optimize
them? Have at it, and pls use the spec to verify that you didn't break them*
(recalling that an incorrect program can be made arbitrarily fast)
* e.g. eqc:quickcheck(gb1:prop_first())
BR,
Ulf W (hoping the list server won't chop the 150-line attachment)
--------------------------------------------------------------------------------
>
> Ulf Wiger, CTO, Erlang Solutions, Ltd.
> http://erlang-solutions.com
>
>
>
>
>
--------------------------------------------------------------------------------
>
> ________________________________________________________________
> erlang-questions (at) erlang.org mailing list.
> See http://www.erlang.org/faq.html
> To unsubscribe; mailto:erlang-questions-unsubscribe@REDACTED
More information about the erlang-questions
mailing list