// 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.
// VMOptions=--optimization-counter-threshold=10 --no-use-osr

import "package:expect/expect.dart";

// [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 < 20; 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));
      }
    }
     Expect.throws(() => divBy0(4),
                  (e) => e is IntegerDivisionByZeroException
                         || e is UnsupportedError);
  }
}
