001/* 002 * Copyright 2010-2013 JetBrains s.r.o. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017package org.jetbrains.k2js.translate.test; 018 019import com.google.dart.compiler.backend.js.ast.JsExpression; 020import com.google.dart.compiler.backend.js.ast.JsNew; 021import com.google.dart.compiler.backend.js.ast.JsStringLiteral; 022import org.jetbrains.annotations.NotNull; 023import org.jetbrains.jet.lang.descriptors.ClassDescriptor; 024import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; 025import org.jetbrains.jet.lang.psi.JetFile; 026import org.jetbrains.k2js.translate.context.TranslationContext; 027import org.jetbrains.k2js.translate.general.JetTestFunctionDetector; 028import org.jetbrains.k2js.translate.reference.CallBuilder; 029import org.jetbrains.k2js.translate.reference.ReferenceTranslator; 030import org.jetbrains.k2js.translate.utils.JsDescriptorUtils; 031 032import java.util.Collection; 033import java.util.List; 034 035//TODO: use method object instead of static functions 036public final class JSTestGenerator { 037 private JSTestGenerator() { 038 } 039 040 public static void generateTestCalls(@NotNull TranslationContext context, 041 @NotNull Collection<JetFile> files, @NotNull JSTester tester) { 042 List<FunctionDescriptor> functionDescriptors = JetTestFunctionDetector.getTestFunctionDescriptors(context.bindingContext(), files); 043 doGenerateTestCalls(functionDescriptors, context, tester); 044 } 045 046 private static void doGenerateTestCalls(@NotNull List<FunctionDescriptor> functionDescriptors, 047 @NotNull TranslationContext context, @NotNull JSTester jsTester) { 048 for (FunctionDescriptor functionDescriptor : functionDescriptors) { 049 ClassDescriptor classDescriptor = JsDescriptorUtils.getContainingClass(functionDescriptor); 050 if (classDescriptor == null) { 051 return; 052 } 053 generateCodeForTestMethod(context, functionDescriptor, classDescriptor, jsTester); 054 } 055 } 056 057 private static void generateCodeForTestMethod(@NotNull TranslationContext context, 058 @NotNull FunctionDescriptor functionDescriptor, 059 @NotNull ClassDescriptor classDescriptor, @NotNull JSTester tester) { 060 JsExpression expression = ReferenceTranslator.translateAsFQReference(classDescriptor, context); 061 JsNew testClass = new JsNew(expression); 062 JsExpression functionToTestCall = CallBuilder.build(context).descriptor(functionDescriptor).receiver(testClass).translate(); 063 JsStringLiteral testName = context.program().getStringLiteral(classDescriptor.getName() + "." + functionDescriptor.getName()); 064 tester.constructTestMethodInvocation(functionToTestCall, testName); 065 } 066}