tests/testthat/test-how_far.R

# Test suite created by claude.ai, 2025-01-27
# Some manual editing by me.

# test how_far_calculation -----------------------------------------------

test_that("how_far_calculation returns correct values", {
  # Set up test dates
  due_date <- as.Date("2025-07-01")

  # Test at different points in pregnancy
  # Start of pregnancy (about 40 weeks before due date)
  result <- how_far_calculation(
    on_date = as.Date("2024-09-24"),
    due_date = due_date
  )

  expect_equal(result$weeks_pregnant, 0)
  expect_equal(result$and_days_pregnant, 0)
  expect_equal(result$weeks_to_go, 40)
  expect_equal(result$and_days_to_go, 0)
  expect_equal(result$percent_along, 0)

  # Middle of pregnancy (about 20 weeks)
  result <- how_far_calculation(
    on_date = as.Date("2025-02-11"),
    due_date = due_date
  )

  expect_equal(result$weeks_pregnant, 20)
  expect_equal(result$and_days_pregnant, 0)
  expect_equal(result$weeks_to_go, 20)
  expect_equal(result$and_days_to_go, 0)
  expect_equal(result$percent_along, 50)

  # Near end of pregnancy (38 weeks)
  result <- how_far_calculation(
    on_date = as.Date("2025-06-17"),
    due_date = due_date
  )

  expect_equal(result$weeks_pregnant, 38)
  expect_equal(result$and_days_pregnant, 0)
  expect_equal(result$weeks_to_go, 2)
  expect_equal(result$and_days_to_go, 0)
  expect_equal(result$percent_along, 95)
})

test_that("how_far_calculation handles due_date option", {
  withr::local_options(pregnancy.due_date = as.Date("2025-07-01"))

  result <- how_far_calculation(on_date = as.Date("2025-02-11"))

  expect_equal(result$weeks_pregnant, 20)
  expect_equal(result$weeks_to_go, 20)
})

test_that("how_far_calculation accepts dates as strings", {
  expect_no_error(
    how_far_calculation(
      on_date = "2025-02-11",
      due_date = "2025-07-01"
    )
  )

  expect_equal(
    how_far_calculation(
      on_date = "2025-02-11",
      due_date = "2025-07-01"
    )$days_along,
    140
  )
})


# test how_far_message ---------------------------------------------------
# TODO: something not quite right here because these tests fail on R CMD check without the local option, even though due_date is passed as arg.
test_that("how_far_message formats messages correctly for present date", {
  local_mocked_bindings(Sys.Date = function() as.Date("2027-01-27"))
  withr::local_options(pregnancy.due_date = as.Date("2025-07-01"))

  calc_results <- how_far_calculation(
    on_date = as.Date("2025-01-27", due_date = as.Date("2025-07-01"))
  )

  # Test with default "You"
  result <- how_far_message(
    calc_results,
  )

  expect_length(result$messages, 3)
  expect_match(result$messages[1], "You are 17 weeks and 6 days pregnant")
  expect_match(result$messages[2], "22 weeks and 1 day until the due date")
  expect_match(result$messages[3], "45% through the pregnancy")

  # Test with "I"
  result <- how_far_message(
    calc_results,
    on_date = Sys.Date(),
    person = "I"
  )

  expect_match(result$messages[1], "I am 17 weeks and 6 days pregnant")
  expect_match(result$messages[3], "I am 45% through the pregnancy")

  # Test with custom name
  result <- how_far_message(
    calc_results,
    on_date = Sys.Date(),
    person = "Sarah"
  )

  expect_match(result$messages[1], "Sarah is 17 weeks and 6 days pregnant")
  expect_match(result$messages[3], "Sarah is 45% through the pregnancy")
})


# TODO: something not quite right here because these tests fail on R CMD check without the local option, even though due_date is passed as arg.
test_that("how_far_message formats messages correctly for past/future dates", {
  local_mocked_bindings(Sys.Date = function() as.Date("2025-01-27"))
  withr::local_options(pregnancy.due_date = as.Date("2025-07-01"))
  # Test past date
  calc_results <- how_far_calculation(
    on_date = as.Date("2025-01-01", due_date = as.Date("2025-07-01"))
  )

  result <- how_far_message(
    calc_results,
    on_date = as.Date("2025-01-01"),
    person = "You"
  )

  expect_length(result$messages, 1)
  expect_match(
    result$messages[1],
    "On January 01, 2025, you were 14 weeks and 1 day pregnant"
  )

  # Test future date
  calc_results <- how_far_calculation(
    on_date = as.Date("2025-05-15", due_date = as.Date("2025-07-01"))
  )

  result <- how_far_message(
    calc_results,
    on_date = as.Date("2025-05-15"),
    person = "Sarah"
  )

  expect_length(result$messages, 1)
  expect_match(
    result$messages[1],
    "On May 15, 2025, Sarah will be 33 weeks and 2 days pregnant"
  )
})

test_that("how_far_message handles pregnancy.person option", {
  withr::local_options(pregnancy.person = "Emma")

  calc_results <- list(
    days_along = 250,
    weeks_pregnant = 35,
    and_days_pregnant = 5,
    weeks_to_go = 4,
    and_days_to_go = 2,
    percent_along = 89,
    due_date = as.Date("2025-07-01")
  )

  result <- how_far_message(calc_results, on_date = as.Date("2025-06-01"))

  expect_match(
    result$messages[1],
    "On June 01, 2025, Emma was 35 weeks and 5 days pregnant."
  )
})

test_that("how_far_message handles over 42 weeks appropriately", {
  calc_results <- list(
    weeks_pregnant = 43,
    and_days_pregnant = 2,
    weeks_to_go = 0,
    and_days_to_go = 0,
    percent_along = 100,
    due_date = as.Date("2025-07-01")
  )

  result <- how_far_message(
    calc_results,
    on_date = Sys.Date(),
    person = "You"
  )

  expect_length(result$messages, 1)
  expect_match(
    result$messages[1],
    "Given a due date of July 01, 2025, you would now be more than 42 weeks pregnant"
  )
})

test_that("how_far_message handles over 42 weeks in past and future tenses", {
  # Test past date with over 42 weeks
  calc_results <- list(
    weeks_pregnant = 43,
    and_days_pregnant = 2,
    weeks_to_go = 0,
    and_days_to_go = 0,
    percent_along = 100,
    due_date = as.Date("2025-07-01")
  )

  # Mock current date to be after the test date
  local_mocked_bindings(Sys.Date = function() as.Date("2025-08-20"))

  result <- how_far_message(
    calc_results,
    on_date = as.Date("2025-08-15"), # This is in the "past" relative to mocked Sys.Date
    person = "You"
  )

  expect_length(result$messages, 1)
  expect_match(
    result$messages[1],
    "Given a due date of July 01, 2025, on August 15, 2025, you would have been more than 42 weeks pregnant"
  )

  # Test future date with over 42 weeks
  local_mocked_bindings(Sys.Date = function() as.Date("2025-08-10"))

  result <- how_far_message(
    calc_results,
    on_date = as.Date("2025-08-15"), # This is in the "future" relative to mocked Sys.Date
    person = "Sarah"
  )

  expect_length(result$messages, 1)
  expect_match(
    result$messages[1],
    "Given a due date of July 01, 2025, on August 15, 2025, Sarah would be more than 42 weeks pregnant"
  )
})

test_that("how_far_message handles under 0 days appropriately", {
  calc_results <- how_far_calculation(due_date = as.Date("2030-01-01"))

  result <- how_far_message(
    calc_results,
    on_date = Sys.Date(),
    person = "You"
  )

  expect_length(result$messages, 1)
  expect_match(
    result$messages[1],
    "Given a due date of January 01, 2030, you wouldn't yet be pregnant."
  )
})

test_that("how_far_message handles under 0 days appropriately in past", {
  # due_date 2026-01-01, on_date 2025-01-01
  calc_results <- list(
    days_along = -85,
    weeks_pregnant = -13,
    and_days_pregnant = 6,
    weeks_to_go = 52,
    and_days_to_go = 1,
    percent_along = -30,
    due_date = as.Date("2026-01-01")
  )

  result <- how_far_message(
    calc_results,
    on_date = as.Date("2025-01-01"),
    person = "You"
  )

  expect_length(result$messages, 1)
  expect_match(
    result$messages[1],
    "Given a due date of January 01, 2026, on January 01, 2025, you would have not yet been pregnant."
  )
})

test_that("how_far_message handles under 0 days appropriately, in the future", {
  # due_date 2027-01-01, on_date 2026-01-01

  calc_results <- how_far_calculation(
    on_date = as.Date("2026-01-01"),
    due_date = as.Date("2027-01-01")
  )

  result <- how_far_message(
    calc_results,
    on_date = as.Date("2026-01-01"),
    person = "You"
  )

  expect_length(result$messages, 1)
  expect_match(
    result$messages[1],
    "Given a due date of January 01, 2027, on January 01, 2026, you will not yet be pregnant."
  )
})

# test how_far() ---------------------------------------------------------

test_that("how_far integrates calculation and message correctly", {
  withr::local_options(
    pregnancy.due_date = as.Date("2025-07-01"),
    pregnancy.person = "Sarah"
  )

  # Test integration: calculation + messaging work together, return correct value
  result <- suppressMessages(how_far(on_date = as.Date("2025-02-11")))
  expect_equal(result, 140) # 20 weeks = 140 days

  # Test with explicitly provided arguments
  result <- suppressMessages(how_far(
    on_date = as.Date("2025-02-11"),
    due_date = as.Date("2025-07-01"),
    person = "Emma"
  ))
  expect_equal(result, 140)

  # Verify the messages are actually being generated (integration aspect)
  messages <- capture_messages(how_far(on_date = as.Date("2025-02-11")))
  expect_length(messages, 1) # Confirms messaging system is working
  expect_match(messages[1], "Sarah was 20 weeks and 0 days pregnant")
})

test_that("how_far prints additional messages when in normal pregnancy range", {
  due_date <- as.Date("2025-12-01")
  local_mocked_bindings(Sys.Date = function() as.Date("2025-08-28"))

  # Capture all messages
  messages <- capture_messages(
    how_far(due_date = due_date)
  )

  # Should have 3 messages for present tense normal pregnancy
  expect_length(messages, 3)

  # Verify messages contain expected content
  expect_match(messages[1], "You are 26 weeks and 3 days pregnant")
  expect_match(
    messages[2],
    "That's 13 weeks and 4 days until the due date (December 01, 2025).",
    fixed = TRUE
  )
  expect_match(messages[3], "You are 66% through the pregnancy.")
})

Try the pregnancy package in your browser

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

pregnancy documentation built on Sept. 14, 2025, 5:09 p.m.