-
Notifications
You must be signed in to change notification settings - Fork 397
Expand file tree
/
Copy pathcoverage.sh
More file actions
executable file
·112 lines (93 loc) · 3.55 KB
/
coverage.sh
File metadata and controls
executable file
·112 lines (93 loc) · 3.55 KB
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#!/usr/bin/env bash
set -e
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd)"
cd $ROOT
# Minimum coverage threshold - can be overridden via first argument
# Default: 80% (as specified in AGENTS.md)
MIN_COVERAGE=${1:-80}
echo "Running tests with coverage collection..."
echo ""
# Clean previous results
rm -rf ./TestResults
# Run tests with coverage using coverlet.collector
# --collect:"XPlat Code Coverage" enables the collector
# --results-directory specifies output location
dotnet test \
--collect:"XPlat Code Coverage" \
--results-directory ./TestResults
echo ""
echo "Coverage collection complete!"
echo ""
# Find all coverage files
COVERAGE_FILES=$(find ./TestResults -name "coverage.cobertura.xml" | sort)
FILE_COUNT=$(echo "$COVERAGE_FILES" | wc -l | tr -d ' ')
echo "Found $FILE_COUNT coverage report(s)"
echo ""
# Parse and display coverage for each project
declare -a COVERAGE_RATES
declare -a COVERAGE_SOURCES
declare -a PROJECT_NAMES
while IFS= read -r COVERAGE_FILE; do
if [ -f "$COVERAGE_FILE" ]; then
# Extract source path and line rate
SOURCE=$(grep -o '<source>.*</source>' "$COVERAGE_FILE" | head -1 | sed 's/<source>//;s/<\/source>//')
LINE_RATE=$(grep -o 'line-rate="[0-9.]*"' "$COVERAGE_FILE" | head -1 | grep -o '[0-9.]*')
if [ -n "$LINE_RATE" ]; then
COVERAGE_PCT=$(awk "BEGIN {printf \"%.2f\", $LINE_RATE * 100}")
# Determine project name from source path
if [[ "$SOURCE" == *"/Core/"* ]] || [[ "$SOURCE" == *"/Core" ]]; then
PROJECT_NAME="Core"
# Only track Core and Main for threshold checking (exclude Combined)
COVERAGE_RATES+=("$COVERAGE_PCT")
COVERAGE_SOURCES+=("$SOURCE")
PROJECT_NAMES+=("$PROJECT_NAME")
elif [[ "$SOURCE" == *"/Main/"* ]] || [[ "$SOURCE" == *"/Main" ]]; then
PROJECT_NAME="Main"
# Only track Core and Main for threshold checking (exclude Combined)
COVERAGE_RATES+=("$COVERAGE_PCT")
COVERAGE_SOURCES+=("$SOURCE")
PROJECT_NAMES+=("$PROJECT_NAME")
else
PROJECT_NAME="Combined (includes untestable entry points)"
# Skip adding to COVERAGE_RATES - we don't check threshold for Combined
fi
echo " $PROJECT_NAME: ${COVERAGE_PCT}%"
fi
fi
done <<< "$COVERAGE_FILES"
echo ""
# Calculate minimum coverage across Core and Main assemblies only
# (Combined report is excluded as it includes untestable entry points like Program.Main)
MIN_PROJECT_COVERAGE=""
MIN_PROJECT_NAME=""
for i in "${!COVERAGE_RATES[@]}"; do
rate="${COVERAGE_RATES[$i]}"
if [ -z "$MIN_PROJECT_COVERAGE" ] || (( $(awk "BEGIN {print ($rate < $MIN_PROJECT_COVERAGE) ? 1 : 0}") )); then
MIN_PROJECT_COVERAGE="$rate"
MIN_PROJECT_NAME="${PROJECT_NAMES[$i]}"
fi
done
if [ -n "$MIN_PROJECT_COVERAGE" ]; then
echo "====================================="
echo " Minimum Coverage: ${MIN_PROJECT_COVERAGE}%"
echo " Threshold: ${MIN_COVERAGE}%"
echo "====================================="
echo ""
# Check if coverage meets threshold
MEETS_THRESHOLD=$(awk "BEGIN {print ($MIN_PROJECT_COVERAGE >= $MIN_COVERAGE) ? 1 : 0}")
if [ "$MEETS_THRESHOLD" -eq 0 ]; then
echo "❌ Coverage ${MIN_PROJECT_COVERAGE}% is below minimum threshold of ${MIN_COVERAGE}%"
echo ""
echo "Coverage by project:"
for i in "${!COVERAGE_RATES[@]}"; do
echo " - ${COVERAGE_SOURCES[$i]}: ${COVERAGE_RATES[$i]}%"
done
exit 1
else
echo "✅ All projects meet minimum threshold"
rm -rf TestResults
fi
else
echo "⚠️ Could not parse coverage from reports"
exit 1
fi