<!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="../../bower_components/webcomponentsjs/webcomponents.min.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',
        _legacyUndefinedCheck: true,
        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>
