wafer/test/registers_test.exs
2020-01-01 20:25:50 +13:00

154 lines
4.1 KiB
Elixir

defmodule WaferRegistersTest do
use ExUnit.Case, async: true
use Mimic
alias Wafer.Chip
Code.require_file("test/support/test_utils.exs")
describe "read-only register" do
test "the register read function is defined" do
assert function_exported?(test_mod(), :read_ro_test, 1)
end
test "the register write function is not defined" do
refute function_exported?(test_mod(), :write_ro_test, 2)
end
test "the register swap function is not defined" do
refute function_exported?(test_mod(), :swap_ro_test, 2)
end
test "the update register function is not defined" do
refute function_exported?(test_mod(), :update_ro_test, 2)
end
test "the register can be read from" do
mod = test_mod()
Chip
|> expect(:read_register, 1, fn conn, address, bytes ->
{:read_register, conn, address, bytes}
end)
assert mod.read_ro_test(:conn) == {:read_register, :conn, 1, 3}
end
end
describe "write-only register" do
test "the register read function is not defined" do
refute function_exported?(test_mod(), :read_wo_test, 1)
end
test "the register write function is defined" do
assert function_exported?(test_mod(), :write_wo_test, 2)
end
test "the register swap function is not defined" do
refute function_exported?(test_mod(), :swap_wo_test, 2)
end
test "the update register function is not defined" do
refute function_exported?(test_mod(), :update_wo_test, 2)
end
test "the register can be written to" do
mod = test_mod()
Chip
|> expect(:write_register, 1, fn conn, address, data ->
{:write_register, conn, address, data}
end)
assert mod.write_wo_test(:conn, <<1, 1, 3, 4, 7>>) ==
{:write_register, :conn, 2, <<1, 1, 3, 4, 7>>}
end
end
describe "read-write register" do
test "the register read function is not defined" do
assert function_exported?(test_mod(), :read_rw_test, 1)
end
test "the register write function is defined" do
assert function_exported?(test_mod(), :write_rw_test, 2)
end
test "the register swap function is defined" do
assert function_exported?(test_mod(), :swap_rw_test, 2)
end
test "the update register function is defined" do
assert function_exported?(test_mod(), :update_rw_test, 2)
end
test "the register can be read from" do
mod = test_mod()
Chip
|> expect(:read_register, 1, fn conn, address, bytes ->
{:read_register, conn, address, bytes}
end)
assert mod.read_rw_test(:conn) == {:read_register, :conn, 3, 7}
end
test "the register can be written to" do
mod = test_mod()
Chip
|> expect(:write_register, 1, fn conn, address, data ->
{:write_register, conn, address, data}
end)
assert mod.write_rw_test(:conn, <<1, 1, 3, 4, 7, 11, 18>>) ==
{:write_register, :conn, 3, <<1, 1, 3, 4, 7, 11, 18>>}
end
test "the register contents can be swapped" do
mod = test_mod()
Chip
|> expect(:swap_register, 1, fn conn, address, data ->
{:swap_register, conn, address, data}
end)
assert mod.swap_rw_test(:conn, <<1, 1, 3, 4, 7, 11, 18>>) ==
{:swap_register, :conn, 3, <<1, 1, 3, 4, 7, 11, 18>>}
end
test "the register contents can be updated" do
mod = test_mod()
Chip
|> expect(:read_register, 1, fn conn, address, bytes ->
assert conn == :conn
assert address == 3
assert bytes == 7
{:ok, <<1, 1, 3, 4, 7, 11, 18>>}
end)
|> expect(:write_register, 1, fn conn, address, data ->
assert conn == :conn
assert address == 3
assert data == <<18, 11, 7, 4, 3, 1, 1>>
:ok
end)
swapper = fn <<a, b, c, d, e, f, g>> -> <<g, f, e, d, c, b, a>> end
assert mod.update_rw_test(:conn, swapper) == :ok
end
end
defp test_mod do
mod = TestUtils.random_module_name()
defmodule mod do
use Wafer.Registers
defregister(:ro_test, 1, :ro, 3)
defregister(:wo_test, 2, :wo, 5)
defregister(:rw_test, 3, :rw, 7)
end
mod
end
end