// 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 collection.from.test;
import 'dart:collection' show Queue;

class CollectionFromTest {
  static testMain() {
    var set = new Set<int>();
    set.add(1);
    set.add(2);
    set.add(4);
    check(set, new List<int>.from(set));
    check(set, new List.from(set));
    check(set, new Queue<int>.from(set));
    check(set, new Queue.from(set));
    check(set, new Set<int>.from(set));
    check(set, new Set.from(set));
  }


  static check(Collection initial, Collection other) {
    Expect.equals(3, initial.length);
    Expect.equals(initial.length, other.length);

    int initialSum = 0;
    int otherSum = 0;

    initial.forEach((e) { initialSum += e; });
    other.forEach((e) { otherSum += e; });
    Expect.equals(4 + 2 + 1, otherSum);
    Expect.equals(otherSum, initialSum);
  }
}

main() {
  CollectionFromTest.testMain();
}
