// 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.

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 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();
  testWriteln();
  testClear();
  testChaining();
}
