| /* |
| * Copyright 2008 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| * use this file except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package com.google.gwt.dev.javac.typemodel; |
| |
| import com.google.gwt.core.ext.TreeLogger; |
| import com.google.gwt.core.ext.UnableToCompleteException; |
| import com.google.gwt.core.ext.typeinfo.NotFoundException; |
| import com.google.gwt.dev.javac.typemodel.test.EnumInterface; |
| import com.google.gwt.dev.javac.typemodel.test.EnumOfInterface; |
| import com.google.gwt.dev.javac.typemodel.test.MyEnum; |
| import com.google.gwt.dev.javac.typemodel.test.TestAnnotation; |
| import com.google.gwt.dev.util.log.PrintWriterTreeLogger; |
| |
| import junit.framework.TestCase; |
| |
| /** |
| * Tests for {@link JEnumType}. |
| */ |
| public class JEnumTypeTest extends TestCase { |
| |
| private final boolean logToConsole = false; |
| |
| private final ModuleContext moduleContext = new ModuleContext(logToConsole |
| ? new PrintWriterTreeLogger() : TreeLogger.NULL, |
| "com.google.gwt.dev.javac.typemodel.TypeOracleTest"); |
| |
| public JEnumTypeTest() throws UnableToCompleteException { |
| } |
| |
| private final TypeOracle typeOracle = moduleContext.getOracle(); |
| |
| /** |
| * Test method for |
| * {@link com.google.gwt.core.ext.typeinfo.JEnumType#getEnumConstants()}. |
| * |
| * @throws NotFoundException |
| */ |
| public void testGetEnumConstants() throws NotFoundException { |
| JClassType type = typeOracle.getType(MyEnum.class.getName()); |
| JEnumType enumType = type.isEnum(); |
| assertNotNull(enumType); |
| |
| JEnumConstant[] enumConstants = enumType.getEnumConstants(); |
| assertEquals(3, enumConstants.length); |
| |
| for (int i = 0; i < enumConstants.length; ++i) { |
| JEnumConstant enumConstant = enumConstants[i]; |
| // Check the ordinal |
| assertEquals(i, enumConstant.getOrdinal()); |
| |
| // Check that the name matches what reflection expects at the current |
| // ordinal. |
| assertEquals(MyEnum.class.getEnumConstants()[i].name(), |
| enumConstant.getName()); |
| } |
| } |
| |
| /** |
| * Test method for |
| * {@link com.google.gwt.core.ext.typeinfo.JClassType#getFields()}. |
| * |
| * @throws NotFoundException |
| */ |
| public void testGetFields() throws NotFoundException { |
| JClassType type = typeOracle.getType(MyEnum.class.getName()); |
| JEnumType enumType = validateTypeIsEnum(type); |
| |
| assertEquals(5, enumType.getFields().length); |
| } |
| |
| /** |
| * Test method for |
| * {@link com.google.gwt.core.ext.typeinfo.JClassType#getField(String)}. |
| * |
| * @throws NotFoundException |
| */ |
| public void testGetFieldString() throws NotFoundException { |
| JClassType type = typeOracle.getType(MyEnum.class.getName()); |
| |
| validateTypeIsEnum(type); |
| |
| type.getField("VAL0"); |
| type.getField("VAL1"); |
| type.getField("VAL2"); |
| type.getField("instanceField"); |
| type.getField("e"); |
| } |
| |
| /** |
| * Test method for {@link JEnumType#getConstructors()} |
| * |
| * @throws NotFoundException |
| * @throws NotFoundException |
| */ |
| public void testGetConstructors() throws NotFoundException { |
| JClassType type = typeOracle.getType(MyEnum.class.getName()); |
| JEnumType enumType = validateTypeIsEnum(type); |
| |
| // Enum constructors are not reflected. |
| assertEquals(0, enumType.getConstructors().length); |
| } |
| |
| /** |
| * Test method for {@link JEnumType#getMethods()} |
| * |
| * @throws NotFoundException |
| */ |
| public void testGetMethods() throws NotFoundException { |
| JClassType type = typeOracle.getType(MyEnum.class.getName()); |
| JEnumType enumType = validateTypeIsEnum(type); |
| |
| assertEquals(3, enumType.getMethods().length); |
| } |
| |
| /** |
| * Test an enum that implements an interface. |
| * |
| * @throws NotFoundException |
| */ |
| public void testInterface() throws NotFoundException { |
| JClassType type = typeOracle.getType(EnumOfInterface.class.getName()); |
| JEnumType enumType = validateTypeIsEnum(type); |
| JClassType[] intf = enumType.getImplementedInterfaces(); |
| assertEquals(1, intf.length); |
| assertEquals(EnumInterface.class.getName(), |
| intf[0].getQualifiedSourceName()); |
| JMethod getExtra = intf[0].getMethod("getExtra", TypeOracle.NO_JTYPES); |
| TestAnnotation annotation = getExtra.getAnnotation(TestAnnotation.class); |
| assertNotNull(annotation); |
| assertEquals("EnumInterface getExtra", annotation.value()); |
| JEnumConstant[] constants = enumType.getEnumConstants(); |
| assertEquals(2, constants.length); |
| assertEquals("A", constants[0].getName()); |
| annotation = constants[0].getAnnotation(TestAnnotation.class); |
| assertNotNull(annotation); |
| assertEquals("A", annotation.value()); |
| JClassType aClass = (JClassType) constants[0].getType().isClass(); |
| { |
| JMethod[] methods = aClass.getInheritableMethods(); |
| assertEquals(11, methods.length); |
| boolean found = false; |
| for (JMethod method : methods) { |
| if ("name".equals(method.getName())) { |
| found = true; |
| // TODO(jat); any other verification here? |
| } |
| } |
| assertTrue(found); |
| } |
| { |
| JMethod[] methods = aClass.getOverridableMethods(); |
| assertEquals(4, methods.length); |
| // TODO(jat): verify getExtra is from A's anonymous subclass of |
| // EnumInterface when/if that is implemented. |
| boolean found = false; |
| for (JMethod method : methods) { |
| if ("getExtra".equals(method.getName())) { |
| found = true; |
| // TODO(jat); any other verification here? |
| } |
| } |
| assertTrue(found); |
| } |
| } |
| |
| /** |
| * Test method for {@link com.google.gwt.core.ext.typeinfo.JEnumType#isEnum()} |
| * . |
| * |
| * @throws NotFoundException |
| */ |
| public void testIsEnum() throws NotFoundException { |
| JClassType type = typeOracle.getType(MyEnum.class.getName()); |
| validateTypeIsEnum(type); |
| } |
| |
| private static JEnumType validateTypeIsEnum(JClassType type) |
| throws NotFoundException { |
| JEnumType maybeEnum = type.isEnum(); |
| assertNotNull(maybeEnum); |
| |
| JClassType enumType = type.getOracle().getType(Enum.class.getName()); |
| |
| assertTrue(enumType.isAssignableFrom(maybeEnum)); |
| |
| return maybeEnum; |
| } |
| } |