// 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.
// Testing optimized 'is' tests.
// VMOptions=--optimization-counter-threshold=5 --no-use-osr --no-background-compilation

import "package:expect/expect.dart";


bool isInt(x) => x is int;


int isIntRes(x) {
  if (x is int) {
    return 1;
  } else {
    return 0;
  }
}


int isNotIntRes(x) {
  if (x is! int) {
    return 1;
  } else {
    return 0;
  }
}


int isIfThenElseIntRes(x) {
  return x is int ?  1 : 0;
}



bool isString(x) => x is String;


int isStringRes(x) {
  if (x is String) {
    return 1;
  } else {
    return 0;
  }
}


int isNotStringRes(x) {
  if (x is! String) {
    return 1;
  } else {
    return 0;
  }
}


main() {
  for (int i = 0; i < 20; i++) {
    Expect.isFalse(isInt(3.2));
    Expect.isTrue(isInt(3));
    Expect.isTrue(isInt(17179869184));  // Mint on ia32.
    Expect.isFalse(isString(2.0));
    Expect.isTrue(isString("Morgan"));
  }
  // No deoptimization of isInt possible since all types are known by the compiler

  Expect.isFalse(isString(true));
  for (int i = 0; i < 20; i++) {
    Expect.isFalse(isInt(3.2));
    Expect.isTrue(isInt(3));
    Expect.isTrue(isInt(17179869184));  // Mint on ia32.
    Expect.isFalse(isInt("hu"));
    Expect.isFalse(isString(2.0));
    Expect.isTrue(isString("Morgan"));
    Expect.isFalse(isString(true));
  }

  for (int i = 0; i < 20; i++) {
    Expect.equals(0, isIntRes(3.2));
    Expect.equals(1, isIntRes(3));
    Expect.equals(0, isIntRes("hi"));
    Expect.equals(1, isNotIntRes(3.2));
    Expect.equals(0, isNotIntRes(3));
    Expect.equals(1, isNotIntRes("hi"));
    Expect.equals(0, isIfThenElseIntRes(3.2));
    Expect.equals(1, isIfThenElseIntRes(3));
    Expect.equals(0, isIfThenElseIntRes("hi"));
  }

  for (int i = 0; i < 20; i++) {
    Expect.equals(0, isStringRes(3.2));
    Expect.equals(1, isStringRes("Lotus"));
    Expect.equals(1, isNotStringRes(3.2));
    Expect.equals(0, isNotStringRes("Lotus"));
  }

  // Deoptimize 'isStringRes', 'isNotIntRes'.
  Expect.equals(0, isStringRes(null));
  Expect.equals(1, isNotIntRes(null));
  for (int i = 0; i < 20; i++) {
    Expect.equals(0, isStringRes(3.2));
    Expect.equals(1, isStringRes("Lotus"));
    Expect.equals(0, isStringRes(null));

    Expect.equals(1, isNotStringRes(3.2));
    Expect.equals(0, isNotStringRes("Lotus"));
    Expect.equals(1, isNotStringRes(null));
  }
}