midi_player/test/player_test.exs

60 lines
1.8 KiB
Elixir
Raw Normal View History

2020-10-12 14:17:36 +00:00
defmodule MIDIPlayerTest do
2020-10-11 16:15:16 +00:00
use ExUnit.Case
2020-10-12 14:17:36 +00:00
doctest MIDIPlayer
2020-10-11 16:15:16 +00:00
2020-10-12 14:17:36 +00:00
alias MIDIPlayer, as: Player
alias MIDIPlayer.Event
2020-10-11 16:15:16 +00:00
setup do
{:ok, player} = Player.start_link([])
[player: player]
2020-10-11 16:15:16 +00:00
end
setup_all do
events = Enum.map(1..4, &Event.note(9, 51, &1 * 500, (&1 + 1) * 500, 127))
2020-10-11 16:15:16 +00:00
duration = 2000
[events: events, duration: duration]
end
test "play", %{player: player, events: events, duration: duration} do
assert :ok = Player.generate_schedule(player, events, duration)
assert :ok = Player.play(player)
2020-10-11 16:15:16 +00:00
Process.sleep(2500)
end
test "pause & resume", %{player: player, events: events, duration: duration} do
Player.generate_schedule(player, events, duration)
Player.play(player)
2020-10-11 16:15:16 +00:00
Process.sleep(1100)
assert :ok = Player.pause(player)
2020-10-11 16:15:16 +00:00
Process.sleep(500)
assert :ok = Player.resume(player)
2020-10-11 16:15:16 +00:00
Process.sleep(1400)
end
test "pause & resume edge cases", %{player: player, events: events, duration: duration} do
Player.generate_schedule(player, events, duration)
assert {:error, :not_started} = Player.pause(player)
assert {:error, :not_paused} = Player.resume(player)
Player.play(player)
Player.pause(player)
assert {:error, :already_paused} = Player.pause(player)
2020-10-11 16:15:16 +00:00
end
2020-10-12 18:20:59 +00:00
test "event conversion", %{player: player} do
event1 = Event.change_program(0, 1, 40)
event2 = Event.note(0, 60, 1, 1000, 127)
2020-10-12 18:20:59 +00:00
events = [event1, event2]
duration = 100
assert :ok = Player.generate_schedule(player, events, duration)
2020-10-12 18:20:59 +00:00
change_program = MIDISynth.Command.change_program(0, 40)
note_on = MIDISynth.Command.note_on(0, 60, 127)
note_off = MIDISynth.Command.note_off(0, 60)
[command1, command2] = Player.get_schedule(player)
2020-10-12 18:20:59 +00:00
assert {1, <<^change_program::binary-size(2), ^note_on::binary-size(3)>>} = command1
assert {1000, ^note_off} = command2
end
2020-10-11 16:15:16 +00:00
end