<!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>keyboard-shortcut-behavior</title>
<script src="/test/common-test-setup.js"></script>
<script src="/bower_components/webcomponentsjs/custom-elements-es5-adapter.js"></script>

<script src="/bower_components/webcomponentsjs/webcomponents-lite.js"></script>
<script src="/bower_components/web-component-tester/browser.js"></script>
<link rel="import" href="../../test/common-test-setup.html"/>
<link rel="import" href="gr-change-table-behavior.html">

<test-fixture id="basic">
  <template>
    <test-element></test-element>
  </template>
</test-fixture>

<test-fixture id="within-overlay">
  <template>
    <gr-overlay>
      <test-element></test-element>
    </gr-overlay>
  </template>
</test-fixture>

<script>
  suite('gr-change-table-behavior tests', () => {
    let element;
    // eslint-disable-next-line no-unused-vars
    let overlay;

    suiteSetup(() => {
      // Define a Polymer element that uses this behavior.
      Polymer({
        is: 'test-element',
        behaviors: [Gerrit.ChangeTableBehavior],
      });
    });

    setup(() => {
      element = fixture('basic');
      overlay = fixture('within-overlay');
    });

    test('getComplementColumns', () => {
      let columns = [
        'Subject',
        'Status',
        'Owner',
        'Assignee',
        'Repo',
        'Branch',
        'Updated',
        'Size',
      ];
      assert.deepEqual(element.getComplementColumns(columns), []);

      columns = [
        'Subject',
        'Status',
        'Assignee',
        'Repo',
        'Branch',
        'Size',
      ];
      assert.deepEqual(element.getComplementColumns(columns),
          ['Owner', 'Updated']);
    });

    test('isColumnHidden', () => {
      const columnToCheck = 'Repo';
      let columnsToDisplay = [
        'Subject',
        'Status',
        'Owner',
        'Assignee',
        'Repo',
        'Branch',
        'Updated',
        'Size',
      ];
      assert.isFalse(element.isColumnHidden(columnToCheck, columnsToDisplay));

      columnsToDisplay = [
        'Subject',
        'Status',
        'Owner',
        'Assignee',
        'Branch',
        'Updated',
        'Size',
      ];
      assert.isTrue(element.isColumnHidden(columnToCheck, columnsToDisplay));
    });

    test('getVisibleColumns maps Project to Repo', () => {
      const columns = [
        'Subject',
        'Status',
        'Owner',
      ];
      assert.deepEqual(element.getVisibleColumns(columns), columns.slice(0));
      assert.deepEqual(
          element.getVisibleColumns(columns.concat(['Project'])),
          columns.slice(0).concat(['Repo']));
    });
  });
</script>
