*** Settings ***
Documentation       A resource file with reusable keywords and variables.
Library     SeleniumLibrary    run_on_failure=nothing
Library     String
Library     DateTime

*** Variables ***
${SERVER}           %{SITE_URL}
${BROWSER}          ff
${DELAY}            0.5
#${VALID USER} =     ville
${VALID PASSWORD} =     koira
${LOGIN URL}        https://${SERVER}/
${WELCOME URL}      #You can use this if there's a different page after login page.
${LOC_USER}         id=registerUsernameInput            #Generated username.
${LOC_PASSWORD}     id=registerPasswordInput            #Generated password first time.
${LOC_PASSWORD2}    id=registerPasswordVerifyInput      #Generated password verify.
${ZOOMIN}           css=a[class=leaflet-control-zoom-in]        #Zoom in button location
${ZOOMOUT}          css=a[class=leaflet-control-zoom-out]        #Zoom out button location
${INVALID_U}        User does not exist
${INVALID_P}        Invalid password
${SHORT_P}          Validation failed: password must be longer than or equal to 3 characters
${SHORT_U}          Validation failed: name must be longer than or equal to 3 characters
${SHORT_UP}         Validation failed: name must be longer than or equal to 3 characters, password must be longer than or equal to 3 characters
${LONG_U}           Validation failed: name must be shorter than or equal to 31 characters
${LONG_P}           Validation failed: password must be shorter than or equal to 255 characters
${LONG_UP}          Validation failed: name must be shorter than or equal to 31 characters, password must be shorter than or equal to 255 characters
${SU_LP}            Validation failed: name must be longer than or equal to 3 characters, password must be shorter than or equal to 255 characters
${LU_SP}            Validation failed: name must be shorter than or equal to 31 characters, password must be longer than or equal to 3 characters
${ACC_EXISTS}       User already exists
${P_NOMATCH}        Passwords do not match

## New Game /
# B = Button / I = Input
${B_NEWGAME}        id=newGameButton
${B_EDITGAME}       id=editGameButton
${I_NGAMENAME}      id=newGameNameInput
${I_NGAMEDESC}      id=newGameDescriptionInput
${I_NGAMESTART}     id=newGameDateStartInput

${I_NSTARTTIME}     id=newGameTimeStartInput
${I_NGAMESTOP}      id=newGameDateEndInput
${I_NSTOPTIME}      id=newGameTimeEndInput
${B_NSUBMIT}        id=newGameSubmitButton

${L_GAMELIST}       id=changeActiveGameList
${START}

## Edit Game
${I_EGAMENAME}      id=editGameNameInput
${I_EGAMEDESC}      id=editGameDescriptionInput
${I_EGAMESTART}     id=editGameDateStartInput
${I_ESTARTTIME}     id=editGameTimeStartInput

${I_EGAMESTOP}      id=editGameDateEndInput
${I_ESTOPTIME}      id=editGameTimeEndInput
${I_FACTIONNAME}    id=editGameFactionNameInput
${I_FACTIONPASS}    id=editGameFactionPasswordInput
${B_FACTIONADD}     id=editGameFactionSubmitButton

${I_FLAGNAME}       id=editGameObjectivePointDescriptionInput
${I_FLAGMULTI}      id=editGameObjectivePointMultiplierInput
${B_FLAGADD}        id=editGameObjectivePointSubmitButton
${I_CAPTURE}        id=editGameCaptureTimeInput
${I_CONF}           id=editGameConfirmationTimeInput

${B_ESUBMIT}        id=editGameSubmitButton
${B_EDELETE}        id=gameDeleteButton
${E_ECLOSE}         id=closeEditGameFormX
${FACTION1}         Faction1
${FACTION2}         Faction2

## Game List
${B_GAMESELECT}     id=selectGameButton
${testit}           css=button[id^="selecttest_"]

## Join Game
${B_JOINGAME}       id=joinGameButton
${L_SELECTFACTION}  id=selectFactionList
${B_JOINSUBMIT}     id=joinGameSubmitButton

*** Keywords ***

#Valid Login
Open Browser To Login Page
    Open Browser        ${LOGIN URL}      ${BROWSER}
    Set Window Size     1920        1080
    Set Selenium Speed      ${DELAY}
    Login Page Should be Open

Login Page Should be Open
    Title Should Be     TACS

Go To Login Page
    Go To       ${LOGIN URL}
    Login Page Should be Open

Open Login      #No need anymore since the new website.
    Click Button       id=loginButton

Input Username
    [Arguments]     ${username}
    Input Text      id=loginUsernameInput      ${username}

Input Password
    [Arguments]     ${password}
    Input Text      id=loginPasswordInput        ${password}

Submit Credentials Login
    Click Button        id=submitLoginButton

Welcome Page Should Be Open     #You can use this if there's a different page after login page.
    Location Should Be      ${WELCOME URL}

Log Out
    Click Button        id=signOutButton

Close Login Screen
    Click Element        id=closeLoginFormX

Wait For Log Out Button To Appear       #not in use
    Wait Until Page Contains Element        id=logoutButton      1



#Registration
Open Registration
    Click Button        id=openRegisterFormButton

Generate Valid Username     #Generates new username for every test rotation in gitlab. Used in test suite 00.
    ${GENE_username} =      Generate Random String      12       [LETTERS][NUMBERS]
    Set Global Variable    ${VALID USER}    ${GENE_username}

Input Valid Username        #Inputs the generated valid username for login. (Test suite 00)
    Input Text      ${LOC_USER}        ${VALID USER}

Input Valid Password        #Inputs the valid password: ville. (Test suite 00 and 01)
    Input Text      ${LOC_PASSWORD}        ${VALID PASSWORD}
    Input Text      ${LOC_PASSWORD2}        ${VALID PASSWORD}

Generate Username       #Generates a random username        lenght=8     chars=[LETTERS][NUMBERS]
    [Arguments]     ${GNUM_U}
    ${GENE_username} =   Generate Random String      ${GNUM_U}       [LETTERS][NUMBERS]
    Input Text      ${LOC_USER}        ${GENE_username}

Generate Password       #Generates a random password        lenght=8     chars=[LETTERS][NUMBERS]
    [Arguments]     ${GNUM_P}
    ${GENE_password} =   Generate Random String      ${GNUM_P}       [LETTERS][NUMBERS]
    Input Text      ${LOC_PASSWORD}        ${GENE_password}
    Input Text      ${LOC_PASSWORD2}        ${GENE_password}

Generate Differing Password
    [Arguments]     ${GNUM_VP}
    ${GENE_dpassword} =     Generate Random String      ${GNUM_VP}      [LETTERS][NUMBERS]
    ${GENE_dpassword2} =     Generate Random String      ${GNUM_VP}      [LETTERS][NUMBERS]
    Input Text      ${LOC_PASSWORD}      ${GENE_dpassword}
    Input Text      ${LOC_PASSWORD2}      ${GENE_dpassword2}

Submit Credentials Registration
    Click Button        id=submitRegisterButton

Close Registration Screen       #not in use
    Click Element       id=closeRegisterFormX

Back To Login Screen
    Click Element       id=openLoginFormButton



#Zoom frontpage
Zoom In On Frontpage
    Repeat Keyword          3 times         Click Element      ${ZOOMIN}


Zoom Out On Frontpage
    Repeat Keyword          3 times         Click Element       ${ZOOMOUT}



#Drawing tools and map movement frontpage
Drawing A Figure
    [Arguments]     ${X}        ${Y}
    Click Element At Coordinates    css=div[class=leaflet-control-container]        ${X}        ${Y}

Click Leaflet Panel
    [Arguments]     ${TARGET}
    Click Element      css=a[title="${TARGET}"]

Draw A Polyline
    Click Element       css=a[class=leaflet-draw-draw-polyline]
    Drawing A Figure        500     500
    Drawing A Figure        300     500
    Drawing A Figure        300     300
    Drawing A Figure        500     300
    Drawing A Figure        500     500
    Click Leaflet Panel     Delete last point drawn
    Drawing A Figure        500     500
    Drawing A Figure        500     500
    Drawing A Figure        550     300
    Drawing A Figure        550     500
    Click Leaflet Panel     Finish drawing
    Drawing A Figure        600     300
    Drawing A Figure        600     500
    Click Leaflet Panel     Cancel drawing
    Log To Console          \n.Polyline done

Draw A Polygon
    Click Element     css=a[class=leaflet-draw-draw-polygon]
    Drawing A Figure        50      300
    Drawing A Figure        -100    300
    Drawing A Figure        -60     100
    Click Leaflet Panel     Cancel drawing
    Click Element     css=a[class=leaflet-draw-draw-polygon]
    Drawing A Figure        50      300
    Drawing A Figure        -100    300
    Drawing A Figure        -60     100
    Click Leaflet Panel     Delete last point drawn
    Drawing A Figure        -60     100
    Click Leaflet Panel     Finish drawing
    Drawing A Figure        -120    300
    Drawing A Figure        -180    300
    Drawing A Figure        -110    100
    Drawing A Figure        -120    300
    Log To Console          Polygon done

Draw A Rectangle
    Click Element       css=a[class=leaflet-draw-draw-rectangle]
    Drawing A Figure        -200     100
    Drawing A Figure        -0       500
    #Click Leaflet Panel     Cancel drawing
    Log To Console          Rectangle done

Draw A Circle
    Click Element       css=a[class=leaflet-draw-draw-circle]
    Mouse Down          class:leaflet-tile-loaded:nth-child(2)
    Mouse Up            class:leaflet-tile-loaded:nth-child(5)
    #Click Leaflet Panel     Cancel drawing
    Log To Console          Circle done

Draw A Marker
    Click Element       css=a[class=leaflet-draw-draw-marker]
    Drawing A Figure        200     200
    Click Element       css=a[class=leaflet-draw-draw-marker]
    Drawing A Figure        300     300
    #Click Leaflet Panel     Cancel drawing
    Log To Console          Markers done

Edit Layers
    Click Element   css=a[class=leaflet-draw-edit-edit]
    Mouse Down      class:leaflet-editing-icon:first-of-type            #Polyline
    Mouse Up        class:leaflet-tile-loaded:nth-child(2)              #Polyline
    Mouse Down      class:leaflet-editing-icon:nth-last-of-type(7)      #Rectangle
    Mouse Up        class:leaflet-tile-loaded:nth-child(4)              #Rectangle
    Mouse Down      class:leaflet-editing-icon:nth-last-of-type(6)      #Rectangle
    Mouse Up        class:leaflet-tile-loaded:nth-child(5)              #Rectangle
    Mouse Down      class:leaflet-editing-icon:nth-last-of-type(8)      #Polygon
    Mouse Up        class:leaflet-tile-loaded:nth-child(2)              #Polygon
    Mouse Down      class:leaflet-editing-icon:nth-last-of-type(3)      #Circle
    Mouse Up        class:leaflet-tile-loaded:nth-child(4)              #Circle
    Mouse Down      class:leaflet-editing-icon:nth-last-of-type(4)      #Circle
    Mouse Up        class:leaflet-tile-loaded:nth-child(3)              #Circle
    Mouse Down      class:leaflet-marker-icon:last-of-type              #Marker
    Mouse Up        class:leaflet-tile-loaded:nth-child(12)             #Marker
    Click Leaflet Panel     Save changes
    Click Element   css=a[class=leaflet-draw-edit-edit]
    Mouse Down      class:leaflet-marker-icon:nth-last-of-type(2)       #Marker
    Mouse Up        class:leaflet-tile-loaded:nth-child(3)              #Marker
    Click Leaflet Panel     Cancel editing, discards all changes
    Log To Console          Editing done

Delete Layers
    Click Element       css=a[class=leaflet-draw-edit-remove]
    Click Element       class:leaflet-marker-icon:nth-last-of-type(2)       #Marker
    Click Leaflet Panel     Save changes
    Click Element       css=a[class=leaflet-draw-edit-remove]
    Click Element At Coordinates    css=div[class=leaflet-control-container]        50        300
    Click Leaflet Panel     Cancel editing, discards all changes
    Click Element       css=a[class=leaflet-draw-edit-remove]
    Click Element       css=a[title="Clear all layers"]
    Log To Console      Deleting done

Map Movement
    Drag And Drop By Offset    css=div[class=leaflet-control-container]     10     100
    Drag And Drop By Offset    css=div[class=leaflet-control-container]     50     300
    Drag And Drop By Offset    css=div[class=leaflet-control-container]     800     800
    Drag And Drop By Offset    css=div[class=leaflet-control-container]     -50     -50
    Log To Console             Map movement tested

# Leaflet write text

Write Text
#    Select Game
    Click Element       css=a[class=leaflet-draw-draw-textbox]
    Click Element At Coordinates    css=div[class=leaflet-control-container]        100        300
    Input Text      css=div[placeholder="Click out to save"]        Hello
    Click Element At Coordinates    css=div[class=leaflet-control-container]        100        400
    Element Text Should Be      css=div[placeholder="Click out to save"]        Hello       #Tarkistaa onko teksti oikein.
    Sleep       2

    Click Element       css=a[class=leaflet-draw-draw-textbox]
    Click Element At Coordinates    css=div[class=leaflet-control-container]        100        500
    Sleep       4
    Input Text      css=div[placeholder="Click out to save"]       12345
    Click Element At Coordinates    css=div[class=leaflet-control-container]        100        400
    Element Text Should Be      css=div[placeholder="Click out to save"]        12345
    :FOR        ${i}        IN RANGE        1000
    \       ${status}       ${value} =  Run Keyword And Ignore Error    Page Should Contain Element     id={i}
    \       Run Keyword if      '${status}'=='PASS'     Log     {i}
#    :FOR    ${i}        IN RANGE        1000
#    \       Run Keyword if      'id={i}'=='PASS'
#    \       Run Keyword if       '{i}'=='5'        Log     ${i}
#    Click Element       css=a[class=leaflet-draw-edit-edit]
#    Mouse Down      class:leaflet-marker-icon:first-of-type
#    Sleep       2
#    Mouse Up        class:leaflet-tile-loaded:nth-child(4)
#    Sleep       2
#    Click Leaflet Panel     Save changes
#    Sleep       2
#    Click Element       css=a[class=leaflet-draw-edit-edit]
#    Mouse Down      class:leaflet-marker-icon:first-of-type
#    Mouse Up        class:leaflet-tile-loaded:nth-child(1)
#    Sleep       2
#    Click Leaflet Panel     Cancel editing, discards all changes
#    Sleep       2

# ------------------------------------------------------------------------------

# Adding New Task

Click Tasks
    Click Element       id=tasklistButton

Generate Task Name/Description
    [Arguments]     ${TASK_NAME}      ${TASK_DESCRIPTION}
    ${TASK_N} =     Generate Random String      ${TASK_NAME}            [LETTERS][NUMBERS]
    ${TASK_D} =     Generate Random String      ${TASK_DESCRIPTION}     [LETTERS][NUMBERS]
    Input Text      id=taskNameInput            ${TASK_N}
    Input Text      id=taskDescriptionInput     ${TASK_D}

Submit Task
    Click Element       id=newTaskSubmitButton

#Wait For Game Select Button To Appear
#    Wait Until Page Contains Element        id=     1

Select Faction
    [Arguments]     ${faction}
    Select From List By Label     id=taskFactionSelect      ${faction}






#
#   New Game
#   Valid name 3-30 / Desc 1 - 255
#${B_NEWGAME}        id=newGameButton
#${I_NGAMENAME}      id=newGameNameInput
#${I_NGAMEDESC}      id=newGameDescriptionInput
#${I_NGAMESTART}     id=newGameDateStartInput
#${I_NSTARTTIME}     id=newGameTimeStartInput
#${I_NGAMESTOP}      id=newGameDateEndInput
#${I_NSTOPTIME}      id=newGameTimeEndInput
#${B_NSUBMIT}        id=newGameSubmitButton
#${L_GAMELIST}       id=changeActiveGameList
#${START}

### Edit Game
#${B_EDITGAME}       id=editGameButton
#${I_EGAMENAME}      id=editGameNameInput
#${I_EGAMEDESC}      id=editGameDescriptionInput
#${I_EGAMESTART}     id=editGameDateStartInput
#${I_ESTARTTIME}     id=editGameTimeStartInput
#${I_EGAMESTOP}      id=editGameDateEndInput
#${I_ESTOPTIME}      id=editGameTimeEndInput
#${B_ESUBMIT}        id=editGameSubmitButton

#${I_FACTIONNAME}    id=factionNameInput
#${I_FACTIONPASS}    id=factionPasswordInput
#${B_FACTIONADD}     id=factionAddButton
#
#${I_FLAGNAME}       id=objectivePointDescriptionInput
#${I_FLAGMULTI}      id=objectivePointMultiplierInput
#${B_FLAGADD}        id=objectivePointAddButton
#${I_CAPTURE}        id=captureTimeInput
#${I_CONF}           id=confirmationTimeInput

Create Game
    Wait Until Page Contains Element        id=newGameButton      1
    Generate Valid Gamename
    Click Button    ${B_NEWGAME}
    Input Text      ${I_NGAMENAME}   ${VALID_GAME}
    Log             GameName set
    Input Text      ${I_NGAMEDESC}   Hello! ~RobotFramework
    Log             Desc set

    # Set Game start time
    Generate Game Start Date And Time   # Generate globals: STARTDATE, STARTTIME
    Input Text      ${I_NGAMESTART}  ${STARTDATE}
    Input Text      ${I_NSTARTTIME}  ${STARTTIME}
    Log             start datetime ok

    # Set Game end time
    Generate Game End Date And Time     # Generate globals: ENDDATE, ENDTIME
    Input Text      ${I_NGAMESTOP}   ${ENDDATE}
    Input Text      ${I_NSTOPTIME}   ${ENDTIME}
    Log             end datetime ok

    Click Button    ${B_NSUBMIT}
    Handle Alert

Select Game
    ${x} =              Format String           select{}     ${VALID_GAME}
    Wait Until Page Contains Element        id=${x}     1
    Click Button        id=${x}
    Log                 Game Selected

Edit Game Time
    Wait Until Page Contains Element        id=editGameButton      1
    Click Button    ${B_EDITGAME}
    Input Text      ${I_EGAMENAME}   ${VALID_GAME}  #test_bINk5V
    Log             GameName edited
    Input Text      ${I_EGAMEDESC}   Hello, I Edited this game ~RobotFramework
    Log             Desc edited

    # Set Game start time
    Generate Game Start Date And Time
    Input Text      ${I_EGAMESTART}  ${STARTDATE}
    Input Text      ${I_ESTARTTIME}  ${STARTTIME}
    Log             start edited

    # Set Game end time
    Generate Game End Date And Time
    Input Text      ${I_EGAMESTOP}   ${ENDDATE}
    Input Text      ${I_ESTOPTIME}   ${ENDTIME}
    Log             end edited

Edit Factions
    Input Text      ${I_FACTIONNAME}    ${FACTION1}
    Input Text      ${I_FACTIONPASS}    Pass1
    Click Button    ${B_FACTIONADD}

    Input Text      ${I_FACTIONNAME}    ${FACTION2}
    Input Text      ${I_FACTIONPASS}    Pass2
    Click Button    ${B_FACTIONADD}

Edit Objective Points
    Input Text      ${I_FLAGNAME}       1234567
    Input Text      ${I_FLAGMULTI}      3
    Click Button    ${B_FLAGADD}

#    Input Text      ${I_CAPTURE}        240
#    Input Text      ${I_CONF}           30

Save Game
    # Joku vika
    #Press Keys          None    PAGE_DOWN
    #Submit Form

    Click Button        ${B_ESUBMIT}
    Alert Should Be Present     text=Game updated     action=ACCEPT       timeout=None
    Click Element        ${E_ECLOSE}
#    Handle Alert

Generate Valid Gamename     #Generates new name for every test rotation in gitlab. Used in test suite xx.
    ${g_name} =     Generate Random String      6       [LETTERS][NUMBERS]
    ${x} =          Format String           test_{}     ${g_name}
    Set Global Variable     ${VALID_GAME}    ${x}

Randint
    [Arguments]     ${x}    ${y}
    ${random} =     Evaluate    random.randint(${x}, ${y})  modules=random
    [Return]        ${random}

Generate Game Start Date And Time
    ${datetime} =   Get Current Date    result_format=%Y-%m-%d %H:%M

    ${random} =     Randint     1   365
    ${startdate} =  Add Time To Date    ${datetime}   ${random} days

    ${random} =     Randint     0   1339
    ${startdate} =  Add Time To Date    ${startdate}  ${random} minutes

    ${startdate} =          Convert Date    ${startdate}   result_format=%Y-%m-%d %H:%M
    ${date}  ${time} =      Split String    ${startdate}
    Set Global Variable     ${START}        ${startdate}
    Set Global Variable     ${STARTDATE}    ${date}
    Set Global Variable     ${STARTTIME}    ${time}


Generate Game End Date And Time
    ${datetime} =   Set Variable  ${START}

    ${random} =     Randint     1   365
    ${enddate} =    Add Time To Date    ${datetime}  ${random} days

    ${random} =     Randint     0   1339
    ${enddate} =    Add Time To Date    ${enddate}   ${random} minutes

    ${enddate} =    Convert Date        ${enddate}   result_format=%Y-%m-%d %H:%M
    ${date}  ${time} =      Split String  ${enddate}

    Set Global Variable     ${END}        ${enddate}
    Set Global Variable     ${ENDDATE}    ${date}
    Set Global Variable     ${ENDTIME}    ${time}


#
# JOIN GAME AND FACTION
#


Generate Player Username     #Generates new username for every test rotation in gitlab. Used in test suite 10.
    ${playername} =     Generate Random String      12       [LETTERS][NUMBERS]
    [Return]            ${playername}

Input Player Username        #Inputs the generated valid username for login. (Test suite 00)
    [Arguments]     ${playername}
    Input Text      ${LOC_USER}        ${playername}

Join Game
    [Arguments]     ${faction}  ${password}
    Click Button    ${B_JOINGAME}
    Select From List By Label           ${L_SELECTFACTION}  ${faction}
    Input Text      ${I_FACTIONPASS}    ${password}
    Click Button    ${B_JOINSUBMIT}
    Handle Alert

Log
    [Arguments]     ${x}
    Log To Console  ${x}

#
#   Delete Game
#

Delete Game
    Click Button       ${testit}
    Click Button       ${B_EDITGAME}
    Click Button       ${B_EDELETE}
    Alert Should Be Present     text=Are you sure you want to delete this game     action=ACCEPT       timeout=None
    Alert Should Be Present     text=Game deleted     action=ACCEPT       timeout=None
    Click Button       ${B_GAMESELECT}

Check If Any Test Games
    ${status}       ${value} =      Run Keyword And Ignore Error        Page Should Contain Button     ${testit}
    [Return]        ${status}




#Select Game
#    ${x} =              Format String           select{}     ${VALID_GAME}
#    Wait Until Page Contains Element        id=${x}     2
#    Click Button        id=${x}
#    Log                 Game Selected