blob: 22c981973e1359aae24882d9c194ef0cb1a2b6c0 [file] [log] [blame]
/*
* 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.stanbol.entityhub.test.model;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertTrue;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import org.apache.stanbol.entityhub.servicesapi.model.Reference;
import org.apache.stanbol.entityhub.servicesapi.model.Representation;
import org.apache.stanbol.entityhub.servicesapi.model.Text;
import org.apache.stanbol.entityhub.servicesapi.model.UnsupportedTypeException;
import org.apache.stanbol.entityhub.servicesapi.model.ValueFactory;
import org.apache.stanbol.entityhub.servicesapi.yard.Yard;
import org.junit.Test;
/**
* General tests for instantiation of model instances by using the different value factory methods. This also
* tests the construction of implementation of {@link Reference}, {@link Text} and {@link Representation}. For
* the immutable {@link Text} and {@link Reference} this tests are sufficient. For Representations there is an
* own Test class
*
* @author Rupert Westenthaler
*
*/
public abstract class ValueFactoryTest {
/**
* Subclasses must implement this method and provide a {@link ValueFactory} instance that is used to test
* the actual model implementation
*
* @return the {@link ValueFactory} for the Entityhub model implementation to be tested
*/
protected abstract ValueFactory getValueFactory();
/**
* Returns an instance of a unsupported Type to be parsed to {@link ValueFactory#createReference(Object)}.
* Used to check if this Method correctly throws an {@link UnsupportedTypeException}
*
* @return an instance of an unsupported type or <code>null</code> if all types are supported
*/
protected abstract Object getUnsupportedReferenceType();
/**
* Returns an instance of a unsupported Type to be parsed to {@link ValueFactory#createText(Object)}. Used
* to check if this Method correctly throws an {@link UnsupportedTypeException}
*
* @return an instance of an unsupported type or <code>null</code> if all types are supported
*/
protected abstract Object getUnsupportedTextType();
@Test(expected = IllegalArgumentException.class)
public void testNullReference() {
testRef(null);
}
@Test(expected = UnsupportedTypeException.class)
public void testUnsupportedReferenceType() {
Object unsupported = getUnsupportedReferenceType();
if (unsupported != null) {
testRef(unsupported);
} else {
// no unsupported types ... this test is not necessary
// -> create a dummy exception
// TODO: is there a way to deactivate a test if not valid
throw new UnsupportedTypeException(Object.class,
"dummy exception to successfully complete this unnecessary test");
}
}
@Test(expected = IllegalArgumentException.class)
public void testEmptyStringReference() {
testRef("");
}
@Test
public void testStringReference() {
Object refObject = "urn:test.1";
Reference ref = testRef(refObject);
assertEquals(ref.getReference(), refObject);
}
@Test
public void testIRIerence() throws URISyntaxException {
URI refObject = new URI("http://www.test.org/uriTest");
Reference ref = testRef(refObject);
assertEquals(ref.getReference(), refObject.toString());
}
@Test
public void testURLReference() throws MalformedURLException {
URL refObject = new URL("http://www.test.org/urlTest");
Reference ref = testRef(refObject);
assertEquals(ref.getReference(), refObject.toString());
}
@Test(expected = IllegalArgumentException.class)
public void testNullText() {
testText(null, "en");
}
@Test
public void testNullLanguage() {
testText("test", null);
}
@Test(expected = UnsupportedTypeException.class)
public void testUnsupportedTextType() {
Object unsupported = getUnsupportedTextType();
if (unsupported != null) {
getValueFactory().createText(unsupported);
} else {
// no unsupported types ... this test is not necessary
// -> create a dummy exception
// TODO: is there a way to deactivate a test if not valid
throw new UnsupportedTypeException(Object.class,
"dummy exception to successfully complete this unnecessary test");
}
}
@Test
public void testNormalText() {
testText("test", "en");
}
/**
* Some Systems use an empty string for the default language, other use <code>null</code>. Text does
* currently not define that <code>null</code> need to be used as default language. However it does define
* that <code>null</code> is a valid value for the language!
* <p>
* Based on that Entityhub allows implementations to convert an empty language to <code>null</code> but
* does NOT allow to to convert <code>null</code> to an empty string.
* <p>
* This test currently assures, that parsing an empty string as language results in an empty string OR
* <code>null</code>. It also tests that parsing an empty string as language does not result in an
* Exception.
*/
@Test
public void testEmptyLanguageText() {
testText("test", "");
}
/**
* One can not create a Representation with <code>null</code> as ID. NOTE: automatic generation of IDs is
* supported by the {@link Yard#create()} but not by the {@link Representation} itself.
*/
@Test(expected = IllegalArgumentException.class)
public void testNullIdRepresentation() {
testRepresentation(null);
}
/**
* One can not create a Representation with an emtpy ID
*/
@Test(expected = IllegalArgumentException.class)
public void testEmptyIdRepresentation() {
testRepresentation("");
}
@Test
public void testMultipleInstanceForSameID() {
Representation rep = testRepresentation("urn:testSameId");
Representation rep1 = testRepresentation("urn:testSameId");
// check that multiple calls with the same ID create different instances
// -> this is very important to allow mapping of Representations (e.g.
// when they are stored within a cache
assertNotSame(rep, rep1);
// if an ID is parsed, than the two instance should be equal
assertTrue(rep.equals(rep1));
assertTrue(rep.hashCode() == rep1.hashCode()); // check the hash code
}
private Representation testRepresentation(String id) {
ValueFactory vf = getValueFactory();
Representation rep = vf.createRepresentation(id);
assertNotNull(rep);
assertNotNull(rep.getId());
if (id != null) {
assertEquals(rep.getId(), id);
}
return rep;
}
/**
* Internally used to create and text {@link Text}s for the different tests
*
* @param textString
* the natural language text as string
* @param language
* the language
* @return the created {@link Text} instance that can be used to perform further tests.
*/
private Text testText(String textString, String language) {
ValueFactory vf = getValueFactory();
Text text = vf.createText(textString, language);
assertNotNull(text.getText());
assertNotNull(text.getText());
assertEquals(text.getText(), textString);
if (language == null) {
assertTrue(text.getLanguage() == null);
} else if (language.isEmpty()) {
// implementations are free to change an empty language string to null
// NOTE that it is not allowed to change NULL to an empty String!
assertTrue(text.getLanguage() == null || text.getLanguage().isEmpty());
} else {
assertNotNull(text.getLanguage());
assertEquals(text.getLanguage(), language);
}
return text;
}
/**
* Internally used to create and test {@link Reference}s for the different tests
*
* @param refObject
* the object representing the reference
* @return the created {@link Reference} that can be used to perform further tests.
*/
private Reference testRef(Object refObject) {
ValueFactory vf = getValueFactory();
Reference ref = vf.createReference(refObject);
// check not null
assertNotNull(ref);
// check reference is not null
assertNotNull(ref.getReference());
return ref;
}
}