public void testCalculateModifiedRanges() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView, view, 10, null);
JsArrayInteger rows = JavaScriptObject.createArray().cast();
// Empty set of rows.
assertListContains(presenter.calculateModifiedRanges(rows, 0, 10));
// One row in range.
rows.push(5);
assertListContains(presenter.calculateModifiedRanges(rows, 0, 10), new Range(5, 1));
// One row not in range.
assertListContains(presenter.calculateModifiedRanges(rows, 6, 10));
// Consecutive rows (should return only one range).
rows.push(6);
rows.push(7);
rows.push(8);
assertListContains(presenter.calculateModifiedRanges(rows, 0, 10), new Range(5, 4));
// Disjoint rows. Should return two ranges.
rows.push(10);
rows.push(11);
assertListContains(presenter.calculateModifiedRanges(rows, 0, 20), new Range(5, 4), new Range(
10, 2));
// Multiple gaps. The largest gap should be between the two ranges.
rows.push(15);
rows.push(17);
assertListContains(presenter.calculateModifiedRanges(rows, 0, 20), new Range(5, 7), new Range(
15, 3));
}