MC/DC independence pairs, worked example with the engine’s coverage report
An independence pair for a condition is two scenarios that differ in that condition only and give different outcomes. This page shows the engine's coverage report for the entry rule: one pair per input, the scenarios they share, and how the four rows become a test suite.
For (member OR invited) AND NOT banned the report finds a pair for each of the three inputs. Member: the all-FALSE scenario gives no entry, and setting member to TRUE alone gives entry. Invited: the same all-FALSE base, with invited set to TRUE alone, gives entry. Banned: invited = TRUE with banned = FALSE gives entry, and banned = TRUE alone takes it away. The report states each pair in words and in values, and the values are complete assignments, so each one can be replayed.
Read as a suite, the pairs overlap: the all-FALSE scenario serves both member and invited, and the invited-not-banned scenario serves both invited and banned. Four distinct rows out of eight are enough, and each row has an expected result that comes from the rule as stated. Those four are a test design, not just a coverage figure, because every row carries the reason it is there.
When a pair cannot be found the report says so for that input, with the status and a message. That happens when assumptions fix a condition or when the rule is written so that a condition never changes the outcome, both of which are findings worth having before any test is written. The CLI's coverage command produces the same report for continuous integration.
Example
allow := (member OR invited) AND NOT banned · output
Exact checks
Truth table (8 rows)
| # | member | invited | banned | allow |
|---|---|---|---|---|
| 0 | FALSE | FALSE | FALSE | FALSE |
| 1 | FALSE | FALSE | TRUE | FALSE |
| 2 | FALSE | TRUE | FALSE | TRUE |
| 3 | FALSE | TRUE | TRUE | FALSE |
| 4 | TRUE | FALSE | FALSE | TRUE |
| 5 | TRUE | FALSE | TRUE | FALSE |
| 6 | TRUE | TRUE | FALSE | TRUE |
| 7 | TRUE | TRUE | TRUE | FALSE |
Plain-language reading
Beginnerallow is true exactly when both of the following hold:
1. at least one of member or invited is true (both may be true)
2. banned is false
In every other case, allow is false.
About the operators:
- AND is true only when all of its parts are true.
- OR is inclusive: it is true when at least one part is true, including when several are.
- NOT reverses a value: true becomes false and false becomes true.
Intermediateallow is true exactly when both of the following hold:
1. at least one of member or invited is true (both may be true)
2. banned is false
In every other case, allow is false.
Advancedallow is true exactly when both of the following hold [conjunction ∧]:
1. at least one of member or invited is true (both may be true) [inclusive disjunction ∨]
2. banned is false [negation ¬]
In every other case, allow is false.
Formal notation: (member ∨ invited) ∧ ¬banned
Logic diagram
MC/DC
| Input | Status | Independence pair (only that input changes) |
|---|---|---|
| member | found | member=F, invited=F, banned=F → F | member=T, invited=F, banned=F → T |
| invited | found | member=F, invited=F, banned=F → F | member=F, invited=T, banned=F → T |
| banned | found | member=F, invited=T, banned=F → T | member=F, invited=T, banned=T → F |
The common slip
Choosing the two rows of a pair from different base scenarios. “Member, invited, not banned: entry” and “not member, not invited, not banned: no entry” differ in two conditions and show nothing about either; the pair must hold everything else fixed.
Questions
Does the report pick a unique pair?
No; several pairs may exist for a condition and the report shows one. Any valid pair serves the criterion, and overlapping scenarios across pairs keep the suite small.
What does the status mean when it is not “found”?
That no admissible pair exists within the stated assumptions, with a message saying why. The condition then has no independent effect on the outcome as the rule stands.
Related
See also
- MC/DC explained: modified condition/decision coverage for Boolean rules
- MC/DC vs condition coverage vs multiple condition coverage
- Deriving test cases from a truth table without testing every row
- Independence pair in MC/DC: meaning and examples
- MC/DC (modified condition/decision coverage): meaning and examples
- Lesson 12: Designing tests that find bugs (advanced, 15 min)
- MC/DC exercises with answers
Testing and rules
Generated from the Tangibool engine, semantics tangibool-semantics/1, engine 1.0.0, build . Every table, map, simplification and verdict on these pages was computed by the Tangibool engine when the site was built, and every claim was re-checked by the same exact checker the app uses. Limits are stated where they apply. © 2026 Foreranger LTD.