package com.bitmonlab.osiris.commons.map.model.geojson; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import math.geom2d.Point2D; import math.geom2d.polygon.LinearRing2D; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import com.bitmonlab.osiris.commons.map.model.geojson.LineString; //@RunWith(PowerMockRunner.class) @RunWith(MockitoJUnitRunner.class) @PrepareForTest({LineString.class, LinearRing2D.class, Collection.class, ArrayList.class, Point2D.class}) public class LineStringTest { @InjectMocks LineString lineString; @Mock ArrayList<Point2D> points; @Mock List<Double> coord; //@Mock //List<List<Double>> coordinates; @Mock Iterator<List<Double>> iteratorCoordinates; @Mock LinearRing2D linearRing2D; @Mock BigDecimal xc; @Mock BigDecimal yc; @Mock BigDecimal tmp; @Mock BigDecimal xp; @Mock BigDecimal yp; @Mock BigDecimal x; @Mock BigDecimal y; @Mock BigDecimal xpmuly; @Mock BigDecimal ypmuly; @Mock BigDecimal area; @Mock BigDecimal prevx; @Mock BigDecimal prevy; @Mock BigDecimal pointx; @Mock BigDecimal pointy; @Mock BigDecimal subtractxy; @Mock BigDecimal denom; @Mock BigDecimal xdivide; @Mock BigDecimal ydivide; @Mock Point2D prev; @Mock Point2D point; @Mock ArrayList<Point2D> vertices; @Mock Iterator<Point2D> iteratorVertices; @Test public void calculateCentroid_centroidPointsNONull() throws Exception{ ArrayList<Double> centroid=null; int n = 4; //vertex number int m = n - 1; //previous vertex double dxprev = 2.0D; double dyprev = 1.0D; double dxpoint = 1.0D; double dypoint = 2.0D; //double coord0 = 8.0D; //double coord1 = 3.0D; BigDecimal BDtwo = new BigDecimal(2.0D); BigDecimal BDsix = new BigDecimal(6.0D); List<List<Double>> coordinates = new ArrayList<List<Double>>(); List<Double> list1 = new ArrayList<Double>(); list1.add(1.0D); list1.add(2.0D); coordinates.add(list1); List<Double> list2 = new ArrayList<Double>(); list2.add(2.0D); list2.add(2.0D); coordinates.add(list2); List<Double> list3 = new ArrayList<Double>(); list3.add(2.0D); list3.add(1.0D); coordinates.add(list3); List<Double> list4 = new ArrayList<Double>(); list4.add(1.0D); list4.add(1.0D); coordinates.add(list4); lineString.setCoordinates(coordinates); //Fixture PowerMockito.whenNew(ArrayList.class).withNoArguments().thenReturn(points); //loop coordinates //Mockito.when(coordinates.iterator()).thenReturn(iteratorCoordinates); //Mockito.when(iteratorCoordinates.hasNext()).thenReturn(true).thenReturn(true).thenReturn(false); //Mockito.when(iteratorCoordinates.next()).thenReturn(coord); //Mockito.when(coord.get(0)).thenReturn(coord0); //Mockito.when(coord.get(1)).thenReturn(coord1); //PowerMockito.whenNew(Point2D.class).withArguments(coord0, coord1).thenReturn(point); PowerMockito.whenNew(LinearRing2D.class).withArguments(points).thenReturn(linearRing2D); //* computeCentroid */ PowerMockito.whenNew(BigDecimal.class).withArguments(0.0D).thenReturn(xc); PowerMockito.whenNew(BigDecimal.class).withArguments(0.0D).thenReturn(yc); PowerMockito.whenNew(BigDecimal.class).withArguments(0.0D).thenReturn(tmp); Mockito.when(linearRing2D.vertexNumber()).thenReturn(n); Mockito.when(linearRing2D.vertex(m)).thenReturn(prev); Mockito.when(prev.x()).thenReturn(dxprev); Mockito.when(prev.y()).thenReturn(dyprev); PowerMockito.whenNew(BigDecimal.class).withArguments(dxprev).thenReturn(xp); PowerMockito.whenNew(BigDecimal.class).withArguments(dyprev).thenReturn(yp); //* loop vertex Mockito.when(vertices.iterator()).thenReturn(iteratorVertices); Mockito.when(iteratorVertices.hasNext()).thenReturn(true).thenReturn(false); Mockito.when(iteratorVertices.next()).thenReturn(point); Mockito.when(point.x()).thenReturn(dxpoint); Mockito.when(point.y()).thenReturn(dypoint); PowerMockito.whenNew(BigDecimal.class).withArguments(dxpoint).thenReturn(x); PowerMockito.whenNew(BigDecimal.class).withArguments(dypoint).thenReturn(y); Mockito.when(xp.multiply(x)).thenReturn(xpmuly); Mockito.when(yp.multiply(y)).thenReturn(ypmuly); //* compute area */ PowerMockito.whenNew(BigDecimal.class).withArguments(0.0D).thenReturn(area); Mockito.when(linearRing2D.vertexNumber()).thenReturn(n); Mockito.when(linearRing2D.vertex(m)).thenReturn(prev); //loop vertex Mockito.when(vertices.iterator()).thenReturn(iteratorVertices); Mockito.when(iteratorVertices.hasNext()).thenReturn(true).thenReturn(false); Mockito.when(iteratorVertices.next()).thenReturn(point); PowerMockito.whenNew(BigDecimal.class).withArguments(dxprev).thenReturn(prevx); PowerMockito.whenNew(BigDecimal.class).withArguments(dyprev).thenReturn(prevy); PowerMockito.whenNew(BigDecimal.class).withArguments(dxpoint).thenReturn(pointx); PowerMockito.whenNew(BigDecimal.class).withArguments(dypoint).thenReturn(pointy); Mockito.when(prevx.multiply(pointy)).thenReturn(xpmuly); Mockito.when(prevy.multiply(pointx)).thenReturn(ypmuly); Mockito.when(xpmuly.subtract(ypmuly)).thenReturn(subtractxy); Mockito.when(area.add(subtractxy)).thenReturn(area); PowerMockito.whenNew(BigDecimal.class).withArguments(dxprev).thenReturn(prevx); Mockito.when(area.divide(BDtwo, 4096, RoundingMode.HALF_UP)).thenReturn(denom); Mockito.when(denom.multiply(BDsix)).thenReturn(denom); //if area in computeCentroid Mockito.when(denom.compareTo(BigDecimal.ZERO)).thenReturn(1); PowerMockito.whenNew(ArrayList.class).withNoArguments().thenReturn(centroid); Mockito.when(xc.divide(denom, 32, RoundingMode.HALF_UP)).thenReturn(xdivide); Mockito.when(yc.divide(denom, 32, RoundingMode.HALF_UP)).thenReturn(ydivide); //if centroidPoint null? //Experimentation lineString.calculateCentroid(); //Expectation Assert.assertTrue("Centroids points must be 1.5,1.5", lineString.getCentroid().get(0).equals(1.5D) && lineString.getCentroid().get(1).equals(1.5D)); } @Test public void calculateCentroid_centroidPointsNull() throws Exception{ int n = 4; //vertex number int m = n - 1; //previous vertex double dxprev = 2.0D; double dyprev = 1.0D; double dxpoint = 1.0D; double dypoint = 2.0D; BigDecimal BDtwo = new BigDecimal(2.0D); BigDecimal BDsix = new BigDecimal(6.0D); List<List<Double>> coordinates = new ArrayList<List<Double>>(); List<Double> list1 = new ArrayList<Double>(); list1.add(1.0D); list1.add(1.0D); coordinates.add(list1); lineString.setCoordinates(coordinates); //Fixture PowerMockito.whenNew(ArrayList.class).withNoArguments().thenReturn(points); PowerMockito.whenNew(LinearRing2D.class).withArguments(points).thenReturn(linearRing2D); //* computeCentroid */ PowerMockito.whenNew(BigDecimal.class).withArguments(0.0D).thenReturn(xc); PowerMockito.whenNew(BigDecimal.class).withArguments(0.0D).thenReturn(yc); PowerMockito.whenNew(BigDecimal.class).withArguments(0.0D).thenReturn(tmp); Mockito.when(linearRing2D.vertexNumber()).thenReturn(n); Mockito.when(linearRing2D.vertex(m)).thenReturn(prev); Mockito.when(prev.x()).thenReturn(dxprev); Mockito.when(prev.y()).thenReturn(dyprev); PowerMockito.whenNew(BigDecimal.class).withArguments(dxprev).thenReturn(xp); PowerMockito.whenNew(BigDecimal.class).withArguments(dyprev).thenReturn(yp); //* loop vertex Mockito.when(vertices.iterator()).thenReturn(iteratorVertices); Mockito.when(iteratorVertices.hasNext()).thenReturn(true).thenReturn(false); Mockito.when(iteratorVertices.next()).thenReturn(point); Mockito.when(point.x()).thenReturn(dxpoint); Mockito.when(point.y()).thenReturn(dypoint); PowerMockito.whenNew(BigDecimal.class).withArguments(dxpoint).thenReturn(x); PowerMockito.whenNew(BigDecimal.class).withArguments(dypoint).thenReturn(y); Mockito.when(xp.multiply(x)).thenReturn(xpmuly); Mockito.when(yp.multiply(y)).thenReturn(ypmuly); //* compute area */ PowerMockito.whenNew(BigDecimal.class).withArguments(0.0D).thenReturn(area); Mockito.when(linearRing2D.vertexNumber()).thenReturn(n); Mockito.when(linearRing2D.vertex(m)).thenReturn(prev); //loop vertex Mockito.when(vertices.iterator()).thenReturn(iteratorVertices); Mockito.when(iteratorVertices.hasNext()).thenReturn(true).thenReturn(false); Mockito.when(iteratorVertices.next()).thenReturn(point); PowerMockito.whenNew(BigDecimal.class).withArguments(dxprev).thenReturn(prevx); PowerMockito.whenNew(BigDecimal.class).withArguments(dyprev).thenReturn(prevy); PowerMockito.whenNew(BigDecimal.class).withArguments(dxpoint).thenReturn(pointx); PowerMockito.whenNew(BigDecimal.class).withArguments(dypoint).thenReturn(pointy); Mockito.when(prevx.multiply(pointy)).thenReturn(xpmuly); Mockito.when(prevy.multiply(pointx)).thenReturn(ypmuly); Mockito.when(xpmuly.subtract(ypmuly)).thenReturn(subtractxy); Mockito.when(area.add(subtractxy)).thenReturn(area); PowerMockito.whenNew(BigDecimal.class).withArguments(dxprev).thenReturn(prevx); Mockito.when(area.divide(BDtwo, 4096, RoundingMode.HALF_UP)).thenReturn(denom); Mockito.when(denom.multiply(BDsix)).thenReturn(denom); //if area in computeCentroid Mockito.when(denom.compareTo(BigDecimal.ZERO)).thenReturn(1); //Experimentation lineString.calculateCentroid(); //Expectation Assert.assertTrue("Centroids points must be null", lineString.getCentroid() == null ); } }