// 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.code.parenmatch; import static com.google.collide.client.editor.search.SearchTestsUtil.createMockViewport; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import com.google.collide.client.editor.renderer.Renderer; import com.google.collide.client.editor.search.SearchTask.SearchDirection; import com.google.collide.client.editor.selection.SelectionModel.CursorListener; import com.google.collide.client.testing.StubIncrementalScheduler; import com.google.collide.client.util.IncrementalScheduler; import com.google.collide.shared.document.Document; import com.google.collide.shared.document.Line; import com.google.collide.shared.document.LineInfo; import com.google.collide.shared.document.anchor.AnchorManager; import com.google.collide.shared.util.ListenerManager; import com.google.collide.shared.util.ListenerRegistrar; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import junit.framework.TestCase; import org.easymock.EasyMock; /** * Tests the ParenMatchHighlighter's ability to find the correct match * */ public class ParenMatchHighlighterTests extends TestCase { private Document document; private ParenMatchHighlighter parenMatchHighlighter; private AnchorManager mockAnchorManager; public void customSetUp(ImmutableList<String> lines) { document = Document.createFromString(Joiner.on('\n').join(lines)); mockAnchorManager = EasyMock.createMock(AnchorManager.class); ParenMatchHighlighter.Css mockCss = EasyMock.createNiceMock(ParenMatchHighlighter.Css.class); expect(mockCss.match()).andReturn("whatever"); replay(mockCss); ParenMatchHighlighter.Resources mockResources = EasyMock.createNiceMock(ParenMatchHighlighter.Resources.class); expect(mockResources.parenMatchHighlighterCss()).andReturn(mockCss); replay(mockResources); Renderer mockRenderer = EasyMock.createNiceMock(Renderer.class); replay(mockRenderer); IncrementalScheduler stubScheduler = new StubIncrementalScheduler(10, 1000); ListenerRegistrar<CursorListener> listenerRegistrar = ListenerManager.create(); parenMatchHighlighter = new ParenMatchHighlighter(document, createMockViewport(document, lines.size()), mockAnchorManager, mockResources, mockRenderer, stubScheduler, listenerRegistrar); } public void testMatchDownSameLine() { customSetUp(ImmutableList.of("(text {in} between)")); LineInfo startLineInfo = document.getFirstLineInfo(); // should find the match on line 1, at column 16 expect( mockAnchorManager.createAnchor(EasyMock.eq(ParenMatchHighlighter.MATCH_ANCHOR_TYPE), EasyMock.eq(startLineInfo.line()), EasyMock.eq(0), EasyMock.eq(18))).andReturn(null); replay(mockAnchorManager); parenMatchHighlighter.search(SearchDirection.DOWN, ')', '(', startLineInfo, 1); verify(mockAnchorManager); } public void testMatchUpSameLine() { customSetUp(ImmutableList.of("<img src='img.jpg' name='test'>")); LineInfo startLineInfo = document.getFirstLineInfo(); // should fine the match one line 1, column 0 expect( mockAnchorManager.createAnchor(EasyMock.eq(ParenMatchHighlighter.MATCH_ANCHOR_TYPE), EasyMock.eq(startLineInfo.line()), EasyMock.eq(0), EasyMock.eq(0))).andReturn(null); replay(mockAnchorManager); parenMatchHighlighter.search(SearchDirection.UP, '<', '>', startLineInfo, 31); verify(mockAnchorManager); } /** * Starts after first { and searches down for } <code> * function foo() { * var temp = 1; * } * </code> */ public void testMatchDownDifferentLines() { customSetUp(ImmutableList.of("function foo() {", " var temp = 1;", "}")); Line startLine = document.getFirstLine(); Line matchLine = document.getLastLine(); // should find the match on line 3, column 0 expect( mockAnchorManager.createAnchor(EasyMock.eq(ParenMatchHighlighter.MATCH_ANCHOR_TYPE), EasyMock.eq(matchLine), EasyMock.eq(3), EasyMock.eq(0))).andReturn(null); replay(mockAnchorManager); parenMatchHighlighter.search(SearchDirection.DOWN, '}', '{', new LineInfo(startLine, 1), 16); verify(mockAnchorManager); } /** * Starts after last ] and searches up for [ <code> * var list = ['str1', * 'str2', * 'str3'] * </code> */ public void testMatchUpDifferentLines() { final ImmutableList<String> documentText = ImmutableList.of("var list = ['str1',", " 'str2',", " 'str3']"); customSetUp(documentText); LineInfo startLineInfo = document.getLastLineInfo(); Line matchLine = document.getFirstLine(); // should find the match on line 1, column 11 expect( mockAnchorManager.createAnchor(EasyMock.eq(ParenMatchHighlighter.MATCH_ANCHOR_TYPE), EasyMock.eq(matchLine), EasyMock.eq(0), EasyMock.eq(11))).andReturn(null); replay(mockAnchorManager); parenMatchHighlighter.search(SearchDirection.UP, '[', ']', startLineInfo, 10); verify(mockAnchorManager); } /** * Starts after the first [ and searches down for the closing ]. It should * skip the open and close brackets in between. <code> * var list = ['str1', * 'str2', * ['sub1','sub2'], * 'str3'] * </code> */ public void testMatchWithFalseMatches() { final ImmutableList<String> documentText = ImmutableList.of("var list = ['str1',", "'str2',", " ['sub1','sub2'],", " 'str3']"); customSetUp(documentText); Line startLine = document.getFirstLine(); Line matchLine = document.getLastLine(); // should find match on line 4, column 11 expect( mockAnchorManager.createAnchor(EasyMock.eq(ParenMatchHighlighter.MATCH_ANCHOR_TYPE), EasyMock.eq(matchLine), EasyMock.eq(4), EasyMock.eq(9))).andReturn(null); replay(mockAnchorManager); parenMatchHighlighter.search(SearchDirection.DOWN, ']', '[', new LineInfo(startLine, 1), 12); verify(mockAnchorManager); } }