/* CSci 555: Functional Programming (in Scala), Spring 2019, Quiz 3

1234567890123456789012345678901234567890123456789012345678901234567890

2019-03-29: Separated from List3x.scala file
2019-03-30: Corrected 12(g)

*/
import GTree._
import List._

object Quiz03Test {

  def main(args: Array[String]) { 
 
    println("\nBeginning of quiz pattern matching testing")

    val fail = "FAILURE"
    val succ = "SUCCESS"

    val gt0: GTree[Int] = Gnode(Nil)
    println("\ngt0 ==> " + gt0)

    println("\n12(a)")
    println("gt0 match { case x => x } ==> \n" +
            (gt0 match { case x => x }))

    println("\n12(b)")
    println("gt0 match { case Gnode(x) => x; case _ => fail } ==> \n" 
            + (gt0 match { case Gnode(x) => x; case _ => fail }) )

    val gt1: GTree[Int] = Gnode(List(Leaf(1),Leaf(3)))
    println("\ngt1 ==> " + gt1)

    println("\n12(c)")
    println("gt1 match { case Leaf(x) => x; case _ => fail } ==> \n" 
            + (gt1 match { case Leaf(x) => x; case _ => fail }) )

    println("\n12(d)")
    println("gt1 match { case Gnode(x) => x; case _ => fail } ==> \n" 
            + (gt1 match { case Gnode(x) => x; case _ => fail }) )

    println("\n12(e)")
    println(
      "gt1 match { case Gnode(Cons(x,xs)) => (x,xs); case _ => fail }"
       + " ==> \n" +
       (gt1 match 
         { case Gnode(Cons(x,xs)) => (x,xs); case _ => fail }) )

    println("\n12(f)")
    println(
      "gt1 match { case Gnode(Cons(Leaf(x),xs)) => (x,xs); "
      + "case _ => fail } ==> \n" +
      (gt1 match 
        { case Gnode(Cons(Leaf(x),xs)) => (x,xs); case _ => fail }) )

    println("\n12(g)")
    println(
      "gt1 match { case Gnode(Cons(Gnode(x),xs)) => (x,xs); "
      + "case _ => fail } ==> \n" +
      (gt1 match 
        { case Gnode(Cons(Gnode(x),xs)) => (x,xs); case _ => fail }) )

    val gt2: GTree[Int] = 
        Gnode(List(Gnode(List(Leaf(1),Leaf(3))),Leaf(3)))
    println("\ngt2 ==> " + gt2)

    println("\n12(h)")
    println(
      "gt2 match { case Gnode(Cons(Gnode(x),xs)) => (x,xs); "
      + "case _ => fail } ==> \n" +
      (gt2 match 
        { case Gnode(Cons(Gnode(x),xs)) => (x,xs); case _ => fail }) )

    println("\nEnd of quiz pattern match testing")  }

}
