/* * 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.builder; import com.google.dart.engine.context.AnalysisContext; import com.google.dart.engine.context.AnalysisContextFactory; import com.google.dart.engine.context.ChangeSet; import com.google.dart.engine.error.AnalysisError; import com.google.dart.engine.source.FileBasedSource; import com.google.dart.engine.source.Source; import com.google.dart.engine.utilities.source.LineInfo; import com.google.dart.tools.core.AbstractDartCoreTest; import com.google.dart.tools.core.analysis.model.AnalysisEvent; import com.google.dart.tools.core.analysis.model.AnalysisListener; import com.google.dart.tools.core.analysis.model.ContextManager; import com.google.dart.tools.core.analysis.model.ResolvedEvent; import com.google.dart.tools.core.analysis.model.ResolvedHtmlEvent; import com.google.dart.tools.core.mock.MockFile; import com.google.dart.tools.core.mock.MockProject; import com.google.dart.tools.core.mock.MockWorkspace; import com.google.dart.tools.core.mock.MockWorkspaceRoot; import org.eclipse.core.resources.IResource; import static org.fest.assertions.Assertions.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import java.util.ArrayList; public class AnalysisWorkerTest extends AbstractDartCoreTest { private final class Listener implements AnalysisListener { ArrayList<AnalysisContext> completed = new ArrayList<AnalysisContext>(); ArrayList<IResource> resolved = new ArrayList<IResource>(); @Override public void complete(AnalysisEvent event) { completed.add(event.getContext()); assertEquals(originalCacheSize, event.getContext().getAnalysisOptions().getCacheSize()); } @Override public void resolved(ResolvedEvent event) { resolved.add(event.getResource()); assertThat(event.getContext().getAnalysisOptions().getCacheSize()).isGreaterThan( originalCacheSize); } @Override public void resolvedHtml(ResolvedHtmlEvent event) { resolved.add(event.getResource()); assertThat(event.getContext().getAnalysisOptions().getCacheSize()).isGreaterThan( originalCacheSize); } void assertCompleted(AnalysisContext expected) { assertTrue(completed.contains(expected)); } void assertNotCompleted(AnalysisContext expected) { assertFalse(completed.contains(expected)); } void assertResolved(IResource res) { assertTrue(resolved.contains(res)); } } private final MockWorkspace workspace = new MockWorkspace(); private final MockWorkspaceRoot root = workspace.getRoot(); private final MockProject project = root.add(new MockProject(root, getClass().getSimpleName())); private final ContextManager contextManager = mock(ContextManager.class); private final AnalysisContext analysisContext = AnalysisContextFactory.contextWithCore(); private final int originalCacheSize = analysisContext.getAnalysisOptions().getCacheSize(); private final AnalysisMarkerManager markerManager = mock(AnalysisMarkerManager.class); private final Listener listener = new Listener(); public void test_getContext() throws Exception { AnalysisWorker worker = new AnalysisWorker(contextManager, analysisContext, null, null, null); assertSame(analysisContext, worker.getContext()); } public void test_new() throws Exception { AnalysisWorker worker = new AnalysisWorker(contextManager, analysisContext, null, null, null); verify(contextManager).addWorker(worker); } public void test_performAnalysis() throws Exception { MockFile libFile = project.addFile("test.dart"); Source libSource = addSource(libFile, "library a;\nmain() {}"); ChangeSet changeSet = new ChangeSet(); changeSet.addedSource(libSource); analysisContext.applyChanges(changeSet); when(contextManager.getResource(libSource)).thenReturn(libFile); AnalysisManager analysisManager = new AnalysisManager(); when(contextManager.getResource()).thenReturn(project); AnalysisWorker worker = new AnalysisWorker( contextManager, analysisContext, null, null, markerManager); worker.performAnalysis(analysisManager); verify(markerManager).queueHasDartSdk(project, true); verify(markerManager, atLeastOnce()).queueErrors( eq(libFile), any(LineInfo.class), any(AnalysisError[].class)); verify(markerManager).done(); listener.assertCompleted(analysisContext); listener.assertResolved(libFile); assertEquals(originalCacheSize, analysisContext.getAnalysisOptions().getCacheSize()); } public void test_performAnalysis_nothingToDo() throws Exception { AnalysisManager analysisManager = new AnalysisManager(); when(contextManager.getResource()).thenReturn(project); AnalysisWorker worker = new AnalysisWorker( contextManager, analysisContext, null, null, markerManager); worker.performAnalysis(analysisManager); verify(markerManager).queueHasDartSdk(project, true); verify(markerManager).done(); verifyNoMoreInteractions(markerManager); listener.assertCompleted(analysisContext); assertEquals(originalCacheSize, analysisContext.getAnalysisOptions().getCacheSize()); } public void test_performAnalysis_nullContext() throws Exception { AnalysisWorker worker = new AnalysisWorker(contextManager, null, null, null, null); worker.performAnalysis(null); verifyNoMoreInteractions(markerManager); listener.assertNotCompleted(analysisContext); assertEquals(originalCacheSize, analysisContext.getAnalysisOptions().getCacheSize()); } public void test_performAnalysis_stop() throws Exception { MockFile libFile = project.addFile("test.dart"); Source libSource = addSource(libFile, "library a;\nmain() {}"); ChangeSet changeSet = new ChangeSet(); changeSet.addedSource(libSource); analysisContext.applyChanges(changeSet); when(contextManager.getResource(libSource)).thenReturn(libFile); AnalysisManager analysisManager = new AnalysisManager(); when(contextManager.getResource()).thenReturn(project); AnalysisWorker worker = new AnalysisWorker( contextManager, analysisContext, null, null, markerManager); worker.stop(); worker.performAnalysis(analysisManager); verifyNoMoreInteractions(markerManager); listener.assertNotCompleted(analysisContext); assertEquals(originalCacheSize, analysisContext.getAnalysisOptions().getCacheSize()); } public void test_stop() throws Exception { AnalysisWorker worker = new AnalysisWorker(contextManager, analysisContext, null, null, null); worker.stop(); assertNull(worker.getContext()); verify(contextManager).removeWorker(worker); } @Override protected void setUp() throws Exception { AnalysisWorker.addListener(listener); } @Override protected void tearDown() throws Exception { AnalysisWorker.removeListener(listener); } private Source addSource(MockFile file, String contents) { Source source = new FileBasedSource(file.toFile()); ChangeSet changeSet = new ChangeSet(); changeSet.addedSource(source); analysisContext.applyChanges(changeSet); analysisContext.setContents(source, contents); return source; } }