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

// Returns a promise that resolves to a DOMStringList with
// the requested entries. Relies on Indexed DB.
function createDOMStringList(entries) {
  return new Promise((resolve, reject) => {
    const dbname = String(self.location + Math.random());
    const request = indexedDB.open(dbname);
    request.onerror = () => reject(request.error);
    request.onupgradeneeded = () => {
      const db = request.result;
      entries.forEach(entry => db.createObjectStore(entry));
      const dsl = db.objectStoreNames;
      resolve(dsl);
      request.transaction.abort();
    }
  });
}

function dsl_test(entries, func, description) {
  promise_test(t => createDOMStringList(entries).then(dsl => func(t, dsl)),
               description);
}

dsl_test(['a', 'b', 'c'], (t, dsl) => {
  assert_equals(dsl.length, 3, 'length attribute');
}, 'DOMStringList: length attribute');

dsl_test(['a', 'b', 'c'], (t, dsl) => {
  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_equals(dsl.item(-1), null, 'item method out of range');
  assert_throws_js(TypeError, () => dsl.item(),
                   'item method should throw if called without enough args');
}, 'DOMStringList: item() method');

dsl_test(['a', 'b', 'c'], (t, dsl) => {
  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_equals(dsl[-1], undefined, 'indexed getter out of range');
}, 'DOMStringList: indexed getter');

dsl_test(['a', 'b', 'c'], (t, dsl) => {
  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_js(TypeError, () => dsl.contains(),
    'contains method should throw if called without enough args');
}, 'DOMStringList: contains() method');

</script>
