// Path: src/main/java/net/nandgr/cba/report/ReportItem.java
// public class ReportItem {
// 
//   private String jarPath = "";
//   private String className = "";
//   private String decompiledFile;
//   private final String ruleName;
//   private final boolean showInReport;
//   private Map<String,String> properties = new HashMap<>();
// 
//   public ReportItem(String ruleName, boolean showInReport) {
//     this.ruleName = ruleName;
//     this.showInReport = showInReport;
//   }
// 
//   public String getJarPath() {
//     return jarPath;
//   }
// 
//   public String getClassName() {
//     return className;
//   }
// 
//   public String getRuleName() {
//     return ruleName;
//   }
// 
//   public void setJarPath(String jarPath) {
//     this.jarPath = jarPath;
//   }
// 
//   public void setClassName(String className) {
//     this.className = className;
//   }
// 
//   public boolean isShowInReport() {
//     return showInReport;
//   }
// 
//   public String getDecompiledFile() {
//     return decompiledFile;
//   }
// 
//   public String getDecompiledFileHtml() {
//     return StringEscapeUtils.escapeHtml(decompiledFile);
//   }
// 
//   public Map<String, String> getProperties() {
//     return properties;
//   }
// 
//   public ReportItem addProperty(String propertyName, String propertyValue) {
//     properties.put(propertyName, propertyValue);
//     return this;
//   }
// 
//   public void setDecompiledFile(String decompiledFile) {
//     this.decompiledFile = decompiledFile;
//   }
// 
//   @Override
//   public boolean equals(Object o) {
//     if (this == o) return true;
//     if (!(o instanceof ReportItem)) return false;
// 
//     ReportItem that = (ReportItem) o;
// 
//     if (isShowInReport() != that.isShowInReport()) return false;
//     if (getJarPath() != null ? !getJarPath().equals(that.getJarPath()) : that.getJarPath() != null) return false;
//     if (getClassName() != null ? !getClassName().equals(that.getClassName()) : that.getClassName() != null)
//       return false;
//     if (getDecompiledFile() != null ? !getDecompiledFile().equals(that.getDecompiledFile()) : that.getDecompiledFile() != null)
//       return false;
//     if (getRuleName() != null ? !getRuleName().equals(that.getRuleName()) : that.getRuleName() != null) return false;
//     return getProperties() != null ? getProperties().equals(that.getProperties()) : that.getProperties() == null;
//   }
// 
//   @Override
//   public int hashCode() {
//     int result = getJarPath() != null ? getJarPath().hashCode() : 0;
//     result = 31 * result + (getClassName() != null ? getClassName().hashCode() : 0);
//     result = 31 * result + (getDecompiledFile() != null ? getDecompiledFile().hashCode() : 0);
//     result = 31 * result + (getRuleName() != null ? getRuleName().hashCode() : 0);
//     result = 31 * result + (isShowInReport() ? 1 : 0);
//     result = 31 * result + (getProperties() != null ? getProperties().hashCode() : 0);
//     return result;
//   }
// }


import java.util.List;
import java.util.stream.Collectors;
import net.nandgr.cba.report.ReportItem;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
package rules;



public class FieldsTest extends AbstractTest {

  public FieldsTest() {
    super("fields");
  }

  @Test
  public void test() {
    runTests();

    List<ReportItem> reportItems1 = getReportItems("fields1");
    assertEquals(2, reportItems1.size());
    assertTrue(matchClassName(reportItems1, "FieldsTestFile$C.class"));
    assertTrue(matchClassName(reportItems1, "FieldsTestFile$A.class"));

    List<ReportItem> reportItems2 = getReportItems("fields2").stream()
            .filter(r ->!r.getProperties().getOrDefault("Field name", "").contains("this"))
            .collect(Collectors.toList());
    assertEquals(8, reportItems2.size());

    List<ReportItem> reportItems3 = getReportItems("fields3");
    assertEquals(1, reportItems3.size());
    assertTrue(matchClassName(reportItems3, "FieldsTestFile$C.class"));

// Path: src/main/java/net/nandgr/cba/report/ReportItem.java
// public class ReportItem {
// 
//   private String jarPath = "";
//   private String className = "";
//   private String decompiledFile;
//   private final String ruleName;
//   private final boolean showInReport;
//   private Map<String,String> properties = new HashMap<>();
// 
//   public ReportItem(String ruleName, boolean showInReport) {
//     this.ruleName = ruleName;
//     this.showInReport = showInReport;
//   }
// 
//   public String getJarPath() {
//     return jarPath;
//   }
// 
//   public String getClassName() {
//     return className;
//   }
// 
//   public String getRuleName() {
//     return ruleName;
//   }
// 
//   public void setJarPath(String jarPath) {
//     this.jarPath = jarPath;
//   }
// 
//   public void setClassName(String className) {
//     this.className = className;
//   }
// 
//   public boolean isShowInReport() {
//     return showInReport;
//   }
// 
//   public String getDecompiledFile() {
//     return decompiledFile;
//   }
// 
//   public String getDecompiledFileHtml() {
//     return StringEscapeUtils.escapeHtml(decompiledFile);
//   }
// 
//   public Map<String, String> getProperties() {
//     return properties;
//   }
// 
//   public ReportItem addProperty(String propertyName, String propertyValue) {
//     properties.put(propertyName, propertyValue);
//     return this;
//   }
// 
//   public void setDecompiledFile(String decompiledFile) {
//     this.decompiledFile = decompiledFile;
//   }
// 
//   @Override
//   public boolean equals(Object o) {
//     if (this == o) return true;
//     if (!(o instanceof ReportItem)) return false;
// 
//     ReportItem that = (ReportItem) o;
// 
//     if (isShowInReport() != that.isShowInReport()) return false;
//     if (getJarPath() != null ? !getJarPath().equals(that.getJarPath()) : that.getJarPath() != null) return false;
//     if (getClassName() != null ? !getClassName().equals(that.getClassName()) : that.getClassName() != null)
//       return false;
//     if (getDecompiledFile() != null ? !getDecompiledFile().equals(that.getDecompiledFile()) : that.getDecompiledFile() != null)
//       return false;
//     if (getRuleName() != null ? !getRuleName().equals(that.getRuleName()) : that.getRuleName() != null) return false;
//     return getProperties() != null ? getProperties().equals(that.getProperties()) : that.getProperties() == null;
//   }
// 
//   @Override
//   public int hashCode() {
//     int result = getJarPath() != null ? getJarPath().hashCode() : 0;
//     result = 31 * result + (getClassName() != null ? getClassName().hashCode() : 0);
//     result = 31 * result + (getDecompiledFile() != null ? getDecompiledFile().hashCode() : 0);
//     result = 31 * result + (getRuleName() != null ? getRuleName().hashCode() : 0);
//     result = 31 * result + (isShowInReport() ? 1 : 0);
//     result = 31 * result + (getProperties() != null ? getProperties().hashCode() : 0);
//     return result;
//   }
// }


// Path: src/test/java/rules/FieldsTest.java
import java.util.List;
import java.util.stream.Collectors;
import net.nandgr.cba.report.ReportItem;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.junit.Test;

package rules;



public class FieldsTest extends AbstractTest {

  public FieldsTest() {
    super("fields");
  }

  @Test
  public void test() {
    runTests();

    List<ReportItem> reportItems1 = getReportItems("fields1");
    assertEquals(2, reportItems1.size());
    assertTrue(matchClassName(reportItems1, "FieldsTestFile$C.class"));
    assertTrue(matchClassName(reportItems1, "FieldsTestFile$A.class"));

    List<ReportItem> reportItems2 = getReportItems("fields2").stream()
            .filter(r ->!r.getProperties().getOrDefault("Field name", "").contains("this"))
            .collect(Collectors.toList());
    assertEquals(8, reportItems2.size());

    List<ReportItem> reportItems3 = getReportItems("fields3");
    assertEquals(1, reportItems3.size());
    assertTrue(matchClassName(reportItems3, "FieldsTestFile$C.class"));

    List<ReportItem> reportItems4 = getReportItems("fields4");