<!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>
