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

// @dart = 2.9

import 'dart:convert';

import 'package:expect/expect.dart';

class MyCodec extends Codec<int, String> {
  const MyCodec();

  final Converter<int, String> encoder = const IntStringConverter();
  final Converter<String, int> decoder = const StringIntConverter();
}

class IntStringConverter extends Converter<int, String> {
  const IntStringConverter();

  String convert(int i) => i.toString();
}

class StringIntConverter extends Converter<String, int> {
  const StringIntConverter();

  int convert(String str) => int.parse(str);
}

class MyCodec2 extends Codec<int, String> {
  const MyCodec2();

  Converter<int, String> get encoder => new IntStringConverter2();
  Converter<String, int> get decoder => new StringIntConverter2();
}

class IntStringConverter2 extends Converter<int, String> {
  String convert(int i) => (i + 99).toString();
}

class StringIntConverter2 extends Converter<String, int> {
  int convert(String str) => int.parse(str) + 400;
}

const TEST_CODEC = const MyCodec();
const TEST_CODEC2 = const MyCodec2();

main() {
  Expect.equals("0", TEST_CODEC.encode(0));
  Expect.equals(5, TEST_CODEC.decode("5"));
  Expect.equals(3, TEST_CODEC.decode(TEST_CODEC.encode(3)));

  Expect.equals("99", TEST_CODEC2.encode(0));
  Expect.equals(405, TEST_CODEC2.decode("5"));
  Expect.equals(499, TEST_CODEC2.decode(TEST_CODEC2.encode(0)));

  var inverted, fused;
  inverted = TEST_CODEC.inverted;
  fused = TEST_CODEC.fuse(inverted);
  Expect.equals(499, fused.encode(499));
  Expect.equals(499, fused.decode(499));

  fused = inverted.fuse(TEST_CODEC);
  Expect.equals("499", fused.encode("499"));
  Expect.equals("499", fused.decode("499"));

  inverted = TEST_CODEC2.inverted;
  fused = TEST_CODEC2.fuse(inverted);
  Expect.equals(499, fused.encode(0));
  Expect.equals(499, fused.decode(0));

  fused = TEST_CODEC.fuse(inverted);
  Expect.equals(405, fused.encode(5));
  Expect.equals(101, fused.decode(2));
}
