@@ -2946,11 +2946,16 @@ void main() {
29462946 // whether the sender should be shown, but the difference between
29472947 // fetchInitial and handleMessageEvent etc. doesn't matter.
29482948
2949- // TODO(#1825) test that messagesCloseInTime gets used
2949+ // Elapse test's clock to a specific time, to avoid any flaky-ness
2950+ // that may be caused by a specific local time of the day.
2951+ final initialTime = DateTime (2035 , 8 , 21 );
2952+ async .elapse (initialTime.difference (clock.now ()));
29502953
29512954 final now = clock.now ();
29522955 final t1 = eg.utcTimestamp (now.subtract (Duration (days: 1 )));
2953- final t2 = eg.utcTimestamp (now);
2956+ final t2 = t1 + Duration (minutes: 1 ).inSeconds;
2957+ final t3 = t2 + Duration (minutes: 10 , seconds: 1 ).inSeconds;
2958+ final t4 = eg.utcTimestamp (now);
29542959 final stream = eg.stream (streamId: eg.defaultStreamMessageStreamId);
29552960 Message streamMessage (int timestamp, User sender) =>
29562961 eg.streamMessage (sender: sender,
@@ -2966,15 +2971,17 @@ void main() {
29662971 streamMessage (t1, eg.selfUser), // first message, so show sender
29672972 streamMessage (t1, eg.selfUser), // hide sender
29682973 streamMessage (t1, eg.otherUser), // no recipient header, but new sender
2969- dmMessage ( t1, eg.otherUser), // same sender, but new recipient
2970- dmMessage ( t2, eg.otherUser), // same sender/recipient, but new day
2974+ streamMessage (t2, eg.otherUser), // same sender, and within 10 mins of last message
2975+ streamMessage (t3, eg.otherUser), // same sender, but after 10 mins from last message
2976+ dmMessage ( t3, eg.otherUser), // same sender, but new recipient
2977+ dmMessage ( t4, eg.otherUser), // same sender/recipient, but new day
29712978 ]);
29722979 await prepareOutboxMessagesTo ([
29732980 dmDestination ([eg.selfUser, eg.otherUser]), // same day, but new sender
29742981 dmDestination ([eg.selfUser, eg.otherUser]), // hide sender
29752982 ]);
29762983 assert (
2977- store.outboxMessages.values.every ((message) => message.timestamp == t2 ));
2984+ store.outboxMessages.values.every ((message) => message.timestamp == t4 ));
29782985 async .elapse (kLocalEchoDebounceDuration);
29792986
29802987 // We check showSender has the right values in [checkInvariants],
@@ -2984,6 +2991,8 @@ void main() {
29842991 (it) => it.isA <MessageListMessageItem >().showSender.isTrue (),
29852992 (it) => it.isA <MessageListMessageItem >().showSender.isFalse (),
29862993 (it) => it.isA <MessageListMessageItem >().showSender.isTrue (),
2994+ (it) => it.isA <MessageListMessageItem >().showSender.isFalse (),
2995+ (it) => it.isA <MessageListMessageItem >().showSender.isTrue (),
29872996 (it) => it.isA <MessageListRecipientHeaderItem >(),
29882997 (it) => it.isA <MessageListMessageItem >().showSender.isTrue (),
29892998 (it) => it.isA <MessageListDateSeparatorItem >(),
@@ -3074,14 +3083,14 @@ void main() {
30743083 });
30753084 });
30763085
3077- test ('messagesSameDay' , () {
3078- // These timestamps will differ depending on the timezone of the
3079- // environment where the tests are run, in order to give the same results
3080- // in the code under test which is also based on the ambient timezone.
3081- // TODO(dart): It'd be great if tests could control the ambient timezone,
3082- // so as to exercise cases like where local time falls back across midnight.
3083- int timestampFromLocalTime (String date) => DateTime .parse (date).millisecondsSinceEpoch ~ / 1000 ;
3086+ // These timestamps will differ depending on the timezone of the
3087+ // environment where the tests are run, in order to give the same results
3088+ // in the code under test which is also based on the ambient timezone.
3089+ // TODO(dart): It'd be great if tests could control the ambient timezone,
3090+ // so as to exercise cases like where local time falls back across midnight.
3091+ int timestampFromLocalTime (String date) => DateTime .parse (date).millisecondsSinceEpoch ~ / 1000 ;
30843092
3093+ test ('messagesSameDay' , () {
30853094 const t111a = '2021-01-01 00:00:00' ;
30863095 const t111b = '2021-01-01 12:00:00' ;
30873096 const t111c = '2021-01-01 23:59:58' ;
@@ -3121,7 +3130,46 @@ void main() {
31213130 }
31223131 });
31233132
3124- // TODO(#1825) test messagesCloseInTime
3133+ group ('messagesCloseInTime' , () {
3134+ final stream = eg.stream ();
3135+ void doTest (String time0, String time1, bool expected) {
3136+ test ('$time0 vs $time1 -> $expected ' , () {
3137+ check (messagesCloseInTime (
3138+ eg.streamMessage (stream: stream, topic: 'foo' , timestamp: timestampFromLocalTime (time0)),
3139+ eg.streamMessage (stream: stream, topic: 'foo' , timestamp: timestampFromLocalTime (time1)),
3140+ )).equals (expected);
3141+ check (messagesCloseInTime (
3142+ eg.dmMessage (from: eg.selfUser, to: [], timestamp: timestampFromLocalTime (time0)),
3143+ eg.dmMessage (from: eg.selfUser, to: [], timestamp: timestampFromLocalTime (time1)),
3144+ )).equals (expected);
3145+ check (messagesCloseInTime (
3146+ eg.streamOutboxMessage (timestamp: timestampFromLocalTime (time0)),
3147+ eg.streamOutboxMessage (timestamp: timestampFromLocalTime (time1)),
3148+ )).equals (expected);
3149+ check (messagesCloseInTime (
3150+ eg.dmOutboxMessage (from: eg.selfUser, to: [], timestamp: timestampFromLocalTime (time0)),
3151+ eg.dmOutboxMessage (from: eg.selfUser, to: [], timestamp: timestampFromLocalTime (time1)),
3152+ )).equals (expected);
3153+ });
3154+ }
3155+
3156+ const time = '2021-01-01 00:30:00' ;
3157+
3158+ doTest ('2021-01-01 00:19:59' , time, false );
3159+ doTest ('2021-01-01 00:20:00' , time, true );
3160+ doTest ('2021-01-01 00:29:59' , time, true );
3161+ doTest ('2021-01-01 00:30:00' , time, true );
3162+
3163+ doTest (time, '2021-01-01 00:30:01' , true );
3164+ doTest (time, '2021-01-01 00:39:59' , true );
3165+ doTest (time, '2021-01-01 00:40:00' , true );
3166+ doTest (time, '2021-01-01 00:40:01' , false );
3167+
3168+ doTest (time, '2022-01-01 00:30:00' , false );
3169+ doTest (time, '2021-02-01 00:30:00' , false );
3170+ doTest (time, '2021-01-02 00:30:00' , false );
3171+ doTest (time, '2021-01-01 01:30:00' , false );
3172+ });
31253173}
31263174
31273175MessageListView ? _lastModel;
@@ -3238,9 +3286,10 @@ void checkInvariants(MessageListView model) {
32383286 check (model.items[i++ ]).isA <MessageListDateSeparatorItem >()
32393287 .message.identicalTo (allMessages[j]);
32403288 showSender = true ;
3289+ } else if (allMessages[j- 1 ].senderId == allMessages[j].senderId) {
3290+ showSender = ! messagesCloseInTime (allMessages[j- 1 ], allMessages[j]);
32413291 } else {
3242- // TODO(#1825) adjust to reflect messagesCloseInTime
3243- showSender = allMessages[j].senderId != allMessages[j- 1 ].senderId;
3292+ showSender = true ;
32443293 }
32453294 if (j < model.messages.length) {
32463295 check (model.items[i]).isA <MessageListMessageItem >()
0 commit comments