    1   package test.net.sourceforge.pmd.rules.design;
    2
    3   import net.sourceforge.pmd.PMD;
    4   import net.sourceforge.pmd.Rule;
    5   import net.sourceforge.pmd.RuleSetNotFoundException;
    6   import test.net.sourceforge.pmd.testframework.SimpleAggregatorTst;
    7   import test.net.sourceforge.pmd.testframework.TestDescriptor;
    8
    9   public class ConfusingTernaryRuleTest extends SimpleAggregatorTst {
    10
    11      private Rule rule;
    12
    13      public void setUp() throws RuleSetNotFoundException {
    14          rule = findRule("design", "ConfusingTernary");
    15      }
    16
    17      public void testAll() {
    18          runTests(new TestDescriptor[]{
    19              new TestDescriptor(TEST1, "!=, bad", 1, rule),
    20              new TestDescriptor(TEST2, "==, good", 0, rule),
    21          });
    22      }
    23
    24      private static final String TEST1 =
    25              "public class Foo {" + PMD.EOL +
    26              " void bar() {" + PMD.EOL +
    27              "  x = a != b ? c : d;" + PMD.EOL +
    28              " }" + PMD.EOL +
    29              "}";
    30
    31      private static final String TEST2 =
    32              "public class Foo {" + PMD.EOL +
    33              " void bar() {" + PMD.EOL +
    34              "  x = a == b ? c : d;" + PMD.EOL +
    35              " }" + PMD.EOL +
    36              "}";
    37
    38      /*
    39  public class BadTernaries {
    40    public static void main(String[] args) {
    41      int i = 0;
    42      int j = 1;
    43      int k = 2;
    44      boolean x = true;
    45      boolean y = false;
    46      boolean z = true;
    47
    48      // flag all of these, lines 11 - 42:
    49      if (i != 11) {a();} else {b();}
    50      if (i != 12 && j != 0) {a();} else {b();}
    51      if (i != 13 || j != 0) {a();} else {b();}
    52      if (i != 14 && j != 0 && k != 0) {a();} else {b();}
    53      if (i != 15 || j != 0 || k != 0) {a();} else {b();}
    54      if (i != 16) {a();} else if (i != j) {b();} else{c();}
    55      if (i != 17) {a();} else if (i == j) {b();} else{c();}
    56      if (i == 18) {a();} else if (i != j) {b();} else{c();}
    57      x = (!y ? x : y);
    58      x = (!(x && y) ? y : z);
    59      x = (!(x || y) ? y : z);
    60      x = ((!x && !y) ? y : z);
    61      x = ((!x || !y) ? y : z);
    62      if (i != 24 && !x) {a();} else {b();}
    63      if (i != 25 || !x) {a();} else {b();}
    64      if (i != 26 && j != 0 && !y) {a();} else {b();}
    65      if (i != 27 || j != 0 || !y) {a();} else {b();}
    66      if (i != 28) {a();} else if (!x) {b();} else{c();}
    67      if (i != 29) {a();} else if (x) {b();} else{c();}
    68      if (i == 30) {a();} else if (!x) {b();} else{c();}
    69      x = !(c() == y) ? y : !z;
    70      if (!c()) {a();} else {b();}
    71      if (c() != x) {a();} else {b();}
    72      if (!c() != x) {a();} else {b();}
    73      if (!c() != !x) {a();} else {b();}
    74      if ((i != 36) || !(j == 0)) {a();} else {b();}
    75      if ((i != 37) || !(x ? y : z)) {a();} else {b();}
    76      if ((i != 38)) {a();} else {b();}
    77      if (i != 39 || (j != 0 || k != 0)) {a();} else {b();}
    78      if (i != 40 && (j != 0 && k != 0)) {a();} else {b();}
    79      if (!x && (j != 41 && k != 0)) {a();} else {b();}
    80      if (((x != y)) || !(x)) { a(); } else { b(); }
    81
    82      // don't flag these:
    83      if (i != 0) {a();}
    84      if (!x) {a();}
    85      if (i == 0) {a();} else {b();}
    86      if (i == 0 && j != 0) {a();} else {b();}
    87      if (i == 0 || j != 0) {a();} else {b();}
    88      if (i == 0 && !x) {a();} else {b();}
    89      if (x) {a();} else {b();}
    90      if (x ? y : !z) {a();} else {b();}
    91      if (c() == !x) {a();} else {b();}
    92      if (c() ? !x : !c()) {a();} else {b();}
    93      if (!x && d() instanceof String) {a();} else {b();}
    94      if (!x && (d() instanceof String)) {a();} else {b();}
    95    }
    96
    97    private static void a() { }
    98    private static void b() { }
    99    private static boolean c() { return true; }
    100   private static Object d() { return null; }
    101 }
    102
    103     */
    104
    105 }