Test IndexedDB keyPath edge cases

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;

indexedDB.deleteDatabase(dbname)
indexedDB.open(dbname)
db.createObjectStore('store-with-path', {keyPath: 'foo'})
db.createObjectStore('store-with-path-and-generator', {keyPath: 'foo', autoIncrement: true})

testKeyPaths():
transaction = db.transaction(['store-with-path'], 'readwrite')
store = transaction.objectStore('store-with-path')

Key path doesn't resolve to a value; should yield null, should throw DATA_ERR
Expecting exception from store.put(null)
PASS Exception was thrown.
PASS code is 0
PASS ename is 'DataError'
Exception message: Failed to store record in an IDBObjectStore: Evaluating the object store's key path did not yield a value.

Key path doesn't resolve to a value; should yield null, should throw DATA_ERR
Expecting exception from store.put({})
PASS Exception was thrown.
PASS code is 0
PASS ename is 'DataError'
Exception message: Failed to store record in an IDBObjectStore: Evaluating the object store's key path did not yield a value.

Key path resolves to a value that is invalid key; should yield 'invalid' key, should throw DATA_ERR
Expecting exception from store.put({foo: null})
PASS Exception was thrown.
PASS code is 0
PASS ename is 'DataError'
Exception message: Failed to store record in an IDBObjectStore: Evaluating the object store's key path yielded a value that is not a valid key.

Key path resolves to a value that is valid key; should yield 'string' key, should succeed
store.put({foo: 'zoo'})
PASS store.put succeeded

testKeyPathsAndGenerator():
transaction = db.transaction(['store-with-path-and-generator'], 'readwrite')
store = transaction.objectStore('store-with-path-and-generator')

Key path doesn't resolve to a value; should yield null but insertion would fail, so put request should raise exception
Expecting exception from store.put(null)
PASS Exception was thrown.
PASS code is 0
PASS ename is 'DataError'
Exception message: Provided data is inadequate.

Key path doesn't resolve to a value; should yield null but insertion would fail, so put request should raise exception
Expecting exception from store.put('string')
PASS Exception was thrown.
PASS code is 0
PASS ename is 'DataError'
Exception message: Provided data is inadequate.

Key path doesn't resolve to a value; should yield null, key should be generated, put request should succeed
store.put({})
PASS store.put succeeded

Key path resolves to a value that is invalid key; should yield 'invalid' key, should throw DATA_ERR
Expecting exception from store.put({foo: null})
PASS Exception was thrown.
PASS code is 0
PASS ename is 'DataError'
Exception message: Failed to store record in an IDBObjectStore: Evaluating the object store's key path yielded a value that is not a valid key.

Key path resolves to a value that is valid key; should yield 'string' key, should succeed
store.put({foo: 'zoo'})
PASS store.put succeeded
PASS successfullyParsed is true

TEST COMPLETE

