@@ -147,6 +147,99 @@ void main() {
147
147
);
148
148
}
149
149
150
+ testWidgets ('Menu responds to density changes' , (WidgetTester tester) async {
151
+ Widget buildMenu ({VisualDensity ? visualDensity = VisualDensity .standard}) => MaterialApp (
152
+ theme: ThemeData (visualDensity: visualDensity),
153
+ home: Material (
154
+ child: Column (
155
+ children: < Widget > [
156
+ MenuBar (
157
+ children: createTestMenus (onPressed: onPressed),
158
+ ),
159
+ const Expanded (child: Placeholder ()),
160
+ ],
161
+ ),
162
+ ),
163
+ );
164
+
165
+ await tester.pumpWidget (buildMenu ());
166
+ await tester.pump ();
167
+
168
+ expect (tester.getRect (find.byType (MenuBar )), equals (const Rect .fromLTRB (145.0 , 0.0 , 655.0 , 48.0 )));
169
+
170
+ // Open and make sure things are the right size.
171
+ await tester.tap (find.text (TestMenu .mainMenu1.label));
172
+ await tester.pump ();
173
+
174
+ expect (tester.getRect (find.byType (MenuBar )), equals (const Rect .fromLTRB (145.0 , 0.0 , 655.0 , 48.0 )));
175
+ expect (
176
+ tester.getRect (find.widgetWithText (MenuItemButton , TestMenu .subMenu10.label)),
177
+ equals (const Rect .fromLTRB (257.0 , 56.0 , 471.0 , 104.0 )),
178
+ );
179
+ expect (
180
+ tester.getRect (
181
+ find.ancestor (of: find.text (TestMenu .subMenu10.label), matching: find.byType (Material )).at (1 ),
182
+ ),
183
+ equals (const Rect .fromLTRB (257.0 , 48.0 , 471.0 , 208.0 )),
184
+ );
185
+
186
+ // Test compact visual density (-2, -2)
187
+ await tester.pumpWidget (Container ());
188
+ await tester.pumpWidget (buildMenu (visualDensity: VisualDensity .compact));
189
+ await tester.pump ();
190
+
191
+ // The original horizontal padding with standard visual density for menu buttons are 12 px, and the total length
192
+ // for the menu bar is (655 - 145) = 510.
193
+ // There are 4 buttons in the test menu bar, and with compact visual density,
194
+ // the padding will reduce by abs(2 * (-2)) = 4. So the total length
195
+ // now should reduce by abs(4 * 2 * (-4)) = 32, which would be 510 - 32 = 478, and
196
+ // 478 = 639 - 161
197
+ expect (tester.getRect (find.byType (MenuBar )), equals (const Rect .fromLTRB (161.0 , 0.0 , 639.0 , 40.0 )));
198
+
199
+ // Open and make sure things are the right size.
200
+ await tester.tap (find.text (TestMenu .mainMenu1.label));
201
+ await tester.pump ();
202
+
203
+ expect (tester.getRect (find.byType (MenuBar )), equals (const Rect .fromLTRB (161.0 , 0.0 , 639.0 , 40.0 )));
204
+ expect (
205
+ tester.getRect (find.widgetWithText (MenuItemButton , TestMenu .subMenu10.label)),
206
+ equals (const Rect .fromLTRB (265.0 , 40.0 , 467.0 , 80.0 )),
207
+ );
208
+ expect (
209
+ tester.getRect (
210
+ find.ancestor (of: find.text (TestMenu .subMenu10.label), matching: find.byType (Material )).at (1 ),
211
+ ),
212
+ equals (const Rect .fromLTRB (265.0 , 40.0 , 467.0 , 160.0 )),
213
+ );
214
+
215
+ await tester.pumpWidget (Container ());
216
+ await tester.pumpWidget (buildMenu (visualDensity: const VisualDensity (horizontal: 2.0 , vertical: 2.0 )));
217
+ await tester.pump ();
218
+
219
+ // Similarly, there are 4 buttons in the test menu bar, and with (2, 2) visual density,
220
+ // the padding will increase by abs(2 * 4) = 8. So the total length for buttons
221
+ // should increase by abs(4 * 2 * 8) = 64. The horizontal padding for the menu bar
222
+ // increases by 2 * 8, so the total width increases to 510 + 64 + 16 = 590, and
223
+ // 590 = 695 - 105
224
+ expect (tester.getRect (find.byType (MenuBar )), equals (const Rect .fromLTRB (105.0 , 0.0 , 695.0 , 72.0 )));
225
+
226
+ // Open and make sure things are the right size.
227
+ await tester.tap (find.text (TestMenu .mainMenu1.label));
228
+ await tester.pump ();
229
+
230
+ expect (tester.getRect (find.byType (MenuBar )), equals (const Rect .fromLTRB (105.0 , 0.0 , 695.0 , 72.0 )));
231
+ expect (
232
+ tester.getRect (find.widgetWithText (MenuItemButton , TestMenu .subMenu10.label)),
233
+ equals (const Rect .fromLTRB (249.0 , 80.0 , 483.0 , 136.0 )),
234
+ );
235
+ expect (
236
+ tester.getRect (
237
+ find.ancestor (of: find.text (TestMenu .subMenu10.label), matching: find.byType (Material )).at (1 ),
238
+ ),
239
+ equals (const Rect .fromLTRB (241.0 , 64.0 , 491.0 , 264.0 )),
240
+ );
241
+ });
242
+
150
243
testWidgets ('menu defaults colors' , (WidgetTester tester) async {
151
244
final ThemeData themeData = ThemeData ();
152
245
await tester.pumpWidget (
@@ -2182,9 +2275,9 @@ void main() {
2182
2275
expect (
2183
2276
collectSubmenuRects (),
2184
2277
equals (const < Rect > [
2185
- Rect .fromLTRB (145 .0 , 0.0 , 655 .0 , 40.0 ),
2186
- Rect .fromLTRB (257 .0 , 40.0 , 467.0 , 176 .0 ),
2187
- Rect .fromLTRB (467.0 , 80 .0 , 715 .0 , 256 .0 ),
2278
+ Rect .fromLTRB (161 .0 , 0.0 , 639 .0 , 40.0 ),
2279
+ Rect .fromLTRB (265 .0 , 40.0 , 467.0 , 160 .0 ),
2280
+ Rect .fromLTRB (467.0 , 72 .0 , 707 .0 , 232 .0 ),
2188
2281
]),
2189
2282
);
2190
2283
});
@@ -2198,9 +2291,9 @@ void main() {
2198
2291
expect (
2199
2292
collectSubmenuRects (),
2200
2293
equals (const < Rect > [
2201
- Rect .fromLTRB (145 .0 , 0.0 , 655 .0 , 40.0 ),
2202
- Rect .fromLTRB (333.0 , 40.0 , 543 .0 , 176 .0 ),
2203
- Rect .fromLTRB (85 .0 , 80 .0 , 333.0 , 256 .0 ),
2294
+ Rect .fromLTRB (161 .0 , 0.0 , 639 .0 , 40.0 ),
2295
+ Rect .fromLTRB (333.0 , 40.0 , 535 .0 , 160 .0 ),
2296
+ Rect .fromLTRB (93 .0 , 72 .0 , 333.0 , 232 .0 ),
2204
2297
]),
2205
2298
);
2206
2299
});
0 commit comments