// Copyright (c) 2012, 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:test/test.dart';

import 'test_utils.dart';

void main() {
  test('closeTo', () {
    shouldPass(0, closeTo(0, 1));
    shouldPass(-1, closeTo(0, 1));
    shouldPass(1, closeTo(0, 1));
    shouldFail(
      1.001,
      closeTo(0, 1),
      'Expected: a numeric value within <1> of <0> '
      'Actual: <1.001> '
      'Which: differs by <1.001>',
    );
    shouldFail(
      -1.001,
      closeTo(0, 1),
      'Expected: a numeric value within <1> of <0> '
      'Actual: <-1.001> '
      'Which: differs by <1.001>',
    );
    shouldFail(
      'not a num',
      closeTo(0, 1),
      endsWith('not an <Instance of \'num\'>'),
    );
  });

  test('inInclusiveRange', () {
    shouldFail(
      -1,
      inInclusiveRange(0, 2),
      'Expected: be in range from 0 (inclusive) to 2 (inclusive) '
      'Actual: <-1>',
    );
    shouldPass(0, inInclusiveRange(0, 2));
    shouldPass(1, inInclusiveRange(0, 2));
    shouldPass(2, inInclusiveRange(0, 2));
    shouldFail(
      3,
      inInclusiveRange(0, 2),
      'Expected: be in range from 0 (inclusive) to 2 (inclusive) '
      'Actual: <3>',
    );
    shouldFail(
      'not a num',
      inInclusiveRange(0, 1),
      endsWith('not an <Instance of \'num\'>'),
    );
  });

  test('inExclusiveRange', () {
    shouldFail(
      0,
      inExclusiveRange(0, 2),
      'Expected: be in range from 0 (exclusive) to 2 (exclusive) '
      'Actual: <0>',
    );
    shouldPass(1, inExclusiveRange(0, 2));
    shouldFail(
      2,
      inExclusiveRange(0, 2),
      'Expected: be in range from 0 (exclusive) to 2 (exclusive) '
      'Actual: <2>',
    );
    shouldFail(
      'not a num',
      inExclusiveRange(0, 1),
      endsWith('not an <Instance of \'num\'>'),
    );
  });

  test('inOpenClosedRange', () {
    shouldFail(
      0,
      inOpenClosedRange(0, 2),
      'Expected: be in range from 0 (exclusive) to 2 (inclusive) '
      'Actual: <0>',
    );
    shouldPass(1, inOpenClosedRange(0, 2));
    shouldPass(2, inOpenClosedRange(0, 2));
    shouldFail(
      'not a num',
      inOpenClosedRange(0, 1),
      endsWith('not an <Instance of \'num\'>'),
    );
  });

  test('inClosedOpenRange', () {
    shouldPass(0, inClosedOpenRange(0, 2));
    shouldPass(1, inClosedOpenRange(0, 2));
    shouldFail(
      2,
      inClosedOpenRange(0, 2),
      'Expected: be in range from 0 (inclusive) to 2 (exclusive) '
      'Actual: <2>',
    );
    shouldFail(
      'not a num',
      inClosedOpenRange(0, 1),
      endsWith('not an <Instance of \'num\'>'),
    );
  });

  group('NaN', () {
    test('inInclusiveRange', () {
      shouldFail(
        double.nan,
        inExclusiveRange(double.negativeInfinity, double.infinity),
        'Expected: be in range from '
        '-Infinity (exclusive) to Infinity (exclusive) '
        'Actual: <NaN>',
      );
    });
  });
}
