import java.io.File;
import java.util.Scanner;

/**
 * The Test class is the main class used to test and grade the CPS420 Lab 6.
 * <br> DO NOT MODIFY THIS CLASS.
 * @author Sophie Quigley
 */
public class Test {

    /** 
    * Input stream.
    */
    private static Scanner input = null;
    
    /** 
    * Path of directory containing test files.
    */
    public static final String testDirPath = "/misc/cps420/public_html/doc/W25/Lab6/Tests/";

    /** 
    * Graph being tested
    */   
    private static Graph graph = null;
          
    /** 
    * Score calculated
    */   
    private static int score = 0;

    
    /**
    * Main test program calculates score for program.
    * <br>It first tests the isConnected method on graphs in test files.
    * <br>Then it tests it on randomly generated undirected simple graphs.
    * @param args the command line arguments
    */

    public static void main(String[] args) {

      // Run test files
			testFile("tree0","",1,true,1);
			testFile("tree1","0",1,true,1);
			testFile("tree4","0 1 2 3",1,true,1);
			testFile("disconnected2","0",1,false,1);
			testFile("disconnected3","0 1",1,false,1);
			testFile("disconnected4","0 1",1,false,1);
			testFile("disconnected5","0 1 2",1,false,1);
			testFile("disconnected7","0 1 2 3 6 5",2,false,1);
			testFile("fullgraph2","0 1",1,true,1);
			testFile("fullgraph5","0 1 2 3 4",1,true,1);
			testFile("graph2-1","0",2,false,1);
			testFile("graph2-2","0 1",1,true,1);
			testFile("graph5-1","0",2,false,1);
			testFile("graph5-2","0 1 2 3 4",1,true,1);
			testFile("graph5-3","0 1",2,false,1);
			testFile("graph5-4","0 1 2 3 4",1,true,1);
			testFile("graph10","0 1 3 2 4 5 6 9 8 7",2,true,1);
			testFile("graph10-1","0 1 3 2 4 5 6 9 8 7",2,true,1);
			testFile("graph10-3","0 1 5 6 7",2,false,1);
			testFile("graph10-4","0 1 3 2 9 8 4 5 6 7",2,true,1);
			testFile("tree10-1","0 1 3 4 8 9 2 5 6 7",2,true,1);
			testFile("tree10-2","0 1 3 4 8 9 2 5 6 7",2,true,1);
			testFile("graph15","0 3 9 1 2 4 5 7 10 13 8 6 12 11 14",2,true,1);
			testFile("graph20","0 3 9 1 2 4 5 7 10 13 8 6 12 11 14 17 15 16 18 19",2,true,1);
      System.out.println("Final score:" + score);
    }

    /**
    * Reads graph described in a test file and test whether that graph is connected
    * @param filename name of test file. The directory containing that file is hard coded in testDirPath
    * @param expectedDFS string of the visit expected to be created by DFSvisit
    * @param DFSpoints points for correct answer to DFSvisit
    * @param expected true if graph is connected and false otherwise
    * @param connectedpoints points for correct answer to isConnected
    */
    public static void testFile(String filename, String expectedDFS, int DFSpoints, boolean expected, int connectedpoints) {
        String filepath = testDirPath + filename;
        boolean connected;
        Walk visit;
        int points;

        System.out.print("=====  Test " + filename + " -");
        try {
            input = new Scanner(new File(filepath));
        } catch (Exception ex) {
            System.out.println(ex);
            System.exit(0);
        }        
        try {
            graph = new Graph(input);
        } catch (InstantiationException ex) {
            System.out.println(ex);
            System.exit(0);
        } catch (Exception ex) {
            System.out.println(ex);
            System.exit(0);
        }
        // Test DFSvisit on graph starting at vertex 0.
        visit = new Walk(graph.getTotalVertices());
        graph.DFSvisit(0,visit);
        graph.resetVisitation();
        if (visit.toString().compareTo(expectedDFS) == 0)  points = DFSpoints;
        else points = 0;
        System.out.print(" DFSvisit:"+points + "/" + DFSpoints);
        score += points;     
        // System.out.println(". Score so far=" + score);
        // System.out.println(visit.toString());
        
        // Test isConnected on graph
        connected = graph.isConnected();
        if (connected == expected)  points = connectedpoints;
        else   points = 0;
        System.out.print(" isConnected:"+points + "/" + connectedpoints);
        score += points;     
        System.out.println(". Score so far=" + score);

    }

}