Unverified Commit 2933e895 authored by Andrew Chen's avatar Andrew Chen Committed by GitHub

Implement Comparable<TimeOfDay> (#59317)

parent 5cfb16b1
...@@ -48,20 +48,21 @@ enum DayPeriod { ...@@ -48,20 +48,21 @@ enum DayPeriod {
/// * [DateTime], which represents date and time, and is subject to eras and /// * [DateTime], which represents date and time, and is subject to eras and
/// time zones. /// time zones.
@immutable @immutable
class TimeOfDay { class TimeOfDay implements Comparable<TimeOfDay> {
/// Creates a time of day. /// Creates a time of day.
/// ///
/// The [hour] argument must be between 0 and 23, inclusive. The [minute] /// The [hour] argument must be between 0 and 23, inclusive. The [minute]
/// argument must be between 0 and 59, inclusive. /// 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. /// 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 /// 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]. /// minute in the timezone of the given [DateTime].
TimeOfDay.fromDateTime(DateTime time) TimeOfDay.fromDateTime(DateTime time)
: hour = time.hour, : this(hour: time.hour, minute: time.minute);
minute = time.minute;
/// Creates a time of day based on the current time. /// Creates a time of day based on the current time.
/// ///
...@@ -80,8 +81,6 @@ class TimeOfDay { ...@@ -80,8 +81,6 @@ class TimeOfDay {
/// Returns a new TimeOfDay with the hour and/or minute replaced. /// Returns a new TimeOfDay with the hour and/or minute replaced.
TimeOfDay replacing({ int hour, int minute }) { 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); return TimeOfDay(hour: hour ?? this.hour, minute: minute ?? this.minute);
} }
...@@ -136,6 +135,19 @@ class TimeOfDay { ...@@ -136,6 +135,19 @@ class TimeOfDay {
return '$TimeOfDay($hourLabel:$minuteLabel)'; 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 /// Determines how the time picker invoked using [showTimePicker] formats and
......
...@@ -28,4 +28,69 @@ void main() { ...@@ -28,4 +28,69 @@ void main() {
expect(await pumpTest(true), '07:00'); 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),
]
);
});
});
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment