wafer/test/i2c_test.exs
James Harton 4b27f5441f Code gardening.
* Rename and extract a bunch of modules into their own files to make it easier to navigate the repository.
* Remove fake versions of `ElixirALE` and `Circuits` from `test/support`.
* Create wrapper modules for `ElixirALE` and `Circuits` modules using `defdelegate` instead.
* Use Elixir 1.10's new `@compile {:no_warn_undefined ...}` directive to inhibit compiler warnings for our optional dependencies.
2020-01-08 10:18:38 +13:00

103 lines
2.4 KiB
Elixir

defmodule WaferI2CTest do
use ExUnit.Case, async: true
alias Wafer.Driver.Circuits.I2C, as: Driver
alias Wafer.I2C
alias Wafer.I2C.Wafer.Driver.Circuits.I2C, as: Impl
import Mimic
Code.require_file("test/support/test_utils.exs")
@moduledoc false
setup do
Mimic.copy(Impl)
{:ok, []}
end
describe "__deriving__/3" do
test "deriving with default key name" do
mod = test_mod()
assert I2C.impl_for!(struct(mod, conn: :noop))
end
test "deriving with a specified key name" do
mod = test_mod(:marty)
assert I2C.impl_for!(struct(mod, fruit: :noop))
end
test "reading a derived I2C device" do
outer_mod = test_mod()
outer_struct = struct(outer_mod, conn: %Driver{})
Impl
|> expect(:read, 1, fn conn, bytes, opts ->
assert conn == %Driver{}
assert bytes == 2
assert opts == []
{:ok, <<0>>}
end)
assert {:ok, <<0>>} = I2C.read(outer_struct, 2, [])
end
test "writing a derived I2C device" do
outer_mod = test_mod()
outer_struct = struct(outer_mod, conn: %Driver{})
Impl
|> expect(:write, 1, fn conn, data, opts ->
assert conn == %Driver{}
assert data == <<0>>
assert opts == []
{:ok, conn}
end)
assert {:ok, ^outer_struct} = I2C.write(outer_struct, <<0>>, [])
end
test "write_read on a derived I2C device" do
outer_mod = test_mod()
outer_struct = struct(outer_mod, conn: %Driver{})
Impl
|> expect(:write_read, 1, fn conn, data, bytes, opts ->
assert conn == %Driver{}
assert data == <<0>>
assert bytes == 1
assert opts == []
{:ok, <<1>>, conn}
end)
assert {:ok, <<1>>, ^outer_struct} = I2C.write_read(outer_struct, <<0>>, 1, [])
end
test "detect_devices on a derived I2C device" do
outer_mod = test_mod()
outer_struct = struct(outer_mod, conn: %Driver{})
Impl
|> expect(:detect_devices, 1, fn conn ->
assert conn == %Driver{}
{:ok, []}
end)
assert {:ok, []} = I2C.detect_devices(outer_struct)
end
end
defp test_mod(key \\ :conn) do
mod = TestUtils.random_module_name()
if key == :conn do
defmodule mod do
@derive I2C
defstruct [:conn]
end
else
defmodule mod do
@derive {I2C, key: key}
defstruct [key]
end
end
mod
end
end