/*
 * Copyright (c) 2017, 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.
 */
/**
 * @assertion Converter<S, TT> fuse<TT>(Converter<T, TT> other)
 * Fuses this with other.
 *
 * Encoding with the resulting converter is equivalent to converting with this
 * before converting with other.
 * @description Checks that encoding with the resulting converter is equivalent
 * to converting with this before converting with other.
 * are parsed correctly.
 * @author sgrekhov@unipro.ru
 */
import "dart:convert";
import "../../../Utils/expect.dart";
import "../JsonDecoder/table1.lib.dart" show table;

class MyConverter extends Converter<List<int>, Object> {
  Object convert(List<int> input) => input;
}

main() {
  for (List<Object?> pair in table) {
    JsonUtf8Encoder encoder = new JsonUtf8Encoder();
    Converter conv = encoder.fuse(new MyConverter());
    Object res = conv.convert(pair[0]);
    Expect.deepEquals(encoder.convert(pair[0]), res);
  }
}
