/* * 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. */ package org.apache.lucene.facet.taxonomy; import org.apache.lucene.facet.FacetField; import org.apache.lucene.facet.FacetTestCase; import org.apache.lucene.facet.sortedset.SortedSetDocValuesFacetField; import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.TestUtil; import org.junit.Test; public class TestFacetLabel extends FacetTestCase { @Test public void testBasic() { assertEquals(0, new FacetLabel().length); assertEquals(1, new FacetLabel("hello").length); assertEquals(2, new FacetLabel("hello", "world").length); } @Test public void testToString() { // When the category is empty, we expect an empty string assertEquals("FacetLabel: []", new FacetLabel().toString()); // one category assertEquals("FacetLabel: [hello]", new FacetLabel("hello").toString()); // more than one category assertEquals("FacetLabel: [hello, world]", new FacetLabel("hello", "world").toString()); } @Test public void testGetComponent() { String[] components = new String[atLeast(10)]; for (int i = 0; i < components.length; i++) { components[i] = Integer.toString(i); } FacetLabel cp = new FacetLabel(components); for (int i = 0; i < components.length; i++) { assertEquals(i, Integer.parseInt(cp.components[i])); } } @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. FacetLabel p = new FacetLabel(); assertEquals(0, p.length); assertEquals("FacetLabel: []", p.toString()); } @Test public void testSubPath() { final FacetLabel p = new FacetLabel("hi", "there", "man"); assertEquals(p.length, 3); FacetLabel p1 = p.subpath(2); assertEquals(2, p1.length); assertEquals("FacetLabel: [hi, there]", p1.toString()); p1 = p.subpath(1); assertEquals(1, p1.length); assertEquals("FacetLabel: [hi]", p1.toString()); p1 = p.subpath(0); assertEquals(0, p1.length); assertEquals("FacetLabel: []", p1.toString()); // with all the following lengths, the prefix should be the whole path int[] lengths = { 3, -1, 4 }; for (int i = 0; i < lengths.length; i++) { p1 = p.subpath(lengths[i]); assertEquals(3, p1.length); assertEquals("FacetLabel: [hi, there, man]", p1.toString()); assertEquals(p, p1); } } @Test public void testEquals() { assertEquals(new FacetLabel(), new FacetLabel()); assertFalse(new FacetLabel().equals(new FacetLabel("hi"))); assertFalse(new FacetLabel().equals(Integer.valueOf(3))); assertEquals(new FacetLabel("hello", "world"), new FacetLabel("hello", "world")); } @Test public void testHashCode() { assertEquals(new FacetLabel().hashCode(), new FacetLabel().hashCode()); assertFalse(new FacetLabel().hashCode() == new FacetLabel("hi").hashCode()); assertEquals(new FacetLabel("hello", "world").hashCode(), new FacetLabel("hello", "world").hashCode()); } @Test public void testLongHashCode() { assertEquals(new FacetLabel().longHashCode(), new FacetLabel().longHashCode()); assertFalse(new FacetLabel().longHashCode() == new FacetLabel("hi").longHashCode()); assertEquals(new FacetLabel("hello", "world").longHashCode(), new FacetLabel("hello", "world").longHashCode()); } @Test public void testArrayConstructor() { FacetLabel p = new FacetLabel("hello", "world", "yo"); assertEquals(3, p.length); assertEquals("FacetLabel: [hello, world, yo]", p.toString()); } @Test public void testCompareTo() { FacetLabel p = new FacetLabel("a", "b", "c", "d"); FacetLabel pother = new FacetLabel("a", "b", "c", "d"); assertEquals(0, pother.compareTo(p)); assertEquals(0, p.compareTo(pother)); pother = new FacetLabel(); assertTrue(pother.compareTo(p) < 0); assertTrue(p.compareTo(pother) > 0); pother = new FacetLabel("a", "b_", "c", "d"); assertTrue(pother.compareTo(p) > 0); assertTrue(p.compareTo(pother) < 0); pother = new FacetLabel("a", "b", "c"); assertTrue(pother.compareTo(p) < 0); assertTrue(p.compareTo(pother) > 0); pother = new FacetLabel("a", "b", "c", "e"); assertTrue(pother.compareTo(p) > 0); assertTrue(p.compareTo(pother) < 0); } @Test public void testEmptyNullComponents() throws Exception { // LUCENE-4724: CategoryPath should not allow empty or null components String[][] components_tests = new String[][] { new String[] { "", "test" }, // empty in the beginning new String[] { "test", "" }, // empty in the end new String[] { "test", "", "foo" }, // empty in the middle new String[] { null, "test" }, // null at the beginning new String[] { "test", null }, // null in the end new String[] { "test", null, "foo" }, // null in the middle }; // empty or null components should not be allowed. for (String[] components : components_tests) { expectThrows(IllegalArgumentException.class, () -> { new FacetLabel(components); }); expectThrows(IllegalArgumentException.class, () -> { new FacetField("dim", components); }); expectThrows(IllegalArgumentException.class, () -> { new AssociationFacetField(new BytesRef(), "dim", components); }); expectThrows(IllegalArgumentException.class, () -> { new IntAssociationFacetField(17, "dim", components); }); expectThrows(IllegalArgumentException.class, () -> { new FloatAssociationFacetField(17.0f, "dim", components); }); } expectThrows(IllegalArgumentException.class, () -> { new FacetField(null, new String[] {"abc"}); }); expectThrows(IllegalArgumentException.class, () -> { new FacetField("", new String[] {"abc"}); }); expectThrows(IllegalArgumentException.class, () -> { new IntAssociationFacetField(17, null, new String[] {"abc"}); }); expectThrows(IllegalArgumentException.class, () -> { new IntAssociationFacetField(17, "", new String[] {"abc"}); }); expectThrows(IllegalArgumentException.class, () -> { new FloatAssociationFacetField(17.0f, null, new String[] {"abc"}); }); expectThrows(IllegalArgumentException.class, () -> { new FloatAssociationFacetField(17.0f, "", new String[] {"abc"}); }); expectThrows(IllegalArgumentException.class, () -> { new AssociationFacetField(new BytesRef(), null, new String[] {"abc"}); }); expectThrows(IllegalArgumentException.class, () -> { new AssociationFacetField(new BytesRef(), "", new String[] {"abc"}); }); expectThrows(IllegalArgumentException.class, () -> { new SortedSetDocValuesFacetField(null, "abc"); }); expectThrows(IllegalArgumentException.class, () -> { new SortedSetDocValuesFacetField("", "abc"); }); expectThrows(IllegalArgumentException.class, () -> { new SortedSetDocValuesFacetField("dim", null); }); expectThrows(IllegalArgumentException.class, () -> { new SortedSetDocValuesFacetField("dim", ""); }); } @Test public void testLongPath() throws Exception { String bigComp = null; while (true) { int len = FacetLabel.MAX_CATEGORY_PATH_LENGTH; bigComp = TestUtil.randomSimpleString(random(), len, len); if (bigComp.indexOf('\u001f') != -1) { continue; } break; } // long paths should not be allowed final String longPath = bigComp; expectThrows(IllegalArgumentException.class, () -> { new FacetLabel("dim", longPath); }); } }