// 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() {
  group("Glob.quote()", () {
    test("quotes all active characters", () {
      expect(Glob.quote("*{[?\\}],-"), equals(r"\*\{\[\?\\\}\]\,\-"));
    });

    test("doesn't quote inactive characters", () {
      expect(Glob.quote("abc~`_+="), equals("abc~`_+="));
    });
  });

  group("Glob.matches()", () {
    test("returns whether the path matches the glob", () {
      var glob = Glob("foo*");
      expect(glob.matches("foobar"), isTrue);
      expect(glob.matches("baz"), isFalse);
    });

    test("only matches the entire path", () {
      var glob = Glob("foo");
      expect(glob.matches("foo/bar"), isFalse);
      expect(glob.matches("bar/foo"), isFalse);
    });
  });

  group("Glob.matchAsPrefix()", () {
    test("returns a match if the path matches the glob", () {
      var glob = Glob("foo*");
      expect(glob.matchAsPrefix("foobar"), isA<Match>());
      expect(glob.matchAsPrefix("baz"), isNull);
    });

    test("returns null for start > 0", () {
      var glob = Glob("*");
      expect(glob.matchAsPrefix("foobar", 1), isNull);
    });
  });

  group("Glob.allMatches()", () {
    test("returns a single match if the path matches the glob", () {
      var matches = Glob("foo*").allMatches("foobar");
      expect(matches, hasLength(1));
      expect(matches.first, isA<Match>());
    });

    test("returns an empty list if the path doesn't match the glob", () {
      expect(Glob("foo*").allMatches("baz"), isEmpty);
    });

    test("returns no matches for start > 0", () {
      var glob = Glob("*");
      expect(glob.allMatches("foobar", 1), isEmpty);
    });
  });

  group("GlobMatch", () {
    var glob = Glob("foo*");
    var match = glob.matchAsPrefix("foobar");

    test("returns the string as input", () {
      expect(match.input, equals("foobar"));
    });

    test("returns the glob as the pattern", () {
      expect(match.pattern, equals(glob));
    });

    test("returns the span of the string for start and end", () {
      expect(match.start, equals(0));
      expect(match.end, equals("foobar".length));
    });

    test("has a single group that contains the whole string", () {
      expect(match.groupCount, equals(0));
      expect(match[0], equals("foobar"));
      expect(match.group(0), equals("foobar"));
      expect(match.groups([0]), equals(["foobar"]));
    });

    test("throws a range error for an invalid group", () {
      expect(() => match[1], throwsRangeError);
      expect(() => match[-1], throwsRangeError);
      expect(() => match.group(1), throwsRangeError);
      expect(() => match.groups([1]), throwsRangeError);
    });
  });

  test("globs are case-sensitive by default for Posix and URL contexts", () {
    expect("foo", contains(Glob("foo", context: p.posix)));
    expect("FOO", isNot(contains(Glob("foo", context: p.posix))));
    expect("foo", isNot(contains(Glob("FOO", context: p.posix))));

    expect("foo", contains(Glob("foo", context: p.url)));
    expect("FOO", isNot(contains(Glob("foo", context: p.url))));
    expect("foo", isNot(contains(Glob("FOO", context: p.url))));
  });

  test("globs are case-insensitive by default for Windows contexts", () {
    expect("foo", contains(Glob("foo", context: p.windows)));
    expect("FOO", contains(Glob("foo", context: p.windows)));
    expect("foo", contains(Glob("FOO", context: p.windows)));
  });
}
