// Copyright (c) 2014, 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.

#include "vm/flow_graph_range_analysis.h"
#include "vm/unit_test.h"

namespace dart {

TEST_CASE(RangeTests) {
  Range* zero = new Range(
      RangeBoundary::FromConstant(0),
      RangeBoundary::FromConstant(0));
  Range* positive = new Range(
      RangeBoundary::FromConstant(0),
      RangeBoundary::FromConstant(100));
  Range* negative = new Range(
      RangeBoundary::FromConstant(-1),
      RangeBoundary::FromConstant(-100));
  Range* range_x = new Range(
      RangeBoundary::FromConstant(-15),
      RangeBoundary::FromConstant(100));
  EXPECT(positive->IsPositive());
  EXPECT(zero->Overlaps(0, 0));
  EXPECT(positive->Overlaps(0, 0));
  EXPECT(!negative->Overlaps(0, 0));
  EXPECT(range_x->Overlaps(0, 0));
  EXPECT(range_x->IsWithin(-15, 100));
  EXPECT(!range_x->IsWithin(-15, 99));
  EXPECT(!range_x->IsWithin(-14, 100));

#define TEST_RANGE_OP_(Op, l_min, l_max, r_min, r_max, Clamp, res_min, res_max)\
  {                                                                            \
    RangeBoundary min, max;                                                    \
    Range* left_range = new Range(                                             \
      RangeBoundary::FromConstant(l_min),                                      \
      RangeBoundary::FromConstant(l_max));                                     \
    Range* shift_range = new Range(                                            \
      RangeBoundary::FromConstant(r_min),                                      \
      RangeBoundary::FromConstant(r_max));                                     \
    Op(left_range, shift_range, &min, &max);                                   \
    min = Clamp(min);                                                          \
    max = Clamp(max);                                                          \
    EXPECT(min.Equals(res_min));                                               \
    if (FLAG_support_il_printer && !min.Equals(res_min)) {                     \
      OS::Print("%s\n", min.ToCString());                                      \
    }                                                                          \
    EXPECT(max.Equals(res_max));                                               \
    if (FLAG_support_il_printer && !max.Equals(res_max)) {                     \
      OS::Print("%s\n", max.ToCString());                                      \
    }                                                                          \
  }

#define NO_CLAMP(b) (b)
#define TEST_RANGE_OP(Op, l_min, l_max, r_min, r_max, result_min, result_max)  \
  TEST_RANGE_OP_(Op, l_min, l_max, r_min, r_max,                               \
                 NO_CLAMP, result_min, result_max)

#define CLAMP_TO_SMI(b) (b.Clamp(RangeBoundary::kRangeBoundarySmi))
#define TEST_RANGE_OP_SMI(Op, l_min, l_max, r_min, r_max, res_min, res_max)    \
  TEST_RANGE_OP_(Op, l_min, l_max, r_min, r_max,                               \
                 CLAMP_TO_SMI, res_min, res_max)

  TEST_RANGE_OP(Range::Shl, -15, 100, 0, 2,
                RangeBoundary(-60), RangeBoundary(400));
  TEST_RANGE_OP(Range::Shl, -15, 100, -2, 2,
                RangeBoundary(-60), RangeBoundary(400));
  TEST_RANGE_OP(Range::Shl, -15, -10, 1, 2,
                RangeBoundary(-60), RangeBoundary(-20));
  TEST_RANGE_OP(Range::Shl, 5, 10, -2, 2,
                RangeBoundary(5), RangeBoundary(40));
  TEST_RANGE_OP(Range::Shl, -15, 100, 0, 64,
                RangeBoundary::NegativeInfinity(),
                RangeBoundary::PositiveInfinity());
  TEST_RANGE_OP(Range::Shl, -1, 1, 63, 63,
                RangeBoundary(kMinInt64),
                RangeBoundary::PositiveInfinity());
  if (kBitsPerWord == 64) {
    TEST_RANGE_OP_SMI(Range::Shl, -1, 1, 62, 62,
                  RangeBoundary(kSmiMin),
                  RangeBoundary(kSmiMax));
    TEST_RANGE_OP_SMI(Range::Shl, -1, 1, 30, 30,
                  RangeBoundary(-(1 << 30)),
                  RangeBoundary(1 << 30));
  } else {
    TEST_RANGE_OP_SMI(Range::Shl, -1, 1, 30, 30,
                  RangeBoundary(kSmiMin),
                  RangeBoundary(kSmiMax));
    TEST_RANGE_OP_SMI(Range::Shl, -1, 1, 62, 62,
                  RangeBoundary(kSmiMin),
                  RangeBoundary(kSmiMax));
  }
  TEST_RANGE_OP(Range::Shl, 0, 100, 0, 64,
                RangeBoundary(0), RangeBoundary::PositiveInfinity());
  TEST_RANGE_OP(Range::Shl, -100, 0, 0, 64,
                RangeBoundary::NegativeInfinity(), RangeBoundary(0));

  TEST_RANGE_OP(Range::Shr, -8, 8, 1, 2, RangeBoundary(-4), RangeBoundary(4));
  TEST_RANGE_OP(Range::Shr, 1, 8, 1, 2, RangeBoundary(0), RangeBoundary(4));
  TEST_RANGE_OP(Range::Shr, -16, -8, 1, 2,
                RangeBoundary(-8), RangeBoundary(-2));
  TEST_RANGE_OP(Range::Shr, 2, 4, -1, 1, RangeBoundary(1), RangeBoundary(4));
  TEST_RANGE_OP(Range::Shr, kMaxInt64, kMaxInt64, 0, 1,
                RangeBoundary(kMaxInt64 >> 1), RangeBoundary(kMaxInt64));
  TEST_RANGE_OP(Range::Shr, kMinInt64, kMinInt64, 0, 1,
                RangeBoundary(kMinInt64), RangeBoundary(kMinInt64 >> 1));
#undef TEST_RANGE_OP
}


TEST_CASE(RangeTestsInfinity) {
  // +/- inf overflowed.
  EXPECT(RangeBoundary::NegativeInfinity().OverflowedSmi());
  EXPECT(RangeBoundary::PositiveInfinity().OverflowedSmi());

  EXPECT(RangeBoundary::NegativeInfinity().OverflowedMint());
  EXPECT(RangeBoundary::PositiveInfinity().OverflowedMint());

  Range* all = new Range(RangeBoundary::NegativeInfinity(),
                         RangeBoundary::PositiveInfinity());
  EXPECT(all->Overlaps(0, 0));
  EXPECT(all->Overlaps(-1, 1));
  EXPECT(!all->IsWithin(0, 100));
  Range* positive = new Range(RangeBoundary::FromConstant(0),
                              RangeBoundary::PositiveInfinity());
  EXPECT(positive->IsPositive());
  EXPECT(positive->Overlaps(0, 1));
  EXPECT(positive->Overlaps(1, 100));
  EXPECT(positive->Overlaps(-1, 0));
  EXPECT(!positive->Overlaps(-2, -1));
  Range* negative = new Range(RangeBoundary::NegativeInfinity(),
                              RangeBoundary::FromConstant(-1));
  EXPECT(!negative->IsPositive());
  EXPECT(!negative->Overlaps(0, 1));
  EXPECT(!negative->Overlaps(1, 100));
  EXPECT(negative->Overlaps(-1, 0));
  EXPECT(negative->Overlaps(-2, -1));
  Range* negpos = new Range(RangeBoundary::NegativeInfinity(),
                            RangeBoundary::FromConstant(0));
  EXPECT(!negpos->IsPositive());

  Range* a = new Range(RangeBoundary::NegativeInfinity(),
                       RangeBoundary::FromConstant(1));

  Range* b = new Range(RangeBoundary::NegativeInfinity(),
                       RangeBoundary::FromConstant(31));

  Range* c = new Range(RangeBoundary::NegativeInfinity(),
                       RangeBoundary::FromConstant(32));

  EXPECT(a->OnlyLessThanOrEqualTo(31));
  EXPECT(b->OnlyLessThanOrEqualTo(31));
  EXPECT(!c->OnlyLessThanOrEqualTo(31));

  Range* unsatisfiable = new Range(RangeBoundary::PositiveInfinity(),
                                   RangeBoundary::NegativeInfinity());
  EXPECT(unsatisfiable->IsUnsatisfiable());

  Range* unsatisfiable_right = new Range(RangeBoundary::PositiveInfinity(),
                                         RangeBoundary::FromConstant(0));
  EXPECT(unsatisfiable_right->IsUnsatisfiable());

  Range* unsatisfiable_left = new Range(RangeBoundary::FromConstant(0),
                                        RangeBoundary::NegativeInfinity());
  EXPECT(unsatisfiable_left->IsUnsatisfiable());
}


TEST_CASE(RangeUtils) {
  // [-inf, +inf].
  const Range& range_0 = *(new Range(RangeBoundary::NegativeInfinity(),
                                     RangeBoundary::PositiveInfinity()));
  // [-inf, -1].
  const Range& range_a = *(new Range(RangeBoundary::NegativeInfinity(),
                                     RangeBoundary::FromConstant(-1)));
  // [-inf, 0].
  const Range& range_b = *(new Range(RangeBoundary::NegativeInfinity(),
                                     RangeBoundary::FromConstant(0)));
  // [-inf, 1].
  const Range& range_c = *(new Range(RangeBoundary::NegativeInfinity(),
                                     RangeBoundary::FromConstant(1)));
  // [-1, +inf]
  const Range& range_d = *(new Range(RangeBoundary::FromConstant(-1),
                                     RangeBoundary::PositiveInfinity()));
  // [0, +inf]
  const Range& range_e = *(new Range(RangeBoundary::FromConstant(0),
                                     RangeBoundary::PositiveInfinity()));
  // [1, +inf].
  const Range& range_f = *(new Range(RangeBoundary::FromConstant(1),
                                     RangeBoundary::PositiveInfinity()));
  // [1, 2].
  const Range& range_g = *(new Range(RangeBoundary::FromConstant(1),
                                     RangeBoundary::FromConstant(2)));
  // [-1, -2].
  const Range& range_h = *(new Range(RangeBoundary::FromConstant(-1),
                                     RangeBoundary::FromConstant(-2)));
  // [-1, 1].
  const Range& range_i = *(new Range(RangeBoundary::FromConstant(-1),
                                     RangeBoundary::FromConstant(1)));

  // OnlyPositiveOrZero.
  EXPECT(!Range::OnlyPositiveOrZero(range_a, range_b));
  EXPECT(!Range::OnlyPositiveOrZero(range_b, range_c));
  EXPECT(!Range::OnlyPositiveOrZero(range_c, range_d));
  EXPECT(!Range::OnlyPositiveOrZero(range_d, range_e));
  EXPECT(Range::OnlyPositiveOrZero(range_e, range_f));
  EXPECT(!Range::OnlyPositiveOrZero(range_d, range_d));
  EXPECT(Range::OnlyPositiveOrZero(range_e, range_e));
  EXPECT(Range::OnlyPositiveOrZero(range_f, range_g));
  EXPECT(!Range::OnlyPositiveOrZero(range_g, range_h));
  EXPECT(!Range::OnlyPositiveOrZero(range_i, range_i));

  // OnlyNegativeOrZero.
  EXPECT(Range::OnlyNegativeOrZero(range_a, range_b));
  EXPECT(!Range::OnlyNegativeOrZero(range_b, range_c));
  EXPECT(Range::OnlyNegativeOrZero(range_b, range_b));
  EXPECT(!Range::OnlyNegativeOrZero(range_c, range_c));
  EXPECT(!Range::OnlyNegativeOrZero(range_c, range_d));
  EXPECT(!Range::OnlyNegativeOrZero(range_d, range_e));
  EXPECT(!Range::OnlyNegativeOrZero(range_e, range_f));
  EXPECT(!Range::OnlyNegativeOrZero(range_f, range_g));
  EXPECT(!Range::OnlyNegativeOrZero(range_g, range_h));
  EXPECT(Range::OnlyNegativeOrZero(range_h, range_h));
  EXPECT(!Range::OnlyNegativeOrZero(range_i, range_i));

  // [-inf, +inf].
  EXPECT(!Range::OnlyNegativeOrZero(range_0, range_0));
  EXPECT(!Range::OnlyPositiveOrZero(range_0, range_0));

  EXPECT(Range::ConstantAbsMax(&range_0) == RangeBoundary::kMax);
  EXPECT(Range::ConstantAbsMax(&range_h) == 2);
  EXPECT(Range::ConstantAbsMax(&range_i) == 1);

  // RangeBOundary.Equals.
  EXPECT(RangeBoundary::FromConstant(1).Equals(
      RangeBoundary::FromConstant(1)));
  EXPECT(!RangeBoundary::FromConstant(2).Equals(
      RangeBoundary::FromConstant(1)));
  EXPECT(RangeBoundary::PositiveInfinity().Equals(
      RangeBoundary::PositiveInfinity()));
  EXPECT(!RangeBoundary::PositiveInfinity().Equals(
      RangeBoundary::NegativeInfinity()));
  EXPECT(RangeBoundary::NegativeInfinity().Equals(
      RangeBoundary::NegativeInfinity()));
  EXPECT(!RangeBoundary::NegativeInfinity().Equals(
      RangeBoundary::PositiveInfinity()));
  EXPECT(!RangeBoundary::FromConstant(1).Equals(
      RangeBoundary::NegativeInfinity()));
  EXPECT(!RangeBoundary::FromConstant(1).Equals(
      RangeBoundary::NegativeInfinity()));
  EXPECT(!RangeBoundary::FromConstant(2).Equals(
      RangeBoundary::PositiveInfinity()));
}


TEST_CASE(RangeBinaryOp) {
  Range* range_a = new Range(RangeBoundary::FromConstant(-1),
                             RangeBoundary::PositiveInfinity());
  range_a->Clamp(RangeBoundary::kRangeBoundaryInt64);
  EXPECT(range_a->min().ConstantValue() == -1);
  EXPECT(range_a->max().ConstantValue() == RangeBoundary::kMax);
  Range* range_b = new Range(RangeBoundary::NegativeInfinity(),
                             RangeBoundary::FromConstant(1));
  range_b->Clamp(RangeBoundary::kRangeBoundaryInt64);
  EXPECT(range_b->min().ConstantValue() == RangeBoundary::kMin);
  EXPECT(range_b->max().ConstantValue() == 1);

  {
    Range result;
    Range::BinaryOp(Token::kADD,
                    range_a,
                    range_b,
                    NULL,
                    &result);
    ASSERT(!Range::IsUnknown(&result));
    EXPECT(result.min().IsNegativeInfinity());
    EXPECT(result.max().IsPositiveInfinity());
  }

  // Test that [5, 10] + [0, 5] = [5, 15].
  Range* range_c = new Range(RangeBoundary::FromConstant(5),
                             RangeBoundary::FromConstant(10));
  Range* range_d = new Range(RangeBoundary::FromConstant(0),
                             RangeBoundary::FromConstant(5));

  {
    Range result;
    Range::BinaryOp(Token::kADD,
                    range_c,
                    range_d,
                    NULL,
                    &result);
    ASSERT(!Range::IsUnknown(&result));
    EXPECT(result.min().ConstantValue() == 5);
    EXPECT(result.max().ConstantValue() == 15);
  }

  // Test that [0xff, 0xfff] & [0xf, 0xf] = [0x0, 0xf].
  Range* range_e = new Range(RangeBoundary::FromConstant(0xff),
                             RangeBoundary::FromConstant(0xfff));
  Range* range_f = new Range(RangeBoundary::FromConstant(0xf),
                             RangeBoundary::FromConstant(0xf));
  {
    Range result;
    Range::BinaryOp(Token::kBIT_AND,
                    range_e,
                    range_f,
                    NULL,
                    &result);
    ASSERT(!Range::IsUnknown(&result));
    EXPECT(result.min().ConstantValue() == 0x0);
    EXPECT(result.max().ConstantValue() == 0xf);
  }
}


TEST_CASE(RangeAdd) {
#define TEST_RANGE_ADD(l_min, l_max, r_min, r_max, result_min, result_max)     \
  {                                                                            \
    RangeBoundary min, max;                                                    \
    Range* left_range = new Range(                                             \
      RangeBoundary::FromConstant(l_min),                                      \
      RangeBoundary::FromConstant(l_max));                                     \
    Range* right_range = new Range(                                            \
      RangeBoundary::FromConstant(r_min),                                      \
      RangeBoundary::FromConstant(r_max));                                     \
    EXPECT(left_range->min().ConstantValue() == l_min);                        \
    EXPECT(left_range->max().ConstantValue() == l_max);                        \
    EXPECT(right_range->min().ConstantValue() == r_min);                       \
    EXPECT(right_range->max().ConstantValue() == r_max);                       \
    Range::Add(left_range, right_range, &min, &max, NULL);                     \
    EXPECT(min.Equals(result_min));                                            \
    if (FLAG_support_il_printer && !min.Equals(result_min)) {                  \
      OS::Print("%s != %s\n", min.ToCString(), result_min.ToCString());        \
    }                                                                          \
    EXPECT(max.Equals(result_max));                                            \
    if (FLAG_support_il_printer && !max.Equals(result_max)) {                  \
      OS::Print("%s != %s\n", max.ToCString(), result_max.ToCString());        \
    }                                                                          \
  }

  // [kMaxInt32, kMaxInt32 + 15] + [10, 20] = [kMaxInt32 + 10, kMaxInt32 + 35].
  TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt32),
                 static_cast<int64_t>(kMaxInt32) + 15,
                 static_cast<int64_t>(10),
                 static_cast<int64_t>(20),
                 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 10),
                 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 35));

  // [kMaxInt32 - 15, kMaxInt32 + 15] + [15, -15] = [kMaxInt32, kMaxInt32].
  TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt32) - 15,
                 static_cast<int64_t>(kMaxInt32) + 15,
                 static_cast<int64_t>(15),
                 static_cast<int64_t>(-15),
                 RangeBoundary(static_cast<int64_t>(kMaxInt32)),
                 RangeBoundary(static_cast<int64_t>(kMaxInt32)));

  // [kMaxInt32, kMaxInt32 + 15] + [10, kMaxInt64] = [kMaxInt32 + 10, +inf].
  TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt32),
                 static_cast<int64_t>(kMaxInt32) + 15,
                 static_cast<int64_t>(10),
                 static_cast<int64_t>(kMaxInt64),
                 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 10),
                 RangeBoundary::PositiveInfinity());

  // [kMinInt64, kMaxInt32 + 15] + [10, 20] = [kMinInt64 + 10, kMaxInt32 + 35].
  TEST_RANGE_ADD(static_cast<int64_t>(kMinInt64),
                 static_cast<int64_t>(kMaxInt32) + 15,
                 static_cast<int64_t>(10),
                 static_cast<int64_t>(20),
                 RangeBoundary(static_cast<int64_t>(kMinInt64) + 10),
                 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 35));

  // [0, 0] + [kMinInt64, kMaxInt64] = [kMinInt64, kMaxInt64].
  TEST_RANGE_ADD(static_cast<int64_t>(0),
                 static_cast<int64_t>(0),
                 static_cast<int64_t>(kMinInt64),
                 static_cast<int64_t>(kMaxInt64),
                 RangeBoundary(kMinInt64),
                 RangeBoundary(kMaxInt64));

  // Overflows.

  // [-1, 1] + [kMinInt64, kMaxInt64] = [-inf, +inf].
  TEST_RANGE_ADD(static_cast<int64_t>(-1),
                 static_cast<int64_t>(1),
                 static_cast<int64_t>(kMinInt64),
                 static_cast<int64_t>(kMaxInt64),
                 RangeBoundary::NegativeInfinity(),
                 RangeBoundary::PositiveInfinity());

  // [kMaxInt64, kMaxInt64] + [kMaxInt64, kMaxInt64] = [-inf, +inf].
  TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt64),
                 static_cast<int64_t>(kMaxInt64),
                 static_cast<int64_t>(kMaxInt64),
                 static_cast<int64_t>(kMaxInt64),
                 RangeBoundary::NegativeInfinity(),
                 RangeBoundary::PositiveInfinity());

  // [kMaxInt64, kMaxInt64] + [1, 1] = [-inf, +inf].
  TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt64),
                 static_cast<int64_t>(kMaxInt64),
                 static_cast<int64_t>(1),
                 static_cast<int64_t>(1),
                 RangeBoundary::NegativeInfinity(),
                 RangeBoundary::PositiveInfinity());

#undef TEST_RANGE_ADD
}


TEST_CASE(RangeSub) {
#define TEST_RANGE_SUB(l_min, l_max, r_min, r_max, result_min, result_max)     \
  {                                                                            \
    RangeBoundary min, max;                                                    \
    Range* left_range = new Range(                                             \
      RangeBoundary::FromConstant(l_min),                                      \
      RangeBoundary::FromConstant(l_max));                                     \
    Range* right_range = new Range(                                            \
      RangeBoundary::FromConstant(r_min),                                      \
      RangeBoundary::FromConstant(r_max));                                     \
    EXPECT(left_range->min().ConstantValue() == l_min);                        \
    EXPECT(left_range->max().ConstantValue() == l_max);                        \
    EXPECT(right_range->min().ConstantValue() == r_min);                       \
    EXPECT(right_range->max().ConstantValue() == r_max);                       \
    Range::Sub(left_range, right_range, &min, &max, NULL);                     \
    EXPECT(min.Equals(result_min));                                            \
    if (FLAG_support_il_printer && !min.Equals(result_min)) {                  \
      OS::Print("%s != %s\n", min.ToCString(), result_min.ToCString());        \
    }                                                                          \
    EXPECT(max.Equals(result_max));                                            \
    if (FLAG_support_il_printer && !max.Equals(result_max)) {                  \
      OS::Print("%s != %s\n", max.ToCString(), result_max.ToCString());        \
    }                                                                          \
  }

  // [kMaxInt32, kMaxInt32 + 15] - [10, 20] = [kMaxInt32 - 20, kMaxInt32 + 5].
  TEST_RANGE_SUB(static_cast<int64_t>(kMaxInt32),
                 static_cast<int64_t>(kMaxInt32) + 15,
                 static_cast<int64_t>(10),
                 static_cast<int64_t>(20),
                 RangeBoundary(static_cast<int64_t>(kMaxInt32) - 20),
                 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 5));

  // [kMintInt64, kMintInt64] - [1, 1] = [-inf, +inf].
  TEST_RANGE_SUB(static_cast<int64_t>(kMinInt64),
                 static_cast<int64_t>(kMinInt64),
                 static_cast<int64_t>(1),
                 static_cast<int64_t>(1),
                 RangeBoundary::NegativeInfinity(),
                 RangeBoundary::PositiveInfinity());

  // [1, 1] - [kMintInt64, kMintInt64] = [-inf, +inf].
  TEST_RANGE_SUB(static_cast<int64_t>(1),
                 static_cast<int64_t>(1),
                 static_cast<int64_t>(kMinInt64),
                 static_cast<int64_t>(kMinInt64),
                 RangeBoundary::NegativeInfinity(),
                 RangeBoundary::PositiveInfinity());

  // [kMaxInt32 + 10, kMaxInt32 + 20] - [-20, -20] =
  //     [kMaxInt32 + 30, kMaxInt32 + 40].
  TEST_RANGE_SUB(static_cast<int64_t>(kMaxInt32) + 10,
                 static_cast<int64_t>(kMaxInt32) + 20,
                 static_cast<int64_t>(-20),
                 static_cast<int64_t>(-20),
                 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 30),
                 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 40));


#undef TEST_RANGE_SUB
}


TEST_CASE(RangeAnd) {
#define TEST_RANGE_AND(l_min, l_max, r_min, r_max, result_min, result_max)     \
  {                                                                            \
    RangeBoundary min, max;                                                    \
    Range* left_range = new Range(                                             \
      RangeBoundary::FromConstant(l_min),                                      \
      RangeBoundary::FromConstant(l_max));                                     \
    Range* right_range = new Range(                                            \
      RangeBoundary::FromConstant(r_min),                                      \
      RangeBoundary::FromConstant(r_max));                                     \
    EXPECT(left_range->min().ConstantValue() == l_min);                        \
    EXPECT(left_range->max().ConstantValue() == l_max);                        \
    EXPECT(right_range->min().ConstantValue() == r_min);                       \
    EXPECT(right_range->max().ConstantValue() == r_max);                       \
    Range::And(left_range, right_range, &min, &max);                           \
    EXPECT(min.Equals(result_min));                                            \
    if (FLAG_support_il_printer && !min.Equals(result_min)) {                  \
      OS::Print("%s != %s\n", min.ToCString(), result_min.ToCString());        \
    }                                                                          \
    EXPECT(max.Equals(result_max));                                            \
    if (FLAG_support_il_printer && !max.Equals(result_max)) {                  \
      OS::Print("%s != %s\n", max.ToCString(), result_max.ToCString());        \
    }                                                                          \
  }

  // [0xff, 0xfff] & [0xf, 0xf] = [0x0, 0xf].
  TEST_RANGE_AND(static_cast<int64_t>(0xff),
                 static_cast<int64_t>(0xfff),
                 static_cast<int64_t>(0xf),
                 static_cast<int64_t>(0xf),
                 RangeBoundary(0),
                 RangeBoundary(0xf));

  // [0xffffffff, 0xffffffff] & [0xfffffffff, 0xfffffffff] = [0x0, 0xfffffffff].
  TEST_RANGE_AND(static_cast<int64_t>(0xffffffff),
                 static_cast<int64_t>(0xffffffff),
                 static_cast<int64_t>(0xfffffffff),
                 static_cast<int64_t>(0xfffffffff),
                 RangeBoundary(0),
                 RangeBoundary(static_cast<int64_t>(0xfffffffff)));

  // [0xffffffff, 0xffffffff] & [-20, 20] = [0x0, 0xffffffff].
  TEST_RANGE_AND(static_cast<int64_t>(0xffffffff),
                 static_cast<int64_t>(0xffffffff),
                 static_cast<int64_t>(-20),
                 static_cast<int64_t>(20),
                 RangeBoundary(0),
                 RangeBoundary(static_cast<int64_t>(0xffffffff)));

  // [-20, 20] & [0xffffffff, 0xffffffff] = [0x0, 0xffffffff].
  TEST_RANGE_AND(static_cast<int64_t>(-20),
                 static_cast<int64_t>(20),
                 static_cast<int64_t>(0xffffffff),
                 static_cast<int64_t>(0xffffffff),
                 RangeBoundary(0),
                 RangeBoundary(static_cast<int64_t>(0xffffffff)));

  // Test that [-20, 20] & [-20, 20] = [-32, 31].
  TEST_RANGE_AND(static_cast<int64_t>(-20),
                 static_cast<int64_t>(20),
                 static_cast<int64_t>(-20),
                 static_cast<int64_t>(20),
                 RangeBoundary(-32),
                 RangeBoundary(31));

#undef TEST_RANGE_AND
}


TEST_CASE(RangeIntersectionMinMax) {
  // Test IntersectionMin and IntersectionMax methods which for constants are
  // simply defined as Max/Min respectively.

  // Constants.
  // MIN(0, 1) == 0
  EXPECT(RangeBoundary::IntersectionMax(
      RangeBoundary::FromConstant(0),
      RangeBoundary::FromConstant(1)).ConstantValue() == 0);
  // MIN(0, -1) == -1
  EXPECT(RangeBoundary::IntersectionMax(
      RangeBoundary::FromConstant(0),
      RangeBoundary::FromConstant(-1)).ConstantValue() == -1);

  // MIN(1, 0) == 0
  EXPECT(RangeBoundary::IntersectionMax(
      RangeBoundary::FromConstant(1),
      RangeBoundary::FromConstant(0)).ConstantValue() == 0);
  // MIN(-1, 0) == -1
  EXPECT(RangeBoundary::IntersectionMax(
      RangeBoundary::FromConstant(-1),
      RangeBoundary::FromConstant(0)).ConstantValue() == -1);

  // MAX(0, 1) == 1
  EXPECT(RangeBoundary::IntersectionMin(
      RangeBoundary::FromConstant(0),
      RangeBoundary::FromConstant(1)).ConstantValue() == 1);

  // MAX(0, -1) == 0
  EXPECT(RangeBoundary::IntersectionMin(
      RangeBoundary::FromConstant(0),
      RangeBoundary::FromConstant(-1)).ConstantValue() == 0);

  // MAX(1, 0) == 1
  EXPECT(RangeBoundary::IntersectionMin(
      RangeBoundary::FromConstant(1),
      RangeBoundary::FromConstant(0)).ConstantValue() == 1);
  // MAX(-1, 0) == 0
  EXPECT(RangeBoundary::IntersectionMin(
      RangeBoundary::FromConstant(-1),
      RangeBoundary::FromConstant(0)).ConstantValue() == 0);

  RangeBoundary n_infinity = RangeBoundary::NegativeInfinity();
  RangeBoundary p_infinity = RangeBoundary::PositiveInfinity();

  // Constants vs. infinity.
  EXPECT(RangeBoundary::IntersectionMin(
      n_infinity,
      RangeBoundary::FromConstant(-1)).ConstantValue() == -1);

  EXPECT(RangeBoundary::IntersectionMin(
      RangeBoundary::FromConstant(-1),
      n_infinity).ConstantValue() == -1);

  EXPECT(RangeBoundary::IntersectionMin(
      RangeBoundary::FromConstant(1),
      n_infinity).ConstantValue() == 1);

  EXPECT(RangeBoundary::IntersectionMin(
      n_infinity,
      RangeBoundary::FromConstant(1)).ConstantValue() == 1);

  EXPECT(RangeBoundary::IntersectionMax(
      p_infinity,
      RangeBoundary::FromConstant(-1)).ConstantValue() == -1);

  EXPECT(RangeBoundary::IntersectionMax(
      RangeBoundary::FromConstant(-1),
      p_infinity).ConstantValue() == -1);

  EXPECT(RangeBoundary::IntersectionMax(
      RangeBoundary::FromConstant(1),
      p_infinity).ConstantValue() == 1);

  EXPECT(RangeBoundary::IntersectionMax(
      p_infinity,
      RangeBoundary::FromConstant(1)).ConstantValue() == 1);
}


TEST_CASE(RangeJoinMinMax) {
  // Test IntersectionMin and IntersectionMax methods which for constants are
  // simply defined as Min/Max respectively.
  const RangeBoundary::RangeSize size = RangeBoundary::kRangeBoundarySmi;

  // Constants.
  EXPECT(RangeBoundary::JoinMax(
      RangeBoundary::FromConstant(0),
      RangeBoundary::FromConstant(1),
      size).ConstantValue() == 1);
  EXPECT(RangeBoundary::JoinMax(
      RangeBoundary::FromConstant(0),
      RangeBoundary::FromConstant(-1),
      size).ConstantValue() == 0);
  EXPECT(RangeBoundary::JoinMax(
      RangeBoundary::FromConstant(1),
      RangeBoundary::FromConstant(0),
      size).ConstantValue() == 1);
  EXPECT(RangeBoundary::JoinMax(
      RangeBoundary::FromConstant(-1),
      RangeBoundary::FromConstant(0),
      size).ConstantValue() == 0);
  EXPECT(RangeBoundary::JoinMin(
      RangeBoundary::FromConstant(0),
      RangeBoundary::FromConstant(1),
      size).ConstantValue() == 0);
  EXPECT(RangeBoundary::JoinMin(
      RangeBoundary::FromConstant(0),
      RangeBoundary::FromConstant(-1),
      size).ConstantValue() == -1);
  EXPECT(RangeBoundary::JoinMin(
      RangeBoundary::FromConstant(1),
      RangeBoundary::FromConstant(0),
      size).ConstantValue() == 0);
  EXPECT(RangeBoundary::JoinMin(
      RangeBoundary::FromConstant(-1),
      RangeBoundary::FromConstant(0),
      size).ConstantValue() == -1);

  RangeBoundary n_infinity = RangeBoundary::NegativeInfinity();
  RangeBoundary p_infinity = RangeBoundary::PositiveInfinity();

  // Constants vs. infinity.
  EXPECT(RangeBoundary::JoinMin(
      n_infinity,
      RangeBoundary::FromConstant(-1),
      size).IsMinimumOrBelow(size));

  EXPECT(RangeBoundary::JoinMin(
      RangeBoundary::FromConstant(-1),
      n_infinity,
      size).IsMinimumOrBelow(size));

  EXPECT(RangeBoundary::JoinMin(
      RangeBoundary::FromConstant(1),
      n_infinity,
      size).IsMinimumOrBelow(size));

  EXPECT(RangeBoundary::JoinMin(
      n_infinity,
      RangeBoundary::FromConstant(1),
      size).IsMinimumOrBelow(size));

  EXPECT(RangeBoundary::JoinMax(
      p_infinity,
      RangeBoundary::FromConstant(-1),
      size).IsMaximumOrAbove(size));

  EXPECT(RangeBoundary::JoinMax(
      RangeBoundary::FromConstant(-1),
      p_infinity,
      size).IsMaximumOrAbove(size));

  EXPECT(RangeBoundary::JoinMax(
      RangeBoundary::FromConstant(1),
      p_infinity,
      size).IsMaximumOrAbove(size));

  EXPECT(RangeBoundary::JoinMax(
      p_infinity,
      RangeBoundary::FromConstant(1),
      size).IsMaximumOrAbove(size));
}

}  // namespace dart
