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