diff --git a/lib/cabbage/feature.ex b/lib/cabbage/feature.ex index ee54ed7..ea47c78 100644 --- a/lib/cabbage/feature.ex +++ b/lib/cabbage/feature.ex @@ -224,19 +224,14 @@ defmodule Cabbage.Feature do {:ok, Map.merge( Cabbage.Feature.Helpers.fetch_state(unquote(scenario.name), __MODULE__), - context || %{} + Cabbage.Feature.Helpers.to_map(context) )} end tags = Cabbage.Feature.Helpers.map_tags(scenario.tags) || [] name = - ExUnit.Case.register_test( - __ENV__, - :scenario, - scenario.name, - tags - ) + Cabbage.Feature.Helpers.register_test(__ENV__, :scenario, scenario.name, tags) def unquote(name)(exunit_state) do Cabbage.Feature.Helpers.start_state(unquote(scenario.name), __MODULE__, exunit_state) diff --git a/lib/cabbage/feature/helpers.ex b/lib/cabbage/feature/helpers.ex index f2c4513..b589233 100644 --- a/lib/cabbage/feature/helpers.ex +++ b/lib/cabbage/feature/helpers.ex @@ -94,6 +94,18 @@ defmodule Cabbage.Feature.Helpers do end end + def to_map(value) when is_map(value), do: value + def to_map(value) when is_list(value), do: Map.new(value) + def to_map(nil), do: %{} + + def register_test(env, test_type, name, tags) do + if function_exported?(ExUnit.Case, :register_test, 6) do + apply(ExUnit.Case, :register_test, [env.module, env.file, env.line, test_type, name, tags]) + else + apply(ExUnit.Case, :register_test, [env, test_type, name, tags]) + end + end + def map_tags(tags) do tags |> Enum.map(fn diff --git a/mix.exs b/mix.exs index 5642be6..1d99594 100644 --- a/mix.exs +++ b/mix.exs @@ -48,8 +48,8 @@ defmodule Cabbage.Mixfile do defp deps do [ {:gherkin, "~> 2.0"}, - {:ex_doc, "~> 0.19", only: :dev}, - {:excoveralls, "~> 0.10", only: :test} + {:ex_doc, "~> 0.40", only: :dev}, + {:excoveralls, "~> 0.18", only: :test} ] end diff --git a/mix.lock b/mix.lock index 631e221..0fa198f 100644 --- a/mix.lock +++ b/mix.lock @@ -1,20 +1,11 @@ %{ - "certifi": {:hex, :certifi, "2.5.1", "867ce347f7c7d78563450a18a6a28a8090331e77fa02380b4a21962a65d36ee5", [:rebar3], [{:parse_trans, "~> 3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm", "805abd97539caf89ec6d4732c91e62ba9da0cda51ac462380bbd28ee697a8c42"}, - "earmark": {:hex, :earmark, "1.4.39", "acdb2f02c536471029dbcc509fbd6b94b89f40ad7729fb3f68f4b6944843f01d", [:mix], [{:earmark_parser, "~> 1.4.33", [hex: :earmark_parser, repo: "hexpm", optional: false]}], "hexpm", "156c9d8ec3cbeccdbf26216d8247bdeeacc8c76b4d9eee7554be2f1b623ea440"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.33", "3c3fd9673bb5dcc9edc28dd90f50c87ce506d1f71b70e3de69aa8154bc695d44", [:mix], [], "hexpm", "2d526833729b59b9fdb85785078697c72ac5e5066350663e5be6a1182da61b8f"}, - "ex_doc": {:hex, :ex_doc, "0.30.6", "5f8b54854b240a2b55c9734c4b1d0dd7bdd41f71a095d42a70445c03cf05a281", [:mix], [{:earmark_parser, "~> 1.4.31", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "bd48f2ddacf4e482c727f9293d9498e0881597eae6ddc3d9562bd7923375109f"}, - "excoveralls": {:hex, :excoveralls, "0.17.1", "83fa7906ef23aa7fc8ad7ee469c357a63b1b3d55dd701ff5b9ce1f72442b2874", [:mix], [{:castore, "~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "95bc6fda953e84c60f14da4a198880336205464e75383ec0f570180567985ae0"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.44", "f20830dd6b5c77afe2b063777ddbbff09f9759396500cdbe7523efd58d7a339c", [:mix], [], "hexpm", "4778ac752b4701a5599215f7030989c989ffdc4f6df457c5f36938cc2d2a2750"}, + "ex_doc": {:hex, :ex_doc, "0.40.1", "67542e4b6dde74811cfd580e2c0149b78010fd13001fda7cfeb2b2c2ffb1344d", [:mix], [{:earmark_parser, "~> 1.4.44", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "bcef0e2d360d93ac19f01a85d58f91752d930c0a30e2681145feea6bd3516e00"}, + "excoveralls": {:hex, :excoveralls, "0.18.5", "e229d0a65982613332ec30f07940038fe451a2e5b29bce2a5022165f0c9b157e", [:mix], [{:castore, "~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "523fe8a15603f86d64852aab2abe8ddbd78e68579c8525ae765facc5eae01562"}, "gherkin": {:hex, :gherkin, "2.0.0", "41ac44571b47973c9dae198ead9650fed5363d5d512e8f6cfa643bf465910378", [:mix], [], "hexpm", "9cf21905d025f2487c1abc16f7c4e239088634a390da95253fcf70a4a8935828"}, - "hackney": {:hex, :hackney, "1.15.1", "9f8f471c844b8ce395f7b6d8398139e26ddca9ebc171a8b91342ee15a19963f4", [:rebar3], [{:certifi, "2.5.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~> 1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.4", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm", "c2790c9f0f7205f4a362512192dee8179097394400e745e4d20bab7226a8eaad"}, - "idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "4bdd305eb64e18b0273864920695cb18d7a2021f31a11b9c5fbcd9a253f936e2"}, - "jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"}, - "makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.16.1", "cc9e3ca312f1cfeccc572b37a09980287e243648108384b97ff2b76e505c3555", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "e127a341ad1b209bd80f7bd1620a15693a9908ed780c3b763bccf7d200c767c6"}, - "makeup_erlang": {:hex, :makeup_erlang, "0.1.2", "ad87296a092a46e03b7e9b0be7631ddcf64c790fa68a9ef5323b6cbb36affc72", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f3f5a1ca93ce6e092d92b6d9c049bcda58a3b617a8d888f8e7231c85630e8108"}, - "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, - "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"}, - "nimble_parsec": {:hex, :nimble_parsec, "1.3.1", "2c54013ecf170e249e9291ed0a62e5832f70a476c61da16f6aac6dca0189f2af", [:mix], [], "hexpm", "2682e3c0b2eb58d90c6375fc0cc30bc7be06f365bf72608804fb9cffa5e1b167"}, - "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm", "17ef63abde837ad30680ea7f857dd9e7ced9476cdd7b0394432af4bfc241b960"}, - "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.4", "f0eafff810d2041e93f915ef59899c923f4568f4585904d010387ed74988e77b", [:make, :mix, :rebar3], [], "hexpm", "603561dc0fd62f4f2ea9b890f4e20e1a0d388746d6e20557cafb1b16950de88c"}, - "unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm", "1d1848c40487cdb0b30e8ed975e34e025860c02e419cb615d255849f3427439d"}, + "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, + "makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"}, + "makeup_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"}, + "makeup_erlang": {:hex, :makeup_erlang, "1.0.3", "4252d5d4098da7415c390e847c814bad3764c94a814a0b4245176215615e1035", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "953297c02582a33411ac6208f2c6e55f0e870df7f80da724ed613f10e6706afd"}, + "nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"}, } diff --git a/test/feature_execution_test.exs b/test/feature_execution_test.exs index f99230c..a9b55ab 100644 --- a/test/feature_execution_test.exs +++ b/test/feature_execution_test.exs @@ -46,7 +46,7 @@ defmodule Cabbage.FeatureExecutionTest do {result, output} = CabbageTestHelper.run() assert result == %{failures: 1, skipped: 0, total: 1, excluded: 0} - assert output =~ "** (BadMapError) expected a map, got: [some: :some]" + assert output =~ "** (BadMapError) expected a map, got:" and output =~ "[some: :some]" end test "accepts state steps that does comply to pattern {:ok, map}" do diff --git a/test/test_helper.exs b/test/test_helper.exs index 6d7f0f2..54f8634 100644 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -28,26 +28,42 @@ defmodule CabbageTestHelper do end defp versioned_callbacks() do - System.version() - |> then(&{Version.compare(&1, "1.6.6"), Version.compare(&1, "1.15.0")}) - |> case do - {:lt, _} -> - {&ExUnit.Server.add_sync_case/1, &ExUnit.Server.cases_loaded/0, &fix_13_elixir_test_result/1} + {resolve_add_module(), resolve_load_modules(), resolve_result_fix()} + end + + defp resolve_add_module() do + cond do + function_exported?(ExUnit.Server, :add_module, 2) -> + fn mod -> + apply(ExUnit.Server, :add_module, [mod, %{async?: false, group: nil, parameterize: nil}]) + end - {:eq, _} -> - {&ExUnit.Server.add_async_module/1, &ExUnit.Server.modules_loaded/0, &fix_13_elixir_test_result/1} + function_exported?(ExUnit.Server, :add_sync_module, 1) -> + &apply(ExUnit.Server, :add_sync_module, [&1]) - {_, :lt} -> - {&ExUnit.Server.add_sync_module/1, &ExUnit.Server.modules_loaded/0, &fix_17_elixir_test_result/1} + true -> + &apply(ExUnit.Server, :add_sync_case, [&1]) + end + end - {_, _} -> - {&ExUnit.Server.add_sync_module/1, fn -> ExUnit.Server.modules_loaded(true) end, &fix_17_elixir_test_result/1} + defp resolve_load_modules() do + if function_exported?(ExUnit.Server, :modules_loaded, 1) do + fn -> apply(ExUnit.Server, :modules_loaded, [true]) end + else + fn -> apply(ExUnit.Server, :modules_loaded, []) end end end - defp fix_17_elixir_test_result(result), do: result + defp resolve_result_fix() do + version = Version.parse!(System.version()) - defp fix_13_elixir_test_result(result) do - Map.merge(result, %{excluded: Map.get(result, :skipped, 0), skipped: 0}) + cond do + Version.match?(version, ">= 1.17.0") -> &normalize_runner_result/1 + Version.match?(version, ">= 1.13.0") -> & &1 + true -> fn result -> Map.merge(result, %{excluded: Map.get(result, :skipped, 0), skipped: 0}) end + end end + + defp normalize_runner_result({result, _}), do: result + defp normalize_runner_result(result), do: result end diff --git a/test/unit_tests/parameter_test.exs b/test/unit_tests/parameter_test.exs index 9566ac1..81c1a87 100644 --- a/test/unit_tests/parameter_test.exs +++ b/test/unit_tests/parameter_test.exs @@ -7,7 +7,9 @@ defmodule Cabbage.Feature.ParameterTest do test "term in the form of {name:type} returns a parameter" do term = "{name:int}" result = Parameter.convert(term) - assert result == %Cabbage.Feature.Parameter{capture_name: "name", type_regex: ~r/\d+/} + assert %Cabbage.Feature.Parameter{capture_name: capture_name, type_regex: type_regex} = result + assert capture_name == "name" + assert type_regex.source == ~r/\d+/.source end test "term not in the form of a parameter returns itself" do