/******************************************************************************* * Copyright (c) 2011 Tomasz Wesolowski and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Tomasz Wesolowski - initial API and implementation * Jens Elmenthaler - further tweaking *******************************************************************************/ package org.eclipse.cdt.core.parser.tests; import junit.framework.TestCase; import org.eclipse.cdt.core.parser.util.SegmentMatcher; public class SegmentMatcherTest extends TestCase { public void testSimple() { assertTrue(matchSegments("", "fooBarBaz")); assertTrue(matchSegments("fBB", "fooBarBaz")); assertTrue(matchSegments("fooBB", "fooBarBaz")); assertTrue(matchSegments("foBaBaz", "fooBarBaz")); assertTrue(matchSegments("fBBaz", "fooBarBaz")); assertTrue(matchSegments("fooBarBaz", "fooBarBaz")); assertTrue(matchSegments("foo", "fooBarBaz")); assertTrue(matchSegments("fooB", "fooBarBaz")); assertTrue(matchSegments("fBBaz", "fooBarBaz")); assertTrue(matchSegments("fooB", "fooBarBaz")); assertTrue(matchSegments("fBBaz", "fooBarBaz")); // Improvement compared to JDT: an all upper case abbreviation should // also match as a single segment. assertTrue(matchSegments("fBBaz", "fooBARBaz")); // Improvement compared to JDT: you don't need to specify all segments // in between. assertTrue(matchSegments("fBaz", "fooBARBaz")); assertFalse(matchSegments("FooBarBaz", "fooBarBaz")); assertFalse(matchSegments("fooBARBaz", "fooBarBaz")); assertTrue(matchSegments("fooBarbaz", "fooBarBaz")); assertFalse(matchSegments("barBaz", "fooBarBaz")); assertFalse(matchSegments("BarBaz", "fooBarBaz")); assertTrue(matchSegments("fBaz", "fooBarBaz")); assertFalse(matchSegments("fBaBar", "fooBarBaz")); assertFalse(matchSegments("fBBB", "fooBarBaz")); assertFalse(matchSegments("fBBBarBaz", "fooBarBaz")); assertFalse(matchSegments("foooBarBaz", "fooBarBaz")); assertFalse(matchSegments("foBrBaz", "fooBarBaz")); } public void testSuffix() { assertTrue(matchSegments("fooBar", "fooBar123")); assertTrue(matchSegments("fooBar", "fooBarrr")); assertTrue(matchSegments("fooBar", "fooBarr__")); } public void testNumeric() { assertTrue(matchSegments("fBBaz", "foo29BarBaz")); assertTrue(matchSegments("fBBaz", "fooBar100Baz10")); assertTrue(matchSegments("fB100Baz1", "fooBar100Baz10")); assertTrue(matchSegments("fB100Baz10", "fooBar100Baz10")); assertTrue(matchSegments("fooBar100Baz10", "fooBar100Baz10")); assertFalse(matchSegments("fBar100Ba", "fooBarBaz")); assertTrue(matchSegments("f100Baz", "fooBar100Baz10")); assertFalse(matchSegments("fB1000Baz", "fooBar100Baz")); assertFalse(matchSegments("sV", "seed48")); } public void testSeparator() { assertTrue(matchSegments("fBB", "foo_Bar_Baz")); assertTrue(matchSegments("fBB", "foo_BarBaz")); assertTrue(matchSegments("fBB", "foo_bar_baz")); // Improvement compared to JDT: assertTrue(matchSegments("FBB", "FOO_BAR_BAZ")); assertTrue(matchSegments("fBB", "foo__barBaz")); assertTrue(matchSegments("fBB", "foo__bar__baz")); assertTrue(matchSegments("fB_B", "foo__bar__Baz")); assertTrue(matchSegments("f__b", "foo__bar")); assertFalse(matchSegments("fB_B", "foo__bar__baz")); assertFalse(matchSegments("f___b", "foo__bar")); assertFalse(matchSegments("f__bb", "foo__bar__baz")); assertFalse(matchSegments("f_B_B", "fooBarBaz")); assertFalse(matchSegments("f_B", "foo_bar")); assertFalse(matchSegments("foo_B", "foo_bar")); assertFalse(matchSegments("foo_Bar", "foo_bar")); assertFalse(matchSegments("fO_bar", "foo_bar")); assertFalse(matchSegments("f__b", "foo_bar")); } public void testPrefixChars() { assertFalse(matchSegments("$asd","_asd")); assertFalse(matchSegments("_$$","__")); assertFalse(matchSegments("__$","__")); // require everything to be exactly the same from start up until the first section assertTrue(matchSegments("__f", "__fooBar")); assertTrue(matchSegments("__fooB", "__fooBar")); assertFalse(matchSegments("_fooB", "__fooBar")); assertFalse(matchSegments("_FooB", "__fooBar")); assertFalse(matchSegments("_$fooB", "__fooBar")); assertTrue(matchSegments("___", "___")); assertFalse(matchSegments("$__", "___")); assertFalse(matchSegments("__$", "___")); assertTrue(matchSegments("__", "___")); assertFalse(matchSegments("____", "___")); } public void testAbbreviations() { assertTrue(matchSegments("IFB", "IFooBar")); assertTrue(matchSegments("IFoB", "IFooBar")); assertTrue(matchSegments("XYZ", "XYZFooBar")); } public void testSingleSegment() { assertTrue(matchSegments("foo", "fooBar")); assertFalse(matchSegments("bar", "fooBar")); } public void testGetPrefixForBinarySearch() { // Segments can be skipped, because of that the first letter as well // as the leading separator must not be added to the binary search prefix. assertEquals("foo", getPrefixForBinarySearch("fooBar")); assertEquals("foo", getPrefixForBinarySearch("foo6")); assertEquals("foo", getPrefixForBinarySearch("foo_")); assertEquals("foo", getPrefixForBinarySearch("foo$")); assertEquals("___", getPrefixForBinarySearch("___")); assertEquals("___foo", getPrefixForBinarySearch("___fooBar")); assertEquals("___foo", getPrefixForBinarySearch("___foo3")); assertEquals("___foo", getPrefixForBinarySearch("___foo_")); assertEquals("___foo", getPrefixForBinarySearch("___foo$")); assertEquals("$__", getPrefixForBinarySearch("$__")); assertEquals("$__foo", getPrefixForBinarySearch("$__fooBar")); assertEquals("$__foo", getPrefixForBinarySearch("$__foo3")); assertEquals("$__foo", getPrefixForBinarySearch("$__foo_")); } /** * Only checks segment matching (i.e. without case-insensitive prefix matching) */ private boolean matchSegments(String pattern, String name) { SegmentMatcher matcher = new SegmentMatcher(pattern.toCharArray()); return matcher.matchSegments(name.toCharArray()); } private String getPrefixForBinarySearch(String pattern) { SegmentMatcher matcher = new SegmentMatcher(pattern.toCharArray()); return String.valueOf(matcher.getPrefixForBinarySearch()); } }