(function() {

    module("utils");

    // ----------
    test("addRemoveClass", function() {
        var div = OpenSeadragon.makeNeutralElement('div');
        strictEqual(div.className, '',
            "makeNeutralElement set no classes");

        OpenSeadragon.addClass(div, 'foo');
        strictEqual(div.className, 'foo',
            "Added first class");
        OpenSeadragon.addClass(div, 'bar');
        strictEqual(div.className, 'foo bar',
            "Added second class");
        OpenSeadragon.addClass(div, 'baz');
        strictEqual(div.className, 'foo bar baz',
            "Added third class");
        OpenSeadragon.addClass(div, 'plugh');
        strictEqual(div.className, 'foo bar baz plugh',
            "Added fourth class");

        OpenSeadragon.addClass(div, 'foo');
        strictEqual(div.className, 'foo bar baz plugh',
            "Re-added first class");
        OpenSeadragon.addClass(div, 'bar');
        strictEqual(div.className, 'foo bar baz plugh',
            "Re-added middle class");
        OpenSeadragon.addClass(div, 'plugh');
        strictEqual(div.className, 'foo bar baz plugh',
            "Re-added last class");

        OpenSeadragon.removeClass(div, 'xyzzy');
        strictEqual(div.className, 'foo bar baz plugh',
            "Removed nonexistent class");
        OpenSeadragon.removeClass(div, 'ba');
        strictEqual(div.className, 'foo bar baz plugh',
            "Removed nonexistent class with existent substring");

        OpenSeadragon.removeClass(div, 'bar');
        strictEqual(div.className, 'foo baz plugh',
            "Removed middle class");
        OpenSeadragon.removeClass(div, 'plugh');
        strictEqual(div.className, 'foo baz',
            "Removed last class");
        OpenSeadragon.removeClass(div, 'foo');
        strictEqual(div.className, 'baz',
            "Removed first class");
        OpenSeadragon.removeClass(div, 'baz');
        strictEqual(div.className, '',
            "Removed only class");
    });

    // ----------
    asyncTest("makeAjaxRequest", function() {
        var timeWatcher = Util.timeWatcher();

        OpenSeadragon.makeAjaxRequest('data/testpattern.dzi', function(xhr) {
            ok(/deepzoom/.test(xhr.response), 'file loaded');
            timeWatcher.done();
        });
    });

    // ----------
    asyncTest("requestAnimationFrame", function() {
        var timeWatcher = Util.timeWatcher();

        OpenSeadragon.requestAnimationFrame(function() {
            ok(true, 'frame fired');
            timeWatcher.done();
        });
    });

    // ----------
    asyncTest("cancelAnimationFrame", function() {
        var frameFired = false;

        setTimeout(function() {
            strictEqual(frameFired, false, 'the frame never fired');
            start();
        }, 150);

        var frameId = OpenSeadragon.requestAnimationFrame(function() {
            frameFired = true;
        });

        OpenSeadragon.cancelAnimationFrame(frameId);
    });

})();

@@ -1,20 +1,117 @@
+/* global module, asyncTest, $, ok, equal, strictEqual, notEqual, start, test, Util, testLog */%0A%0A
 (function() %7B%0A%0A    m
@@ -2268,16 +2268,28 @@
 rn.dzi',
+%0A           
  functio
@@ -2313,58 +2313,307 @@
     
-ok(/deepzoom/.test(xhr.response), 'file load
+    equal(xhr.status, 200, 'Success callback called for HTTP 200');%0A                ok(/deepzoom/.test(xhr.responseText), 'Success function called');%0A                timeWatcher.done();%0A            %7D,%0A            function(xhr) %7B%0A                ok(false, 'Error callback should not be call
 ed');%0A
+    
     
@@ -2640,33 +2640,623 @@
 done();%0A        
-%7D
+    %7D%0A        );%0A    %7D);%0A%0A    asyncTest(%22makeAjaxRequest for invalid file%22, function() %7B%0A        var timeWatcher = Util.timeWatcher();%0A%0A        OpenSeadragon.makeAjaxRequest('not-a-real-dzi-file',%0A            function(xhr) %7B%0A                ok(false, 'Success function should not be called for errors');%0A                timeWatcher.done();%0A            %7D,%0A            function(xhr) %7B%0A                equal(xhr.status, 404, 'Error callback called for HTTP 404');%0A                ok(true, 'Error function should be called for errors');%0A                timeWatcher.done();%0A            %7D%0A        
 );%0A    %7D);%0A%0A    

update AJAX tests