farmbot_os/farmbot_firmware/test/farmbot_firmware_test.exs

100 lines
3.1 KiB
Elixir

defmodule FarmbotFirmwareTest do
use ExUnit.Case
doctest FarmbotFirmware
def try_command(pid, cmd) do
GenServer.call(pid, cmd, :infinity)
end
def try_cast(pid, cmd) do
GenServer.cast(pid, cmd)
end
def firmware_server do
arg = [transport: FarmbotFirmware.StubTransport, reset: StubReset]
{:ok, pid} = FarmbotFirmware.start_link(arg, [])
send(pid, :timeout)
try_command(pid, {nil, {:command_emergency_lock, []}})
try_command(pid, {nil, {:command_emergency_unlock, []}})
pid
end
@tag :capture_log
test "various reports" do
pid = firmware_server()
reports = [
{:report_begin, []},
{:report_busy, []},
{:report_emergency_lock, []},
{:report_error, [:calibration_error]},
{:report_error, [:emergency_lock]},
{:report_error, [:invalid_command]},
{:report_error, [:no_config]},
{:report_error, [:no_error]},
{:report_error, [:other]},
{:report_error, [:stall_detected]},
{:report_error, [:stall_detected_x]},
{:report_error, [:stall_detected_y]},
{:report_error, [:stall_detected_z]},
{:report_error, [:timeout]},
{:report_error, []},
{:report_home_complete, [:x]},
{:report_invalid, []},
{:report_load, 23.0},
{:report_retry, []},
{:report_success, []},
{:report_axis_timeout, [:x]},
{:report_debug_message, ["Hello"]},
{:report_axis_state, [x: :idle]},
{:report_encoders_raw, [x: 1.4, y: 2.3, z: 3.2]},
{:report_encoders_scaled, [{:x, 100.0}, {:y, 200.0}, {:z, 400.0}]},
{:report_end_stops, [xa: 1, xb: 2, ya: 3, yb: 4, za: 5, zb: 6]},
{:report_parameter_value, [{:param_version, 1.2}]},
{:report_pin_value, [{:p, 1}, {:v, 2}, {:m, 0}, {:q, 3}]},
{:report_position_change, [{:x, 200.0}]},
{:report_position, [x: 1.4, y: 2.3, z: 3.2, s: 4.1]},
{:report_software_version, ["6.5.0.G"]}
]
Enum.map(reports, fn report ->
assert :ok = try_cast(pid, {:x, report})
end)
Process.sleep(1000)
end
@tag :capture_log
test "various command()s" do
pid = firmware_server()
cmds = [
# TEST VALUES EXTRACTED FROM A REAL BOT
# They may change over time, so a test failure
# is not necessarily indicitive of a defect,
# but it *IS* indicitve of a change (perhaps unepxected?)
# in runtime behavior.
#
# Approach with caution.
{:command_movement,
[x: 0.0, y: 0.0, z: 0.0, a: 400.0, b: 400.0, c: 400.0]},
{:command_movement,
[x: 0.0, y: 0.0, z: 10.0, a: 400.0, b: 400.0, c: 400.0]},
{:parameter_write, [movement_home_up_y: 0.0]},
{:parameter_write, [movement_home_up_y: 1.0]},
{:parameter_write, [movement_invert_2_endpoints_y: 1.0]},
{:parameter_write, [movement_stop_at_home_x: 0.0]},
{:parameter_write, [movement_stop_at_home_x: 1.0]},
{:pin_mode_write, [p: 13, m: 1]},
{:pin_write, [p: 13, v: 0, m: 0]},
{:pin_write, [p: 13, v: 1, m: 0]},
{:position_write_zero, [:x]}
# {:command_emergency_lock, []},
]
Enum.map(cmds, fn cmd ->
assert {:ok, "2"} = try_command(pid, {"2", cmd})
end)
end
end