Index: lib/src/runner/browser/browser_manager.dart |
diff --git a/lib/src/runner/browser/browser_manager.dart b/lib/src/runner/browser/browser_manager.dart |
index 7498efad5b352f9564f2abeb180637fcce176820..15cd745737bace29c912210a48ffa64b54bebe58 100644 |
--- a/lib/src/runner/browser/browser_manager.dart |
+++ b/lib/src/runner/browser/browser_manager.dart |
@@ -11,7 +11,9 @@ import 'package:async/async.dart'; |
import 'package:http_parser/http_parser.dart'; |
import 'package:pool/pool.dart'; |
+import '../../backend/group.dart'; |
import '../../backend/metadata.dart'; |
+import '../../backend/suite_entry.dart'; |
import '../../backend/test_platform.dart'; |
import '../../util/cancelable_future.dart'; |
import '../../util/multi_channel.dart'; |
@@ -241,15 +243,33 @@ class BrowserManager { |
asyncError.stackTrace); |
} |
- return new RunnerSuite(await _environment, response["tests"].map((test) { |
- var testMetadata = new Metadata.deserialize(test['metadata']); |
- var testChannel = suiteChannel.virtualChannel(test['channel']); |
- return new IframeTest(test['name'], testMetadata, testChannel, |
- mapper: mapper); |
- }), platform: _platform, metadata: metadata, path: path, |
+ return new RunnerSuite( |
+ await _environment, |
+ _deserializeEntries(suiteChannel, mapper, response["entries"]), |
+ platform: _platform, |
+ metadata: metadata, |
+ path: path, |
onClose: () => closeIframe()); |
} |
+ /// Deserializes [entries] into concrete [SuiteEntry] subclasses. |
+ Iterable<SuiteEntry> _deserializeEntries(MultiChannel suiteChannel, |
+ Mapper mapper, List<Map> entries) { |
+ return entries.map((entry) { |
+ var metadata = new Metadata.deserialize(entry['metadata']); |
+ if (entry['type'] == 'group') { |
+ return new Group( |
+ entry['name'], |
+ metadata, |
+ _deserializeEntries(suiteChannel, mapper, entry['entries'])); |
+ } else { |
+ var testChannel = suiteChannel.virtualChannel(entry['channel']); |
+ return new IframeTest(entry['name'], metadata, testChannel, |
+ mapper: mapper); |
+ } |
+ }); |
+ } |
+ |
/// An implementation of [Environment.displayPause]. |
CancelableFuture _displayPause() { |
if (_pauseCompleter != null) return _pauseCompleter.future; |