1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This should output "PROXY success:80" if all the tests pass.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Otherwise it will output "PROXY failure:<num-failures>".
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This aims to unit-test the PAC library functions, which are
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// exposed in the PAC's execution environment. (Namely, dnsDomainLevels,
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// timeRange, etc.)
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottfunction FindProxyForURL(url, host) {
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var numTestsFailed = 0;
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Run all the tests
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (var test in Tests) {
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    var t = new TestContext(test);
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Run the test.
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    Tests[test](t);
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (t.failed()) {
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      numTestsFailed++;
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (numTestsFailed == 0) {
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return "PROXY success:80";
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return "PROXY failure:" + numTestsFailed;
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// --------------------------
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Tests
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// --------------------------
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvar Tests = {};
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTests.testDnsDomainIs = function(t) {
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectTrue(dnsDomainIs("google.com", ".com"));
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectTrue(dnsDomainIs("google.co.uk", ".co.uk"));
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectFalse(dnsDomainIs("google.com", ".co.uk"));
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectFalse(dnsDomainIs("www.adobe.com", ".ad"));
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTests.testDnsDomainLevels = function(t) {
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(0, dnsDomainLevels("www"));
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(2, dnsDomainLevels("www.google.com"));
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(3, dnsDomainLevels("192.168.1.1"));
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTests.testIsInNet = function(t) {
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectTrue(
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      isInNet("192.89.132.25", "192.89.132.25", "255.255.255.255"));
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectFalse(
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      isInNet("193.89.132.25", "192.89.132.25", "255.255.255.255"));
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectTrue(isInNet("192.89.132.25", "192.89.0.0", "255.255.0.0"));
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectFalse(isInNet("193.89.132.25", "192.89.0.0", "255.255.0.0"));
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectFalse(
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      isInNet("192.89.132.a", "192.89.0.0", "255.255.0.0"));
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTests.testIsPlainHostName = function(t) {
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectTrue(isPlainHostName("google"));
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectFalse(isPlainHostName("google.com"));
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTests.testLocalHostOrDomainIs = function(t) {
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectTrue(localHostOrDomainIs("www.google.com", "www.google.com"));
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectTrue(localHostOrDomainIs("www", "www.google.com"));
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectFalse(localHostOrDomainIs("maps.google.com", "www.google.com"));
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTests.testShExpMatch = function(t) {
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectTrue(shExpMatch("foo.jpg", "*.jpg"));
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectTrue(shExpMatch("foo5.jpg", "*o?.jpg"));
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectFalse(shExpMatch("foo.jpg", ".jpg"));
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectFalse(shExpMatch("foo.jpg", "foo"));
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
793345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTests.testSortIpAddressList = function(t) {
803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectEquals("::1;::2;::3", sortIpAddressList("::2;::3;::1"));
813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectEquals(
823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "2001:4898:28:3:201:2ff:feea:fc14;fe80::5efe:157:9d3b:8b16;157.59.139.22",
833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      sortIpAddressList("157.59.139.22;" +
843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                        "2001:4898:28:3:201:2ff:feea:fc14;" +
853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                        "fe80::5efe:157:9d3b:8b16"));
863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Single IP address (v4 and v6).
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectEquals("127.0.0.1", sortIpAddressList("127.0.0.1"));
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectEquals("::1", sortIpAddressList("::1"))
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Verify that IPv6 address is not re-written (not reduced).
923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectEquals("0:0::1;192.168.1.1", sortIpAddressList("192.168.1.1;0:0::1"));
933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Input is already sorted.
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectEquals("::1;192.168.1.3", sortIpAddressList("::1;192.168.1.3"));
963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Same-valued IP addresses (also tests stability).
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectEquals("0::1;::1;0:0::1", sortIpAddressList("0::1;::1;0:0::1"));
993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Contains extra semi-colons.
1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectEquals("127.0.0.1", sortIpAddressList(";127.0.0.1;"));
1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Contains whitespace (spaces and tabs).
1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectEquals("192.168.0.1;192.168.0.2",
1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      sortIpAddressList("192.168.0.1; 192.168.0.2"));
1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectEquals("127.0.0.0;127.0.0.1;127.0.0.2",
1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      sortIpAddressList("127.0.0.1;	127.0.0.2;	 127.0.0.0"));
1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Empty lists.
1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectFalse(sortIpAddressList(""));
1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectFalse(sortIpAddressList(" "));
1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectFalse(sortIpAddressList(";"));
1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectFalse(sortIpAddressList(";;"));
1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectFalse(sortIpAddressList(" ;  ; "));
1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Invalid IP addresses.
1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectFalse(sortIpAddressList("256.0.0.1"));
1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectFalse(sortIpAddressList("192.168.1.1;0:0:0:1;127.0.0.1"));
1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Call sortIpAddressList() with wonky arguments.
1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectEquals(null, sortIpAddressList());
1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectEquals(null, sortIpAddressList(null));
1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectEquals(null, sortIpAddressList(null, null));
1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTests.testIsInNetEx = function(t) {
1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectTrue(isInNetEx("198.95.249.79", "198.95.249.79/32"));
1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectTrue(isInNetEx("198.95.115.10", "198.95.0.0/16"));
1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectTrue(isInNetEx("198.95.1.1", "198.95.0.0/16"));
1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectTrue(isInNetEx("198.95.1.1", "198.95.3.3/16"));
1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectTrue(isInNetEx("0:0:0:0:0:0:7f00:1", "0:0:0:0:0:0:7f00:1/32"));
1323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectTrue(isInNetEx("3ffe:8311:ffff:abcd:1234:dead:beef:101",
1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                         "3ffe:8311:ffff::/48"));
1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // IPv4 and IPv6 mix.
1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectFalse(isInNetEx("127.0.0.1", "0:0:0:0:0:0:7f00:1/16"));
1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectFalse(isInNetEx("192.168.24.3", "fe80:0:0:0:0:0:c0a8:1803/32"));
1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectFalse(isInNetEx("198.95.249.78", "198.95.249.79/32"));
1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectFalse(isInNetEx("198.96.115.10", "198.95.0.0/16"));
1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectFalse(isInNetEx("3fff:8311:ffff:abcd:1234:dead:beef:101",
1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                          "3ffe:8311:ffff::/48"));
1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Call isInNetEx with wonky arguments.
1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectEquals(null, isInNetEx());
1463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectEquals(null, isInNetEx(null));
1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectEquals(null, isInNetEx(null, null));
1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectEquals(null, isInNetEx(null, null, null));
1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectEquals(null, isInNetEx("198.95.249.79"));
1503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Invalid IP address.
1523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectFalse(isInNetEx("256.0.0.1", "198.95.249.79"));
1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectFalse(isInNetEx("127.0.0.1 ", "127.0.0.1/32"));  // Extra space.
1543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Invalid prefix.
1563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectFalse(isInNetEx("198.95.115.10", "198.95.0.0/34"));
1573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  t.expectFalse(isInNetEx("127.0.0.1", "127.0.0.1"));  // Missing '/' in prefix.
1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTests.testWeekdayRange = function(t) {
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test with local time.
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MockDate.setCurrent("Tue Mar 03 2009");
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, weekdayRange("MON", "FRI"));
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, weekdayRange("TUE", "FRI"));
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, weekdayRange("TUE", "TUE"));
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, weekdayRange("TUE"));
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, weekdayRange("WED", "FRI"));
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, weekdayRange("SUN", "MON"));
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, weekdayRange("SAT"));
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, weekdayRange("FRI", "MON"));
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test with GMT time.
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MockDate.setCurrent("Tue Mar 03 2009 GMT");
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, weekdayRange("MON", "FRI", "GMT"));
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, weekdayRange("TUE", "FRI", "GMT"));
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, weekdayRange("TUE", "TUE", "GMT"));
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, weekdayRange("TUE", "GMT"));
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, weekdayRange("WED", "FRI", "GMT"));
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, weekdayRange("SUN", "MON", "GMT"));
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, weekdayRange("SAT", "GMT"));
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTests.testDateRange = function(t) {
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // dateRange(day)
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MockDate.setCurrent("Mar 03 2009");
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, dateRange(3));
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, dateRange(1));
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // dateRange(day, "GMT")
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MockDate.setCurrent("Mar 03 2009 GMT");
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, dateRange(3, "GMT"));
192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, dateRange(1, "GMT"));
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // dateRange(day1, day2)
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MockDate.setCurrent("Mar 03 2009");
196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, dateRange(1, 4));
197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, dateRange(4, 20));
198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // dateRange(day, month)
200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MockDate.setCurrent("Mar 03 2009");
201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, dateRange(3, "MAR"));
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MockDate.setCurrent("Mar 03 2014");
203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, dateRange(3, "MAR"));
204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // TODO(eroman):
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //t.expectEquals(false, dateRange(2, "MAR"));
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //t.expectEquals(false, dateRange(3, "JAN"));
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // dateRange(day, month, year)
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MockDate.setCurrent("Mar 03 2009");
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, dateRange(3, "MAR", 2009));
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, dateRange(4, "MAR", 2009));
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, dateRange(3, "FEB", 2009));
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MockDate.setCurrent("Mar 03 2014");
214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, dateRange(3, "MAR", 2009));
215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // dateRange(month1, month2)
217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MockDate.setCurrent("Mar 03 2009");
218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, dateRange("JAN", "MAR"));
219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, dateRange("MAR", "APR"));
220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, dateRange("MAY", "SEP"));
221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // dateRange(day1, month1, day2, month2)
223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MockDate.setCurrent("Mar 03 2009");
224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, dateRange(1, "JAN", 3, "MAR"));
225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, dateRange(3, "MAR", 4, "SEP"));
226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, dateRange(4, "MAR", 4, "SEP"));
227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // dateRange(month1, year1, month2, year2)
229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MockDate.setCurrent("Mar 03 2009");
230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, dateRange("FEB", 2009, "MAR", 2009));
231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MockDate.setCurrent("Apr 03 2009");
232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, dateRange("FEB", 2009, "MAR", 2010));
233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, dateRange("FEB", 2009, "MAR", 2009));
234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // dateRange(day1, month1, year1, day2, month2, year2)
236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MockDate.setCurrent("Mar 03 2009");
237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, dateRange(1, "JAN", 2009, 3, "MAR", 2009));
238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, dateRange(3, "MAR", 2009, 4, "SEP", 2009));
239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, dateRange(3, "JAN", 2009, 4, "FEB", 2010));
240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, dateRange(4, "MAR", 2009, 4, "SEP", 2009));
241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTests.testTimeRange = function(t) {
244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // timeRange(hour)
245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MockDate.setCurrent("Mar 03, 2009 03:34:01");
246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, timeRange(3));
247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, timeRange(2));
248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // timeRange(hour1, hour2)
250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MockDate.setCurrent("Mar 03, 2009 03:34:01");
251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, timeRange(2, 3));
252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, timeRange(2, 4));
253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, timeRange(3, 5));
254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, timeRange(1, 2));
255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, timeRange(11, 12));
256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // timeRange(hour1, min1, hour2, min2)
258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MockDate.setCurrent("Mar 03, 2009 03:34:01");
259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, timeRange(1, 0, 3, 34));
260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, timeRange(1, 0, 3, 35));
261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, timeRange(3, 34, 5, 0));
262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, timeRange(1, 0, 3, 0));
263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, timeRange(11, 0, 16, 0));
264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // timeRange(hour1, min1, sec1, hour2, min2, sec2)
266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MockDate.setCurrent("Mar 03, 2009 03:34:14");
267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, timeRange(1, 0, 0, 3, 34, 14));
268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, timeRange(1, 0, 0, 3, 34, 0));
269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, timeRange(1, 0, 0, 3, 35, 0));
270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(true, timeRange(3, 34, 0, 5, 0, 0));
271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, timeRange(1, 0, 0, 3, 0, 0));
272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  t.expectEquals(false, timeRange(11, 0, 0, 16, 0, 0));
273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// --------------------------
276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TestContext
277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// --------------------------
278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// |name| is the name of the test being executed, it will be used when logging
280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// errors.
281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottfunction TestContext(name) {
282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  this.numFailures_ = 0;
283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  this.name_ = name;
284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTestContext.prototype.failed = function() {
287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return this.numFailures_ != 0;
288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTestContext.prototype.expectEquals = function(expectation, actual) {
291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (!(expectation === actual)) {
292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    this.numFailures_++;
293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    this.log("FAIL: expected: " + expectation + ", actual: " + actual);
294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTestContext.prototype.expectTrue = function(x) {
298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  this.expectEquals(true, x);
299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTestContext.prototype.expectFalse = function(x) {
302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  this.expectEquals(false, x);
303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTestContext.prototype.log = function(x) {
306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Prefix with the test name that generated the log.
307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  try {
308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    alert(this.name_ + ": " + x);
309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  } catch(e) {
310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // In case alert() is not defined.
311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// --------------------------
315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// MockDate
316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// --------------------------
317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottfunction MockDate() {
319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  this.wrappedDate_ = new MockDate.super_(MockDate.currentDateString_);
320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Setup the MockDate so it forwards methods to "this.wrappedDate_" (which is a
323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// real Date object).  We can't simply chain the prototypes since Date() doesn't
324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// allow it.
325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottMockDate.init = function() {
326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MockDate.super_ = Date;
327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  function createProxyMethod(methodName) {
329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return function() {
330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      return this.wrappedDate_[methodName]
331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          .apply(this.wrappedDate_, arguments);
332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (i in MockDate.methodNames_) {
336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    var methodName = MockDate.methodNames_[i];
337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Don't define the closure directly in the loop body, since Javascript's
338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // crazy scoping rules mean |methodName| actually bleeds out of the loop!
339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    MockDate.prototype[methodName] = createProxyMethod(methodName);
340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Replace the native Date() with our mock.
343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Date = MockDate;
344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Unfortunately Date()'s methods are non-enumerable, therefore list manually.
347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottMockDate.methodNames_ = [
348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  "toString", "toDateString", "toTimeString", "toLocaleString",
349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  "toLocaleDateString", "toLocaleTimeString", "valueOf", "getTime",
350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  "getFullYear", "getUTCFullYear", "getMonth", "getUTCMonth",
351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  "getDate", "getUTCDate", "getDay", "getUTCDay", "getHours", "getUTCHours",
352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  "getMinutes", "getUTCMinutes", "getSeconds", "getUTCSeconds",
353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  "getMilliseconds", "getUTCMilliseconds", "getTimezoneOffset", "setTime",
354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  "setMilliseconds", "setUTCMilliseconds", "setSeconds", "setUTCSeconds",
355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  "setMinutes", "setUTCMinutes", "setHours", "setUTCHours", "setDate",
356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  "setUTCDate", "setMonth", "setUTCMonth", "setFullYear", "setUTCFullYear",
357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  "toGMTString", "toUTCString", "getYear", "setYear"
358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott];
359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottMockDate.setCurrent = function(currentDateString) {
361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MockDate.currentDateString_ = currentDateString;
362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Bind the methods to proxy requests to the wrapped Date().
365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottMockDate.init();
366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
367