/* * #! * 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.utils; import java.util.Collections; import junit.framework.TestCase; public class UniqueSetTest extends TestCase { // This class does not subclass CompactHashSetTest because the set // implementation is immutable. public UniqueSetTest(String name) { super(name); } public void setUp() { } protected void tearDown() { } // --- Test cases public void testUniqueSetGarbageCollect() { UniqueSet setpool = new UniqueSet(); assertTrue("Set pool is not empty", setpool.size() == 0 && setpool.isEmpty()); // Make sure that sets are garbage collected when no longer referenced boolean dereference = true; int times = 3; for (int i=0; i < times; i++) { UniqueSet emptyset1 = setpool.get(Collections.EMPTY_SET); assertTrue("emptyset1 is not empty", emptyset1.size() == 0 && emptyset1.isEmpty()); // adding first element should return new set: [a] UniqueSet setA1 = setpool.add(emptyset1, "a", dereference); assertTrue("setA1 is incorrect", setA1.size() == 1 && setA1.contains("a")); // adding existing element should return same set: [a] UniqueSet setA2 = setpool.add(setA1, "a", dereference); assertTrue("!CollectionUtils.equalsUnorderedSet(setA1, setA2)", CollectionUtils.equalsUnorderedSet(setA1, setA2)); // adding second element should return new set: [a,b] UniqueSet setAB1 = setpool.add(setA2, "b", dereference); assertTrue("setAB1.size() != 2", setAB1.size() == 2); assertTrue("!setAB1.contains('a')", setAB1.contains("a")); assertTrue("!setAB1.contains('b')", setAB1.contains("b")); // adding third element should return new set: [a,b,c] UniqueSet setABC1 = setpool.add(setAB1, "c", dereference); assertTrue("setABC1.size() != 3", setABC1.size() == 3); assertTrue("!setABC1.contains('a')", setABC1.contains("a")); assertTrue("!setABC1.contains('b')", setABC1.contains("b")); assertTrue("!setABC1.contains('c')", setABC1.contains("c")); // removing third element should return setAB1: [a,b] UniqueSet setAB2 = setpool.remove(setABC1, "c", dereference); assertTrue("!CollectionUtils.equalsUnorderedSet(setAB1, setAB2)", CollectionUtils.equalsUnorderedSet(setAB1, setAB2)); // removing second element should return setA1: [a] UniqueSet setA3 = setpool.remove(setAB1, "b", dereference); assertTrue("!CollectionUtils.equalsUnorderedSet(setA3, setA1)", CollectionUtils.equalsUnorderedSet(setA3, setA1)); // removing first element should return emptyset1: [] UniqueSet emptyset2 = setpool.remove(setA3, "a", dereference); assertTrue("!CollectionUtils.equalsUnorderedSet(emptyset2, emptyset1)", CollectionUtils.equalsUnorderedSet(emptyset2, emptyset1)); // emptyset1 and setAB2 should still be in setpool // FIXME: This test fails occationally (bug #674) assertTrue("setpool.size() != 2", setpool.size() == 2); // dereference setAB2, and check that setpool is empty setpool.dereference(setAB2); assertTrue("setpool.size() != 1", setpool.size() == 1); // dereference emptyset1, and check that setpool is empty setpool.dereference(emptyset2); assertTrue("setpool.size() != 0", setpool.size() == 0 && setpool.isEmpty()); } } public void testUniqueSetNoGarbageCollect() { UniqueSet setpool = new UniqueSet(); assertTrue("Set pool is not empty", setpool.size() == 0 && setpool.isEmpty()); // Make sure that sets are not dereferenced boolean dereference = false; int times = 3; for (int i=0; i < times; i++) { UniqueSet emptyset1 = setpool.get(Collections.EMPTY_SET); assertTrue("emptyset1 is not empty", emptyset1.size() == 0 && emptyset1.isEmpty()); // adding first element should return new set: [a] UniqueSet setA1 = setpool.add(emptyset1, "a", dereference); assertTrue("setA1 is incorrect", setA1.size() == 1 && setA1.contains("a")); // adding existing element should return same set: [a] UniqueSet setA2 = setpool.add(setA1, "a", dereference); assertTrue("setA1 != setA2", setA1 == setA2); // adding second element should return new set: [a,b] UniqueSet setAB1 = setpool.add(setA2, "b", dereference); assertTrue("setAB1.size() != 2", setAB1.size() == 2); assertTrue("!setAB1.contains('a')", setAB1.contains("a")); assertTrue("!setAB1.contains('b')", setAB1.contains("b")); // adding third element should return new set: [a,b,c] UniqueSet setABC1 = setpool.add(setAB1, "c", dereference); assertTrue("setABC1.size() != 3", setABC1.size() == 3); assertTrue("!setABC1.contains('a')", setABC1.contains("a")); assertTrue("!setABC1.contains('b')", setABC1.contains("b")); assertTrue("!setABC1.contains('c')", setABC1.contains("c")); // removing third element should return setAB1: [a,b] UniqueSet setAB2 = setpool.remove(setABC1, "c", dereference); assertTrue("setAB2 != setAB1 " + setAB2 + ":" + setAB1, setAB2 == setAB1); // removing second element should return setA1: [a] UniqueSet setA3 = setpool.remove(setAB1, "b", dereference); assertTrue("setA3 != setA1", setA3 == setA1); // removing first element should return emptyset1: [] UniqueSet emptyset2 = setpool.remove(setA3, "a", dereference); assertTrue("emptyset2 != emptyset1", emptyset2 == emptyset1); } } }