/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 * * 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.android.tools.idea.navigator; import com.android.tools.idea.gradle.project.GradleSyncListener; import com.android.tools.idea.gradle.project.NewProjectImportGradleSyncListener; import com.android.tools.idea.gradle.util.GradleUtil; import com.android.tools.idea.navigator.nodes.AndroidViewProjectNode; import com.android.tools.idea.templates.AndroidGradleTestCase; import com.intellij.ide.projectView.ViewSettings; import com.intellij.ide.projectView.impl.GroupByTypeComparator; import com.intellij.ide.util.treeView.AbstractTreeNode; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Queryable; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.projectView.TestProjectTreeStructure; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiManager; import com.intellij.testFramework.PlatformTestUtil; import com.intellij.testFramework.ProjectViewTestUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class AndroidProjectViewTest extends AndroidGradleTestCase { private AndroidProjectViewPane myPane; public void testProjectView() throws Exception { loadProject("projects/navigator/packageview/simple"); myPane = createPane(); TestAndroidTreeStructure structure = new TestAndroidTreeStructure(getProject(), myTestRootDisposable); Queryable.PrintInfo printInfo = new Queryable.PrintInfo(); PsiDirectory dir = getBaseFolder(); assertNotNull(dir); String rootModuleName = null; for (Module module : ModuleManager.getInstance(getProject()).getModules()) { if (GradleUtil.getGradlePath(module) == null) { rootModuleName = module.getName(); } } assertNotNull(rootModuleName); String projectName = getProject().getName(); String expected = projectName + "\n" + " app (Android)\n" + " manifests\n" + " AndroidManifest.xml (main)\n" + " AndroidManifest.xml (debug)\n" + " java\n" + " app (main)\n" + " MainActivity\n" + " app (androidTest)\n" + " MainActivityTest.java\n" + " Debug.java\n" + " res\n" + " drawable\n" + " ic_launcher.png (2)\n" + " ic_launcher.png (hdpi, debug)\n" + " ic_launcher.png (mdpi)\n" + " j.png (mdpi)\n" + " layout\n" + " activity_main.xml\n" + " menu\n" + " main.xml\n" + " values\n" + " dimens.xml (3)\n" + " dimens.xml\n" + " dimens.xml (debug)\n" + " dimens.xml (w820dp)\n" + " strings.xml (2)\n" + " strings.xml\n" + " strings.xml (debug)\n" + " styles.xml\n" + " assets\n" + " raw.asset.txt\n" + " rs\n" + " test.rs\n" + " javamodule (non-Android)\n" + " java\n" + " foo\n" + " Foo.java\n" + " tests\n" + " foo\n" + " FooTest.java\n" + " resources\n" + " res2.txt\n" + " test-resources\n" + " test-res.txt\n" + " lib (Android)\n" + " manifests\n" + " AndroidManifest.xml (main)\n" + " res\n" + " drawable\n" + " ic_launcher.png (mdpi)\n" + " values\n" + " strings.xml\n" + " jni\n" + " hello.c\n" + " jniLibs\n" + " libc.so\n" + " Gradle Scripts\n" + " build.gradle (app)\n" + " sonar.gradle (app)\n" + " build.gradle (javamodule)\n" + " build.gradle (lib)\n" + " build.gradle (" + rootModuleName + ")\n" + " settings.gradle (Project Settings)\n" + " gradle-wrapper.properties\n" + " local.properties\n"; int numLines = expected.split("\n").length; ProjectViewTestUtil .assertStructureEqual(structure, expected, numLines, new GroupByTypeComparator(null, "android"), structure.getRootElement(), printInfo); } public void testCommonRoots() throws Exception { loadProject("projects/navigator/packageview/commonroots"); myPane = createPane(); TestAndroidTreeStructure structure = new TestAndroidTreeStructure(getProject(), myTestRootDisposable); Queryable.PrintInfo printInfo = new Queryable.PrintInfo(); PsiDirectory dir = getBaseFolder(); assertNotNull(dir); Module[] modules = ModuleManager.getInstance(getProject()).getModules(); assertEquals(1, modules.length); String projectName = getProject().getName(); String expected = projectName + "\n" + " Gradle Scripts\n" + " build.gradle (" + modules[0].getName() + ")\n" + " gradle-wrapper.properties\n" + " " + modules[0].getName() + " (Android)\n" + " java\n" + " foo (main)\n" + " Foo.java\n" + " manifests\n" + " AndroidManifest.xml (main)\n" + " res\n" + " values\n" + " dimens.xml (w820dp)\n" + " resources\n" + " sample_resource.txt\n"; int numLines = expected.split("\n").length; ProjectViewTestUtil .assertStructureEqual(structure, expected, numLines, PlatformTestUtil.createComparator(printInfo), structure.getRootElement(), printInfo); } public void testFailedImport() throws Exception { loadProject("projects/navigator/invalid", false, new GradleSyncListener.Adapter() { @Override public void syncFailed(@NotNull final Project project, @NotNull String errorMessage) { // If the sync fails, then IDE creates an empty top level module. Mimic the same behavior for this test. ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override public void run() { NewProjectImportGradleSyncListener.createTopLevelModule(project); } }); } }); myPane = createPane(); TestAndroidTreeStructure structure = new TestAndroidTreeStructure(getProject(), myTestRootDisposable); Queryable.PrintInfo printInfo = new Queryable.PrintInfo(); PsiDirectory dir = getBaseFolder(); assertNotNull(dir); Module[] modules = ModuleManager.getInstance(getProject()).getModules(); assertEquals(1, modules.length); String projectName = getProject().getName(); String expected = projectName + "\n" + " Gradle Scripts\n" + " build.gradle (" + modules[0].getName() + ")\n" + " gradle-wrapper.properties\n" + " " + modules[0].getName() + "\n" + " .idea\n" + " AndroidManifest.xml\n" + " build.gradle\n" + " gradle\n" + " wrapper\n" + " gradle-wrapper.jar\n" + " gradle-wrapper.properties\n" + " gradlew\n" + " gradlew.bat\n"; int numLines = expected.split("\n").length; ProjectViewTestUtil .assertStructureEqual(structure, expected, numLines, PlatformTestUtil.createComparator(printInfo), structure.getRootElement(), printInfo); } @Nullable private PsiDirectory getBaseFolder() throws Exception { VirtualFile folder = getProject().getBaseDir(); assertNotNull("project basedir is null!", folder); return PsiManager.getInstance(getProject()).findDirectory(folder); } private class TestAndroidTreeStructure extends TestProjectTreeStructure { public TestAndroidTreeStructure(Project project, Disposable parentDisposable) { super(project, parentDisposable); } @Override protected AbstractTreeNode createRoot(Project project, ViewSettings settings) { return new AndroidViewProjectNode(project, settings, myPane); } @Override public boolean isShowLibraryContents() { return false; } @Override public boolean isHideEmptyMiddlePackages() { return true; } } private AndroidProjectViewPane createPane() { final AndroidProjectViewPane pane = new AndroidProjectViewPane(getProject()); pane.createComponent(); Disposer.register(getProject(), pane); return pane; } }