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

/// @assertion A cascade expression e..s translates as follows, where F is the
/// translation of e and x and y are fresh object level variables:
///  fn[k : Exp -> Exp] : Exp =>
///      F[fn[r : Exp] : Exp => let x = r in
///                             let y = EXP(x.s)
///                             in k[x]
///  ]
///
/// @description Check that a cascade expression e..s translates as follows,
/// where F is the translation of e and x and y are fresh object level variables:
///  fn[k : Exp -> Exp] : Exp =>
///      F[fn[r : Exp] : Exp => let x = r in
///                             let y = EXP(x.s)
///                             in k[x]
///  ]
///  Test type aliases
/// @author sgrekhov@unipro.ru

// Requirements=nnbd-weak
import '../../../Utils/expect.dart';

class C {
  int c1 = 0, c2 = 0;
  String get log => "test1 called $c1 times, test2() called $c2 times";

  String get test1 {
    c1++;
    return "Show must go on";
  }

  String test2() {
    c2++;
    return "Let it be";
  }
}

typedef CAlias1 = C;
typedef CAlias2 = C?;

main() {
  CAlias1 c1 = new C();

  var actual1 = c1 .. test1;
  var expected = c1;
  Expect.equals(expected, actual1);
  Expect.equals("test1 called 1 times, test2() called 0 times", c1.log);

  var actual2 = c1 .. test2();
  Expect.equals(expected, actual2);
  Expect.equals("test1 called 1 times, test2() called 1 times", c1.log);

  var actual3 = c1
    .. test1
    .. test2();
  Expect.equals(expected, actual3);
  Expect.equals("test1 called 2 times, test2() called 2 times", c1.log);

  CAlias1? c2 = new C();
  if (c2 != null) {
    var actual4 = c2 .. test1;
    var expected2 = c2;
    Expect.equals(expected2, actual4);
    Expect.equals("test1 called 1 times, test2() called 0 times", c2.log);

    var actual5 = c2 .. test2();
    Expect.equals(expected2, actual5);
    Expect.equals("test1 called 1 times, test2() called 1 times", c2.log);

    var actual6 = c2 .. test1 .. test2();
    Expect.equals(expected2, actual6);
    Expect.equals("test1 called 2 times, test2() called 2 times", c2.log);
  }

  CAlias2 c3 = new C();
  if (c3 != null) {
    var actual7 = c3 .. test1;
    var expected3 = c3;
    Expect.equals(expected3, actual7);
    Expect.equals("test1 called 1 times, test2() called 0 times", c3.log);

    var actual8 = c3.. test2();
    Expect.equals(expected3, actual8);
    Expect.equals("test1 called 1 times, test2() called 1 times", c3.log);

    var actual9 = c3
      .. test1
      .. test2();
    Expect.equals(expected3, actual9);
    Expect.equals("test1 called 2 times, test2() called 2 times", c3.log);
  }

  CAlias2? c4 = new C();
  if (c4 != null) {
    var actual10 = c4 .. test1;
    var expected4 = c4;
    Expect.equals(expected4, actual10);
    Expect.equals("test1 called 1 times, test2() called 0 times", c4.log);

    var actual5 = c4 .. test2();
    Expect.equals(expected4, actual10);
    Expect.equals("test1 called 1 times, test2() called 1 times", c4.log);

    var actual6 = c4
      .. test1
      .. test2();
    Expect.equals(expected4, actual10);
    Expect.equals("test1 called 2 times, test2() called 2 times", c4.log);
  }
}
