tests/testthat/test_combine.R

test_that("bind_subtitles returns a subtitles object when collapse = TRUE", {
  s <- make_valid_subtitles()
  result <- bind_subtitles(s, s)
  expect_s3_class(result, "subtitles")
})

test_that("bind_subtitles returns a multisubtitles object when collapse = FALSE", {
  s <- make_valid_subtitles()
  result <- bind_subtitles(s, s, collapse = FALSE)
  expect_s3_class(result, "multisubtitles")
  expect_length(result, 2L)
})

test_that("bind_subtitles sequential = FALSE leaves timecodes unchanged", {
  s <- make_valid_subtitles()
  result <- bind_subtitles(s, s, collapse = FALSE, sequential = FALSE)
  expect_equal(result[[1]]$Timecode_in, s$Timecode_in)
  expect_equal(result[[2]]$Timecode_in, s$Timecode_in)
  expect_equal(result[[1]]$Timecode_out, s$Timecode_out)
  expect_equal(result[[2]]$Timecode_out, s$Timecode_out)
})

test_that("bind_subtitles sequential = TRUE shifts second subtitle by max Timecode_out of first", {
  s <- make_valid_subtitles()
  # s has Timecode_in = c(1,5,11) and Timecode_out = c(4,9,14)
  # max(Timecode_out) of s = 14, so second s should be shifted by 14
  result <- bind_subtitles(s, s, collapse = FALSE, sequential = TRUE)
  expect_equal(result[[1]]$Timecode_in, s$Timecode_in)
  expect_equal(result[[1]]$Timecode_out, s$Timecode_out)
  expect_equal(result[[2]]$Timecode_in, hms::as_hms(c(1, 5, 11) + 14))
  expect_equal(result[[2]]$Timecode_out, hms::as_hms(c(4, 9, 14) + 14))
})

test_that("bind_subtitles sequential = TRUE accumulates offsets across three subtitles", {
  s <- make_valid_subtitles()
  # max Timecode_out of s = 14
  # offset[1] = 0, offset[2] = 14, offset[3] = 14 + 14 = 28
  result <- bind_subtitles(s, s, s, collapse = FALSE, sequential = TRUE)
  expect_equal(result[[1]]$Timecode_in, hms::as_hms(c(1, 5, 11) + 0))
  expect_equal(result[[2]]$Timecode_in, hms::as_hms(c(1, 5, 11) + 14))
  expect_equal(result[[3]]$Timecode_in, hms::as_hms(c(1, 5, 11) + 28))
})

test_that("bind_subtitles sequential collapsed result has correct row count", {
  s <- make_valid_subtitles()
  result <- bind_subtitles(s, s)
  expect_equal(nrow(result), nrow(s) * 2L)
})

test_that("bind_subtitles sequential collapsed timecodes are correct", {
  s <- make_valid_subtitles()
  result <- bind_subtitles(s, s)
  expect_equal(result$Timecode_in, hms::as_hms(c(1, 5, 11, 1 + 14, 5 + 14, 11 + 14)))
  expect_equal(result$Timecode_out, hms::as_hms(c(4, 9, 14, 4 + 14, 9 + 14, 14 + 14)))
})

test_that("bind_subtitles timecodes remain hms/difftime class after sequential shift", {
  s <- make_valid_subtitles()
  result <- bind_subtitles(s, s, collapse = FALSE, sequential = TRUE)
  expect_s3_class(result[[2]]$Timecode_in, c("hms", "difftime"), exact = TRUE)
  expect_s3_class(result[[2]]$Timecode_out, c("hms", "difftime"), exact = TRUE)
})

test_that("bind_subtitles unpacks multisubtitles input", {
  s <- make_valid_subtitles()
  multi <- bind_subtitles(s, s, collapse = FALSE, sequential = FALSE)
  result <- bind_subtitles(multi, collapse = FALSE, sequential = FALSE)
  expect_s3_class(result, "multisubtitles")
  expect_length(result, 2L)
})

test_that("bind_subtitles rejects non-subtitles input", {
  expect_error(bind_subtitles(data.frame()))
})

Try the subtools package in your browser

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

subtools documentation built on March 24, 2026, 5:07 p.m.