/* Blackbox test objects for the CookieJar ADT in Scala
   H. Conrad Cunningham
   Version #1:  15 March 2010
   Version #2:  22 March 2010 Add testing of CookieJarTupleList
   Version #2a: 22 March 2010 Add testing of CookieJarArray

123456789012345678901234567890123456789012345678901234567890123456789012345678

*/


/* Object CookieJarTest's main method runs a simple blackbox testing
   script for the various concrete CookieJar classes.  

*/

object CookieJarTest {

  // Main method for testing
  def main(args: Array[String]) {

    println("\nBegin CookieJar test.")

    // Test CookJarList, the List-based CookieJar class
    println("\nBegin CookieJarList test.\n")
    var j: CookieJar[String] = new CookieJarList[String]
    println("var j: CookieJar[String] = new CookieJarList[String]" )
    testCookieJar(j)
    println("End CookieJarList test.")

    // Test CookJarArrayBuffer, the ArrayBuffer-based CookieJar class
    println("\nBegin CookieJarArrayBuffer test.\n")
    j = new CookieJarArrayBuffer[String]
    println("j                        = new CookieJarArrayBuffer[String]" )
    testCookieJar(j)
    println("End CookieJarArrayBuffer test.")

    // Test CookJarMap, the Map-based CookieJar class
    println("\nBegin CookieJarMap test.\n")
    j = new CookieJarMap[String]
    println("j                        = new CookieJarMap[String]" )
    testCookieJar(j)
    println("End CookieJarMap test.")

    // Test CookJarTupleList, the Tuple-List-based CookieJar class
    println("\nBegin CookieJarTupleList test.\n")
    j = new CookieJarTupleList[String]
    println("j                        = new CookieJarTupleList[String]" )
    testCookieJar(j)
    println("End CookieJarTupleList test.")

    // Test CookJarArray, the simple Array-based CookieJar class
    println("\nBegin CookieJarArray test.\n")
    j = new CookieJarArray[String]
    println("j                        = new CookieJarArray[String]" )
    testCookieJar(j)
    println("End CookieJarArray test.")

    println("\nEnd CookieJar test.\n")
  }
   
  // A script for blackbox testing of any CookieJar[String]
  private def testCookieJar(j: CookieJar[String]) {
    println(  "j                        = " + j)
    println(  "j.isEmpty                = " + j.isEmpty)    
    println("j.has(\"Cookie1\")         = " + j.has("Cookie1"))
    println("j.has(\"Cookie2\")         = " + j.has("Cookie2"))
    println

    j.putIn("Cookie1")
    println("j.putIn(\"Cookie1\")       = " + j)
    println(  "j.isEmpty                = " + j.isEmpty)
    println("j.has(\"Cookie1\")         = " + j.has("Cookie1"))
    println("j.has(\"Cookie2\")         = " + j.has("Cookie2"))
    println

    j.putIn("Cookie2")
    println("j.putIn(\"Cookie2\")       = " + j)
    println(  "j.isEmpty                = " + j.isEmpty)
    println("j.has(\"Cookie1\")         = " + j.has("Cookie1"))
    println("j.has(\"Cookie2\")         = " + j.has("Cookie2"))
    println

    j.putIn("Cookie1")
    println("j.putIn(\"Cookie1\")       = " + j)
    println(  "j.isEmpty                = " + j.isEmpty)
    println("j.has(\"Cookie1\")         = " + j.has("Cookie1"))
    println("j.has(\"Cookie2\")         = " + j.has("Cookie2"))
    println

    j.eat("Cookie1")
    println("j.eat(\"Cookie1\")         = " + j)
    println(  "j.isEmpty                = " + j.isEmpty)
    println("j.has(\"Cookie1\")         = " + j.has("Cookie1"))
    println("j.has(\"Cookie2\")         = " + j.has("Cookie2"))
    println

    j.eat("Cookie1")
    println("j.eat(\"Cookie1\")         = " + j)
    println(  "j.isEmpty                = " + j.isEmpty)
    println("j.has(\"Cookie1\")         = " + j.has("Cookie1"))
    println("j.has(\"Cookie2\")         = " + j.has("Cookie2"))
    println

    j.eat("Cookie2")
    println("j.eat(\"Cookie2\")         = " + j)
    println(  "j.isEmpty                = " + j.isEmpty)
    println("j.has(\"Cookie1\")         = " + j.has("Cookie1"))
    println("j.has(\"Cookie2\")         = " + j.has("Cookie2"))
    println

    print(  "j.eat(\"Cookie2\")         = " )
    try   { j.eat("Cookie2"); println(j) }
    catch { case ex => println("\nERROR " + ex) }
    println(  "j.isEmpty                = " + j.isEmpty)
    println("j.has(\"Cookie1\")         = " + j.has("Cookie1"))
    println("j.has(\"Cookie2\")         = " + j.has("Cookie2"))
    println
  }
}

