// Copyright (c) 2021, 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:analyzer_utilities/check/check.dart';
import 'package:test/test.dart';

void main() {
  group('type', () {
    group('bool', () {
      test('isEqualTo', () {
        check(true).isEqualTo(true);
        check(false).isEqualTo(false);
        _fails(() => check(true).isEqualTo(false));
        _fails(() => check(false).isEqualTo(true));
      });
      test('isFalse', () {
        check(false).isFalse;
        _fails(() => check(true).isFalse);
      });
      test('isNotEqualTo', () {
        check(true).isNotEqualTo(false);
        check(false).isNotEqualTo(true);
        _fails(() => check(true).isNotEqualTo(true));
        _fails(() => check(false).isNotEqualTo(false));
      });
      test('isTrue', () {
        check(true).isTrue;
        _fails(() => check(false).isTrue);
      });
    });
    group('equality', () {
      test('isIdenticalTo', () {
        final a = Object();
        final b = Object();
        check(a).isIdenticalTo(a);
        _fails(() => check(a).isIdenticalTo(b));
      });
    });
    group('int', () {
      test('isEqualTo', () {
        check(0).isEqualTo(0);
        check(1).isEqualTo(1);
        check(2).isEqualTo(2);
        _fails(() => check(0).isEqualTo(1));
        _fails(() => check(1).isEqualTo(0));
      });
      test('isGreaterThan', () {
        check(2).isGreaterThan(1);
        check(1).isGreaterThan(0);
        check(-1).isGreaterThan(-2);
        _fails(() => check(0).isGreaterThan(0));
        _fails(() => check(0).isGreaterThan(1));
        _fails(() => check(1).isGreaterThan(2));
        _fails(() => check(-2).isGreaterThan(-1));
      });
      test('isNotEqualTo', () {
        check(0).isNotEqualTo(1);
        check(1).isNotEqualTo(0);
        check(1).isNotEqualTo(2);
        check(2).isNotEqualTo(1);
        _fails(() => check(0).isNotEqualTo(0));
        _fails(() => check(1).isNotEqualTo(1));
        _fails(() => check(2).isNotEqualTo(2));
      });
      test('isZero', () {
        check(0).isZero;
        _fails(() => check(1).isZero);
        _fails(() => check(-1).isZero);
      });
    });
    group('Iterable', () {
      test('containsMatch', () {
        check(<int>[0]).containsMatch((e) => e.isZero);
        check(<int>[1, 0, 2]).containsMatch((e) => e.isZero);
        _fails(() => check(<int>[]).containsMatch((e) => e.isZero));
        _fails(() => check(<int>[1]).containsMatch((e) => e.isZero));
      });
      test('excludesAll', () {
        check(<int>[]).excludesAll([
          (e) => e.isEqualTo(0),
        ]);
        check([1]).excludesAll([
          (e) => e.isEqualTo(0),
          (e) => e.isEqualTo(2),
        ]);
        // Fails if any match.
        _fails(() {
          check(<int>[0]).excludesAll([
            (e) => e.isEqualTo(0),
          ]);
        });
        _fails(() {
          check(<int>[0]).excludesAll([
            (e) => e.isZero,
          ]);
        });
        _fails(() {
          check(<int>[0]).excludesAll([
            (e) => e.isEqualTo(2),
            (e) => e.isEqualTo(1),
            (e) => e.isEqualTo(0),
          ]);
        });
      });
      test('hasLength', () {
        check(<int>[]).hasLength().isZero;
        check(<int>[0]).hasLength().isEqualTo(1);
        check(<int>[0]).hasLength(1);
        check(<int>[0, 1]).hasLength().isEqualTo(2);
        check(<int>[0, 1]).hasLength(2);
        check(<int>{}).hasLength().isZero;
        check(<int>{0}).hasLength().isEqualTo(1);
        check(<int>{0}).hasLength(1);
        check(<int>{0, 1}).hasLength().isEqualTo(2);
        check(<int>{0, 1}).hasLength(2);
        _fails(() => check(<int>[]).hasLength(1));
        _fails(() => check(<int>[]).hasLength(2));
        _fails(() => check(<int>{}).hasLength(1));
        _fails(() => check(<int>{}).hasLength(2));
        _fails(() => check(<int>[]).hasLength().isEqualTo(1));
        _fails(() => check(<int>[0]).hasLength().isEqualTo(0));
      });
      test('includesAll', () {
        // Extra elements are OK.
        check([0, 1, 2]).includesAll([
          (e) => e.isEqualTo(0),
          (e) => e.isEqualTo(1),
        ]);
        // Order does not matter.
        check([0, 1, 2]).includesAll([
          (e) => e.isEqualTo(1),
          (e) => e.isEqualTo(0),
        ]);
        // Must have all elements.
        _fails(() {
          check(<int>[]).includesAll([
            (e) => e.isEqualTo(0),
          ]);
        });
        _fails(() {
          check([0]).includesAll([
            (e) => e.isEqualTo(0),
            (e) => e.isEqualTo(1),
          ]);
        });
        _fails(() {
          check([1]).includesAll([
            (e) => e.isEqualTo(0),
            (e) => e.isEqualTo(1),
          ]);
        });
      });
      test('includesAllInOrder', () {
        // Extra elements are OK.
        check([0, 1, 2, 3, 4]).includesAllInOrder([
          (e) => e.isEqualTo(0),
          (e) => e.isEqualTo(3),
        ]);
        // Exactly one element should match.
        _fails(() {
          check([0, 1, 0, 2]).includesAllInOrder([
            (e) => e.isZero,
          ]);
        });
        // Must be in the requested order.
        _fails(() {
          check([0, 1, 2]).includesAllInOrder([
            (e) => e.isEqualTo(1),
            (e) => e.isEqualTo(0),
          ]);
        });
        // Must have all elements.
        _fails(() {
          check(<int>[]).includesAllInOrder([
            (e) => e.isEqualTo(0),
          ]);
        });
        _fails(() {
          check([0]).includesAllInOrder([
            (e) => e.isEqualTo(0),
            (e) => e.isEqualTo(1),
          ]);
        });
        _fails(() {
          check([1]).includesAllInOrder([
            (e) => e.isEqualTo(0),
            (e) => e.isEqualTo(1),
          ]);
        });
      });
      test('isEmpty', () {
        check(<int>[]).isEmpty;
        check(<int>{}).isEmpty;
        _fails(() => check([0]).isEmpty);
        _fails(() => check([0, 1]).isEmpty);
        _fails(() => check({0}).isEmpty);
        _fails(() => check({0, 1}).isEmpty);
      });
      test('isNotEmpty', () {
        check([0]).isNotEmpty;
        check([0, 1]).isNotEmpty;
        check({0}).isNotEmpty;
        check({0, 1}).isNotEmpty;
        _fails(() => check(<int>[]).isNotEmpty);
        _fails(() => check(<int>{}).isNotEmpty);
      });
      test('matches', () {
        check(<int>[]).matches([]);
        check(<int>[0]).matches([
          (e) => e.isEqualTo(0),
        ]);
        check(<int>[0, 1]).matches([
          (e) => e.isEqualTo(0),
          (e) => e.isEqualTo(1),
        ]);
        // Order is important.
        _fails(
          () => check([0, 1]).matches([
            (e) => e.isEqualTo(1),
            (e) => e.isEqualTo(0),
          ]),
        );
        // Too few matchers.
        _fails(
          () => check([0, 1]).matches([
            (e) => e.isEqualTo(0),
          ]),
        );
        // Too many matchers.
        _fails(
          () => check([0]).matches([
            (e) => e.isEqualTo(0),
            (e) => e.isEqualTo(1),
          ]),
        );
      });
      test('matchesInAnyOrder', () {
        // Order does not matter.
        check([0, 1]).matchesInAnyOrder([
          (e) => e.isEqualTo(0),
          (e) => e.isEqualTo(1),
        ]);
        check([0, 1]).matchesInAnyOrder([
          (e) => e.isEqualTo(1),
          (e) => e.isEqualTo(0),
        ]);
        // Matchers can be different.
        check([0, 1]).matchesInAnyOrder([
          (e) => e.isZero,
          (e) => e.isEqualTo(1),
        ]);
        check([0, 10]).matchesInAnyOrder([
          (e) => e.isZero,
          (e) => e.isGreaterThan(5),
        ]);
        // Wrong number of matchers.
        _fails(
          () => check([0, 1]).matchesInAnyOrder([
            (e) => e.isZero,
          ]),
        );
        // The first matcher accepts more than one element.
        _fails(
          () => check([1, 2]).matchesInAnyOrder([
            (e) => e.isGreaterThan(0),
            (e) => e.isEqualTo(2),
          ]),
        );
        // The second matcher accepts more than one element.
        _fails(
          () => check([1, 2]).matchesInAnyOrder([
            (e) => e.isEqualTo(2),
            (e) => e.isGreaterThan(0),
          ]),
        );
      });
    });
    group('nullability', () {
      // ignore: unnecessary_nullable_for_final_variable_declarations
      const int? notNullable = 0;
      const int? nullable = null;
      test('isNotNull', () {
        check(notNullable).isNotNull;
        _fails(() => check(nullable).isNotNull.isZero);
      });
      test('isNull', () {
        check(nullable).isNull;
        _fails(() => check(notNullable).isNull);
      });
    });
    group('String', () {
      test('contains', () {
        check('abc').contains('a');
        check('abc').contains('b');
        check('abc').contains('c');
        check('abc').contains('ab');
        check('abc').contains('bc');
        check('abc').contains(RegExp('a'));
        check('abc').contains(RegExp('a.'));
        check('abc').contains(RegExp('a.c'));
        check('abc').contains(RegExp('.b.'));
        _fails(() => check('abc').contains('x'));
        _fails(() => check('abc').contains('ac'));
        _fails(() => check('abc').contains(RegExp('ac.')));
      });
      test('hasLength', () {
        check('').hasLength().isZero;
        check('').hasLength(0);
        check('a').hasLength().isEqualTo(1);
        check('a').hasLength(1);
        check('abc').hasLength().isEqualTo(3);
        check('abc').hasLength(3);
        _fails(() => check('abc').hasLength(0));
        _fails(() => check('abc').hasLength(1));
        _fails(() => check('abc').hasLength(2));
      });
      test('isEqualTo', () {
        check('').isEqualTo('');
        check('abc').isEqualTo('abc');
        check('foobar').isEqualTo('foobar');
        _fails(() => check('abc').isEqualTo('ab'));
        _fails(() => check('abc').isEqualTo('xyz'));
      });
      test('isNotEqualTo', () {
        check('abc').isNotEqualTo('ab');
        check('abc').isNotEqualTo('xyz');
        _fails(() => check('abc').isNotEqualTo('abc'));
        _fails(() => check('foobar').isNotEqualTo('foobar'));
      });
      test('startsWith', () {
        check('abc').startsWith('a');
        check('abc').startsWith('ab');
        check('abc').startsWith('abc');
        check('abc').startsWith(RegExp('..c'));
        check('abc').startsWith(RegExp('.*c'));
        _fails(() => check('abc').startsWith('b'));
        _fails(() => check('abc').startsWith('x'));
        _fails(() => check('abc').startsWith(RegExp('.c')));
      });
    });
    group('type', () {
      test('hasExactType', () {
        check(42).hasExactType<int>();
        _fails(() => check(42 as dynamic).hasExactType<num>());
      });
      test('isA', () {
        check(0).isA<int>();
        _fails(() => check('abc' as dynamic).isA<int>());
      });
    });
    test('which', () {
      check(0).which((e) => e.isZero);
      _fails(() => check(1).which((e) => e.isZero));
    });
  });
}

void _fails(void Function() f) {
  try {
    f();
  } on TestFailure {
    return;
  }
  fail('expected to fail');
}
