1 package net.jaekl.frank;
3 import java.io.ByteArrayOutputStream;
4 import java.io.IOException;
5 import java.io.PrintWriter;
7 import java.util.Locale;
9 import org.junit.Assert;
11 import net.jaekl.frank.octranspo.RouteMock;
12 import net.jaekl.frank.octranspo.RouteSummaryMock;
13 import net.jaekl.frank.octranspo.TripMock;
15 import org.junit.After;
16 import org.junit.Before;
17 import org.junit.Test;
19 public class ScheduleTest {
20 static final String TITLE_PREFIX = "<HTML>\n<HEAD>\n"
21 + " <META NAME=\"viewport\" content=\"width=device-width\"/>\n"
23 static final String TITLE_SUFFIX = "</TITLE>\n" + Style.CSS + "\n</HEAD>\n";
26 ByteArrayOutputStream m_baos;
31 m_baos = new ByteArrayOutputStream();
32 m_pw = new PrintWriter(m_baos);
36 public void tearDown() throws IOException {
43 public void test_writeHeader() {
44 Locale[] locales = { Locale.CANADA, Locale.CANADA_FRENCH, Locale.JAPAN };
45 String[] titles = { "", "CARLETON", "BILLINGS BRIDGE (3204)" };
47 for (Locale locale : locales) {
48 Schedule schedule = new Schedule(locale);
49 for (String title : titles) {
50 String expected = TITLE_PREFIX + title + TITLE_SUFFIX;
54 schedule.writeHeader(m_pw, title);
57 String actual = m_baos.toString();
58 Assert.assertEquals(expected, actual);
64 public void test_writePage_withNoRoutes() {
65 final String stopName = "RIDEAU RIDEAU";
66 final int stopNo = 3009;
68 RouteSummaryMock rsm = new RouteSummaryMock();
69 rsm.mock_setDescr(stopName);
70 rsm.mock_setStopNo(stopNo);
72 Schedule schedule = new Schedule(Locale.CANADA);
76 schedule.writePage(m_pw, rsm);
79 String actual = m_baos.toString();
81 Assert.assertTrue(actual.contains(Style.CSS));
83 String expectedTitle = TITLE_PREFIX + "Frank: " + stopName + " (" + stopNo + ")" + TITLE_SUFFIX;
84 Assert.assertTrue(actual.contains(expectedTitle));
88 public void test_writePage_withMultipleRoutes() {
89 final String stopName = "RIDEAU RIDEAU";
90 final String SOUTH_KEYS = "South Keys";
91 final String HURDMAN = "Hurdman";
92 final int stopNo = 3009;
93 final Date queryDate = new Date(1418357155000L);
94 final double LAT1 = 45.379298;
95 final double LON1 = -75.652007;
96 final double LAT2 = 45.351322;
97 final double LON2 = -75.652007;
103 rsm = new RouteSummaryMock();
104 rsm.mock_setDescr(stopName);
105 rsm.mock_setStopNo(stopNo);
107 // First route: Number 1
108 route = new RouteMock();
109 route.mock_setRouteNo(1);
111 trip = new TripMock(queryDate);
112 trip.mock_setDest(SOUTH_KEYS);
113 trip.mock_setAdjTime(10);
114 trip.mock_setLatitude(LAT1);
115 trip.mock_setLongitude(LON1);
116 trip.mock_setSpeed(0.5);
117 route.mock_addTrip(trip);
119 trip = new TripMock(queryDate);
120 trip.mock_setDest(SOUTH_KEYS);
121 trip.mock_setAdjTime(20);
122 trip.mock_setLatitude(LAT2);
123 trip.mock_setLongitude(LON2);
124 trip.mock_setSpeed(22.4);
125 route.mock_addTrip(trip);
127 rsm.mock_addRoute(route);
129 // Second route: Number 4
130 route = new RouteMock();
131 route.mock_setRouteNo(4);
133 trip = new TripMock(queryDate);
134 trip.mock_setDest(HURDMAN);
135 trip.mock_setAdjTime(17);
136 route.mock_addTrip(trip);
138 trip = new TripMock(queryDate);
139 trip.mock_setDest(HURDMAN);
140 trip.mock_setAdjTime(37);
141 trip.mock_setAdjAge(-2);
142 route.mock_addTrip(trip);
144 rsm.mock_addRoute(route);
147 Schedule schedule = new Schedule(Locale.CANADA);
151 schedule.writePage(m_pw, rsm);
154 String actual = m_baos.toString();
156 // Some rudimentary validation of the result.
157 // Should really go through more permutations, and examine them more closely, here.
158 Assert.assertTrue(actual.contains(Style.CSS));
160 String expectedTitle = TITLE_PREFIX + "Frank: " + stopName + " (" + stopNo + ")" + TITLE_SUFFIX;
161 Assert.assertTrue(actual.contains(expectedTitle));
163 Assert.assertTrue(actual.contains("<TABLE ID=\"trips\">"));
164 Assert.assertTrue(actual.contains("<TR><TH COLSPAN=\"5\">" + stopName + " (" + stopNo + ")</TH></TR>"));
165 Assert.assertTrue(actual.contains("<TR><TH>Route</TH><TH>Destination</TH><TH>ETA</TH><TH>Remain</TH><TH>GPS Read</TH>"));
167 Assert.assertTrue(actual.contains("<TD>1</TD>"));
168 Assert.assertTrue(actual.contains("<TD>" + SOUTH_KEYS + "</TD>"));
169 Assert.assertTrue(actual.contains("<TD>11:15PM</TD>"));
170 Assert.assertTrue(actual.contains("<TD><SPAN ID=\"in_0\">10m</SPAN></TD>"));
171 Assert.assertTrue(actual.contains("<TD><A HREF=\"" + schedule.mapUrl(LAT1, LON1) + "\">11:05:55PM</A></TD>"));
173 Assert.assertTrue(actual.contains("<TD>1</TD>"));
174 Assert.assertTrue(actual.contains("<TD>" + SOUTH_KEYS + "</TD>"));
175 Assert.assertTrue(actual.contains("<TD>11:25PM"));
176 Assert.assertTrue(actual.contains("<TD><SPAN ID=\"in_1\">20m</SPAN></TD>"));
177 Assert.assertTrue(actual.contains("<TD><A HREF=\"" + schedule.mapUrl(LAT1, LON1) + "\">11:05:55PM</A></TD>"));
178 Assert.assertTrue(actual.contains("<TD>4</TD>"));
179 Assert.assertTrue(actual.contains("<TD>" + HURDMAN + "</TD>"));
180 Assert.assertTrue(actual.contains("<TD><SPAN ID=\"in_2\">17m</SPAN></TD>"));
182 Assert.assertTrue(actual.contains("<TR CLASS=\"ghost\">"));
183 Assert.assertTrue(actual.contains("<TD>4</TD>"));
184 Assert.assertTrue(actual.contains("<TD>" + HURDMAN + "</TD>"));
185 Assert.assertTrue(actual.contains("<TD><SPAN ID=\"in_3\">37m</SPAN></TD>"));
186 Assert.assertTrue(actual.contains("<TD>GPS off</TD>"));