package com.intellij.flex.uiDesigner;
import com.intellij.flex.model.bc.TargetPlatform;
import com.intellij.lang.javascript.JavaScriptSupportLoader;
import com.intellij.openapi.roots.ContentEntry;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileVisitor;
import com.intellij.util.TripleFunction;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
@SuppressWarnings("TestMethodWithIncorrectSignature")
@Flex(version="4.5")
public class MxmlTest extends MxmlTestBase {
@Flex(platform=TargetPlatform.Mobile, version="4.6")
public void testMobile() throws Exception {
testFiles(DesignerTests.getFile("src/mobile"));
}
public void testResolveResourceIfNameIsAmbiguous() throws Exception {
moduleInitializer = (model, file, libs1) -> {
final VirtualFile localesDir = DesignerTests.getFile("locales");
final ContentEntry localesContentEntry = model.addContentEntry(localesDir);
//noinspection ConstantConditions
localesContentEntry.addSourceFolder(localesDir.findChild("en_US"), false);
//localesContentEntry.addSourceFolder(localesDir.findChild("ru_RU"), false);
return null;
};
testFile("ResourceDirective.mxml");
}
private void init45And46Tests() {
moduleInitializer = (model, sourceDir, libs1) -> {
libs1.add(DebugPathManager.resolveTestArtifactPath("test-data-helper.swc"));
final VirtualFile assetsDir = DesignerTests.getFile("assets");
model.addContentEntry(assetsDir).addSourceFolder(assetsDir, false);
THashSet<ProblemDescriptor> expectedProblems = new THashSet<>();
TestDocumentProblemManager.setExpectedProblems(expectedProblems);
expectedProblems.add(new ProblemDescriptor("spark.components.supportClasses.TrackBase is abstract class",
sourceDir.findFileByRelativePath("AbstractClass.mxml"), 3));
expectedProblems.add(new ProblemDescriptor("Default property not found for Rect", sourceDir.findFileByRelativePath("CannotFindDefaultProperty.mxml"), 2));
VirtualFile file = sourceDir.findFileByRelativePath("ClassProperty.mxml");
expectedProblems.add(new ProblemDescriptor("Invalid class value", file, 6));
expectedProblems.add(new ProblemDescriptor("Invalid class value", file, 11));
expectedProblems.add(new ProblemDescriptor("Unsupported embed asset type \"@Embed(source='/jazz.mp3')\"", sourceDir.findFileByRelativePath("Embed.mxml"), 3));
file = sourceDir.findFileByRelativePath("InvalidColorNameOrNumericValue.mxml");
//noinspection SpellCheckingInspection
expectedProblems.add(new ProblemDescriptor("Invalid color name invalidcolorname", file, 2));
expectedProblems.add(new ProblemDescriptor("Invalid numeric value", file, 3));
expectedProblems.add(new ProblemDescriptor("Invalid numeric value", file, 4));
expectedProblems.add(new ProblemDescriptor("Invalid numeric value", file, 5));
expectedProblems.add(new ProblemDescriptor("Invalid numeric value", file, 6));
//expectedProblems.add(new ProblemDescriptor("<a href=\"http://youtrack.jetbrains.net/issue/IDEA-72175\">Inline components are not supported</a>", sourceDir.findFileByRelativePath("ItemRendererAndMixDefaultExplicitContent.mxml"), 9));
expectedProblems.add(new ProblemDescriptor("Unresolved variable or type unresolvedData", sourceDir.findFileByRelativePath("ArrayOfPrimitives.mxml"), 10));
file = sourceDir.findFileByRelativePath("ChildrenTypeCheck.mxml");
expectedProblems.add(new ProblemDescriptor("Initializer for Group cannot be represented in text", file, 2));
expectedProblems.add(new ProblemDescriptor("Initializer for Container cannot be represented in text", file, 5));
expectedProblems.add(new ProblemDescriptor("Children of Accordion must be mx.core.INavigatorContent", file, 8));
return null;
};
}
public void test45() throws Exception {
init45And46Tests();
testFiles(getTestDir(), DesignerTests.getFile("src/mx"));
}
@Flex(version="4.6")
public void test46() throws Exception {
init45And46Tests();
testFiles(getTestDir(), DesignerTests.getFile("src/mx"));
}
private void testFiles(VirtualFile... roots) throws Exception {
Pair<VirtualFile[], VirtualFile[]> pair = computeFiles(getTestFiles(roots));
testFiles(pair.first, pair.second);
}
@Flex(version="4.1")
public void test41() throws Exception {
testFile("states/UnusedStates.mxml");
}
@Override
protected String expectedErrorForDocument(String documentName) {
if (documentName.equals("RuntimeErrorInMxmlRead")) {
return "Error: Boo\n\tat com.intellij.flex.uiDesigner.test::LabelWithError()";
}
else if (documentName.equals("RuntimeError")) {
return "Error: I am runtime error\n\tat com.intellij.flex.uiDesigner.test::DateFieldWithError/commitProperties()";
}
return null;
}
private static Pair<VirtualFile[], VirtualFile[]> getTestFiles(VirtualFile... roots) {
final ArrayList<VirtualFile> files = new ArrayList<>(128);
final ArrayList<VirtualFile> auxFiles = new ArrayList<>(8);
for (VirtualFile root : roots) {
collectMxmlFiles(files, auxFiles, root);
}
final VirtualFile[] list = files.toArray(new VirtualFile[files.size()]);
final VirtualFile[] auxList = auxFiles.toArray(new VirtualFile[auxFiles.size()]);
final VirtualFileComparator virtualFileComparator = new VirtualFileComparator();
Arrays.sort(list, virtualFileComparator);
Arrays.sort(auxList, virtualFileComparator);
return new Pair<>(list, auxList);
}
private Pair<VirtualFile[], VirtualFile[]> computeFiles(Pair<VirtualFile[], VirtualFile[]> pair) {
final String testFile = System.getProperty("testFile");
VirtualFile[] auxiliaryFiles = pair.getSecond();
if (testFile == null) {
return pair;
}
else {
String[] strings = testFile.split(",");
if (strings.length > 1) {
auxiliaryFiles = new VirtualFile[auxiliaryFiles.length + strings.length - 1];
System.arraycopy(pair.getSecond(), 0, auxiliaryFiles, 0, pair.getSecond().length);
for (int i = 1, j = pair.getSecond().length, n = strings.length; i < n; i++) {
//noinspection AssignmentToForLoopParameter
auxiliaryFiles[j++] = getSource(strings[i] + ".mxml");
}
}
return new Pair<>(new VirtualFile[]{getSource(strings[0] + ".mxml")}, auxiliaryFiles);
}
}
private static void collectMxmlFiles(final ArrayList<VirtualFile> files, final ArrayList<VirtualFile> auxFiles, VirtualFile parent) {
VfsUtilCore.visitChildrenRecursively(parent, new VirtualFileVisitor<Object>() {
@Override
public boolean visitFile(@NotNull VirtualFile file) {
String name = file.getName();
//noinspection StatementWithEmptyBody
if (name.charAt(0) == '.') {
// skip
}
else if (name.startsWith("Aux") || name.endsWith(JavaScriptSupportLoader.FXG_FILE_EXTENSION_DOT)) {
auxFiles.add(file);
}
else if (name.endsWith(JavaScriptSupportLoader.MXML_FILE_EXTENSION_DOT) &&
!name.startsWith("T.") &&
!name.startsWith("TestApp.") &&
!name.startsWith("MigLayoutExample.") &&
!name.startsWith("ResourceDirective.") &&
!name.startsWith("GenericMxmlSupport.")) {
files.add(file);
}
return file.isDirectory();
}
});
}
private static class VirtualFileComparator implements Comparator<VirtualFile> {
@Override
public int compare(VirtualFile o1, VirtualFile o2) {
return o1.getPath().compareTo(o2.getPath());
}
}
@Override
protected void tearDown() throws Exception {
TestDocumentProblemManager.setExpectedProblems(null);
super.tearDown();
}
}