<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Node.isEqualNode</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<div id="log"/>
<script>
function testNullHandling(node) {
  test(function() {
    assert_false(node.isEqualNode(null))
    assert_false(node.isEqualNode(undefined))
  })
}
[
  document.createElement("foo"),
  document.createTextNode("foo"),
  document.createProcessingInstruction("foo", "bar"),
  document.createComment("foo"),
  document,
  document.implementation.createDocumentType("html", "", ""),
  document.createDocumentFragment()
].forEach(testNullHandling)

test(function() {
  var a = document.createElement("foo")
  a.setAttribute("a", "bar")
  a.setAttribute("b", "baz")
  var b = document.createElement("foo")
  b.setAttribute("b", "baz")
  b.setAttribute("a", "bar")
  assert_true(a.isEqualNode(b))
}, "isEqualNode should return true when the attributes are in a different order")

test(function() {
  var a = document.createElementNS("ns", "prefix:foo")
  var b = document.createElementNS("ns", "prefix:foo")
  assert_true(a.isEqualNode(b))
}, "isEqualNode should return true if elements have same namespace, prefix, and local name")

test(function() {
  var a = document.createElementNS("ns1", "prefix:foo")
  var b = document.createElementNS("ns2", "prefix:foo")
  assert_false(a.isEqualNode(b))
}, "isEqualNode should return false if elements have different namespace")

test(function() {
  var a = document.createElementNS("ns", "prefix1:foo")
  var b = document.createElementNS("ns", "prefix2:foo")
  assert_false(a.isEqualNode(b))
}, "isEqualNode should return false if elements have different prefix")

test(function() {
  var a = document.createElementNS("ns", "prefix:foo1")
  var b = document.createElementNS("ns", "prefix:foo2")
  assert_false(a.isEqualNode(b))
}, "isEqualNode should return false if elements have different local name")

test(function() {
  var a = document.createElement("foo")
  a.setAttributeNS("ns", "x:a", "bar")
  var b = document.createElement("foo")
  b.setAttributeNS("ns", "y:a", "bar")
  assert_true(a.isEqualNode(b))
}, "isEqualNode should return true when the attributes have different prefixes")
var internalSubset = async_test("isEqualNode should return true when only the internal subsets of DocumentTypes differ.")
var wait = 2;
function iframeLoaded() {
  if (!--wait) {
    internalSubset.step(function() {
      var doc1 = document.getElementById("subset1").contentDocument
      var doc2 = document.getElementById("subset2").contentDocument
      assert_true(doc1.doctype.isEqualNode(doc2.doctype), "doc1.doctype.isEqualNode(doc2.doctype)")
      assert_true(doc1.isEqualNode(doc2), "doc1.isEqualNode(doc2)")
    })
    internalSubset.done()
  }
}
</script>
<iframe id="subset1" onload="iframeLoaded()" src="Node-isEqualNode-iframe1.xml" />
<iframe id="subset2" onload="iframeLoaded()" src="Node-isEqualNode-iframe2.xml" />
</body>
</html>
