@@ -2946,11 +2946,16 @@ void main() {
2946
2946
// whether the sender should be shown, but the difference between
2947
2947
// fetchInitial and handleMessageEvent etc. doesn't matter.
2948
2948
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 ()));
2950
2953
2951
2954
final now = clock.now ();
2952
2955
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);
2954
2959
final stream = eg.stream (streamId: eg.defaultStreamMessageStreamId);
2955
2960
Message streamMessage (int timestamp, User sender) =>
2956
2961
eg.streamMessage (sender: sender,
@@ -2966,15 +2971,17 @@ void main() {
2966
2971
streamMessage (t1, eg.selfUser), // first message, so show sender
2967
2972
streamMessage (t1, eg.selfUser), // hide sender
2968
2973
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
2971
2978
]);
2972
2979
await prepareOutboxMessagesTo ([
2973
2980
dmDestination ([eg.selfUser, eg.otherUser]), // same day, but new sender
2974
2981
dmDestination ([eg.selfUser, eg.otherUser]), // hide sender
2975
2982
]);
2976
2983
assert (
2977
- store.outboxMessages.values.every ((message) => message.timestamp == t2 ));
2984
+ store.outboxMessages.values.every ((message) => message.timestamp == t4 ));
2978
2985
async .elapse (kLocalEchoDebounceDuration);
2979
2986
2980
2987
// We check showSender has the right values in [checkInvariants],
@@ -2984,6 +2991,8 @@ void main() {
2984
2991
(it) => it.isA <MessageListMessageItem >().showSender.isTrue (),
2985
2992
(it) => it.isA <MessageListMessageItem >().showSender.isFalse (),
2986
2993
(it) => it.isA <MessageListMessageItem >().showSender.isTrue (),
2994
+ (it) => it.isA <MessageListMessageItem >().showSender.isFalse (),
2995
+ (it) => it.isA <MessageListMessageItem >().showSender.isTrue (),
2987
2996
(it) => it.isA <MessageListRecipientHeaderItem >(),
2988
2997
(it) => it.isA <MessageListMessageItem >().showSender.isTrue (),
2989
2998
(it) => it.isA <MessageListDateSeparatorItem >(),
@@ -3074,14 +3083,14 @@ void main() {
3074
3083
});
3075
3084
});
3076
3085
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 ;
3084
3092
3093
+ test ('messagesSameDay' , () {
3085
3094
const t111a = '2021-01-01 00:00:00' ;
3086
3095
const t111b = '2021-01-01 12:00:00' ;
3087
3096
const t111c = '2021-01-01 23:59:58' ;
@@ -3121,7 +3130,46 @@ void main() {
3121
3130
}
3122
3131
});
3123
3132
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
+ });
3125
3173
}
3126
3174
3127
3175
MessageListView ? _lastModel;
@@ -3238,9 +3286,10 @@ void checkInvariants(MessageListView model) {
3238
3286
check (model.items[i++ ]).isA <MessageListDateSeparatorItem >()
3239
3287
.message.identicalTo (allMessages[j]);
3240
3288
showSender = true ;
3289
+ } else if (allMessages[j- 1 ].senderId == allMessages[j].senderId) {
3290
+ showSender = ! messagesCloseInTime (allMessages[j- 1 ], allMessages[j]);
3241
3291
} else {
3242
- // TODO(#1825) adjust to reflect messagesCloseInTime
3243
- showSender = allMessages[j].senderId != allMessages[j- 1 ].senderId;
3292
+ showSender = true ;
3244
3293
}
3245
3294
if (j < model.messages.length) {
3246
3295
check (model.items[i]).isA <MessageListMessageItem >()
0 commit comments