// 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 'dart:io';

import 'package:path/path.dart' as p;
import 'package:test/test.dart';

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

import 'utils.dart';

void main() {
  test("create() does nothing", () async {
    await d.nothing('foo').create();
    expect(new File(p.join(d.sandbox, 'foo')).exists(), completion(isFalse));
    expect(new Directory(p.join(d.sandbox, 'foo')).exists(),
        completion(isFalse));
  });

  group("validate()", () {
    test("succeeds if nothing's there", () async {
      await d.nothing('foo').validate();
    });

    test("fails if there's a file", () async {
      await d.file('name.txt', 'contents').create();
      expect(d.nothing('name.txt').validate(), throwsA(toString(equals(
          'Expected nothing to exist at "name.txt", but found a file.'))));
    });

    test("fails if there's a directory", () async {
      await d.dir('dir').create();
      expect(d.nothing('dir').validate(), throwsA(toString(equals(
          'Expected nothing to exist at "dir", but found a directory.'))));
    });

    test("fails if there's a broken link", () async {
      await new Link(p.join(d.sandbox, 'link')).create('nonexistent');
      expect(d.nothing('link').validate(), throwsA(toString(equals(
          'Expected nothing to exist at "link", but found a link.'))));
    });
  });
}
