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 DrivingRouteFormatter class.
012     **/
013    public class DrivingRouteFormatterTest extends TestCase {
014      
015        private DrivingRouteFormatter 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 DrivingRouteFormatter();
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 go 4.7 miles.\n", 
039                         mDirections.computeDirections(mShortRoute, 180));
040            assertEquals("Turn right onto Penny Lane and go 4.7 miles.\n", 
041                         mDirections.computeDirections(mShortRoute, 0));
042            
043            assertEquals("Turn slight left onto Penny Lane and go 4.7 miles.\n", 
044                         mDirections.computeDirections(mShortRoute, 100));
045            assertEquals("Turn slight right onto Penny Lane and go 4.7 miles.\n", 
046                         mDirections.computeDirections(mShortRoute, 80));
047    
048            assertEquals("Continue onto Penny Lane and go 4.7 miles.\n", 
049                         mDirections.computeDirections(mShortRoute, 99));
050            assertEquals("Continue onto Penny Lane and go 4.7 miles.\n", 
051                         mDirections.computeDirections(mShortRoute, 81));
052    
053            assertEquals("Turn sharp right onto Penny Lane and go 4.7 miles.\n", 
054                         mDirections.computeDirections(mShortRoute, 330));
055            assertEquals("Turn sharp left onto Penny Lane and go 4.7 miles.\n", 
056                         mDirections.computeDirections(mShortRoute, 231));
057    
058            assertEquals("U-turn onto Penny Lane and go 4.7 miles.\n", 
059                         mDirections.computeDirections(mShortRoute, 271));
060            assertEquals("U-turn onto Penny Lane and go 4.7 miles.\n", 
061                         mDirections.computeDirections(mShortRoute, 269));
062        }
063      
064    
065        /**
066         * Test turning directions with different origHeadings.
067         **/
068        public void testTurning() {
069        
070            // Left turn
071            mShortRoute = new Route(new GeoSegment(mName,
072                                                   new GeoPoint(0,0),
073                                                   new GeoPoint(oneUnit,0)));
074            assertEquals("Turn left onto Penny Lane and go 6.9 miles.\n",
075                         mDirections.computeDirections(mShortRoute, 90));
076    
077            // Right turn
078            mShortRoute = new Route(new GeoSegment(mName,
079                                                   new GeoPoint(0,0),
080                                                   new GeoPoint(-oneUnit,0)));
081            assertEquals("Turn right onto Penny Lane and go 6.9 miles.\n",
082                         mDirections.computeDirections(mShortRoute, 90));
083    
084            // U-turn
085            mShortRoute = new Route(new GeoSegment(mName,
086                                                   new GeoPoint(0,0),
087                                                   new GeoPoint(0,-oneUnit)));
088            assertEquals("U-turn onto Penny Lane and go 4.7 miles.\n",
089                         mDirections.computeDirections(mShortRoute, 90));
090        
091            // Continue
092            mShortRoute = new Route(new GeoSegment(mName,
093                                                   new GeoPoint(0,0),
094                                                   new GeoPoint(0,oneUnit)));
095            assertEquals("Continue onto Penny Lane and go 4.7 miles.\n",
096                         mDirections.computeDirections(mShortRoute, 90));
097        
098            // Slight left (15 degrees)
099            mShortRoute = new Route(new GeoSegment(mName,
100                                                   new GeoPoint(0,0),
101                                                   new GeoPoint(-oneUnit,39510)));
102            assertEquals("Turn slight left onto Penny Lane and go 7.1 miles.\n",
103                         mDirections.computeDirections(mShortRoute, 180));
104    
105            // Slight right (15 degrees)
106            mShortRoute = new Route(new GeoSegment(mName,
107                                                   new GeoPoint(0,0),
108                                                   new GeoPoint(-oneUnit,-39510)));
109            assertEquals("Turn slight right onto Penny Lane and go 7.1 miles.\n",
110                         mDirections.computeDirections(mShortRoute, 180));
111    
112            // Sharp left (165 degrees)
113            mShortRoute = new Route(new GeoSegment(mName,
114                                                   new GeoPoint(0,0),
115                                                   new GeoPoint(oneUnit,39510)));
116            assertEquals("Turn sharp left onto Penny Lane and go 7.1 miles.\n",
117                         mDirections.computeDirections(mShortRoute, 180));
118    
119            // Sharp right (165 degrees)
120            mShortRoute = new Route(new GeoSegment(mName,
121                                                   new GeoPoint(0,0),
122                                                   new GeoPoint(oneUnit,-39510)));
123            assertEquals("Turn sharp right onto Penny Lane and go 7.1 miles.\n",
124                         mDirections.computeDirections(mShortRoute, 180));
125    
126            // U-turn (on the right side, 179.5 degree)
127            mShortRoute = new Route(new GeoSegment(mName,
128                                                   new GeoPoint(0,0),
129                                                   new GeoPoint(-oneUnit,1293)));
130            assertEquals("U-turn onto Penny Lane and go 6.9 miles.\n",
131                         mDirections.computeDirections(mShortRoute, 0));
132    
133            // U-turn (on the left side, 179.5 degree)
134            mShortRoute = new Route(new GeoSegment(mName,
135                                                   new GeoPoint(0,0),
136                                                   new GeoPoint(-oneUnit,-1293)));
137            assertEquals("U-turn onto Penny Lane and go 6.9 miles.\n",
138                         mDirections.computeDirections(mShortRoute, 0));
139        }
140    
141    
142        /**  
143         * Test rounding distance, especially if rounded up to 0.1 and
144         * rounded down to 0.0.  Should compute time before rounding.
145         **/
146        public void testDistance() {
147        
148            // 0.08 miles
149            mShortRoute = new Route(new GeoSegment(mName,
150                                                   new GeoPoint(0,0),
151                                                   new GeoPoint(0,1566)));
152            assertEquals("Continue onto Penny Lane and go 0.1 miles.\n",
153                         mDirections.computeDirections(mShortRoute, 90));
154        
155            // 0.02 miles
156            mShortRoute = new Route(new GeoSegment(mName,
157                                                   new GeoPoint(0,0),
158                                                   new GeoPoint(0,392)));
159            assertEquals("Continue onto Penny Lane and go 0.0 miles.\n",
160                         mDirections.computeDirections(mShortRoute, 90));
161        }
162    
163    
164        /**
165         * Two step route with one geo feature.
166         **/
167        public void testRepeatedSegment() {
168            Route route = new Route(new GeoSegment(mName,
169                                                   new GeoPoint(0,0),
170                                                   new GeoPoint(0,oneUnit)));
171            route = route.addSegment(new GeoSegment(mName,
172                                                    new GeoPoint(0,oneUnit),
173                                                    new GeoPoint(0,oneUnit*2)));
174    
175            assertEquals("Turn left onto Penny Lane and go 9.3 miles.\n",
176                         mDirections.computeDirections(route, 180));
177        }
178    
179      
180        /**
181         * Long route with no repeats.
182         **/
183        public void testLongRoute() {
184            Route route = new Route(new GeoSegment("Penny Lane",
185                                           new GeoPoint(0,0),
186                                           new GeoPoint(0,oneUnit*2)));
187            route = route.addSegment(new GeoSegment("Abby Road",
188                                            new GeoPoint(0,oneUnit*2),
189                                            new GeoPoint(oneUnit*2,oneUnit*2)));
190                                                
191            route = route.addSegment(new GeoSegment("Strawberry Fields",
192                                            new GeoPoint(oneUnit*2,oneUnit*2),
193                                            new GeoPoint(oneUnit*4,oneUnit*2)));
194    
195            route = route.addSegment(new GeoSegment("Octopus's Garden",
196                                            new GeoPoint(oneUnit*4,oneUnit*2),
197                                            new GeoPoint(oneUnit*4,oneUnit*4)));
198    
199            route = route.addSegment(new GeoSegment("Norwegian Wood",
200                                            new GeoPoint(oneUnit*4,oneUnit*4),
201                                            new GeoPoint(oneUnit*10,oneUnit*10)));
202    
203            route = route.addSegment(new GeoSegment("Yellow Submarine",
204                                            new GeoPoint(oneUnit*10,oneUnit*10),
205                                            new GeoPoint(0,0)));
206    
207            String directions = 
208                "Turn left onto Penny Lane and go 9.3 miles." + "\n" + 
209                "Turn left onto Abby Road and go 13.8 miles." + "\n" + 
210                "Continue onto Strawberry Fields and go 13.8 miles." + "\n" + 
211                "Turn right onto Octopus's Garden and go 9.3 miles." + "\n" + 
212                "Turn slight left onto Norwegian Wood and go 50.0 miles." + "\n" + 
213                "U-turn onto Yellow Submarine and go 83.3 miles." + "\n"
214                ;
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    
229            route = route.addSegment(new GeoSegment("Abby Road",
230                                            new GeoPoint(0,oneUnit*2),
231                                            new GeoPoint(oneUnit,oneUnit*2)));
232            route = route.addSegment(new GeoSegment("Abby Road",
233                                            new GeoPoint(oneUnit,oneUnit*2),
234                                            new GeoPoint(oneUnit*2,oneUnit*2)));
235            route = route.addSegment(new GeoSegment("Strawberry Fields",
236                                            new GeoPoint(oneUnit*2,oneUnit*2),
237                                            new GeoPoint(oneUnit*3,oneUnit*2)));
238            route = route.addSegment(new GeoSegment("Strawberry Fields",
239                                            new GeoPoint(oneUnit*3,oneUnit*2),
240                                            new GeoPoint(oneUnit*4,oneUnit*2)));
241            route = route.addSegment(new GeoSegment("Octopus's Garden",
242                                            new GeoPoint(oneUnit*4,oneUnit*2),
243                                            new GeoPoint(oneUnit*3,oneUnit*3)));
244            route = route.addSegment(new GeoSegment("Octopus's Garden",
245                                            new GeoPoint(oneUnit*3,oneUnit*3),
246                                            new GeoPoint(oneUnit*4,oneUnit*3)));
247            route = route.addSegment(new GeoSegment("Octopus's Garden",
248                                            new GeoPoint(oneUnit*4,oneUnit*3),
249                                            new GeoPoint(oneUnit*4,oneUnit*4)));
250            route = route.addSegment(new GeoSegment("Norwegian Wood",
251                                            new GeoPoint(oneUnit*4,oneUnit*4),
252                                            new GeoPoint(oneUnit*10,oneUnit*10)));
253            route = route.addSegment(new GeoSegment("Yellow Submarine",
254                                            new GeoPoint(oneUnit*10,oneUnit*10),
255                                            new GeoPoint(0,0)));
256                                              
257            String directions =
258                "Turn left onto Penny Lane and go 9.3 miles." + "\n" + 
259                "Turn left onto Abby Road and go 13.8 miles." + "\n" + 
260                "Continue onto Strawberry Fields and go 13.8 miles." + "\n" + 
261                "Turn sharp right onto Octopus's Garden and go 19.9 miles."+ "\n" +
262                "Turn slight left onto Norwegian Wood and go 50.0 miles." + "\n" + 
263                "U-turn onto Yellow Submarine and go 83.3 miles." + "\n"
264                ;
265    
266            assertEquals(directions,
267                         mDirections.computeDirections(route, 180));
268        }
269    }