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

<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.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-diff-highlight.html">

<script>void(0);</script>

<test-fixture id="basic">
  <template>
    <style>
      .tab-indicator:before {
        color: #C62828;
        /* >> character */
        content: '\00BB';
      }
    </style>
    <gr-diff-highlight>
      <table id="diffTable">

        <tbody class="section both">
           <tr class="diff-row side-by-side" left-type="both" right-type="both">
            <td class="left lineNum" data-value="1"></td>
            <td class="content both"><div class="contentText">[1] Nam cum ad me in Cumanum salutandi causa uterque venisset,</div></td>
            <td class="right lineNum" data-value="1"></td>
            <td class="content both"><div class="contentText">[1] Nam cum ad me in Cumanum salutandi causa uterque</div></td>
          </tr>
        </tbody>

        <tbody class="section delta">
          <tr class="diff-row side-by-side" left-type="remove" right-type="add">
            <td class="left lineNum" data-value="2"></td>
            <!-- Next tag is formatted to eliminate zero-length text nodes. -->
            <td class="content remove"><div class="contentText">na💢ti <hl class="foo">te, inquit</hl>, sumus <hl class="bar">aliquando</hl> otiosum, <hl>certe</hl> a <hl><span class="tab-indicator" style="tab-size:8;">	</span></hl>udiam, <hl>quid</hl> sit, <span class="tab-indicator" style="tab-size:8;">	</span>quod <hl>Epicurum</hl></div></td>
            <td class="right lineNum" data-value="2"></td>
            <!-- Next tag is formatted to eliminate zero-length text nodes. -->
            <td class="content add"><div class="contentText">nacti , <hl>,</hl> sumus <hl><span class="tab-indicator" style="tab-size:8;">	</span></hl> otiosum,  <span class="tab-indicator" style="tab-size:8;">	</span> audiam,  sit, quod</div></td>
          </tr>
        </tbody>


        <tbody class="section both">
          <tr class="diff-row side-by-side" left-type="both" right-type="both">
            <td class="left lineNum" data-value="138"></td>
            <td class="content both"><div class="contentText">[14] Nam cum ad me in Cumanum salutandi causa uterque venisset,</div></td>
            <td class="right lineNum" data-value="119"></td>
            <td class="content both"><div class="contentText">[14] Nam cum ad me in Cumanum salutandi causa uterque venisset,</div></td>
          </tr>
        </tbody>

        <tbody class="section delta">
          <tr class="diff-row side-by-side" left-type="remove" right-type="add">
            <td class="left lineNum" data-value="140"></td>
            <!-- Next tag is formatted to eliminate zero-length text nodes. -->
            <td class="content remove"><div class="contentText">na💢ti <hl class="foo">te, inquit</hl>, sumus <hl class="bar">aliquando</hl> otiosum, <hl>certe</hl> a <hl><span class="tab-indicator" style="tab-size:8;">	</span></hl>udiam, <hl>quid</hl> sit, <span class="tab-indicator" style="tab-size:8;">	</span>quod <hl>Epicurum</hl></div><gr-diff-comment-thread>
                [Yet another random diff thread content here]
              </gr-diff-comment-thread></td>
            <td class="right lineNum" data-value="120"></td>
            <!-- Next tag is formatted to eliminate zero-length text nodes. -->
            <td class="content add"><div class="contentText">nacti , <hl>,</hl> sumus <hl><span class="tab-indicator" style="tab-size:8;">	</span></hl> otiosum,  <span class="tab-indicator" style="tab-size:8;">	</span> audiam,  sit, quod</div></td>
          </tr>
        </tbody>

        <tbody class="section both">
          <tr class="diff-row side-by-side" left-type="both" right-type="both">
            <td class="left lineNum" data-value="141"></td>
            <td class="content both"><div class="contentText">nam et<hl><span class="tab-indicator" style="tab-size:8;">	</span></hl>complectitur<span class="tab-indicator" style="tab-size:8;">	</span>verbis, quod vult, et dicit plane, quod intellegam;</div></td>
            <td class="right lineNum" data-value="130"></td>
            <td class="content both"><div class="contentText">nam et complectitur verbis, quod vult, et dicit plane, quod intellegam;</div></td>
          </tr>
        </tbody>

        <tbody class="section contextControl">
          <tr class="diff-row side-by-side" left-type="contextControl" right-type="contextControl">
            <td class="left contextLineNum" data-value="@@"></td>
            <td>
              <gr-button>+10↑</gr-button>
              -
              <gr-button>Show 21 common lines</gr-button>
              -
              <gr-button>+10↓</gr-button>
            </td>
            <td class="right contextLineNum" data-value="@@"></td>
            <td>
              <gr-button>+10↑</gr-button>
              -
              <gr-button>Show 21 common lines</gr-button>
              -
              <gr-button>+10↓</gr-button>
            </td>
          </tr>
        </tbody>

        <tbody class="section delta total">
          <tr class="diff-row side-by-side" left-type="blank" right-type="add">
            <td class="left"></td>
            <td class="blank"></td>
            <td class="right lineNum" data-value="146"></td>
            <td class="content add"><div class="contentText">[17] Quid igitur est? inquit; audire enim cupio, quid non probes. Principio, inquam,</div></td>
          </tr>
        </tbody>

        <tbody class="section both">
          <tr class="diff-row side-by-side" left-type="both" right-type="both">
            <td class="left lineNum" data-value="165"></td>
            <td class="content both"><div class="contentText"></div></td>
            <td class="right lineNum" data-value="147"></td>
            <td class="content both"><div class="contentText">in physicis, <hl><span class="tab-indicator" style="tab-size:8;">	</span></hl> quibus maxime gloriatur, primum totus est alienus. Democritea dicit</div></td>
          </tr>
        </tbody>

      </table>
    </gr-diff-highlight>
  </template>
</test-fixture>

<test-fixture id="highlighted">
  <template>
    <div>
      <hl class="rangeHighlight">foo</hl>
      bar
      <hl class="rangeHighlight">baz</hl>
    </div>
  </template>
</test-fixture>

<script>
  suite('gr-diff-highlight', () => {
    let element;
    let sandbox;

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

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

    suite('selectionchange event handling', () => {
      const emulateSelection = function() {
        document.dispatchEvent(new CustomEvent('selectionchange'));
        element.flushDebouncer('selectionChange');
        element.flushDebouncer('removeActionBox');
      };

      setup(() => {
        sandbox.stub(element, '_handleSelection');
        sandbox.stub(element, '_removeActionBox');
      });

      test('enabled if logged in', () => {
        element.loggedIn = true;
        emulateSelection();
        assert.isTrue(element._handleSelection.called);
        assert.isTrue(element._removeActionBox.called);
      });

      test('ignored if logged out', () => {
        element.loggedIn = false;
        emulateSelection();
        assert.isFalse(element._handleSelection.called);
        assert.isFalse(element._removeActionBox.called);
      });
    });

    suite('comment events', () => {
      let builder;

      setup(() => {
        builder = {
          getContentsByLineRange: sandbox.stub().returns([]),
          getLineElByChild: sandbox.stub().returns({}),
          getSideByLineEl: sandbox.stub().returns('other-side'),
        };
        element._cachedDiffBuilder = builder;
      });

      test('comment-mouse-over from line comments is ignored', () => {
        sandbox.stub(element, 'set');
        element.fire('comment-mouse-over', {comment: {}});
        assert.isFalse(element.set.called);
      });

      test('comment-mouse-over from ranged comment causes set', () => {
        sandbox.stub(element, 'set');
        sandbox.stub(element, '_indexOfComment').returns(0);
        element.fire('comment-mouse-over', {comment: {range: {}}});
        assert.isTrue(element.set.called);
      });

      test('comment-mouse-out from line comments is ignored', () => {
        element.fire('comment-mouse-over', {comment: {}});
        assert.isFalse(builder.getContentsByLineRange.called);
      });

      test('on create-comment action box is removed', () => {
        sandbox.stub(element, '_removeActionBox');
        element.fire('create-comment', {
          comment: {
            range: {},
          },
        });
        assert.isTrue(element._removeActionBox.called);
      });
    });

    suite('selection', () => {
      let diff;
      let builder;
      let contentStubs;

      const stubContent = (line, side, opt_child) => {
        const contentTd = diff.querySelector(
            `.${side}.lineNum[data-value="${line}"] ~ .content`);
        const contentText = contentTd.querySelector('.contentText');
        const lineEl = diff.querySelector(
            `.${side}.lineNum[data-value="${line}"]`);
        contentStubs.push({
          lineEl,
          contentTd,
          contentText,
        });
        builder.getContentByLineEl.withArgs(lineEl).returns(contentText);
        builder.getLineNumberByChild.withArgs(lineEl).returns(line);
        builder.getContentByLine.withArgs(line, side).returns(contentText);
        builder.getSideByLineEl.withArgs(lineEl).returns(side);
        return contentText;
      };

      const emulateSelection = (startNode, startOffset, endNode, endOffset) => {
        const selection = window.getSelection();
        const range = document.createRange();
        range.setStart(startNode, startOffset);
        range.setEnd(endNode, endOffset);
        selection.addRange(range);
        element._handleSelection();
      };

      const getActionRange = () =>
        Polymer.dom(element.root).querySelector(
            'gr-selection-action-box').range;

      const getActionSide = () =>
        Polymer.dom(element.root).querySelector(
            'gr-selection-action-box').side;

      const getLineElByChild = node => {
        const stubs = contentStubs.find(stub => stub.contentTd.contains(node));
        return stubs && stubs.lineEl;
      };

      setup(() => {
        contentStubs = [];
        stub('gr-selection-action-box', {
          placeAbove: sandbox.stub(),
          placeBelow: sandbox.stub(),
        });
        diff = element.querySelector('#diffTable');
        builder = {
          getContentByLine: sandbox.stub(),
          getContentByLineEl: sandbox.stub(),
          getLineElByChild,
          getLineNumberByChild: sandbox.stub(),
          getSideByLineEl: sandbox.stub(),
        };
        element._cachedDiffBuilder = builder;
      });

      teardown(() => {
        contentStubs = null;
        window.getSelection().removeAllRanges();
      });

      test('single first line', () => {
        const content = stubContent(1, 'right');
        sandbox.spy(element, '_positionActionBox');
        emulateSelection(content.firstChild, 5, content.firstChild, 12);
        const actionBox = element.$$('gr-selection-action-box');
        assert.isTrue(actionBox.positionBelow);
      });

      test('multiline starting on first line', () => {
        const startContent = stubContent(1, 'right');
        const endContent = stubContent(2, 'right');
        sandbox.spy(element, '_positionActionBox');
        emulateSelection(
            startContent.firstChild, 10, endContent.lastChild, 7);
        const actionBox = element.$$('gr-selection-action-box');
        assert.isTrue(actionBox.positionBelow);
      });

      test('single line', () => {
        const content = stubContent(138, 'left');
        sandbox.spy(element, '_positionActionBox');
        emulateSelection(content.firstChild, 5, content.firstChild, 12);
        const actionBox = element.$$('gr-selection-action-box');
        assert.isTrue(element.isRangeSelected());
        assert.deepEqual(getActionRange(), {
          startLine: 138,
          startChar: 5,
          endLine: 138,
          endChar: 12,
        });
        assert.equal(getActionSide(), 'left');
        assert.notOk(actionBox.positionBelow);
      });

      test('multiline', () => {
        const startContent = stubContent(119, 'right');
        const endContent = stubContent(120, 'right');
        sandbox.spy(element, '_positionActionBox');
        emulateSelection(
            startContent.firstChild, 10, endContent.lastChild, 7);
        assert.isTrue(element.isRangeSelected());
        const actionBox = element.$$('gr-selection-action-box');

        assert.deepEqual(getActionRange(), {
          startLine: 119,
          startChar: 10,
          endLine: 120,
          endChar: 36,
        });
        assert.equal(getActionSide(), 'right');
        assert.notOk(actionBox.positionBelow);
      });

      test('multiple ranges aka firefox implementation', () => {
        const startContent = stubContent(119, 'right');
        const endContent = stubContent(120, 'right');

        const startRange = document.createRange();
        startRange.setStart(startContent.firstChild, 10);
        startRange.setEnd(startContent.firstChild, 11);

        const endRange = document.createRange();
        endRange.setStart(endContent.lastChild, 6);
        endRange.setEnd(endContent.lastChild, 7);

        const getRangeAtStub = sandbox.stub();
        getRangeAtStub
            .onFirstCall().returns(startRange)
            .onSecondCall().returns(endRange);
        sandbox.stub(window, 'getSelection').returns({
          rangeCount: 2,
          getRangeAt: getRangeAtStub,
          removeAllRanges: sandbox.stub(),
        });
        element._handleSelection();
        assert.isTrue(element.isRangeSelected());
        assert.deepEqual(getActionRange(), {
          startLine: 119,
          startChar: 10,
          endLine: 120,
          endChar: 36,
        });
      });

      test('multiline grow end highlight over tabs', () => {
        const startContent = stubContent(119, 'right');
        const endContent = stubContent(120, 'right');
        emulateSelection(startContent.firstChild, 10, endContent.firstChild, 2);
        assert.isTrue(element.isRangeSelected());
        assert.deepEqual(getActionRange(), {
          startLine: 119,
          startChar: 10,
          endLine: 120,
          endChar: 2,
        });
        assert.equal(getActionSide(), 'right');
      });

      test('collapsed', () => {
        const content = stubContent(138, 'left');
        emulateSelection(content.firstChild, 5, content.firstChild, 5);
        assert.isOk(window.getSelection().getRangeAt(0).startContainer);
        assert.isFalse(element.isRangeSelected());
      });

      test('starts inside hl', () => {
        const content = stubContent(140, 'left');
        const hl = content.querySelector('.foo');
        emulateSelection(hl.firstChild, 2, hl.nextSibling, 7);
        assert.isTrue(element.isRangeSelected());
        assert.deepEqual(getActionRange(), {
          startLine: 140,
          startChar: 8,
          endLine: 140,
          endChar: 23,
        });
        assert.equal(getActionSide(), 'left');
      });

      test('ends inside hl', () => {
        const content = stubContent(140, 'left');
        const hl = content.querySelector('.bar');
        emulateSelection(hl.previousSibling, 2, hl.firstChild, 3);
        assert.isTrue(element.isRangeSelected());
        assert.deepEqual(getActionRange(), {
          startLine: 140,
          startChar: 18,
          endLine: 140,
          endChar: 27,
        });
      });

      test('multiple hl', () => {
        const content = stubContent(140, 'left');
        const hl = content.querySelectorAll('hl')[4];
        emulateSelection(content.firstChild, 2, hl.firstChild, 2);
        assert.isTrue(element.isRangeSelected());
        assert.deepEqual(getActionRange(), {
          startLine: 140,
          startChar: 2,
          endLine: 140,
          endChar: 61,
        });
        assert.equal(getActionSide(), 'left');
      });

      test('starts outside of diff', () => {
        const contentText = stubContent(140, 'left');
        const contentTd = contentText.parentElement;

        emulateSelection(contentTd.previousElementSibling, 0,
            contentText.firstChild, 2);
        assert.isFalse(element.isRangeSelected());
      });

      test('ends outside of diff', () => {
        const content = stubContent(140, 'left');
        emulateSelection(content.nextElementSibling.firstChild, 2,
            content.firstChild, 2);
        assert.isFalse(element.isRangeSelected());
      });

      test('starts and ends on different sides', () => {
        const startContent = stubContent(140, 'left');
        const endContent = stubContent(130, 'right');
        emulateSelection(startContent.firstChild, 2, endContent.firstChild, 2);
        assert.isFalse(element.isRangeSelected());
      });

      test('starts in comment thread element', () => {
        const startContent = stubContent(140, 'left');
        const comment = startContent.parentElement.querySelector(
            'gr-diff-comment-thread');
        const endContent = stubContent(141, 'left');
        emulateSelection(comment.firstChild, 2, endContent.firstChild, 4);
        assert.isTrue(element.isRangeSelected());
        assert.deepEqual(getActionRange(), {
          startLine: 140,
          startChar: 83,
          endLine: 141,
          endChar: 4,
        });
        assert.equal(getActionSide(), 'left');
      });

      test('ends in comment thread element', () => {
        const content = stubContent(140, 'left');
        const comment = content.parentElement.querySelector(
            'gr-diff-comment-thread');
        emulateSelection(content.firstChild, 4, comment.firstChild, 1);
        assert.isTrue(element.isRangeSelected());
        assert.deepEqual(getActionRange(), {
          startLine: 140,
          startChar: 4,
          endLine: 140,
          endChar: 83,
        });
        assert.equal(getActionSide(), 'left');
      });

      test('starts in context element', () => {
        const contextControl =
            diff.querySelector('.contextControl').querySelector('gr-button');
        const content = stubContent(146, 'right');
        emulateSelection(contextControl, 0, content.firstChild, 7);
        // TODO (viktard): Select nearest line.
        assert.isFalse(element.isRangeSelected());
      });

      test('ends in context element', () => {
        const contextControl =
            diff.querySelector('.contextControl').querySelector('gr-button');
        const content = stubContent(141, 'left');
        emulateSelection(content.firstChild, 2, contextControl, 1);
        // TODO (viktard): Select nearest line.
        assert.isFalse(element.isRangeSelected());
      });

      test('selection containing context element', () => {
        const startContent = stubContent(130, 'right');
        const endContent = stubContent(146, 'right');
        emulateSelection(startContent.firstChild, 3, endContent.firstChild, 14);
        assert.isTrue(element.isRangeSelected());
        assert.deepEqual(getActionRange(), {
          startLine: 130,
          startChar: 3,
          endLine: 146,
          endChar: 14,
        });
        assert.equal(getActionSide(), 'right');
      });

      test('ends at a tab', () => {
        const content = stubContent(140, 'left');
        emulateSelection(
            content.firstChild, 1, content.querySelector('span'), 0);
        assert.isTrue(element.isRangeSelected());
        assert.deepEqual(getActionRange(), {
          startLine: 140,
          startChar: 1,
          endLine: 140,
          endChar: 51,
        });
        assert.equal(getActionSide(), 'left');
      });

      test('starts at a tab', () => {
        const content = stubContent(140, 'left');
        emulateSelection(
            content.querySelectorAll('hl')[3], 0,
            content.querySelectorAll('span')[1].nextSibling, 1);
        assert.isTrue(element.isRangeSelected());
        assert.deepEqual(getActionRange(), {
          startLine: 140,
          startChar: 51,
          endLine: 140,
          endChar: 71,
        });
        assert.equal(getActionSide(), 'left');
      });

      test('properly accounts for syntax highlighting', () => {
        const content = stubContent(140, 'left');
        const spy = sinon.spy(element, '_normalizeRange');
        emulateSelection(
            content.querySelectorAll('hl')[3], 0,
            content.querySelectorAll('span')[1], 0);
        const spyCall = spy.getCall(0);
        const range = window.getSelection().getRangeAt(0);
        assert.notDeepEqual(spyCall.returnValue, range);
      });

      test('GrRangeNormalizer._getTextOffset computes text offset', () => {
        let content = stubContent(140, 'left');
        let child = content.lastChild.lastChild;
        let result = GrRangeNormalizer._getTextOffset(content, child);
        assert.equal(result, 75);
        content = stubContent(146, 'right');
        child = content.lastChild;
        result = GrRangeNormalizer._getTextOffset(content, child);
        assert.equal(result, 0);
      });

      test('_fixTripleClickSelection', () => {
        const startContent = stubContent(119, 'right');
        const endContent = stubContent(120, 'right');
        emulateSelection(startContent.firstChild, 0, endContent.firstChild, 0);
        assert.isTrue(element.isRangeSelected());
        assert.deepEqual(getActionRange(), {
          startLine: 119,
          startChar: 0,
          endLine: 119,
          endChar: element._getLength(startContent),
        });
        assert.equal(getActionSide(), 'right');
      });

      test('_fixTripleClickSelection empty line', () => {
        const startContent = stubContent(146, 'right');
        const endContent = stubContent(165, 'left');
        emulateSelection(startContent.firstChild, 0,
            endContent.parentElement.previousElementSibling, 0);
        assert.isTrue(element.isRangeSelected());
        assert.deepEqual(getActionRange(), {
          startLine: 146,
          startChar: 0,
          endLine: 146,
          endChar: 84,
        });
        assert.equal(getActionSide(), 'right');
      });
    });
  });
</script>
