package příklady;

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


/*******************************************************************************
 * Testovací třída XObdélníkTest slouží ke komplexnímu otestování třídy
 * XObdélník.
 *
 * @author    Rudolf Pecinovský
 * @version   1.00,  05.2004
 */
public class XObdélníkTest extends junit.framework.TestCase
{
    private AktivníPlátno AP;
    private int krok;
    private XObdélník xo1;

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

    /***************************************************************************
     * Vytvoří test se zadaným názvem.
     *
     * @param název  Název konstruovaného testu
     */
    public XObdélníkTest(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 );
        xo1  = new XObdélník();
        AP.přidej( xo1 );
    }


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


//== VLASTNÍ TESTY =============================================================

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

/**/

    /***************************************************************************
     *
     */
    public void testPosuny()
    {
        for( int i=0;   i < 2;   i++ )
        {
            assertTrue( P.souhlas(getName(), "Přijde posun vpravo") );
            xo1.posunVpravo();

            assertTrue( P.souhlas(getName(), "Přijde posun dolů") );
            xo1.posunDolů();

            assertTrue( P.souhlas(getName(), "Přijde posun vlevo") );
            xo1.posunVlevo();

            assertTrue( P.souhlas(getName(), "Přijde posun vzhůru") );
            xo1.posunVzhůru();

            if( i == 1 )   break;

            assertTrue( P.souhlas(getName(), "Krok se zmenší na polovinu") );
            AP.setKrokRozměr( krok /= 2, 8, 8 );

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

            assertTrue( P.souhlas(getName(), "Přijde posun dolů o " + 2*krok) );
            xo1.posunDolů(2*krok);
        }
        assertTrue( P.souhlas(getName(), "V pořádku posunuto") );
    }


    /***************************************************************************
     *
     */
    public void testPřesovače()
    {
        Přesouvač přesouvač3 = new Přesouvač(3);
        Přesouvač přesouvač9 = new Přesouvač(9);

        přesouvač3.přesunNa( xo1, 150, 50 );
        assertEquals( "\nx-ová souřadnice xobdélníku", 150, xo1.getX() );
        assertEquals( "\ny-ová souřadnice xobdélníku",  50, xo1.getY() );
        přesouvač9.přesunNa( xo1, 150, 150 );
        assertEquals( "\nx-ová souřadnice elipsy", 150, xo1.getX() );
        assertEquals( "\ny-ová souřadnice elipsy", 150, xo1.getY() );

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

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


    /***************************************************************************
     *
     */
    public void testHýbací()
    {
        int k2 = 25;
        int kr = 2*k2;

        AP.setKrokRozměr( kr, 6, 6 );
        xo1.setPozice( 3*kr, 3*kr );
        assertTrue( P.souhlas(getName(), "Umístěn ve středu plátna?") );
        xo1.setRozměr( 4*kr, 4*kr );
        assertTrue( P.souhlas(getName(), "Zvětšen na rozměr 4×4 pole?") );
        xo1.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( xo1, 4*kr, 4*kr );
        pk.nafoukniNa( xo1, kr,   kr );
    }
}

