(function() {

    // This module tests whether our various file formats can be opened.
    // TODO: Add more file formats (with corresponding test data).

    module('Formats', {
        setup: function () {
            var example = document.createElement("div");
            example.id = "example";
            document.getElementById("qunit-fixture").appendChild(example);
        }
    });

    var viewer = null;

    // ----------
    var testOpen = function(name) {
        $(document).ready(function() {
            var timeWatcher = Util.timeWatcher(7000);

            viewer = OpenSeadragon({
                id:            'example',
                prefixUrl:     '/build/openseadragon/images/',
                tileSources:   '/test/data/' + name
            });

            ok(viewer, 'Viewer exists');

            var openHandler = function(event) {
                viewer.removeHandler('open', openHandler);
                ok(true, 'Open event was sent');
                viewer.addHandler('tile-drawn', tileDrawnHandler);
            };

            var tileDrawnHandler = function(event) {
                viewer.removeHandler('tile-drawn', tileDrawnHandler);
                ok(true, 'A tile has been drawn');
                viewer.addHandler('close', closeHandler);
                viewer.close();
            };

            var closeHandler = function(event) {
                viewer.removeHandler('close', closeHandler);
                $('#example').empty();
                ok(true, 'Close event was sent');
                timeWatcher.done();
            };

            viewer.addHandler('open', openHandler);
        });
    };

    // ----------
    asyncTest('DZI', function() {
        testOpen('testpattern.dzi');
    });

    // ----------
    asyncTest('DZI JSONp', function() {
        testOpen('testpattern.js');
    });

    // ----------
    asyncTest('DZI XML', function() {
        testOpen('testpattern.xml');
    });

    // ----------
    asyncTest('DZI XML with query parameter', function() {
        testOpen('testpattern.xml?param=value');
    });

     // ----------
    asyncTest('IIIF 1.0 JSON', function() {
        testOpen('iiif_1_0_files/info.json');
    });

    // ----------
    asyncTest('IIIF 1.0 XML', function() {
        testOpen('iiif_1_0_files/info.xml');
    });

    // ----------
    asyncTest('IIIF 1.1 JSON', function() {
        testOpen('iiif_1_1_tiled/info.json');
    });

    // ----------
    asyncTest('IIIF No Tiles, Less than 256', function() {
        testOpen('iiif_1_1_no_tiles_255/info.json');
    });

    // ----------
    asyncTest('IIIF No Tiles, Bet. 256 and 512', function() {
        testOpen('iiif_1_1_no_tiles_384/info.json');
    });

    // ----------
    asyncTest('IIIF No Tiles, Bet. 512 and 1024', function() {
        testOpen('iiif_1_1_no_tiles_768/info.json');
    });

    // ----------
    asyncTest('IIIF No Tiles, Larger than 1024', function() {
        testOpen('iiif_1_1_no_tiles_1048/info.json');
    });

    // ----------
    asyncTest('IIIF 2.0 JSON', function() {
        testOpen('iiif_2_0_tiled/info.json');
    });    

})();