package tmcsim.highwaymodel;

import tmcsim.highwaymodel.Station;
import tmcsim.highwaymodel.Highways;
import tmcsim.highwaymodel.Highway;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import junit.framework.TestCase;

/**
 *
 * @author jdalbey
 */
public class LoadHighwaysTest extends TestCase {
    // Setup a path for temp files
    static String tmpPath = "/tmp/";// default path is for linux
    static
    {
        String myOs = System.getProperty("os.name").toLowerCase();
        if (myOs.indexOf("win") >= 0) 
        {
          tmpPath = "C:/TEMP/";  // alt path for Windows
        }
    }

    public LoadHighwaysTest(String testName) {
        super(testName);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        PrintWriter writer = null;
        try {
            writer = new PrintWriter(new FileWriter(tmpPath + "postmiles1.txt"));
            writer.println("5 S 0.9,33.408425,-117.599923,CALAFIA,0,0");
            writer.println("5 N 1.24,33.413051,-117.601964,MAGDALENA,0,0");
            writer.println("5 S 1.49,33.416348,-117.603827,EL CAMINO REAL,0,0");
            writer.close();
            writer = new PrintWriter(new FileWriter(tmpPath + "postmiles3.txt"));
            writer.println("73 N 23.9,33.643656,-117.859875,BISON 2,0.976131,0.217185");
            writer.println("55 S 6.88,33.697495,-117.862677,MACARTHU1,-0.710326,0.703873");
            writer.println("5 N 5.73,33.458342,-117.655008,ESTRELLA1,0,0");
            writer.println("5 N 6.47,33.464404,-117.665509,SACRAMENTO,0.523797,0.851843");
            writer.println("405 N 6.21,33.672851,-117.832271,HARVARD,0.320278,0.947323");
            writer.println("405 S 6.8,33.675863,-117.84179,JAMBOREE1,-0.402558,-0.915394");
            writer.close();            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
        Path path = FileSystems.getDefault().getPath(tmpPath, "postmiles1.txt");
        Files.delete(path);
        path = FileSystems.getDefault().getPath(tmpPath, "postmiles3.txt");
        Files.delete(path);
    }

    /**
     * Test of Highways constructor 
     */
    public void testLoadHighways() {
        System.out.println("testLoadHighways");
        Highways highways = new Highways(
                tmpPath + "postmiles1.txt");

        // Test for correct number of highways
        List<Highway> result = (ArrayList) highways.highways;
        assertEquals(1, result.size());
        
        // Test 5 was loaded
        Highway fiveS = result.get(0);
        assertEquals(new Integer(5), fiveS.routeNumber);
        
        // Test for correct number of stations
        assertEquals(new Integer(3), new Integer(fiveS.stations.size()));
        
        // Test hwy5 stations are sorted by postmile
        List<Station> stations = (ArrayList) fiveS.stations;
        ArrayList<Double> stationsPostmiles = new ArrayList<>();
        for(Station station : stations)
        {
            stationsPostmiles.add(station.postmile);
        }
        
        // Create expected station postmile list (sorted)
        ArrayList<Double> expectedStationsPostmiles = new ArrayList<>();
        expectedStationsPostmiles.add(new Double(0.9));
        expectedStationsPostmiles.add(new Double(1.24));
        expectedStationsPostmiles.add(new Double(1.49));

        for(int i = 0; i < 3; i++)
        {
            assertEquals(expectedStationsPostmiles.get(i), 
                    stationsPostmiles.get(i));
        }
    }
    public void testLoadHighways2() {
        System.out.println("testLoadHighways2");
        Highways highways = new Highways(
                tmpPath + "postmiles3.txt");

        // Test for correct number of highways
        List<Highway> result = (ArrayList) highways.highways;
        assertEquals(4, result.size());
        
        Highway five = result.get(0);
        assertEquals(new Integer(5), five.routeNumber);
        assertEquals(new Integer(405), result.get(1).routeNumber);
        assertEquals(new Integer(55), result.get(2).routeNumber);
        assertEquals(new Integer(73), result.get(3).routeNumber);
    }
}
