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