com-lihaoyi / utest

A simple testing framework for Scala

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Custom fansi formatting for error messages

bwbecker opened this issue · comments

I'd like to write a custom assertion that compares two strings for equality, highlighting their differences. For example, writing

      val s = "My relatively long string with a difference in the middle"
      "verify" - {
        verify(s).equals("My relatively long string With a difference in the middle")
      }

to produce '...long string [w]ith a differ...' != '...long string [W]ith a differ...' is not hard with uTest out of the box.

However, I'd really like the [w] and [W] to be set in red using the fansi library. I can do that now by passing a fansi-formatted string to the exception AND setting exceptionMsgColor = Attrs.Empty. However, that means that all the rest of the error messages are uncoloured.

I propose adding a marker trait, FansiErrorMarker to the utest. In formatException, test for that trait and, if present, print the message unchanged. Otherwise apply the usual exception message colour:

            current.getMessage match {
              case null => exCls
              case nonNull =>
                current match {
                  case e: FansiErrorMarker ⇒ ufansi.Str.join(exCls, ": ", nonNull)
                  case e ⇒ ufansi.Str.join(exCls, ": ", exceptionMsgColor(nonNull))
                }
            },

Then users can throw new AssertionError(fansiMsg) with FansiErrorMarker with their fansi-formatted message in a backwards compatible way.

Would the maintainers welcome a pull request with these changes?