<!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", 'auto');
                testExpected("textCue.size", 100);
                testExpected("textCue.align", "center");

                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", 'auto');
                testExpected("newCue.size", 100);
                testExpected("newCue.align", "center");

                consoleWrite("<br>*** Create an old-style cue with an id.");
                run("invalidCue = new VTTCue('sausage-cue', 33, 3.4, 'Sausage?')");
                testExpected("window.invalidCue", undefined);

                testExpected("testTrack.track.cues.length", 5);

                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();
            }

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