159 lines · plain
1// Test visualization of general MC/DC constructs.2 3// RUN: llvm-profdata merge %S/Inputs/mcdc-general.proftext -o %t.profdata4// RUN: llvm-cov show --show-mcdc %S/Inputs/mcdc-general.o -instr-profile %t.profdata -path-equivalence=.,%S/Inputs | FileCheck %s5// 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=REPORT6 7// CHECK: test(bool8 9// CHECK: ------------------10// CHECK-NEXT: |---> MC/DC Decision Region (12:7) to (12:27)11// CHECK-NEXT: |12// CHECK-NEXT: | Number of Conditions: 413// 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 Result21// 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: 240// 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 Result46// 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: 257// 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 Result63// 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 covered68// 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: 476// 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 Result84// 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 covered92// 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=NOMCDC99// NOMCDC-NOT: MC/DC Decision Region100 101// REPORT: Name Regions Miss Cover Lines Miss Cover Branches Miss Cover MC/DC Conditions Miss Cover102// 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_NOMCDC110// 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=FILEREPORT115// FILEREPORT: TOTAL{{.*}}12 2 83.33%116 117 118// Test html output.119// RUN: rm -rf %t.html.dir120// 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.dir121// RUN: FileCheck -check-prefix=HTML -input-file=%t.html.dir/coverage/mcdc-general.cpp.html %s122// 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 %s125// 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: Totals140 141Instructions for regenerating the test:142 143cd %S/Inputs # Or copy mcdc-general.cpp into the working directory144 145clang++ -c -Os \146 -fcoverage-compilation-dir=. -mllvm -enable-name-compression=false \147 -fcoverage-mcdc -fprofile-instr-generate -fcoverage-mapping \148 mcdc-general.cpp149 150# Instructions for regenerating profdata151 152for x in mcdc-general; do153 clang++ -fprofile-instr-generate $x.o -o $x154 find -name '*.profraw' | xargs rm -f155 ./$x156 llvm-profdata merge --sparse -o $x.profdata $(find -name '*.profraw')157 llvm-profdata merge --text -o $x.proftext $x.profdata158done159