<!DOCTYPE html>
<!--
@license
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-confirm-rebase-dialog</title>

<script src="/node_modules/@webcomponents/webcomponentsjs/custom-elements-es5-adapter.js"></script>

<script src="/node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
<script src="/components/wct-browser-legacy/browser.js"></script>

<test-fixture id="basic">
  <template>
    <gr-confirm-rebase-dialog></gr-confirm-rebase-dialog>
  </template>
</test-fixture>

<script type="module">
import '../../../test/common-test-setup.js';
import './gr-confirm-rebase-dialog.js';
suite('gr-confirm-rebase-dialog tests', () => {
  let element;
  let sandbox;

  setup(() => {
    element = fixture('basic');
    sandbox = sinon.sandbox.create();
  });

  teardown(() => {
    sandbox.restore();
  });

  test('controls with parent and rebase on current available', () => {
    element.rebaseOnCurrent = true;
    element.hasParent = true;
    flushAsynchronousOperations();
    assert.isTrue(element.$.rebaseOnParentInput.checked);
    assert.isFalse(element.$.rebaseOnParent.hasAttribute('hidden'));
    assert.isTrue(element.$.parentUpToDateMsg.hasAttribute('hidden'));
    assert.isFalse(element.$.rebaseOnTip.hasAttribute('hidden'));
    assert.isTrue(element.$.tipUpToDateMsg.hasAttribute('hidden'));
  });

  test('controls with parent rebase on current not available', () => {
    element.rebaseOnCurrent = false;
    element.hasParent = true;
    flushAsynchronousOperations();
    assert.isTrue(element.$.rebaseOnTipInput.checked);
    assert.isTrue(element.$.rebaseOnParent.hasAttribute('hidden'));
    assert.isFalse(element.$.parentUpToDateMsg.hasAttribute('hidden'));
    assert.isFalse(element.$.rebaseOnTip.hasAttribute('hidden'));
    assert.isTrue(element.$.tipUpToDateMsg.hasAttribute('hidden'));
  });

  test('controls without parent and rebase on current available', () => {
    element.rebaseOnCurrent = true;
    element.hasParent = false;
    flushAsynchronousOperations();
    assert.isTrue(element.$.rebaseOnTipInput.checked);
    assert.isTrue(element.$.rebaseOnParent.hasAttribute('hidden'));
    assert.isTrue(element.$.parentUpToDateMsg.hasAttribute('hidden'));
    assert.isFalse(element.$.rebaseOnTip.hasAttribute('hidden'));
    assert.isTrue(element.$.tipUpToDateMsg.hasAttribute('hidden'));
  });

  test('controls without parent rebase on current not available', () => {
    element.rebaseOnCurrent = false;
    element.hasParent = false;
    flushAsynchronousOperations();
    assert.isTrue(element.$.rebaseOnOtherInput.checked);
    assert.isTrue(element.$.rebaseOnParent.hasAttribute('hidden'));
    assert.isTrue(element.$.parentUpToDateMsg.hasAttribute('hidden'));
    assert.isTrue(element.$.rebaseOnTip.hasAttribute('hidden'));
    assert.isFalse(element.$.tipUpToDateMsg.hasAttribute('hidden'));
  });

  test('input cleared on cancel or submit', () => {
    element._text = '123';
    element.$.confirmDialog.dispatchEvent(
        new CustomEvent('confirm', {
          composed: true, bubbles: true,
        }));
    assert.equal(element._text, '');

    element._text = '123';
    element.$.confirmDialog.dispatchEvent(
        new CustomEvent('cancel', {
          composed: true, bubbles: true,
        }));
    assert.equal(element._text, '');
  });

  test('_getSelectedBase', () => {
    element._text = '5fab321c';
    element.$.rebaseOnParentInput.checked = true;
    assert.equal(element._getSelectedBase(), null);
    element.$.rebaseOnParentInput.checked = false;
    element.$.rebaseOnTipInput.checked = true;
    assert.equal(element._getSelectedBase(), '');
    element.$.rebaseOnTipInput.checked = false;
    assert.equal(element._getSelectedBase(), element._text);
    element._text = '101: Test';
    assert.equal(element._getSelectedBase(), '101');
  });

  suite('parent suggestions', () => {
    let recentChanges;
    setup(() => {
      recentChanges = [
        {
          name: '123: my first awesome change',
          value: 123,
        },
        {
          name: '124: my second awesome change',
          value: 124,
        },
        {
          name: '245: my third awesome change',
          value: 245,
        },
      ];

      sandbox.stub(element.$.restAPI, 'getChanges').returns(Promise.resolve(
          [
            {
              _number: 123,
              subject: 'my first awesome change',
            },
            {
              _number: 124,
              subject: 'my second awesome change',
            },
            {
              _number: 245,
              subject: 'my third awesome change',
            },
          ]
      ));
    });

    test('_getRecentChanges', () => {
      sandbox.spy(element, '_getRecentChanges');
      return element._getRecentChanges()
          .then(() => {
            assert.deepEqual(element._recentChanges, recentChanges);
            assert.equal(element.$.restAPI.getChanges.callCount, 1);
            // When called a second time, should not re-request recent changes.
            element._getRecentChanges();
          })
          .then(() => {
            assert.equal(element._getRecentChanges.callCount, 2);
            assert.equal(element.$.restAPI.getChanges.callCount, 1);
          });
    });

    test('_filterChanges', () => {
      assert.equal(element._filterChanges('123', recentChanges).length, 1);
      assert.equal(element._filterChanges('12', recentChanges).length, 2);
      assert.equal(element._filterChanges('awesome', recentChanges).length,
          3);
      assert.equal(element._filterChanges('third', recentChanges).length,
          1);

      element.changeNumber = 123;
      assert.equal(element._filterChanges('123', recentChanges).length, 0);
      assert.equal(element._filterChanges('124', recentChanges).length, 1);
      assert.equal(element._filterChanges('awesome', recentChanges).length,
          2);
    });

    test('input text change triggers function', () => {
      sandbox.spy(element, '_getRecentChanges');
      element.$.parentInput.noDebounce = true;
      MockInteractions.pressAndReleaseKeyOn(
          element.$.parentInput.$.input,
          13,
          null,
          'enter');
      element._text = '1';
      assert.isTrue(element._getRecentChanges.calledOnce);
      element._text = '12';
      assert.isTrue(element._getRecentChanges.calledTwice);
    });
  });
});
</script>
