You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2012/07/25 02:58:06 UTC
svn commit: r1365375 - in
/lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis:
core/TestAllAnalyzersHaveFactories.java core/TestRandomChains.java
util/TestAnalysisSPILoader.java
Author: rmuir
Date: Wed Jul 25 00:58:05 2012
New Revision: 1365375
URL: http://svn.apache.org/viewvc?rev=1365375&view=rev
Log:
LUCENE-2510: add tests
Added:
lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/core/TestAllAnalyzersHaveFactories.java (with props)
lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/util/TestAnalysisSPILoader.java (with props)
Modified:
lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/core/TestRandomChains.java
Added: lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/core/TestAllAnalyzersHaveFactories.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/core/TestAllAnalyzersHaveFactories.java?rev=1365375&view=auto
==============================================================================
--- lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/core/TestAllAnalyzersHaveFactories.java (added)
+++ lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/core/TestAllAnalyzersHaveFactories.java Wed Jul 25 00:58:05 2012
@@ -0,0 +1,128 @@
+package org.apache.lucene.analysis.core;
+
+/*
+ * 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.
+ */
+
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.lucene.analysis.CachingTokenFilter;
+import org.apache.lucene.analysis.CharFilter;
+import org.apache.lucene.analysis.EmptyTokenizer;
+import org.apache.lucene.analysis.MockCharFilter;
+import org.apache.lucene.analysis.MockFixedLengthPayloadFilter;
+import org.apache.lucene.analysis.MockGraphTokenFilter;
+import org.apache.lucene.analysis.MockHoleInjectingTokenFilter;
+import org.apache.lucene.analysis.MockRandomLookaheadTokenFilter;
+import org.apache.lucene.analysis.MockTokenFilter;
+import org.apache.lucene.analysis.MockTokenizer;
+import org.apache.lucene.analysis.MockVariableLengthPayloadFilter;
+import org.apache.lucene.analysis.TokenFilter;
+import org.apache.lucene.analysis.Tokenizer;
+import org.apache.lucene.analysis.ValidatingTokenFilter;
+import org.apache.lucene.analysis.core.TestRandomChains;
+import org.apache.lucene.analysis.path.ReversePathHierarchyTokenizer;
+import org.apache.lucene.analysis.sinks.TeeSinkTokenFilter;
+import org.apache.lucene.analysis.snowball.SnowballFilter;
+import org.apache.lucene.analysis.util.CharFilterFactory;
+import org.apache.lucene.analysis.util.TokenFilterFactory;
+import org.apache.lucene.analysis.util.TokenizerFactory;
+import org.apache.lucene.util.LuceneTestCase;
+
+/**
+ * Tests that any newly added Tokenizers/TokenFilters/CharFilters have a
+ * corresponding factory.
+ */
+public class TestAllAnalyzersHaveFactories extends LuceneTestCase {
+
+ // these are test-only components (e.g. test-framework)
+ private static final Set<Class<?>> testComponents = Collections.newSetFromMap(new IdentityHashMap<Class<?>,Boolean>());
+ static {
+ Collections.<Class<?>>addAll(testComponents,
+ MockTokenizer.class,
+ MockCharFilter.class,
+ MockFixedLengthPayloadFilter.class,
+ MockGraphTokenFilter.class,
+ MockHoleInjectingTokenFilter.class,
+ MockRandomLookaheadTokenFilter.class,
+ MockTokenFilter.class,
+ MockVariableLengthPayloadFilter.class,
+ EmptyTokenizer.class,
+ ValidatingTokenFilter.class
+ );
+ }
+
+ // these are 'crazy' components like cachingtokenfilter. does it make sense to add factories for these?
+ private static final Set<Class<?>> crazyComponents = Collections.newSetFromMap(new IdentityHashMap<Class<?>,Boolean>());
+ static {
+ Collections.<Class<?>>addAll(crazyComponents,
+ CachingTokenFilter.class,
+ TeeSinkTokenFilter.class
+ );
+ }
+
+ // these are oddly-named (either the actual analyzer, or its factory)
+ // they do actually have factories.
+ // TODO: clean this up!
+ private static final Set<Class<?>> oddlyNamedComponents = Collections.newSetFromMap(new IdentityHashMap<Class<?>,Boolean>());
+ static {
+ Collections.<Class<?>>addAll(oddlyNamedComponents,
+ ReversePathHierarchyTokenizer.class, // this is supported via an option to PathHierarchyTokenizer's factory
+ SnowballFilter.class // this is called SnowballPorterFilterFactory
+ );
+ }
+
+ public void test() throws Exception {
+ List<Class<?>> analysisClasses = new ArrayList<Class<?>>();
+ TestRandomChains.getClassesForPackage("org.apache.lucene.analysis", analysisClasses);
+
+ for (final Class<?> c : analysisClasses) {
+ final int modifiers = c.getModifiers();
+ if (
+ // don't waste time with abstract classes or deprecated known-buggy ones
+ Modifier.isAbstract(modifiers) || !Modifier.isPublic(modifiers)
+ || c.isSynthetic() || c.isAnonymousClass() || c.isMemberClass() || c.isInterface()
+ || testComponents.contains(c)
+ || crazyComponents.contains(c)
+ || oddlyNamedComponents.contains(c)
+ || c.isAnnotationPresent(Deprecated.class)
+ || !(Tokenizer.class.isAssignableFrom(c) || TokenFilter.class.isAssignableFrom(c) || CharFilter.class.isAssignableFrom(c))
+ ) {
+ continue;
+ }
+
+ if (Tokenizer.class.isAssignableFrom(c)) {
+ String clazzName = c.getSimpleName();
+ assertTrue(clazzName.endsWith("Tokenizer"));
+ assertNotNull(TokenizerFactory.forName(clazzName.substring(0, clazzName.length() - 9)));
+ } else if (TokenFilter.class.isAssignableFrom(c)) {
+ String clazzName = c.getSimpleName();
+ assertTrue(clazzName.endsWith("Filter"));
+ String simpleName = clazzName.substring(0, clazzName.length() - (clazzName.endsWith("TokenFilter") ? 11 : 6));
+ assertNotNull(TokenFilterFactory.forName(simpleName));
+ } else if (CharFilter.class.isAssignableFrom(c)) {
+ String clazzName = c.getSimpleName();
+ assertTrue(clazzName.endsWith("CharFilter"));
+ assertNotNull(CharFilterFactory.forName(clazzName.substring(0, clazzName.length() - 10)));
+ }
+ }
+ }
+}
Modified: lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/core/TestRandomChains.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/core/TestRandomChains.java?rev=1365375&r1=1365374&r2=1365375&view=diff
==============================================================================
--- lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/core/TestRandomChains.java (original)
+++ lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/core/TestRandomChains.java Wed Jul 25 00:58:05 2012
@@ -235,7 +235,7 @@ public class TestRandomChains extends Ba
private static <T> Constructor<T> castConstructor(Class<T> instanceClazz, Constructor<?> ctor) {
return (Constructor<T>) ctor;
}
- private static void getClassesForPackage(String pckgname, List<Class<?>> classes) throws Exception {
+ static void getClassesForPackage(String pckgname, List<Class<?>> classes) throws Exception {
final ClassLoader cld = TestRandomChains.class.getClassLoader();
final String path = pckgname.replace('.', '/');
final Enumeration<URL> resources = cld.getResources(path);
Added: lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/util/TestAnalysisSPILoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/util/TestAnalysisSPILoader.java?rev=1365375&view=auto
==============================================================================
--- lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/util/TestAnalysisSPILoader.java (added)
+++ lucene/dev/branches/lucene2510/lucene/analysis/common/src/test/org/apache/lucene/analysis/util/TestAnalysisSPILoader.java Wed Jul 25 00:58:05 2012
@@ -0,0 +1,84 @@
+package org.apache.lucene.analysis.util;
+
+/*
+ * 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.
+ */
+
+import org.apache.lucene.analysis.charfilter.HTMLStripCharFilterFactory;
+import org.apache.lucene.analysis.core.LowerCaseFilterFactory;
+import org.apache.lucene.analysis.core.WhitespaceTokenizerFactory;
+import org.apache.lucene.analysis.miscellaneous.RemoveDuplicatesTokenFilterFactory;
+import org.apache.lucene.util.LuceneTestCase;
+
+public class TestAnalysisSPILoader extends LuceneTestCase {
+
+ public void testLookupTokenizer() {
+ assertEquals(WhitespaceTokenizerFactory.class, TokenizerFactory.forName("Whitespace").getClass());
+ assertEquals(WhitespaceTokenizerFactory.class, TokenizerFactory.forName("WHITESPACE").getClass());
+ assertEquals(WhitespaceTokenizerFactory.class, TokenizerFactory.forName("whitespace").getClass());
+ }
+
+ public void testLookupTokenizerClass() {
+ assertEquals(WhitespaceTokenizerFactory.class, TokenizerFactory.lookupClass("Whitespace"));
+ assertEquals(WhitespaceTokenizerFactory.class, TokenizerFactory.lookupClass("WHITESPACE"));
+ assertEquals(WhitespaceTokenizerFactory.class, TokenizerFactory.lookupClass("whitespace"));
+ }
+
+ public void testAvailableTokenizers() {
+ assertTrue(TokenizerFactory.availableTokenizers().contains("whitespace"));
+ }
+
+ public void testLookupTokenFilter() {
+ assertEquals(LowerCaseFilterFactory.class, TokenFilterFactory.forName("Lowercase").getClass());
+ assertEquals(LowerCaseFilterFactory.class, TokenFilterFactory.forName("LOWERCASE").getClass());
+ assertEquals(LowerCaseFilterFactory.class, TokenFilterFactory.forName("lowercase").getClass());
+
+ assertEquals(RemoveDuplicatesTokenFilterFactory.class, TokenFilterFactory.forName("RemoveDuplicates").getClass());
+ assertEquals(RemoveDuplicatesTokenFilterFactory.class, TokenFilterFactory.forName("REMOVEDUPLICATES").getClass());
+ assertEquals(RemoveDuplicatesTokenFilterFactory.class, TokenFilterFactory.forName("removeduplicates").getClass());
+ }
+
+ public void testLookupTokenFilterClass() {
+ assertEquals(LowerCaseFilterFactory.class, TokenFilterFactory.lookupClass("Lowercase"));
+ assertEquals(LowerCaseFilterFactory.class, TokenFilterFactory.lookupClass("LOWERCASE"));
+ assertEquals(LowerCaseFilterFactory.class, TokenFilterFactory.lookupClass("lowercase"));
+
+ assertEquals(RemoveDuplicatesTokenFilterFactory.class, TokenFilterFactory.lookupClass("RemoveDuplicates"));
+ assertEquals(RemoveDuplicatesTokenFilterFactory.class, TokenFilterFactory.lookupClass("REMOVEDUPLICATES"));
+ assertEquals(RemoveDuplicatesTokenFilterFactory.class, TokenFilterFactory.lookupClass("removeduplicates"));
+ }
+
+ public void testAvailableTokenFilters() {
+ assertTrue(TokenFilterFactory.availableTokenFilters().contains("lowercase"));
+ assertTrue(TokenFilterFactory.availableTokenFilters().contains("removeduplicates"));
+ }
+
+ public void testLookupCharFilter() {
+ assertEquals(HTMLStripCharFilterFactory.class, CharFilterFactory.forName("HTMLStrip").getClass());
+ assertEquals(HTMLStripCharFilterFactory.class, CharFilterFactory.forName("HTMLSTRIP").getClass());
+ assertEquals(HTMLStripCharFilterFactory.class, CharFilterFactory.forName("htmlstrip").getClass());
+ }
+
+ public void testLookupCharFilterClass() {
+ assertEquals(HTMLStripCharFilterFactory.class, CharFilterFactory.lookupClass("HTMLStrip"));
+ assertEquals(HTMLStripCharFilterFactory.class, CharFilterFactory.lookupClass("HTMLSTRIP"));
+ assertEquals(HTMLStripCharFilterFactory.class, CharFilterFactory.lookupClass("htmlstrip"));
+ }
+
+ public void testAvailableCharFilters() {
+ assertTrue(CharFilterFactory.availableCharFilters().contains("htmlstrip"));
+ }
+}