Merge "Upgrades and tests for GrDiffBuilder utility methods"
This commit is contained in:
		@@ -142,10 +142,7 @@ limitations under the License.
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        getContentByLine: function(lineNumber, opt_side, opt_root) {
 | 
			
		||||
          var root = Polymer.dom(opt_root || this.diffElement);
 | 
			
		||||
          var sideSelector = !!opt_side ? ('.' + opt_side) : '';
 | 
			
		||||
          return root.querySelector('td.lineNum[data-value="' + lineNumber +
 | 
			
		||||
              '"]' + sideSelector + ' ~ td.content .contentText');
 | 
			
		||||
          return this._builder.getContentByLine(lineNumber, opt_side, opt_root);
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        getContentByLineEl: function(lineEl) {
 | 
			
		||||
@@ -162,19 +159,10 @@ limitations under the License.
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        getContentsByLineRange: function(startLine, endLine, opt_side) {
 | 
			
		||||
          var groups =
 | 
			
		||||
              this._builder.getGroupsByLineRange(startLine, endLine, opt_side);
 | 
			
		||||
          // In each group, search Element for lines in range.
 | 
			
		||||
          return groups.reduce((function(acc, group) {
 | 
			
		||||
            for (var line = startLine; line <= endLine; line++) {
 | 
			
		||||
              var content =
 | 
			
		||||
                  this.getContentByLine(line, opt_side, group.element);
 | 
			
		||||
              if (content) {
 | 
			
		||||
                acc.push(content);
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
            return acc;
 | 
			
		||||
          }).bind(this), []);
 | 
			
		||||
          var result = [];
 | 
			
		||||
          this._builder.findLinesByRange(startLine, endLine, opt_side, null,
 | 
			
		||||
              result);
 | 
			
		||||
          return result;
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        getCommentThreadByLine: function(lineNumber, opt_side, opt_root) {
 | 
			
		||||
 
 | 
			
		||||
@@ -109,6 +109,66 @@
 | 
			
		||||
    return groups;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  GrDiffBuilder.prototype.getContentByLine = function(lineNumber, opt_side,
 | 
			
		||||
      opt_root) {
 | 
			
		||||
    var root = Polymer.dom(opt_root || this._outputEl);
 | 
			
		||||
    var sideSelector = !!opt_side ? ('.' + opt_side) : '';
 | 
			
		||||
    return root.querySelector('td.lineNum[data-value="' + lineNumber +
 | 
			
		||||
        '"]' + sideSelector + ' ~ td.content .contentText');
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Find line elements or line objects by a range of line numbers and a side.
 | 
			
		||||
   *
 | 
			
		||||
   * @param {Number} start The first line number
 | 
			
		||||
   * @param {Number} end The last line number
 | 
			
		||||
   * @param {String} opt_side The side of the range. Either 'left' or 'right'.
 | 
			
		||||
   * @param {Array<GrDiffLine>} out_lines The output list of line objects. Use
 | 
			
		||||
   *     null if not desired.
 | 
			
		||||
   * @param  {Array<HTMLElement>} out_elements The output list of line elements.
 | 
			
		||||
   *     Use null if not desired.
 | 
			
		||||
   */
 | 
			
		||||
  GrDiffBuilder.prototype.findLinesByRange = function(start, end, opt_side,
 | 
			
		||||
      out_lines, out_elements) {
 | 
			
		||||
    var groups = this.getGroupsByLineRange(start, end, opt_side);
 | 
			
		||||
 | 
			
		||||
    groups.forEach(function(group) {
 | 
			
		||||
      group.lines.forEach(function(line) {
 | 
			
		||||
        if ((opt_side === 'left' && line.type === GrDiffLine.Type.ADD) ||
 | 
			
		||||
            (opt_side === 'right' && line.type === GrDiffLine.Type.REMOVE)) {
 | 
			
		||||
          return;
 | 
			
		||||
        }
 | 
			
		||||
        var lineNumber = opt_side === 'left' ?
 | 
			
		||||
            line.beforeNumber : line.afterNumber;
 | 
			
		||||
        if (lineNumber < start || lineNumber > end) { return; }
 | 
			
		||||
 | 
			
		||||
        if (out_lines) { out_lines.push(line); }
 | 
			
		||||
        if (out_elements) {
 | 
			
		||||
          var content = this.getContentByLine(lineNumber, opt_side,
 | 
			
		||||
              group.element);
 | 
			
		||||
          if (content) { out_elements.push(content); }
 | 
			
		||||
        }
 | 
			
		||||
      }.bind(this));
 | 
			
		||||
    }.bind(this));
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Re-renders the DIV.contentText alement for the given side and range of diff
 | 
			
		||||
   * content.
 | 
			
		||||
   */
 | 
			
		||||
  GrDiffBuilder.prototype._renderContentByRange = function(start, end, side) {
 | 
			
		||||
    var lines = [];
 | 
			
		||||
    var elements = [];
 | 
			
		||||
    var line;
 | 
			
		||||
    var el;
 | 
			
		||||
    this.findLinesByRange(start, end, side, lines, elements);
 | 
			
		||||
    for (var i = 0; i < lines.length; i++) {
 | 
			
		||||
      line = lines[i];
 | 
			
		||||
      el = elements[i];
 | 
			
		||||
      el.parentElement.replaceChild(this._createTextEl(line).firstChild, el);
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  GrDiffBuilder.prototype.getSectionsByLineRange = function(
 | 
			
		||||
      startLine, endLine, opt_side) {
 | 
			
		||||
    return this.getGroupsByLineRange(startLine, endLine, opt_side).map(
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,9 @@ limitations under the License.
 | 
			
		||||
<script src="../gr-diff/gr-diff-line.js"></script>
 | 
			
		||||
<script src="../gr-diff/gr-diff-group.js"></script>
 | 
			
		||||
<script src="gr-diff-builder.js"></script>
 | 
			
		||||
<script src="../../../scripts/util.js"></script>
 | 
			
		||||
 | 
			
		||||
<link rel="import" href="../gr-diff-cursor/mock-diff-response_test.html">
 | 
			
		||||
<link rel="import" href="gr-diff-builder.html">
 | 
			
		||||
 | 
			
		||||
<test-fixture id="basic">
 | 
			
		||||
@@ -40,6 +42,14 @@ limitations under the License.
 | 
			
		||||
  </template>
 | 
			
		||||
</test-fixture>
 | 
			
		||||
 | 
			
		||||
<test-fixture id="mock-diff">
 | 
			
		||||
  <template>
 | 
			
		||||
    <gr-diff-builder view-mode="SIDE_BY_SIDE">
 | 
			
		||||
      <table id="diffTable"></table>
 | 
			
		||||
    </gr-diff-builder>
 | 
			
		||||
  </template>
 | 
			
		||||
</test-fixture>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
  suite('gr-diff-builder tests', function() {
 | 
			
		||||
    var element;
 | 
			
		||||
@@ -476,5 +486,83 @@ limitations under the License.
 | 
			
		||||
        assert.strictEqual(sections[1], section[1]);
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    suite('mock-diff', function() {
 | 
			
		||||
      var element;
 | 
			
		||||
      var builder;
 | 
			
		||||
      var diff;
 | 
			
		||||
 | 
			
		||||
      setup(function(done) {
 | 
			
		||||
        element = fixture('mock-diff');
 | 
			
		||||
        diff = document.createElement('mock-diff-response').diffResponse;
 | 
			
		||||
 | 
			
		||||
        var prefs = {
 | 
			
		||||
          line_length: 80,
 | 
			
		||||
          show_tabs: true,
 | 
			
		||||
          tab_size: 4,
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        function doneHandler() {
 | 
			
		||||
          element.removeEventListener('render', doneHandler);
 | 
			
		||||
          builder = element._builder;
 | 
			
		||||
          done();
 | 
			
		||||
        }
 | 
			
		||||
        element.addEventListener('render', doneHandler);
 | 
			
		||||
 | 
			
		||||
        element.render(diff, {left: [], right: []}, prefs);
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      test('getContentByLine', function() {
 | 
			
		||||
        var actual;
 | 
			
		||||
 | 
			
		||||
        actual = builder.getContentByLine(2, 'left');
 | 
			
		||||
        assert.equal(actual.textContent, diff.content[0].ab[1]);
 | 
			
		||||
 | 
			
		||||
        actual = builder.getContentByLine(2, 'right');
 | 
			
		||||
        assert.equal(actual.textContent, diff.content[0].ab[1]);
 | 
			
		||||
 | 
			
		||||
        actual = builder.getContentByLine(5, 'left');
 | 
			
		||||
        assert.equal(actual.textContent, diff.content[2].ab[0]);
 | 
			
		||||
 | 
			
		||||
        actual = builder.getContentByLine(5, 'right');
 | 
			
		||||
        assert.equal(actual.textContent, diff.content[1].b[0]);
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      test('findLinesByRange', function() {
 | 
			
		||||
        var lines = [];
 | 
			
		||||
        var elems = [];
 | 
			
		||||
        var start = 6;
 | 
			
		||||
        var end = 10;
 | 
			
		||||
        var count = end - start + 1;
 | 
			
		||||
 | 
			
		||||
        builder.findLinesByRange(start, end, 'right', lines, elems);
 | 
			
		||||
 | 
			
		||||
        assert.equal(lines.length, count);
 | 
			
		||||
        assert.equal(elems.length, count);
 | 
			
		||||
 | 
			
		||||
        for (var i = 0; i < 5; i++) {
 | 
			
		||||
          assert.instanceOf(lines[i], GrDiffLine);
 | 
			
		||||
          assert.equal(lines[i].afterNumber, start + i);
 | 
			
		||||
          assert.instanceOf(elems[i], HTMLElement);
 | 
			
		||||
          assert.equal(lines[i].text, elems[i].textContent);
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      test('_renderContentByRange', function() {
 | 
			
		||||
        var spy = sinon.spy(builder, '_createTextEl');
 | 
			
		||||
        var start = 9;
 | 
			
		||||
        var end = 14;
 | 
			
		||||
        var count = end - start + 1;
 | 
			
		||||
 | 
			
		||||
        builder._renderContentByRange(start, end, 'left');
 | 
			
		||||
 | 
			
		||||
        assert.equal(spy.callCount, count);
 | 
			
		||||
        spy.getCalls().forEach(function(call, i) {
 | 
			
		||||
          assert.equal(call.args[0].beforeNumber, start + i);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        spy.restore();
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user