blob: e96c0f7d02b8ee572561e0f585af797f515e74e5 [file] [log] [blame]
// Copyright 2018 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the 'License');
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an 'AS IS' BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import 'package:clock/clock.dart';
import 'package:test/test.dart';
import 'utils.dart';
void main() {
test('returns the system frequency', () {
expect(fixed(1990, 11, 8).stopwatch().frequency,
equals(Stopwatch().frequency));
});
group('before it starts', () {
late Stopwatch stopwatch;
setUp(() {
stopwatch = clock.stopwatch();
});
test('is not running', () => expect(stopwatch.isRunning, isFalse));
test('stop() does nothing', () {
stopwatch.stop();
expect(stopwatch.isRunning, isFalse);
expect(stopwatch.elapsed, equals(Duration.zero));
});
group('reports no elapsed', () {
test('duration', () => expect(stopwatch.elapsed, equals(Duration.zero)));
test('ticks', () => expect(stopwatch.elapsedTicks, isZero));
test('microseconds', () => expect(stopwatch.elapsedMicroseconds, isZero));
test('milliseconds', () => expect(stopwatch.elapsedMilliseconds, isZero));
});
});
group('when 12345μs have elapsed', () {
late DateTime time;
late Clock clock;
late Stopwatch stopwatch;
setUp(() {
time = date(1990, 11, 8);
clock = Clock(() => time);
stopwatch = clock.stopwatch()..start();
time = clock.microsFromNow(12345);
});
group('and the stopwatch is active', () {
test('is running', () {
expect(stopwatch.isRunning, isTrue);
});
test('reports more elapsed time', () {
time = clock.microsFromNow(54321);
expect(stopwatch.elapsedMicroseconds, equals(66666));
});
test('start does nothing', () {
stopwatch.start();
expect(stopwatch.isRunning, isTrue);
expect(stopwatch.elapsedMicroseconds, equals(12345));
});
group('reset()', () {
setUp(() {
stopwatch.reset();
});
test('sets the elapsed time to zero', () {
expect(stopwatch.elapsed, equals(Duration.zero));
});
test('reports more elapsed time', () {
time = clock.microsFromNow(54321);
expect(stopwatch.elapsedMicroseconds, equals(54321));
});
});
group('reports elapsed', () {
test('duration', () {
expect(
stopwatch.elapsed, equals(const Duration(microseconds: 12345)));
});
test('ticks', () {
expect(stopwatch.elapsedTicks,
equals((Stopwatch().frequency * 12345) ~/ 1000000));
});
test('microseconds', () {
expect(stopwatch.elapsedMicroseconds, equals(12345));
});
test('milliseconds', () {
expect(stopwatch.elapsedMilliseconds, equals(12));
});
});
});
group('and the stopwatch is inactive, reports that as', () {
setUp(() {
stopwatch.stop();
});
test('is not running', () {
expect(stopwatch.isRunning, isFalse);
});
test("doesn't report more elapsed time", () {
time = clock.microsFromNow(54321);
expect(stopwatch.elapsedMicroseconds, equals(12345));
});
test('start starts reporting more elapsed time', () {
stopwatch.start();
expect(stopwatch.isRunning, isTrue);
time = clock.microsFromNow(54321);
expect(stopwatch.elapsedMicroseconds, equals(66666));
});
group('reset()', () {
setUp(() {
stopwatch.reset();
});
test('sets the elapsed time to zero', () {
expect(stopwatch.elapsed, equals(Duration.zero));
});
test("doesn't report more elapsed time", () {
time = clock.microsFromNow(54321);
expect(stopwatch.elapsed, equals(Duration.zero));
});
});
group('reports elapsed', () {
test('duration', () {
expect(
stopwatch.elapsed, equals(const Duration(microseconds: 12345)));
});
test('ticks', () {
expect(stopwatch.elapsedTicks,
equals((Stopwatch().frequency * 12345) ~/ 1000000));
});
test('microseconds', () {
expect(stopwatch.elapsedMicroseconds, equals(12345));
});
test('milliseconds', () {
expect(stopwatch.elapsedMilliseconds, equals(12));
});
});
});
}, onPlatform: {
'js': const Skip('Web does not have enough precision'),
});
}