/* * Copyright 2015-present Open Networking Laboratory * * 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 org.onlab.util; import java.util.Objects; import org.junit.Test; import com.google.common.collect.Maps; import static org.junit.Assert.*; /** * Unit tests for ExtendedSet. */ public class ExtendedSetTest { @Test public void testGet() { ExtendedSet<TestValue> set = new ExtendedSet<>(Maps.newConcurrentMap()); TestValue e1 = new TestValue("foo", 1); set.add(e1); TestValue lookupValue = new TestValue("foo", 2); TestValue setEntry = set.get(lookupValue); assertEquals(e1, setEntry); } @Test public void testInsertOrReplace() { ExtendedSet<TestValue> set = new ExtendedSet<>(Maps.newConcurrentMap()); TestValue small = new TestValue("foo", 1); TestValue medium = new TestValue("foo", 2); TestValue large = new TestValue("foo", 3); // input TestValue will replace existing TestValue if its value2() is greater // than existing entry's value2() assertTrue(set.insertOrReplace(small, existing -> existing.value2() < small.value2())); assertTrue(set.insertOrReplace(large, existing -> existing.value2() < large.value2())); assertFalse(set.insertOrReplace(medium, existing -> existing.value2() < medium.value2())); assertTrue(set.contains(small)); assertTrue(set.contains(medium)); assertTrue(set.contains(large)); } @Test public void testConditionalRemove() { ExtendedSet<TestValue> set = new ExtendedSet<>(Maps.newConcurrentMap()); TestValue small = new TestValue("foo", 1); TestValue medium = new TestValue("foo", 2); assertTrue(set.add(small)); set.conditionalRemove(medium, existing -> existing.value2() < medium.value2); assertFalse(set.contains(small)); } private class TestValue { private String value1; private int value2; public TestValue(String v1, int v2) { this.value1 = v1; this.value2 = v2; } public String value1() { return value1; } public int value2() { return value2; } @Override public boolean equals(Object other) { if (other instanceof TestValue) { TestValue that = (TestValue) other; return Objects.equals(value1, that.value1); } return false; } @Override public int hashCode() { return Objects.hash(value1); } } }