/*******************************************************************************
 * Testovací třída Strom_5Test.
 * = dědí od třídy Strom_4Test:
 *    - že se stromy umějí nakreslit a smazat 
 *    - základní bezparametrické posuny 
 *    - test posunů po změně kroku
 *    - test Zarámuj  
 *    - test PočítáníInstancí
 * = sama přidává
 *    - test Obrázek - testuje metodu, využívající konstruktor pracující
 *      s přepravkou Pozice  
 *
 * @author     Rudolf Pecinovský
 * @version    2.01, duben 2004
 */
public class Strom_5Test extends junit.framework.TestCase
{
    private Strom_5 strom1;
    private Strom_5 strom2;
    private Strom_5 strom3;
    private Strom_5 strom4;


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

    /***************************************************************************
     * Vytvoří test se zadaným názvem.
     *
     * @param název  Název konstruovaného testu
     */
    public Strom_5Test(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()
    {
        Plátno plátno = Plátno.getPlátno();
        plátno.setRozměr( 300, 300 );
        strom1 = new Strom_5();                        
        strom2 = new Strom_5( 25, 150);                
        strom3 = new Strom_5(100, 100, 100,  90);      
        strom4 = new Strom_5(200,   0, 100, 300, 3, 5);
    }


    /***************************************************************************
     * Úklid po testu - tato metoda se spustí po vykonání každého testu.
     * Bezparametrický konstruktor pro testovací třídu StromTest
     */
    protected void tearDown()
    {
    }


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

    public void testNakresliSmaž()
    {
        strom1.smaž();
        strom2.smaž();
        strom3.smaž();
        strom4.smaž();
        assertEquals(true, P.souhlas("Stromy smazány?"));
        strom1.nakresli();
        strom2.nakresli();
        strom3.nakresli();
        strom4.nakresli();
        assertEquals(true, P.souhlas(
            "Strom 1: x=0,   y=  0, š=100, v=150, šSt/šKm=10, vSt/vKo=3\n" +
            "Strom 2: x= 25, y=150, š=100, v=150, šSt/šKm=10, vSt/vKo=3\n" +
            "Strom 3: x=100, y=100, š=100, v= 90, šSt/šKm=10, vSt/vKo=3\n" +
            "Strom 4: x=200, y=100, š=100, v=300, šSt/šKm= 3, vSt/vKo=5\n" +
            "\nPozice, rozměry a poměry kmen a korun souhlasí?"));
    }

    public void testPosuny()
    {
        P.zpráva("Následuje posun vpravo");
        strom4.posunVpravo();
        strom3.posunVpravo();
        strom2.posunVpravo();
        strom1.posunVpravo();
        assertEquals(true, 
            P.souhlas("Posun vpravo vpořádku?\n\nNásleduje posun vlevo"));
        strom1.posunVlevo();
        strom2.posunVlevo();
        strom3.posunVlevo();
        strom4.posunVlevo();
        assertEquals(true, 
            P.souhlas("Posun vlevo vpořádku?\n\nNásleduje posun vzhůru"));
        strom1.posunVzhůru();
        strom3.posunVzhůru();
        strom4.posunVzhůru();
        strom2.posunVzhůru();
        assertEquals(true, 
            P.souhlas("Posun vzhůru vpořádku?\n\nNásleduje posun dolů"));
        strom2.posunDolů();
        strom4.posunDolů();
        strom3.posunDolů();
        strom1.posunDolů();
        assertEquals(true, 
            P.souhlas("Posun dolů vpořádku?"));
    }
    
    public void testKrok()
    {
        P.zpráva("Následuje změna kroku na 10");
        Strom_5.setKrok(10);
        testPosuny();
    }
        
    public void testZarámuj()
    {
        strom1.zarámuj();
        assertTrue( P.souhlas("Implicitní strom zarámován?") );
        strom1.smaž();
        strom3.zarámuj();
        assertTrue( P.souhlas("Třetí strom zarámován?") );
        strom3.smaž();
        strom4.zarámuj();
        assertTrue( P.souhlas("Čtvrtý strom zarámován?") );
    }

    public void testPočítáníInstancí()
    {
        assertTrue( P.souhlas( "Test počítání instancí a převodu na řetězec\n" +
            strom1 + "\n" + strom2 + "\n" + strom3 + "\n" + strom4 + "\n" +
            "\n\nSouhlasi?"));
    }

    public void testObrázek()
    {
        Strom_5.obrázek( new Oblast (100, 100, 100, 100), 10 );
        assertTrue( P.souhlas("V pořádku na středu zarámovaný strom?"));
    }


}

