@@ -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