/* * #! * 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.utils; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import junit.framework.TestCase; import net.ontopia.topicmaps.impl.basic.InMemoryTopicMapStore; import net.ontopia.infoset.core.LocatorIF; import net.ontopia.infoset.impl.basic.URILocator; import net.ontopia.topicmaps.core.ScopedIF; import net.ontopia.topicmaps.core.TopicIF; import net.ontopia.topicmaps.core.TopicMapBuilderIF; import net.ontopia.topicmaps.core.TopicMapIF; import net.ontopia.utils.StringUtils; import net.ontopia.utils.DeciderIF; public class ScopeUtilsTest extends TestCase { protected TopicMapIF topicmap; protected TopicMapBuilderIF builder; public ScopeUtilsTest(String name) { super(name); } public void setUp() { topicmap = makeTopicMap(); makeTopic("A"); makeTopic("B"); } // intended to be overridden protected TopicMapIF makeTopicMap() { InMemoryTopicMapStore store = new InMemoryTopicMapStore(); builder = store.getTopicMap().getBuilder(); return store.getTopicMap(); } protected TopicIF makeTopic(String name) { TopicIF topic = builder.makeTopic(); topic.addSubjectIdentifier(makeLocator("http://psi.ontopia.net/fake/" + name)); return topic; } protected TopicIF getTopic(String name) { return topicmap.getTopicBySubjectIdentifier(makeLocator("http://psi.ontopia.net/fake/" + name)); } public URILocator makeLocator(String uri) { try { return new URILocator(uri); } catch (java.net.MalformedURLException e) { fail("malformed URL given: " + e); return null; // never executed... } } // public void check(String deciderName, String object, String user, boolean res) { // Collection userScope = makeContext(user); // DeciderIF decider = null; // if (deciderName == "Broad") // decider = new InBroadScopeDecider(userScope); // else if (deciderName == "Narrow") // decider = new InNarrowScopeDecider(userScope); // else if (deciderName == "Identical") // decider = new InIdenticalScopeDecider(userScope); // else if (deciderName == "Related") // decider = new InRelatedScopeDecider(userScope); // else // fail("bad decider name given"); // // assertTrue(deciderName + " decider got wrong result: " + object + "/" + user, // decider.ok(makeScoped(object)) == res); // } public Collection makeContext(String spec) { Collection scope = new HashSet(); String[] tokens = StringUtils.split(spec, ","); for (int ix = 0; ix < tokens.length; ix++) { String token = tokens[ix].trim(); if (!token.equals("")) scope.add(getTopic(token)); } return scope; } public ScopedIF makeScoped(String spec) { return new Scoped(makeContext(spec)); } // --- Test cases // public void testScopeDeciders() { // makeTopic("A"); // makeTopic("B"); // makeTopic("C"); // makeTopic("D"); // makeTopic("E"); // makeTopic("F"); // // check("Broad", " ", "", true); // check("Narrow", " ", "", true); // check("Identical", " ", "", true); // check("Related", " ", "", true); // check("Broad", " ", "A", true); // check("Narrow", " ", "A", true); // check("Identical", " ", "A", false); // check("Related", " ", "A", true); // check("Broad", " ", "A, B", true); // check("Narrow", " ", "A, B", true); // check("Identical", " ", "A, B", false); // check("Related", " ", "A, B", true); // check("Broad", " ", "A, B, C", true); // check("Narrow", " ", "A, B, C", true); // check("Identical", " ", "A, B, C", false); // check("Related", " ", "A, B, C", true); // check("Broad", " A", "", true); // check("Narrow", " A", "", true); // check("Identical", " A", "", false); // check("Related", " A", "", true); // check("Broad", " A", "A", true); // check("Narrow", " A", "A", true); // check("Identical", " A", "A", true); // check("Related", " A", "A", true); // check("Broad", " A", "A, B", false); // check("Narrow", " A", "A, B", true); // check("Identical", " A", "A, B", false); // check("Related", " A", "A, B", true); // check("Broad", " A", "A, B, C", false); // check("Narrow", " A", "A, B, C", true); // check("Identical", " A", "A, B, C", false); // check("Related", " A", "A, B, C", true); // check("Broad", " A, B", "", true); // check("Narrow", " A, B", "", true); // check("Identical", " A, B", "", false); // check("Related", " A, B", "", true); // check("Broad", " A, B", "A", true); // check("Narrow", " A, B", "A", false); // check("Identical", " A, B", "A", false); // check("Related", " A, B", "A", true); // check("Broad", " A, B", "A, B", true); // check("Narrow", " A, B", "A, B", true); // check("Identical", " A, B", "A, B", true); // check("Related", " A, B", "A, B", true); // check("Broad", " A, B", "A, B, C", false); // check("Narrow", " A, B", "A, B, C", true); // check("Identical", " A, B", "A, B, C", false); // check("Related", " A, B", "A, B, C", true); // check("Broad", " A, B, C", "", true); // check("Narrow", " A, B, C", "", true); // check("Identical", " A, B, C", "", false); // check("Related", " A, B, C", "", true); // check("Broad", " A, B, C", "A", true); // check("Narrow", " A, B, C", "A", false); // check("Identical", " A, B, C", "A", false); // check("Related", " A, B, C", "A", true); // check("Broad", " A, B, C", "A, B", true); // check("Narrow", " A, B, C", "A, B", false); // check("Identical", " A, B, C", "A, B", false); // check("Related", " A, B, C", "A, B", true); // check("Broad", " A, B, C", "A, B, C", true); // check("Narrow", " A, B, C", "A, B, C", true); // check("Identical", " A, B, C", "A, B, C", true); // check("Related", " A, B, C", "A, B, C", true); // check("Broad", " ", "", true); // check("Narrow", " ", "", true); // check("Identical", " ", "", true); // check("Related", " ", "", true); // check("Broad", " ", "D", true); // check("Narrow", " ", "D", true); // check("Identical", " ", "D", false); // check("Related", " ", "D", true); // check("Broad", " ", "D, E", true); // check("Narrow", " ", "D, E", true); // check("Identical", " ", "D, E", false); // check("Related", " ", "D, E", true); // check("Broad", " ", "D, E, F", true); // check("Narrow", " ", "D, E, F", true); // check("Identical", " ", "D, E, F", false); // check("Related", " ", "D, E, F", true); // check("Broad", " A", "", true); // check("Narrow", " A", "", true); // check("Identical", " A", "", false); // check("Related", " A", "", true); // check("Broad", " A", "D", false); // check("Narrow", " A", "D", false); // check("Identical", " A", "D", false); // check("Related", " A", "D", false); // check("Broad", " A", "D, E", false); // check("Narrow", " A", "D, E", false); // check("Identical", " A", "D, E", false); // check("Related", " A", "D, E", false); // check("Broad", " A", "D, E, F", false); // check("Narrow", " A", "D, E, F", false); // check("Identical", " A", "D, E, F", false); // check("Related", " A", "D, E, F", false); // check("Broad", " A, B", "", true); // check("Narrow", " A, B", "", true); // check("Identical", " A, B", "", false); // check("Related", " A, B", "", true); // check("Broad", " A, B", "D", false); // check("Narrow", " A, B", "D", false); // check("Identical", " A, B", "D", false); // check("Related", " A, B", "D", false); // check("Broad", " A, B", "D, E", false); // check("Narrow", " A, B", "D, E", false); // check("Identical", " A, B", "D, E", false); // check("Related", " A, B", "D, E", false); // check("Broad", " A, B", "D, E, F", false); // check("Narrow", " A, B", "D, E, F", false); // check("Identical", " A, B", "D, E, F", false); // check("Related", " A, B", "D, E, F", false); // check("Broad", " A, B, C", "", true); // check("Narrow", " A, B, C", "", true); // check("Identical", " A, B, C", "", false); // check("Related", " A, B, C", "", true); // check("Broad", " A, B, C", "D", false); // check("Narrow", " A, B, C", "D", false); // check("Identical", " A, B, C", "D", false); // check("Related", " A, B, C", "D", false); // check("Broad", " A, B, C", "D, E", false); // check("Narrow", " A, B, C", "D, E", false); // check("Identical", " A, B, C", "D, E", false); // check("Related", " A, B, C", "D, E", false); // check("Broad", " A, B, C", "D, E, F", false); // check("Narrow", " A, B, C", "D, E, F", false); // check("Identical", " A, B, C", "D, E, F", false); // check("Related", " A, B, C", "D, E, F", false); // } public void checkApplicableInContextDecider(String scope, String context, boolean res) { DeciderIF decider = new ApplicableInContextDecider(makeContext(context)); assertTrue(decider + " decider got wrong result: " + scope + "/" + context, decider.ok(makeScoped(scope)) == res); } public void checkSuperOfContextDecider(String scope, String context, boolean res) { DeciderIF decider = new SupersetOfContextDecider(makeContext(context)); assertTrue(decider + " decider got wrong result: " + scope + "/" + context, decider.ok(makeScoped(scope)) == res); } public void checkSubOfContextDecider(String scope, String context, boolean res) { DeciderIF decider = new SubsetOfContextDecider(makeContext(context)); assertTrue(decider + " decider got wrong result: " + scope + "/" + context, decider.ok(makeScoped(scope)) == res); } public void checkIntersectionOfContextDecider(String scope, String context, boolean res) { DeciderIF decider = new IntersectionOfContextDecider(makeContext(context)); assertTrue(decider + " decider got wrong result: " + scope + "/" + context, decider.ok(makeScoped(scope)) == res); } public void testApplicableInContextDecider() { checkApplicableInContextDecider("", "", true); checkApplicableInContextDecider("", "A", true); checkApplicableInContextDecider("", "A, B", true); checkApplicableInContextDecider("A", "", true); checkApplicableInContextDecider("A", "A", true); checkApplicableInContextDecider("A", "A, B", false); checkApplicableInContextDecider("A, B", "", true); checkApplicableInContextDecider("A, B", "A", true); checkApplicableInContextDecider("A, B", "A, B", true); } public void testSuperOfContextDecider() { checkSuperOfContextDecider("", "", true); checkSuperOfContextDecider("", "A", false); checkSuperOfContextDecider("", "A, B", false); checkSuperOfContextDecider("A", "", true); checkSuperOfContextDecider("A", "A", true); checkSuperOfContextDecider("A", "A, B", false); checkSuperOfContextDecider("A, B", "", true); checkSuperOfContextDecider("A, B", "A", true); checkSuperOfContextDecider("A, B", "A, B", true); } public void testSubOfContextDecider() { checkSubOfContextDecider("", "", true); checkSubOfContextDecider("", "A", true); checkSubOfContextDecider("", "A, B", true); checkSubOfContextDecider("A", "", false); checkSubOfContextDecider("A", "A", true); checkSubOfContextDecider("A", "A, B", true); checkSubOfContextDecider("A, B", "", false); checkSubOfContextDecider("A, B", "A", false); checkSubOfContextDecider("A, B", "A, B", true); } public void testIntersectionOfContextDecider() { checkIntersectionOfContextDecider("", "", false); checkIntersectionOfContextDecider("", "A", false); checkIntersectionOfContextDecider("", "A, B", false); checkIntersectionOfContextDecider("A", "", false); checkIntersectionOfContextDecider("A", "A", true); checkIntersectionOfContextDecider("A", "A, B", true); checkIntersectionOfContextDecider("A, B", "", false); checkIntersectionOfContextDecider("A, B", "A", true); checkIntersectionOfContextDecider("A, B", "A, B", true); } // --- Helper classes public static class Scoped implements ScopedIF { Collection scope; Scoped(Collection scope) { this.scope = scope; } public Collection getScope() { return scope; } public void addTheme(TopicIF theme) { scope.add(theme); } public void removeTheme(TopicIF theme) { scope.remove(theme); } public String getObjectId() {return "";} public boolean isReadOnly() {return false;} public TopicMapIF getTopicMap() {return null;} public Collection getItemIdentifiers() {return Collections.EMPTY_SET;} public void addItemIdentifier(LocatorIF source_locator) { } public void removeItemIdentifier(LocatorIF source_locator) { } public void remove() { } } }