<!DOCTYPE html>
<!--
Copyright (C) 2016 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
<title>gr-editable-label</title>

<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
<script src="../../../bower_components/web-component-tester/browser.js"></script>
<script src="../../../bower_components/iron-test-helpers/mock-interactions.js"></script>

<link rel="import" href="gr-editable-label.html">

<script>void(0);</script>

<test-fixture id="basic">
  <template>
    <gr-editable-label
        value="value text"
        placeholder="label text"></gr-editable-label>
  </template>
</test-fixture>

<test-fixture id="read-only">
  <template>
    <gr-editable-label
        read-only
        value="value text"
        placeholder="label text"></gr-editable-label>
  </template>
</test-fixture>

<script>
  suite('gr-editable-label tests', () => {
    let element;
    let input;
    let label;

    setup(() => {
      element = fixture('basic');

      input = element.$$('input');
      label = element.$$('label');
    });

    test('element render', () => {
      // The input is hidden and the label is visible:
      assert.isNotNull(input.getAttribute('hidden'));
      assert.isNull(label.getAttribute('hidden'));

      assert.isTrue(label.classList.contains('editable'));

      assert.equal(label.textContent, 'value text');

      MockInteractions.tap(label);

      Polymer.dom.flush();

      // The input is visible and the label is hidden:
      assert.isNull(input.getAttribute('hidden'));
      assert.isNotNull(label.getAttribute('hidden'));

      assert.equal(input.value, 'value text');
    });

    test('edit value', done => {
      const editedStub = sinon.stub();
      element.addEventListener('changed', editedStub);

      MockInteractions.tap(label);

      Polymer.dom.flush();

      element._inputText = 'new text';

      assert.isFalse(editedStub.called);

      element.async(() => {
        assert.isTrue(editedStub.called);
        assert.equal(input.value, 'new text');
        done();
      });

      // Press enter:
      MockInteractions.keyDownOn(input, 13);
    });
  });

  suite('gr-editable-label read-only tests', () => {
    let element;
    let input;
    let label;

    setup(() => {
      element = fixture('read-only');

      input = element.$$('input');
      label = element.$$('label');
    });

    test('disallows edit when read-only', () => {
      // The input is hidden and the label is visible:
      assert.isNotNull(input.getAttribute('hidden'));
      assert.isNull(label.getAttribute('hidden'));

      MockInteractions.tap(label);

      Polymer.dom.flush();

      // The input is still hidden and the label is still visible:
      assert.isNotNull(input.getAttribute('hidden'));
      assert.isNull(label.getAttribute('hidden'));
    });

    test('label is not marked as editable', () => {
      assert.isFalse(label.classList.contains('editable'));
    });
  });
</script>
