public void Replace_WithPredicate_OnTimestampedValues_Updates_IfNewer()
        {
            IEnumerable <TimestampedInt> originalItems = new[]
            {
                new TimestampedInt(1, new DateTime(2017, 09, 08, 18, 56, 00, DateTimeKind.Utc)),
                new TimestampedInt(2, new DateTime(2016, 01, 01, 10, 00, 00, DateTimeKind.Utc))
            };

            // A newer replacement
            TimestampedInt replacement = new TimestampedInt(3, new DateTime(2018, 01, 01, 01, 08, 00, DateTimeKind.Utc));

            var loader = new ThreadSafeAsyncLoader <TimestampedInt>(seqFactory: Seq.ListBased, loadDataAsync: _ => Task.FromResult(originalItems));

            loader.LoadAsync();

            // --- Perform ---
            loader.Replace(i => i.Value == 1, replacement);

            loader.Should().BeEquivalentTo(new[] { replacement, originalItems.ElementAt(1) });
        }
        public void Replace_OnTimestampedValues_DoesNotUpdate_IfOlder()
        {
            IEnumerable <TimestampedInt> originalItems = new[]
            {
                new TimestampedInt(1, new DateTime(2017, 09, 08, 18, 56, 00, DateTimeKind.Utc)),
                new TimestampedInt(2, new DateTime(2016, 01, 01, 10, 00, 00, DateTimeKind.Utc))
            };

            // An older replacement
            TimestampedInt replacement = new TimestampedInt(3, new DateTime(2017, 01, 01, 01, 08, 00, DateTimeKind.Utc));

            var loader = new ThreadSafeAsyncLoader <TimestampedInt>(
                seqFactory: Seq.ListBased,
                loadDataAsync: _ => Task.FromResult(originalItems),
                identityComparer: new TimestampedIntValueComparer());

            loader.LoadAsync();

            // --- Perform ---
            loader.Replace(originalItems.ElementAt(0), replacement);

            loader.Should().BeEquivalentTo(originalItems);
        }
            public override bool Equals(object obj)
            {
                TimestampedInt other = obj as TimestampedInt;

                return(other != null && this.Value == other.Value && this.LastUpdated == other.LastUpdated);
            }