<!DOCTYPE html>
<!-- Submitted from TestTWF Paris -->
<meta charset="utf-8">
<title>Invalid keypath</title>
<link rel=help href="http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#key-path-construct">
<link rel=assert title="A key path is a DOMString that defines how to extract a key from a value. A valid key path is either the empty string, a JavaScript identifier, or multiple Javascript identifiers separated by periods (ASCII character code 46) [ECMA-262].">
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="support.js"></script>

<script>

    var global_db = createdb_for_multiple_tests();

    function invalid_keypath(keypath, desc) {
        var t = async_test("Invalid keyPath - " + (desc ? desc : format_value(keypath)), undefined, 2);

        var openrq = global_db.setTest(t),
            store_name  = "store-" + Date.now() + Math.random();

        openrq.onupgradeneeded = function(e) {
            var db = e.target.result;
            assert_throws('SyntaxError', function() {
                    db.createObjectStore(store_name, { keyPath: keypath })
                }, "createObjectStore with keyPath");

            store = db.createObjectStore(store_name);
            assert_throws('SyntaxError', function() {
                    store.createIndex('index', keypath);
                }, "createIndex with keyPath");

            db.close();

            this.done();
        };
    }

    invalid_keypath('j a');
    invalid_keypath('.yo');
    invalid_keypath('yo,lo');
    invalid_keypath([]);
    invalid_keypath(['array with space']);
    invalid_keypath(['multi_array', ['a', 'b']], "multidimensional array (invalid toString)"); // => ['multi_array', 'a,b']
    invalid_keypath('3m');
    invalid_keypath({toString:function(){return '3m'}}, '{toString->3m}');
    invalid_keypath('my.1337');
    invalid_keypath('..yo');
    invalid_keypath('y..o');
    invalid_keypath('y.o.');
    invalid_keypath('y.o..');
    invalid_keypath('m.*');
    invalid_keypath('"m"');
    invalid_keypath('m%');
    invalid_keypath('m/');
    invalid_keypath('m/a');
    invalid_keypath('m&');
    invalid_keypath('m!');
    invalid_keypath('*');
    invalid_keypath('*.*');
    invalid_keypath('^m');
    invalid_keypath('/m/');

</script>

<div id=log></div>
