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"));
+  }
+}