Skip to content
This repository was archived by the owner on Jun 21, 2023. It is now read-only.

Commit 6d8c105

Browse files
authored
Merge pull request #595 from StanleyGoldman/fixes/tracking-collection-newer-comparer
Fixes/tracking collection newer comparer
2 parents e090773 + d269b2f commit 6d8c105

File tree

2 files changed

+127
-5
lines changed

2 files changed

+127
-5
lines changed

src/GitHub.Exports.Reactive/Collections/TrackingCollection.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -539,8 +539,8 @@ ActionData ProcessItem(ActionData data, List<T> list)
539539
var old = list[idx];
540540
if (newer != null)
541541
{
542-
// the object is "older" than the one we have, ignore it
543-
if (newer(item, old) > 0)
542+
// the object is not "newer" than the one we have, ignore it
543+
if (newer(item, old) >= 0)
544544
return new ActionData(TheAction.Ignore, list, item, null, idx, idx);
545545
}
546546

src/TrackingCollectionTests/TrackingCollectionTests.cs

Lines changed: 125 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ public void FilterTitleRun2()
333333
var total = 1000;
334334

335335
var list1 = new List<Thing>(Enumerable.Range(1, total).Select(i => GetThing(i, i, i, "Run 1")).ToList());
336-
var list2 = new List<Thing>(Enumerable.Range(1, total).Select(i => GetThing(i, i, i, "Run 2")).ToList());
336+
var list2 = new List<Thing>(Enumerable.Range(1, total).Select(i => GetThing(i, i, i + 1, "Run 2")).ToList());
337337

338338
ITrackingCollection<Thing> col = new TrackingCollection<Thing>(
339339
list1.ToObservable(),
@@ -429,8 +429,8 @@ public void OrderByMatchesOriginalOrder()
429429
var count = 0;
430430
var total = 1000;
431431

432-
var list1 = new List<Thing>(Enumerable.Range(1, total).Select(i => GetThing(i, i, total - i, "Run 1")).ToList());
433-
var list2 = new List<Thing>(Enumerable.Range(1, total).Select(i => GetThing(i, i, total - i, "Run 2")).ToList());
432+
var list1 = new List<Thing>(Enumerable.Range(1, total).Select(i => GetThing(i, i, i, "Run 1")).Reverse().ToList());
433+
var list2 = new List<Thing>(Enumerable.Range(1, total).Select(i => GetThing(i, i, i + 1, "Run 2")).Reverse().ToList());
434434

435435
ITrackingCollection<Thing> col = new TrackingCollection<Thing>(
436436
list1.ToObservable(),
@@ -2014,4 +2014,126 @@ public async void AddingBeforeSubscribingWorks()
20142014
await Observable.Timeout(done, TimeSpan.FromMilliseconds(500));
20152015
Assert.AreEqual(2, col.Count);
20162016
}
2017+
2018+
[Test]
2019+
public void DoesNotUpdateThingIfTimeIsOlder()
2020+
{
2021+
ITrackingCollection<Thing> col = new TrackingCollection<Thing>(
2022+
Observable.Never<Thing>(),
2023+
OrderedComparer<Thing>.OrderBy(x => x.UpdatedAt).Compare);
2024+
col.NewerComparer = OrderedComparer<Thing>.OrderByDescending(x => x.UpdatedAt).Compare;
2025+
col.ProcessingDelay = TimeSpan.Zero;
2026+
2027+
var evt = new ManualResetEvent(false);
2028+
col.Subscribe(t =>
2029+
{
2030+
evt.Set();
2031+
}, () => { });
2032+
2033+
var createdAndUpdatedTime = DateTimeOffset.Now;
2034+
var olderUpdateTime = createdAndUpdatedTime.Subtract(TimeSpan.FromMinutes(1));
2035+
2036+
const string originalTitle = "Original Thing";
2037+
2038+
var originalThing = new Thing(1, originalTitle, createdAndUpdatedTime, createdAndUpdatedTime);
2039+
col.AddItem(originalThing);
2040+
2041+
evt.WaitOne();
2042+
evt.Reset();
2043+
2044+
Assert.AreEqual(originalTitle, col[0].Title);
2045+
2046+
const string updatedTitle = "Updated Thing";
2047+
2048+
var updatedThing = new Thing(1, updatedTitle, createdAndUpdatedTime, olderUpdateTime);
2049+
col.AddItem(updatedThing);
2050+
2051+
evt.WaitOne();
2052+
evt.Reset();
2053+
2054+
Assert.AreEqual(originalTitle, col[0].Title);
2055+
2056+
col.Dispose();
2057+
}
2058+
2059+
[Test]
2060+
public void DoesNotUpdateThingIfTimeIsEqual()
2061+
{
2062+
ITrackingCollection<Thing> col = new TrackingCollection<Thing>(
2063+
Observable.Never<Thing>(),
2064+
OrderedComparer<Thing>.OrderBy(x => x.UpdatedAt).Compare);
2065+
col.NewerComparer = OrderedComparer<Thing>.OrderByDescending(x => x.UpdatedAt).Compare;
2066+
col.ProcessingDelay = TimeSpan.Zero;
2067+
2068+
var evt = new ManualResetEvent(false);
2069+
col.Subscribe(t =>
2070+
{
2071+
evt.Set();
2072+
}, () => { });
2073+
2074+
var createdAndUpdatedTime = DateTimeOffset.Now;
2075+
2076+
const string originalTitle = "Original Thing";
2077+
2078+
var originalThing = new Thing(1, originalTitle, createdAndUpdatedTime, createdAndUpdatedTime);
2079+
col.AddItem(originalThing);
2080+
2081+
evt.WaitOne();
2082+
evt.Reset();
2083+
2084+
Assert.AreEqual(originalTitle, col[0].Title);
2085+
2086+
const string updatedTitle = "Updated Thing";
2087+
2088+
var updatedThing = new Thing(1, updatedTitle, createdAndUpdatedTime, createdAndUpdatedTime);
2089+
col.AddItem(updatedThing);
2090+
2091+
evt.WaitOne();
2092+
evt.Reset();
2093+
2094+
Assert.AreEqual(originalTitle, col[0].Title);
2095+
2096+
col.Dispose();
2097+
}
2098+
2099+
[Test]
2100+
public void DoesUpdateThingIfTimeIsNewer()
2101+
{
2102+
ITrackingCollection<Thing> col = new TrackingCollection<Thing>(
2103+
Observable.Never<Thing>(),
2104+
OrderedComparer<Thing>.OrderBy(x => x.UpdatedAt).Compare);
2105+
col.NewerComparer = OrderedComparer<Thing>.OrderByDescending(x => x.UpdatedAt).Compare;
2106+
col.ProcessingDelay = TimeSpan.Zero;
2107+
2108+
var evt = new ManualResetEvent(false);
2109+
col.Subscribe(t =>
2110+
{
2111+
evt.Set();
2112+
}, () => { });
2113+
2114+
var createdAndUpdatedTime = DateTimeOffset.Now;
2115+
var newerUpdateTime = createdAndUpdatedTime.Add(TimeSpan.FromMinutes(1));
2116+
2117+
const string originalTitle = "Original Thing";
2118+
2119+
var originalThing = new Thing(1, originalTitle, createdAndUpdatedTime, createdAndUpdatedTime);
2120+
col.AddItem(originalThing);
2121+
2122+
evt.WaitOne();
2123+
evt.Reset();
2124+
2125+
Assert.AreEqual(originalTitle, col[0].Title);
2126+
2127+
const string updatedTitle = "Updated Thing";
2128+
2129+
var updatedThing = new Thing(1, updatedTitle, createdAndUpdatedTime, newerUpdateTime);
2130+
col.AddItem(updatedThing);
2131+
2132+
evt.WaitOne();
2133+
evt.Reset();
2134+
2135+
Assert.AreEqual(updatedTitle, col[0].Title);
2136+
2137+
col.Dispose();
2138+
}
20172139
}

0 commit comments

Comments
 (0)