<!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", -1);
                testExpected("textCue.position", 50);
                testExpected("textCue.size", 100);
                testExpected("textCue.align", "middle");

                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", -1);
                testExpected("newCue.position", 50);
                testExpected("newCue.size", 100);
                testExpected("newCue.align", "middle");

                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>
