Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(439)

Side by Side Diff: tools/testing/dart/test_suite.dart

Issue 695893002: Working SimpleHTML test front end (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Clean up CL Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 /** 5 /**
6 * Classes and methods for enumerating and preparing tests. 6 * Classes and methods for enumerating and preparing tests.
7 * 7 *
8 * This library includes: 8 * This library includes:
9 * 9 *
10 * - Creating tests by listing all the Dart files in certain directories, 10 * - Creating tests by listing all the Dart files in certain directories,
11 * and creating [TestCase]s for those files that meet the relevant criteria. 11 * and creating [TestCase]s for those files that meet the relevant criteria.
12 * - Preparing tests, including copying files and frameworks to temporary 12 * - Preparing tests, including copying files and frameworks to temporary
13 * directories, and computing the command line and arguments to be run. 13 * directories, and computing the command line and arguments to be run.
14 */ 14 */
15 library test_suite; 15 library test_suite;
16 16
17 import "dart:async"; 17 import "dart:async";
18 import "dart:io"; 18 import "dart:io";
19 import "drt_updater.dart"; 19 import "drt_updater.dart";
20 import "html_test.dart" as htmlTest;
20 import "multitest.dart"; 21 import "multitest.dart";
21 import "status_file_parser.dart"; 22 import "status_file_parser.dart";
22 import "test_runner.dart"; 23 import "test_runner.dart";
23 import "utils.dart"; 24 import "utils.dart";
24 import "http_server.dart" show PREFIX_BUILDDIR, PREFIX_DARTDIR; 25 import "http_server.dart" show PREFIX_BUILDDIR, PREFIX_DARTDIR;
25 26
26 import "compiler_configuration.dart" show 27 import "compiler_configuration.dart" show
27 CommandArtifact, 28 CommandArtifact,
28 CompilerConfiguration; 29 CompilerConfiguration;
29 30
30 import "runtime_configuration.dart" show 31 import "runtime_configuration.dart" show
31 RuntimeConfiguration; 32 RuntimeConfiguration;
32 33
33 part "browser_test.dart"; 34 part "browser_test.dart";
34 35
35 36
36 RegExp multiHtmlTestGroupRegExp = new RegExp(r"\s*[^/]\s*group\('[^,']*"); 37 RegExp multiHtmlTestGroupRegExp = new RegExp(r"\s*[^/]\s*group\('[^,']*");
37 RegExp multiHtmlTestRegExp = new RegExp(r"useHtmlIndividualConfiguration()"); 38 RegExp multiHtmlTestRegExp = new RegExp(r"useHtmlIndividualConfiguration()");
38 // Require at least one non-space character before '///' 39 // Require at least one non-space character before '///'
39 RegExp multiTestRegExp = new RegExp(r"\S *" 40 RegExp multiTestRegExp = new RegExp(r"\S *"
40 r"/// \w+:(.*)"); 41 r"/// \w+:(.*)");
41 42
42 /** 43 /**
43 * A simple function that tests [arg] and returns `true` or `false`. 44 * A simple function that tests [arg] and returns `true` or `false`.
44 */ 45 */
45 typedef bool Predicate<T>(T arg); 46 typedef bool Predicate<T>(T arg);
46 47
47 typedef void CreateTest(Path filePath, 48 typedef void CreateTest(Path filePath,
49 Path originTestPath,
48 bool hasCompileError, 50 bool hasCompileError,
49 bool hasRuntimeError, 51 bool hasRuntimeError,
50 {bool isNegativeIfChecked, 52 {bool isNegativeIfChecked,
51 bool hasCompileErrorIfChecked, 53 bool hasCompileErrorIfChecked,
52 bool hasStaticWarning, 54 bool hasStaticWarning,
53 String multitestKey, 55 String multitestKey});
54 Path originTestPath});
55 56
56 typedef void VoidFunction(); 57 typedef void VoidFunction();
57 58
58 /** 59 /**
59 * Calls [function] asynchronously. Returns a future that completes with the 60 * Calls [function] asynchronously. Returns a future that completes with the
60 * result of the function. If the function is `null`, returns a future that 61 * result of the function. If the function is `null`, returns a future that
61 * completes immediately with `null`. 62 * completes immediately with `null`.
62 */ 63 */
63 Future asynchronously(function()) { 64 Future asynchronously(function()) {
64 if (function == null) return new Future.value(null); 65 if (function == null) return new Future.value(null);
(...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after
556 }).catchError((error) { 557 }).catchError((error) {
557 print("Fatal error occured: $error"); 558 print("Fatal error occured: $error");
558 exit(1); 559 exit(1);
559 }); 560 });
560 }); 561 });
561 } 562 }
562 } 563 }
563 564
564 565
565 class TestInformation { 566 class TestInformation {
567 Path filePath;
566 Path originTestPath; 568 Path originTestPath;
567 Path filePath;
568 Map optionsFromFile; 569 Map optionsFromFile;
569 bool hasCompileError; 570 bool hasCompileError;
570 bool hasRuntimeError; 571 bool hasRuntimeError;
571 bool isNegativeIfChecked; 572 bool isNegativeIfChecked;
572 bool hasCompileErrorIfChecked; 573 bool hasCompileErrorIfChecked;
573 bool hasStaticWarning; 574 bool hasStaticWarning;
574 String multitestKey; 575 String multitestKey;
575 576
576 TestInformation(this.filePath, this.optionsFromFile, 577 TestInformation(this.filePath, this.originTestPath, this.optionsFromFile,
577 this.hasCompileError, this.hasRuntimeError, 578 this.hasCompileError, this.hasRuntimeError,
578 this.isNegativeIfChecked, this.hasCompileErrorIfChecked, 579 this.isNegativeIfChecked, this.hasCompileErrorIfChecked,
579 this.hasStaticWarning, 580 this.hasStaticWarning,
580 {this.multitestKey, this.originTestPath}) { 581 {this.multitestKey: ''}) {
581 assert(filePath.isAbsolute); 582 assert(filePath.isAbsolute);
582 if (originTestPath == null) originTestPath = filePath;
583 } 583 }
584 } 584 }
585 585
586
587 class HtmlTestInformation extends TestInformation {
588 List<String> expectedMessages;
589 List<String> scripts;
590
591 HtmlTestInformation(Path filePath, this.expectedMessages, this.scripts)
592 : super(filePath, filePath,
593 {'isMultitest': false, 'isMultiHtmlTest': false},
594 false, false, false, false, false) {}
595 }
596
ricow1 2014/11/04 09:18:03 two newlines
Bill Hesse 2014/11/04 16:29:01 Put two newlines between all classes in the file.
586 /** 597 /**
587 * A standard [TestSuite] implementation that searches for tests in a 598 * A standard [TestSuite] implementation that searches for tests in a
588 * directory, and creates [TestCase]s that compile and/or run them. 599 * directory, and creates [TestCase]s that compile and/or run them.
589 */ 600 */
590 class StandardTestSuite extends TestSuite { 601 class StandardTestSuite extends TestSuite {
591 final Path suiteDir; 602 final Path suiteDir;
592 final List<String> statusFilePaths; 603 final List<String> statusFilePaths;
593 TestExpectations testExpectations; 604 TestExpectations testExpectations;
594 List<TestInformation> cachedTests; 605 List<TestInformation> cachedTests;
595 final Path dartDir; 606 final Path dartDir;
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
664 675
665 List<Uri> get dart2JsBootstrapDependencies => _dart2JsBootstrapDependencies; 676 List<Uri> get dart2JsBootstrapDependencies => _dart2JsBootstrapDependencies;
666 677
667 /** 678 /**
668 * The default implementation assumes a file is a test if 679 * The default implementation assumes a file is a test if
669 * it ends in "Test.dart". 680 * it ends in "Test.dart".
670 */ 681 */
671 bool isTestFile(String filename) { 682 bool isTestFile(String filename) {
672 // Use the specified predicate, if provided. 683 // Use the specified predicate, if provided.
673 if (isTestFilePredicate != null) return isTestFilePredicate(filename); 684 if (isTestFilePredicate != null) return isTestFilePredicate(filename);
685 // TODO(whesse): Remove check, and make the default "_test.dart", if
686 // this line is never hit.
687 throw new Exception('This suite uses obsolete "Test.dart" filenames');
ricow1 2014/11/04 09:18:03 do this in a separate cl please
Bill Hesse 2014/11/04 16:29:01 Done.
688 }
674 689
675 return filename.endsWith("Test.dart"); 690 bool isHtmlTestFile(String filename) => filename.endsWith('_htmltest.html');
676 }
677 691
678 List<String> additionalOptions(Path filePath) => []; 692 List<String> additionalOptions(Path filePath) => [];
679 693
680 Map<String, String> localPackageDirectories; 694 Map<String, String> localPackageDirectories;
681 695
682 void forEachTest(Function onTest, Map testCache, [VoidFunction onDone]) { 696 void forEachTest(Function onTest, Map testCache, [VoidFunction onDone]) {
683 discoverPackagesInRepository().then((Map packageDirectories) { 697 discoverPackagesInRepository().then((Map packageDirectories) {
684 localPackageDirectories = packageDirectories; 698 localPackageDirectories = packageDirectories;
685 return updateDartium(); 699 return updateDartium();
686 }).then((_) { 700 }).then((_) {
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
761 group.add(listCompleter.future); 775 group.add(listCompleter.future);
762 776
763 var lister = dir.list(recursive: listRecursively) 777 var lister = dir.list(recursive: listRecursively)
764 .listen((FileSystemEntity fse) { 778 .listen((FileSystemEntity fse) {
765 if (fse is File) enqueueFile(fse.path, group); 779 if (fse is File) enqueueFile(fse.path, group);
766 }, 780 },
767 onDone: listCompleter.complete); 781 onDone: listCompleter.complete);
768 } 782 }
769 783
770 void enqueueFile(String filename, FutureGroup group) { 784 void enqueueFile(String filename, FutureGroup group) {
785 if (isHtmlTestFile(filename)) {
786 var info = htmlTest.getInformation(filename);
787 if (info == null) {
788 print("Invalid HtmlTest $filename");
ricow1 2014/11/04 09:18:03 so I don't think this will catch peoples attention
Bill Hesse 2014/11/04 16:29:01 This is rather hard to do. At this point, we woul
789 return;
790 }
791 cachedTests.add(info);
792 enqueueTestCaseFromTestInformation(info);
793 return;
794 }
771 if (!isTestFile(filename)) return; 795 if (!isTestFile(filename)) return;
772 Path filePath = new Path(filename); 796 Path filePath = new Path(filename);
773 797
774 // Only run the tests that match the pattern. 798 // Only run the tests that match the pattern.
775 if (filePath.filename.endsWith('test_config.dart')) return; 799 if (filePath.filename.endsWith('test_config.dart')) return;
776 800
777 var optionsFromFile = readOptionsFromFile(filePath); 801 var optionsFromFile = readOptionsFromFile(filePath);
778 CreateTest createTestCase = makeTestCaseCreator(optionsFromFile); 802 CreateTest createTestCase = makeTestCaseCreator(optionsFromFile);
779 803
780 if (optionsFromFile['isMultitest']) { 804 if (optionsFromFile['isMultitest']) {
781 group.add(doMultitest(filePath, buildDir, suiteDir, createTestCase)); 805 group.add(doMultitest(filePath, buildDir, suiteDir, createTestCase));
782 } else { 806 } else {
783 createTestCase(filePath, 807 createTestCase(filePath,
808 filePath,
784 optionsFromFile['hasCompileError'], 809 optionsFromFile['hasCompileError'],
785 optionsFromFile['hasRuntimeError'], 810 optionsFromFile['hasRuntimeError'],
786 hasStaticWarning: optionsFromFile['hasStaticWarning']); 811 hasStaticWarning: optionsFromFile['hasStaticWarning']);
787 } 812 }
788 } 813 }
789 814
790 static Path _findPubspecYamlFile(Path filePath) { 815 static Path _findPubspecYamlFile(Path filePath) {
791 final existsCache = TestUtils.existsCache; 816 final existsCache = TestUtils.existsCache;
792 817
793 Path root = TestUtils.dartDir; 818 Path root = TestUtils.dartDir;
794 assert ("$filePath".startsWith("$root")); 819 assert ("$filePath".startsWith("$root"));
795 820
796 // We start with the parent directory of [filePath] and go up until 821 // We start with the parent directory of [filePath] and go up until
797 // the root directory (excluding the root). 822 // the root directory (excluding the root).
798 List<String> segments = 823 List<String> segments =
799 filePath.directoryPath.relativeTo(root).segments(); 824 filePath.directoryPath.relativeTo(root).segments();
800 while (segments.length > 0) { 825 while (segments.length > 0) {
801 var pubspecYamlPath = 826 var pubspecYamlPath =
802 new Path(segments.join('/')).append('pubspec.yaml'); 827 new Path(segments.join('/')).append('pubspec.yaml');
803 if (existsCache.doesFileExist(pubspecYamlPath.toNativePath())) { 828 if (existsCache.doesFileExist(pubspecYamlPath.toNativePath())) {
804 return root.join(pubspecYamlPath); 829 return root.join(pubspecYamlPath);
805 } 830 }
806 segments.removeLast(); 831 segments.removeLast();
807 } 832 }
808 return null; 833 return null;
809 } 834 }
810 835
811 void enqueueTestCaseFromTestInformation(TestInformation info) { 836 void enqueueTestCaseFromTestInformation(TestInformation info) {
837 String testName = buildTestCaseDisplayName(suiteDir, info.originTestPath,
838 multitestName: info.multitestKey);
839 Set<Expectation> expectations = testExpectations.expectations(testName);
840 if (info is HtmlTestInformation &&
841 TestUtils.isBrowserRuntime(configuration['runtime'])) {
842 enqueueBrowserTest([], null, info, testName, expectations);
843 return;
844 }
812 var filePath = info.filePath; 845 var filePath = info.filePath;
813 var optionsFromFile = info.optionsFromFile; 846 var optionsFromFile = info.optionsFromFile;
814 847
815 Map buildSpecialPackageRoot(Path pubspecYamlFile) { 848 Map buildSpecialPackageRoot(Path pubspecYamlFile) {
816 var commands = <Command>[]; 849 var commands = <Command>[];
817 var packageDir = pubspecYamlFile.directoryPath; 850 var packageDir = pubspecYamlFile.directoryPath;
818 var packageName = packageDir.filename; 851 var packageName = packageDir.filename;
819 852
820 var checkoutDirectory = 853 var checkoutDirectory =
821 createPubspecCheckoutDirectory(packageDir); 854 createPubspecCheckoutDirectory(packageDir);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
869 'package-root' : newPackageRoot, 902 'package-root' : newPackageRoot,
870 }; 903 };
871 } 904 }
872 905
873 // If this test is inside a package, we will check if there is a 906 // If this test is inside a package, we will check if there is a
874 // pubspec.yaml file and if so, create a custom package root for it. 907 // pubspec.yaml file and if so, create a custom package root for it.
875 List<Command> baseCommands = <Command>[]; 908 List<Command> baseCommands = <Command>[];
876 Path packageRoot; 909 Path packageRoot;
877 if (configuration['use_repository_packages'] || 910 if (configuration['use_repository_packages'] ||
878 configuration['use_public_packages']) { 911 configuration['use_public_packages']) {
879 Path pubspecYamlFile = _findPubspecYamlFile(filePath); 912 Path pubspecYamlFile = _findPubspecYamlFile(filePath);
880 if (pubspecYamlFile != null) { 913 if (pubspecYamlFile != null) {
881 var result = buildSpecialPackageRoot(pubspecYamlFile); 914 var result = buildSpecialPackageRoot(pubspecYamlFile);
882 baseCommands.addAll(result['commands']); 915 baseCommands.addAll(result['commands']);
883 packageRoot = result['package-root']; 916 packageRoot = result['package-root'];
884 if (optionsFromFile['packageRoot'] == null || 917 if (optionsFromFile['packageRoot'] == null ||
885 optionsFromFile['packageRoot'] == "") { 918 optionsFromFile['packageRoot'] == "") {
886 optionsFromFile['packageRoot'] = packageRoot.toNativePath(); 919 optionsFromFile['packageRoot'] = packageRoot.toNativePath();
887 } 920 }
888 } 921 }
889 } 922 }
890 if (configuration['package_root'] != null) { 923 if (configuration['package_root'] != null) {
891 packageRoot = new Path(configuration['package_root']); 924 packageRoot = new Path(configuration['package_root']);
892 optionsFromFile['packageRoot'] = packageRoot.toNativePath(); 925 optionsFromFile['packageRoot'] = packageRoot.toNativePath();
893 } 926 }
894 927
895 String testName = buildTestCaseDisplayName(suiteDir, info.originTestPath,
896 multitestName: optionsFromFile['isMultitest'] ? info.multitestKey : "");
897
898 Set<Expectation> expectations = testExpectations.expectations(testName);
899 if (new CompilerConfiguration(configuration).hasCompiler && 928 if (new CompilerConfiguration(configuration).hasCompiler &&
900 expectCompileError(info)) { 929 expectCompileError(info)) {
901 // If a compile-time error is expected, and we're testing a 930 // If a compile-time error is expected, and we're testing a
902 // compiler, we never need to attempt to run the program (in a 931 // compiler, we never need to attempt to run the program (in a
903 // browser or otherwise). 932 // browser or otherwise).
904 enqueueStandardTest(baseCommands, info, testName, expectations); 933 enqueueStandardTest(baseCommands, info, testName, expectations);
905 } else if (TestUtils.isBrowserRuntime(configuration['runtime'])) { 934 } else if (TestUtils.isBrowserRuntime(configuration['runtime'])) {
906 if (info.optionsFromFile['isMultiHtmlTest']) { 935 if (info.optionsFromFile['isMultiHtmlTest']) {
907 // A browser multi-test has multiple expectations for one test file. 936 // A browser multi-test has multiple expectations for one test file.
908 // Find all the different sub-test expecations for one entire test file. 937 // Find all the different sub-test expecations for one entire test file.
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
1013 runtimeConfiguration.computeRuntimeCommands( 1042 runtimeConfiguration.computeRuntimeCommands(
1014 this, 1043 this,
1015 CommandBuilder.instance, 1044 CommandBuilder.instance,
1016 compilationArtifact, 1045 compilationArtifact,
1017 runtimeArguments, 1046 runtimeArguments,
1018 environmentOverrides)); 1047 environmentOverrides));
1019 } 1048 }
1020 1049
1021 CreateTest makeTestCaseCreator(Map optionsFromFile) { 1050 CreateTest makeTestCaseCreator(Map optionsFromFile) {
1022 return (Path filePath, 1051 return (Path filePath,
1052 Path originTestPath,
1023 bool hasCompileError, 1053 bool hasCompileError,
1024 bool hasRuntimeError, 1054 bool hasRuntimeError,
1025 {bool isNegativeIfChecked: false, 1055 {bool isNegativeIfChecked: false,
1026 bool hasCompileErrorIfChecked: false, 1056 bool hasCompileErrorIfChecked: false,
1027 bool hasStaticWarning: false, 1057 bool hasStaticWarning: false,
1028 String multitestKey, 1058 String multitestKey}) {
1029 Path originTestPath}) {
1030 // Cache the test information for each test case. 1059 // Cache the test information for each test case.
1031 var info = new TestInformation(filePath, 1060 var info = new TestInformation(filePath,
1061 originTestPath,
1032 optionsFromFile, 1062 optionsFromFile,
1033 hasCompileError, 1063 hasCompileError,
1034 hasRuntimeError, 1064 hasRuntimeError,
1035 isNegativeIfChecked, 1065 isNegativeIfChecked,
1036 hasCompileErrorIfChecked, 1066 hasCompileErrorIfChecked,
1037 hasStaticWarning, 1067 hasStaticWarning,
1038 multitestKey: multitestKey, 1068 multitestKey: multitestKey);
1039 originTestPath: originTestPath);
1040 cachedTests.add(info); 1069 cachedTests.add(info);
1041 enqueueTestCaseFromTestInformation(info); 1070 enqueueTestCaseFromTestInformation(info);
1042 }; 1071 };
1043 } 1072 }
1044 1073
1045 /** 1074 /**
1046 * _createUrlPathFromFile takes a [file], which is either located in the dart 1075 * _createUrlPathFromFile takes a [file], which is either located in the dart
1047 * or in the build directory, and will return a String representing 1076 * or in the build directory, and will return a String representing
1048 * the relative path to either the dart or the build directory. 1077 * the relative path to either the dart or the build directory.
1049 * Thus, the returned [String] will be the path component of the URL 1078 * Thus, the returned [String] will be the path component of the URL
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1127 // on to the browser (it may be test specific). 1156 // on to the browser (it may be test specific).
1128 1157
1129 // TODO(kustermann/ricow): This method should be refactored. 1158 // TODO(kustermann/ricow): This method should be refactored.
1130 Map optionsFromFile = info.optionsFromFile; 1159 Map optionsFromFile = info.optionsFromFile;
1131 Path filePath = info.filePath; 1160 Path filePath = info.filePath;
1132 String filename = filePath.toString(); 1161 String filename = filePath.toString();
1133 1162
1134 final String compiler = configuration['compiler']; 1163 final String compiler = configuration['compiler'];
1135 final String runtime = configuration['runtime']; 1164 final String runtime = configuration['runtime'];
1136 1165
1166 if (info is HtmlTestInformation) {
1167 if (compiler != 'none' || runtime != 'dartium') {
1168 // TODO(whesse): Enable compilation of scripts to dart2js, and
1169 // rewriting of script links in html file. Currently unimplemented.
1170 return;
1171 }
1172 if (info.scripts.length > 0) {
1173 // TODO(whesse): Copy scripts into output directory.
1174 return;
1175 }
1176 final String tempDir = createOutputDirectory(info.filePath, '');
1177 final String htmlFile = '$tempDir/${filePath.filename}';
1178 new File(htmlFile).writeAsStringSync(htmlTest.getContents(info));
1179
1180 String testDisplayName = '$suiteName/$testName';
1181 var htmlPath = _createUrlPathFromFile(new Path(htmlFile));
1182 var fullHtmlPath = _getUriForBrowserTest(info, htmlPath,
1183 null, null);
1184 var commands = [CommandBuilder.instance.getBrowserHtmlTestCommand(
1185 runtime, fullHtmlPath, configuration, info.expectedMessages)];
1186 var testCase = new BrowserTestCase(testDisplayName,
1187 commands, configuration, expectations,
1188 info, isNegative(info), fullHtmlPath);
1189 enqueueNewTestCase(testCase);
1190 return;
1191 }
1192
1137 for (var vmOptions in getVmOptions(optionsFromFile)) { 1193 for (var vmOptions in getVmOptions(optionsFromFile)) {
1138 // Create a unique temporary directory for each set of vmOptions. 1194 // Create a unique temporary directory for each set of vmOptions.
1139 // TODO(dart:429): Replace separate replaceAlls with a RegExp when 1195 // TODO(dart:429): Replace separate replaceAlls with a RegExp when
1140 // replaceAll(RegExp, String) is implemented. 1196 // replaceAll(RegExp, String) is implemented.
1141 String optionsName = ''; 1197 String optionsName = '';
1142 if (getVmOptions(optionsFromFile).length > 1) { 1198 if (getVmOptions(optionsFromFile).length > 1) {
1143 optionsName = vmOptions.join('-').replaceAll('-','') 1199 optionsName = vmOptions.join('-').replaceAll('-','')
1144 .replaceAll('=','') 1200 .replaceAll('=','')
1145 .replaceAll('/',''); 1201 .replaceAll('/','');
1146 } 1202 }
(...skipping 1190 matching lines...) Expand 10 before | Expand all | Expand 10 after
2337 * $pass tests are expected to pass 2393 * $pass tests are expected to pass
2338 * $failOk tests are expected to fail that we won't fix 2394 * $failOk tests are expected to fail that we won't fix
2339 * $fail tests are expected to fail that we should fix 2395 * $fail tests are expected to fail that we should fix
2340 * $crash tests are expected to crash that we should fix 2396 * $crash tests are expected to crash that we should fix
2341 * $timeout tests are allowed to timeout 2397 * $timeout tests are allowed to timeout
2342 * $compileErrorSkip tests are skipped on browsers due to compile-time error 2398 * $compileErrorSkip tests are skipped on browsers due to compile-time error
2343 """; 2399 """;
2344 print(report); 2400 print(report);
2345 } 2401 }
2346 } 2402 }
OLDNEW
« tools/testing/dart/html_test.dart ('K') | « tools/testing/dart/test_runner.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698