package příklady;

import rup.česky.společně.P;
import rup.česky.tvary.Barva;
import rup.česky.tvary.AktivníPlátno;
import rup.česky.tvary.Kompresor;
import rup.česky.tvary.Přesouvač;


/*******************************************************************************
 * Testovací třída Terč_9Test slouží ke komplexnímu otestování
 * třídy ...
 *
 * @author    Rudolf Pecinovský
 * @version   1.00,  05.2004
 */
public class Terč_9Test extends junit.framework.TestCase
{
    private AktivníPlátno AP;
    private int           krok, k1, k2, k3;
    private Terč_9        t1;
    private Terč_9        t2;
    private Terč_9        t3;


//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vytvoří test se zadaným názvem.
     *
     * @param název  Název konstruovaného testu
     */
    public Terč_9Test(String název)
    {
        super( název );
    }



//== PŘÍPRAVA A ÚKLID PŘÍPRAVKU ================================================

    /***************************************************************************
     * Vytvoření přípravku (fixture), tj. sady objektů, s nimiž budou všechny
     * testy pracovat a která se proto vytvoří před spuštěním každého testu.
     */
    protected void setUp()
    {
        krok = 50;
        AP = AktivníPlátno.getPlátno();
        AP.odstraňVše();
        AP.setKrokRozměr( krok, 6, 6 );

        k1 = krok / 2;
        t1 = new Terč_9();

        k2 = 2*krok;
        t2 = new Terč_9( k2, k2, k2 );

        k3 = (int)(4.5 * krok);
        t3 = new Terč_9( k3, k3, 3*krok,
                         Barva.ČERVENÁ, Barva.ZELENÁ, Barva.AZUROVÁ );
        AP.přidej( t1 );
        AP.přidej( t2 );
        AP.přidej( t3 );
    }


    /***************************************************************************
     * Úklid po testu - tato metoda se spustí po vykonání každého testu.
     */
    protected void tearDown()
    {
    }


//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== VNOŘENÉ A VNITŘNÍ TŘÍDY ===================================================
//== VLASTNÍ TESTY =============================================================

    /***************************************************************************
     *
     * /
    public void testXXX()
    {
    }

/**/

    /***************************************************************************
     *
     */
    public void testPosuny()
    {
        for( int i=0;   i < 2;   i++ )
        {
            assertTrue( P.souhlas(getName(), "Přijde posun vpravo") );
            t1.posunVpravo();
            t2.posunVpravo();
            t3.posunVpravo();
            assertEquals( "\nx-ová souřadnice 1. terče", k1+krok, t1.getX() );
            assertEquals( "\ny-ová souřadnice 1. terče", k1,      t1.getY() );
            assertEquals( "\nx-ová souřadnice 2. terče", k2+krok, t2.getX() );
            assertEquals( "\ny-ová souřadnice 2. terče", k2,      t2.getY() );
            assertEquals( "\nx-ová souřadnice 3. terče", k3+krok, t3.getX() );
            assertEquals( "\ny-ová souřadnice 3. terče", k3,      t3.getY() );

            assertTrue( P.souhlas(getName(), "Přijde posun dolů") );
            t1.posunDolů();
            t2.posunDolů();
            t3.posunDolů();
            assertEquals( "\nx-ová souřadnice 1. terče", k1+krok, t1.getX() );
            assertEquals( "\ny-ová souřadnice 1. terče", k1+krok, t1.getY() );
            assertEquals( "\nx-ová souřadnice 2. terče", k2+krok, t2.getX() );
            assertEquals( "\ny-ová souřadnice 2. terče", k2+krok, t2.getY() );
            assertEquals( "\nx-ová souřadnice 3. terče", k3+krok, t3.getX() );
            assertEquals( "\ny-ová souřadnice 3. terče", k3+krok, t3.getY() );

            assertTrue( P.souhlas(getName(), "Přijde posun vlevo") );
            t1.posunVlevo();
            t2.posunVlevo();
            t3.posunVlevo();
            assertEquals( "\nx-ová souřadnice 1. terče", k1,      t1.getX() );
            assertEquals( "\ny-ová souřadnice 1. terče", k1+krok, t1.getY() );
            assertEquals( "\nx-ová souřadnice 2. terče", k2,      t2.getX() );
            assertEquals( "\ny-ová souřadnice 2. terče", k2+krok, t2.getY() );
            assertEquals( "\nx-ová souřadnice 3. terče", k3,      t3.getX() );
            assertEquals( "\ny-ová souřadnice 3. terče", k3+krok, t3.getY() );

            assertTrue( P.souhlas(getName(), "Přijde posun vzhůru") );
            t1.posunVzhůru();
            t2.posunVzhůru();
            t3.posunVzhůru();
            assertEquals( "\nx-ová souřadnice 1. terče", k1,      t1.getX() );
            assertEquals( "\ny-ová souřadnice 1. terče", k1,      t1.getY() );
            assertEquals( "\nx-ová souřadnice 2. terče", k2,      t2.getX() );
            assertEquals( "\ny-ová souřadnice 2. terče", k2,      t2.getY() );
            assertEquals( "\nx-ová souřadnice 3. terče", k3,      t3.getX() );
            assertEquals( "\ny-ová souřadnice 3. terče", k3,      t3.getY() );

            if( i == 1 )   break;

            assertTrue( P.souhlas(getName(), "Krok se zmenší na polovinu") );
            AP.setKrokRozměr( krok/2, 2*(AP.getŠířka()+1), 2*(AP.getVýška()+1) );

            assertTrue( P.souhlas(getName(), "Přijde posun vpravo o " + 2*krok) );
            t1.posunVpravo(krok);
            t2.posunVpravo(krok);
            t3.posunVpravo(krok);

            assertTrue( P.souhlas(getName(), "Přijde posun dolů o " + 2*krok) );
            t1.posunDolů(krok);     k1 += krok;
            t2.posunDolů(krok);     k2 += krok;
            t3.posunDolů(krok);     k3 += krok;
            assertEquals( "\nx-ová souřadnice 1. terče", k1,      t1.getX() );
            assertEquals( "\ny-ová souřadnice 1. terče", k1,      t1.getY() );
            assertEquals( "\nx-ová souřadnice 2. terče", k2,      t2.getX() );
            assertEquals( "\ny-ová souřadnice 2. terče", k2,      t2.getY() );
            assertEquals( "\nx-ová souřadnice 3. terče", k3,      t3.getX() );
            assertEquals( "\ny-ová souřadnice 3. terče", k3,      t3.getY() );

            krok /= 2;
        }
        assertTrue( P.souhlas(getName(), "V pořádku posunuto") );
    }


    /***************************************************************************
     *
     */
    public void testPřesouvače()
    {
        AP.odstraň( t2 );
        AP.odstraň( t3 );

        Přesouvač přesouvač3 = new Přesouvač(3);
        Přesouvač přesouvač9 = new Přesouvač(9);

        přesouvač3.přesunNa( t1, 150, 50 );
        assertEquals( "\nx-ová souřadnice 1. terče", 150, t1.getX() );
        assertEquals( "\ny-ová souřadnice 1. terče",  50, t1.getY() );
        přesouvač9.přesunNa( t1, 150, 150 );
        assertEquals( "\nx-ová souřadnice 1. terče", 150, t1.getX() );
        assertEquals( "\ny-ová souřadnice 1. terče", 150, t1.getY() );

        assertTrue( P.souhlas(getName(),
            "Objekt přesunut na [150;150]?") );

        přesouvač3 = přesouvač9 = null;
    }


    /***************************************************************************
     *
     */
    public void testHýbací()
    {
        AP.odstraň( t2 );
        AP.odstraň( t3 );

        int k2 = 25;
        int kr = 2*k2;

        AP.setKrokRozměr( kr, 5, 5 );
        t1.setPozice( 5*k2, 5*k2 );
        assertTrue( P.souhlas(getName(), "Umístěn ve středu plátna?") );
        t1.setRozměr( 4*kr, 4*kr );
        assertTrue( P.souhlas(getName(), "Zvětšen na rozměr 4×4 pole?") );
        t1.setRozměr( 2*kr, 2*kr );
        assertTrue( P.souhlas(getName(), "Změnšen na rozměr 2×2 pole?") );

        Kompresor pk = new Kompresor( 4 );
        pk.nafoukniNa( t1, 4*kr, 4*kr );
        pk.nafoukniNa( t1, kr,   kr );
    }
}

