// 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' show expect, test, throwsArgumentError;

import 'test_utils.dart';

void main() {
  test('anyOf', () {
    // with a list
    shouldFail(
      0,
      anyOf([equals(1), equals(2)]),
      'Expected: (<1> or <2>) Actual: <0>',
    );
    shouldPass(1, anyOf([equals(1), equals(2)]));

    // with individual items
    shouldFail(
      0,
      anyOf(equals(1), equals(2)),
      'Expected: (<1> or <2>) Actual: <0>',
    );
    shouldPass(1, anyOf(equals(1), equals(2)));
  });

  test('allOf', () {
    // with a list
    shouldPass(1, allOf([lessThan(10), greaterThan(0)]));
    shouldFail(
      -1,
      allOf([lessThan(10), greaterThan(0)]),
      'Expected: (a value less than <10> and a value greater than <0>) '
      'Actual: <-1> '
      'Which: is not a value greater than <0>',
    );

    // with individual items
    shouldPass(1, allOf(lessThan(10), greaterThan(0)));
    shouldFail(
      -1,
      allOf(lessThan(10), greaterThan(0)),
      'Expected: (a value less than <10> and a value greater than <0>) '
      'Actual: <-1> '
      'Which: is not a value greater than <0>',
    );

    // with maximum items
    shouldPass(
      1,
      allOf(
        lessThan(10),
        lessThan(9),
        lessThan(8),
        lessThan(7),
        lessThan(6),
        lessThan(5),
        lessThan(4),
      ),
    );
    shouldFail(
      4,
      allOf(
        lessThan(10),
        lessThan(9),
        lessThan(8),
        lessThan(7),
        lessThan(6),
        lessThan(5),
        lessThan(4),
      ),
      'Expected: (a value less than <10> and a value less than <9> and a '
      'value less than <8> and a value less than <7> and a value less than '
      '<6> and a value less than <5> and a value less than <4>) '
      'Actual: <4> '
      'Which: is not a value less than <4>',
    );
  });

  test('If the first argument is a List, the rest must be null', () {
    expect(() => allOf([], 5), throwsArgumentError);
    expect(
      () => anyOf([], null, null, null, null, null, 42),
      throwsArgumentError,
    );
  });
}
