/** * <copyright> * * Copyright (c) 2014 Springsite BV (The Netherlands) 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: * Martin Taal - Initial API and implementation * * </copyright> * * $Id: TestModelAccess.java,v 1.7 2011/08/25 12:42:19 mtaal Exp $ */ package org.eclipse.emf.texo.test; import java.lang.reflect.Method; import junit.framework.TestCase; import org.eclipse.emf.texo.model.ModelObject; import org.eclipse.emf.texo.test.model.issues.bz420913.Bz420913ModelFactory; import org.eclipse.emf.texo.test.model.issues.bz420913.Bz420913ModelPackage; import org.eclipse.emf.texo.test.model.issues.bz420913.Bz420913_O; import org.eclipse.emf.texo.test.model.issues.bz420913.Bz420913_T; import org.eclipse.emf.texo.test.model.issues.bz420913notbidirectional.Bz420913_NotBiDirectionalModelFactory; import org.eclipse.emf.texo.test.model.issues.bz420913notbidirectional.Bz420913_NotBiDirectionalModelPackage; import org.eclipse.emf.texo.test.model.issues.bz420913notbidirectional.Bz420913_NotBiDirectional_O; import org.eclipse.emf.texo.test.model.issues.bz420913notbidirectional.Bz420913_NotBiDirectional_T; import org.junit.Assert; import org.junit.Test; /** * https://bugs.eclipse.org/bugs/show_bug.cgi?id=420913 * * @author <a href="mailto:mtaal@elver.org">Martin Taal</a> * @version $Revision: 1.7 $ */ public class TestBz420913 extends TestCase { @Test public void test() { doTestBidirectionalDirectApi(); doTestBidirectionalModelObjectApi(); doTestNotBidirectionalDirectApi(); } private void doTestNotBidirectionalDirectApi() { Bz420913_NotBiDirectionalModelFactory factory = Bz420913_NotBiDirectionalModelPackage.INSTANCE.getModelFactory(); final Bz420913_NotBiDirectional_O biDirO1 = factory.createBz420913_NotBiDirectional_O(); final Bz420913_NotBiDirectional_T biDirT1 = factory.createBz420913_NotBiDirectional_T(); final Bz420913_NotBiDirectional_O biDirO2 = factory.createBz420913_NotBiDirectional_O(); final Bz420913_NotBiDirectional_T biDirT2 = factory.createBz420913_NotBiDirectional_T(); final ModelObject<?> moDirO2 = factory.createModelObject( Bz420913_NotBiDirectionalModelPackage.INSTANCE.getBz420913_NotBiDirectional_OEClass(), biDirO2); final ModelObject<?> moDirT2 = factory.createModelObject( Bz420913_NotBiDirectionalModelPackage.INSTANCE.getBz420913_NotBiDirectional_TEClass(), biDirT2); biDirO1.setSingleBidirectional(biDirT1); Assert.assertNull(biDirT1.getSingleBidirectional()); biDirT1.setMultiBidirectional(biDirO1); Assert.assertTrue(biDirO1.getMultiBidirectional().isEmpty()); moDirO2.eSet(Bz420913_NotBiDirectionalModelPackage.INSTANCE.getBz420913_NotBiDirectional_O_SingleBidirectional(), biDirT2); Assert.assertNull(biDirT2.getSingleBidirectional()); moDirT2.eSet(Bz420913_NotBiDirectionalModelPackage.INSTANCE.getBz420913_NotBiDirectional_T_SingleBidirectional(), biDirO2); Assert.assertTrue(biDirO1.getMultiBidirectional().isEmpty()); for (Method m : biDirO2.getClass().getMethods()) { if (m.getName().toLowerCase().contains("addto") || m.getName().toLowerCase().contains("removefrom")) { //$NON-NLS-1$//$NON-NLS-2$ Assert.fail("Unexpected bidirectional or safe many access method " + m.getName()); //$NON-NLS-1$ } } } private void doTestBidirectionalModelObjectApi() { Bz420913ModelFactory factory = Bz420913ModelPackage.INSTANCE.getModelFactory(); final Bz420913_O biDirO1 = factory.createBz420913_O(); final Bz420913_T biDirT1 = factory.createBz420913_T(); final Bz420913_O biDirO2 = factory.createBz420913_O(); final Bz420913_T biDirT2 = factory.createBz420913_T(); final ModelObject<?> moDirO1 = factory.createModelObject(Bz420913ModelPackage.INSTANCE.getBz420913_OEClass(), biDirO1); final ModelObject<?> moDirO2 = factory.createModelObject(Bz420913ModelPackage.INSTANCE.getBz420913_OEClass(), biDirO2); final ModelObject<?> moDirT1 = factory.createModelObject(Bz420913ModelPackage.INSTANCE.getBz420913_TEClass(), biDirT1); final ModelObject<?> moDirT2 = factory.createModelObject(Bz420913ModelPackage.INSTANCE.getBz420913_TEClass(), biDirT2); // multi-to-single // initial Assert.assertNull(moDirT1.eGet(Bz420913ModelPackage.INSTANCE.getBz420913_T_MultiBidirectional())); // add moDirO1.eAddTo(Bz420913ModelPackage.INSTANCE.getBz420913_O_MultiBidirectional(), biDirT1); Assert.assertEquals(biDirO1, biDirT1.getMultiBidirectional()); Assert.assertEquals(biDirO1, moDirT1.eGet(Bz420913ModelPackage.INSTANCE.getBz420913_T_MultiBidirectional())); // remove moDirO1.eRemoveFrom(Bz420913ModelPackage.INSTANCE.getBz420913_O_MultiBidirectional(), biDirT1); Assert.assertNull(moDirT1.eGet(Bz420913ModelPackage.INSTANCE.getBz420913_T_MultiBidirectional())); Assert.assertNull(biDirT1.getMultiBidirectional()); // set from single moDirT1.eSet(Bz420913ModelPackage.INSTANCE.getBz420913_T_MultiBidirectional(), biDirO1); Assert.assertEquals(biDirO1.getMultiBidirectional().get(0), biDirT1); Assert.assertEquals(biDirO1, biDirT1.getMultiBidirectional()); Assert.assertEquals(biDirO1, moDirT1.eGet(Bz420913ModelPackage.INSTANCE.getBz420913_T_MultiBidirectional())); // set a second one moDirO1.eAddTo(Bz420913ModelPackage.INSTANCE.getBz420913_O_MultiBidirectional(), biDirT2); Assert.assertEquals(biDirO1.getMultiBidirectional().get(1), biDirT2); Assert.assertEquals(biDirO1, biDirT2.getMultiBidirectional()); Assert.assertEquals(biDirO1, moDirT2.eGet(Bz420913ModelPackage.INSTANCE.getBz420913_T_MultiBidirectional())); // set second from single side, first remove moDirO1.eRemoveFrom(Bz420913ModelPackage.INSTANCE.getBz420913_O_MultiBidirectional(), biDirT2); Assert.assertTrue(biDirO1.getMultiBidirectional().size() == 1); // set from single side again moDirT2.eSet(Bz420913ModelPackage.INSTANCE.getBz420913_T_MultiBidirectional(), biDirO1); Assert.assertEquals(biDirO1.getMultiBidirectional().get(1), biDirT2); // replace moDirO2.eAddTo(Bz420913ModelPackage.INSTANCE.getBz420913_O_MultiBidirectional(), biDirT2); Assert.assertEquals(biDirO2.getMultiBidirectional().get(0), biDirT2); Assert.assertEquals(biDirO2, biDirT2.getMultiBidirectional()); // should be removed on the other side Assert.assertTrue(biDirO1.getMultiBidirectional().size() == 1); // single-to-single // set moDirO1.eSet(Bz420913ModelPackage.INSTANCE.getBz420913_O_SingleBidirectional(), biDirT1); Assert.assertEquals(biDirT1.getSingleBidirectional(), biDirO1); // remove moDirO1.eSet(Bz420913ModelPackage.INSTANCE.getBz420913_O_SingleBidirectional(), null); biDirO1.setSingleBidirectional(null); Assert.assertNull(biDirT1.getSingleBidirectional()); // set and replace moDirO1.eSet(Bz420913ModelPackage.INSTANCE.getBz420913_O_SingleBidirectional(), biDirT1); Assert.assertEquals(biDirT1.getSingleBidirectional(), biDirO1); moDirO1.eSet(Bz420913ModelPackage.INSTANCE.getBz420913_O_SingleBidirectional(), biDirT2); Assert.assertNull(biDirT1.getSingleBidirectional()); Assert.assertEquals(biDirT2.getSingleBidirectional(), biDirO1); moDirO2.eSet(Bz420913ModelPackage.INSTANCE.getBz420913_O_SingleBidirectional(), biDirT2); Assert.assertNull(biDirO1.getSingleBidirectional()); Assert.assertEquals(biDirT2.getSingleBidirectional(), biDirO2); // multi-to-multi moDirO1.eAddTo(Bz420913ModelPackage.INSTANCE.getBz420913_O_MultiMultiBidirectional(), biDirT1); moDirO1.eAddTo(Bz420913ModelPackage.INSTANCE.getBz420913_O_MultiMultiBidirectional(), biDirT2); Assert.assertTrue(biDirT1.getMultiMultiBidirectional().contains(biDirO1)); Assert.assertTrue(biDirT2.getMultiMultiBidirectional().contains(biDirO1)); moDirO2.eAddTo(Bz420913ModelPackage.INSTANCE.getBz420913_O_MultiMultiBidirectional(), biDirT1); moDirO2.eAddTo(Bz420913ModelPackage.INSTANCE.getBz420913_O_MultiMultiBidirectional(), biDirT2); Assert.assertTrue(biDirT1.getMultiMultiBidirectional().contains(biDirO2)); Assert.assertTrue(biDirT2.getMultiMultiBidirectional().contains(biDirO2)); moDirT1.eRemoveFrom(Bz420913ModelPackage.INSTANCE.getBz420913_T_MultiMultiBidirectional(), biDirO1); biDirT1.removeFromMultiMultiBidirectional(biDirO1); Assert.assertTrue(!biDirO1.getMultiMultiBidirectional().contains(biDirT1)); moDirT2.eRemoveFrom(Bz420913ModelPackage.INSTANCE.getBz420913_T_MultiMultiBidirectional(), biDirO1); Assert.assertTrue(!biDirO1.getMultiMultiBidirectional().contains(biDirT2)); } private void doTestBidirectionalDirectApi() { Bz420913ModelFactory factory = Bz420913ModelPackage.INSTANCE.getModelFactory(); final Bz420913_O biDirO1 = factory.createBz420913_O(); final Bz420913_T biDirT1 = factory.createBz420913_T(); final Bz420913_O biDirO2 = factory.createBz420913_O(); final Bz420913_T biDirT2 = factory.createBz420913_T(); // multi-to-single // initial Assert.assertNull(biDirT1.getMultiBidirectional()); // add biDirO1.addToMultiBidirectional(biDirT1); Assert.assertEquals(biDirO1, biDirT1.getMultiBidirectional()); // remove biDirO1.removeFromMultiBidirectional(biDirT1); Assert.assertNull(biDirT1.getMultiBidirectional()); // set from single biDirT1.setMultiBidirectional(biDirO1); Assert.assertEquals(biDirO1.getMultiBidirectional().get(0), biDirT1); // set a second one biDirO1.addToMultiBidirectional(biDirT2); Assert.assertEquals(biDirO1.getMultiBidirectional().get(1), biDirT2); Assert.assertEquals(biDirO1, biDirT2.getMultiBidirectional()); // set second from single side, first remove biDirO1.removeFromMultiBidirectional(biDirT2); Assert.assertTrue(biDirO1.getMultiBidirectional().size() == 1); // set from single side again biDirT2.setMultiBidirectional(biDirO1); Assert.assertEquals(biDirO1.getMultiBidirectional().get(1), biDirT2); // replace biDirO2.addToMultiBidirectional(biDirT2); Assert.assertEquals(biDirO2.getMultiBidirectional().get(0), biDirT2); Assert.assertEquals(biDirO2, biDirT2.getMultiBidirectional()); // should be removed on the other side Assert.assertTrue(biDirO1.getMultiBidirectional().size() == 1); // single-to-single // set biDirO1.setSingleBidirectional(biDirT1); Assert.assertEquals(biDirT1.getSingleBidirectional(), biDirO1); // remove biDirO1.setSingleBidirectional(null); Assert.assertNull(biDirT1.getSingleBidirectional()); // set and replace biDirO1.setSingleBidirectional(biDirT1); Assert.assertEquals(biDirT1.getSingleBidirectional(), biDirO1); biDirO1.setSingleBidirectional(biDirT2); Assert.assertNull(biDirT1.getSingleBidirectional()); Assert.assertEquals(biDirT2.getSingleBidirectional(), biDirO1); biDirO2.setSingleBidirectional(biDirT2); Assert.assertNull(biDirO1.getSingleBidirectional()); Assert.assertEquals(biDirT2.getSingleBidirectional(), biDirO2); // multi-to-multi biDirO1.addToMultiMultiBidirectional(biDirT1); biDirO1.addToMultiMultiBidirectional(biDirT2); Assert.assertTrue(biDirT1.getMultiMultiBidirectional().contains(biDirO1)); Assert.assertTrue(biDirT2.getMultiMultiBidirectional().contains(biDirO1)); biDirO2.addToMultiMultiBidirectional(biDirT1); biDirO2.addToMultiMultiBidirectional(biDirT2); Assert.assertTrue(biDirT1.getMultiMultiBidirectional().contains(biDirO2)); Assert.assertTrue(biDirT2.getMultiMultiBidirectional().contains(biDirO2)); biDirT1.removeFromMultiMultiBidirectional(biDirO1); Assert.assertTrue(!biDirO1.getMultiMultiBidirectional().contains(biDirT1)); biDirT2.removeFromMultiMultiBidirectional(biDirO1); Assert.assertTrue(!biDirO1.getMultiMultiBidirectional().contains(biDirT2)); } }