All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.scalactic.Bool.scala Maven / Gradle / Ivy

/*
 * Copyright 2001-2013 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.scalactic

/**
 * A trait that represent a rich-featured boolean value, which includes the following members:
 *
 * 
    *
  • a boolean value
  • *
  • methods useful for failure messages construction
  • *
  • logical expression methods that makes Bool composable
  • *
* * Bool is used by code generated from BooleanMacro (which AssertionsMacro and RequirementsMacro uses), * it needs to be public so that the generated code can be compiled. It is expected that ScalaTest users would ever need to use Bool directly. */ trait Bool { private def makeString(raw: String, args: Array[Any]): String = Resources.formatString(raw, args.map(Prettifier.default)) /** * Construct and return failure message, by applying arguments returned from failureMessageArgs to * raw message returned from rawFailureMessage */ def failureMessage: String = if (failureMessageArgs.isEmpty) rawFailureMessage else makeString(rawFailureMessage, failureMessageArgs.toArray) /** * Construct and return negated failure message, by applying arguments returned from negatedFailureMessageArgs to * raw message returned from rawNegatedFailureMessage */ def negatedFailureMessage: String = if (negatedFailureMessageArgs.isEmpty) rawNegatedFailureMessage else makeString(rawNegatedFailureMessage, negatedFailureMessageArgs.toArray) /** * Construct and return mid sentence failure message, by applying arguments returned from midSentenceFailureMessageArgs to * raw message returned from rawMidSentenceFailureMessage */ def midSentenceFailureMessage: String = if (midSentenceFailureMessageArgs.isEmpty) rawMidSentenceFailureMessage else makeString(rawMidSentenceFailureMessage, midSentenceFailureMessageArgs.toArray) /** * Construct and return mid sentence negated failure message, by applying arguments returned from midSentenceNegatedFailureMessageArgs to * raw message returned from rawMidSentenceNegatedFailureMessage */ def midSentenceNegatedFailureMessage: String = if (midSentenceNegatedFailureMessageArgs.isEmpty) rawMidSentenceNegatedFailureMessage else makeString(rawMidSentenceNegatedFailureMessage, midSentenceNegatedFailureMessageArgs.toArray) /** * the Boolean value of this Bool */ def value: Boolean /** * raw message to report a failure */ def rawFailureMessage: String /** * raw message with a meaning opposite to that of the failure message */ def rawNegatedFailureMessage: String /** * raw mid sentence message to report a failure */ def rawMidSentenceFailureMessage: String /** * raw mid sentence message with a meaning opposite to that of the failure message */ def rawMidSentenceNegatedFailureMessage: String /** * Arguments to construct final failure message with raw message returned from rawFailureMessage. */ def failureMessageArgs: IndexedSeq[Any] /** * Arguments to construct final negated failure message with raw message returned from rawNegatedFailureMessage. */ def negatedFailureMessageArgs: IndexedSeq[Any] /** * Arguments to construct final mid sentence failure message with raw message returned from rawMidSentenceFailureMessage. */ def midSentenceFailureMessageArgs: IndexedSeq[Any] /** * Arguments to construct final negated mid sentence failure message with raw message returned from rawMidSentenceNegatedFailureMessage. */ def midSentenceNegatedFailureMessageArgs: IndexedSeq[Any] /** * Logical and this Bool with another Bool * * @param bool another Bool * @return a Bool that represents the result of logical and */ def &&(bool: Bool): Bool = if (value) new AndBool(this, bool) else this /** * Logical and this Bool with another Bool * * @param bool another Bool * @return a Bool that represents the result of logical and */ def &(bool: Bool): Bool = &&(bool) /** * Logical or this Bool with another Bool * * @param bool another Bool * @return a Bool that represents the result of logical or */ def ||(bool: => Bool): Bool = new OrBool(this, bool) /** * Logical or this Bool with another Bool * * @param bool another Bool * @return a Bool that represents the result of logical or */ def |(bool: => Bool): Bool = ||(bool) /** * Negate this Bool * * @return a Bool that represents the result of negating the original Bool */ def unary_! : Bool = new NotBool(this) } /** * Bool companion object that provides factory methods to create different sub types of Bool * * Bool is used by code generated from BooleanMacro (which AssertionsMacro and RequirementsMacro uses), * it needs to be public so that the generated code can be compiled. It is expected that ScalaTest users would ever need to use Bool directly. */ object Bool { /** * Create a negated version of the given Bool * * @param bool the given Bool * @return a negated version of the given Bool */ def notBool(bool: Bool): Bool = new NotBool(bool) /** * Create simple macro Bool that is used by BooleanMacro to wrap an unrecognized Boolean expression. * * @param expression the Boolean expression * @param expressionText the original expression text (source code) * @return a simple macro Bool */ def simpleMacroBool(expression: Boolean, expressionText: String): Bool = new SimpleMacroBool(expression, expressionText) /** * Create binary macro Bool that is used by BooleanMacro to wrap a recognized Boolean expression, which includes Boolean expression that * uses ==, ===, !=, !==, >, >=, <, <=, &&, * &, || and |. * * @param left the left-hand-side (LHS) of the Boolean expression * @param operator the operator (method name) of the Boolean expression * @param right the right-hand-side (RHS) of the Boolean expression * @param expression the Boolean expression * @return a binary macro Bool */ def binaryMacroBool(left: Any, operator: String, right: Any, expression: Boolean): Bool = new BinaryMacroBool(left, operator, right, expression) /** * Overloaded method that takes a Bool in place of Boolean expression to create a new binary macro Bool. * * @param left the left-hand-side (LHS) of the Boolean expression * @param operator the operator (method name) of the Boolean expression * @param right the right-hand-side (RHS) of the Boolean expression * @param bool the Bool that will provide the Boolean expression value with bool.value * @return a binary macro Bool */ def binaryMacroBool(left: Any, operator: String, right: Any, bool: Bool): Bool = new BinaryMacroBool(left, operator, right, bool) /** * Create unary macro Bool that is used by BooleanMacro to wrap a recognized Boolean expression represented by a unary method call, * which includes Boolean expression that uses isEmpty. * * @param left the left-hand-side (LHS) of the Boolean expression * @param operator the operator (method name) of the Boolean expression * @param expression the Boolean expression * @return a unary macro Bool */ def unaryMacroBool(left: Any, operator: String, expression: Boolean): Bool = new UnaryMacroBool(left, operator, expression) /** * Overloaded method that takes a Bool in place of Boolean expression to create a new unary macro Bool. * * @param left the left-hand-side (LHS) of the Boolean expression * @param operator the operator (method name) of the Boolean expression * @param bool the Bool that will provide the Boolean expression value with bool.value * @return a binary macro Bool */ def unaryMacroBool(left: Any, operator: String, bool: Bool): Bool = new UnaryMacroBool(left, operator, bool.value) /** * Create macro Bool that is used by BooleanMacro to wrap a recognized Boolean expression * represented by a isInstanceOf method call, * * @param left the left-hand-side (LHS) of the Boolean expression * @param operator the operator (method name) of the Boolean expression * @param className the class name passed to isInstanceOf method call * @param expression the Boolean expression * @return a Bool instance that represents a isInstanceOf method call */ def isInstanceOfMacroBool(left: Any, operator: String, className: String, expression: Boolean): Bool = new IsInstanceOfMacroBool(left, operator, className, expression) /** * Overloaded method that takes a Bool in place of Boolean expression to create a new isInstanceOf * macro Bool. * * @param left the left-hand-side (LHS) of the Boolean expression * @param operator the operator (method name) of the Boolean expression * @param className the class name passed to isInstanceOf method call * @param bool the Bool that will provide the Boolean expression value with bool.value * @return a Bool instance that represents a isInstanceOf method call */ def isInstanceOfMacroBool(left: Any, operator: String, className: String, bool: Bool): Bool = new IsInstanceOfMacroBool(left, operator, className, bool.value) /** * Create macro Bool that is used by BooleanMacro to wrap a recognized Boolean expression * represented by length and size method call, * * @param left the left-hand-side (LHS) of the Boolean expression * @param operator the operator (method name) of the Boolean expression * @param actual the actual value returned from length or size method call * @param expected the expected value returned from length or size method call * @return a Bool instance that represents a length or size method call */ def lengthSizeMacroBool(left: Any, operator: String, actual: Any, expected: Any): Bool = new LengthSizeMacroBool(left, operator, actual, expected) /** * Create exists macro Bool that is used by BooleanMacro to wrap a recognized Boolean expression * represented by exists method call. * * @param left the left-hand-side (LHS) of the Boolean expression * @param right the right-hand-side (RHS) of the Boolean expression * @param expression the Boolean expression * @return a exists macro Bool */ def existsMacroBool(left: Any, right: Any, expression: Boolean): Bool = new ExistsMacroBool(left, right, expression) /** * A helper method to check is the given Bool is a simple macro Bool and contains empty expression text. * * @param bool the Bool to check * @return true if the given Bool is a simple macro Bool and contains empty expression text, false otherwise. */ def isSimpleWithoutExpressionText(bool: Bool): Boolean = bool match { case s: org.scalactic.SimpleMacroBool if s.expressionText.isEmpty => true case _ => false } } private[scalactic] class SimpleBool(expression: Boolean) extends Bool { /** * the Boolean value of this Bool */ val value: Boolean = expression /** * raw message to report a failure * * @return Localized string for "Expression was false" */ def rawFailureMessage: String = Resources.rawExpressionWasFalse /** * raw message with a meaning opposite to that of the failure message * * @return Localized string for "Expression was true" */ def rawNegatedFailureMessage: String = Resources.rawExpressionWasTrue /** * raw mid sentence message to report a failure * * @return Localized string for "Expression was false" */ def rawMidSentenceFailureMessage: String = Resources.rawExpressionWasFalse /** * raw mid sentence message with a meaning opposite to that of the failure message * * @return Localized string for "Expression was false" */ def rawMidSentenceNegatedFailureMessage: String = Resources.rawExpressionWasTrue /** * Arguments to construct final failure message with raw message returned from rawFailureMessage. * * @return empty Vector */ def failureMessageArgs: IndexedSeq[Any] = Vector.empty /** * Arguments to construct final negated failure message with raw message returned from rawNegatedFailureMessage. * * @return empty Vector */ def negatedFailureMessageArgs: IndexedSeq[Any] = Vector.empty /** * Arguments to construct final mid sentence failure message with raw message returned from rawMidSentenceFailureMessage. * * @return empty Vector */ def midSentenceFailureMessageArgs: IndexedSeq[Any] = Vector.empty /** * Arguments to construct final negated mid sentence failure message with raw message returned from rawMidSentenceNegatedFailureMessage. * * @return empty Vector */ def midSentenceNegatedFailureMessageArgs: IndexedSeq[Any] = Vector.empty } /** * Bool that represents the result of logical AND of two Bool. * * @param bool1 the first Bool * @param bool2 the second Bool */ private[scalactic] class AndBool(bool1: Bool, bool2: Bool) extends Bool { /** * the result of bool1.value logical AND bool2.value */ lazy val value: Boolean = bool1.value && bool2.value /** * raw message to report a failure * * @return Localized raw string for "{0}, but {1}" */ def rawFailureMessage: String = Resources.rawCommaBut /** * raw message with a meaning opposite to that of the failure message * * @return Localized raw string for "{0}, and {1}" */ def rawNegatedFailureMessage: String = Resources.rawCommaAnd /** * raw mid sentence message to report a failure * * @return Localized raw string for "{0}, but {1}" */ def rawMidSentenceFailureMessage: String = Resources.rawCommaBut /** * raw mid sentence message with a meaning opposite to that of the failure message * * @return Localized raw string for "{0}, and {1}" */ def rawMidSentenceNegatedFailureMessage: String = Resources.rawCommaAnd /** * Arguments to construct final failure message with raw message returned from rawFailureMessage. * * @return Vector that contains bool1.negatedFailureMessage and bool2.midSentenceFailureMessage */ def failureMessageArgs = Vector(bool1.negatedFailureMessage, bool2.midSentenceFailureMessage) /** * Arguments to construct final negated failure message with raw message returned from rawNegatedFailureMessage. * * @return Vector that contains bool1.negatedFailureMessage and bool2.midSentenceNegatedFailureMessage */ def negatedFailureMessageArgs = Vector(bool1.negatedFailureMessage, bool2.midSentenceNegatedFailureMessage) /** * Arguments to construct final mid sentence failure message with raw message returned from rawMidSentenceFailureMessage. * * @return Vector that contains bool1.midSentenceNegatedFailureMessage and bool2.midSentenceFailureMessage */ def midSentenceFailureMessageArgs = Vector(bool1.midSentenceNegatedFailureMessage, bool2.midSentenceFailureMessage) /** * Arguments to construct final negated mid sentence failure message with raw message returned from rawMidSentenceNegatedFailureMessage. * * @return Vector that contains bool1.midSentenceNegatedFailureMessage and bool2.midSentenceNegatedFailureMessage */ def midSentenceNegatedFailureMessageArgs = Vector(bool1.midSentenceNegatedFailureMessage, bool2.midSentenceNegatedFailureMessage) } /** * Bool that represents the result of logical OR of two Bool. * * @param bool1 the first Bool * @param bool2 the second Bool */ private[scalactic] class OrBool(bool1: Bool, bool2: Bool) extends Bool { /** * the result of bool1.value logical OR bool2.value */ lazy val value: Boolean = bool1.value || bool2.value /** * raw message to report a failure * * @return Localized raw string for "{0}, and {1}" */ def rawFailureMessage: String = Resources.rawCommaAnd /** * raw message with a meaning opposite to that of the failure message * * @return Localized raw string for "{0}, and {1}" */ def rawNegatedFailureMessage: String = Resources.rawCommaAnd /** * raw mid sentence message to report a failure * * @return Localized raw string for "{0}, and {1}" */ def rawMidSentenceFailureMessage: String = Resources.rawCommaAnd /** * raw mid sentence message with a meaning opposite to that of the failure message * * @return Localized raw string for "{0}, and {1}" */ def rawMidSentenceNegatedFailureMessage: String = Resources.rawCommaAnd /** * Arguments to construct final failure message with raw message returned from rawFailureMessage. * * @return Vector that contains bool1.failureMessage and bool2.midSentenceFailureMessage */ def failureMessageArgs = Vector(bool1.failureMessage, bool2.midSentenceFailureMessage) /** * Arguments to construct final negated failure message with raw message returned from rawNegatedFailureMessage. * * @return Vector that contains bool1.failureMessage and bool2.midSentenceNegatedFailureMessage */ def negatedFailureMessageArgs = Vector(bool1.failureMessage, bool2.midSentenceNegatedFailureMessage) /** * Arguments to construct final mid sentence failure message with raw message returned from rawMidSentenceFailureMessage. * * @return Vector that contains bool1.midSentenceFailureMessage and bool2.midSentenceFailureMessage */ def midSentenceFailureMessageArgs = Vector(bool1.midSentenceFailureMessage, bool2.midSentenceFailureMessage) /** * Arguments to construct final negated mid sentence failure message with raw message returned from rawMidSentenceNegatedFailureMessage. * * @return Vector that contains bool1.midSentenceFailureMessage and bool2.midSentenceNegatedFailureMessage */ def midSentenceNegatedFailureMessageArgs = Vector(bool1.midSentenceFailureMessage, bool2.midSentenceNegatedFailureMessage) } private[scalactic] class NotBool(bool: Bool) extends Bool { val value: Boolean = !bool.value /** * raw message to report a failure * * @return the passed in bool.rawNegatedFailureMessage */ def rawFailureMessage: String = bool.rawNegatedFailureMessage /** * raw message with a meaning opposite to that of the failure message * * @return the passed in bool.rawFailureMessage */ def rawNegatedFailureMessage: String = bool.rawFailureMessage /** * raw mid sentence message to report a failure * * @return the passed in bool.rawMidSentenceNegatedFailureMessage */ def rawMidSentenceFailureMessage: String = bool.rawMidSentenceNegatedFailureMessage /** * raw mid sentence message with a meaning opposite to that of the failure message * * @return the passed in bool.rawMidSentenceFailureMessage */ def rawMidSentenceNegatedFailureMessage: String = bool.rawMidSentenceFailureMessage /** * Arguments to construct final failure message with raw message returned from rawFailureMessage. * * @return the passed in bool.negatedFailureMessageArgs */ def failureMessageArgs: IndexedSeq[Any] = bool.negatedFailureMessageArgs /** * Arguments to construct final negated failure message with raw message returned from rawNegatedFailureMessage. * * @return the passed in bool.failureMessageArgs */ def negatedFailureMessageArgs: IndexedSeq[Any] = bool.failureMessageArgs /** * Arguments to construct final mid sentence failure message with raw message returned from rawMidSentenceFailureMessage. * * @return the passed in bool.midSentenceNegatedFailureMessageArgs */ def midSentenceFailureMessageArgs: IndexedSeq[Any] = bool.midSentenceNegatedFailureMessageArgs /** * Arguments to construct final negated mid sentence failure message with raw message returned from rawMidSentenceNegatedFailureMessage. * * @return the passed in bool.midSentenceFailureMessageArgs */ def midSentenceNegatedFailureMessageArgs: IndexedSeq[Any] = bool.midSentenceFailureMessageArgs } /** * Simple macro Bool that is used by BooleanMacro to wrap an unrecognized Boolean expression. * * @param expression the Boolean expression * @param expressionText the original expression text (source code) */ private[scalactic] class SimpleMacroBool(expression: Boolean, val expressionText: String) extends Bool { /** * the Boolean value of this Bool, holding the passed in expression value. */ val value: Boolean = expression /** * raw message to report a failure * * @return Localized raw string of "Expression was false" if passed in expressionText is empty, else "{0} was false" */ def rawFailureMessage: String = if (expressionText.isEmpty) Resources.rawExpressionWasFalse else Resources.rawWasFalse /** * raw message with a meaning opposite to that of the failure message * * @return Localized raw string of "Expression was true" if passed in expressionText is empty, else "{0} was true" */ def rawNegatedFailureMessage: String = if (expressionText.isEmpty) Resources.rawExpressionWasTrue else Resources.rawWasTrue /** * raw mid sentence message to report a failure * * @return Localized raw string of "Expression was false" if passed in expressionText is empty, else "{0} was false" */ def rawMidSentenceFailureMessage: String = if (expressionText.isEmpty) Resources.rawExpressionWasFalse else Resources.rawWasFalse /** * raw mid sentence message with a meaning opposite to that of the failure message * * @return Localized raw string of "Expression was true" if passed in expressionText is empty, else "{0} was true" */ def rawMidSentenceNegatedFailureMessage: String = if (expressionText.isEmpty) Resources.rawExpressionWasTrue else Resources.rawWasTrue /** * Arguments to construct final failure message with raw message returned from rawFailureMessage. * * @return empty Vector if passed in expressionText is empty, else Vector that contains the unquoted expressionText */ def failureMessageArgs: IndexedSeq[Any] = if (expressionText.isEmpty) Vector.empty else Vector(UnquotedString(expressionText)) /** * Arguments to construct final negated failure message with raw message returned from rawNegatedFailureMessage. * * @return empty Vector if passed in expressionText is empty, else Vector that contains the unquoted expressionText */ def negatedFailureMessageArgs: IndexedSeq[Any] = if (expressionText.isEmpty) Vector.empty else Vector(UnquotedString(expressionText)) /** * Arguments to construct final mid sentence failure message with raw message returned from rawMidSentenceFailureMessage. * * @return empty Vector if passed in expressionText is empty, else Vector that contains the unquoted expressionText */ def midSentenceFailureMessageArgs: IndexedSeq[Any] = if (expressionText.isEmpty) Vector.empty else Vector(UnquotedString(expressionText)) /** * Arguments to construct final negated mid sentence failure message with raw message returned from rawMidSentenceNegatedFailureMessage. * * @return empty Vector if passed in expressionText is empty, else Vector that contains the unquoted expressionText */ def midSentenceNegatedFailureMessageArgs: IndexedSeq[Any] = if (expressionText.isEmpty) Vector.empty else Vector(UnquotedString(expressionText)) } /** * Binary macro Bool that is used by BooleanMacro to wrap a recognized Boolean expression, which includes Boolean expression that * uses ==, ===, !=, !==, >, >=, <, <=, &&, * &, || and |. * * @param left the left-hand-side (LHS) of the Boolean expression * @param operator the operator (method name) of the Boolean expression * @param right the right-hand-side (RHS) of the Boolean expression * @param expression the Boolean expression */ private[scalactic] class BinaryMacroBool(left: Any, operator: String, right: Any, expression: Boolean) extends Bool { /** * Overloaded constructor that takes a Bool in place of Boolean expression. * * @param left the left-hand-side (LHS) of the Boolean expression * @param operator the operator (method name) of the Boolean expression * @param right the right-hand-side (RHS) of the Boolean expression * @param bool the Bool that will provide the Boolean expression value with bool.value */ def this(left: Any, operator: String, right: Any, bool: Bool) = this(left, operator, right, bool.value) /** * the Boolean value of this Bool. */ val value: Boolean = expression private def getObjectsForFailureMessage = left match { case aEqualizer: org.scalactic.TripleEqualsSupport#Equalizer[_] => Prettifier.getObjectsForFailureMessage(aEqualizer.leftSide, right) case aEqualizer: org.scalactic.TripleEqualsSupport#CheckingEqualizer[_] => Prettifier.getObjectsForFailureMessage(aEqualizer.leftSide, right) case _ => Prettifier.getObjectsForFailureMessage(left, right) } /** * raw message to report a failure, this method implementation will return the friendly raw message based on the passed * in operator. * * @return Localized friendly raw message based on the passed in operator */ def rawFailureMessage: String = { operator match { case "==" => Resources.rawDidNotEqual case "===" => Resources.rawDidNotEqual case "!=" => Resources.rawEqualed case "!==" => Resources.rawEqualed case ">" => Resources.rawWasNotGreaterThan case ">=" => Resources.rawWasNotGreaterThanOrEqualTo case "<" => Resources.rawWasNotLessThan case "<=" => Resources.rawWasNotLessThanOrEqualTo case "startsWith" => Resources.rawDidNotStartWith case "endsWith" => Resources.rawDidNotEndWith case "contains" => left match { case leftMap: scala.collection.GenMap[_, _] => Resources.rawDidNotContainKey case _ => Resources.rawDidNotContain } case "eq" => Resources.rawWasNotTheSameInstanceAs case "ne" => Resources.rawWasTheSameInstanceAs case "&&" | "&" => (left, right) match { case (leftBool: Bool, rightBool: Bool) => if (leftBool.value) Resources.rawCommaBut else leftBool.rawFailureMessage case (leftBool: Bool, rightAny: Any) => if (leftBool.value) Resources.rawCommaBut else leftBool.rawFailureMessage case _ => Resources.rawCommaBut } case "||" | "|" => Resources.rawCommaAnd case _ => Resources.rawExpressionWasFalse } } /** * raw message with a meaning opposite to that of the failure message, this method implementation will return the * friendly raw message based on the passed in operator. * * @return Localized negated friendly raw message based on the passed in operator */ def rawNegatedFailureMessage: String = operator match { case "==" => Resources.rawEqualed case "===" => Resources.rawEqualed case "!=" => Resources.rawDidNotEqual case "!==" => Resources.rawDidNotEqual case ">" => Resources.rawWasGreaterThan case ">=" => Resources.rawWasGreaterThanOrEqualTo case "<" => Resources.rawWasLessThan case "<=" => Resources.rawWasLessThanOrEqualTo case "startsWith" => Resources.rawStartedWith case "endsWith" => Resources.rawEndedWith case "contains" => left match { case leftMap: scala.collection.GenMap[_, _] => Resources.rawContainedKey case _ => Resources.rawContained } case "eq" => Resources.rawWasTheSameInstanceAs case "ne" => Resources.rawWasNotTheSameInstanceAs case "&&" | "&" => Resources.rawCommaAnd case "||" | "|" => Resources.rawCommaAnd case _ => Resources.rawExpressionWasTrue } /** * raw mid sentence message to report a failure * * @return the same result as rawFailureMessage */ def rawMidSentenceFailureMessage: String = rawFailureMessage /** * raw mid sentence message with a meaning opposite to that of the failure message * * @return the same result as rawNegatedFailureMessage */ def rawMidSentenceNegatedFailureMessage: String = rawNegatedFailureMessage /** * Arguments to construct final failure message with raw message returned from rawFailureMessage. Based * on the passed in operator, this implementation will return the arguments needed by rawFailureMessage * to construct the final friendly failure message. * * @return Vector that contains arguments needed by rawFailureMessage to construct the final friendly failure message */ def failureMessageArgs: IndexedSeq[Any] = operator match { case "==" | "===" | "!=" | "!==" | ">" | ">=" | "<" | "<=" => val (leftee, rightee) = getObjectsForFailureMessage Vector(leftee, rightee) case "startsWith" | "endsWith" | "contains" | "eq" | "ne" => Vector(left, right) case "&&" | "&" => (left, right) match { case (leftBool: Bool, rightBool: Bool) => if (leftBool.value) Vector(UnquotedString(leftBool.negatedFailureMessage), UnquotedString(rightBool.midSentenceFailureMessage)) else leftBool.failureMessageArgs case (leftBool: Bool, rightAny: Any) => if (leftBool.value) Vector(UnquotedString(leftBool.negatedFailureMessage), rightAny) else leftBool.failureMessageArgs case (leftAny: Any, rightBool: Bool) => Vector(leftAny, UnquotedString(if (rightBool.value) rightBool.midSentenceNegatedFailureMessage else rightBool.midSentenceFailureMessage)) case _ => Vector(left, right) } case "||" | "|" => (left, right) match { case (leftBool: Bool, rightBool: Bool) => Vector(UnquotedString(leftBool.failureMessage), UnquotedString(rightBool.midSentenceFailureMessage)) case (leftBool: Bool, rightAny: Any) => Vector(UnquotedString(leftBool.failureMessage), rightAny) case (leftAny: Any, rightBool: Bool) => Vector(leftAny, UnquotedString(rightBool.midSentenceFailureMessage)) case _ => Vector(left, right) } case _ => Vector.empty } /** * Arguments to construct final negated failure message with raw message returned from rawNegatedFailureMessage. Based * on the passed in operator, this implementation will return the arguments needed by rawNegatedFailureMessage to construct * the final negated friendly failure message. * * @return Vector that contains arguments needed by rawNegatedFailureMessage to construct the final negated friendly failure message */ def negatedFailureMessageArgs: IndexedSeq[Any] = operator match { case "==" | "===" | "!=" | "!==" | ">" | ">=" | "<" | "<=" => val (leftee, rightee) = getObjectsForFailureMessage Vector(leftee, rightee) case "startsWith" | "endsWith" | "contains" | "eq" | "ne" => Vector(left, right) case "&&" | "&" => (left, right) match { case (leftBool: Bool, rightBool: Bool) => Vector( UnquotedString(if (leftBool.value) leftBool.negatedFailureMessage else leftBool.failureMessage), UnquotedString(if (rightBool.value) rightBool.midSentenceNegatedFailureMessage else rightBool.midSentenceFailureMessage) ) case (leftBool: Bool, rightAny: Any) => Vector(UnquotedString(if (leftBool.value) leftBool.negatedFailureMessage else leftBool.failureMessage), rightAny) case (leftAny: Any, rightBool: Bool) => Vector(leftAny, UnquotedString(if (rightBool.value) rightBool.midSentenceNegatedFailureMessage else rightBool.negatedFailureMessage)) case _ => Vector(left, right) } case "||" | "|" => (left, right) match { case (leftBool: Bool, rightBool: Bool) => Vector( UnquotedString(if (leftBool.value) leftBool.negatedFailureMessage else leftBool.failureMessage), UnquotedString(if (rightBool.value) rightBool.midSentenceNegatedFailureMessage else rightBool.midSentenceFailureMessage) ) case (leftBool: Bool, rightAny: Any) => Vector(UnquotedString(if (leftBool.value) leftBool.negatedFailureMessage else leftBool.failureMessage), rightAny) case (leftAny: Any, rightBool: Bool) => Vector(leftAny, UnquotedString(if (rightBool.value) rightBool.midSentenceNegatedFailureMessage else rightBool.midSentenceFailureMessage)) case _ => Vector(left, right) } case _ => Vector.empty } /** * Arguments to construct final mid sentence failure message with raw message returned from rawMidSentenceFailureMessage. * * @return the same result as failureMessageArgs */ def midSentenceFailureMessageArgs: IndexedSeq[Any] = failureMessageArgs /** * Arguments to construct final negated mid sentence failure message with raw message returned from rawMidSentenceNegatedFailureMessage. * * @return the same result as negatedFailureMessageArgs */ def midSentenceNegatedFailureMessageArgs: IndexedSeq[Any] = negatedFailureMessageArgs } /** * Unary macro Bool that is used by BooleanMacro to wrap a recognized Boolean expression represents a unary method call, which includes * Boolean expression that uses isEmpty. * * @param left the left-hand-side (LHS) of the Boolean expression * @param operator the operator (method name) of the Boolean expression * @param expression the Boolean expression */ private[scalactic] class UnaryMacroBool(left: Any, operator: String, expression: Boolean) extends Bool { /** * the Boolean value of this Bool. */ val value: Boolean = expression /** * raw message to report a failure, this method implementation will return the friendly raw message based on the passed * in operator. * * @return Localized friendly raw message based on the passed in operator */ def rawFailureMessage: String = { operator match { case "isEmpty" => Resources.rawWasNotEmpty case "nonEmpty" => Resources.rawWasEmpty case _ => Resources.rawExpressionWasFalse } } /** * raw message with a meaning opposite to that of the failure message, this method implementation will return the * friendly raw message based on the passed in operator. * * @return Localized negated friendly raw message based on the passed in operator */ def rawNegatedFailureMessage: String = operator match { case "isEmpty" => Resources.rawWasEmpty case "nonEmpty" => Resources.rawWasNotEmpty case _ => Resources.rawExpressionWasTrue } /** * raw mid sentence message to report a failure * * @return the same result as rawFailureMessage */ def rawMidSentenceFailureMessage: String = rawFailureMessage /** * raw mid sentence message with a meaning opposite to that of the failure message * * @return the same result as rawNegatedFailureMessage */ def rawMidSentenceNegatedFailureMessage: String = rawNegatedFailureMessage /** * Arguments to construct final failure message with raw message returned from rawFailureMessage. Based * on the passed in operator, this implementation will return the arguments needed by rawFailureMessage * to construct the final friendly failure message. * * @return Vector that contains arguments needed by rawFailureMessage to construct the final friendly failure message */ def failureMessageArgs: IndexedSeq[Any] = operator match { case "isEmpty" | "nonEmpty" => Vector(left) case _ => Vector.empty } /** * Arguments to construct final negated failure message with raw message returned from rawNegatedFailureMessage. Based * on the passed in operator, this implementation will return the arguments needed by rawNegatedFailureMessage to construct * the final negated friendly failure message. * * @return Vector that contains arguments needed by rawNegatedFailureMessage to construct the final negated friendly failure message */ def negatedFailureMessageArgs: IndexedSeq[Any] = operator match { case "isEmpty" | "nonEmpty" => Vector(left) case _ => Vector.empty } /** * Arguments to construct final mid sentence failure message with raw message returned from rawMidSentenceFailureMessage. * * @return the same result as failureMessageArgs */ def midSentenceFailureMessageArgs: IndexedSeq[Any] = failureMessageArgs /** * Arguments to construct final negated mid sentence failure message with raw message returned from rawMidSentenceNegatedFailureMessage. * * @return the same result as negatedFailureMessageArgs */ def midSentenceNegatedFailureMessageArgs: IndexedSeq[Any] = negatedFailureMessageArgs } /** * Macro Bool that is used by BooleanMacro to wrap a recognized Boolean expression * that represents a isInstanceOf method call. * * @param left the left-hand-side (LHS) of the Boolean expression * @param operator the operator (method name) of the Boolean expression * @param className the class name passed to isInstanceOf method call * @param expression the Boolean expression */ private[scalactic] class IsInstanceOfMacroBool(left: Any, operator: String, className: String, expression: Boolean) extends Bool { /** * the Boolean value of this Bool. */ val value: Boolean = expression /** * raw message to report a failure, this method implementation will return the friendly raw message based on the passed * in operator. * * @return Localized friendly raw message based on the passed in operator */ def rawFailureMessage: String = { operator match { case "isInstanceOf" => Resources.rawWasNotInstanceOf case _ => Resources.rawExpressionWasFalse } } /** * raw message with a meaning opposite to that of the failure message, this method implementation will return the * friendly raw message based on the passed in operator. * * @return Localized negated friendly raw message based on the passed in operator */ def rawNegatedFailureMessage: String = operator match { case "isInstanceOf" => Resources.rawWasInstanceOf case _ => Resources.rawExpressionWasTrue } /** * raw mid sentence message to report a failure * * @return the same result as rawFailureMessage */ def rawMidSentenceFailureMessage: String = rawFailureMessage /** * raw mid sentence message with a meaning opposite to that of the failure message * * @return the same result as rawNegatedFailureMessage */ def rawMidSentenceNegatedFailureMessage: String = rawNegatedFailureMessage /** * Arguments to construct final failure message with raw message returned from rawFailureMessage. Based * on the passed in operator, this implementation will return the arguments needed by rawFailureMessage * to construct the final friendly failure message. * * @return Vector that contains arguments needed by rawFailureMessage to construct the final friendly failure message */ def failureMessageArgs: IndexedSeq[Any] = operator match { case "isInstanceOf" => Vector(left, UnquotedString(className)) case _ => Vector.empty } /** * Arguments to construct final negated failure message with raw message returned from rawNegatedFailureMessage. Based * on the passed in operator, this implementation will return the arguments needed by rawNegatedFailureMessage to construct * the final negated friendly failure message. * * @return Vector that contains arguments needed by rawNegatedFailureMessage to construct the final negated friendly failure message */ def negatedFailureMessageArgs: IndexedSeq[Any] = operator match { case "isInstanceOf" => Vector(left, UnquotedString(className)) case _ => Vector.empty } /** * Arguments to construct final mid sentence failure message with raw message returned from rawMidSentenceFailureMessage. * * @return the same result as failureMessageArgs */ def midSentenceFailureMessageArgs: IndexedSeq[Any] = failureMessageArgs /** * Arguments to construct final negated mid sentence failure message with raw message returned from rawMidSentenceNegatedFailureMessage. * * @return the same result as negatedFailureMessageArgs */ def midSentenceNegatedFailureMessageArgs: IndexedSeq[Any] = negatedFailureMessageArgs } /** * Macro Bool that is used by BooleanMacro to wrap a recognized Boolean expression * that represents a length or size method call. * * @param left the left-hand-side (LHS) of the Boolean expression * @param operator the operator (method name) of the Boolean expression * @param actual the actual length or size of left * @param expected the expected length or size of left */ private[scalactic] class LengthSizeMacroBool(left: Any, operator: String, actual: Any, expected: Any) extends Bool { /** * the Boolean value of this Bool. */ val value: Boolean = actual == expected /** * raw message to report a failure, this method implementation will return the friendly raw message based on the passed * in operator. * * @return Localized friendly raw message based on the passed in operator */ def rawFailureMessage: String = { operator match { case "length" => Resources.rawHadLengthInsteadOfExpectedLength case "size" => Resources.rawHadSizeInsteadOfExpectedSize case _ => Resources.rawExpressionWasFalse } } /** * raw message with a meaning opposite to that of the failure message, this method implementation will return the * friendly raw message based on the passed in operator. * * @return Localized negated friendly raw message based on the passed in operator */ def rawNegatedFailureMessage: String = operator match { case "length" => Resources.rawHadLength case "size" => Resources.rawHadSize case _ => Resources.rawExpressionWasTrue } /** * raw mid sentence message to report a failure * * @return the same result as rawFailureMessage */ def rawMidSentenceFailureMessage: String = rawFailureMessage /** * raw mid sentence message with a meaning opposite to that of the failure message * * @return the same result as rawNegatedFailureMessage */ def rawMidSentenceNegatedFailureMessage: String = rawNegatedFailureMessage /** * Arguments to construct final failure message with raw message returned from rawFailureMessage. Based * on the passed in operator, this implementation will return the arguments needed by rawFailureMessage * to construct the final friendly failure message. * * @return Vector that contains arguments needed by rawFailureMessage to construct the final friendly failure message */ def failureMessageArgs: IndexedSeq[Any] = operator match { case "length" | "size" => Vector(left, actual, expected) case _ => Vector.empty } /** * Arguments to construct final negated failure message with raw message returned from rawNegatedFailureMessage. Based * on the passed in operator, this implementation will return the arguments needed by rawNegatedFailureMessage to construct * the final negated friendly failure message. * * @return Vector that contains arguments needed by rawNegatedFailureMessage to construct the final negated friendly failure message */ def negatedFailureMessageArgs: IndexedSeq[Any] = operator match { case "length" | "size" => Vector(left, actual) case _ => Vector.empty } /** * Arguments to construct final mid sentence failure message with raw message returned from rawMidSentenceFailureMessage. * * @return the same result as failureMessageArgs */ def midSentenceFailureMessageArgs: IndexedSeq[Any] = failureMessageArgs /** * Arguments to construct final negated mid sentence failure message with raw message returned from rawMidSentenceNegatedFailureMessage. * * @return the same result as negatedFailureMessageArgs */ def midSentenceNegatedFailureMessageArgs: IndexedSeq[Any] = negatedFailureMessageArgs } /** * Macro Bool that is used by BooleanMacro to wrap a recognized Boolean expression * that represents a length or size method call. * * @param left the left-hand-side (LHS) of the Boolean expression * @param right the right-hand-side (RHS) of the Boolean expression * @param expression the Boolean expression */ private[scalactic] class ExistsMacroBool(left: Any, right: Any, expression: Boolean) extends Bool { /** * the Boolean value of this Bool. */ val value: Boolean = expression /** * raw message to report a failure, this method implementation will return localized "x did not contain y" message. * * @return Localized friendly raw message based on the passed in operator */ def rawFailureMessage: String = Resources.rawDidNotContain /** * raw message with a meaning opposite to that of the failure message, this method implementation will return localized * "x contained y" message. * * @return Localized negated friendly raw message based on the passed in operator */ def rawNegatedFailureMessage: String = Resources.rawContained /** * raw mid sentence message to report a failure * * @return the same result as rawFailureMessage */ def rawMidSentenceFailureMessage: String = rawFailureMessage /** * raw mid sentence message with a meaning opposite to that of the failure message * * @return the same result as rawNegatedFailureMessage */ def rawMidSentenceNegatedFailureMessage: String = rawNegatedFailureMessage /** * Arguments to construct final failure message with raw message returned from rawFailureMessage. This * implementation will return a Vector that contains the passed in left and right. * * @return Vector that contains arguments needed by rawFailureMessage to construct the final friendly failure message */ def failureMessageArgs: IndexedSeq[Any] = Vector(left, right) /** * Arguments to construct final negated failure message with raw message returned from rawNegatedFailureMessage. * This implementation will return a Vector that contains the passed in left and right. * * @return Vector that contains arguments needed by rawNegatedFailureMessage to construct the final negated friendly failure message */ def negatedFailureMessageArgs: IndexedSeq[Any] = Vector(left, right) /** * Arguments to construct final mid sentence failure message with raw message returned from rawMidSentenceFailureMessage. * * @return the same result as failureMessageArgs */ def midSentenceFailureMessageArgs: IndexedSeq[Any] = failureMessageArgs /** * Arguments to construct final negated mid sentence failure message with raw message returned from rawMidSentenceNegatedFailureMessage. * * @return the same result as negatedFailureMessageArgs */ def midSentenceNegatedFailureMessageArgs: IndexedSeq[Any] = negatedFailureMessageArgs }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy