mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Implement Comparable<TimeOfDay> (#59317)
This commit is contained in:
parent
5cfb16b193
commit
2933e895e5
@ -48,20 +48,21 @@ enum DayPeriod {
|
||||
/// * [DateTime], which represents date and time, and is subject to eras and
|
||||
/// time zones.
|
||||
@immutable
|
||||
class TimeOfDay {
|
||||
class TimeOfDay implements Comparable<TimeOfDay> {
|
||||
/// Creates a time of day.
|
||||
///
|
||||
/// The [hour] argument must be between 0 and 23, inclusive. The [minute]
|
||||
/// argument must be between 0 and 59, inclusive.
|
||||
const TimeOfDay({ @required this.hour, @required this.minute });
|
||||
const TimeOfDay({ @required this.hour, @required this.minute })
|
||||
: assert(hour != null && hour >= 0 && hour < hoursPerDay),
|
||||
assert(minute != null && minute >= 0 && minute < minutesPerHour);
|
||||
|
||||
/// Creates a time of day based on the given time.
|
||||
///
|
||||
/// The [hour] is set to the time's hour and the [minute] is set to the time's
|
||||
/// minute in the timezone of the given [DateTime].
|
||||
TimeOfDay.fromDateTime(DateTime time)
|
||||
: hour = time.hour,
|
||||
minute = time.minute;
|
||||
: this(hour: time.hour, minute: time.minute);
|
||||
|
||||
/// Creates a time of day based on the current time.
|
||||
///
|
||||
@ -80,8 +81,6 @@ class TimeOfDay {
|
||||
|
||||
/// Returns a new TimeOfDay with the hour and/or minute replaced.
|
||||
TimeOfDay replacing({ int hour, int minute }) {
|
||||
assert(hour == null || (hour >= 0 && hour < hoursPerDay));
|
||||
assert(minute == null || (minute >= 0 && minute < minutesPerHour));
|
||||
return TimeOfDay(hour: hour ?? this.hour, minute: minute ?? this.minute);
|
||||
}
|
||||
|
||||
@ -136,6 +135,19 @@ class TimeOfDay {
|
||||
|
||||
return '$TimeOfDay($hourLabel:$minuteLabel)';
|
||||
}
|
||||
|
||||
static int _inMinutesOf(TimeOfDay time) => minutesPerHour * time.hour + time.minute;
|
||||
|
||||
@override
|
||||
int compareTo(TimeOfDay other) {
|
||||
if (other == null) {
|
||||
return 1;
|
||||
}
|
||||
if (other == this) {
|
||||
return 0;
|
||||
}
|
||||
return _inMinutesOf(this).compareTo(_inMinutesOf(other));
|
||||
}
|
||||
}
|
||||
|
||||
/// Determines how the time picker invoked using [showTimePicker] formats and
|
||||
|
||||
@ -28,4 +28,69 @@ void main() {
|
||||
expect(await pumpTest(true), '07:00');
|
||||
});
|
||||
});
|
||||
|
||||
group('TimeOfDay', () {
|
||||
test('assertions', () {
|
||||
expect(() => TimeOfDay(hour: null, minute: null), throwsAssertionError);
|
||||
expect(() => TimeOfDay(hour: null, minute: 0), throwsAssertionError);
|
||||
expect(() => TimeOfDay(hour: 0, minute: null), throwsAssertionError);
|
||||
expect(() => TimeOfDay(hour: -1, minute: -1), throwsAssertionError);
|
||||
expect(() => TimeOfDay(hour: 0, minute: -1), throwsAssertionError);
|
||||
expect(() => TimeOfDay(hour: -1, minute: 0), throwsAssertionError);
|
||||
expect(() => TimeOfDay(hour: 24, minute: 0), throwsAssertionError);
|
||||
expect(() => TimeOfDay(hour: 0, minute: 60), throwsAssertionError);
|
||||
});
|
||||
|
||||
test('.==', () {
|
||||
expect(const TimeOfDay(hour: 0 , minute: 0)
|
||||
== (const TimeOfDay(hour: 0 , minute: 0)), true);
|
||||
});
|
||||
|
||||
test('.replacing', () {
|
||||
expect(
|
||||
const TimeOfDay(hour: 23 , minute: 59).replacing(hour: 0),
|
||||
const TimeOfDay(hour: 0 , minute: 59),
|
||||
);
|
||||
expect(
|
||||
const TimeOfDay(hour: 23 , minute: 59).replacing(minute: 0),
|
||||
const TimeOfDay(hour: 23 , minute: 0),
|
||||
);
|
||||
});
|
||||
|
||||
test('.compareTo', () {
|
||||
expect(
|
||||
<TimeOfDay>[
|
||||
const TimeOfDay(hour: 12 , minute: 0),
|
||||
const TimeOfDay(hour: 23 , minute: 59),
|
||||
const TimeOfDay(hour: 0 , minute: 0),
|
||||
]..sort(),
|
||||
<TimeOfDay>[
|
||||
const TimeOfDay(hour: 0 , minute: 0),
|
||||
const TimeOfDay(hour: 12 , minute: 0),
|
||||
const TimeOfDay(hour: 23 , minute: 59),
|
||||
]
|
||||
);
|
||||
|
||||
expect(const TimeOfDay(hour: 0 , minute: 0).compareTo(null) > 0, true);
|
||||
|
||||
const TimeOfDay zero = TimeOfDay(hour: 0 , minute: 0);
|
||||
expect(zero.compareTo(zero), 0);
|
||||
|
||||
expect(const TimeOfDay(hour: 0 , minute: 0)
|
||||
.compareTo(const TimeOfDay(hour: 0 , minute: 0)), 0);
|
||||
|
||||
expect(
|
||||
<TimeOfDay>[
|
||||
const TimeOfDay(hour: 0 , minute: 0),
|
||||
const TimeOfDay(hour: 23 , minute: 59),
|
||||
const TimeOfDay(hour: 12 , minute: 0),
|
||||
]..sort(),
|
||||
<TimeOfDay>[
|
||||
const TimeOfDay(hour: 0 , minute: 0),
|
||||
const TimeOfDay(hour: 12 , minute: 0),
|
||||
const TimeOfDay(hour: 23 , minute: 59),
|
||||
]
|
||||
);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user