// 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:matcher/matcher.dart';
import 'package:test/test.dart';

import 'test_utils.dart';

void main() {
  test('greaterThan', () {
    shouldPass(10, greaterThan(9));
    shouldFail(
        9,
        greaterThan(10),
        'Expected: a value greater than <10> '
        'Actual: <9> '
        'Which: is not a value greater than <10>');
  });

  test('greaterThanOrEqualTo', () {
    shouldPass(10, greaterThanOrEqualTo(10));
    shouldFail(
        9,
        greaterThanOrEqualTo(10),
        'Expected: a value greater than or equal to <10> '
        'Actual: <9> '
        'Which: is not a value greater than or equal to <10>');
  });

  test('lessThan', () {
    shouldFail(
        10,
        lessThan(9),
        'Expected: a value less than <9> '
        'Actual: <10> '
        'Which: is not a value less than <9>');
    shouldPass(9, lessThan(10));
  });

  test('lessThanOrEqualTo', () {
    shouldPass(10, lessThanOrEqualTo(10));
    shouldFail(
        11,
        lessThanOrEqualTo(10),
        'Expected: a value less than or equal to <10> '
        'Actual: <11> '
        'Which: is not a value less than or equal to <10>');
  });

  test('isZero', () {
    shouldPass(0, isZero);
    shouldFail(
        1,
        isZero,
        'Expected: a value equal to <0> '
        'Actual: <1> '
        'Which: is not a value equal to <0>');
  });

  test('isNonZero', () {
    shouldFail(
        0,
        isNonZero,
        'Expected: a value not equal to <0> '
        'Actual: <0> '
        'Which: is not a value not equal to <0>');
    shouldPass(1, isNonZero);
  });

  test('isPositive', () {
    shouldFail(
        -1,
        isPositive,
        'Expected: a positive value '
        'Actual: <-1> '
        'Which: is not a positive value');
    shouldFail(
        0,
        isPositive,
        'Expected: a positive value '
        'Actual: <0> '
        'Which: is not a positive value');
    shouldPass(1, isPositive);
  });

  test('isNegative', () {
    shouldPass(-1, isNegative);
    shouldFail(
        0,
        isNegative,
        'Expected: a negative value '
        'Actual: <0> '
        'Which: is not a negative value');
  });

  test('isNonPositive', () {
    shouldPass(-1, isNonPositive);
    shouldPass(0, isNonPositive);
    shouldFail(
        1,
        isNonPositive,
        'Expected: a non-positive value '
        'Actual: <1> '
        'Which: is not a non-positive value');
  });

  test('isNonNegative', () {
    shouldPass(1, isNonNegative);
    shouldPass(0, isNonNegative);
    shouldFail(
        -1,
        isNonNegative,
        'Expected: a non-negative value '
        'Actual: <-1> '
        'Which: is not a non-negative value');
  });

  group('NaN', () {
    test('greaterThan', () {
      shouldFail(
          double.nan,
          greaterThan(10),
          'Expected: a value greater than <10> '
          'Actual: <NaN> '
          'Which: is not a value greater than <10>');
      shouldFail(
          10,
          greaterThan(double.nan),
          'Expected: a value greater than <NaN> '
          'Actual: <10> '
          'Which: is not a value greater than <NaN>');
    });

    test('lessThanOrEqualTo', () {
      shouldFail(
          double.nan,
          lessThanOrEqualTo(10),
          'Expected: a value less than or equal to <10> '
          'Actual: <NaN> '
          'Which: is not a value less than or equal to <10>');
      shouldFail(
          10,
          lessThanOrEqualTo(double.nan),
          'Expected: a value less than or equal to <NaN> '
          'Actual: <10> '
          'Which: is not a value less than or equal to <NaN>');
    });
  });
}
