/*
* Copyright 2008 Tobias Hochwallner
*
* 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.exolab.castor.builder.info.nature;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import junit.framework.TestCase;
import org.exolab.castor.builder.factory.FieldInfoFactory;
import org.exolab.castor.builder.info.ClassInfo;
import org.exolab.castor.builder.info.FieldInfo;
import org.exolab.castor.builder.info.NodeType;
import org.exolab.castor.builder.types.XSClass;
import org.exolab.castor.mapping.AccessMode;
import org.exolab.javasource.JClass;
/**
* Tests access to {@link ClassInfo} properties via {@link JDOClassInfoNature}. Remember that
* behavior of properties not set before is specified in the {@link BaseNature}
* class and tested in {@link BaseNatureTest}. Property implementation will not
* be tested in here.
*
* @author Tobias Hochwallner, Lukas Lang
* @since 1.2.1
*/
public final class JDOClassNatureTest extends TestCase {
/**
* Constructor.
*
* @param name
* of the test case.
*/
public JDOClassNatureTest(final String name) {
super(name);
}
/**
* Shows the usage of JDOClassNature.
*/
public void testUsage() {
ClassInfo classInfo = new ClassInfo(new JClass("test"));
if (!classInfo.hasNature(JDOClassInfoNature.class.getName())) {
classInfo.addNature(JDOClassInfoNature.class.getName());
JDOClassInfoNature jdo = new JDOClassInfoNature(classInfo);
jdo.setTableName("BOOK");
jdo.addPrimaryKey("ISBN");
// TODO Tobias jdo.addPrimaryKey("ISBN","Generator");
assertEquals("BOOK", jdo.getTableName());
assertEquals(1, jdo.getPrimaryKeys().size());
assertTrue(jdo.getPrimaryKeys().contains("ISBN"));
}
}
/**
* Tests set and get JDO table name.
*/
public void testTableName() {
ClassInfo classInfo = new ClassInfo(new JClass("test"));
classInfo.addNature(JDOClassInfoNature.class.getName());
JDOClassInfoNature jdo = new JDOClassInfoNature(classInfo);
jdo.setTableName("BOOK");
assertEquals("BOOK", jdo.getTableName());
}
/**
* Tests set and get primary keys. Adding the author column to the primary
* key in reality would net really make sense.
*/
public void testPrimaryKeys() {
ClassInfo classInfo = new ClassInfo(new JClass("test"));
classInfo.addNature(JDOClassInfoNature.class.getName());
JDOClassInfoNature jdo = new JDOClassInfoNature(classInfo);
List columns = new LinkedList();
columns.add("ISBN");
columns.add("AUTHOR");
jdo.addPrimaryKey(columns.get(0).toString());
assertEquals(1, jdo.getPrimaryKeys().size());
assertTrue(jdo.getPrimaryKeys().contains(columns.get(0)));
jdo.addPrimaryKey(columns.get(1).toString());
List primaryKey = jdo.getPrimaryKeys();
assertEquals(2, jdo.getPrimaryKeys().size());
assertTrue(primaryKey.containsAll(columns));
}
/**
* Tests set and get {@link AccessMode} of the JDO entity.
*/
public void testAccessMode() {
ClassInfo classInfo = new ClassInfo(new JClass("test"));
classInfo.addNature(JDOClassInfoNature.class.getName());
JDOClassInfoNature jdo = new JDOClassInfoNature(classInfo);
jdo.setAccessMode(AccessMode.Shared);
assertNotNull(jdo.getAccessMode());
assertEquals(AccessMode.Shared, jdo.getAccessMode());
}
/**
* Tests if getFields returns a list of {@link JDOFieldInfoNature}s.
*/
public void testGetElementFields() {
ClassInfo classInfo = new ClassInfo(new JClass("test"));
FieldInfoFactory factory = new FieldInfoFactory();
FieldInfo field = factory.createFieldInfo(new XSClass(
new JClass("Book")), "isbn");
field.addNature(JDOFieldInfoNature.class.getName());
JDOFieldInfoNature jdoField = new JDOFieldInfoNature(field);
jdoField.setColumnName("isbn");
jdoField.setColumnType("integer");
classInfo.addFieldInfo(field);
classInfo.addNature(JDOClassInfoNature.class.getName());
JDOClassInfoNature jdo = new JDOClassInfoNature(classInfo);
List jdoFields = jdo.getFields();
assertEquals(1, jdoFields.size());
JDOFieldInfoNature jdoFieldReceived = (JDOFieldInfoNature) jdoFields
.get(0);
assertEquals("integer", jdoFieldReceived.getColumnType());
assertEquals("isbn", jdoFieldReceived.getColumnName());
}
/**
* Tests if getFields returns a list of {@link JDOFieldInfoNature}s.
*/
public void testGetElementFieldsWithMoreThanOneField() {
ClassInfo classInfo = new ClassInfo(new JClass("test"));
FieldInfoFactory factory = new FieldInfoFactory();
FieldInfo isbn = factory.createFieldInfo(new XSClass(
new JClass("Book")), "isbn");
FieldInfo title = factory.createFieldInfo(new XSClass(
new JClass("Book")), "title");
isbn.addNature(JDOFieldInfoNature.class.getName());
title.addNature(JDOFieldInfoNature.class.getName());
JDOFieldInfoNature jdoIsbn = new JDOFieldInfoNature(isbn);
JDOFieldInfoNature jdoTitle = new JDOFieldInfoNature(title);
jdoIsbn.setColumnName("isbn");
jdoIsbn.setColumnType("integer");
jdoTitle.setColumnName("title");
jdoTitle.setColumnType("varchar");
classInfo.addFieldInfo(isbn);
classInfo.addFieldInfo(title);
classInfo.addNature(JDOClassInfoNature.class.getName());
JDOClassInfoNature jdo = new JDOClassInfoNature(classInfo);
List jdoFields = jdo.getFields();
assertEquals(2, jdoFields.size());
JDOFieldInfoNature jdoFieldReceived = (JDOFieldInfoNature) jdoFields
.get(0);
// We can not depend on the order of the received Natures.
if (jdoFieldReceived.getColumnName().equals("isbn")) {
assertEquals("integer", jdoFieldReceived.getColumnType());
// Now check the second field
jdoFieldReceived = (JDOFieldInfoNature) jdoFields.get(1);
assertEquals("title", jdoFieldReceived.getColumnName());
assertEquals("varchar", jdoFieldReceived.getColumnType());
} else if (jdoFieldReceived.getColumnName().equals("title")) {
assertEquals("varchar", jdoFieldReceived.getColumnType());
// Now check the second field
jdoFieldReceived = (JDOFieldInfoNature) jdoFields.get(1);
assertEquals("isbn", jdoFieldReceived.getColumnName());
assertEquals("integer", jdoFieldReceived.getColumnType());
} else {
fail("Fields not found!");
}
}
/**
* Test getFields with a ClassInfo having a FieldInfo but without
* JDOFieldInfoNature.
*/
public void testGetElementFieldsWithoutNatures() {
ClassInfo classInfo = new ClassInfo(new JClass("test"));
FieldInfoFactory factory = new FieldInfoFactory();
FieldInfo field = factory.createFieldInfo(new XSClass(
new JClass("Book")), "isbn");
classInfo.addFieldInfo(field);
classInfo.addNature(JDOClassInfoNature.class.getName());
JDOClassInfoNature jdo = new JDOClassInfoNature(classInfo);
List jdoFields = jdo.getFields();
assertEquals(0, jdoFields.size());
}
/**
* Test getFields with a ClassInfo no fields added before.
*/
public void testGetElementFieldsNoFieldsAdded() {
ClassInfo classInfo = new ClassInfo(new JClass("test"));
classInfo.addNature(JDOClassInfoNature.class.getName());
JDOClassInfoNature jdo = new JDOClassInfoNature(classInfo);
List jdoFields = jdo.getFields();
assertEquals(0, jdoFields.size());
}
/**
* Tests if getFields returns a list of {@link JDOFieldInfoNature}s.
*/
public void testGetElementFieldsOnlyOneHasNature() {
ClassInfo classInfo = new ClassInfo(new JClass("test"));
FieldInfoFactory factory = new FieldInfoFactory();
FieldInfo field = factory.createFieldInfo(new XSClass(
new JClass("Book")), "isbn");
FieldInfo field2 = factory.createFieldInfo(new XSClass(
new JClass("Book")), "abc");
field.addNature(JDOFieldInfoNature.class.getName());
JDOFieldInfoNature jdoField = new JDOFieldInfoNature(field);
jdoField.setColumnName("isbn");
jdoField.setColumnType("integer");
classInfo.addFieldInfo(field);
classInfo.addFieldInfo(field2);
classInfo.addNature(JDOClassInfoNature.class.getName());
JDOClassInfoNature jdo = new JDOClassInfoNature(classInfo);
List jdoFields = jdo.getFields();
assertEquals(1, jdoFields.size());
JDOFieldInfoNature jdoFieldReceived = (JDOFieldInfoNature) jdoFields
.get(0);
assertEquals("integer", jdoFieldReceived.getColumnType());
assertEquals("isbn", jdoFieldReceived.getColumnName());
}
/**
* Tests if getFields returns a list of {@link JDOFieldInfoNature}s.
*/
public void testGetAttributeTextElementFields() {
ClassInfo classInfo = new ClassInfo(new JClass("test"));
FieldInfoFactory factory = new FieldInfoFactory();
FieldInfo elementField = factory.createFieldInfo(new XSClass(
new JClass("Book")), "isbn");
// Set node type
elementField.addNature(XMLInfoNature.class.getName());
new XMLInfoNature(elementField).setNodeType(NodeType.ELEMENT);
// Set column name
elementField.addNature(JDOFieldInfoNature.class.getName());
JDOFieldInfoNature jdoField = new JDOFieldInfoNature(elementField);
jdoField.setColumnName("isbn");
classInfo.addFieldInfo(elementField);
FieldInfo attributeField = factory.createFieldInfo(new XSClass(
new JClass("Book")), "title");
// Set node type
attributeField.addNature(XMLInfoNature.class.getName());
new XMLInfoNature(attributeField).setNodeType(NodeType.ATTRIBUTE);
// Set column name
attributeField.addNature(JDOFieldInfoNature.class.getName());
jdoField = new JDOFieldInfoNature(attributeField);
jdoField.setColumnName("title");
classInfo.addFieldInfo(attributeField);
FieldInfo textField = factory.createFieldInfo(new XSClass(
new JClass("Book")), "price");
// Set node type
textField.addNature(XMLInfoNature.class.getName());
new XMLInfoNature(textField).setNodeType(NodeType.TEXT);
// Set column name
textField.addNature(JDOFieldInfoNature.class.getName());
jdoField = new JDOFieldInfoNature(textField);
jdoField.setColumnName("price");
classInfo.addFieldInfo(textField);
// Add JDO Nature to ClassInfo.
classInfo.addNature(JDOClassInfoNature.class.getName());
JDOClassInfoNature jdo = new JDOClassInfoNature(classInfo);
List jdoFields = jdo.getFields();
assertEquals(3, jdoFields.size());
boolean containsElementField = false;
boolean containsAttributeField = false;
boolean containsTextField = false;
for (Iterator fieldIt = jdoFields.iterator(); fieldIt.hasNext();) {
JDOFieldInfoNature nature = (JDOFieldInfoNature) fieldIt.next();
if (nature.getColumnName().equals("isbn")) {
containsElementField = true;
} else if (nature.getColumnName().equals("title")) {
containsAttributeField = true;
} else if (nature.getColumnName().equals("price")) {
containsTextField = true;
}
}
assertTrue(containsElementField);
assertTrue(containsAttributeField);
assertTrue(containsTextField);
}
}