blob: dea986ec0734ab44598fa23c7fcf901757d576be [file] [log] [blame]
/*
* Copyright (c) 2018 BSI Business Systems Integration AG.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* BSI Business Systems Integration AG - initial API and implementation
*/
package org.eclipse.scout.rt.dataobject;
import static org.junit.Assert.*;
import java.util.Date;
import java.util.Map;
import java.util.Optional;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.DataObjectFixture_1_0_0;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.DataObjectFixture_1_0_0_034;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.DataObjectFixture_1_0_0_Duplicate;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.DataObjectFixture_No_Version;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.NonRegisteredNamespaceFixture_1_0_0;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectProjectFixtureTypeVersions.DataObjectProjectFixture_1_2_3_004;
import org.eclipse.scout.rt.dataobject.fixture.DateFixtureDo;
import org.eclipse.scout.rt.dataobject.fixture.EntityFixtureDo;
import org.eclipse.scout.rt.dataobject.fixture.EntityFixtureInvalidTypeNameDo;
import org.eclipse.scout.rt.dataobject.fixture.OtherEntityFixtureDo;
import org.eclipse.scout.rt.dataobject.fixture.ProjectFixtureDo;
import org.eclipse.scout.rt.dataobject.fixture.ProjectSubFixtureDo;
import org.eclipse.scout.rt.dataobject.fixture.ScoutFixtureDo;
import org.eclipse.scout.rt.platform.BEANS;
import org.eclipse.scout.rt.platform.BeanMetaData;
import org.eclipse.scout.rt.platform.IBean;
import org.eclipse.scout.rt.platform.util.Assertions.AssertionException;
import org.eclipse.scout.rt.testing.platform.BeanTestingHelper;
import org.eclipse.scout.rt.testing.platform.runner.PlatformTestRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Various tests for {@link DataObjectInventory}
*/
@RunWith(PlatformTestRunner.class)
public class DataObjectInventoryTest {
protected DataObjectInventory m_inventory;
@TypeName("TestBaseFixtureEntity")
public static abstract class TestBaseFixtureEntityDo extends DoEntity {
}
public static class TestFixtureSubclass1Do extends TestBaseFixtureEntityDo {
}
public static class TestFixtureSubclass2Do extends TestBaseFixtureEntityDo {
}
@TypeName("TestFixtureEntity")
public static abstract class TestFixtureEntityDo extends DoEntity {
public DoValue<String> id() {
return doValue("id");
}
// static attribute definitions should be ignored
public static DoValue<String> idStatic() {
return new DoValue<>();
}
}
@Before
public void before() {
m_inventory = new DataObjectInventory();
m_inventory.registerClassByTypeName(EntityFixtureDo.class);
m_inventory.registerClassByTypeName(OtherEntityFixtureDo.class);
m_inventory.registerClassByTypeName(DateFixtureDo.class);
m_inventory.registerClassByTypeName(TestFixtureEntityDo.class);
m_inventory.registerClassByTypeName(EntityFixtureInvalidTypeNameDo.class);
}
@Test
public void testValidateTypeVersionImplementors() {
m_inventory.validateTypeVersionImplementors(); // no exception
BeanTestingHelper beanTestingHelper = BEANS.get(BeanTestingHelper.class);
IBean<Object> fixtureNoVersionBean = beanTestingHelper.registerBean(new BeanMetaData(DataObjectFixture_No_Version.class));
try {
assertThrows(AssertionException.class, () -> m_inventory.validateTypeVersionImplementors());
}
finally {
beanTestingHelper.unregisterBean(fixtureNoVersionBean);
}
IBean<Object> fixtureNoRegisteredNamespaceBean = beanTestingHelper.registerBean(new BeanMetaData(NonRegisteredNamespaceFixture_1_0_0.class));
try {
assertThrows(AssertionException.class, () -> m_inventory.validateTypeVersionImplementors());
}
finally {
beanTestingHelper.unregisterBean(fixtureNoRegisteredNamespaceBean);
}
IBean<Object> fixtureDuplicateVersionBean = beanTestingHelper.registerBean(new BeanMetaData(DataObjectFixture_1_0_0_Duplicate.class));
try {
assertThrows(AssertionException.class, () -> m_inventory.validateTypeVersionImplementors());
}
finally {
beanTestingHelper.unregisterBean(fixtureDuplicateVersionBean);
}
}
@Test
public void testToTypeName() {
assertEquals("EntityFixture", m_inventory.toTypeName(EntityFixtureDo.class));
assertEquals("OtherEntityFixture", m_inventory.toTypeName(OtherEntityFixtureDo.class));
assertEquals("DateFixture", m_inventory.toTypeName(DateFixtureDo.class));
assertNull(m_inventory.toTypeName(EntityFixtureInvalidTypeNameDo.class));
assertNull(m_inventory.toTypeName(TestFixtureSubclass1Do.class));
assertNull(m_inventory.toTypeName(null));
assertNull(m_inventory.toTypeName(Object.class));
assertNull(m_inventory.toTypeName(String.class));
}
@Test
public void testFromTypeName() {
assertEquals(EntityFixtureDo.class, m_inventory.fromTypeName("EntityFixture"));
assertEquals(OtherEntityFixtureDo.class, m_inventory.fromTypeName("OtherEntityFixture"));
assertNull(m_inventory.fromTypeName(null));
assertNull(m_inventory.fromTypeName("foo"));
m_inventory.registerClassByTypeName(TestBaseFixtureEntityDo.class);
assertNull(m_inventory.fromTypeName("TestBaseFixtureEntity"));
}
@Test
public void testGetTypeNameToClassMapItems() {
assertEquals(EntityFixtureDo.class, m_inventory.getTypeNameToClassMap().get("EntityFixture"));
assertEquals(OtherEntityFixtureDo.class, m_inventory.getTypeNameToClassMap().get("OtherEntityFixture"));
}
@Test
public void testGetTypeNameToClassMapSize() {
assertEquals(4, m_inventory.getTypeNameToClassMap().size());
}
@Test
public void testGetAttributeDescription() throws Exception {
Optional<DataObjectAttributeDescriptor> attributeDescription = m_inventory.getAttributeDescription(EntityFixtureDo.class, "id");
assertTrue(attributeDescription.isPresent());
assertEquals("id", attributeDescription.get().getName());
assertEquals(DoValue.class, attributeDescription.get().getType().getRawType());
assertEquals(String.class, attributeDescription.get().getType().getActualTypeArguments()[0]);
assertEquals(EntityFixtureDo.class.getMethod("id"), attributeDescription.get().getAccessor());
assertFalse(attributeDescription.get().getFormatPattern().isPresent());
attributeDescription = m_inventory.getAttributeDescription(EntityFixtureDo.class, "otherEntities");
assertTrue(attributeDescription.isPresent());
assertEquals("otherEntities", attributeDescription.get().getName());
assertEquals(DoList.class, attributeDescription.get().getType().getRawType());
assertEquals(OtherEntityFixtureDo.class, attributeDescription.get().getType().getActualTypeArguments()[0]);
assertEquals(EntityFixtureDo.class.getMethod("otherEntities"), attributeDescription.get().getAccessor());
assertFalse(attributeDescription.get().getFormatPattern().isPresent());
attributeDescription = m_inventory.getAttributeDescription(DateFixtureDo.class, "date");
assertTrue(attributeDescription.isPresent());
assertEquals("date", attributeDescription.get().getName());
assertEquals(DoValue.class, attributeDescription.get().getType().getRawType());
assertEquals(Date.class, attributeDescription.get().getType().getActualTypeArguments()[0]);
assertEquals(DateFixtureDo.class.getMethod("date"), attributeDescription.get().getAccessor());
assertEquals(IValueFormatConstants.DATE_PATTERN, attributeDescription.get().getFormatPattern().get());
attributeDescription = m_inventory.getAttributeDescription(DateFixtureDo.class, "list");
assertTrue(attributeDescription.isPresent());
assertEquals("list", attributeDescription.get().getName());
assertEquals(DoList.class, attributeDescription.get().getType().getRawType());
assertEquals(Integer.class, attributeDescription.get().getType().getActualTypeArguments()[0]);
assertEquals(DateFixtureDo.class.getMethod("_list"), attributeDescription.get().getAccessor());
assertFalse(attributeDescription.get().getFormatPattern().isPresent());
assertFalse(m_inventory.getAttributeDescription(EntityFixtureDo.class, "foo").isPresent());
assertFalse(m_inventory.getAttributeDescription(DoEntity.class, "foo").isPresent());
attributeDescription = m_inventory.getAttributeDescription(TestFixtureEntityDo.class, "id");
assertTrue(attributeDescription.isPresent());
attributeDescription = m_inventory.getAttributeDescription(TestFixtureEntityDo.class, "idStatic");
assertFalse(attributeDescription.isPresent());
}
@Test
public void testGetAttributesDescription() {
Map<String, DataObjectAttributeDescriptor> attributesDescription = m_inventory.getAttributesDescription(EntityFixtureDo.class);
assertEquals(5, attributesDescription.size());
assertEquals("id", attributesDescription.get("id").getName());
assertEquals("otherEntity", attributesDescription.get("otherEntity").getName());
assertEquals("otherEntities", attributesDescription.get("otherEntities").getName());
assertEquals("otherEntitiesList", attributesDescription.get("otherEntitiesList").getName());
assertEquals("otherEntitiesMap", attributesDescription.get("otherEntitiesMap").getName());
}
@Test(expected = AssertionException.class)
public void testRegisterDuplicateTypeName() {
m_inventory.registerClassByTypeName(EntityFixtureDo.class);
m_inventory.registerClassByTypeName(EntityFixtureDo.class);
}
@Test
public void testResolveTypeName() {
assertEquals("EntityFixture", m_inventory.resolveTypeName(EntityFixtureDo.class));
assertEquals("TestBaseFixtureEntity", m_inventory.resolveTypeName(TestFixtureSubclass1Do.class));
assertEquals("", m_inventory.resolveTypeName(EntityFixtureInvalidTypeNameDo.class));
assertNull(m_inventory.resolveTypeName(Object.class));
}
@Test
public void testResolveTypeVersionClass() {
assertNull(m_inventory.resolveTypeVersionClass(EntityFixtureDo.class));
assertEquals(DataObjectFixture_1_0_0.class, m_inventory.resolveTypeVersionClass(OtherEntityFixtureDo.class));
assertNull(m_inventory.resolveTypeVersionClass(Object.class));
m_inventory.registerClassByTypeVersion(ScoutFixtureDo.class);
assertEquals(DataObjectFixture_1_0_0_034.VERSION, m_inventory.getTypeVersion(ScoutFixtureDo.class));
m_inventory.registerClassByTypeVersion(ProjectFixtureDo.class);
assertEquals(DataObjectProjectFixture_1_2_3_004.VERSION, m_inventory.getTypeVersion(ProjectFixtureDo.class));
assertNull(m_inventory.getTypeVersion(ProjectSubFixtureDo.class));
}
@Test(expected = AssertionException.class)
public void testRegisterDuplicateTypeVersion() {
m_inventory.registerClassByTypeVersion(ScoutFixtureDo.class);
m_inventory.registerClassByTypeVersion(ScoutFixtureDo.class);
}
/**
* Test for {@link DataObjectInventory#init()} based on class inventory
*/
@Test
public void testInit() {
DataObjectInventory inv = BEANS.get(DataObjectInventory.class);
assertEquals("ScoutFixture", inv.toTypeName(ScoutFixtureDo.class));
assertEquals("ScoutFixture", inv.toTypeName(ProjectFixtureDo.class));
assertEquals("ScoutFixture", inv.toTypeName(ProjectSubFixtureDo.class));
assertEquals(DataObjectFixture_1_0_0_034.VERSION, inv.getTypeVersion(ScoutFixtureDo.class));
assertEquals(DataObjectProjectFixture_1_2_3_004.VERSION, inv.getTypeVersion(ProjectFixtureDo.class));
assertNull(inv.getTypeVersion(ProjectSubFixtureDo.class));
}
}