public void Assert_Coherency_TrySwap()
        {
            const int NumIterations = 1_000_000;

            var runner = NewRunner(new DummyImmutableRef(0L));

            runner.AllThreadsTearDown = target => FastAssertEqual(NumIterations, target.Value.LongProp);
            runner.ExecuteFreeThreadedTests(
                target => {
                while (true)
                {
                    var curValue = target.Value;
                    if (curValue.LongProp == NumIterations)
                    {
                        return;
                    }
                    var newValue  = new DummyImmutableRef(curValue.LongProp + 1L);
                    var prevValue = target.TrySwap(newValue, curValue);
                    var wasSet    = prevValue.Equals(curValue);
                    var setValue  = wasSet ? newValue : prevValue;
                    if (wasSet)
                    {
                        FastAssertEqual(curValue, prevValue);
                        FastAssertEqual(newValue, setValue);
                    }
                    else
                    {
                        FastAssertNotEqual(curValue, prevValue);
                        FastAssertEqual(setValue, prevValue);
                    }
                }
            }
                );
            runner.AllThreadsTearDown = null;
        }
        public void FastTryExchange()
        {
            const int NumIterations = 1_000_000;

            var runner = NewRunner(new DummyImmutableRef(0L));

            // (T, T)
            runner.AllThreadsTearDown = target => AssertAreEqual(NumIterations, target.Value.LongProp);
            runner.ExecuteFreeThreadedTests(
                target => {
                while (true)
                {
                    var curValue = target.Value;
                    if (curValue.LongProp == NumIterations)
                    {
                        return;
                    }
                    var newValue  = new DummyImmutableRef(curValue.LongProp + 1L);
                    var prevValue = target.FastTryExchange(newValue, curValue);
                    var wasSet    = prevValue.Equals(curValue);
                    var setValue  = wasSet ? newValue : prevValue;
                    if (wasSet)
                    {
                        AssertAreEqualObjects(curValue, prevValue);
                        AssertAreEqualObjects(newValue, setValue);
                    }
                    else
                    {
                        AssertAreNotEqualObjects(curValue, prevValue);
                        AssertAreEqualObjects(setValue, prevValue);
                    }
                }
            }
                );
            runner.AllThreadsTearDown = null;
        }
示例#3
0
        public void TryExchangeWithContext()
        {
            const int NumIterations = 100_000;

            var runner = NewRunner(new DummyImmutableRef(0L));

            // Func(T, Func<T, T, TContext, bool>)
            runner.ExecuteContinuousCoherencyTests(
                target => {
                var curValue = target.Value;
                var newValue = new DummyImmutableRef(curValue.LongProp + 1L);
                target.TryExchange(newValue, (c, n, ctx) => c.LongProp == n.LongProp - ctx, 1L);
            },
                NumIterations,
                target => target.Value,
                (prev, cur) => FastAssertTrue(cur.LongProp >= prev.LongProp)
                );

            // (Func<T, TContext, T>, T)
            runner.AllThreadsTearDown = target => FastAssertEqual(NumIterations, target.Value.LongProp);
            runner.ExecuteFreeThreadedTests(
                target => {
                while (true)
                {
                    var curValue = target.Value;
                    if (curValue.LongProp == NumIterations)
                    {
                        return;
                    }
                    var(wasSet, prevValue, CurrentValue) = target.TryExchange((c, ctx) => new DummyImmutableRef(c.LongProp + ctx), 1L, curValue);
                    if (wasSet)
                    {
                        FastAssertEqual(curValue, prevValue);
                        FastAssertEqual((object)(prevValue.LongProp + 1L), CurrentValue.LongProp);
                    }
                    else
                    {
                        FastAssertNotEqual(curValue, prevValue);
                    }
                }
            }
                );
            runner.AllThreadsTearDown = null;

            // (Func<T, TContext, T>, Func<T, T, bool>)
            runner.ExecuteFreeThreadedTests(
                target => {
                var(wasSet, prevValue, CurrentValue) = target.TryExchange((c, ctx) => new DummyImmutableRef(c.LongProp + ctx), 1L, (c, n) => c.LongProp == n.LongProp - 1L);
                if (wasSet)
                {
                    AssertAreEqual(prevValue.LongProp + 1L, CurrentValue.LongProp);
                }
                else
                {
                    AssertAreNotEqual(prevValue.LongProp + 1L, CurrentValue.LongProp);
                }
            },
                NumIterations
                );

            // (Func<T, T>, Func<T, T, TContext, bool>)
            runner.ExecuteFreeThreadedTests(
                target => {
                var(wasSet, prevValue, CurrentValue) = target.TryExchange(c => new DummyImmutableRef(c.LongProp + 1L), (c, n, ctx) => c.LongProp == n.LongProp - ctx, 1L);
                if (wasSet)
                {
                    AssertAreEqual(prevValue.LongProp + 1L, CurrentValue.LongProp);
                }
                else
                {
                    AssertAreNotEqual(prevValue.LongProp + 1L, CurrentValue.LongProp);
                }
            },
                NumIterations
                );

            // (Func<T, TMapContext, T>, Func<T, T, TPredicateContext, bool>)
            runner.ExecuteFreeThreadedTests(
                target => {
                var(wasSet, prevValue, CurrentValue) = target.TryExchange((c, ctx) => new DummyImmutableRef(c.LongProp + (ctx - 1L)), 2L, (c, n, ctx) => c.LongProp == n.LongProp - ctx, 1L);
                if (wasSet)
                {
                    AssertAreEqual(prevValue.LongProp + 1L, CurrentValue.LongProp);
                }
                else
                {
                    AssertAreNotEqual(prevValue.LongProp + 1L, CurrentValue.LongProp);
                }
            },
                NumIterations
                );
        }
        public void Assert_Coherency_TrySet()
        {
            const int NumIterations = 1_000_000;

            var runner = NewRunner(new DummyImmutableRef(0L));

            runner.GlobalSetUp = (target, _) => target.Set(new DummyImmutableRef(0L));

            // bool TrySet(T newValue, Func<T, bool> setPredicate);
            runner.AllThreadsTearDown = target => {
                FastAssertEqual(NumIterations, target.Value.LongProp);
            };
            runner.ExecuteContinuousCoherencyTests(
                target => {
                while (true)
                {
                    var curValue = target.Value;
                    if (curValue.LongProp == NumIterations)
                    {
                        return;
                    }
                    var newValue = new DummyImmutableRef(curValue.LongProp + 1);
                    target.TrySet(newValue, v => v.LongProp + 1 == newValue.LongProp);
                    FastAssertTrue(target.Value.LongProp > curValue.LongProp);
                }
            },
                target => target.Value,
                (prev, cur) => {
                FastAssertTrue(cur.LongProp >= prev.LongProp);
            },
                v => v.LongProp == NumIterations
                );
            runner.AllThreadsTearDown = null;

            // bool TrySet(T newValue, Func<T, bool> setPredicate, out T previousValue);
            runner.AllThreadsTearDown = target => {
                FastAssertEqual(NumIterations, target.Value.LongProp);
            };
            runner.ExecuteFreeThreadedTests(
                target => {
                while (true)
                {
                    var curValue = target.Value;
                    if (curValue.LongProp == NumIterations)
                    {
                        return;
                    }
                    var newValue = new DummyImmutableRef(curValue.LongProp + 1);
                    var wasSet   = target.TrySet(newValue, v => v.LongProp + 1 == newValue.LongProp, out var prevValue);
                    if (wasSet)
                    {
                        FastAssertEqual(curValue, prevValue);
                    }
                    else
                    {
                        FastAssertNotEqual(curValue, prevValue);
                    }
                }
            }
                );
            runner.AllThreadsTearDown = null;

            // bool TrySet(Func<T, T> valueMapFunc, Func<T, bool> setPredicate);
            runner.AllThreadsTearDown = target => {
                FastAssertEqual(NumIterations, target.Value.LongProp);
            };
            runner.ExecuteFreeThreadedTests(
                target => {
                while (true)
                {
                    var curValue = target.Value;
                    if (curValue.LongProp == NumIterations)
                    {
                        return;
                    }
                    target.TrySet(v => new DummyImmutableRef(v.LongProp + 1), v => v == curValue);
                    FastAssertTrue(target.Value.LongProp > curValue.LongProp);
                }
            }
                );
            runner.AllThreadsTearDown = null;

            // bool TrySet(Func<T, T> valueMapFunc, Func<T, bool> setPredicate, out T previousValue);
            runner.AllThreadsTearDown = target => {
                FastAssertEqual(NumIterations, target.Value.LongProp);
            };
            runner.ExecuteFreeThreadedTests(
                target => {
                while (true)
                {
                    var curValue = target.Value;
                    if (curValue.LongProp == NumIterations)
                    {
                        return;
                    }
                    var wasSet = target.TrySet(v => new DummyImmutableRef(v.LongProp + 1), v => v == curValue, out var prevValue);
                    if (wasSet)
                    {
                        FastAssertEqual(curValue, prevValue);
                    }
                    else
                    {
                        FastAssertNotEqual(curValue, prevValue);
                    }
                }
            }
                );
            runner.AllThreadsTearDown = null;

            // bool TrySet(Func<T, T> valueMapFunc, Func<T, bool> setPredicate, out T previousValue, out T newValue);
            runner.AllThreadsTearDown = target => {
                FastAssertEqual(NumIterations, target.Value.LongProp);
            };
            runner.ExecuteFreeThreadedTests(
                target => {
                while (true)
                {
                    var curValue = target.Value;
                    if (curValue.LongProp == NumIterations)
                    {
                        return;
                    }
                    var wasSet = target.TrySet(v => new DummyImmutableRef(v.LongProp + 1), v => v == curValue, out var prevValue, out var newValue);
                    if (wasSet)
                    {
                        FastAssertEqual(curValue, prevValue);
                        FastAssertEqual(prevValue.LongProp + 1, newValue.LongProp);
                    }
                    else
                    {
                        FastAssertNotEqual(curValue, prevValue);
                        FastAssertEqual(prevValue, newValue);
                    }
                }
            }
                );
            runner.AllThreadsTearDown = null;

            // bool TrySet(Func<T, T> valueMapFunc, Func<T, T, bool> setPredicate);
            runner.AllThreadsTearDown = target => {
                FastAssertEqual(NumIterations, target.Value.LongProp);
            };
            runner.ExecuteFreeThreadedTests(
                target => {
                while (true)
                {
                    var curValue = target.Value;
                    if (curValue.LongProp == NumIterations)
                    {
                        return;
                    }
                    target.TrySet(v => new DummyImmutableRef(v.LongProp + 1), (c, n) => c.LongProp == curValue.LongProp && n.LongProp == c.LongProp + 1);
                    FastAssertTrue(target.Value.LongProp > curValue.LongProp);
                }
            }
                );
            runner.AllThreadsTearDown = null;

            // bool TrySet(Func<T, T> valueMapFunc, Func<T, T, bool> setPredicate, out T previousValue);
            runner.AllThreadsTearDown = target => {
                FastAssertEqual(NumIterations, target.Value.LongProp);
            };
            runner.ExecuteFreeThreadedTests(
                target => {
                while (true)
                {
                    var curValue = target.Value;
                    if (curValue.LongProp == NumIterations)
                    {
                        return;
                    }
                    var wasSet = target.TrySet(v => new DummyImmutableRef(v.LongProp + 1), (c, n) => c.LongProp == curValue.LongProp && n.LongProp == c.LongProp + 1, out var prevValue);
                    if (wasSet)
                    {
                        FastAssertEqual(curValue, prevValue);
                    }
                    else
                    {
                        FastAssertNotEqual(curValue, prevValue);
                    }
                }
            }
                );
            runner.AllThreadsTearDown = null;

            // bool TrySet(Func<T, T> valueMapFunc, Func<T, T, bool> setPredicate, out T previousValue, out T newValue);
            runner.AllThreadsTearDown = target => {
                FastAssertEqual(NumIterations, target.Value.LongProp);
            };
            runner.ExecuteFreeThreadedTests(
                target => {
                while (true)
                {
                    var curValue = target.Value;
                    if (curValue.LongProp == NumIterations)
                    {
                        return;
                    }
                    var wasSet = target.TrySet(v => new DummyImmutableRef(v.LongProp + 1), (c, n) => c.LongProp == curValue.LongProp && n.LongProp == c.LongProp + 1, out var prevValue, out var newValue);
                    if (wasSet)
                    {
                        FastAssertEqual(curValue, prevValue);
                        FastAssertEqual(prevValue.LongProp + 1, newValue.LongProp);
                    }
                    else
                    {
                        FastAssertNotEqual(curValue, prevValue);
                        FastAssertEqual(prevValue, newValue);
                    }
                }
            }
                );
            runner.AllThreadsTearDown = null;
        }