public void Capacity_is_never_exceeded_when_there_are_duplicates() { var pool = new DistinctValueSortedPool <int, WithFinalizer>(Capacity, (t1, t2) => { int t1Oddity = t1.Index % 2; int t2Oddity = t2.Index % 2; if (t1Oddity.CompareTo(t2Oddity) != 0) { return(t1Oddity.CompareTo(t2Oddity)); } return(t1.Index.CompareTo(t2.Index)); }, new WithFinalizerComparer()); int capacityMultiplier = 10; for (int i = 0; i < Capacity * capacityMultiplier; i++) { WithFinalizer newOne = new WithFinalizer(i % (Capacity * 2)); pool.TryInsert(newOne.Index, newOne); } CollectAndFinalize(); _finalizedCount.Should().BeLessOrEqualTo(Capacity * (capacityMultiplier - 1)); _allCount.Should().Be(Capacity * capacityMultiplier); pool.Count.Should().Be(Capacity); }
public void Capacity_is_never_exceeded() { var pool = new DistinctValueSortedPool <int, WithFinalizer>(Capacity, (t1, t2) => { int t1Oddity = t1.Index % 2; int t2Oddity = t2.Index % 2; if (t1Oddity.CompareTo(t2Oddity) != 0) { return(t1Oddity.CompareTo(t2Oddity)); } return(t1.Index.CompareTo(t2.Index)); }, new WithFinalizerComparer()); int capacityMultiplier = 10; int expectedAllCount = Capacity * capacityMultiplier; WithFinalizer newOne; for (int i = 0; i < expectedAllCount; i++) { newOne = new WithFinalizer(); pool.TryInsert(newOne.Index, newOne); } newOne = null; CollectAndFinalize(); _allCount.Should().Be(expectedAllCount); _finalizedCount.Should().BeLessOrEqualTo(expectedAllCount - Capacity); pool.Count.Should().Be(Capacity); }
public async Task Capacity_is_never_exceeded_with_multiple_threads() { int capacityMultiplier = 10; _finalizedCount.Should().Be(0); _allCount.Should().Be(0); var pool = new DistinctValueSortedPool <int, WithFinalizer>(Capacity, (t1, t2) => { int t1Oddity = t1.Index % 2; int t2Oddity = t2.Index % 2; if (t1Oddity.CompareTo(t2Oddity) != 0) { return(t1Oddity.CompareTo(t2Oddity)); } return(t1.Index.CompareTo(t2.Index)); }, new WithFinalizerComparer()); void KeepGoing(int iterations) { for (int i = 0; i < iterations; i++) { if (i % 3 == 2) { pool.TryRemove(i - 1, out _); } pool.TryInsert(i, new WithFinalizer(i)); if (i % 3 == 1) { pool.GetSnapshot(); } } } Task a = new Task(() => KeepGoing(Capacity * capacityMultiplier)); Task b = new Task(() => KeepGoing(Capacity * capacityMultiplier)); Task c = new Task(() => KeepGoing(Capacity * capacityMultiplier)); a.Start(); b.Start(); c.Start(); await Task.WhenAll(a, b, c); CollectAndFinalize(); int expectedAllCount = Capacity * capacityMultiplier * 3; _allCount.Should().Be(expectedAllCount); _finalizedCount.Should().BeGreaterOrEqualTo(expectedAllCount - Capacity); }
public void Distinct_transactions_are_all_added(Transaction[] transactions, int expectedCount) { var pool = new DistinctValueSortedPool <Keccak, Transaction>(Capacity, (t1, t2) => t1.GasPrice.CompareTo(t2.GasPrice), PendingTransactionComparer.Default); foreach (var transaction in transactions) { pool.TryInsert(transaction.Hash, transaction); } pool.Count.Should().Be(expectedCount); }
public void Same_transactions_are_all_replaced_with_highest_gas_price(bool gasPriceAscending) { var pool = new DistinctValueSortedPool <Keccak, Transaction>(Capacity, (t1, t2) => t1.GasPrice.CompareTo(t2.GasPrice), PendingTransactionComparer.Default); var transactions = gasPriceAscending ? GenerateTransactions(address: TestItem.AddressB, nonce: 3).OrderBy(t => t.GasPrice) : GenerateTransactions(address: TestItem.AddressB, nonce: 3).OrderByDescending(t => t.GasPrice); foreach (var transaction in transactions) { pool.TryInsert(transaction.Hash, transaction); } pool.Count.Should().Be(1); pool.GetSnapshot().First().GasPrice.Should().Be(Capacity - 1); }