// Copyright 2013 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

library quiver.patttern.glob_test;

import 'package:test/test.dart';
import 'package:quiver/pattern.dart';

main() {
  group('Glob', () {
    test('should match "*" against sequences of word chars', () {
      expectGlob("*.html", matches: [
        "a.html",
        "_-\a.html",
        r"^$*?.html",
        "()[]{}.html",
        "↭.html",
        "\u21ad.html",
        "♥.html",
        "\u2665.html"
      ], nonMatches: [
        "a.htm",
        "a.htmlx",
        "/a.html"
      ]);
      expectGlob("foo.*",
          matches: ["foo.html"],
          nonMatches: ["afoo.html", "foo/a.html", "foo.html/a"]);
    });

    test('should match "**" against paths', () {
      expectGlob("**/*.html",
          matches: ["/a.html", "a/b.html", "a/b/c.html", "a/b/c.html/d.html"],
          nonMatches: ["a.html", "a/b.html/c"]);
    });

    test('should match "?" a single word char', () {
      expectGlob("a?",
          matches: ["ab", "a?", "a↭", "a\u21ad", "a\\"],
          nonMatches: ["a", "abc"]);
    });
  });
}

expectGlob(String pattern, {List<String> matches, List<String> nonMatches}) {
  var glob = new Glob(pattern);
  for (var str in matches) {
    expect(glob.hasMatch(str), true);
    expect(glob.allMatches(str).map((m) => m.input), [str]);
    var match = glob.matchAsPrefix(str);
    expect(match.start, 0);
    expect(match.end, str.length);
  }
  for (var str in nonMatches) {
    expect(glob.hasMatch(str), false);
    var m = new List.from(glob.allMatches(str));
    expect(m.length, 0);
    expect(glob.matchAsPrefix(str), null);
  }
}
