From 9f9124b8fb17285d7326dd5c6f15579af1253f13 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Fri, 4 Nov 2016 09:44:23 +0100 Subject: [PATCH] Fixes #1521 [apex] ApexUnitTestClassShouldHaveAsserts: Parsing error on APEX class: expected one element but was: --- .../apex/ast/ASTMethodCallExpression.java | 13 ++++++ .../ApexUnitTestClassShouldHaveAsserts.java | 42 +++++++++---------- .../ApexUnitTestClassShouldHaveAsserts.xml | 40 ++++++++++++++++++ src/site/markdown/overview/changelog.md | 2 + 4 files changed, 76 insertions(+), 21 deletions(-) diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ASTMethodCallExpression.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ASTMethodCallExpression.java index 345df13d06..133c100525 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ASTMethodCallExpression.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ASTMethodCallExpression.java @@ -14,4 +14,17 @@ public class ASTMethodCallExpression extends AbstractApexNode ASSERT_METHODS = new HashSet<>(); + static { + ASSERT_METHODS.add("System.assert"); + ASSERT_METHODS.add("System.assertEquals"); + ASSERT_METHODS.add("System.assertNotEquals"); + } + @Override public Object visit(ASTMethod node, Object data) { if (!isTestMethodOrClass(node)) { @@ -36,21 +39,18 @@ public class ApexUnitTestClassShouldHaveAsserts extends AbstractApexUnitTestRule private Object checkForAssertStatements(ApexNode node, Object data) { final List blockStatements = node.findDescendantsOfType(ASTBlockStatement.class); - final List statements = Iterables.getOnlyElement(blockStatements).findDescendantsOfType(ASTStatement.class); + final List statements = new ArrayList<>(); + final List methodCalls = new ArrayList<>(); + for (ASTBlockStatement blockStatement : blockStatements) { + statements.addAll(blockStatement.findDescendantsOfType(ASTStatement.class)); + methodCalls.addAll(blockStatement.findDescendantsOfType(ASTMethodCallExpression.class)); + } boolean isAssertFound = false; - - for (final ASTStatement statement : statements) { - final List methodCalls = statement.findDescendantsOfType(ASTMethodCallExpression.class); - - for (final ASTMethodCallExpression methodCallExpression : methodCalls) { - final String methodName = methodCallExpression.getNode().getMethod().getName(); - - if (methodCallExpression.getNode().getDefiningType().getApexName().equalsIgnoreCase(SYSTEM) - && (methodName.equalsIgnoreCase(ASSERT) - || methodName.equalsIgnoreCase(ASSERT_EQUALS) - || methodName.equalsIgnoreCase(ASSERT_NOT_EQUALS))) { - isAssertFound = true; - } + + for (final ASTMethodCallExpression methodCallExpression : methodCalls) { + if (ASSERT_METHODS.contains(methodCallExpression.getFullMethodName())) { + isAssertFound = true; + break; } } diff --git a/pmd-apex/src/test/resources/net/sourceforge/pmd/lang/apex/rule/apexunit/xml/ApexUnitTestClassShouldHaveAsserts.xml b/pmd-apex/src/test/resources/net/sourceforge/pmd/lang/apex/rule/apexunit/xml/ApexUnitTestClassShouldHaveAsserts.xml index 9b87884fdb..fddca200b4 100644 --- a/pmd-apex/src/test/resources/net/sourceforge/pmd/lang/apex/rule/apexunit/xml/ApexUnitTestClassShouldHaveAsserts.xml +++ b/pmd-apex/src/test/resources/net/sourceforge/pmd/lang/apex/rule/apexunit/xml/ApexUnitTestClassShouldHaveAsserts.xml @@ -16,4 +16,44 @@ public class Foo { } ]]> + + + #1521 [apex] ApexUnitTestClassShouldHaveAsserts: Parsing error on APEX class: expected one element but was: <BlockStatement, BlockStatement> + 0 + cases = new List(); + cases.add(new C2_Case__c(Name='TT0000000', Queue__c = 'PA-CSA', Status__c=C2_Case_Util.STATUS_NEW, PA_CSA__c=u.Id, DSA__c=u.Id, QR_CSA__c=u.Id, Receiver_Unit__c=ru.Id)); + cases.add(new C2_Case__c(Name='TT0000001', Queue__c = 'PA-CSA', Status__c=C2_Case_Util.STATUS_NEW, PA_CSA__c=u.Id, DSA__c=u.Id, QR_CSA__c=u.Id, Receiver_Unit__c=ru.Id)); + cases.add(new C2_Case__c(Name='TT0000002', Queue__c = 'PA-CSA', Status__c=C2_Case_Util.STATUS_NEW, PA_CSA__c=u.Id, DSA__c=u.Id, QR_CSA__c=u.Id, Receiver_Unit__c=ru.Id)); + cases.add(new C2_Case__c(Name='TT0000011', Queue__c = 'DSA', Status__c=C2_Case_Util.STATUS_PACSA_COMPLETE, PA_CSA__c=u.Id, DSA__c=u.Id, QR_CSA__c=u.Id, Receiver_Unit__c=ru.Id)); + cases.add(new C2_Case__c(Name='TT0000012', Queue__c = 'DSA', Status__c=C2_Case_Util.STATUS_PACSA_COMPLETE, PA_CSA__c=u.Id, DSA__c=u.Id, QR_CSA__c=u.Id, Receiver_Unit__c=ru.Id)); + cases.add(new C2_Case__c(Name='TT0000021', Queue__c = 'QR-CSA', Status__c=C2_Case_Util.STATUS_DSA_COMPLETE, PA_CSA__c=u.Id, DSA__c=u.Id, QR_CSA__c=u.Id, Receiver_Unit__c=ru.Id)); + insert cases; + List scope = Database.query(query); + Test.startTest(); + job.execute(null, scope); + Test.stopTest(); + List caseEventEntries = + [select Num_Cases_Assign__c, Num_Cases_Not_Completed__c, Num_Cases_Reassigned__c, Num_Cases_Completed__c, User__c, Role__c + from C2_Case_Assign_Report_Data__c]; + System.assertEquals(3, caseEventEntries.size()); + Map userIdWithRole2ReportData = getCaseEventEntriesMap(caseEventEntries); + System.assertEquals(3, userIdWithRole2ReportData.get(createUserRoleKey(u.Id, 'PA-CSA'))); + System.assertEquals(2, userIdWithRole2ReportData.get(createUserRoleKey(u.Id, 'DSA'))); + System.assertEquals(1, userIdWithRole2ReportData.get(createUserRoleKey(u.Id, 'QR-CSA'))); + } + } +} + ]]> + \ No newline at end of file diff --git a/src/site/markdown/overview/changelog.md b/src/site/markdown/overview/changelog.md index f480c9dbf8..58c22b7d94 100644 --- a/src/site/markdown/overview/changelog.md +++ b/src/site/markdown/overview/changelog.md @@ -27,6 +27,8 @@ **Bugfixes:** +* apex-apexunit + * [#1521](https://sourceforge.net/p/pmd/bugs/1521/): \[apex] ApexUnitTestClassShouldHaveAsserts: Parsing error on APEX class: expected one element but was: * Java * [#1530](https://sourceforge.net/p/pmd/bugs/1530/): \[java] Parser exception on Java code * [#1490](https://sourceforge.net/p/pmd/bugs/1490/): \[java] PMD Error while processing - NullPointerException