MC/DC explained: modified condition/decision coverage for Boolean rules
Modified condition/decision coverage asks, for every condition in a Boolean rule, for a pair of test cases that differ only in that condition and produce different outcomes. The engine finds such a pair for each input of the entry rule, and the four scenarios they need are listed below.
The rule is (member OR invited) AND NOT banned, three conditions, eight rows. MC/DC is satisfied when each condition has an independence pair: two admissible scenarios that differ in that condition alone and give different results, which shows that the condition can affect the outcome on its own. The engine's pairs are: for member, member = FALSE, invited = FALSE, banned = FALSE (no entry) against member = TRUE with the rest unchanged (entry); for invited, the same base row against invited = TRUE; for banned, invited = TRUE, banned = FALSE (entry) against banned = TRUE (no entry).
Those three pairs use four distinct scenarios, which is the usual minimum of n + 1 for n conditions. A suite built from them exercises every condition's influence with four tests where the full table has eight, and it catches the classic grouping slip, because the banned pair is exactly the row that member OR (invited AND NOT banned) gets wrong when the person is a member.
MC/DC comes from avionics certification, where it is required for the most critical software, but the idea is general: a test suite should show that every input matters. The engine's coverage report computes independence pairs for any rule within its limits, and the lesson on test design puts the method in context with mutation testing.
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
Testing each condition in both values without holding the others fixed. Four tests that vary everything at once can cover every condition and every outcome and still fail to show that any single condition made the difference; the pair must differ in one condition only.
Questions
What if no pair exists for a condition?
Then the condition cannot affect the outcome within the stated assumptions, which usually means a redundant condition or an assumption that fixes it. The engine reports the status for each input rather than inventing a pair.
Is MC/DC the same as multiple condition coverage?
No. Multiple condition coverage tests every combination, 2 to the power n cases; MC/DC needs about n + 1 and still shows each condition's independent effect. The comparison page sets the coverage criteria side by side.
Related
See also
- MC/DC independence pairs, worked example with the engine’s coverage report
- MC/DC vs condition coverage vs multiple condition coverage
- MC/DC (modified condition/decision coverage): meaning and examples
- Independence pair in MC/DC: meaning and examples
- Lesson 12: Designing tests that find bugs (advanced, 15 min)
- Entry rule: (member OR invited) AND NOT banned, checked every way
- 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.