Skip to content

Commit c5aed0c

Browse files
committed
Responsive Wrapper Test Creation #6
*Create maxWidth and minWidth tests.
1 parent 328c7a1 commit c5aed0c

File tree

3 files changed

+163
-78
lines changed

3 files changed

+163
-78
lines changed

README.md

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Use Responsive Framework to automatically scale your UI.
2020
2121
## Demo
2222

23-
### [Minimal Website](https://gallery.imfast.io/flutterwebsites/minimal/)
23+
### [Minimal Website](https://gallery.codelessly.com/flutterwebsites/minimal/?utm_medium=link&utm_campaign=demo)
2424

2525
A demo website built with the Responsive Framework. [View Code](https://github.com/Codelessly/FlutterMinimalWebsite)
2626

@@ -136,7 +136,7 @@ An arbitrary number of breakpoints can be set. Resizing/scaling behavior can be
136136

137137
## About
138138

139-
Responsive Framework was created out of a desire for a better way to manage responsiveness. The ability to automatically adapt UI to different sizes opens up a world of possibilities. Here at Codelessly, we're working on #NoCode and code generation automation tools to increase productivity. If you are interested in building a website builder powered by computer vision, drop us a line below 😎
139+
Responsive Framework was created out of a desire for a better way to manage responsiveness. The ability to automatically adapt UI to different sizes opens up a world of possibilities. Here at Codelessly, we're working on #NoCode and code generation automation tools to increase productivity. If that sounds interesting, you'll want to subscribe to updates below 😎
140140

141141
Responsive Framework is licensed under Zero-Clause BSD and released as Emailware. If you like this project or it helped you, please subscribe to updates. Although it is not required, you might miss the goodies we share!
142142

@@ -151,26 +151,16 @@ Now you can proudly display the time and headache saved by using Responsive Fram
151151
```
152152
[![Flutter Responsive](https://img.shields.io/badge/flutter-responsive-brightgreen.svg?style=flat-square)](https://github.com/Codelessly/ResponsiveFramework)
153153
```
154-
155154
<img alt="Built Responsive" src="https://raw.githubusercontent.com/Codelessly/ResponsiveFramework/master/packages/Built%20Responsive%20Badge.png"/>
156155
157-
<a id="raw-url" href="https://raw.githubusercontent.com/Codelessly/ResponsiveFramework/master/packages/Built%20Responsive%20Badge.png">
158-
<p>Download</p>
159-
</a>
160-
161156
```html
162157
<a href="https://github.com/Codelessly/ResponsiveFramework">
163158
<img alt="Built Responsive"
164159
src="https://raw.githubusercontent.com/Codelessly/ResponsiveFramework/master/packages/Built%20Responsive%20Badge.png"/>
165160
</a>
166161
```
167-
168162
<img alt="Built with Responsive Framework" src="https://raw.githubusercontent.com/Codelessly/ResponsiveFramework/master/packages/Built%20with%20Responsive%20Badge.png"/>
169163

170-
<a id="raw-url" href="https://raw.githubusercontent.com/Codelessly/ResponsiveFramework/master/packages/Built%20with%20Responsive%20Badge.png">
171-
<p>Download</p>
172-
</a>
173-
174164
```html
175165
<a href="https://github.com/Codelessly/ResponsiveFramework">
176166
<img alt="Built with Responsive Framework"

lib/responsive_wrapper.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ class ResponsiveWrapper extends StatefulWidget {
6868
this.defaultScaleFactor = 1,
6969
this.background,
7070
this.mediaQueryData,
71-
}) : super(key: key);
71+
}) : assert(minWidth != null),
72+
super(key: key);
7273

7374
@override
7475
_ResponsiveWrapperState createState() => _ResponsiveWrapperState();

test/responsive_wrapper_test.dart

Lines changed: 159 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,118 @@ void main() {
170170
}
171171
});
172172

173+
// Verify inherited mediaQueryData is used.
174+
testWidgets('MediaQueryData Inherited', (WidgetTester tester) async {
175+
setScreenSize(tester, Size(450, 1200));
176+
Key key = UniqueKey();
177+
Widget widget = MaterialApp(
178+
home: ResponsiveWrapper(
179+
key: key,
180+
mediaQueryData:
181+
MediaQueryData(size: Size(600, 1200), devicePixelRatio: 3),
182+
child: Container(),
183+
),
184+
);
185+
await tester.pumpWidget(widget);
186+
await tester.pump();
187+
MediaQuery mediaQuery = tester.widget(find.descendant(
188+
of: find.byKey(key), matching: find.byType(MediaQuery)));
189+
expect(mediaQuery.data.size, Size(600, 1200));
190+
191+
// Pass MediaQueryData through builder.
192+
key = UniqueKey();
193+
widget = MaterialApp(
194+
builder: (context, widget) => ResponsiveWrapper.builder(widget,
195+
mediaQueryData:
196+
MediaQueryData(size: Size(600, 1200), devicePixelRatio: 3)),
197+
home: Container(),
198+
);
199+
await tester.pumpWidget(widget);
200+
await tester.pump();
201+
expect(
202+
find
203+
.byType(MediaQuery)
204+
.allCandidates
205+
.firstWhere((element) => element.size == Size(600, 1200)),
206+
isNotNull);
207+
});
208+
209+
// Test maxWidth and minWidth values.
210+
testWidgets('Max and Min Width', (WidgetTester tester) async {
211+
// 0 value.
212+
setScreenSize(tester, Size(450, 1200));
213+
Key key = UniqueKey();
214+
Widget widget = MaterialApp(
215+
home: ResponsiveWrapper(
216+
key: key,
217+
defaultScale: true,
218+
maxWidth: 0,
219+
minWidth: 0,
220+
child: Container(),
221+
),
222+
);
223+
await tester.pumpWidget(widget);
224+
await tester.pump();
225+
// Fallback to SizedBox.
226+
expect(find.byType(SizedBox), findsOneWidget);
227+
228+
// Infinity value. (BoxConstraints forbid forcing double.infinity)
229+
key = UniqueKey();
230+
widget = MaterialApp(
231+
home: ResponsiveWrapper(
232+
key: key,
233+
defaultScale: true,
234+
maxWidth: 1073741823,
235+
minWidth: 1073741823,
236+
child: Container(),
237+
),
238+
);
239+
await tester.pumpWidget(widget);
240+
await tester.pump();
241+
242+
// maxWidth smaller than minWidth.
243+
// When defaultScale is false, minWidth is ignored.
244+
// If defaultScale is true, minWidth acts as a
245+
// scaleFactor multiplier when greater than maxWidth.
246+
key = UniqueKey();
247+
widget = MaterialApp(
248+
home: ResponsiveWrapper(
249+
key: key,
250+
defaultScale: true,
251+
maxWidth: 200,
252+
minWidth: 800,
253+
child: Container(),
254+
),
255+
);
256+
await tester.pumpWidget(widget);
257+
await tester.pump();
258+
dynamic state = tester.state(find.byKey(key));
259+
// Screen width is capped at maxWidth value.
260+
// Scale factor is 4.
261+
expect(state.screenWidth, 200);
262+
});
263+
});
264+
265+
group('ResponsiveBreakpoint', () {
266+
// Test ResponsiveBreakpoint class parameters.
267+
test('Parameters', () {
268+
// Test empty breakpoint.
269+
ResponsiveBreakpoint responsiveBreakpoint =
270+
ResponsiveBreakpoint(breakpoint: null);
271+
// Test print empty.
272+
print(responsiveBreakpoint);
273+
expect(responsiveBreakpoint.breakpoint, null);
274+
expect(responsiveBreakpoint.autoScale, false);
275+
expect(responsiveBreakpoint.scaleFactor, 1);
276+
expect(responsiveBreakpoint.name, null);
277+
278+
// Test setting parameters types.
279+
responsiveBreakpoint = ResponsiveBreakpoint(
280+
breakpoint: 600, name: MOBILE, autoScale: true, scaleFactor: 1.2);
281+
// Test print parameters.
282+
print(responsiveBreakpoint);
283+
});
284+
173285
// Test duplicate breakpoints.
174286
testWidgets('Breakpoint Duplicate', (WidgetTester tester) async {
175287
setScreenSize(tester, Size(450, 1200));
@@ -258,55 +370,6 @@ void main() {
258370
// Negative breakpoints are not allowed.
259371
});
260372

261-
// Test 0 screen width and height.
262-
// Verify no errors are thrown.
263-
testWidgets('Screen Size 0', (WidgetTester tester) async {
264-
// Screen Width 0.
265-
setScreenSize(tester, Size(0, 1200));
266-
Key key = UniqueKey();
267-
String defaultName = 'defaultName';
268-
Widget widget = MaterialApp(
269-
home: ResponsiveWrapper(
270-
key: key,
271-
defaultName: defaultName,
272-
defaultScale: true,
273-
breakpoints: [
274-
ResponsiveBreakpoint(breakpoint: 450, name: MOBILE),
275-
ResponsiveBreakpoint(breakpoint: 600, name: TABLET),
276-
ResponsiveBreakpoint(breakpoint: 800, name: DESKTOP),
277-
],
278-
child: Container(),
279-
),
280-
);
281-
await tester.pumpWidget(widget);
282-
await tester.pump();
283-
dynamic state = tester.state(find.byKey(key));
284-
expect(state.activeBreakpoint?.name, defaultName);
285-
MediaQuery mediaQuery = tester.widget(find.byType(MediaQuery).first);
286-
expect(mediaQuery.data.size, Size(0, 1200));
287-
288-
resetScreenSize(tester);
289-
setScreenSize(tester, Size(450, 0));
290-
await tester.pump();
291-
state = tester.state(find.byKey(key));
292-
expect(state.activeBreakpoint?.name, MOBILE);
293-
mediaQuery = tester.widget(find.byType(MediaQuery).first);
294-
expect(mediaQuery.data.size, Size(450, 0));
295-
296-
resetScreenSize(tester);
297-
setScreenSize(tester, Size(0, 0));
298-
await tester.pump();
299-
state = tester.state(find.byKey(key));
300-
expect(state.activeBreakpoint?.breakpoint, null);
301-
mediaQuery = tester.widget(find.byType(MediaQuery).first);
302-
expect(mediaQuery.data.size, Size(0, 0));
303-
});
304-
305-
// Test infinite screen width and height.
306-
testWidgets('Screen Size Infinite', (WidgetTester tester) async {
307-
// Infinite screen width or height is not allowed.
308-
}, skip: true);
309-
310373
// Test unnamed breakpoints.
311374
testWidgets('Breakpoints Unnamed', (WidgetTester tester) async {
312375
List<double> boundaryValues = [
@@ -402,23 +465,54 @@ void main() {
402465
expect(state.activeBreakpoint?.name, expectedValues[i]);
403466
}
404467
});
405-
});
406468

407-
test('ResponsiveBreakpoint', () {
408-
// Test empty breakpoint.
409-
ResponsiveBreakpoint responsiveBreakpoint =
410-
ResponsiveBreakpoint(breakpoint: null);
411-
// Test print empty.
412-
print(responsiveBreakpoint);
413-
expect(responsiveBreakpoint.breakpoint, null);
414-
expect(responsiveBreakpoint.autoScale, false);
415-
expect(responsiveBreakpoint.scaleFactor, 1);
416-
expect(responsiveBreakpoint.name, null);
469+
// Test 0 screen width and height.
470+
// Verify no errors are thrown.
471+
testWidgets('Screen Size 0', (WidgetTester tester) async {
472+
// Screen Width 0.
473+
setScreenSize(tester, Size(0, 1200));
474+
Key key = UniqueKey();
475+
String defaultName = 'defaultName';
476+
Widget widget = MaterialApp(
477+
home: ResponsiveWrapper(
478+
key: key,
479+
defaultName: defaultName,
480+
defaultScale: true,
481+
breakpoints: [
482+
ResponsiveBreakpoint(breakpoint: 450, name: MOBILE),
483+
ResponsiveBreakpoint(breakpoint: 600, name: TABLET),
484+
ResponsiveBreakpoint(breakpoint: 800, name: DESKTOP),
485+
],
486+
child: Container(),
487+
),
488+
);
489+
await tester.pumpWidget(widget);
490+
await tester.pump();
491+
dynamic state = tester.state(find.byKey(key));
492+
expect(state.activeBreakpoint?.name, defaultName);
493+
MediaQuery mediaQuery = tester.widget(find.byType(MediaQuery).first);
494+
expect(mediaQuery.data.size, Size(0, 1200));
417495

418-
// Test setting parameters types.
419-
responsiveBreakpoint = ResponsiveBreakpoint(
420-
breakpoint: 600, name: MOBILE, autoScale: true, scaleFactor: 1.2);
421-
// Test print parameters.
422-
print(responsiveBreakpoint);
496+
resetScreenSize(tester);
497+
setScreenSize(tester, Size(450, 0));
498+
await tester.pump();
499+
state = tester.state(find.byKey(key));
500+
expect(state.activeBreakpoint?.name, MOBILE);
501+
mediaQuery = tester.widget(find.byType(MediaQuery).first);
502+
expect(mediaQuery.data.size, Size(450, 0));
503+
504+
resetScreenSize(tester);
505+
setScreenSize(tester, Size(0, 0));
506+
await tester.pump();
507+
state = tester.state(find.byKey(key));
508+
expect(state.activeBreakpoint?.breakpoint, null);
509+
mediaQuery = tester.widget(find.byType(MediaQuery).first);
510+
expect(mediaQuery.data.size, Size(0, 0));
511+
});
512+
513+
// Test infinite screen width and height.
514+
testWidgets('Screen Size Infinite', (WidgetTester tester) async {
515+
// Infinite screen width or height is not allowed.
516+
}, skip: true);
423517
});
424518
}

0 commit comments

Comments
 (0)