// Copyright (c) 2011, 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. import "package:expect/expect.dart"; // Tests all statement types. Not an exhaustive test of all statement semantics. class StatementTest { StatementTest() {} static testMain() { var test = new StatementTest(); test.testIfStatement(); test.testForLoop(); test.testWhileLoops(); test.testSwitch(); test.testExceptions(); test.testBreak(); test.testContinue(); test.testFunction(); test.testReturn(); } testIfStatement() { // Basic if statements. if (true) { Expect.equals(true, true); } else { Expect.equals(false, true); } if (false) { Expect.equals(false, true); } else { Expect.equals(true, true); } } testForLoop() { int count = 0, count2; // Basic for loop. for (int i = 0; i < 10; ++i) { ++count; } Expect.equals(10, count); // For loop with no 'var'. count2 = 0; for (count = 0; count < 5; ++count) { ++count2; } Expect.equals(5, count); Expect.equals(5, count2); // For loop with no initializer. count = count2 = 0; for (; count < 10; ++count) { ++count2; } Expect.equals(10, count); Expect.equals(10, count2); // For loop with no increment. for (count = 0; count < 5;) { ++count; } Expect.equals(5, count); // For loop with no test. for (count = 0; ; ++count) { if (count == 10) { break; } } Expect.equals(10, count); // For loop with no nothing. count = 0; for (;;) { if (count == 5) { break; } ++count; } Expect.equals(5, count); } testWhileLoops() { // Basic while loop. int count = 0; while (count < 10) { ++count; } Expect.equals(10, count); // Basic do loop. count = 0; do { ++count; } while (count < 5); Expect.equals(5, count); } testSwitch() { // Int switch. bool? hit0, hit1, hitDefault; for (int x = 0; x < 3; ++x) { switch (x) { case 0: hit0 = true; break; case 1: hit1 = true; break; default: hitDefault = true; break; } } Expect.equals(true, hit0); Expect.equals(true, hit1); Expect.equals(true, hitDefault); // String switch. var strings = ['a', 'b', 'c']; bool? hitA, hitB; hitDefault = false; for (int x = 0; x < 3; ++x) { switch (strings[x]) { case 'a': hitA = true; break; case 'b': hitB = true; break; default: hitDefault = true; break; } } Expect.equals(true, hitA); Expect.equals(true, hitB); Expect.equals(true, hitDefault); } testExceptions() { // TODO(jgw): Better tests once all the exception semantics are worked out. bool hitCatch, hitFinally; try { throw "foo"; } catch (e) { Expect.equals(true, e == "foo"); hitCatch = true; } finally { hitFinally = true; } Expect.equals(true, hitCatch); Expect.equals(true, hitFinally); } testBreak() { var ints = [ [32, 87, 3, 589], [12, 1076, 2000, 8], [622, 127, 77, 955], ]; int i, j = 0; bool foundIt = false; search: for (i = 0; i < ints.length; i++) { for (j = 0; j < ints[i].length; j++) { if (ints[i][j] == 12) { foundIt = true; break search; } } } Expect.equals(true, foundIt); } testContinue() { String searchMe = "Look for a substring in me"; String substring = "sub"; bool foundIt = false; int max = searchMe.length - substring.length; test: for (int i = 0; i <= max; i++) { int n = substring.length; int j = i; int k = 0; while (n-- != 0) { if (searchMe[j++] != substring[k++]) { continue test; } } foundIt = true; break test; } } testFunction() { int foo() { return 42; } Expect.equals(42, foo()); } void testReturn() { if (true) { return; } Expect.equals(true, false); } } main() { StatementTest.testMain(); }