package com.puppycrawl.tools.checkstyle.checks.indentation.indentation; //indent:0 exp:0

import java.io.Closeable; //indent:0 exp:0
import java.util.stream.Stream; //indent:0 exp:0

/**                                                                           //indent:0 exp:0
 * This test-input is intended to be checked using following configuration:   //indent:1 exp:1
 *                                                                            //indent:1 exp:1
 * arrayInitIndent = 4                                                        //indent:1 exp:1
 * basicOffset = 4                                                            //indent:1 exp:1
 * braceAdjustment = 0                                                        //indent:1 exp:1
 * caseIndent = 4                                                             //indent:1 exp:1
 * forceStrictCondition = false                                               //indent:1 exp:1
 * lineWrappingIndentation = 4                                                //indent:1 exp:1
 * tabWidth = 4                                                               //indent:1 exp:1
 * throwsIndent = 4                                                           //indent:1 exp:1
 *                                                                            //indent:1 exp:1
 * @author  jrichard                                                         //indent:1 exp:1
 */                                                                           //indent:1 exp:1
public class InputIndentationValidBlockIndent { //indent:0 exp:0

    /** Creates a new instance of InputValidBlockIndent */ //indent:4 exp:4
    public InputIndentationValidBlockIndent() { //indent:4 exp:4
    } //indent:4 exp:4

    public void method1() { //indent:4 exp:4

        { } //indent:8 exp:8
        { //indent:8 exp:8
        } //indent:8 exp:8
        { //indent:8 exp:8
            int var = 3; //indent:12 exp:12

            var += 3; //indent:12 exp:12
        } //indent:8 exp:8


        {  int var = 5; } //indent:8 exp:8

        { //indent:8 exp:8
            int var = 3; //indent:12 exp:12

            var += 3; //indent:12 exp:12

            { //indent:12 exp:12
                int innerVar = 4; //indent:16 exp:16

                innerVar += var; //indent:16 exp:16
            } //indent:12 exp:12
        } //indent:8 exp:8

    } //indent:4 exp:4

    static { int var = 4; } //indent:4 exp:4


    static { //indent:4 exp:4
        int var = 4;  //indent:8 exp:8
    } //indent:4 exp:4

    static  //indent:4 exp:4
    { //indent:4 exp:4
        int var = 4;  //indent:8 exp:8
    } //indent:4 exp:4

    { int var = 4; } //indent:4 exp:4


    { //indent:4 exp:4
        int var = 4;  //indent:8 exp:8
    } //indent:4 exp:4

    { //indent:4 exp:4
        int var = 4;  //indent:8 exp:8
    } //indent:4 exp:4


} //indent:0 exp:0

enum EquivalenceTester { //indent:0 exp:0
    /** //indent:4 exp:4
     * An equivalenster that decides based on {@link Object#equals(Object) equals}. //indent:5 exp:5
     */ //indent:5 exp:5
    OBJECT_ATTRIBUTES { //indent:4 exp:4
        /** //indent:8 exp:8
         * {@inheritDoc} //indent:9 exp:9
         */ //indent:9 exp:9
        public boolean areEqual( final Object first, final Object second ) { //indent:8 exp:8
            return true; //indent:12 exp:12
        } //indent:8 exp:8

        /** //indent:8 exp:8
         * {@inheritDoc} //indent:9 exp:9
         */ //indent:9 exp:9
        public int hashCode( final Object target ) { //indent:8 exp:8
            return 1; //indent:12 exp:12
        } //indent:8 exp:8
    }, //indent:4 exp:4

    /** //indent:4 exp:4
     * An equivalence tester that decides based on {@code ==}. //indent:5 exp:5
     */ //indent:5 exp:5
    OBJECT_IDENTITIES //indent:4 exp:4
    { //indent:4 exp:4
        /** //indent:8 exp:8
         * {@inheritDoc} //indent:9 exp:9
         */ //indent:9 exp:9
        public boolean areEqual( final Object first, final Object second ) { //indent:8 exp:8
            return first == second; //indent:12 exp:12
        } //indent:8 exp:8

        /** //indent:8 exp:8
         * {@inheritDoc} //indent:9 exp:9
         */ //indent:9 exp:9
        public int hashCode( final Object target ) { //indent:8 exp:8
            return System.identityHashCode( target ); //indent:12 exp:12
        } //indent:8 exp:8
    }; //indent:4 exp:4

    /** //indent:4 exp:4
     * Tells whether the two given objects are considered equivalent. //indent:5 exp:5
     * //indent:5 exp:5
     * @param first first comparand //indent:5 exp:5
     * @param second second comparand //indent:5 exp:5
     * @return whether {@code first} and {@code second} are considered equivalent //indent:5 exp:5
     */ //indent:5 exp:5
    public abstract boolean areEqual( Object first, Object second ); //indent:4 exp:4

    /** //indent:4 exp:4
     * Computes a hash code for the given object. //indent:5 exp:5
     * //indent:5 exp:5
     * @param target object to compute a hash for //indent:5 exp:5
     * @return the computed hash //indent:5 exp:5
     */ //indent:5 exp:5
    public abstract int hashCode( Object target ); //indent:4 exp:4
} //indent:0 exp:0

class bug1251988 //indent:0 exp:0
{ //indent:0 exp:0
    private int a; //indent:4 exp:4

    // non static initializer //indent:4 exp:4
    { //indent:4 exp:4
        if (a == 1) //indent:8 exp:8
        { //indent:8 exp:8
        } //indent:8 exp:8
    } //indent:4 exp:4
} //indent:0 exp:0

class bug1260079 //indent:0 exp:0
{ //indent:0 exp:0
    public bug1260079() //indent:4 exp:4
    { //indent:4 exp:4
        new Thread() //indent:8 exp:8
        { //indent:8 exp:8
            public void run() //indent:12 exp:12
            { //indent:12 exp:12
                System.identityHashCode("ran"); //indent:16 exp:16
            } //indent:12 exp:12
        }.start(); //indent:8 exp:8
    } //indent:4 exp:4
} //indent:0 exp:0

class bug1336737 { //indent:0 exp:0
    private static enum Command { //indent:4 exp:4
        IMPORT("import"), //indent:8 exp:8
        LIST("list"); //indent:8 exp:8
        private final String c; //indent:8 exp:8
        Command(String c) { this.c = c; } //indent:8 exp:8
        public String toString() { return c; } //indent:8 exp:8
    } //indent:4 exp:4
} //indent:0 exp:0

class AnonymousClassWithInitializer { //indent:0 exp:0
    void create() { //indent:4 exp:4
        new Object() { //indent:8 exp:8
            { //indent:12 exp:12
                new Object(); //indent:16 exp:16
            } //indent:12 exp:12
        }; //indent:8 exp:8
    } //indent:4 exp:4
} //indent:0 exp:0

class OneLineCode { //indent:0 exp:0
    void block() { //indent:4 exp:4
        { if (true) return; }  //indent:8 exp:8
    } //indent:4 exp:4
    void lambda() { //indent:4 exp:4
        Stream.of(false).map(x -> { if (x) return 0; else return 1; }); //indent:8 exp:8
    } //indent:4 exp:4
    void tryCatchDoWhile(Closeable is) throws Exception { //indent:4 exp:4
        if (is != null) { try { is.close(); } catch (Exception e) {} } //indent:8 exp:8
        if (is != null) { do { is.close(); } while (is != null); } //indent:8 exp:8
    } //indent:4 exp:4
} //indent:0 exp:0
