001 package ps2.test;
002
003 import ps2.*;
004
005 import org.junit.Test;
006 import org.junit.Before;
007 import static org.junit.Assert.assertTrue;
008 import static org.junit.Assert.assertFalse;
009 import static org.junit.Assert.assertEquals;
010
011 import java.io.IOException;
012
013
014 /**
015 * Unit tests for the DrivingRouteFormatter class.
016 **/
017 public class DrivingRouteFormatterTest {
018
019 private DrivingRouteFormatter mDirections;
020 private Route mShortRoute;
021
022 // Some constants for easy reference
023 private String mName = "Penny Lane";
024 private int oneUnit = 100000;
025
026
027 // JUnit calls @Before before each @Test.
028 @Before
029 public void setupBeforeTests() {
030 mDirections = new DrivingRouteFormatter();
031 mShortRoute = new Route(new GeoSegment(mName,
032 new GeoPoint(0,0),
033 new GeoPoint(0,100000)));
034 }
035
036
037 /**
038 * Test simple directions with one distance and one origHeading.
039 **/
040 @Test
041 public void testShortDirections() throws IOException {
042 assertEquals(new Double(90.0),
043 new Double(mShortRoute.getStartHeading()));
044
045 assertEquals("Turn left onto Penny Lane and go 4.7 miles.\n",
046 mDirections.computeDirections(mShortRoute, 180));
047 assertEquals("Turn right onto Penny Lane and go 4.7 miles.\n",
048 mDirections.computeDirections(mShortRoute, 0));
049
050 assertEquals("Turn slight left onto Penny Lane and go 4.7 miles.\n",
051 mDirections.computeDirections(mShortRoute, 100));
052 assertEquals("Turn slight right onto Penny Lane and go 4.7 miles.\n",
053 mDirections.computeDirections(mShortRoute, 80));
054
055 assertEquals("Continue onto Penny Lane and go 4.7 miles.\n",
056 mDirections.computeDirections(mShortRoute, 99));
057 assertEquals("Continue onto Penny Lane and go 4.7 miles.\n",
058 mDirections.computeDirections(mShortRoute, 81));
059
060 assertEquals("Turn sharp right onto Penny Lane and go 4.7 miles.\n",
061 mDirections.computeDirections(mShortRoute, 330));
062 assertEquals("Turn sharp left onto Penny Lane and go 4.7 miles.\n",
063 mDirections.computeDirections(mShortRoute, 231));
064
065 assertEquals("U-turn onto Penny Lane and go 4.7 miles.\n",
066 mDirections.computeDirections(mShortRoute, 271));
067 assertEquals("U-turn onto Penny Lane and go 4.7 miles.\n",
068 mDirections.computeDirections(mShortRoute, 269));
069 }
070
071
072 /**
073 * Test turning directions with different origHeadings.
074 **/
075 @Test
076 public void testTurning() {
077
078 // Left turn
079 mShortRoute = new Route(new GeoSegment(mName,
080 new GeoPoint(0,0),
081 new GeoPoint(oneUnit,0)));
082 assertEquals("Turn left onto Penny Lane and go 6.9 miles.\n",
083 mDirections.computeDirections(mShortRoute, 90));
084
085 // Right turn
086 mShortRoute = new Route(new GeoSegment(mName,
087 new GeoPoint(0,0),
088 new GeoPoint(-oneUnit,0)));
089 assertEquals("Turn right onto Penny Lane and go 6.9 miles.\n",
090 mDirections.computeDirections(mShortRoute, 90));
091
092 // U-turn
093 mShortRoute = new Route(new GeoSegment(mName,
094 new GeoPoint(0,0),
095 new GeoPoint(0,-oneUnit)));
096 assertEquals("U-turn onto Penny Lane and go 4.7 miles.\n",
097 mDirections.computeDirections(mShortRoute, 90));
098
099 // Continue
100 mShortRoute = new Route(new GeoSegment(mName,
101 new GeoPoint(0,0),
102 new GeoPoint(0,oneUnit)));
103 assertEquals("Continue onto Penny Lane and go 4.7 miles.\n",
104 mDirections.computeDirections(mShortRoute, 90));
105
106 // Slight left (15 degrees)
107 mShortRoute = new Route(new GeoSegment(mName,
108 new GeoPoint(0,0),
109 new GeoPoint(-oneUnit,39510)));
110 assertEquals("Turn slight left onto Penny Lane and go 7.1 miles.\n",
111 mDirections.computeDirections(mShortRoute, 180));
112
113 // Slight right (15 degrees)
114 mShortRoute = new Route(new GeoSegment(mName,
115 new GeoPoint(0,0),
116 new GeoPoint(-oneUnit,-39510)));
117 assertEquals("Turn slight right onto Penny Lane and go 7.1 miles.\n",
118 mDirections.computeDirections(mShortRoute, 180));
119
120 // Sharp left (165 degrees)
121 mShortRoute = new Route(new GeoSegment(mName,
122 new GeoPoint(0,0),
123 new GeoPoint(oneUnit,39510)));
124 assertEquals("Turn sharp left onto Penny Lane and go 7.1 miles.\n",
125 mDirections.computeDirections(mShortRoute, 180));
126
127 // Sharp right (165 degrees)
128 mShortRoute = new Route(new GeoSegment(mName,
129 new GeoPoint(0,0),
130 new GeoPoint(oneUnit,-39510)));
131 assertEquals("Turn sharp right onto Penny Lane and go 7.1 miles.\n",
132 mDirections.computeDirections(mShortRoute, 180));
133
134 // U-turn (on the right side, 179.5 degree)
135 mShortRoute = new Route(new GeoSegment(mName,
136 new GeoPoint(0,0),
137 new GeoPoint(-oneUnit,1293)));
138 assertEquals("U-turn onto Penny Lane and go 6.9 miles.\n",
139 mDirections.computeDirections(mShortRoute, 0));
140
141 // U-turn (on the left side, 179.5 degree)
142 mShortRoute = new Route(new GeoSegment(mName,
143 new GeoPoint(0,0),
144 new GeoPoint(-oneUnit,-1293)));
145 assertEquals("U-turn onto Penny Lane and go 6.9 miles.\n",
146 mDirections.computeDirections(mShortRoute, 0));
147 }
148
149
150 /**
151 * Test rounding distance, especially if rounded up to 0.1 and
152 * rounded down to 0.0. Should compute time before rounding.
153 **/
154 @Test
155 public void testDistance() {
156
157 // 0.08 miles
158 mShortRoute = new Route(new GeoSegment(mName,
159 new GeoPoint(0,0),
160 new GeoPoint(0,1566)));
161 assertEquals("Continue onto Penny Lane and go 0.1 miles.\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 go 0.0 miles.\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 go 9.3 miles.\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
202 route = route.addSegment(new GeoSegment("Strawberry Fields",
203 new GeoPoint(oneUnit*2,oneUnit*2),
204 new GeoPoint(oneUnit*4,oneUnit*2)));
205
206 route = route.addSegment(new GeoSegment("Octopus's Garden",
207 new GeoPoint(oneUnit*4,oneUnit*2),
208 new GeoPoint(oneUnit*4,oneUnit*4)));
209
210 route = route.addSegment(new GeoSegment("Norwegian Wood",
211 new GeoPoint(oneUnit*4,oneUnit*4),
212 new GeoPoint(oneUnit*10,oneUnit*10)));
213
214 route = route.addSegment(new GeoSegment("Yellow Submarine",
215 new GeoPoint(oneUnit*10,oneUnit*10),
216 new GeoPoint(0,0)));
217
218 String directions =
219 "Turn left onto Penny Lane and go 9.3 miles." + "\n" +
220 "Turn left onto Abby Road and go 13.8 miles." + "\n" +
221 "Continue onto Strawberry Fields and go 13.8 miles." + "\n" +
222 "Turn right onto Octopus's Garden and go 9.3 miles." + "\n" +
223 "Turn slight left onto Norwegian Wood and go 50.0 miles." + "\n" +
224 "U-turn onto Yellow Submarine and go 83.3 miles." + "\n"
225 ;
226
227 assertEquals(directions,
228 mDirections.computeDirections(route, 180));
229 }
230
231
232 /**
233 * Just like long route, but different makeup of geosegements.
234 **/
235 @Test
236 public void testRepeatedRoute() {
237 Route route = new Route(new GeoSegment("Penny Lane",
238 new GeoPoint(0,0),
239 new GeoPoint(0,oneUnit*2)));
240
241 route = route.addSegment(new GeoSegment("Abby Road",
242 new GeoPoint(0,oneUnit*2),
243 new GeoPoint(oneUnit,oneUnit*2)));
244 route = route.addSegment(new GeoSegment("Abby Road",
245 new GeoPoint(oneUnit,oneUnit*2),
246 new GeoPoint(oneUnit*2,oneUnit*2)));
247 route = route.addSegment(new GeoSegment("Strawberry Fields",
248 new GeoPoint(oneUnit*2,oneUnit*2),
249 new GeoPoint(oneUnit*3,oneUnit*2)));
250 route = route.addSegment(new GeoSegment("Strawberry Fields",
251 new GeoPoint(oneUnit*3,oneUnit*2),
252 new GeoPoint(oneUnit*4,oneUnit*2)));
253 route = route.addSegment(new GeoSegment("Octopus's Garden",
254 new GeoPoint(oneUnit*4,oneUnit*2),
255 new GeoPoint(oneUnit*3,oneUnit*3)));
256 route = route.addSegment(new GeoSegment("Octopus's Garden",
257 new GeoPoint(oneUnit*3,oneUnit*3),
258 new GeoPoint(oneUnit*4,oneUnit*3)));
259 route = route.addSegment(new GeoSegment("Octopus's Garden",
260 new GeoPoint(oneUnit*4,oneUnit*3),
261 new GeoPoint(oneUnit*4,oneUnit*4)));
262 route = route.addSegment(new GeoSegment("Norwegian Wood",
263 new GeoPoint(oneUnit*4,oneUnit*4),
264 new GeoPoint(oneUnit*10,oneUnit*10)));
265 route = route.addSegment(new GeoSegment("Yellow Submarine",
266 new GeoPoint(oneUnit*10,oneUnit*10),
267 new GeoPoint(0,0)));
268
269 String directions =
270 "Turn left onto Penny Lane and go 9.3 miles." + "\n" +
271 "Turn left onto Abby Road and go 13.8 miles." + "\n" +
272 "Continue onto Strawberry Fields and go 13.8 miles." + "\n" +
273 "Turn sharp right onto Octopus's Garden and go 19.9 miles."+ "\n" +
274 "Turn slight left onto Norwegian Wood and go 50.0 miles." + "\n" +
275 "U-turn onto Yellow Submarine and go 83.3 miles." + "\n"
276 ;
277
278 assertEquals(directions,
279 mDirections.computeDirections(route, 180));
280 }
281 }