<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

        <script src=../media-file.js></script>
        <script src=../video-test.js></script>
        <script>           

            var cues;

            function trackLoaded()
            {
                var testTrack = document.getElementById('testTrack');
                cues = testTrack.track.cues;

                consoleWrite("<br>*** Test cues loaded from the file.");
                testExpected("cues.length", 4);
                testExpected("cues.getCueById('1').startTime", 0);
                testExpected("cues[1].startTime", 31);
                testExpected("cues[2].startTime", 61);
                testExpected("cues.getCueById('4').startTime", 121);
                testExpected("cues.getCueById('junk')", undefined);

                consoleWrite("<br>*** Create a new cue, check values");
                run("textCue = new VTTCue(33, 3.4, 'Sausage?')");
                testExpected("textCue.track", null);
                testExpected("textCue.id", '');
                testExpected("textCue.startTime", 33);
                testExpected("textCue.endTime", 3.4);
                testExpected("textCue.pauseOnExit", false);
                testExpected("textCue.vertical", "");
                testExpected("textCue.snapToLines", true);
                testExpected("textCue.line", "auto");
                testExpected("textCue.position", 50);
                testExpected("textCue.size", 100);
                testExpected("textCue.align", "middle");

                consoleWrite("<br>*** Remove the unadded track, make sure it throws correctly.");
                testException("testTrack.track.removeCue(textCue)", '"NotFoundError: Failed to execute \'removeCue\' on \'TextTrack\': The specified cue is not listed in the TextTrack\'s list of cues."');

                consoleWrite("<br>*** Add the new cue to a track, make sure it is inserted correctly.");
                run("testTrack.track.addCue(textCue)");
                testExpected("textCue.track", testTrack.track);
                testExpected("cues[1].startTime", 31);
                testExpected("cues[2].startTime", 33);
                testExpected("cues[3].startTime", 61);

                consoleWrite("<br>*** create a new cue and add it to a track created with video.addTextTrack, make sure it is inserted correctly.");
                findMediaElement();
                run('newTrack = video.addTextTrack("subtitles", "French subtitles", "fr")');
                newTrack.mode = 2;
                run('newTrack.addCue(new VTTCue(0.0, 1.0, "Test!"))');
                run('newCue = newTrack.cues[0]');
                testExpected("newCue.track", newTrack);
                testExpected("newCue.id", "");
                testExpected("newCue.startTime", 0.0);
                testExpected("newCue.endTime", 1.0);
                testExpected("newCue.pauseOnExit", false);
                testExpected("newCue.vertical", "");
                testExpected("newCue.snapToLines", true);
                testExpected("newCue.line", "auto");
                testExpected("newCue.position", 50);
                testExpected("newCue.size", 100);
                testExpected("newCue.align", "middle");

                consoleWrite("<br>*** Remove a cue created with addCue().");
                run("testTrack.track.removeCue(textCue)");
                testExpected("textCue.track", null);
                testExpected("cues[1].startTime", 31);
                testExpected("cues[2].startTime", 61);

                consoleWrite("<br>*** Remove a cue added from the WebVTT file.");
                run("textCue = cues[2]");
                run("testTrack.track.removeCue(textCue)");
                testExpected("textCue.track", null);
                testExpected("cues[1].startTime", 31);
                testExpected("cues[2].startTime", 121);

                consoleWrite("<br>*** Try to remove the cue again.");
                testDOMException("testTrack.track.removeCue(textCue)", "DOMException.NOT_FOUND_ERR");

                consoleWrite("<br>*** Add a cue before all the existing cues.");
                run("testTrack.track.addCue(new VTTCue(0, 31, 'I am first'))");
                testExpected("cues[0].startTime", 0);
                testExpected("cues[0].endTime", 31);
                testExpected("cues[1].startTime", 0);
                testExpected("cues[1].endTime", 30.5);
                testExpected("cues[2].startTime", 31);
                endTest();
            }

        </script>
    </head>
    <body>
        <p>Tests TextTrack's addCue and removeCue</p>
        <video>
            <track id="testTrack" src="captions-webvtt/tc013-settings.vtt" kind="captions" onload="trackLoaded()" default>
        </video>
    </body>
</html>
