/*
* The MIT License (MIT)
*
* Copyright (c) 2015 Reinventing Geospatial, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package com.rgi.geopackage.features.geometry.z;
import com.rgi.geopackage.features.ByteOutputStream;
import com.rgi.geopackage.features.Contents;
import com.rgi.geopackage.features.GeometryType;
import org.junit.Test;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.Collection;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
/**
* @author Luke Lambert
*/
public class WkbPolygonZTest
{
/**
* Test the constructor
*/
@Test
@SuppressWarnings("JUnitTestMethodWithNoAssertions")
public void constructor()
{
new WkbPolygonZ(new LinearRingZ(new CoordinateZ(1.0, 0.0, 0.0),
new CoordinateZ(0.0, 1.0, 0.0),
new CoordinateZ(1.0, 1.0, 0.0)),
new LinearRingZ(new CoordinateZ(0.5, 0.0, 0.0),
new CoordinateZ(0.0, 0.5, 0.0),
new CoordinateZ(0.5, 0.5, 0.0)));
}
/**
* Test the coordinate constructor
*/
@Test
@SuppressWarnings("JUnitTestMethodWithNoAssertions")
public void coordinateConstructor()
{
new WkbPolygonZ(new LinearRingZ(new CoordinateZ(1.0, 0.0, 0.0),
new CoordinateZ(1.0, 1.0, 0.0),
new CoordinateZ(0.0, 1.0, 0.0)),
Arrays.asList(new LinearRingZ(new CoordinateZ(0.5, 0.0, 0.0),
new CoordinateZ(0.0, 0.5, 0.0),
new CoordinateZ(0.5, 0.5, 0.0))));
}
/**
* Test the collection constructor for failure on a null coordinate
*/
@Test(expected = IllegalArgumentException.class)
public void constructorNullCollection()
{
new WkbPolygonZ(null);
}
/**
* Test the collection constructor for failure on a null coordinate
*/
@Test(expected = IllegalArgumentException.class)
public void constructorNullCoordinate()
{
new WkbLineStringZ(Arrays.asList(new CoordinateZ(0.0, 0.0, 0.0),
new CoordinateZ(0.0, 0.0, 0.0),
null));
}
/**
* Test equals
*/
@Test
public void testEquals()
{
final WkbPolygonZ polygon = new WkbPolygonZ(new LinearRingZ(new CoordinateZ(1.0, 0.0, 0.0),
new CoordinateZ(0.0, 1.0, 0.0),
new CoordinateZ(1.0, 1.0, 0.0)),
new LinearRingZ(new CoordinateZ(0.5, 0.0, 0.0),
new CoordinateZ(0.0, 0.5, 0.0),
new CoordinateZ(0.5, 0.5, 0.0)));
//noinspection EqualsWithItself,SimplifiableJUnitAssertion
assertTrue("Equals failed on self reference",
polygon.equals(polygon));
}
/**
* Test equals with null
*/
@Test
@SuppressWarnings("ObjectEqualsNull")
public void testEqualsWithNull()
{
final WkbPolygonZ polygon = new WkbPolygonZ(new LinearRingZ(new CoordinateZ(1.0, 0.0, 0.0),
new CoordinateZ(0.0, 1.0, 0.0),
new CoordinateZ(1.0, 1.0, 0.0)),
new LinearRingZ(new CoordinateZ(0.5, 0.0, 0.0),
new CoordinateZ(0.0, 0.5, 0.0),
new CoordinateZ(0.5, 0.5, 0.0)));
//noinspection EqualsWithItself
assertFalse("Equals should have failed on null comparison",
polygon.equals(null));
}
/**
* Test equals with a different object type
*/
@Test
public void testEqualsWithDifferentObjectType()
{
final WkbPolygonZ polygon = new WkbPolygonZ(new LinearRingZ(new CoordinateZ(1.0, 0.0, 0.0),
new CoordinateZ(0.0, 1.0, 0.0),
new CoordinateZ(1.0, 1.0, 0.0)),
new LinearRingZ(new CoordinateZ(0.5, 0.0, 0.0),
new CoordinateZ(0.0, 0.5, 0.0),
new CoordinateZ(0.5, 0.5, 0.0)));
//noinspection EqualsWithItself,UnnecessaryBoxing,EqualsBetweenInconvertibleTypes
assertFalse("Equals should fail on a different object type",
polygon.equals(Integer.valueOf(0)));
}
/**
* Test equals
*/
@Test
public void testEqualsTrue()
{
final WkbPolygonZ polygon1 = new WkbPolygonZ(new LinearRingZ(new CoordinateZ(1.0, 0.0, 0.0),
new CoordinateZ(0.0, 1.0, 0.0),
new CoordinateZ(1.0, 1.0, 0.0)),
new LinearRingZ(new CoordinateZ(0.5, 0.0, 0.0),
new CoordinateZ(0.0, 0.5, 0.0),
new CoordinateZ(0.5, 0.5, 0.0)));
final WkbPolygonZ polygon2 = new WkbPolygonZ(new LinearRingZ(new CoordinateZ(1.0, 0.0, 0.0),
new CoordinateZ(0.0, 1.0, 0.0),
new CoordinateZ(1.0, 1.0, 0.0)),
new LinearRingZ(new CoordinateZ(0.5, 0.0, 0.0),
new CoordinateZ(0.0, 0.5, 0.0),
new CoordinateZ(0.5, 0.5, 0.0)));
//noinspection SimplifiableJUnitAssertion
assertTrue("Equals failed to return true",
polygon1.equals(polygon2));
}
/**
* Test hashCode()
*/
@Test
public void testHashCode()
{
final WkbPolygonZ polygon = new WkbPolygonZ(new LinearRingZ(new CoordinateZ(1.0, 0.0, 0.0),
new CoordinateZ(0.0, 1.0, 0.0),
new CoordinateZ(1.0, 1.0, 0.0)),
new LinearRingZ(new CoordinateZ(0.5, 0.0, 0.0),
new CoordinateZ(0.0, 0.5, 0.0),
new CoordinateZ(0.5, 0.5, 0.0)));
assertEquals("Hash code failed",
-907113473,
polygon.hashCode());
}
/**
* Test isEmpty()
*/
@Test
public void testIsEmpty()
{
final WkbPolygonZ polygon = new WkbPolygonZ(new LinearRingZ(new CoordinateZ(1.0, 0.0, 0.0),
new CoordinateZ(0.0, 1.0, 0.0),
new CoordinateZ(1.0, 1.0, 0.0)),
new LinearRingZ(new CoordinateZ(0.5, 0.0, 0.0),
new CoordinateZ(0.0, 0.5, 0.0),
new CoordinateZ(0.5, 0.5, 0.0)));
assertFalse("isEmpty failed",
polygon.isEmpty());
final WkbPolygonZ emptyPolygon = new WkbPolygonZ(new LinearRingZ());
assertTrue("isEmpty failed",
emptyPolygon.isEmpty());
}
/**
* Test getContents()
*/
@Test
public void getContents()
{
final WkbPolygonZ polygon = new WkbPolygonZ(new LinearRingZ(new CoordinateZ(1.0, 0.0, 0.0),
new CoordinateZ(0.0, 1.0, 0.0),
new CoordinateZ(1.0, 1.0, 0.0)),
new LinearRingZ(new CoordinateZ(0.5, 0.0, 0.0),
new CoordinateZ(0.0, 0.5, 0.0),
new CoordinateZ(0.5, 0.5, 0.0)));
assertSame("getContents failed",
Contents.NotEmpty,
polygon.getContents());
final WkbPolygonZ emptyPolygon = new WkbPolygonZ(new LinearRingZ());
assertSame("getContents failed",
Contents.Empty,
emptyPolygon.getContents());
}
/**
* Test createEnvelopeZ()
*/
@Test
public void createEnvelopeZ()
{
final double x = 1.0;
final double y = 1.0;
final double z = 1.0;
final WkbPolygonZ polygon = new WkbPolygonZ(new LinearRingZ(new CoordinateZ(x, y, z),
new CoordinateZ(x, y, z),
new CoordinateZ(x, y, z)));
final EnvelopeZ envelope = polygon.createEnvelopeZ();
assertEquals("createEnvelope failed",
x,
envelope.getMinimumX(),
0.0);
assertEquals("createEnvelope failed",
x,
envelope.getMaximumX(),
0.0);
assertEquals("createEnvelope failed",
y,
envelope.getMinimumY(),
0.0);
assertEquals("createEnvelope failed",
y,
envelope.getMaximumY(),
0.0);
assertEquals("createEnvelope failed",
z,
envelope.getMinimumZ(),
0.0);
assertEquals("createEnvelope failed",
z,
envelope.getMaximumZ(),
0.0);
final EnvelopeZ emptyEnvelope = new WkbPolygonZ(new LinearRingZ()).createEnvelopeZ();
assertTrue("createemptyEnvelope failed",
Double.isNaN(emptyEnvelope.getMinimumX()));
assertTrue("createemptyEnvelope failed",
Double.isNaN(emptyEnvelope.getMaximumX()));
assertTrue("createemptyEnvelope failed",
Double.isNaN(emptyEnvelope.getMinimumY()));
assertTrue("createemptyEnvelope failed",
Double.isNaN(emptyEnvelope.getMaximumY()));
assertTrue("createemptyEnvelope failed",
Double.isNaN(emptyEnvelope.getMinimumZ()));
assertTrue("createemptyEnvelope failed",
Double.isNaN(emptyEnvelope.getMaximumZ()));
}
/**
* Test createEnvelope()
*/
@Test
public void createEnvelope()
{
final double x = 1.0;
final double y = 1.0;
final double z = 1.0;
final WkbPolygonZ polygon = new WkbPolygonZ(new LinearRingZ(new CoordinateZ(x, y, z),
new CoordinateZ(x, y, z),
new CoordinateZ(x, y, z)));
@SuppressWarnings("CastToConcreteClass")
final EnvelopeZ envelope = (EnvelopeZ)polygon.createEnvelope();
assertEquals("createEnvelope failed",
x,
envelope.getMinimumX(),
0.0);
assertEquals("createEnvelope failed",
x,
envelope.getMaximumX(),
0.0);
assertEquals("createEnvelope failed",
y,
envelope.getMinimumY(),
0.0);
assertEquals("createEnvelope failed",
y,
envelope.getMaximumY(),
0.0);
assertEquals("createEnvelope failed",
z,
envelope.getMinimumZ(),
0.0);
assertEquals("createEnvelope failed",
z,
envelope.getMaximumZ(),
0.0);
@SuppressWarnings("CastToConcreteClass")
final EnvelopeZ emptyEnvelope = (EnvelopeZ)new WkbPolygonZ(new LinearRingZ()).createEnvelope();
assertTrue("createemptyEnvelope failed",
Double.isNaN(emptyEnvelope.getMinimumX()));
assertTrue("createemptyEnvelope failed",
Double.isNaN(emptyEnvelope.getMaximumX()));
assertTrue("createemptyEnvelope failed",
Double.isNaN(emptyEnvelope.getMinimumY()));
assertTrue("createemptyEnvelope failed",
Double.isNaN(emptyEnvelope.getMaximumY()));
assertTrue("createemptyEnvelope failed",
Double.isNaN(emptyEnvelope.getMinimumZ()));
assertTrue("createemptyEnvelope failed",
Double.isNaN(emptyEnvelope.getMaximumZ()));
}
/**
* Test writeWellKnownBinary
*/
@Test
public void writeWellKnownText()
{
try(final ByteOutputStream output = new ByteOutputStream())
{
final WkbPolygonZ polygon = new WkbPolygonZ(new LinearRingZ(new CoordinateZ(1.0, 0.0, 0.0),
new CoordinateZ(0.0, 1.0, 0.0),
new CoordinateZ(1.0, 1.0, 0.0)),
new LinearRingZ(new CoordinateZ(0.5, 0.0, 0.0),
new CoordinateZ(0.0, 0.5, 0.0),
new CoordinateZ(0.5, 0.5, 0.0)));
polygon.writeWellKnownBinary(output);
final ByteBuffer byteBuffer = ByteBuffer.wrap(output.array());
final WkbPolygonZ found = WkbPolygonZ.readWellKnownBinary(byteBuffer);
assertEquals("writeWellKnownBinary failed",
polygon,
found);
}
}
/**
* Test getGeometryTypeName()
*/
@Test
public void getGeometryTypeName()
{
assertEquals("getGeometryTypeName() returned the wrong value",
GeometryType.Polygon.toString(),
new WkbPolygonZ(new LinearRingZ()).getGeometryTypeName());
}
/**
* Test rings
*/
@Test
public void rings()
{
final LinearRingZ exteriorRing = new LinearRingZ(new CoordinateZ(1.0, 0.0, 0.0),
new CoordinateZ(0.0, 1.0, 0.0),
new CoordinateZ(1.0, 1.0, 0.0));
final Collection<LinearRingZ> interiorRing = Arrays.asList(new LinearRingZ(new CoordinateZ(0.5, 0.0, 0.0),
new CoordinateZ(0.0, 0.5, 0.0),
new CoordinateZ(0.5, 0.5, 0.0)));
final WkbPolygonZ polygon = new WkbPolygonZ(exteriorRing, interiorRing);
assertEquals("getExteriorRing() returned the wrong value",
exteriorRing,
polygon.getExteriorRing());
assertEquals("getInteriorRings() returned the wrong value",
interiorRing,
polygon.getInteriorRings());
}
/**
* Test writeWellKnownBinary with no rings
*/
@Test
public void writeWellKnownTextNoRings()
{
try(final ByteOutputStream output = new ByteOutputStream())
{
final WkbPolygonZ polygon = new WkbPolygonZ(new LinearRingZ());
polygon.writeWellKnownBinary(output);
final ByteBuffer byteBuffer = ByteBuffer.wrap(output.array());
final WkbPolygonZ found = WkbPolygonZ.readWellKnownBinary(byteBuffer);
assertEquals("writeWellKnownBinary failed",
polygon,
found);
}
}
}