// Copyright (c) 2014, 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:glob/glob.dart';
import 'package:path/path.dart' as p;
import 'package:test/test.dart';

void main() {
  test("supports backslash-escaped characters", () {
    expect(r"*[]{,}?()", contains(Glob(r"\*\[\]\{\,\}\?\(\)")));
    if (p.style != p.Style.windows) {
      expect(r"foo\bar", contains(Glob(r"foo\\bar")));
    }
  });

  test("disallows an empty glob", () {
    expect(() => Glob(""), throwsFormatException);
  });

  group("range", () {
    test("supports either ^ or ! for negated ranges", () {
      var bang = Glob("fo[!a-z]");
      expect("foo", isNot(contains(bang)));
      expect("fo2", contains(bang));

      var caret = Glob("fo[^a-z]");
      expect("foo", isNot(contains(caret)));
      expect("fo2", contains(caret));
    });

    test("supports backslash-escaped characters", () {
      var glob = Glob(r"fo[\*\--\]]");
      expect("fo]", contains(glob));
      expect("fo-", contains(glob));
      expect("fo*", contains(glob));
    });

    test("disallows inverted ranges", () {
      expect(() => Glob(r"[z-a]"), throwsFormatException);
    });

    test("disallows empty ranges", () {
      expect(() => Glob(r"[]"), throwsFormatException);
    });

    test("disallows unclosed ranges", () {
      expect(() => Glob(r"[abc"), throwsFormatException);
      expect(() => Glob(r"[-"), throwsFormatException);
    });

    test("disallows dangling ]", () {
      expect(() => Glob(r"abc]"), throwsFormatException);
    });

    test("disallows explicit /", () {
      expect(() => Glob(r"[/]"), throwsFormatException);
      expect(() => Glob(r"[ -/]"), throwsFormatException);
      expect(() => Glob(r"[/-~]"), throwsFormatException);
    });
  });

  group("options", () {
    test("allows empty branches", () {
      var glob = Glob("foo{,bar}");
      expect("foo", contains(glob));
      expect("foobar", contains(glob));
    });

    test("disallows empty options", () {
      expect(() => Glob("{}"), throwsFormatException);
    });

    test("disallows single options", () {
      expect(() => Glob("{foo}"), throwsFormatException);
    });

    test("disallows unclosed options", () {
      expect(() => Glob("{foo,bar"), throwsFormatException);
      expect(() => Glob("{foo,"), throwsFormatException);
    });

    test("disallows dangling }", () {
      expect(() => Glob("foo}"), throwsFormatException);
    });

    test("disallows dangling ] in options", () {
      expect(() => Glob(r"{abc]}"), throwsFormatException);
    });
  });

  test("disallows unescaped parens", () {
    expect(() => Glob("foo(bar"), throwsFormatException);
    expect(() => Glob("foo)bar"), throwsFormatException);
  });
}
