<!DOCTYPE html>
<!-- Submitted from TestTWF Paris -->
<html>
    <head>
        <meta charset=utf-8>
        <title id='desc'>IDBKeyRange Tests - Incorrect</title>
        <link rel=help href="http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#range-concept">
        <link rel=assert title="If the lower key is greater than the upper key, then a DOMException of type DataError must be thrown.">
        <link rel=author href="mailto:chrcharles67@gmail.com" title="Christophe CHARLES">

        <script src="../../../resources/testharness.js"></script>
        <script src="../../../resources/testharnessreport.js"></script>
        <script src="support.js"></script>

        <script type="text/javascript">

            // TypeError: bound requires more than 0 arguments
            test( function() {
                assert_throws(new TypeError(), function() {
                    IDBKeyRange.bound();
                });
            }, "IDBKeyRange.bound() - bound requires more than 0 arguments.");

            // Null parameters
            test( function() {
                assert_throws("DataError", function() {
                    IDBKeyRange.bound(null, null);
                });
            }, "IDBKeyRange.bound(null, null) - null parameters are incorrect.");

            // // Null parameter
            test( function() {
                assert_throws("DataError", function() {
                    IDBKeyRange.bound(1, null);
                });
                assert_throws("DataError", function() {
                    IDBKeyRange.bound(null, 1);
                });
            }, "IDBKeyRange.bound(1, null / null, 1) - null parameter is incorrect.");

            // bound incorrect
            test( function() {
                var lowerBad = Math.floor(Math.random()*31) + 5;
                var upper = lowerBad - 1;
                assert_throws("DataError", function() {
                    IDBKeyRange.bound(lowerBad, upper);
                });
                assert_throws("DataError", function() {
                    IDBKeyRange.bound('b', 'a');
                });
            }, "IDBKeyRange.bound(lower, upper / lower > upper) -  'lower' is greater than 'upper'."
            );

            test( function() {
                assert_throws("DataError", function() {
                    IDBKeyRange.bound('a', 1);
                });
                assert_throws("DataError", function() {
                    IDBKeyRange.bound(new Date(), 1);
                });
                assert_throws("DataError", function() {
                    IDBKeyRange.bound([1, 2], 1);
                });
            }, "IDBKeyRange.bound(DOMString/Date/Array, 1) - A DOMString, Date and Array are greater than a float.");


            // ReferenceError: the variable is not defined
            test( function() {
                var goodVariable = 1;
                assert_throws(new ReferenceError(), function() {
                    IDBKeyRange.bound(noExistingVariable, 1);
                });
                assert_throws(new ReferenceError(), function() {
                    IDBKeyRange.bound(goodVariable, noExistingVariable);
                });
            }, "IDBKeyRange.bound(noExistingVariable, 1 / goodVariable, noExistingVariable) - noExistingVariable is not defined.");

            // Valid type key error
            test( function() {
                assert_throws("DataError", function() {
                    IDBKeyRange.bound(true, 1);
                });
            }, "IDBKeyRange.bound(true, 1) - boolean is not a valid key type.");


        </script>
    </head>

    <body>
        <div id="log"></div>
    </body>
</html>