test_that("run_coverage returns correct fraction on success", {
  pkg_path <- "path/to/test.pkg"
  
  # Mock run_covr to return 75% coverage
  mock_cov_list <- list(totalcoverage = 75, filecoverage = c(a = 75))
  mockery::stub(run_coverage, "run_covr", mock_cov_list)
  
  testthat::expect_message(
    res <- run_coverage(pkg_path),
    "code coverage for test.pkg successful"
  )
  
  # Check fraction conversion (75/100 = 0.75)
  testthat::expect_equal(res$total_cov, 0.75)
  testthat::expect_equal(res$res_cov$name, "test.pkg")
})

test_that("run_coverage handles packages with no testable functions", {
  pkg_path <- "path/to/empty.pkg"
  
  # Mock the specific state: NaN total and logical(0) file coverage
  mock_cov_list <- list(totalcoverage = NaN, filecoverage = logical(0))
  mockery::stub(run_coverage, "run_covr", mock_cov_list)
  
  testthat::expect_message(
    res <- run_coverage(pkg_path),
    "R coverage for empty.pkg had notes: no testable functions found"
  )
  
  # Code coerces NaN to 0 in this specific case
  testthat::expect_equal(res$total_cov, 0)
  testthat::expect_equal(res$res_cov$notes, "no testable functions found")
})

test_that("run_coverage catches errors from run_covr", {
  pkg_path <- "path/to/failing.pkg"
  
  # Force run_covr to throw an error
  mockery::stub(run_coverage, "run_covr", function(...) stop("Process Timeout"))
  
  testthat::expect_message(
    res <- run_coverage(pkg_path),
    "code coverage for failing.pkg unsuccessful"
  )
  
  # Verify error capture
  testthat::expect_true(is.na(res$total_cov))
  testthat::expect_s3_class(res$res_cov$errors, "error")
  testthat::expect_match(res$res_cov$errors$message, "Process Timeout")
})

test_that("run_coverage identifies non-standard package failures such as NaN coverage with non-empty filecoverage", {
  pkg_path <- "path/to/weird.pkg"
  
  # NaN total but filecoverage is NOT an empty logical
  mock_cov_list <- list(totalcoverage = NaN, filecoverage = list(complex = 1))
  mockery::stub(run_coverage, "run_covr", mock_cov_list)
  
  testthat::expect_message(
    res <- run_coverage(pkg_path),
    "Total coverage returned NaN"
  )
  
  testthat::expect_true(is.na(res$total_cov))
  testthat::expect_true(is.na(res$res_cov$notes))
})

