diff --git a/usvm-util/src/main/kotlin/org/usvm/algorithms/DeterministicPriorityCollection.kt b/usvm-util/src/main/kotlin/org/usvm/algorithms/DeterministicPriorityCollection.kt index af9eb77830..844a16487c 100644 --- a/usvm-util/src/main/kotlin/org/usvm/algorithms/DeterministicPriorityCollection.kt +++ b/usvm-util/src/main/kotlin/org/usvm/algorithms/DeterministicPriorityCollection.kt @@ -44,7 +44,7 @@ class DeterministicPriorityCollection(private val comparator: Compa assert({ !priorityQueue.any { (e, _) -> e == element } }) { "Element already exists in priority queue" } val currentTop = topElement - if (currentTop != null && comparator.compare(currentTop.second, priority) < 0) { + if (currentTop != null && comparator.compare(currentTop.second, priority) > 0) { topElement = element to priority priorityQueue.add(currentTop) return diff --git a/usvm-util/src/test/kotlin/org/usvm/algorithms/DeterministicPriorityCollectionTest.kt b/usvm-util/src/test/kotlin/org/usvm/algorithms/DeterministicPriorityCollectionTest.kt new file mode 100644 index 0000000000..c5d182a099 --- /dev/null +++ b/usvm-util/src/test/kotlin/org/usvm/algorithms/DeterministicPriorityCollectionTest.kt @@ -0,0 +1,62 @@ +package org.usvm.algorithms + +import org.junit.jupiter.api.Test +import kotlin.test.assertEquals + +internal class DeterministicPriorityCollectionTest { + @Test + fun `adding a worse priority keeps the cached minimum`() { + val collection = DeterministicPriorityCollection(naturalOrder()) + collection.add(element = "first", priority = 1) + assertEquals("first", collection.peek()) + + collection.add(element = "second", priority = 2) + + assertEquals("first", collection.peek()) + collection.remove("first") + assertEquals("second", collection.peek()) + assertEquals(1, collection.count) + } + + @Test + fun `adding a better priority replaces the cached minimum`() { + val collection = DeterministicPriorityCollection(naturalOrder()) + collection.add(element = "second", priority = 2) + assertEquals("second", collection.peek()) + + collection.add(element = "first", priority = 1) + + assertEquals("first", collection.peek()) + collection.remove("first") + assertEquals("second", collection.peek()) + assertEquals(1, collection.count) + } + + @Test + fun `adding a worse priority keeps the cached maximum with reverse order`() { + val collection = DeterministicPriorityCollection(reverseOrder()) + collection.add(element = "first", priority = 2) + assertEquals("first", collection.peek()) + + collection.add(element = "second", priority = 1) + + assertEquals("first", collection.peek()) + collection.remove("first") + assertEquals("second", collection.peek()) + assertEquals(1, collection.count) + } + + @Test + fun `adding a better priority replaces the cached maximum with reverse order`() { + val collection = DeterministicPriorityCollection(reverseOrder()) + collection.add(element = "second", priority = 1) + assertEquals("second", collection.peek()) + + collection.add(element = "first", priority = 2) + + assertEquals("first", collection.peek()) + collection.remove("first") + assertEquals("second", collection.peek()) + assertEquals(1, collection.count) + } +}