#Assembles, links and run tests of FreePascal
#Param 1, the directory with the tests to perform.
#Note versions can be either 2 or 3 fields, e g 1.1  1.0.10

Export nrOfSucceded
Export nrOfFailed

#Iterate through tests
Set Exit 0 # To handle the case, in the for stmt, when there is no match
For sourceWithExt In {1}t.log  #only test files, which begins with a 't'
  Set Exit 1 #Revert error handling

  (Evaluate "{sourceWithExt}" =~ /(([.])*)1/) > Dev:Null
  Set apppath {1}

  (Evaluate {apppath} =~ /:([:]*)1/) > Dev:Null
  Set appname {1}

  If `Exists {apppath}.elg`
    Continue
  End

  Set testdirectives ""
  Set testdirectives "`StreamEdit {apppath}.pp 
      -d -e "/{[ t]*(%*)1[ t]*}/ Print 1"`" > Dev:Null
  Echo "============================================================="

  If {debugverbose}
    Echo {testdirectives}
  End

  If `Evaluate "{testdirectives}" =~ /%CPU=([,_0-9A-Za-z]*)1/`
    If `Evaluate "{1}" !~ /powerpc/`
      Echo Skipped {apppath}. Test only for CPU: "{1}"
      Continue
    End
  End
  
  If `Evaluate "{testdirectives}" =~ /%SKIPCPU=([,_0-9A-Za-z]*)1/`
    If `Evaluate "{1}" =~ /powerpc/`
      Echo Skipped {apppath}. Test not for CPU: {1}
      Continue
    End
  End
  
  If `Evaluate "{testdirectives}" =~ /%TARGET=([,_0-9A-Za-z]*)1/`
    If `Evaluate "{1}" !~ /macos/`
      Echo Skipped {apppath}. Test only for target: {1}
      Continue
    End
  End
  
  If `Evaluate "{testdirectives}" =~ /%SKIPTARGET=([,_0-9A-Za-z]*)1/`
    If `Evaluate "{1}" =~ /macos/`
      Echo Skipped {apppath}. Test not for target: {1}
      Continue
    End
  End

  If `Evaluate "{testdirectives}" =~ /%VERSION=([0-9.]*)1/`
    Set minver {1}
    If `Evaluate "{minver}" !~ /([0-9]*)1.([0-9]*)2.([0-9]*)3/`
      If `Evaluate "{minver}" !~ /([0-9]*)1.([0-9]*)2/`
        Echo Skipped {apppath}. Error in version no: {minver}
        Continue
      Else
        Set 3 0
      End
    End
    
    If (({cv1}> {1}) || (({cv1}=={1}) && 
           (({cv2}> {2}) || (({cv2}=={2}) && 
           ({cv3}>={3})))))
      Echo Skipped {apppath}. Compiler too old, test requires at least: {minver}
      Continue
    End
  End
  
  If `Evaluate "{testdirectives}" =~ /%MAXVERSION=([0-9.]*)1/`
    Set maxver {1}
    If `Evaluate "{maxver}" !~ /([0-9]*)1.([0-9]*)2.([0-9]*)3/`
      If `Evaluate "{maxver}" !~ /([0-9]*)1.([0-9]*)2/`
        Echo Skipped {apppath}. Error in version no: {maxver}
        Continue
      Else
        Set 3 0
      End
    End
    
    If (({cv1}< {1}) || (({cv1}=={1}) && 
           (({cv2}< {2}) || (({cv2}=={2}) && 
           ({cv3}<={3})))))
      Echo Skipped {apppath}. Compiler too new, test requires no more than: {maxver}
      Continue
    End
  End

  If `Evaluate "{testdirectives}" =~ /%NOTE=([%]*)1/`
    Echo Note: {1}
  End

  # Start compiling
  Echo Start compiling "{apppath}"
  

  Set Exit 0
  SetFile -c 'MPS ' -t 'TEXT' {appname}_ppas
  
  If {debugverbose}
    (Execute {appname}_ppas; Set linkresult "{Status}") | Tee {apppath}.log
  Else
    Execute {appname}_ppas > {apppath}.log
    Set linkresult "{Status}"
  End

  If "{linkresult}" != 0
    Set Exit 1
    Echo Compiling of "{apppath}" failed
    Set -e nrOfFailed `Evaluate {nrOfFailed}+1`
    If {debugverbose}
      StreamEdit  {apppath}.pp -d -e "1,15 Print"
    End
    Continue
  Else
    Set Exit 1
    Echo Compiling of "{apppath}" succeded
  End
  
  If `Evaluate "{testdirectives}" =~ /%NORUN/`
    Echo Skipped running of {apppath} due to option NORUN
    Continue
  End

  If `Evaluate "{testdirectives}" =~ /%INTERACTIVE/`
    Echo Skipped running of {apppath} due to option INTERACTIVE
    Continue
  End

  If Not `Exists {apppath}`
    # Should this be counted as a failed test ?
    # Or perhaps files is to be checked for if they are units ?
    Echo Skipped running due to nonexisting executable
    Continue
  End

  If 1
    If `Evaluate "{testdirectives}" =~ /%RESULT=([0-9]*)1/`
      Set expectedresult {1}
    Else
      Set expectedresult 0
    End
    
    #Execute test program
    Echo "Xxx" > "{apppath}.elg" #Needed, to continue if test app crashes
    Set Exit 0
    If {debugverbose}
      ( {apppath} ; Set actualresult "{Status}" ) | Tee {apppath}.elg
    Else
      {apppath} > {apppath}.elg
      Set actualresult "{Status}"
    End
    Set Exit 1

    If {actualresult} != 0
      Echo Running of "{apppath}" failed
    Else
      Echo Running of "{apppath}" succeded
    End

    Echo "Exit code was {actualresult}, expected {expectedresult}"
    If "{actualresult}" != "{expectedresult}"
      Echo -n "Failed to run {apppath}r" >> log #r gives a linefeed
      Echo Failed test "{apppath}"
      Set -e nrOfFailed `Evaluate {nrOfFailed}+1`
      If {debugverbose}
        StreamEdit  {apppath}.pp -d -e "1,15 Print"
      End
    Else
      Echo -n "Successfully run {apppath}r" >> log #r gives a linefeed
      Echo Succeded test "{apppath}"
      Set -e nrOfSucceded `Evaluate {nrOfSucceded}+1`
    End

  End
  Set Exit 0 # To handle the case, in the for stmt, when there is no match
End
Set Exit 1 #Revert error handling
