/*******************************************************************************
 * Testovaci trida VýtahDTest slouží ke komplexnímu otestování
 * třídy VýtahD
 *
 * @author    Rudolf Pecinovský
 * @author    jméno autora
 * @version   0.00.000,  0.0.2004
 */
public class VýtahDTest extends junit.framework.TestCase
{
    private static AktivníPlátno AP = AktivníPlátno.getPlátno();

    private int krok = 50;      //Krok aktivního plátna
    private int šířka = 5;      //Počet sloupců aktivního plátna
    private int výška = 5;      //Počet řádků aktivního plátna
    
    private VýtahD v1;        //Výtah v prvním sloupci
    private VýtahD v3;        //Výtah ve třetím sloupci
    
    private Elipsa      k;      //Kruhový pasažér
    private Trojúhelník t;      //Trojúhelníkový pasažér



//##############################################################################
//== 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.odstraňVše();
        AP.setKrokRozměr( krok, šířka, výška );
        
        k = new Elipsa     ( x(0), y(1), krok, krok, Barva.ČERVENÁ );
        AP.přidej( k );
        t = new Trojúhelník( x(2), y(4), krok, krok, Barva.ČERVENÁ );
        AP.přidej( t );
        
        v1 = new VýtahD( 1 );
        v3 = new VýtahD( 3, 4, Barva.MODRÁ );
    }


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


//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================

    /***************************************************************************
     * Otestuje, jestli je zadaný objekt ve správěném políčku.
     * 
     * @param ip       Odkaz na objekt, jehož souřqadnice testujeme.
     * @param sloupec  Sloupec, v němž se má prověřovaný objekt nacházet.
     * @param řádek    Řádek, v němž se má prověřovaný objekt nacházet.
     */
    public static void souřadnice( IPosuvný ip, int sloupec, int patro )
    {
        assertEquals( "Nesouhlasí vodorovná souřadnice objektu " + ip + ":", 
                      x(sloupec), ip.getX() );
        assertEquals( "Nesouhlasí svislá souřadnice objektu " + ip + ":", 
                      y(patro), ip.getY() );
    }


    /***************************************************************************
     * Vrátí x-ovou souřadnici políček v zadaném sloupci;
     */
    public static int x( int sloupec )
    {
        return sloupec * AP.getKrok(); 
    }
    

    /***************************************************************************
     * Vrátí y-ovou souřadnici políček v zadaném řádku;
     */
    public static int y( int patro )
    {
        return (AP.getVýška() - patro - 1) * AP.getKrok();
    }
    

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

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

    /***************************************************************************
     * Testuje správné nastavení počátečních podmínek. 
     * Předpokládá přitom, že metody getX() a getY() fungují u výtahů správně.
     */
    public void testInicializace()
    {
        souřadnice( v1, 1, 0 );
        souřadnice( v3, 3, 0 );
    }
    

    /***************************************************************************
     * Otestuje, že oba výtahy umí správně dojet do 3. patra
     * a sjet zase zpět do přízemí.     
     */
    public void testPrázdnýVýtahDoPatra()
    {
        v1.doPatra( 3 );    souřadnice( v1, 1, 3 );
        v3.doPatra( 3 );    souřadnice( v3, 3, 3 );
        v1.doPatra( 0 );    souřadnice( v1, 1, 0 );
        v3.doPatra( 0 );    souřadnice( v3, 3, 0 );
    }
    

    /***************************************************************************
     * Testuje schopnost výtahu přemístit nastupující pasažéry do výtahu a
     * pak je vysadit na sousední políčko v zadném směru.
     */
    public void testNástupVýstup()
    {
        v1.nástup( k );    souřadnice( k, 1, 0 );
        v3.nástup( t );    souřadnice( t, 3, 0 );
        v1.výstupVlevo();  souřadnice( k, 0, 0 );
        v3.výstupVpravo(); souřadnice( t, 4, 0 );
    }
    

    /***************************************************************************
     * Testuje schopnost výtahu převézt pasažery do požadovaného patra.
     */
    public void testPřevozPasažera()
    {
        v1.nástup( k );
        v1.doPatra( 2 );
        v1.výstupVlevo();
        souřadnice( k, 0, 2 );
        
        v3.nástup( t );
        v3.doPatra( 4 );
        v3.výstupVpravo(); 
        souřadnice( t, 4, 4 );
    }
    

    /***************************************************************************
     * Testuje metody zabezpečující kompletní obsluhu pasažera, 
     * tj. dojetí do jeho patra, nástup, převezení do požadovaného patra
     * a vysazení pasažera na požadovanou stranu.
     */
    public void testOdvez()
    {
        v1.odvezVpravo( k, 3 );   
        souřadnice( v1, 1, 3 );  souřadnice( k, 2, 3 );
        
        v3.odvezVlevo ( t, 1 );
        souřadnice( v3, 3, 1 );  souřadnice( t, 2, 1 );
        
        v3.odvezVpravo( k, 0 );
        souřadnice( v3, 3, 0 );  souřadnice( k, 4, 0 );
    }
    
}

