// Copyright 2012 Google Inc. All Rights Reserved. // // 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.google.collide.client.editor.search; import static com.google.collide.client.editor.search.SearchTestsUtil.createDocument; import static com.google.collide.client.editor.search.SearchTestsUtil.createMockViewport; import static com.google.collide.client.editor.search.SearchTestsUtil.gotoLineInfo; import static org.easymock.EasyMock.anyObject; import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.expectLastCall; import static org.easymock.EasyMock.not; import static org.easymock.EasyMock.or; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import com.google.collide.client.AppContext; import com.google.collide.client.Resources; import com.google.collide.client.editor.ViewportModel; import com.google.collide.client.editor.renderer.LineRenderer; import com.google.collide.client.editor.renderer.Renderer; import com.google.collide.client.editor.search.SearchMatchRenderer.Css; import com.google.collide.client.editor.search.SearchModel.SearchProgressListener; import com.google.collide.client.editor.search.SearchTestsUtil.StubMatchManager; import com.google.collide.client.editor.selection.SelectionModel; import com.google.collide.client.testing.StubIncrementalScheduler; import com.google.collide.shared.document.Document; import com.google.collide.shared.document.LineInfo; import com.google.gwt.regexp.shared.RegExp; import junit.framework.TestCase; import org.easymock.EasyMock; /** * Tests the search model */ public class SearchModelTests extends TestCase { private static AppContext createMockContext() { AppContext mockContext = EasyMock.createMock(AppContext.class); Resources mockResources = EasyMock.createMock(Resources.class); Css mockCss = EasyMock.createMock(Css.class); expect(mockContext.getResources()).andReturn(mockResources).anyTimes(); expect(mockResources.searchMatchRendererCss()).andReturn(mockCss).anyTimes(); expect(mockCss.match()).andReturn("match").anyTimes(); replay(mockCss, mockResources, mockContext); return mockContext; } private static SelectionModel createMockSelectionModel(Document document) { SelectionModel selection = EasyMock.createMock(SelectionModel.class); expect(selection.getCursorLine()).andReturn(document.getFirstLine()).anyTimes(); expect(selection.getCursorLineNumber()).andReturn(0).anyTimes(); replay(selection); return selection; } public void testSetQueryNullOrEmpty() { Document document = createDocument(); // Setup the renderer Renderer mockRenderer = EasyMock.createNiceMock(Renderer.class); mockRenderer.addLineRenderer(anyObject(LineRenderer.class)); mockRenderer.removeLineRenderer(anyObject(LineRenderer.class)); replay(mockRenderer); AppContext mockContext = createMockContext(); ViewportModel mockView = createMockViewport(document, 4); SearchModel model = SearchModel.createWithManagerAndScheduler(mockContext, document, mockRenderer, mockView, new StubMatchManager(document), new StubIncrementalScheduler(10, 1000), createMockSelectionModel(document)); // Almost nothing is performed here since there was no previous query model.setQuery(""); model.setQuery("a"); model.setQuery(""); try { model.setQuery(null); fail("Did not throw Illegal Argument Exception on Null"); } catch (IllegalArgumentException e) { } // verify verify(mockRenderer, mockView, mockContext); } public void testSetQueryReturnsNumberOfMatches() { Document document = createDocument(); AppContext mockContext = createMockContext(); ViewportModel mockView = createMockViewport(document, 4); StubMatchManager mockMatchManager = new StubMatchManager(document); // Setup Callback SearchProgressListener callback = EasyMock.createMock(SearchProgressListener.class); callback.onSearchBegin(); callback.onSearchDone(); callback.onSearchBegin(); callback.onSearchDone(); callback.onSearchBegin(); callback.onSearchDone(); callback.onSearchBegin(); callback.onSearchDone(); replay(callback); // None of these get called during this test Renderer mockRenderer = EasyMock.createNiceMock(Renderer.class); replay(mockRenderer); SearchModel model = SearchModel.createWithManagerAndScheduler(mockContext, document, mockRenderer, mockView, mockMatchManager, new StubIncrementalScheduler(10, 1000), createMockSelectionModel(document)); model.setQuery("when", callback); assertEquals(1, mockMatchManager.getTotalMatches()); model.setQuery("When", callback); assertEquals(1, mockMatchManager.getTotalMatches()); model.setQuery("Doug", callback); assertEquals(8, mockMatchManager.getTotalMatches()); model.setQuery("tiger", callback); assertEquals(3, mockMatchManager.getTotalMatches()); model.setQuery("", callback); assertEquals(0, mockMatchManager.getTotalMatches()); // verify verify(callback, mockRenderer, mockView, mockContext); } public void testCallbackCalledWhenAllLinesFitInViewport() { Document document = createDocument(); AppContext mockContext = createMockContext(); ViewportModel mockView = createMockViewport(document, SearchTestsUtil.DOCUMENT_LINES.size() - 1); StubMatchManager mockMatchManager = new StubMatchManager(document); // Setup Callback SearchProgressListener callback = EasyMock.createMock(SearchProgressListener.class); callback.onSearchBegin(); callback.onSearchDone(); callback.onSearchBegin(); callback.onSearchDone(); replay(callback); // None of these get called during this test Renderer mockRenderer = EasyMock.createNiceMock(Renderer.class); replay(mockRenderer); SearchModel model = SearchModel.createWithManagerAndScheduler(mockContext, document, mockRenderer, mockView, mockMatchManager, new StubIncrementalScheduler(10, 1000), createMockSelectionModel(document)); model.setQuery("when", callback); model.setQuery("Doug", callback); // verify callback is called verify(callback, mockRenderer, mockView, mockContext); } public void testMatchManagerIsCalledCorrectly() { Document document = createDocument(); AppContext mockContext = createMockContext(); ViewportModel mockView = createMockViewport(document, 4); // Let's test the behavior towards match manager this time SearchMatchManager mockMatchManager = EasyMock.createMock(SearchMatchManager.class); mockMatchManager.clearMatches(); expectLastCall().times(2); expect(mockMatchManager.getTotalMatches()).andReturn(8).times(2); mockMatchManager.setSearchPattern(anyObject(RegExp.class)); // Mocking the behavior of addMatches is a bit more difficult... LineInfo lineSixInfo = gotoLineInfo(document, 6); LineInfo lineEightInfo = gotoLineInfo(document, 8); mockMatchManager.addMatches(lineSixInfo, 1); mockMatchManager.addMatches(lineEightInfo, 7); mockMatchManager.addMatches(not(or(eq(lineSixInfo), eq(lineEightInfo))), eq(0)); expectLastCall().times(10); replay(mockMatchManager); // None of these get called during this test Renderer mockRenderer = EasyMock.createNiceMock(Renderer.class); replay(mockRenderer); SearchModel model = SearchModel.createWithManagerAndScheduler(mockContext, document, mockRenderer, mockView, mockMatchManager, new StubIncrementalScheduler(10, 1000), createMockSelectionModel(document)); model.setQuery("Doug"); // verify callback is called verify(mockRenderer, mockView, mockContext); } }