diff --git a/lib/cli.ex b/lib/cli.ex index 4840862..cc247f4 100644 --- a/lib/cli.ex +++ b/lib/cli.ex @@ -21,25 +21,34 @@ defmodule Onigumo.CLI do {working_dir, switches} = Keyword.pop(switches, :working_dir, File.cwd!()) case switches do - [] -> module.main(working_dir) - _ -> usage_message() + [] -> + module.main(working_dir) + + _ -> + OptionParser.to_argv(switches) + |> Enum.join(", ") + |> then(&"incompatible OPTIONS #{&1}") + |> usage_message() end :error -> - usage_message() + usage_message("invalid COMPONENT #{component}") end - {_, _, [_ | _]} -> - usage_message() + {_, _, invalid = [_ | _]} -> + Enum.map(invalid, &elem(&1, 0)) + |> Enum.join(", ") + |> then(&"invalid OPTIONS #{&1}") + |> usage_message() {_, argv, _} when length(argv) != 1 -> - usage_message() + usage_message("exactly one COMPONENT must be provided") end end - defp usage_message() do + defp usage_message(reason) do IO.write(""" - onigumo: invalid usage + onigumo: invalid usage – #{reason} Usage: onigumo [OPTION]... [COMPONENT] Try `onigumo --help' for more options. diff --git a/test/onigumo_cli_test.exs b/test/onigumo_cli_test.exs index 87d0bf6..a246ec0 100644 --- a/test/onigumo_cli_test.exs +++ b/test/onigumo_cli_test.exs @@ -9,8 +9,9 @@ defmodule OnigumoCLITest do ] @invalid_switches [ - "--invalid", - "-c" + ["--invalid"], + ["-c"], + ["-a", "-b"] ] @invalid_combinations [ @@ -32,27 +33,42 @@ defmodule OnigumoCLITest do describe("Onigumo.CLI.main/1") do for argument <- @invalid_arguments do test("run CLI with invalid argument #{inspect(argument)}") do - assert usage_message_printed?(fn -> Onigumo.CLI.main([unquote(argument)]) end) + assert usage_message_printed?( + fn -> Onigumo.CLI.main([unquote(argument)]) end, + "invalid COMPONENT #{unquote(argument)}" + ) end end test("run CLI with no arguments") do - assert usage_message_printed?(fn -> Onigumo.CLI.main([]) end) + assert usage_message_printed?( + fn -> Onigumo.CLI.main([]) end, + "exactly one COMPONENT must be provided" + ) end test("run CLI with more than one argument") do - assert usage_message_printed?(fn -> Onigumo.CLI.main(["Downloader", "Parser"]) end) + assert usage_message_printed?( + fn -> Onigumo.CLI.main(["Downloader", "Parser"]) end, + "exactly one COMPONENT must be provided" + ) end for switch <- @invalid_switches do test("run CLI with invalid switch #{inspect(switch)}") do - assert usage_message_printed?(fn -> Onigumo.CLI.main([unquote(switch)]) end) + assert usage_message_printed?( + fn -> Onigumo.CLI.main(unquote(switch)) end, + "invalid OPTIONS #{Enum.join(unquote(switch), ", ")}" + ) end end for combination <- @invalid_combinations do test("run CLI with invalid combination #{inspect(combination)}") do - assert usage_message_printed?(fn -> Onigumo.CLI.main(unquote(combination)) end) + assert usage_message_printed?( + fn -> Onigumo.CLI.main(unquote(combination)) end, + "incompatible OPTIONS --help" + ) end end @@ -73,7 +89,10 @@ defmodule OnigumoCLITest do end test("run CLI 'downloader' with #{inspect(switch)} without any value") do - assert usage_message_printed?(fn -> Onigumo.CLI.main(["downloader", unquote(switch)]) end) + assert usage_message_printed?( + fn -> Onigumo.CLI.main(["downloader", unquote(switch)]) end, + "invalid OPTIONS #{unquote(switch)}" + ) end end @@ -96,9 +115,9 @@ defmodule OnigumoCLITest do String.match?(output, ~r/\N\n\z/) end - defp usage_message_printed?(function) do + defp usage_message_printed?(function, reason) do output = capture_io(function) - String.starts_with?(output, "onigumo: invalid usage") + String.starts_with?(output, "onigumo: invalid usage – #{reason}") end defp help_message_printed?(function) do