blob: 3952fbf357418a04691aec1ddf15eb4e92856463 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 NumberFour AG
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* NumberFour AG - initial API and Implementation (Alex Panchenko)
*******************************************************************************/
package org.eclipse.dltk.javascript.core.tests.typeinfo;
import static java.util.Collections.singletonList;
import static org.eclipse.dltk.javascript.core.Types.ARRAY;
import static org.eclipse.dltk.javascript.core.Types.NUMBER;
import static org.eclipse.dltk.javascript.core.Types.OBJECT;
import static org.eclipse.dltk.javascript.core.Types.STRING;
import static org.eclipse.dltk.javascript.typeinfo.RTypes.simple;
import static org.junit.Assert.assertThat;
import static org.junit.matchers.JUnitMatchers.hasItem;
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.IRTypeDeclaration;
import org.eclipse.dltk.javascript.typeinfo.ITypeSystem;
import org.eclipse.dltk.javascript.typeinfo.TypeCompatibility;
import org.eclipse.dltk.javascript.typeinfo.model.GenericType;
import org.eclipse.dltk.javascript.typeinfo.model.Type;
import org.eclipse.dltk.javascript.typeinfo.model.TypeInfoModelFactory;
import org.eclipse.dltk.javascript.typeinfo.model.TypeVariable;
@SuppressWarnings("restriction")
public class RTypeDeclarationTests extends TestCase {
private ITypeSystem typeSystem;
@Override
protected void setUp() throws Exception {
super.setUp();
this.typeSystem = new TypeSystemImpl();
}
public void testAssignableFrom() {
final IRTypeDeclaration string = typeSystem.convert(STRING);
final IRTypeDeclaration number = typeSystem.convert(NUMBER);
final IRTypeDeclaration object = typeSystem.convert(OBJECT);
assertEquals(TypeCompatibility.TRUE, object.isAssignableFrom(string));
assertEquals(TypeCompatibility.TRUE, object.isAssignableFrom(number));
assertEquals(TypeCompatibility.FALSE, number.isAssignableFrom(string));
}
public void testAssignableFromArray() {
final IRTypeDeclaration arrayOfString = typeSystem.parameterize(ARRAY,
singletonList(simple(typeSystem, STRING)));
final IRTypeDeclaration arrayOfNumber = typeSystem.parameterize(ARRAY,
singletonList(simple(typeSystem, NUMBER)));
final IRTypeDeclaration arrayOfObject = typeSystem.parameterize(ARRAY,
singletonList(simple(typeSystem, OBJECT)));
assertEquals(TypeCompatibility.TRUE,
arrayOfObject.isAssignableFrom(arrayOfString));
assertEquals(TypeCompatibility.TRUE,
arrayOfObject.isAssignableFrom(arrayOfNumber));
assertEquals(TypeCompatibility.UNPARAMETERIZED,
arrayOfNumber.isAssignableFrom(arrayOfString));
}
public void testAssignableFromArrayUntyped() {
final IRTypeDeclaration arrayOfString = typeSystem.parameterize(ARRAY,
singletonList(simple(typeSystem, STRING)));
final IRTypeDeclaration arrayOfNumber = typeSystem.parameterize(ARRAY,
singletonList(simple(typeSystem, NUMBER)));
final IRTypeDeclaration array = typeSystem.convert(ARRAY);
assertEquals(TypeCompatibility.TRUE,
array.isAssignableFrom(arrayOfString));
assertEquals(TypeCompatibility.TRUE,
array.isAssignableFrom(arrayOfNumber));
}
public void testAssignableFromGenericChild() {
final IRTypeDeclaration arrayOfString = typeSystem.parameterize(ARRAY,
singletonList(simple(typeSystem, STRING)));
final GenericType listType = TypeInfoModelFactory.eINSTANCE
.createGenericType();
listType.setName("List");
listType.setSuperType(Types.ARRAY);
final TypeVariable variable = TypeInfoModelFactory.eINSTANCE
.createTypeVariable();
variable.setName("T");
listType.getTypeParameters().add(variable);
final IRTypeDeclaration listOfString = typeSystem.parameterize(
listType, singletonList(simple(typeSystem, STRING)));
assertEquals(TypeCompatibility.TRUE,
arrayOfString.isAssignableFrom(listOfString));
}
public void testAssignableFromParameterized() {
final GenericType listType = TypeInfoModelFactory.eINSTANCE
.createGenericType();
listType.setName("List");
final TypeVariable variable = TypeInfoModelFactory.eINSTANCE
.createTypeVariable();
variable.setName("T");
listType.getTypeParameters().add(variable);
final IRTypeDeclaration list = typeSystem.convert(listType);
final IRTypeDeclaration listOfString = typeSystem.parameterize(
listType, singletonList(simple(typeSystem, STRING)));
assertEquals(TypeCompatibility.TRUE,
list.isAssignableFrom(listOfString));
assertEquals(TypeCompatibility.TRUE,
listOfString.isAssignableFrom(list));
}
public void testCycles() {
final Type aType = TypeInfoModelFactory.eINSTANCE.createType();
aType.setName("A");
final Type bType = TypeInfoModelFactory.eINSTANCE.createType();
bType.setName("B");
aType.setSuperType(bType);
bType.setSuperType(aType);
final IRTypeDeclaration a = typeSystem.convert(aType);
final IRTypeDeclaration b = typeSystem.convert(bType);
assertSame(b, a.getSuperType());
assertSame(a, b.getSuperType());
}
public void testTraits() {
final Type aType = TypeInfoModelFactory.eINSTANCE.createType();
aType.setName("A");
final Type bType = TypeInfoModelFactory.eINSTANCE.createType();
bType.setName("B");
final Type cType = TypeInfoModelFactory.eINSTANCE.createType();
cType.setName("C");
aType.setSuperType(bType);
aType.getTraits().add(cType);
bType.getTraits().add(cType);
final IRTypeDeclaration a = typeSystem.convert(aType);
final IRTypeDeclaration b = typeSystem.convert(bType);
final IRTypeDeclaration c = typeSystem.convert(cType);
assertSame(b, a.getSuperType());
assertNull(b.getSuperType());
assertNull(c.getSuperType());
assertThat(a.getTraits(), hasItem(c));
assertThat(b.getTraits(), hasItem(c));
}
}