<!doctype html>
<meta charset=utf-8>
<title>HTMLCollection getters and own properties</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<div id=log></div>
<script>
function append(t, tag, name) {
  var element = document.createElement(tag);
  if (name) {
    element.id = name;
  }
  document.body.appendChild(element);
  t.add_cleanup(function() { element.remove(); });
  return element;
}

test(function() {
  var name = "named", tag = "a";
  var c = document.getElementsByTagName(tag);
  var element = append(this, tag, name);
  assert_equals(c[name], element);
  c[name] = "foo";
  assert_equals(c[name], element);
}, "Setting non-array index while named property exists (loose)");

test(function() {
  "use strict";
  var name = "named", tag = "b";
  var c = document.getElementsByTagName(tag);
  var element = append(this, tag, name);
  assert_equals(c[name], element);
  assert_throws(new TypeError(), function() {
    c[name] = "foo";
  });
  assert_equals(c[name], element);
}, "Setting non-array index while named property exists (strict)");

test(function() {
  var name = "named", tag = "i";
  var c = document.getElementsByTagName(tag);
  assert_equals(c[name], undefined);
  c[name] = "foo";
  assert_equals(c[name], "foo");

  var element = append(this, tag, name);
  assert_equals(c[name], "foo");
  assert_equals(c.namedItem(name), element);
}, "Setting non-array index while named property doesn't exist (loose)");

test(function() {
  "use strict";
  var name = "named", tag = "p";
  var c = document.getElementsByTagName(tag);
  assert_equals(c[name], undefined);
  c[name] = "foo";
  assert_equals(c[name], "foo");

  var element = append(this, tag, name);
  assert_equals(c[name], "foo");
  assert_equals(c.namedItem(name), element);
}, "Setting non-array index while named property doesn't exist (strict)");

test(function() {
  var tag = "q";
  var c = document.getElementsByTagName(tag);
  var element = append(this, tag);
  assert_equals(c[0], element);
  c[0] = "foo";
  assert_equals(c[0], element);
}, "Setting array index while indexed property exists (loose)");

test(function() {
  "use strict";
  var tag = "s";
  var c = document.getElementsByTagName(tag);
  var element = append(this, tag);
  assert_equals(c[0], element);
  assert_throws(new TypeError(), function() {
    c[0] = "foo";
  });
  assert_equals(c[0], element);
}, "Setting array index while indexed property exists (strict)");

test(function() {
  var tag = "u";
  var c = document.getElementsByTagName(tag);
  assert_equals(c[0], undefined);
  c[0] = "foo";
  assert_equals(c[0], undefined);

  var element = append(this, tag);
  assert_equals(c[0], element);
}, "Setting array index while indexed property doesn't exist (loose)");

test(function() {
  "use strict";
  var tag = "u";
  var c = document.getElementsByTagName(tag);
  assert_equals(c[0], undefined);
  assert_throws(new TypeError(), function() {
    c[0] = "foo";
  });
  assert_equals(c[0], undefined);

  var element = append(this, tag);
  assert_equals(c[0], element);
}, "Setting array index while indexed property doesn't exist (strict)");
</script>
