var date; module(“Date Formatting”, {

setup: function() {
  date = new Date(2011, 7, 12, 10, 15, 25);
}

});

function fmt(str, date) {

return str.fmt({ date: date, dateFormatter: SC.DateFormatter });

}

test(“Era”, function() {

equals(fmt("%{date:G}", date), "AD", "One G");
equals(fmt("%{date:GG}", date), "AD", "Two Gs");
equals(fmt("%{date:GGG}", date), "AD", "Three Gs");
equals(fmt("%{date:GGGG}", date), "Anno Domini", "Four Gs");
equals(fmt("%{date:GGGGG}", date), "A", "Five Gs");

date = new Date(-100, 1, 1);
equals(fmt("%{date:G}", date), "BC", "One G");
equals(fmt("%{date:GG}", date), "BC", "Two Gs");
equals(fmt("%{date:GGG}", date), "BC", "Three Gs");

// seems rather politically-incorrect, but from what I can tell, we DO use
// BC/AD, and BC stands for that. BCE would be Before Common Era.
equals(fmt("%{date:GGGG}", date), "Before Christ", "Four Gs");
equals(fmt("%{date:GGGGG}", date), "B", "Five Gs");

});

test(“Year”, function() {

date.setFullYear(10);
equals(fmt("%{date:y}", date), "0");
equals(fmt("%{date:yy}", date), "10");
equals(fmt("%{date:yyy}", date), "010");
equals(fmt("%{date:yyyy}", date), "0010");

date.setFullYear(2010);
equals(fmt("%{date:y}", date), "0");
equals(fmt("%{date:yy}", date), "10");
equals(fmt("%{date:yyy}", date), "010");
equals(fmt("%{date:yyyy}", date), "2010");

date.setFullYear(-10);
equals(fmt("%{date:y}", date), "0");
equals(fmt("%{date:yy}", date), "10");
equals(fmt("%{date:yyy}", date), "010");
equals(fmt("%{date:yyyy}", date), "0010");

});

test(“Year - Negative for BC”, function() {

date.setFullYear(10);
equals(fmt("%{date:u}", date), "0");
equals(fmt("%{date:uu}", date), "10");
equals(fmt("%{date:uuu}", date), "010");
equals(fmt("%{date:uuuu}", date), "0010");

date.setFullYear(-10);
equals(fmt("%{date:u}", date), "-0");
equals(fmt("%{date:uu}", date), "-10");
equals(fmt("%{date:uuu}", date), "-010");
equals(fmt("%{date:uuuu}", date), "-0010");

});

test(“Quarter”, function() {

date = new Date(2011, 0, 1);
equals(fmt("%{date:Q}", date), "1");
equals(fmt("%{date:QQ}", date), "01");
equals(fmt("%{date:QQQ}", date), "Q1");
equals(fmt("%{date:QQQQ}", date), "1st quarter");

equals(fmt("%{date:q}", date), "1");
equals(fmt("%{date:qq}", date), "01");
equals(fmt("%{date:qqq}", date), "Q1");
equals(fmt("%{date:qqqq}", date), "1st Quarter");

date = new Date(2011, 2, 31);
equals(fmt("%{date:Q}", date), "1");
equals(fmt("%{date:QQ}", date), "01");
equals(fmt("%{date:QQQ}", date), "Q1");
equals(fmt("%{date:QQQQ}", date), "1st quarter");

equals(fmt("%{date:q}", date), "1");
equals(fmt("%{date:qq}", date), "01");
equals(fmt("%{date:qqq}", date), "Q1");
equals(fmt("%{date:qqqq}", date), "1st Quarter");

date = new Date(2011, 3, 1);
equals(fmt("%{date:Q}", date), "2");
equals(fmt("%{date:QQ}", date), "02");
equals(fmt("%{date:QQQ}", date), "Q2");
equals(fmt("%{date:QQQQ}", date), "2nd quarter");

equals(fmt("%{date:q}", date), "2");
equals(fmt("%{date:qq}", date), "02");
equals(fmt("%{date:qqq}", date), "Q2");
equals(fmt("%{date:qqqq}", date), "2nd Quarter");

date = new Date(2011, 5, 30);
equals(fmt("%{date:Q}", date), "2");
equals(fmt("%{date:QQ}", date), "02");
equals(fmt("%{date:QQQ}", date), "Q2");
equals(fmt("%{date:QQQQ}", date), "2nd quarter");

equals(fmt("%{date:q}", date), "2");
equals(fmt("%{date:qq}", date), "02");
equals(fmt("%{date:qqq}", date), "Q2");
equals(fmt("%{date:qqqq}", date), "2nd Quarter");

date = new Date(2011, 6, 1);
equals(fmt("%{date:Q}", date), "3");
equals(fmt("%{date:QQ}", date), "03");
equals(fmt("%{date:QQQ}", date), "Q3");
equals(fmt("%{date:QQQQ}", date), "3rd quarter");

equals(fmt("%{date:q}", date), "3");
equals(fmt("%{date:qq}", date), "03");
equals(fmt("%{date:qqq}", date), "Q3");
equals(fmt("%{date:qqqq}", date), "3rd Quarter");

date = new Date(2011, 8, 30);
equals(fmt("%{date:Q}", date), "3");
equals(fmt("%{date:QQ}", date), "03");
equals(fmt("%{date:QQQ}", date), "Q3");
equals(fmt("%{date:QQQQ}", date), "3rd quarter");

equals(fmt("%{date:q}", date), "3");
equals(fmt("%{date:qq}", date), "03");
equals(fmt("%{date:qqq}", date), "Q3");
equals(fmt("%{date:qqqq}", date), "3rd Quarter");

date = new Date(2011, 9, 1);
equals(fmt("%{date:Q}", date), "4");
equals(fmt("%{date:QQ}", date), "04");
equals(fmt("%{date:QQQ}", date), "Q4");
equals(fmt("%{date:QQQQ}", date), "4th quarter");

equals(fmt("%{date:q}", date), "4");
equals(fmt("%{date:qq}", date), "04");
equals(fmt("%{date:qqq}", date), "Q4");
equals(fmt("%{date:qqqq}", date), "4th Quarter");

date = new Date(2011, 11, 31);
equals(fmt("%{date:Q}", date), "4");
equals(fmt("%{date:QQ}", date), "04");
equals(fmt("%{date:QQQ}", date), "Q4");
equals(fmt("%{date:QQQQ}", date), "4th quarter");

equals(fmt("%{date:q}", date), "4");
equals(fmt("%{date:qq}", date), "04");
equals(fmt("%{date:qqq}", date), "Q4");
equals(fmt("%{date:qqqq}", date), "4th Quarter");

});

test(“Month”, function() {

//
// make the standalone month names distinctive
//
SC.stringsFor('english', {
  "SC.Date.Month.StandAlone.January.Abbreviated": "SJan",
  "SC.Date.Month.StandAlone.January.Full": "SJanuary",
  "SC.Date.Month.StandAlone.January.Letter": "SJ",

  "SC.Date.Month.StandAlone.February.Abbreviated": "SFeb",
  "SC.Date.Month.StandAlone.February.Full": "SFebruary",
  "SC.Date.Month.StandAlone.February.Letter": "SF",

  "SC.Date.Month.StandAlone.March.Abbreviated": "SMar",
  "SC.Date.Month.StandAlone.March.Full": "SMarch",
  "SC.Date.Month.StandAlone.March.Letter": "SM",

  "SC.Date.Month.StandAlone.April.Abbreviated": "SApr",
  "SC.Date.Month.StandAlone.April.Full": "SApril",
  "SC.Date.Month.StandAlone.April.Letter": "SA",

  "SC.Date.Month.StandAlone.May.Abbreviated": "SMay",
  "SC.Date.Month.StandAlone.May.Full": "SMay",
  "SC.Date.Month.StandAlone.May.Letter": "SM",

  "SC.Date.Month.StandAlone.June.Abbreviated": "SJun",
  "SC.Date.Month.StandAlone.June.Full": "SJune",
  "SC.Date.Month.StandAlone.June.Letter": "SJ",

  "SC.Date.Month.StandAlone.July.Abbreviated": "SJul",
  "SC.Date.Month.StandAlone.July.Full": "SJuly",
  "SC.Date.Month.StandAlone.July.Letter": "SJ",

  "SC.Date.Month.StandAlone.August.Abbreviated": "SAug",
  "SC.Date.Month.StandAlone.August.Full": "SAugust",
  "SC.Date.Month.StandAlone.August.Letter": "SA",

  "SC.Date.Month.StandAlone.September.Abbreviated": "SSep",
  "SC.Date.Month.StandAlone.September.Full": "SSeptember",
  "SC.Date.Month.StandAlone.September.Letter": "SS",

  "SC.Date.Month.StandAlone.October.Abbreviated": "SOct",
  "SC.Date.Month.StandAlone.October.Full": "SOctober",
  "SC.Date.Month.StandAlone.October.Letter": "SO",

  "SC.Date.Month.StandAlone.November.Abbreviated": "SNov",
  "SC.Date.Month.StandAlone.November.Full": "SNovember",
  "SC.Date.Month.StandAlone.November.Letter": "SN",

  "SC.Date.Month.StandAlone.December.Abbreviated": "SDec",
  "SC.Date.Month.StandAlone.December.Full": "SDecember",
  "SC.Date.Month.StandAlone.December.Letter": "SD"
});

function check(month, one, two, three, four, five) {
  date = new Date(2011, month, 1);
  equals(fmt("%{date:M}", date), one);
  equals(fmt("%{date:MM}", date), two);
  equals(fmt("%{date:MMM}", date), three);
  equals(fmt("%{date:MMMM}", date), four);
  equals(fmt("%{date:MMMMM}", date), five);
}

check(0,  "1",  "01", "Jan", "January", "J");
check(1,  "2",  "02", "Feb", "February", "F");
check(2,  "3",  "03", "Mar", "March", "M");
check(3,  "4",  "04", "Apr", "April", "A");
check(4,  "5",  "05", "May", "May", "M");
check(5,  "6",  "06", "Jun", "June", "J");
check(6,  "7",  "07", "Jul", "July", "J");
check(7,  "8",  "08", "Aug", "August", "A");
check(8,  "9",  "09", "Sep", "September", "S");
check(9,  "10", "10", "Oct", "October", "O");
check(10, "11", "11", "Nov", "November", "N");
check(11, "12", "12", "Dec", "December", "D");

function checkL(month, one, two, three, four, five) {
  date = new Date(2011, month, 1);
  equals(fmt("%{date:L}", date), one);
  equals(fmt("%{date:LL}", date), two);
  equals(fmt("%{date:LLL}", date), three);
  equals(fmt("%{date:LLLL}", date), four);
  equals(fmt("%{date:LLLLL}", date), five);
}

checkL(0,  "1",  "01", "SJan", "SJanuary", "SJ");
checkL(1,  "2",  "02", "SFeb", "SFebruary", "SF");
checkL(2,  "3",  "03", "SMar", "SMarch", "SM");
checkL(3,  "4",  "04", "SApr", "SApril", "SA");
checkL(4,  "5",  "05", "SMay", "SMay", "SM");
checkL(5,  "6",  "06", "SJun", "SJune", "SJ");
checkL(6,  "7",  "07", "SJul", "SJuly", "SJ");
checkL(7,  "8",  "08", "SAug", "SAugust", "SA");
checkL(8,  "9",  "09", "SSep", "SSeptember", "SS");
checkL(9,  "10", "10", "SOct", "SOctober", "SO");
checkL(10, "11", "11", "SNov", "SNovember", "SN");
checkL(11, "12", "12", "SDec", "SDecember", "SD");

});

// // Week Number: Not done… //

// // Day // test(“Day”, function() {

date = new Date(2011, 1, 2);
fmt("%{date:d}", date, "2");
fmt("%{date:dd}", date, "02");

date = new Date(2011, 1, 12);
fmt("%{date:d}", date, "12");
fmt("%{date:dd}", date, "12");

});

test(“Day of Year”, function() {

date = new Date(2011, 0, 1);
equals(fmt("%{date:D}", date), "1");

date = new Date(2011, 1, 1);
equals(fmt("%{date:D}", date), "32");

});

test(“Day of Week”, function() {

SC.stringsFor("English", {
  "SC.Date.Day.StandAlone.Monday.Abbreviated": "SMon",
  "SC.Date.Day.StandAlone.Monday.Full": "SMonday",
  "SC.Date.Day.StandAlone.Monday.Letter": "SM",

  "SC.Date.Day.StandAlone.Tuesday.Abbreviated": "STue",
  "SC.Date.Day.StandAlone.Tuesday.Full": "STuesday",
  "SC.Date.Day.StandAlone.Tuesday.Letter": "ST",

  "SC.Date.Day.StandAlone.Wednesday.Abbreviated": "SWed",
  "SC.Date.Day.StandAlone.Wednesday.Full": "SWednesday",
  "SC.Date.Day.StandAlone.Wednesday.Letter": "SW",

  "SC.Date.Day.StandAlone.Thursday.Abbreviated": "SThu",
  "SC.Date.Day.StandAlone.Thursday.Full": "SThursday",
  "SC.Date.Day.StandAlone.Thursday.Letter": "SR",

  "SC.Date.Day.StandAlone.Friday.Abbreviated": "SFri",
  "SC.Date.Day.StandAlone.Friday.Full": "SFriday",
  "SC.Date.Day.StandAlone.Friday.Letter": "SF",

  "SC.Date.Day.StandAlone.Saturday.Abbreviated": "SSat",
  "SC.Date.Day.StandAlone.Saturday.Full": "SSaturday",
  "SC.Date.Day.StandAlone.Saturday.Letter": "SS",

  "SC.Date.Day.StandAlone.Sunday.Abbreviated": "SSun",
  "SC.Date.Day.StandAlone.Sunday.Full": "SSunday",
  "SC.Date.Day.StandAlone.Sunday.Letter": "SS"
});

function check(day, number, abbr, full, letter) {
  date = new Date(2011, 7, day);
  equals(fmt("%{date:E}", date), abbr);
  equals(fmt("%{date:EE}", date), abbr);
  equals(fmt("%{date:EEE}", date), abbr);
  equals(fmt("%{date:EEEE}", date), full);
  equals(fmt("%{date:EEEEE}", date), letter);

  equals(fmt("%{date:e}", date), "" + number);
  equals(fmt("%{date:ee}", date), "0" + number);
  equals(fmt("%{date:eee}", date), abbr);
  equals(fmt("%{date:eeee}", date), full);
  equals(fmt("%{date:eeeee}", date), letter);

  equals(fmt("%{date:c}", date), "" + number);
  equals(fmt("%{date:cc}", date), "0" + number);
  equals(fmt("%{date:ccc}", date), "S" + abbr);
  equals(fmt("%{date:cccc}", date), "S" + full);
  equals(fmt("%{date:ccccc}", date), "S" + letter);
}

// the first is the day of the month of August 2011; the second is the
// expected day-of-week number
check(1, 2, "Mon", "Monday", "M");
check(2, 3, "Tue", "Tuesday", "T");
check(3, 4, "Wed", "Wednesday", "W");
check(4, 5, "Thu", "Thursday", "R");
check(5, 6, "Fri", "Friday", "F");
check(6, 7, "Sat", "Saturday", "S");
check(7, 1, "Sun", "Sunday", "S");

});

test(“Period”, function() {

// one in the morning...
date = new Date(2011, 7, 1, 1);
equals(fmt("%{date:a}", date), "AM");

date = new Date(2011, 7, 1, 11);
equals(fmt("%{date:a}", date), "AM");

date = new Date(2011, 7, 1, 12);
equals(fmt("%{date:a}", date), "PM");

});

test(“Hour”, function() {

// 12:00 AM
date = new Date(2011, 7, 1, 0);

// h: 12hr, 12:00 == 12:00
equals(fmt("%{date:h}", date), "12");
equals(fmt("%{date:hh}", date), "12");

// K: 12hr, 12:00 == 0:00
equals(fmt("%{date:K}", date), "0");
equals(fmt("%{date:KK}", date), "00");

// H: 24hr, 24:00 == 0:00
equals(fmt("%{date:H}", date), "0");
equals(fmt("%{date:HH}", date), "00");

// k: 24hr, 24:00 == 24:00
equals(fmt("%{date:k}", date), "24");
equals(fmt("%{date:kk}", date), "24");

// 1:00 AM
date = new Date(2011, 7, 1, 1);

// h: 12hr, 12:00 == 12:00
equals(fmt("%{date:h}", date), "1");
equals(fmt("%{date:hh}", date), "01");

// K: 12hr, 12:00 == 0:00
equals(fmt("%{date:K}", date), "1");
equals(fmt("%{date:KK}", date), "01");

// H: 24hr, 24:00 == 0:00
equals(fmt("%{date:H}", date), "1");
equals(fmt("%{date:HH}", date), "01");

// k: 24hr, 24:00 == 24:00
equals(fmt("%{date:k}", date), "1");
equals(fmt("%{date:kk}", date), "01");

// 11:00 AM
date = new Date(2011, 7, 1, 11);

// h: 12hr, 12:00 == 12:00
equals(fmt("%{date:h}", date), "11");
equals(fmt("%{date:hh}", date), "11");

// K: 12hr, 12:00 == 0:00
equals(fmt("%{date:K}", date), "11");
equals(fmt("%{date:KK}", date), "11");

// H: 24hr, 24:00 == 0:00
equals(fmt("%{date:H}", date), "11");
equals(fmt("%{date:HH}", date), "11");

// k: 24hr, 24:00 == 24:00
equals(fmt("%{date:k}", date), "11");
equals(fmt("%{date:kk}", date), "11");

// 12:00 PM
date = new Date(2011, 7, 1, 12);

// h: 12hr, 12:00 == 12:00
equals(fmt("%{date:h}", date), "12");
equals(fmt("%{date:hh}", date), "12");

// K: 12hr, 12:00 == 0:00
equals(fmt("%{date:K}", date), "0");
equals(fmt("%{date:KK}", date), "00");

// H: 24hr, 24:00 == 0:00
equals(fmt("%{date:H}", date), "12");
equals(fmt("%{date:HH}", date), "12");

// k: 24hr, 24:00 == 24:00
equals(fmt("%{date:k}", date), "12");
equals(fmt("%{date:kk}", date), "12");

// 1:00 PM
date = new Date(2011, 7, 1, 13);

// h: 12hr, 12:00 == 12:00
equals(fmt("%{date:h}", date), "1");
equals(fmt("%{date:hh}", date), "01");

// K: 12hr, 12:00 == 0:00
equals(fmt("%{date:K}", date), "1");
equals(fmt("%{date:KK}", date), "01");

// H: 24hr, 24:00 == 0:00
equals(fmt("%{date:H}", date), "13");
equals(fmt("%{date:HH}", date), "13");

// k: 24hr, 24:00 == 24:00
equals(fmt("%{date:k}", date), "13");
equals(fmt("%{date:kk}", date), "13");

});

test(“Minutes”, function() {

date = new Date(2011, 7, 1, 13, 9);
equals(fmt("%{date:m}", date), "9");
equals(fmt("%{date:mm}", date), "09");

date = new Date(2011, 7, 1, 13, 12);
equals(fmt("%{date:m}", date), "12");
equals(fmt("%{date:mm}", date), "12");

});

test(“Seconds”, function() {

date = new Date(2011, 7, 1, 13, 1, 9);
equals(fmt("%{date:s}", date), "9");
equals(fmt("%{date:ss}", date), "09");

date = new Date(2011, 7, 1, 13, 1, 19);
equals(fmt("%{date:s}", date), "19");
equals(fmt("%{date:ss}", date), "19");

});

test(“Fractional seconds”, function() {

date = new Date(2011, 7, 1);

date.setMilliseconds(100);
equals(fmt("%{date:S}", date), "1");

date.setMilliseconds(151);
equals(fmt("%{date:S}", date), "2");
equals(fmt("%{date:SS}", date), "15");
equals(fmt("%{date:SSS}", date), "151");

date.setMilliseconds(1);
equals(fmt("%{date:S}", date), "0");
equals(fmt("%{date:SS}", date), "00");
equals(fmt("%{date:SSS}", date), "001");

});

test(“Milliseconds in day”, function() {

date = new Date(2011, 7, 1, 0, 1, 1);
date.setMilliseconds(100);

equals(fmt("%{date:A}", date), "61100");
equals(fmt("%{date:AAAAA}", date), "61100");
equals(fmt("%{date:AAAAAA}", date), "061100");

});