@@ -7,6 +7,8 @@ import 'package:flutter_checks/flutter_checks.dart';
7
7
import 'package:flutter_test/flutter_test.dart' ;
8
8
import 'package:url_launcher/url_launcher.dart' ;
9
9
import 'package:zulip/api/core.dart' ;
10
+ import 'package:zulip/api/model/initial_snapshot.dart' ;
11
+ import 'package:zulip/api/model/model.dart' ;
10
12
import 'package:zulip/model/content.dart' ;
11
13
import 'package:zulip/model/narrow.dart' ;
12
14
import 'package:zulip/model/settings.dart' ;
@@ -118,9 +120,13 @@ Widget plainContent(String html) {
118
120
Future <void > prepareContent (WidgetTester tester, Widget child, {
119
121
List <NavigatorObserver > navObservers = const [],
120
122
bool wrapWithPerAccountStoreWidget = false ,
123
+ InitialSnapshot ? initialSnapshot,
121
124
}) async {
122
125
if (wrapWithPerAccountStoreWidget) {
123
- await testBinding.globalStore.add (eg.selfAccount, eg.initialSnapshot ());
126
+ initialSnapshot ?? = eg.initialSnapshot ();
127
+ await testBinding.globalStore.add (eg.selfAccount, initialSnapshot);
128
+ } else {
129
+ assert (initialSnapshot == null );
124
130
}
125
131
126
132
addTearDown (testBinding.reset);
@@ -598,10 +604,12 @@ void main() {
598
604
Future <void > checkFontSizeRatio (WidgetTester tester, {
599
605
required String targetHtml,
600
606
required TargetFontSizeFinder targetFontSizeFinder,
607
+ bool wrapWithPerAccountStoreWidget = false ,
601
608
}) async {
602
- await prepareContent (tester, plainContent (
603
- '<h1>header-plain $targetHtml </h1>\n '
604
- '<p>paragraph-plain $targetHtml </p>' ));
609
+ await prepareContent (tester, wrapWithPerAccountStoreWidget: wrapWithPerAccountStoreWidget,
610
+ plainContent (
611
+ '<h1>header-plain $targetHtml </h1>\n '
612
+ '<p>paragraph-plain $targetHtml </p>' ));
605
613
606
614
final headerRootSpan = tester.renderObject <RenderParagraph >(find.textContaining ('header' )).text;
607
615
final headerPlainStyle = mergedStyleOfSubstring (headerRootSpan, 'header-plain ' );
@@ -1071,16 +1079,52 @@ void main() {
1071
1079
// the timezone of the environment running these tests. Accept here a wide
1072
1080
// range of times. See comments in "show dates" test in
1073
1081
// `test/widgets/message_list_test.dart`.
1074
- final renderedTextRegexp = RegExp (r'^(Tue, Jan 30|Wed, Jan 31), 2024, \d+:\d\d [AP]M$' );
1082
+ final renderedTextRegexp = RegExp (r'^(Tue, Jan 30|Wed, Jan 31), 2024, \d+:\d\d(?: [AP]M)?$' );
1083
+ final renderedTextRegexpTwelveHour = RegExp (r'^(Tue, Jan 30|Wed, Jan 31), 2024, \d+:\d\d [AP]M$' );
1084
+ final renderedTextRegexpTwentyFourHour = RegExp (r'^(Tue, Jan 30|Wed, Jan 31), 2024, \d+:\d\d$' );
1085
+
1086
+ Future <void > prepare (
1087
+ WidgetTester tester,
1088
+ [TwentyFourHourTimeMode twentyFourHourTimeMode = TwentyFourHourTimeMode .localeDefault]
1089
+ ) async {
1090
+ final initialSnapshot = eg.initialSnapshot ()
1091
+ ..userSettings.twentyFourHourTime = twentyFourHourTimeMode;
1092
+ await prepareContent (tester,
1093
+ // We use the self-account's time-format setting.
1094
+ wrapWithPerAccountStoreWidget: true ,
1095
+ initialSnapshot: initialSnapshot,
1096
+ plainContent ('<p>$timeSpanHtml </p>' ));
1097
+ }
1075
1098
1076
1099
testWidgets ('smoke' , (tester) async {
1077
- await prepareContent (tester, plainContent ( '<p>$ timeSpanHtml </p>' ) );
1100
+ await prepare (tester);
1078
1101
tester.widget (find.textContaining (renderedTextRegexp));
1079
1102
});
1080
1103
1104
+ testWidgets ('TwentyFourHourTimeMode.twelveHour' , (tester) async {
1105
+ await prepare (tester, TwentyFourHourTimeMode .twelveHour);
1106
+ check (find.textContaining (renderedTextRegexpTwelveHour)).findsOne ();
1107
+ });
1108
+
1109
+ testWidgets ('TwentyFourHourTimeMode.twentyFourHour' , (tester) async {
1110
+ await prepare (tester, TwentyFourHourTimeMode .twentyFourHour);
1111
+ check (find.textContaining (renderedTextRegexpTwentyFourHour)).findsOne ();
1112
+ });
1113
+
1114
+ testWidgets ('TwentyFourHourTimeMode.localeDefault' , (tester) async {
1115
+ await prepare (tester, TwentyFourHourTimeMode .localeDefault);
1116
+ // This expectation holds as long as we're always formatting in en_US,
1117
+ // the default locale, which uses the twelve-hour format.
1118
+ // TODO(#1727) follow the actual locale; test with different locales
1119
+ check (find.textContaining (renderedTextRegexpTwelveHour)).findsOne ();
1120
+ });
1121
+
1081
1122
void testIconAndTextSameColor (String description, String html) {
1082
1123
testWidgets ('clock icon and text are the same color: $description ' , (tester) async {
1083
- await prepareContent (tester, plainContent (html));
1124
+ await prepareContent (tester,
1125
+ // We use the self-account's time-format setting.
1126
+ wrapWithPerAccountStoreWidget: true ,
1127
+ plainContent (html));
1084
1128
1085
1129
final icon = tester.widget <Icon >(
1086
1130
find.descendant (of: find.byType (GlobalTime ),
@@ -1100,6 +1144,8 @@ void main() {
1100
1144
group ('maintains font-size ratio with surrounding text' , () {
1101
1145
Future <void > doCheck (WidgetTester tester, double Function (GlobalTime widget) sizeFromWidget) async {
1102
1146
await checkFontSizeRatio (tester,
1147
+ // We use the self-account's time-format setting.
1148
+ wrapWithPerAccountStoreWidget: true ,
1103
1149
targetHtml: '<time datetime="2024-01-30T17:33:00Z">2024-01-30T17:33:00Z</time>' ,
1104
1150
targetFontSizeFinder: (rootSpan) {
1105
1151
late final double result;
0 commit comments