package atmsdriver.model;

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 {

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

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        PrintWriter writer = null;
        try {
            writer = new PrintWriter(new FileWriter("test/atmsdriver/model/lds_loadhighways_sample.txt"));
            
            writer.println("2");
            writer.println("32 0 2");
            writer.println("1210831 1 5 S 0.9 8 CALAFIA");
            writer.println("1210832 ML_1");
            writer.println("1210833 ML_2");
            writer.println("1210834 ML_3");
            writer.println("1210835 ML_4");
            writer.println("1210836 PASSAGE");
            writer.println("1210837 DEMAND");
            writer.println("1210838 QUEUE");
            writer.println("1210839 RAMP_OFF");
            writer.println("1210845 2 5 S 1.49 9 EL CAMINO REAL");
            writer.println("1210846 ML_1");
            writer.println("1210847 ML_2");
            writer.println("1210848 ML_3");
            writer.println("1210849 ML_4");
            writer.println("1210850 RAMP_ON");
            writer.println("1210851 PASSAGE");
            writer.println("1210853 DEMAND");
            writer.println("1210854 QUEUE");
            writer.println("1210855 RAMP_OFF");
            writer.println("74 0 1");
            writer.println("1204203 2 5 N 1.26 13 MAGDALENA");
            writer.println("1204205 RAMP_ON");
            writer.println("1204206 QUEUE");
            writer.println("1204207 DEMAND");
            writer.println("1204208 PASSAGE");
            writer.println("1204210 RAMP_OFF");
            writer.println("1204212 ML_1");
            writer.println("1204213 ML_2");
            writer.println("1204214 ML_3");
            writer.println("1204215 ML_4");
            writer.println("1204217 OS_1");
            writer.println("1204218 OS_2");
            writer.println("1204219 OS_3");
            writer.println("1204220 OS_4");
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
        Path path = FileSystems.getDefault().getPath("test/atmsdriver/model", "lds_loadhighways_sample.txt");
        Files.delete(path);
    }

    /**
     * Test of toXML method, of class Network.
     */
    public void testLoadHighways() {
        System.out.println("toXML");
        Highways highways = new Highways(
                "test/atmsdriver/model/lds_loadhighways_sample.txt",
                "localhost", 8080);

        // 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 5 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.26));
        expectedStationsPostmiles.add(new Double(1.49));

        for(int i = 0; i < 3; i++)
        {
            assertEquals(expectedStationsPostmiles.get(i), 
                    stationsPostmiles.get(i));
        }
        
        // Test for correct number of loops
        assertEquals(new Integer(30), new Integer(fiveS.stations.get(0).loops.size()
            + fiveS.stations.get(1).loops.size() + fiveS.stations.get(2).loops.size()));
    }
}
