<html>
<link rel="import" href="../resources/chai.html" />
<link rel="import" href="../resources/mocha.html" />
<script>
describe('MutationObserver.observe on childList', function() {
  it('should handle basic observation', function(done) {
    var div;
    var observer;
    var mutations;
    var removedDiv1, removedDiv2;

    function start() {
      div = document.createElement('div');
      observer = new MutationObserver(function(m) {
        mutations = m;
      });

      observer.observe(div, { childList: true });
      removedDiv1 = div.appendChild(document.createElement('div'));
      setTimeout(checkDisconnectAndMutate, 0);
    }

    function checkDisconnectAndMutate() {
      // ...can childList changes be observed at all.

      assert.equal(mutations.length, 1);
      assert.equal(mutations[0].type, "childList");
      assert.equal(mutations[0].addedNodes.length, 1);
      assert.equal(mutations[0].addedNodes[0], removedDiv1);

      mutations = null;
      observer.disconnect();
      removedDiv1 = div.appendChild(document.createElement('div'));
      setTimeout(checkNotDeliveredAndMutateMultiple, 0);
    }

    function checkNotDeliveredAndMutateMultiple() {
      // ...observer.disconnect() should prevent further delivery of mutations.

      assert.equal(mutations, null);
      observer.observe(div, { childList: true });
      removedDiv1 = div.removeChild(div.firstChild);
      removedDiv2 = div.removeChild(div.firstChild);
      setTimeout(finish);
    }

    function finish() {
      // ...re-observing after disconnect works with the same observer.

      assert.equal(mutations.length, 2);
      assert.equal(mutations[0].type, "childList");
      assert.equal(mutations[0].removedNodes.length, 1);
      assert.equal(mutations[0].removedNodes[0], removedDiv1);
      assert.equal(mutations[1].type, "childList");
      assert.equal(mutations[1].removedNodes.length, 1);
      assert.equal(mutations[1].removedNodes[0], removedDiv2);
      observer.disconnect();
      done();
    }

    start();
  });

  it('should handle observing without specifying "childList" does not result in hearing about childList changes', function(done) {
    var div;
    var observer;
    var mutations;

    function start() {
      div = document.createElement('div');
      observer = new MutationObserver(function(m) {
        mutations = m;
      });

      observer.observe(div, { attributes: true, characterData: true });
      div.appendChild(document.createElement('div'));
      setTimeout(finish, 0);
    }

    function finish() {
      assert.equal(mutations, null);
      observer.disconnect();
      done();
    }

    start();
  });

  it('should handle re-observing the same node with the same observer has the effect of resetting the options', function(done) {
    var div;
    var observer;
    var mutations;
    var calls = 0;

    function start() {
      div = document.createElement('div');
      observer = new MutationObserver(function(m) {
        mutations = m;
        calls++;
      });

      observer.observe(div, { childList: true, characterData: true });
      observer.observe(div, { childList: true });
      div.appendChild(document.createElement('div'));
      setTimeout(checkDisconnectAndMutate, 0);
    }

    function checkDisconnectAndMutate() {
      assert.equal(calls, 1);
      assert.equal(mutations.length, 1);
      assert.equal(mutations[0].type, "childList");
      mutations = null;
      observer.observe(div, { childList: true, characterData: true });
      observer.observe(div, { attributes: true });
      div.appendChild(document.createElement('div'));
      setTimeout(finish, 0);
    }

    function finish() {
      assert.equal(mutations, null);
      observer.disconnect();
      done();
    }

    start();
  });

  it('should handle multiple observers can be registered to a given node and both receive mutations', function(done) {
    var div;
    var observer;
    var observer2;
    var mutations;
    var mutations2;

    function start() {
      div = document.createElement('div');
      observer = new MutationObserver(function(m) {
        mutations = m;
      });
      observer2 = new MutationObserver(function(m) {
        mutations2 = m;
      });
      observer.observe(div, { childList: true });
      observer2.observe(div, { childList: true });
      div.appendChild(document.createElement('div'));
      setTimeout(finish, 0);
    }

    function finish() {
      assert.equal(mutations.length, 1);
      assert.equal(mutations[0].type, "childList");
      assert.equal(mutations2.length, 1);
      assert.equal(mutations2[0].type, "childList");
      observer.disconnect();
      observer2.disconnect();
      done();
    }

    start();
  });

  it('should create minimal mutations for replaceChild', function(done) {
    var div;
    var observer;
    var fragment;
    var mutations;
    var addedDiv1;
    var addedDiv2;
    var removedDiv1;

    function start() {
      div = document.createElement('div');

      var first = document.createElement('span');
      first.textContent = 'Foo';
      div.appendChild(first);

      var second = document.createElement('div');
      second.textContent = 'Bar';
      div.appendChild(second);

      removedDiv1 = div.firstChild;

      observer = new MutationObserver(function(m) {
        mutations = m;
      });

      observer.observe(div, { childList: true });
      addedDiv1 = document.createElement('div');
      div.replaceChild(addedDiv1, div.firstChild);
      setTimeout(checkReplaceWithNode, 0);
    }

    function checkReplaceWithNode() {
      // ...simple replace child

      assert.equal(mutations.length, 1);
      assert.equal(mutations[0].type, "childList");
      assert.equal(mutations[0].addedNodes.length, 1);
      assert.equal(mutations[0].addedNodes[0], addedDiv1);
      assert.equal(mutations[0].removedNodes.length, 1);
      assert.equal(mutations[0].removedNodes[0], removedDiv1);

      mutations = null;
      fragment = document.createDocumentFragment();
      addedDiv1 = fragment.appendChild(document.createElement('div'));
      addedDiv2 = fragment.appendChild(document.createElement('div'));
      removedDiv1 = div.firstChild;

      div.replaceChild(fragment, removedDiv1);

      setTimeout(finish, 0);
    }

    function finish() {
      // ...replace with DocumentFragment.

      assert.equal(mutations.length, 1);
      assert.equal(mutations[0].type, "childList");
      assert.equal(mutations[0].addedNodes.length, 2);
      assert.equal(mutations[0].addedNodes[0], addedDiv1);
      assert.equal(mutations[0].addedNodes[1], addedDiv2);
      assert.equal(mutations[0].removedNodes.length, 1);
      assert.equal(mutations[0].removedNodes[0], removedDiv1);

      observer.disconnect();
      done();
    }

    start();
  });

  it('should create minimal mutations for insertBefore', function(done) {
    var div;
    var observer;
    var fragment;
    var mutations;
    var addedDiv1;
    var addedDiv2;

    function start() {
      div = document.createElement('div');

      var first = document.createElement('span');
      first.textContent = 'Foo';
      div.appendChild(first);

      fragment = document.createDocumentFragment();
      addedDiv1 = fragment.appendChild(document.createElement('div'));
      addedDiv2 = fragment.appendChild(document.createElement('div'));

      observer = new MutationObserver(function(m) {
        mutations = m;
      });

      observer.observe(div, { childList: true });
      div.insertBefore(fragment, div.firstChild);
      setTimeout(finish, 0);
    }


    function finish() {
      assert.equal(mutations.length, 1);
      assert.equal(mutations[0].type, "childList");
      assert.equal(mutations[0].addedNodes.length, 2);
      assert.equal(mutations[0].addedNodes[0], addedDiv1);
      assert.equal(mutations[0].addedNodes[1], addedDiv2);
      assert.equal(mutations[0].removedNodes.length, 0);

      observer.disconnect();
      done();
    }

    start();
  });

  it('should create minimal mutations for appendChild', function(done) {
    var div;
    var observer;
    var fragment;
    var mutations;
    var addedDiv1;
    var addedDiv2;

    function start() {
      div = document.createElement('div');

      var first = document.createElement('span');
      first.textContent = 'Foo';
      div.appendChild(first);

      fragment = document.createDocumentFragment();
      addedDiv1 = fragment.appendChild(document.createElement('div'));
      addedDiv2 = fragment.appendChild(document.createElement('div'));

      observer = new MutationObserver(function(m) {
        mutations = m;
      });

      observer.observe(div, { childList: true });
      div.appendChild(fragment);
      setTimeout(finish, 0);
    }

    function finish() {
      assert.equal(mutations.length, 1);
      assert.equal(mutations[0].type, "childList");
      assert.equal(mutations[0].addedNodes.length, 2);
      assert.equal(mutations[0].addedNodes[0], addedDiv1);
      assert.equal(mutations[0].addedNodes[1], addedDiv2);
      assert.equal(mutations[0].removedNodes.length, 0);

      observer.disconnect();
      done();
    }

    start();
  });
});
</script>
</body>
</html>
