context("knitr")

test_that("An R Markdown document can be rendered using reticulate", {

  skip_on_cran()
  skip_on_os("windows")
  skip_if_not_installed("rmarkdown")
  skip_if(py_version() < "3") # plotly _repr_html_ test fails in py2


  modules <- c("numpy", "matplotlib", "pandas", "plotly",
               "tabulate", "IPython")
  for (module in modules) {
    if (!py_module_available(module)) {
      fmt <- "module '%s' not available; skipping"
      skip(sprintf(fmt, module))
    }
  }

  owd <- setwd(test_path("resources"))
  status <- rmarkdown::render("eng-reticulate-example.Rmd", quiet = TRUE)
  setwd(owd)

  expect_true(file.exists(status), "example.Rmd rendered successfully")
})




test_that("Figures saved in correct place with custom root.dir", {

  skip_on_cran()
  skip_if_not_installed("rmarkdown")
  skip_if(py_version() < "3.8") # end_lineno attr added in 3.8

  rmd_filepath <- normalizePath(file.path(test_path("resources"),
                                          "test-custom-root-dir.Rmd"))

  dir.create(dir <- tempfile("reticulate-knitr-test-dir"))
  owd <- setwd(dir)

  file.copy(rmd_filepath, ".")
  output <- knitr::knit("test-custom-root-dir.Rmd", quiet = TRUE)

  expect_true(file.exists(output), "test-custom-root-dir.Rmd rendered successfully")

  setwd(owd)

})


test_that("In Rmd chunks, comments and output attach to code correctly", {

  skip_on_cran()
  skip_if_not_installed("rmarkdown")
  skip_if(py_version() < "3.8") # end_lineno attr added in 3.8

  local_edition(3) # needed for expect_snapshot_file()
  # TODO: update the full testsuite to testthat edition 3

  owd <- setwd(test_path("resources"))
  rmarkdown::render("test-chunking.Rmd", quiet = TRUE)

  expect_snapshot_file("test-chunking.md")
  setwd(owd)

})


test_that("knitr 'warning=FALSE' option", {

  skip_on_cran()
  skip_if_not_installed("rmarkdown")

  local_edition(3) # needed for expect_snapshot_file()

  owd <- setwd(test_path("resources"))
  rmarkdown::render("knitr-warn.Rmd", quiet = TRUE)
  setwd(owd)

  rendered <- test_path("resources", "knitr-warn.md")
  res <- paste0(readLines(rendered), collapse = "\n")

  expect_snapshot_file(rendered)
  expect_no_match(res, "UserWarning", fixed = TRUE)

})

test_that("Output streams are remapped when kniting", {

  skip_on_cran()
  skip_if_not_installed("rmarkdown")
  local_edition(3)

  owd <- setwd(test_path("resources"))
  rmarkdown::render("knitr-print.Rmd", quiet = TRUE)
  setwd(owd)

  rendered <- test_path("resources", "knitr-print.md")
  expect_snapshot_file(rendered)

  # if remapping is set by default we have no way to check that the options
  # is correctly reset
  skip_if(!is.na(Sys.getenv("RETICULATE_REMAP_OUTPUT_STREAMS", unset = NA)))

  bt <- reticulate::import_builtins()
  x <- py_capture_output(out <- capture.output({
    bt$print("hello world")
  }))
  expect_length(out, 0)

  # make sure it works from a background session
  callr::r(function(path) {
    setwd(path)
    rmarkdown::render(
      "knitr-print.Rmd",
      output_file = "knitr-print2.md",
      quiet = TRUE
    )
  }, args = list(path = test_path("resources")))

  expect_snapshot_file(test_path("resources", "knitr-print2.md"))
})
