// 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=constant-update-2018

// Tests that short-circuit operators do not care about the unevaluated part.

import "package:expect/expect.dart";

main() {
  const C c = C();
  // Short-circuited operations.
  // Non-taken branch of ?:.
  const c1 = true ? c : c + c;
  const c2 = false ? c + c : c;
  // Non-taken part of &&, ||, ??.
  const c3 = (c != null) || c < c;
  const c4 = (c == null) && c < c;
  const c5 = c ?? c + c;
  Expect.identical(c, c1);
  Expect.identical(c, c2);
  Expect.isTrue(c3);
  Expect.isFalse(c4);
  Expect.identical(c, c5);
  // Nested short-circuiting.
  const c6 = true ? c == null && c + c : c < c;
  Expect.isFalse(c6);

  // Concrete use-case.
  Expect.equals(1, const T.length("a").value);
  Expect.equals(0, const T.length("").value);
  Expect.equals(0, const T.length(null).value);
  Expect.equals(1, T.length([1]).value);
  Expect.equals(0, T.length([]).value);
  Expect.equals(0, T.length(null).value);

  Expect.equals(1, const T.asserts("a").value);
  Expect.equals(0, const T.asserts("").value);
  Expect.equals(0, const T.asserts(null).value);
  Expect.equals(1, T.asserts([1]).value);
  Expect.equals(0, T.asserts([]).value);
  Expect.equals(0, T.asserts(null).value);
}

class T {
  final Object value;
  const T(this.value);
  const T.length(dynamic l) : value = (l == null ? 0 : l.length);
  const T.asserts(dynamic l)
      : assert(l == null || l.length < 2),
        value = (l ?? "").length;
}

class C {
  const C();
  dynamic operator +(dynamic other) => throw "Never";
  bool operator <(dynamic other) => throw "Never";
}
