/******************************************************************************* * Copyright (c) 2010-2014 SAP AG and others. * 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: * SAP AG - initial API and implementation *******************************************************************************/ package org.eclipse.skalli.model; import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.skalli.testutil.AssertUtils; import org.eclipse.skalli.testutil.PropertyTestUtil; import org.eclipse.skalli.testutil.TestExtensibleEntityBase; import org.eclipse.skalli.testutil.TestExtension; import org.eclipse.skalli.testutil.TestExtensionEntityBase1; import org.eclipse.skalli.testutil.TestExtensionEntityBase2; import org.eclipse.skalli.testutil.TestUUIDs; import org.junit.Assert; import org.junit.Test; @SuppressWarnings("nls") public class ExtensibleEntityBaseTest { @Test public void testPropertyDefinitions() throws Exception { Map<String, Object> values = PropertyTestUtil.getValues(); Map<Class<?>, String[]> requiredProperties = PropertyTestUtil.getRequiredProperties(); PropertyTestUtil.checkPropertyDefinitions(TestExtensibleEntityBase.class, requiredProperties, values); } @Test public void testExtension() { TestExtensibleEntityBase base = new TestExtensibleEntityBase(TestUUIDs.TEST_UUIDS[0]); Assert.assertNull(base.getExtension(TestExtensionEntityBase1.class)); Assert.assertNull(base.getExtension(null)); Assert.assertTrue(base.getAllExtensions().isEmpty()); TestExtensionEntityBase1 ext1 = new TestExtensionEntityBase1(); TestExtensionEntityBase2 ext2 = new TestExtensionEntityBase2(); base.addExtension(ext1); base.addExtension(ext2); Assert.assertNotNull(base.getExtension(TestExtensionEntityBase1.class)); Assert.assertNotNull(base.getExtension(TestExtensionEntityBase2.class)); Collection<ExtensionEntityBase> c = base.getAllExtensions(); Assert.assertEquals(2, c.size()); Assert.assertTrue(c.contains(ext1)); Assert.assertTrue(c.contains(ext2)); base.addExtension(ext1); c = base.getAllExtensions(); Assert.assertEquals(2, c.size()); Assert.assertTrue(c.contains(ext1)); Assert.assertTrue(c.contains(ext2)); Iterator<ExtensionEntityBase> it = c.iterator(); Assert.assertEquals(ext1, it.next()); Assert.assertEquals(ext2, it.next()); base.addExtension(null); c = base.getAllExtensions(); Assert.assertEquals(2, c.size()); Assert.assertTrue(c.contains(ext1)); Assert.assertTrue(c.contains(ext2)); base.removeExtension(TestExtensionEntityBase1.class); c = base.getAllExtensions(); Assert.assertNull(base.getExtension(TestExtensionEntityBase1.class)); Assert.assertEquals(1, c.size()); Assert.assertTrue(c.contains(ext2)); base.removeExtension(TestExtensionEntityBase2.class); Assert.assertNull(base.getExtension(TestExtensionEntityBase1.class)); Assert.assertNull(base.getExtension(TestExtensionEntityBase2.class)); Assert.assertTrue(base.getAllExtensions().isEmpty()); } @Test public void testInheritedExtension() { TestExtensibleEntityBase base = new TestExtensibleEntityBase(TestUUIDs.TEST_UUIDS[0]); TestExtensibleEntityBase parent = new TestExtensibleEntityBase(TestUUIDs.TEST_UUIDS[1]); TestExtensibleEntityBase parentParent = new TestExtensibleEntityBase(TestUUIDs.TEST_UUIDS[2]); TestExtension ext1 = new TestExtension(); ext1.setExtensibleEntity(base); ext1.setBool(true); ext1.setStr("Homer"); List<String> list1 = Arrays.asList("A", "B"); ext1.addItem(list1.get(0)); ext1.addItem(list1.get(1)); base.addExtension(ext1); TestExtension ext2 = new TestExtension(); ext2.setExtensibleEntity(parent); ext2.setBool(false); ext2.setStr("Marge"); List<String> list2 = Arrays.asList("C", "D"); ext2.addItem(list2.get(0)); ext2.addItem(list2.get(1)); parent.addExtension(ext2); TestExtension ext3 = new TestExtension(); ext3.setExtensibleEntity(parent); ext3.setBool(false); ext3.setStr("Lisa"); List<String> list3 = Arrays.asList("E", "F"); ext3.addItem(list3.get(0)); ext3.addItem(list3.get(1)); parentParent.addExtension(ext3); base.setParentEntity(parent); parent.setParentEntity(parentParent); // TestExtension.class is not inherited => expect ext1 Assert.assertFalse(base.isInherited(TestExtension.class)); Assert.assertFalse(parent.isInherited(TestExtension.class)); TestExtension ext = base.getExtension(TestExtension.class); Assert.assertNotNull(ext); Assert.assertEquals(ext1, ext); Assert.assertEquals("Homer", ext.getStr()); AssertUtils.assertEquals("", list1, ext.getItems()); // setInherited(TestExtension.class) => expect ext2 from parent base.setInherited(TestExtension.class, true); Assert.assertTrue(base.isInherited(TestExtension.class)); Assert.assertFalse(parent.isInherited(TestExtension.class)); ext = base.getExtension(TestExtension.class); Assert.assertNotNull(ext); Assert.assertEquals(ext2, ext); Assert.assertEquals("Marge", ext.getStr()); AssertUtils.assertEquals("", list2, ext.getItems()); // remove ext2 from parent => expect null parent.removeExtension(TestExtension.class); Assert.assertTrue(base.isInherited(TestExtension.class)); Assert.assertFalse(parent.isInherited(TestExtension.class)); Assert.assertNull(base.getExtension(TestExtension.class)); // switch parent to inheritance, too => expect ext3 from parentParent parent.setInherited(TestExtension.class, true); Assert.assertTrue(base.isInherited(TestExtension.class)); Assert.assertTrue(parent.isInherited(TestExtension.class)); ext = base.getExtension(TestExtension.class); Assert.assertNotNull(ext); Assert.assertEquals(ext3, ext); Assert.assertEquals("Lisa", ext.getStr()); AssertUtils.assertEquals("", list3, ext.getItems()); // remove ext3 from parentParent => expect null parentParent.removeExtension(TestExtension.class); Assert.assertTrue(base.isInherited(TestExtension.class)); Assert.assertTrue(parent.isInherited(TestExtension.class)); Assert.assertNull(base.getExtension(TestExtension.class)); // add ext2 to parent again => inheritance switched off => expect ext2 parent.addExtension(ext2); Assert.assertTrue(base.isInherited(TestExtension.class)); Assert.assertFalse(parent.isInherited(TestExtension.class)); ext = base.getExtension(TestExtension.class); Assert.assertNotNull(ext); Assert.assertEquals(ext2, ext); Assert.assertEquals("Marge", ext.getStr()); AssertUtils.assertEquals("", list2, ext.getItems()); // switch off inheritance => expect null base.setInherited(TestExtension.class, false); Assert.assertFalse(base.isInherited(TestExtension.class)); Assert.assertFalse(parent.isInherited(TestExtension.class)); Assert.assertNull(base.getExtension(TestExtension.class)); // add ext1 to base again => expect ext1 base.addExtension(ext1); Assert.assertFalse(base.isInherited(TestExtension.class)); Assert.assertFalse(parent.isInherited(TestExtension.class)); ext = base.getExtension(TestExtension.class); Assert.assertNotNull(ext); Assert.assertEquals(ext1, ext); Assert.assertEquals("Homer", ext.getStr()); AssertUtils.assertEquals("", list1, ext.getItems()); // switch parent to inheritance, again => expect ext1 parent.setInherited(TestExtension.class, true); Assert.assertFalse(base.isInherited(TestExtension.class)); Assert.assertTrue(parent.isInherited(TestExtension.class)); ext = base.getExtension(TestExtension.class); Assert.assertNotNull(ext); Assert.assertEquals(ext1, ext); Assert.assertEquals("Homer", ext.getStr()); AssertUtils.assertEquals("", list1, ext.getItems()); } }