org.scalatest.matchers.MatchResult.scala Maven / Gradle / Ivy
Show all versions of scalatest_2.9.0 Show documentation
/* * Copyright 2001-2008 Artima, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.scalatest.matchers import org.scalatest._ /** * The result of a match operation, such as one performed by a
or. * For example: * * *Matcher
or *BeMatcher
, which * contains one field that indicates whether the match succeeded and four fields that provide * failure messages to report under different circumstances. * ** A
* *MatchResult
'smatches
field indicates whether a match succeeded. If it succeeded, *matches
will betrue
. * The other four fields contain failure message strings, one of which will be presented to the user in case of a match failure. If a match succeeds, * none of these strings will be used, because no failure message will be reported (i.e., because there was no failure * to report). If a match fails (matches
isfalse
), thefailureMessage
(or *midSentenceFailure
—more on that below) will be reported to help the user understand what went wrong. *Understanding
* *negatedFailureMessage
* The
* *negatedFailureMessage
exists so that it can become thefailureMessage
if the matcher is inverted, * which happens, for instance, if it is passed tonot
. Here's an example: ** val equalSeven = equal (7) * val notEqualSeven = not (equalSeven) ** ** The
* *Matcher[Int]
that results from passing 7 toequal
, which is assigned to theequalSeven
* variable, will compareInt
s passed to its *apply
method with 7. If 7 is passed, theequalSeven
match will succeed. If anything other than 7 is passed, it * will fail. By contrast, thenotEqualSeven
matcher, which results from passingequalSeven
tonot
, does * just the opposite. If 7 is passed, thenotEqualSeven
match will fail. If anything other than 7 is passed, it will succeed. ** For example, if 8 is passed,
* *equalSeven
'sMatchResult
will contain: ** expression: equalSeven(8) * matches: false * failureMessage: 8 did not equal 7 * negatedFailureMessage: 8 equaled 7 ** ** Although the
* *negatedFailureMessage
is nonsensical, it will not be reported to the user. Only thefailureMessage
, * which does actually explain what caused the failure, will be reported by the user. If you pass 8 tonotEqualSeven
'sapply
* method, by contrast, thefailureMessage
andnegatedFailureMessage
will be: ** expression: notEqualSeven(8) * matches: true * failureMessage: 8 equaled 7 * negatedFailureMessage: 8 did not equal 7 ** ** Note that the messages are swapped from the
* *equalSeven
messages. This swapping was effectively performed by thenot
matcher, * which in addition to swapping thefailureMessage
andnegatedFailureMessage
, also inverted the *matches
value. Thus when you pass the same value to bothequalSeven
andnotEqualSeven
thematches
* field of oneMatchResult
will betrue
and the otherfalse
. Because the *matches
field of theMatchResult
returned bynotEqualSeven(8)
istrue
, * the nonsensicalfailureMessage
, "8 equaled 7
", will not be reported to the user. ** If 7 is passed, by contrast, the
* *failureMessage
andnegatedFailureMessage
ofequalSeven
* will be: ** expression: equalSeven(7) * matches: true * failureMessage: 7 did not equal 7 * negatedFailureMessage: 7 equaled 7 ** ** In this case
* *equalSeven
'sfailureMessage
is nonsensical, but because the match succeeded, the nonsensical message will * not be reported to the user. * If you pass 7 tonotEqualSeven
'sapply
* method, you'll get: ** expression: notEqualSeven(7) * matches: false * failureMessage: 7 equaled 7 * negatedFailureMessage: 7 did not equal 7 ** ** Again the messages are swapped from the
* *equalSeven
messages, but this time, thefailureMessage
makes sense * and explains what went wrong: thenotEqualSeven
match failed because the number passed did in fact equal 7. Since * the match failed, this failure message, "7 equaled 7
", will be reported to the user. *Understanding the "
* *midSentence
" messages* When a ScalaTest matcher expression that involves
and
oror
fails, the failure message that * results is composed from the failure messages of the left and right matcher operatnds toand
or* 8 should (equal (7) or equal (9)) ** ** This above expression would fail with the following failure message reported to the user: *
* ** 8 did not equal 7, and 8 did not equal 9 ** ** This works fine, but what if the failure messages being combined begin with a capital letter, such as: *
* ** The name property did not equal "Ricky" ** ** A combination of two such failure messages might result in an abomination of English punctuation, such as: *
* ** The name property did not equal "Ricky", and The name property did not equal "Bobby" ** ** Because ScalaTest is an internationalized application, taking all of its strings from a property file * enabling it to be localized, it isn't a good idea to force the first character to lower case. Besides, * it might actually represent a String value which should stay upper case. The
* *midSentenceFailureMessage
* exists for this situation. If the failure message is used at the beginning of the sentence,failureMessage
* will be used. But if it appears mid-sentence, or at the end of the sentence,midSentenceFailureMessage
* will be used. Given these failure message strings: ** failureMessage: The name property did not equal "Bobby" * midSentenceFailureMessage: the name property did not equal "Bobby" ** ** The resulting failure of the
* *or
expression involving to matchers would make any English teacher proud: ** The name property did not equal "Ricky", and the name property did not equal "Bobby" ** * @param matches indicates whether or not the matcher matched * @param failureMessage a failure message to report if a match fails * @param negatedFailureMessage a message with a meaning opposite to that of the failure message * @param midSentenceFailureMessage a failure message suitable for appearing mid-sentence * @param midSentenceNegatedFailureMessage a negated failure message suitable for appearing mid-sentence * * @author Bill Venners */ final case class MatchResult( matches: Boolean, failureMessage: String, negatedFailureMessage: String, midSentenceFailureMessage: String, midSentenceNegatedFailureMessage: String ) { /** * Constructs a newMatchResult
with passedmatches
,failureMessage
, and *negativeFailureMessage
fields. ThemidSentenceFailureMessage
will return the same * string asfailureMessage
, and themidSentenceNegatedFailureMessage
will return the * same string asnegatedFailureMessage
. * * @param matches indicates whether or not the matcher matched * @param failureMessage a failure message to report if a match fails * @param negatedFailureMessage a message with a meaning opposite to that of the failure message */ def this(matches: Boolean, failureMessage: String, negatedFailureMessage: String) = this( matches, failureMessage, negatedFailureMessage, failureMessage, negatedFailureMessage ) } /** * Companion object for theMatchResult
case class. * * @author Bill Venners */ object MatchResult { /* Can't seem to redefine this to get the Scaladoc. /** * Factory method that constructs a newMatchResult
with passedmatches
,failureMessage
, *negativeFailureMessage
,midSentenceFailureMessage
, and *midSentenceNegatedFailureMessage
fields. * * @param matches indicates whether or not the matcher matched * @param failureMessage a failure message to report if a match fails * @param negatedFailureMessage a message with a meaning opposite to that of the failure message * @param midSentenceFailureMessage a failure message to report if a match fails * @param midSentenceNegatedFailureMessage a message with a meaning opposite to that of the failure message */ def apply(matches: Boolean, failureMessage: String, negatedFailureMessage: String, midSentenceFailureMessage: String, midSentenceNegatedFailureMessage: String): MatchResult = new MatchResult(matches, failureMessage, negatedFailureMessage, midSentenceFailureMessage, midSentenceNegatedFailureMessage) */ /** * Factory method that constructs a newMatchResult
with passedmatches
,failureMessage
, and *negativeFailureMessage
fields. ThemidSentenceFailureMessage
will return the same * string asfailureMessage
, and themidSentenceNegatedFailureMessage
will return the * same string asnegatedFailureMessage
. * * @param matches indicates whether or not the matcher matched * @param failureMessage a failure message to report if a match fails * @param negatedFailureMessage a message with a meaning opposite to that of the failure message */ def apply(matches: Boolean, failureMessage: String, negatedFailureMessage: String): MatchResult = new MatchResult(matches, failureMessage, negatedFailureMessage, failureMessage, negatedFailureMessage) }