Browse Source

Fix Range.restrictTo to work with non-intersecting ranges(#13334)

Also adds a special case for isSubsetOf with two empty ranges.

Change-Id: I9b4c854051bd760bbac05c7a0bc2e5418371e90e
tags/7.4.0.beta1^2
Teemu Suo-Anttila 9 years ago
parent
commit
c1c3564717

+ 1
- 0
client/src/com/vaadin/client/data/AbstractRemoteDataSource.java View File



private Range getMinCacheRange() { private Range getMinCacheRange() {
Range availableDataRange = getAvailableRangeForCache(); Range availableDataRange = getAvailableRangeForCache();

Range minCacheRange = cacheStrategy.getMinCacheRange( Range minCacheRange = cacheStrategy.getMinCacheRange(
requestedAvailability, cached, availableDataRange); requestedAvailability, cached, availableDataRange);



+ 11
- 3
shared/src/com/vaadin/shared/ui/grid/Range.java View File

* range * range
*/ */
public boolean isSubsetOf(final Range other) { public boolean isSubsetOf(final Range other) {
if (isEmpty() && other.isEmpty()) {
return true;
}

return other.getStart() <= getStart() && getEnd() <= other.getEnd(); return other.getStart() <= getStart() && getEnd() <= other.getEnd();
} }


* @return a bounded range * @return a bounded range
*/ */
public Range restrictTo(Range bounds) { public Range restrictTo(Range bounds) {
boolean startWithin = getStart() >= bounds.getStart();
boolean endWithin = getEnd() <= bounds.getEnd();
boolean startWithin = bounds.contains(getStart());
boolean endWithin = bounds.contains(getEnd());
boolean boundsWithin = getStart() < bounds.getStart()
&& getEnd() >= bounds.getEnd();


if (startWithin) { if (startWithin) {
if (endWithin) { if (endWithin) {
} else { } else {
if (endWithin) { if (endWithin) {
return Range.between(bounds.getStart(), getEnd()); return Range.between(bounds.getStart(), getEnd());
} else {
} else if (boundsWithin) {
return bounds; return bounds;
} else {
return Range.withLength(getStart(), 0);
} }
} }
} }

+ 19
- 0
shared/tests/src/com/vaadin/shared/ui/grid/RangeTest.java View File

assertTrue(r2 == r3); assertTrue(r2 == r3);
} }


@Test
public void restrictTo_notInterstecting() { public void restrictTo_notInterstecting() {
Range r1 = Range.between(5, 10); Range r1 = Range.between(5, 10);
Range r2 = Range.between(15, 20); Range r2 = Range.between(15, 20);
r4.isEmpty()); r4.isEmpty());
} }


@Test
public void restrictTo_startOutside() { public void restrictTo_startOutside() {
Range r1 = Range.between(5, 10); Range r1 = Range.between(5, 10);
Range r2 = Range.between(7, 15); Range r2 = Range.between(7, 15);
Range r3 = r1.restrictTo(r2); Range r3 = r1.restrictTo(r2);


assertEquals(Range.between(7, 10), r3); assertEquals(Range.between(7, 10), r3);

assertEquals(r2.restrictTo(r1), r3);
} }


@Test
public void restrictTo_endOutside() { public void restrictTo_endOutside() {
Range r1 = Range.between(5, 10); Range r1 = Range.between(5, 10);
Range r2 = Range.between(4, 7); Range r2 = Range.between(4, 7);
Range r3 = r1.restrictTo(r2); Range r3 = r1.restrictTo(r2);


assertEquals(Range.between(5, 7), r3); assertEquals(Range.between(5, 7), r3);

assertEquals(r2.restrictTo(r1), r3);
}

@Test
public void restrictTo_empty() {
Range r1 = Range.between(5, 10);
Range r2 = Range.between(0, 0);

Range r3 = r1.restrictTo(r2);
assertTrue(r3.isEmpty());

Range r4 = r2.restrictTo(r1);
assertTrue(r4.isEmpty());
} }


} }

+ 17
- 2
uitest/src/com/vaadin/tests/components/grid/basicfeatures/server/GridStructureTest.java View File

import java.util.List; import java.util.List;


import org.junit.Test; import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException; import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebElement; import org.openqa.selenium.WebElement;


import com.vaadin.testbench.By;
import com.vaadin.testbench.TestBenchElement; import com.vaadin.testbench.TestBenchElement;
import com.vaadin.testbench.elements.GridElement; import com.vaadin.testbench.elements.GridElement;
import com.vaadin.testbench.elements.GridElement.GridCellElement; import com.vaadin.testbench.elements.GridElement.GridCellElement;
public void testItemSetChangeEvent() throws Exception { public void testItemSetChangeEvent() throws Exception {
openTestURL(); openTestURL();


final By newRow = By.xpath("//td[text()='newcell: 0']");
final org.openqa.selenium.By newRow = By
.xpath("//td[text()='newcell: 0']");


assertTrue("Unexpected initial state", !isElementPresent(newRow)); assertTrue("Unexpected initial state", !isElementPresent(newRow));


assertEquals("Grid scrolled unexpectedly", cellContent, cell.getText()); assertEquals("Grid scrolled unexpectedly", cellContent, cell.getText());
} }


@Test
public void testScrollAndRemoveAll() {
setDebug(true);
openTestURL();

getGridElement().scrollToRow(500);
selectMenuPath("Component", "Body rows", "Remove all rows");

assertFalse("Error notification was present after removing all rows",
isElementPresent(NotificationElement.class));

assertFalse(getGridElement().isElementPresent(By.vaadin("#cell[0][0]")));
}

private void assertPrimaryStylename(String stylename) { private void assertPrimaryStylename(String stylename) {
assertTrue(getGridElement().getAttribute("class").contains(stylename)); assertTrue(getGridElement().getAttribute("class").contains(stylename));



Loading…
Cancel
Save