// Copyright (c) 2013, 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.

@TestOn('vm')

import 'package:test/test.dart';

import 'package:test_descriptor/test_descriptor.dart' as d;

import 'utils.dart';

void main() {
  group("validate()", () {
    test("succeeds if there's a file matching the pattern and the child",
        () async {
      await d.file('foo', 'blap').create();
      await d.filePattern(new RegExp(r'f..'), 'blap').validate();
    });

    test("succeeds if there's a directory matching the pattern and the child",
        () async {
      await d.dir('foo', [
        d.file('bar', 'baz')
      ]).create();

      await d.dirPattern(new RegExp(r'f..'), [
        d.file('bar', 'baz')
      ]).validate();
    });

    test("succeeds if multiple files match the pattern but only one matches "
        "the child entry", () async {
      await d.file('foo', 'blap').create();
      await d.file('fee', 'blak').create();
      await d.file('faa', 'blut').create();

      await d.filePattern(new RegExp(r'f..'), 'blap').validate();
    });

    test("fails if there's no file matching the pattern", () {
      expect(d.filePattern(new RegExp(r'f..'), 'bar').validate(),
          throwsA(toString(equals(
              'No entries found in sandbox matching /f../.'))));
    });

    test("fails if there's a file matching the pattern but not the entry",
        () async {
      await d.file('foo', 'bap').create();
      expect(d.filePattern(new RegExp(r'f..'), 'bar').validate(),
          throwsA(toString(startsWith('File "foo" should contain:'))));
    });

    test("fails if there's a dir matching the pattern but not the entry",
        () async{
      await d.dir('foo', [
        d.file('bar', 'bap')
      ]).create();

      expect(d.dirPattern(new RegExp(r'f..'), [
        d.file('bar', 'baz')
      ]).validate(),
          throwsA(toString(startsWith('File "foo/bar" should contain:'))));
    });

    test("fails if there are multiple files matching the pattern and the child "
        "entry", () async {
      await d.file('foo', 'bar').create();
      await d.file('fee', 'bar').create();
      await d.file('faa', 'bar').create();
      expect(d.filePattern(new RegExp(r'f..'), 'bar').validate(),
          throwsA(toString(startsWith(
              "Multiple valid entries found in sandbox matching /f../:"))));
    });
  });
}
