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

// @dart = 2.9

import "package:expect/expect.dart";

// Dart test program for RegExp.allMatches.

class RegExpAllMatchesTest {
  static testIterator() {
    var matches = new RegExp("foo").allMatches("foo foo");
    Iterator it = matches.iterator;
    Expect.isNull(it.current);
    Expect.isTrue(it.moveNext());
    Expect.equals('foo', it.current.group(0));
    Expect.isTrue(it.moveNext());
    Expect.equals('foo', it.current.group(0));
    Expect.isFalse(it.moveNext());

    // Run two iterators over the same results.
    it = matches.iterator;
    Iterator it2 = matches.iterator;
    Expect.isTrue(it.moveNext());
    Expect.isTrue(it2.moveNext());
    Expect.equals('foo', it.current.group(0));
    Expect.equals('foo', it2.current.group(0));
    Expect.isTrue(it.moveNext());
    Expect.isTrue(it2.moveNext());
    Expect.equals('foo', it.current.group(0));
    Expect.equals('foo', it2.current.group(0));
    Expect.equals(false, it.moveNext());
    Expect.equals(false, it2.moveNext());
  }

  static testForEach() {
    var matches = new RegExp("foo").allMatches("foo foo");
    var strbuf = new StringBuffer();
    matches.forEach((Match m) {
      strbuf.write(m.group(0));
    });
    Expect.equals("foofoo", strbuf.toString());
  }

  static testMap() {
    var matches = new RegExp("foo?").allMatches("foo fo foo fo");
    var mapped = matches.map((Match m) => "${m.group(0)}bar");
    Expect.equals(4, mapped.length);
    var strbuf = new StringBuffer();
    for (String s in mapped) {
      strbuf.write(s);
    }
    Expect.equals("foobarfobarfoobarfobar", strbuf.toString());
  }

  static testFilter() {
    var matches = new RegExp("foo?").allMatches("foo fo foo fo");
    var filtered = matches.where((Match m) {
      return m.group(0) == 'foo';
    });
    Expect.equals(2, filtered.length);
    var strbuf = new StringBuffer();
    for (Match m in filtered) {
      strbuf.write(m.group(0));
    }
    Expect.equals("foofoo", strbuf.toString());
  }

  static testEvery() {
    var matches = new RegExp("foo?").allMatches("foo fo foo fo");
    Expect.equals(true, matches.every((Match m) {
      return m.group(0).startsWith("fo");
    }));
    Expect.equals(false, matches.every((Match m) {
      return m.group(0).startsWith("foo");
    }));
  }

  static testSome() {
    var matches = new RegExp("foo?").allMatches("foo fo foo fo");
    Expect.equals(true, matches.any((Match m) {
      return m.group(0).startsWith("fo");
    }));
    Expect.equals(true, matches.any((Match m) {
      return m.group(0).startsWith("foo");
    }));
    Expect.equals(false, matches.any((Match m) {
      return m.group(0).startsWith("fooo");
    }));
  }

  static testIsEmpty() {
    var matches = new RegExp("foo?").allMatches("foo fo foo fo");
    Expect.equals(false, matches.isEmpty);
    matches = new RegExp("fooo").allMatches("foo fo foo fo");
    Expect.equals(true, matches.isEmpty);
  }

  static testGetCount() {
    var matches = new RegExp("foo?").allMatches("foo fo foo fo");
    Expect.equals(4, matches.length);
    matches = new RegExp("fooo").allMatches("foo fo foo fo");
    Expect.equals(0, matches.length);
  }

  static testMain() {
    testIterator();
    testForEach();
    testMap();
    testFilter();
    testEvery();
    testSome();
    testIsEmpty();
    testGetCount();
  }
}

main() {
  RegExpAllMatchesTest.testMain();
}
