4b27f5441f
* 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.
208 lines
4.8 KiB
Elixir
208 lines
4.8 KiB
Elixir
defmodule WaferElixirALE.I2CTest do
|
|
use ExUnit.Case, async: true
|
|
use Mimic
|
|
alias Wafer.Driver.ElixirALE.I2C.Wrapper
|
|
alias Wafer.Chip
|
|
alias Wafer.Driver.ElixirALE.I2C, as: Subject
|
|
alias Wafer.I2C
|
|
@moduledoc false
|
|
|
|
describe "acquire/1" do
|
|
test "opens the bus and verifies that the device is present" do
|
|
buspid = self()
|
|
busname = "i2c-1"
|
|
address = 0x13
|
|
|
|
Wrapper
|
|
|> expect(:start_link, 1, fn bus, address ->
|
|
assert bus == busname
|
|
assert address == 0x13
|
|
{:ok, buspid}
|
|
end)
|
|
|> expect(:detect_devices, 1, fn pid ->
|
|
assert buspid == pid
|
|
[address]
|
|
end)
|
|
|
|
assert {:ok, %Subject{} = conn} = Subject.acquire(bus_name: busname, address: address)
|
|
end
|
|
|
|
test "when the device is not present on the bus" do
|
|
buspid = self()
|
|
busname = "i2c-1"
|
|
address = 0x13
|
|
|
|
Wrapper
|
|
|> expect(:start_link, 1, fn bus, address ->
|
|
assert bus == busname
|
|
assert address == 0x13
|
|
{:ok, buspid}
|
|
end)
|
|
|> expect(:detect_devices, 1, fn pid ->
|
|
assert buspid == pid
|
|
[]
|
|
end)
|
|
|
|
assert {:error, _reason} = Subject.acquire(bus_name: busname, address: address)
|
|
end
|
|
|
|
test "when the device is not present on the bus but an override is forced" do
|
|
buspid = self()
|
|
busname = "i2c-1"
|
|
address = 0x13
|
|
|
|
Wrapper
|
|
|> expect(:start_link, 1, fn bus, address ->
|
|
assert bus == busname
|
|
assert address == 0x13
|
|
{:ok, buspid}
|
|
end)
|
|
|> expect(:detect_devices, 1, fn pid ->
|
|
assert buspid == pid
|
|
[]
|
|
end)
|
|
|
|
assert {:ok, %Subject{} = conn} =
|
|
Subject.acquire(bus_name: busname, address: address, force: true)
|
|
end
|
|
|
|
test "when the bus name is not specified it returns an error" do
|
|
assert {:error, _} = Subject.acquire(address: 0x13)
|
|
end
|
|
|
|
test "when the address is not specified it returns an error" do
|
|
assert {:error, _} = Subject.acquire(bus_name: "i2c-1")
|
|
end
|
|
end
|
|
|
|
describe "release/1" do
|
|
test "closes the bus connection" do
|
|
conn = conn()
|
|
|
|
Wrapper
|
|
|> expect(:release, 1, fn pid ->
|
|
assert pid == conn.pid
|
|
:ok
|
|
end)
|
|
|
|
assert :ok = Subject.release(conn)
|
|
end
|
|
end
|
|
|
|
describe "Chip.read_register/3" do
|
|
test "reads from the device's register" do
|
|
conn = conn()
|
|
|
|
Wrapper
|
|
|> expect(:write_read, 1, fn pid, data, bytes ->
|
|
assert pid == conn.pid
|
|
assert data == <<0>>
|
|
assert bytes == 2
|
|
<<0, 0>>
|
|
end)
|
|
|
|
assert {:ok, <<0, 0>>} = Chip.read_register(conn, 0, 2)
|
|
end
|
|
end
|
|
|
|
describe "Chip.write_register/3" do
|
|
test "writes to the device's register" do
|
|
conn = conn()
|
|
|
|
Wrapper
|
|
|> expect(:write, 1, fn pid, data ->
|
|
assert pid == conn.pid
|
|
assert data == <<1, 2, 3>>
|
|
:ok
|
|
end)
|
|
|
|
assert {:ok, %Subject{}} = Chip.write_register(conn, 1, <<2, 3>>)
|
|
end
|
|
end
|
|
|
|
describe "Chip.swap_register/3" do
|
|
test "swaps the device's register value for a new value, returning the old value" do
|
|
conn = conn()
|
|
|
|
Wrapper
|
|
|> expect(:write_read, 1, fn pid, data, bytes ->
|
|
assert pid == conn.pid
|
|
assert data == <<0>>
|
|
assert bytes == 2
|
|
<<0, 0>>
|
|
end)
|
|
|
|
Wrapper
|
|
|> expect(:write, 1, fn pid, data ->
|
|
assert pid == conn.pid
|
|
assert data == <<0, 1, 1>>
|
|
:ok
|
|
end)
|
|
|
|
assert {:ok, <<0, 0>>, %Subject{}} = Chip.swap_register(conn, 0, <<1, 1>>)
|
|
end
|
|
end
|
|
|
|
describe "I2C.read/2" do
|
|
test "reads from the device" do
|
|
conn = conn()
|
|
|
|
Wrapper
|
|
|> expect(:read, 1, fn pid, bytes ->
|
|
assert pid == conn.pid
|
|
assert bytes == 2
|
|
<<0, 0>>
|
|
end)
|
|
|
|
assert {:ok, <<0, 0>>} = I2C.read(conn, 2)
|
|
end
|
|
end
|
|
|
|
describe "I2C.write/2" do
|
|
test "it writes to the device" do
|
|
conn = conn()
|
|
|
|
Wrapper
|
|
|> expect(:write, 1, fn pid, data ->
|
|
assert pid == conn.pid
|
|
assert data == <<0, 0>>
|
|
:ok
|
|
end)
|
|
|
|
assert {:ok, %Subject{}} = I2C.write(conn, <<0, 0>>)
|
|
end
|
|
end
|
|
|
|
describe "I2C.write_read/3" do
|
|
test "it writes to then reads from the device" do
|
|
conn = conn()
|
|
|
|
Wrapper
|
|
|> expect(:write_read, 1, fn pid, data, bytes ->
|
|
assert pid == conn.pid
|
|
assert data == <<1>>
|
|
assert bytes == 2
|
|
|
|
<<0, 0>>
|
|
end)
|
|
|
|
assert {:ok, <<0, 0>>, %Subject{}} = I2C.write_read(conn, <<1>>, 2)
|
|
end
|
|
end
|
|
|
|
describe "I2C.detect_devices/1" do
|
|
test "it detects devices" do
|
|
conn = conn()
|
|
|
|
Wrapper
|
|
|> expect(:detect_devices, 1, fn pid ->
|
|
assert conn.pid == pid
|
|
[conn.address]
|
|
end)
|
|
|
|
assert {:ok, [0x13]} = I2C.detect_devices(conn)
|
|
end
|
|
end
|
|
|
|
defp conn, do: %Subject{pid: self(), bus: "i2c-1", address: 0x13}
|
|
end
|