// Copyright (c) 2022, 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';

abstract class Base {}

class Child1 extends Base {}

class Child2 extends Base {}

bool trivial(x) => true;
Base either = DateTime.now().millisecondsSinceEpoch > 0 ? Child2() : Child1();

test1() {
  Base child = either;
  if (trivial(child is Child1 && true)) return child;
  return null;
}

test2() {
  Base child = either;
  if (child is Child1 || trivial(child is Child1 && true)) return child;
  return null;
}

test3() {
  Base child = either;
  if (trivial(child is Child1 && true) && child is Child2) return child;
  return null;
}

test4() {
  Base child = either;
  if (child is Child2 && trivial(child is Child1 && true)) return child;
  return null;
}

test5() {
  Base child = either;
  if ((child is Child1 && true) == false) return child;
  return null;
}

test6() {
  Base child = either;
  if (trivial(child is Child1 ? false : true)) return child;
  return null;
}

test7() {
  Base child = either;
  if (trivial(trivial(child is Child1 && true))) return child;
  return null;
}

main() {
  Expect.isTrue(test1() is Child2, "test1");
  Expect.isTrue(test2() is Child2, "test2");
  Expect.isTrue(test3() is Child2, "test3");
  Expect.isTrue(test4() is Child2, "test4");
  Expect.isTrue(test5() is Child2, "test5");
  Expect.isTrue(test6() is Child2, "test6");
  Expect.isTrue(test7() is Child2, "test7");
}
