blob: d607bbd163b927497ffdf130b84a919f8b3878ea [file] [log] [blame]
// Copyright (c) 2022, 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 logicalOrPattern ::= ( logicalOrPattern '||' )? logicalAndPattern
///
/// A pair of patterns separated by || matches if either of the branches match
///
/// A logical-or pattern may match even if one of its branches does not. That
/// means that any variables in the non-matching branch would not be
/// initialized. To avoid problems stemming from that, the following
/// restrictions apply:
///
/// The two branches must define the same set of variables.
///
/// If the left branch matches, the right branch is not evaluated. This
/// determines which value the variable gets if both branches would have
/// matched. In that case, it will always be the value from the left branch.
///
/// @description Checks logical-or pattern in an if-case statement
/// @author sgrekhov22@gmail.com
import "patterns_lib.dart";
import "../../Utils/expect.dart";
void test(Shape shape, Unit expectedArea, Type expectedType, bool match) {
if (shape case Square(area: var s) || Circle(area: var s)) {
Expect.equals(s, expectedArea);
Expect.equals(expectedType, shape.runtimeType);
Expect.isTrue(match);
} else {
Expect.isFalse(match);
}
}
main() {
test(Circle(1), Unit(3.14), Circle, true);
test(Square(2), Unit(4), Square, true);
test(Rectangle(2, 1), Unit(2), Rectangle, false);
}