X-Git-Url: https://git.mdrn.pl/pylucene.git/blobdiff_plain/a2e61f0c04805cfcb8706176758d1283c7e3a55c..aaeed5504b982cf3545252ab528713250aa33eed:/lucene-java-3.4.0/lucene/contrib/facet/src/test/org/apache/lucene/facet/taxonomy/TestCategoryPath.java diff --git a/lucene-java-3.4.0/lucene/contrib/facet/src/test/org/apache/lucene/facet/taxonomy/TestCategoryPath.java b/lucene-java-3.4.0/lucene/contrib/facet/src/test/org/apache/lucene/facet/taxonomy/TestCategoryPath.java deleted file mode 100644 index 784c07c..0000000 --- a/lucene-java-3.4.0/lucene/contrib/facet/src/test/org/apache/lucene/facet/taxonomy/TestCategoryPath.java +++ /dev/null @@ -1,901 +0,0 @@ -package org.apache.lucene.facet.taxonomy; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; - -import org.junit.Test; - -import org.apache.lucene.util.LuceneTestCase; -import org.apache.lucene.facet.taxonomy.CategoryPath; - -/** - * 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. - */ - -public class TestCategoryPath extends LuceneTestCase { - - @Test - public void testBasic() { - CategoryPath p = new CategoryPath(0,0); - assertEquals(0, p.length()); - for (int i=0; i<1000; i++) { - p.add("hello"); - assertEquals(i+1, p.length()); - } - } - - @Test - public void testConstructorCapacity() { - CategoryPath p = new CategoryPath(0,0); - assertEquals(0, p.capacityChars()); - assertEquals(0, p.capacityComponents()); - assertEquals(0, p.length()); - p = new CategoryPath(5,18); - assertEquals(5, p.capacityChars()); - assertEquals(18, p.capacityComponents()); - assertEquals(0, p.length()); - p = new CategoryPath(27,13); - assertEquals(27, p.capacityChars()); - assertEquals(13, p.capacityComponents()); - assertEquals(0, p.length()); - } - - @Test - public void testClear() { - CategoryPath p = new CategoryPath(0,0); - p.add("hi"); - p.add("there"); - assertEquals(2, p.length()); - p.clear(); - assertEquals(0, p.length()); - p.add("yo!"); - assertEquals(1, p.length()); - } - - @Test - public void testTrim() { - CategoryPath p = new CategoryPath(0,0); - p.add("this"); - p.add("message"); - p.add("will"); - p.add("self"); - p.add("destruct"); - p.add("in"); - p.add("five"); - p.add("seconds"); - assertEquals(8, p.length()); - p.trim(3); - assertEquals(5, p.length()); - p.trim(0); // no-op - assertEquals(5, p.length()); - p.trim(-3); // no-op - assertEquals(5, p.length()); - p.trim(1); - assertEquals(4, p.length()); - p.trim(8); // clear - assertEquals(0, p.length()); - p.add("yo!"); - assertEquals(1, p.length()); - p.trim(1); // clear - assertEquals(0, p.length()); - } - - @Test - public void testComponentsLimit() { - // Test that we can add up to 2^15-1 components - CategoryPath p = new CategoryPath(0,0); - for (int i=0; i<32767; i++) { - p.add(""); - assertEquals(i+1, p.length()); - } - // Also see that in the current implementation, this is actually - // the limit: if we add one more component, things break (because - // we used a short to hold ncomponents). See that it breaks in the - // way we expect it to: - p.add(""); // this still works, but... - assertEquals(-32768, p.length()); // now the length is wrong and negative - } - - @Test - public void testCharsLimit() { - // Test that we can add up to 2^15-1 characters - CategoryPath p = new CategoryPath(0,0); - for (int i=0; i<8192; i++) { - p.add("aaaa"); - } - // Also see that in the current implementation, this is actually the - // limit: If we add one more character, things break (because ends[] - // is an array of shorts), and we actually get an exception. - try { - p.add("a"); - fail("Should have thrown an exception"); - } catch (ArrayIndexOutOfBoundsException e) { - // good. - } - } - - @Test - public void testToString() { - CategoryPath p = new CategoryPath(0,0); - // When the category is empty, we expect an empty string - assertEquals("", p.toString('/')); - // This is (deliberately, in our implementation) indistinguishable - // from the case of a single empty component: - p.add(""); - assertEquals("", p.toString('/')); - // Check just one category (so no delimiter needed): - p.clear(); - p.add("hello"); - assertEquals("hello", p.toString('/')); - // Now for two categories: - p.clear(); - p.add("hello"); - p.add("world"); - assertEquals("hello/world", p.toString('/')); - // And for a thousand... - p.clear(); - p.add("0"); - StringBuilder expected = new StringBuilder("0"); - for (int i=1; i<1000; i++) { - String num = Integer.toString(i); - p.add(num); - expected.append('/'); - expected.append(num); - } - assertEquals(expected.toString(), p.toString('/')); - // Check that toString() without a parameter just defaults to '/': - assertEquals(expected.toString(), p.toString()); - } - - // testing toString() and its variants already test most of the appendTo() - // code, but not all of it (the "eclemma" code-coverage tool discovered - // this for us). Here we complete the coverage of the appendTo() methods: - @Test - public void testAppendTo() throws IOException { - CategoryPath p = new CategoryPath(0,0); - StringBuilder sb = new StringBuilder(); - p.appendTo(sb, '/'); - assertEquals(0, sb.length()); - p.appendTo(sb, '/', -1); - assertEquals(0, sb.length()); - p.appendTo(sb, '/', 1); - assertEquals(0, sb.length()); - p.appendTo(sb, '/', -1, 1); - assertEquals(0, sb.length()); - } - - @Test - public void testLastComponent() { - CategoryPath p = new CategoryPath(1000,1000); - // When the category is empty, we expect a null - assertNull(p.lastComponent()); - for (int i=0; i<=100; i++) { - String num = Integer.toString(i); - p.add(num); - assertEquals(num, p.lastComponent()); - } - } - - @Test - public void testGetComponent() { - CategoryPath p = new CategoryPath(1000,1000); - // When the category is empty, we expect a null - assertNull(p.getComponent(0)); - assertNull(p.getComponent(1)); - assertNull(p.getComponent(-1)); - for (int i=0; i<=100; i++) { - p.add(Integer.toString(i)); - for (int j=0; j<=i; j++) { - assertEquals(j, Integer.parseInt(p.getComponent(j))); - } - assertNull(p.getComponent(-1)); - assertNull(p.getComponent(i+1)); - } - } - - @Test - public void testToStringPrefix() { - CategoryPath p = new CategoryPath(0,0); - p.add("hi"); - p.add("there"); - p.add("man"); - assertEquals("hi/there/man", p.toString('/')); - assertEquals("", p.toString('/', 0)); - assertEquals("hi", p.toString('/', 1)); - assertEquals("hi/there", p.toString('/', 2)); - assertEquals("hi/there/man", p.toString('/', 3)); - assertEquals("hi/there/man", p.toString('/', 4)); - assertEquals("hi/there/man", p.toString('/', -1)); - } - - @Test - public void testToStringSubpath() { - CategoryPath p = new CategoryPath(0,0); - assertEquals("", p.toString('/', 0, 0)); - p.add("hi"); - p.add("there"); - p.add("man"); - assertEquals("", p.toString('/', 0, 0)); - assertEquals("hi", p.toString('/', 0, 1)); - assertEquals("hi/there", p.toString('/', 0, 2)); - assertEquals("hi/there/man", p.toString('/', 0, 3)); - assertEquals("hi/there/man", p.toString('/', 0, 4)); - assertEquals("hi/there/man", p.toString('/', 0, -1)); - assertEquals("hi/there/man", p.toString('/', -1, -1)); - assertEquals("there/man", p.toString('/', 1, -1)); - assertEquals("man", p.toString('/', 2, -1)); - assertEquals("", p.toString('/', 3, -1)); - assertEquals("there/man", p.toString('/', 1, 3)); - assertEquals("there", p.toString('/', 1, 2)); - assertEquals("", p.toString('/', 1, 1)); - } - - @Test - public void testDelimiterConstructor() { - // Test that the constructor that takes a string and a delimiter - // works correctly. Also check that it allocates exactly the needed - // needed size for the array - not more. - CategoryPath p = new CategoryPath("", '/'); - assertEquals(p.length(), 0); - assertEquals(p.capacityChars(), 0); - assertEquals(p.capacityComponents(), 0); - p = new CategoryPath("hello", '/'); - assertEquals(p.length(), 1); - assertEquals(p.capacityChars(), 5); - assertEquals(p.capacityComponents(), 1); - assertEquals(p.toString('@'), "hello"); - p = new CategoryPath("hi/there", '/'); - assertEquals(p.length(), 2); - assertEquals(p.capacityChars(), 7); - assertEquals(p.capacityComponents(), 2); - assertEquals(p.toString('@'), "hi@there"); - p = new CategoryPath("how/are/you/doing?", '/'); - assertEquals(p.length(), 4); - assertEquals(p.capacityChars(), 15); - assertEquals(p.capacityComponents(), 4); - assertEquals(p.toString('@'), "how@are@you@doing?"); - } - - @Test - public void testDefaultConstructor() { - // test that the default constructor (no parameters) currently - // defaults to creating an object with a 0 initial capacity. - // If we change this default later, we also need to change this - // test. - CategoryPath p = new CategoryPath(); - assertEquals(0, p.capacityChars()); - assertEquals(0, p.capacityComponents()); - assertEquals(0, p.length()); - assertEquals("", p.toString('/')); - } - - @Test - public void testAddEmpty() { - // In the current implementation, p.add("") should add en empty - // component (which is, admitingly, not a useful case. On the other - // hand, p.add("", delimiter) should add no components at all. - // Verify this: - CategoryPath p = new CategoryPath(0, 0); - p.add(""); - assertEquals(1, p.length()); - p.add(""); - assertEquals(2, p.length()); - p.add("", '/'); - assertEquals(2, p.length()); - p.clear(); - p.add("", '/'); - assertEquals(0, p.length()); - } - - @Test - public void testDelimiterAdd() { - // Test that the add() that takes a string and a delimiter - // works correctly. Note that unlike the constructor test above, - // we can't expect the capacity to grow to exactly the length of - // the given category, so we do not test this. - CategoryPath p = new CategoryPath(0, 0); - p.add("", '/'); - assertEquals(0, p.length()); - assertEquals("", p.toString('@'), ""); - p.clear(); - p.add("hello", '/'); - assertEquals(p.length(), 1); - assertEquals(p.toString('@'), "hello"); - p.clear(); - p.add("hi/there", '/'); - assertEquals(p.length(), 2); - assertEquals(p.toString('@'), "hi@there"); - p.clear(); - p.add("how/are/you/doing?", '/'); - assertEquals(p.length(), 4); - assertEquals(p.toString('@'), "how@are@you@doing?"); - // See that this is really an add, not replace: - p.clear(); - p.add("hi/there", '/'); - assertEquals(p.length(), 2); - assertEquals(p.toString('@'), "hi@there"); - p.add("how/are/you/doing", '/'); - assertEquals(p.length(), 6); - assertEquals(p.toString('@'), "hi@there@how@are@you@doing"); - } - - @Test - public void testCopyConstructor() { - CategoryPath p = new CategoryPath(0,0); - int expectedchars=0; - for (int i=0; i<1000; i++) { - CategoryPath clone = new CategoryPath(p); - assertEquals(p.length(), clone.length()); - assertEquals(p.toString('/'), clone.toString('/')); - // verify that the newly created clone has exactly the right - // capacity, with no spare (while the original path p probably - // does have spare) - assertEquals(i, clone.capacityComponents()); - assertEquals(expectedchars, clone.capacityChars()); - // Finally, add another component to the path, for the next - // round of this loop - String num = Integer.toString(i); - p.add(num); - expectedchars+=num.length(); - } - } - - @Test - public void testPrefixCopyConstructor() { - CategoryPath p = new CategoryPath(0,0); - p.add("hi"); - p.add("there"); - p.add("man"); - assertEquals(p.length(), 3); - - CategoryPath p1 = new CategoryPath(p,2); - assertEquals(2, p1.length()); - assertEquals("hi/there", p1.toString('/')); - // the new prefix object should only take the space it needs: - assertEquals(2, p1.capacityComponents()); - assertEquals(7, p1.capacityChars()); - - p1 = new CategoryPath(p,1); - assertEquals(1, p1.length()); - assertEquals("hi", p1.toString('/')); - assertEquals(1, p1.capacityComponents()); - assertEquals(2, p1.capacityChars()); - - p1 = new CategoryPath(p,0); - assertEquals(0, p1.length()); - assertEquals("", p1.toString('/')); - assertEquals(0, p1.capacityComponents()); - assertEquals(0, p1.capacityChars()); - - // with all the following lengths, the prefix should be the whole path: - int[] lengths = { 3, -1, 4 }; - for (int i=0; i0) { - expectedCharsNeeded++; - } - assertEquals(expectedCharsNeeded, p.charsNeededForFullPath()); - } - } - - @Test - public void testCopyToCharArray() { - String[] components = { "hello", "world", "yo" }; - CategoryPath p = new CategoryPath(components); - char[] charArray = new char[p.charsNeededForFullPath()]; - int numCharsCopied = 0; - - numCharsCopied = p.copyToCharArray(charArray, 0, 0, '.'); - assertEquals(0, numCharsCopied); - assertEquals("", new String(charArray, 0, numCharsCopied)); - - numCharsCopied = p.copyToCharArray(charArray, 0, 1, '.'); - assertEquals(5, numCharsCopied); - assertEquals("hello", new String(charArray, 0, numCharsCopied)); - - numCharsCopied = p.copyToCharArray(charArray, 0, 3, '.'); - assertEquals(14, numCharsCopied); - assertEquals("hello.world.yo", new String(charArray, 0, numCharsCopied)); - - numCharsCopied = p.copyToCharArray(charArray, 0, -1, '.'); - assertEquals(14, numCharsCopied); - assertEquals("hello.world.yo", new String(charArray, 0, numCharsCopied)); - numCharsCopied = p.copyToCharArray(charArray, 0, 4, '.'); - assertEquals(14, numCharsCopied); - assertEquals("hello.world.yo", new String(charArray, 0, numCharsCopied)); - } - - @Test - public void testCharSerialization() throws Exception { - CategoryPath[] testCategories = { - new CategoryPath("hi", "there", "man"), - new CategoryPath("hello"), - new CategoryPath("what's", "up"), - // See that an empty category, which generates a (char)0, - // doesn't cause any problems in the middle of the serialization: - new CategoryPath(), - new CategoryPath("another", "example"), - new CategoryPath(), - new CategoryPath() - }; - StringBuilder sb = new StringBuilder(); - for (int i=0; i 0); - pother = new CategoryPath("a/b/c", '/'); - assertTrue(pother.compareTo(p) < 0); - pother = new CategoryPath("a/b/c/e", '/'); - assertTrue(pother.compareTo(p) > 0); - pother = new CategoryPath("a/b/c//e", '/'); - assertTrue(pother.compareTo(p) < 0); - } - - private static class CS implements CharSequence { - public CS(String s) { - this.ca = new char[s.length()]; - s.getChars(0, s.length(), this.ca, 0); - } - public char charAt(int index) { - return this.ca[index]; - } - public int length() { - return this.ca.length; - } - public CharSequence subSequence(int start, int end) { - return null; // not used. - } - private char[] ca; - } - -}