Skip to content

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

Always true (tautology)? No Counterexample: member = F, invited = F, banned = F · Exhaustively checked and solver cross-checked · 1 rows
Always false (contradiction)? No Counterexample: member = F, invited = T, banned = F · Exhaustively checked and solver cross-checked · 3 rows
Can be true? Yes Example assignment: member = F, invited = T, banned = F · Exhaustively checked and solver cross-checked · 3 rows

Truth table (8 rows)

MC/DC explained: modified condition/decision coverage for Boolean rules
#memberinvitedbannedallow
0FALSEFALSEFALSEFALSE
1FALSEFALSETRUEFALSE
2FALSETRUEFALSETRUE
3FALSETRUETRUEFALSE
4TRUEFALSEFALSETRUE
5TRUEFALSETRUEFALSE
6TRUETRUEFALSETRUE
7TRUETRUETRUEFALSE

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 explained: modified condition/decision coverage for Boolean rules MC/DC explained: modified condition/decision coverage for Boolean rules member invited banned allow AND OR NOT
MC/DC explained: modified condition/decision coverage for Boolean rules MC/DC explained: modified condition/decision coverage for Boolean rules member invited banned allow AND OR NOT

MC/DC

InputStatusIndependence pair (only that input changes)
memberfoundmember=F, invited=F, banned=F → F  |  member=T, invited=F, banned=F → T
invitedfoundmember=F, invited=F, banned=F → F  |  member=F, invited=T, banned=F → T
bannedfoundmember=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

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.