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

// SharedOptions=--enable-experiment=control-flow-collections
// dart2jsOptions=--omit-implicit-checks

// Note: --omit-implicit-checks causes Expect.isNull to misbehave, so we use
// Expect.equals(null, ...) instead.

import 'package:expect/expect.dart';

void main() {
  conditionalTest();
  orTest();
  andTest();
  ifTest();
  forTest();
  whileTest();
  doTest();
  notTest();
  ifElementTest();
  forElementTest();
}

void conditionalTest() {
  bool x = null;
  Expect.isFalse(x ? true : false);
}

void orTest() {
  bool x = null;
  Expect.equals(null, x || x);
  Expect.isFalse(x || false);
  Expect.isTrue(x || true);
  Expect.equals(null, false || x);
  Expect.isTrue(true || x);
}

void andTest() {
  bool x = null;
  Expect.isFalse(x && x);
  Expect.isFalse(x && false);
  Expect.isFalse(x && true);
  Expect.isFalse(false && x);
  Expect.equals(null, true && x);
}

void ifTest() {
  bool x = null;
  Expect.isFalse(() {
    if (x) {
      return true;
    } else {
      return false;
    }
  }());
}

void forTest() {
  bool x = null;
  Expect.isFalse(() {
    for (; x;) {
      return true;
    }
    return false;
  }());
}

void whileTest() {
  bool x = null;
  Expect.isFalse(() {
    while (x) {
      return true;
    }
    return false;
  }());
}

void doTest() {
  bool x = null;
  Expect.equals(1, () {
    int n = 0;
    do {
      n++;
    } while (x);
    return n;
  }());
}

void notTest() {
  bool x = null;
  Expect.isTrue(!x);
}

void ifElementTest() {
  bool x = null;
  Expect.listEquals([], [if (x) 1]);
}

void forElementTest() {
  bool x = null;
  Expect.listEquals([], [for (var i = 0; x; i++) i]);
}
