anchor.diff:  end_per_suite(Config) ->
       unittest_helper:end_per_suite(Config).
   
  +%% add backend name to list
   backends() ->
       [db_ets].
   
  
positive.code:     true.
  
  test_get(Data, Backend) ->
      true.
  
  tester_get(_Config) ->
  
negative.code: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % test foldl/2 of available backends
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  -spec prop_foldl([backend_beh:entry()], backend_beh:interval(),
                   non_neg_integer()) -> true.
  prop_foldl(Data, Interval, MaxNum) ->
      [test_foldl(Data, Interval, MaxNum, Backend) || Backend <- backends()],
      true.
  
  test_foldl(Data, Interval, MaxNum, Backend) ->
      {DB1, ScrubedData} =
                           write_scrubed_to_db(Backend:new(randoms:getRandomString()),
                                               Data, Backend),
      {ExpInInterval, _NotIn} = lists:partition(
              fun(E) -> 
                      case Interval of
                          all ->
                              true;
                          {element, Key} ->
                              element(1, E) == Key;
                          {interval, '(', L, R, ')'} ->
                              element(1, E) > L andalso
                              element(1, E) < R;
                          {interval, '(', L, R, ']'} ->
                              element(1, E) > L andalso
                              element(1, E) =< R;
                          {interval, '[', L, R, ')'} ->
                              element(1, E) >= L andalso
                              element(1, E) < R;
                          {interval, '[', L, R, ']'} ->
                              element(1, E) >= L andalso
                              element(1, E) =< R
                      end
              end,
              ScrubedData),
      ExpInIntervalCounted = lists:sublist(ExpInInterval, MaxNum),
      AllFold = Backend:foldl(DB1, fun(E, AccIn) -> [E | AccIn] end, []),
      IntervalFold = Backend:foldl(DB1,
                                   fun(E, AccIn) -> [E | AccIn] end,
                                   [],
                                   Interval),
      IntervalCountFold = Backend:foldl(DB1,
                              fun(E, AccIn) -> [E | AccIn] end,
                              [],
                              Interval,
                              MaxNum),
      ?equals_w_note(lists:sort(ScrubedData), lists:sort(AllFold), "test_foldl1_"
                     ++ atom_to_list(Backend)),
      ?equals_w_note(lists:sort(ExpInInterval), lists:sort(IntervalFold), "test_foldl2_"
                     ++ atom_to_list(Backend)),
      ?equals_w_note(lists:sort(ExpInIntervalCounted),
                     lists:sort(IntervalCountFold), "test_foldl3_" ++
                     atom_to_list(Backend)),
      Backend:close(DB1),
      true.
  
  tester_foldl(_Config) ->
      tester:test(?MODULE, prop_foldl, 3, rw_suite_runs(10000), [{threads, 2}]).
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % test foldr/2 of available backends
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  -spec prop_foldr([backend_beh:entry()], backend_beh:interval(),
                   non_neg_integer()) -> true.
  prop_foldr(Data, Interval, MaxNum) ->
      [test_foldr(Data, Interval, MaxNum, Backend) || Backend <- backends()],
      true.
  
  test_foldr(Data, Interval, MaxNum, Backend) ->
      {DB1, ScrubedData} =
                           write_scrubed_to_db(Backend:new(randoms:getRandomString()),
                                               Data, Backend),
      {ExpInInterval, _NotIn} = lists:partition(
              fun(E) -> 
                      case Interval of
                          all ->
                              true;
                          {element, Key} ->
                              element(1, E) == Key;
                          {interval, '(', L, R, ')'} ->
                              element(1, E) > L andalso
                              element(1, E) < R;
                          {interval, '(', L, R, ']'} ->
                              element(1, E) > L andalso
                              element(1, E) =< R;
                          {interval, '[', L, R, ')'} ->
                              element(1, E) >= L andalso
                              element(1, E) < R;
                          {interval, '[', L, R, ']'} ->
                              element(1, E) >= L andalso
                              element(1, E) =< R
                      end
              end,
              ScrubedData),
      ExpInIntervalCounted = lists:sublist(lists:reverse(ExpInInterval), MaxNum),
      AllFold = Backend:foldr(DB1, fun(E, AccIn) -> [E | AccIn] end, []),
      IntervalFold = Backend:foldr(DB1,
                                   fun(E, AccIn) -> [E | AccIn] end,
                                   [],
                                   Interval),
      IntervalCountFold = Backend:foldr(DB1,
                              fun(E, AccIn) -> [E | AccIn] end,
                              [],
                              Interval,
                              MaxNum),
      %% ct:pal("ExpInInterval: ~p~nIntervalFold: ~p~nInterval: ~p~n", [ExpInInterval,
      %%                                                  IntervalFold, Interval]),
      ?equals_w_note(lists:sort(ScrubedData), lists:sort(AllFold), "test_foldr1_"
                     ++ atom_to_list(Backend)),
      ?equals_w_note(lists:sort(ExpInInterval), lists:sort(IntervalFold), "test_foldr2_"
                     ++ atom_to_list(Backend)),
      ?equals_w_note(lists:sort(ExpInIntervalCounted),
                     lists:sort(IntervalCountFold), "test_foldr3_" ++
                     atom_to_list(Backend)),
      Backend:close(DB1),
      true.
  
  tester_foldr(_Config) ->
      tester:test(?MODULE, prop_foldr, 3, rw_suite_runs(10000), [{threads, 2}]).
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % helper functions
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  write_scrubed_to_db(DB, Data, Backend) ->
      ScrubedData = scrub_data(Data),
      DB1 = lists:foldl(
              fun(Entry, DBAcc) ->
                  Backend:put(DBAcc, Entry)
              end, DB, ScrubedData),
      {DB1, ScrubedData}.
  
  scrub_data(Data) ->
      %% Entries should be unique
  