summaryrefslogblamecommitdiff
path: root/test/files/run/regularpatmatnew.scala
blob: c610b80444eb02ba001812f9dc4ceabc6dfa7c1e (plain) (tree)
1
2
3
4
5
6
7
8
9


                              
                                 




                           
                 
                 
                 
                 

                 


             
                                           

   
                                                                        

                                                      
     




                                        















                                                                       
                                                                       

                                                   
     








                                            


     
                                                                                    


                                                      
     






                                            


     





                                                                                                         

                                       
       
                          

                                 

                                      
       
                          


     





                                                                                          
                            

                                                                                   
                     
       
                                                                                                                                                                              

     
 

                                                                              
                        
 



                                             

     
                            





                                         

                                                        
                                             













                                                                  











                                                                      
 
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)
    }
  }

}