// Copyright (c) 2013, 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 'dart:convert';

import 'package:expect/expect.dart';

// Test that the String and ByteConversionSinks make a copy when they need to
// adapt.

class MyByteSink extends ByteConversionSinkBase {
  var accumulator = [];
  add(List<int> bytes) {
    accumulator.add(bytes);
  }

  close() {}
}

void testBase() {
  var byteSink = new MyByteSink();
  var bytes = [1];
  byteSink.addSlice(bytes, 0, 1, false);
  bytes[0] = 2;
  byteSink.addSlice(bytes, 0, 1, true);
  Expect.equals(1, byteSink.accumulator[0][0]);
  Expect.equals(2, byteSink.accumulator[1][0]);
}

class MyChunkedSink extends ChunkedConversionSink<List<int>> {
  var accumulator = [];
  add(List<int> bytes) {
    accumulator.add(bytes);
  }

  close() {}
}

void testAdapter() {
  var chunkedSink = new MyChunkedSink();
  var byteSink = new ByteConversionSink.from(chunkedSink);
  var bytes = [1];
  byteSink.addSlice(bytes, 0, 1, false);
  bytes[0] = 2;
  byteSink.addSlice(bytes, 0, 1, true);
  Expect.equals(1, chunkedSink.accumulator[0][0]);
  Expect.equals(2, chunkedSink.accumulator[1][0]);
}

void main() {
  testBase();
  testAdapter();
}
