// The increased timeout is especially needed with larger binaries
// like in the debug/gpu build
jasmine.DEFAULT_TIMEOUT_INTERVAL = 20000;

describe('Debugger\'s Playback Behavior', function() {
    const container = document.createElement('div');
    document.body.appendChild(container);

    beforeEach(function() {
        container.innerHTML = `<canvas id=debugger_view width=720 height=1280></canvas>`;
    });

    afterEach(function() {
        container.innerHTML = '';
    });

    it('can switch to the second frame of an animated skp', function(done) {
        const filename = '/debugger/anim.mskp'
        const fetchSkpPromise = fetch(filename);

        Promise.all([LoadDebugger, fetchSkpPromise]).then((values) => {

            const response = values[1];
            if (!response.ok) {
                throw new Error("HTTP error, status = " + response.status);
            }
            response.arrayBuffer().then((buffer) => {
                catchException(done, () => {
                    const canvasElement = document.getElementById('debugger_view');
                    const fileContents = new Uint8Array(buffer);
                    console.log('fetched '+filename);
                    const player = Debugger.SkpFilePlayer(fileContents);
                    const bounds = player.getBounds();
                    canvasElement.width = bounds.fRight - bounds.fLeft;
                    canvasElement.height = bounds.fBottom - bounds.fTop;
                    expect(canvasElement.width).toBe(1080);
                    expect(canvasElement.height).toBe(1920);
                    const surface = Debugger.MakeWebGLCanvasSurface(canvasElement);
                    expect(surface).toBeTruthy();
                    const numFrames = player.getFrameCount();
                    expect(numFrames).toBe(10);

                    let cmd = JSON.parse(player.jsonCommandList(surface));
                    expect(cmd).toBeTruthy();

                    // Move to last command in first frame
                    player.drawTo(surface, cmd.commands.length);
                    surface.flush();

                    // Move to frame two
                    player.changeFrame(1);
                    cmd = JSON.parse(player.jsonCommandList(surface));
                    expect(cmd).toBeTruthy();
                    // move to command 100 in frame 2
                    player.drawTo(surface, 100);
                    surface.flush();

                    console.log('drew picture to canvas element');
                    surface.dispose();
                    done();
                })();
            });
        });
    });
});