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

// dart2jsOptions=-O1

import "package:expect/expect.dart";

// Test that dart2js does not rewrite conditional into logical operators
// in cases where it changes which falsy value is returned.

posFalse(x, y) => x != null ? y : false;
negFalse(x, y) => x != null ? !y : false;
posNull(x, y) => x != null ? y : null;
negNull(x, y) => x != null ? !y : null;

main() {
  Expect.equals(false, posFalse(null, false));
  Expect.equals(false, negFalse(null, false));
  Expect.equals(null, posNull(null, false));
  Expect.equals(null, negNull(null, false));

  Expect.equals(false, posFalse(null, true));
  Expect.equals(false, negFalse(null, true));
  Expect.equals(null, posNull(null, true));
  Expect.equals(null, negNull(null, true));

  Expect.equals(false, posFalse([], false));
  Expect.equals(true, negFalse([], false));
  Expect.equals(false, posNull([], false));
  Expect.equals(true, negNull([], false));

  Expect.equals(true, posFalse([], true));
  Expect.equals(false, negFalse([], true));
  Expect.equals(true, posNull([], true));
  Expect.equals(false, negNull([], true));

  if (isConditionCheckDisabled) {
    Expect.equals(null, posFalse([], null));
    Expect.equals(true, negFalse([], null));
    Expect.equals(null, posNull([], null));
    Expect.equals(true, negNull([], null));

    var y = {};
    Expect.identical(y, posFalse([], y));
    Expect.equals(true, negFalse([], y));
    Expect.identical(y, posNull([], y));
    Expect.equals(true, negNull([], y));
  }
}

bool get isConditionCheckDisabled {
  bool? b = null;
  for (int i = 0; i < 3; i++) {
    try {
      b = !(b as dynamic);
    } catch (e) {
      return false;
    }
  }
  return true;
}
