2020-07-08 11:29:13 -07:00
|
|
|
defmodule MarkovChainTest do
|
|
|
|
|
use ExUnit.Case
|
|
|
|
|
alias Omnibot.Contrib.Markov.Chain
|
|
|
|
|
|
2020-07-08 12:59:34 -07:00
|
|
|
test "chain train works correctly" do
|
2020-07-08 11:29:13 -07:00
|
|
|
chain = %Chain {order: 2}
|
2020-07-08 12:59:34 -07:00
|
|
|
|> Chain.train(~w(foo bar baz))
|
2020-07-17 17:33:52 -07:00
|
|
|
assert chain.chain == %{
|
|
|
|
|
["bar", "baz"] => %{nil => 1},
|
|
|
|
|
["foo", "bar"] => %{"baz" => 1},
|
|
|
|
|
}
|
2020-07-15 16:25:25 -07:00
|
|
|
|
|
|
|
|
chain = chain |> Chain.train(~w(foo bar baz))
|
|
|
|
|
|
2020-07-17 17:33:52 -07:00
|
|
|
assert chain.chain == %{
|
|
|
|
|
["bar", "baz"] => %{nil => 2},
|
|
|
|
|
["foo", "bar"] => %{"baz" => 2},
|
|
|
|
|
}
|
2020-07-15 16:25:25 -07:00
|
|
|
|
|
|
|
|
chain = chain |> Chain.train(~w(baz bar foo))
|
|
|
|
|
|
2020-07-17 17:33:52 -07:00
|
|
|
assert chain.chain == %{
|
|
|
|
|
["bar", "foo"] => %{nil => 1},
|
|
|
|
|
["baz", "bar"] => %{"foo" => 1},
|
|
|
|
|
["bar", "baz"] => %{nil => 2},
|
|
|
|
|
["foo", "bar"] => %{"baz" => 2},
|
|
|
|
|
}
|
2020-07-15 16:25:25 -07:00
|
|
|
|
|
|
|
|
chain = chain |> Chain.train(~w(a b c))
|
2020-07-17 17:33:52 -07:00
|
|
|
assert chain.chain == %{
|
|
|
|
|
["b", "c"] => %{nil => 1},
|
|
|
|
|
["a", "b"] => %{"c" => 1},
|
|
|
|
|
["bar", "foo"] => %{nil => 1},
|
|
|
|
|
["baz", "bar"] => %{"foo" => 1},
|
|
|
|
|
["bar", "baz"] => %{nil => 2},
|
|
|
|
|
["foo", "bar"] => %{"baz" => 2},
|
|
|
|
|
}
|
2020-07-08 12:59:34 -07:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
test "chain add_weight works correctly" do
|
|
|
|
|
chain = %Chain {order: 2}
|
|
|
|
|
|> Chain.add_weight(["foo", "bar"], "baz")
|
2020-07-17 17:33:52 -07:00
|
|
|
assert chain.chain == %{
|
|
|
|
|
["foo", "bar"] => %{"baz" => 1},
|
|
|
|
|
}
|
2020-07-08 12:59:34 -07:00
|
|
|
|
|
|
|
|
chain = chain |> Chain.add_weight(["foo", "bar"], "baz", 2)
|
|
|
|
|
|
2020-07-17 17:33:52 -07:00
|
|
|
assert chain.chain == %{
|
|
|
|
|
["foo", "bar"] => %{"baz" => 3},
|
|
|
|
|
}
|
2020-07-08 12:59:34 -07:00
|
|
|
|
|
|
|
|
chain = chain |> Chain.add_weight(["foo", "bar"], "qux")
|
2020-07-17 17:33:52 -07:00
|
|
|
assert chain.chain == %{
|
|
|
|
|
["foo", "bar"] => %{"baz" => 3, "qux" => 1},
|
|
|
|
|
}
|
2020-07-15 16:25:25 -07:00
|
|
|
|
|
|
|
|
chain = chain |> Chain.add_weight(["bar", "baz"], "qux")
|
2020-07-17 17:33:52 -07:00
|
|
|
assert chain.chain == %{
|
|
|
|
|
["bar", "baz"] => %{"qux" => 1},
|
|
|
|
|
["foo", "bar"] => %{"baz" => 3, "qux" => 1},
|
|
|
|
|
}
|
2020-07-15 16:25:25 -07:00
|
|
|
|
|
|
|
|
chain = chain |> Chain.add_weight(["bar", "baz"], nil)
|
2020-07-17 17:33:52 -07:00
|
|
|
assert chain.chain == %{
|
|
|
|
|
["bar", "baz"] => %{"qux" => 1, nil => 1},
|
|
|
|
|
["foo", "bar"] => %{"baz" => 3, "qux" => 1},
|
|
|
|
|
}
|
2020-07-08 11:29:13 -07:00
|
|
|
end
|
2020-07-17 20:07:02 -07:00
|
|
|
|
2020-07-21 14:58:10 -07:00
|
|
|
test "chain add_weight does not reset reply_chance" do
|
|
|
|
|
chain = %Chain {order: 2, reply_chance: 0.0}
|
|
|
|
|
|> Chain.add_weight(["foo", "bar"], "baz")
|
|
|
|
|
|
|
|
|
|
chain = chain |> Chain.add_weight(["foo", "bar"], "baz", 2)
|
|
|
|
|
assert chain.reply_chance == 0.0
|
|
|
|
|
|
|
|
|
|
chain = chain |> Chain.add_weight(["foo", "bar"], "qux")
|
|
|
|
|
assert chain.reply_chance == 0.0
|
|
|
|
|
|
|
|
|
|
chain = chain |> Chain.add_weight(["bar", "baz"], "qux")
|
|
|
|
|
assert chain.reply_chance == 0.0
|
|
|
|
|
|
|
|
|
|
chain = chain |> Chain.add_weight(["bar", "baz"], nil)
|
|
|
|
|
assert chain.reply_chance == 0.0
|
|
|
|
|
end
|
|
|
|
|
|
2020-07-17 20:07:02 -07:00
|
|
|
test "chain merge works correctly" do
|
|
|
|
|
chain1 = %Chain {order: 2}
|
|
|
|
|
|> Chain.add_weight(["foo", "bar"], "baz")
|
|
|
|
|
|
|
|
|
|
chain2 = %Chain {order: 2}
|
|
|
|
|
|> Chain.add_weight(["foo", "bar"], "baz")
|
|
|
|
|
|> Chain.add_weight(["bar", "baz"], "qux")
|
|
|
|
|
|
|
|
|
|
merged = Chain.merge(chain1, chain2)
|
|
|
|
|
assert merged.chain == %{
|
|
|
|
|
["foo", "bar"] => %{"baz" => 2},
|
|
|
|
|
["bar", "baz"] => %{"qux" => 1},
|
|
|
|
|
}
|
|
|
|
|
end
|
2020-07-08 11:29:13 -07:00
|
|
|
end
|