dart / co19 / 71951f8d687c6e7400bc9e5605301d2ef3fafa5b / . / LanguageFeatures / nnbd / null_aware_operator_A16_t01.dart

/* | |

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

*/ | |

/** | |

* @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] | |

* ] | |

* @author sgrekhov@unipro.ru | |

*/ | |

// Requirements=nnbd-strong | |

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"; | |

} | |

} | |

main() { | |

C 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); | |

C? 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); | |

} | |

} |