// Copyright (c) 2012, 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 num.clamp.

import "package:expect/expect.dart";

testIntClamp() {
  Expect.equals(2, 2.clamp(1, 3));
  Expect.equals(1, 0.clamp(1, 3));
  Expect.equals(3, 4.clamp(1, 3));
  Expect.equals(-2, (-2).clamp(-3, -1));
  Expect.equals(-1, 0.clamp(-3, -1));
  Expect.equals(-3, (-4).clamp(-3, -1));
  Expect.equals(0, 1.clamp(0, 0));
  Expect.equals(0, (-1).clamp(0, 0));
  Expect.equals(0, 0.clamp(0, 0));
  Expect.throws(() => 0.clamp(0, -1), (e) => e is ArgumentError);
}

testDoubleClamp() {
  Expect.equals(2.0, 2.clamp(1.0, 3.0));
  Expect.equals(1.0, 0.clamp(1.0, 3.0));
  Expect.equals(3.0, 4.clamp(1.0, 3.0));
  Expect.equals(-2.0, (-2.0).clamp(-3.0, -1.0));
  Expect.equals(-1.0, 0.0.clamp(-3.0, -1.0));
  Expect.equals(-3.0, (-4.0).clamp(-3.0, -1.0));
  Expect.equals(0.0, 1.0.clamp(0.0, 0.0));
  Expect.equals(0.0, (-1.0).clamp(0.0, 0.0));
  Expect.equals(0.0, 0.0.clamp(0.0, 0.0));
  Expect.throws(() => 0.0.clamp(0.0, -1.0), (e) => e is ArgumentError);
}

testDoubleClampInt() {
  Expect.equals(2.0, 2.0.clamp(1, 3));
  Expect.equals(1, 0.0.clamp(1, 3));
  Expect.isTrue(0.0.clamp(1, 3) is int);
  Expect.equals(3, 4.0.clamp(1, 3));
  Expect.isTrue(4.0.clamp(1, 3) is int);
  Expect.equals(-2.0, (-2.0).clamp(-3, -1));
  Expect.equals(-1, 0.0.clamp(-3, -1));
  Expect.isTrue(0.0.clamp(-3, -1) is int);
  Expect.equals(-3, (-4.0).clamp(-3, -1));
  Expect.isTrue((-4.0).clamp(-3, -1) is int);
  Expect.equals(0, 1.0.clamp(0, 0));
  Expect.isTrue(1.0.clamp(0, 0) is int);
  Expect.equals(0, (-1.0).clamp(0, 0));
  Expect.isTrue((-1.0).clamp(0, 0) is int);
  Expect.equals(0.0, 0.0.clamp(0, 0));
  Expect.isTrue(0.0.clamp(0, 0) is double);
  Expect.throws(() => 0.0.clamp(0, -1), (e) => e is ArgumentError);
}

testDoubleClampExtremes() {
  Expect.equals(2.0, 2.0.clamp(-double.INFINITY, double.INFINITY));
  Expect.equals(2.0, 2.0.clamp(-double.INFINITY, double.NAN));
  Expect.equals(double.INFINITY, 2.0.clamp(double.INFINITY, double.NAN));
  Expect.isTrue(2.0.clamp(double.NAN, double.NAN).isNaN);
  Expect.throws(
      () => 0.0.clamp(double.NAN, double.INFINITY), (e) => e is ArgumentError);
}

main() {
  testIntClamp();
  testDoubleClamp();
  testDoubleClampInt();
  testDoubleClampExtremes();
}
