<sky>
<import src="../resources/chai.sky" />
<import src="../resources/mocha.sky" />
<import src="../resources/test-element.sky" as="TestElement" />
<import src="/sky/framework/sky-element/sky-element.sky" as="SkyElement" />

<div id="sandbox"></div>

<test-element id="parser-element" checked="true" size="10" name="foo bar" />

<sky-element name="test-element-parent">
  <template>
    <test-element size="{{ size }}" />
  </template>
  <script>
    (class extends SkyElement {
      created() {
        this.size = 10;
      }
    }).register();
  </script>
</sky-element>

<test-element-parent id="parent" />

<script>
describe("SkyElement", function() {
  var element;
  var sandbox = document.getElementById("sandbox");

  beforeEach(function() {
    element = new TestElement();
  });
  afterEach(function() {
    element.remove();
  });

  it("should stamp when the element is inserted", function() {
    assert.isNull(element.shadowRoot);
    sandbox.appendChild(element);
    assert.instanceOf(element.shadowRoot, ShadowRoot);
    assert.ok(element.shadowRoot.getElementById("inside"));
  });

  it("should update isAttached when inserting", function() {
    assert.isFalse(element.isAttached);
    sandbox.appendChild(element);
    assert.isTrue(element.isAttached);
    element.remove();
    assert.isFalse(element.isAttached);
  });

  it("should handle parser created elements with attributes", function() {
    var element = document.getElementById("parser-element");
    assert.isTrue(element.checked);
    assert.isNumber(element.size);
    assert.equal(element.size, 10);
    assert.isString(element.name);
    assert.equal(element.name, "foo bar");
  });

  it("should have defaults for all attributes", function() {
    var element = new TestElement();
    assert.isFalse(element.checked);
    assert.isNumber(element.size);
    assert.equal(element.size, 0);
    assert.isString(element.name);
    assert.equal(element.name, "");
  });

  it("should call change callbacks", function() {
    var element = new TestElement();
    element.size = 20;
    element.name = "first name";
    element.checked = true;
    element.size = 10;
    element.name = "second name";
    assert.deepEqual(element.changes, [
      { name: 'size', oldValue: 0, newValue: 20 },
      { name: 'name', oldValue: "", newValue: "first name" },
      { name: 'checked', oldValue: false, newValue: true },
      { name: 'size', oldValue: 20, newValue: 10 },
      { name: 'name', oldValue: "first name", newValue: "second name" },
    ]);
  });

  it("should convert boolean reflected attributes", function() {
    var element = new TestElement();
    assert.isFalse(element.checked);
    element.checked = null;
    assert.isFalse(element.checked);
    element.checked = "true";
    assert.isTrue(element.checked);
    element.checked = "false";
    assert.isFalse(element.checked);
    element.checked = {};
    assert.isTrue(element.checked);
  });

  it("should convert string reflected attributes", function() {
    var element = new TestElement();
    assert.equal(element.name, "");
    element.name = null;
    assert.equal(element.name, "");
    element.name = [1, 2];
    assert.equal(element.name, "1,2");
    element.name = false;
    assert.equal(element.name, "false");
    element.name = {};
    assert.equal(element.name, "[object Object]");
    element.name = "";
    assert.equal(element.name, "");
  });

  it("should convert number reflected attributes", function() {
    var element = new TestElement();
    assert.isNumber(element.size);
    element.size = 20;
    assert.isNumber(element.size);
    assert.equal(element.size, 20);
    element.size = "08";
    assert.equal(element.size, 8);
    element.size = " 30 ";
    assert.equal(element.size, 30);
    element.size = "1.5";
    assert.isNumber(element.size);
    assert.equal(element.size, 1.5);
    element.size = "false";
    assert.isTrue(isNaN(element.size));
    element.size = {};
    assert.isTrue(isNaN(element.size));
  });

  it("should connect data binding", function(done) {
    sandbox.appendChild(element);
    var inside = element.shadowRoot.getElementById("inside");
    Promise.resolve().then(function() {
      assert.equal(inside.textContent, 10);
      assert.equal(inside.lang, 10);
      element.value = 20;
    }).then(function() {
      assert.equal(inside.textContent, 20);
      assert.equal(inside.lang, 20);
      done();
    }).catch(function(e) {
      done(e);
    });
  });

  it("should two way bind attributes", function(done) {
    sandbox.appendChild(element);
    var checkbox = element.shadowRoot.getElementById("checkbox");
    assert.isFalse(checkbox.checked);
    assert.isFalse(element.checked);
    element.checked = true;
    assert.isTrue(element.checked);
    assert.isFalse(checkbox.checked);
    Promise.resolve().then(function() {
      assert.isTrue(checkbox.checked);
      checkbox.checked = false;
      assert.isFalse(checkbox.checked);
      return Promise.resolve().then(function() {
        assert.isFalse(element.checked);
        assert.isFalse(checkbox.checked);
        checkbox.checked = true;
        assert.isTrue(checkbox.checked);
        return Promise.resolve().then(function() {
          assert.isTrue(element.checked);
          element.checked = true;
          assert.isTrue(element.checked);
          assert.isTrue(checkbox.checked);
          element.checked = false;
          assert.isFalse(element.checked);
          assert.isTrue(checkbox.checked);
          return Promise.resolve().then(function() {
            assert.isFalse(checkbox.checked);
            assert.isFalse(element.checked);
            done();
          });
        });
      });
    }).catch(function(e) {
      done(e);
    });
  });

  it("should connect template event handlers", function() {
    sandbox.appendChild(element);
    var inside = element.shadowRoot.getElementById("inside");
    inside.dispatchEvent(new CustomEvent("wrong-event"));
    assert.isNull(element.lastEvent);
    var event = new CustomEvent("test-event");
    inside.dispatchEvent(event);
    assert.equal(element.lastEvent, event);
  });

  it("should connect host event handlers", function() {
    sandbox.appendChild(element);
    element.dispatchEvent(new CustomEvent("wrong-event"));
    assert.isNull(element.lastEvent);
    var event = new CustomEvent("host-event");
    element.dispatchEvent(event);
    assert.equal(element.lastEvent, event);
  });

  it("should not call attributeChanged for binding expression values", function() {
    var parent = document.getElementById('parent');
    var element = parent.shadowRoot.querySelector('test-element');
    assert.deepEqual(element.changes, [
      { name: 'size', oldValue: 0, newValue: 10 },
    ]);
  });

  it("should call shadowRootReady after creating the template instance", function() {
    assert.equal(element.shadowRootReadyCount, 0);
    sandbox.appendChild(element);
    assert.equal(element.shadowRootReadyCount, 1);
    element.remove();
    sandbox.appendChild(element);
    assert.equal(element.shadowRootReadyCount, 1);
  });
});
</script>
</sky>
