
test_that("polling for output available", {

  px <- get_tool("px")
  p <- process$new(px, c("sleep", "1", "outln", "foobar"), stdout = "|")

  ## Timeout
  expect_equal(p$poll_io(0), c(output = "timeout", error = "nopipe",
                               process = "nopipe"))

  p$wait()
  expect_equal(p$poll_io(-1), c(output = "ready", error = "nopipe",
                                process = "nopipe"))

  p$read_output_lines()
  expect_equal(p$poll_io(-1), c(output = "ready", error = "nopipe",
                                process = "nopipe"))

  p$kill(close_connections = FALSE)
  expect_equal(p$poll_io(-1), c(output = "ready", error = "nopipe",
                                process = "nopipe"))

  close(p$get_output_connection())
  expect_equal(p$poll_io(-1), c(output = "closed", error = "nopipe",
                                process = "nopipe"))
})

test_that("polling for stderr", {

  px <- get_tool("px")
  p <- process$new(px, c("sleep", "1", "errln", "foobar"), stderr = "|")

  ## Timeout
  expect_equal(p$poll_io(0), c(output = "nopipe", error = "timeout",
                               process = "nopipe"))

  p$wait()
  expect_equal(p$poll_io(-1), c(output = "nopipe", error = "ready",
                                process = "nopipe"))

  p$read_error_lines()
  expect_equal(p$poll_io(-1), c(output = "nopipe", error = "ready",
                                process = "nopipe"))

  p$kill(close_connections = FALSE)
  expect_equal(p$poll_io(-1), c(output = "nopipe", error = "ready",
                                process = "nopipe"))

  close(p$get_error_connection())
  expect_equal(p$poll_io(-1), c(output = "nopipe", error = "closed",
                                process = "nopipe"))
})

test_that("polling for both stdout and stderr", {

  px <- get_tool("px")
  p <- process$new(px, c("sleep", "1", "errln", "foo", "outln", "bar"),
                   stdout = "|", stderr = "|")

  ## Timeout
  expect_equal(p$poll_io(0), c(output = "timeout", error = "timeout",
                               process = "nopipe"))

  p$wait()
  expect_true("ready" %in% p$poll_io(-1))

  p$read_error_lines()
  expect_true("ready" %in% p$poll_io(-1))

  p$kill(close_connections = FALSE)
  expect_true("ready" %in% p$poll_io(-1))

  close(p$get_output_connection())
  close(p$get_error_connection())
  expect_equal(p$poll_io(-1), c(output = "closed", error = "closed",
                                process = "nopipe"))
})

test_that("multiple polls", {

  px <- get_tool("px")
  p <- process$new(
    px, c("sleep", "1", "outln", "foo", "sleep", "1", "outln", "bar"),
    stdout = "|", stderr = "|")
  on.exit(p$kill(), add = TRUE)

  out <- character()
  while (p$is_alive()) {
    p$poll_io(2000)
    out <- c(out, p$read_output_lines())
  }

  expect_identical(out, c("foo", "bar"))
})
