// 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 List<int> dictionary
///  final
///  Initial compression dictionary.
/// It should consist of strings (byte sequences) that are likely to be
/// encountered later in the data to be compressed, with the most commonly used
/// strings preferably put towards the end of the dictionary. Using a dictionary
/// is most useful when the data to be compressed is short and can be predicted
/// with good accuracy; the data can then be compressed better than with the
/// default empty dictionary.
/// @description Checks that this property returns initial compression dictionary
/// @author sgrekhov@unipro.ru

import "dart:io";
import "../../../Utils/expect.dart";

check(ZLibDecoder decoder, List<int> toDecode, List<int> expected) {
  var decoded = decoder.convert(toDecode);
  Expect.listEquals(expected, decoded);
}

main() {
  GZipCodec codec = new GZipCodec();
  Expect.isNull(codec.dictionary);
  ZLibEncoder encoder = new ZLibEncoder();
  for (int i = 0; i < 256; i++) {
    var encoded = encoder.convert([i]);
    check(codec.decoder, encoded, [i]);
  }
  check(codec.decoder, [], []);

  codec = new GZipCodec(dictionary: [1, 2, 3]);
  Expect.listEquals([1, 2, 3], codec.dictionary);
  Expect.isNotNull(codec.decoder);

  for (int i = 0; i < 256; i++) {
    var encoded = encoder.convert([i]);
    check(codec.decoder, encoded, [i]);
  }
  check(codec.decoder, [], []);
}
