/* * (C) Copyright 2006-2007 Nuxeo SA (http://nuxeo.com/) and others. * * Licensed 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. * * Contributors: * Nuxeo - initial API and implementation * * $Id: TestStatement.java 22853 2007-07-22 21:09:50Z sfermigier $ */ package org.nuxeo.ecm.platform.relations.api.impl; import java.util.HashMap; import java.util.Map; import org.junit.Before; import org.junit.After; import org.junit.Test; import static org.junit.Assert.*; import org.nuxeo.ecm.platform.relations.api.Literal; import org.nuxeo.ecm.platform.relations.api.Node; import org.nuxeo.ecm.platform.relations.api.Resource; import org.nuxeo.ecm.platform.relations.api.Statement; import org.nuxeo.ecm.platform.relations.api.exceptions.InvalidPredicateException; import org.nuxeo.ecm.platform.relations.api.exceptions.InvalidStatementException; import org.nuxeo.ecm.platform.relations.api.exceptions.InvalidSubjectException; @SuppressWarnings({ "ResultOfObjectAllocationIgnored" }) public class TestStatement { private Resource subject; private Resource predicate; private LiteralImpl literal; private Resource object; private BlankImpl blank; private Resource propertyResource; private Node[] propertyValues; private Map<Resource, Node[]> properties; @Before public void setUp() throws Exception { subject = NodeFactory.createResource("http://toto"); predicate = NodeFactory.createResource("http://says"); literal = NodeFactory.createLiteral("Hello"); object = NodeFactory.createResource("http://hello"); blank = NodeFactory.createBlank("blank"); properties = new HashMap<Resource, Node[]>(); propertyResource = NodeFactory.createResource("http://heardBy"); propertyValues = new Node[] { NodeFactory.createResource("http://God"), NodeFactory.createLiteral("echo") }; properties.put(propertyResource, propertyValues); } @After public void tearDown() throws Exception { properties = null; propertyValues = null; } @Test public void testCreateStatementNull() { Statement st = new StatementImpl(); assertNotNull(st); assertNull(st.getSubject()); assertNull(st.getPredicate()); assertNull(st.getObject()); // change null values st = new StatementImpl(null, null, null); assertNotNull(st); assertNull(st.getSubject()); assertNull(st.getPredicate()); assertNull(st.getObject()); st = new StatementImpl(null, predicate, object); assertNotNull(st); assertNull(st.getSubject()); assertEquals(st.getPredicate(), predicate); assertEquals(st.getObject(), object); st = new StatementImpl(subject, null, object); assertNotNull(st); assertEquals(st.getSubject(), subject); assertNull(st.getPredicate()); assertEquals(st.getObject(), object); st = new StatementImpl(subject, predicate, null); assertNotNull(st); assertEquals(st.getSubject(), subject); assertEquals(st.getPredicate(), predicate); assertNull(st.getObject()); } @Test public void testCreateStatementLiteral() { Statement st = new StatementImpl(subject, predicate, literal); assertNotNull(st); assertEquals(st.getSubject(), subject); assertEquals(st.getPredicate(), predicate); assertEquals(st.getObject(), literal); } @Test public void testCreateStatementBlank() { Statement st = new StatementImpl(subject, predicate, blank); assertNotNull(st); assertEquals(st.getSubject(), subject); assertEquals(st.getPredicate(), predicate); assertEquals(st.getObject(), blank); } @Test public void testCreateStatementResource() { Statement st = new StatementImpl(subject, predicate, object); assertNotNull(st); assertEquals(st.getSubject(), subject); assertEquals(st.getPredicate(), predicate); assertEquals(st.getObject(), object); } @Test public void testCreateStatementBlankSubject() { Statement st = new StatementImpl(blank, predicate, object); assertNotNull(st); assertEquals(st.getSubject(), blank); assertEquals(st.getPredicate(), predicate); assertEquals(st.getObject(), object); } @Test public void testCreateStatementInvalidSubjectException() { try { new StatementImpl(literal, predicate, literal); fail("Should have raised an InvalidSubjectException"); } catch (InvalidSubjectException e) { } } @Test public void testCreateStatementInvalidPredicateException() { try { new StatementImpl(subject, literal, literal); fail("Should have raised an InvalidPredicateException"); } catch (InvalidPredicateException e) { } } @Test public void testCreateStatementInvalidStatementException() { try { new StatementImpl(literal, blank, literal); fail("Should have raised an InvalidStatementException"); } catch (InvalidStatementException e) { } } @SuppressWarnings({ "ObjectEqualsNull" }) @Test public void testEquals() { Statement st1 = new StatementImpl(subject, predicate, literal); Statement st2 = new StatementImpl(subject, predicate, literal); Statement st3 = new StatementImpl(subject, predicate, object); assertEquals(st1, st1); assertEquals(st1, st2); assertEquals(st1.hashCode(), st2.hashCode()); assertFalse(st1.equals(st3)); assertFalse(st1.equals(null)); } @Test public void testGetSetProperties() { Statement st = new StatementImpl(subject, predicate, literal); assertNotNull(st.getProperties()); assertEquals(0, st.getProperties().size()); st.setProperties(properties); assertEquals(properties, st.getProperties()); assertEquals(1, st.getProperties().size()); } @Test public void testGetProperty() { Statement st = new StatementImpl(subject, predicate, literal); st.setProperties(properties); assertEquals(propertyValues[0], st.getProperty(propertyResource)); assertNull(st.getProperty(null)); assertNull(st.getProperty(NodeFactory.createResource("http://foo"))); } @Test public void testGetPropertyList() { Statement st = new StatementImpl(subject, predicate, literal); st.setProperties(properties); assertEquals(propertyValues, st.getProperties(propertyResource)); assertNull(st.getProperties(null)); assertNull(st.getProperties(NodeFactory.createResource("http://foo"))); } @Test public void testSetProperty() { Statement st = new StatementImpl(subject, predicate, literal); Node godProperty = NodeFactory.createResource("http://God"); st.setProperty(propertyResource, godProperty); Node[] values = { godProperty }; assertEquals(values.length, st.getProperties(propertyResource).length); for (int i = 0; i < values.length; i++) { assertEquals(values[i], st.getProperties(propertyResource)[i]); } Node echoProperty = NodeFactory.createLiteral("echo"); st.setProperty(propertyResource, echoProperty); Node[] newValues = { echoProperty }; assertEquals(newValues.length, st.getProperties(propertyResource).length); for (int i = 0; i < newValues.length; i++) { assertEquals(newValues[i], st.getProperties(propertyResource)[i]); } } @Test public void testSetPropertyList() { Statement st = new StatementImpl(subject, predicate, literal); st.setProperties(propertyResource, propertyValues); assertEquals(propertyValues, st.getProperties(propertyResource)); Node[] otherValues = { NodeFactory.createResource("http://foo") }; st.setProperties(propertyResource, otherValues); assertEquals(otherValues, st.getProperties(propertyResource)); } @Test public void testDeletePropertiesAll() { Statement st = new StatementImpl(subject, predicate, literal); assertNotNull(st.getProperties()); assertEquals(0, st.getProperties().size()); st.setProperties(properties); st.setProperties(NodeFactory.createResource("http://bar"), propertyValues); assertEquals(2, st.getProperties().size()); st.deleteProperties(); assertEquals(0, st.getProperties().size()); } @Test public void testDeleteProperty() { Statement st = new StatementImpl(subject, predicate, literal); assertNotNull(st.getProperties()); assertEquals(0, st.getProperties().size()); st.setProperties(properties); st.setProperties(NodeFactory.createResource("http://bar"), propertyValues); assertEquals(2, st.getProperties().size()); st.deleteProperty(null); assertEquals(2, st.getProperties().size()); st.deleteProperty(NodeFactory.createResource("http://bar")); assertEquals(1, st.getProperties().size()); assertEquals(properties, st.getProperties()); } @Test public void testDeleteProperties() { Statement st = new StatementImpl(subject, predicate, literal); st.setProperties(properties); assertEquals(properties, st.getProperties()); st.deleteProperties(propertyResource, null); assertEquals(properties, st.getProperties()); st.deleteProperties(null, propertyValues); assertEquals(properties, st.getProperties()); Node[] deleteValues = { NodeFactory.createResource("http://God") }; st.deleteProperties(propertyResource, deleteValues); Node[] newValues = { NodeFactory.createLiteral("echo") }; assertEquals(newValues.length, st.getProperties(propertyResource).length); for (int i = 0; i < newValues.length; i++) { assertEquals(newValues[i], st.getProperties(propertyResource)[i]); } st.deleteProperties(propertyResource, propertyValues); assertEquals(0, st.getProperties().size()); } @Test public void testAddProperties() { Statement st = new StatementImpl(subject, predicate, literal); st.setProperties(properties); assertEquals(properties, st.getProperties()); st.addProperties(null); assertEquals(properties, st.getProperties()); Map<Resource, Node[]> newProperties = new HashMap<Resource, Node[]>(); // set duplicates newProperties.putAll(properties); Resource otherPropertyResource = NodeFactory.createResource("http://foo"); Node[] otherValues = { NodeFactory.createLiteral("http://bar") }; newProperties.put(otherPropertyResource, otherValues); st.addProperties(newProperties); assertEquals(newProperties, st.getProperties()); assertEquals(otherValues, st.getProperties(otherPropertyResource)); assertEquals(propertyValues, st.getProperties(propertyResource)); } @Test public void testAddProperty() { Statement st = new StatementImpl(subject, predicate, literal); st.setProperties(properties); assertEquals(properties, st.getProperties()); st.addProperty(null, null); assertEquals(properties, st.getProperties()); Resource otherPropertyResource = NodeFactory.createResource("http://foo"); Literal newValue = NodeFactory.createLiteral("http://bar"); st.addProperty(otherPropertyResource, null); assertEquals(properties, st.getProperties()); st.addProperty(null, newValue); assertEquals(properties, st.getProperties()); st.addProperty(otherPropertyResource, newValue); assertEquals(propertyValues, st.getProperties(propertyResource)); Node[] otherValues = { newValue }; assertEquals(otherValues.length, st.getProperties(otherPropertyResource).length); for (int i = 0; i < otherValues.length; i++) { assertEquals(otherValues[i], st.getProperties(otherPropertyResource)[i]); } } @Test public void testAddPropertyList() { Statement st = new StatementImpl(subject, predicate, literal); st.setProperties(propertyResource, propertyValues); Resource otherPropertyResource = NodeFactory.createResource("http://foo"); assertEquals(propertyValues, st.getProperties(propertyResource)); assertNull(st.getProperties(otherPropertyResource)); Literal newValue = NodeFactory.createLiteral("http://bar"); Node[] otherValues = { newValue }; st.addProperties(otherPropertyResource, otherValues); assertEquals(otherValues, st.getProperties(otherPropertyResource)); assertEquals(propertyValues, st.getProperties(propertyResource)); } @Test public void testClone() throws CloneNotSupportedException { StatementImpl st = new StatementImpl(subject, predicate, literal); st.setProperties(properties); assertEquals(properties, st.getProperties()); Statement clone = (Statement) st.clone(); assertEquals(clone, st); // assertEquals(properties, st.getProperties()); // add new properties to clone Map<Resource, Node[]> newProperties = new HashMap<Resource, Node[]>(); Node[] newValues = { NodeFactory.createLiteral("http://bar") }; newProperties.put(propertyResource, newValues); clone.setProperties(newProperties); // make sure old statement properties have not changed assertEquals(properties, st.getProperties()); assertEquals(newProperties, clone.getProperties()); } }