package org.rubypeople.rdt.internal.ui.util;
import junit.framework.TestCase;
import org.rubypeople.rdt.internal.ui.util.StringMatcher.Position;
public class StringMatcherTest extends TestCase
{
// TODO Find and match with offset and non-full length!
// TODO Find with oddball patterns like "*??*" and "*abc*" to see what positions it returns!
public void testStartAfterEnd()
{
String pattern = "Ch*r";
StringMatcher matcher = new StringMatcher(pattern, true, false);
assertNull(matcher.find("Cheerios", 3, 1));
assertFalse(matcher.match("Cheerios", 3, 1));
}
public void testNullPattern()
{
try
{
new StringMatcher(null, true, false);
fail("Expected IllegalArgumentException");
}
catch (IllegalArgumentException e)
{
assertTrue(true);
}
}
public void testFindWithNullText()
{
StringMatcher matcher = new StringMatcher("*", true, false);
try
{
matcher.find(null, 0, 0);
fail("Expected IllegalArgumentException");
}
catch (IllegalArgumentException e)
{
assertTrue(true);
}
}
public void testMatchWithNullText()
{
StringMatcher matcher = new StringMatcher("*", true, false);
try
{
matcher.match(null);
fail("Expected IllegalArgumentException");
}
catch (IllegalArgumentException e)
{
assertTrue(true);
}
}
public void testMatchWithStartAndEndWithNullText()
{
StringMatcher matcher = new StringMatcher("*", true, false);
try
{
matcher.match(null, 0, 0);
fail("Expected IllegalArgumentException");
}
catch (IllegalArgumentException e)
{
assertTrue(true);
}
}
public void testFindWithEmptyTextString()
{
String pattern = "Ch*r";
StringMatcher matcher = new StringMatcher(pattern, true, false);
assertNull(matcher.find("", 0, "".length()));
pattern = "*";
matcher = new StringMatcher(pattern, true, false);
assertNull(matcher.find("", 0, "".length()));
pattern = "?";
matcher = new StringMatcher(pattern, true, false);
assertNull(matcher.find("", 0, "".length()));
}
public void testFindWithEmptyPattern()
{
String pattern = "";
StringMatcher matcher = new StringMatcher(pattern, false, false);
String text = "cheerios";
// empty string pattern is supposed to return 0's
Position pos = matcher.find(text, 0, text.length());
assertNotNull(pos);
assertEquals(0, pos.getStart());
assertEquals(0, pos.getEnd());
}
public void testFindIgnoringCase()
{
String pattern = "Ch*r";
StringMatcher matcher = new StringMatcher(pattern, true, false);
String text = "cheerios";
Position pos = matcher.find(text, 0, text.length());
assertNotNull(pos);
assertEquals(0, pos.getStart());
assertEquals(5, pos.getEnd());
}
public void testMatchIgnoringCase()
{
String pattern = "Ch*ios";
StringMatcher matcher = new StringMatcher(pattern, true, false);
assertTrue(matcher.match("cheerios"));
assertTrue(matcher.match("Cheerios"));
assertFalse(matcher.match("cheeris"));
}
public void testMatchNotIgnoringCase()
{
String pattern = "Ch*ios";
StringMatcher matcher = new StringMatcher(pattern, false, false);
assertFalse(matcher.match("cheerios"));
assertTrue(matcher.match("Cheerios"));
assertFalse(matcher.match("cheeris"));
}
public void testFindNotIgnoringCase()
{
String pattern = "Ch*r";
StringMatcher matcher = new StringMatcher(pattern, false, false);
// Finds when case matches
String text = "Cheerios";
Position pos = matcher.find(text, 0, text.length());
assertNotNull(pos);
assertEquals(0, pos.getStart());
assertEquals(5, pos.getEnd());
// doesn't when C case is different
text = "cheerios";
pos = matcher.find(text, 0, text.length());
assertNull(pos);
}
public void testFindStarInPatternIgnoringWildcards()
{
String pattern = "Ch*r";
StringMatcher matcher = new StringMatcher(pattern, false, true);
String text = "Cheerios";
Position pos = matcher.find(text, 0, text.length());
assertNull(pos);
text = "Ch*ris";
pos = matcher.find(text, 0, text.length());
assertEquals(0, pos.getStart());
assertEquals(4, pos.getEnd());
}
public void testFindQuestionMarkInPatternIgnoringWildcards()
{
String pattern = "Ch?r";
StringMatcher matcher = new StringMatcher(pattern, false, true);
String text = "Cher";
Position pos = matcher.find(text, 0, text.length());
assertNull(pos);
text = "Ch?r";
pos = matcher.find(text, 0, text.length());
assertEquals(0, pos.getStart());
assertEquals(4, pos.getEnd());
}
public void testFindWithSingleCharWildcard()
{
String pattern = "Chr?s";
StringMatcher matcher = new StringMatcher(pattern, false, false);
String text = "Chris";
Position pos = matcher.find(text, 0, text.length());
assertNotNull(pos);
assertEquals(0, pos.getStart());
assertEquals(5, pos.getEnd());
text = "Chrs";
pos = matcher.find(text, 0, text.length());
assertNull(pos);
}
public void testFindWithStarWildcard()
{
String pattern = "Ch*r";
StringMatcher matcher = new StringMatcher(pattern, false, false);
// finds when * == multiple chars
String text = "Cheerios";
Position pos = matcher.find(text, 0, text.length());
assertNotNull(pos);
assertEquals(0, pos.getStart());
assertEquals(5, pos.getEnd());
// finds when there's no chars picked up by *
text = "Chris";
pos = matcher.find(text, 0, text.length());
assertNotNull(pos);
assertEquals(0, pos.getStart());
assertEquals(3, pos.getEnd());
}
public void testFindWithOpenEndedWildcardAtEnd()
{
String pattern = "Ch*";
StringMatcher matcher = new StringMatcher(pattern, false, false);
String text = "Cheerios";
Position pos = matcher.find(text, 0, text.length());
assertNotNull(pos);
assertEquals(0, pos.getStart());
assertEquals(2, pos.getEnd()); // only matches the concrete chars in pattern
}
}