emitPassing method

List<File> emitPassing({
  1. required String requirementId,
  2. required ScenarioId scenarioId,
  3. required Iterable<String> evidenceTypes,
  4. required String target,
  5. required String runnerCompatibilityId,
  6. required String digestInput,
  7. Iterable<String> controlIds = const [],
  8. String variant = 'default',
  9. String? outputDirectory,
  10. String? profile,
  11. String? runnerId,
  12. ExecutionSourceIdentity? sourceIdentity,
  13. String? caseId,
})

Implementation

List<File> emitPassing({
  required String requirementId,
  required ScenarioId scenarioId,
  required Iterable<String> evidenceTypes,
  required String target,
  required String runnerCompatibilityId,
  required String digestInput,
  Iterable<String> controlIds = const [],
  String variant = 'default',
  String? outputDirectory,
  String? profile,
  String? runnerId,
  ExecutionSourceIdentity? sourceIdentity,
  String? caseId,
}) {
  final managedContext = RunnerExecutionContext.fromEnvironment(
    Platform.environment,
  );
  if (managedContext == null) {
    final explicitManaged =
        sourceIdentity != null ||
        outputDirectory != null ||
        profile != null ||
        runnerId != null;
    if (!explicitManaged) {
      // Ordinary direct tests run normally and publish no evidence.
      return const [];
    }
    if (sourceIdentity == null ||
        outputDirectory == null ||
        profile == null ||
        runnerId == null) {
      throw const FormatException(
        'Managed evidence options require a complete RunnerExecutionContext',
      );
    }
  }
  final effectiveIdentity = managedContext?.sourceIdentity ?? sourceIdentity!;
  final effectiveOutputDirectory =
      managedContext?.resultDirectory ?? outputDirectory!;
  final effectiveProfile = managedContext?.profile ?? profile!;
  final effectiveRunnerId = managedContext?.runnerId ?? runnerId!;
  if (managedContext != null &&
      profile != null &&
      profile != managedContext.profile) {
    throw const FormatException(
      'Evidence profile disagrees with managed context',
    );
  }
  if (managedContext != null &&
      runnerId != null &&
      runnerId != managedContext.runnerId) {
    throw const FormatException(
      'Evidence runner disagrees with managed context',
    );
  }
  if (managedContext != null &&
      runnerCompatibilityId != managedContext.runnerCompatibilityId) {
    throw const FormatException(
      'Evidence runner compatibility disagrees with managed context',
    );
  }
  if (managedContext != null &&
      sourceIdentity != null &&
      canonicalJson(sourceIdentity.toJson()) !=
          canonicalJson(managedContext.sourceIdentity.toJson())) {
    throw const FormatException(
      'Evidence source identity disagrees with managed context',
    );
  }
  final digest = 'sha256:${sha256.convert(utf8.encode(digestInput))}';
  final sortedControlIds = [...controlIds.toSet()]..sort();
  final identity = effectiveIdentity;
  final writer = ExecutionResultWriter(identity: identity);
  final files = <File>[];
  for (final evidenceType in evidenceTypes.toSet()) {
    final executionId = _suiteExecutionId(
      profile: effectiveProfile,
      requirementId: requirementId,
      scenarioId: scenarioId,
      evidenceType: evidenceType,
      target: target,
      variant: variant,
      runnerCompatibilityId: runnerCompatibilityId,
      caseId: caseId,
    );
    final result = SuiteResult(
      executionId: executionId,
      status: SuiteStatus.passed,
      requirementId: requirementId,
      evidenceType: evidenceType,
      target: target,
      variant: variant,
      candidateId: scenarioId.value,
      profile: effectiveProfile,
      runnerId: effectiveRunnerId,
      runnerCompatibilityId: runnerCompatibilityId,
      sourcePackage: identity.sourcePackage,
      sourceAdapter: identity.sourceAdapter,
      sourceCompatibilityId: identity.sourceCompatibilityId,
      resultDigest: digest,
      scenarioIds: [scenarioId],
      controlIds: sortedControlIds,
    );
    files.add(writer.writeSuite(effectiveOutputDirectory, result));
  }
  return files;
}