require('../../src/fluentnode')
os = require('os')

describe '| node-native | process',->

    it 'start_Process', ->
      ''.start_Process.assert_Is_Function()
      if os.platform() is 'win32'
        ### !pragma coverage-skip-block ###
        'cmd'.start_Process('/c','echo').assert_Is_Object()
                                        .constructor.name.assert_Is('ChildProcess')
        'cmd'.start_Process('/c',).pid.assert_Is_Number()
      else
        'echo'.start_Process().assert_Is_Object()
                              .constructor.name.assert_Is('ChildProcess')
        'echo'.start_Process().pid.assert_Is_Number()


    if os.platform() is 'win32'  # tests below Fail in Appveyor
      ### !pragma coverage-skip-block ###
      return

    it 'start_Process_Redirect_Console (good process)', (done)->
      tmp_file       = '_tmp_File_'.add_5_Letters().touch() 
      second_Message = ' this is the 2nd message '.add_5_Letters()
      original_log = console.log
      log_Messages = []
      console.log  = (logMsg)-> log_Messages.push(logMsg)

      childProcess = 'ls'.start_Process_Redirect_Console('.')
      childProcess.on 'exit', ->
        console.log second_Message
        log_Messages.first() .assert_Contains(tmp_file.file_Name())
        log_Messages.second().assert_Is second_Message
        console.log = original_log
        tmp_file.assert_File_Deleted()
        done()

    it 'start_Process_Redirect_Console (stderr message)', (done)->
      log_Messages = []
      console.log  = (logMsg)-> log_Messages.push(logMsg)
      childProcess = 'ls'.start_Process_Redirect_Console 'aaaa'
      childProcess.on 'exit', ->
        log_Messages.assert_Is [ 'ls: aaaa: No such file or directory' ]        
        done() 

    # Fails in Appveyor
    it 'String::start_Process_Capture_Console_Out', (done)->

        runTest = (testData,next)->
            name          = testData.process_Name
            parameter     = testData.process_Parameter
            expected_Data = testData.expected_Data
            name.start_Process_Capture_Console_Out parameter, (data)->
                data.assert_Is(expected_Data)
                next()

        runTests = (testsData, next)->
            if testsData.empty()
                next()
            else
                runTest testsData.pop(), ()-> runTests(testsData, next)

        testsData = [
                        {process_Name: 'echo' , process_Parameter: 'hello'       , expected_Data:'hello\n' }
                        {process_Name: 'echo' , process_Parameter: ['hello','me'], expected_Data:'hello,me\n' }
                        {process_Name: 'echo' , process_Parameter: []            , expected_Data:'\n' }
                        {process_Name: 'echo' , process_Parameter: [null]        , expected_Data:'\n' }
                        {process_Name: 'git'  , process_Parameter: ['xyz'       ], expected_Data:'git: \'xyz\' is not a git command. See \'git --help\'.\n' }
                        #travis and cloud9 sometimes failed on a couple of these (not in an consistent/repeatable way)
                        #{process_Name: 'ls'   , process_Parameter: '.'           , expected_Data:'Cakefile\nLICENSE\nREADME.md\ndocs\npackage.json\nsrc\ntest\n' }
                        #{process_Name: 'ls'   , process_Parameter: null          , expected_Data:'ls: null: No such file or directory\n' }
                    ]

        runTests(testsData, done)
