/*
* Copyright 2014 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.world.generation;
import org.junit.Test;
import org.terasology.context.Context;
import org.terasology.context.internal.ContextImpl;
import org.terasology.math.Region3i;
import org.terasology.math.geom.Vector3i;
import org.terasology.world.generation.facets.base.BaseFacet3D;
import org.terasology.world.generator.plugin.WorldGeneratorPluginLibrary;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
public class WorldBuilderTest {
private Context context = new ContextImpl();
@Test
public void testBorderCalculation() {
WorldBuilder worldBuilder = new WorldBuilder(context.get(WorldGeneratorPluginLibrary.class));
worldBuilder.setSeed(12);
worldBuilder.addProvider(new Facet1Provider());
worldBuilder.addProvider(new Facet2Provider());
World world = worldBuilder.build();
Region3i regionToGenerate = Region3i.createFromCenterExtents(new Vector3i(), 1);
Region regionData = world.getWorldData(regionToGenerate);
Facet1 facet1 = regionData.getFacet(Facet1.class);
assertEquals(regionToGenerate, facet1.getWorldRegion());
Facet2 facet2 = regionData.getFacet(Facet2.class);
assertEquals(Region3i.createFromMinAndSize(new Vector3i(-3, -1, -3), new Vector3i(7, 3, 7)), facet2.getWorldRegion());
}
@Test
public void testCumulativeBorderCalculation() {
WorldBuilder worldBuilder = new WorldBuilder(context.get(WorldGeneratorPluginLibrary.class));
worldBuilder.setSeed(12);
worldBuilder.addProvider(new Facet1Provider());
worldBuilder.addProvider(new Facet2Provider());
worldBuilder.addProvider(new Facet3Provider());
World world = worldBuilder.build();
Region3i regionToGenerate = Region3i.createFromCenterExtents(new Vector3i(), 1);
Region regionData = world.getWorldData(regionToGenerate);
Facet3 facet3 = regionData.getFacet(Facet3.class);
assertEquals(regionToGenerate, facet3.getWorldRegion());
Facet1 facet1 = regionData.getFacet(Facet1.class);
assertEquals(Region3i.createFromMinAndSize(new Vector3i(-2, -1, -2), new Vector3i(5, 3, 5)), facet1.getWorldRegion());
Facet2 facet2 = regionData.getFacet(Facet2.class);
assertEquals(Region3i.createFromMinAndSize(new Vector3i(-4, -1, -4), new Vector3i(9, 3, 9)), facet2.getWorldRegion());
}
@Test
public void testMultiplePathsBorderCalculation() {
WorldBuilder worldBuilder = new WorldBuilder(context.get(WorldGeneratorPluginLibrary.class));
worldBuilder.setSeed(12);
worldBuilder.addProvider(new Facet1Provider());
worldBuilder.addProvider(new Facet2Provider());
worldBuilder.addProvider(new Facet4Provider());
World world = worldBuilder.build();
Region3i regionToGenerate = Region3i.createFromCenterExtents(new Vector3i(), 1);
Region regionData = world.getWorldData(regionToGenerate);
Facet1 facet1 = regionData.getFacet(Facet1.class);
assertEquals(regionToGenerate, facet1.getWorldRegion());
Facet4 facet4 = regionData.getFacet(Facet4.class);
assertEquals(regionToGenerate, facet4.getWorldRegion());
Facet2 facet2 = regionData.getFacet(Facet2.class);
assertEquals(Region3i.createFromMinAndSize(new Vector3i(-4, -1, -4), new Vector3i(9, 3, 9)), facet2.getWorldRegion());
}
@Test
public void testUpdating() {
WorldBuilder worldBuilder = new WorldBuilder(context.get(WorldGeneratorPluginLibrary.class));
worldBuilder.setSeed(12);
worldBuilder.addProvider(new Facet1Provider());
worldBuilder.addProvider(new Facet2Provider());
worldBuilder.addProvider(new Facet3Provider());
worldBuilder.addProvider(new Facet4Provider());
worldBuilder.addProvider(new FacetUpdater());
Region3i regionToGenerate = Region3i.createFromCenterExtents(new Vector3i(), 1);
World world;
Region regionData;
// try checking updated facet
world = worldBuilder.build();
regionData = world.getWorldData(regionToGenerate);
assertTrue(regionData.getFacet(Facet1.class).updated);
assertTrue(regionData.getFacet(Facet4.class).updated);
// try checking generated facet
world = worldBuilder.build();
regionData = world.getWorldData(regionToGenerate);
assertNotNull(regionData.getFacet(Facet3.class));
assertTrue(regionData.getFacet(Facet4.class).updated);
}
public static class Facet1 extends BaseFacet3D {
public boolean updated;
public Facet1(Region3i targetRegion, Border3D border) {
super(targetRegion, border);
}
}
public static class Facet2 extends BaseFacet3D {
public Facet2(Region3i targetRegion, Border3D border) {
super(targetRegion, border);
}
}
public static class Facet3 extends BaseFacet3D {
public Facet3(Region3i targetRegion, Border3D border) {
super(targetRegion, border);
}
}
public static class Facet4 extends BaseFacet3D {
public boolean updated;
public Facet4(Region3i targetRegion, Border3D border) {
super(targetRegion, border);
}
}
@Produces(Facet1.class)
@Requires(@Facet(value = Facet2.class, border = @FacetBorder(sides = 2)))
public static class Facet1Provider implements FacetProvider {
@Override
public void process(GeneratingRegion region) {
Facet1 facet = new Facet1(region.getRegion(), region.getBorderForFacet(Facet1.class));
region.setRegionFacet(Facet1.class, facet);
}
}
@Produces(Facet2.class)
public static class Facet2Provider implements FacetProvider {
@Override
public void process(GeneratingRegion region) {
Facet2 facet = new Facet2(region.getRegion(), region.getBorderForFacet(Facet2.class));
region.setRegionFacet(Facet2.class, facet);
}
}
@Produces(Facet3.class)
@Requires(@Facet(value = Facet1.class, border = @FacetBorder(sides = 1)))
public static class Facet3Provider implements FacetProvider {
@Override
public void process(GeneratingRegion region) {
Facet3 facet = new Facet3(region.getRegion(), region.getBorderForFacet(Facet3.class));
region.setRegionFacet(Facet3.class, facet);
}
}
@Produces(Facet4.class)
@Requires(@Facet(value = Facet2.class, border = @FacetBorder(sides = 3)))
public static class Facet4Provider implements FacetProvider {
@Override
public void process(GeneratingRegion region) {
Facet4 facet = new Facet4(region.getRegion(), region.getBorderForFacet(Facet4.class));
region.setRegionFacet(Facet4.class, facet);
}
}
@Requires(@Facet(Facet2.class))
@Produces(Facet3.class)
@Updates({@Facet(Facet1.class), @Facet(Facet4.class)})
public static class FacetUpdater implements FacetProvider {
@Override
public void process(GeneratingRegion region) {
Facet3 facet = new Facet3(region.getRegion(), region.getBorderForFacet(Facet3.class));
Facet1 facet1 = region.getRegionFacet(Facet1.class);
Facet4 facet4 = region.getRegionFacet(Facet4.class);
facet1.updated = true;
facet4.updated = true;
region.setRegionFacet(Facet3.class, facet);
}
}
}