/* * #! * Ontopia Engine * #- * Copyright (C) 2001 - 2013 The Ontopia Project * #- * 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. * !# */ package net.ontopia.topicmaps.core; import java.io.IOException; import java.net.MalformedURLException; import java.util.logging.Level; import java.util.logging.Logger; import net.ontopia.infoset.impl.basic.URILocator; public abstract class AbstractTMObjectTest extends AbstractTopicMapTest { protected TMObjectIF object; // object being tested protected TMObjectIF parent; // parent of object being tested, if any public AbstractTMObjectTest(String name) { super(name); } protected abstract TMObjectIF makeObject(); // --- Test cases public void testObjectId() { assertTrue("object id not null", object.getObjectId() != null); assertEquals("object not found by id", topicmap.getObjectById(object.getObjectId()), object); } //! public void _testObjectIdUnassignable() { // Note: this test is really specific to the basic implementation //! TMObjectIF object = makeParentlessObject(); //! if (object == null) return; // makes no sense for topic maps :) //! try { //! fail("could assign id even with no topic map: " + //! object.getObjectId()); //! } //! catch (OntopiaRuntimeException e) { //! } //! } public void testEquals() { assertTrue("object does not equal itself", object.equals(object)); TMObjectIF other = makeObject(); if (other != null) { assertTrue("object equals other objects", !object.equals(other)); } } public void testDuplicateSourceLocator() { try { URILocator loc = new URILocator("http://www.ontopia.net"); object.addItemIdentifier(loc); // if this is a topic map we stop, since new object will be // another topic map if (object instanceof TopicMapIF) return; TMObjectIF object2 = makeObject(); if (object2 != null) { try { object2.addItemIdentifier(loc); fail("duplicate source locator allowed"); } catch (ConstraintViolationException e) { } } } catch (MalformedURLException e) { fail("(INTERNAL) bad URL given" + e); } catch (ConstraintViolationException e) { fail("spurious ConstraintViolationException"); } } public void testTopicSubjectIndicatorSourceLocator() { try { URILocator loc = new URILocator("http://www.ontopia.net"); TopicIF topic = builder.makeTopic(); object.addItemIdentifier(loc); topic.addSubjectIdentifier(loc); } catch (MalformedURLException e) { fail("(INTERNAL) bad URL given" + e); } catch (ConstraintViolationException e) { fail("spurious ConstraintViolationException"); } } public void testSourceLocatorTopicSubjectIndicator() { try { URILocator loc = new URILocator("http://www.ontopia.net"); TopicIF topic = builder.makeTopic(); topic.addSubjectIdentifier(loc); object.addItemIdentifier(loc); } catch (MalformedURLException e) { fail("(INTERNAL) bad URL given" + e); } catch (ConstraintViolationException e) { fail("spurious ConstraintViolationException"); } } //! public void _testSourceLocatorUnassignable() { //! try { //! URILocator loc = new URILocator("http://www.opera.com"); //! TMObjectIF object = makeParentlessObject(); //! if (object == null) return; // makes no sense for topic maps :) //! object.addItemIdentifier(loc); //! fail("source locator allowed when not in topic map"); //! } //! catch (ConstraintViolationException e) { //! } //! catch (MalformedURLException e) { //! fail("(INTERNAL) bad URL given" + e); //! } //! } public void testSourceLocators() { // STATE 1: has no source locator assertTrue("empty object has source locators", object.getItemIdentifiers().size() == 0); try { // STATE 2: has only one source locator URILocator loc = new URILocator("http://www.ontopia.net"); object.addItemIdentifier(loc); assertTrue("source locator not added", object.getItemIdentifiers().size() == 1); assertTrue("source locator not added", object.getItemIdentifiers().iterator().next().equals(loc)); TMObjectIF found = topicmap.getObjectByItemIdentifier(loc); assertTrue("can't look up by resid", found.equals(object)); found = topicmap.getObjectByItemIdentifier(new URILocator("http://www.ontopia.net")); assertTrue("can't look up by resid", found.equals(object)); object.addItemIdentifier(loc); assertTrue("duplicate source locator not rejected", object.getItemIdentifiers().size() == 1); // STATE 3: has no source locator object.removeItemIdentifier(loc); assertTrue("source locator not removed", object.getItemIdentifiers().size() == 0); found = topicmap.getObjectByItemIdentifier(loc); assertTrue("can still look up by resid", found == null); // removing locator that is not present works OK object.removeItemIdentifier(loc); } catch (MalformedURLException e) { fail("(INTERNAL) bad URL given" + e); } catch (ConstraintViolationException e) { fail("spurious ConstraintViolationException"); } } public void testMoveSourceLocators() { // bug #273 try { URILocator loc = new URILocator("http://www.ontopia.net"); TopicIF topic = builder.makeTopic(); object.addItemIdentifier(loc); // we do this here to make the RDBMS backend write the // changes in the transaction to the DB URILocator loc2 = new URILocator("http://www.ontopia.com"); TMObjectIF lookedup = topicmap.getObjectByItemIdentifier(loc2); // </end> // ready to blow us up object.removeItemIdentifier(loc); topic.addItemIdentifier(loc); lookedup = topicmap.getObjectByItemIdentifier(loc); assertTrue("wrong object returned on lookup: " + lookedup, lookedup == topic); } catch (MalformedURLException e) { fail("(INTERNAL) bad URL given" + e); } } public void testIsModifiable() { assertTrue("is not modifiable", !object.isReadOnly()); } public void testTopicMap() { assertTrue("has the wrong topic map", object.getTopicMap().equals(topicmap)); } }