From 2802e5fbf7b4df9b2d0f04d6a1fea5faf51422a3 Mon Sep 17 00:00:00 2001 From: Pim Kunis Date: Sun, 11 Oct 2020 18:15:16 +0200 Subject: [PATCH] Add tests for player and event. --- lib/midi_tools/event.ex | 14 +++++++++++--- lib/midi_tools/player.ex | 7 +++---- mix.exs | 2 +- test/event_test.exs | 28 +++++++++++++++++++++++++++ test/midi_tools_test.exs | 8 -------- test/player_test.exs | 42 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 85 insertions(+), 16 deletions(-) create mode 100644 test/event_test.exs delete mode 100644 test/midi_tools_test.exs create mode 100644 test/player_test.exs diff --git a/lib/midi_tools/event.ex b/lib/midi_tools/event.ex index 8d7d89c..19acabd 100644 --- a/lib/midi_tools/event.ex +++ b/lib/midi_tools/event.ex @@ -11,8 +11,15 @@ defmodule MIDITools.Event do defstruct channel: 0, tone: 0, start_time: 0, end_time: 0, velocity: 0 - @spec new(MIDISynth.Command.channel(), non_neg_integer(), non_neg_integer(), non_neg_integer(), MIDISynth.Command.velocity()) :: %Note{} - def new(channel, tone, start_time, end_time, velocity) when start_time >= 0 and end_time > start_time do + @spec new( + MIDISynth.Command.channel(), + non_neg_integer(), + non_neg_integer(), + non_neg_integer(), + MIDISynth.Command.velocity() + ) :: %Note{} + def new(channel, tone, start_time, end_time, velocity) + when start_time >= 0 and end_time > start_time do %__MODULE__{ channel: channel, tone: tone, @@ -30,7 +37,8 @@ defmodule MIDITools.Event do defstruct channel: 0, time: 0, program: 0 - @spec new(MIDISynth.Command.channel(), non_neg_integer(), non_neg_integer()) :: %ChangeProgram{} + @spec new(MIDISynth.Command.channel(), non_neg_integer(), non_neg_integer()) :: + %ChangeProgram{} def new(channel, time, program) do %__MODULE__{channel: channel, time: time, program: program} end diff --git a/lib/midi_tools/player.ex b/lib/midi_tools/player.ex index 8e77ddc..bd20a67 100644 --- a/lib/midi_tools/player.ex +++ b/lib/midi_tools/player.ex @@ -66,7 +66,7 @@ defmodule MIDITools.Player do @doc """ Resume playback on the player after it has been paused. """ - @spec resume() :: :ok, {:error, :not_paused} + @spec(resume() :: :ok, {:error, :not_paused}) def resume do GenServer.call(__MODULE__, :resume) end @@ -100,15 +100,14 @@ defmodule MIDITools.Player do start_time = Timex.now() timer = start_timer(schedule, start_time) - {:reply, :ok, - %{reset(state) | timer: timer, start_time: start_time}} + {:reply, :ok, %{reset(state) | timer: timer, start_time: start_time}} end def handle_call({:set_repeat, repeat}, _from, state) do {:reply, :ok, %{state | repeat: repeat}} end - def handle_call(:stop_playing, _from, state) do + def handle_call(:stop_playing, _from, state) do {:reply, :ok, reset(state)} end diff --git a/mix.exs b/mix.exs index 57f98bf..c085ac2 100644 --- a/mix.exs +++ b/mix.exs @@ -29,7 +29,7 @@ defmodule MIDITools.MixProject do [ {:midi_synth, "~> 0.4.0"}, {:timex, "~> 3.6"}, - {:ex_doc, "~> 0.22", only: :dev, runtime: false}, + {:ex_doc, "~> 0.22", only: :dev, runtime: false} ] end end diff --git a/test/event_test.exs b/test/event_test.exs new file mode 100644 index 0000000..17c55f0 --- /dev/null +++ b/test/event_test.exs @@ -0,0 +1,28 @@ +defmodule MIDITools.EventTest do + use ExUnit.Case + doctest MIDITools.Event + + alias MIDITools.Event + + test "note event" do + assert %Event.Note{channel: 0, tone: 60, start_time: 1, end_time: 1000, velocity: 127} = + Event.Note.new(0, 60, 1, 1000, 127) + end + + test "change program event" do + assert %Event.ChangeProgram{channel: 0, time: 1, program: 40} = + Event.ChangeProgram.new(0, 1, 40) + end + + test "note event conversion" do + note = Event.Note.new(0, 60, 1, 1000, 127) + [note_on, note_off] = Event.convert(note) + assert {1, <<0x90, 60, 127>>} = note_on + assert {1000, <<0x80, 60, 64>>} = note_off + end + + test "change program event conversion" do + change_program = Event.ChangeProgram.new(0, 1, 40) + assert [{1, <<0xC0, 40>>}] = Event.convert(change_program) + end +end diff --git a/test/midi_tools_test.exs b/test/midi_tools_test.exs deleted file mode 100644 index 3687866..0000000 --- a/test/midi_tools_test.exs +++ /dev/null @@ -1,8 +0,0 @@ -defmodule MIDIToolsTest do - use ExUnit.Case - doctest MIDITools - - test "greets the world" do - assert MIDITools.hello() == :world - end -end diff --git a/test/player_test.exs b/test/player_test.exs new file mode 100644 index 0000000..f7f85c0 --- /dev/null +++ b/test/player_test.exs @@ -0,0 +1,42 @@ +defmodule MIDITools.PlayerTest do + use ExUnit.Case + doctest MIDITools.Player + + alias MIDITools.Player + + setup do + {:ok, _pid} = Player.start_link() + :ok + end + + setup_all do + events = Enum.map(1..4, &MIDITools.Event.Note.new(9, 51, &1 * 500, (&1 + 1) * 500, 127)) + duration = 2000 + [events: events, duration: duration] + end + + test "play", %{events: events, duration: duration} do + assert :ok = Player.generate_schedule(events, duration) + assert :ok = Player.play() + Process.sleep(2500) + end + + test "pause & resume", %{events: events, duration: duration} do + Player.generate_schedule(events, duration) + Player.play() + Process.sleep(1100) + assert :ok = Player.pause() + Process.sleep(500) + assert :ok = Player.resume() + Process.sleep(1400) + end + + test "pause & resume edge cases", %{events: events, duration: duration} do + Player.generate_schedule(events, duration) + assert {:error, :not_started} = Player.pause() + assert {:error, :not_paused} = Player.resume() + Player.play() + Player.pause() + assert {:error, :already_paused} = Player.pause() + end +end