Add viewport to pages, to score better on "Mobile Friendly".
[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 org.junit.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 TITLE_PREFIX = "<HTML>\n<HEAD>\n"
21                         + "  <META NAME=\"viewport\" content=\"width=device-width\"/>\n"
22                         + "  <TITLE>";
23         static final String TITLE_SUFFIX = "</TITLE>\n" + Style.CSS + "\n</HEAD>\n";
24         
25         
26         ByteArrayOutputStream m_baos;
27         PrintWriter m_pw;
28         
29         @Before
30         public void setUp() {
31                 m_baos = new ByteArrayOutputStream();
32                 m_pw = new PrintWriter(m_baos);
33         }
34         
35         @After
36         public void tearDown() throws IOException {
37                 if (null != m_baos) {
38                         m_baos.close();
39                 }
40         }
41         
42         @Test
43         public void test_writeHeader() {
44                 Locale[] locales = { Locale.CANADA, Locale.CANADA_FRENCH, Locale.JAPAN };
45                 String[] titles = { "", "CARLETON", "BILLINGS BRIDGE (3204)" };
46                 
47                 for (Locale locale : locales) {
48                         Schedule schedule = new Schedule(locale);
49                         for (String title : titles) {
50                                 String expected = TITLE_PREFIX + title + TITLE_SUFFIX;
51                                 
52                                 m_baos.reset();
53                                 
54                                 schedule.writeHeader(m_pw, title);
55                                 m_pw.flush();
56                                 
57                                 String actual = m_baos.toString();
58                                 Assert.assertEquals(expected, actual);
59                         }
60                 }
61         }
62
63         @Test
64         public void test_writePage_withNoRoutes() {
65                 final String stopName = "RIDEAU RIDEAU";
66                 final int stopNo = 3009;
67                 
68                 RouteSummaryMock rsm = new RouteSummaryMock();
69                 rsm.mock_setDescr(stopName);
70                 rsm.mock_setStopNo(stopNo);
71                 
72                 Schedule schedule = new Schedule(Locale.CANADA);
73                 
74                 m_baos.reset();
75                 
76                 schedule.writePage(m_pw, rsm);
77                 m_pw.flush();
78                 
79                 String actual = m_baos.toString();
80                 
81                 Assert.assertTrue(actual.contains(Style.CSS));
82                 
83                 String expectedTitle = TITLE_PREFIX + "Frank: " + stopName + " (" + stopNo + ")" + TITLE_SUFFIX;
84                 Assert.assertTrue(actual.contains(expectedTitle));
85         }
86         
87         @Test
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;
98                 
99                 RouteSummaryMock rsm;
100                 RouteMock route;
101                 TripMock trip;
102                 
103                 rsm = new RouteSummaryMock();
104                 rsm.mock_setDescr(stopName);
105                 rsm.mock_setStopNo(stopNo);
106                 
107                 // First route:  Number 1
108                 route = new RouteMock();
109                 route.mock_setRouteNo(1);
110                 
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);
118                 
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);
126
127                 rsm.mock_addRoute(route);
128                 
129                 // Second route:  Number 4
130                 route = new RouteMock();
131                 route.mock_setRouteNo(4);
132                 
133                 trip = new TripMock(queryDate);
134                 trip.mock_setDest(HURDMAN);
135                 trip.mock_setAdjTime(17);
136                 route.mock_addTrip(trip);
137                 
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);
143                 
144                 rsm.mock_addRoute(route);
145                 
146                 // Generate the HTML 
147                 Schedule schedule = new Schedule(Locale.CANADA);
148                 
149                 m_baos.reset();
150                 
151                 schedule.writePage(m_pw, rsm);
152                 m_pw.flush();
153                 
154                 String actual = m_baos.toString();
155                 
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));
159                 
160                 String expectedTitle = TITLE_PREFIX + "Frank: " + stopName + " (" + stopNo + ")" + TITLE_SUFFIX;
161                 Assert.assertTrue(actual.contains(expectedTitle));
162                 
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>"));
166     
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>"));
172                 
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>"));
181                 
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>"));
187         }
188 }