// Copyright (c) 2016, 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:convert/convert.dart';
import 'package:test/test.dart';

void main() {
  late StringAccumulatorSink sink;
  setUp(() {
    sink = StringAccumulatorSink();
  });

  test("provides access to the concatenated string", () {
    expect(sink.string, isEmpty);

    sink.add("foo");
    expect(sink.string, equals("foo"));

    sink.addSlice(" bar baz", 1, 4, false);
    expect(sink.string, equals("foobar"));
  });

  test("clear() clears the string", () {
    sink.add("foo");
    expect(sink.string, equals("foo"));

    sink.clear();
    expect(sink.string, isEmpty);

    sink.add("bar");
    expect(sink.string, equals("bar"));
  });

  test("indicates whether the sink is closed", () {
    expect(sink.isClosed, isFalse);
    sink.close();
    expect(sink.isClosed, isTrue);
  });

  test("indicates whether the sink is closed via addSlice", () {
    expect(sink.isClosed, isFalse);
    sink.addSlice("", 0, 0, true);
    expect(sink.isClosed, isTrue);
  });

  test("doesn't allow add() to be called after close()", () {
    sink.close();
    expect(() => sink.add("x"), throwsStateError);
  });

  test("doesn't allow addSlice() to be called after close()", () {
    sink.close();
    expect(() => sink.addSlice("", 0, 0, false), throwsStateError);
  });
}
