this repo has no description
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add BTree SimpleKV and validate iterator results

garrison 7beb1ef9 a7f744c0

+45 -3
+15 -3
lib/btree/fuzz/model_fuzz.ex
··· 1 1 defmodule Hobbes.BTree.Fuzz.ModelFuzz do 2 2 alias Hobbes.BTree 3 3 alias Hobbes.BTree.Iterator 4 + alias Hobbes.BTree.Fuzz.SimpleKV 4 5 5 6 import Hobbes.FuzzUtils 7 + import ExUnit.Assertions, only: [assert: 1] 6 8 7 9 defmodule State do 8 10 @enforce_keys [ 9 11 :btree, 12 + :simple_kv, 10 13 :opts, 11 14 ] 12 15 defstruct @enforce_keys ··· 30 33 defp fuzz(opts) do 31 34 state = %State{ 32 35 btree: BTree.new(opts.btree_opts), 36 + simple_kv: SimpleKV.new(), 33 37 opts: opts, 34 38 } 35 39 ··· 59 63 defp execute(:apply_batch, %State{} = state) do 60 64 %{ 61 65 btree: btree, 66 + simple_kv: simple_kv, 62 67 opts: opts, 63 68 } = state 64 69 65 70 mutations = make_batch(opts) 66 71 :ok = BTree.Writer.apply_batch(btree, mutations) 72 + simple_kv = SimpleKV.apply_batch(simple_kv, mutations) 67 73 68 - state 74 + %{state | 75 + simple_kv: simple_kv, 76 + } 69 77 end 70 78 71 79 defp execute(:scan, %State{} = state) do 72 80 %{ 81 + simple_kv: simple_kv, 73 82 btree: btree, 74 83 opts: %{ 75 84 key_bits: opt_key_bits, ··· 79 88 start_key = make_key(opt_key_bits) 80 89 count = Enum.random(1..10) 81 90 reverse? = false 91 + #dbg {start_key, count} 92 + #dbg SimpleKV.dump(simple_kv) 82 93 83 - _pairs = scan(btree, start_key, count, reverse?) 84 - #dbg pairs 94 + btree_pairs = scan(btree, start_key, count, reverse?) 95 + skv_pairs = SimpleKV.scan(simple_kv, start_key, count) 96 + assert btree_pairs == skv_pairs 85 97 86 98 state 87 99 end
+30
lib/btree/fuzz/simple_kv.ex
··· 1 + defmodule Hobbes.BTree.Fuzz.SimpleKV do 2 + @type t :: map 3 + 4 + @spec new :: t 5 + def new do 6 + %{} 7 + end 8 + 9 + @spec apply_batch(t, list) :: t 10 + def apply_batch(simple_kv, mutations) do 11 + Enum.reduce(mutations, simple_kv, fn 12 + {:write, k, v}, simple_kv -> Map.put(simple_kv, k, v) 13 + {:clear, k}, simple_kv -> Map.delete(simple_kv, k) 14 + {:clear_range, _sk, _ek}, _simple_kv -> raise "Not supported" 15 + end) 16 + end 17 + 18 + @spec scan(t, binary, non_neg_integer) :: [{binary, binary}] 19 + def scan(simple_kv, start_key, count) do 20 + simple_kv 21 + |> Enum.sort_by(fn {k, _v} -> k end) 22 + |> Enum.filter(fn {k, _v} -> k >= start_key end) 23 + |> Enum.take(count) 24 + end 25 + 26 + @doc false 27 + def dump(simple_kv) do 28 + Enum.sort_by(simple_kv, fn {k, _v} -> k end) 29 + end 30 + end