private void TestTryAddGetRemoveUnspentTxOutput(ITestStorageProvider provider)
{
var random = new Random();
var txOutput0Key = new TxOutputKey(UInt256.Zero, 0);
var txOutput0 = new TxOutput(0, random.NextBytes(100).ToImmutableArray());
var txOutput1Key = new TxOutputKey(UInt256.One, 1);
var txOutput1 = new TxOutput(1, random.NextBytes(100).ToImmutableArray());
using (var storageManager = provider.OpenStorageManager())
using (var handle = storageManager.OpenChainStateCursor())
{
var chainStateCursor = handle.Item;
// begin transaction
chainStateCursor.BeginTransaction();
// verify initial empty state
TxOutput actualTxOutput0, actualTxOutput1;
Assert.IsFalse(chainStateCursor.TryGetUnspentTxOutput(txOutput0Key, out actualTxOutput0));
Assert.IsFalse(chainStateCursor.TryGetUnspentTxOutput(txOutput1Key, out actualTxOutput1));
// add unspent tx 0
Assert.IsTrue(chainStateCursor.TryAddUnspentTxOutput(txOutput0Key, txOutput0));
// verify unspent txes
Assert.IsTrue(chainStateCursor.TryGetUnspentTxOutput(txOutput0Key, out actualTxOutput0));
Assert.AreEqual(txOutput0, actualTxOutput0);
Assert.IsFalse(chainStateCursor.TryGetUnspentTxOutput(txOutput1Key, out actualTxOutput1));
// add unspent tx 1
Assert.IsTrue(chainStateCursor.TryAddUnspentTxOutput(txOutput1Key, txOutput1));
// verify unspent txes
Assert.IsTrue(chainStateCursor.TryGetUnspentTxOutput(txOutput0Key, out actualTxOutput0));
Assert.AreEqual(txOutput0, actualTxOutput0);
Assert.IsTrue(chainStateCursor.TryGetUnspentTxOutput(txOutput1Key, out actualTxOutput1));
Assert.AreEqual(txOutput1, actualTxOutput1);
// remove unspent tx 1
Assert.IsTrue(chainStateCursor.TryRemoveUnspentTxOutput(txOutput1Key));
// verify unspent txes
Assert.IsTrue(chainStateCursor.TryGetUnspentTxOutput(txOutput0Key, out actualTxOutput0));
Assert.AreEqual(txOutput0, actualTxOutput0);
Assert.IsFalse(chainStateCursor.TryGetUnspentTxOutput(txOutput1Key, out actualTxOutput1));
// remove unspent tx 0
Assert.IsTrue(chainStateCursor.TryRemoveUnspentTxOutput(txOutput0Key));
// verify unspent txes
Assert.IsFalse(chainStateCursor.TryGetUnspentTxOutput(txOutput0Key, out actualTxOutput0));
Assert.IsFalse(chainStateCursor.TryGetUnspentTxOutput(txOutput1Key, out actualTxOutput1));
}
}