// 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:math';

import 'package:source_maps/src/vlq.dart';
import 'package:test/test.dart';

void main() {
  test('encode and decode - simple values', () {
    expect(encodeVlq(1).join(''), 'C');
    expect(encodeVlq(2).join(''), 'E');
    expect(encodeVlq(3).join(''), 'G');
    expect(encodeVlq(100).join(''), 'oG');
    expect(decodeVlq('C'.split('').iterator), 1);
    expect(decodeVlq('E'.split('').iterator), 2);
    expect(decodeVlq('G'.split('').iterator), 3);
    expect(decodeVlq('oG'.split('').iterator), 100);
  });

  test('encode and decode', () {
    for (var i = -10000; i < 10000; i++) {
      _checkEncodeDecode(i);
    }
  });

  test('only 32-bit ints allowed', () {
    var maxInt = (pow(2, 31) as int) - 1;
    var minInt = -(pow(2, 31) as int);
    _checkEncodeDecode(maxInt - 1);
    _checkEncodeDecode(minInt + 1);
    _checkEncodeDecode(maxInt);
    _checkEncodeDecode(minInt);

    expect(encodeVlq(minInt).join(''), 'hgggggE');
    expect(decodeVlq('hgggggE'.split('').iterator), minInt);

    expect(() => encodeVlq(maxInt + 1), throwsA(anything));
    expect(() => encodeVlq(maxInt + 2), throwsA(anything));
    expect(() => encodeVlq(minInt - 1), throwsA(anything));
    expect(() => encodeVlq(minInt - 2), throwsA(anything));

    // if we allowed more than 32 bits, these would be the expected encodings
    // for the large numbers above.
    expect(() => decodeVlq('ggggggE'.split('').iterator), throwsA(anything));
    expect(() => decodeVlq('igggggE'.split('').iterator), throwsA(anything));
    expect(() => decodeVlq('jgggggE'.split('').iterator), throwsA(anything));
    expect(() => decodeVlq('lgggggE'.split('').iterator), throwsA(anything));
  },
      // This test uses integers so large they overflow in JS.
      testOn: 'dart-vm');
}

void _checkEncodeDecode(int value) {
  var encoded = encodeVlq(value);
  expect(decodeVlq(encoded.iterator), value);
  expect(decodeVlq(encoded.join('').split('').iterator), value);
}
