blob: c3610ed64cbc92928dd0b0f4d189643740db9008 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 NumberFour AG
*
* 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:
* NumberFour AG - initial API and Implementation (Alex Panchenko)
*******************************************************************************/
package org.eclipse.dltk.javascript.core.tests.typeinfo;
import static org.eclipse.dltk.javascript.typeinfo.RTypes.arrayOf;
import static org.eclipse.dltk.javascript.typeinfo.RTypes.simple;
import java.util.Collections;
import junit.framework.TestCase;
import org.eclipse.dltk.internal.javascript.ti.TypeSystemImpl;
import org.eclipse.dltk.javascript.core.Types;
import org.eclipse.dltk.javascript.typeinfo.IRClassType;
import org.eclipse.dltk.javascript.typeinfo.IRFunctionType;
import org.eclipse.dltk.javascript.typeinfo.IRMapType;
import org.eclipse.dltk.javascript.typeinfo.IRParameter;
import org.eclipse.dltk.javascript.typeinfo.IRSimpleType;
import org.eclipse.dltk.javascript.typeinfo.IRType;
import org.eclipse.dltk.javascript.typeinfo.IRTypeDeclaration;
import org.eclipse.dltk.javascript.typeinfo.IRUnionType;
import org.eclipse.dltk.javascript.typeinfo.ITypeSystem;
import org.eclipse.dltk.javascript.typeinfo.RTypes;
import org.eclipse.dltk.javascript.typeinfo.TypeCompatibility;
import org.eclipse.dltk.javascript.typeinfo.TypeUtil;
import org.eclipse.dltk.javascript.typeinfo.model.FunctionType;
import org.eclipse.dltk.javascript.typeinfo.model.MapType;
import org.eclipse.dltk.javascript.typeinfo.model.Parameter;
import org.eclipse.dltk.javascript.typeinfo.model.Type;
import org.eclipse.dltk.javascript.typeinfo.model.TypeInfoModelFactory;
import org.eclipse.dltk.javascript.typeinfo.model.UnionType;
import org.eclipse.emf.ecore.util.EcoreUtil;
@SuppressWarnings("restriction")
public class RTypeTests extends TestCase {
private static final TypeInfoModelFactory TIMF = TypeInfoModelFactory.eINSTANCE;
private ITypeSystem ts;
@Override
protected void setUp() throws Exception {
super.setUp();
ts = new TypeSystemImpl();
}
public void testAssignableJavaScriptObject() {
final IRType object = simple(ts, Types.OBJECT);
assertEquals(TypeCompatibility.TRUE,
object.isAssignableFrom(arrayOf(ts, simple(ts, Types.STRING))));
assertEquals(
TypeCompatibility.TRUE,
object.isAssignableFrom(RTypes.functionType(ts,
Collections.<IRParameter> emptyList(),
simple(ts, Types.STRING))));
}
public void testAssignableSuperType() {
final Type superType = Types.STRING;
final Type type = TIMF.createType();
type.setName(EcoreUtil.generateUUID());
type.setSuperType(superType);
assertEquals(TypeCompatibility.TRUE, RTypes.simple(ts, superType)
.isAssignableFrom(RTypes.simple(ts, type)));
}
public void testAssignableTrait() {
final Type trait = Types.STRING;
final Type type = TIMF.createType();
type.setName(EcoreUtil.generateUUID());
type.getTraits().add(trait);
assertEquals(TypeCompatibility.TRUE, RTypes.simple(ts, trait)
.isAssignableFrom(RTypes.simple(ts, type)));
}
public void testSimpleType() {
final IRType type = RTypes.create(ts, TypeUtil.ref(Types.STRING));
assertSame(Types.STRING, ((IRSimpleType) type).getTarget());
}
public void testClassType() {
final IRType type = RTypes.create(ts, TypeUtil.classType(Types.STRING));
assertSame(Types.STRING, ((IRClassType) type).getTarget());
}
public void testMapType() {
final MapType mapType = TIMF.createMapType();
mapType.setKeyType(TypeUtil.ref(Types.STRING));
mapType.setValueType(TypeUtil.ref(Types.NUMBER));
final IRMapType type = (IRMapType) RTypes.create(ts, mapType);
assertEquals(RTypes.simple(ts, Types.STRING), type.getKeyType());
assertEquals(RTypes.simple(ts, Types.NUMBER), type.getValueType());
}
public void testUnionType() {
final UnionType unionType = TIMF.createUnionType();
unionType.getTargets().add(TypeUtil.ref(Types.STRING));
unionType.getTargets().add(TypeUtil.ref(Types.NUMBER));
final IRUnionType type = (IRUnionType) RTypes.create(ts, unionType);
assertEquals(2, type.getTargets().size());
assertTrue(type.getTargets().contains(RTypes.simple(ts, Types.STRING)));
assertTrue(type.getTargets().contains(RTypes.simple(ts, Types.NUMBER)));
}
public void testFunctionType() {
final FunctionType functionType = TIMF.createFunctionType();
functionType.setReturnType(TypeUtil.ref(Types.STRING));
final Parameter parameter = TIMF.createParameter();
parameter.setName("num");
parameter.setType(TypeUtil.ref(Types.NUMBER));
functionType.getParameters().add(parameter);
final IRFunctionType type = (IRFunctionType) RTypes.create(ts,
functionType);
assertEquals(RTypes.simple(ts, Types.STRING), type.getReturnType());
assertEquals(1, type.getParameters().size());
assertEquals(RTypes.simple(ts, Types.NUMBER),
type.getParameters().get(0).getType());
assertEquals(TypeCompatibility.TRUE,
type.isAssignableFrom(RTypes.simple(ts, Types.FUNCTION)));
}
public void testTypeDeclaration() {
final IRTypeDeclaration stringType = ((IRSimpleType) RTypes.simple(ts,
Types.STRING)).getDeclaration();
assertEquals(Types.STRING.getMembers().size(), stringType.getMembers()
.size());
final IRTypeDeclaration objectType = stringType.getSuperType();
assertEquals(Types.OBJECT.getName(), objectType.getName());
assertEquals(Types.OBJECT.getMembers().size(), objectType.getMembers()
.size());
}
public void testAssignableFunction() {
final FunctionType functionType = TIMF.createFunctionType();
functionType.setReturnType(TypeUtil.ref(Types.NUMBER));
final IRType f = RTypes.create(ts, functionType);
assertEquals(TypeCompatibility.TRUE,
RTypes.FUNCTION.isAssignableFrom(f));
}
}