public void testGrow() {
    CharTermAttributeImpl t = new CharTermAttributeImpl();
    StringBuilder buf = new StringBuilder("ab");
    for (int i = 0; i < 20; i++) {
      char[] content = buf.toString().toCharArray();
      t.copyBuffer(content, 0, content.length);
      assertEquals(buf.length(), t.length());
      assertEquals(buf.toString(), t.toString());
      buf.append(buf.toString());
    }
    assertEquals(1048576, t.length());

    // now as a StringBuilder, first variant
    t = new CharTermAttributeImpl();
    buf = new StringBuilder("ab");
    for (int i = 0; i < 20; i++) {
      t.setEmpty().append(buf);
      assertEquals(buf.length(), t.length());
      assertEquals(buf.toString(), t.toString());
      buf.append(t);
    }
    assertEquals(1048576, t.length());

    // Test for slow growth to a long term
    t = new CharTermAttributeImpl();
    buf = new StringBuilder("a");
    for (int i = 0; i < 20000; i++) {
      t.setEmpty().append(buf);
      assertEquals(buf.length(), t.length());
      assertEquals(buf.toString(), t.toString());
      buf.append("a");
    }
    assertEquals(20000, t.length());
  }
  public void testCharSequenceInterface() {
    final String s = "0123456789";
    final CharTermAttributeImpl t = new CharTermAttributeImpl();
    t.append(s);

    assertEquals(s.length(), t.length());
    assertEquals("12", t.subSequence(1, 3).toString());
    assertEquals(s, t.subSequence(0, s.length()).toString());

    assertTrue(Pattern.matches("01\\d+", t));
    assertTrue(Pattern.matches("34", t.subSequence(3, 5)));

    assertEquals(s.subSequence(3, 7).toString(), t.subSequence(3, 7).toString());

    for (int i = 0; i < s.length(); i++) {
      assertTrue(t.charAt(i) == s.charAt(i));
    }
  }