| <?xml version="1.0" encoding="UTF-8"?> |
| <org.eclipse.epf.uma:ContentDescription xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:org.eclipse.epf.uma="http://www.eclipse.org/epf/uma/1.0.3/uma.ecore" epf:version="1.0.0" xmi:id="-FX8hDYUKOXsrQulFe9lwtw" name="test_ideas_for_booleans_and_boundaries,1.7150344523489172E-305" guid="-FX8hDYUKOXsrQulFe9lwtw" changeDate="2006-11-21T15:55:18.633-0800" version="1.0.0"> |
| <mainDescription><a id="XE_test__developer_testing__test_ideas__for_booleans_and_boundaries" |
| name="XE_test__developer_testing__test_ideas__for_booleans_and_boundaries"></a><a |
| id="XE_test-ideas__for_booleans_and_boundaries" name="XE_test-ideas__for_booleans_and_boundaries"></a><a |
| id="XE_design__developer_testing__test_ideas__for_booleans_and_boundaries" |
| name="XE_design__developer_testing__test_ideas__for_booleans_and_boundaries"></a> |
| <h3> |
| <a id="Introduction" name="Introduction"></a>Introduction |
| </h3> |
| <p> |
| Test ideas are based on <a href="./../../../glossary/glossary.htm#fault_model" target="_blank">fault models</a>, |
| notions of which faults are plausible in software and how those faults can best be uncovered. This guideline shows how |
| to create test ideas from boolean and relational expressions. It first motivates the techniques by looking at code, |
| then describes how to apply them if the code hasn't been written yet or is otherwise unavailable. |
| </p> |
| <h3> |
| <a id="BooleanExpressions" name="BooleanExpressions"></a><b>Boolean Expressions</b> |
| </h3> |
| <p> |
| Consider the following code snippet, taken from an (imaginary) system for managing bomb detonation. It's part of the |
| safety system and controls whether the "detonate bomb" button push is obeyed. |
| </p> |
| <blockquote> |
| <pre> |
| if (publicIsClear || technicianClear) { |
| bomb.detonate(); |
| } |
| </pre> |
| </blockquote> |
| <p> |
| The code is wrong. The <font size="+0">||</font> should be an <font size="+0">&amp;&amp;</font>. That mistake will have |
| bad effects. Instead of detonating the bomb when both the bomb technician and public are clear, the system will |
| detonate when <i>either</i> is clear. |
| </p> |
| <p> |
| What test would find this bug? |
| </p> |
| <p> |
| Consider a test in which the button is pushed when both the technician and public are clear. The code will allow the |
| bomb to be detonated. But-and this is important-the <i>correct</i> code (the one that uses an <font |
| size="+0">&amp;&amp;</font>) would do the same. So the test is useless at finding this fault. |
| </p> |
| <p> |
| Similarly, this incorrect code behaves correctly when both the technician and public are next to the bomb: the bomb is |
| not detonated. |
| </p> |
| <p> |
| To find the bug, you have to have a case in which the code as written evaluates differently than the code that should |
| have been written. For example, the public must be clear, but the bomb technician is still next to the bomb. Here are |
| all the tests in table form: |
| </p> |
| <div align="center"> |
| <table |
| style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid" |
| cellspacing="0" bordercolordark="#808080" cellpadding="4" width="100%" bordercolorlight="#808080" border="1"> |
| <tbody> |
| <tr> |
| <th scope="col" width="20%"> |
| <p align="center"> |
| publicIsClear |
| </p> |
| </th> |
| <th scope="col" width="20%"> |
| <p align="center"> |
| technicianClear |
| </p> |
| </th> |
| <th scope="col" width="20%"> |
| <p align="center"> |
| Code as written... |
| </p> |
| </th> |
| <th scope="col" width="20%"> |
| <p align="center"> |
| Correct code would have... |
| </p> |
| </th> |
| <th width="20%"> |
| &nbsp; |
| </th> |
| </tr> |
| <tr> |
| <td width="20%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="20%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="20%"> |
| <p align="center"> |
| <font color="#008000">detonates</font> |
| </p> |
| </td> |
| <td width="20%"> |
| <p align="center"> |
| <font color="#008000">detonated</font> |
| </p> |
| </td> |
| <td width="20%"> |
| <p align="center"> |
| test is useless (for this fault) |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="20%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="20%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="20%"> |
| <p align="center"> |
| <font color="#ff0000">detonates</font> |
| </p> |
| </td> |
| <td width="20%"> |
| <p align="center"> |
| <font color="#ff0000">not detonated</font> |
| </p> |
| </td> |
| <td width="20%"> |
| <p align="center"> |
| useful test |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="20%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="20%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="20%"> |
| <p align="center"> |
| <font color="#ff0000">detonates</font> |
| </p> |
| </td> |
| <td width="20%"> |
| <p align="center"> |
| <font color="#ff0000">not detonated</font> |
| </p> |
| </td> |
| <td width="20%"> |
| <p align="center"> |
| useful test |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="20%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="20%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="20%"> |
| <p align="center"> |
| <font color="#008000">does not detonate</font> |
| </p> |
| </td> |
| <td width="20%"> |
| <p align="center"> |
| <font color="#008000">not detonated</font> |
| </p> |
| </td> |
| <td width="20%"> |
| <p align="center"> |
| test is useless (for this fault) |
| </p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| <br /> |
| </div> |
| <p> |
| The two middle tests are both useful for finding this particular fault. Note, however, that they're redundant: since |
| either will find the fault, you needn't run both. |
| </p> |
| <p> |
| There are other ways in which the expression might be wrong. Here are two lists of common mistakes in boolean |
| expressions. The faults on the left are all caught by the technique discussed here. The faults on the right might not |
| be. So this technique doesn't catch all the faults we might like, but it's still useful. |
| </p> |
| <div align="right"> |
| <table |
| style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid" |
| cellspacing="0" bordercolordark="#808080" cellpadding="4" width="100%" bordercolorlight="#808080" border="1"> |
| <tbody> |
| <tr> |
| <th scope="col" width="50%"> |
| <p align="center"> |
| <b>Faults detected</b> |
| </p> |
| </th> |
| <th scope="col" width="50%"> |
| <p align="center"> |
| <b>Faults possibly not detected</b> |
| </p> |
| </th> |
| </tr> |
| <tr> |
| <td width="50%"> |
| Using wrong operator: a <font color="#ff0000"><b>||</b></font> b should be a<font |
| color="#ff0000"><b>&amp;&amp;</b></font>b |
| </td> |
| <td width="50%"> |
| Wrong variable used: a&amp;&amp;<font color="#ff0000"><b>b</b></font>&amp;&amp;c should be a&amp;&amp; |
| <font color="#ff0000"><b>x</b></font>&amp;&amp;d |
| </td> |
| </tr> |
| <tr> |
| <td width="50%"> |
| Negation is omitted or incorrect: a||b should be <font color="#ff0000"><b>!</b></font>a||b, or <font |
| color="#ff0000"><b>!</b></font> a||b should be a||b |
| </td> |
| <td width="50%"> |
| Expression is too simple: a&amp;&amp;b should be a&amp;&amp;b<font |
| color="#ff0000"><b>&amp;&amp;c</b></font> |
| </td> |
| </tr> |
| <tr> |
| <td width="50%"> |
| The expression is misparenthesized: a&amp;&amp;b||c should be a&amp;&amp;<font |
| color="#ff0000"><b>(</b></font>b||c<font color="#ff0000"><b>)</b></font> |
| </td> |
| <td width="50%"> |
| Expressions with more than one of the faults in the left column |
| </td> |
| </tr> |
| <tr> |
| <td width="50%"> |
| The expression is overly complex: a&amp;&amp;b<b>&amp;&amp;c</b> should be <font |
| size="+0">a&amp;&amp;b<br /> |
| </font> (This fault is not so likely, but is easy to find with tests useful for other reasons.) |
| </td> |
| <td width="50%"> |
| &nbsp; |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| <br /> |
| </div> |
| <p> |
| How are these ideas used? Suppose you're given a boolean expression like <font size="+0">a&amp;&amp;!b</font>. You |
| could construct a truth table like this one: |
| </p> |
| <div align="right"> |
| <table |
| style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid" |
| cellspacing="0" bordercolordark="#808080" cellpadding="4" width="100%" bordercolorlight="#808080" border="1"> |
| <tbody> |
| <tr> |
| <th scope="col" width="14%"> |
| <p align="center"> |
| a |
| </p> |
| </th> |
| <th scope="col" width="14%"> |
| <p align="center"> |
| b |
| </p> |
| </th> |
| <th scope="col" width="14%"> |
| <p align="center"> |
| a&amp;&amp;!b<br /> |
| (code as written) |
| </p> |
| </th> |
| <th scope="col" width="14%"> |
| <p align="center"> |
| maybe it should be<br /> |
| a<font color="#ff0000"><b>||</b></font>!b |
| </p> |
| </th> |
| <th scope="col" width="14%"> |
| <p align="center"> |
| maybe it should be<br /> |
| <font color="#ff0000"><b>!</b></font>a&amp;&amp;!b |
| </p> |
| </th> |
| <th scope="col" width="15%"> |
| <p align="center"> |
| maybe it should be<br /> |
| a&amp;&amp;b |
| </p> |
| </th> |
| <th scope="col" width="15%"> |
| <p align="center"> |
| ... |
| </p> |
| </th> |
| </tr> |
| <tr> |
| <td width="14%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="14%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="14%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="14%"> |
| <p align="center"> |
| <font color="#ff0000">true</font> |
| </p> |
| </td> |
| <td width="14%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="15%"> |
| <p align="center"> |
| <font color="#ff0000">true</font> |
| </p> |
| </td> |
| <td width="15%"> |
| <p align="center"> |
| ... |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="14%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="14%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="14%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="14%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="14%"> |
| <p align="center"> |
| <font color="#ff0000">false</font> |
| </p> |
| </td> |
| <td width="15%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="15%"> |
| <p align="center"> |
| ... |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="14%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="14%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="14%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="14%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="14%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="15%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="15%"> |
| <p align="center"> |
| ... |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="14%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="14%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="14%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="14%"> |
| <p align="center"> |
| <font color="#ff0000">true</font> |
| </p> |
| </td> |
| <td width="14%"> |
| <p align="center"> |
| <font color="#ff0000">true</font> |
| </p> |
| </td> |
| <td width="15%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="15%"> |
| <p align="center"> |
| ... |
| </p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| <br /> |
| </div> |
| <p> |
| If you crunched through all the possibilities, you'd find that the first, second, and fourth possibilities are all |
| that's needed. The third expression will find no faults that won't be found by one of the others, so you needn't try |
| it. (As the expressions grow more complicated, the savings due to unneeded cases grow quickly.) |
| </p> |
| <p> |
| Of course, no one sane would build such a table. Fortunately, you don't have to. It's easy to memorize the required |
| cases for simple expressions. (See the next section.) For more complex expressions, such as <font |
| size="+0">A&amp;&amp;B||C</font>, see <a href="../../examples/extrnlcntrbtns/test/tstatmtch.htm" target="_blank">Test |
| Ideas for Mixtures of ANDs and ORs</a>, which lists test ideas for expressions with two or three operators. For even |
| more complex expressions, a <a href="http://www.testing.com/tools/multi/README.html" target="_blank">program</a> can be |
| used to generate test ideas. |
| </p> |
| <h3> |
| <a id="SimpleExpressionTables" name="SimpleExpressionTables"></a><b>Tables for Simple Boolean Expressions</b> |
| </h3> |
| <p> |
| If the expression is <font size="+0">A&amp;&amp;B</font>, test with: |
| </p> |
| <div align="center"> |
| <table |
| style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid" |
| cellspacing="0" bordercolordark="#808080" cellpadding="4" width="85%" bordercolorlight="#808080" border="1"> |
| <tbody> |
| <tr> |
| <th scope="col" width="50%"> |
| <p align="center"> |
| A |
| </p> |
| </th> |
| <th scope="col" width="50%"> |
| <p align="center"> |
| B |
| </p> |
| </th> |
| </tr> |
| <tr> |
| <td width="50%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="50%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="50%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="50%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| <br /> |
| </div> |
| <p> |
| If the expression is <font size="+0">A||B</font>, test with: |
| </p> |
| <div align="center"> |
| <table |
| style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid" |
| cellspacing="0" bordercolordark="#808080" cellpadding="4" width="85%" bordercolorlight="#808080" border="1"> |
| <tbody> |
| <tr> |
| <th scope="col" width="50%"> |
| <p align="center"> |
| A |
| </p> |
| </th> |
| <th scope="col" width="50%"> |
| <p align="center"> |
| B |
| </p> |
| </th> |
| </tr> |
| <tr> |
| <td width="50%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="50%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="50%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="50%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| <br /> |
| </div> |
| <p> |
| If the expression is <font size="+0">A<sub>1</sub> &amp;&amp; A<sub>2</sub> &amp;&amp; ... &amp;&amp; |
| A<sub>n</sub></font>, test with: |
| </p> |
| <div align="center"> |
| <table |
| style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid" |
| cellspacing="0" bordercolordark="#808080" cellpadding="4" width="85%" bordercolorlight="#808080" border="1"> |
| <tbody> |
| <tr> |
| <td width="100%"> |
| <p align="center"> |
| A<sub>1,</sub> A<sub>2</sub>, ..., and A<sub>n</sub> are all true |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="100%"> |
| <p align="center"> |
| A<sub>1</sub> is false, all the rest are true |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="100%"> |
| <p align="center"> |
| A<sub>2</sub> is false, all the rest are true |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="100%"> |
| <p align="center"> |
| ... |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="100%"> |
| <p align="center"> |
| A<sub>n</sub> is false, all the rest are true |
| </p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| <br /> |
| </div> |
| <p align="left"> |
| If the expression is <font size="+0">A<sub>1</sub> || A<sub>2</sub> || ... || A<sub>n</sub></font>, test with: |
| </p> |
| <div align="center"> |
| <table |
| style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid" |
| cellspacing="0" bordercolordark="#808080" cellpadding="4" width="85%" bordercolorlight="#808080" border="1"> |
| <tbody> |
| <tr> |
| <td width="100%"> |
| <p align="center"> |
| A<sub>1,</sub> A<sub>2</sub>, ..., and A<sub>n</sub> are all false |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="100%"> |
| <p align="center"> |
| A<sub>1</sub> is true, all the rest are false |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="100%"> |
| <p align="center"> |
| A<sub>2</sub> is true, all the rest are false |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="100%"> |
| <p align="center"> |
| ... |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="100%"> |
| <p align="center"> |
| A<sub>n</sub> is true, all the rest are false |
| </p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| <br /> |
| </div> |
| <p> |
| If the expression is <font size="+0">A</font>, test with: |
| </p> |
| <div align="center"> |
| <table |
| style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid" |
| cellspacing="0" bordercolordark="#808080" cellpadding="4" width="85%" bordercolorlight="#808080" border="1"> |
| <tbody> |
| <tr> |
| <td width="100%"> |
| <p align="center"> |
| A |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="100%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="100%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| <br /> |
| </div> |
| <p> |
| So, when you need to test <font size="+0">a&amp;&amp;!b</font>, you can apply the first table above, invert the sense |
| of b (because it's negated), and get this list of <a class="elementLinkWithUserText" |
| href="./../../../xp/guidances/concepts/test-ideas_list,8.834380241450745E-306.html" guid="8.834380241450745E-306">Test |
| Ideas</a>: |
| </p> |
| <ul> |
| <li> |
| A true, B false |
| </li> |
| <li> |
| A true, B true |
| </li> |
| <li> |
| A false, B false |
| </li> |
| </ul> |
| <h3> |
| <a id="RelationalExpressions" name="RelationalExpressions"></a><b>Relational Expressions</b> |
| </h3> |
| <p align="left"> |
| Here's another example of code with a fault: |
| </p> |
| <blockquote> |
| <pre> |
| if (finished &lt; required) { |
| siren.sound(); |
| } |
| </pre> |
| </blockquote> |
| <p align="left"> |
| The <font size="+0">&lt;</font> should be a <font size="+0">&lt;=</font>. Such mistakes are fairly common. As with |
| boolean expressions, you can construct a table of test values and see which ones detect the fault: |
| </p> |
| <div align="center"> |
| <table |
| style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid" |
| cellspacing="0" bordercolordark="#808080" cellpadding="4" width="85%" bordercolorlight="#808080" border="1"> |
| <tbody> |
| <tr> |
| <th scope="col" width="25%"> |
| <p align="center"> |
| finished |
| </p> |
| </th> |
| <th scope="col" width="25%"> |
| <p align="center"> |
| required |
| </p> |
| </th> |
| <th scope="col" width="25%"> |
| <p align="center"> |
| code as written... |
| </p> |
| </th> |
| <th scope="col" width="25%"> |
| <p align="center"> |
| the correct code would have... |
| </p> |
| </th> |
| </tr> |
| <tr> |
| <td width="25%"> |
| <p align="center"> |
| 1 |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| 5 |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| sounds the siren |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| sounded the siren |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="25%"> |
| <p align="center"> |
| 5 |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| 5 |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| <font color="#ff0000">does not sound the siren</font> |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| <font color="#ff0000">sounded the siren</font> |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="25%"> |
| <p align="center"> |
| 5 |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| 1 |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| does not sound the siren |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| not sounded the siren |
| </p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| <br /> |
| </div> |
| <p> |
| More generally, the fault can be detected whenever <font size="+0">finished=required</font>. From analyses of plausible |
| faults, we can get these rules for test ideas: |
| </p> |
| <p> |
| If the expression is A&lt;B or A&gt;=B, test with |
| </p> |
| <div align="center"> |
| <table |
| style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid" |
| cellspacing="0" bordercolordark="#808080" cellpadding="4" width="85%" bordercolorlight="#808080" border="1"> |
| <tbody> |
| <tr> |
| <td width="100%"> |
| <p align="center"> |
| A=B |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="100%"> |
| <p align="center"> |
| A slightly less than B |
| </p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| <br /> |
| </div> |
| <p> |
| If the expression is A&gt;B or A&lt;=B, test with |
| </p> |
| <div align="center"> |
| <table |
| style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid" |
| cellspacing="0" bordercolordark="#808080" cellpadding="4" width="85%" bordercolorlight="#808080" border="1"> |
| <tbody> |
| <tr> |
| <td width="100%"> |
| <p align="center"> |
| A=B |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="100%"> |
| <p align="center"> |
| A slightly larger than B |
| </p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| <br /> |
| </div> |
| <p> |
| What does "slightly" mean? If A and B are integers, A should be one less than or larger than B. If they are floating |
| point numbers, A should be a number quite close to B. (It's probably not necessary that it be the the closest floating |
| point number to B.) |
| </p> |
| <h3> |
| <a id="CombinedExpressions" name="CombinedExpressions"></a><b>Rules for Combined Boolean and Relational Expressions</b> |
| </h3> |
| <p> |
| Most relational operators occur within boolean expressions, as in this example: |
| </p> |
| <blockquote> |
| <pre> |
| if (finished &lt; required) { |
| siren.sound(); |
| } |
| </pre> |
| </blockquote> |
| <p> |
| The rules for relational expressions would lead to these test ideas: |
| </p> |
| <ol> |
| <li> |
| <font size="+0">finished</font> is equal to required |
| </li> |
| <li> |
| <font size="+0">finished</font> is slightly less than <font size="+0">required</font> |
| </li> |
| </ol> |
| <p> |
| The rules for boolean expressions would lead to these: |
| </p> |
| <ol> |
| <li> |
| <font size="+0">finished &lt; required</font> should be true |
| </li> |
| <li> |
| <font size="+0">finished &lt; required</font> should be false |
| </li> |
| </ol> |
| <p> |
| But if <font size="+0">finished</font> is slightly less than <font size="+0">required</font>, <font size="+0">finished |
| &lt; required</font> is true, so there's no point in writing down the latter. |
| </p> |
| <p> |
| And if <font size="+0">finished</font> equals <font size="+0">required</font>, <font size="+0">finished &lt; |
| required</font> is false, so there's no point in writing down that latter one either. |
| </p> |
| <p> |
| So, <b>if a relational expression contains no boolean operators (<font size="+0">&amp;&amp;</font> and <font |
| size="+0">||</font>), ignore the fact that it's also a boolean expression.</b> |
| </p> |
| <p> |
| Things are a bit more complicated with combinations of boolean and relational operators, like this one: |
| </p> |
| <blockquote> |
| <pre> |
| if (count&lt;5 || always) { |
| siren.sound(); |
| } |
| </pre> |
| </blockquote> |
| <p> |
| From the relational expression, you get: |
| </p> |
| <ul> |
| <li> |
| <font size="+0">count</font> slightly less than 5 |
| </li> |
| <li> |
| <font size="+0">count</font> equal to 5 |
| </li> |
| </ul> |
| <p> |
| From the boolean expression, you get: |
| </p> |
| <ul> |
| <li> |
| <font size="+0">count&lt;5</font> true, always false |
| </li> |
| <li> |
| <font size="+0">count&lt;5</font> false, always true |
| </li> |
| <li> |
| <font size="+0">count&lt;5</font> false, always false |
| </li> |
| </ul> |
| <p> |
| These can be combined into three more specific test ideas. (Here, note that <font size="+0">count</font> is an |
| integer.) |
| </p> |
| <ol> |
| <li> |
| <font size="+0">count=4</font>, always false |
| </li> |
| <li> |
| <font size="+0">count=5</font>, always true |
| </li> |
| <li> |
| <font size="+0">count=5</font>, always false |
| </li> |
| </ol> |
| <p> |
| Notice that <font size="+0">count=5</font> is used twice. It might seem better to use it only once, to allow the use of |
| some other value-after all, why test <font size="+0">count</font> with 5 twice? Wouldn't it be better to try it once |
| with 5 and another time with some other value such that <font size="+0">count&lt;5</font> is false? It would be, but |
| it's dangerous to try. That's because it's easy to make a mistake. Suppose you tried the following: |
| </p> |
| <ol> |
| <li> |
| <font size="+0">count=4</font>, always false |
| </li> |
| <li> |
| <font size="+0">count=5</font>, always true |
| </li> |
| <li> |
| <font size="+0"><b>count&lt;5</b></font> <b>false</b>, <font size="+0">always</font> false |
| </li> |
| </ol> |
| <p> |
| Suppose that there's a fault that can <i>only</i> be caught with <font size="+0">count=5</font>. What that means is |
| that the value 5 will cause <font size="+0">count&lt;5</font> to produce false in the second test, when the correct |
| code would have produced true. However, that false value is immediately or'd with the value of always, which is true. |
| That means the value of the whole expression is correct, even though the value of the relational subexpression was |
| wrong. The fault will go undiscovered. |
| </p> |
| <p> |
| The fault doesn't go undiscovered if it's the <i>other</i> count=5 that is left less specific. |
| </p> |
| <p> |
| Similar problems happen when the relational expression is on the right-hand side of the boolean operator. |
| </p> |
| <p> |
| Because it's hard to know which subexpressions have to be exact and which can be general, it's best to make them all |
| exact. The alternative is to use the <a href="http://www.testing.com/tools/multi/README.html" target="_blank">boolean |
| expression program</a> mentioned above. It produces correct test ideas for arbitrary mixed boolean-and-relational |
| expressions. |
| </p> |
| <h3> |
| <a id="TestIdeasWithoutCode" name="TestIdeasWithoutCode"></a><b>Test ideas without Code</b> |
| </h3> |
| <p> |
| As explained in <a class="elementLinkWithType" |
| href="./../../../xp/guidances/concepts/test-first_design,6.556259235358794E-306.html" |
| guid="6.556259235358794E-306">Concept: Test-first Design</a>, it's usually preferable to design tests before |
| implementing code. So, although the techniques are motivated by code examples, they'll usually be applied without code. |
| How? |
| </p> |
| <p> |
| Certain design artifacts, such as statecharts and sequence diagrams, use boolean expressions as guards. Those cases are |
| straightforward-simply add the test ideas from the boolean expressions to the artifact's test idea checklist. See <a |
| class="elementLinkWithUserText" |
| href="./../../../xp/guidances/guidelines/test_ideas_for_statechart_and_flow_diagrams,1.0347051690476123E-305.html" |
| guid="1.0347051690476123E-305">Guideline: Test Ideas for Statechart and Activity Diagrams</a>. |
| </p> |
| <p> |
| The trickier case is when boolean expressions are implicit rather than explicit. That's often the case in descriptions |
| of APIs. Here's an example. Consider this method: |
| </p> |
| <blockquote> |
| <pre> |
| List matchList(Directory d1, Directory d1, |
| FilenameFilter excluder); |
| </pre> |
| </blockquote> |
| <p> |
| The description of this method's behavior might read like this: |
| </p> |
| <blockquote> |
| <p> |
| Returns a List of the absolute pathnames of all files that appear in both Directories. Subdirectories are |
| descended. [...] Filenames that match the <font size="+0">excluder</font> are excluded from the returned list. The |
| excluder only applies to the top-level directories, not to filenames in subdirectories. |
| </p> |
| </blockquote> |
| <p> |
| The words "and" and "or" do not appear. But when is a filename included in the return list? When it appears in the |
| first directory <b>and</b> it appears in the second directory <b>and</b> it's either in a lower level directory |
| <b>or</b> it's not specifically excluded. In code: |
| </p> |
| <blockquote> |
| <pre> |
| if (appearsInFirst &amp;&amp; appearsInSecond &amp;&amp; |
| (inLowerLevel || !excluded)) { |
| add to list |
| } |
| </pre> |
| </blockquote> |
| <p> |
| Here are the test ideas for that expression, given in tabular form: |
| </p> |
| <div align="center"> |
| <table |
| style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid" |
| cellspacing="0" bordercolordark="#808080" cellpadding="4" width="85%" bordercolorlight="#808080" border="1"> |
| <tbody> |
| <tr> |
| <th scope="col" width="25%"> |
| <p align="center"> |
| appearsInFirst |
| </p> |
| </th> |
| <th scope="col" width="25%"> |
| <p align="center"> |
| appearsInSecond |
| </p> |
| </th> |
| <th scope="col" width="25%"> |
| <p align="center"> |
| inLower |
| </p> |
| </th> |
| <th scope="col" width="25%"> |
| <p align="center"> |
| excluded |
| </p> |
| </th> |
| </tr> |
| <tr> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="25%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| <p> |
| <br /> |
| The general approach for discovering implicit boolean expressions from text is to first list the actions described |
| (such as "returns a matching name"). Then write a boolean expression that describes the cases in which an action is |
| taken. Derive test ideas from all the expressions. |
| </p> |
| <p> |
| There's room for disagreement in that process. For example, one person might write down the boolean expression used |
| above. Another might say that there are really two distinct actions: first, the program discovers matching names, then |
| it filters them out. So, instead of one expression, there are two: |
| </p> |
| <dl> |
| <dt> |
| discover a match: |
| </dt> |
| <dd> |
| happens when a file is in the first directory <b>and</b> a file with the same name is in the second directory |
| </dd> |
| <dt> |
| filter a match: |
| </dt> |
| <dd> |
| happens when the matching files are in the top level <b>and</b> the name matches the <font |
| size="+0">excluder</font> |
| </dd> |
| </dl> |
| <p> |
| These different approaches can lead to different test ideas and thus different tests. But the differences are most |
| likely not particularly important. That is, the time spent worrying about which expression is right, and trying |
| alternatives, would be better spent on other techniques and producing more tests. If you're curious about what the |
| sorts of differences might be, read on. |
| </p> |
| <p> |
| The second person would get two sets of test ideas. |
| </p> |
| <blockquote> |
| <p> |
| test ideas about discovering a match: |
| </p> |
| <ul> |
| <li> |
| file in first directory, file in second directory (true, true) |
| </li> |
| <li> |
| file in first directory, file not in second directory (true, false) |
| </li> |
| <li> |
| file not in first directory, file in second directory (false, true) |
| </li> |
| </ul> |
| <p> |
| test ideas about filtering a match (once one has been discovered): |
| </p> |
| <ul> |
| <li> |
| matching files are in the top level, the name matches the <font size="+0">excluder</font> (true, true) |
| </li> |
| <li> |
| matching files are in the top level, the name doesn't match the <font size="+0">excluder</font> (true, false) |
| </li> |
| <li> |
| matching files are in some lower level, the name matches the <font size="+0">excluder</font> (false, true) |
| </li> |
| </ul> |
| </blockquote> |
| <p> |
| Suppose those two sets of test ideas are combined. The ones in the second set only matter when the file is in both |
| directories, so they can only be combined with the first idea in the first set. That gives us the following: |
| </p> |
| <div align="center"> |
| <table |
| style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid" |
| cellspacing="0" bordercolordark="#808080" cellpadding="4" width="85%" bordercolorlight="#808080" border="1"> |
| <tbody> |
| <tr> |
| <th scope="col" width="25%"> |
| <p align="center"> |
| file in first directory |
| </p> |
| </th> |
| <th scope="col" width="25%"> |
| <p align="center"> |
| file in second directory |
| </p> |
| </th> |
| <th scope="col" width="25%"> |
| <p align="center"> |
| in top level |
| </p> |
| </th> |
| <th scope="col" width="25%"> |
| <p align="center"> |
| matches excluder |
| </p> |
| </th> |
| </tr> |
| <tr> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| <br /> |
| </div> |
| <p> |
| Two of the test ideas about discovering a match do not appear in that table. We can add them like this: |
| </p> |
| <div align="center"> |
| <table |
| style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid" |
| cellspacing="0" bordercolordark="#808080" cellpadding="4" width="85%" bordercolorlight="#808080" border="1"> |
| <tbody> |
| <tr> |
| <th scope="col" width="25%"> |
| <p align="center"> |
| file in first directory |
| </p> |
| </th> |
| <th scope="col" width="25%"> |
| <p align="center"> |
| file in second directory |
| </p> |
| </th> |
| <th scope="col" width="25%"> |
| <p align="center"> |
| in top level |
| </p> |
| </th> |
| <th scope="col" width="25%"> |
| <p align="center"> |
| matches excluder |
| </p> |
| </th> |
| </tr> |
| <tr> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| - |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| - |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="25%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| - |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| - |
| </p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| <br /> |
| </div> |
| <p> |
| The blank cells indicate that the columns are irrelevant. |
| </p> |
| <p> |
| This table now looks rather similar to the first person's table. The similarity can be emphasized by using the same |
| terminology. The first person's table has a column called "inLower", and the second person's has one called "in top |
| level". They can be converted by flipping the sense of the values. Doing that, we get this version of the second table: |
| </p> |
| <div align="center"> |
| <table |
| style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid" |
| cellspacing="0" bordercolordark="#808080" cellpadding="4" width="85%" bordercolorlight="#808080" border="1"> |
| <tbody> |
| <tr> |
| <th width="25%"> |
| <p align="center"> |
| appearsInFirst |
| </p> |
| </th> |
| <th width="25%"> |
| <p align="center"> |
| appearsInSecond |
| </p> |
| </th> |
| <th width="25%"> |
| <p align="center"> |
| inLower |
| </p> |
| </th> |
| <th width="25%"> |
| <p align="center"> |
| excluded |
| </p> |
| </th> |
| </tr> |
| <tr> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td width="25%"> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td> |
| <p align="center"> |
| - |
| </p> |
| </td> |
| <td> |
| <p align="center"> |
| - |
| </p> |
| </td> |
| </tr> |
| <tr> |
| <td> |
| <p align="center"> |
| false |
| </p> |
| </td> |
| <td> |
| <p align="center"> |
| true |
| </p> |
| </td> |
| <td> |
| <p align="center"> |
| - |
| </p> |
| </td> |
| <td> |
| <p align="center"> |
| - |
| </p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| <br /> |
| </div> |
| <p> |
| The first three rows are identical to the first person's table. The last two differ only in that this version doesn't |
| specify values that the first does. This amounts to an assumption about the way the code was written. The first assumed |
| a complicated boolean expression: |
| </p> |
| <blockquote> |
| <pre> |
| if (appearsInFirst &amp;&amp; appearsInSecond &amp;&amp; |
| (inLowerLevel || !excluded)) { |
| add to list |
| } |
| </pre> |
| </blockquote> |
| <p> |
| The second assumes nested boolean expressions: |
| </p> |
| <blockquote> |
| <pre> |
| if (appearsInFirst &amp;&amp; appearsInSecond) { |
| // found match. |
| if (inTopLevel &amp;&amp; excluded) { |
| // filter it |
| } |
| } |
| </pre> |
| </blockquote> |
| <p> |
| The difference between the two is that the test ideas for the first detect two faults that the ideas for the second do |
| not, because those faults don't apply. |
| </p> |
| <ol> |
| <li> |
| In the first implementation, there can be a misparenthesization fault. Are the parentheses around the <font |
| size="+0">||</font> correct or incorrect? Since the second implementation has no <font size="+0">||</font> and no |
| parentheses, the fault cannot exist. |
| </li> |
| <li> |
| The test requirements for the first implementation check whether the second <font size="+0">&amp;&amp;</font> |
| should be an <font size="+0">||</font>. In the second implementation, that explicit <font |
| size="+0">&amp;&amp;</font> is replaced by the implicit <font size="+0">&amp;&amp;</font> of the nested <font |
| size="+0">if</font> statements. There's no <font size="+0">||</font>-for-<font size="+0">&amp;&amp;</font> fault, |
| per se. (It might be the case that the nesting is incorrect, but this technique does not address that.)<br /> |
| </li> |
| </ol></mainDescription> |
| </org.eclipse.epf.uma:ContentDescription> |