コード例 #1
0
        public void IndexTrackerLockThreadPotentiallyAfter()
        {
            var tracker = new ListCollectionIndexOffsetTracker <int>();

            tracker.SetOriginalIndexAndResetCurrent(1);

            Assert.That(tracker.CurrentIndex, Is.EqualTo(1));
            Assert.That(tracker.OriginalIndex, Is.EqualTo(1));

            tracker.ApplyContextLock(t =>
            {
                t.SetOriginalIndexAndResetCurrent(t.CurrentIndex + 1);
            });

            // We'll skip mid-tests to ensure there's a chance a lock contention would occur

            var state = Task.Run(() =>
            {
                tracker.HandleEvent(null, ListCollectionEventArgs <int> .CreateInsertEvent(0, 5)); // Should happen after or as close to the set operation as possible (high chance it will happen after)
                return(0);
            }).ContinueWith(execState =>
            {
                var eState = execState.Result;
                Assert.That(eState, Is.Zero);

                Assert.That(tracker.CurrentIndex, Is.EqualTo(3));
                Assert.That(tracker.OriginalIndex, Is.EqualTo(2));

                return(eState + 1);
            }).Result;

            Assert.That(state, Is.EqualTo(1)); // We do this test to ensure that the ContinueWith is always executed. There may be task continuation options to enforce this, but it's probably easier to understand "the state will only be correct if ContinueWith is executed"
        }
コード例 #2
0
        public void IndexTrackerLockThreadEnforceBefore()
        {
            var tracker = new ListCollectionIndexOffsetTracker <int>();

            tracker.SetOriginalIndexAndResetCurrent(1);

            Assert.That(tracker.CurrentIndex, Is.EqualTo(1));
            Assert.That(tracker.OriginalIndex, Is.EqualTo(1));

            tracker.HandleEvent(null, ListCollectionEventArgs <int> .CreateInsertEvent(0, 5));

            Assert.That(tracker.CurrentIndex, Is.EqualTo(2));
            Assert.That(tracker.OriginalIndex, Is.EqualTo(1));

            tracker.ApplyContextLock(t =>
            {
                t.SetOriginalIndexAndResetCurrent(t.CurrentIndex + 1);
            });
            Assert.That(tracker.CurrentIndex, Is.EqualTo(3));
            Assert.That(tracker.OriginalIndex, Is.EqualTo(3));
        }