From ed9a357a84f7812c12c2fd8fbfd4c8e289a031a1 Mon Sep 17 00:00:00 2001 From: Eric Entin Date: Sat, 28 May 2016 12:07:37 -0400 Subject: [PATCH 1/4] Enhance the ExUnit.AssertionError message. --- lib/ex_unit/lib/ex_unit/assertions.ex | 7 ++++ lib/ex_unit/lib/ex_unit/formatter.ex | 41 ++++++++++++-------- lib/ex_unit/test/ex_unit/assertions_test.exs | 11 ++++++ 3 files changed, 43 insertions(+), 16 deletions(-) diff --git a/lib/ex_unit/lib/ex_unit/assertions.ex b/lib/ex_unit/lib/ex_unit/assertions.ex index 1bbb3bc96c7..832571d4ef1 100644 --- a/lib/ex_unit/lib/ex_unit/assertions.ex +++ b/lib/ex_unit/lib/ex_unit/assertions.ex @@ -16,6 +16,13 @@ defmodule ExUnit.AssertionError do def no_value do @no_value end + + def message(assertion_error) do + ExUnit.Formatter.format_assertion_error(assertion_error, :infinity, &formatter/2, "") + end + + defp formatter(:colors_enabled?, _), do: false + defp formatter(_, msg), do: msg end defmodule ExUnit.MultiError do diff --git a/lib/ex_unit/lib/ex_unit/formatter.ex b/lib/ex_unit/lib/ex_unit/formatter.ex index 61034d656cf..2e1a5efb96c 100644 --- a/lib/ex_unit/lib/ex_unit/formatter.ex +++ b/lib/ex_unit/lib/ex_unit/formatter.ex @@ -118,6 +118,30 @@ defmodule ExUnit.Formatter do <> report(tags, failures, width, formatter) end + @doc false + def format_assertion_error(%ExUnit.AssertionError{} = struct, width, formatter, counter_padding \\ @counter_padding) do + padding_size = byte_size(@inspect_padding) + + fields = [ + note: if_value(struct.message, &format_banner(&1, formatter)), + code: if_value(struct.expr, &code_multiline(&1, padding_size)), + lhs: if_value(struct.left, &inspect_multiline(&1, padding_size, width)), + rhs: if_value(struct.right, &inspect_multiline(&1, padding_size, width)) + ] + + fields = + if formatter.(:colors_enabled?, nil) do + fields ++ [diff: format_diff(struct, formatter)] + else + fields + end + + fields + |> filter_interesting_fields() + |> format_each_field(formatter) + |> make_into_lines(counter_padding) + end + defp report(tags, failures, width, formatter) do case Map.take(tags, List.wrap(tags[:report])) do report when map_size(report) == 0 -> @@ -149,22 +173,7 @@ defmodule ExUnit.Formatter do end defp format_kind_reason(:error, %ExUnit.AssertionError{} = struct, width, formatter) do - padding_size = byte_size(@inspect_padding) - - fields = [ - note: if_value(struct.message, &format_banner(&1, formatter)), - code: if_value(struct.expr, &code_multiline(&1, padding_size)), - lhs: if_value(struct.left, &inspect_multiline(&1, padding_size, width)), - rhs: if_value(struct.right, &inspect_multiline(&1, padding_size, width)) - ] - if formatter.(:colors_enabled?, nil) do - fields ++ [diff: format_diff(struct, formatter)] - else - fields - end - |> filter_interesting_fields() - |> format_each_field(formatter) - |> make_into_lines(@counter_padding) + format_assertion_error(struct, width, formatter) end defp format_kind_reason(kind, reason, _width, formatter) do diff --git a/lib/ex_unit/test/ex_unit/assertions_test.exs b/lib/ex_unit/test/ex_unit/assertions_test.exs index 04312e44a8d..585dfeb8673 100644 --- a/lib/ex_unit/test/ex_unit/assertions_test.exs +++ b/lib/ex_unit/test/ex_unit/assertions_test.exs @@ -593,6 +593,17 @@ defmodule ExUnit.AssertionsTest do "no function clause matching in ExUnit.Assertions.flunk/1" = FunctionClauseError.message error end + test "AssertionError message should include nice formatting" do + assert :a = :b + rescue + error in [ExUnit.AssertionError] -> + """ + match (=) failed + code: :a = :b + rhs: :b + """ = Exception.message(error) + end + defp ok(val), do: {:ok, val} defp error(val), do: {:error, val} end From 1228f1837683a193bac20bc791d0b23d8c54135a Mon Sep 17 00:00:00 2001 From: Eric Entin Date: Sat, 28 May 2016 12:25:21 -0400 Subject: [PATCH 2/4] Add newline to ExUnit.AssertionError message. --- lib/ex_unit/lib/ex_unit/assertions.ex | 4 +++- lib/ex_unit/test/ex_unit/assertions_test.exs | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/ex_unit/lib/ex_unit/assertions.ex b/lib/ex_unit/lib/ex_unit/assertions.ex index 832571d4ef1..7937efa7f26 100644 --- a/lib/ex_unit/lib/ex_unit/assertions.ex +++ b/lib/ex_unit/lib/ex_unit/assertions.ex @@ -3,6 +3,8 @@ defmodule ExUnit.AssertionError do Raised to signal an assertion error. """ + alias ExUnit.Formatter, as: F + @no_value :ex_unit_no_meaningful_value defexception left: @no_value, @@ -18,7 +20,7 @@ defmodule ExUnit.AssertionError do end def message(assertion_error) do - ExUnit.Formatter.format_assertion_error(assertion_error, :infinity, &formatter/2, "") + "\n" <> F.format_assertion_error(assertion_error, :infinity, &formatter/2, "") end defp formatter(:colors_enabled?, _), do: false diff --git a/lib/ex_unit/test/ex_unit/assertions_test.exs b/lib/ex_unit/test/ex_unit/assertions_test.exs index 585dfeb8673..ed61d47e849 100644 --- a/lib/ex_unit/test/ex_unit/assertions_test.exs +++ b/lib/ex_unit/test/ex_unit/assertions_test.exs @@ -598,6 +598,7 @@ defmodule ExUnit.AssertionsTest do rescue error in [ExUnit.AssertionError] -> """ + match (=) failed code: :a = :b rhs: :b From f1d89779848288e9efbaacaea48434fbcd454c07 Mon Sep 17 00:00:00 2001 From: Eric Entin Date: Sat, 28 May 2016 12:35:16 -0400 Subject: [PATCH 3/4] Add 2 newlines at the start of ExUnit.AssertionError message. --- lib/ex_unit/lib/ex_unit/assertions.ex | 2 +- lib/ex_unit/test/ex_unit/assertions_test.exs | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/ex_unit/lib/ex_unit/assertions.ex b/lib/ex_unit/lib/ex_unit/assertions.ex index 7937efa7f26..d84cbf9fe70 100644 --- a/lib/ex_unit/lib/ex_unit/assertions.ex +++ b/lib/ex_unit/lib/ex_unit/assertions.ex @@ -20,7 +20,7 @@ defmodule ExUnit.AssertionError do end def message(assertion_error) do - "\n" <> F.format_assertion_error(assertion_error, :infinity, &formatter/2, "") + "\n\n" <> F.format_assertion_error(assertion_error, :infinity, &formatter/2, "") end defp formatter(:colors_enabled?, _), do: false diff --git a/lib/ex_unit/test/ex_unit/assertions_test.exs b/lib/ex_unit/test/ex_unit/assertions_test.exs index ed61d47e849..7c899a4600f 100644 --- a/lib/ex_unit/test/ex_unit/assertions_test.exs +++ b/lib/ex_unit/test/ex_unit/assertions_test.exs @@ -599,6 +599,7 @@ defmodule ExUnit.AssertionsTest do error in [ExUnit.AssertionError] -> """ + match (=) failed code: :a = :b rhs: :b From 9a8430484af26ea9db6c691076aa05e297f85524 Mon Sep 17 00:00:00 2001 From: Eric Entin Date: Sat, 28 May 2016 12:35:58 -0400 Subject: [PATCH 4/4] Change ExUnit.Formatter :colors_enabled? to :diff_enabled? and default to false --- lib/ex_unit/lib/ex_unit/assertions.ex | 1 - lib/ex_unit/lib/ex_unit/cli_formatter.ex | 2 +- lib/ex_unit/lib/ex_unit/formatter.ex | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/ex_unit/lib/ex_unit/assertions.ex b/lib/ex_unit/lib/ex_unit/assertions.ex index d84cbf9fe70..ee3b91cc120 100644 --- a/lib/ex_unit/lib/ex_unit/assertions.ex +++ b/lib/ex_unit/lib/ex_unit/assertions.ex @@ -23,7 +23,6 @@ defmodule ExUnit.AssertionError do "\n\n" <> F.format_assertion_error(assertion_error, :infinity, &formatter/2, "") end - defp formatter(:colors_enabled?, _), do: false defp formatter(_, msg), do: msg end diff --git a/lib/ex_unit/lib/ex_unit/cli_formatter.ex b/lib/ex_unit/lib/ex_unit/cli_formatter.ex index 88b1a73da3b..cde8f89caa3 100644 --- a/lib/ex_unit/lib/ex_unit/cli_formatter.ex +++ b/lib/ex_unit/lib/ex_unit/cli_formatter.ex @@ -197,7 +197,7 @@ defmodule ExUnit.CLIFormatter do colorize(:red, msg, config) end - defp formatter(:colors_enabled?, _, %{colors: colors}), + defp formatter(:diff_enabled?, _, %{colors: colors}), do: colors[:enabled] defp formatter(:error_info, msg, config), diff --git a/lib/ex_unit/lib/ex_unit/formatter.ex b/lib/ex_unit/lib/ex_unit/formatter.ex index 2e1a5efb96c..c3649c6e54c 100644 --- a/lib/ex_unit/lib/ex_unit/formatter.ex +++ b/lib/ex_unit/lib/ex_unit/formatter.ex @@ -130,7 +130,7 @@ defmodule ExUnit.Formatter do ] fields = - if formatter.(:colors_enabled?, nil) do + if formatter.(:diff_enabled?, nil) == true do fields ++ [diff: format_diff(struct, formatter)] else fields