blob: cf5b19ccb984420f55bccacffb417a9cf4e061ff [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.netbeans.modules.editor.search;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JTextArea;
import org.junit.Test;
import static org.junit.Assert.*;
import org.netbeans.modules.editor.search.DocumentFinder.FindReplaceResult;
/**
* @author Milutin Kristofic
*/
public class DocumentFinderTest {
private final static int[] NOT_FOUND_RESULT = new int[]{-1, 0};
public DocumentFinderTest() {
}
private static class SearchBuilder {
final Map<String, Object> props = new HashMap<>();
public SearchBuilder() {
getDefaultValues();
}
private void getDefaultValues() {
props.put(EditorFindSupport.FIND_WHAT, "test");
props.put(EditorFindSupport.FIND_BACKWARD_SEARCH, Boolean.FALSE);
props.put(EditorFindSupport.FIND_WHOLE_WORDS, Boolean.FALSE);
props.put(EditorFindSupport.FIND_HIGHLIGHT_SEARCH, Boolean.TRUE);
props.put(EditorFindSupport.FIND_INC_SEARCH, Boolean.TRUE);
props.put(EditorFindSupport.FIND_WRAP_SEARCH, Boolean.FALSE);
props.put(EditorFindSupport.FIND_MATCH_CASE, Boolean.FALSE);
props.put(EditorFindSupport.FIND_SMART_CASE, Boolean.FALSE);
props.put(EditorFindSupport.FIND_REG_EXP, Boolean.FALSE);
props.put(EditorFindSupport.FIND_HISTORY, new Integer(30));
}
private SearchBuilder setFwdSearch(String findWhat) {
getDefaultValues();
props.put(EditorFindSupport.FIND_WHAT, findWhat);
return this;
}
private SearchBuilder setBwdSearch(String findWhat) {
getDefaultValues();
props.put(EditorFindSupport.FIND_WHAT, findWhat);
props.put(EditorFindSupport.FIND_BACKWARD_SEARCH, Boolean.TRUE);
return this;
}
private SearchBuilder setWholeWordsBwdSearch(String findWhat) {
getDefaultValues();
props.put(EditorFindSupport.FIND_WHAT, findWhat);
props.put(EditorFindSupport.FIND_BACKWARD_SEARCH, Boolean.TRUE);
props.put(EditorFindSupport.FIND_WHOLE_WORDS, Boolean.TRUE);
return this;
}
private SearchBuilder setWholeWordsFwdSearch(String findWhat) {
getDefaultValues();
props.put(EditorFindSupport.FIND_WHAT, findWhat);
props.put(EditorFindSupport.FIND_WHOLE_WORDS, Boolean.TRUE);
return this;
}
private SearchBuilder setMatchCase() {
props.put(EditorFindSupport.FIND_MATCH_CASE, Boolean.TRUE);
return this;
}
private SearchBuilder setPreserveCase() {
props.put(EditorFindSupport.FIND_PRESERVE_CASE, Boolean.TRUE);
return this;
}
public Map<String, Object> getProps() {
return props;
}
}
private int[] find(SearchBuilder searchBuilder, String docText, int startOffset, int endOffset) throws BadLocationException {
return DocumentFinder.find(getDocument(docText), startOffset, endOffset, searchBuilder.getProps(), false);
}
private int[] find(SearchBuilder searchBuilder, String docText) throws BadLocationException {
if (docText != null) {
return DocumentFinder.find(getDocument(docText), 0, docText.length(), searchBuilder.getProps(), false);
} else {
return DocumentFinder.find(getDocument(docText), 0, 10, searchBuilder.getProps(), false);
}
}
private DocumentFinder.FindReplaceResult replace(SearchBuilder searchBuilder, String docText, String replaceText) throws BadLocationException {
if (docText != null) {
return DocumentFinder.findReplaceResult(replaceText, getDocument(docText), 0, docText.length(), searchBuilder.getProps(), false);
} else {
return DocumentFinder.findReplaceResult(replaceText, getDocument(docText), 0, 10, searchBuilder.getProps(), false);
}
}
private Document getDocument(String str) {
JTextArea ta = new JTextArea(str);
if (str != null && str.length() > 0) {
ta.setCaretPosition(1);
}
Document doc = ta.getDocument();
return doc;
}
@Test
public void testSearchFalseFind() throws Exception {
String findWhat = "test1";
String docText = "";
int[] finds = find(new SearchBuilder().setFwdSearch(findWhat), docText);
final int[] expectedFinds = NOT_FOUND_RESULT;
assertArrayEquals(expectedFinds, finds);
docText = null;
finds = find(new SearchBuilder().setFwdSearch(findWhat), docText);
assertArrayEquals(expectedFinds, finds);
}
@Test
public void testSearch() throws Exception {
String findWhat = "test1";
String docText = "...Text...aTest1 ...Text...";
int[] finds = find(new SearchBuilder().setFwdSearch(findWhat), docText);
final int[] expectedFinds = {docText.toLowerCase().indexOf(findWhat), docText.toLowerCase().indexOf(findWhat) + findWhat.length()};
assertArrayEquals(expectedFinds, finds);
finds = find(new SearchBuilder().setBwdSearch(findWhat), docText, docText.length(), docText.length());
assertArrayEquals(expectedFinds, finds);
}
@Test
public void testMatchCaseSearch() throws Exception {
String findWhat = "test1";
String docText = "...Text...test1...Text...";
int[] finds = find(new SearchBuilder().setFwdSearch(findWhat).setMatchCase(), docText);
final int[] expectedFinds = {docText.toLowerCase().indexOf(findWhat), docText.toLowerCase().indexOf(findWhat) + findWhat.length()};
assertArrayEquals(expectedFinds, finds);
finds = find(new SearchBuilder().setBwdSearch(findWhat).setMatchCase(), docText, docText.length(), docText.length());
assertArrayEquals(expectedFinds, finds);
docText = "...Text... Test1 ...Text...";
finds = find(new SearchBuilder().setFwdSearch(findWhat).setMatchCase(), docText, docText.length(), docText.length());
assertArrayEquals(NOT_FOUND_RESULT, finds);
finds = find(new SearchBuilder().setBwdSearch(findWhat).setMatchCase(), docText, docText.length(), docText.length());
assertArrayEquals(NOT_FOUND_RESULT, finds);
findWhat = "Test1";
docText = "...Text...test1 ...Text...";
finds = find(new SearchBuilder().setBwdSearch(findWhat).setMatchCase(), docText, docText.length(), docText.length());
assertArrayEquals(NOT_FOUND_RESULT, finds);
finds = find(new SearchBuilder().setBwdSearch(findWhat).setMatchCase(), docText, docText.length(), docText.length());
assertArrayEquals(NOT_FOUND_RESULT, finds);
findWhat = "Test1";
docText = "...Text... test1 ...Text...";
finds = find(new SearchBuilder().setWholeWordsBwdSearch(findWhat).setMatchCase(), docText, docText.length(), docText.length());
assertArrayEquals(NOT_FOUND_RESULT, finds);
finds = find(new SearchBuilder().setWholeWordsBwdSearch(findWhat).setMatchCase(), docText, docText.length(), docText.length());
assertArrayEquals(NOT_FOUND_RESULT, finds);
}
@Test
public void testWholeWordsSearch() throws Exception {
String findWhat = "test1";
String docText = "...Text... test1 ...Text...";
int[] finds = find(new SearchBuilder().setFwdSearch(findWhat).setMatchCase(), docText);
final int[] expectedFinds = {docText.toLowerCase().indexOf(findWhat), docText.toLowerCase().indexOf(findWhat) + findWhat.length()};
assertArrayEquals(expectedFinds, finds);
finds = find(new SearchBuilder().setBwdSearch(findWhat).setMatchCase(), docText, docText.length(), docText.length());
assertArrayEquals(expectedFinds, finds);
docText = "...Text...atest1...Text...";
finds = find(new SearchBuilder().setWholeWordsBwdSearch(findWhat), docText, docText.length(), docText.length());
assertArrayEquals(NOT_FOUND_RESULT, finds);
finds = find(new SearchBuilder().setWholeWordsBwdSearch(findWhat), docText, docText.length(), docText.length());
assertArrayEquals(NOT_FOUND_RESULT, finds);
docText = "...Text... Test1 ...Text...";
finds = find(new SearchBuilder().setFwdSearch(findWhat), docText);
assertArrayEquals(expectedFinds, finds);
finds = find(new SearchBuilder().setBwdSearch(findWhat), docText, docText.length(), docText.length());
assertArrayEquals(expectedFinds, finds);
findWhat = "Test1";
docText = "...Text... test1 ...Text...";
finds = find(new SearchBuilder().setWholeWordsBwdSearch(findWhat).setMatchCase(), docText, docText.length(), docText.length());
assertArrayEquals(NOT_FOUND_RESULT, finds);
finds = find(new SearchBuilder().setWholeWordsBwdSearch(findWhat).setMatchCase(), docText, docText.length(), docText.length());
assertArrayEquals(NOT_FOUND_RESULT, finds);
}
/**
* Test of backward whole words search
* Bug #177126
*/
@Test
public void testBackWardSearchWholeWordsEndOfWords() throws Exception {
String findWhat = "PAxx1";
String docText = " PAxx11 ";
int[] finds = find(new SearchBuilder().setWholeWordsBwdSearch(findWhat), docText);
final int[] expectedFinds = NOT_FOUND_RESULT;
assertArrayEquals(expectedFinds, finds);
}
/**
* Test of backward whole words search - a word is in the beginning of document
* reopened Bug #177126
*/
@Test
public void testBackWardSearchWholeWordsBeginDocument() throws Exception {
String findWhat = "Test1";
String docText = "Test1 ";
int[] finds = find(new SearchBuilder().setWholeWordsBwdSearch(findWhat), docText, docText.length(), docText.length());
final int[] expectedFinds = {0, findWhat.length()};
assertArrayEquals(expectedFinds, finds);
}
@Test
public void testReplacePreserveCase() throws Exception {
String findWhat = "Test1";
String replaceText = "next1";
String docText = "test1";
String expectedReplace = "next1";
FindReplaceResult replaceResult = replace(new SearchBuilder().setPreserveCase().setFwdSearch(findWhat), docText, replaceText);
final int[] expectedFinds = {docText.toLowerCase().indexOf(findWhat.toLowerCase()), docText.toLowerCase().indexOf(findWhat.toLowerCase()) + findWhat.length()};
assertArrayEquals(expectedFinds, replaceResult.getFoundPositions());
assertEquals(expectedReplace, replaceResult.getReplacedString());
docText = "Test1";
expectedReplace = "Next1";
replaceResult = replace(new SearchBuilder().setPreserveCase().setFwdSearch(findWhat), docText, replaceText);
assertArrayEquals(expectedFinds, replaceResult.getFoundPositions());
assertEquals(expectedReplace, replaceResult.getReplacedString());
docText = "TEST1";
expectedReplace = "NEXT1";
replaceResult = replace(new SearchBuilder().setPreserveCase().setFwdSearch(findWhat), docText, replaceText);
assertArrayEquals(expectedFinds, replaceResult.getFoundPositions());
assertEquals(expectedReplace, replaceResult.getReplacedString());
docText = "tEST1";
expectedReplace = "nEXT1";
replaceResult = replace(new SearchBuilder().setPreserveCase().setFwdSearch(findWhat), docText, replaceText);
assertArrayEquals(expectedFinds, replaceResult.getFoundPositions());
assertEquals(expectedReplace, replaceResult.getReplacedString());
}
@Test
public void testReplacePreserveCaseCamelCase() throws Exception {
String findWhat = "FooBar";
String replaceText = "SomethingElse";
String docText = "fooBar";
String expectedReplace = "somethingElse";
FindReplaceResult replaceResult = replace(new SearchBuilder().setPreserveCase().setFwdSearch(findWhat), docText, replaceText);
int[] expectedFinds = {docText.toLowerCase().indexOf(findWhat.toLowerCase()), docText.toLowerCase().indexOf(findWhat.toLowerCase()) + findWhat.length()};
assertArrayEquals(expectedFinds, replaceResult.getFoundPositions());
assertEquals(expectedReplace, replaceResult.getReplacedString());
docText = "foobar";
expectedReplace = "somethingelse";
replaceResult = replace(new SearchBuilder().setPreserveCase().setFwdSearch(findWhat), docText, replaceText);
assertArrayEquals(expectedFinds, replaceResult.getFoundPositions());
assertEquals(expectedReplace, replaceResult.getReplacedString());
findWhat = "JPanel";
replaceText = "MBox";
docText = "JPanel";
expectedReplace = "MBox";
expectedFinds = new int[] {docText.toLowerCase().indexOf(findWhat.toLowerCase()), docText.toLowerCase().indexOf(findWhat.toLowerCase()) + findWhat.length()};
replaceResult = replace(new SearchBuilder().setPreserveCase().setFwdSearch(findWhat), docText, replaceText);
assertArrayEquals(expectedFinds, replaceResult.getFoundPositions());
assertEquals(expectedReplace, replaceResult.getReplacedString());
docText = "jPanel";
expectedReplace = "mBox";
replaceResult = replace(new SearchBuilder().setPreserveCase().setFwdSearch(findWhat), docText, replaceText);
assertArrayEquals(expectedFinds, replaceResult.getFoundPositions());
assertEquals(expectedReplace, replaceResult.getReplacedString());
docText = "jpanel";
expectedReplace = "mbox";
replaceResult = replace(new SearchBuilder().setPreserveCase().setFwdSearch(findWhat), docText, replaceText);
assertArrayEquals(expectedFinds, replaceResult.getFoundPositions());
assertEquals(expectedReplace, replaceResult.getReplacedString());
findWhat = "MyClass";
replaceText = "DaRealJunk";
docText = "MyClass";
expectedFinds = new int[] {docText.toLowerCase().indexOf(findWhat.toLowerCase()), docText.toLowerCase().indexOf(findWhat.toLowerCase()) + findWhat.length()};
expectedReplace = "DaRealJunk";
replaceResult = replace(new SearchBuilder().setPreserveCase().setFwdSearch(findWhat), docText, replaceText);
assertArrayEquals(expectedFinds, replaceResult.getFoundPositions());
assertEquals(expectedReplace, replaceResult.getReplacedString());
docText = "myClass";
expectedReplace = "daRealJunk";
replaceResult = replace(new SearchBuilder().setPreserveCase().setFwdSearch(findWhat), docText, replaceText);
assertArrayEquals(expectedFinds, replaceResult.getFoundPositions());
assertEquals(expectedReplace, replaceResult.getReplacedString());
docText = "myclass";
expectedReplace = "darealjunk";
replaceResult = replace(new SearchBuilder().setPreserveCase().setFwdSearch(findWhat), docText, replaceText);
assertArrayEquals(expectedFinds, replaceResult.getFoundPositions());
assertEquals(expectedReplace, replaceResult.getReplacedString());
findWhat = "DaRealJunk";
replaceText = "MyClass";
docText = "DaRealJunk";
expectedFinds = new int[] {docText.toLowerCase().indexOf(findWhat.toLowerCase()), docText.toLowerCase().indexOf(findWhat.toLowerCase()) + findWhat.length()};
expectedReplace = "MyClass";
replaceResult = replace(new SearchBuilder().setPreserveCase().setFwdSearch(findWhat), docText, replaceText);
assertArrayEquals(expectedFinds, replaceResult.getFoundPositions());
assertEquals(expectedReplace, replaceResult.getReplacedString());
docText = "daRealJunk";
expectedReplace = "myClass";
replaceResult = replace(new SearchBuilder().setPreserveCase().setFwdSearch(findWhat), docText, replaceText);
assertArrayEquals(expectedFinds, replaceResult.getFoundPositions());
assertEquals(expectedReplace, replaceResult.getReplacedString());
docText = "darealjunk";
expectedReplace = "myclass";
replaceResult = replace(new SearchBuilder().setPreserveCase().setFwdSearch(findWhat), docText, replaceText);
assertArrayEquals(expectedFinds, replaceResult.getFoundPositions());
assertEquals(expectedReplace, replaceResult.getReplacedString());
findWhat = "foo";
replaceText = "fooBar";
docText = "Foo";
expectedFinds = new int[] {docText.toLowerCase().indexOf(findWhat.toLowerCase()), docText.toLowerCase().indexOf(findWhat.toLowerCase()) + findWhat.length()};
expectedReplace = "FooBar";
replaceResult = replace(new SearchBuilder().setPreserveCase().setFwdSearch(findWhat), docText, replaceText);
assertArrayEquals(expectedFinds, replaceResult.getFoundPositions());
assertEquals(expectedReplace, replaceResult.getReplacedString());
}
@Test
public void testReplacePreserveCaseNotPreserveCase() throws Exception {
String findWhat = "Test1";
String replaceText = "next1";
String docText = "test1";
String expectedReplace = "next1";
FindReplaceResult replaceResult = replace(new SearchBuilder().setPreserveCase().setFwdSearch(findWhat), docText, replaceText);
final int[] expectedFinds = {docText.toLowerCase().indexOf(findWhat.toLowerCase()), docText.toLowerCase().indexOf(findWhat.toLowerCase()) + findWhat.length()};
assertArrayEquals(expectedFinds, replaceResult.getFoundPositions());
assertEquals(expectedReplace, replaceResult.getReplacedString());
docText = "TEST1";
expectedReplace = "next1";
replaceResult = replace(new SearchBuilder().setFwdSearch(findWhat), docText, replaceText);
assertArrayEquals(expectedFinds, replaceResult.getFoundPositions());
assertEquals(expectedReplace, replaceResult.getReplacedString());
docText = "Test1";
expectedReplace = "next1";
replaceResult = replace(new SearchBuilder().setFwdSearch(findWhat), docText, replaceText);
assertArrayEquals(expectedFinds, replaceResult.getFoundPositions());
assertEquals(expectedReplace, replaceResult.getReplacedString());
docText = "Test1";
replaceText = null;
replaceResult = replace(new SearchBuilder().setFwdSearch(findWhat), docText, replaceText);
assertArrayEquals(expectedFinds, replaceResult.getFoundPositions());
assertNull(replaceResult.getReplacedString());
docText = "Test1";
replaceText = "";
expectedReplace = "";
replaceResult = replace(new SearchBuilder().setFwdSearch(findWhat), docText, replaceText);
assertArrayEquals(expectedFinds, replaceResult.getFoundPositions());
assertEquals(expectedReplace, replaceResult.getReplacedString());
}
}