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

org.specs.form.PropIterable.scala Maven / Gradle / Ivy

/**
 * Copyright (c) 2007-2009 Eric Torreborre 
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
 * documentation files (the "Software"), to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
 * and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of
 * the Software. Neither the name of specs nor the names of its contributors may be used to endorse or promote
 * products derived from this software without specific prior written permission.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
 * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */
package org.specs.form
import scala.xml.NodeSeq
import org.specs.util.Property
/**
 * Matcher prop on an Iterable value.
 * This subclass of Prop is able to display its values differently, like one per line.
 */
class MatcherPropIterable[T](override val label: String,
                             expectedIt: Property[Iterable[T]],
                             actual: Property[Iterable[T]], constraint: Option[MatcherConstraint[Iterable[T]]]) extends
  MatcherProp[Iterable[T]](label, expectedIt, actual, constraint) with ValuesFormatter[T] {

  override def copy: MatcherPropIterable[T] = {
    val p = new MatcherPropIterable(label, expectedIt, actual, constraint)
    super[MatcherProp].copy(p)
    super[ValuesFormatter].copy(p)
    p
  }
  /**
   * change the value formatter to display the value differently
   */
  override def formatWith(function: Option[Iterable[T]] => String): this.type = { 
    formatIterableWith(function)
    super.formatWith(function)
  }
  /**
   * change the value formatter to display the value differently. This formatter displays "" for a missing value
   */
  override def formatterIs(function: T => String): this.type = {
    super[ValuesFormatter].formatterIs(function)
    super.formatterIs(function)
  }

  /** apply method with multiple args for better readability */
  def apply(v: T*): this.type = {
    expected(v)
    this
  }
  /**
   * Display the property:
   * 
   * label: "this" (expected: "that")
   */
  override def toString = {
    label + ": " + formatStringValue(this.actual.optionalValue) + " (expected: " + formatStringValue(expected.optionalValue) + ")"
  }
  
  private def formatStringValue(v: Option[Iterable[T]]) = {
    v.map(formatIterable(_)).getOrElse("_")
  }
  
  override private[form] def formattedValue = decorateValue(formatIterable(expected.getOrElse(actual.getOrElse(Nil: Iterable[T]))))
}
/**
 * Companion object containing default factory methods
 */
case object PropIterable {
  def apply[T](value: =>Iterable[T]): MatcherPropIterable[T] = PropIterable.apply("", value)
  def apply[T](label: String, value: =>Iterable[T]): MatcherPropIterable[T] = new MatcherPropIterable(label, Property[Iterable[T]](), Property(value), None)
  def apply[T](label: String, value: =>Iterable[T], c: MatcherConstraint[Iterable[T]]): MatcherPropIterable[T] = new MatcherPropIterable(label, Property[Iterable[T]](), Property(value), Some(c))
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy