<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
    "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
    "https://checkstyle.org/dtds/configuration_1_3.dtd">

<!--
  Checkstyle configuration for the demo API server.

  Formatting (indentation, wrapping, spacing) is owned by Spotless /
  google-java-format (AOSP). Checkstyle here enforces the structural rules
  that a formatter does not: import hygiene, brace usage, naming, and a few
  banned constructs the architecture forbids (see docs/PROMT.md §8).
-->
<module name="Checker">
    <property name="charset" value="UTF-8"/>
    <property name="severity" value="warning"/>
    <property name="fileExtensions" value="java"/>

    <!-- No tabs. -->
    <module name="FileTabCharacter">
        <property name="eachLine" value="true"/>
    </module>

    <!-- Banned outputs / types, enforced independently of ArchUnit for fast feedback. -->
    <module name="RegexpSingleline">
        <property name="format" value="System\.(out|err)\.print"/>
        <property name="message" value="Do not use System.out/System.err; use a logger."/>
    </module>

    <module name="TreeWalker">
        <!-- Import hygiene. -->
        <module name="AvoidStarImport"/>
        <module name="RedundantImport"/>
        <module name="UnusedImports">
            <property name="processJavadoc" value="true"/>
        </module>
        <module name="IllegalImport">
            <property name="illegalPkgs" value="sun, com.sun"/>
        </module>

        <!-- Banned types. -->
        <module name="IllegalImport">
            <property name="illegalClasses" value="java.util.Date, java.sql.Date"/>
        </module>

        <!-- Braces everywhere. -->
        <module name="NeedBraces"/>

        <!-- Naming conventions. -->
        <module name="PackageName">
            <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
        </module>
        <module name="TypeName"/>
        <!-- Allow the mandated snake_case test convention should_<expected>_when_<condition>. -->
        <module name="MethodName">
            <property name="format" value="^[a-z][a-zA-Z0-9_]*$"/>
        </module>
        <!-- UPPER_SNAKE constants, plus the conventional slf4j logger names. -->
        <module name="ConstantName">
            <property name="format"
                      value="^(log|logger|[A-Z][A-Z0-9]*(_[A-Z0-9]+)*)$"/>
        </module>
        <module name="LocalVariableName"/>
        <module name="MemberName"/>
        <module name="ParameterName"/>

        <!-- Correctness smells. -->
        <module name="EmptyCatchBlock">
            <property name="exceptionVariableName" value="expected|ignored"/>
        </module>
        <module name="EqualsHashCode"/>
        <module name="SimplifyBooleanExpression"/>
        <module name="SimplifyBooleanReturn"/>
        <module name="MissingOverride"/>
    </module>
</module>
