// Copyright (c) 2015, 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.
//
// VMOptions=--optimization_counter_threshold=5
//
// Basic null-aware operator test that invokes the optimizing compiler.

import "package:expect/expect.dart";

class C {
  C(this.f);
  var f;
  m(a) => a;
}

bomb() {
  Expect.fail('Should not be executed');
  return 100;
}

getNull() => null;

test() {
  var c;
  var d = new C(5) as C?;
  Expect.equals(null, c?.m(bomb()));
  Expect.equals(null, getNull()?.anything(bomb()));
  Expect.equals(1, d?.m(1));

  var c2 = new C(1) as C?;
  Expect.equals(1, c2?.f);
  Expect.equals(null, c?.v);
  Expect.equals(10, c ?? 10);
  Expect.equals(d, d ?? bomb());
  var list = [[3]] as List<List<int>>?;
  Expect.equals(
      3,
      list?.expand((i) => i).toList()[0]);
  Expect.equals(null, (null as dynamic)?.expand((i) => i)?.toList());

  var e;
  // The assignment to e is not executed since d != null.
  d ??= e ??= new C(100);
  Expect.equals(null, e);
  e ??= new C(100);
  Expect.equals(100, e?.f);
  e?.f ??= 200;
  Expect.equals(100, e?.f);

  e.f = null;
  e?.f ??= 200;
  Expect.equals(200, e?.f);

  c?.f ??= 400;
  Expect.equals(null, c?.f);
  Expect.equals(null, c?.f++);
  e?.f++;
  Expect.equals(201, e.f);

  var five = 5 as int?;
  var x = five ?? bomb();
}

// Check that instructions without result do not crash.
test2() {
  var c;
  c?.v;
  c?.m(bomb());
}

class Bar {
  String? s;
}

class Foo {
  Bar? _bar;
  String? str;

  Foo(this._bar) : str = _bar?.s;
}

// Check that ?? isn't incorrectly optimized as non-nullable
// (DDC regression test)
test3() {
  List? n = null;
  var func = n?.add;
  var result = func ?? 1;
  Expect.equals(result, 1);

  String? x = null;
  Expect.equals(x?.split(',') ?? 'hello', 'hello');
}

main() {
  for (int i = 0; i < 10; i++) {
    test();
    test2();
    test3();
  }

  Expect.equals(null, new Foo(new Bar()).str);
}
