public void GetSet()
        {
            bool mark;
            AtomicMarkableReference <T> ai = new AtomicMarkableReference <T>(one, false);

            Assert.AreEqual(one, ai.Value);
            Assert.IsFalse(ai.IsMarked);
            Assert.AreEqual(one, ai.GetValue(out mark));
            Assert.IsFalse(mark);
            ai.SetNewAtomicValue(two, false);
            Assert.AreEqual(two, ai.Value);
            Assert.IsFalse(ai.IsMarked);
            Assert.AreEqual(two, ai.GetValue(out mark));
            Assert.IsFalse(mark);
            ai.SetNewAtomicValue(one, true);
            Assert.AreEqual(one, ai.Value);
            Assert.IsTrue(ai.IsMarked);
            Assert.AreEqual(one, ai.GetValue(out mark));
            Assert.IsTrue(mark);

            ai.SetNewAtomicValue(one, true);
            Assert.AreEqual(one, ai.Value);
            Assert.IsTrue(ai.IsMarked);
            Assert.AreEqual(one, ai.GetValue(out mark));
            Assert.IsTrue(mark);
        }
        public void AttemptMark()
        {
            bool mark;
            AtomicMarkableReference <T> ai = new AtomicMarkableReference <T>(one, false);

            Assert.IsFalse(ai.IsMarked, "Reference is marked.");
            Assert.IsTrue(ai.AttemptMark(one, true), "Reference was not marked");
            Assert.IsTrue(ai.IsMarked, "Reference is not marked.");
            Assert.AreEqual(one, ai.GetValue(out mark), "Reference does not equal.");
            Assert.IsTrue(mark, "Mark returned is false");
        }
        public void CompareAndSet()
        {
            bool mark;
            AtomicMarkableReference <T> ai = new AtomicMarkableReference <T>(one, false);

            Assert.AreEqual(one, ai.GetValue(out mark));
            Assert.IsFalse(ai.IsMarked);
            Assert.IsFalse(mark);

            Assert.IsTrue(ai.CompareAndSet(one, two, false, false));
            Assert.AreEqual(two, ai.GetValue(out mark));
            Assert.IsFalse(mark);

            Assert.IsTrue(ai.CompareAndSet(two, m3, false, true));
            Assert.AreEqual(m3, ai.GetValue(out mark));
            Assert.IsTrue(mark);

            Assert.IsFalse(ai.CompareAndSet(two, m3, true, true));
            Assert.AreEqual(m3, ai.GetValue(out mark));
            Assert.IsTrue(mark);
        }