View Javadoc

    1   package net.sourceforge.pmd.ast;
    2
    3   import net.sourceforge.pmd.PMD;
    4   import net.sourceforge.pmd.lang.java.ast.ParseException;
    5   import net.sourceforge.pmd.testframework.ParserTst;
    6
    7   import org.junit.Test;
    8
    9
    10  public class JDKVersionTest extends ParserTst {
    11
    12      // enum keyword/identifier
    13      @Test(expected = ParseException.class)
    14      public void testEnumAsKeywordShouldFailWith14() throws Throwable {
    15          parseJava15(JDK14_ENUM);
    16      }
    17
    18      @Test
    19      public void testEnumAsIdentifierShouldPassWith14() throws Throwable {
    20          parseJava14(JDK14_ENUM);
    21      }
    22
    23      @Test
    24      public void testEnumAsKeywordShouldPassWith15() throws Throwable {
    25          parseJava15(JDK15_ENUM);
    26      }
    27
    28      @Test(expected = ParseException.class)
    29      public void testEnumAsIdentifierShouldFailWith15() throws Throwable {
    30          parseJava15(JDK14_ENUM);
    31      }
    32      // enum keyword/identifier
    33
    34      // assert keyword/identifier
    35      @Test
    36      public void testAssertAsKeywordVariantsSucceedWith1_4() {
    37          parseJava14(ASSERT_TEST1);
    38          parseJava14(ASSERT_TEST2);
    39          parseJava14(ASSERT_TEST3);
    40          parseJava14(ASSERT_TEST4);
    41      }
    42
    43      @Test(expected = ParseException.class)
    44      public void testAssertAsVariableDeclIdentifierFailsWith1_4() {
    45          parseJava14(ASSERT_TEST5);
    46      }
    47
    48      @Test(expected = ParseException.class)
    49      public void testAssertAsMethodNameIdentifierFailsWith1_4() {
    50          parseJava14(ASSERT_TEST7);
    51      }
    52
    53      @Test
    54      public void testAssertAsIdentifierSucceedsWith1_3() {
    55          parseJava13(ASSERT_TEST5);
    56      }
    57
    58      @Test(expected = ParseException.class)
    59      public void testAssertAsKeywordFailsWith1_3() {
    60          parseJava13(ASSERT_TEST6);
    61      }
    62      // assert keyword/identifier
    63
    64      @Test
    65      public void testVarargsShouldPassWith15() throws Throwable {
    66          parseJava15(JDK15_VARARGS);
    67      }
    68
    69      @Test(expected = ParseException.class)
    70      public void testVarargsShouldFailWith14() throws Throwable {
    71          parseJava14(JDK15_VARARGS);
    72      }
    73
    74      @Test
    75      public void testJDK15ForLoopSyntaxShouldPassWith15() throws Throwable {
    76          parseJava15(JDK15_FORLOOP);
    77      }
    78
    79      @Test
    80      public void testJDK15ForLoopSyntaxWithModifiers() throws Throwable {
    81          parseJava15(JDK15_FORLOOP_WITH_MODIFIER);
    82      }
    83
    84      @Test(expected = ParseException.class)
    85      public void testJDK15ForLoopShouldFailWith14() throws Throwable {
    86          parseJava14(JDK15_FORLOOP);
    87      }
    88
    89      @Test
    90      public void testJDK15GenericsSyntaxShouldPassWith15() throws Throwable {
    91          parseJava15(JDK15_GENERICS);
    92      }
    93
    94      @Test
    95      public void testVariousParserBugs() throws Throwable {
    96          parseJava15(FIELDS_BUG);
    97          parseJava15(GT_BUG);
    98          parseJava15(ANNOTATIONS_BUG);
    99          parseJava15(CONSTANT_FIELD_IN_ANNOTATION_BUG);
    100         parseJava15(GENERIC_IN_FIELD);
    101     }
    102
    103     @Test
    104     public void testNestedClassInMethodBug() throws Throwable {
    105         parseJava15(INNER_BUG);
    106         parseJava15(INNER_BUG2);
    107     }
    108
    109     @Test
    110     public void testGenericsInMethodCall() throws Throwable {
    111         parseJava15(GENERIC_IN_METHOD_CALL);
    112     }
    113
    114     @Test
    115     public void testGenericINAnnotation() throws Throwable {
    116         parseJava15(GENERIC_IN_ANNOTATION);
    117     }
    118
    119     @Test
    120     public void testGenericReturnType() throws Throwable {
    121         parseJava15(GENERIC_RETURN_TYPE);
    122     }
    123
    124     @Test
    125     public void testMultipleGenerics() throws Throwable {
    126         parseJava15(FUNKY_GENERICS);
    127         parseJava15(MULTIPLE_GENERICS);
    128     }
    129
    130     @Test
    131     public void testAnnotatedParams() throws Throwable {
    132         parseJava15(ANNOTATED_PARAMS);
    133     }
    134
    135     @Test
    136     public void testAnnotatedLocals() throws Throwable {
    137         parseJava15(ANNOTATED_LOCALS);
    138     }
    139
    140     @Test
    141     public void testAssertAsIdentifierSucceedsWith1_3_test2() {
    142         parseJava13(ASSERT_TEST5_a);
    143     }
    144
    145     @Test
    146     public final void testBinaryAndUnderscoresInNumericalLiterals() throws Throwable {
    147         parseJava17(JDK17_NUMERICAL_LITERALS);
    148     }
    149
    150     @Test
    151     public final void testStringInSwitch() throws Throwable {
    152         parseJava17(JDK17_STRING_IN_SWITCH);
    153     }
    154
    155     @Test
    156     public final void testGenericDiamond() throws Throwable {
    157         parseJava17(JDK17_GENERIC_DIAMOND);
    158     }
    159
    160     @Test
    161     public final void testTryWithResources() throws Throwable {
    162         parseJava17(JDK17_TRY_WITH_RESOURCES);
    163     }
    164
    165     @Test
    166     public final void testTryWithResourcesSemi() throws Throwable {
    167         parseJava17(JDK17_TRY_WITH_RESOURCES_SEMI);
    168     }
    169
    170     @Test
    171     public final void testTryWithResourcesMulti() throws Throwable {
    172         parseJava17(JDK17_TRY_WITH_RESOURCES_MULTI);
    173     }
    174
    175     @Test
    176     public final void testTryWithResourcesWithAnnotations() throws Throwable {
    177         parseJava17(JDK17_TRY_WITH_RESOURCES_WITH_ANNOTATIONS);
    178     }
    179
    180     @Test
    181     public final void testMulticatch() throws Throwable {
    182         parseJava17(JDK17_MULTICATCH);
    183     }
    184
    185     @Test
    186     public final void testMulticatchWithAnnotations() throws Throwable {
    187         parseJava17(JDK17_MULTICATCH_WITH_ANNOTATIONS);
    188     }
    189     private static final String ANNOTATED_LOCALS =
    190             "public class Foo {" + PMD.EOL +
    191             " void bar() {" + PMD.EOL +
    192             "  @SuppressWarnings(\"foo\") int y = 5;" + PMD.EOL +
    193             " }" + PMD.EOL +
    194             "}";
    195
    196     private static final String ANNOTATED_PARAMS =
    197             "public class Foo {" + PMD.EOL +
    198             " void bar(@SuppressWarnings(\"foo\") int x) {}" + PMD.EOL +
    199             "}";
    200
    201     private static final String ASSERT_TEST1 =
    202             "public class Foo {" + PMD.EOL +
    203             " void bar() {" + PMD.EOL +
    204             "  assert x == 2;" + PMD.EOL +
    205             " }" + PMD.EOL +
    206             "}";
    207
    208     private static final String ASSERT_TEST2 =
    209             "public class Foo {" + PMD.EOL +
    210             " void bar() {" + PMD.EOL +
    211             "  assert (x == 2);" + PMD.EOL +
    212             " }" + PMD.EOL +
    213             "}";
    214
    215     private static final String ASSERT_TEST3 =
    216             "public class Foo {" + PMD.EOL +
    217             " void bar() {" + PMD.EOL +
    218             "  assert (x==2) : \"hi!\";" + PMD.EOL +
    219             " }" + PMD.EOL +
    220             "}";
    221
    222     private static final String ASSERT_TEST4 =
    223             "public class Foo {" + PMD.EOL +
    224             " void bar() {" + PMD.EOL +
    225             "  assert (x==2) : \"hi!\";" + PMD.EOL +
    226             " }" + PMD.EOL +
    227             "}";
    228
    229     private static final String ASSERT_TEST5 =
    230             "public class Foo {" + PMD.EOL +
    231             "  int assert = 2;" + PMD.EOL +
    232             "}";
    233
    234
    235     private static final String ASSERT_TEST5_a =
    236             "public class Foo {" + PMD.EOL +
    237             "  void bar() { assert(); }" + PMD.EOL +
    238             "}";
    239
    240     private static final String ASSERT_TEST6 =
    241             "public class Foo {" + PMD.EOL +
    242             " void foo() {" + PMD.EOL +
    243             "  assert (x == 2) : \"hi!\";" + PMD.EOL +
    244             " }" + PMD.EOL +
    245             "}";
    246
    247     private static final String ASSERT_TEST7 =
    248             "public class Foo {" + PMD.EOL +
    249             " void assert() {}" + PMD.EOL +
    250             "}";
    251
    252     private static final String JDK15_ENUM =
    253             "public class Test {" + PMD.EOL +
    254             " enum Season { winter, spring, summer, fall };" + PMD.EOL +
    255             "}";
    256
    257     private static final String JDK14_ENUM =
    258             "public class Test {" + PMD.EOL +
    259             " int enum;" + PMD.EOL +
    260             "}";
    261
    262     private static final String JDK15_VARARGS =
    263             "public class Test {" + PMD.EOL +
    264             " void bar(Object ... args) {}" + PMD.EOL +
    265             "}";
    266
    267     private static final String JDK15_FORLOOP =
    268             "public class Test {" + PMD.EOL +
    269             " void foo(List list) {" + PMD.EOL +
    270             "  for (Integer i : list) {}" + PMD.EOL +
    271             " }" + PMD.EOL +
    272             "}";
    273
    274     private static final String JDK15_FORLOOP_WITH_MODIFIER =
    275             "public class Test {" + PMD.EOL +
    276             " void foo(List list) {" + PMD.EOL +
    277             "  for (final Integer i : list) {}" + PMD.EOL +
    278             " }" + PMD.EOL +
    279             "}";
    280
    281     private static final String JDK15_GENERICS =
    282             "public class Test {" + PMD.EOL +
    283             "  ArrayList<Integer> list =  new ArrayList<Integer>();" + PMD.EOL +
    284             "}";
    285
    286     private static final String FIELDS_BUG =
    287             "public class Test {" + PMD.EOL +
    288             "  private Foo bar;" + PMD.EOL +
    289             "}";
    290
    291     private static final String GT_BUG =
    292             "public class Test {" + PMD.EOL +
    293             "  int y = x > 32;" + PMD.EOL +
    294             "}";
    295
    296     private static final String ANNOTATIONS_BUG =
    297             "@Target(ElementType.METHOD)" + PMD.EOL +
    298             "public @interface Foo {" + PMD.EOL +
    299             "}";
    300
    301     private static final String CONSTANT_FIELD_IN_ANNOTATION_BUG =
    302             "public @interface Foo {" + PMD.EOL +
    303             "  String CONST = \"foo\";" + PMD.EOL +
    304             "}";
    305
    306     private static final String GENERIC_IN_FIELD =
    307             "public class Foo {" + PMD.EOL +
    308             " Class<Double> foo = (Class<Double>)clazz;" + PMD.EOL +
    309             "}";
    310
    311     private static final String GENERIC_IN_ANNOTATION =
    312             "public class Foo {" + PMD.EOL +
    313             " public <A extends Annotation> A foo(Class<A> c) {" + PMD.EOL +
    314             "  return null;" + PMD.EOL +
    315             " }" + PMD.EOL +
    316             "}";
    317
    318     private static final String INNER_BUG =
    319             "public class Test {" + PMD.EOL +
    320             "  void bar() {" + PMD.EOL +
    321             "   final class Inner {};" + PMD.EOL +
    322             "   Inner i = new Inner();" + PMD.EOL +
    323             "  }" + PMD.EOL +
    324             "}";
    325
    326     private static final String INNER_BUG2 =
    327             "public class Test {" + PMD.EOL +
    328             "  void bar() {" + PMD.EOL +
    329             "   class Inner {};" + PMD.EOL +
    330             "   Inner i = new Inner();" + PMD.EOL +
    331             "  }" + PMD.EOL +
    332             "}";
    333
    334     private static final String GENERIC_IN_METHOD_CALL =
    335             "public class Test {" + PMD.EOL +
    336             "  List<String> test() {" + PMD.EOL +
    337             "   return Collections.<String>emptyList();" + PMD.EOL +
    338             "  }" + PMD.EOL +
    339             "}";
    340
    341     private static final String GENERIC_RETURN_TYPE =
    342             "public class Test {" + PMD.EOL +
    343             "  public static <String> String test(String x) {" + PMD.EOL +
    344             "   return x;" + PMD.EOL +
    345             "  }" + PMD.EOL +
    346             "}";
    347
    348     // See java/lang/concurrent/ConcurrentHashMap
    349     private static final String MULTIPLE_GENERICS =
    350             "public class Foo<K,V> {" + PMD.EOL +
    351             "  public <A extends K, B extends V> Foo(Bar<A,B> t) {}" + PMD.EOL +
    352             "}";
    353
    354     // See java/lang/concurrent/CopyOnWriteArraySet
    355     private static final String FUNKY_GENERICS =
    356             "public class Foo {" + PMD.EOL +
    357             "  public <T extends E> Foo() {}" + PMD.EOL +
    358             "}";
    359
    360     private static final String JDK17_NUMERICAL_LITERALS =
    361       "public class Test {" + PMD.EOL +
    362       "  int i1 = 0b00011110;" + PMD.EOL +
    363       "  int i2 = 0B00011110;" + PMD.EOL +
    364       "  int i3 = 0xA;" + PMD.EOL +
    365       "  int i4 = 0x1___A_F;" + PMD.EOL +
    366       "  int i5 = 0b1;" + PMD.EOL +
    367       "  int i6 = 0b1___1_0;" + PMD.EOL +
    368       "  int i7 = 0;" + PMD.EOL +
    369       "  int i8 = 02;" + PMD.EOL +
    370       "  int i9 = 0_123;" + PMD.EOL +
    371       "  int i10 = 1;" + PMD.EOL +
    372       "  int i11 = 1___3;" + PMD.EOL +
    373       "  int i12 = 1_43_43598_7;" + PMD.EOL +
    374       "  " + PMD.EOL +
    375       "  long l1 = 0b00011110L;" + PMD.EOL +
    376       "  long l2 = 0B00011110l;" + PMD.EOL +
    377       "  long l3 = 0xAL;" + PMD.EOL +
    378       "  long l4 = 0x1___A_FL;" + PMD.EOL +
    379       "  long l5 = 0b1L;" + PMD.EOL +
    380       "  long l6 = 0b1___1_0L;" + PMD.EOL +
    381       "  long l7 = 0l;" + PMD.EOL +
    382       "  long l8 = 02L;" + PMD.EOL +
    383       "  long l9 = 0_123l;" + PMD.EOL +
    384       "  long l10 = 1l;" + PMD.EOL +
    385       "  long l11 = 1___3l;" + PMD.EOL +
    386       "  long l12 = 1_43_43598_7L;" + PMD.EOL +
    387       "  long l13 = 1_43_43598_7;" + PMD.EOL +
    388       "  " + PMD.EOL +
    389       "  float f1 = .1f;" + PMD.EOL +
    390       "  float f2 = 1.f;" + PMD.EOL +
    391       "  float f3 = 0f;" + PMD.EOL +
    392       "  float f4 = 1e0F;" + PMD.EOL +
    393       "  float f5 = 1e0f;" + PMD.EOL +
    394       "  float f6 = 12.345F;" + PMD.EOL +
    395       "  float f7 = .5____2_1f;" + PMD.EOL +
    396       "  float f8 = 1__42__3.f;" + PMD.EOL +
    397       "  float f9 = 0__2_4__324f;" + PMD.EOL +
    398       "  float f10 = 1_34e0F;" + PMD.EOL +
    399       "  float f11 = 1__1_2e0f;" + PMD.EOL +
    400       "  float f12 = 2_1___2.3__4_5F;" + PMD.EOL +
    401       "  float f13 = 1_34e0__4__3f;" + PMD.EOL +
    402       "  float f14 = 1__1_2e00__000_4f;" + PMD.EOL +
    403       "  float f15 = 2_1___2.3__4_5e00______0_5F;" + PMD.EOL +
    404       "  " + PMD.EOL +
    405       "  double d1 = .1d;" + PMD.EOL +
    406       "  double d2 = 1.D;" + PMD.EOL +
    407       "  double d3 = 0d;" + PMD.EOL +
    408       "  double d4 = 1e0D;" + PMD.EOL +
    409       "  double d5 = 1e0d;" + PMD.EOL +
    410       "  double d6 = 12.345D;" + PMD.EOL +
    411       "  double d7 = .5____2_1d;" + PMD.EOL +
    412       "  double d8 = 1__42__3.D;" + PMD.EOL +
    413       "  double d9 = 0__2_4__324d;" + PMD.EOL +
    414       "  double d10 = 1_34e0d;" + PMD.EOL +
    415       "  double d11 = 1__1_2e0d;" + PMD.EOL +
    416       "  double d12 = 2_1___2.3__4_5D;" + PMD.EOL +
    417       "  double d13 = 1_34e0__4__3d;" + PMD.EOL +
    418       "  double d14 = 1__1_2e00__000_4d;" + PMD.EOL +
    419       "  double d15 = 2_1___2.3__4_5e00______0_5D;" + PMD.EOL +
    420       "  double d16 = 0.12___34;" + PMD.EOL +
    421       "  " + PMD.EOL +
    422       "  float hf1 = 0x.1___AFp1;" + PMD.EOL +
    423       "  float hf2 = 0x.1___AFp0__0__0f;" + PMD.EOL +
    424       "  float hf3 = 0x2__3_34.4___AFP00_00f;" + PMD.EOL +
    425       "  " + PMD.EOL +
    426       "  double hd1 = 0x.1___AFp1;" + PMD.EOL +
    427       "  double hd2 = 0x.1___AFp0__0__0d;" + PMD.EOL +
    428       "  double hd3 = 0x2__3_34.4___AFP00_00d;" + PMD.EOL +
    429       "  " + PMD.EOL +
    430       "  int doc1 = 1234_5678;" + PMD.EOL +
    431       "  long doc2 = 1_2_3_4__5_6_7_8L;" + PMD.EOL +
    432       "  int doc3 = 0b0001_0010_0100_1000;" + PMD.EOL +
    433       "  double doc4 = 3.141_592_653_589_793d;" + PMD.EOL +
    434       "  double doc5 = 0x1.ffff_ffff_ffff_fP1_023;" + PMD.EOL +
    435       "}" + PMD.EOL
    436       ;
    437
    438     private static final String JDK17_STRING_IN_SWITCH =
    439       "public class Test {" + PMD.EOL +
    440       "	public static void main(String[] args) {" + PMD.EOL +
    441       "		String mystr = \"value\" + \"2\";" + PMD.EOL +
    442       "		switch (mystr) {" + PMD.EOL +
    443       "			case \"value1\":" + PMD.EOL +
    444       "				break;" + PMD.EOL +
    445       "			case \"value2\":" + PMD.EOL +
    446       "				break;" + PMD.EOL +
    447       "			default:" + PMD.EOL +
    448       "				break;" + PMD.EOL +
    449       "		}" + PMD.EOL +
    450       "	}" + PMD.EOL +
    451       "}" + PMD.EOL
    452       ;
    453
    454     private static final String JDK17_GENERIC_DIAMOND =
    455     	"public class InputJava7Diamond {" + PMD.EOL +
    456     	" HashMap<String> map = new HashMap<>();" + PMD.EOL +
    457     	"}";
    458
    459     private static final String JDK17_TRY_WITH_RESOURCES =
    460     	"public class InputJava7TryWithResources {" + PMD.EOL +
    461     	" public static void main() {" + PMD.EOL +
    462     	"  try (MyResource resource = new MyResource()) { }" + PMD.EOL +
    463     	" }" + PMD.EOL +
    464     	"}";
    465
    466     private static final String JDK17_TRY_WITH_RESOURCES_SEMI =
    467     	"public class InputJava7TryWithResources {" + PMD.EOL +
    468     	" public static void main() {" + PMD.EOL +
    469     	"  try (MyResource resource = new MyResource();) { }" + PMD.EOL +
    470     	" }" + PMD.EOL +
    471     	"}";
    472
    473     private static final String JDK17_TRY_WITH_RESOURCES_MULTI =
    474     	"public class InputJava7TryWithResources {" + PMD.EOL +
    475     	" public static void main() {" + PMD.EOL +
    476     	"  try (MyResource resource = new MyResource(); MyResource2 resource2 = new MyResource2()) { }" + PMD.EOL +
    477     	" }" + PMD.EOL +
    478     	"}";
    479
    480     private static final String JDK17_TRY_WITH_RESOURCES_WITH_ANNOTATIONS =
    481     	"public class InputJava7TryWithResources {" + PMD.EOL +
    482     	" public static void main() {" + PMD.EOL +
    483     	"  try (@SuppressWarnings(\"all\") final MyResource resource = new MyResource()) { }" + PMD.EOL +
    484     	" }" + PMD.EOL +
    485     	"}";
    486
    487     private static final String JDK17_MULTICATCH =
    488     	"public class InputJava7Multicatch {" + PMD.EOL +
    489     	" public static void main() {" + PMD.EOL +
    490     	"  try { }" + PMD.EOL +
    491     	"  catch (FileNotFoundException | CustomException e) { }" + PMD.EOL +
    492     	" }" + PMD.EOL +
    493     	"}";
    494
    495     private static final String JDK17_MULTICATCH_WITH_ANNOTATIONS =
    496     	"public class InputJava7Multicatch {" + PMD.EOL +
    497     	" public static void main() {" + PMD.EOL +
    498     	"  try { }" + PMD.EOL +
    499     	"  catch (final @SuppressWarnings(\"all\") FileNotFoundException | CustomException e) { }" + PMD.EOL +
    500     	" }" + PMD.EOL +
    501     	"}";
    502     public static junit.framework.Test suite() {
    503         return new junit.framework.JUnit4TestAdapter(JDKVersionTest.class);
    504     }
    505 }