package org.apache.lucene.facet.index;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Iterator;
import org.junit.Test;
import org.apache.lucene.facet.FacetException;
import org.apache.lucene.facet.enhancements.association.AssociationIntProperty;
import org.apache.lucene.facet.enhancements.association.AssociationProperty;
import org.apache.lucene.facet.index.CategoryContainer;
import org.apache.lucene.facet.index.attributes.CategoryAttribute;
import org.apache.lucene.facet.index.attributes.CategoryAttributeImpl;
import org.apache.lucene.facet.index.streaming.CategoryAttributesStream;
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 CategoryContainerTest extends CategoryContainerTestBase {
@Test
public void basicTest() {
assertEquals("Wrong number of categories in the container", 3,
categoryContainer.size());
categoryContainer.clear();
assertEquals("Container should not contain categories after clear", 0,
categoryContainer.size());
}
@Test
public void testIterator() throws FacetException {
Iterator<CategoryAttribute> iterator = categoryContainer.iterator();
// count the number of tokens
int nCategories;
for (nCategories = 0; iterator.hasNext(); nCategories++) {
iterator.next();
}
assertEquals("Wrong number of tokens", 3, nCategories);
}
@Test
public void testExistingNewCategoryWithProperty() throws FacetException {
categoryContainer.addCategory(new CategoryPath("five", "six"),
new DummyProperty());
Iterator<CategoryAttribute> iterator = categoryContainer.iterator();
// count the number of tokens, and check there is one DummyAttribute
int nCategories;
int nProperties = 0;
for (nCategories = 0; iterator.hasNext(); nCategories++) {
CategoryAttribute attribute = iterator.next();
if (attribute.getProperty(DummyProperty.class) != null) {
nProperties++;
}
}
assertEquals("Wrong number of tokens", 3, nCategories);
assertEquals("Wrong number of tokens with properties", 1, nProperties);
}
@Test
public void testMultipleCategoriesWithProperties() throws FacetException {
AssociationProperty associationProperty = new AssociationIntProperty(
49);
categoryContainer.addCategory(new CategoryPath("five", "six"),
new DummyProperty(), associationProperty);
categoryContainer.addCategory(new CategoryPath("seven", "eight"),
new DummyProperty());
associationProperty = new AssociationIntProperty(123);
categoryContainer.addCategory(new CategoryPath("nine"),
associationProperty, new DummyProperty());
Iterator<CategoryAttribute> iterator = categoryContainer.iterator();
// count the number of tokens, and check there is one DummyAttribute
int nCategories;
int nDummyAttributes = 0;
int nAssocAttributes = 0;
for (nCategories = 0; iterator.hasNext(); nCategories++) {
CategoryAttribute attribute = iterator.next();
if (attribute.getProperty(DummyProperty.class) != null) {
nDummyAttributes++;
}
if (attribute.getProperty(AssociationIntProperty.class) != null) {
nAssocAttributes++;
}
}
assertEquals("Wrong number of tokens", 5, nCategories);
assertEquals("Wrong number of tokens with dummy properties", 3,
nDummyAttributes);
assertEquals("Wrong number of tokens with association properties", 2,
nAssocAttributes);
}
@Test
public void testAddNewCategoryWithProperty() throws FacetException {
categoryContainer.addCategory(new CategoryPath("seven", "eight"),
new DummyProperty());
Iterator<CategoryAttribute> iterator = categoryContainer.iterator();
// count the number of tokens, and check there is one DummyAttribute
int nCategories;
int nProperties = 0;
for (nCategories = 0; iterator.hasNext(); nCategories++) {
CategoryAttribute attribute = iterator.next();
if (attribute.getProperty(DummyProperty.class) != null) {
nProperties++;
}
}
assertEquals("Wrong number of tokens", 4, nCategories);
assertEquals("Wrong number of tokens with properties", 1, nProperties);
}
/**
* Test addition of {@link CategoryAttribute} object without properties to a
* {@link CategoryContainer}.
*/
@Test
public void testAddCategoryAttributeWithoutProperties()
throws FacetException {
CategoryAttribute newCA = new CategoryAttributeImpl(new CategoryPath(
"seven", "eight"));
categoryContainer.addCategory(newCA);
}
/**
* Test addition of {@link CategoryAttribute} object with property to a
* {@link CategoryContainer}.
*/
@Test
public void testAddCategoryAttributeWithProperty() throws FacetException {
CategoryAttribute newCA = new CategoryAttributeImpl(new CategoryPath(
"seven", "eight"));
newCA.addProperty(new DummyProperty());
categoryContainer.addCategory(newCA);
Iterator<CategoryAttribute> iterator = categoryContainer.iterator();
// count the number of tokens, and check there is one DummyAttribute
int nCategories;
int nProperties = 0;
for (nCategories = 0; iterator.hasNext(); nCategories++) {
CategoryAttribute attribute = iterator.next();
if (attribute.getProperty(DummyProperty.class) != null) {
nProperties++;
}
}
assertEquals("Wrong number of tokens", 4, nCategories);
assertEquals("Wrong number of tokens with properties", 1, nProperties);
}
/**
* Verifies that a {@link CategoryAttributesStream} can be constructed from
* {@link CategoryContainer} and produce the correct number of tokens.
*/
@Test
public void testCategoryAttributesStream() throws IOException {
CategoryAttributesStream stream = new CategoryAttributesStream(
categoryContainer);
// count the number of tokens
int nTokens;
for (nTokens = 0; stream.incrementToken(); nTokens++) {
}
assertEquals("Wrong number of tokens", 3, nTokens);
}
/**
* Test that {@link CategoryContainer} merges properties.
*/
@Test
public void testCategoryAttributeMerge() throws FacetException {
categoryContainer.addCategory(initialCatgeories[0],
new AssociationIntProperty(2));
categoryContainer.addCategory(initialCatgeories[0],
new AssociationIntProperty(15));
Iterator<CategoryAttribute> iterator = categoryContainer.iterator();
int nCategories;
int nAssociations = 0;
for (nCategories = 0; iterator.hasNext(); nCategories++) {
CategoryAttribute ca = iterator.next();
AssociationProperty aa = (AssociationProperty) ca
.getProperty(AssociationIntProperty.class);
if (aa != null) {
assertEquals("Wrong association value", 17, aa.getAssociation());
nAssociations++;
}
}
assertEquals("Wrong number of tokens", 3, nCategories);
assertEquals("Wrong number of tokens with associations", 1,
nAssociations);
}
@Test
public void testSerialization() throws Exception {
AssociationProperty associationProperty = new AssociationIntProperty(
49);
categoryContainer.addCategory(new CategoryPath("five", "six"),
new DummyProperty(), associationProperty);
categoryContainer.addCategory(new CategoryPath("seven", "eight"),
new DummyProperty());
associationProperty = new AssociationIntProperty(123);
categoryContainer.addCategory(new CategoryPath("nine"),
associationProperty, new DummyProperty());
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
ObjectOutputStream out = new ObjectOutputStream(baos);
out.writeObject(categoryContainer);
out.close();
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream in = new ObjectInputStream(bais);
assertEquals(
"Original and deserialized CategoryContainer are different",
categoryContainer, in.readObject());
}
}