1// Test visualization of general MC/DC constructs. 2 3// RUN: llvm-profdata merge %S/Inputs/mcdc-general.proftext -o %t.profdata 4// RUN: llvm-cov show --show-mcdc %S/Inputs/mcdc-general.o -instr-profile %t.profdata -path-equivalence=.,%S/Inputs | FileCheck %s 5// RUN: llvm-cov report --show-mcdc-summary %S/Inputs/mcdc-general.o -instr-profile %t.profdata -show-functions -path-equivalence=.,%S/Inputs %S/Inputs/mcdc-general.cpp | FileCheck %s -check-prefix=REPORT 6 7// CHECK: test(bool 8 9// CHECK: ------------------ 10// CHECK-NEXT: |---> MC/DC Decision Region (12:7) to (12:27) 11// CHECK-NEXT: | 12// CHECK-NEXT: | Number of Conditions: 4 13// CHECK-NEXT: | Condition C1 --> (12:8) 14// CHECK-NEXT: | Condition C2 --> (12:13) 15// CHECK-NEXT: | Condition C3 --> (12:20) 16// CHECK-NEXT: | Condition C4 --> (12:25) 17// CHECK-NEXT: | 18// CHECK-NEXT: | Executed MC/DC Test Vectors: 19// CHECK-NEXT: | 20// CHECK-NEXT: | C1, C2, C3, C4 Result 21// CHECK-NEXT: | 1 { F, -, F, - = F } 22// CHECK-NEXT: | 2 { F, -, T, F = F } 23// CHECK-NEXT: | 3 { T, F, F, - = F } 24// CHECK-NEXT: | 4 { T, F, T, F = F } 25// CHECK-NEXT: | 5 { T, F, T, T = T } 26// CHECK-NEXT: | 6 { T, T, -, - = T } 27// CHECK-NEXT: | 28// CHECK-NEXT: | C1-Pair: covered: (1,6) 29// CHECK-NEXT: | C2-Pair: covered: (3,6) 30// CHECK-NEXT: | C3-Pair: covered: (3,5) 31// CHECK-NEXT: | C4-Pair: covered: (4,5) 32// CHECK-NEXT: | MC/DC Coverage for Decision: 100.00% 33// CHECK-NEXT: | 34// CHECK-NEXT: ------------------ 35 36// CHECK: ------------------ 37// CHECK-NEXT: |---> MC/DC Decision Region (15:7) to (15:13) 38// CHECK-NEXT: | 39// CHECK-NEXT: | Number of Conditions: 2 40// CHECK-NEXT: | Condition C1 --> (15:7) 41// CHECK-NEXT: | Condition C2 --> (15:12) 42// CHECK-NEXT: | 43// CHECK-NEXT: | Executed MC/DC Test Vectors: 44// CHECK-NEXT: | 45// CHECK-NEXT: | C1, C2 Result 46// CHECK-NEXT: | 1 { F, - = F } 47// CHECK-NEXT: | 2 { T, F = F } 48// CHECK-NEXT: | 3 { T, T = T } 49// CHECK-NEXT: | 50// CHECK-NEXT: | C1-Pair: covered: (1,3) 51// CHECK-NEXT: | C2-Pair: covered: (2,3) 52// CHECK-NEXT: | MC/DC Coverage for Decision: 100.00% 53// CHECK-NEXT: | 54// CHECK-NEXT: |---> MC/DC Decision Region (15:19) to (15:25) 55// CHECK-NEXT: | 56// CHECK-NEXT: | Number of Conditions: 2 57// CHECK-NEXT: | Condition C1 --> (15:19) 58// CHECK-NEXT: | Condition C2 --> (15:24) 59// CHECK-NEXT: | 60// CHECK-NEXT: | Executed MC/DC Test Vectors: 61// CHECK-NEXT: | 62// CHECK-NEXT: | C1, C2 Result 63// CHECK-NEXT: | 1 { F, - = F } 64// CHECK-NEXT: | 2 { T, T = T } 65// CHECK-NEXT: | 66// CHECK-NEXT: | C1-Pair: covered: (1,2) 67// CHECK-NEXT: | C2-Pair: not covered 68// CHECK-NEXT: | MC/DC Coverage for Decision: 50.00% 69// CHECK-NEXT: | 70// CHECK-NEXT: ------------------ 71 72// CHECK: ------------------ 73// CHECK-NEXT: |---> MC/DC Decision Region (18:7) to (19:15) 74// CHECK-NEXT: | 75// CHECK-NEXT: | Number of Conditions: 4 76// CHECK-NEXT: | Condition C1 --> (18:8) 77// CHECK-NEXT: | Condition C2 --> (18:13) 78// CHECK-NEXT: | Condition C3 --> (19:8) 79// CHECK-NEXT: | Condition C4 --> (19:13) 80// CHECK-NEXT: | 81// CHECK-NEXT: | Executed MC/DC Test Vectors: 82// CHECK-NEXT: | 83// CHECK-NEXT: | C1, C2, C3, C4 Result 84// CHECK-NEXT: | 1 { F, -, -, - = F } 85// CHECK-NEXT: | 2 { T, F, -, - = F } 86// CHECK-NEXT: | 3 { T, T, T, F = F } 87// CHECK-NEXT: | 4 { T, T, T, T = T } 88// CHECK-NEXT: | 89// CHECK-NEXT: | C1-Pair: covered: (1,4) 90// CHECK-NEXT: | C2-Pair: covered: (2,4) 91// CHECK-NEXT: | C3-Pair: not covered 92// CHECK-NEXT: | C4-Pair: covered: (3,4) 93// CHECK-NEXT: | MC/DC Coverage for Decision: 75.00% 94// CHECK-NEXT: | 95// CHECK-NEXT: ------------------ 96 97// Turn off MC/DC visualization. 98// RUN: llvm-cov show %S/Inputs/mcdc-general.o -instr-profile %t.profdata -path-equivalence=.,%S/Inputs | FileCheck %s -check-prefix=NOMCDC 99// NOMCDC-NOT: MC/DC Decision Region 100 101// REPORT: Name Regions Miss Cover Lines Miss Cover Branches Miss Cover MC/DC Conditions Miss Cover 102// REPORT-NEXT: ------------------------------------------------------------------------------------------------------------------------------------------- 103// REPORT-NEXT: _Z4testbbbb 25 0 100.00% 9 0 100.00% 24 2 91.67% 12 2 83.33% 104// REPORT-NEXT: main 1 0 100.00% 11 0 100.00% 0 0 0.00% 0 0 0.00% 105// REPORT-NEXT: --- 106// REPORT-NEXT: TOTAL 26 0 100.00% 20 0 100.00% 24 2 91.67% 12 2 83.33% 107 108// Turn off MC/DC summary. 109// RUN: llvm-cov report %S/Inputs/mcdc-general.o -instr-profile %t.profdata -show-functions -path-equivalence=.,%S/Inputs %S/Inputs/mcdc-general.cpp | FileCheck %s -check-prefix=REPORT_NOMCDC 110// REPORT_NOMCDC-NOT: TOTAL{{.*}}12 2 83.33% 111 112 113// Test file-level report. 114// RUN: llvm-cov report --show-mcdc-summary %S/Inputs/mcdc-general.o -instr-profile %t.profdata -path-equivalence=.,%S/Inputs %S/Inputs/mcdc-general.cpp | FileCheck %s -check-prefix=FILEREPORT 115// FILEREPORT: TOTAL{{.*}}12 2 83.33% 116 117 118// Test html output. 119// RUN: rm -rf %t.html.dir 120// RUN: llvm-cov show --show-mcdc-summary --show-mcdc %S/Inputs/mcdc-general.o -instr-profile %t.profdata -path-equivalence=.,%S/Inputs -format html -o %t.html.dir 121// RUN: FileCheck -check-prefix=HTML -input-file=%t.html.dir/coverage/mcdc-general.cpp.html %s 122// HTML-COUNT-4: MC/DC Decision Region (<span class='line-number'><a href='#L{{[0-9]+}}'><span> 123 124// RUN: FileCheck -check-prefix HTML-INDEX -input-file %t.html.dir/index.html %s 125// HTML-INDEX-LABEL: <table> 126// HTML-INDEX: <td class='column-entry-bold'>Filename</td> 127// HTML-INDEX: <td class='column-entry-bold'>Function Coverage</td> 128// HTML-INDEX: <td class='column-entry-bold'>Line Coverage</td> 129// HTML-INDEX: <td class='column-entry-bold'>Region Coverage</td> 130// HTML-INDEX: <td class='column-entry-bold'>Branch Coverage</td> 131// HTML-INDEX: <td class='column-entry-bold'>MC/DC</td> 132// HTML-INDEX: <a href='coverage{{.*}}mcdc-general.cpp.html'{{.*}}mcdc-general.cpp</a> 133// HTML-INDEX: <td class='column-entry-green'> 134// HTML-INDEX: 100.00% (2/2) 135// HTML-INDEX: 100.00% (20/20) 136// HTML-INDEX: 100.00% (26/26) 137// HTML-INDEX: 91.67% (22/24) 138// HTML-INDEX: 83.33% (10/12) 139// HTML-INDEX: Totals 140 141Instructions for regenerating the test: 142 143cd %S/Inputs # Or copy mcdc-general.cpp into the working directory 144 145clang++ -c -Os \ 146 -fcoverage-compilation-dir=. -mllvm -enable-name-compression=false \ 147 -fcoverage-mcdc -fprofile-instr-generate -fcoverage-mapping \ 148 mcdc-general.cpp 149 150# Instructions for regenerating profdata 151 152for x in mcdc-general; do 153 clang++ -fprofile-instr-generate $x.o -o $x 154 find -name '*.profraw' | xargs rm -f 155 ./$x 156 llvm-profdata merge --sparse -o $x.profdata $(find -name '*.profraw') 157 llvm-profdata merge --text -o $x.proftext $x.profdata 158done 159