/*
* Copyright 2013 Dart project authors.
*
* Licensed under the Eclipse Public License v1.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.eclipse.org/legal/epl-v10.html
*
* 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.google.dart.tools.core.internal.analysis.model;
import com.google.dart.engine.context.AnalysisContext;
import com.google.dart.engine.element.LibraryElement;
import com.google.dart.engine.index.Index;
import com.google.dart.engine.index.IndexFactory;
import com.google.dart.engine.internal.index.file.MemoryNodeManager;
import com.google.dart.engine.sdk.DartSdk;
import com.google.dart.engine.source.FileBasedSource;
import com.google.dart.engine.source.Source;
import com.google.dart.engine.source.SourceFactory;
import com.google.dart.tools.core.analysis.model.IFileInfo;
import com.google.dart.tools.core.analysis.model.Project;
import com.google.dart.tools.core.analysis.model.ProjectEvent;
import com.google.dart.tools.core.analysis.model.ProjectListener;
import com.google.dart.tools.core.analysis.model.PubFolder;
import com.google.dart.tools.core.internal.analysis.model.ProjectImpl.AnalysisContextFactory;
import com.google.dart.tools.core.internal.builder.MockContext;
import com.google.dart.tools.core.internal.builder.TestProjects;
import com.google.dart.tools.core.internal.model.DartIgnoreManager;
import com.google.dart.tools.core.mock.MockFile;
import com.google.dart.tools.core.mock.MockFolder;
import com.google.dart.tools.core.mock.MockProject;
import com.google.dart.tools.core.mock.MockWorkspaceRoot;
import static com.google.dart.engine.element.ElementFactory.library;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class ProjectManagerImplTest extends ContextManagerImplTest {
private final class MockContextForTest extends MockContext {
private List<Source> sources = new ArrayList<Source>();
@Override
public LibraryElement computeLibraryElement(Source source) {
if (source.getShortName().equals("libraryA.dart")) {
return library(this, "libraryA");
}
return null;
}
@Override
public Source[] getLibrariesContaining(Source source) {
if (source.getShortName().equals("libraryA.dart")) {
sources.add(source);
return new Source[] {source};
}
return Source.EMPTY_ARRAY;
}
@Override
public Source[] getLibrarySources() {
return sources.toArray(new Source[sources.size()]);
}
@Override
public boolean isClientLibrary(Source librarySource) {
if (librarySource.getShortName().equals("libraryA.dart")) {
return true;
}
return false;
}
@Override
public boolean isServerLibrary(Source librarySource) {
if (librarySource.getShortName().equals("libraryB.dart")) {
return true;
}
return false;
}
}
private final class MockProjectListener implements ProjectListener {
private final ArrayList<Project> analyzed = new ArrayList<Project>();
public void assertNoProjectsAnalyzed() {
assertEquals(0, analyzed.size());
}
public void assertProjectAnalyzed(Project project) {
assertEquals(1, analyzed.size());
assertSame(project, analyzed.get(0));
}
@Override
public void projectAnalyzed(ProjectEvent event) {
analyzed.add(event.getProject());
}
}
private final class MockProjectManagerImpl extends ProjectManagerImpl {
private Project projectUnderTest;
public MockProjectManagerImpl(IWorkspaceRoot resource, DartSdk sdk, String sdkContextId,
DartIgnoreManager ignoreManager) {
super(
resource,
sdk,
sdkContextId,
IndexFactory.newIndex(IndexFactory.newSplitIndexStore(new MemoryNodeManager())),
ignoreManager);
}
@Override
public Project getProject(IProject project) {
if (project == projectContainer) {
if (projectUnderTest == null) {
projectUnderTest = new ProjectImpl(
projectContainer,
sdk,
sdkContextId,
getIndex(),
new AnalysisContextFactory() {
@Override
public AnalysisContext createContext() {
return context;
}
});
}
return projectUnderTest;
}
return super.getProject(project);
}
}
private MockWorkspaceRoot rootContainer;
private MockProject projectContainer;
private DartIgnoreManager ignoreManager = new DartIgnoreManager();
private MockContext context;
public void test_getContext() {
MockProjectManagerImpl manager = newTarget();
IResource resource = projectContainer.getFolder("web").getFile("other.dart");
Project project = manager.getProject(projectContainer);
AnalysisContext expected = project.getContext(resource);
AnalysisContext actual = manager.getContext(resource);
assertNotNull(actual);
assertSame(expected, actual);
}
public void test_getHtmlFileForLibrary() {
// MockProjectManagerImpl manager = newTarget();
//TODO(keertip): finish when context api has been implemented
MockFolder mockFolder = projectContainer.getMockFolder("web");
MockFile file = new MockFile(mockFolder, "libraryA.dart", "library libraryA;\n\n main(){}");
mockFolder.add(file);
MockFile htmlfile = new MockFile(mockFolder, "<!DOCTYPE html>\n<html><body> +"
+ " <script type=\"application/dart\" src=\"libraryA.dart\"></script>\n" + "</body></html>");
mockFolder.add(htmlfile);
MockFile libFile = new MockFile(mockFolder, "libraryB.dart", "library libraryB;\n\n main(){}");
mockFolder.add(libFile);
// IResource resource = manager.getHtmlFileForLibrary(manager.getSource(file));
// assertNotNull(resource);
// assertEquals(htmlfile, resource);
// assertNull(manager.getHtmlFileForLibrary(manager.getSource(libFile)));
}
public void test_getIgnoreManager() throws Exception {
MockProjectManagerImpl manager = newTarget();
assertSame(ignoreManager, manager.getIgnoreManager());
}
public void test_getIndex() throws Exception {
MockProjectManagerImpl manager = newTarget();
Index index = manager.getIndex();
assertNotNull(index);
assertSame(index, manager.getIndex());
}
public void test_getLibrarySources() {
MockProjectManagerImpl manager = newTarget();
MockFolder mockFolder = projectContainer.getMockFolder("web");
MockFile file = new MockFile(mockFolder, "libraryA.dart", "library libraryA;\n\n main(){}");
mockFolder.add(file);
Source[] libraries = manager.getLibrarySources(file);
Source[] sources = manager.getLibrarySources(mockFolder.getProject());
assertEquals(1, sources.length);
assertEquals(sources.length, libraries.length);
assertEquals(sources[0].getShortName(), libraries[0].getShortName());
}
public void test_getProject() {
MockProjectManagerImpl manager = newTarget();
Project actual = manager.getProject(projectContainer);
assertNotNull(actual);
assertSame(projectContainer, actual.getResource());
}
public void test_getProjects() {
MockProjectManagerImpl manager = newTarget();
Project[] actual = manager.getProjects();
assertNotNull(actual);
assertEquals(1, actual.length);
assertNotNull(actual[0]);
assertSame(manager.getProject(projectContainer), actual[0]);
}
public void test_getPubFolder() {
MockProjectManagerImpl manager = newTarget();
IResource resource = projectContainer.getFolder("web").getFile("other.dart");
Project project = manager.getProject(projectContainer);
PubFolder expected = project.getPubFolder(resource);
PubFolder actual = manager.getPubFolder(resource);
assertNotNull(actual);
assertSame(expected, actual);
}
public void test_getPubFolder_project() {
MockProjectManagerImpl manager = newTarget();
IResource resource = projectContainer;
Project project = manager.getProject(projectContainer);
PubFolder expected = project.getPubFolder(resource);
PubFolder actual = manager.getPubFolder(resource);
assertNotNull(actual);
assertSame(expected, actual);
}
public void test_getResource() {
MockProjectManagerImpl manager = newTarget();
assertSame(rootContainer, manager.getResource());
}
public void test_getResource_Source() {
MockProjectManagerImpl manager = newTarget();
IResource resource = projectContainer.getFolder("web").getFile("other.dart");
File file = resource.getLocation().toFile();
manager.getProject(projectContainer);
Source source = new FileBasedSource(file);
assertSame(resource, manager.getResource(source));
}
public void test_getResource_Source_null() {
MockProjectManagerImpl manager = newTarget();
assertNull(manager.getResource(null));
}
public void test_getResource_Source_outside() {
MockProjectManagerImpl manager = newTarget();
File file = new File("/does/not/exist.dart");
manager.getProject(projectContainer);
Source source = new FileBasedSource(file);
assertNull(manager.getResource(source));
}
@Override
public void test_getSdkContext() throws Exception {
MockProjectManagerImpl manager = newTarget();
AnalysisContext sdkContext = manager.getSdkContext();
assertNotNull(sdkContext);
SourceFactory factory = sdkContext.getSourceFactory();
assertNotNull(factory);
Source source = factory.forUri("dart:core");
assertNotNull(source);
source = factory.forUri("package:foo/bar.dart");
assertNull(source);
source = factory.forUri("file:/does/not/exist.dart");
assertNull(source);
}
public void test_isClientLibrary() {
MockProjectManagerImpl manager = newTarget();
MockFolder mockFolder = projectContainer.getMockFolder("web");
MockFile file = new MockFile(
mockFolder,
"libraryA.dart",
"library libraryA;\nimport 'dart:html';\n main(){}");
mockFolder.add(file);
manager.getProject(projectContainer);
Source source = new FileBasedSource(file.toFile());
boolean result = manager.isClientLibrary(source);
assertTrue(result);
result = manager.isServerLibrary(source);
assertFalse(result);
}
public void test_isServerLibrary() {
MockProjectManagerImpl manager = newTarget();
MockFolder mockFolder = projectContainer.getMockFolder("web");
MockFile serverFile = new MockFile(
mockFolder,
"libraryB.dart",
"library libraryB;\nimport 'dart:io';\n main(){}");
mockFolder.add(serverFile);
manager.getProject(projectContainer);
Source source = new FileBasedSource(serverFile.toFile());
boolean result = manager.isClientLibrary(source);
assertFalse(result);
result = manager.isServerLibrary(source);
assertTrue(result);
}
public void test_listener() throws Exception {
MockProjectManagerImpl manager = newTarget();
Project project = manager.getProject(projectContainer);
MockProjectListener listener = new MockProjectListener();
manager.addProjectListener(listener);
listener.assertNoProjectsAnalyzed();
manager.projectAnalyzed(project);
listener.assertProjectAnalyzed(project);
}
public void test_newSearchEngine() throws Exception {
MockProjectManagerImpl manager = newTarget();
assertNotNull(manager.newSearchEngine());
}
public void test_resolveUriToFileInfo() {
MockProjectManagerImpl manager = newTarget();
IResource resource = projectContainer.getFolder("web").getFile("other.dart");
IFileInfo info = manager.resolveUriToFileInfo(
projectContainer,
resource.getLocation().toFile().toURI().toString());
assertNotNull(info);
assertNotNull(info.getResource());
info = manager.resolveUriToFileInfo(projectContainer, "package:pkg1/build.dart");
assertNotNull(info);
assertNotNull(info.getResource());
info = manager.resolveUriToFileInfo(projectContainer, "package:/doesnotexist/nofile.dart");
assertNull(info);
}
@Override
protected MockProjectManagerImpl newTarget() {
return new MockProjectManagerImpl(rootContainer, sdk, sdkContextId, ignoreManager);
}
@Override
protected void setUp() throws Exception {
super.setUp();
rootContainer = new MockWorkspaceRoot();
projectContainer = TestProjects.newPubProject3(rootContainer);
context = new MockContextForTest();
}
}