<!DOCTYPE html>
<title>DOMStringList interface</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script>

// Returns a promise that will resolve to a DOMStringList.
// Strings must be unique, and the strings will be sorted.
function makeDOMStringList(entries) {
    return new Promise(function(resolve, reject) {
        var dbname = String(self.location);
        var r = indexedDB.open(dbname);
        r.onerror = function() { reject(r.error); };
        r.onupgradeneeded = function() {
            var db = r.result;
            entries.forEach(function(entry) {
                db.createObjectStore(entry);
            });
        }
        r.onsuccess = function() {
            var db = r.result;
            var dsl = db.objectStoreNames;
            db.close();
            var r2 = indexedDB.deleteDatabase(dbname);
            r2.onerror = function() { reject(r2.error); };
            r2.onsuccess = function() { resolve(dsl); };
        }
    });
}

promise_test(function(t) {
    return makeDOMStringList(['a', 'b', 'c'])
        .then(function(dsl) {
            assert_equals(Object.prototype.toString.call(dsl),
                          '[object DOMStringList]',
                          'Object should be branded as "DOMStringList"');
            assert_true('length' in dsl && typeof dsl.length === 'number',
                        'DOMStringList should have length attribute');
            assert_true('item' in dsl && typeof dsl.item === 'function',
                        'DOMStringList should have item method');
            assert_true('contains' in dsl && typeof dsl.contains === 'function',
                        'DOMStringList should have contains method');

            assert_equals(dsl.length, 3, 'length attribute');

            assert_equals(dsl.item(0), 'a', 'item method');
            assert_equals(dsl.item(1), 'b', 'item method');
            assert_equals(dsl.item(2), 'c', 'item method');
            assert_equals(dsl.item(3), null, 'item method out of range');
            assert_throws(
                {name: 'TypeError'}, function() { dsl.item(); },
                'item method should throw if called without enough args');

            assert_equals(dsl[0], 'a', 'indexed getter');
            assert_equals(dsl[1], 'b', 'indexed getter');
            assert_equals(dsl[2], 'c', 'indexed getter');
            assert_equals(dsl[3], undefined, 'indexed getter out of range');

            assert_true(dsl.contains('a'),
                        'contains method matched');
            assert_true(dsl.contains('b'),
                        'contains method matched');
            assert_true(dsl.contains('c'),
                        'contains method matched');
            assert_false(dsl.contains(''),
                         'contains method unmatched');
            assert_false(dsl.contains('d'),
                         'contains method unmatched');
            assert_throws(
                {name: 'TypeError'}, function(){ dsl.contains(); },
                'contains method should throw if called without enough args');
        });
}, 'DOMStringList interface');

</script>
