﻿Date.Specification = new Specification({
'Exception Handling': {
    setup: function() {},
	'Date.parse() : No params': {
      run: function() { this.date = Date.parse() },
      assert: function() {  return null == this.date }
    },
	'Date.parse("") : string.empty': {
      run: function() { this.date = Date.parse('') },
      assert: function() {  return null == this.date }
    },
	'Date.parse("asdf") : Random String': {
      run: function() { this.date = Date.parse('asdf') },
      assert: function() {  return null == this.date }
    },
	'Date.parse(null) : null': {
      run: function() { this.date = Date.parse(null) },
      assert: function() {  return null == this.date }
    },    
    '29-Sep-2008.set({ day: 31 }) : RangeError': {
      run: function() {},
      assert: function() { 
        try {
  			return new Date(2008,8,29).set({ day: 31 }).equals(new Date(2008,9,1));
		}
		catch(ex) {
			return (ex instanceof RangeError);
		}
		
        
        return new Date(2008,8,30).equals(this.date) }
    },
    '29-Sep-2008.set({ month: 12 }) : RangeError': {
      run: function() {},
      assert: function() { 
            try {
                return new Date(2008,8,29).set({ month: 12 }).equals(new Date(2009,0,29));
            }
            catch(ex) {
                return (ex instanceof RangeError);
            }
      }
    },
    
    'new Date("").compareTo(new Date()) : Error': {
      run: function() {},
	      assert: function() {
		  	try {
	  			return new Date("").compareTo(new Date()) == 0
			}
			catch(ex) {
				return (ex instanceof Error);
			}
		}
    },
    'new Date("").equals(new Date()) : Error': {
      run: function() {},
	      assert: function() {
		  	try {
	  			return new Date("").equals(new Date());
			}
			catch(ex) {
				return (ex instanceof Error);
			}
		}
    },
	'new Date().compareTo(0) : Error': {
      run: function() {},
	      assert: function() {
		  	try {
	  			return new Date().compareTo(0);
			}
			catch(ex) {
				return (ex instanceof TypeError);
			}
		}
    },	
	'new Date().equals(0) : TypeError': {
    run: function() {},
		assert: function() {
			try {
	  			return new Date().equals(0);
			}
			catch(ex) {
				return (ex instanceof Error);
			}
		}
	},
	'new Date().compareTo(new Date("")) : TypeError': {
    run: function() {},
		assert: function() {
			try {
	  			return new Date().compareTo(new Date(""));
			}
			catch(ex) {
				return (ex instanceof Error);
			}
		}
	},
	'new Date().equals(new Date("")) : TypeError': {
    run: function() {},
		assert: function() {
			try {
	  			return new Date().equals(new Date(""));
			}
			catch(ex) {
				return (ex instanceof Error);
			}
		}
	}
    },
 
	'.compareTo() and .equals()': {
    setup: function() {

	},
	'.compareTo() : today > yesterday': {
        run: function() {},
	    assert: function() {
		    return Date.today().compareTo(Date.today().addDays(-1)) == 1;
	    }
	},
	'.compareTo() : today == today': {
        run: function() {},
	    assert: function() {
		    return Date.today().compareTo(Date.today()) == 0;
	    }
	},
	'.compareTo() : today < tomorrow': {
        run: function() {},
	    assert: function() {
		    return Date.today().compareTo(Date.today().addDays(1)) == -1;
	    }
	},
	'.equals() : today != yesterday': {
        run: function() {},
	    assert: function() {
		    return false == Date.today().equals(Date.today().addDays(-1));
	    }
	},
	'.equals() : today == today': {
        run: function() {},
	    assert: function() {
		    return Date.today().equals(Date.today());
	    }
	},
	'.equals() : today != tomorrow': {
        run: function() {},
	    assert: function() {
		    return false == Date.today().equals(Date.today().addDays(1));
	    }
	}
},
  '.set() Tests': {
    setup: function() {
		
		  this.d1 = new Date('');
		
	},
    '15-Aug-2008 to 15-Sep-2008': {
      run: function() { 
        this.date = new Date(2008,7,15);
        this.date.set({ month: 8 });
      },
      assert: function() { return new Date(2008,8,15).equals(this.date) }
    },
    '15-Aug-2008 to 15-Jul-2008': {
      run: function() { 
        this.date = new Date(2008,7,15);
        this.date.set({ month: 6 });
      },
      assert: function() { return new Date(2008,6,15).equals(this.date) }
    },    
    '29-Feb-2008 to 28-Feb-2009': {
      run: function() { 
        this.date = new Date(2008,1,29);
        this.date.set({ year: 2009 });
      },
      assert: function() { return new Date(2009,1,28).equals(this.date) }
    },
    '29-Feb-2008 to 28-Feb-2007': {
      run: function() { 
        this.date = new Date(2008,1,29);
        this.date.set({ year: 2007 });
      },
      assert: function() { return new Date(2007,1,28).equals(this.date) }
    },
    '31-Jan-2008 to 29-Feb-2008': {
      run: function() {
        this.date = new Date(2008,0,31);
        this.date.set({ month: 1 });
      },
      assert: function() { return new Date(2008,1,29).equals(this.date) }
    },
    '31-Mar-2008 to 29-Feb-2008': {
      run: function() {
        this.date = new Date(2008,2,31);
        this.date.set({ month: 1 });
      },
      assert: function() { return new Date(2008,1,29).equals(this.date) }
    },
    '30-Sep-2008 to 30-Oct-2008': {
      run: function() {
        this.date = new Date(2008,8,30);
        this.date.set({ month: 9 });
      },
      assert: function() { return new Date(2008,9,30).equals(this.date) }
    },
    '30-Sep-2008 to 30-Aug-2008': {
      run: function() {
        this.date = new Date(2008,8,30);
        this.date.set({ month: 7 });
      },
      assert: function() { return new Date(2008,7,30).equals(this.date) }
    },
    '30-Sep-2008 to 30-Sep-2008': {
      run: function() {
        this.date = new Date(2008,8,30);
        this.date.set({ month: 8 });
      },
      assert: function() { return new Date(2008,8,30).equals(this.date) }
    },
    '31-Aug-2008 to 30-Sep-2008': {
      run: function() {
        this.date = new Date(2008,7,31);
        this.date.set({ month: 8 });      },
      assert: function() { return new Date(2008,8,30).equals(this.date) }
    },
    '31-Oct-2008 to 30-Sep-2008': {
      run: function() {
        this.date = new Date(2008,9,31);
        this.date.set({ month: 8 });      },
      assert: function() { return new Date(2008,8,30).equals(this.date) }
    }
  },
  
'.next() and .previous()': {
    setup: function() {},
    'next().monday()': {
      run: function() { 
        this.date = new Date().clearTime().next().monday();
      },
      assert: function() { return Date.parse('next monday').equals(this.date) }
    },
    'next().tuesday()': {
      run: function() { 
        this.date = new Date().clearTime().next().tuesday();
      },
      assert: function() { return Date.parse('next tuesday').equals(this.date) }
    },
    'next().wednesday()': {
      run: function() { 
        this.date = new Date().clearTime().next().wednesday();
      },
      assert: function() { return Date.parse('next wednesday').equals(this.date) }
    },
    'next().thursday()': {
      run: function() { 
        this.date = new Date().clearTime().next().thursday();
      },
      assert: function() { return Date.parse('next thursday').equals(this.date) }
    },
    'next().friday()': {
      run: function() { 
        this.date = new Date().clearTime().next().friday();
      },
      assert: function() { return Date.parse('next friday').equals(this.date) }
    },
    'next().saturday()': {
      run: function() { 
        this.date = new Date().clearTime().next().saturday();
      },
      assert: function() { return Date.parse('next saturday').equals(this.date) }
    },
    'next().sunday()': {
      run: function() { 
        this.date = new Date().clearTime().next().sunday();
      },
      assert: function() { return Date.parse('next sunday').equals(this.date) }
    },
    'last().monday()': {
      run: function() { 
        this.date = new Date().clearTime().last().monday();
      },
      assert: function() { return Date.parse('last monday').equals(this.date) }
    },
    'last().tuesday()': {
      run: function() { 
        this.date = new Date().clearTime().last().tuesday();
      },
      assert: function() { return Date.parse('last tuesday').equals(this.date) }
    },
    'last().wednesday()': {
      run: function() { 
        this.date = new Date().clearTime().last().wednesday();
      },
      assert: function() { return Date.parse('last wednesday').equals(this.date) }
    },
    'last().thursday()': {
      run: function() { 
        this.date = new Date().clearTime().last().thursday();
      },
      assert: function() { return Date.parse('last thursday').equals(this.date) }
    },
    'last().friday()': {
      run: function() { 
        this.date = new Date().clearTime().last().friday();
      },
      assert: function() { return Date.parse('last friday').equals(this.date) }
    },
    'last().saturday()': {
      run: function() { 
        this.date = new Date().clearTime().last().saturday();
      },
      assert: function() { return Date.parse('last saturday').equals(this.date) }
    },
    'last().sunday()': {
      run: function() { 
        this.date = new Date().clearTime().last().sunday();
      },
      assert: function() { return Date.parse('last sunday').equals(this.date) }
    }, 
    'monday()': {
      run: function() { 
        this.date = new Date().clearTime().monday();
      },
      assert: function() { return Date.parse('next monday').equals(this.date) }
    },
    'tuesday()': {
      run: function() { 
        this.date = new Date().clearTime().tuesday();
      },
      assert: function() { return Date.parse('next tuesday').equals(this.date) }
    },
    'wednesday()': {
      run: function() { 
        this.date = new Date().clearTime().wednesday();
      },
      assert: function() { return Date.parse('next wednesday').equals(this.date) }
    },
    'thursday()': {
      run: function() { 
        this.date = new Date().clearTime().thursday();
      },
      assert: function() { return Date.parse('next thursday').equals(this.date) }
    },
    'friday()': {
      run: function() { 
        this.date = new Date().clearTime().friday();
      },
      assert: function() { return Date.parse('next friday').equals(this.date) }
    },
    'saturday()': {
      run: function() { 
        this.date = new Date().clearTime().saturday();
      },
      assert: function() { return Date.parse('next saturday').equals(this.date) }
    },
    'sunday()': {
      run: function() { 
        this.date = Date.today().sunday();
      },
      assert: function() { return Date.parse('next sunday').equals(this.date) }
    }
  },
  
  '.is()': {
    setup: function() {},
    '.is().monday()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).is().monday() == true; }
    },
    '.is().mon()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).is().mon() == true; }
    },
    '.is().tuesday()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 2).is().tuesday() == true; }
    },
    '.is().tue()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 2).is().tue() == true; }
    },
    '.is().wednesday()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 3).is().wednesday() == true; }
    },
    '.is().wed()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 3).is().wed() == true; }
    },
    '.is().thursday()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 4).is().thursday() == true; }
    },
    '.is().thu()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 4).is().thu() == true; }
    },
    '.is().friday()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 5).is().friday() == true; }
    },
    '.is().fri()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 5).is().fri() == true; }
    },
    '.is().saturday()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 6).is().saturday() == true; }
    },
    '.is().sat()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 6).is().sat() == true; }
    },
    '.is().sunday()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 7).is().sunday() == true; }
    },
    '.is().sun()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 7).is().sun() == true; }
    },
    '.is().january()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).is().january() == true; }
    },
    '.is().jan()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).is().jan() == true; }
    },
    '.is().february()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).add(1).month().is().february() == true; }
    },
    '.is().feb()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).is().add(1).month().feb() == true; }
    },
    '.is().march()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).add(2).months().is().march() == true; }
    },
    '.is().mar()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).is().add(2).months().mar() == true; }
    },
    '.is().april()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).add(3).months().is().april() == true; }
    },
    '.is().apr()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).is().add(3).months().april() == true; }
    },
    '.is().may()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).add(4).months().is().may() == true; }
    },
    '.is().june()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).add(5).months().is().june() == true; }
    },
    '.is().jun()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).is().add(5).months().jun() == true; }
    },
    '.is().july()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).add(6).months().is().july() == true; }
    },
    '.is().jul()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).is().add(6).months().jul() == true; }
    },
    '.is().august()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).add(7).months().is().august() == true; }
    },
    '.is().aug()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).is().add(7).months().aug() == true; }
    },
    '.is().september()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).add(8).months().is().september() == true; }
    },
    '.is().sep()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).is().add(8).months().sep() == true; }
    },
    '.is().october()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).add(9).months().is().october() == true; }
    },
    '.is().oct()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).is().add(9).months().oct() == true; }
    },
    '.is().november()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).add(10).months().is().november() == true; }
    },
    '.is().nov()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).is().add(10).months().nov() == true; }
    },
    '.is().december()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).add(11).months().is().december() == true; }
    },
    '.is().dec()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).is().add(11).months().dec() == true; }
    }
    
  },
  
  '.add()': {
    setup: function() {},
    '.add(1).second()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 2).add(1).second().equals(new Date(2001, 0, 2, 0, 0, 1)); }
    },
    '.add(-1).second()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 2).add(-1).second().equals(new Date(2001, 0, 1, 23, 59, 59)); }
    },
    '.add(10).seconds()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 2).add(10).seconds().equals(new Date(2001, 0, 2, 0, 0, 10)); }
    },
    '.add(-10).seconds()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 2).add(-10).seconds().equals(new Date(2001, 0, 1, 23, 59, 50)); }
    },
    
    '.add(1).minute()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 2).add(1).minute().equals(new Date(2001, 0, 2, 0, 1, 0)); }
    },
    '.add(-1).minute()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 2).add(-1).minute().equals(new Date(2001, 0, 1, 23, 59, 0)); }
    },
    '.add(10).minutes()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 2).add(10).minutes().equals(new Date(2001, 0, 2, 0, 10, 0)); }
    },
    '.add(-10).minutes()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 2).add(-10).minutes().equals(new Date(2001, 0, 1, 23, 50, 0)); }
    },

    '.add(1).hour()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 2).add(1).hour().equals(new Date(2001, 0, 2, 1, 0, 0)); }
    },
    '.add(-1).hour()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 2).add(-1).hour().equals(new Date(2001, 0, 1, 23, 0, 0)); }
    },
    '.add(10).hours()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 2).add(10).hours().equals(new Date(2001, 0, 2, 10, 0, 0)); }
    },
    '.add(-10).hours()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 2).add(-10).hours().equals(new Date(2001, 0, 1, 14, 0, 0)); }
    },    
            
    '.add(1).day()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).add(1).day().equals(new Date(2001, 0, 2)); }
    },
    '.add(-1).day()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).add(-1).day().equals(new Date(2000, 11, 31)); }
    },
    '.add(31).days()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).add(31).days().equals(new Date(2001, 1, 1)); }
    },
    '.add(-31).days()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).add(-31).days().equals(new Date(2000, 11, 1)); }
    },
    '.add(1).month()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).add(1).month().equals(new Date(2001, 1, 1)); }
    },
    '.add(-1).month()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).add(-1).month().equals(new Date(2000, 11, 1)); }
    },
    '.add(6).months()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).add(6).months().equals(new Date(2001, 6, 1)); }
    },
    '.add(-6).months()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).add(-6).months().equals(new Date(2000, 6, 1)); }
    },
    '.add(1).month() : 31-Jan to 28-Feb': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 31).add(1).month().equals(new Date(2001, 1, 28)); }
    },
    '.add(-1).month() : 31-Mar to 28-Feb': {
      run: function() {},
      assert: function() { return new Date(2001, 2, 31).add(-1).month().equals(new Date(2001, 1, 28)); }
    },
    '.add(1).month() : 31-Jan to 29-Feb [leap year]': {
      run: function() {},
      assert: function() { return new Date(2008, 0, 31).add(1).month().equals(new Date(2008, 1, 29)); }
    },
    '.add(-1).month() : 31-Mar to 29-Feb [leap year]': {
      run: function() {},
      assert: function() { return new Date(2008, 2, 31).add(-1).month().equals(new Date(2008, 1, 29)); }
    },
    '.add(1).year()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).add(1).year().equals(new Date(2002, 0, 1)); }
    },
    '.add(-1).year()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).add(-1).year().equals(new Date(2000, 0, 1)); }
    },
    '.add(-1).year() : 29-Feb-2000 to 28-Feb-2001 [leap year]': {
      run: function() {},
      assert: function() { return new Date(2000, 1, 29).add(1).year().equals(new Date(2001, 1, 28)); }
    },
    '.add(5).years()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).add(5).years().equals(new Date(2006, 0, 1)); }
    },
    '.add(-5).years()': {
      run: function() {},
      assert: function() { return new Date(2001, 0, 1).add(-5).years().equals(new Date(1996, 0, 1)); }
    }    
  }   ,
  
  '.moveToNthOccurrence()': {
    setup: function() {},
    'Final Sunday in Jan': {
      run: function() {},
      assert: function() { return new Date(2008, 0, 27).equals(Date.today().set({year: 2008, month: 0}).final().sunday()); }
    },
    'Final Sunday in Feb': {
      run: function() {},
      assert: function() { return new Date(2008, 1, 24).equals(Date.today().set({year: 2008, month: 1}).final().sunday()); }
    },    
    'Final Sunday in Mar': {
      run: function() {},
      assert: function() { return new Date(2008, 2, 30).equals(Date.today().set({year: 2008, month: 2}).final().sunday()); }
    },
    'Final Sunday in Apr': {
      run: function() {},
      assert: function() { return new Date(2008, 3, 27).equals(Date.today().set({year: 2008, month: 3}).final().sunday()); }
    },
    'Final Sunday in May': {
      run: function() {},
      assert: function() { return new Date(2008, 4, 25).equals(Date.today().set({year: 2008, month: 4}).final().sunday()); }
    },
    'Final Sunday in Jun': {
      run: function() {},
      assert: function() { return new Date(2008, 5, 29).equals(Date.today().set({year: 2008, month: 5}).final().sunday()); }
    },
    'Final Sunday in Jul': {
      run: function() {},
      assert: function() { return new Date(2008, 6, 27).equals(Date.today().set({year: 2008, month: 6}).final().sunday()); }
    },
    'Final Sunday in Aug': {
      run: function() {},
      assert: function() { return new Date(2008, 7, 31).equals(Date.today().set({year: 2008, month: 7}).final().sunday()); }
    },
    'Final Sunday in Sep': {
      run: function() {},
      assert: function() { return new Date(2008, 8, 28).equals(Date.today().set({year: 2008, month: 8}).final().sunday()); }
    },    
    'Final Sunday in Oct': {
      run: function() {},
      assert: function() { return new Date(2008, 9, 26).equals(Date.today().set({year: 2008, month: 9}).final().sunday()); }
    },
    'Final Sunday in Nov': {
      run: function() {},
      assert: function() { return new Date(2008, 10, 30).equals(Date.today().set({year: 2008, month: 10}).final().sunday()); }
    },
    'Final Sunday in Dec': {
      run: function() {},
      assert: function() { return new Date(2008, 11, 28).equals(Date.today().set({year: 2008, month: 11}).final().sunday()); }
    }
  },
  
  '.getWeek()': {
    setup: function() {
        this.d = new Date(1969, 0, 1);
    },
    '1969': {
      run: function() {},
      assert: function() { return (this.d.addYears(0).getWeek() == 1); }
    },
    '1970': {
      run: function() {},
      assert: function() { return (this.d.addYears(1).getWeek() == 1); }
    },
    '1971': {
      run: function() {},
      assert: function() { return (this.d.addYears(2).getWeek() == 53); }
    },
    '1972': {
      run: function() {},
      assert: function() { return (this.d.addYears(3).getWeek() == 52); }
    },
    '1973': {
      run: function() {},
      assert: function() { return (this.d.addYears(4).getWeek() == 1); }
    },
    '1974': {
      run: function() {},
      assert: function() { return (this.d.addYears(5).getWeek() == 1); }
    },
    '1975': {
      run: function() {},
      assert: function() { return (this.d.addYears(6).getWeek() == 1); }
    },
    '1976': {
      run: function() {},
      assert: function() { return (this.d.addYears(7).getWeek() == 1); }
    },
    '1977': {
      run: function() {},
      assert: function() { return (this.d.addYears(8).getWeek() == 53); }
    },
    '1978': {
      run: function() {},
      assert: function() { return (this.d.addYears(9).getWeek() == 52); }
    },
    '1979': {
      run: function() {},
      assert: function() { return (this.d.addYears(10).getWeek() == 1); }
    },
    '1980': {
      run: function() {},
      assert: function() { return (this.d.addYears(11).getWeek() == 1); }
    },
    '1981': {
      run: function() {},
      assert: function() { return (this.d.addYears(12).getWeek() == 1); }
    },
    '1982': {
      run: function() {},
      assert: function() { return (this.d.addYears(13).getWeek() == 53); }
    },
    '1983': {
      run: function() {},
      assert: function() { return (this.d.addYears(14).getWeek() == 52); }
    },
    '1984': {
      run: function() {},
      assert: function() { return (this.d.addYears(15).getWeek() == 52); }
    },
    '1985': {
      run: function() {},
      assert: function() { return (this.d.addYears(16).getWeek() == 1); }
    },
    '1986': {
      run: function() {},
      assert: function() { return (this.d.addYears(17).getWeek() == 1); }
    },
    '1987': {
      run: function() {},
      assert: function() { return (this.d.addYears(18).getWeek() == 1); }
    },
    '1988': {
      run: function() {},
      assert: function() { return (this.d.addYears(19).getWeek() == 53); }
    },
    '1989': {
      run: function() {},
      assert: function() { return (this.d.addYears(20).getWeek() == 52); }
    },
    '1990': {
      run: function() {},
      assert: function() { return (this.d.addYears(21).getWeek() == 1); }
    },
    '1991': {
      run: function() {},
      assert: function() { return (this.d.addYears(22).getWeek() == 1); }
    },
    '1992': {
      run: function() {},
      assert: function() { return (this.d.addYears(23).getWeek() == 1); }
    },
    '1993': {
      run: function() {},
      assert: function() { return (this.d.addYears(24).getWeek() == 53); }
    },
    '1994': {
      run: function() {},
      assert: function() { return (this.d.addYears(25).getWeek() == 52); }
    },
    '1995': {
      run: function() {},
      assert: function() { return (this.d.addYears(26).getWeek() == 52); }
    },
    '1996': {
      run: function() {},
      assert: function() { return (this.d.addYears(27).getWeek() == 1); }
    },
    '1997': {
      run: function() {},
      assert: function() { return (this.d.addYears(28).getWeek() == 1); }
    },
    '1998': {
      run: function() {},
      assert: function() { return (this.d.addYears(29).getWeek() == 1); }
    },
    '1999': {
      run: function() {},
      assert: function() { return (this.d.addYears(30).getWeek() == 53); }
    },
    '2000': {
      run: function() {},
      assert: function() { return (this.d.addYears(31).getWeek() == 52); }
    },
    '2001': {
      run: function() {},
      assert: function() { return (this.d.addYears(32).getWeek() == 1); }
    },
    '2002': {
      run: function() {},
      assert: function() { return (this.d.addYears(33).getWeek() == 1); }
    },
    '2003': {
      run: function() {},
      assert: function() { return (this.d.addYears(34).getWeek() == 1); }
    },
    '2004': {
      run: function() {},
      assert: function() { return (this.d.addYears(35).getWeek() == 1); }
    },
    '2005': {
      run: function() {},
      assert: function() { return (this.d.addYears(36).getWeek() == 53); }
    },
    '2006': {
      run: function() {},
      assert: function() { return (this.d.addYears(37).getWeek() == 52); }
    },
    '2007': {
      run: function() {},
      assert: function() { return (this.d.addYears(38).getWeek() == 1); }
    },
    '2008': {
      run: function() {},
      assert: function() { return (this.d.addYears(39).getWeek() == 1); }
    },
    '2009': {
      run: function() {},
      assert: function() { return (this.d.addYears(40).getWeek() == 1); }
    },
    '2010': {
      run: function() {},
      assert: function() { return (this.d.addYears(41).getWeek() == 53); }
    },
    '2011': {
      run: function() {},
      assert: function() { return (this.d.addYears(42).getWeek() == 52); }
    },
    '2012': {
      run: function() {},
      assert: function() { return (this.d.addYears(43).getWeek() == 52); }
    },
    '2013': {
      run: function() {},
      assert: function() { return (this.d.addYears(44).getWeek() == 1); }
    },
    '2014': {
      run: function() {},
      assert: function() { return (this.d.addYears(45).getWeek() == 1); }
    },
    '2015': {
      run: function() {},
      assert: function() { return (this.d.addYears(46).getWeek() == 1); }
    },
    '2016': {
      run: function() {},
      assert: function() { return (this.d.addYears(47).getWeek() == 53); }
    },
    '2017': {
      run: function() {},
      assert: function() { return (this.d.addYears(48).getWeek() == 52); }
    },
    '2018': {
      run: function() {},
      assert: function() { return (this.d.addYears(49).getWeek() == 1); }
    },
    '2019': {
      run: function() {},
      assert: function() { return (this.d.addYears(50).getWeek() == 1); }
    },
    '2020': {
      run: function() {},
      assert: function() { return (this.d.addYears(51).getWeek() == 1); }
    },
    '2021': {
      run: function() {},
      assert: function() { return (this.d.addYears(52).getWeek() == 53); }
    },
    '2022': {
      run: function() {},
      assert: function() { return (this.d.addYears(53).getWeek() == 52); }
    },
    '2023': {
      run: function() {},
      assert: function() { return (this.d.addYears(54).getWeek() == 52); }
    },
    '2024': {
      run: function() {},
      assert: function() { return (this.d.addYears(55).getWeek() == 1); }
    },
    '2025': {
      run: function() {},
      assert: function() { return (this.d.addYears(56).getWeek() == 1); }
    },
    '2026': {
      run: function() {},
      assert: function() { return (this.d.addYears(57).getWeek() == 1); }
    },
    '2027': {
      run: function() {},
      assert: function() { return (this.d.addYears(58).getWeek() == 53); }
    },
    '2028': {
      run: function() {},
      assert: function() { return (this.d.addYears(59).getWeek() == 52); }
    },
    '2029': {
      run: function() {},
      assert: function() { return (this.d.addYears(60).getWeek() == 1); }
    },
    '2030': {
      run: function() {},
      assert: function() { return (this.d.addYears(61).getWeek() == 1); }
    },
    '2031': {
      run: function() {},
      assert: function() { return (this.d.addYears(62).getWeek() == 1); }
    },
    '2032': {
      run: function() {},
      assert: function() { return (this.d.addYears(63).getWeek() == 1); }
    },
    '2033': {
      run: function() {},
      assert: function() { return (this.d.addYears(64).getWeek() == 53); }
    }
    
  }
  
  
  ,
  
  '.setWeek()': {
    setup: function() {
        this.d = Date.today().set({year: 1969});
    },
    '1969': {
      run: function() {},
      assert: function() { return this.d.addYears(0).setWeek(1).equals(new Date(1968, 11, 30)); }
    },
    '1970': {
      run: function() {},
      assert: function() { return this.d.addYears(1).setWeek(1).equals(new Date(1969, 11, 29)); }
    },
    '1971': {
      run: function() {},
      assert: function() { return this.d.addYears(2).setWeek(1).equals(new Date(1971, 0, 4)); }
    },
    '1972': {
      run: function() {},
      assert: function() { return this.d.addYears(3).setWeek(1).equals(new Date(1972, 0, 3)); }
    },
    '1973': {
      run: function() {},
      assert: function() { return this.d.addYears(4).setWeek(1).equals(new Date(1973, 0, 1)); }
    },
    '1974': {
      run: function() {},
      assert: function() { return this.d.addYears(5).setWeek(1).equals(new Date(1973, 11, 31)); }
    },
    '1975': {
      run: function() {},
      assert: function() { return this.d.addYears(6).setWeek(1).equals(new Date(1974, 11, 30)); }
    },
    '1976': {
      run: function() {},
      assert: function() { return this.d.addYears(7).setWeek(1).equals(new Date(1975, 11, 29)); }
    },
    '1977': {
      run: function() {},
      assert: function() { return this.d.addYears(8).setWeek(1).equals(new Date(1977, 0, 3)); }
    },
    '1978': {
      run: function() {},
      assert: function() { return this.d.addYears(9).setWeek(1).equals(new Date(1978, 0, 2)); }
    },
    '1979': {
      run: function() {},
      assert: function() { return this.d.addYears(10).setWeek(1).equals(new Date(1979, 0, 1)); }
    },
    '1980': {
      run: function() {},
      assert: function() { return this.d.addYears(11).setWeek(1).equals(new Date(1979, 11, 31)); }
    },
    '1981': {
      run: function() {},
      assert: function() { return this.d.addYears(12).setWeek(1).equals(new Date(1980, 11, 29)); }
    },
    '1982': {
      run: function() {},
      assert: function() { return this.d.addYears(13).setWeek(1).equals(new Date(1982, 0, 4)); }
    },
    '1983': {
      run: function() {},
      assert: function() { return this.d.addYears(14).setWeek(1).equals(new Date(1983, 0, 3)); }
    },
    '1984': {
      run: function() {},
      assert: function() { return this.d.addYears(15).setWeek(1).equals(new Date(1984, 0, 2)); }
    },
    '1985': {
      run: function() {},
      assert: function() { return this.d.addYears(16).setWeek(1).equals(new Date(1984, 11, 31)); }
    },
    '1986': {
      run: function() {},
      assert: function() { return this.d.addYears(17).setWeek(1).equals(new Date(1985, 11, 30)); }
    },
    '1987': {
      run: function() {},
      assert: function() { return this.d.addYears(18).setWeek(1).equals(new Date(1986, 11, 29)); }
    },
    '1988': {
      run: function() {},
      assert: function() { return this.d.addYears(19).setWeek(1).equals(new Date(1988, 0, 4)); }
    },
    '1989': {
      run: function() {},
      assert: function() { return this.d.addYears(20).setWeek(1).equals(new Date(1989, 0, 2)); }
    },
    '1990': {
      run: function() {},
      assert: function() { return this.d.addYears(21).setWeek(1).equals(new Date(1990, 0, 1)); }
    },
    '1991': {
      run: function() {},
      assert: function() { return this.d.addYears(22).setWeek(1).equals(new Date(1990, 11, 31)); }
    },
    '1992': {
      run: function() {},
      assert: function() { return this.d.addYears(23).setWeek(1).equals(new Date(1991, 11, 30)); }
    },
    '1993': {
      run: function() {},
      assert: function() { return this.d.addYears(24).setWeek(1).equals(new Date(1993, 0, 4)); }
    },
    '1994': {
      run: function() {},
      assert: function() { return this.d.addYears(25).setWeek(1).equals(new Date(1994, 0, 3)); }
    },
    '1995': {
      run: function() {},
      assert: function() { return this.d.addYears(26).setWeek(1).equals(new Date(1995, 0, 2)); }
    },
    '1996': {
      run: function() {},
      assert: function() { return this.d.addYears(27).setWeek(1).equals(new Date(1996, 0, 1)); }
    },
    '1997': {
      run: function() {},
      assert: function() { return this.d.addYears(28).setWeek(1).equals(new Date(1996, 11, 30)); }
    },
    '1998': {
      run: function() {},
      assert: function() { return this.d.addYears(29).setWeek(1).equals(new Date(1997, 11, 29)); }
    },
    '1999': {
      run: function() {},
      assert: function() { return this.d.addYears(30).setWeek(1).equals(new Date(1999, 0, 4)); }
    },
    '2000': {
      run: function() {},
      assert: function() { return this.d.addYears(31).setWeek(1).equals(new Date(2000, 0, 3)); }
    },
    '2001': {
      run: function() {},
      assert: function() { return this.d.addYears(32).setWeek(1).equals(new Date(2001, 0, 1)); }
    },
    '2002': {
      run: function() {},
      assert: function() { return this.d.addYears(33).setWeek(1).equals(new Date(2001, 11, 31)); }
    },
    '2003': {
      run: function() {},
      assert: function() { return this.d.addYears(34).setWeek(1).equals(new Date(2002, 11, 30)); }
    },
    '2004': {
      run: function() {},
      assert: function() { return this.d.addYears(35).setWeek(1).equals(new Date(2003, 11, 29)); }
    },
    '2005': {
      run: function() {},
      assert: function() { return this.d.addYears(36).setWeek(1).equals(new Date(2005, 0, 3)); }
    },
    '2006': {
      run: function() {},
      assert: function() { return this.d.addYears(37).setWeek(1).equals(new Date(2006, 0, 2)); }
    },
    '2007': {
      run: function() {},
      assert: function() { return this.d.addYears(38).setWeek(1).equals(new Date(2007, 0, 1)); }
    },
    '2008': {
      run: function() {},
      assert: function() { return this.d.addYears(39).setWeek(1).equals(new Date(2007, 11, 31)); }
    },
    '2009': {
      run: function() {},
      assert: function() { return this.d.addYears(40).setWeek(1).equals(new Date(2008, 11, 29)); }
    },
    '2010': {
      run: function() {},
      assert: function() { return this.d.addYears(41).setWeek(1).equals(new Date(2010, 0, 4)); }
    },
    '2011': {
      run: function() {},
      assert: function() { return this.d.addYears(42).setWeek(1).equals(new Date(2011, 0, 3)); }
    },
    '2012': {
      run: function() {},
      assert: function() { return this.d.addYears(43).setWeek(1).equals(new Date(2012, 0, 2)); }
    },
    '2013': {
      run: function() {},
      assert: function() { return this.d.addYears(44).setWeek(1).equals(new Date(2012, 11, 31)); }
    },
    '2014': {
      run: function() {},
      assert: function() { return this.d.addYears(45).setWeek(1).equals(new Date(2013, 11, 30)); }
    },
    '2015': {
      run: function() {},
      assert: function() { return this.d.addYears(46).setWeek(1).equals(new Date(2014, 11, 29)); }
    },
    '2016': {
      run: function() {},
      assert: function() { return this.d.addYears(47).setWeek(1).equals(new Date(2016, 0, 4)); }
    },
    '2017': {
      run: function() {},
      assert: function() { return this.d.addYears(48).setWeek(1).equals(new Date(2017, 0, 2)); }
    },
    '2018': {
      run: function() {},
      assert: function() { return this.d.addYears(49).setWeek(1).equals(new Date(2018, 0, 1)); }
    },
    '2019': {
      run: function() {},
      assert: function() { return this.d.addYears(50).setWeek(1).equals(new Date(2018, 11, 31)); }
    },
    '2020': {
      run: function() {},
      assert: function() { return this.d.addYears(51).setWeek(1).equals(new Date(2019, 11, 30)); }
    },
    '2021': {
      run: function() {},
      assert: function() { return this.d.addYears(52).setWeek(1).equals(new Date(2021, 0, 4)); }
    },
    '2022': {
      run: function() {},
      assert: function() { return this.d.addYears(53).setWeek(1).equals(new Date(2022, 0, 3)); }
    },
    '2023': {
      run: function() {},
      assert: function() { return this.d.addYears(54).setWeek(1).equals(new Date(2023, 0, 2)); }
    },
    '2024': {
      run: function() {},
      assert: function() { return this.d.addYears(55).setWeek(1).equals(new Date(2024, 0, 1)); }
    },
    '2025': {
      run: function() {},
      assert: function() { return this.d.addYears(56).setWeek(1).equals(new Date(2024, 11, 30)); }
    },
    '2026': {
      run: function() {},
      assert: function() { return this.d.addYears(57).setWeek(1).equals(new Date(2025, 11, 29)); }
    },
    '2027': {
      run: function() {},
      assert: function() { return this.d.addYears(58).setWeek(1).equals(new Date(2027, 0, 4)); }
    },
    '2028': {
      run: function() {},
      assert: function() { return this.d.addYears(59).setWeek(1).equals(new Date(2028, 0, 3)); }
    },
    '2029': {
      run: function() {},
      assert: function() { return this.d.addYears(60).setWeek(1).equals(new Date(2029, 0, 1)); }
    },
    '2030': {
      run: function() {},
      assert: function() { return this.d.addYears(61).setWeek(1).equals(new Date(2029, 11, 31)); }
    },
    '2031': {
      run: function() {},
      assert: function() { return this.d.addYears(62).setWeek(1).equals(new Date(2030, 11, 30)); }
    },
    '2032': {
      run: function() {},
      assert: function() { return this.d.addYears(63).setWeek(1).equals(new Date(2031, 11, 29)); }
    },
    '2033': {
      run: function() {},
      assert: function() { return this.d.addYears(64).setWeek(1).equals(new Date(2033, 0, 3)); }
    }
    
  }
  
  ,
  
  '.getOrdinalNumber() at 00:00': {
    setup: function() { },
    '1-Jan-2008 (Ordinal Day: 1)': {
      run: function() {},
      assert: function() { return (new Date(2008, 0, 1).getOrdinalNumber() === 1); }
    },
    '15-Jan-2008 (Ordinal Day: 15)': {
      run: function() {},
      assert: function() { return (new Date(2008, 0, 15).getOrdinalNumber() === 15); }
    },
    '1-Feb-2008 (Ordinal Day: 32)': {
      run: function() {},
      assert: function() { return (new Date(2008, 1, 1).getOrdinalNumber() === 32); }
    },
    '28-Feb-2007 (Ordinal Day: 59)': {
      run: function() {},
      assert: function() { return (new Date(2007, 1, 28).getOrdinalNumber() === 59); }
    },
    '29-Feb-2008 (Ordinal Day: 60)': {
      run: function() {},
      assert: function() { return (new Date(2008, 1, 29).getOrdinalNumber() === 60); }
    },
    '1-Mar-2008 (Ordinal Day: 61)': {
      run: function() {},
      assert: function() { return (new Date(2008, 2, 1).getOrdinalNumber() === 61); }
    },
    '1-Apr-2008 (Ordinal Day: 92)': {
      run: function() {},
      assert: function() { return (new Date(2008, 3, 1).getOrdinalNumber() === 92); }
    },
    '1-May-2008 (Ordinal Day: 122)': {
      run: function() {},
      assert: function() { return (new Date(2008, 4, 1).getOrdinalNumber() === 122); }
    },
    '1-Jun-2008 (Ordinal Day: 153)': {
      run: function() {},
      assert: function() { return (new Date(2008, 5, 1).getOrdinalNumber() === 153); }
    },
    '1-Jul-2008 (Ordinal Day: 183)': {
      run: function() {},
      assert: function() { return (new Date(2008, 6, 1).getOrdinalNumber() === 183); }
    },
    '1-Aug-2008 (Ordinal Day: 214)': {
      run: function() {},
      assert: function() { return (new Date(2008, 7, 1).getOrdinalNumber() === 214); }
    },
    '1-Sep-2008 (Ordinal Day: 245)': {
      run: function() {},
      assert: function() { return (new Date(2008, 8, 1).getOrdinalNumber() === 245); }
    },
    '1-Oct-2008 (Ordinal Day: 275)': {
      run: function() {},
      assert: function() { return (new Date(2008, 9, 1).getOrdinalNumber() === 275); }
    },
    '1-Nov-2008 (Ordinal Day: 306)': {
      run: function() {},
      assert: function() { return (new Date(2008, 10, 1).getOrdinalNumber() === 306); }
    },
    '1-Dec-2008 (Ordinal Day: 336)': {
      run: function() {},
      assert: function() { return (new Date(2008, 11, 1).getOrdinalNumber() === 336); }
    },
    '31-Dec-2008 (Ordinal Day: 366)': {
      run: function() {},
      assert: function() { return (new Date(2008, 11, 31).getOrdinalNumber() === 366); }
    }
    
  }
  
  ,
  
  '.getOrdinalNumber() with time set to now': {
    setup: function() { },
    '1-Jan-2008 (Ordinal Day: 1)': {
      run: function() {},
      assert: function() { return (new Date(2008, 0, 1).setTimeToNow().getOrdinalNumber() === 1); }
    },
    '15-Jan-2008 (Ordinal Day: 15)': {
      run: function() {},
      assert: function() { return (new Date(2008, 0, 15).setTimeToNow().getOrdinalNumber() === 15); }
    },
    '1-Feb-2008 (Ordinal Day: 32)': {
      run: function() {},
      assert: function() { return (new Date(2008, 1, 1).setTimeToNow().getOrdinalNumber() === 32); }
    },
    '28-Feb-2007 (Ordinal Day: 59)': {
      run: function() {},
      assert: function() { return (new Date(2007, 1, 28).setTimeToNow().getOrdinalNumber() === 59); }
    },
    '29-Feb-2008 (Ordinal Day: 60)': {
      run: function() {},
      assert: function() { return (new Date(2008, 1, 29).setTimeToNow().getOrdinalNumber() === 60); }
    },
    '1-Mar-2008 (Ordinal Day: 61)': {
      run: function() {},
      assert: function() { return (new Date(2008, 2, 1).setTimeToNow().getOrdinalNumber() === 61); }
    },
    '1-Apr-2008 (Ordinal Day: 92)': {
      run: function() {},
      assert: function() { return (new Date(2008, 3, 1).setTimeToNow().getOrdinalNumber() === 92); }
    },
    '1-May-2008 (Ordinal Day: 122)': {
      run: function() {},
      assert: function() { return (new Date(2008, 4, 1).setTimeToNow().getOrdinalNumber() === 122); }
    },
    '1-Jun-2008 (Ordinal Day: 153)': {
      run: function() {},
      assert: function() { return (new Date(2008, 5, 1).setTimeToNow().getOrdinalNumber() === 153); }
    },
    '1-Jul-2008 (Ordinal Day: 183)': {
      run: function() {},
      assert: function() { return (new Date(2008, 6, 1).setTimeToNow().getOrdinalNumber() === 183); }
    },
    '1-Aug-2008 (Ordinal Day: 214)': {
      run: function() {},
      assert: function() { return (new Date(2008, 7, 1).setTimeToNow().getOrdinalNumber() === 214); }
    },
    '1-Sep-2008 (Ordinal Day: 245)': {
      run: function() {},
      assert: function() { return (new Date(2008, 8, 1).setTimeToNow().getOrdinalNumber() === 245); }
    },
    '1-Oct-2008 (Ordinal Day:275 )': {
      run: function() {},
      assert: function() { return (new Date(2008, 9, 1).setTimeToNow().getOrdinalNumber() === 275); }
    },
    '1-Nov-2008 (Ordinal Day: 306)': {
      run: function() {},
      assert: function() { return (new Date(2008, 10, 1).setTimeToNow().getOrdinalNumber() === 306); }
    },
    '1-Dec-2008 (Ordinal Day: 336)': {
      run: function() {},
      assert: function() { return (new Date(2008, 11, 1).setTimeToNow().getOrdinalNumber() === 336); }
    },
    '31-Dec-2008 (Ordinal Day: 366)': {
      run: function() {},
      assert: function() { return (new Date(2008, 11, 31).setTimeToNow().getOrdinalNumber() === 366); }
    }
    
  }
  
});

$(document).ready(function() { Date.Specification.validate().show() });
