dart / co19 / refs/heads/master / . / LanguageFeatures / nnbd / weak / null_aware_operator_A16_t01.dart

// Copyright (c) 2020, 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-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"; | |

} | |

} | |

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

} | |

} |