/*******************************************************************************
 * Třída má za úkol otestovat chování inkrementačních a dekrementačních
 * operátorů.
 */
public class Xkrementy_4
{
    //i, j, k jsou definovány jako statické atributy,
    //aby je metoda test mohla sdílet s metodou zobraz
    private static int     i, j, k;

    //Atribut vše slouží jako akumulátor vytvářeného řetězce
    private static String  vše = "";


    /***************************************************************************
     * Metoda ověří, že se operátory chovají tak,
     * jak je v učebnici uvedeno v tabulce.
     */
    public static void test()
    {
        //Statické atributy jsou na počátku nulové => stačí nastavit i
        i = 1;              zobraz( "Počáteční hodnoty" );
        j = i++;            zobraz( "Po (j = i++)" );
        k = ++i;            zobraz( "Po (k = ++i)" );
        k = i-- + j--;      zobraz( "Po (k = i-- + j--)" );
        k = --i + --j;      zobraz( "Po (k = --i + --j)" );
        P.zpráva( vše );
    }


    /***************************************************************************
     * Pomocná metoda, která zobrazí poslední akci a
     * vytiskne pomocí metody P.zpráva() hodnoty všech číselných atributů.
     * Zaroveň přidá tištěný text do souhrného řetězce,
     * který se bude tisknout na závěr.
     */
    private static void zobraz( String text )
    {
        text = text + ":  i=" + i + ",  j=" + j + ",  k=" + k;
        P.zpráva( text );
        vše = vše + "\n" + text;
    }


    /***************************************************************************
     * Parametrická verze metody test umožnující zadání výchozích hodnot
     * proměnných a nepoužívající atributy,
     * protože je nahrazuje je lokálními proměnnými.
     */
    public static void test( int i, int j, int k )
    {
        String vše;
        i = 1;            vše  = zobraz( i, j, k, "Počáteční hodnoty");
        j = i++;          vše += '\n' + zobraz( i, j, k, "Po (j = i++)" );
        k = ++i;          vše += '\n' + zobraz( i, j, k, "Po (k = ++i)" );
        k = i-- + j--;    vše += '\n' + zobraz( i, j, k, "Po (k = i-- + j--)" );
        k = --i + --j;    vše += '\n' + zobraz( i, j, k, "Po (k = --i + --j)" );
        P.zpráva( vše );
    }


    /***************************************************************************
     * Pomocná metoda pro parametrickou verzi metody test.
     * Zobrazí poslední akci a vytiskne pomocí metody P.zpráva()
     * hodnoty všech číselných parametrů.
     *
     * @return Vytištěný řetězec.
     */
    private static String zobraz( int i, int j, int k, String text )
    {
        text = text + ":  i=" + i + ",  j=" + j + ",  k=" + k;
        P.zpráva( text );
        return text;
    }


    /***************************************************************************
     * Bezparametrická verze testu, která své výsledky nezobrazuje
     * v dialogovém okně, ale posílá je na standardní výstup.
     */
    public static void ttest()
    {
        System.out.println("\n===============================================");
        i = 1;              tiskni( "start");
        j = i++;            tiskni( "j = i++" );
        k = ++i;            tiskni( "k = ++i");
        k = i-- + j--;      tiskni( "k = i-- + j--");
        k = --i + --j;      tiskni( "k = --i + --j");
    }


    /***************************************************************************
     * Pomocná metoda, která vytiskne zadanou akci na standarní výstup.
     */
    private static void tiskni( String akce )
    {
        //Dvojice znaků \t v následujícím příkazu označuje znak tabulátoru
        System.out.println( "Po (" + akce + "):\ti="
                            + i + ",  j=" + j + ",  k=" + k );
    }


    /***************************************************************************
     * Bezparametrická verze testu, která své výsledky nezobrazuje
     * v dialogovém okně, ale posílá je na standardní výstup.
     */
    public static void etest()
    {
        System.err.println("\nEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE");
        i = 1;              etiskni( "E-start");
        j = i++;            etiskni( "j = i++" );
        k = ++i;            etiskni( "k = ++i");
        k = i-- + j--;      etiskni( "k = i-- + j--");
        k = --i + --j;      etiskni( "k = --i + --j");
    }


    /***************************************************************************
     * Pomocná metoda, která vytiskne zadanou akci na standarní výstup.
     */
    private static void etiskni( String akce )
    {
        //Dvojice znaků \t v následujícím příkazu označuje znak tabulátoru
        System.err.println( "EPo (" + akce + "):\ti="
                            + i + ",  j=" + j + ",  k=" + k );
    }

}


