// 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.
// Test division by power of two.
// Test that results before and after optimization are the same.

// [function, [list of tuples argument/result]].
var expectedResults =
  [ [divBy1,
      [[134217730, 134217730],
       [-134217730, -134217730],
       [10, 10],
       [-10, -10]]],
    [divByNeg1,
      [[134217730, -134217730],
       [-134217730, 134217730],
       [10, -10],
       [-10, 10]]],
    [divBy2,
      [[134217730, 67108865],
       [-134217730, -67108865],
       [10, 5],
       [-10, -5]]],
    [divByNeg2,
      [[134217730, -67108865],
       [-134217730, 67108865],
       [10, -5],
       [-10, 5]]],
    [divBy4,
      [[134217730, 33554432],
       [-134217730, -33554432],
       [10, 2],
       [-10, -2]]],
    [divByNeg4,
      [[134217730, -33554432],
       [-134217730, 33554432],
       [10, -2],
       [-10, 2]]],
    [divBy134217728,
      [[134217730, 1],
       [-134217730, -1],
       [10, 0],
       [-10, 0]]],
    [divByNeg134217728,
      [[134217730, -1],
       [-134217730, 1],
       [10, 0],
       [-10, 0]]],
    // Use different functions for 64 bit arguments.
    [divBy4_,
      [[549755813990, 137438953497],
       [-549755813990, -137438953497],
       [288230925907525632, 72057731476881408],
       [-288230925907525632, -72057731476881408]]],
    [divByNeg4_,
      [[549755813990, -137438953497],
       [-549755813990, 137438953497],
       [288230925907525632, -72057731476881408],
       [-288230925907525632, 72057731476881408]]],
    [divBy549755813888,
      [[549755813990, 1],
       [-549755813990, -1],
       [288230925907525632, 524289],
       [-288230925907525632, -524289]]],
    [divByNeg549755813888,
      [[549755813990, -1],
       [-549755813990, 1],
       [288230925907525632, -524289],
       [-288230925907525632, 524289]]],
  ];

divBy0(a) => a ~/ 0;
divBy1(a) => a ~/ 1;
divByNeg1(a) => a ~/ -1;
divBy2(a) => a ~/ 2;
divByNeg2(a) => a ~/ -2;
divBy4(a) => a ~/ 4;
divByNeg4(a) => a ~/ -4;
divBy134217728(a) => a ~/ 134217728;
divByNeg134217728(a) => a ~/ -134217728;

divBy4_(a) => a ~/ 4;
divByNeg4_(a) => a ~/ -4;
divBy549755813888(a) => a ~/ 549755813888;
divByNeg549755813888(a) => a ~/ -549755813888;

main() {
  for (int i = 0; i < 8000; i++) {
    for (var e in expectedResults) {
      Function f = e[0];
      List values = e[1];
      for (var v in values) {
        int arg = v[0];
        int res = v[1];
        Expect.equals(res, f(arg));
      }
    }
    try {
      divBy0(4);
      Expect.fail("Should have thrown exception.");
    } on IntegerDivisionByZeroException catch (e) {}
  }
}
