/** * Copyright (c) 2006 IBM Corporation 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: * IBM - Initial API and implementation */ package org.eclipse.emf.test.tools.merger.facade; import static org.eclipse.emf.codegen.merge.java.facade.FacadeFlags.FINAL; import static org.eclipse.emf.codegen.merge.java.facade.FacadeFlags.PROTECTED; import static org.eclipse.emf.codegen.merge.java.facade.FacadeFlags.PUBLIC; import static org.eclipse.emf.codegen.merge.java.facade.FacadeFlags.STATIC; import static org.eclipse.emf.codegen.merge.java.facade.FacadeFlags.TRANSIENT; import static org.eclipse.emf.codegen.merge.java.facade.FacadeFlags.VOLATILE; import static org.eclipse.emf.test.tools.merger.facade.BaseFacadeTest.Operation.ADD; import static org.eclipse.emf.test.tools.merger.facade.BaseFacadeTest.Operation.REMOVE; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.eclipse.emf.codegen.merge.java.facade.JEnum; import org.eclipse.emf.codegen.merge.java.facade.JField; import org.eclipse.emf.codegen.merge.java.facade.JType; import org.junit.Test; public class FieldsTest extends BaseFacadeTest { /** * Moves field1 from class to the enum. Modifies all properties and tests them during move. */ @Test public void testMoveAndModify1() { moveAndModifyField1(); rewriteAndCompare("TestMoveAndModify1"); } /** * Does all modifications of {@link #testMoveAndModify1()}, * switches the order of annotations of field1 in enum, modifies these annotations, * then clones the field and inserts cloned field back into class 1. */ @Test public void testMoveAndModify2() { moveAndModifyField2(); rewriteAndCompare("TestMoveAndModify2"); } /** * Does all modifications of {@link #testMoveAndModify2()}, * and at the end switches the order of enum and class. */ @Test public void testMoveClasses() { moveAndModifyField2(); JType type = (JType)compilationUnit.getChildren().get(0); // switch class and enum assertTrue(facadeHelper.remove(type)); assertFalse(facadeHelper.remove(type)); updateNoChildren(compilationUnit, type, REMOVE, 2); assertTrue(facadeHelper.addChild(compilationUnit, type)); assertFalse(facadeHelper.addChild(compilationUnit, type)); updateNoChildren(compilationUnit, type, ADD, 1); rewriteAndCompare("TestMoveClasses"); } /** * Moves field1 from class to the enum. Modifies all properties and tests them during move. */ protected void moveAndModifyField1() { testNoChildren(compilationUnit, 2); JType type1 = (JType)compilationUnit.getChildren().get(0); JEnum enum1 = (JEnum)compilationUnit.getChildren().get(1); testNoChildren(type1, 2); testNoChildren(enum1, 0); JField field1 = (JField)type1.getChildren().get(0); readOriginalField1(field1); modifyField(field1, "1_1"); facadeHelper.remove(field1); updateNoChildren(type1, field1, REMOVE, 2); modifyField(field1, "1_2"); readModifiedField1(field1, "1_2"); facadeHelper.addChild(enum1, field1); updateNoChildren(enum1, field1, ADD, 0); modifyField(field1, "1_3"); readModifiedField1(field1, "1_3"); } /** * Does all modifications of {@link #testMoveAndModify1()}, * switches the order of annotations of field1 in enum, modifies these annotations, * then clones the field and inserts cloned field back into class 1. */ protected void moveAndModifyField2() { moveAndModifyField1(); // get field that was moved from class to enum JType type = (JType)compilationUnit.getChildren().get(0); JField field1 = (JField)compilationUnit.getChildren().get(1).getChildren().get(0); // switch annotations AnnotationsTest annotationsTest = new AnnotationsTest(this); annotationsTest.switchVersionAndDeprecatedAnnotations(field1); // clone field Object context = facadeHelper.getContext(type); JField clonedField = (JField)facadeHelper.cloneNode(context, field1); // insert cloned field back in the class assertTrue(facadeHelper.addChild(type, clonedField)); assertFalse(facadeHelper.addChild(type, clonedField)); updateNoChildren(type, clonedField, ADD, 1); } protected void modifyField(JField field, String modificationId) { field.setComment("/** Javadoc " + modificationId + " **/"); field.setInitializer("new Object() {\n // line comment " + modificationId + "\n // line comment\n }"); field.setType("Type_" + modificationId); field.setName("field_modified_" + modificationId); } protected void readOriginalField1(JField field) { testNoChildren(field, 2); assertEquals("/**\n * Javadoc for field1\n * Another line of javadoc\n */", field.getComment()); assertEquals(PUBLIC | STATIC | TRANSIENT | VOLATILE, field.getFlags()); assertEquals("new Object() {\n // line comment\n // line comment\n }", field.getInitializer()); assertEquals("List< ? extends Serializable >", field.getType()); assertEquals("field1", field.getName()); } protected void readOriginalField2(JField field) { testNoChildren(field, 2); assertEquals("/**\n * Javadoc for field2\n * Another line of javadoc\n */", field.getComment()); assertEquals(PROTECTED | FINAL, field.getFlags()); assertEquals(null, field.getInitializer()); assertEquals("T", field.getType()); assertEquals("field2", field.getName()); } protected void readModifiedField1(JField field2, String modificationId) { testNoChildren(field2, 2); assertEquals("/** Javadoc " + modificationId + " **/", field2.getComment()); assertEquals(PUBLIC | STATIC | TRANSIENT | VOLATILE, field2.getFlags()); assertEquals("new Object() {\n // line comment " + modificationId + "\n // line comment\n }", field2.getInitializer()); assertEquals("Type_" + modificationId, field2.getType()); assertEquals("field_modified_" + modificationId, field2.getName()); } protected void readModifiedField2(JField field2, String modificationId) { testNoChildren(field2, 2); assertEquals("/** Javadoc " + modificationId + " **/", field2.getComment()); assertEquals(PROTECTED | FINAL, field2.getFlags()); assertEquals("new Object() {\n // line comment " + modificationId + "\n // line comment\n }", field2.getInitializer()); assertEquals("Type_" + modificationId, field2.getType()); assertEquals("field_modified_" + modificationId, field2.getName()); } }