/*******************************************************************************
 * Testovací třída Strom_6cTest.
 * 
 * Oproti třídě Strom_6bTest obsahuje následující změny:
 *  - Přibyl testSetRozměr()
 *
 * @author     Rudolf Pecinovský
 * @version    2.01, duben 2004
 */
public class Strom_6cTest extends junit.framework.TestCase
{
    private AktivníPlátno ap;
    private Strom_6c strom1;
    private Strom_6c strom2;
    private Strom_6c strom3;
    private Strom_6c strom4;

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

    /***************************************************************************
     * Vytvoří test se zadaným názvem.
     *
     * @param název  Název konstruovaného testu
     */
    public Strom_6cTest(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()
    {
        ap = AktivníPlátno.getPlátno();
        ap.setKrokRozměr( 50, 6, 6 );
        ap.setMřížka(true);
        ap.odstraňVše();
        strom1 = new Strom_6c();                        
        strom2 = new Strom_6c( 25, 150);                
        strom3 = new Strom_6c(100, 100, 100,  90);      
        strom4 = new Strom_6c(200,   0, 100, 300, 3, 5);
        strom1.nakresli();
        strom2.nakresli();
        strom3.nakresli();
        strom4.nakresli();
    }


    /***************************************************************************
     * Ú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");
        ap.setKrokRozměr(10, 30, 30);
        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_6c.obrázek( new Oblast (100, 100, 100, 100), 10 );
        assertTrue( P.souhlas("V pořádku na středu zarámovaný strom?"));
    }

    public void testAlej()
    {
        ap.odstraňVše();
        Strom_6c.alej();
        assertTrue( P.souhlas("Alej nakreslena správně?"));
    }

    public void testStatickéZarámuj()
    {
        ap.odstraňVše();
        Strom_6c.zarámuj( 200, 300 );
        assertTrue( P.souhlas("Strom zarámován v okně 200×300?"));
    }

    public void testPřesouvání()
    {
            Přesouvač přes1 = new Přesouvač();
            přes1.přesunO(strom3, -100, -100);

            Přesouvač přes5 = new Přesouvač(5);
            přes5.přesunO(strom1, 200, 0);
            přes5.přesunNa(strom4, 150, 200);
    }

    public void testSetRozměr()
    {
        ap.setKrokRozměr(10, 30, 30);
        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=  0, š=100, v=300, šSt/šKm= 3, vSt/vKo=5\n" +
            "\nPozice, rozměry a poměry kmenů a korun souhlasí?"));
        strom1.setRozměr( 11, 19 );
        strom2.setRozměr( 23, 29 );
        strom3.setRozměr( 27, 37 );
        strom4.setRozměr( 13, 17 );
        assertTrue( P.souhlas(
            "Strom 1: x=0,   y=  0, š=11, v=19, šSt/šKm=10, vSt/vKo=3\n" +
            "Strom 2: x=25,  y=150, š=23, v=29, šSt/šKm=10, vSt/vKo=3\n" +
            "Strom 3: x=100, y=100, š=27, v=37, šSt/šKm=10, vSt/vKo=3\n" +
            "Strom 4: x=200, y=  0, š=13, v=17, šSt/šKm= 3, vSt/vKo=5\n" +
            "\nPozice, rozměry a poměry kmenů a korun souhlasí?"));
        strom1.setRozměr( 100, 150 );
        strom2.setRozměr( 100, 150 );
        strom3.setRozměr( 100,  90 );
        strom4.setRozměr( 100, 300 );
        assertTrue( 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=  0, š=100, v=300, šSt/šKm= 3, vSt/vKo=5\n" +
            "\nPozice, rozměry a poměry kmenů a korun souhlasí?"));
    }

}

