Skip to content

Commit eb7bcc0

Browse files
committed
Responsive Wrapper Test Creation #7
*Create comparator tests.
1 parent c5aed0c commit eb7bcc0

File tree

2 files changed

+167
-18
lines changed

2 files changed

+167
-18
lines changed

lib/responsive_wrapper.dart

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -436,11 +436,11 @@ class ResponsiveWrapperData {
436436
scaledWidth: state.scaledWidth,
437437
scaledHeight: state.scaledHeight,
438438
breakpoints: state.breakpoints,
439-
activeBreakpoint: state?.activeBreakpoint,
440-
isMobile: state?.activeBreakpoint?.name == MOBILE,
441-
isPhone: state?.activeBreakpoint?.name == PHONE,
442-
isTablet: state?.activeBreakpoint?.name == TABLET,
443-
isDesktop: state?.activeBreakpoint?.name == DESKTOP,
439+
activeBreakpoint: state.activeBreakpoint,
440+
isMobile: state.activeBreakpoint.name == MOBILE,
441+
isPhone: state.activeBreakpoint.name == PHONE,
442+
isTablet: state.activeBreakpoint.name == TABLET,
443+
isDesktop: state.activeBreakpoint.name == DESKTOP,
444444
);
445445
}
446446

@@ -469,24 +469,25 @@ class ResponsiveWrapperData {
469469
isDesktop?.toString() +
470470
")";
471471

472+
bool equals(String breakpointName) =>
473+
activeBreakpoint.name != null && activeBreakpoint.name == breakpointName;
474+
472475
/// Is the [scaledWidth] larger than or equal to [breakpointName]?
473476
/// Defaults to false if the [breakpointName] cannot be found.
474-
bool isLargerThan(String breakpointName) =>
475-
scaledWidth >=
476-
breakpoints
477-
.firstWhere((element) => element.name == breakpointName,
478-
orElse: () => ResponsiveBreakpoint(breakpoint: 1073741823))
479-
.breakpoint;
477+
bool isLargerThan(String breakpointName) {
478+
for (var i = breakpoints.length - 1; i > 0; i--) {
479+
if (breakpoints[i].name == breakpointName &&
480+
breakpoints[i - 1].name != breakpointName &&
481+
screenWidth >= breakpoints[i - 1].breakpoint) return true;
482+
}
483+
484+
return false;
485+
}
480486

481487
/// Is the [scaledWidth] smaller than the [breakpointName]?
482488
/// Defaults to false if the [breakpointName] cannot be found.
483-
bool isSmallerThan(String breakpointName) {
484-
return scaledWidth <
485-
breakpoints
486-
.firstWhere((element) => element.name == breakpointName,
487-
orElse: () => ResponsiveBreakpoint(breakpoint: -1073741824))
488-
.breakpoint;
489-
}
489+
bool isSmallerThan(String breakpointName) => breakpoints.any((element) =>
490+
element.name == breakpointName && scaledWidth < element.breakpoint);
490491
}
491492

492493
/// Creates an immutable widget that exposes [ResponsiveWrapperData]

test/responsive_wrapper_test.dart

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,5 +514,153 @@ void main() {
514514
testWidgets('Screen Size Infinite', (WidgetTester tester) async {
515515
// Infinite screen width or height is not allowed.
516516
}, skip: true);
517+
518+
// Test convenience comparators.
519+
testWidgets('Breakpoint Comparators', (WidgetTester tester) async {
520+
// Verify comparator at named breakpoint returns correct values.
521+
setScreenSize(tester, Size(600, 1200));
522+
Key key = UniqueKey();
523+
Widget widget = MaterialApp(
524+
home: ResponsiveWrapper(
525+
key: key,
526+
breakpoints: [
527+
ResponsiveBreakpoint(breakpoint: 450, name: MOBILE),
528+
ResponsiveBreakpoint(breakpoint: 500, name: MOBILE),
529+
ResponsiveBreakpoint(breakpoint: 550),
530+
ResponsiveBreakpoint(breakpoint: 600, name: TABLET),
531+
ResponsiveBreakpoint(breakpoint: 650, name: TABLET),
532+
ResponsiveBreakpoint(breakpoint: 700),
533+
ResponsiveBreakpoint(breakpoint: 800, name: DESKTOP),
534+
],
535+
child: Container(),
536+
),
537+
);
538+
await tester.pumpWidget(widget);
539+
await tester.pump();
540+
dynamic state = tester.state(find.byKey(key));
541+
expect(ResponsiveWrapperData.fromResponsiveWrapper(state).equals(MOBILE),
542+
false);
543+
expect(ResponsiveWrapperData.fromResponsiveWrapper(state).equals(TABLET),
544+
true);
545+
expect(ResponsiveWrapperData.fromResponsiveWrapper(state).equals(DESKTOP),
546+
false);
547+
expect(
548+
ResponsiveWrapperData.fromResponsiveWrapper(state)
549+
.isLargerThan(MOBILE),
550+
true);
551+
expect(
552+
ResponsiveWrapperData.fromResponsiveWrapper(state)
553+
.isLargerThan(TABLET),
554+
false);
555+
expect(
556+
ResponsiveWrapperData.fromResponsiveWrapper(state)
557+
.isLargerThan(DESKTOP),
558+
false);
559+
expect(
560+
ResponsiveWrapperData.fromResponsiveWrapper(state)
561+
.isSmallerThan(MOBILE),
562+
false);
563+
expect(
564+
ResponsiveWrapperData.fromResponsiveWrapper(state)
565+
.isSmallerThan(TABLET),
566+
true);
567+
expect(
568+
ResponsiveWrapperData.fromResponsiveWrapper(state)
569+
.isSmallerThan(DESKTOP),
570+
true);
571+
572+
// Verify comparator at unnamed breakpoint works correctly.
573+
key = UniqueKey();
574+
widget = MaterialApp(
575+
home: ResponsiveWrapper(
576+
key: key,
577+
breakpoints: [
578+
ResponsiveBreakpoint(breakpoint: 450, name: MOBILE),
579+
ResponsiveBreakpoint(breakpoint: 500, name: TABLET),
580+
ResponsiveBreakpoint(breakpoint: 550, name: MOBILE),
581+
ResponsiveBreakpoint(breakpoint: 600),
582+
ResponsiveBreakpoint(breakpoint: 650, name: TABLET),
583+
ResponsiveBreakpoint(breakpoint: 700, name: DESKTOP),
584+
ResponsiveBreakpoint(breakpoint: 800, name: DESKTOP),
585+
],
586+
child: Container(),
587+
),
588+
);
589+
await tester.pumpWidget(widget);
590+
await tester.pump();
591+
state = tester.state(find.byKey(key));
592+
expect(ResponsiveWrapperData.fromResponsiveWrapper(state).equals(MOBILE),
593+
false);
594+
expect(ResponsiveWrapperData.fromResponsiveWrapper(state).equals(TABLET),
595+
false);
596+
expect(ResponsiveWrapperData.fromResponsiveWrapper(state).equals(DESKTOP),
597+
false);
598+
expect(
599+
ResponsiveWrapperData.fromResponsiveWrapper(state)
600+
.isLargerThan(MOBILE),
601+
true);
602+
expect(
603+
ResponsiveWrapperData.fromResponsiveWrapper(state)
604+
.isLargerThan(TABLET),
605+
true);
606+
expect(
607+
ResponsiveWrapperData.fromResponsiveWrapper(state)
608+
.isLargerThan(DESKTOP),
609+
false);
610+
expect(
611+
ResponsiveWrapperData.fromResponsiveWrapper(state)
612+
.isSmallerThan(MOBILE),
613+
false);
614+
expect(
615+
ResponsiveWrapperData.fromResponsiveWrapper(state)
616+
.isSmallerThan(TABLET),
617+
true);
618+
expect(
619+
ResponsiveWrapperData.fromResponsiveWrapper(state)
620+
.isSmallerThan(DESKTOP),
621+
true);
622+
623+
// Test largerThan upper bound.
624+
key = UniqueKey();
625+
widget = MaterialApp(
626+
home: ResponsiveWrapper(
627+
key: key,
628+
breakpoints: [
629+
ResponsiveBreakpoint(breakpoint: 450, name: MOBILE),
630+
ResponsiveBreakpoint(breakpoint: 500, name: TABLET),
631+
ResponsiveBreakpoint(breakpoint: 550, name: DESKTOP),
632+
ResponsiveBreakpoint(breakpoint: 600),
633+
],
634+
child: Container(),
635+
),
636+
);
637+
await tester.pumpWidget(widget);
638+
await tester.pump();
639+
state = tester.state(find.byKey(key));
640+
expect(
641+
ResponsiveWrapperData.fromResponsiveWrapper(state)
642+
.isLargerThan(MOBILE),
643+
true);
644+
expect(
645+
ResponsiveWrapperData.fromResponsiveWrapper(state)
646+
.isLargerThan(TABLET),
647+
true);
648+
expect(
649+
ResponsiveWrapperData.fromResponsiveWrapper(state)
650+
.isLargerThan(DESKTOP),
651+
true);
652+
expect(
653+
ResponsiveWrapperData.fromResponsiveWrapper(state)
654+
.isSmallerThan(MOBILE),
655+
false);
656+
expect(
657+
ResponsiveWrapperData.fromResponsiveWrapper(state)
658+
.isSmallerThan(TABLET),
659+
false);
660+
expect(
661+
ResponsiveWrapperData.fromResponsiveWrapper(state)
662+
.isSmallerThan(DESKTOP),
663+
false);
664+
});
517665
});
518666
}

0 commit comments

Comments
 (0)