001    package ps6.test;
002    
003    import java.io.ByteArrayInputStream;
004    import ps6.*;
005    import junit.framework.*;
006    
007    /**
008     * Public (Specification) TextUI Test Suite
009     * @author tws
010     */
011    public class PublicTextUITest extends TestSuite{
012    
013        public static final String INPUT_PROMPTS =
014            "starting number? starting street? starting zipcode? " +
015            "destination number? destination street? destination zipcode? walking or driving [w/d]? ";
016    
017        public static final String END_PROMPT = "starting number? ";
018    
019        public PublicTextUITest() {
020            this("Problem Set 6 TextUI Tests");
021        }
022    
023        public static String EOL = System.getProperty("line.separator");
024    
025        public PublicTextUITest(String name) {
026            super(name);
027            addTests();
028        }
029    
030        /**
031         * Constructs and adds the tests for the textui.
032         */
033        private void addTests() {
034            // You could test groups of queries separately
035            // e.g. loop over ValidateQueries.badQueries
036    
037            for (TestRecord record : ValidateQueries.allQueries) {
038                addTest(makeUiTest(record));
039            }
040        }
041    
042        public PS6TextUiTestCase makeUiTest(TestRecord record) {
043            return new PS6TextUiTestCase(record.getTestName(),
044                    new String[] {record.getDb().dbPath()},
045                    TextUI.class,
046                    new ByteArrayInputStream((genTextUiStdIn(record) + "-1" + EOL).getBytes()),
047                    INPUT_PROMPTS + genTextUiStdOut(record));
048        }
049    
050        public static Test suite() {
051            return new PublicTextUITest();
052        }
053    
054        /**
055         * Generate the expected TextUI output for a test record
056         * @param record a PS6 test
057         * @return the expected TestUI output for a test
058         */
059        public static String genTextUiStdOut(TestRecord record) {
060            StringBuilder b = new StringBuilder();
061    
062            switch (record.getType()) {
063            case INVALID_DIR_TYPE:
064            case INVALID_ADDRESS:
065            case NO_PATH:
066                b.append(record.getErrorMessage());
067                b.append(EOL);
068                break;
069            case WALKING:
070            case DRIVING:
071                b.append("Start at "
072                        + record.getStart().getNum() + " "
073                        + record.getStart().getName()
074                        + " " + record.getStart().getZipcode());
075    
076                b.append(EOL);
077                for (String line : record.getDirections()) {
078                    b.append(line);
079                    b.append(EOL);
080                }
081                b.append(record.getTripLength());
082                b.append(EOL);
083                b.append(END_PROMPT);
084                break;
085            }
086    
087            return b.toString();
088        }
089    
090        /**
091         * Generate the TextUI input for a test record
092         * @param record a PS6 test
093         * @return the TextUI input for the test
094         */
095        public static String genTextUiStdIn(TestRecord record) {
096            StringBuilder b = new StringBuilder();
097            b.append(record.getStart().getNum());
098            b.append(EOL);
099            b.append(record.getStart().getName());
100            b.append(EOL);
101            b.append(record.getStart().getZipcode());
102            b.append(EOL);
103            b.append(record.getEnd().getNum());
104            b.append(EOL);
105            b.append(record.getEnd().getName());
106            b.append(EOL);
107            b.append(record.getEnd().getZipcode());
108            b.append(EOL);
109            b.append(record.getDirectionType());
110            b.append(EOL);
111            return b.toString();
112        }
113    }