<!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 TextTrackCue(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 TextTrackCue(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("oldStyleCue = new TextTrackCue('sausage-cue', 33, 3.4, 'Sausage?')");
                testExpected("oldStyleCue.id", "");
                testExpected("oldStyleCue.startTime.toString()", "NaN");
                testExpected("oldStyleCue.endTime", 33);
                consoleWrite("*** Make sure the old-style cue is not inserted because its start time is not a number.");
                testExpected("testTrack.track.cues.length", 5);
                run("testTrack.track.addCue(oldStyleCue)");
                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 TextTrackCue(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>
