<!--
@license
Copyright (C) 2017 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-edit-file-controls</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-edit-file-controls></gr-edit-file-controls>
  </template>
</test-fixture>

<script type="module">
import '../../../test/common-test-setup.js';
import '../gr-edit-constants.js';
import './gr-edit-file-controls.js';
suite('gr-edit-file-controls tests', () => {
  let element;
  let sandbox;
  let fileActionHandler;

  setup(() => {
    sandbox = sinon.sandbox.create();
    element = fixture('basic');
    fileActionHandler = sandbox.stub();
    element.addEventListener('file-action-tap', fileActionHandler);
  });

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

  test('open tap emits event', () => {
    const actions = element.$.actions;
    element.filePath = 'foo';
    actions._open();
    flushAsynchronousOperations();

    MockInteractions.tap(actions.shadowRoot
        .querySelector('li [data-id="open"]'));
    assert.isTrue(fileActionHandler.called);
    assert.deepEqual(fileActionHandler.lastCall.args[0].detail,
        {action: GrEditConstants.Actions.OPEN.id, path: 'foo'});
  });

  test('delete tap emits event', () => {
    const actions = element.$.actions;
    element.filePath = 'foo';
    actions._open();
    flushAsynchronousOperations();

    MockInteractions.tap(actions.shadowRoot
        .querySelector('li [data-id="delete"]'));
    assert.isTrue(fileActionHandler.called);
    assert.deepEqual(fileActionHandler.lastCall.args[0].detail,
        {action: GrEditConstants.Actions.DELETE.id, path: 'foo'});
  });

  test('restore tap emits event', () => {
    const actions = element.$.actions;
    element.filePath = 'foo';
    actions._open();
    flushAsynchronousOperations();

    MockInteractions.tap(actions.shadowRoot
        .querySelector('li [data-id="restore"]'));
    assert.isTrue(fileActionHandler.called);
    assert.deepEqual(fileActionHandler.lastCall.args[0].detail,
        {action: GrEditConstants.Actions.RESTORE.id, path: 'foo'});
  });

  test('rename tap emits event', () => {
    const actions = element.$.actions;
    element.filePath = 'foo';
    actions._open();
    flushAsynchronousOperations();

    MockInteractions.tap(actions.shadowRoot
        .querySelector('li [data-id="rename"]'));
    assert.isTrue(fileActionHandler.called);
    assert.deepEqual(fileActionHandler.lastCall.args[0].detail,
        {action: GrEditConstants.Actions.RENAME.id, path: 'foo'});
  });

  test('computed properties', () => {
    assert.equal(element._allFileActions.length, 4);
  });
});
</script>
