Metadata constructor Null safety
Creates new Metadata.
testOn defaults to PlatformSelector.all.
If forTag contains metadata that applies to tags, that metadata is
included inline in the returned value. The values directly passed to the
constructor take precedence over tag-specific metadata.
Implementation
factory Metadata(
{PlatformSelector? testOn,
Timeout? timeout,
bool? skip,
bool? verboseTrace,
bool? chainStackTraces,
int? retry,
String? skipReason,
Iterable<String>? tags,
Map<PlatformSelector, Metadata>? onPlatform,
Map<BooleanSelector, Metadata>? forTag,
String? languageVersionComment}) {
// Returns metadata without forTag resolved at all.
Metadata unresolved() => Metadata._(
testOn: testOn,
timeout: timeout,
skip: skip,
verboseTrace: verboseTrace,
chainStackTraces: chainStackTraces,
retry: retry,
skipReason: skipReason,
tags: tags,
onPlatform: onPlatform,
forTag: forTag,
languageVersionComment: languageVersionComment);
// If there's no tag-specific metadata, or if none of it applies, just
// return the metadata as-is.
if (forTag == null || tags == null) return unresolved();
tags = Set.from(tags);
forTag = Map.from(forTag);
// Otherwise, resolve the tag-specific components. Doing this eagerly means
// we only have to resolve suite- or group-level tags once, rather than
// doing it for every test individually.
var empty = Metadata._();
var merged = forTag.keys.toList().fold(empty, (Metadata merged, selector) {
if (!selector.evaluate(tags!.contains)) return merged;
return merged.merge(forTag!.remove(selector)!);
});
if (merged == empty) return unresolved();
return merged.merge(unresolved());
}