define(["doh", "../date"], function(doh, date){
doh.register("tests.date.util", [

/* Informational Functions
 **************************/

function test_date_getDaysInMonth(t){
	// months other than February
	t.is(31, date.getDaysInMonth(new Date(2006,0,1)));
	t.is(31, date.getDaysInMonth(new Date(2006,2,1)));
	t.is(30, date.getDaysInMonth(new Date(2006,3,1)));
	t.is(31, date.getDaysInMonth(new Date(2006,4,1)));
	t.is(30, date.getDaysInMonth(new Date(2006,5,1)));
	t.is(31, date.getDaysInMonth(new Date(2006,6,1)));
	t.is(31, date.getDaysInMonth(new Date(2006,7,1)));
	t.is(30, date.getDaysInMonth(new Date(2006,8,1)));
	t.is(31, date.getDaysInMonth(new Date(2006,9,1)));
	t.is(30, date.getDaysInMonth(new Date(2006,10,1)));
	t.is(31, date.getDaysInMonth(new Date(2006,11,1)));

	// Februarys
	t.is(28, date.getDaysInMonth(new Date(2006,1,1)));
	t.is(29, date.getDaysInMonth(new Date(2004,1,1)));
	t.is(29, date.getDaysInMonth(new Date(2000,1,1)));
	t.is(28, date.getDaysInMonth(new Date(1900,1,1)));
	t.is(28, date.getDaysInMonth(new Date(1800,1,1)));
	t.is(28, date.getDaysInMonth(new Date(1700,1,1)));
	t.is(29, date.getDaysInMonth(new Date(1600,1,1)));
},

function test_date_isLeapYear(t){
	t.f(date.isLeapYear(new Date(2006,0,1)));
	t.t(date.isLeapYear(new Date(2004,0,1)));
	t.t(date.isLeapYear(new Date(2000,0,1)));
	t.f(date.isLeapYear(new Date(1900,0,1)));
	t.f(date.isLeapYear(new Date(1800,0,1)));
	t.f(date.isLeapYear(new Date(1700,0,1)));
	t.t(date.isLeapYear(new Date(1600,0,1)));
},

// The getTimezone function pulls from either the date's toString or
// toLocaleString method -- it's really just a string-processing
// function (assuming the Date obj passed in supporting both toString
// and toLocaleString) and as such can be tested for multiple browsers
// by manually settting up fake Date objects with the actual strings
// produced by various browser/OS combinations.
// FIXME: the function and tests are not localized.
function test_date_getTimezoneName(t){

	// Create a fake Date object with toString and toLocaleString
	// results manually set to simulate tests for multiple browsers
	function FakeDate(str, strLocale){
		this.str = str || '';
		this.strLocale = strLocale || '';
		this.toString = function(){
			return this.str;
		};
		this.toLocaleString = function(){
			return this.strLocale;
		};
	}
	var dt = new FakeDate();

	// FF 1.5 Ubuntu Linux (Breezy)
	dt.str = 'Sun Sep 17 2006 22:25:51 GMT-0500 (CDT)';
	dt.strLocale = 'Sun 17 Sep 2006 10:25:51 PM CDT';
	t.is('CDT', date.getTimezoneName(dt));

	// Safari 2.0 Mac OS X 10.4
	dt.str = 'Sun Sep 17 2006 22:55:01 GMT-0500';
	dt.strLocale = 'September 17, 2006 10:55:01 PM CDT';
	t.is('CDT', date.getTimezoneName(dt));

	// FF 1.5 Mac OS X 10.4
	dt.str = 'Sun Sep 17 2006 22:57:18 GMT-0500 (CDT)';
	dt.strLocale = 'Sun Sep 17 22:57:18 2006';
	t.is('CDT', date.getTimezoneName(dt));

	// Opera 9 Mac OS X 10.4 -- no TZ data expect empty string return
	dt.str = 'Sun, 17 Sep 2006 22:58:06 GMT-0500';
	dt.strLocale = 'Sunday September 17, 22:58:06 GMT-0500 2006';
	t.is('', date.getTimezoneName(dt));

	// IE 6 Windows XP
	dt.str = 'Mon Sep 18 11:21:07 CDT 2006';
	dt.strLocale = 'Monday, September 18, 2006 11:21:07 AM';
	t.is('CDT', date.getTimezoneName(dt));

	// Opera 9 Ubuntu Linux (Breezy) -- no TZ data expect empty string return
	dt.str = 'Mon, 18 Sep 2006 13:30:32 GMT-0500';
	dt.strLocale = 'Monday September 18, 13:30:32 GMT-0500 2006';
	t.is('', date.getTimezoneName(dt));

	// IE 5.5 Windows 2000
	dt.str = 'Mon Sep 18 13:49:22 CDT 2006';
	dt.strLocale = 'Monday, September 18, 2006 1:49:22 PM';
	t.is('CDT', date.getTimezoneName(dt));
}
	]
);

doh.register("tests.date.math",
	[
function test_date_compare(t){
	var d1=new Date();
	d1.setHours(0);
	var d2=new Date();
	d2.setFullYear(2005);
	d2.setHours(12);
	t.is(0, date.compare(d1, d1));
	t.is(1, date.compare(d1, d2, "date"));
	t.is(-1, date.compare(d2, d1, "date"));
	t.is(-1, date.compare(d1, d2, "time"));
	t.is(1, date.compare(d1, d2, "datetime"));
},
function test_date_add(t){
	var interv = ''; // Interval (e.g., year, month)
	var dtA = null; // Date to increment
	var dtB = null; // Expected result date

	interv = "year";
	dtA = new Date(2005, 11, 27);
	dtB = new Date(2006, 11, 27);
	t.is(dtB, date.add(dtA, interv, 1));

	dtA = new Date(2005, 11, 27);
	dtB = new Date(2004, 11, 27);
	t.is(dtB, date.add(dtA, interv, -1));

	dtA = new Date(2000, 1, 29);
	dtB = new Date(2001, 1, 28);
	t.is(dtB, date.add(dtA, interv, 1));

	dtA = new Date(2000, 1, 29);
	dtB = new Date(2005, 1, 28);
	t.is(dtB, date.add(dtA, interv, 5));

	dtA = new Date(1900, 11, 31);
	dtB = new Date(1930, 11, 31);
	t.is(dtB, date.add(dtA, interv, 30));

	dtA = new Date(1995, 11, 31);
	dtB = new Date(2030, 11, 31);
	t.is(dtB, date.add(dtA, interv, 35));

	interv = "quarter";
	dtA = new Date(2000, 0, 1);
	dtB = new Date(2000, 3, 1);
	t.is(dtB, date.add(dtA, interv, 1));

	dtA = new Date(2000, 1, 29);
	dtB = new Date(2000, 7, 29);
	t.is(dtB, date.add(dtA, interv, 2));

	dtA = new Date(2000, 1, 29);
	dtB = new Date(2001, 1, 28);
	t.is(dtB, date.add(dtA, interv, 4));

	interv = "month";
	dtA = new Date(2000, 0, 1);
	dtB = new Date(2000, 1, 1);
	t.is(dtB, date.add(dtA, interv, 1));

	dtA = new Date(2000, 0, 31);
	dtB = new Date(2000, 1, 29);
	t.is(dtB, date.add(dtA, interv, 1));

	dtA = new Date(2000, 1, 29);
	dtB = new Date(2001, 1, 28);
	t.is(dtB, date.add(dtA, interv, 12));

	interv = "week";
	dtA = new Date(2000, 0, 1);
	dtB = new Date(2000, 0, 8);
	t.is(dtB, date.add(dtA, interv, 1));

	interv = "day";
	dtA = new Date(2000, 0, 1);
	dtB = new Date(2000, 0, 2);
	t.is(dtB, date.add(dtA, interv, 1));

	dtA = new Date(2001, 0, 1);
	dtB = new Date(2002, 0, 1);
	t.is(dtB, date.add(dtA, interv, 365));

	dtA = new Date(2000, 0, 1);
	dtB = new Date(2001, 0, 1);
	t.is(dtB, date.add(dtA, interv, 366));

	dtA = new Date(2000, 1, 28);
	dtB = new Date(2000, 1, 29);
	t.is(dtB, date.add(dtA, interv, 1));

	dtA = new Date(2001, 1, 28);
	dtB = new Date(2001, 2, 1);
	t.is(dtB, date.add(dtA, interv, 1));

	dtA = new Date(2000, 2, 1);
	dtB = new Date(2000, 1, 29);
	t.is(dtB, date.add(dtA, interv, -1));

	dtA = new Date(2001, 2, 1);
	dtB = new Date(2001, 1, 28);
	t.is(dtB, date.add(dtA, interv, -1));

	dtA = new Date(2000, 0, 1);
	dtB = new Date(1999, 11, 31);
	t.is(dtB, date.add(dtA, interv, -1));

	interv = "weekday";
	// Sat, Jan 1
	dtA = new Date(2000, 0, 1);
	// Should be Mon, Jan 3
	dtB = new Date(2000, 0, 3);
	t.is(dtB, date.add(dtA, interv, 1));

	// Sun, Jan 2
	dtA = new Date(2000, 0, 2);
	// Should be Mon, Jan 3
	dtB = new Date(2000, 0, 3);
	t.is(dtB, date.add(dtA, interv, 1));

	// Sun, Jan 2
	dtA = new Date(2000, 0, 2);
	// Should be Fri, Jan 7
	dtB = new Date(2000, 0, 7);
	t.is(dtB, date.add(dtA, interv, 5));

	// Sun, Jan 2
	dtA = new Date(2000, 0, 2);
	// Should be Mon, Jan 10
	dtB = new Date(2000, 0, 10);
	t.is(dtB, date.add(dtA, interv, 6));

	// Mon, Jan 3
	dtA = new Date(2000, 0, 3);
	// Should be Mon, Jan 17
	dtB = new Date(2000, 0, 17);
	t.is(dtB, date.add(dtA, interv, 10));

	// Sat, Jan 8
	dtA = new Date(2000, 0, 8);
	// Should be Mon, Jan 3
	dtB = new Date(2000, 0, 3);
	t.is(dtB, date.add(dtA, interv, -5));

	// Sun, Jan 9
	dtA = new Date(2000, 0, 9);
	// Should be Wed, Jan 5
	dtB = new Date(2000, 0, 5);
	t.is(dtB, date.add(dtA, interv, -3));

	// Sun, Jan 23
	dtA = new Date(2000, 0, 23);
	// Should be Fri, Jan 7
	dtB = new Date(2000, 0, 7);
	t.is(dtB, date.add(dtA, interv, -11));

	interv = "hour";
	dtA = new Date(2000, 0, 1, 11);
	dtB = new Date(2000, 0, 1, 12);
	t.is(dtB, date.add(dtA, interv, 1));

	dtA = new Date(2001, 9, 28, 0);
	dtB = new Date(dtA.getTime() + (60 * 60 * 1000));
	t.is(dtB, date.add(dtA, interv, 1));

	dtA = new Date(2001, 9, 28, 23);
	dtB = new Date(2001, 9, 29, 0);
	t.is(dtB, date.add(dtA, interv, 1));

	dtA = new Date(2001, 11, 31, 23);
	dtB = new Date(2002, 0, 1, 0);
	t.is(dtB, date.add(dtA, interv, 1));

	interv = "minute";
	dtA = new Date(2000, 11, 31, 23, 59);
	dtB = new Date(2001, 0, 1, 0, 0);
	t.is(dtB, date.add(dtA, interv, 1));

	dtA = new Date(2000, 11, 27, 12, 2);
	dtB = new Date(2000, 11, 27, 13, 2);
	t.is(dtB, date.add(dtA, interv, 60));

	interv = "second";
	dtA = new Date(2000, 11, 31, 23, 59, 59);
	dtB = new Date(2001, 0, 1, 0, 0, 0);
	t.is(dtB, date.add(dtA, interv, 1));

	dtA = new Date(2000, 11, 27, 8, 10, 59);
	dtB = new Date(2000, 11, 27, 8, 11, 59);
	t.is(dtB, date.add(dtA, interv, 60));

	// Test environment JS Date doesn't support millisec?
	//interv = "millisecond";
	//
	//dtA = new Date(2000, 11, 31, 23, 59, 59, 999);
	//dtB = new Date(2001, 0, 1, 0, 0, 0, 0);
	//t.is(dtB, date.add(dtA, interv, 1));
	//
	//dtA = new Date(2000, 11, 27, 8, 10, 53, 2);
	//dtB = new Date(2000, 11, 27, 8, 10, 54, 2);
	//t.is(dtB, date.add(dtA, interv, 1000));
},
function test_date_diff(t){
	var dtA = null; // First date to compare
	var dtB = null; // Second date to compare
	var interv = ''; // Interval to compare on (e.g., year, month)

	interv = "year";
	dtA = new Date(2005, 11, 27);
	dtB = new Date(2006, 11, 27);
	t.is(1, date.difference(dtA, dtB, interv));

	dtA = new Date(2000, 11, 31);
	dtB = new Date(2001, 0, 1);
	t.is(1, date.difference(dtA, dtB, interv));

	interv = "quarter";
	dtA = new Date(2000, 1, 29);
	dtB = new Date(2001, 2, 1);
	t.is(4, date.difference(dtA, dtB, interv));

	dtA = new Date(2000, 11, 1);
	dtB = new Date(2001, 0, 1);
	t.is(1, date.difference(dtA, dtB, interv));

	interv = "month";
	dtA = new Date(2000, 1, 29);
	dtB = new Date(2001, 2, 1);
	t.is(13, date.difference(dtA, dtB, interv));

	dtA = new Date(2000, 11, 1);
	dtB = new Date(2001, 0, 1);
	t.is(1, date.difference(dtA, dtB, interv));

	interv = "week";
	dtA = new Date(2000, 1, 1);
	dtB = new Date(2000, 1, 8);
	t.is(1, date.difference(dtA, dtB, interv));

	dtA = new Date(2000, 1, 28);
	dtB = new Date(2000, 2, 6);
	t.is(1, date.difference(dtA, dtB, interv));

	dtA = new Date(2000, 2, 6);
	dtB = new Date(2000, 1, 28);
	t.is(-1, date.difference(dtA, dtB, interv));

	interv = "day";
	dtA = new Date(2000, 1, 29);
	dtB = new Date(2000, 2, 1);
	t.is(1, date.difference(dtA, dtB, interv));

	dtA = new Date(2000, 11, 31);
	dtB = new Date(2001, 0, 1);
	t.is(1, date.difference(dtA, dtB, interv));

	// DST leap -- check for rounding err
	// This is dependent on US calendar, but
	// shouldn't break in other locales
	dtA = new Date(2005, 3, 3);
	dtB = new Date(2005, 3, 4);
	t.is(1, date.difference(dtA, dtB, interv));

	interv = "weekday";
	dtA = new Date(2006, 7, 3);
	dtB = new Date(2006, 7, 11);
	t.is(6, date.difference(dtA, dtB, interv));

	// Positive diffs
	dtA = new Date(2006, 7, 4);
	dtB = new Date(2006, 7, 11);
	t.is(5, date.difference(dtA, dtB, interv));

	dtA = new Date(2006, 7, 5);
	dtB = new Date(2006, 7, 11);
	t.is(5, date.difference(dtA, dtB, interv));

	dtA = new Date(2006, 7, 6);
	dtB = new Date(2006, 7, 11);
	t.is(5, date.difference(dtA, dtB, interv));

	dtA = new Date(2006, 7, 7);
	dtB = new Date(2006, 7, 11);
	t.is(4, date.difference(dtA, dtB, interv));

	dtA = new Date(2006, 7, 7);
	dtB = new Date(2006, 7, 13);
	t.is(4, date.difference(dtA, dtB, interv));

	dtA = new Date(2006, 7, 7);
	dtB = new Date(2006, 7, 14);
	t.is(5, date.difference(dtA, dtB, interv));

	dtA = new Date(2006, 7, 7);
	dtB = new Date(2006, 7, 15);
	t.is(6, date.difference(dtA, dtB, interv));

	dtA = new Date(2006, 7, 7);
	dtB = new Date(2006, 7, 28);
	t.is(15, date.difference(dtA, dtB, interv));

	dtA = new Date(2006, 2, 2);
	dtB = new Date(2006, 2, 28);
	t.is(18, date.difference(dtA, dtB, interv));

	// Negative diffs
	dtA = new Date(2006, 7, 11);
	dtB = new Date(2006, 7, 4);
	t.is(-5, date.difference(dtA, dtB, interv));

	dtA = new Date(2006, 7, 11);
	dtB = new Date(2006, 7, 5);
	t.is(-4, date.difference(dtA, dtB, interv));

	dtA = new Date(2006, 7, 11);
	dtB = new Date(2006, 7, 6);
	t.is(-4, date.difference(dtA, dtB, interv));

	dtA = new Date(2006, 7, 11);
	dtB = new Date(2006, 7, 7);
	t.is(-4, date.difference(dtA, dtB, interv));

	dtA = new Date(2006, 7, 13);
	dtB = new Date(2006, 7, 7);
	t.is(-5, date.difference(dtA, dtB, interv));

	dtA = new Date(2006, 7, 14);
	dtB = new Date(2006, 7, 7);
	t.is(-5, date.difference(dtA, dtB, interv));

	dtA = new Date(2006, 7, 15);
	dtB = new Date(2006, 7, 7);
	t.is(-6, date.difference(dtA, dtB, interv));

	dtA = new Date(2006, 7, 28);
	dtB = new Date(2006, 7, 7);
	t.is(-15, date.difference(dtA, dtB, interv));

	dtA = new Date(2006, 2, 28);
	dtB = new Date(2006, 2, 2);
	t.is(-18, date.difference(dtA, dtB, interv));

	// Two days on the same weekend -- no weekday diff
	dtA = new Date(2006, 7, 5);
	dtB = new Date(2006, 7, 6);
	t.is(0, date.difference(dtA, dtB, interv));

	interv = "hour";
	dtA = new Date(2000, 11, 31, 23);
	dtB = new Date(2001, 0, 1, 0);
	t.is(1, date.difference(dtA, dtB, interv));

	dtA = new Date(2000, 11, 31, 12);
	dtB = new Date(2001, 0, 1, 0);
	t.is(12, date.difference(dtA, dtB, interv));

	interv = "minute";
	dtA = new Date(2000, 11, 31, 23, 59);
	dtB = new Date(2001, 0, 1, 0, 0);
	t.is(1, date.difference(dtA, dtB, interv));

	dtA = new Date(2000, 1, 28, 23, 59);
	dtB = new Date(2000, 1, 29, 0, 0);
	t.is(1, date.difference(dtA, dtB, interv));

	interv = "second";
	dtA = new Date(2000, 11, 31, 23, 59, 59);
	dtB = new Date(2001, 0, 1, 0, 0, 0);
	t.is(1, date.difference(dtA, dtB, interv));

	interv = "millisecond";
	dtA = new Date(2000, 11, 31, 23, 59, 59, 999);
	dtB = new Date(2001, 0, 1, 0, 0, 0, 0);
	t.is(1, date.difference(dtA, dtB, interv));

	dtA = new Date(2000, 11, 31, 23, 59, 59, 0);
	dtB = new Date(2001, 0, 1, 0, 0, 0, 0);
	t.is(1000, date.difference(dtA, dtB, interv));
},
function test_date_add_diff_year(t){
	var interv = ''; // Interval (e.g., year, month)
	var dtA = null; // Date to increment
	var dtB = null; // Expected result date

	interv = "year";
	dtA = new Date(2005, 11, 27);
	dtB = date.add(dtA, interv, 1);
	t.is(date.difference(dtA, dtB, interv), 1);

	dtA = new Date(2005, 11, 27);
	dtB = date.add(dtA, interv, -1);
	t.is(date.difference(dtA, dtB, interv), -1);

	dtA = new Date(2000, 1, 29);
	dtB = date.add(dtA, interv, 1);
	t.is(date.difference(dtA, dtB, interv), 1);

	dtA = new Date(2000, 1, 29);
	dtB = date.add(dtA, interv, 5);
	t.is(date.difference(dtA, dtB, interv), 5);

	dtA = new Date(1900, 11, 31);
	dtB = date.add(dtA, interv, 30);
	t.is(date.difference(dtA, dtB, interv), 30);

	dtA = new Date(1995, 11, 31);
	dtB = date.add(dtA, interv, 35);
	t.is(date.difference(dtA, dtB, interv), 35);
},
function test_date_add_diff_quarter(t){
	var interv = ''; // Interval (e.g., year, month)
	var dtA = null; // Date to increment
	var dtB = null; // Expected result date
	interv = "quarter";
	dtA = new Date(2000, 0, 1);
	dtB = date.add(dtA, interv, 1);
	t.is(date.difference(dtA, dtB, interv), 1);

	dtA = new Date(2000, 1, 29);
	dtB = date.add(dtA, interv, 2);
	t.is(date.difference(dtA, dtB, interv), 2);

	dtA = new Date(2000, 1, 29);
	dtB = date.add(dtA, interv, 4);
	t.is(date.difference(dtA, dtB, interv), 4);
},
function test_date_add_diff_month(t){
	var interv = ''; // Interval (e.g., year, month)
	var dtA = null; // Date to increment
	var dtB = null; // Expected result date
	interv = "month";
	dtA = new Date(2000, 0, 1);
	dtB = date.add(dtA, interv, 1);
	t.is(date.difference(dtA, dtB, interv), 1);

	dtA = new Date(2000, 0, 31);
	dtB = date.add(dtA, interv, 1);
	t.is(date.difference(dtA, dtB, interv), 1);

	dtA = new Date(2000, 1, 29);
	dtB = date.add(dtA, interv, 12);
	t.is(date.difference(dtA, dtB, interv), 12);
},
function test_date_add_diff_week(t){
	var interv = ''; // Interval (e.g., year, month)
	var dtA = null; // Date to increment
	var dtB = null; // Expected result date
	interv = "week";
	dtA = new Date(2000, 0, 1);
	dtB = date.add(dtA, interv, 1);
	t.is(date.difference(dtA, dtB, interv), 1);
},
function test_date_add_diff_day(t){
	var interv = ''; // Interval (e.g., year, month)
	var dtA = null; // Date to increment
	var dtB = null; // Expected result date
	interv = "day";
	dtA = new Date(2000, 0, 1);
	dtB = date.add(dtA, interv, 1);
	t.is(date.difference(dtA, dtB, interv), 1);

	dtA = new Date(2001, 0, 1);
	dtB = date.add(dtA, interv, 365);
	t.is(date.difference(dtA, dtB, interv), 365);

	dtA = new Date(2000, 0, 1);
	dtB = date.add(dtA, interv, 366);
	t.is(date.difference(dtA, dtB, interv), 366);

	dtA = new Date(2000, 1, 28);
	dtB = date.add(dtA, interv, 1);
	t.is(date.difference(dtA, dtB, interv), 1);

	dtA = new Date(2001, 1, 28);
	dtB = date.add(dtA, interv, 1);
	t.is(date.difference(dtA, dtB, interv), 1);

	dtA = new Date(2000, 2, 1);
	dtB = date.add(dtA, interv, -1);
	t.is(date.difference(dtA, dtB, interv), -1);

	dtA = new Date(2001, 2, 1);
	dtB = date.add(dtA, interv, -1);
	t.is(date.difference(dtA, dtB, interv), -1);

	dtA = new Date(2000, 0, 1);
	dtB = date.add(dtA, interv, -1);
	t.is(date.difference(dtA, dtB, interv), -1);
},
function test_date_add_diff_weekday(t){
	var interv = ''; // Interval (e.g., year, month)
	var dtA = null; // Date to increment
	var dtB = null; // Expected result date
	interv = "weekday";
	// Sat, Jan 1
	dtA = new Date(2000, 0, 1);
	// Should be Mon, Jan 3
	dtB = date.add(dtA, interv, 1);
	t.is(date.difference(dtA, dtB, interv), 1);

	// Sun, Jan 2
	dtA = new Date(2000, 0, 2);
	// Should be Mon, Jan 3
	dtB = date.add(dtA, interv, 1);
	t.is(date.difference(dtA, dtB, interv), 1);

	// Sun, Jan 2
	dtA = new Date(2000, 0, 2);
	// Should be Fri, Jan 7
	dtB = date.add(dtA, interv, 5);
	t.is(date.difference(dtA, dtB, interv), 5);

	// Sun, Jan 2
	dtA = new Date(2000, 0, 2);
	// Should be Mon, Jan 10
	dtB = date.add(dtA, interv, 6);
	t.is(date.difference(dtA, dtB, interv), 6);

	// Mon, Jan 3
	dtA = new Date(2000, 0, 3);
	// Should be Mon, Jan 17
	dtB = date.add(dtA, interv, 10);
	t.is(date.difference(dtA, dtB, interv), 10);

	// Sat, Jan 8
	dtA = new Date(2000, 0, 8);
	// Should be Mon, Jan 3
	dtB = date.add(dtA, interv, -5);
	t.is(date.difference(dtA, dtB, interv), -5);

	// Sun, Jan 9
	dtA = new Date(2000, 0, 9);
	// Should be Wed, Jan 5
	dtB = date.add(dtA, interv, -3);
	t.is(date.difference(dtA, dtB, interv), -3);

	// Sun, Jan 23
	dtA = new Date(2000, 0, 23);
	// Should be Fri, Jan 7
	dtB = date.add(dtA, interv, -11);
	t.is(date.difference(dtA, dtB, interv), -11);
},
function test_date_add_diff_hour(t){
	var interv = ''; // Interval (e.g., year, month)
	var dtA = null; // Date to increment
	var dtB = null; // Expected result date
	interv = "hour";
	dtA = new Date(2000, 0, 1, 11);
	dtB = date.add(dtA, interv, 1);
	t.is(date.difference(dtA, dtB, interv), 1);

	dtA = new Date(2001, 9, 28, 0);
	dtB = date.add(dtA, interv, 1);
	t.is(date.difference(dtA, dtB, interv), 1);

	dtA = new Date(2001, 9, 28, 23);
	dtB = date.add(dtA, interv, 1);
	t.is(date.difference(dtA, dtB, interv), 1);

	dtA = new Date(2001, 11, 31, 23);
	dtB = date.add(dtA, interv, 1);
	t.is(date.difference(dtA, dtB, interv), 1);
},
function test_date_add_diff_minute(t){
	var interv = ''; // Interval (e.g., year, month)
	var dtA = null; // Date to increment
	var dtB = null; // Expected result date
	interv = "minute";
	dtA = new Date(2000, 11, 31, 23, 59);
	dtB = date.add(dtA, interv, 1);
	t.is(date.difference(dtA, dtB, interv), 1);

	dtA = new Date(2000, 11, 27, 12, 2);
	dtB = date.add(dtA, interv, 60);
	t.is(date.difference(dtA, dtB, interv), 60);
},
function test_date_add_diff_second(t){
	var interv = ''; // Interval (e.g., year, month)
	var dtA = null; // Date to increment
	var dtB = null; // Expected result date
	console.debug("second");
	interv = "second";
	dtA = new Date(2000, 11, 31, 23, 59, 59);
	dtB = date.add(dtA, interv, 1);
	t.is(date.difference(dtA, dtB, interv), 1);

	dtA = new Date(2000, 11, 27, 8, 10, 59);
	dtB = date.add(dtA, interv, 60);
	t.is(date.difference(dtA, dtB, interv), 60);

	// Test environment JS Date doesn't support millisec?
	//interv = "millisecond";
	//
	//dtA = new Date(2000, 11, 31, 23, 59, 59, 999);
	//dtB = date.add(dtA, interv, 1);
	//t.is(date.difference(dtA, dtB, interv), 1);
	//
	//dtA = new Date(2000, 11, 27, 8, 10, 53, 2);
	//dtB = date.add(dtA, interv, 1000);
	//t.is(date.difference(dtA, dtB, interv), 1000);
}
	]
);
});
