update breakpoint package

This commit is contained in:
2026-01-14 01:00:34 -08:00
parent b7f99e2ce9
commit 18e40d4ac9
108 changed files with 3420 additions and 455 deletions
@@ -0,0 +1,242 @@
import 'package:breakpoint/breakpoint.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('Breakpoint', () {
test('xsmall / smallHandset (0-359)', () {
final b = Breakpoint(
columns: 4,
device: LayoutClass.smallHandset,
gutters: 16,
margin: 16,
window: WindowSize.xsmall,
);
_testBreakpoint(300, b);
_testBreakpoint(359, b);
});
test('xsmall / mediumHandset (360-399)', () {
final b = Breakpoint(
columns: 4,
device: LayoutClass.mediumHandset,
gutters: 16,
margin: 16,
window: WindowSize.xsmall,
);
_testBreakpoint(360, b);
_testBreakpoint(399, b);
});
test('xsmall / largeHandset (400-479)', () {
final b = Breakpoint(
columns: 4,
device: LayoutClass.largeHandset,
gutters: 16,
margin: 16,
window: WindowSize.xsmall,
);
_testBreakpoint(400, b);
_testBreakpoint(479, b);
});
test('xsmall / largeHandset (480-599)', () {
final b = Breakpoint(
columns: 4,
device: LayoutClass.largeHandset,
gutters: 16,
margin: 16,
window: WindowSize.xsmall,
);
_testBreakpoint(480, b);
_testBreakpoint(599, b);
});
test('small / smallTablet (600-719)', () {
final b = Breakpoint(
columns: 8,
device: LayoutClass.smallTablet,
gutters: 16,
margin: 16,
window: WindowSize.small,
);
_testBreakpoint(600, b);
_testBreakpoint(719, b);
});
test('small / largeTablet (720-839)', () {
final b = Breakpoint(
columns: 8,
device: LayoutClass.largeTablet,
gutters: 24,
margin: 24,
window: WindowSize.small,
);
_testBreakpoint(720, b);
_testBreakpoint(839, b);
});
test('small / largeTablet (840-959)', () {
final b = Breakpoint(
columns: 12,
device: LayoutClass.largeTablet,
gutters: 24,
margin: 24,
window: WindowSize.small,
);
_testBreakpoint(840, b);
_testBreakpoint(959, b);
});
test('small / largeTablet (960-1023)', () {
final b = Breakpoint(
columns: 12,
device: LayoutClass.largeTablet,
gutters: 24,
margin: 24,
window: WindowSize.small,
);
_testBreakpoint(960, b);
_testBreakpoint(1023, b);
});
test('medium / desktop (1024-1279)', () {
final b = Breakpoint(
columns: 12,
device: LayoutClass.desktop,
gutters: 24,
margin: 24,
window: WindowSize.medium,
);
_testBreakpoint(1024, b);
_testBreakpoint(1279, b);
});
test('medium / desktop (1280-1439)', () {
final b = Breakpoint(
columns: 12,
device: LayoutClass.desktop,
gutters: 24,
margin: 24,
window: WindowSize.medium,
);
_testBreakpoint(1280, b);
_testBreakpoint(1439, b);
});
test('large / desktop (1440-1599)', () {
final b = Breakpoint(
columns: 12,
device: LayoutClass.desktop,
gutters: 24,
margin: 24,
window: WindowSize.large,
);
_testBreakpoint(1440, b);
_testBreakpoint(1599, b);
});
test('large / desktop (1600-1919)', () {
final b = Breakpoint(
columns: 12,
device: LayoutClass.desktop,
gutters: 24,
margin: 24,
window: WindowSize.large,
);
_testBreakpoint(1600, b);
_testBreakpoint(1919, b);
});
test('xlarge / desktop (1920+)', () {
final b = Breakpoint(
columns: 12,
device: LayoutClass.desktop,
gutters: 24,
margin: 24,
window: WindowSize.xlarge,
);
_testBreakpoint(1920, b);
_testBreakpoint(3000, b);
});
test('Orientation Landscape (+120 width behavior)', () {
// 300 base width + 120 buffer = 420 effective width
// 420 falls into largeHandset (400-479)
final constraints = BoxConstraints(maxWidth: 300, maxHeight: 200);
final breakpoint = Breakpoint.fromConstraints(constraints);
expect(breakpoint.device, LayoutClass.largeHandset);
});
});
group('Comparators', () {
test('WindowSize', () {
expect(WindowSize.xsmall < WindowSize.small, true);
expect(WindowSize.small < WindowSize.medium, true);
expect(WindowSize.medium < WindowSize.large, true);
expect(WindowSize.large < WindowSize.xlarge, true);
expect(WindowSize.xlarge > WindowSize.large, true);
expect(WindowSize.small <= WindowSize.small, true);
expect(WindowSize.small >= WindowSize.small, true);
});
test('LayoutClass', () {
expect(LayoutClass.smallHandset < LayoutClass.mediumHandset, true);
expect(LayoutClass.mediumHandset < LayoutClass.largeHandset, true);
expect(LayoutClass.largeHandset < LayoutClass.smallTablet, true);
expect(LayoutClass.smallTablet < LayoutClass.largeTablet, true);
expect(LayoutClass.largeTablet < LayoutClass.desktop, true);
expect(LayoutClass.desktop > LayoutClass.largeTablet, true);
expect(LayoutClass.desktop >= LayoutClass.desktop, true);
expect(LayoutClass.desktop <= LayoutClass.desktop, true);
});
});
group('BreakpointBuilder', () {
testWidgets('Builds with correct breakpoint', (tester) async {
Breakpoint? capturedBreakpoint;
await tester.pumpWidget(
MaterialApp(
home: Center(
child: SizedBox(
width: 800,
height: 600,
child: BreakpointBuilder(
builder: (context, breakpoint) {
capturedBreakpoint = breakpoint;
return Container();
},
),
),
),
),
);
// Width 800(landscape +120 -> 920) falls into largeTablet (840-959), columns 12, gutter 24, margin 24
expect(capturedBreakpoint, isNotNull);
expect(capturedBreakpoint!.columns, 12);
expect(capturedBreakpoint!.gutters, 24);
expect(capturedBreakpoint!.margin, 24);
expect(capturedBreakpoint!.device, LayoutClass.largeTablet);
});
});
}
void _testBreakpoint(double width, Breakpoint expected) {
final constraints =
BoxConstraints(maxWidth: width, maxHeight: double.infinity);
final breakpoint = Breakpoint.fromConstraints(constraints);
expect(breakpoint.columns, expected.columns,
reason: 'Columns mismatch at width $width');
expect(breakpoint.gutters, expected.gutters,
reason: 'Gutters mismatch at width $width');
expect(breakpoint.margin, expected.margin,
reason: 'Margin mismatch at width $width');
expect(breakpoint.device, expected.device,
reason: 'Device mismatch at width $width');
expect(breakpoint.window, expected.window,
reason: 'Window mismatch at width $width');
}