// 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 test, expect, 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);
  });
}
