2fc9ac2a5f84f09bf189840648f0b3fb7df50ede
[frank.git] / test / net / jaekl / frank / ScheduleTest.java
1 package net.jaekl.frank;
2
3 import java.io.ByteArrayOutputStream;
4 import java.io.IOException;
5 import java.io.PrintWriter;
6 import java.util.Date;
7 import java.util.Locale;
8
9 import junit.framework.Assert;
10
11 import net.jaekl.frank.octranspo.RouteMock;
12 import net.jaekl.frank.octranspo.RouteSummaryMock;
13 import net.jaekl.frank.octranspo.TripMock;
14
15 import org.junit.After;
16 import org.junit.Before;
17 import org.junit.Test;
18
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" + 
26                         "</STYLE>\n";
27         static final String TITLE_PREFIX = "<HTML>\n<HEAD>\n<TITLE>";
28         static final String TITLE_SUFFIX = "</TITLE>\n" + EXPECTED_STYLE + "</HEAD>\n";
29         
30         
31         ByteArrayOutputStream m_baos;
32         PrintWriter m_pw;
33         
34         @Before
35         public void setUp() {
36                 m_baos = new ByteArrayOutputStream();
37                 m_pw = new PrintWriter(m_baos);
38         }
39         
40         @After
41         public void tearDown() throws IOException {
42                 if (null != m_baos) {
43                         m_baos.close();
44                 }
45         }
46         
47         // Confirm that writeStyle's output does not vary with the locale
48         @Test
49         public void test_writeStyle() {
50                 String actual;
51
52                 Locale[] locales = { Locale.CANADA, Locale.CANADA_FRENCH, Locale.JAPAN };
53                 
54                 for (Locale locale : locales) {
55                         m_baos.reset();
56                         
57                         Schedule schedule = new Schedule(locale);
58                         schedule.writeStyle(m_pw);
59                         m_pw.flush();
60                         
61                         actual = m_baos.toString();
62                         Assert.assertEquals(EXPECTED_STYLE, actual);
63                 }
64         }
65         
66         @Test
67         public void test_writeHeader() {
68                 Locale[] locales = { Locale.CANADA, Locale.CANADA_FRENCH, Locale.JAPAN };
69                 String[] titles = { "", "CARLETON", "BILLINGS BRIDGE (3204)" };
70                 
71                 for (Locale locale : locales) {
72                         Schedule schedule = new Schedule(locale);
73                         for (String title : titles) {
74                                 String expected = TITLE_PREFIX + title + TITLE_SUFFIX;
75                                 
76                                 m_baos.reset();
77                                 
78                                 schedule.writeHeader(m_pw, title);
79                                 m_pw.flush();
80                                 
81                                 String actual = m_baos.toString();
82                                 Assert.assertEquals(expected, actual);
83                         }
84                 }
85         }
86
87         @Test
88         public void test_writePage_withNoRoutes() {
89                 final String stopName = "RIDEAU RIDEAU";
90                 final int stopNo = 3009;
91                 
92                 RouteSummaryMock rsm = new RouteSummaryMock();
93                 rsm.mock_setDescr(stopName);
94                 rsm.mock_setStopNo(stopNo);
95                 
96                 Schedule schedule = new Schedule(Locale.CANADA);
97                 
98                 m_baos.reset();
99                 
100                 schedule.writePage(m_pw, rsm);
101                 m_pw.flush();
102                 
103                 String actual = m_baos.toString();
104                 
105                 Assert.assertTrue(actual.contains(EXPECTED_STYLE));
106                 
107                 String expectedTitle = TITLE_PREFIX + "Frank: " + stopName + " (" + stopNo + ")" + TITLE_SUFFIX;
108                 Assert.assertTrue(actual.contains(expectedTitle));
109         }
110         
111         @Test
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;
122                 
123                 RouteSummaryMock rsm;
124                 RouteMock route;
125                 TripMock trip;
126                 
127                 rsm = new RouteSummaryMock();
128                 rsm.mock_setDescr(stopName);
129                 rsm.mock_setStopNo(stopNo);
130                 
131                 // First route:  Number 1
132                 route = new RouteMock();
133                 route.mock_setRouteNo(1);
134                 
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);
142                 
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);
150
151                 rsm.mock_addRoute(route);
152                 
153                 // Second route:  Number 4
154                 route = new RouteMock();
155                 route.mock_setRouteNo(4);
156                 
157                 trip = new TripMock(queryDate);
158                 trip.mock_setDest(HURDMAN);
159                 trip.mock_setAdjTime(17);
160                 route.mock_addTrip(trip);
161                 
162                 trip = new TripMock(queryDate);
163                 trip.mock_setDest(HURDMAN);
164                 trip.mock_setAdjTime(37);
165                 route.mock_addTrip(trip);
166                 
167                 rsm.mock_addRoute(route);
168                 
169                 // Generate the HTML 
170                 Schedule schedule = new Schedule(Locale.CANADA);
171                 
172                 m_baos.reset();
173                 
174                 schedule.writePage(m_pw, rsm);
175                 m_pw.flush();
176                 
177                 String actual = m_baos.toString();
178                 
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));
182                 
183                 String expectedTitle = TITLE_PREFIX + "Frank: " + stopName + " (" + stopNo + ")" + TITLE_SUFFIX;
184                 Assert.assertTrue(actual.contains(expectedTitle));
185                 
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>"));
189     
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>"));
195                 
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>"));
204                 
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>"));
208         }
209 }