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

import 'package:expect/expect.dart';

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

void expectError(Function() callback) {
  if (isWeakMode) {
    Expect.throwsAssertionError(callback);
  } else {
    Expect.throwsTypeError(callback);
  }
}

void conditionalTest() {
  dynamic x = null;
  expectError(() => x ? 1 : 0);
}

void orTest() {
  dynamic x = null;
  expectError(() => x || x);
  expectError(() => x || false);
  expectError(() => x || true);
  expectError(() => false || x);
  Expect.isTrue(true || x);
}

void andTest() {
  dynamic x = null;
  expectError(() => x && x);
  expectError(() => x && false);
  expectError(() => x && true);
  Expect.isFalse(false && x);
  expectError(() => true && x);
}

void ifTest() {
  dynamic x = null;
  expectError(() {
    if (x) {}
  });
}

void forTest() {
  dynamic x = null;
  expectError(() {
    for (; x;) {}
  });
}

void whileTest() {
  dynamic x = null;
  expectError(() {
    while (x) {}
  });
}

void doTest() {
  dynamic x = null;
  expectError(() {
    do {} while (x);
  });
}

void notTest() {
  dynamic x = null;
  expectError(() => !x);
}
