| // 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. |
| |
| /// @assertion Evaluation of an if-null expression e of the form e1 ??e2 is |
| /// equivalent to the evaluation of the expression ((x) => x == null?e2 : x)(e1). |
| /// |
| /// @description Check evaluation order |
| /// |
| /// @author a.semenov@unipro.ru |
| |
| import '../../../Utils/expect.dart'; |
| |
| int e1count = 0; |
| int? e1(int? r) { |
| e1count++; |
| return r; |
| } |
| |
| int e2count = 0; |
| int? e2(int? r) { |
| e2count++; |
| return r; |
| } |
| |
| int e3count = 0; |
| int? e3(int? r) { |
| e3count++; |
| return r; |
| } |
| |
| void reset() { |
| e1count = 0; |
| e2count = 0; |
| e3count = 0; |
| } |
| |
| main() { |
| // if e1 evaluates to not null value, e2 is not evaluated |
| reset(); |
| var x = e1(1) ?? e2(null); |
| Expect.equals(1, e1count); |
| Expect.equals(0, e2count); |
| |
| // if e1 evaluates to null value, e2 is evaluated |
| reset(); |
| x = e1(null) ?? e2(1); |
| Expect.equals(1, e1count); |
| Expect.equals(1, e2count); |
| |
| // if e1 evaluates to not null value, e2 and e3 are not evaluated |
| reset(); |
| x = e1(1) ?? e2(2) ?? e3(3); |
| Expect.equals(1, e1count); |
| Expect.equals(0, e2count); |
| Expect.equals(0, e3count); |
| |
| // if e1 evaluates to null value and e2 is evaluated to not null value, |
| // e3 is not evaluated |
| reset(); |
| x = e1(null) ?? e2(2) ?? e3(3); |
| Expect.equals(1, e1count); |
| Expect.equals(1, e2count); |
| Expect.equals(0, e3count); |
| |
| // if e1 evaluates to null value and e2 is evaluated to null, |
| // e3 is evaluated |
| reset(); |
| x = e1(null) ?? e2(null) ?? e3(3); |
| Expect.equals(1, e1count); |
| Expect.equals(1, e2count); |
| Expect.equals(1, e3count); |
| } |