#!/usr/bin/env dart
// Copyright (c) 2011, 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.

library pb_list_tests;

import 'package:protobuf/protobuf.dart';
import 'package:unittest/unittest.dart';

void main() {
  test('testPbList', () {
    PbList<int> lb1 = new PbList();
    expect(lb1, []);

    lb1.add(1);
    expect(lb1, [1]);

    lb1.addAll([0, 2, 4, 6, 99]);
    expect(lb1, [1, 0, 2, 4, 6, 99]);

    expect(lb1[3], 4);
    expect(lb1.contains(4), isTrue);

    lb1[3] = 99;
    expect(lb1, [1, 0, 2, 99, 6, 99]);

    expect(lb1.indexOf(99), 3);

    expect(lb1.lastIndexOf(99), 5);

    expect(lb1.firstWhere((e) => e % 2 == 0), 0);

    expect(lb1.last, 99);
    var last = lb1.removeLast();
    expect(last, 99);
    expect(lb1.last, 6);

    int count = 0;
    lb1.forEach((int i) {count += i;});
    expect(count, 108);

    List<int> evens = new List<int>.from(
        lb1.where((int i) { return i % 2 == 0; }));
    expect(evens, [0, 2, 6]);

    expect(lb1.any((int i) { return i % 2 == 0; }), isTrue);
    expect(lb1.every((int i) { return i >= 0; }), isTrue);

    lb1.clear();
    expect(lb1, []);

    PbList<int> lb2 = new PbList();

    lb2.addAll([1, 2, 3, 4, 5, 6, 7, 8, 9]);
    expect(lb2.sublist(3, 7), [4, 5, 6, 7]);

    lb2.setRange(3, 7, [9, 8, 7, 6]);
    expect(lb2, [1, 2, 3, 9, 8, 7, 6, 8, 9]);

    lb2.removeRange(5, 8);
    expect(lb2, [1, 2, 3, 9, 8, 9]);

    expect(() => lb2.setRange(5, 7, [88, 99].take(2)), throwsRangeError);
    expect(lb2, [1, 2, 3, 9, 8, 9]);

    expect(() => lb2.setRange(5, 7, [88, 99].take(2), 1), throwsRangeError);
    expect(lb2, [1, 2, 3, 9, 8, 9]);

    expect(() => lb2.setRange(4, 6, [88, 99].take(1), 1), throwsStateError);
    expect(lb2, [1, 2, 3, 9, 8, 9]);

    lb2.setRange(5, 6, [88, 99].take(2));
    expect(lb2, [1, 2, 3, 9, 8, 88]);

    lb2.setRange(5, 6, [88, 99].take(2), 1);
    expect(lb2, [1, 2, 3, 9, 8, 99]);

    expect(() { (new PbList<int>() as dynamic).add('hello'); }, throws);

    PbSint32List listSint32 = new PbSint32List();

    expect(() { listSint32.add(-2147483649); }, throwsArgumentError);

    expect(() { listSint32.add(-2147483648); },
        returnsNormally,
        reason: 'could not add min_sint32 to PbSint32List');

    expect(() { listSint32.add(2147483648); }, throwsArgumentError);

    expect(() { listSint32.add(2147483647); },
        returnsNormally,
        reason: 'could not add max_sint32 to PbSint32List');

    PbUint32List listUint32 = new PbUint32List();

    expect(() { listUint32.add(-1); }, throwsArgumentError);

    expect(() { listUint32.add(0); },
        returnsNormally,
        reason: 'could not add 0 PbSint32List');

    expect(() { listUint32.add(4294967296); }, throwsArgumentError);

    expect(() { listUint32.add(4294967295); },
        returnsNormally,
        reason: 'could not add max_uint32 to PbUint32List');

    PbFloatList listFloat = new PbFloatList();

    expect(() { listFloat.add(3.4028234663852886E39); }, throwsArgumentError);

    expect(() { listFloat.add(-3.4028234663852886E39); }, throwsArgumentError);

    expect(() { listFloat.add(3.4028234663852886E38); },
        returnsNormally,
        reason: 'could not add max_float to PbUint64List');

    expect(() { listFloat.add(-3.4028234663852886E38); },
        returnsNormally,
        reason: 'could not add max_float to PbUint64List');
  });
}
