001    package ps4.test;
002    
003    import java.io.BufferedReader;
004    import java.io.File;
005    import java.io.FileNotFoundException;
006    import java.io.FileReader;
007    import java.io.FileWriter;
008    import java.io.IOException;
009    import java.io.Reader;
010    import java.io.Writer;
011    import java.net.URISyntaxException;
012    
013    import junit.framework.Test;
014    import junit.framework.TestCase;
015    import junit.framework.TestSuite;
016    
017    /**
018     * This class, along with a complete PS4TestDriver implementation,
019     * can be used to test the your implementations of Graph and the
020     * path finding algorithm using the script file format described
021     * in the problem set.  It is assumed that the files are
022     * located in the same directory as this class.
023    */
024    public class ScriptFileTests extends TestCase {
025        private final File testDriver;
026            
027        /**
028         * Creates a new ScriptFileTests case, which runs the given test file.
029         * @param testDriver
030         */
031        public ScriptFileTests(File testDriver) {
032            super("testWithScriptFile");
033            
034            this.testDriver = testDriver;
035        }
036    
037        /**
038         * Reads in the contents of a file; changes the line
039         * separator to System.getProperty("line.separator")
040         * @throws FileNotFoundException, IOException
041         * @requires that the specified File exists && File ends with a newline
042         * @returns the contents of that file
043         */
044        private String fileContents(File f) throws IOException {
045            if (f == null) {
046                throw new IllegalArgumentException("No file specified");
047            }
048            
049            BufferedReader br = new BufferedReader(new FileReader(f));
050            
051            StringBuilder result = new StringBuilder();
052            String line = null;
053            
054            //read line reads up to *any* newline character
055            while( (line = br.readLine()) != null){
056                    result.append(line);
057                    result.append(System.getProperty("line.separator"));
058            }
059                   
060            br.close();
061            return result.toString();
062        }
063    
064        /**
065         * @throws IOException 
066         * @requires there exists a test file indicated by testDriver
067         *
068         * @effects runs the test in filename, and output its results to a file in
069         * the same directory with name filename+".actual"; if that file already
070         * exists, it will be overwritten.     
071         * @returns the contents of the output file
072         */
073        private String runScriptFile() throws IOException {
074            if (testDriver == null) {
075                throw new RuntimeException("No file specified");
076            }
077            
078            File actual = fileWithSuffix("actual");
079            
080            Reader r = new FileReader(testDriver);
081            Writer w = new FileWriter(actual);
082            
083            PS4TestDriver td = new PS4TestDriver(r, w);
084            td.runTests();
085            
086            return fileContents(actual);
087        }
088        
089        /**
090         * @param newSuffix
091         * @return a File with the same name as testDriver, except that the test
092         *         suffix is replaced by the given suffix
093         */
094        private File fileWithSuffix(String newSuffix) {
095            File parent = testDriver.getParentFile();
096            String driverName = testDriver.getName();
097            String baseName = driverName.substring(0, driverName.length() - "test".length());
098            
099            return new File(parent, baseName + newSuffix);
100        }
101        
102        /**
103         * The only test that is run: run a script file and test its output.
104         * @throws IOException
105         */
106        public void testWithScriptFile() throws IOException {
107            File expected = fileWithSuffix("expected");
108            
109            assertEquals(testDriver.getName(), fileContents(expected), runScriptFile());
110        }
111        
112        /**
113         * Build a test suite of all of the script files in the directory.
114         * @return the test suite
115         * @throws URISyntaxException
116         */
117        public static Test suite()
118        { 
119            TestSuite suite = new TestSuite(); 
120            
121            // Hack to get at the directory where the files are: they are in the
122            // same directory as the compiled ScriptFileTests class,
123            try {
124                File myDirectory = new File(ScriptFileTests.class.getResource("ScriptFileTests.class").toURI()).getParentFile();
125                for (File f : myDirectory.listFiles()) {
126                    if (f.getName().endsWith(".test")) {
127                        suite.addTest(new ScriptFileTests(f));
128                    }
129                }
130                return suite;
131            } catch (URISyntaxException e) {
132                throw new RuntimeException(e);
133            }
134        }
135    }