tests/testthat/test-qgis-function.R

test_that("qgis_function() works", {
  skip_if_not(has_qgis())

  expect_error(
    qgis_function("native:buffer", NOT_AN_ARG = "value"),
    "must be valid input names"
  )
  expect_error(
    qgis_function("native:buffer", "no name"),
    "must be named"
  )

  qgis_buffer <- qgis_function("native:buffer")
  expect_type(qgis_buffer, "closure")
  expect_identical(parent.env(environment(qgis_buffer)), baseenv())
  expect_true(rlang::is_call(body(qgis_buffer), "qgis_run_algorithm", ns = "qgisprocess"))

  buffer_args <- qgis_get_argument_specs("native:buffer")
  expect_identical(
    names(formals(qgis_buffer)),
    c(
      buffer_args$name,
      setdiff(names(formals(qgis_run_algorithm)), c("algorithm", "...", ".raw_json_input"))
    )
  )

  result <- qgis_buffer(
    system.file("longlake/longlake_depth.gpkg", package = "qgisprocess"),
    DISTANCE = 100,
    DISSOLVE = TRUE,
    MITER_LIMIT = 2,
    OUTPUT = qgis_tmp_vector(),
    END_CAP_STYLE = 0,
    JOIN_STYLE = 0
  )

  expect_s3_class(result, "qgis_result")
})

test_that("qgis_run_algorithm_p() works", {
  skip_if_not(has_qgis())
  skip_if_not_installed("sf")

  result <- system.file("longlake/longlake_depth.gpkg", package = "qgisprocess") |>
    qgis_run_algorithm_p(
      "native:buffer",
      DISTANCE = 100,
      DISSOLVE = TRUE,
      MITER_LIMIT = 2,
      OUTPUT = qgis_tmp_vector(),
      END_CAP_STYLE = 0,
      JOIN_STYLE = 0
    )

  expect_s3_class(result, "qgis_result")
  expect_true(file.exists(result$.args$OUTPUT))

  result2 <- result |>
    qgis_run_algorithm_p("native:subdivide", MAX_NODES = 10, .clean = FALSE) |>
    qgis_run_algorithm_p("native:dissolve", .clean = FALSE)

  expect_true(file.exists(result$.args$OUTPUT))

  expect_s3_class(result2, "qgis_result")
  expect_named(result2, c("OUTPUT", ".algorithm", ".args", ".raw_json_input", ".processx_result"))
  expect_equal(sf::st_area(sf::st_as_sf(result)), sf::st_area(sf::st_as_sf(result2)))

  result3 <- result |>
    qgis_extract_output_by_name("OUTPUT") |>
    qgis_run_algorithm_p("native:subdivide", MAX_NODES = 10)
  expect_s3_class(result3, "qgis_result")
  expect_named(result3, c("OUTPUT", ".algorithm", ".args", ".raw_json_input", ".processx_result"))

  expect_error(
    result |>
      qgis_run_algorithm_p(
        "native:subdivide",
        MAX_NODES = 10,
        .clean = FALSE,
        .select = "dummy"
      ),
    "The qgis_result object misses"
  )

  result4 <- result |>
    qgis_run_algorithm_p("native:subdivide", MAX_NODES = 10)
  expect_false(file.exists(result$.args$OUTPUT))

  fake_result <- structure(result[".processx_result"], class = "qgis_result")
  expect_error(
    fake_result |> qgis_run_algorithm_p("native:subdivide", MAX_NODES = 10),
    "The qgis_result object misses"
  )
})

Try the qgisprocess package in your browser

Any scripts or data that you put into this service are public.

qgisprocess documentation built on Sept. 11, 2024, 6:43 p.m.