

import java.util.NoSuchElementException;
import junit.framework.Assert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.WebDriver;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.openqa.selenium.Keys;

/**
 *
 * @author Andre Heidt
 */
public class HangmanTests {

    public HangmanTests() {
    }
    static WebDriver driver;

    @BeforeClass
    public static void setUp() {
        //Erzeugt neue Instanz des Browser Treibers
        driver = new FirefoxDriver();
        //driver = new InternetExplorerDriver();
        //driver = new HtmlUnitDriver();
        //driver = new ChromeDriver();
    }

    @AfterClass
    public static void tearDown() {
        //beendet Browser
        driver.quit();
    }

    @Test
    public void WortAnlegen1() {
        WebElement element;

        driver.get("http://localhost:8080/MyJSFProject/faces/index.xhtml");
        element = driver.findElement(By.id("homeform:eingabe"));
        element.click();
        element = driver.findElement(By.id("eingabeform:eingabetext"));
        element.sendKeys("Testwort1");
        driver.findElement(By.id("eingabeform:eintragen")).click();

        driver.get("http://localhost:8080/MyJSFProject/faces/uebersicht.xhtml");
        Assert.assertTrue(driver.getPageSource().contains("Testwort1"));
    }

    @Ignore("Fall tritt bei manueller Benutzung nicht ein")
    @Test
    public void WortAnlegen2() {
        WebElement element;

        driver.get("http://localhost:8080/MyJSFProject/faces/index.xhtml");
        element = driver.findElement(By.id("homeform:eingabe"));
        element.click();
        element = driver.findElement(By.id("eingabeform:eingabetext"));
        element.sendKeys("Testwort2");
        element.submit();

        driver.get("http://localhost:8080/MyJSFProject/faces/uebersicht.xhtml");
        Assert.assertTrue(driver.getPageSource().contains("Testwort2"));
    }

    @Test
    public void WortAnlegen3() {
        WebElement element;

        driver.get("http://localhost:8080/MyJSFProject/faces/index.xhtml");
        element = driver.findElement(By.id("homeform:eingabe"));
        element.click();
        element = driver.findElement(By.id("eingabeform:eingabetext"));
        element.sendKeys("Testwort3", Keys.ENTER);

        driver.get("http://localhost:8080/MyJSFProject/faces/uebersicht.xhtml");
        Assert.assertTrue(driver.getPageSource().contains("Testwort3"));
    }

    @Test
    public void SpielVersuche1() {
        WebElement eingabefeld;
        WebElement anzahlVersuche;
        String erwartet;
        String tatsaechlich;

        driver.get("http://localhost:8080/MyJSFProject/faces/index.xhtml");
        //klick auf Button "Spielen"
        driver.findElement(By.id("homeform:spiel")).click();
        //Finde Element in Tabelle mit id spielform:spielfeld in der 2. Reihe 1. Spalte
        anzahlVersuche = driver.findElement(By.xpath("//table[@id='spielform:spielfeld']//tr[2]/td[1]"));
        erwartet = "0";
        tatsaechlich = anzahlVersuche.getText();
        //Spiel abbrechen
        driver.findElement(By.id("spielform:abbruch")).click();
        Assert.assertEquals(tatsaechlich, erwartet);
    }

    @Test
    public void SpielVersuche2() {
        WebElement eingabefeld;
        WebElement anzahlVersuche;
        String erwartet;
        String tatsaechlich;

        driver.get("http://localhost:8080/MyJSFProject/faces/index.xhtml");
        //klick auf Button "Spielen"
        driver.findElement(By.id("homeform:spiel")).click();

        WebElement versuchButton;
        for (int i = 0; i < 10; i++) {
            versuchButton = driver.findElement(By.id("spielform:versuchen"));
            versuchButton.click();
        }
        //Finde Element in Tabelle mit id spielform:spielfeld in der 2. Reihe 1. Spalte
        anzahlVersuche = driver.findElement(By.xpath("//table[@id='spielform:spielfeld']//tr[2]/td[1]"));
        erwartet = "10";
        tatsaechlich = anzahlVersuche.getText();
        //Spiel abbrechen
        driver.findElement(By.id("spielform:abbruch")).click();
        Assert.assertEquals(tatsaechlich, erwartet);
    }

    @Test
    public void SpielVersuche3() {
        WebElement eingabefeld;
        WebElement anzahlVersuche;
        String erwartet;
        String tatsaechlich;

        driver.get("http://localhost:8080/MyJSFProject/faces/index.xhtml");
        //klick auf Button "Spielen"
        driver.findElement(By.id("homeform:spiel")).click();


        for (int i = 0; i < 10; i++) {
            eingabefeld = driver.findElement(By.id("spielform:entry"));
            eingabefeld.sendKeys(Keys.ENTER);
        }
        //Finde Element in Tabelle mit id spielform:spielfeld in der 2. Reihe 1. Spalte
        anzahlVersuche = driver.findElement(By.xpath("//table[@id='spielform:spielfeld']//tr[2]/td[1]"));
        erwartet = "10";
        tatsaechlich = anzahlVersuche.getText();
        //Spiel abbrechen
        driver.findElement(By.id("spielform:abbruch")).click();

        Assert.assertEquals(tatsaechlich, erwartet);
    }

    @Test
    public void SpielVersuche4() {
        WebElement eingabefeld;
        WebElement anzahlVersuche;
        String erwartet;
        String tatsaechlich;

        driver.get("http://localhost:8080/MyJSFProject/faces/index.xhtml");
        //klick auf Button "Spielen"
        driver.findElement(By.id("homeform:spiel")).click();

        WebElement versuchButton;
        for (int i = 0; i < 10; i++) {
            //versuch mit Browserfunktion "zurueck" Anzahl Versuche zu beeinflussen
            if (i == 5) {
                driver.navigate().back();
            }
            versuchButton = driver.findElement(By.id("spielform:versuchen"));
            versuchButton.click();
        }
        //Finde Element in Tabelle mit id spielform:spielfeld in der 2. Reihe 1. Spalte
        anzahlVersuche = driver.findElement(By.xpath("//table[@id='spielform:spielfeld']//tr[2]/td[1]"));
        erwartet = "10";
        tatsaechlich = anzahlVersuche.getText();
        //Spiel abbrechen
        driver.findElement(By.id("spielform:abbruch")).click();
        Assert.assertEquals(tatsaechlich, erwartet);
    }

    @Test
    public void SpielGewinn1() {
        WebElement eingabefeld;
        StringBuilder versuch;
        Boolean sieg = false;
        int i = -1;

        driver.get("http://localhost:8080/MyJSFProject/faces/index.xhtml");
        //klick auf Button "Spielen"
        driver.findElement(By.id("homeform:spiel")).click();

        try {
            //versuche 1 mal mehr als Woerter im Wortspeicher - bei sieg, wird eingabefeld nicht mehr gefunden
            //und die exception geworfen
            for (i = 0; i < 4; i++) {
                eingabefeld = driver.findElement(By.id("spielform:entry"));
                versuch = new StringBuilder("Testwort");
                versuch.append(Integer.toString(i + 1));
                eingabefeld.sendKeys(versuch.toString(), Keys.ENTER);
            }
        } catch (Exception expected) {
            sieg = true;
        }

        if (sieg && i > -1) {
            //vergleich angezeigte Anzahl Versuche mit tatsaechlich benoetigten
            WebElement versuche = driver.findElement(By.xpath("//table[@id='spielform:siegfeld']//tr[2]/td[1]"));
            Assert.assertEquals(Integer.toString(i), versuche.getText());
        } else {
            Assert.fail("Testwort konnte nicht erraten werden");
        }
    }
}
