Skip to content

Commit

Permalink
Refactored tests, added zeroPad argument to horizontal constructor
Browse files Browse the repository at this point in the history
  • Loading branch information
moniaS committed Aug 1, 2019
1 parent 63cd969 commit 7b01b96
Show file tree
Hide file tree
Showing 5 changed files with 166 additions and 169 deletions.
1 change: 1 addition & 0 deletions example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ class _MyHomePageState extends State<MyHomePage> {
minValue: 0,
maxValue: 100,
step: 10,
zeroPad: true,
onChanged: (value) => setState(() => _currentHorizontalIntValue = value),
);
integerInfiniteNumberPicker = new NumberPicker.integer(
Expand Down
33 changes: 18 additions & 15 deletions lib/numberpicker.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class NumberPicker extends StatelessWidget {
this.itemExtent = kDefaultItemExtent,
this.listViewHeight = kDefaultListViewCrossAxisSize,
this.step = 1,
this.zeroPad = false,
}) : assert(initialValue != null),
assert(minValue != null),
assert(maxValue != null),
Expand All @@ -44,8 +45,7 @@ class NumberPicker extends StatelessWidget {
listViewWidth = 3 * itemExtent,
infiniteLoop = false,
integerItemCount = (maxValue - minValue) ~/ step + 1,
zeroPad = false,
super(key: key);
super(key: key);

///constructor for integer number picker
NumberPicker.integer({
Expand All @@ -60,8 +60,7 @@ class NumberPicker extends StatelessWidget {
this.scrollDirection = Axis.vertical,
this.infiniteLoop = false,
this.zeroPad = false,
})
: assert(initialValue != null),
}) : assert(initialValue != null),
assert(minValue != null),
assert(maxValue != null),
assert(maxValue > minValue),
Expand Down Expand Up @@ -250,15 +249,14 @@ class NumberPicker extends StatelessWidget {

bool isExtra = index == 0 || index == listItemCount - 1;

String displayValue = zeroPad
? value.toString().padLeft(maxValue.toString().length, '0')
: value.toString();

return isExtra
? new Container() //empty first and last element
: new Center(
child: new Text(displayValue, style: itemStyle),
);
child: new Text(
getDisplayedValue(value),
style: itemStyle,
),
);
},
),
),
Expand Down Expand Up @@ -324,12 +322,11 @@ class NumberPicker extends StatelessWidget {
final TextStyle itemStyle =
value == selectedIntValue ? selectedStyle : defaultStyle;

String displayValue = zeroPad
? value.toString().padLeft(maxValue.toString().length, '0')
: value.toString();

return new Center(
child: new Text(displayValue, style: itemStyle),
child: new Text(
getDisplayedValue(value),
style: itemStyle,
),
);
},
),
Expand All @@ -338,6 +335,12 @@ class NumberPicker extends StatelessWidget {
);
}

String getDisplayedValue(int value) {
return zeroPad
? value.toString().padLeft(maxValue.toString().length, '0')
: value.toString();
}

//
// ----------------------------- LOGIC -----------------------------
//
Expand Down
219 changes: 83 additions & 136 deletions test/integer_infinite_numberpicker_test.dart
Original file line number Diff line number Diff line change
@@ -1,171 +1,118 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:numberpicker/numberpicker.dart';
import 'test_utils.dart';

void main() {
testWidgets('Integer small scroll up works', (WidgetTester tester) async {
await _testNumberPicker(
tester: tester,
minValue: 1,
maxValue: 10,
initialValue: 5,
scrollBy: 2,
expectedValue: 7);
await testNumberPicker(
tester: tester,
minValue: 1,
maxValue: 10,
initialValue: 5,
scrollBy: 2,
expectedValue: 7,
infiniteLoop: true,
);
});

testWidgets('Integer small scroll down works', (WidgetTester tester) async {
await _testNumberPicker(
tester: tester,
minValue: 1,
maxValue: 10,
initialValue: 5,
scrollBy: -2,
expectedValue: 3);
await testNumberPicker(
tester: tester,
minValue: 1,
maxValue: 10,
initialValue: 5,
scrollBy: -2,
expectedValue: 3,
infiniteLoop: true,
);
});

testWidgets('Integer overscroll over max value', (WidgetTester tester) async {
await _testNumberPicker(
tester: tester,
minValue: 1,
maxValue: 5,
initialValue: 5,
scrollBy: 1,
expectedValue: 1);
await testNumberPicker(
tester: tester,
minValue: 1,
maxValue: 5,
initialValue: 5,
scrollBy: 1,
expectedValue: 1,
infiniteLoop: true,
);
});

testWidgets('Integer overscroll under min value', (WidgetTester tester) async {
await _testNumberPicker(
tester: tester,
minValue: 1,
maxValue: 5,
initialValue: 1,
scrollBy: -1,
expectedValue: 5);
testWidgets('Integer overscroll under min value',
(WidgetTester tester) async {
await testNumberPicker(
tester: tester,
minValue: 1,
maxValue: 5,
initialValue: 1,
scrollBy: -1,
expectedValue: 5,
infiniteLoop: true,
);
});

testWidgets('Step works', (WidgetTester tester) async {
await _testNumberPicker(
tester: tester,
minValue: 0,
maxValue: 6,
step: 3,
initialValue: 0,
scrollBy: 2,
expectedValue: 6);
await testNumberPicker(
tester: tester,
minValue: 0,
maxValue: 6,
step: 3,
initialValue: 0,
scrollBy: 2,
expectedValue: 6,
infiniteLoop: true,
);
});

testWidgets('Step cuts max value', (WidgetTester tester) async {
await _testNumberPicker(
tester: tester,
minValue: 0,
maxValue: 5,
step: 3,
initialValue: 0,
scrollBy: 2,
expectedValue: 0);
await testNumberPicker(
tester: tester,
minValue: 0,
maxValue: 5,
step: 3,
initialValue: 0,
scrollBy: 2,
expectedValue: 0,
infiniteLoop: true,
);
});

testWidgets('Min value==step, force animate', (WidgetTester tester) async {
await _testNumberPicker(
tester: tester,
minValue: 10,
maxValue: 50,
step: 10,
initialValue: 10,
scrollBy: 2,
expectedValue: 30,
animateToItself: true);
await testNumberPicker(
tester: tester,
minValue: 10,
maxValue: 50,
step: 10,
initialValue: 10,
scrollBy: 2,
expectedValue: 30,
animateToItself: true,
infiniteLoop: true,
);
});

testWidgets('Force animate works', (WidgetTester tester) async {
await _testNumberPicker(
tester: tester,
minValue: 10,
maxValue: 50,
initialValue: 10,
scrollBy: 13,
expectedValue: 23,
animateToItself: true);
await testNumberPicker(
tester: tester,
minValue: 10,
maxValue: 50,
initialValue: 10,
scrollBy: 13,
expectedValue: 23,
animateToItself: true,
infiniteLoop: true,
);
});

testWidgets('Zero pad works', (WidgetTester tester) async {
await _testNumberPicker(
await testMultipleValuesInPicker(
tester: tester,
minValue: 0,
maxValue: 10,
initialValue: 9,
zeroPad: true,
scrollBy: 1,
infiniteLoop: true,
expectedDisplayValues: ['09', '10', '00']);
});
}

Future<NumberPicker> _testNumberPicker(
{WidgetTester tester,
int minValue,
int maxValue,
int initialValue,
bool zeroPad = false,
int scrollBy,
int step = 1,
int expectedValue,
List<String> expectedDisplayValues,
bool animateToItself = false}) async {
int value = initialValue;
NumberPicker picker;

await tester.pumpWidget(
StatefulBuilder(builder: (BuildContext context, StateSetter setState) {
picker = NumberPicker.integer(
initialValue: value,
minValue: minValue,
maxValue: maxValue,
step: step,
infiniteLoop: true,
zeroPad: zeroPad,
onChanged: (newValue) => setState(() => value = newValue),
);
return MaterialApp(
home: Scaffold(
body: picker,
),
);
}),
);
expect(value, equals(initialValue));

await _scrollNumberPicker(Offset(0.0, 0.0), tester, scrollBy);
await tester.pumpAndSettle();

if (expectedValue != null) {
expect(value, equals(expectedValue));

if (animateToItself) {
expect(picker.selectedIntValue, equals(expectedValue));
await picker.animateInt(picker.selectedIntValue);
await tester.pumpAndSettle();
expect(picker.selectedIntValue, equals(expectedValue));
}
}

if (expectedDisplayValues != null) {
for (String displayValue in expectedDisplayValues) {
expect(find.text(displayValue), findsOneWidget);
}
}

return picker;
}

_scrollNumberPicker(
Offset pickerPosition, WidgetTester tester, int scrollBy) async {
Offset pickerCenter = Offset(
pickerPosition.dx + NumberPicker.kDefaultListViewCrossAxisSize / 2,
pickerPosition.dy + 1.5 * NumberPicker.kDefaultItemExtent,
);
final TestGesture testGesture = await tester.startGesture(pickerCenter);
await testGesture.moveBy(Offset(
0.0,
-scrollBy * NumberPicker.kDefaultItemExtent,
));
}
}
2 changes: 1 addition & 1 deletion test/integer_numberpicker_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ void main() {
});

testWidgets('Zero pad works', (WidgetTester tester) async {
await testNumberPicker(
await testMultipleValuesInPicker(
tester: tester,
minValue: 0,
maxValue: 10,
Expand Down
Loading

0 comments on commit 7b01b96

Please sign in to comment.