tests/testthat/test-set-solver-solve.R

test_that("set_solver covers single assignment, wrappers, warnings, and validation", {
  p <- make_round4_problem()

  expect_error(multiscape::set_solver(list()), "Problem")
  expect_error(multiscape::set_solver(p, solver_params = "bad"), "solver_params")
  expect_error(multiscape::set_solver(p, gap_limit = -0.1), "gap_limit")
  expect_error(multiscape::set_solver(p, time_limit = -1), "time_limit")
  expect_error(multiscape::set_solver(p, solution_limit = NA), "solution_limit")
  expect_error(multiscape::set_solver(p, cores = 0), "cores")
  expect_error(multiscape::set_solver(p, verbose = NA), "verbose")
  expect_error(multiscape::set_solver(p, write_log = NA), "write_log")
  expect_error(multiscape::set_solver(p, log_file = ""), "log_file")
  expect_error(multiscape::set_solver_gurobi(p, write_log = TRUE), "log_file")

  expect_warning(
    p_log <- multiscape::set_solver(p, write_log = FALSE, log_file = "solver.log"),
    "write_log = FALSE"
  )
  expect_identical(p_log$data$solve_args$name_output_file, "solver.log")

  expect_warning(p1 <- multiscape::set_solver(
    p,
    solver = "cbc",
    gap_limit = 0.12345,
    time_limit = 10.9876,
    solution_limit = TRUE,
    cores = 1,
    verbose = TRUE,
    solver_params = list(a = 1),
    b = 2
  ), "thread control is not available through rcbc")

  expect_identical(p1$data$solve_args$solver, "cbc")
  expect_equal(p1$data$solve_args$gap_limit, 0.12345)
  expect_equal(p1$data$solve_args$time_limit, 10.988)
  expect_true(p1$data$solve_args$solution_limit)
  expect_true(p1$data$solve_args$verbose)
  expect_equal(p1$data$solve_args$solver_params$a, 1)
  expect_equal(p1$data$solve_args$solver_params$b, 2)

  expect_error(multiscape::set_solver(p1, solver = "gurobi"), "already defined")
  p2 <- multiscape::set_solver(p, solver = "gurobi", solver_params = list(a = 3))
  expect_identical(p2$data$solve_args$solver, "gurobi")
  expect_null(p2$data$solve_args$gap_limit)
  expect_equal(p2$data$solve_args$solver_params$a, 3)
  expect_null(p2$data$solve_args$solver_params$b)

  expect_identical(multiscape::set_solver_gurobi(p)$data$solve_args$solver, "gurobi")
  expect_identical(multiscape::set_solver_cbc(p)$data$solve_args$solver, "cbc")
  expect_identical(multiscape::set_solver_cplex(p)$data$solve_args$solver, "cplex")
  expect_identical(multiscape::set_solver_symphony(p)$data$solve_args$solver, "symphony")
})


test_that("solve dispatch validates malformed method configurations before solver use", {
  p <- make_round4_mo_problem()

  p_bad <- p
  p_bad$data$method <- list(type = "")
  expect_error(multiscape::solve(p_bad), "missing method name")

  p_bad$data$method <- list(type = "unsupported_method")
  expect_error(multiscape::solve(p_bad), "Unknown|unsupported")

  p_nomethod <- p
  p_nomethod$data$method <- NULL
  expect_error(multiscape::solve(p_nomethod), "Multiple objectives")
})

Try the multiscape package in your browser

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

multiscape documentation built on Oct. 12, 2026, 5:08 p.m.