<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<test-data
        xmlns="http://pmd.sourceforge.net/rule-tests"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://pmd.sourceforge.net/rule-tests https://pmd.sourceforge.io/rule-tests_1_0_0.xsd">

    <test-code>
        <description>All static fields must be immutable </description>
        <expected-problems>1</expected-problems>
        <code><![CDATA[
        import java.util.Map;
        import java.util.HashMap;
    public class MutableStatic {
      public static final Map f1 = new HashMap();
    }
         ]]></code>
    </test-code>
    <test-code>
        <description>Should not detect immutable static fields</description>
        <expected-problems>0</expected-problems>
        <code><![CDATA[
        import java.net.InetAddress;
    public class Immutable {
      public static final int f1 = 0;
      public static final String f2 = "hi";
      public static final InetAddress f3 = null;
    }
         ]]></code>
    </test-code>
    <test-code>
        <description>Should ignore fields marked Immutable</description>
        <expected-problems>0</expected-problems>
        <code><![CDATA[
        import org.apache.geode.annotations.Immutable;
        import java.util.Map;
        import java.util.Collections;
    public class IsImmutable {
      @Immutable
      public static final Map f4 = Collections.emptyMap();
    }
         ]]></code>
    </test-code>

    <test-code>
        <description>Should not be fooled by annotating previous field</description>
        <expected-problems>1</expected-problems>
        <code><![CDATA[
        import org.apache.geode.annotations.Immutable;
        import java.util.Map;
        import java.util.Collections;
    public class IsImmutable {
      @Immutable
      public static final Map f4 = Collections.emptyMap();
      public static final Map f5 = Collections.emptyMap();
    }
         ]]></code>
    </test-code>

    <test-code>
        <description>Should ingore logger </description>
        <expected-problems>0</expected-problems>
        <code><![CDATA[
        import org.apache.logging.log4j.Logger;
        import org.apache.geode.internal.logging.LogService;
    public class HasLogger {
      private static final Logger logger = LogService.getLogger();
    }
         ]]></code>
    </test-code>

    <test-code>
        <description>Should flag primitive arrays</description>
        <expected-problems>1</expected-problems>
        <code><![CDATA[
    public class HasArray {
      private static final int[] field = new int [] {1,2};
    }
         ]]></code>
    </test-code>
</test-data>
