001 package ps2.test;
002
003 import ps2.*;
004
005 import org.junit.*;
006 import static org.junit.Assert.assertEquals;
007
008 import java.io.IOException;
009
010
011 /**
012 * Unit tests for the WalkingRouteFormatter class.
013 **/
014 public class WalkingRouteFormatterTest {
015
016 private WalkingRouteFormatter mDirections;
017 private Route mShortRoute;
018
019 // Some constants for easy reference
020 private String mName = "Penny Lane";
021 private int oneUnit = 100000;
022
023 // JUnit calls @Before methods before each @Test is run
024 @Before
025 public void setupBeforeTests() {
026 mDirections = new WalkingRouteFormatter();
027 mShortRoute = new Route(new GeoSegment(mName,
028 new GeoPoint(0,0),
029 new GeoPoint(0,100000)));
030 }
031
032
033 /**
034 * Test simple directions with one distance and one origHeading.
035 **/
036 @Test
037 public void testShortDirections() throws IOException {
038 assertEquals(new Double(90.0),
039 new Double(mShortRoute.getStartHeading()));
040
041 assertEquals("Turn left onto Penny Lane and walk for 93 minutes.\n",
042 mDirections.computeDirections(mShortRoute, 180));
043 assertEquals("Turn right onto Penny Lane and walk for 93 minutes.\n",
044 mDirections.computeDirections(mShortRoute, 0));
045
046 assertEquals("Turn slight left onto Penny Lane and walk for 93 minutes.\n",
047 mDirections.computeDirections(mShortRoute, 100));
048 assertEquals("Turn slight right onto Penny Lane and walk for 93 minutes.\n",
049 mDirections.computeDirections(mShortRoute, 80));
050
051 assertEquals("Continue onto Penny Lane and walk for 93 minutes.\n",
052 mDirections.computeDirections(mShortRoute, 99));
053 assertEquals("Continue onto Penny Lane and walk for 93 minutes.\n",
054 mDirections.computeDirections(mShortRoute, 81));
055
056 assertEquals("Turn left onto Penny Lane and walk for 93 minutes.\n",
057 mDirections.computeDirections(mShortRoute, 181));
058 assertEquals("Turn right onto Penny Lane and walk for 93 minutes.\n",
059 mDirections.computeDirections(mShortRoute, 359));
060
061 assertEquals("Turn sharp right onto Penny Lane and walk for 93 minutes.\n",
062 mDirections.computeDirections(mShortRoute, 300));
063 assertEquals("Turn sharp left onto Penny Lane and walk for 93 minutes.\n",
064 mDirections.computeDirections(mShortRoute, 231));
065
066 assertEquals("U-turn onto Penny Lane and walk for 93 minutes.\n",
067 mDirections.computeDirections(mShortRoute, 269));
068 assertEquals("U-turn onto Penny Lane and walk for 93 minutes.\n",
069 mDirections.computeDirections(mShortRoute, 271));
070 }
071
072
073 /**
074 * Test turning directions, with different origHeadings.
075 **/
076 @Test
077 public void testTurning() {
078
079 // Left turn
080 mShortRoute = new Route(new GeoSegment(mName,
081 new GeoPoint(0,0),
082 new GeoPoint(oneUnit,0)));
083 assertEquals("Turn left onto Penny Lane and walk for 138 minutes.\n",
084 mDirections.computeDirections(mShortRoute, 90));
085
086 // Right turn
087 mShortRoute = new Route(new GeoSegment(mName,
088 new GeoPoint(0,0),
089 new GeoPoint(-oneUnit,0)));
090 assertEquals("Turn right onto Penny Lane and walk for 138 minutes.\n",
091 mDirections.computeDirections(mShortRoute, 90));
092
093 // U-turn
094 mShortRoute = new Route(new GeoSegment(mName,
095 new GeoPoint(0,0),
096 new GeoPoint(0,-oneUnit)));
097 assertEquals("U-turn onto Penny Lane and walk for 93 minutes.\n",
098 mDirections.computeDirections(mShortRoute, 90));
099
100 // Continue
101 mShortRoute = new Route(new GeoSegment(mName,
102 new GeoPoint(0,0),
103 new GeoPoint(0,oneUnit)));
104 assertEquals("Continue onto Penny Lane and walk for 93 minutes.\n",
105 mDirections.computeDirections(mShortRoute, 90));
106
107 // Slight left (13.74 degrees)
108 mShortRoute = new Route(new GeoSegment(mName,
109 new GeoPoint(0,0),
110 new GeoPoint(-27988,10134)));
111 assertEquals("Turn slight left onto Penny Lane and walk for 40 minutes.\n",
112 mDirections.computeDirections(mShortRoute, 180));
113
114 // Slight right (13.74 degrees)
115 mShortRoute = new Route(new GeoSegment(mName,
116 new GeoPoint(0,0),
117 new GeoPoint(-27988,-10134)));
118 assertEquals("Turn slight right onto Penny Lane and walk for 40 minutes.\n",
119 mDirections.computeDirections(mShortRoute, 180));
120
121 // Sharp left (166.26 degrees)
122 mShortRoute = new Route(new GeoSegment(mName,
123 new GeoPoint(0,0),
124 new GeoPoint(27988,10134)));
125 assertEquals("Turn sharp left onto Penny Lane and walk for 40 minutes.\n",
126 mDirections.computeDirections(mShortRoute, 180));
127
128 // Sharp right (166.26 degrees)
129 mShortRoute = new Route(new GeoSegment(mName,
130 new GeoPoint(0,0),
131 new GeoPoint(27988,-10134)));
132 assertEquals("Turn sharp right onto Penny Lane and walk for 40 minutes.\n",
133 mDirections.computeDirections(mShortRoute, 180));
134
135 // U-turn (on the left side, 179.5 degree)
136 mShortRoute = new Route(new GeoSegment(mName,
137 new GeoPoint(0,0),
138 new GeoPoint(-724368,8542)));
139 assertEquals("U-turn onto Penny Lane and walk for 1000 minutes.\n",
140 mDirections.computeDirections(mShortRoute, 0));
141
142 // U-turn (on the right side, 179.5 degree)
143 mShortRoute = new Route(new GeoSegment(mName,
144 new GeoPoint(0,0),
145 new GeoPoint(-724368,-8542)));
146 assertEquals("U-turn onto Penny Lane and walk for 1000 minutes.\n",
147 mDirections.computeDirections(mShortRoute, 0));
148 }
149
150
151 /**
152 * Test rounding distance, specifically if it rounds up to 0.1 and
153 * rounds down to 0.0. Should compute time before rounding.
154 **/
155 @Test
156 public void testDistance() {
157 // 0.08 miles
158 mShortRoute = new Route(new GeoSegment(mName,
159 new GeoPoint(0,0),
160 new GeoPoint(0,1718)));
161 assertEquals("Continue onto Penny Lane and walk for 2 minutes.\n",
162 mDirections.computeDirections(mShortRoute, 90));
163
164 // 0.02 miles
165 mShortRoute = new Route(new GeoSegment(mName,
166 new GeoPoint(0,0),
167 new GeoPoint(0,392)));
168 assertEquals("Continue onto Penny Lane and walk for 0 minutes.\n",
169 mDirections.computeDirections(mShortRoute, 90));
170 }
171
172
173 /**
174 * Two step route with one geo feature.
175 **/
176 @Test
177 public void testRepeatedSegment() {
178 Route route = new Route(new GeoSegment(mName,
179 new GeoPoint(0,0),
180 new GeoPoint(0,oneUnit)));
181 route = route.addSegment(new GeoSegment(mName,
182 new GeoPoint(0,oneUnit),
183 new GeoPoint(0,oneUnit*2)));
184
185 assertEquals("Turn left onto Penny Lane and walk for 186 minutes.\n",
186 mDirections.computeDirections(route, 180));
187 }
188
189
190 /**
191 * Long route with no repeats.
192 **/
193 @Test
194 public void testLongRoute() {
195 Route route = new Route(new GeoSegment("Penny Lane",
196 new GeoPoint(0,0),
197 new GeoPoint(0,oneUnit*2)));
198 route = route.addSegment(new GeoSegment("Abby Road",
199 new GeoPoint(0,oneUnit*2),
200 new GeoPoint(oneUnit*2,oneUnit*2)));
201 route = route.addSegment(new GeoSegment("Strawberry Fields",
202 new GeoPoint(oneUnit*2,oneUnit*2),
203 new GeoPoint(oneUnit*4,oneUnit*2)));
204 route = route.addSegment(new GeoSegment("Octopus's Garden",
205 new GeoPoint(oneUnit*4,oneUnit*2),
206 new GeoPoint(oneUnit*4,oneUnit*4)));
207
208 route = route.addSegment(new GeoSegment("Norwegian Wood",
209 new GeoPoint(oneUnit*4,oneUnit*4),
210 new GeoPoint(oneUnit*10,oneUnit*10)));
211
212 route = route.addSegment(new GeoSegment("Yellow Submarine",
213 new GeoPoint(oneUnit*10,oneUnit*10),
214 new GeoPoint(0,0)));
215 String directions =
216 "Turn left onto Penny Lane and walk for 186 minutes." + "\n" +
217 "Turn left onto Abby Road and walk for 276 minutes." + "\n" +
218 "Continue onto Strawberry Fields and walk for 276 minutes." + "\n" +
219 "Turn right onto Octopus's Garden and walk for 186 minutes." + "\n" +
220 "Turn slight left onto Norwegian Wood and walk for 999 minutes." + "\n" +
221 "U-turn onto Yellow Submarine and walk for 1666 minutes." + "\n"
222 ;
223 assertEquals(directions,
224 mDirections.computeDirections(route, 180));
225 }
226
227
228 /**
229 * Just like long route, but different makeup of geosegements.
230 **/
231 @Test
232 public void testRepeatedRoute() {
233 Route route = new Route(new GeoSegment("Penny Lane",
234 new GeoPoint(0,0),
235 new GeoPoint(0,oneUnit*2)));
236 route = route.addSegment(new GeoSegment("Abby Road",
237 new GeoPoint(0,oneUnit*2),
238 new GeoPoint(oneUnit,oneUnit*2)));
239 route = route.addSegment(new GeoSegment("Abby Road",
240 new GeoPoint(oneUnit,oneUnit*2),
241 new GeoPoint(oneUnit*2,oneUnit*2)));
242 route = route.addSegment(new GeoSegment("Strawberry Fields",
243 new GeoPoint(oneUnit*2,oneUnit*2),
244 new GeoPoint(oneUnit*3,oneUnit*2)));
245 route = route.addSegment(new GeoSegment("Strawberry Fields",
246 new GeoPoint(oneUnit*3,oneUnit*2),
247 new GeoPoint(oneUnit*4,oneUnit*2)));
248 route = route.addSegment(new GeoSegment("Octopus's Garden",
249 new GeoPoint(oneUnit*4,oneUnit*2),
250 new GeoPoint(oneUnit*3,oneUnit*3)));
251 route = route.addSegment(new GeoSegment("Octopus's Garden",
252 new GeoPoint(oneUnit*3,oneUnit*3),
253 new GeoPoint(oneUnit*4,oneUnit*3)));
254 route = route.addSegment(new GeoSegment("Octopus's Garden",
255 new GeoPoint(oneUnit*4,oneUnit*3),
256 new GeoPoint(oneUnit*4,oneUnit*4)));
257 route = route.addSegment(new GeoSegment("Norwegian Wood",
258 new GeoPoint(oneUnit*4,oneUnit*4),
259 new GeoPoint(oneUnit*10,oneUnit*10)));
260 route = route.addSegment(new GeoSegment("Yellow Submarine",
261 new GeoPoint(oneUnit*10,oneUnit*10),
262 new GeoPoint(0,0)));
263
264 String directions =
265 "Turn left onto Penny Lane and walk for 186 minutes." + "\n" +
266 "Turn left onto Abby Road and walk for 276 minutes." + "\n" +
267 "Continue onto Strawberry Fields and walk for 276 minutes." + "\n" +
268 "Turn sharp right onto Octopus's Garden and walk for 398 minutes." + "\n" +
269 "Turn slight left onto Norwegian Wood and walk for 999 minutes." + "\n" +
270 "U-turn onto Yellow Submarine and walk for 1666 minutes." + "\n"
271 ;
272
273 assertEquals(directions,
274 mDirections.computeDirections(route, 180));
275
276 }
277 }