From 7e00492c97791f0404b307ad33e831fde659544e Mon Sep 17 00:00:00 2001
From: Johannes Mey <johannes.mey@tu-dresden.de>
Date: Sat, 4 Jan 2020 18:43:40 +0100
Subject: [PATCH] add trivial test from SEI CERT Oracle Coding Standard for
 Java

---
 .../src/test/java/org/extendj/DCL51JTest.java | 32 +++++++++++++++++++
 .../resources/dcl51-j/FieldComplient.java     | 10 ++++++
 .../resources/dcl51-j/FieldNoncomplient.java  | 10 ++++++
 .../resources/dcl51-j/VariableCompliant.java  |  9 ++++++
 .../dcl51-j/VariableNoncompliant.java         | 12 +++++++
 5 files changed, 73 insertions(+)
 create mode 100644 scope4j/src/test/java/org/extendj/DCL51JTest.java
 create mode 100644 scope4j/src/test/resources/dcl51-j/FieldComplient.java
 create mode 100644 scope4j/src/test/resources/dcl51-j/FieldNoncomplient.java
 create mode 100644 scope4j/src/test/resources/dcl51-j/VariableCompliant.java
 create mode 100644 scope4j/src/test/resources/dcl51-j/VariableNoncompliant.java

diff --git a/scope4j/src/test/java/org/extendj/DCL51JTest.java b/scope4j/src/test/java/org/extendj/DCL51JTest.java
new file mode 100644
index 0000000..8a56410
--- /dev/null
+++ b/scope4j/src/test/java/org/extendj/DCL51JTest.java
@@ -0,0 +1,32 @@
+package org.extendj;
+
+import org.extendj.ast.AbstractFinding;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.Set;
+
+public class DCL51JTest extends ScopeAnalysisTest {
+
+  @Test
+  void test() {
+
+    // see https://wiki.sei.cmu.edu/confluence/display/java/DCL51-J.+Do+not+shadow+or+obscure+identifiers+in+subscopes
+
+    ScopeAnalysis scopeAnalysis = new ScopeAnalysis();
+    Set<AbstractFinding> findings = scopeAnalysis.analyze("src/test/resources/dcl51-j", true, true);
+
+    System.out.println(findings);
+
+//    final String fFieldComplient = "src/test/resources/dcl51-j/FieldComplient.java";
+    final String fFieldNoncomplient = "src/test/resources/dcl51-j/FieldNoncomplient.java";
+//    final String fVariableCompliant = "src/test/resources/dcl51-j/VariableCompliant.java";
+    final String fVariableNoncompliant = "src/test/resources/dcl51-j/VariableNoncompliant.java";
+
+    assertShadow(findings, "val", fFieldNoncomplient, 7, fFieldNoncomplient, 5);
+    assertShadow(findings, "i", fVariableNoncompliant, 8, fVariableNoncompliant, 5);
+
+    Assertions.assertEquals(2, findings.size());
+  }
+
+}
diff --git a/scope4j/src/test/resources/dcl51-j/FieldComplient.java b/scope4j/src/test/resources/dcl51-j/FieldComplient.java
new file mode 100644
index 0000000..a4d51bf
--- /dev/null
+++ b/scope4j/src/test/resources/dcl51-j/FieldComplient.java
@@ -0,0 +1,10 @@
+/**
+ * Compliant Solution (Field Shadowing)
+ */
+public class FieldComplient {
+  private int val = 1;
+  private void doLogic() {
+    int newValue;
+    //...
+  }
+}
diff --git a/scope4j/src/test/resources/dcl51-j/FieldNoncomplient.java b/scope4j/src/test/resources/dcl51-j/FieldNoncomplient.java
new file mode 100644
index 0000000..035ea80
--- /dev/null
+++ b/scope4j/src/test/resources/dcl51-j/FieldNoncomplient.java
@@ -0,0 +1,10 @@
+/**
+ * Noncompliant Code Example (Field Shadowing)
+ */
+public class FieldNoncomplient {
+  private int val = 1;
+  private void doLogic() {
+    int val;
+    //...
+  }
+}
diff --git a/scope4j/src/test/resources/dcl51-j/VariableCompliant.java b/scope4j/src/test/resources/dcl51-j/VariableCompliant.java
new file mode 100644
index 0000000..7ffeba8
--- /dev/null
+++ b/scope4j/src/test/resources/dcl51-j/VariableCompliant.java
@@ -0,0 +1,9 @@
+/**
+ * Compliant Solution (Variable Shadowing)
+ */
+public class VariableCompliant {
+  private void doLogic() {
+    for (int i = 0; i < 10; i++) {/* ... */}
+    for (int i = 0; i < 20; i++) {/* ... */}
+  }
+}
diff --git a/scope4j/src/test/resources/dcl51-j/VariableNoncompliant.java b/scope4j/src/test/resources/dcl51-j/VariableNoncompliant.java
new file mode 100644
index 0000000..f93a792
--- /dev/null
+++ b/scope4j/src/test/resources/dcl51-j/VariableNoncompliant.java
@@ -0,0 +1,12 @@
+/**
+ * Noncompliant Code Example (Variable Shadowing)
+ */
+public class VariableNoncompliant {
+  private int i = 0;
+  private void doLogic() {
+    for (i = 0; i < 10; i++) {/* ... */}
+    for (int i = 0; i < 20; i++) {/* ... */}
+  }
+}
+
+
-- 
GitLab