printAffected static method

void printAffected(
  1. ImpactResult result, {
  2. String? warningMessage,
  3. bool explain = false,
})

Implementation

static void printAffected(ImpactResult result, {String? warningMessage, bool explain = false}) {
  printHeader();

  if (warningMessage != null) {
    print(warningMessage);
    print('');
  }

  if (result.isFallback) {
    final exp = result.fallbackExplanation ?? "Dependency analysis is incomplete. Falling back to the full test suite to avoid false negatives.";
    print('\u26a0 ' + exp);
    print('Reason: ' + (result.fallbackReason ?? 'unknown'));
    print('');
  }

  if (result.changedFiles.isEmpty) {
    print('No changed files detected.');
    print('');
  } else {
    print('Changed:');
    for (final f in result.changedFiles) {
      print('  M ' + f);
    }
    print('');
  }

  if (result.analysisLevel == 'symbol' && result.changedSymbols.isNotEmpty) {
    print('Changed symbol(s):');
    for (final sym in result.changedSymbols) {
      print('  ? ' + sym);
    }
    print('');
  }

  if (result.isFallback) {
    print('Affected tests:');
    print('  ALL ' + result.totalTests.toString() + ' tests (Fallback active)');
    print('');
  } else if (result.affectedTests.isEmpty) {
    print('Affected tests:');
    print('  None');
    print('');
  } else {
    print('Affected tests:');
    print('');
    for (final affected in result.affectedTests) {
      print('  ? ' + affected.testPath);
      if (explain && result.impactPaths.isNotEmpty) {
        final matchingPaths = result.impactPaths.where((p) => p.testPath == affected.testPath);
        for (final path in matchingPaths) {
          print('    Impact path:');
          print('      ' + path.testPath);
          for (final s in path.symbolChain) {
            print('        ?');
            print('      ' + s);
          }
        }
      } else if (affected.dependencyChain.length > 1) {
        final chain = affected.dependencyChain.reversed.join(' -> ');
        print('    reason: ' + chain);
      }
    }
    print('');
  }

  if (result.unaffectedCount > 0) {
    print('Not affected:');
    for (final skipped in result.unaffectedTests) {
      print('  ? ' + skipped);
    }
    print('');
  }

  print('Impact:');
  print('  ' + result.affectedCount.toString() + ' / ' + result.totalTests.toString() + ' tests (Level: ' + result.analysisLevel + ')');
}