package scriptbuilder.structures;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.logging.Level;
import java.util.logging.Logger;
import junit.framework.TestCase;
import scriptbuilder.structures.events.AudioEvent;
import scriptbuilder.structures.events.CHPRadioEvent;
import scriptbuilder.structures.events.I_ScriptEvent;

/**
 *
 * @author Bryan McGuffin
 */
public class TimeSliceTest extends TestCase
{

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

    /**
     * Test of addEvent method, of class TimeSlice.
     */
    public void testAddEvent()
    {
        System.out.println("addEvent");
        I_ScriptEvent event = new CHPRadioEvent();
        TimeSlice instance = new TimeSlice(0, null);

        assertEquals(0, instance.events.size());
        instance.addEvent(event);
        assertEquals(1, instance.events.size());
    }

    /**
     * Test of getX method, of class TimeSlice.
     */
    public void testGetX()
    {
        System.out.println("getX");
        TimeSlice instance = new TimeSlice(0, null);
        int expResult = 0;
        int result = instance.getX();
        assertEquals(expResult, result);
        TimeSlice instance2 = new TimeSlice(2, null);
        int expResult2 = 2;
        int result2 = instance2.getTime();
        assertEquals(expResult2, result2);
    }

    /**
     * Test of getTime method, of class TimeSlice.
     */
    public void testGetTime()
    {
        System.out.println("getTime");
        TimeSlice instance = new TimeSlice(100, null);
        int expResult = 100;
        int result = instance.getTime();
        assertEquals(expResult, result);
    }

    /**
     * Test of shift method, of class TimeSlice.
     */
    public void testShift()
    {
        System.out.println("shift");
        int amnt = 25;
        TimeSlice instance = new TimeSlice(100, null);
        assertEquals(100, instance.getTime());
        instance.shift(amnt);
        assertEquals(125, instance.getTime());
    }

    /**
     * Test of getEffectiveDuration method, of class TimeSlice.
     */
    public void testGetEffectiveDuration()
    {
        System.out.println("getEffectiveDuration");
        TimeSlice instance = new TimeSlice(0, null);
        assertEquals(0, instance.getEffectiveDuration());

        ScriptEvent ev1 = new AudioEvent();
        assertEquals(1, ev1.getLength());
        instance.addEvent(ev1);
        assertEquals(1, instance.getEffectiveDuration());

        ScriptEvent ev2 = new AudioEvent();
        ev2.length = 25;
        assertEquals(25, ev2.getLength());
        instance.addEvent(ev2);
        assertEquals(25, instance.getEffectiveDuration());
    }

    /**
     * Test of getToolTipText method, of class TimeSlice.
     */
    public void testGetToolTipText()
    {
        System.out.println("getToolTipText");
        int y = 0;
        TimeSlice instance = new TimeSlice(0, null);
        String expResult = "";
        String result = instance.getToolTipText(0);
        assertEquals(null, result);

        result = instance.getToolTipText(56);
        assertEquals(null, result);

        result = instance.getToolTipText(50);
        assertEquals(null, result);

        result = instance.getToolTipText(80);
        assertEquals(null, result);

        AudioEvent ev = new AudioEvent();
        instance.addEvent(ev);
        expResult = "<html>" + ev.toString() + "<br/></html>";

        result = instance.getToolTipText(56);
        assertEquals(ev.toString(), result);

        result = instance.getToolTipText(70);
        assertEquals(ev.toString(), result);

        result = instance.getToolTipText(85);
        assertEquals(null, result);

        result = instance.getToolTipText(50);
        assertEquals(expResult, result);

        result = instance.getToolTipText(0);
        assertEquals(null, result);
    }

    /**
     * Test of toString method, of class TimeSlice.
     */
    public void testToString()
    {
        System.out.println("toString");
        TimeSlice instance = new TimeSlice(0, null);
        String expResult = "";
        String result = instance.toString();
        assertEquals(expResult, result);

        AudioEvent ev1 = new AudioEvent();
        CHPRadioEvent ev2 = new CHPRadioEvent();

        instance.addEvent(ev1);
        instance.addEvent(ev2);

        expResult = ev1.toString() + "\n" + ev2.toString() + "\n";
        result = instance.toString();
        assertEquals(expResult, result);
    }

    /**
     * Test of compareTo method, of class TimeSlice.
     */
    public void testCompareTo()
    {
        System.out.println("compareTo");
        Object o = new SimulationScript();

        TimeSlice other = new TimeSlice(10, null);

        TimeSlice instance = new TimeSlice(0, null);
        int result = instance.compareTo(o);
        assertEquals(0, result);

        result = instance.compareTo(other);
        assertEquals(-1, result);

        result = other.compareTo(instance);
        assertEquals(1, result);

        result = instance.compareTo(instance);
        assertEquals(0, result);

    }

    /**
     * Test of toXML method, of class TimeSlice.
     */
    public void testToXML()
    {
        try
        {
            System.out.println("toXML");
            SimulationScript script = new SimulationScript();
            script.loadScriptFromFile(new File("test/scriptbuilder/structures/single_timeslice_output_expected.xml"));
            TimeSlice instance = script.incidents.get(0).slices.get(0);

            byte[] data = Files.readAllBytes(
                    new File("test/scriptbuilder/structures/single_timeslice_output_expected.xml").toPath());

            String expResult = new String(data);

            String result = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"
                    + "<!DOCTYPE TMC_SCRIPT SYSTEM \"script.dtd\">\n"
                    + XMLBuilder.openTag(ELEMENT.TMC_SCRIPT.tag + " title=\"" + script.title + "\"")
                    + instance.toXML()
                    + XMLBuilder.closeTag(ELEMENT.TMC_SCRIPT.tag);

            assertEquals(expResult, result);

        }
        catch (IOException ex)
        {
            Logger.getLogger(TimeSliceTest.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}
