/*******************************************************************************
* Copyright (c) 2008,2010 itemis AG (http://www.itemis.eu) 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
*
*******************************************************************************/
package org.eclipse.emf.mwe2.language.tests.model;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.mwe2.language.mwe2.Assignment;
import org.eclipse.emf.mwe2.language.mwe2.DeclaredProperty;
import org.eclipse.emf.mwe2.language.mwe2.Module;
import org.eclipse.emf.mwe2.language.tests.TestSetup;
import org.eclipse.emf.mwe2.language.tests.factory.ComponentA;
import org.eclipse.xtext.common.types.JvmType;
import org.eclipse.xtext.junit4.AbstractXtextTests;
import org.junit.Test;
public class ActualTypeComputationTest extends AbstractXtextTests {
@Override
public void setUp() throws Exception {
super.setUp();
with(new TestSetup());
}
@Test public void testInferredLiteralTypes() throws Exception {
checkPropertyType("a = 'myString'", String.class);
checkPropertyType("a = true", boolean.class);
checkPropertyType("a = java.util.ArrayList {}", ArrayList.class);
checkPropertyType("a = java.util.Arrays.ArrayList {}", Class.forName("java.util.Arrays$ArrayList"));
}
@Test public void testInferredComponentType() throws Exception {
String typeName = ComponentA.class.getName();
Module module = (Module) getModel("module myModule " + typeName + " {"
+ " x = {}"
+ "}");
Assignment assignment = module.getRoot().getAssignment().get(0);
JvmType assignedType = assignment.getValue().getActualType();
assertNotNull(assignedType);
assertFalse("eIsProxy", assignedType.eIsProxy());
assertEquals(typeName, assignedType.getIdentifier());
}
@Test public void testLiteralTypes() throws Exception {
checkPropertyType("java.lang.CharSequence a = 'myString'", CharSequence.class);
checkPropertyType("boolean a", boolean.class);
checkPropertyType("java.util.List a = java.util.ArrayList {}", List.class);
}
@Test public void testReferenceTypes() throws Exception {
checkPropertyType("CharSequence a = 'myString' var b = a", CharSequence.class);
checkPropertyType("boolean a var b = a", boolean.class);
checkPropertyType("java.util.List a = java.util.ArrayList {} var b = a", List.class);
}
@Test public void testDefaultType() throws Exception {
checkPropertyType("a", String.class);
}
@Test public void testModuleType() throws Exception {
Module stringModule = (Module) getModel("module stringModule String {}");
JvmType stringType = stringModule.getRoot().getActualType();
assertNotNull(stringType);
assertFalse("eIsProxy", stringType.eIsProxy());
assertEquals(String.class.getName(), stringType.getIdentifier());
Module referingModule = (Module) getModel("module referingModule java.util.ArrayList {}");
referingModule.getRoot().setModule(stringModule);
referingModule.getRoot().setType(null);
JvmType referingRootType = referingModule.getRoot().getActualType();
assertSame(stringType, referingRootType);
}
protected void checkPropertyType(String input, Class<?> expected) throws Exception {
Module module = (Module) getModelAndExpect("module myModule var " + input, 1);
List<DeclaredProperty> properties = module.getDeclaredProperties();
DeclaredProperty property = properties.get(properties.size() - 1);
JvmType type = property.getActualType();
assertNotNull(type);
assertFalse("eIsProxy", type.eIsProxy());
assertEquals(expected.getName(), type.getIdentifier());
}
}