Skip to content

Commit

Permalink
🧪 feat(test): PBT & Unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
worthant committed Oct 19, 2024
1 parent b0a09c8 commit 29dc7c7
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 2 deletions.
3 changes: 2 additions & 1 deletion mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ defmodule TreeDict.MixProject do
[
{:credo, "~> 1.7", only: [:dev, :test], runtime: false},
{:propcheck, "~> 1.4.1", only: [:test]},
{:excoveralls, "~> 0.18", only: :test}
{:excoveralls, "~> 0.18", only: :test},
{:stream_data, "~> 0.5", only: :test}
]
end

Expand Down
1 change: 1 addition & 0 deletions mix.lock
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@
"libgraph": {:hex, :libgraph, "0.16.0", "3936f3eca6ef826e08880230f806bfea13193e49bf153f93edcf0239d4fd1d07", [:mix], [], "hexpm", "41ca92240e8a4138c30a7e06466acc709b0cbb795c643e9e17174a178982d6bf"},
"propcheck": {:hex, :propcheck, "1.4.1", "c12908dbe6f572032928548089b34ff9d40672d5d70f1562e3a9e9058d226cc9", [:mix], [{:libgraph, "~> 0.13", [hex: :libgraph, repo: "hexpm", optional: false]}, {:proper, "~> 1.4", [hex: :proper, repo: "hexpm", optional: false]}], "hexpm", "e1b088f574785c3c7e864da16f39082d5599b3aaf89086d3f9be6adb54464b19"},
"proper": {:hex, :proper, "1.4.0", "89a44b8c39d28bb9b4be8e4d715d534905b325470f2e0ec5e004d12484a79434", [:rebar3], [], "hexpm", "18285842185bd33efbda97d134a5cb5a0884384db36119fee0e3cfa488568cbb"},
"stream_data": {:hex, :stream_data, "0.6.0", "e87a9a79d7ec23d10ff83eb025141ef4915eeb09d4491f79e52f2562b73e5f47", [:mix], [], "hexpm", "b92b5031b650ca480ced047578f1d57ea6dd563f5b57464ad274718c9c29501c"},
}
50 changes: 50 additions & 0 deletions test/red_black_tree_pbt_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
defmodule RedBlackTreePropertyBasedTest do
use ExUnit.Case
use ExUnitProperties

alias RedBlackTree

property "insertion maintains red-black properties for any sequence of integers" do
check all(
keys <- uniq_list_of(integer()),
values <- list_of(term()),
max_runs: 100
) do
# Обрезаем values до длины keys
values = Enum.take(values, length(keys))

# Создаём список пар {key, value}
kv_pairs = Enum.zip(keys, values)

# Вставляем пары в дерево
tree =
Enum.reduce(kv_pairs, nil, fn {key, value}, acc ->
RedBlackTree.insert(acc, key, value)
end)

# Проверяем корректность красно-чёрного дерева
assert tree == nil or RedBlackTree.valid_red_black_tree?(tree),
"Дерево должно удовлетворять свойствам красно-чёрного дерева"
end
end

property "inserting and retrieving values works correctly" do
check all(
keys <- uniq_list_of(integer()),
values <- list_of(term()),
max_runs: 100
) do
values = Enum.take(values, length(keys))
kv_pairs = Enum.zip(keys, values)

tree =
Enum.reduce(kv_pairs, nil, fn {key, value}, acc ->
RedBlackTree.insert(acc, key, value)
end)

Enum.each(kv_pairs, fn {key, value} ->
assert RedBlackTree.get(tree, key) == value
end)
end
end
end
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
defmodule RedBlackTreeTest do
defmodule RedBlackTreeUnitTest do
use ExUnit.Case
alias RedBlackTree

Expand Down
26 changes: 26 additions & 0 deletions test/tree_dict_pbt_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
defmodule TreeDictPropertyBasedTest do
use ExUnit.Case
use ExUnitProperties

alias TreeDict

property "TreeDict insert and get work correctly" do
check all(
keys <- uniq_list_of(term()),
values <- list_of(term()),
max_runs: 100
) do
values = Enum.take(values, length(keys))
kv_pairs = Enum.zip(keys, values)

dict =
Enum.reduce(kv_pairs, TreeDict.new(), fn {key, value}, acc ->
TreeDict.insert(acc, key, value)
end)

Enum.each(kv_pairs, fn {key, value} ->
assert TreeDict.get(dict, key) == value
end)
end
end
end

0 comments on commit 29dc7c7

Please sign in to comment.