/******************************************************************************* * Copyright (c) 1998, 2016 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.tools.workbench.test.mappingsmodel.meta; import org.eclipse.persistence.tools.workbench.mappingsmodel.meta.MWClass; import org.eclipse.persistence.tools.workbench.mappingsmodel.meta.MWModifier; import org.eclipse.persistence.tools.workbench.mappingsmodel.project.relational.MWRelationalProject; import org.eclipse.persistence.tools.workbench.mappingsmodel.spi.meta.ExternalClassNotFoundException; import org.eclipse.persistence.tools.workbench.test.mappingsmodel.MappingsModelTestTools; import org.eclipse.persistence.tools.workbench.test.utility.TestTools; import org.eclipse.persistence.tools.workbench.uitools.Displayable; import org.eclipse.persistence.tools.workbench.utility.Bag; import org.eclipse.persistence.tools.workbench.utility.Classpath; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; public class MWModifierTests extends TestCase { private MWRelationalProject project; private MWClass type; private MWModifier modifier; private volatile Object volatileField; public static Test suite() { return new TestSuite(MWModifierTests.class); } public MWModifierTests(String name) { super(name); } @Override protected void setUp() throws Exception { super.setUp(); this.project = this.buildProject(); this.project.getRepository().addClasspathEntry(Classpath.locationFor(Bag.class)); // "core" jar this.project.getRepository().addClasspathEntry(Classpath.locationFor(Displayable.class)); // "ui" jar this.project.getRepository().addClasspathEntry(Classpath.locationFor(this.getClass())); this.type = this.project.typeNamed("com.foo.Foo"); this.modifier = this.type.getModifier(); } private MWRelationalProject buildProject() { return new MWRelationalProject(this.getClass().getName(), MappingsModelTestTools.buildSPIManager(), null); // we don't need a database platform } @Override protected void tearDown() throws Exception { TestTools.clear(this); super.tearDown(); } public void testNewModifier() { assertTrue("invalid new modifier: " + this.modifier, this.modifier.isDefaultValue() && ! this.modifier.isAbstract() && ! this.modifier.isFinal() && ! this.modifier.isNative() && ! this.modifier.isPackage() && ! this.modifier.isPrivate() && ! this.modifier.isProtected() && this.modifier.isPublic() && ! this.modifier.isStatic() && ! this.modifier.isStrict() && ! this.modifier.isSynchronized() && ! this.modifier.isTransient() && ! this.modifier.isVolatile() ); } public void testDisplayString() throws Exception { this.verifyClassModifierDisplayString(java.lang.String.class, "public final"); this.verifyClassModifierDisplayString(java.lang.Thread.class, "public"); this.verifyClassModifierDisplayString(java.lang.Cloneable.class, "public abstract"); this.verifyClassModifierDisplayString(java.util.AbstractCollection.class, "public abstract"); this.verifyMethodModifierDisplayString(java.lang.String.class, "valueOf(java.lang.Object)", "public static"); this.verifyMethodModifierDisplayString(java.lang.Thread.class, "interrupt0()", "private native"); this.verifyMethodModifierDisplayString(java.util.Vector.class, "add(java.lang.Object)", "public synchronized"); this.verifyMethodModifierDisplayString(java.util.Vector.class, "removeRange(int, int)", "protected synchronized"); this.verifyMethodModifierDisplayString(java.lang.Math.class, "sin(double)", "public static"); this.verifyAttributeModifierDisplayString(java.util.HashMap.class, "size", "transient"); this.volatileField = "something to keep the compiler from complaining..."; assertEquals(this.volatileField, this.volatileField); this.verifyAttributeModifierDisplayString(this.getClass(), "volatileField", "private volatile"); } private void verifyClassModifierDisplayString(Class javaClass, String expected) throws Exception { MWModifier m = this.modifierForClass(javaClass); assertEquals("invalid display string for " + javaClass.getName(), expected, m.displayString()); } private MWModifier modifierForClass(Class javaClass) throws ExternalClassNotFoundException { return this.fullyPopulatedTypeFor(javaClass).getModifier(); } private void verifyMethodModifierDisplayString(Class javaClass, String methodSignature, String expected) throws Exception { MWModifier m = this.modifierForMethod(javaClass, methodSignature); assertEquals("invalid display string for " + javaClass.getName() + "#" + methodSignature, expected, m.displayString()); } private MWModifier modifierForMethod(Class javaClass, String methodSignature) throws ExternalClassNotFoundException { return this.fullyPopulatedTypeFor(javaClass).methodWithSignature(methodSignature).getModifier(); } private void verifyAttributeModifierDisplayString(Class javaClass, String attributeName, String expected) throws ExternalClassNotFoundException { MWModifier m = this.modifierForAttribute(javaClass, attributeName); assertEquals("invalid display string for " + javaClass.getName() + "." + attributeName, expected, m.displayString()); } private MWModifier modifierForAttribute(Class javaClass, String attributeName) throws ExternalClassNotFoundException { return this.fullyPopulatedTypeFor(javaClass).attributeNamed(attributeName).getModifier(); } public void testCanBeSetAbstract() throws Exception { MWModifier m; m = this.modifierForClass(java.lang.Boolean.class); // final assertTrue( ! m.canBeSetAbstract()); m = this.modifierForClass(java.util.Vector.class); assertTrue(m.canBeSetAbstract()); m = this.modifierForAttribute(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "parent"); // unsupported assertTrue( ! m.canBeSetAbstract()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "AbstractNodeModel(org.eclipse.persistence.tools.workbench.utility.node.Node)"); // ctor assertTrue( ! m.canBeSetAbstract()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "markDirty()"); // private assertTrue( ! m.canBeSetAbstract()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.mappingsmodel.MWModel.class, "legacy60BuildStandardDescriptor()"); // static assertTrue( ! m.canBeSetAbstract()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "children()"); // final assertTrue( ! m.canBeSetAbstract()); m = this.modifierForMethod(java.lang.Object.class, "hashCode()"); // native assertTrue( ! m.canBeSetAbstract()); m = this.modifierForMethod(java.util.Vector.class, "firstElement()"); // synchronized assertTrue( ! m.canBeSetAbstract()); m = this.modifierForMethod(java.util.Vector.class, "clear()"); // concrete class assertTrue( ! m.canBeSetAbstract()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "initialize()"); assertTrue(m.canBeSetAbstract()); } public void testCanBeSetFinal() throws Exception { MWModifier m; m = this.modifierForClass(java.util.AbstractList.class); // abstract assertTrue( ! m.canBeSetFinal()); m = this.modifierForClass(java.util.Vector.class); assertTrue(m.canBeSetFinal()); m = this.modifierForAttribute(org.eclipse.persistence.tools.workbench.utility.node.DefaultProblem.class, "source"); assertTrue(m.canBeSetFinal()); m = this.modifierForAttribute(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "parent"); assertTrue( ! m.canBeSetFinal()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "AbstractNodeModel(org.eclipse.persistence.tools.workbench.utility.node.Node)"); // ctor assertTrue( ! m.canBeSetFinal()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.uitools.Displayable.class, "displayString()"); // abstract assertTrue( ! m.canBeSetFinal()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "initialize()"); assertTrue(m.canBeSetFinal()); } public void testCanBeSetNative() throws Exception { MWModifier m; m = this.modifierForClass(java.util.Vector.class); // unsupported assertTrue( ! m.canBeSetNative()); m = this.modifierForAttribute(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "parent"); // unsupported assertTrue( ! m.canBeSetNative()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "AbstractNodeModel(org.eclipse.persistence.tools.workbench.utility.node.Node)"); // ctor assertTrue( ! m.canBeSetNative()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.uitools.Displayable.class, "displayString()"); // abstract assertTrue( ! m.canBeSetNative()); // need a strictfp method... m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "initialize()"); assertTrue(m.canBeSetNative()); } public void testCanBeSetPackage() throws Exception { MWModifier m; m = this.modifierForClass(java.util.Vector.class); // unrestricted assertTrue(m.canBeSetPackage()); m = this.modifierForAttribute(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "parent"); // unrestricted assertTrue(m.canBeSetPackage()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "initialize()"); // unrestricted assertTrue(m.canBeSetPackage()); } public void testCanBeSetPrivate() throws Exception { MWModifier m; m = this.modifierForClass(java.util.Vector.class); // top level class assertTrue( ! m.canBeSetPrivate()); m = this.modifierForClass(java.util.Map.Entry.class); assertTrue(m.canBeSetPrivate()); m = this.modifierForAttribute(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "parent"); // unrestricted assertTrue(m.canBeSetPrivate()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.uitools.Displayable.class, "displayString()"); // abstract assertTrue( ! m.canBeSetPrivate()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "initialize()"); assertTrue(m.canBeSetPrivate()); } public void testCanBeSetProtected() throws Exception { MWModifier m; m = this.modifierForClass(java.util.Vector.class); // top level class assertTrue( ! m.canBeSetProtected()); m = this.modifierForClass(java.util.Map.Entry.class); assertTrue(m.canBeSetProtected()); m = this.modifierForAttribute(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "parent"); // unrestricted assertTrue(m.canBeSetProtected()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "initialize()"); // unrestricted assertTrue(m.canBeSetProtected()); } public void testCanBeSetPublic() throws Exception { MWModifier m; m = this.modifierForClass(java.util.Map.Entry.class); // unrestricted assertTrue(m.canBeSetPublic()); m = this.modifierForAttribute(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "parent"); // unrestricted assertTrue(m.canBeSetPublic()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "initialize()"); // unrestricted assertTrue(m.canBeSetPublic()); } public void testCanBeSetStatic() throws Exception { MWModifier m; m = this.modifierForClass(java.util.Vector.class); // top level class assertTrue( ! m.canBeSetStatic()); m = this.modifierForClass(java.util.Map.Entry.class); assertTrue(m.canBeSetStatic()); m = this.modifierForAttribute(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "parent"); // unrestricted assertTrue(m.canBeSetStatic()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "AbstractNodeModel(org.eclipse.persistence.tools.workbench.utility.node.Node)"); // ctor assertTrue( ! m.canBeSetStatic()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.uitools.Displayable.class, "displayString()"); // abstract assertTrue( ! m.canBeSetStatic()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "initialize()"); assertTrue(m.canBeSetStatic()); } public void testCanBeSetStrict() throws Exception { MWModifier m; m = this.modifierForClass(java.util.Vector.class); // unrestricted assertTrue(m.canBeSetStrict()); m = this.modifierForAttribute(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "parent"); // unsupported assertTrue( ! m.canBeSetStrict()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "initialize()"); // unrestricted assertTrue(m.canBeSetStrict()); } public void testCanBeSetSychronized() throws Exception { MWModifier m; m = this.modifierForClass(java.util.Vector.class); // unsupported assertTrue( ! m.canBeSetSynchronized()); m = this.modifierForAttribute(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "parent"); // unsupported assertTrue( ! m.canBeSetSynchronized()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "AbstractNodeModel(org.eclipse.persistence.tools.workbench.utility.node.Node)"); // ctor assertTrue( ! m.canBeSetSynchronized()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.uitools.Displayable.class, "displayString()"); // abstract assertTrue( ! m.canBeSetSynchronized()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "initialize()"); assertTrue(m.canBeSetSynchronized()); } public void testCanBeSetTransient() throws Exception { MWModifier m; m = this.modifierForClass(java.util.Vector.class); // unsupported assertTrue( ! m.canBeSetTransient()); m = this.modifierForAttribute(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "parent"); // unrestricted assertTrue(m.canBeSetTransient()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "initialize()"); // unsupported assertTrue( ! m.canBeSetTransient()); } public void testCanBeSetVolatile() throws Exception { MWModifier m; m = this.modifierForClass(java.util.Vector.class); // unsupported assertTrue( ! m.canBeSetVolatile()); m = this.modifierForAttribute(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "COMMENT_PROPERTY"); // final assertTrue( ! m.canBeSetVolatile()); m = this.modifierForAttribute(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "parent"); assertTrue(m.canBeSetVolatile()); m = this.modifierForMethod(org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel.class, "initialize()"); // unsupported assertTrue( ! m.canBeSetVolatile()); } public void testSetAbstract() { this.setAllFlagsIn(this.modifier); this.modifier.setAbstract(false); assertTrue("invalid modifier: " + this.modifier, ! this.modifier.isAbstract()); this.modifier.setAbstract(true); assertTrue("invalid modifier: " + this.modifier, this.modifier.isAbstract()); } public void testSetFinal() { this.setAllFlagsIn(this.modifier); this.modifier.setFinal(false); assertTrue("invalid modifier: " + this.modifier, ! this.modifier.isFinal()); this.modifier.setFinal(true); assertTrue("invalid modifier: " + this.modifier, this.modifier.isFinal()); } public void testSetNative() { this.setAllFlagsIn(this.modifier); this.modifier.setNative(false); assertTrue("invalid modifier: " + this.modifier, ! this.modifier.isNative()); this.modifier.setNative(true); assertTrue("invalid modifier: " + this.modifier, this.modifier.isNative()); } public void testSetPackage() { this.setAllFlagsIn(this.modifier); this.modifier.setPackage(false); assertTrue("invalid modifier: " + this.modifier, this.modifier.isPublic() && ! this.modifier.isProtected() && ! this.modifier.isPackage() && ! this.modifier.isPrivate() ); this.modifier.setPackage(true); assertTrue("invalid modifier: " + this.modifier, ! this.modifier.isPublic() && ! this.modifier.isProtected() && this.modifier.isPackage() && ! this.modifier.isPrivate() ); } public void testSetPrivate() { this.setAllFlagsIn(this.modifier); this.modifier.setPublic(false); // need to clean up flags a bit... this.modifier.setProtected(false); this.modifier.setPrivate(false); assertTrue("invalid modifier: " + this.modifier, ! this.modifier.isPublic() && ! this.modifier.isProtected() && this.modifier.isPackage() && ! this.modifier.isPrivate() ); this.modifier.setPrivate(true); assertTrue("invalid modifier: " + this.modifier, ! this.modifier.isPublic() && ! this.modifier.isProtected() && ! this.modifier.isPackage() && this.modifier.isPrivate() ); } public void testSetProtected() { this.setAllFlagsIn(this.modifier); this.modifier.setPublic(false); // need to clean up flags a bit... this.modifier.setProtected(false); this.modifier.setPrivate(false); assertTrue("invalid modifier: " + this.modifier, ! this.modifier.isPublic() && ! this.modifier.isProtected() && this.modifier.isPackage() && ! this.modifier.isPrivate() ); this.modifier.setProtected(true); assertTrue("invalid modifier: " + this.modifier, ! this.modifier.isPublic() && this.modifier.isProtected() && ! this.modifier.isPackage() && ! this.modifier.isPrivate() ); } public void testSetPublic() { this.setAllFlagsIn(this.modifier); this.modifier.setPublic(false); // need to clean up flags a bit... this.modifier.setProtected(false); this.modifier.setPrivate(false); assertTrue("invalid modifier: " + this.modifier, ! this.modifier.isPublic() && ! this.modifier.isProtected() && this.modifier.isPackage() && ! this.modifier.isPrivate() ); this.modifier.setPublic(true); assertTrue("invalid modifier: " + this.modifier, this.modifier.isPublic() && ! this.modifier.isProtected() && ! this.modifier.isPackage() && ! this.modifier.isPrivate() ); } public void testSetStatic() { this.setAllFlagsIn(this.modifier); this.modifier.setStatic(false); assertTrue("invalid modifier: " + this.modifier, ! this.modifier.isStatic()); this.modifier.setStatic(true); assertTrue("invalid modifier: " + this.modifier, this.modifier.isStatic()); } public void testSetStrict() { this.setAllFlagsIn(this.modifier); this.modifier.setStrict(false); assertTrue("invalid modifier: " + this.modifier, ! this.modifier.isStrict()); this.modifier.setStrict(true); assertTrue("invalid modifier: " + this.modifier, this.modifier.isStrict()); } public void testSetSynchronized() { this.setAllFlagsIn(this.modifier); this.modifier.setSynchronized(false); assertTrue("invalid modifier: " + this.modifier, ! this.modifier.isSynchronized()); this.modifier.setSynchronized(true); assertTrue("invalid modifier: " + this.modifier, this.modifier.isSynchronized()); } public void testSetTransient() { this.setAllFlagsIn(this.modifier); this.modifier.setTransient(false); assertTrue("invalid modifier: " + this.modifier, ! this.modifier.isTransient()); this.modifier.setTransient(true); assertTrue("invalid modifier: " + this.modifier, this.modifier.isTransient()); } public void testSetVolatile() { this.setAllFlagsIn(this.modifier); this.modifier.setVolatile(false); assertTrue("invalid modifier: " + this.modifier, ! this.modifier.isVolatile()); this.modifier.setVolatile(true); assertTrue("invalid modifier: " + this.modifier, this.modifier.isVolatile()); } private void setAllFlagsIn(MWModifier m) { m.setCode(0xFFFFFFFF); } private MWClass fullyPopulatedTypeFor(Class javaClass) throws ExternalClassNotFoundException { MWClass result = this.project.typeFor(javaClass); result.refresh(); return result; } }