<!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(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(TypeError(), () => dsl.contains(),
    'contains method should throw if called without enough args');
}, 'DOMStringList: contains() method');

</script>
