17.17. Over-Constrained Code¶
17.17.1. Over-Constrained Code¶
17.17.1.1. Over-constrained Code (1)¶
Consider the situation where we have two points. We want to know which quadrant the second point (b) is in w.r.t. the first point (a):
if ((b.x < a.x) && (b.y < a.y)) doNW(); else if ((b.x < a.x) && (b.y >= a.y)) doSW(); else if ((b.x >= a.x) && (b.y < a.y)) doNE(); else if ((b.x >= a.x) && (b.y >= a.y)) doSE();This has the virtue of being quite logical and clear. However, it has some problems.
17.17.1.2. Over-constrained Code (2)¶
It is horribly inefficient, compared to alternatives.
But our real concern has to do with testing and code coverage.
Fact: No series of tests will cover all branches in this code.
Q: Why?
A: Consider every possible branch and see what can get triggered. Consider that there have to be at least 8+ branches, and only 4 possible inputs!!
Try to hit every branch by brute force, one at a time…
17.17.1.3. Over-constrained Code (3)¶
Q: If we want complete code coverage when there are only four logically distinct inputs, then we had better do what?
A: Come up with code that has only four branches!
17.17.1.4. Over-constrained Code (4)¶
Refactored code:
if (b.x < a.x) if (b.y < a.y) doNW(); else doSW(); else if (b.y < a.y) doNE(); else doSE();Not only can you test every branch, but this is a lot more efficient! Every branch requires 2 tests!