### Question:
PoolString implements CharSequence, java.io.Serializable { public PoolString after(PoolString other) { if (other.isEmpty()) { return this; } Preconditions.checkArgument(other.base == base); Preconditions.checkArgument(other.startIndex == startIndex); if (other.endIndex == endIndex) { return empty; } Preconditions.checkArgument(other.endIndex < endIndex); return new PoolString(base, other.endIndex, endIndex); } private  PoolString(CharSequence base, int startIndex, int endIndex); static PoolString of(String base); static PoolString of(String base, int startIndex, int endIndex); @Override int length(); @Override char charAt(int index); @Override PoolString subSequence(int start, int end); @Override String toString(); PoolString concat(PoolString other); PoolString concat(String other); static PoolString concat(CharSequence... poolStringsOrStrings); boolean sameAs(CharSequence other); boolean startsWith(String prefix); boolean endsWith(String suffix); int indexOf(String lookingFor); int indexOf(char lookingFor); PoolString until(String lookingFor); PoolString after(PoolString other); int baseLineNumberStart(); int baseLineNumberEnd(); static PoolString empty(); boolean isEmpty();  }### Answer:
@Test public void afterTest() { PoolString abcdef = PoolString.of("abcdef"); PoolString untilA = abcdef.until("a"); Assertions.assertThat(untilA).hasToString(""); Assertions.assertThat(abcdef.after(untilA)).hasToString("abcdef"); PoolString untilC = abcdef.until("c"); Assertions.assertThat(untilC).hasToString("ab"); Assertions.assertThat(abcdef.after(untilC)).hasToString("cdef"); PoolString untilF = abcdef.until("f"); Assertions.assertThat(untilF).hasToString("abcde"); Assertions.assertThat(abcdef.after(untilF)).hasToString("f"); PoolString untilZ = abcdef.until("z"); Assertions.assertThat(untilZ).hasToString("abcdef"); Assertions.assertThat(abcdef.after(untilZ)).hasToString(""); }