# Verify these invariantLs: # No overlapping ranges. # Size should reflect what's currently in the queue. # Empty queue should return nil. # Oldest element should be removed first. # Remove from empty queue. # Removing from the empty queue should return nil. create ---- (success) print-size ---- 0 remove-compaction ---- (nil) # Add to empty queue. create ---- (success) add-compaction L5: a-e 1 ---- print-size ---- 1 remove-compaction ---- L5: a-e 1 print-size ---- 0 remove-compaction ---- (nil) # No intersection in a non-full queue. create ---- (success) add-compaction L5: a-e 1 ---- print-queue ---- L5: a-e 1 add-compaction L5: g-k 2 ---- print-queue ---- L5: a-e 1 L5: g-k 2 print-size ---- 2 remove-compaction ---- L5: a-e 1 print-size ---- 1 remove-compaction ---- L5: g-k 2 print-size ---- 0 # No intersection in a full queue. # This adds a compaction once the queue is already full. # This new compaction doesn't intersect with any compaction # already in the queue, so the oldest element is evicted. create ---- (success) add-compaction L5: a-e 1 ---- add-compaction L5: f-g 2 ---- add-compaction L5: k-m 3 ---- add-compaction L5: n-o 4 ---- add-compaction L5: p-r 5 ---- print-size ---- 5 print-queue ---- L5: a-e 1 L5: f-g 2 L5: k-m 3 L5: n-o 4 L5: p-r 5 add-compaction L4: t-u 6 ---- print-queue ---- L5: f-g 2 L5: k-m 3 L5: n-o 4 L5: p-r 5 L4: t-u 6 print-size ---- 5 # One intersection in a non-full queue. # Try intersections with intervals at # various positions in the queue, and examine # the state of the queue after. create ---- (success) add-compaction L5: a-e 1 ---- add-compaction L5: f-g 2 ---- add-compaction L5: k-m 3 ---- add-compaction L5: n-w 4 ---- # print-size ---- 4 print-queue ---- L5: a-e 1 L5: f-g 2 L5: k-m 3 L5: n-w 4 # Add interval which intersects with the first # interval in the queue. add-compaction L4: c-d 5 ---- print-queue ---- L5: f-g 2 L5: k-m 3 L5: n-w 4 L4: c-d 5 print-size ---- 4 # Add an interval which intersects with the last # element in the queue. add-compaction L3: a-d 6 ---- print-queue ---- L5: f-g 2 L5: k-m 3 L5: n-w 4 L3: a-d 6 print-size ---- 4 # Add an interval which intersects with an element in the # middle of the queue. add-compaction L3: u-z 7 ---- print-queue ---- L5: f-g 2 L5: k-m 3 L3: a-d 6 L3: u-z 7 print-size ---- 4 remove-compaction ---- L5: f-g 2 remove-compaction ---- L5: k-m 3 remove-compaction ---- L3: a-d 6 remove-compaction ---- L3: u-z 7 remove-compaction ---- (nil) # One intersection in a full queue. # We're doing some tests with full/non-full queues # because the logic for those cases is sometimes different. create ---- (success) add-compaction L5: a-e 1 ---- add-compaction L5: f-g 2 ---- add-compaction L5: k-m 3 ---- add-compaction L5: n-w 4 ---- add-compaction L5: x-z 5 ---- print-size ---- 5 print-queue ---- L5: a-e 1 L5: f-g 2 L5: k-m 3 L5: n-w 4 L5: x-z 5 # Add interval which intersects with the first # interval in the queue. add-compaction L4: c-d 6 ---- print-queue ---- L5: f-g 2 L5: k-m 3 L5: n-w 4 L5: x-z 5 L4: c-d 6 print-size ---- 5 # Add an interval which intersects with the last # element in the queue. add-compaction L3: a-d 6 ---- print-queue ---- L5: f-g 2 L5: k-m 3 L5: n-w 4 L5: x-z 5 L3: a-d 6 print-size ---- 5 # Add an interval which intersects with an element in the # middle of the queue. add-compaction L3: u-z 7 ---- print-queue ---- L5: f-g 2 L5: k-m 3 L3: a-d 6 L3: u-z 7 print-size ---- 4 remove-compaction ---- L5: f-g 2 remove-compaction ---- L5: k-m 3 remove-compaction ---- L3: a-d 6 remove-compaction ---- L3: u-z 7 remove-compaction ---- (nil) # More than one intersection in a non-full queue. create ---- (success) add-compaction L5: a-e 1 ---- add-compaction L5: f-g 2 ---- add-compaction L5: k-m 3 ---- add-compaction L5: n-w 4 ---- # print-size ---- 4 print-queue ---- L5: a-e 1 L5: f-g 2 L5: k-m 3 L5: n-w 4 # Add an interval with intersects with two elements of the queue. add-compaction L4: f-m 5 ---- print-queue ---- L5: a-e 1 L5: n-w 4 L4: f-m 5 print-size ---- 3 # Add an interval which clears the entire queue. add-compaction L3: a-z 6 ---- print-queue ---- L3: a-z 6 print-size ---- 1 remove-compaction ---- L3: a-z 6 remove-compaction ---- (nil) print-size ---- 0 # More than one intersection in a full queue. create ---- (success) add-compaction L5: a-e 1 ---- add-compaction L5: f-g 2 ---- add-compaction L5: k-m 3 ---- add-compaction L5: n-w 4 ---- add-compaction L3: y-z 5 ---- add-compaction L2: a-z 6 ---- print-queue ---- L2: a-z 6 print-size ---- 1 create ---- (success) add-compaction L5: a-e 1 ---- add-compaction L5: f-g 2 ---- add-compaction L5: k-m 3 ---- add-compaction L5: n-w 4 ---- add-compaction L3: y-z 5 ---- # Test multiple overlap which doesn't cover the entire full queue. add-compaction L2: o-y 6 ---- print-queue ---- L5: a-e 1 L5: f-g 2 L5: k-m 3 L2: o-y 6 remove-compaction ---- L5: a-e 1 remove-compaction ---- L5: f-g 2 remove-compaction ---- L5: k-m 3 remove-compaction ---- L2: o-y 6 remove-compaction ---- (nil) # Test a queue which becomes full, then empty, then fills up again. create ---- (success) add-compaction L5: a-e 1 ---- add-compaction L5: f-g 2 ---- add-compaction L5: k-m 3 ---- add-compaction L5: n-w 4 ---- add-compaction L3: y-z 5 ---- add-compaction L2: o-y 6 ---- print-queue ---- L5: a-e 1 L5: f-g 2 L5: k-m 3 L2: o-y 6 remove-compaction ---- L5: a-e 1 remove-compaction ---- L5: f-g 2 remove-compaction ---- L5: k-m 3 remove-compaction ---- L2: o-y 6 remove-compaction ---- (nil) add-compaction L5: a-e 1 ---- add-compaction L5: f-g 2 ---- add-compaction L5: k-m 3 ---- add-compaction L5: n-w 4 ---- print-queue ---- L5: a-e 1 L5: f-g 2 L5: k-m 3 L5: n-w 4 print-size ---- 4 # Test overlap once we refill the queue. add-compaction L4: b-l 5 ---- print-queue ---- L5: n-w 4 L4: b-l 5 print-size ---- 2