test_that("rss_self returns current process RSS", {
  rss <- rss_self()

  # Should be either a positive number or NA (if monitoring unavailable)
  if (!is.na(rss)) {
    expect_true(rss > 0)
    # R process should use at least some memory (10MB minimum)
    expect_gt(rss, 10 * 1024^2)
  }
})

test_that("rss_get_pid returns NA for invalid PID", {
  expect_true(is.na(rss_get_pid(NA)))
  # On Windows, wmic may be missing and produce a warning
  rss <- suppressWarnings(rss_get_pid(999999999)) # Unlikely to exist
  expect_true(is.na(rss))
})

test_that("rss_get_pid works for current process", {
  expect_silent({
    rss <- rss_get_pid(Sys.getpid())
  })

  # Should match rss_self
  rss_self_val <- rss_self()

  if (!is.na(rss) && !is.na(rss_self_val)) {
    # Allow some variance (10%)
    expect_true(abs(rss - rss_self_val) / rss_self_val < 0.1)
  }
})

test_that("rss_monitor tracks samples over time", {
  mon <- rss_monitor(Sys.getpid())

  # Take some samples
  mon$sample()
  Sys.sleep(0.05)
  mon$sample()
  Sys.sleep(0.05)
  mon$sample()

  hist <- mon$history()
  expect_equal(nrow(hist), 3L)
  expect_true("timestamp" %in% names(hist))
  expect_true("rss" %in% names(hist))

  # Peak should be valid
  peak <- mon$peak()
  if (!is.na(peak)) {
    expect_gt(peak, 0)
  }
})

test_that("rss_monitor drift calculation", {
  mon <- rss_monitor(Sys.getpid())

  # Single sample - drift should be NA
  mon$sample()
  expect_true(is.na(mon$drift()))

  # Second sample - drift should be calculable
  mon$sample()
  drift <- mon$drift()

  # Drift should be small for stable process
  if (!is.na(drift)) {
    expect_true(abs(drift) < 0.5)  # Less than 50% change
  }
})
