-
Notifications
You must be signed in to change notification settings - Fork 217
/
Copy pathgroup.dart
90 lines (75 loc) · 2.7 KB
/
group.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// Copyright (c) 2015, 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:stack_trace/stack_trace.dart';
import 'group_entry.dart';
import 'metadata.dart';
import 'suite_platform.dart';
import 'test.dart';
/// A group contains one or more tests and subgroups.
///
/// It includes metadata that applies to all contained tests.
class Group implements GroupEntry {
@override
final String name;
@override
final Metadata metadata;
@override
final Trace? trace;
/// The children of this group.
final List<GroupEntry> entries;
/// Returns a new root-level group.
Group.root(Iterable<GroupEntry> entries, {Metadata? metadata})
: this('', entries, metadata: metadata);
/// A test to run before all tests in the group.
///
/// This is `null` if no `setUpAll` callbacks were declared.
final Test? setUpAll;
/// A test to run after all tests in the group.
///
/// This is `null` if no `tearDown` callbacks were declared.
final Test? tearDownAll;
/// The number of tests (recursively) in this group.
int get testCount {
if (_testCount != null) return _testCount!;
_testCount = entries.fold<int>(
0, (count, entry) => count + (entry is Group ? entry.testCount : 1));
return _testCount!;
}
int? _testCount;
Group(this.name, Iterable<GroupEntry> entries,
{Metadata? metadata, this.trace, this.setUpAll, this.tearDownAll})
: entries = List<GroupEntry>.unmodifiable(entries),
metadata = metadata ?? Metadata();
@override
Group? forPlatform(SuitePlatform platform) {
if (!metadata.testOn.evaluate(platform)) return null;
var newMetadata = metadata.forPlatform(platform);
var filtered = _map((entry) => entry.forPlatform(platform));
if (filtered.isEmpty && entries.isNotEmpty) return null;
return Group(name, filtered,
metadata: newMetadata,
trace: trace,
setUpAll: setUpAll,
tearDownAll: tearDownAll);
}
@override
Group? filter(bool Function(Test) callback) {
var filtered = _map((entry) => entry.filter(callback));
if (filtered.isEmpty && entries.isNotEmpty) return null;
return Group(name, filtered,
metadata: metadata,
trace: trace,
setUpAll: setUpAll,
tearDownAll: tearDownAll);
}
/// Returns the entries of this group mapped using [callback].
///
/// Any `null` values returned by [callback] will be removed.
List<GroupEntry> _map(GroupEntry? Function(GroupEntry) callback) {
return entries
.map((entry) => callback(entry))
.whereType<GroupEntry>()
.toList();
}
}