// 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"; // TODO(srdjan): Move StringBuffer to visible names. void testConstructor() { StringBuffer bf = new StringBuffer(""); testBufferLength(0, bf); bf = new StringBuffer("abc"); testBufferLength(3, bf); Expect.equals("abc", bf.toString()); bf = new StringBuffer("\x00"); } void testWrite() { StringBuffer bf = new StringBuffer(""); Expect.equals(true, bf.isEmpty); bf.write("a"); testBufferLength(1, bf); Expect.equals("a", bf.toString()); bf = new StringBuffer(""); bf.write("a"); bf.write("b"); Expect.equals("ab", bf.toString()); bf = new StringBuffer("abc"); bf.write("d"); bf.write("e"); bf.write("f"); bf.write("g"); bf.write("h"); bf.write("i"); bf.write("j"); bf.write("k"); bf.write("l"); bf.write("m"); bf.write("n"); bf.write("o"); bf.write("p"); bf.write("q"); bf.write("r"); bf.write("s"); bf.write("t"); bf.write("u"); bf.write("v"); bf.write("w"); bf.write("x"); bf.write("y"); bf.write("z"); bf.write("\n"); bf.write("thequickbrownfoxjumpsoverthelazydog"); Expect.equals( "abcdefghijklmnopqrstuvwxyz\n" "thequickbrownfoxjumpsoverthelazydog", bf.toString()); bf = new StringBuffer(""); for (int i = 0; i < 100000; i++) { bf.write(''); bf.write(""); } Expect.equals("", bf.toString()); } void testLength() { StringBuffer bf = new StringBuffer(""); testBufferLength(0, bf); bf.write("foo"); testBufferLength(3, bf); bf.write("bar"); testBufferLength(6, bf); bf.write(""); testBufferLength(6, bf); } void testIsEmpty() { StringBuffer bf = new StringBuffer(""); Expect.equals(true, bf.isEmpty); bf.write("foo"); Expect.equals(false, bf.isEmpty); } void testWriteAll() { StringBuffer bf = new StringBuffer(""); bf.writeAll(["foo", "bar", "a", "b", "c"]); Expect.equals("foobarabc", bf.toString()); bf.writeAll([]); Expect.equals("foobarabc", bf.toString()); bf.writeAll(["", "", ""]); Expect.equals("foobarabc", bf.toString()); bf.writeAll(["", "", ""], ""); Expect.equals("foobarabc", bf.toString()); StringBuffer bf2 = new StringBuffer(""); bf2.writeAll([], "s"); Expect.equals("", bf2.toString()); StringBuffer bf3 = new StringBuffer(""); bf3.writeAll(["a"], "s"); Expect.equals("a", bf3.toString()); StringBuffer bf4 = new StringBuffer(""); bf4.writeAll(["a", "b"], "s"); Expect.equals("asb", bf4.toString()); } void testWriteAll2() { // Passing `null` for separator is an error that is checked when the iterable // is not empty. This is not specified in the documentation but we want // implementations to be consistent. StringBuffer bf1 = new StringBuffer(""); bf1.writeAll([], null); Expect.equals("", bf1.toString()); StringBuffer bf2 = new StringBuffer(""); Expect.throws(() { bf2.writeAll([1], null); }); } void testWriteln() { StringBuffer bf1 = new StringBuffer(""); bf1.writeln("Hello"); Expect.equals("Hello\n", bf1.toString()); StringBuffer bf2 = new StringBuffer(""); bf2.writeln(); Expect.equals("\n", bf2.toString()); StringBuffer bf3 = new StringBuffer(""); bf3.writeln("\n"); bf3.writeln(null); bf3.writeln(1); Expect.equals("\n\nnull\n1\n", bf3.toString()); } void testClear() { StringBuffer bf = new StringBuffer(""); bf.write("foo"); bf.clear(); Expect.equals("", bf.toString()); testBufferLength(0, bf); bf.write("bar"); Expect.equals("bar", bf.toString()); testBufferLength(3, bf); bf.clear(); Expect.equals("", bf.toString()); testBufferLength(0, bf); } void testToString() { StringBuffer bf = new StringBuffer(""); Expect.equals("", bf.toString()); bf = new StringBuffer("foo"); Expect.equals("foo", bf.toString()); bf = new StringBuffer("foo"); bf.write("bar"); Expect.equals("foobar", bf.toString()); } void testChaining() { StringBuffer bf = new StringBuffer(""); StringBuffer bf2 = new StringBuffer(""); bf2.write("bf2"); bf..write("foo")..write("bar")..write(bf2)..write(bf2)..write("toto"); Expect.equals("foobarbf2bf2toto", bf.toString()); } void testWriteCharCode() { StringBuffer bf1 = new StringBuffer(); StringBuffer bf2 = new StringBuffer(); bf1.write("a"); bf2.writeCharCode(0x61); // a bf1.write("b"); bf2.writeCharCode(0x62); // b bf1.write("c"); bf2.writeCharCode(0x63); // c bf1.write(new String.fromCharCode(0xD823)); bf2.writeCharCode(0xD823); bf1.write(new String.fromCharCode(0xDC23)); bf2.writeCharCode(0xDC23); bf1.write("\u{1d49e}"); bf2.writeCharCode(0x1d49e); bf1.write("\x00"); bf2.writeCharCode(0); Expect.equals(bf1.toString(), bf2.toString()); Expect.equals("abc\u{18c23}\u{1d49e}\x00", bf2.toString()); // Mixing strings and char-codes. bf1.clear(); bf1.write("abcde"); bf1.writeCharCode(0x61); bf1.writeCharCode(0x62); bf1.writeCharCode(0x63); bf1.write("d"); bf1.writeCharCode(0x65); Expect.equals("abcdeabcde", bf1.toString()); // Out-of-range character codes are not allowed. Expect.throws(() { bf2.writeCharCode(-1); }); Expect.throws(() { bf2.writeCharCode(0x110000); }); } void testBufferLength(int length, StringBuffer bf) { Expect.equals(length, bf.length); (length == 0 ? Expect.isTrue : Expect.isFalse)(bf.isEmpty); (length != 0 ? Expect.isTrue : Expect.isFalse)(bf.isNotEmpty); } void main() { testToString(); testConstructor(); testLength(); testIsEmpty(); testWrite(); testWriteCharCode(); testWriteAll(); testWriteAll2(); testWriteln(); testClear(); testChaining(); }