<!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>GrDiffBuilderUnified</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"/>
<script src="../../../scripts/util.js"></script>
<script src="../gr-diff/gr-diff-line.js"></script>
<script src="../gr-diff/gr-diff-group.js"></script>
<script src="../gr-diff-highlight/gr-annotation.js"></script>
<script src="gr-diff-builder.js"></script>
<script src="gr-diff-builder-unified.js"></script>

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

<script>
  suite('GrDiffBuilderUnified tests', () => {
    let prefs;
    let outputEl;
    let diffBuilder;

    setup(()=> {
      prefs = {
        line_length: 10,
        show_tabs: true,
        tab_size: 4,
      };
      outputEl = document.createElement('div');
      diffBuilder = new GrDiffBuilderUnified({}, prefs, outputEl, []);
    });

    suite('buildSectionElement for BOTH group', () => {
      let lines;
      let group;

      setup(() => {
        lines = [
          new GrDiffLine(GrDiffLine.Type.BOTH, 1, 2),
          new GrDiffLine(GrDiffLine.Type.BOTH, 2, 3),
          new GrDiffLine(GrDiffLine.Type.BOTH, 3, 4),
        ];
        lines[0].text = 'def hello_world():';
        lines[1].text = '  print "Hello World";';
        lines[2].text = '  return True';

        group = new GrDiffGroup(GrDiffGroup.Type.BOTH, lines);
      });

      test('creates the section', () => {
        const sectionEl = diffBuilder.buildSectionElement(group);
        assert.isTrue(sectionEl.classList.contains('section'));
        assert.isTrue(sectionEl.classList.contains('both'));
      });

      test('creates each unchanged row once', () => {
        const sectionEl = diffBuilder.buildSectionElement(group);
        const rowEls = sectionEl.querySelectorAll('.diff-row');

        assert.equal(rowEls.length, 3);

        assert.equal(
            rowEls[0].querySelector('.lineNum.left').textContent,
            lines[0].beforeNumber);
        assert.equal(
            rowEls[0].querySelector('.lineNum.right').textContent,
            lines[0].afterNumber);
        assert.equal(
            rowEls[0].querySelector('.content').textContent, lines[0].text);

        assert.equal(
            rowEls[1].querySelector('.lineNum.left').textContent,
            lines[1].beforeNumber);
        assert.equal(
            rowEls[1].querySelector('.lineNum.right').textContent,
            lines[1].afterNumber);
        assert.equal(
            rowEls[1].querySelector('.content').textContent, lines[1].text);

        assert.equal(
            rowEls[2].querySelector('.lineNum.left').textContent,
            lines[2].beforeNumber);
        assert.equal(
            rowEls[2].querySelector('.lineNum.right').textContent,
            lines[2].afterNumber);
        assert.equal(
            rowEls[2].querySelector('.content').textContent, lines[2].text);
      });
    });

    suite('buildSectionElement for DELTA group', () => {
      let lines;
      let group;

      setup(() => {
        lines = [
          new GrDiffLine(GrDiffLine.Type.REMOVE, 1),
          new GrDiffLine(GrDiffLine.Type.REMOVE, 2),
          new GrDiffLine(GrDiffLine.Type.ADD, 2),
          new GrDiffLine(GrDiffLine.Type.ADD, 3),
        ];
        lines[0].text = 'def hello_world():';
        lines[1].text = '  print "Hello World"';
        lines[2].text = 'def hello_universe()';
        lines[3].text = '  print "Hello Universe"';

        group = new GrDiffGroup(GrDiffGroup.Type.DELTA, lines);
      });

      test('creates the section', () => {
        const sectionEl = diffBuilder.buildSectionElement(group);
        assert.isTrue(sectionEl.classList.contains('section'));
        assert.isTrue(sectionEl.classList.contains('delta'));
      });

      test('creates the section with class if ignoredWhitespaceOnly', () => {
        group.ignoredWhitespaceOnly = true;
        const sectionEl = diffBuilder.buildSectionElement(group);
        assert.isTrue(sectionEl.classList.contains('ignoredWhitespaceOnly'));
      });

      test('creates the section with class if dueToRebase', () => {
        group.dueToRebase = true;
        const sectionEl = diffBuilder.buildSectionElement(group);
        assert.isTrue(sectionEl.classList.contains('dueToRebase'));
      });

      test('creates first the removed and then the added rows', () => {
        const sectionEl = diffBuilder.buildSectionElement(group);
        const rowEls = sectionEl.querySelectorAll('.diff-row');

        assert.equal(rowEls.length, 4);

        assert.equal(
            rowEls[0].querySelector('.lineNum.left').textContent,
            lines[0].beforeNumber);
        assert.isNotOk(rowEls[0].querySelector('.lineNum.right'));
        assert.equal(
            rowEls[0].querySelector('.content').textContent, lines[0].text);

        assert.equal(
            rowEls[1].querySelector('.lineNum.left').textContent,
            lines[1].beforeNumber);
        assert.isNotOk(rowEls[1].querySelector('.lineNum.right'));
        assert.equal(
            rowEls[1].querySelector('.content').textContent, lines[1].text);

        assert.isNotOk(rowEls[2].querySelector('.lineNum.left'));
        assert.equal(
            rowEls[2].querySelector('.lineNum.right').textContent,
            lines[2].afterNumber);
        assert.equal(
            rowEls[2].querySelector('.content').textContent, lines[2].text);

        assert.isNotOk(rowEls[3].querySelector('.lineNum.left'));
        assert.equal(
            rowEls[3].querySelector('.lineNum.right').textContent,
            lines[3].afterNumber);
        assert.equal(
            rowEls[3].querySelector('.content').textContent, lines[3].text);
      });

      test('creates only the added rows if only ignored whitespace', () => {
        group.ignoredWhitespaceOnly = true;
        const sectionEl = diffBuilder.buildSectionElement(group);
        const rowEls = sectionEl.querySelectorAll('.diff-row');

        assert.equal(rowEls.length, 2);

        assert.isNotOk(rowEls[0].querySelector('.lineNum.left'));
        assert.equal(
            rowEls[0].querySelector('.lineNum.right').textContent,
            lines[2].afterNumber);
        assert.equal(
            rowEls[0].querySelector('.content').textContent, lines[2].text);

        assert.isNotOk(rowEls[1].querySelector('.lineNum.left'));
        assert.equal(
            rowEls[1].querySelector('.lineNum.right').textContent,
            lines[3].afterNumber);
        assert.equal(
            rowEls[1].querySelector('.content').textContent, lines[3].text);
      });
    });
  });
</script>
