| // Copyright (c) 2014, 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. | |
| // Dart test program for testing if statement. | |
| import "package:expect/expect.dart"; | |
| // For logical-or conditions dart2js sometimes inlined expressions, leading to | |
| // completely broken programs. | |
| int globalCounter = 0; | |
| falseWithSideEffect() { | |
| bool confuse() => new DateTime.now().millisecondsSinceEpoch == 42; | |
| var result = confuse(); | |
| // Make it harder to inline. | |
| if (result) { | |
| try { | |
| try { | |
| if (confuse()) falseWithSideEffect(); | |
| if (confuse()) return 499; | |
| } catch (e) { | |
| rethrow; | |
| } | |
| } catch (e) { | |
| rethrow; | |
| } | |
| } | |
| globalCounter++; | |
| return result; | |
| } | |
| falseWithoutSideEffect() { | |
| bool confuse() => new DateTime.now().millisecondsSinceEpoch == 42; | |
| var result = confuse(); | |
| // Make it harder to inline. | |
| if (result) { | |
| try { | |
| try { | |
| if (confuse()) falseWithSideEffect(); | |
| if (confuse()) return 499; | |
| } catch (e) { | |
| rethrow; | |
| } | |
| } catch (e) { | |
| rethrow; | |
| } | |
| } | |
| return result; | |
| } | |
| testLogicalOr() { | |
| globalCounter = 0; | |
| bool cond1 = falseWithSideEffect(); | |
| if (cond1 || falseWithoutSideEffect()) Expect.fail("must be false"); | |
| if (cond1 || falseWithoutSideEffect()) Expect.fail("must be false"); | |
| if (cond1 || falseWithoutSideEffect()) Expect.fail("must be false"); | |
| Expect.equals(1, globalCounter); | |
| cond1 = (falseWithSideEffect() == 499); | |
| if (cond1 || falseWithoutSideEffect()) Expect.fail("must be false"); | |
| if (cond1 || falseWithoutSideEffect()) Expect.fail("must be false"); | |
| if (cond1 || falseWithoutSideEffect()) Expect.fail("must be false"); | |
| Expect.equals(2, globalCounter); | |
| } | |
| List globalList = []; | |
| void testLogicalOr2() { | |
| globalList.clear(); | |
| testValueOr([]); | |
| testValueOr(null); | |
| Expect.listEquals([1, 2, 3], globalList); | |
| } | |
| void testValueOr(List? list) { | |
| if (list == null) globalList.add(1); | |
| if (list == null || list.contains("2")) globalList.add(2); | |
| if (list == null || list.contains("3")) globalList.add(3); | |
| } | |
| testLogicalAnd() { | |
| globalCounter = 0; | |
| bool cond1 = falseWithSideEffect(); | |
| if (cond1 && falseWithoutSideEffect()) Expect.fail("must be false"); | |
| if (cond1 && falseWithoutSideEffect()) Expect.fail("must be false"); | |
| if (cond1 && falseWithoutSideEffect()) Expect.fail("must be false"); | |
| Expect.equals(1, globalCounter); | |
| cond1 = (falseWithSideEffect() == 499); | |
| if (cond1 && falseWithoutSideEffect()) Expect.fail("must be false"); | |
| if (cond1 && falseWithoutSideEffect()) Expect.fail("must be false"); | |
| if (cond1 && falseWithoutSideEffect()) Expect.fail("must be false"); | |
| Expect.equals(2, globalCounter); | |
| } | |
| void testLogicalAnd2() { | |
| globalList.clear(); | |
| testValueAnd([]); | |
| testValueAnd(null); | |
| Expect.listEquals([1, 2, 3], globalList); | |
| } | |
| void testValueAnd(List? list) { | |
| if (list == null) globalList.add(1); | |
| if (list == null && globalList.contains(1)) globalList.add(2); | |
| if (list == null && globalList.contains(1)) globalList.add(3); | |
| } | |
| main() { | |
| testLogicalOr(); | |
| testLogicalOr2(); | |
| testLogicalAnd(); | |
| testLogicalAnd2(); | |
| } |