////////////////////////////////////////////////////////////////////////////////
//
//	cookiejar-test - tests for CookieJar
//
//	Dependencies:
//		cookiejar
//
//	2009-2011, Josh Moyer <JMoyer@nodomain.net>.  Public domain, no warrantee.
//
////////////////////////////////////////////////////////////////////////////////

// returns nothing
//
CookieJar.prototype.test = function()
	{
	var TestRun =
		[
		// suite, case, expected result
		[0, 1, false],
		[1, 1, false],
		[0, 2, false],
		[0, 3, false],
		[0, 4, false],
		[0, 5, false],
		[0, 6, false],
		[1, 2, false],
		[0, 7, true],	// not our domain
		[1, 3, false],
		[1, 4, false],
		[0, 8, false],	
		[1, 5, true], 	// didn't use the same domain and path as when added
		[1, 6, false],
		[0, 9, true], 	// we're not testing with https
		[1, 7, true],	// no such cookie
		[0, 11, false],
		[0, 12, true],	// we live above the specified path
		[0, 13, false],
		[0, 14, false],
		[0, 15, false],
		[0, 16, false],
		[0, 17, false],
		[1, 8, false],
		[0, 0, "Cookies MUST have a name."]
		];
	
	// Mobile IE throws exceptions if there are problems with the value written
	// to document.cookie, so define a new test suite.
	var TestRunMobileIE =
		[
		[0, 1, false],
		[1, 1, false],
		[0, 2, false],
		[0, 3, false],
		[0, 4, false],
		[0, 5, false],
		[0, 6, new Error],	// trailing dot in domain
		[1, 2, new Error],  // trailing dot in domain
		[0, 7, new Error],	// not our domain
		[1, 3, false],
		[1, 4, false],
		[0, 8, false],
		[1, 5, true], 		// didn't use the same domain and path as when added
		[1, 6, new Error],	// trailing dot in domain
		[0, 9, true],	 	// we're not testing with https
		[1, 7, true],		// no such cookie
		[0, 11, false],
		[0, 12, true],		// we live above the specified path
		[0, 13, false],
		[0, 14, false],
		[0, 15, false],
		[0, 16, false],
		[0, 17, false],
		[1, 8, false],
		[0, 0, new Error]
		];
	
	var TestsAdd =
		{
		// cookie name, value, max-age, domain, path, secure
		0:[, , , , , ], 
		1:["test1", , , , , ],
		2:["test$2", , , , , ],
		3:["test$3", "http://www.nodomain.net./", , , , ],
		4:["test4", "holst", , , , ],
		5:["test5", null, 60000, , , ],
		6:["test6", "bach", null, "nodomain.net", , ],
		7:["test7", null, "", "hykes.local.", , ],
		8:["test8", "sullivan", null, "nodomain.net", "/", ],
		9:["test9", "pachelbell", null, null, null, true],
		10:["", , , , , ],
		11:["test11", "vivaldi", 60000, , , ],
		12:["test12", "copland", null, "nodomain.net", "/foo", ],
		13:["test111", , , , , ],
		14:["test1111", , , , , ],
		15:["test111111", , , , , ],
		16:["test1111111", , , , , ],
		17:["test11111111", , , , , ]
		};
	
	var TestsEat =
		{
		// cookie name, domain, path
		0:[null, , , ],
		1:["test1", , ],
		2:["test6", "nodomain.net", ],
		3:["test$3", , ],
		4:["test5", , ],
		5:["test8", , ],
		6:["test8", "nodomain.net", "/"],
		7:["test10", , ],
		8:["test111", , ]
		};
	
	var TestsPeek =
		[
		// cookie name
		"",
		"test",
		"test;",
		"test=",
		"test=;",
		"testtest",
		"testtest;",
		"testtest=",
		"testtest=;",
		"testtesttest",
		"testtesttest;",
		"testtesttest=",
		"testtesttest=;",
		"testtest;testtesttest=test;test",
		"testtest;testtesttest=test;test="
		];
	
	var ec;					// exception caught
	var re;					// result expected
	var ro;					// result observed
	var s0 = TestsAdd;		// suite 0
	var s1 = TestsEat;		// suite 1
	var s2 = TestsPeek;		// suite 2
	var si;					// suite instance
	var ti;					// test instance
	var tr;					// test run
	
	//if (JM.UserAgent.Browser == JM.UserAgents.MSIE && JM.UserAgent.Browser.Mobile)
	//	tr = TestRunMobileIE;
	//else
	tr = TestRun;
	
	this.print("");
	
	for (var i=0; i<tr.length; i++)
		{
		ec = false;
		si = tr[i][0];
		ti = tr[i][1];
		re = tr[i][2];
		ro = false;
	
		try
			{
			if (si == 0)
				{
				ro = this.add
					(
					s0[ti][0],
					s0[ti][1],
					s0[ti][2],
					s0[ti][3],
					s0[ti][4],
					s0[ti][5]
					);
				}
			if (si == 1)
				{
				ro = this.eat
					(
					s1[ti][0],
					s1[ti][1],
					s1[ti][2]
					);
				}
			}
		catch (e)
			{
			ro = e.message;
			this.print(ro);
			}
	
		this.print("ro=" + ro + ", re=" + re);
	
		if (ro != re)
			throw new Error("CookieJar.Test: S" + si + "T" + ti);
	
		this.print("");
		}
	}

