blob: 518c7e58651dc9fd757473dfeef660ca0b93fa1c [file] [log] [blame]
// 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);
}