/* * (C) Copyright 2006-2011 Nuxeo SA (http://nuxeo.com/) and others. * * 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. * * Contributors: * Nuxeo - initial API and implementation * * $Id: JOOoConvertPluginImpl.java 18651 2007-05-13 20:28:53Z sfermigier $ */ package org.nuxeo.ecm.core.schema.types; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; import org.nuxeo.ecm.core.schema.Namespace; import org.nuxeo.ecm.core.schema.SchemaManager; import org.nuxeo.ecm.core.schema.SchemaNames; import org.nuxeo.ecm.core.schema.types.primitives.BooleanType; import org.nuxeo.ecm.core.schema.types.primitives.DateType; import org.nuxeo.ecm.core.schema.types.primitives.DoubleType; import org.nuxeo.ecm.core.schema.types.primitives.IntegerType; import org.nuxeo.ecm.core.schema.types.primitives.LongType; import org.nuxeo.ecm.core.schema.types.primitives.StringType; import org.nuxeo.runtime.api.Framework; import org.nuxeo.runtime.test.NXRuntimeTestCase; public class TestTypes extends NXRuntimeTestCase { @Override @Before public void setUp() throws Exception { super.setUp(); deployBundle("org.nuxeo.ecm.core.schema"); } // ANY type @Test public void testAnyType() throws TypeException { Type type = AnyType.INSTANCE; assertEquals(AnyType.ID, type.getName()); assertTrue(type.isAnyType()); assertFalse(type.isSimpleType()); // assertFalse(type.isPrimitive()); assertFalse(type.isComplexType()); assertNull(type.getSuperType()); assertEquals(0, type.getTypeHierarchy().length); // ANY validates anything assertTrue(type.validate(0)); assertTrue(type.validate("")); assertTrue(type.validate(true)); } // Primitive types @Test public void testStringType() throws TypeException { SimpleType type = StringType.INSTANCE; assertEquals("string", type.getName()); assertTrue(type.isSimpleType()); assertTrue(type.isPrimitive()); assertFalse(type.isComplexType()); assertFalse(type.isAnyType()); assertNull(type.getSuperType()); assertEquals(0, type.getTypeHierarchy().length); assertTrue(type.validate(0)); assertTrue(type.validate("")); assertTrue(type.validate(true)); // TODO: test convert method } @SuppressWarnings({ "SimplifiableJUnitAssertion", "AssertEqualsBetweenInconvertibleTypes" }) @Test public void testBooleanType() throws TypeException { SimpleType type = BooleanType.INSTANCE; assertEquals("boolean", type.getName()); assertTrue(type.isSimpleType()); assertTrue(type.isPrimitive()); assertFalse(type.isComplexType()); assertFalse(type.isAnyType()); assertNull(type.getSuperType()); assertEquals(0, type.getTypeHierarchy().length); // Validation tests assertFalse(type.validate(0)); assertFalse(type.validate("")); assertTrue(type.validate(true)); assertTrue(type.validate(false)); // Conversion tests assertNull(type.decode("")); assertEquals(true, type.convert(true)); assertEquals(false, type.convert(false)); assertEquals(true, type.convert("true")); assertEquals(false, type.convert("false")); assertEquals(true, type.convert(1)); assertEquals(false, type.convert(0)); assertEquals(true, type.decode("true")); } @Test public void testIntegerType() throws TypeException { SimpleType type = IntegerType.INSTANCE; assertEquals("integer", type.getName()); assertTrue(type.isSimpleType()); assertTrue(type.isPrimitive()); assertFalse(type.isComplexType()); assertFalse(type.isAnyType()); assertNull(type.getSuperType()); assertEquals(0, type.getTypeHierarchy().length); // Validation tests assertTrue(type.validate(0)); assertFalse(type.validate("")); assertFalse(type.validate(true)); // Conversion tests assertNull(type.decode("")); assertEquals(0, type.convert(0)); assertEquals(0, type.convert("0")); assertEquals(0, type.convert(0.5)); assertNull(type.convert("abc")); assertEquals(0, type.decode("0")); } @Test public void testDoubleType() throws TypeException { SimpleType type = DoubleType.INSTANCE; assertEquals("double", type.getName()); assertTrue(type.isSimpleType()); assertTrue(type.isPrimitive()); assertFalse(type.isComplexType()); assertFalse(type.isAnyType()); assertNull(type.getSuperType()); assertEquals(0, type.getTypeHierarchy().length); // Validation tests assertTrue(type.validate(0)); assertTrue(type.validate(0.0)); assertFalse(type.validate(true)); assertFalse(type.validate("")); // Conversion tests assertNull(type.decode("")); assertEquals(0.0, type.convert(0)); assertEquals(0.5, type.convert(0.5)); assertEquals(3.14, type.convert("3.14")); assertNull(type.convert("abc")); assertEquals(0.0, type.decode("0.0")); assertEquals(3.14, type.decode("3.14")); } @Test public void testLongType() throws TypeException { SimpleType type = LongType.INSTANCE; assertEquals("long", type.getName()); assertTrue(type.isSimpleType()); assertTrue(type.isPrimitive()); assertFalse(type.isComplexType()); assertFalse(type.isAnyType()); assertNull(type.getSuperType()); assertEquals(0, type.getTypeHierarchy().length); // Validation tests assertTrue(type.validate(0)); assertFalse(type.validate("")); assertFalse(type.validate(true)); // Conversion tests assertNull(type.decode("")); assertEquals(0L, type.convert(0)); assertEquals(0L, type.convert("0")); assertEquals(0L, type.convert(0.5)); assertNull(type.convert("abc")); assertEquals(0L, type.decode("0")); } @Test public void testDateType() throws TypeException { SimpleType type = DateType.INSTANCE; assertEquals("date", type.getName()); assertTrue(type.isSimpleType()); assertTrue(type.isPrimitive()); assertFalse(type.isComplexType()); assertFalse(type.isAnyType()); assertNull(type.getSuperType()); assertEquals(0, type.getTypeHierarchy().length); // Validation tests assertTrue(type.validate(new Date())); assertTrue(type.validate(Calendar.getInstance())); // Conversion tests assertNull(type.decode("")); // TODO (after the DateType class is fully implemented) } // Custom types @Test public void testListType() throws TypeException { ListType type = new ListTypeImpl(SchemaNames.BUILTIN, "list type", StringType.INSTANCE); assertTrue(type.isListType()); assertEquals("list type", type.getName()); assertFalse(type.isCompositeType()); assertFalse(type.isSimpleType()); assertFalse(type.isComplexType()); assertFalse(type.isAnyType()); assertNull(type.getSuperType()); assertEquals(StringType.INSTANCE, type.getFieldType()); // Validation tests assertTrue(type.validate(new Integer[3])); assertTrue(type.validate(null)); assertFalse(type.validate(0)); assertFalse(type.validate("")); assertFalse(type.validate(true)); // Conversion tests assertNull(type.decode("")); Object[] array = (Object[]) type.decode("foo bar"); assertEquals(Arrays.asList("foo", "bar"), Arrays.asList(array)); // TODO: add tests for collections once this is implemented } @Test public void testCompositeType() { CompositeTypeImpl type = new CompositeTypeImpl((CompositeType) null, SchemaNames.BUILTIN, "composite type", null); assertTrue(type.isCompositeType()); assertEquals("composite type", type.getName()); assertFalse(type.isSimpleType()); // XXX: Not is CompositeType API. Why? // assertFalse(type.isPrimitive()); assertFalse(type.isComplexType()); assertFalse(type.isAnyType()); assertNull(type.getSuperType()); // Author schemas API assertFalse(type.hasSchemas()); assertFalse(type.hasSchema("inexisting schema")); assertTrue(type.getSchemas().isEmpty()); // Author fields API assertTrue(type.getFields().isEmpty()); } @Test public void testSchema() { String name = "name"; String uri = "uri"; String prefix = "prefix"; Schema schema = new SchemaImpl(name, new Namespace(uri, prefix)); assertEquals(schema.getName(), name); assertEquals(schema.getNamespace().uri, uri); assertEquals(schema.getNamespace().prefix, prefix); } @Test public void testFieldFromXpath() throws Exception { deployTestContrib("org.nuxeo.ecm.core.schema", "OSGI-INF/test-advanced-schema.xml"); SchemaManager sm = Framework.getService(SchemaManager.class); assertNotNull(sm); Field field = sm.getField("tp:foo"); assertNull(field); field = sm.getField("dc:title"); assertEquals("title", field.getName().getLocalName()); assertEquals("string", field.getType().getName()); field = sm.getField("dc:contributors"); assertEquals("contributors", field.getName().getLocalName()); assertEquals("contributorList", field.getType().getName()); field = sm.getField("tp:stringArray"); assertEquals("stringArray", field.getName().getLocalName()); assertEquals("stringArrayType", field.getType().getName()); field = sm.getField("tp:stringArray/*"); assertEquals("item", field.getName().getLocalName()); assertEquals("string", field.getType().getName()); field = sm.getField("tp:stringArray/1"); assertEquals("item", field.getName().getLocalName()); assertEquals("string", field.getType().getName()); field = sm.getField("tp:complexChain"); assertEquals("complexChain", field.getName().getLocalName()); assertEquals("complexChain", field.getType().getName()); field = sm.getField("tp:complexChain/stringItem"); assertEquals("stringItem", field.getName().getLocalName()); assertEquals("string", field.getType().getName()); field = sm.getField("tp:complexChain/complexItem"); assertEquals("complexItem", field.getName().getLocalName()); assertEquals("complexType", field.getType().getName()); field = sm.getField("tp:complexList/*/stringItem"); assertEquals("stringItem", field.getName().getLocalName()); assertEquals("string", field.getType().getName()); field = sm.getField("tp:complexList/0/stringItem"); assertEquals("stringItem", field.getName().getLocalName()); assertEquals("string", field.getType().getName()); field = sm.getField("tp:listOfLists"); assertEquals("listOfLists", field.getName().getLocalName()); assertEquals("listOfListsType", field.getType().getName()); field = sm.getField("tp:listOfLists/*"); assertEquals("listOfListsItem", field.getName().getLocalName()); assertEquals("listOfListsItemType", field.getType().getName()); field = sm.getField("tp:listOfLists/*/stringItem"); assertEquals("stringItem", field.getName().getLocalName()); assertEquals("string", field.getType().getName()); // XXX maybe this one should resolve to null (invalid item index in xpath) (?) field = sm.getField("tp:listOfLists/stringItem"); assertEquals("stringItem", field.getName().getLocalName()); assertEquals("string", field.getType().getName()); field = sm.getField("tp:listOfLists/*/stringListItem/*"); assertEquals("item", field.getName().getLocalName()); assertEquals("string", field.getType().getName()); field = sm.getField("tp:listOfLists/*/stringListItem/0"); assertEquals("item", field.getName().getLocalName()); assertEquals("string", field.getType().getName()); // XXX maybe this one should resolve to null (invalid item index in xpath) (?) field = sm.getField("tp:listOfLists/stringListItem"); assertEquals("stringListItem", field.getName().getLocalName()); assertEquals("stringList", field.getType().getName()); } @Test public void testSchemaFromType() throws Exception { deployTestContrib("org.nuxeo.ecm.core.schema", "OSGI-INF/test-advanced-schema.xml"); Schema schema = getSchema("foo"); assertNull(schema); schema = getSchema("dc:title"); assertEquals("dublincore", schema.getName()); schema = getSchema("dc:contributors"); assertEquals("dublincore", schema.getName()); schema = getSchema("tp:stringArray"); assertEquals("testProperties", schema.getName()); schema = getSchema("tp:complexChain"); assertEquals("testProperties", schema.getName()); schema = getSchema("tp:complexChain/stringItem"); assertEquals("testProperties", schema.getName()); schema = getSchema("tp:complexChain/complexItem"); assertEquals("testProperties", schema.getName()); schema = getSchema("tp:complexList/*/stringItem"); assertEquals("testProperties", schema.getName()); schema = getSchema("tp:complexList/0/stringItem"); assertEquals("testProperties", schema.getName()); schema = getSchema("tp:listOfLists"); assertEquals("testProperties", schema.getName()); schema = getSchema("tp:listOfLists/*"); assertEquals("testProperties", schema.getName()); schema = getSchema("tp:listOfLists/*/stringItem"); assertEquals("testProperties", schema.getName()); // XXX maybe this one should resolve to null (invalid item index in xpath) (?) schema = getSchema("tp:listOfLists/stringItem"); assertEquals("testProperties", schema.getName()); schema = getSchema("tp:listOfLists/*/stringListItem/*"); assertEquals("testProperties", schema.getName()); schema = getSchema("tp:listOfLists/*/stringListItem/0"); assertEquals("testProperties", schema.getName()); // XXX maybe this one should resolve to null (invalid item index in xpath) (?) schema = getSchema("tp:listOfLists/stringListItem"); assertEquals("testProperties", schema.getName()); } protected Schema getSchema(String xpath) { SchemaManager sm = Framework.getService(SchemaManager.class); assertNotNull(sm); Field field = sm.getField(xpath); if (field != null) { return field.getDeclaringType().getSchema(); } return null; } }