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

import "package:expect/expect.dart";

class A {
  bool _result;
  A(this._result);
  operator ==(x) {
    return _result;
  }
}

opaque(x) => [x, 1, 'y'][0]; // confuse the optimizers.

class Death {
  operator ==(x) {
    throw 'Dead!';
  }
}

death() => opaque(new Death());
nullFn() => opaque(null);

tests() {
  var alwaysTrue = new A(true);
  var alwaysFalse = new A(false);
  Expect.isFalse(alwaysFalse == alwaysFalse);
  Expect.isTrue(alwaysFalse != alwaysFalse);
  Expect.isTrue(alwaysTrue == alwaysTrue);
  Expect.isTrue(alwaysTrue == 5);
  Expect.isFalse(alwaysTrue == null);
  Expect.isFalse(null == alwaysTrue);
  Expect.isTrue(alwaysTrue != null);
  Expect.isTrue(null != alwaysTrue);
  Expect.isTrue(null == null);
  Expect.isFalse(null != null);

  Expect.throws(() => death() == 5);
  Expect.isFalse(death() == nullFn());
  Expect.isFalse(nullFn() == death());
  Expect.isTrue(nullFn() == nullFn());
  Expect.isTrue(death() != nullFn());
  Expect.isTrue(nullFn() != death());
  Expect.isFalse(nullFn() != nullFn());

  if (death() == nullFn()) {
    throw "failed";
  }
  if (death() != nullFn()) {} else {
    throw "failed";
  }
}

boolEqualityPositiveA(a) => a == true;
boolEqualityNegativeA(a) => a != true;

boolEqualityPositiveB(a) => true == a;
boolEqualityNegativeB(a) => true != a;

main() {
  for (int i = 0; i < 20; i++) {
    tests();
    // Do not inline calls to prevent constant folding.
    Expect.isTrue(boolEqualityPositiveA(true));
    Expect.isFalse(boolEqualityPositiveA(false));
    Expect.isFalse(boolEqualityNegativeA(true));
    Expect.isTrue(boolEqualityNegativeA(false));

    Expect.isTrue(boolEqualityPositiveB(true));
    Expect.isFalse(boolEqualityPositiveB(false));
    Expect.isFalse(boolEqualityNegativeB(true));
    Expect.isTrue(boolEqualityNegativeB(false));
  }

  // Deoptimize.
  Expect.isFalse(boolEqualityPositiveA(1));
  Expect.isTrue(boolEqualityNegativeA("hi"));
  Expect.isFalse(boolEqualityPositiveB(2.0));
  Expect.isTrue(boolEqualityNegativeB([]));
}
