blob: d16d66857eb5334c1ba5a793adfd266f5f0244b3 [file] [log] [blame]
/*
* Copyright (c) 2013, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.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.eclipse.org/legal/epl-v10.html
*
* 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.dart.engine.internal.resolver;
import com.google.dart.engine.EngineTestCase;
import com.google.dart.engine.element.ClassElement;
import com.google.dart.engine.internal.context.AnalysisContextImpl;
import com.google.dart.engine.internal.element.ClassElementImpl;
import com.google.dart.engine.internal.element.CompilationUnitElementImpl;
import com.google.dart.engine.internal.element.LibraryElementImpl;
import com.google.dart.engine.internal.element.TypeParameterElementImpl;
import com.google.dart.engine.internal.type.InterfaceTypeImpl;
import com.google.dart.engine.internal.type.TypeParameterTypeImpl;
import com.google.dart.engine.type.InterfaceType;
import static com.google.dart.engine.ast.AstFactory.identifier;
import static com.google.dart.engine.ast.AstFactory.libraryIdentifier;
public class TypeProviderImplTest extends EngineTestCase {
public void test_creation() {
//
// Create a mock library element with the types expected to be in dart:core. We cannot use
// either ElementFactory or TestTypeProvider (which uses ElementFactory) because we side-effect
// the elements in ways that would break other tests.
//
InterfaceType objectType = classElement("Object", null).getType();
InterfaceType boolType = classElement("bool", objectType).getType();
InterfaceType numType = classElement("num", objectType).getType();
InterfaceType doubleType = classElement("double", numType).getType();
InterfaceType functionType = classElement("Function", objectType).getType();
InterfaceType intType = classElement("int", numType).getType();
InterfaceType iterableType = classElement("Iterable", objectType, "T").getType();
InterfaceType listType = classElement("List", objectType, "E").getType();
InterfaceType mapType = classElement("Map", objectType, "K", "V").getType();
InterfaceType stackTraceType = classElement("StackTrace", objectType).getType();
InterfaceType stringType = classElement("String", objectType).getType();
InterfaceType symbolType = classElement("Symbol", objectType).getType();
InterfaceType typeType = classElement("Type", objectType).getType();
CompilationUnitElementImpl coreUnit = new CompilationUnitElementImpl("core.dart");
coreUnit.setTypes(new ClassElement[] {
boolType.getElement(), doubleType.getElement(), functionType.getElement(),
intType.getElement(), iterableType.getElement(), listType.getElement(),
mapType.getElement(), objectType.getElement(), stackTraceType.getElement(),
stringType.getElement(), symbolType.getElement(), typeType.getElement()});
LibraryElementImpl coreLibrary = new LibraryElementImpl(
new AnalysisContextImpl(),
libraryIdentifier("dart.core"));
coreLibrary.setDefiningCompilationUnit(coreUnit);
//
// Create a type provider and ensure that it can return the expected types.
//
TypeProviderImpl provider = new TypeProviderImpl(coreLibrary);
assertSame(boolType, provider.getBoolType());
assertNotNull(provider.getBottomType());
assertSame(doubleType, provider.getDoubleType());
assertNotNull(provider.getDynamicType());
assertSame(functionType, provider.getFunctionType());
assertSame(intType, provider.getIntType());
assertSame(listType, provider.getListType());
assertSame(mapType, provider.getMapType());
assertSame(objectType, provider.getObjectType());
assertSame(stackTraceType, provider.getStackTraceType());
assertSame(stringType, provider.getStringType());
assertSame(symbolType, provider.getSymbolType());
assertSame(typeType, provider.getTypeType());
}
private ClassElement classElement(String typeName, InterfaceType superclassType,
String... parameterNames) {
ClassElementImpl element = new ClassElementImpl(identifier(typeName));
element.setSupertype(superclassType);
InterfaceTypeImpl type = new InterfaceTypeImpl(element);
element.setType(type);
int count = parameterNames.length;
if (count > 0) {
TypeParameterElementImpl[] typeParameters = new TypeParameterElementImpl[count];
TypeParameterTypeImpl[] typeArguments = new TypeParameterTypeImpl[count];
for (int i = 0; i < count; i++) {
TypeParameterElementImpl typeParameter = new TypeParameterElementImpl(
identifier(parameterNames[i]));
typeParameters[i] = typeParameter;
typeArguments[i] = new TypeParameterTypeImpl(typeParameter);
typeParameter.setType(typeArguments[i]);
}
element.setTypeParameters(typeParameters);
type.setTypeArguments(typeArguments);
}
return element;
}
}