public void It_should_have_the_Expected_Value_By_Default()
            {
                var target = new InterlockedDateTimeOffset();

                target.Equals(new DateTimeOffset(new DateTime(0, DateTimeKind.Utc))).Should().BeTrue();
                target.GetHashCode().Should().Be(new DateTimeOffset(new DateTime(0, DateTimeKind.Utc)).GetHashCode());
            }
            public void It_should_Implement_IComparable_of_T()
            {
                var now    = DateTimeOffset.UtcNow;
                var target = new InterlockedDateTimeOffset(now.UtcDateTime);

                target.CompareTo(now).Should().Be(0);
                target.CompareTo(new InterlockedDateTimeOffset(now.UtcDateTime)).Should().Be(0);
            }
            public void It_should_Accept_The_Value_Set()
            {
                var expected = DateTimeOffset.UtcNow;
                var target   = new InterlockedDateTimeOffset();

                target.Equals(expected).Should().BeFalse();
                target.SetValue(expected);
                target.Equals(expected).Should().BeTrue();
            }
            public void It_should_Be_Accept_A_Starting_DateTime()
            {
                var original = DateTimeOffset.UtcNow;
                var target   = new InterlockedDateTimeOffset(original.UtcDateTime);

                target.GetValue().Should().Be(original);
                target.Equals(original).Should().BeTrue();
                target.Equals(new InterlockedDateTimeOffset(original.UtcDateTime)).Should().BeTrue();
            }
            public void It_should_Evaluate_Equality_With_Value_Semantics()
            {
                var now    = DateTimeOffset.UtcNow;
                var target = new InterlockedDateTimeOffset(now.UtcDateTime);

                target.Equals(null).Should().BeFalse();
                target.Equals((object)new InterlockedDateTimeOffset(now.UtcDateTime)).Should().BeTrue();

                // ReSharper disable once SuspiciousTypeConversion.Global
                target.Equals((object)now).Should().BeTrue();

                target.Equals(new object()).Should().BeFalse();
            }
            public void It_should_Be_Comparable_To_Earlier_And_Later_Values()
            {
                var now    = DateTimeOffset.UtcNow;
                var before = now.AddDays(-1);
                var after  = now.AddDays(1);

                var target = new InterlockedDateTimeOffset(now.UtcDateTime);

                target.GetValue().Should().Be(now);
                target.Should().Be(new InterlockedDateTimeOffset(now.UtcDateTime));
                (target >= before).Should().BeTrue();
                (before <= target).Should().BeTrue();
                (target >= new InterlockedDateTimeOffset(before.UtcDateTime)).Should().BeTrue();
                (new InterlockedDateTimeOffset(before.UtcDateTime) <= target).Should().BeTrue();
                (target > before).Should().BeTrue();
                (before < target).Should().BeTrue();
                (target > new InterlockedDateTimeOffset(before.UtcDateTime)).Should().BeTrue();
                (new InterlockedDateTimeOffset(before.UtcDateTime) < target).Should().BeTrue();
                (target == now).Should().BeTrue();
                (now == target).Should().BeTrue();
                (target == new InterlockedDateTimeOffset(now.UtcDateTime)).Should().BeTrue();
                (new InterlockedDateTimeOffset(now.UtcDateTime) == target).Should().BeTrue();
                (target != after).Should().BeTrue();
                (after != target).Should().BeTrue();
                (target != new InterlockedDateTimeOffset(after.UtcDateTime)).Should().BeTrue();
                (new InterlockedDateTimeOffset(after.UtcDateTime) != target).Should().BeTrue();
                (target <= before).Should().BeFalse();
                (before >= target).Should().BeFalse();
                (target <= new InterlockedDateTimeOffset(before.UtcDateTime)).Should().BeFalse();
                (new InterlockedDateTimeOffset(before.UtcDateTime) >= target).Should().BeFalse();
                (target < before).Should().BeFalse();
                (before > target).Should().BeFalse();
                (target < new InterlockedDateTimeOffset(before.UtcDateTime)).Should().BeFalse();
                (new InterlockedDateTimeOffset(before.UtcDateTime) > target).Should().BeFalse();
                target.As <IComparable <DateTimeOffset> >().Should().BeGreaterThan(before);
                target.As <IComparable <DateTimeOffset> >().Should().BeLessThan(after);
                target.As <IComparable <InterlockedDateTimeOffset> >().Should().BeGreaterThan(new InterlockedDateTimeOffset(before.UtcDateTime));
                target.CompareTo(before).Should().BeGreaterThan(0);
            }