/* * Copyright 2013 MovingBlocks * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.terasology.math; import com.google.common.collect.Sets; import org.junit.Test; import org.terasology.math.geom.Vector3i; import java.util.Arrays; import java.util.List; import java.util.Set; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; /** */ public class Region3iTest { @Test public void testEmptyConstructor() { Region3i region = Region3i.EMPTY; assertEquals(new Vector3i(), region.size()); assertTrue(region.isEmpty()); } @Test public void testCreateRegionWithMinAndSize() { List<Vector3i> mins = Arrays.asList(new Vector3i(), new Vector3i(1, 1, 1), new Vector3i(3, 4, 5)); List<Vector3i> size = Arrays.asList(new Vector3i(1, 1, 1), new Vector3i(3, 3, 3), new Vector3i(8, 5, 2)); List<Vector3i> expectedMax = Arrays.asList(new Vector3i(), new Vector3i(3, 3, 3), new Vector3i(10, 8, 6)); for (int i = 0; i < mins.size(); ++i) { Region3i region = Region3i.createFromMinAndSize(mins.get(i), size.get(i)); assertEquals(mins.get(i), region.min()); assertEquals(size.get(i), region.size()); assertEquals(expectedMax.get(i), region.max()); assertFalse(region.isEmpty()); } } @Test public void testCreateRegionWithMinMax() { List<Vector3i> mins = Arrays.asList(new Vector3i(), new Vector3i(1, 1, 1), new Vector3i(3, 4, 5)); List<Vector3i> expectedSize = Arrays.asList(new Vector3i(1, 1, 1), new Vector3i(3, 3, 3), new Vector3i(8, 5, 2)); List<Vector3i> max = Arrays.asList(new Vector3i(), new Vector3i(3, 3, 3), new Vector3i(10, 8, 6)); for (int i = 0; i < mins.size(); ++i) { Region3i region = Region3i.createFromMinMax(mins.get(i), max.get(i)); assertEquals(mins.get(i), region.min()); assertEquals(max.get(i), region.max()); assertEquals(expectedSize.get(i), region.size()); assertFalse(region.isEmpty()); } } @Test public void testCreateRegionWithBounds() { Region3i expectedRegion = Region3i.createFromMinMax(new Vector3i(-2, 4, -16), new Vector3i(4, 107, 0)); List<Vector3i> vec1 = Arrays.asList(new Vector3i(-2, 4, -16), new Vector3i(4, 4, -16), new Vector3i(-2, 107, -16), new Vector3i(-2, 4, 0), new Vector3i(4, 107, -16), new Vector3i(4, 4, 0), new Vector3i(-2, 107, 0), new Vector3i(4, 107, 0)); List<Vector3i> vec2 = Arrays.asList(new Vector3i(4, 107, 0), new Vector3i(-2, 107, 0), new Vector3i(4, 4, 0), new Vector3i(4, 107, -16), new Vector3i(-2, 4, 0), new Vector3i(-2, 107, -16), new Vector3i(4, 4, -16), new Vector3i(-2, 4, -16)); for (int i = 0; i < vec1.size(); ++i) { assertEquals(expectedRegion, Region3i.createBounded(vec1.get(i), vec2.get(i))); } } @Test public void testRegionEmptyIfMaxLessThanMin() { Region3i region = Region3i.createFromMinMax(new Vector3i(0, 0, 0), new Vector3i(-1, 0, 0)); assertTrue(region.isEmpty()); } @Test public void testRegionEmptyIfSizeZeroOrLess() { Region3i region = Region3i.createFromMinAndSize(new Vector3i(1, 1, 1), new Vector3i(0, 1, 1)); assertTrue(region.isEmpty()); region = Region3i.createFromMinAndSize(new Vector3i(1, 1, 1), new Vector3i(1, -1, 1)); assertTrue(region.isEmpty()); } @Test public void testIterateRegion() { Vector3i min = new Vector3i(2, 5, 7); Vector3i max = new Vector3i(10, 11, 12); Region3i region = Region3i.createFromMinMax(min, max); Set<Vector3i> expected = Sets.newHashSet(); for (int x = min.x; x <= max.x; ++x) { for (int y = min.y; y <= max.y; ++y) { for (int z = min.z; z <= max.z; ++z) { expected.add(new Vector3i(x, y, z)); } } } for (Vector3i pos : region) { assertTrue(expected.contains(pos)); expected.remove(pos); } assertEquals("All vectors provided", 0, expected.size()); } @Test public void testSimpleIntersect() { Region3i region1 = Region3i.createFromMinMax(new Vector3i(), new Vector3i(32, 32, 32)); Region3i region2 = Region3i.createFromMinMax(new Vector3i(1, 1, 1), new Vector3i(17, 17, 17)); assertEquals(region2, region1.intersect(region2)); } @Test public void testNonTouchingIntersect() { Region3i region1 = Region3i.createFromMinMax(new Vector3i(), new Vector3i(32, 32, 32)); Region3i region2 = Region3i.createFromMinMax(new Vector3i(103, 103, 103), new Vector3i(170, 170, 170)); assertEquals(Region3i.EMPTY, region1.intersect(region2)); } @Test public void testEncompasses() { Region3i region = Region3i.createFromMinAndSize(new Vector3i(), new Vector3i(1, 1, 1)); assertTrue(region.encompasses(0, 0, 0)); assertFalse(region.encompasses(1, 0, 0)); assertFalse(region.encompasses(1, 0, 1)); assertFalse(region.encompasses(0, 0, 1)); assertFalse(region.encompasses(-1, 0, -1)); assertFalse(region.encompasses(-1, 0, 0)); assertFalse(region.encompasses(-1, 0, -1)); assertFalse(region.encompasses(0, 0, -1)); assertFalse(region.encompasses(1, 1, 0)); assertFalse(region.encompasses(1, 1, 1)); assertFalse(region.encompasses(0, 1, 1)); assertFalse(region.encompasses(-1, 1, -1)); assertFalse(region.encompasses(-1, 1, 0)); assertFalse(region.encompasses(-1, 1, -1)); assertFalse(region.encompasses(0, 1, -1)); assertFalse(region.encompasses(1, -1, 0)); assertFalse(region.encompasses(1, -1, 1)); assertFalse(region.encompasses(0, -1, 1)); assertFalse(region.encompasses(-1, -1, -1)); assertFalse(region.encompasses(-1, -1, 0)); assertFalse(region.encompasses(-1, -1, -1)); assertFalse(region.encompasses(0, -1, -1)); } @Test public void testNearestPointToWhenEncompasses() { Region3i region = Region3i.createFromMinMax(new Vector3i(), new Vector3i(4, 4, 4)); assertEquals(new Vector3i(2, 1, 1), region.getNearestPointTo(new Vector3i(2, 1, 1))); } @Test public void testNearestPointToAlongSide() { Region3i region = Region3i.createFromMinMax(new Vector3i(), new Vector3i(4, 4, 4)); assertEquals(new Vector3i(4, 2, 1), region.getNearestPointTo(new Vector3i(15, 2, 1))); } @Test public void testNearestPointToAwayFromCorner() { Region3i region = Region3i.createFromMinMax(new Vector3i(), new Vector3i(4, 4, 4)); assertEquals(new Vector3i(4, 4, 4), region.getNearestPointTo(new Vector3i(15, 12, 7))); } }