package xsbt.boot import org.scalacheck._ import Prop.{Exception => _,_} object EnumerationTest extends Properties("Enumeration") { property("MultiEnum.toValue") = checkToValue(MultiEnum, multiElements : _*) property("MultiEnum.elements") = checkElements(MultiEnum, multiElements : _*) property("EmptyEnum.toValue") = checkToValue(EmptyEnum) property("EmptyEnum.elements") = EmptyEnum.elements.isEmpty property("SingleEnum.toValue") = checkToValue( SingleEnum, singleElements ) property("SingleEnum.elements") = checkElements( SingleEnum,singleElements ) def singleElements = ("A", SingleEnum.a) def multiElements = { import MultiEnum.{a,b,c} List(("A" -> a), ("B" -> b), ("C" -> c)) } def checkElements(enum: Enumeration, mapped: (String, Enumeration#Value)*) = { val elements = enum.elements ("elements: " + elements) |: ( mapped.forall{ case (s,v) => elements.contains(v) } && (elements.length == mapped.length) ) } def checkToValue(enum: Enumeration, mapped: (String, Enumeration#Value)*) = { def invalid(s: String) = ("valueOf(" + s + ")") |: Prop.throws(classOf[Exception])(enum.toValue(s)) def valid(s: String, expected: Enumeration#Value) = ("valueOf(" + s + ")") |: ("Expected " + expected) |: ( enum.toValue(s) == expected ) val map = Map( mapped : _*) Prop.forAll( (s: String) => map.get(s) match { case Some(v) => valid(s, v) case None => invalid(s) } ) } object MultiEnum extends Enumeration { val a = value("A") val b = value("B") val c = value("C") } object SingleEnum extends Enumeration { val a = value("A") } object EmptyEnum extends Enumeration }