package com.intellij.flex.flexunit.codeInsight;
import com.intellij.codeInsight.CodeInsightTestCase;
import com.intellij.execution.actions.ConfigurationContext;
import com.intellij.execution.actions.ConfigurationFromContext;
import com.intellij.execution.configurations.RunConfiguration;
import com.intellij.flex.util.FlexTestUtils;
import com.intellij.flex.util.FlexUnitLibs;
import com.intellij.ide.DataManager;
import com.intellij.javascript.flex.css.FlexStylesIndexableSetContributor;
import com.intellij.lang.javascript.JSTestOption;
import com.intellij.lang.javascript.JSTestOptions;
import com.intellij.lang.javascript.JSTestUtils;
import com.intellij.lang.javascript.flex.FlexModuleType;
import com.intellij.lang.javascript.flex.flexunit.FlexUnitRunConfiguration;
import com.intellij.lang.javascript.flex.flexunit.FlexUnitRunnerParameters;
import com.intellij.lang.javascript.flex.flexunit.FlexUnitRuntimeConfigurationProducer;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.module.ModuleType;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
import static com.intellij.openapi.vfs.VfsUtilCore.convertFromUrl;
import static com.intellij.openapi.vfs.VfsUtilCore.urlToPath;
public class FlexUnitConfigurationTest extends CodeInsightTestCase implements FlexUnitLibs {
private static final String BASE_PATH = "/config/";
@Override
protected void setUp() throws Exception {
VfsRootAccess.allowRootAccess(getTestRootDisposable(),
urlToPath(convertFromUrl(FlexStylesIndexableSetContributor.class.getResource("FlexStyles.as"))));
super.setUp();
}
@Override
protected void doCommitModel(@NotNull ModifiableRootModel rootModel) {
super.doCommitModel(rootModel);
FlexTestUtils.addFlexUnitLib(getClass(), getTestName(false), getModule(), getTestDataPath(), FLEX_UNIT_0_9_SWC, FLEX_UNIT_4_SWC);
}
@Override
protected String getTestDataPath() {
return FlexTestUtils.getTestDataPath("flexUnit");
}
@Override
protected ModuleType getModuleType() {
return FlexModuleType.getInstance();
}
@Override
protected void setUpJdk() {
FlexTestUtils.setupFlexSdk(myModule, getTestName(false), getClass());
}
public Object getData(final String dataId) {
return LangDataKeys.MODULE.is(dataId) ? myModule : super.getData(dataId);
}
private void defaultTest() throws Exception {
doTest(getTestName(false) + ".as");
}
private void doTest(String filename) throws Exception {
configureByFile(BASE_PATH + filename);
final Map<Integer, String> markers = JSTestUtils.extractPositionMarkers(getProject(), getEditor().getDocument());
assertFalse("No caret markers found", markers.isEmpty());
assertFalse("No 'expected' value", markers.containsValue(null));
final DataContext dataContext = DataManager.getInstance().getDataContext(getEditor().getComponent());
int i = 1;
for (Map.Entry<Integer, String> marker : markers.entrySet()) {
String place = filename + ": marker " + i++ + ": ";
getEditor().getCaretModel().moveToOffset(marker.getKey());
final ConfigurationFromContext configurationFromContext =
new FlexUnitRuntimeConfigurationProducer().createConfigurationFromContext(ConfigurationContext.getFromContext(dataContext));
final RunConfiguration configuration = configurationFromContext == null ? null : configurationFromContext.getConfiguration();
if ("null".equals(marker.getValue())) {
assertNull(place + "Null configuration expected", configuration);
}
else {
assertNotNull(place + "Not null configuration expected", configuration);
assertTrue(place + "Invalid configuration", configuration instanceof FlexUnitRunConfiguration);
final String[] expected;
if ("null".equals(marker.getValue())) {
expected = null;
}
else {
expected = marker.getValue().split(" ");
assertEquals(
place + "Expected should be in the form: \"Class com.test.Foo\" or \"Method com.test.Foo.testBar()\" or \"Package com.test\"",
2, expected.length);
}
final FlexUnitRunnerParameters params = ((FlexUnitRunConfiguration)configuration).getRunnerParameters();
assertEquals(place + "Invalid scope", expected[0], params.getScope().name());
final String definition;
switch (params.getScope()) {
case Class:
definition = params.getClassName();
break;
case Method:
definition = params.getClassName() + "." + params.getMethodName() + "()";
break;
case Package:
definition = params.getPackageName();
break;
default:
fail(place + "Unknown scope: " + params.getScope());
definition = null;
}
assertEquals(place + "Invalid definition", expected[1], definition);
}
}
}
@JSTestOptions({JSTestOption.WithFlexFacet, JSTestOption.WithFlexUnit1})
public void testFlexUnit1() throws Exception {
defaultTest();
}
@JSTestOptions({JSTestOption.WithFlexFacet, JSTestOption.WithFlexUnit4})
public void testFlexUnit1WithFlexUnit4() throws Exception {
defaultTest();
}
@JSTestOptions({JSTestOption.WithFlexFacet, JSTestOption.WithFlexUnit1})
public void testFlexUnit1Empty() throws Exception {
defaultTest();
}
@JSTestOptions({JSTestOption.WithFlexFacet, JSTestOption.WithFlexUnit1})
public void testFlexUnit1NonPublic() throws Exception {
defaultTest();
}
@JSTestOptions({JSTestOption.WithFlexFacet, JSTestOption.WithFlexUnit1})
public void testFlexUnit1EmptyWithFlex4() throws Exception {
doTest("FlexUnit1Empty.as");
}
@JSTestOptions({JSTestOption.WithFlexFacet, JSTestOption.WithFlexUnit1})
public void testFlexUnit1WithNonDefaultConstructor() throws Exception {
defaultTest();
}
@JSTestOptions({JSTestOption.WithFlexFacet, JSTestOption.WithFlexUnit4})
public void testFlexUnit1WithNonDefaultConstructorWithFlex4() throws Exception {
doTest("FlexUnit1WithNonDefaultConstructor.as");
}
@JSTestOptions({JSTestOption.WithFlexFacet, JSTestOption.WithFlexUnit4})
public void testFlexUnit4() throws Exception {
defaultTest();
}
@JSTestOptions({JSTestOption.WithFlexFacet, JSTestOption.WithFlexUnit1})
public void testFlexUnit4WithFlexUnit1() throws Exception {
defaultTest();
}
@JSTestOptions({JSTestOption.WithFlexFacet, JSTestOption.WithFlexUnit1})
public void testFlexUnit4WithFlexUnit1_2() throws Exception {
defaultTest();
}
@JSTestOptions({JSTestOption.WithFlexFacet, JSTestOption.WithFlexUnit4})
public void testFlexUnit4WithNonDefaultConstructor() throws Exception {
defaultTest();
}
@JSTestOptions({JSTestOption.WithFlexFacet, JSTestOption.WithFlexUnit4})
public void testFlexUnit4Empty() throws Exception {
defaultTest();
}
@JSTestOptions({JSTestOption.WithFlexFacet, JSTestOption.WithFlexUnit4})
public void testFlexUnit4NonPublic() throws Exception {
defaultTest();
}
@JSTestOptions({JSTestOption.WithFlexFacet})
public void testNoFlexUnit() throws Exception {
defaultTest();
}
public void testNoFlex() throws Exception {
doTest("NoFlexUnit.as");
}
@JSTestOptions({JSTestOption.WithFlexFacet, JSTestOption.WithFlexUnit4})
public void testFlunit1() throws Exception {
defaultTest();
}
@JSTestOptions({JSTestOption.WithFlexFacet, JSTestOption.WithFlexUnit4})
public void testSuite1() throws Exception {
defaultTest();
}
@JSTestOptions({JSTestOption.WithFlexFacet, JSTestOption.WithFlexUnit1})
public void testNoSuiteWithFlexUnit1() throws Exception {
defaultTest();
}
@JSTestOptions({JSTestOption.WithFlexFacet, JSTestOption.WithFlexUnit4})
public void testTestMethodInSuite() throws Exception {
defaultTest();
}
@JSTestOptions({JSTestOption.WithFlexFacet, JSTestOption.WithFlexUnit4})
public void testWithCustomRunner() throws Exception {
defaultTest();
}
@JSTestOptions({JSTestOption.WithFlexFacet, JSTestOption.WithFlexUnit4})
public void testOldStyleSuite() throws Exception {
defaultTest();
}
@JSTestOptions({JSTestOption.WithFlexFacet, JSTestOption.WithFlexUnit4})
public void testFlunitSuite() throws Exception {
defaultTest();
}
}