withManualClock<T> function

T withManualClock<T>(
  1. T callback(
    1. ManualClock clock
    ), {
  2. DateTime? initialTime,
})

Run callback with overriding the top level clock field with a manual clock.

This function is useful for testing clock.now() and Timer related code.

Implementation

T withManualClock<T>(
  T Function(ManualClock clock) callback, {
  DateTime? initialTime,
}) {
  final clock = ManualClock(initialTime: initialTime);
  return withClock(
    clock,
    () => runZoned(
      () => callback(clock),
      zoneSpecification: ZoneSpecification(
        createTimer: (_, __, ___, duration, callback) {
          final timer = ManualTimer(duration, (timer) => callback());
          clock.addTimer(timer);
          return timer;
        },
        createPeriodicTimer: (_, __, ___, period, callback) {
          final timer = ManualTimer.periodic(period, callback);
          clock.addTimer(timer);
          return timer;
        },
      ),
    ),
  );
}