package com.intellij.flex.uiDesigner; import com.intellij.lang.javascript.JavaScriptSupportLoader; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.util.ActionCallback; import com.intellij.openapi.util.AsyncResult; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiManager; import com.intellij.psi.xml.XmlFile; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; abstract class MxmlTestBase extends AppTestBase { private static final int TIMEOUT = Boolean.valueOf(System.getProperty("fud.test.debug")) ? 0 : 8; protected static final String SPARK_COMPONENTS_FILE = "SparkComponents.mxml"; private int passedCounter; @Override protected void changeServicesImplementation() { Tests.changeDesignerServicesImplementation(); Tests.changeServiceImplementation(DocumentProblemManager.class, TestDocumentProblemManager.class); } protected VirtualFile getRawProjectRoot() throws NoSuchMethodException { return useRawProjectRoot() ? getTestDir() : null; } private boolean useRawProjectRoot() throws NoSuchMethodException { Flex annotation = getClass().getMethod(getName()).getAnnotation(Flex.class); return annotation != null && annotation.rawProjectRoot(); } protected void testFiles(VirtualFile[] files, VirtualFile[] auxiliaryFiles) throws Exception { testFiles(new MyTester(), files, auxiliaryFiles); } protected void testFiles(String[] paths, String... auxiliaryPaths) throws Exception { final VirtualFile[] files = new VirtualFile[paths.length]; final VirtualFile[] auxiliaryFiles = auxiliaryPaths.length > 0 ? new VirtualFile[auxiliaryPaths.length] : null; int i = 0; for (String file : paths) { files[i++] = getSource(file); } i = 0; for (String file : auxiliaryPaths) { //noinspection ConstantConditions auxiliaryFiles[i++] = getSource(file); } testFiles(new MyTester(), files, auxiliaryFiles); } protected void testFile(String... originalVFilePath) throws Exception { testFile(new MyTester(), originalVFilePath); } protected void testFile(Tester tester, String... paths) throws Exception { final VirtualFile[] files = new VirtualFile[1]; final VirtualFile[] auxiliaryFiles = paths.length > 1 ? new VirtualFile[paths.length - 1] : null; for (int i = 0; i < paths.length; i++) { if (i == 0) { files[i] = getSource(paths[i]); } else { //noinspection ConstantConditions auxiliaryFiles[i - 1] = getSource(paths[i]); } } testFiles(tester, files, auxiliaryFiles); } protected void testFiles(final Tester tester, VirtualFile[] files, VirtualFile[] auxiliaryFiles) throws Exception { VirtualFile[] testFiles = configureByFiles(getRawProjectRoot(), files, auxiliaryFiles); final PsiManager psiManager = PsiManager.getInstance(myProject); for (int i = 0, n = testFiles.length; i < n; i++) { final VirtualFile file = testFiles[i]; if (!file.getName().endsWith(JavaScriptSupportLoader.MXML_FILE_EXTENSION_DOT)) { continue; } final VirtualFile originalVFile = files[i]; final XmlFile xmlFile = (XmlFile)psiManager.findFile(file); assert xmlFile != null; final Callable<Void> action = () -> { tester.test(file, xmlFile, originalVFile); return null; }; if (TIMEOUT == 0) { action.call(); } else { ApplicationManager.getApplication().executeOnPooledThread(action).get(TIMEOUT, TimeUnit.SECONDS); } } } @Override protected void tearDown() throws Exception { System.out.print("\npassed " + passedCounter + " tests.\n"); super.tearDown(); } private class MyTester implements Tester { @Override public void test(VirtualFile file, XmlFile xmlFile, final VirtualFile originalFile) throws Exception { final String documentName = file.getNameWithoutExtension(); System.out.print(documentName + '\n'); socketInputHandler.setExpectedErrorMessage(expectedErrorForDocument(documentName)); AsyncResult<DocumentFactoryManager.DocumentInfo> renderResult = client.renderDocument(myModule, xmlFile, new ProblemsHolder()); socketInputHandler.processUntil(renderResult); if (renderResult.isDone()) { ActionCallback testCallback = client.test(DocumentFactoryManager.getInstance().getId(file), documentName, originalFile.getParent().getName()); socketInputHandler.processUntil(testCallback); if (testCallback.isDone()) { passedCounter++; } else { throw new AssertionError(socketInputHandler.reader.readUTF()); } } } } protected String expectedErrorForDocument(String documentName) { return null; } } interface Tester { void test(VirtualFile file, XmlFile xmlFile, VirtualFile originalFile) throws Exception; }