package org.geotools.data.efeature.tests.unit;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import junit.framework.Test;
import junit.framework.TestSuite;
import junit.textui.TestRunner;
import org.geotools.data.efeature.EFeatureAttributeInfo;
import org.geotools.data.efeature.EFeatureContext;
import org.geotools.data.efeature.EFeatureContextFactory;
import org.geotools.data.efeature.EFeatureContextInfo;
import org.geotools.data.efeature.EFeaturePackageInfo;
import org.geotools.data.efeature.EFeatureFactoryFinder;
import org.geotools.data.efeature.EFeatureFolderInfo;
import org.geotools.data.efeature.EFeatureGeometryInfo;
import org.geotools.data.efeature.EFeatureInfo;
import org.geotools.data.efeature.EFeaturePackage;
import org.geotools.data.efeature.EFeatureStatus;
import org.geotools.data.efeature.EStructureInfo;
import org.geotools.data.efeature.tests.EFeatureCompatibleData;
import org.geotools.data.efeature.tests.EFeatureData;
import org.geotools.data.efeature.tests.impl.EFeatureTestsContextHelper;
/**
* This class implements unit tests for {@link EFeatureContext}
*
* @author kengu - 4. mai 2011
*
*/
public class EFeatureContextTest extends AbstractEFeatureTest {
// -----------------------------------------------------
// Tests
// -----------------------------------------------------
/** Test constructor */
@org.junit.Test
public void testConstructor() {
//
// Create private context helper with private context factory.
//
EFeatureTestsContextHelper eHelper =
new EFeatureTestsContextHelper(new EFeatureContextFactory(),false, false);
EFeatureContext eContext = eHelper.eContext();
EFeatureContextInfo eStructure = eContext.eStructure();
assertState(eStructure,false,false,false);
assertStatus(eStructure.validate(),EFeatureStatus.SUCCESS);
assertState(eStructure,true,true,false);
assertStructure("EFeatureContext structure mismatch",eStructure);
}
/** Test SPI. */
@org.junit.Test
public void testSPI() {
//
// Create private context helper with private context factory.
//
EFeatureTestsContextHelper eHelper =
new EFeatureTestsContextHelper(new EFeatureContextFactory(), false, false);
EFeatureContextFactory eFactory = EFeatureFactoryFinder.getContextFactory();
assertNotNull("EFeatureFactoryFinder failure, " +
"default EFeatureContextFactory instance not found", eFactory);
assertNotNull("SPI failure, EFeatureContextFactory instance not found", eFactory);
eFactory = eHelper.eContextFactory();
assertNotNull("SPI failure, EFeatureContextFactory instance not found", eFactory);
EFeatureContext eContext = eHelper.eContext();
EFeatureContextInfo eInfo = eContext.eStructure();
assertState(eInfo,false,false,false);
assertStatus(eInfo.validate(),EFeatureStatus.SUCCESS);
assertState(eInfo,true,true,false);
assertStructure("EFeatureContext structure mismatch",eInfo);
}
// -----------------------------------------------------
// TestCase setup
// -----------------------------------------------------
/**
* Main for test runner.
*/
public static void main(String[] args) {
TestRunner.run(suite());
}
/**
* Constructor with test name.
*/
public EFeatureContextTest(String name) {
super(name);
}
/**
* Required suite builder.
* @return A test suite for this unit test.
*/
public static Test suite() {
return new TestSuite(EFeatureContextTest.class);
}
// -----------------------------------------------------
// Test assertion methods
// -----------------------------------------------------
private static void assertStatus(EFeatureStatus eStatus, int type)
{
if(eStatus.getType() != type) {
if(eStatus.getCause()!=null) {
eStatus.getCause().printStackTrace();
}
fail(eStatus.getMessage());
}
}
private static void assertState(EStructureInfo<?> eInfo, boolean isAvailable, boolean isValid, boolean isDisposed)
{
String eName = eInfo.getClass().getSimpleName();
assertTrue(eName + "#isAvailable mismatch: " +
"expected " + isAvailable + ", found " + eInfo.isAvailable(),
eInfo.isAvailable() == isAvailable);
assertTrue(eName + "#isValid mismatch: " +
"expected " + isValid + ", found " + eInfo.isAvailable(),
eInfo.isValid() == isValid);
assertTrue(eName + "isDisposed mismatch: " +
"expected " + isDisposed + ", found " + eInfo.isDisposed(),
eInfo.isDisposed() == isDisposed);
}
private static void assertStructure(String msg,EFeatureContextInfo eInfo)
{
assertNotNull(msg+". EFeatureContextFactory instance not set", eInfo.eContext());
assertEquals(msg+". EFeaturePackageInfo count mismatch", 2, eInfo.ePackageMap().size());
for(EFeaturePackageInfo it : eInfo.ePackageMap().values()) {
assertStructure(msg, it);
}
}
private static void assertStructure(String msg,EFeaturePackageInfo eInfo)
{
assertEquals(msg+". EFeatureFolderInfo count mismatch", 1, eInfo.eFolderInfoMap().size());
for(EFeatureFolderInfo it : eInfo.eFolderInfoMap().values()) {
assertStructure(msg, it);
}
}
private static void assertStructure(String msg,EFeatureFolderInfo eInfo)
{
int count = (EFeaturePackage.eNS_URI.equals(eInfo.eNsURI()) ? 0 : 2);
assertEquals(msg+". EFeatureInfo count mismatch", count, eInfo.eFeatureInfoMap().size());
for(EFeatureInfo it : eInfo.eFeatureInfoMap().values()) {
assertStructure(msg, it);
}
}
private static void assertStructure(String msg,EFeatureInfo eInfo)
{
int pcount = 0;
int acount = 0;
int gcount = 0;
if(EFeatureData.class.getSimpleName().equals(eInfo.eName())) {
pcount = 7;
acount = 6;
gcount = 1;
}
else if(EFeatureCompatibleData.class.getSimpleName().equals(eInfo.eName())) {
pcount = 5;
acount = 4;
gcount = 1;
}
assertEquals(msg+". EFeature["+eInfo.eName()+"] property count mismatch", pcount, eInfo.eGetAttributeInfoList(true).size());
assertEquals(msg+". EFeatureAttributeInfo["+eInfo.eName()+"] count mismatch", acount, eInfo.eGetAttributeInfoList(false).size());
assertStructure(msg, eInfo.eName(), eInfo.eGetAttributeInfoList(false));
assertEquals(msg+". EFeatureGeometryInfo["+eInfo.eName()+"] count mismatch", gcount, eInfo.eGetGeometryInfoMap().size());
assertStructure(msg, eInfo.eGetGeometryInfoMap().values().iterator().next());
}
private static void assertStructure(String msg,String eName, Collection<EFeatureAttributeInfo> eInfos)
{
Map<String, Boolean> exists = new HashMap<String, Boolean>();
if(EFeatureData.class.getSimpleName().equals(eName)) {
exists.put("SRID", false);
exists.put("data", false);
exists.put("default", false);
exists.put("structure", false);
exists.put("attribute", false);
}
else if(EFeatureCompatibleData.class.getSimpleName().equals(eName)) {
exists.put("ID", false);
exists.put("attribute", false);
}
for(EFeatureAttributeInfo it : eInfos)
{
exists.put(it.eName(),true);
}
StringBuffer s = new StringBuffer();
for(String name : exists.keySet())
{
if(!exists.get(name)) {
if(s.length()>0) s.append(",");
s.append(name);
}
}
assertEquals(msg+". Missing attributes: " + s.toString(),0,s.length());
}
private static void assertStructure(String msg,EFeatureGeometryInfo eInfo)
{
assertEquals(msg,"geometry",eInfo.eName());
}
// -----------------------------------------------------
// Helper methods
// -----------------------------------------------------
}