blob: c201b7a372b0f70695636fa6ce857409545b9b76 [file] [log] [blame]
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:checks/context.dart';
extension NumChecks on Subject<num> {
/// Expects that [num.isNaN] is true.
void isNaN() {
context.expect(() => ['is not a number (NaN)'], (actual) {
if (actual.isNaN) return null;
return Rejection(which: ['is a number']);
});
}
/// Expects that [num.isNaN] is false.
void isNotNaN() {
context.expect(() => ['is a number (not NaN)'], (actual) {
if (!actual.isNaN) return null;
return Rejection(which: ['is not a number (NaN)']);
});
}
/// Expects that [num.isNegative] is true.
void isNegative() {
context.expect(() => ['is negative'], (actual) {
if (actual.isNegative) return null;
return Rejection(which: ['is not negative']);
});
}
/// Expects that [num.isNegative] is false.
void isNotNegative() {
context.expect(() => ['is not negative'], (actual) {
if (!actual.isNegative) return null;
return Rejection(which: ['is negative']);
});
}
/// Expects that [num.isFinite] is true.
void isFinite() {
context.expect(() => ['is finite'], (actual) {
if (actual.isFinite) return null;
return Rejection(which: ['is not finite']);
});
}
/// Expects that [num.isFinite] is false.
///
/// Satisfied by [double.nan], [double.infinity] and
/// [double.negativeInfinity].
void isNotFinite() {
context.expect(() => ['is not finite'], (actual) {
if (!actual.isFinite) return null;
return Rejection(which: ['is finite']);
});
}
/// Expects that [num.isInfinite] is true.
///
/// Satisfied by [double.infinity] and [double.negativeInfinity].
void isInfinite() {
context.expect(() => ['is infinite'], (actual) {
if (actual.isInfinite) return null;
return Rejection(which: ['is not infinite']);
});
}
/// Expects that [num.isInfinite] is false.
///
/// Satisfied by [double.nan] and finite numbers.
void isNotInfinite() {
context.expect(() => ['is not infinite'], (actual) {
if (!actual.isInfinite) return null;
return Rejection(which: ['is infinite']);
});
}
/// Expects that the difference between this number and [other] is less than
/// or equal to [delta].
void isCloseTo(num other, num delta) {
context.expect(() => ['is within <$delta> of <$other>'], (actual) {
final difference = (other - actual).abs();
if (difference <= delta) return null;
return Rejection(which: ['differs by <$difference>']);
});
}
}