function test_getElementsByTagNameNS(context, element) {
  test(function() {
    assert_false(context.getElementsByTagNameNS("http://www.w3.org/1999/xhtml", "html") instanceof NodeList, "NodeList")
    assert_true(context.getElementsByTagNameNS("http://www.w3.org/1999/xhtml", "html") instanceof HTMLCollection, "HTMLCollection")
    var firstCollection = context.getElementsByTagNameNS("http://www.w3.org/1999/xhtml", "html"),
        secondCollection = context.getElementsByTagNameNS("http://www.w3.org/1999/xhtml", "html")
    assert_true(firstCollection !== secondCollection || firstCollection === secondCollection,
                "Caching is allowed.")
  })

  test(function() {
    var t = element.appendChild(document.createElementNS("test", "body"))
    this.add_cleanup(function() {element.removeChild(t)})
    var actual = context.getElementsByTagNameNS("*", "body");
    var expected = [];
    var get_elements = function(node) {
      for (var i = 0; i < node.childNodes.length; i++) {
        var child = node.childNodes[i];
        if (child.nodeType === child.ELEMENT_NODE) {
          if (child.localName == "body") {
            expected.push(child);
          }
          get_elements(child);
        }
      }
    }
    get_elements(context);
    assert_array_equals(actual, expected);
  }, "getElementsByTagNameNS('*', 'body')")

  test(function() {
    assert_array_equals(context.getElementsByTagNameNS("", "*"), []);
    var t = element.appendChild(document.createElementNS("", "body"))
    this.add_cleanup(function() {element.removeChild(t)})
    assert_array_equals(context.getElementsByTagNameNS("", "*"), [t]);
  }, "Empty string namespace")

  test(function() {
    var t = element.appendChild(document.createElementNS("test", "body"))
    this.add_cleanup(function() {element.removeChild(t)})
    assert_array_equals(context.getElementsByTagNameNS("test", "body"), [t]);
  }, "body element in test namespace, no prefix")

  test(function() {
    var t = element.appendChild(document.createElementNS("test", "test:body"))
    this.add_cleanup(function() {element.removeChild(t)})
    assert_array_equals(context.getElementsByTagNameNS("test", "body"), [t]);
  }, "body element in test namespace, prefix")

  test(function() {
    var t = element.appendChild(document.createElementNS("test", "BODY"))
    this.add_cleanup(function() {element.removeChild(t)})
    assert_array_equals(context.getElementsByTagNameNS("test", "BODY"), [t]);
    assert_array_equals(context.getElementsByTagNameNS("test", "body"), []);
  }, "BODY element in test namespace, no prefix")

  test(function() {
    var t = element.appendChild(document.createElementNS("http://www.w3.org/1999/xhtml", "abc"))
    this.add_cleanup(function() {element.removeChild(t)})
    assert_array_equals(context.getElementsByTagNameNS("http://www.w3.org/1999/xhtml", "abc"), [t]);
    assert_array_equals(context.getElementsByTagNameNS("http://www.w3.org/1999/xhtml", "ABC"), []);
    assert_array_equals(context.getElementsByTagNameNS("test", "ABC"), []);
  }, "abc element in html namespace")

  test(function() {
    var t = element.appendChild(document.createElementNS("http://www.w3.org/1999/xhtml", "ABC"))
    this.add_cleanup(function() {element.removeChild(t)})
    assert_array_equals(context.getElementsByTagNameNS("http://www.w3.org/1999/xhtml", "abc"), []);
    assert_array_equals(context.getElementsByTagNameNS("http://www.w3.org/1999/xhtml", "ABC"), [t]);
  }, "ABC element in html namespace")

  test(function() {
    var t = element.appendChild(document.createElementNS("http://www.w3.org/1999/xhtml", "AÇ"))
    this.add_cleanup(function() {element.removeChild(t)})
    assert_array_equals(context.getElementsByTagNameNS("http://www.w3.org/1999/xhtml", "AÇ"), [t]);
    assert_array_equals(context.getElementsByTagNameNS("test", "aÇ"), []);
    assert_array_equals(context.getElementsByTagNameNS("test", "aç"), []);
  }, "AÇ, case sensitivity")

  test(function() {
    var t = element.appendChild(document.createElementNS("test", "test:BODY"))
    this.add_cleanup(function() {element.removeChild(t)})
    assert_array_equals(context.getElementsByTagNameNS("test", "BODY"), [t]);
    assert_array_equals(context.getElementsByTagNameNS("test", "body"), []);
  }, "BODY element in test namespace, prefix")

  test(function() {
    var t = element.appendChild(document.createElementNS("test", "test:test"))
    this.add_cleanup(function() {element.removeChild(t)})
    var actual = context.getElementsByTagNameNS("http://www.w3.org/1999/xhtml", "*");
    var expected = [];
    var get_elements = function(node) {
      for (var i = 0; i < node.childNodes.length; i++) {
        var child = node.childNodes[i];
        if (child.nodeType === child.ELEMENT_NODE) {
          if (child !== t) {
            expected.push(child);
          }
          get_elements(child);
        }
      }
    }
    get_elements(context);
    assert_array_equals(actual, expected);
  }, "getElementsByTagNameNS('http://www.w3.org/1999/xhtml', '*')")

  test(function() {
    var actual = context.getElementsByTagNameNS("*", "*");
    var expected = [];
    var get_elements = function(node) {
      for (var i = 0; i < node.childNodes.length; i++) {
        var child = node.childNodes[i];
        if (child.nodeType === child.ELEMENT_NODE) {
          expected.push(child);
          get_elements(child);
        }
      }
    }
    get_elements(context);
    assert_array_equals(actual, expected);
  }, "getElementsByTagNameNS('*', '*')")

  test(function() {
    assert_array_equals(context.getElementsByTagNameNS("**", "*"), []);
    assert_array_equals(context.getElementsByTagNameNS(null, "0"), []);
    assert_array_equals(context.getElementsByTagNameNS(null, "div"), []);
  }, "Empty lists")
}
