public static void TestFloatInitialize()
        {
            var field = default(float);

            var init = InterlockedOperations.Initialize(ref field, 1.0f);

            Assert.That(init, Is.EqualTo(1.0f));
            Assert.That(field, Is.EqualTo(1.0f));

            init = InterlockedOperations.Initialize(ref field, 2.0f);
            Assert.That(init, Is.EqualTo(1.0f));
            Assert.That(field, Is.EqualTo(1.0f));

            init = InterlockedOperations.Initialize(ref field, 2.0f, 1.0f);
            Assert.That(init, Is.EqualTo(2.0f));
            Assert.That(field, Is.EqualTo(2.0f));

            init = InterlockedOperations.Initialize(ref field, 1.0f, default(float));
            Assert.That(init, Is.EqualTo(2.0f));
            Assert.That(field, Is.EqualTo(2.0f));

            init = InterlockedOperations.Initialize(ref field, 1.0f, 2.0f);
            Assert.That(init, Is.EqualTo(1.0f));
            Assert.That(field, Is.EqualTo(1.0f));
        }
        public static void TestDoubleUpdate()
        {
            const int count = 1000;
            var       field = default(double);
            var       a     = 1.0;
            var       b     = 2.0;

            var updated = InterlockedOperations.Update(ref field, t => a);

            Assert.That(updated, Is.EqualTo(a));
            Assert.That(field, Is.EqualTo(a));

            updated = InterlockedOperations.Update(ref field, b, (t1, t2) => t1 + t2);
            Assert.That(updated, Is.EqualTo(a + b));
            Assert.That(field, Is.EqualTo(a + b));

            var sum = default(double);

            for (int i = 0; i < count; i++)
            {
                sum += a;
            }

            field = default(double);
            Parallel.For(
                0, count,
                i => InterlockedOperations.Update(ref field, a, (t1, t2) => t1 + t2));
            Assert.That(field, Is.EqualTo(sum));
        }
        public static void TestStringInitialize()
        {
            var field = default(string);

            var init = InterlockedOperations.Initialize(ref field, "A");

            Assert.That(init, Is.EqualTo("A"));
            Assert.That(field, Is.EqualTo("A"));

            init = InterlockedOperations.Initialize(ref field, "B");
            Assert.That(init, Is.EqualTo("A"));
            Assert.That(field, Is.EqualTo("A"));

            init = InterlockedOperations.Initialize(ref field, "B", "A");
            Assert.That(init, Is.EqualTo("B"));
            Assert.That(field, Is.EqualTo("B"));

            init = InterlockedOperations.Initialize(ref field, "A", default(string));
            Assert.That(init, Is.EqualTo("B"));
            Assert.That(field, Is.EqualTo("B"));

            init = InterlockedOperations.Initialize(ref field, "A", "B");
            Assert.That(init, Is.EqualTo("A"));
            Assert.That(field, Is.EqualTo("A"));
        }
        public static void TestDoubleInitialize()
        {
            var field = default(double);

            var init = InterlockedOperations.Initialize(ref field, 1.0);

            Assert.That(init, Is.EqualTo(1.0));
            Assert.That(field, Is.EqualTo(1.0));

            init = InterlockedOperations.Initialize(ref field, 2.0);
            Assert.That(init, Is.EqualTo(1.0));
            Assert.That(field, Is.EqualTo(1.0));

            init = InterlockedOperations.Initialize(ref field, 2.0, 1.0);
            Assert.That(init, Is.EqualTo(2.0));
            Assert.That(field, Is.EqualTo(2.0));

            init = InterlockedOperations.Initialize(ref field, 1.0, default(double));
            Assert.That(init, Is.EqualTo(2.0));
            Assert.That(field, Is.EqualTo(2.0));

            init = InterlockedOperations.Initialize(ref field, 1.0, 2.0);
            Assert.That(init, Is.EqualTo(1.0));
            Assert.That(field, Is.EqualTo(1.0));
        }
        public static void TestLongInitialize()
        {
            var field = default(long);

            var init = InterlockedOperations.Initialize(ref field, 1L);

            Assert.That(init, Is.EqualTo(1L));
            Assert.That(field, Is.EqualTo(1L));

            init = InterlockedOperations.Initialize(ref field, 2L);
            Assert.That(init, Is.EqualTo(1L));
            Assert.That(field, Is.EqualTo(1L));

            init = InterlockedOperations.Initialize(ref field, 2L, 1L);
            Assert.That(init, Is.EqualTo(2L));
            Assert.That(field, Is.EqualTo(2L));

            init = InterlockedOperations.Initialize(ref field, 1L, default(long));
            Assert.That(init, Is.EqualTo(2L));
            Assert.That(field, Is.EqualTo(2L));

            init = InterlockedOperations.Initialize(ref field, 1L, 2L);
            Assert.That(init, Is.EqualTo(1L));
            Assert.That(field, Is.EqualTo(1L));
        }
        public static void TestIntInitialize()
        {
            var field = default(int);

            var init = InterlockedOperations.Initialize(ref field, 1);

            Assert.That(init, Is.EqualTo(1));
            Assert.That(field, Is.EqualTo(1));

            init = InterlockedOperations.Initialize(ref field, 2);
            Assert.That(init, Is.EqualTo(1));
            Assert.That(field, Is.EqualTo(1));

            init = InterlockedOperations.Initialize(ref field, 2, 1);
            Assert.That(init, Is.EqualTo(2));
            Assert.That(field, Is.EqualTo(2));

            init = InterlockedOperations.Initialize(ref field, 1, default(int));
            Assert.That(init, Is.EqualTo(2));
            Assert.That(field, Is.EqualTo(2));

            init = InterlockedOperations.Initialize(ref field, 1, 2);
            Assert.That(init, Is.EqualTo(1));
            Assert.That(field, Is.EqualTo(1));
        }