Package org.fife.ui.rtextarea

Source Code of org.fife.ui.rtextarea.SearchEngineTest

/*
* 05/12/2010
*
* SearchEngineTest.java - Test cases for SearchEngine.java
*
* This library is distributed under a modified BSD license.  See the included
* RSyntaxTextArea.License.txt file for details.
*/
package org.fife.ui.rtextarea;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

import javax.swing.text.BadLocationException;

import org.fife.ui.rsyntaxtextarea.DocumentRange;
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
import org.fife.ui.rtextarea.SearchEngine;
import org.junit.BeforeClass;
import org.junit.Test;

import static org.junit.Assert.*;

/**
* Some very basic unit tests for the {@link SearchEngine} used by
* <code>RTextArea</code>/<code>RSyntaxTextArea</code>.
*
* @author Robert Futrell
* @version 1.0
*/
public class SearchEngineTest {

  private RSyntaxTextArea textArea = new RSyntaxTextArea();

  private static String text;
  private SearchResult result;


  /**
   * Asserts that two strings are equal, ignoring case.
   *
   * @param expected
   * @param actual
   */
  private void assertEqualsIgnoreCase(String expected, String actual) {
    expected = expected != null ? expected.toLowerCase() : null;
    actual = actual != null ? actual.toLowerCase() : null;
    assertEquals(expected, actual);
  }


  /**
   * Checks whether the result of the last find or replace operation matches
   * the given criteria.
   *
   * @param expected The expected search result.
   */
  private void assertResult(SearchResult expected) {
    assertEquals(expected, this.result);
  }


  /**
   * Asserts that the text area's selection is at the expected location and
   * has the expected value.
   *
   * @param expected
   * @param offs
   * @param matchCase
   */
  private void assertSelected(String expected, int offs, boolean matchCase) {
    String actual = textArea.getSelectedText();
    if (matchCase) {
      assertEquals(expected, actual);
    } else {
      assertEqualsIgnoreCase(expected, actual);
    }
    int selOffs = textArea.getSelectionStart();
    assertEquals("unexpected selection offset: ", offs, selOffs);
  }


  private final boolean findImpl(SearchContext context) {
    result = SearchEngine.find(textArea, context);
    return result.wasFound();
  }


  private final boolean replaceImpl(SearchContext context) {
    result = SearchEngine.replace(textArea, context);
    return result.wasFound();
  }


  private final int replaceAllImpl(SearchContext context) {
    result = SearchEngine.replaceAll(textArea, context);
    return result.getCount();
  }


  @BeforeClass
  public static void setUp() throws Exception {

    // setUp() is called once per test, each with a new instantiation of
    // SearchEngineTest, so check a static variable to ensure that
    // initialization is only done once.

    if (text == null || text.length() <= 0) {

      StringBuilder sb = new StringBuilder();
      InputStream in = SearchEngineTest.class.
          getResourceAsStream("SearchEngineTest.txt");
      BufferedReader br = new BufferedReader(new InputStreamReader(in));
      String s = null;
      try {
        while ((s=br.readLine())!=null) {
          sb.append(s).append("\n");
        }
      } finally {
        br.close();
      }

      // Strip off last newline
      text = sb.toString().substring(0, sb.length()-1);

    }

  }


  /**
   * Tests <code>SearchEngine.find()</code> when searching backward.
   */
  @Test
  public void testSearchEngineFindBackward() throws BadLocationException {
    testSearchEngineFindBackwardImpl(true);
    testSearchEngineFindBackwardImpl(false);
  }


  /**
   * Tests <code>SearchEngine.find()</code> when searching backward.
   *
   * @param markAll Whether or not "mark all" should be enabled during the
   *        test.
   */
  private void testSearchEngineFindBackwardImpl(boolean markAll)
      throws BadLocationException {

    textArea.setText(text);

    int end = text.length();
    SearchContext context = new SearchContext();
    context.setSearchForward(false);
    context.setMarkAll(markAll);

    // Search for "chuck", ignoring case.
    context.setSearchFor("chuck");
    int markedCount = markAll ? 4 : 0;
    context.setMatchCase(false);
    textArea.setCaretPosition(end);
    boolean found = findImpl(context);
    assertTrue(found);
    assertSelected("chuck", 60, context.getMatchCase());
    assertResult(new SearchResult(new DocumentRange(60, 65), 1, markedCount));
    found = findImpl(context);
    assertTrue(found);
    assertSelected("chuck", 48, context.getMatchCase());
    assertResult(new SearchResult(new DocumentRange(48, 53), 1, markedCount));
    found = findImpl(context);
    assertTrue(found);
    assertSelected("chuck", 32, context.getMatchCase());
    assertResult(new SearchResult(new DocumentRange(32, 37), 1, markedCount));
    found = findImpl(context);
    assertTrue(found);
    assertSelected("chuck", 26, context.getMatchCase());
    assertResult(new SearchResult(new DocumentRange(26, 31), 1, markedCount));
    found = findImpl(context);
    assertFalse(found);
    assertResult(new SearchResult(null, 0, markedCount));

    // Search for "Chuck", matching case.
    context.setSearchFor("Chuck");
    markedCount = markAll ? 1 : 0;
    context.setMatchCase(true);
    textArea.setCaretPosition(end);
    found = findImpl(context);
    assertTrue(found);
    assertSelected("Chuck", 26, context.getMatchCase());
    assertResult(new SearchResult(new DocumentRange(26, 31), 1, markedCount));
    found = findImpl(context);
    assertFalse(found);
    assertResult(new SearchResult(null, 0, markedCount));

    // Search for "chuck", ignoring case, whole word
    context.setSearchFor("Chuck");
    markedCount = markAll ? 2 : 0;
    context.setMatchCase(false);
    context.setWholeWord(true);
    textArea.setCaretPosition(end);
    found = findImpl(context);
    assertTrue(found);
    assertSelected("chuck", 60, context.getMatchCase());
    assertResult(new SearchResult(new DocumentRange(60, 65), 1, markedCount));
    found = findImpl(context);
    assertTrue(found);
    assertSelected("chuck", 32, context.getMatchCase());
    assertResult(new SearchResult(new DocumentRange(32, 37), 1, markedCount));
    found = findImpl(context);
    assertFalse(found);
    assertResult(new SearchResult(null, 0, markedCount));

    // Search for "wood", matching case, whole word
    context.setSearchFor("wood");
    markedCount = markAll ? 1 : 0;
    context.setMatchCase(true);
    context.setWholeWord(true);
    textArea.setCaretPosition(end);
    found = findImpl(context);
    assertTrue(found);
    assertSelected("wood", 9, context.getMatchCase());
    assertResult(new SearchResult(new DocumentRange(9, 13), 1, markedCount));
    found = findImpl(context);
    assertFalse(found);
    assertResult(new SearchResult(null, 0, markedCount));

    // Search for ".ould", regex, ignoring case
    context.setSearchFor(".ould");
    markedCount = markAll ? 2 : 0;
    context.setMatchCase(false);
    context.setWholeWord(false);
    context.setRegularExpression(true);
    textArea.setCaretPosition(end);
    found = findImpl(context);
    assertTrue(found);
    assertSelected("could", 54, true);
    assertResult(new SearchResult(new DocumentRange(54, 59), 1, markedCount));
    found = findImpl(context);
    assertTrue(found);
    assertSelected("wOuld", 14, true);
    assertResult(new SearchResult(new DocumentRange(14, 19), 1, markedCount));
    found = findImpl(context);
    assertFalse(found);
    assertResult(new SearchResult(null, 0, markedCount));

    // Search for ".ould", regex, matching case
    context.setSearchFor(".ould");
    markedCount = markAll ? 1 : 0;
    context.setMatchCase(true);
    context.setWholeWord(false);
    context.setRegularExpression(true);
    textArea.setCaretPosition(end);
    found = findImpl(context);
    assertTrue(found);
    assertSelected("could", 54, true);
    assertResult(new SearchResult(new DocumentRange(54, 59), 1, markedCount));
    found = findImpl(context);
    assertFalse(found);
    assertResult(new SearchResult(null, 0, markedCount));

    // Search for "[cd]huck", regex, ignoring case, whole word
    context.setSearchFor("[cd]hUCk");
    markedCount = markAll ? 2 : 0;
    context.setMatchCase(false);
    context.setWholeWord(true);
    context.setRegularExpression(true);
    textArea.setCaretPosition(end);
    found = findImpl(context);
    assertTrue(found);
    assertSelected("chuck", 60, context.getMatchCase());
    assertResult(new SearchResult(new DocumentRange(60, 65), 1, markedCount));
    found = findImpl(context);
    assertTrue(found);
    assertSelected("chuck", 32, context.getMatchCase());
    assertResult(new SearchResult(new DocumentRange(32, 37), 1, markedCount));
    found = findImpl(context);
    assertFalse(found);
    assertResult(new SearchResult(null, 0, markedCount));

    // Search for "[cd]huck", regex, matching case, whole word
    context.setSearchFor("[cd]huck");
    markedCount = markAll ? 1 : 0;
    context.setMatchCase(true);
    context.setWholeWord(true);
    context.setRegularExpression(true);
    textArea.setCaretPosition(end);
    found = findImpl(context);
    assertTrue(found);
    assertSelected("chuck", 60, true);
    assertResult(new SearchResult(new DocumentRange(60, 65), 1, markedCount));
    found = findImpl(context);
    assertFalse(found);
    assertResult(new SearchResult(null, 0, markedCount));

  }


  /**
   * Tests <code>SearchEngine.find()</code> when searching forward.
   */
  @Test
  public void testSearchEngineFindForward() throws BadLocationException {
    testSearchEngineFindForwardImpl(true);
    testSearchEngineFindForwardImpl(false);
  }


  /**
   * Tests <code>SearchEngine.find()</code> when searching forward.
   *
   * @param markAll Whether "mark all" should be enabled during the test.
   */
  private void testSearchEngineFindForwardImpl(boolean markAll)
      throws BadLocationException {

    textArea.setText(text);

    SearchContext context = new SearchContext();
    context.setMarkAll(markAll);

    // Search for "chuck", ignoring case.
    context.setSearchFor("chuck");
    int markedCount = markAll ? 4 : 0;
    boolean found = findImpl(context);
    assertTrue(found);
    assertSelected("chuck", 26, context.getMatchCase());
    assertResult(new SearchResult(new DocumentRange(26, 31), 1, markedCount));
    found = findImpl(context);
    assertTrue(found);
    assertSelected("chuck", 32, context.getMatchCase());
    assertResult(new SearchResult(new DocumentRange(32, 37), 1, markedCount));
    found = findImpl(context);
    assertTrue(found);
    assertSelected("chuck", 48, context.getMatchCase());
    assertResult(new SearchResult(new DocumentRange(48, 53), 1, markedCount));
    found = findImpl(context);
    assertTrue(found);
    assertSelected("chuck", 60, context.getMatchCase());
    assertResult(new SearchResult(new DocumentRange(60, 65), 1, markedCount));
    found = findImpl(context);
    assertFalse(found);
    assertResult(new SearchResult(null, 0, markedCount));

    // Search for "Chuck", matching case.
    context.setSearchFor("Chuck");
    markedCount = markAll ? 1 : 0;
    context.setMatchCase(true);
    textArea.setCaretPosition(0);
    found = findImpl(context);
    assertTrue(found);
    assertSelected("Chuck", 26, context.getMatchCase());
    assertResult(new SearchResult(new DocumentRange(26, 31), 1, markedCount));
    found = findImpl(context);
    assertFalse(found);
    assertResult(new SearchResult(null, 0, markedCount));

    // Search for "chuck", ignoring case, whole word
    context.setSearchFor("chuck");
    markedCount = markAll ? 2 : 0;
    context.setMatchCase(false);
    context.setWholeWord(true);
    textArea.setCaretPosition(0);
    found = findImpl(context);
    assertTrue(found);
    assertSelected("chuck", 32, context.getMatchCase());
    assertResult(new SearchResult(new DocumentRange(32, 37), 1, markedCount));
    found = findImpl(context);
    assertTrue(found);
    assertSelected("chuck", 60, context.getMatchCase());
    assertResult(new SearchResult(new DocumentRange(60, 65), 1, markedCount));
    found = findImpl(context);
    assertFalse(found);
    assertResult(new SearchResult(null, 0, markedCount));

    // Search for "wood", matching case, whole word
    context.setSearchFor("wood");
    markedCount = markAll ? 1 : 0;
    context.setMatchCase(true);
    context.setWholeWord(true);
    textArea.setCaretPosition(0);
    found = findImpl(context);
    assertTrue(found);
    assertSelected("wood", 9, context.getMatchCase());
    assertResult(new SearchResult(new DocumentRange(9, 13), 1, markedCount));
    found = findImpl(context);
    assertFalse(found);
    assertResult(new SearchResult(null, 0, markedCount));

    // Search for ".ould", regex, ignoring case
    context.setSearchFor(".ould");
    markedCount = markAll ? 2 : 0;
    context.setMatchCase(false);
    context.setWholeWord(false);
    context.setRegularExpression(true);
    textArea.setCaretPosition(0);
    found = findImpl(context);
    assertTrue(found);
    assertSelected("wOuld", 14, true);
    assertResult(new SearchResult(new DocumentRange(14, 19), 1, markedCount));
    found = findImpl(context);
    assertTrue(found);
    assertSelected("could", 54, true);
    assertResult(new SearchResult(new DocumentRange(54, 59), 1, markedCount));
    found = findImpl(context);
    assertFalse(found);
    assertResult(new SearchResult(null, 0, markedCount));

    // Search for ".ould", regex, matching case
    context.setSearchFor(".ould");
    markedCount = markAll ? 1 : 0;
    context.setMatchCase(true);
    context.setWholeWord(false);
    context.setRegularExpression(true);
    textArea.setCaretPosition(0);
    found = findImpl(context);
    assertTrue(found);
    assertSelected("could", 54, true);
    assertResult(new SearchResult(new DocumentRange(54, 59), 1, markedCount));
    found = findImpl(context);
    assertFalse(found);
    assertResult(new SearchResult(null, 0, markedCount));

    // Search for "[cd]huck", regex, ignoring case, whole word
    context.setSearchFor("[cd]hUCk");
    markedCount = markAll ? 2 : 0;
    context.setMatchCase(false);
    context.setWholeWord(true);
    context.setRegularExpression(true);
    textArea.setCaretPosition(0);
    found = findImpl(context);
    assertTrue(found);
    assertSelected("chuck", 32, context.getMatchCase());
    assertResult(new SearchResult(new DocumentRange(32, 37), 1, markedCount));
    found = findImpl(context);
    assertTrue(found);
    assertSelected("chuck", 60, context.getMatchCase());
    assertResult(new SearchResult(new DocumentRange(60, 65), 1, markedCount));
    found = findImpl(context);
    assertFalse(found);
    assertResult(new SearchResult(null, 0, markedCount));

    // Search for "[cd]huck", regex, matching case, whole word
    context.setSearchFor("[cd]huck");
    markedCount = markAll ? 1 : 0;
    context.setMatchCase(true);
    context.setWholeWord(true);
    context.setRegularExpression(true);
    textArea.setCaretPosition(0);
    found = findImpl(context);
    assertTrue(found);
    assertSelected("chuck", 60, true);
    assertResult(new SearchResult(new DocumentRange(60, 65), 1, markedCount));
    found = findImpl(context);
    assertFalse(found);
    assertResult(new SearchResult(null, 0, markedCount));

  }


  /**
   * https://github.com/bobbylight/RSyntaxTextArea/issues/38
   */
  @Test
  public void testSearchEngineRegexFindEmptyString() throws Exception {

    textArea.setText("how the who for what is it howhow");

    String searchFor = "[how]{3}|";
    SearchContext context = new SearchContext(searchFor);
    context.setRegularExpression(true);

    assertTrue(findImpl(context));
    assertResult(new SearchResult(new DocumentRange(0, 3), 1, 4));
    assertTrue(findImpl(context));
    assertResult(new SearchResult(new DocumentRange(8, 11), 1, 4));
    assertTrue(findImpl(context));
    assertResult(new SearchResult(new DocumentRange(27, 30), 1, 4));
    assertTrue(findImpl(context));
    assertResult(new SearchResult(new DocumentRange(30, 33), 1, 4));
    assertFalse(findImpl(context));

  }


  /**
   * Tests <code>SearchEngine.markAll()</code>.
   */
  @Test
  public void testSearchEngineMarkAll() {

    textArea.setText(text);

    int end = text.length();
    SearchContext context = new SearchContext();
    context.setMarkAll(true);

    // Search for "chuck", ignoring case.
    context.setSearchFor("chuck");
    context.setMatchCase(false);
    textArea.setCaretPosition(end);
    SearchResult res = SearchEngine.markAll(textArea, context);
    assertEquals(end, textArea.getCaretPosition());
    assertEquals(new SearchResult(null, 0, 4), res);
    textArea.setCaretPosition(3);
    res = SearchEngine.markAll(textArea, context);
    assertEquals(3, textArea.getCaretPosition());
    assertEquals(new SearchResult(null, 0, 4), res);

    // Search for "Chuck", matching case.
    context.setSearchFor("Chuck");
    context.setMatchCase(true);
    textArea.setCaretPosition(end);
    res = SearchEngine.markAll(textArea, context);
    assertEquals(end, textArea.getCaretPosition());
    assertEquals(new SearchResult(null, 0, 1), res);
    textArea.setCaretPosition(1);
    res = SearchEngine.markAll(textArea, context);
    assertEquals(1, textArea.getCaretPosition());
    assertEquals(new SearchResult(null, 0, 1), res);

    // Search for "chuck", ignoring case, whole word
    context.setSearchFor("Chuck");
    context.setMatchCase(false);
    context.setWholeWord(true);
    textArea.setCaretPosition(end);
    res = SearchEngine.markAll(textArea, context);
    assertEquals(end, textArea.getCaretPosition());
    assertEquals(new SearchResult(null, 0, 2), res);
    textArea.setCaretPosition(5);
    res = SearchEngine.markAll(textArea, context);
    assertEquals(5, textArea.getCaretPosition());
    assertEquals(new SearchResult(null, 0, 2), res);

    // Search for "wood", matching case, whole word
    context.setSearchFor("wood");
    context.setMatchCase(true);
    context.setWholeWord(true);
    textArea.setCaretPosition(end);
    textArea.setCaretPosition(end);
    res = SearchEngine.markAll(textArea, context);
    assertEquals(end, textArea.getCaretPosition());
    assertEquals(new SearchResult(null, 0, 1), res);
    textArea.setCaretPosition(2);
    res = SearchEngine.markAll(textArea, context);
    assertEquals(2, textArea.getCaretPosition());
    assertEquals(new SearchResult(null, 0, 1), res);

    // Search for ".ould", regex, ignoring case
    context.setSearchFor(".ould");
    context.setMatchCase(false);
    context.setWholeWord(false);
    context.setRegularExpression(true);
    textArea.setCaretPosition(end);
    res = SearchEngine.markAll(textArea, context);
    assertEquals(end, textArea.getCaretPosition());
    assertEquals(new SearchResult(null, 0, 2), res);
    textArea.setCaretPosition(end-1);
    res = SearchEngine.markAll(textArea, context);
    assertEquals(end-1, textArea.getCaretPosition());
    assertEquals(new SearchResult(null, 0, 2), res);

    // Search for ".ould", regex, matching case
    context.setSearchFor(".ould");
    context.setMatchCase(true);
    context.setWholeWord(false);
    context.setRegularExpression(true);
    textArea.setCaretPosition(end);
    res = SearchEngine.markAll(textArea, context);
    assertEquals(end, textArea.getCaretPosition());
    assertEquals(new SearchResult(null, 0, 1), res);
    textArea.setCaretPosition(end-1);
    res = SearchEngine.markAll(textArea, context);
    assertEquals(end-1, textArea.getCaretPosition());
    assertEquals(new SearchResult(null, 0, 1), res);

    // Search for "[cd]huck", regex, ignoring case, whole word
    context.setSearchFor("[cd]hUCk");
    context.setMatchCase(false);
    context.setWholeWord(true);
    context.setRegularExpression(true);
    textArea.setCaretPosition(end);
    res = SearchEngine.markAll(textArea, context);
    assertEquals(end, textArea.getCaretPosition());
    assertEquals(new SearchResult(null, 0, 2), res);
    textArea.setCaretPosition(end-1);
    res = SearchEngine.markAll(textArea, context);
    assertEquals(end-1, textArea.getCaretPosition());
    assertEquals(new SearchResult(null, 0, 2), res);

    // Search for "[cd]huck", regex, matching case, whole word
    context.setSearchFor("[cd]huck");
    context.setMatchCase(true);
    context.setWholeWord(true);
    context.setRegularExpression(true);
    textArea.setCaretPosition(end);
    res = SearchEngine.markAll(textArea, context);
    assertEquals(end, textArea.getCaretPosition());
    assertEquals(new SearchResult(null, 0, 1), res);
    textArea.setCaretPosition(end-1);
    res = SearchEngine.markAll(textArea, context);
    assertEquals(end-1, textArea.getCaretPosition());
    assertEquals(new SearchResult(null, 0, 1), res);

  }


  /**
   * Tests <code>SearchEngine.replace()</code>.
   *
   * @param forward Whether to test searching forward or backward.
   */
  private void testSearchEngineReplace(boolean forward)
                    throws BadLocationException {

    int offs = forward ? 0 : text.length();
    SearchContext context = new SearchContext();
    context.setSearchForward(forward);
    context.setReplaceWith("FOOBAR");

    // Search for "chuck", ignoring case.
    context.setSearchFor("chuck");
    textArea.setText(text);
    String expected = textArea.getText().replaceAll("(?i:" + context.getSearchFor() ")", context.getReplaceWith());
    textArea.setCaretPosition(offs);
    boolean found = replaceImpl(context);
    assertTrue(found);
    //assertResult(new SearchResult(new DocumentRange(26, 32), 1, 0));
    found = replaceImpl(context);
    assertTrue(found);
    found = replaceImpl(context);
    assertTrue(found);
    found = replaceImpl(context);
    assertTrue(found);
    found = replaceImpl(context);
    assertFalse(found);
    assertEquals(expected, textArea.getText());

    // Search for "chuck", matching case.
    context.setSearchFor("chuck");
    textArea.setText(text);
    expected = textArea.getText().replaceAll(context.getSearchFor(), context.getReplaceWith());
    context.setMatchCase(true);
    context.setWholeWord(false);
    context.setRegularExpression(false);
    textArea.setCaretPosition(offs);
    found = replaceImpl(context);
    assertTrue(found);
    found = replaceImpl(context);
    assertTrue(found);
    found = replaceImpl(context);
    assertFalse(found);
    assertEquals(expected, textArea.getText());

    // Search for "chuck", ignoring case, whole word.
    context.setSearchFor("chuck");
    textArea.setText(text);
    expected = "How much wood wOuld a woodChuck FOOBAR, if a woodchuck could FOOBAR wOod?";
    context.setMatchCase(false);
    context.setWholeWord(true);
    context.setRegularExpression(false);
    textArea.setCaretPosition(offs);
    found = replaceImpl(context);
    assertTrue(found);
    found = replaceImpl(context);
    assertTrue(found);
    found = replaceImpl(context);
    assertFalse(found);
    assertEquals(expected, textArea.getText());

    // Search for "chuck", matching case, whole word.
    context.setSearchFor("chuck");
    textArea.setText(text);
    expected = "How much wood wOuld a woodChuck chUck, if a woodchuck could FOOBAR wOod?";
    context.setMatchCase(true);
    context.setWholeWord(true);
    context.setRegularExpression(false);
    textArea.setCaretPosition(offs);
    found = replaceImpl(context);
    assertTrue(found);
    found = replaceImpl(context);
    assertFalse(found);
    assertEquals(expected, textArea.getText());

    // Search for ".huck", regex, ignoring case
    context.setSearchFor(".huck");
    textArea.setText(text);
    expected = textArea.getText().replaceAll("(?i:" + context.getSearchFor() ")", context.getReplaceWith());
    context.setMatchCase(false);
    context.setWholeWord(false);
    context.setRegularExpression(true);
    textArea.setCaretPosition(offs);
    found = replaceImpl(context);
    assertTrue(found);
    found = replaceImpl(context);
    assertTrue(found);
    found = replaceImpl(context);
    assertTrue(found);
    found = replaceImpl(context);
    assertTrue(found);
    found = replaceImpl(context);
    assertFalse(found);
    assertEquals(expected, textArea.getText());

    // Search for ".huck", regex, matching case
    context.setSearchFor(".huck");
    textArea.setText(text);
    expected = textArea.getText().replaceAll(context.getSearchFor(), context.getReplaceWith());
    context.setMatchCase(true);
    context.setWholeWord(false);
    context.setRegularExpression(true);
    textArea.setCaretPosition(offs);
    found = replaceImpl(context);
    assertTrue(found);
    found = replaceImpl(context);
    assertTrue(found);
    found = replaceImpl(context);
    assertTrue(found);
    found = replaceImpl(context);
    assertFalse(found);
    assertEquals(expected, textArea.getText());

    // Search for "[cd]huck", regex, ignoring case, whole word
    context.setSearchFor("[cd]huck");
    textArea.setText(text);
    expected = "How much wood wOuld a woodChuck FOOBAR, if a woodchuck could FOOBAR wOod?";
    context.setMatchCase(false);
    context.setWholeWord(true);
    context.setRegularExpression(true);
    textArea.setCaretPosition(offs);
    found = replaceImpl(context);
    assertTrue(found);
    found = replaceImpl(context);
    assertTrue(found);
    found = replaceImpl(context);
    assertFalse(found);
    assertEquals(expected, textArea.getText());

    // Search for "[cd]hUck", regex, matching case, whole word
    context.setSearchFor("[cd]hUck");
    textArea.setText(text);
    expected = "How much wood wOuld a woodChuck FOOBAR, if a woodchuck could chuck wOod?";
    context.setMatchCase(true);
    context.setWholeWord(false);
    context.setRegularExpression(true);
    textArea.setCaretPosition(offs);
    found = replaceImpl(context);
    assertTrue(found);
    found = replaceImpl(context);
    assertFalse(found);
    assertEquals(expected, textArea.getText());

  }


  /**
   * Tests <code>SearchEngine.replace()</code> when searching backward.
   */
  @Test
  public void testSearchEngineReplaceBackward() throws BadLocationException {
    testSearchEngineReplace(false);
  }


  /**
   * Tests <code>SearchEngine.replace()</code> when searching forward.
   */
  @Test
  public void testSearchEngineReplaceForward() throws BadLocationException {
    testSearchEngineReplace(true);
  }


  /**
   * Tests <code>SearchEngine.replaceAll()</code>.
   */
  @Test
  public void testSearchEngineReplaceAll() throws BadLocationException {

    SearchContext context = new SearchContext();
    context.setReplaceWith("FOOBAR");

    // Replace "chuck", ignoring case.
    context.setSearchFor("chuck");
    textArea.setText(text);
    String expected = textArea.getText().replaceAll("(?i:" + context.getSearchFor() ")", context.getReplaceWith());
    int count = replaceAllImpl(context);
    assertEquals(4, count);
    assertEquals(expected, textArea.getText());

    // Replace "wood", matching case.
    context.setSearchFor("wood");
    textArea.setText(text);
    expected = textArea.getText().replaceAll(context.getSearchFor(), context.getReplaceWith());
    context.setMatchCase(true);
    context.setWholeWord(false);
    context.setRegularExpression(false);
    count = replaceAllImpl(context);
    assertEquals(3, count);
    assertEquals(expected, textArea.getText());

    // Replace "wood", ignoring case, whole word.
    context.setSearchFor("wood");
    textArea.setText(text);
    expected = "How much FOOBAR wOuld a woodChuck chUck, if a woodchuck could chuck FOOBAR?";
    context.setMatchCase(false);
    context.setWholeWord(true);
    context.setRegularExpression(false);
    count = replaceAllImpl(context);
    assertEquals(2, count);
    assertEquals(expected, textArea.getText());

    // Replace "chUck", matching case, whole word.
    context.setSearchFor("chUck");
    textArea.setText(text);
    expected = "How much wood wOuld a woodChuck FOOBAR, if a woodchuck could chuck wOod?";
    context.setMatchCase(true);
    context.setWholeWord(true);
    context.setRegularExpression(false);
    count = replaceAllImpl(context);
    assertEquals(1, count);
    assertEquals(expected, textArea.getText());

    // Replace "wo(?:o|ul)d", regex, ignoring case.
    context.setSearchFor("wo(?:o|ul)d");
    textArea.setText(text);
    expected = textArea.getText().replaceAll("(?i:" + context.getSearchFor() ")", context.getReplaceWith());
    context.setMatchCase(false);
    context.setWholeWord(false);
    context.setRegularExpression(true);
    count = replaceAllImpl(context);
    assertEquals(5, count);
    assertEquals(expected, textArea.getText());

    // Replace "wo(?:o|ul)d", regex, matching case.
    context.setSearchFor("wo(?:o|ul)d");
    textArea.setText(text);
    expected = textArea.getText().replaceAll(context.getSearchFor(), context.getReplaceWith());
    context.setMatchCase(true);
    context.setWholeWord(false);
    context.setRegularExpression(true);
    count = replaceAllImpl(context);
    assertEquals(3, count);
    assertEquals(expected, textArea.getText());

    // Replace "wo(?:o|ul)d", regex, ignoring case, whole word
    context.setSearchFor("wo(?:o|ul)d");
    textArea.setText(text);
    expected = "How much FOOBAR FOOBAR a woodChuck chUck, if a woodchuck could chuck FOOBAR?";
    context.setMatchCase(false);
    context.setWholeWord(true);
    context.setRegularExpression(true);
    count = replaceAllImpl(context);
    assertEquals(3, count);
    assertEquals(expected, textArea.getText());

    // Replace "wO(?:o|ul)d", regex, matching case, whole word
    context.setSearchFor("wO(?:o|ul)d");
    textArea.setText(text);
    expected = "How much wood FOOBAR a woodChuck chUck, if a woodchuck could chuck FOOBAR?";
    context.setMatchCase(true);
    context.setWholeWord(true);
    context.setRegularExpression(true);
    count = replaceAllImpl(context);
    assertEquals(2, count);
    assertEquals(expected, textArea.getText());

  }


  /**
   * Tests <code>SearchEngine.replaceAll()</code> when the replacement string
   * has captured groups.
   */
  @Test
  public void testSearchEngineRegexReplaceAllWithCapturedGroups() throws BadLocationException {

    SearchContext context = new SearchContext();
    context.setRegularExpression(true);

    // A single captured group.
    context.setSearchFor("r(o+)t");
    textArea.setText("root roOt root");
    String expected = "oo oO oo";
    context.setMatchCase(false);
    context.setWholeWord(false);
    context.setReplaceWith("$1");
    int count = replaceAllImpl(context);
    assertEquals(3, count);
    assertEquals(expected, textArea.getText());

    // A single captured group - caret location shouldn't matter
    context.setSearchFor("r(o+)t");
    textArea.setText("root roOt root");
    textArea.setCaretPosition(textArea.getText().length()-4);
    expected = "oo oO oo";
    context.setMatchCase(false);
    context.setWholeWord(false);
    context.setReplaceWith("$1");
    count = replaceAllImpl(context);
    assertEquals(3, count);
    assertEquals(expected, textArea.getText());

    // Multiple captured groups.
    context.setSearchFor("(\\d)(\\d+)[kM]");
    textArea.setText("152k 5271143M 3985k");
    expected = "1.52 5.271143 3.985";
    context.setMatchCase(false);
    context.setWholeWord(false);
    context.setReplaceWith("$1.$2");
    count = replaceAllImpl(context);
    assertEquals(3, count);
    assertEquals(expected, textArea.getText());

    // No matches
    context.setSearchFor("(\\d)(\\d+)ABC");
    expected = "152k 5271143M 3985k";
    textArea.setText(expected);
    textArea.setCaretPosition(8);
    context.setMatchCase(false);
    context.setWholeWord(false);
    context.setReplaceWith("$1.$2");
    count = replaceAllImpl(context);
    assertEquals(0, count);
    assertEquals(expected, textArea.getText());
    assertEquals(8, textArea.getCaretPosition()); // Caret doesn't move

  }


}
TOP

Related Classes of org.fife.ui.rtextarea.SearchEngineTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.