diff --git a/source/Gossip-Tests/GossipListValueTest.class.st b/source/Gossip-Tests/GossipListValueTest.class.st new file mode 100644 index 0000000..4a47012 --- /dev/null +++ b/source/Gossip-Tests/GossipListValueTest.class.st @@ -0,0 +1,61 @@ +Class { + #name : 'GossipListValueTest', + #superclass : 'TestCase', + #category : 'Gossip-Tests', + #package : 'Gossip-Tests' +} + +{ #category : 'as yet unclassified' } +GossipListValueTest >> testAddMakesItemPresent [ + | lv | + lv := GossipListValue new. + lv add: #a. + self assert: (lv includes: #a). + self assert: lv presentItems asArray equals: #(#a) +] + +{ #category : 'as yet unclassified' } +GossipListValueTest >> testGcTombstonesOlderThanKeepsRecentTombstones [ + | lv | + lv := GossipListValue new. + lv add: #a. + lv remove: #a. + lv add: #b. + lv gcTombstonesOlderThan: 5. + self assert: (lv entries includesKey: #a) +] + +{ #category : 'as yet unclassified' } +GossipListValueTest >> testGcTombstonesOlderThanNeverRemovesPresentItems [ + | lv | + lv := GossipListValue new. + lv add: #a. + lv add: #b. + lv add: #c. + lv gcTombstonesOlderThan: 0. + self assert: (lv entries includesKey: #a). + self assert: lv presentItems asSortedCollection asArray equals: #(#a #b #c) +] + +{ #category : 'as yet unclassified' } +GossipListValueTest >> testGcTombstonesOlderThanRemovesOldTombstones [ + | lv | + lv := GossipListValue new. + lv add: #a. + lv remove: #a. + lv add: #b. + lv add: #c. + lv gcTombstonesOlderThan: 1. + self deny: (lv entries includesKey: #a) +] + +{ #category : 'as yet unclassified' } +GossipListValueTest >> testRemoveTombstonesRatherThanDeletes [ + | lv | + lv := GossipListValue new. + lv add: #a. + lv remove: #a. + self deny: (lv includes: #a). + self assert: lv presentItems isEmpty. + self assert: (lv entries includesKey: #a) +] diff --git a/source/Gossip/GossipListValue.class.st b/source/Gossip/GossipListValue.class.st index 8ac0017..f17ca05 100644 --- a/source/Gossip/GossipListValue.class.st +++ b/source/Gossip/GossipListValue.class.st @@ -19,6 +19,12 @@ GossipListValue >> entries [ ^ entries ] +{ #category : 'as yet unclassified' } +GossipListValue >> gcTombstonesOlderThan: aVersionGap [ + entries := entries reject: [ :pair | + pair first not and: [ (versionCounter - pair second) > aVersionGap ] ] +] + { #category : 'not defined protocol' } GossipListValue >> includes: anItem [ ^ (entries at: anItem ifAbsent: [ ^ false ]) first