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 junit.framework.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 EXPECTED_STYLE = "<STYLE>\n" +
21 " body {background-color: #F0F0C0; font-size: 1.5em; }\n" +
22 " #trips {border-collapse: collapse; font-size: 1.5em; }\n" +
23 " #trips td, #trips th {border: 1px solid #600000; padding: 3px 3px 3px 3px; text-align: center;}\n" +
24 " #trips th {background-color: #800000; color: #FFFFFF; }\n" +
25 " #trips tr.ghost td {background-color: #C0C0C0;}\n" +
27 static final String TITLE_PREFIX = "<HTML>\n<HEAD>\n<TITLE>";
28 static final String TITLE_SUFFIX = "</TITLE>\n" + EXPECTED_STYLE + "</HEAD>\n";
31 ByteArrayOutputStream m_baos;
36 m_baos = new ByteArrayOutputStream();
37 m_pw = new PrintWriter(m_baos);
41 public void tearDown() throws IOException {
47 // Confirm that writeStyle's output does not vary with the locale
49 public void test_writeStyle() {
52 Locale[] locales = { Locale.CANADA, Locale.CANADA_FRENCH, Locale.JAPAN };
54 for (Locale locale : locales) {
57 Schedule schedule = new Schedule(locale);
58 schedule.writeStyle(m_pw);
61 actual = m_baos.toString();
62 Assert.assertEquals(EXPECTED_STYLE, actual);
67 public void test_writeHeader() {
68 Locale[] locales = { Locale.CANADA, Locale.CANADA_FRENCH, Locale.JAPAN };
69 String[] titles = { "", "CARLETON", "BILLINGS BRIDGE (3204)" };
71 for (Locale locale : locales) {
72 Schedule schedule = new Schedule(locale);
73 for (String title : titles) {
74 String expected = TITLE_PREFIX + title + TITLE_SUFFIX;
78 schedule.writeHeader(m_pw, title);
81 String actual = m_baos.toString();
82 Assert.assertEquals(expected, actual);
88 public void test_writePage_withNoRoutes() {
89 final String stopName = "RIDEAU RIDEAU";
90 final int stopNo = 3009;
92 RouteSummaryMock rsm = new RouteSummaryMock();
93 rsm.mock_setDescr(stopName);
94 rsm.mock_setStopNo(stopNo);
96 Schedule schedule = new Schedule(Locale.CANADA);
100 schedule.writePage(m_pw, rsm);
103 String actual = m_baos.toString();
105 Assert.assertTrue(actual.contains(EXPECTED_STYLE));
107 String expectedTitle = TITLE_PREFIX + "Frank: " + stopName + " (" + stopNo + ")" + TITLE_SUFFIX;
108 Assert.assertTrue(actual.contains(expectedTitle));
112 public void test_writePage_withMultipleRoutes() {
113 final String stopName = "RIDEAU RIDEAU";
114 final String SOUTH_KEYS = "South Keys";
115 final String HURDMAN = "Hurdman";
116 final int stopNo = 3009;
117 final Date queryDate = new Date(1418357155000L);
118 final double LAT1 = 45.379298;
119 final double LON1 = -75.652007;
120 final double LAT2 = 45.351322;
121 final double LON2 = -75.652007;
123 RouteSummaryMock rsm;
127 rsm = new RouteSummaryMock();
128 rsm.mock_setDescr(stopName);
129 rsm.mock_setStopNo(stopNo);
131 // First route: Number 1
132 route = new RouteMock();
133 route.mock_setRouteNo(1);
135 trip = new TripMock(queryDate);
136 trip.mock_setDest(SOUTH_KEYS);
137 trip.mock_setAdjTime(10);
138 trip.mock_setLatitude(LAT1);
139 trip.mock_setLongitude(LON1);
140 trip.mock_setSpeed(0.5);
141 route.mock_addTrip(trip);
143 trip = new TripMock(queryDate);
144 trip.mock_setDest(SOUTH_KEYS);
145 trip.mock_setAdjTime(20);
146 trip.mock_setLatitude(LAT2);
147 trip.mock_setLongitude(LON2);
148 trip.mock_setSpeed(22.4);
149 route.mock_addTrip(trip);
151 rsm.mock_addRoute(route);
153 // Second route: Number 4
154 route = new RouteMock();
155 route.mock_setRouteNo(4);
157 trip = new TripMock(queryDate);
158 trip.mock_setDest(HURDMAN);
159 trip.mock_setAdjTime(17);
160 route.mock_addTrip(trip);
162 trip = new TripMock(queryDate);
163 trip.mock_setDest(HURDMAN);
164 trip.mock_setAdjTime(37);
165 route.mock_addTrip(trip);
167 rsm.mock_addRoute(route);
170 Schedule schedule = new Schedule(Locale.CANADA);
174 schedule.writePage(m_pw, rsm);
177 String actual = m_baos.toString();
179 // Some rudimentary validation of the result.
180 // Should really go through more permutations, and examine them more closely, here.
181 Assert.assertTrue(actual.contains(EXPECTED_STYLE));
183 String expectedTitle = TITLE_PREFIX + "Frank: " + stopName + " (" + stopNo + ")" + TITLE_SUFFIX;
184 Assert.assertTrue(actual.contains(expectedTitle));
186 Assert.assertTrue(actual.contains("<TABLE ID=\"trips\">"));
187 Assert.assertTrue(actual.contains("<TR><TH COLSPAN=\"5\">" + stopName + " (" + stopNo + ")</TH></TR>"));
188 Assert.assertTrue(actual.contains("<TR><TH>Route</TH><TH>Destination</TH><TH>ETA</TH><TH>Remain</TH><TH>GPS Read</TH>"));
190 Assert.assertTrue(actual.contains("<TD>1</TD>"));
191 Assert.assertTrue(actual.contains("<TD>" + SOUTH_KEYS + "</TD>"));
192 Assert.assertTrue(actual.contains("<TD>11:15PM</TD>"));
193 Assert.assertTrue(actual.contains("<TD><SPAN ID=\"in_0\">10m</SPAN></TD>"));
194 Assert.assertTrue(actual.contains("<TD><A HREF=\"" + schedule.mapUrl(LAT1, LON1) + "\">11:05:55PM</A></TD>"));
196 Assert.assertTrue(actual.contains("<TD>1</TD>"));
197 Assert.assertTrue(actual.contains("<TD>" + SOUTH_KEYS + "</TD>"));
198 Assert.assertTrue(actual.contains("<TD>11:25PM"));
199 Assert.assertTrue(actual.contains("<TD><SPAN ID=\"in_1\">20m</SPAN></TD>"));
200 Assert.assertTrue(actual.contains("<TD><A HREF=\"" + schedule.mapUrl(LAT1, LON1) + "\">11:05:55PM</A></TD>"));
201 Assert.assertTrue(actual.contains("<TD>4</TD>"));
202 Assert.assertTrue(actual.contains("<TD>" + HURDMAN + "</TD>"));
203 Assert.assertTrue(actual.contains("<TD><SPAN ID=\"in_2\">17m</SPAN></TD>"));
205 Assert.assertTrue(actual.contains("<TD>4</TD>"));
206 Assert.assertTrue(actual.contains("<TD>" + HURDMAN + "</TD>"));
207 Assert.assertTrue(actual.contains("<TD><SPAN ID=\"in_3\">37m</SPAN></TD>"));