/*
* Copyright (c) 2012, the 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.AnalysisEngine;
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.internal.context.InstrumentedAnalysisContextImpl;
import com.google.dart.engine.internal.context.InternalAnalysisContext;
import com.google.dart.engine.source.DirectoryBasedSourceContainer;
import com.google.dart.engine.source.FileBasedSource;
import com.google.dart.engine.source.Source;
import com.google.dart.engine.source.SourceContainer;
import com.google.dart.engine.source.SourceFactory;
import com.google.dart.engine.utilities.io.FileUtilities2;
import com.google.dart.tools.core.CmdLineOptions;
import com.google.dart.tools.core.DartCore;
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.PubFolder;
import com.google.dart.tools.core.analysis.model.ResourceMap;
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.mock.MockContainer;
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.test.util.TestProject;
import com.google.dart.tools.core.utilities.io.FileUtilities;
import static com.google.dart.engine.element.ElementFactory.library;
import static com.google.dart.tools.core.DartCore.PACKAGES_DIRECTORY_NAME;
import static com.google.dart.tools.core.DartCore.PUBSPEC_FILE_NAME;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import java.io.File;
import java.io.IOException;
public class ProjectImplTest extends ContextManagerImplTest {
private final class MockContextForTest extends MockContext {
@Override
public LibraryElement computeLibraryElement(Source source) {
if (source.getShortName().equals("libraryA.dart")) {
return library(this, "libraryA");
}
return null;
}
@Override
public Source[] getLibrarySources() {
return Source.EMPTY_ARRAY;
}
}
private MockProject projectContainer;
private MockFolder webContainer;
private MockFolder subContainer;
private MockFolder appContainer;
private MockFolder subAppContainer;
private File[] packageRoots = new File[0];
private Index index;
private TestProject testProject;
private boolean useInstrumentedContexts;
public void assertUriResolvedToPackageRoot(Project project, IPath expectedPackageRoot) {
IPath expected = expectedPackageRoot != null ? expectedPackageRoot.append("foo").append(
"foo.dart") : null;
SourceFactory factory = project.getDefaultContext().getSourceFactory();
Source source = factory.forUri("package:foo/foo.dart");
IPath actual = new Path(source.getFullName());
assertEquals(expected.setDevice(null), actual.setDevice(null));
}
public void test_AnalysisContextFactory() throws Exception {
AnalysisContextFactory contextFactory = new AnalysisContextFactory();
AnalysisContext context = contextFactory.createContext();
assertNotNull(context);
File[] roots = contextFactory.getPackageRoots(projectContainer);
assertNotNull(roots);
assertEquals(0, roots.length);
}
/**
* Verify context removed from index when folder containing pubspec is discarded
*/
public void test_discardContextsIn_project() {
ProjectImpl project = newTarget();
assertEquals(1, project.getPubFolders().length);
PubFolder pubFolder = project.getPubFolder(projectContainer);
assertNotNull(pubFolder);
projectContainer.remove(PUBSPEC_FILE_NAME);
MockFolder myApp = projectContainer.getMockFolder("myapp");
myApp.remove(PUBSPEC_FILE_NAME);
myApp.getMockFolder("subApp").remove(PUBSPEC_FILE_NAME);
project.discardContextsIn(projectContainer);
verify(index, times(2)).removeContext(pubFolder.getContext());
assertEquals(0, project.getPubFolders().length);
}
/**
* Verify that when "web" folder is removed, index is not modified because "web" is a child folder
* and does not contains a pubspec
*/
public void test_discardContextsIn_project_web() {
ProjectImpl project = newTarget();
assertEquals(1, project.getPubFolders().length);
PubFolder pubFolder = project.getPubFolder(projectContainer);
assertNotNull(pubFolder);
projectContainer.remove("web");
project.discardContextsIn(webContainer);
verifyNoMoreInteractions(index);
assertEquals(1, project.getPubFolders().length);
assertSame(pubFolder, project.getPubFolder(projectContainer));
}
public void test_getContext_folder() {
ProjectImpl project = newTarget();
projectContainer.remove(PUBSPEC_FILE_NAME);
MockContext context1 = (MockContext) project.getContext(projectContainer);
assertNotNull(context1);
assertSame(context1, project.getDefaultContext());
assertSame(context1, project.getContext(webContainer));
assertSame(context1, project.getContext(subContainer));
MockContext context2 = (MockContext) project.getContext(appContainer);
assertNotNull(context2);
assertNotSame(context1, context2);
context1.assertExtracted(appContainer);
context2.assertExtracted(null);
assertDartSdkFactoryInitialized(projectContainer, context1);
assertFactoryInitialized(appContainer, context2);
}
public void test_getContext_project() {
ProjectImpl project = newTarget();
MockContext context1 = (MockContext) project.getContext(projectContainer);
assertNotNull(context1);
assertSame(context1, project.getDefaultContext());
assertSame(context1, project.getContext(webContainer));
assertSame(context1, project.getContext(subContainer));
assertSame(context1, project.getContext(appContainer));
context1.assertExtracted(null);
assertFactoryInitialized(projectContainer, context1);
}
public void test_getLibrarySources() {
ProjectImpl project = newTarget();
// TODO(keertip): make this more meaningful
MockFolder folder = projectContainer.getMockFolder("web");
MockFile file = new MockFile(folder, "libraryA.dart", "library libraryA;\n\n main(){}");
folder.add(file);
Source[] sources = project.getLibrarySources();
assertNotNull(sources);
}
public void test_getMultiplePackageRoots_project() throws Exception {
CmdLineOptions options = CmdLineOptions.parseCmdLine(new String[] {});
final IEclipsePreferences prefs = mock(IEclipsePreferences.class);
when(prefs.get(DartCore.PROJECT_PREF_PACKAGE_ROOT, "")).thenReturn(
"bar" + File.pathSeparator + "foo");
final DartCore core = mock(DartCore.class);
when(core.getProjectPreferences(projectContainer)).thenReturn(prefs);
File[] roots = ProjectImpl.getPackageRoots(core, options, projectContainer);
assertNotNull(roots);
assertEquals(2, roots.length);
assertEquals("bar", roots[0].getName());
assertEquals("foo", roots[1].getName());
}
public void test_getPackageRoots() throws Exception {
CmdLineOptions options = CmdLineOptions.parseCmdLine(new String[] {});
DartCore core = DartCore.getPlugin();
File[] roots = ProjectImpl.getPackageRoots(core, options, projectContainer);
assertNotNull(roots);
assertEquals(0, roots.length);
}
public void test_getPackageRoots_global() throws Exception {
CmdLineOptions options = CmdLineOptions.parseCmdLine(new String[] {
"--package-root", "foo", "bar"});
DartCore core = DartCore.getPlugin();
File[] roots = ProjectImpl.getPackageRoots(core, options, projectContainer);
assertNotNull(roots);
assertEquals(2, roots.length);
assertEquals("foo", roots[0].getName());
assertEquals("bar", roots[1].getName());
}
public void test_getPackageRoots_project() throws Exception {
CmdLineOptions options = CmdLineOptions.parseCmdLine(new String[] {});
final IEclipsePreferences prefs = mock(IEclipsePreferences.class);
when(prefs.get(DartCore.PROJECT_PREF_PACKAGE_ROOT, "")).thenReturn("bar");
final DartCore core = mock(DartCore.class);
when(core.getProjectPreferences(projectContainer)).thenReturn(prefs);
File[] roots = ProjectImpl.getPackageRoots(core, options, projectContainer);
assertNotNull(roots);
assertEquals(1, roots.length);
assertEquals("bar", roots[0].getName());
}
public void test_getResource() {
ProjectImpl project = newTarget();
assertSame(projectContainer, project.getResource());
}
public void test_getResource_Source() {
ProjectImpl project = newTarget();
IResource resource = projectContainer.getFolder("web").getFile("other.dart");
File file = resource.getLocation().toFile();
Source source = new FileBasedSource(file);
assertSame(resource, project.getResource(source));
}
public void test_getResource_Source_null() {
ProjectImpl project = newTarget();
assertNull(project.getResource(null));
}
public void test_getResource_Source_outside() {
ProjectImpl project = newTarget();
File file = new File("/does/not/exist.dart");
Source source = new FileBasedSource(file);
assertNull(project.getResource(source));
}
public void test_getResourceMap_forContext() {
projectContainer.remove(DartCore.PUBSPEC_FILE_NAME);
// Initialize the project without instrumented contexts
ProjectImpl project = newTarget();
useInstrumentedContexts = false;
assertFalse(project.getDefaultContext() instanceof InstrumentedAnalysisContextImpl);
AnalysisContext defaultContext = project.getDefaultContext();
assertFalse(defaultContext instanceof InstrumentedAnalysisContextImpl);
AnalysisContext pubContext = project.getContext(appContainer);
assertFalse(pubContext instanceof InstrumentedAnalysisContextImpl);
assertNotSame(defaultContext, pubContext);
ResourceMap defaultResourceMap = project.getResourceMap(projectContainer);
assertNotNull(defaultResourceMap);
ResourceMap pubResourceMap = project.getResourceMap(appContainer);
assertNotNull(pubResourceMap);
assertNotSame(defaultResourceMap, pubResourceMap);
assertNull(project.getResourceMap((AnalysisContext) null));
assertNull(project.getResourceMap(AnalysisEngine.getInstance().createAnalysisContext()));
assertSame(defaultResourceMap, project.getResourceMap(defaultContext));
assertSame(pubResourceMap, project.getResourceMap(pubContext));
}
public void test_getResourceMap_forInstrumentedContext() {
projectContainer.remove(DartCore.PUBSPEC_FILE_NAME);
// Initialize the project with instrumented contexts
ProjectImpl project = newTarget();
useInstrumentedContexts = true;
assertTrue(project.getDefaultContext() instanceof InstrumentedAnalysisContextImpl);
AnalysisContext defaultContext = project.getDefaultContext();
assertTrue(defaultContext instanceof InstrumentedAnalysisContextImpl);
AnalysisContext pubContext = project.getContext(appContainer);
assertTrue(pubContext instanceof InstrumentedAnalysisContextImpl);
assertNotSame(defaultContext, pubContext);
ResourceMap defaultResourceMap = project.getResourceMap(projectContainer);
assertNotNull(defaultResourceMap);
ResourceMap pubResourceMap = project.getResourceMap(appContainer);
assertNotNull(pubResourceMap);
assertNotSame(defaultResourceMap, pubResourceMap);
assertNull(project.getResourceMap((AnalysisContext) null));
assertNull(project.getResourceMap(AnalysisEngine.getInstance().createAnalysisContext()));
AnalysisContext uninstrumentedDefaultContext = ((InstrumentedAnalysisContextImpl) defaultContext).getBasis();
AnalysisContext uninstrumentedPubContext = ((InstrumentedAnalysisContextImpl) pubContext).getBasis();
assertSame(defaultResourceMap, project.getResourceMap(defaultContext));
assertSame(pubResourceMap, project.getResourceMap(pubContext));
assertSame(defaultResourceMap, project.getResourceMap(uninstrumentedDefaultContext));
assertSame(pubResourceMap, project.getResourceMap(uninstrumentedPubContext));
}
public void test_packageRoots_ignored() throws Exception {
ProjectImpl project = newTarget();
packageRoots = new File[] {new Path("/does/not/exist").toFile()};
assertUriResolvedToPackageRoot(project, new Path("/does/not/exist"));
}
public void test_packageRoots_not_set() throws Exception {
ProjectImpl project = newTarget();
projectContainer.remove(PUBSPEC_FILE_NAME);
appContainer.remove(PUBSPEC_FILE_NAME);
subAppContainer.remove(PUBSPEC_FILE_NAME);
packageRoots = new File[] {};
assertUriDoesNotResolve(project);
}
public void test_packageRoots_set() throws Exception {
ProjectImpl project = newTarget();
projectContainer.remove(PUBSPEC_FILE_NAME);
appContainer.remove(PUBSPEC_FILE_NAME);
subAppContainer.remove(PUBSPEC_FILE_NAME);
packageRoots = new File[] {new Path("/does/not/exist").toFile()};
assertUriResolvedToPackageRoot(project, new Path(packageRoots[0].getPath()));
}
public void test_pubFolder_folder() {
ProjectImpl project = newTarget();
projectContainer.remove(PUBSPEC_FILE_NAME);
assertNull(project.getPubFolder(projectContainer));
assertNull(project.getPubFolder(webContainer));
assertNull(project.getPubFolder(subContainer));
PubFolder pubFolder = project.getPubFolder(appContainer);
assertNotNull(pubFolder);
assertEquals(1, project.getPubFolders().length);
assertSame(pubFolder, project.getPubFolders()[0]);
assertNotNull(project.getDefaultContext());
assertNotSame(project.getDefaultContext(), pubFolder.getContext());
assertDartSdkFactoryInitialized(projectContainer, project.getDefaultContext());
assertFactoryInitialized(appContainer, pubFolder.getContext());
}
public void test_pubFolder_none() {
ProjectImpl project = newTarget();
projectContainer.remove(PUBSPEC_FILE_NAME);
appContainer.remove(PUBSPEC_FILE_NAME);
subAppContainer.remove(PUBSPEC_FILE_NAME);
assertNull(project.getPubFolder(projectContainer));
assertNull(project.getPubFolder(webContainer));
assertNull(project.getPubFolder(subContainer));
assertNull(project.getPubFolder(appContainer));
assertEquals(0, project.getPubFolders().length);
assertNotNull(project.getDefaultContext());
assertDartSdkFactoryInitialized(projectContainer, project.getDefaultContext());
}
public void test_pubFolder_project() {
ProjectImpl project = newTarget();
// Simulate traversal in which the top level pubspec is visited last
projectContainer.add(projectContainer.remove(PUBSPEC_FILE_NAME));
PubFolder pubFolder = project.getPubFolder(projectContainer);
assertNotNull(pubFolder);
assertSame(pubFolder, project.getPubFolder(webContainer));
assertSame(pubFolder, project.getPubFolder(subContainer));
assertSame(pubFolder, project.getPubFolder(appContainer));
assertEquals(1, project.getPubFolders().length);
assertSame(pubFolder, project.getPubFolders()[0]);
assertNotNull(project.getDefaultContext());
assertSame(project.getDefaultContext(), pubFolder.getContext());
assertFactoryInitialized(projectContainer, project.getDefaultContext());
}
public void test_pubspecAdded_folder() {
ProjectImpl project = newTarget();
projectContainer.remove(PUBSPEC_FILE_NAME);
appContainer.remove(PUBSPEC_FILE_NAME);
subAppContainer.remove(PUBSPEC_FILE_NAME);
assertEquals(0, project.getPubFolders().length);
MockContext defaultContext = (MockContext) project.getDefaultContext();
defaultContext.assertExtracted(null);
defaultContext.assertMergedContext(null);
assertDartSdkFactoryInitialized(projectContainer, defaultContext);
appContainer.addFile(PUBSPEC_FILE_NAME);
project.pubspecAdded(appContainer);
assertEquals(1, project.getPubFolders().length);
assertNull(project.getPubFolder(projectContainer));
PubFolder pubFolder = project.getPubFolder(appContainer);
assertNotNull(pubFolder);
assertSame(defaultContext, project.getDefaultContext());
assertNotSame(defaultContext, pubFolder.getContext());
assertSame(appContainer, pubFolder.getResource());
defaultContext.assertExtracted(appContainer);
defaultContext.assertMergedContext(null);
assertDartSdkFactoryInitialized(projectContainer, defaultContext);
}
public void test_pubspecAdded_folder_ignored() {
ProjectImpl project = newTarget();
appContainer.remove(PUBSPEC_FILE_NAME);
subAppContainer.remove(PUBSPEC_FILE_NAME);
assertEquals(1, project.getPubFolders().length);
PubFolder pubFolder = project.getPubFolder(projectContainer);
assertNotNull(pubFolder);
appContainer.addFile(PUBSPEC_FILE_NAME);
project.pubspecAdded(appContainer);
assertEquals(1, project.getPubFolders().length);
assertSame(pubFolder, project.getPubFolder(projectContainer));
}
public void test_pubspecAdded_project() {
ProjectImpl project = newTarget();
projectContainer.remove(PUBSPEC_FILE_NAME);
appContainer.remove(PUBSPEC_FILE_NAME);
subAppContainer.remove(PUBSPEC_FILE_NAME);
packageRoots = new File[] {new Path("/does/not/exist").toFile()};
assertEquals(0, project.getPubFolders().length);
MockContext defaultContext = (MockContext) project.getDefaultContext();
defaultContext.assertExtracted(null);
defaultContext.assertMergedContext(null);
assertFactoryInitialized(projectContainer, defaultContext);
assertUriResolvedToPackageRoot(project, new Path(packageRoots[0].getPath()));
packageRoots = new File[] {};
projectContainer.addFile(PUBSPEC_FILE_NAME);
project.pubspecAdded(projectContainer);
assertEquals(1, project.getPubFolders().length);
PubFolder pubFolder = project.getPubFolder(projectContainer);
assertNotNull(pubFolder);
assertSame(defaultContext, project.getDefaultContext());
assertSame(defaultContext, pubFolder.getContext());
assertSame(projectContainer, pubFolder.getResource());
defaultContext.assertExtracted(null);
defaultContext.assertMergedContext(null);
assertFactoryInitialized(projectContainer, defaultContext);
assertUriResolvedToPackageRoot(
project,
projectContainer.getLocation().append(PACKAGES_DIRECTORY_NAME));
}
public void test_pubspecAdded_project_replacing_folder() {
ProjectImpl project = newTarget();
projectContainer.remove(PUBSPEC_FILE_NAME);
subAppContainer.remove(PUBSPEC_FILE_NAME);
assertEquals(1, project.getPubFolders().length);
assertNull(project.getPubFolder(projectContainer));
PubFolder oldPubFolder = project.getPubFolder(appContainer);
assertNotNull(oldPubFolder);
assertSame(appContainer, oldPubFolder.getResource());
MockContext defaultContext = (MockContext) project.getDefaultContext();
defaultContext.assertExtracted(appContainer);
defaultContext.assertMergedContext(null);
assertDartSdkFactoryInitialized(projectContainer, defaultContext);
projectContainer.addFile(PUBSPEC_FILE_NAME);
project.pubspecAdded(projectContainer);
assertEquals(1, project.getPubFolders().length);
PubFolder newPubFolder = project.getPubFolder(projectContainer);
assertNotNull(newPubFolder);
assertNotSame(oldPubFolder, newPubFolder);
assertSame(defaultContext, project.getDefaultContext());
assertSame(defaultContext, newPubFolder.getContext());
assertSame(projectContainer, newPubFolder.getResource());
defaultContext.assertExtracted(null);
defaultContext.assertMergedContext(oldPubFolder.getContext());
assertFactoryInitialized(projectContainer, defaultContext);
}
/**
* Verify index is updated when pubspec is removed
*/
public void test_pubspecRemoved_folder() {
ProjectImpl project = newTarget();
projectContainer.remove(PUBSPEC_FILE_NAME);
assertEquals(1, project.getPubFolders().length);
PubFolder pubFolder = project.getPubFolder(appContainer);
assertNotNull(pubFolder);
appContainer.remove(PUBSPEC_FILE_NAME);
project.pubspecRemoved(appContainer);
verify(index).removeContext(pubFolder.getContext());
assertEquals(1, project.getPubFolders().length);
assertSame(subAppContainer, project.getPubFolder(subAppContainer).getResource());
SourceContainer directory = new DirectoryBasedSourceContainer(
subAppContainer.getLocation().toFile());
((MockContext) project.getDefaultContext()).extractContext(directory);
}
/**
* Verify nothing removed from index when pubspec removed from project container because default
* context does not change
*/
public void test_pubspecRemoved_project_to_folder() {
ProjectImpl project = newTarget();
subAppContainer.remove(PUBSPEC_FILE_NAME);
assertEquals(1, project.getPubFolders().length);
PubFolder pubFolder = project.getPubFolder(projectContainer);
assertNotNull(pubFolder);
projectContainer.remove(PUBSPEC_FILE_NAME);
project.pubspecRemoved(projectContainer);
verifyNoMoreInteractions(index);
assertEquals(1, project.getPubFolders().length);
assertSame(appContainer, project.getPubFolder(appContainer).getResource());
SourceContainer directory = new DirectoryBasedSourceContainer(
appContainer.getLocation().toFile());
((MockContext) project.getDefaultContext()).extractContext(directory);
}
public void test_pubspecRemoved_project_to_none() {
ProjectImpl project = newTarget();
appContainer.remove(PUBSPEC_FILE_NAME);
subAppContainer.remove(PUBSPEC_FILE_NAME);
assertEquals(1, project.getPubFolders().length);
PubFolder pubFolder = project.getPubFolder(projectContainer);
assertNotNull(pubFolder);
assertUriResolvedToPackageRoot(
project,
projectContainer.getLocation().append(PACKAGES_DIRECTORY_NAME));
projectContainer.remove(PUBSPEC_FILE_NAME);
project.pubspecRemoved(projectContainer);
assertEquals(0, project.getPubFolders().length);
}
public void test_resolvePathToPackage() {
//TODO(keertip): implement project with ExplicitUriResolver and package map
// use that to verify path to package
// ProjectImpl project = newTarget();
}
public void test_resolveUriTofileInfoFile() throws IOException {
projectContainer.remove(PUBSPEC_FILE_NAME);
File parent = projectContainer.getLocation().toFile().getParentFile();
File packages = new File(parent, "packagesRoot");
File dartFile = new File(packages, "bar/foo.dart");
FileUtilities.create(dartFile);
final IEclipsePreferences prefs = mock(IEclipsePreferences.class);
when(prefs.get(DartCore.PROJECT_PREF_PACKAGE_ROOT, "")).thenReturn(packages.getAbsolutePath());
final DartCore core = mock(DartCore.class);
when(core.getProjectPreferences(projectContainer)).thenReturn(prefs);
ProjectImpl project = new ProjectImpl(
projectContainer,
sdk,
sdkContextId,
index,
new AnalysisContextFactory() {
@Override
public AnalysisContext createContext() {
return new MockContextForTest();
}
@Override
public File[] getPackageRoots(IContainer container) {
CmdLineOptions options = CmdLineOptions.parseCmdLine(new String[] {});
return ProjectImpl.getPackageRoots(core, options, projectContainer);
}
});
IFileInfo info = project.resolveUriToFileInfo(webContainer, "package:bar/foo.dart");
assertNotNull(info);
assertNotNull(info.getFile());
assertNull(info.getResource());
}
public void test_resolveUriToFileInfoResource() {
ProjectImpl project = newTarget();
IResource resource = projectContainer.getFolder("web").getFile("other.dart");
IFileInfo info = project.resolveUriToFileInfo(
webContainer,
resource.getLocation().toFile().toURI().toString());
assertNotNull(info);
assertNotNull(info.getResource());
info = project.resolveUriToFileInfo(webContainer, "package:pkg1/build.dart");
assertNotNull(info);
assertNotNull(info.getResource());
}
public void test_resolveUriToFileInfoResourceInLib() throws IOException {
if (!DartCore.isWindows()) {
ProjectImpl project = newTarget();
File packages = projectContainer.getFolder("packages").getLocation().toFile();
File lib = projectContainer.getFolder("lib").getLocation().toFile();
FileUtilities.createDirectory(packages);
FileUtilities.createDirectory(lib);
FileUtilities2.createSymLink(lib, new File(packages, "myapp"));
IFileInfo info = project.resolveUriToFileInfo(webContainer, "package:myapp/stuff.dart");
assertNotNull(info);
assertNotNull(info.getResource());
assertEquals(
info.getResource().getFullPath(),
projectContainer.getFile("lib/stuff.dart").getFullPath());
}
}
public void test_resolveUriToFileInfoResourceInLib_Windows() throws Exception {
if (DartCore.isWindows()) {
testProject = new TestProject();
if (testProject.getProject().exists()) {
testProject.createFolder("lib");
testProject.setFileContent("lib/stuff.dart", "library stuff;");
testProject.setFileContent(PUBSPEC_FILE_NAME, "name: myapp");
testProject.createFolder(PACKAGES_DIRECTORY_NAME + "/myapp");
testProject.setFileContent(PACKAGES_DIRECTORY_NAME + "/myapp/stuff.dart", "library stuff;");
ProjectImpl projectimpl = new ProjectImpl(testProject.getProject(), sdk, sdkContextId);
IFileInfo info = projectimpl.resolveUriToFileInfo(
testProject.getProject(),
"package:myapp/stuff.dart");
assertNotNull(info);
assertNotNull(info.getResource());
assertTrue(info.getResource().getFullPath().toString().contains("/lib/"));
}
}
}
@Override
protected ProjectImpl newTarget() {
return new ProjectImpl(
projectContainer,
sdk,
sdkContextId,
index,
new AnalysisContextFactory() {
@Override
public AnalysisContext createContext() {
InternalAnalysisContext context = new MockContextForTest();
if (useInstrumentedContexts) {
context = new InstrumentedAnalysisContextImpl(context);
}
return context;
}
@Override
public File[] getPackageRoots(IContainer container) {
return packageRoots;
}
});
}
@Override
protected void setUp() throws Exception {
super.setUp();
projectContainer = TestProjects.newPubProject3();
webContainer = projectContainer.getMockFolder("web");
subContainer = webContainer.getMockFolder("sub");
appContainer = projectContainer.getMockFolder("myapp");
subAppContainer = appContainer.getMockFolder("subApp");
index = mock(Index.class);
}
@Override
protected void tearDown() throws Exception {
File packages = projectContainer.getFolder("packages").getLocation().toFile();
File lib = projectContainer.getFolder("lib").getLocation().toFile();
if (packages.exists()) {
FileUtilities.delete(packages);
}
if (lib.exists()) {
FileUtilities.delete(lib);
}
if (testProject != null && testProject.getProject().exists()) {
testProject.dispose();
}
}
private void assertDartSdkFactoryInitialized(MockContainer container, AnalysisContext context) {
SourceFactory factory = context.getSourceFactory();
File file1 = container.getFile(new Path("doesNotExist1.dart")).getLocation().toFile();
Source source1 = new FileBasedSource(file1);
Source source2 = factory.resolveUri(source1, "doesNotExist2.dart");
File file2 = new File(source2.getFullName());
assertEquals(file1.getParent(), file2.getParent());
Source source3 = factory.resolveUri(source1, "package:doesNotExist3/doesNotExist4.dart");
assertNotNull(source3);
assertFalse(new File(source3.getFullName()).exists());
}
private void assertFactoryInitialized(MockContainer container, AnalysisContext context) {
SourceFactory factory = context.getSourceFactory();
File file1 = container.getFile(new Path("doesNotExist1.dart")).getLocation().toFile();
Source source1 = new FileBasedSource(file1);
Source source2 = factory.resolveUri(source1, "doesNotExist2.dart");
File file2 = new File(source2.getFullName());
assertEquals(file1.getParent(), file2.getParent());
Source source3 = factory.resolveUri(source1, "package:doesNotExist3/doesNotExist4.dart");
File file3 = new File(source3.getFullName());
assertEquals("doesNotExist4.dart", file3.getName());
File parent3 = file3.getParentFile();
assertEquals("doesNotExist3", parent3.getName());
}
private void assertUriDoesNotResolve(Project project) {
SourceFactory factory = project.getDefaultContext().getSourceFactory();
Source source = factory.forUri("package:foo/foo.dart");
assertNotNull(source);
assertFalse(new File(source.getFullName()).exists());
}
}