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

// Not all categories are currently used in tests.
// They're retained in case we add more tests.
// ignore_for_file: unreachable_from_main

import "dart:math";

import "package:characters/characters.dart";
import "package:test/test.dart";

import "src/unicode_tests.dart";
import "src/various_tests.dart";

late Random random;

void main([List<String>? args]) {
  // Ensure random seed is part of every test failure message,
  // and that it can be reapplied for testing.
  var seed = (args != null && args.isNotEmpty)
      ? int.parse(args[0])
      : Random().nextInt(0x3FFFFFFF);
  random = Random(seed);
  group("[Random Seed: $seed]", tests);
  group("characters", () {
    test("operations", () {
      var flag = "\u{1F1E9}\u{1F1F0}"; // Regional Indicators "DK".
      var string = "Hi $flag!";
      expect(string.length, 8);
      var cs = gc(string);
      expect(cs.length, 5);
      expect(cs.toList(), ["H", "i", " ", flag, "!"]);
      expect(cs.skip(2).toString(), " $flag!");
      expect(cs.skipLast(2).toString(), "Hi ");
      expect(cs.take(2).toString(), "Hi");
      expect(cs.takeLast(2).toString(), "$flag!");
      expect(cs.getRange(1, 4).toString(), "i $flag");
      expect(cs.characterAt(1).toString(), "i");
      expect(cs.characterAt(3).toString(), flag);

      expect(cs.contains("\u{1F1E9}"), false);
      expect(cs.contains(flag), true);
      expect(cs.contains("$flag!"), false);
      expect(cs.containsAll(gc("$flag!")), true);

      expect(cs.takeWhile((x) => x != " ").toString(), "Hi");
      expect(cs.takeLastWhile((x) => x != " ").toString(), "$flag!");
      expect(cs.skipWhile((x) => x != " ").toString(), " $flag!");
      expect(cs.skipLastWhile((x) => x != " ").toString(), "Hi ");

      expect(cs.findFirst(gc(""))!.moveBack(), false);
      expect(cs.findFirst(gc(flag))!.current, flag);
      expect(cs.findLast(gc(flag))!.current, flag);
      expect(cs.iterator.moveNext(), true);
      expect(cs.iterator.moveBack(), false);
      expect((cs.iterator..moveNext()).current, "H");
      expect(cs.iteratorAtEnd.moveNext(), false);
      expect(cs.iteratorAtEnd.moveBack(), true);
      expect((cs.iteratorAtEnd..moveBack()).current, "!");
    });

    testParts(gc("a"), gc("b"), gc("c"), gc("d"), gc("e"));

    // Composite pictogram example, from https://en.wikipedia.org/wiki/Zero-width_joiner.
    var flag = "\u{1f3f3}"; // U+1F3F3, Flag, waving. Category Pictogram.
    var white = "\ufe0f"; // U+FE0F, Variant selector 16. Category Extend.
    var zwj = "\u200d"; // U+200D, ZWJ
    var rainbow = "\u{1f308}"; // U+1F308, Rainbow. Category Pictogram

    testParts(gc("$flag$white$zwj$rainbow"), gc("$flag$white"), gc(rainbow),
        gc("$flag$zwj$rainbow"), gc("!"));
  });

  group("CharacterRange", () {
    test("new", () {
      var range = CharacterRange("abc");
      expect(range.isEmpty, true);
      expect(range.moveNext(), true);
      expect(range.current, "a");
    });
    group("new.at", () {
      test("simple", () {
        var range = CharacterRange.at("abc", 0);
        expect(range.isEmpty, true);
        expect(range.moveNext(), true);
        expect(range.current, "a");

        range = CharacterRange.at("abc", 1);
        expect(range.isEmpty, true);
        expect(range.moveNext(), true);
        expect(range.current, "b");

        range = CharacterRange.at("abc", 1, 2);
        expect(range.isEmpty, false);
        expect(range.current, "b");
        expect(range.moveNext(), true);

        range = CharacterRange.at("abc", 0, 3);
        expect(range.isEmpty, false);
        expect(range.current, "abc");
        expect(range.moveNext(), false);
      });
      test("complicated", () {
        // Composite pictogram example, from https://en.wikipedia.org/wiki/Zero-width_joiner.
        var flag = "\u{1f3f3}"; // U+1F3F3, Flag, waving. Category Pictogram.
        var white = "\ufe0f"; // U+FE0F, Variant selector 16. Category Extend.
        var zwj = "\u200d"; // U+200D, ZWJ
        var rainbow = "\u{1f308}"; // U+1F308, Rainbow. Category Pictogram

        var rbflag = "$flag$white$zwj$rainbow";
        var string = "-$rbflag-";
        var range = CharacterRange.at(string, 1);
        expect(range.isEmpty, true);
        expect(range.moveNext(), true);
        expect(range.current, rbflag);

        range = range = CharacterRange.at(string, 2);
        expect(range.isEmpty, false);
        expect(range.current, rbflag);

        range = range = CharacterRange.at(string, 0, 2);
        expect(range.isEmpty, false);
        expect(range.current, "-$rbflag");

        range = range = CharacterRange.at(string, 0, 2);
        expect(range.isEmpty, false);
        expect(range.current, "-$rbflag");

        range = range = CharacterRange.at(string, 2, "-$rbflag".length - 1);
        expect(range.isEmpty, false);
        expect(range.current, rbflag);
        expect(range.stringBeforeLength, 1);

        range = range = CharacterRange.at(string, 0, string.length);
        expect(range.isEmpty, false);
        expect(range.current, string);
      });
    });
  });
}

void tests() {
  test("empty", () {
    expectGC(gc(""), []);
  });
  group("gc-ASCII", () {
    for (var text in [
      "",
      "A",
      "123456abcdefab",
    ]) {
      test('"$text"', () {
        expectGC(gc(text), charsOf(text));
      });
    }
    test("CR+NL", () {
      expectGC(gc("a\r\nb"), ["a", "\r\n", "b"]);
      expectGC(gc("a\n\rb"), ["a", "\n", "\r", "b"]);
    });
  });
  group("Non-ASCII single-code point", () {
    for (var text in [
      "à la mode",
      "rødgrød-æble-ål",
    ]) {
      test('"$text"', () {
        expectGC(gc(text), charsOf(text));
      });
    }
  });
  group("Combining marks", () {
    var text = "a\u0300 la mode";
    test('"$text"', () {
      expectGC(gc(text), ["a\u0300", " ", "l", "a", " ", "m", "o", "d", "e"]);
    });
    var text2 = "æble-a\u030Al";
    test('"$text2"', () {
      expectGC(gc(text2), ["æ", "b", "l", "e", "-", "a\u030A", "l"]);
    });
  });

  group("Regional Indicators", () {
    test('"🇦🇩🇰🇾🇪🇸"', () {
      // Andorra, Cayman Islands, Spain.
      expectGC(gc("🇦🇩🇰🇾🇪🇸"), ["🇦🇩", "🇰🇾", "🇪🇸"]);
    });
    test('"X🇦🇩🇰🇾🇪🇸"', () {
      // Other, Andorra, Cayman Islands, Spain.
      expectGC(gc("X🇦🇩🇰🇾🇪🇸"), ["X", "🇦🇩", "🇰🇾", "🇪🇸"]);
    });
    test('"🇩🇰🇾🇪🇸"', () {
      // Denmark, Yemen, unmatched S.
      expectGC(gc("🇩🇰🇾🇪🇸"), ["🇩🇰", "🇾🇪", "🇸"]);
    });
    test('"X🇩🇰🇾🇪🇸"', () {
      // Other, Denmark, Yemen, unmatched S.
      expectGC(gc("X🇩🇰🇾🇪🇸"), ["X", "🇩🇰", "🇾🇪", "🇸"]);
    });
  });

  group("Hangul", () {
    // Individual characters found on Wikipedia. Not expected to make sense.
    test('"읍쌍된밟"', () {
      expectGC(gc("읍쌍된밟"), ["읍", "쌍", "된", "밟"]);
    });
  });

  group("Unicode test", () {
    for (var gcs in splitTests) {
      test("[${testDescription(gcs)}]", () {
        expectGC(gc(gcs.join()), gcs);
      });
    }
  });

  group("Emoji test", () {
    for (var gcs in emojis) {
      test("[${testDescription(gcs)}]", () {
        expectGC(gc(gcs.join()), gcs);
      });
    }
  });

  group("Zalgo test", () {
    for (var gcs in zalgo) {
      test("[${testDescription(gcs)}]", () {
        expectGC(gc(gcs.join()), gcs);
      });
    }
  });
}

// Converts text with no multi-code-point grapheme clusters into
// list of grapheme clusters.
List<String> charsOf(String text) =>
    text.runes.map(String.fromCharCode).toList();

void expectGC(Characters actual, List<String> expected) {
  var text = expected.join();

  // Iterable operations.
  expect(actual.string, text);
  expect(actual.toString(), text);
  expect(actual.toList(), expected);
  expect(actual.length, expected.length);
  if (expected.isNotEmpty) {
    expect(actual.first, expected.first);
    expect(actual.last, expected.last);
  } else {
    expect(() => actual.first, throwsStateError);
    expect(() => actual.last, throwsStateError);
  }
  if (expected.length == 1) {
    expect(actual.single, expected.single);
  } else {
    expect(() => actual.single, throwsStateError);
  }
  expect(actual.isEmpty, expected.isEmpty);
  expect(actual.isNotEmpty, expected.isNotEmpty);
  expect(actual.contains(""), false);
  for (var char in expected) {
    expect(actual.contains(char), true);
  }
  for (var i = 1; i < expected.length; i++) {
    expect(actual.contains(expected[i - 1] + expected[i]), false);
  }
  expect(actual.skip(1).toList(), expected.skip(1).toList());
  expect(actual.take(1).toList(), expected.take(1).toList());
  expect(actual.skip(1).toString(), expected.skip(1).join());
  expect(actual.take(1).toString(), expected.take(1).join());
  expect(actual.getRange(1, 2).toString(), expected.take(2).skip(1).join());

  if (expected.isNotEmpty) {
    expect(actual.skipLast(1).toList(),
        expected.take(expected.length - 1).toList());
    expect(actual.takeLast(1).toList(),
        expected.skip(expected.length - 1).toList());
    expect(actual.skipLast(1).toString(),
        expected.take(expected.length - 1).join());
    expect(actual.takeLast(1).toString(),
        expected.skip(expected.length - 1).join());
  }
  bool isEven(String s) => s.length.isEven;

  expect(
      actual.skipWhile(isEven).toList(), expected.skipWhile(isEven).toList());
  expect(
      actual.takeWhile(isEven).toList(), expected.takeWhile(isEven).toList());
  expect(
      actual.skipWhile(isEven).toString(), expected.skipWhile(isEven).join());
  expect(
      actual.takeWhile(isEven).toString(), expected.takeWhile(isEven).join());

  expect(actual.skipLastWhile(isEven).toString(),
      expected.toList().reversed.skipWhile(isEven).toList().reversed.join());
  expect(actual.takeLastWhile(isEven).toString(),
      expected.toList().reversed.takeWhile(isEven).toList().reversed.join());

  expect(actual.where(isEven).toString(), expected.where(isEven).join());

  expect((actual + actual).toString(), actual.string + actual.string);

  // Iteration.
  var it = actual.iterator;
  expect(it.isEmpty, true);
  for (var i = 0; i < expected.length; i++) {
    expect(it.moveNext(), true);
    expect(it.current, expected[i]);

    expect(actual.elementAt(i), expected[i]);
    expect(actual.skip(i).first, expected[i]);
    expect(actual.characterAt(i).toString(), expected[i]);
    expect(actual.getRange(i, i + 1).toString(), expected[i]);
  }
  expect(it.moveNext(), false);
  for (var i = expected.length - 1; i >= 0; i--) {
    expect(it.moveBack(), true);
    expect(it.current, expected[i]);
  }
  expect(it.moveBack(), false);
  expect(it.isEmpty, true);

  // GraphemeClusters operations.
  expect(actual.toUpperCase().string, text.toUpperCase());
  expect(actual.toLowerCase().string, text.toLowerCase());

  expect(actual.string, text);

  expect(actual.containsAll(gc("")), true);
  expect(actual.containsAll(actual), true);
  if (expected.isNotEmpty) {
    var steps = min(5, expected.length);
    for (var s = 0; s <= steps; s++) {
      var i = expected.length * s ~/ steps;
      expect(actual.startsWith(gc(expected.sublist(0, i).join())), true);
      expect(actual.endsWith(gc(expected.sublist(i).join())), true);
      for (var t = s + 1; t <= steps; t++) {
        var j = expected.length * t ~/ steps;
        var slice = expected.sublist(i, j).join();
        var gcs = gc(slice);
        expect(actual.containsAll(gcs), true);
      }
    }
  }

  {
    // Random walk back and forth.
    var it = actual.iterator;
    var pos = -1;
    if (random.nextBool()) {
      pos = expected.length;
      it = actual.iteratorAtEnd;
    }
    var steps = 5 + random.nextInt(expected.length * 2 + 1);
    var lastMove = false;
    while (true) {
      var back = false;
      if (pos < 0) {
        expect(lastMove, false);
        expect(it.isEmpty, true);
      } else if (pos >= expected.length) {
        expect(lastMove, false);
        expect(it.isEmpty, true);
        back = true;
      } else {
        expect(lastMove, true);
        expect(it.current, expected[pos]);
        back = random.nextBool();
      }
      if (--steps < 0) break;
      if (back) {
        lastMove = it.moveBack();
        pos -= 1;
      } else {
        lastMove = it.moveNext();
        pos += 1;
      }
    }
  }
}

Characters gc(String string) => Characters(string);

void testParts(
    Characters a, Characters b, Characters c, Characters d, Characters e) {
  var cs = gc("$a$b$c$d$e");
  test("$cs", () {
    var it = cs.iterator;
    expect(it.isEmpty, true);
    expect(it.isNotEmpty, false);
    expect(it.current, "");

    // moveNext().
    expect(it.moveNext(), true);
    expect(it.isEmpty, false);
    expect(it.current, "$a");
    expect(it.moveNext(), true);
    expect(it.isEmpty, false);
    expect(it.current, "$b");
    expect(it.moveNext(), true);
    expect(it.isEmpty, false);
    expect(it.current, "$c");
    expect(it.moveNext(), true);
    expect(it.isEmpty, false);
    expect(it.current, "$d");
    expect(it.moveNext(), true);
    expect(it.isEmpty, false);
    expect(it.current, "$e");
    expect(it.moveNext(), false);
    expect(it.isEmpty, true);
    expect(it.current, "");

    // moveBack().
    expect(it.moveBack(), true);
    expect(it.isEmpty, false);
    expect(it.current, "$e");
    expect(it.moveBack(), true);
    expect(it.isEmpty, false);
    expect(it.current, "$d");
    expect(it.moveBack(), true);
    expect(it.isEmpty, false);
    expect(it.current, "$c");
    expect(it.moveBack(), true);
    expect(it.isEmpty, false);
    expect(it.current, "$b");
    expect(it.moveBack(), true);
    expect(it.isEmpty, false);
    expect(it.current, "$a");
    expect(it.moveBack(), false);
    expect(it.isEmpty, true);
    expect(it.current, "");

    // moveNext(int).
    expect(it.moveTo(c), true);
    expect(it.current, "$c");
    expect(it.moveTo(b), false);
    expect(it.moveTo(c), false);
    expect(it.current, "$c");
    expect(it.moveTo(d), true);
    expect(it.current, "$d");

    // moveBack(c).
    expect(it.moveBackTo(c), true);
    expect(it.current, "$c");
    expect(it.moveBackTo(d), false);
    expect(it.moveBackTo(c), false);
    expect(it.moveBackTo(a), true);
    expect(it.current, "$a");

    // moveNext(n)
    expect(it.moveBack(), false);

    expect(it.moveNext(2), true);
    expect(it.current, "$a$b");
    expect(it.moveNext(4), false);
    expect(it.current, "$c$d$e");
    expect(it.moveNext(0), true);
    expect(it.current, "");
    expect(it.moveNext(1), false);
    expect(it.current, "");

    // moveBack(n).
    expect(it.moveBack(2), true);
    expect(it.current, "$d$e");
    expect(it.moveBack(1), true);
    expect(it.current, "$c");
    expect(it.moveBack(3), false);
    expect(it.current, "$a$b");
    expect(it.moveBack(), false);

    // moveFirst.
    it.expandAll();
    expect(it.current, "$a$b$c$d$e");
    expect(it.collapseToFirst(b), true);
    expect(it.current, "$b");
    it.expandAll();
    expect(it.current, "$b$c$d$e");
    expect(it.collapseToFirst(a), false);
    expect(it.current, "$b$c$d$e");

    // moveBackTo
    it.expandBackAll();
    expect(it.current, "$a$b$c$d$e");
    expect(it.collapseToLast(c), true);
    expect(it.current, "$c");

    // includeNext/includePrevious
    expect(it.expandTo(e), true);
    expect(it.current, "$c$d$e");
    expect(it.expandTo(e), false);
    expect(it.expandBackTo(b), true);
    expect(it.current, "$b$c$d$e");
    expect(it.expandBackTo(b), false);
    expect(it.current, "$b$c$d$e");
    expect(it.collapseToFirst(c), true);
    expect(it.current, "$c");

    // includeUntilNext/expandBackUntil
    expect(it.expandBackUntil(a), true);
    expect(it.current, "$b$c");
    expect(it.expandBackUntil(a), true);
    expect(it.current, "$b$c");
    expect(it.expandUntil(e), true);
    expect(it.current, "$b$c$d");
    expect(it.expandUntil(e), true);
    expect(it.current, "$b$c$d");

    // dropFirst/dropLast
    expect(it.dropFirst(), true);
    expect(it.current, "$c$d");
    expect(it.dropLast(), true);
    expect(it.current, "$c");
    it.expandBackAll();
    it.expandAll();
    expect(it.current, "$a$b$c$d$e");
    expect(it.dropTo(b), true);
    expect(it.current, "$c$d$e");
    expect(it.dropBackTo(d), true);
    expect(it.current, "$c");

    it.expandBackAll();
    it.expandAll();
    expect(it.current, "$a$b$c$d$e");

    expect(it.dropUntil(b), true);
    expect(it.current, "$b$c$d$e");
    expect(it.dropBackUntil(d), true);
    expect(it.current, "$b$c$d");

    it.dropWhile((x) => x == b.string);
    expect(it.current, "$c$d");
    it.expandBackAll();
    expect(it.current, "$a$b$c$d");
    it.dropBackWhile((x) => x != b.string);
    expect(it.current, "$a$b");
    it.dropBackWhile((x) => false);
    expect(it.current, "$a$b");

    // include..While
    it.expandWhile((x) => false);
    expect(it.current, "$a$b");
    it.expandWhile((x) => x != e.string);
    expect(it.current, "$a$b$c$d");
    expect(it.collapseToFirst(c), true);
    expect(it.current, "$c");
    it.expandBackWhile((x) => false);
    expect(it.current, "$c");
    it.expandBackWhile((x) => x != a.string);
    expect(it.current, "$b$c");

    var cs2 = cs.replaceAll(c, gc(""));
    var cs3 = cs.replaceFirst(c, gc(""));
    var cs4 = cs.findFirst(c)!.replaceRange(gc("")).source;
    var cse = gc("$a$b$d$e");
    expect(cs2, cse);
    expect(cs3, cse);
    expect(cs4, cse);
    var cs5 = cs4.replaceAll(a, c);
    expect(cs5, gc("$c$b$d$e"));
    var cs6 = cs5.replaceAll(gc(""), a);
    expect(cs6, gc("$a$c$a$b$a$d$a$e$a"));
    var cs7 = cs6.replaceFirst(b, a);
    expect(cs7, gc("$a$c$a$a$a$d$a$e$a"));
    var cs8 = cs7.replaceFirst(e, a);
    expect(cs8, gc("$a$c$a$a$a$d$a$a$a"));
    var cs9 = cs8.replaceAll(a + a, b);
    expect(cs9, gc("$a$c$b$a$d$b$a"));
    it = cs9.iterator;
    it.moveTo(b + a);
    expect("$b$a", it.current);
    it.expandTo(b + a);
    expect("$b$a$d$b$a", it.current);
    var cs10 = it.replaceAll(b + a, e + e)!;
    expect(cs10.currentCharacters, e + e + d + e + e);
    expect(cs10.source, gc("$a$c$e$e$d$e$e"));
    var cs11 = it.replaceRange(e);
    expect(cs11.currentCharacters, e);
    expect(cs11.source, gc("$a$c$e"));

    var cs12 = gc("$a$b$a");
    expect(cs12.split(b), [a, a]);
    expect(cs12.split(a), [gc(""), b, gc("")]);
    expect(cs12.split(a, 2), [gc(""), gc("$b$a")]);

    expect(cs12.split(gc("")), [a, b, a]);
    expect(cs12.split(gc(""), 2), [a, gc("$b$a")]);

    expect(gc("").split(gc("")), [gc("")]);

    var cs13 = gc("$b$a$b$a$b$a");
    expect(cs13.split(b), [gc(""), a, a, a]);
    expect(cs13.split(b, 1), [cs13]);
    expect(cs13.split(b, 2), [gc(""), gc("$a$b$a$b$a")]);
    expect(cs13.split(b, 3), [gc(""), a, gc("$a$b$a")]);
    expect(cs13.split(b, 4), [gc(""), a, a, a]);
    expect(cs13.split(b, 5), [gc(""), a, a, a]);
    expect(cs13.split(b, 9999), [gc(""), a, a, a]);
    expect(cs13.split(b, 0), [gc(""), a, a, a]);
    expect(cs13.split(b, -1), [gc(""), a, a, a]);
    expect(cs13.split(b, -9999), [gc(""), a, a, a]);

    it = cs13.iterator..expandAll();
    expect(it.current, "$b$a$b$a$b$a");
    it.dropFirst();
    it.dropLast();
    expect(it.current, "$a$b$a$b");
    expect(it.split(a).map((range) => range.current), ["", "$b", "$b"]);
    expect(it.split(a, 2).map((range) => range.current), ["", "$b$a$b"]);
    // Each split is after an *a*.
    var first = true;
    for (var range in it.split(a)) {
      if (range.isEmpty) {
        // First range is empty.
        expect(first, true);
        first = false;
        continue;
      }
      // Later ranges are "b" that come after "a".
      expect(range.current, "$b");
      range.moveBack();
      expect(range.current, "$a");
    }

    expect(it.split(gc("")).map((range) => range.current),
        ["$a", "$b", "$a", "$b"]);

    expect(gc("").iterator.split(gc("")).map((range) => range.current), [""]);

    expect(cs.startsWith(gc("")), true);
    expect(cs.startsWith(a), true);
    expect(cs.startsWith(a + b), true);
    expect(cs.startsWith(gc("$a$b$c")), true);
    expect(cs.startsWith(gc("$a$b$c$d")), true);
    expect(cs.startsWith(gc("$a$b$c$d$e")), true);
    expect(cs.startsWith(b), false);
    expect(cs.startsWith(c), false);
    expect(cs.startsWith(d), false);
    expect(cs.startsWith(e), false);

    expect(cs.endsWith(gc("")), true);
    expect(cs.endsWith(e), true);
    expect(cs.endsWith(d + e), true);
    expect(cs.endsWith(gc("$c$d$e")), true);
    expect(cs.endsWith(gc("$b$c$d$e")), true);
    expect(cs.endsWith(gc("$a$b$c$d$e")), true);
    expect(cs.endsWith(d), false);
    expect(cs.endsWith(c), false);
    expect(cs.endsWith(b), false);
    expect(cs.endsWith(a), false);

    it = cs.findFirst(b + c)!;
    expect(it.startsWith(gc("")), true);
    expect(it.startsWith(b), true);
    expect(it.startsWith(b + c), true);
    expect(it.startsWith(a + b + c), false);
    expect(it.startsWith(b + c + d), false);
    expect(it.startsWith(a), false);

    expect(it.endsWith(gc("")), true);
    expect(it.endsWith(c), true);
    expect(it.endsWith(b + c), true);
    expect(it.endsWith(a + b + c), false);
    expect(it.endsWith(b + c + d), false);
    expect(it.endsWith(d), false);

    it.collapseToFirst(c);
    expect(it.isPrecededBy(gc("")), true);
    expect(it.isPrecededBy(b), true);
    expect(it.isPrecededBy(a + b), true);
    expect(it.isPrecededBy(a + b + c), false);
    expect(it.isPrecededBy(a), false);

    expect(it.isFollowedBy(gc("")), true);
    expect(it.isFollowedBy(d), true);
    expect(it.isFollowedBy(d + e), true);
    expect(it.isFollowedBy(c + d + e), false);
    expect(it.isFollowedBy(e), false);
  });
  test("replace methods", () {
    // Unicode grapheme breaking character classes,
    // represented by their first value.

    var pattern = gc("\t"); // A non-combining entry to be replaced.
    var non = gc("");

    var c = otr + cr + pattern + lf + pic + pattern + zwj + pic + otr;
    var r = c.replaceAll(pattern, non);
    expect(r, otr + cr + lf + pic + zwj + pic + otr);
    var ci = c.iterator..moveNextAll();
    var ri = ci.replaceAll(pattern, non)!;
    expect(ri.currentCharacters, otr + cr + lf + pic + zwj + pic + otr);
    ci.dropFirst();
    ci.dropLast();
    expect(ci.currentCharacters, cr + pattern + lf + pic + pattern + zwj + pic);
    expect(ci.currentCharacters.length, 7);
    ri = ci.replaceAll(pattern, non)!;
    expect(ri.currentCharacters, cr + lf + pic + zwj + pic);
    expect(ri.currentCharacters.length, 2);
    ci.dropFirst();
    ci.dropLast(5);
    expect(ci.currentCharacters, pattern);
    ri = ci.replaceAll(pattern, non)!;
    expect(ri.currentCharacters, cr + lf);
    ci.moveNext(2);
    ci.moveNext(1);
    expect(ci.currentCharacters, pattern);
    ri = ci.replaceAll(pattern, non)!;
    expect(ri.currentCharacters, pic + zwj + pic);

    c = otr + pic + ext + pattern + pic + ext + otr;
    expect(c.length, 5);
    ci = c.iterator..moveTo(pattern);
    expect(ci.currentCharacters, pattern);
    ri = ci.replaceAll(pattern, zwj)!;
    expect(ri.currentCharacters, pic + ext + zwj + pic + ext);

    c = reg + pattern + reg + reg;
    ci = c.iterator..moveTo(pattern);
    ri = ci.replaceRange(non);
    expect(ri.currentCharacters, reg + reg);
    expect(ri.moveNext(), true);
    expect(ri.currentCharacters, reg);
  });
}

/// Sample characters from each breaking algorithm category.
final Characters ctl = gc("\x00"); // Control, NUL.
final Characters cr = gc("\r"); // Carriage Return, CR.
final Characters lf = gc("\n"); // Newline, NL.
final Characters otr = gc(" "); // Other, Space.
final Characters ext = gc("\u0300"); // Extend, Combining Grave Accent.
final Characters spc = gc("\u0903"); // Spacing Mark, Devanagari Sign Visarga.
final Characters pre = gc("\u0600"); // Prepend, Arabic Number Sign.
final Characters zwj = gc("\u200d"); // Zero-Width Joiner.
final Characters pic = gc("\u00a9"); // Extended Pictographic, Copyright.
final Characters reg = gc("\u{1f1e6}"); // Regional Identifier "a".
final Characters hanl = gc("\u1100"); // Hangul L, Choseong Kiyeok.
final Characters hanv = gc("\u1160"); // Hangul V, Jungseong Filler.
final Characters hant = gc("\u11a8"); // Hangul T, Jongseong Kiyeok.
final Characters hanlv = gc("\uac00"); // Hangul LV, Syllable Ga.
final Characters hanlvt = gc("\uac01"); // Hangul LVT, Syllable Gag.
