25

I need to check that one string contains many substrings. The following works

string should include ("seven")
string should include ("eight")
string should include ("nine")

but it takes three almost duplicated lines. I'm looking for something like

string should contain allOf ("seven", "eight", "nine")

however this doesn't work... The assertion just fails while string contains these substrings for sure.

How can I perform such assertion in one line?

Michal Kordas
  • 10,475
  • 7
  • 58
  • 103

2 Answers2

38

Try this:

string should (include("seven") and include("eight") and include("nine"))
Łukasz
  • 8,555
  • 2
  • 28
  • 51
Sergey
  • 2,880
  • 3
  • 19
  • 29
11

You can always create a custom matcher:

it should "..." in {
  "str asd dsa ddsd" should includeAllOf ("r as", "asd", "dd")
}

def includeAllOf(expectedSubstrings: String*): Matcher[String] =
  new Matcher[String] {
    def apply(left: String): MatchResult =
      MatchResult(expectedSubstrings forall left.contains,
        s"""String "$left" did not include all of those substrings: ${expectedSubstrings.map(s => s""""$s"""").mkString(", ")}""",
        s"""String "$left" contained all of those substrings: ${expectedSubstrings.map(s => s""""$s"""").mkString(", ")}""")
  }

See http://www.scalatest.org/user_guide/using_matchers#usingCustomMatchers for more details.

Matthias Braun
  • 32,039
  • 22
  • 142
  • 171
Łukasz
  • 8,555
  • 2
  • 28
  • 51