// 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.

import 'package:expect/expect.dart';

baz() {}

check_true_true(x, y) {
  if (x) {
    if (y) {
      return true;
    }
  }
  baz();
  return false;
}

check_false_true(x, y) {
  if (x) {} else {
    if (y) {
      return true;
    }
  }
  baz();
  return false;
}

check_true_false(x, y) {
  if (x) {
    if (y) {} else {
      return true;
    }
  }
  baz();
  return false;
}

check_false_false(x, y) {
  if (x) {} else {
    if (y) {} else {
      return true;
    }
  }
  baz();
  return false;
}

main() {
  Expect.equals(true, check_true_true(true, true));
  Expect.equals(false, check_true_true(true, false));
  Expect.equals(false, check_true_true(false, true));
  Expect.equals(false, check_true_true(false, false));

  Expect.equals(false, check_true_false(true, true));
  Expect.equals(true, check_true_false(true, false));
  Expect.equals(false, check_true_false(false, true));
  Expect.equals(false, check_true_false(false, false));

  Expect.equals(false, check_false_true(true, true));
  Expect.equals(false, check_false_true(true, false));
  Expect.equals(true, check_false_true(false, true));
  Expect.equals(false, check_false_true(false, false));

  Expect.equals(false, check_false_false(true, true));
  Expect.equals(false, check_false_false(true, false));
  Expect.equals(false, check_false_false(false, true));
  Expect.equals(true, check_false_false(false, false));
}
