<!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-diff-selection</title>

<script src="../../../bower_components/webcomponentsjs/webcomponents.min.js"></script>
<script src="../../../bower_components/web-component-tester/browser.js"></script>

<link rel="import" href="../../../bower_components/iron-test-helpers/iron-test-helpers.html">
<link rel="import" href="gr-diff-selection.html">

<test-fixture id="basic">
  <template>
    <gr-diff-selection>
      <table>
        <tr>
          <td class="lineNum left">1</td>
          <td class="content">ba ba</td>
          <td class="lineNum right">1</td>
          <td class="content">some other text</td>
        </tr>
        <tr>
          <td class="lineNum left">2</td>
          <td class="content">zin</td>
          <td class="lineNum right">2</td>
          <td class="content">more more more</td>
        </tr>
        <tr>
          <td class="lineNum left">2</td>
          <td class="content">ga ga</td>
          <td class="lineNum right">3</td>
          <td class="other">some other text</td>
        </tr>
      </table>
    </gr-diff-selection>
  </template>
</test-fixture>

<script>
  suite('gr-diff-selection', function() {
    var element;

    var emulateCopyOn = function(target) {
      var fakeEvent = {
        target: target,
        preventDefault: sinon.stub(),
        clipboardData: {
          setData: sinon.stub(),
        },
      };
      element._handleCopy(fakeEvent);
      return fakeEvent;
    };

    setup(function() {
      element = fixture('basic');
      element._cachedDiffBuilder = {
        getLineElByChild: sinon.stub().returns({}),
        getSideByLineEl: sinon.stub(),
      };
    });

    test('applies selected-left on left side click', function() {
      element.classList.add('selected-right');
      element._cachedDiffBuilder.getSideByLineEl.returns('left');
      MockInteractions.down(element);
      assert.isTrue(
          element.classList.contains('selected-left'), 'adds selected-left');
      assert.isFalse(
          element.classList.contains('selected-right'),
          'removes selected-right');
    });

    test('applies selected-right on right side click', function() {
      element.classList.add('selected-left');
      element._cachedDiffBuilder.getSideByLineEl.returns('right');
      MockInteractions.down(element);
      assert.isTrue(
          element.classList.contains('selected-right'), 'adds selected-right');
      assert.isFalse(
          element.classList.contains('selected-left'), 'removes selected-left');
    });

    test('ignores copy for non-content Element', function() {
      sinon.stub(element, '_getSelectedText');
      emulateCopyOn(element.querySelector('.other'));
      assert.isFalse(element._getSelectedText.called);
    });

    test('asks for text for right side Elements', function() {
      element._cachedDiffBuilder.getSideByLineEl.returns('left');
      sinon.stub(element, '_getSelectedText');
      emulateCopyOn(element.querySelector('td.content'));
      assert.deepEqual(['left'], element._getSelectedText.lastCall.args);
    });

    test('reacts to copy for content Elements', function() {
      sinon.stub(element, '_getSelectedText');
      emulateCopyOn(element.querySelector('td.content'));
      assert.isTrue(element._getSelectedText.called);
    });

    test('copy event is prevented for content Elements', function() {
      sinon.stub(element, '_getSelectedText');
      var event = emulateCopyOn(element.querySelector('td.content'));
      assert.isTrue(event.preventDefault.called);
    });

    test('inserts text into clipboard on copy', function() {
      sinon.stub(element, '_getSelectedText').returns('the text');
      var event = emulateCopyOn(element.querySelector('td.content'));
      assert.deepEqual(
          ['Text', 'the text'], event.clipboardData.setData.lastCall.args);
    });

    test('copies content correctly', function() {
      element.classList.add('selected-left');
      var selection = window.getSelection();
      var range = document.createRange();
      range.setStart(element.querySelector('td.content').firstChild, 3);
      range.setEnd(
          element.querySelectorAll('td.content')[4].firstChild, 2);
      selection.addRange(range);
      assert.equal('ba\nzin\nga\n', element._getSelectedText('left'));
    });
  });
</script>
