object Test { import scala.testing.SUnit._ def main(args: Array[String]) { val tr = new TestResult new TestSuite( new Test01, new Test02, new Test03, new Test04, new Test05, new Test06, new Test07, new Test08 ).run(tr) for (val f <- tr.failures()) println(f) } class Test01 extends TestCase("uno (all ignoring patterns on List)") { def doMatch(xs: List[String]): String = xs match { case List(_*) => "ok" } override def runTest() { val list1 = List() assertEquals(doMatch(list1), "ok") val list2 = List("1","2","3") assertEquals(doMatch(list2), "ok") } } /* these are not allowed, for strange reasons I will never figure out def doMatch(l:Seq[String]):String = l match { case List(_*) => "ok" case _ => "not ok" } def doMatch(l:Seq[String]):String = l match { case Array(_*) => "ok" case _ => "not ok" } */ class Test02 extends TestCase("due (all ignoring patterns on Seq)") { def doMatch(l: Seq[String]): String = l match { case Seq(_*) => "ok" } override def runTest() { val list1 = List() assertEquals(doMatch(list1), "ok") val list2 = List("1", "2", "3") assertEquals(doMatch(list2), "ok") val array3 = Array[String]() assertEquals(doMatch(array3), "ok") val array4 = Array[String]("ga", "gu") assertEquals(doMatch(array4), "ok") } } class Test03 extends TestCase("tre (right-ignoring patterns on List, defaults)") { def doMatch(xs: List[String]): String = xs match { case List(_,_,_,_*) => "ok" case _ => "not ok" } override def runTest() { val list1 = List() assertEquals(doMatch(list1), "not ok") val list2 = List("1","2","3") assertEquals(doMatch(list2), "ok") val list3 = List("1","2","3","4") assertEquals(doMatch(list3), "ok") } } class Test04 extends TestCase("quattro (all- and right-ignoring pattern on case class w/ seq param)") { case class Foo(i: Int, chars: Char*) override def runTest() = { val a = Foo(0, 'a') match { case Foo(i, c, chars @ _*) => c case _ => null } assertEquals(a, 'a') val b = Foo(0, 'a') match { case Foo(i, chars @ _*) => 'b' case _ => null } assertEquals(b, 'b') } } class Test05 extends TestCase("cinque (sealed case class with ignoring seq patterns)") { sealed abstract class Con; case class Foo() extends Con case class Bar(xs:Con*) extends Con override def runTest() { val res = (Bar(Foo()):Con) match { case Bar(xs@_*) => xs // this should be optimized away to a pattern Bar(xs) case _ => Nil } assertEquals("res instance"+res.isInstanceOf[Seq[Con] forSome { type Con }]+" res(0)="+res(0), true, res.isInstanceOf[Seq[Foo] forSome { type Foo}] && res(0) == Foo() ) } } class Test06 extends TestCase("sei (not regular) fancy guards / bug#644 ") { case class A(i: Any) def doMatch(x: Any, bla: int) = x match { case x:A if (bla==1) => 0 case A(1) => 1 case A(A(1)) => 2 } override def runTest() { assertEquals(doMatch(A(null),1), 0) assertEquals(doMatch(A(1),2), 1) assertEquals(doMatch(A(A(1)),2), 2) } } class Test07 extends TestCase("sette List of chars") { def doMatch1(xs: List[char]) = xs match { case List(x, y, _*) => x::y::Nil } def doMatch2(xs:List[char]) = xs match { case List(x, y, z, w) => List(z,w) } //def doMatch3(xs:List[char]) = xs match { // case List(_*, z, w) => w::Nil //} override def runTest() { assertEquals(doMatch1(List('a','b','c','d')), List('a','b')) assertEquals(doMatch2(List('a','b','c','d')), List('c','d')) //assertEquals(doMatch3(List('a','b','c','d')), List('d')) } } class Test08 extends TestCase("backquoted identifiers in pattern") { override def runTest() { val xs = List(2, 3) val ys = List(1, 2, 3) match { case x :: `xs` => xs case _ => Nil } assertEquals(xs, ys) } } }