/*
* The MIT License
*
* Copyright 2014 Ryan Gilera ryangilera@gmail.com.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.github.daytron.flipit.map.creator;
import com.github.daytron.flipit.map.creator.utility.GlobalSettings;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import static java.util.concurrent.TimeUnit.SECONDS;
import java.util.concurrent.TimeoutException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyCodeCombination;
import javafx.stage.Stage;
import org.junit.After;
import org.junit.AfterClass;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.loadui.testfx.Assertions;
import org.loadui.testfx.controls.Commons;
import org.testfx.util.WaitForAsyncUtils;
import org.testfx.api.FxRobot;
import org.testfx.api.FxToolkit;
/**
* Test class for testing the interaction with user control area
* @author Ryan Gilera
*/
@Category({AllTest.class})
public class UITest extends FxRobot {
private MainApp app;
public static Stage primaryStage;
public UITest() {
}
@BeforeClass
public static void setUpClass() {
try {
// Start the Toolkit and block until the primary Stage was retrieved.
primaryStage = FxToolkit.registerPrimaryStage();
} catch (TimeoutException ex) {
Logger.getLogger(UITest.class.getName()).log(Level.SEVERE, null, ex);
}
}
@AfterClass
public static void tearDownClass() {
}
@Before
public void setUp() {
try {
// Construct the Application and call start() with the primary Stage.
this.app = (MainApp) FxToolkit.setupApplication(MainApp.class);
// Wait for the primary Stage to be shown by start().
WaitForAsyncUtils.waitFor(10, TimeUnit.SECONDS, primaryStage.showingProperty());
} catch (TimeoutException ex) {
Logger.getLogger(UITest.class.getName()).log(Level.SEVERE, null, ex);
}
}
@After
public void tearDown() {
}
/**
* Test event:
* <ul>
* <li> 1. click generate button
* </ul>
*/
@Test
public void clickGenerateButtonAtStartTest() {
clickOn("#generate_map_btn");
Date date = new Date();
sleep(3, SECONDS);
SimpleDateFormat df = new SimpleDateFormat("hh:mm");
String timeFormat = df.format(date);
String outputLog = GlobalSettings.LOG_SEPARATOR
+ "[" + timeFormat + "] " + "[NEW MAP CREATED]\n"
+ "10 columns & 10 rows";
Assertions.verifyThat("#logArea", Commons.hasText(outputLog));
assertTrue(this.app.getView().isThereAMapVisible());
}
/**
* Test events:
* <ul>
* <li> 1. click column combo box
* <li> 2. select and click number 5
* <li> 3. click row combo box
* <li> 4. select and click number 6
* <li> 5. click generate button
* </ul>
*/
@Test
public void clickComboBoxesAndGenerateTest() {
clickOn("#column_combo").clickOn("5");
clickOn("#row_combo").clickOn("6");
clickOn("#generate_map_btn");
Date date = new Date();
sleep(1, SECONDS);
SimpleDateFormat df = new SimpleDateFormat("hh:mm");
String timeFormat = df.format(date);
String outputLog = GlobalSettings.LOG_SEPARATOR
+ "[" + timeFormat + "] " + "[NEW MAP CREATED]\n"
+ "5 columns & 6 rows";
/*
TextArea ta = find("#logArea");
System.out.println(ta.getText());
System.out.println(outputLog);
System.out.println(ta.getText().equals(outputLog));
*/
Assertions.verifyThat("#logArea", Commons.hasText(outputLog));
assertTrue(this.app.getView().isThereAMapVisible());
}
/**
* Test events:
* <ul>
* <li> 1. click generate button
* <li> 2. click on title field
* <li> 3. write "eye of the world" in the field
* <li> 4. press ENTER key
* </ul>
*/
@Test
public void clickGenerateAndEnterTitleTest() {
clickOn("#generate_map_btn");
Date date = new Date();
sleep(1, SECONDS);
clickOn("#title_field");
write("eye of the world").push(KeyCode.ENTER);
Date date2 = new Date();
sleep(2, SECONDS);
SimpleDateFormat df = new SimpleDateFormat("hh:mm");
String timeFormat = df.format(date);
String timeFormat2 = df.format(date2);
String outputLog = GlobalSettings.LOG_SEPARATOR
+ "[" + timeFormat + "] " + GlobalSettings.LOG_NEW_MAP
+ "10 columns & 10 rows"
+ "\n" + GlobalSettings.LOG_SEPARATOR
+ "[" + timeFormat2 + "] " + GlobalSettings.LOG_TITLE_SET
+ "Title: Eye Of The World 10x10 is set.";
Assertions.verifyThat("#logArea", Commons.hasText(outputLog));
Assertions.verifyThat("#title_field", Commons.hasText("Eye Of The World"));
assertTrue(this.app.getView().isThereAMapVisible());
}
/**
* Test events:
* <ul>
* <li> 1. click generate button
* <li> 2. click player 1 start button
* <li> 3. click tile 8,4
* <li> 4. click player 2 start button
* <li> 5. click tile 9,3
* </ul>
*/
@Test
public void clickGenerateThenPlayer1ThenPlayer2AndCanvasTest() {
clickOn("#generate_map_btn");
Date date = new Date();
sleep(3, SECONDS);
clickOn("#p1_start_btn");
Date date2 = new Date();
moveBy(-400.00, -200.00).clickOn();
Date date3 = new Date();
clickOn("#p2_start_btn");
Date date4 = new Date();
moveBy(-300.00, -300.00).clickOn();
Date date5 = new Date();
sleep(2, SECONDS);
SimpleDateFormat df = new SimpleDateFormat("hh:mm");
String timeFormat = df.format(date);
String timeFormat2 = df.format(date2);
String timeFormat3 = df.format(date3);
String timeFormat4 = df.format(date4);
String timeFormat5 = df.format(date5);
String outputLog = GlobalSettings.LOG_SEPARATOR
+ "[" + timeFormat + "] " + GlobalSettings.LOG_NEW_MAP
+ "10 columns & 10 rows"
+ "\n" + GlobalSettings.LOG_SEPARATOR
+ "[" + timeFormat2 + "] " + GlobalSettings.LOG_PLAYER1_ON
+ "\n" + GlobalSettings.LOG_SEPARATOR
+ "[" + timeFormat3 + "] " + GlobalSettings.LOG_TILE_SET
+ "Player 1 start position is now set to [8,4]"
+ "\n" + GlobalSettings.LOG_SEPARATOR
+ "[" + timeFormat4 + "] " + GlobalSettings.LOG_PLAYER2_ON
+ "\n" + GlobalSettings.LOG_SEPARATOR
+ "[" + timeFormat5 + "] " + GlobalSettings.LOG_TILE_SET
+ "Player 2 start position is now set to [9,3]";
Assertions.verifyThat("#logArea", Commons.hasText(outputLog));
assertTrue(this.app.getView().isThereAMapVisible());
}
/**
* Test events:
* <ul>
* <li> 1. click generate button
* <li> 2. click player 1 start button
* <li> 3. click on tile 8,4
* <li> 4. click on tile 3,4
* <li> 5. click player 1 start button
* <li> 6. click on tile 8,8
* <li> 7. click player 1 start button
* <li> 8. click on tile 8,8 (click again on the same tile)
* <li> 9. click player 2 start button
* <li> 10. click tile 9,3
* <li> 11. click player 2 start button
* <li> 12. click tile 9,3 (click again on the same tile)
* <li> 13. click player 2 start button
* <li> 14. click tile 8,1
* <li> 15. click player 2 start button (overwrite p1 start tile )
* <li> 16. click tile 8,8
* </ul>
*/
@Test
public void clickGenerateThenPlayer1ThenPlayer2AndCanvasTwiceTest() {
clickOn("#generate_map_btn");
Date date = new Date();
sleep(1, SECONDS);
clickOn("#p1_start_btn");
Date date2 = new Date();
moveBy(-400.00, -200.00).clickOn();
Date date3 = new Date();
moveBy(-400.00, 0.00).clickOn();
Date date4 = new Date();
clickOn("#p1_start_btn");
Date date5 = new Date();
moveBy(-400.00, 0.0).clickOn();
Date date6 = new Date();
clickOn("#p1_start_btn");
Date date7 = new Date();
moveBy(-400.00, 0.0).clickOn();
Date date8 = new Date();
clickOn("#p2_start_btn");
Date date9 = new Date();
moveBy(-300.00, -300.00).clickOn();
Date date10 = new Date();
clickOn("#p2_start_btn");
Date date11 = new Date();
moveBy(-300.00, -300.00).clickOn();
Date date12 = new Date();
clickOn("#p2_start_btn");
Date date13 = new Date();
moveBy(-350.00, -400.00).clickOn();
Date date14 = new Date();
clickOn("#p2_start_btn");
Date date15 = new Date();
moveBy(-400.00, 0.0).clickOn();
Date date16 = new Date();
sleep(2, SECONDS);
SimpleDateFormat df = new SimpleDateFormat("hh:mm");
String timeFormat = df.format(date);
String timeFormat2 = df.format(date2);
String timeFormat3 = df.format(date3);
String timeFormat4 = df.format(date4);
String timeFormat5 = df.format(date5);
String timeFormat6 = df.format(date6);
String timeFormat7 = df.format(date7);
String timeFormat8 = df.format(date8);
String timeFormat9 = df.format(date9);
String timeFormat10 = df.format(date10);
String timeFormat11 = df.format(date11);
String timeFormat12 = df.format(date12);
String timeFormat13 = df.format(date13);
String timeFormat14 = df.format(date14);
String timeFormat15 = df.format(date15);
String timeFormat16 = df.format(date16);
StringBuilder outputLog = new StringBuilder();
// clickOn("#generate_map_btn");
outputLog.append(GlobalSettings.LOG_SEPARATOR);
outputLog.append("[").append(timeFormat).append("] ");
outputLog.append(GlobalSettings.LOG_NEW_MAP);
outputLog.append("10 columns & 10 rows");
// clickOn("#p1_start_btn");
outputLog.append("\n").append(GlobalSettings.LOG_SEPARATOR);
outputLog.append("[").append(timeFormat2).append("] ");
outputLog.append(GlobalSettings.LOG_PLAYER1_ON);
// moveBy(-400.00, -200.00).clickOn();
outputLog.append("\n").append(GlobalSettings.LOG_SEPARATOR);
outputLog.append("[").append(timeFormat3).append("] ");
outputLog.append(GlobalSettings.LOG_TILE_SET);
outputLog.append("Player 1 start position is now set to [8,4]");
// moveBy(-400.00, 0.0).clickOn();
outputLog.append("\n").append(GlobalSettings.LOG_SEPARATOR);
outputLog.append("[").append(timeFormat4).append("] ");
outputLog.append(GlobalSettings.LOG_NOTE);
outputLog.append("Nothing selected. [3,4]");
// clickOn("#p1_start_btn");
outputLog.append("\n").append(GlobalSettings.LOG_SEPARATOR);
outputLog.append("[").append(timeFormat5).append("] ");
outputLog.append(GlobalSettings.LOG_PLAYER1_ON);
// moveBy(-400.00, 0.0).clickOn();
outputLog.append("\n").append(GlobalSettings.LOG_SEPARATOR);
outputLog.append("[").append(timeFormat6).append("] ");
outputLog.append(GlobalSettings.LOG_TILE_SET);
outputLog.append("Player 1 start position is now set to [8,8]");
// clickOn("#p1_start_btn");
outputLog.append("\n").append(GlobalSettings.LOG_SEPARATOR);
outputLog.append("[").append(timeFormat7).append("] ");
outputLog.append(GlobalSettings.LOG_PLAYER1_ON);
// moveBy(-400.00, 0.0).clickOn();
outputLog.append("\n").append(GlobalSettings.LOG_SEPARATOR);
outputLog.append("[").append(timeFormat8).append("] ");
outputLog.append(GlobalSettings.LOG_ERROR);
outputLog.append("You already have selected this tile.");
// clickOn("#p2_start_btn");
outputLog.append("\n").append(GlobalSettings.LOG_SEPARATOR);
outputLog.append("[").append(timeFormat9).append("] ");
outputLog.append(GlobalSettings.LOG_PLAYER2_ON);
// moveBy(-300.00, -300.00).clickOn();
outputLog.append("\n").append(GlobalSettings.LOG_SEPARATOR);
outputLog.append("[").append(timeFormat10).append("] ");
outputLog.append(GlobalSettings.LOG_TILE_SET);
outputLog.append("Player 2 start position is now set to [9,3]");
// clickOn("#p2_start_btn");
outputLog.append("\n").append(GlobalSettings.LOG_SEPARATOR);
outputLog.append("[").append(timeFormat11).append("] ");
outputLog.append(GlobalSettings.LOG_PLAYER2_ON);
// moveBy(-300.00, -300.00).clickOn();
outputLog.append("\n").append(GlobalSettings.LOG_SEPARATOR);
outputLog.append("[").append(timeFormat12).append("] ");
outputLog.append(GlobalSettings.LOG_ERROR);
outputLog.append("You already have selected this tile.");
// clickOn("#p2_start_btn");
outputLog.append("\n").append(GlobalSettings.LOG_SEPARATOR);
outputLog.append("[").append(timeFormat13).append("] ");
outputLog.append(GlobalSettings.LOG_PLAYER2_ON);
// moveBy(-350.00, -400.00).clickOn();
outputLog.append("\n").append(GlobalSettings.LOG_SEPARATOR);
outputLog.append("[").append(timeFormat14).append("] ");
outputLog.append(GlobalSettings.LOG_TILE_SET);
outputLog.append("Player 2 start position is now set to [8,1]");
// clickOn("#p2_start_btn");
outputLog.append("\n").append(GlobalSettings.LOG_SEPARATOR);
outputLog.append("[").append(timeFormat15).append("] ");
outputLog.append(GlobalSettings.LOG_PLAYER2_ON);
// moveBy(-400.00, 0.0).clickOn();
outputLog.append("\n").append(GlobalSettings.LOG_SEPARATOR);
outputLog.append("[").append(timeFormat16).append("] ");
outputLog.append(GlobalSettings.LOG_WARNING);
outputLog.append("Player 1 start position is overwritten!");
outputLog.append("\n").append(GlobalSettings.LOG_SEPARATOR);
outputLog.append("[").append(timeFormat16).append("] ");
outputLog.append(GlobalSettings.LOG_TILE_OVERWRITTEN);
outputLog.append("Player 2 start position is now set to [8,8]");
Assertions.verifyThat("#logArea",
Commons.hasText(outputLog.toString()));
assertTrue(this.app.getView().isThereAMapVisible());
}
/**
* Test events:
* <ul>
* <li> 1. click generate button
* <li> 2, click boulder button
* <li> 3. click on tile 8,6
* <li> 4. click neutral button (overwrites boulder button)
* <li> 5. click on tile 8,6
* </ul>
*/
@Test
public void clickGenerateThenBoulderAndOverwrittenByNeutralTest() {
clickOn("#generate_map_btn");
Date date = new Date();
sleep(3, SECONDS);
clickOn("#boulder_btn");
Date date2 = new Date();
moveBy(-400.00, -200.00).clickOn();
Date date3 = new Date();
clickOn("#neutral_btn");
Date date4 = new Date();
moveBy(-400.00, -250.00).clickOn();
Date date5 = new Date();
sleep(2, SECONDS);
SimpleDateFormat df = new SimpleDateFormat("hh:mm");
String timeFormat = df.format(date);
String timeFormat2 = df.format(date2);
String timeFormat3 = df.format(date3);
String timeFormat4 = df.format(date4);
String timeFormat5 = df.format(date5);
StringBuilder outputLog = new StringBuilder();
// clickOn("#generate_map_btn");
outputLog.append(GlobalSettings.LOG_SEPARATOR);
outputLog.append("[").append(timeFormat).append("] ");
outputLog.append(GlobalSettings.LOG_NEW_MAP);
outputLog.append("10 columns & 10 rows");
// clickOn("#boulder_btn");
outputLog.append("\n").append(GlobalSettings.LOG_SEPARATOR);
outputLog.append("[").append(timeFormat2).append("] ");
outputLog.append(GlobalSettings.LOG_BOULDER_ON);
// moveBy(-400.00, -200.00).clickOn();
outputLog.append("\n").append(GlobalSettings.LOG_SEPARATOR);
outputLog.append("[").append(timeFormat3).append("] ");
outputLog.append(GlobalSettings.LOG_TILE_SET);
outputLog.append("Boulder tile is set to [8,6]");
// clickOn("#neutral_btn");
outputLog.append("\n").append(GlobalSettings.LOG_SEPARATOR);
outputLog.append("[").append(timeFormat4).append("] ");
outputLog.append(GlobalSettings.LOG_NEUTRAL_ON);
// moveBy(-400.00, -250.00).clickOn();
outputLog.append("\n").append(GlobalSettings.LOG_SEPARATOR);
outputLog.append("[").append(timeFormat5).append("] ");
outputLog.append(GlobalSettings.LOG_WARNING);
outputLog.append(GlobalSettings.LOG_BOULDER_OVERWRITTEN);
outputLog.append("\n").append(GlobalSettings.LOG_SEPARATOR);
outputLog.append("[").append(timeFormat5).append("] ");
outputLog.append(GlobalSettings.LOG_TILE_SET);
outputLog.append("Neutral tile is set to [8,6]");
Assertions.verifyThat("#logArea",
Commons.hasText(outputLog.toString()));
assertTrue(this.app.getView().isThereAMapVisible());
assertTrue(this.app.getView().isEditMapOn());
}
/**
* Test events:
* <ul>
* <li> 1. click help menu
* <li> 2. click about menu item
* <li> 3. click OK button (on the About App dialog window)
* </ul>
*/
@Test
public void testAboutAppDialog() {
KeyCodeCombination altA = new KeyCodeCombination(
KeyCode.A, KeyCodeCombination.ALT_DOWN);
push(altA);
sleep(2, SECONDS);
clickOn("OK");
}
}