tests/testthat/test-issue-481-glmmtmb-duplication.R

test_that("issue #481 - no text duplication in gsub pattern", {
  # Test the .info_effectsize function directly to ensure the regex fix works
  # This tests the specific fix for the duplicated text issue

  # Mock effectsize object with attributes that could trigger the bug
  mock_effectsize <- list()

  # Test case 1: Correct replacement with literal period
  attr(mock_effectsize, "method") <- paste0(
    "Standardized parameters were obtained by fitting the model ",
    "on a standardized version of the dataset."
  )
  attr(
    mock_effectsize,
    "rules"
  ) <- "Effect sizes were interpreted according to Cohen's (1988) conventions."

  result1 <- report:::.info_effectsize(
    NULL,
    effectsize = mock_effectsize,
    include_effectsize = TRUE
  )
  expected1 <- paste0(
    "Standardized parameters were obtained by fitting the model ",
    "on a standardized version of the dataset and were interpreted ",
    "according to Cohen's (1988) conventions."
  )
  expect_identical(result1, expected1)

  # Test case 2: Should NOT replace when there's no literal period before "Effect sizes"
  attr(
    mock_effectsize,
    "method"
  ) <- "Standardized parameters were obtained by fitting the model"
  attr(
    mock_effectsize,
    "rules"
  ) <- " Effect sizes were interpreted according to Cohen's (1988) conventions."

  result2 <- report:::.info_effectsize(
    NULL,
    effectsize = mock_effectsize,
    include_effectsize = TRUE
  )
  expected2 <- paste0(
    "Standardized parameters were obtained by fitting the model",
    " Effect sizes were interpreted according to Cohen's (1988) conventions."
  )
  expect_identical(result2, expected2)

  # Test case 3: Edge case - text that might have caused the original bug
  # Before the fix, ".Effect sizes " would match any single character + "Effect sizes "
  attr(mock_effectsize, "method") <- "Some text"
  attr(mock_effectsize, "rules") <- "xEffect sizes are interpreted." # This should NOT be replaced

  result3 <- report:::.info_effectsize(
    NULL,
    effectsize = mock_effectsize,
    include_effectsize = TRUE
  )
  expected3 <- "Some textxEffect sizes are interpreted."
  expect_identical(result3, expected3)
})

test_that("gsub regex pattern is correctly escaped", {
  # Direct test of the regex pattern to ensure it only matches literal periods

  # Test strings that should be replaced (literal period followed by space)
  test_string1 <- "Some text.Effect sizes follow Cohen's recommendations."
  result1 <- gsub(
    pattern = ".Effect sizes ",
    replacement = " and ",
    x = test_string1,
    fixed = TRUE
  )
  expect_identical(result1, "Some text and follow Cohen's recommendations.")

  # Test strings that should NOT be replaced (other characters)
  test_string2 <- "Some textxEffect sizes follow Cohen's recommendations."
  result2 <- gsub(
    pattern = ".Effect sizes ",
    replacement = " and ",
    x = test_string2,
    fixed = TRUE
  )
  expect_identical(result2, test_string2) # Should remain unchanged

  test_string3 <- "Some text Effect sizes follow Cohen's recommendations."
  result3 <- gsub(
    pattern = ".Effect sizes ",
    replacement = " and ",
    x = test_string3,
    fixed = TRUE
  )
  expect_identical(result3, test_string3) # Should remain unchanged (space, not period)

  # Test the problematic case that could cause duplication
  problem_case <- "Standardized parameters were computed.Effect sizes were interpreted."
  fixed_result <- gsub(
    pattern = ".Effect sizes ",
    replacement = " and ",
    x = problem_case,
    fixed = TRUE
  )
  expect_identical(
    fixed_result,
    "Standardized parameters were computed and were interpreted."
  )

  # Show what the old broken pattern would do (for documentation)
  broken_result <- gsub(
    pattern = ".Effect sizes ",
    replacement = " and ",
    x = problem_case,
    fixed = TRUE
  )
  expect_identical(
    broken_result,
    "Standardized parameters were computed and were interpreted."
  )
  # Note: both should produce same result for this specific case, but old pattern
  # would incorrectly match other characters too
})

test_that("no redundant CI information concatenation in report_info.lm", {
  # Test that report_info.lm doesn't duplicate CI information when effectsize already contains it

  data(mtcars)
  model <- lm(mpg ~ hp + wt, data = mtcars)

  # Create mock effectsize object with CI information already included
  mock_effectsize <- structure(c(1, 2, 3), class = "effectsize_table")
  attr(mock_effectsize, "method") <- paste0(
    "Standardized parameters were obtained by fitting the model on a standardized version of the dataset. ",
    "95% Confidence Intervals (CIs) and p-values were computed using a Wald z-distribution approximation."
  )
  attr(mock_effectsize, "rules") <- "Effect sizes follow Cohen's conventions."

  # Get parameters to have proper attributes structure
  table <- report_table(model, include_effectsize = TRUE)
  params <- report_parameters(model, table = table)
  attributes(params)$effectsize <- mock_effectsize

  # Test report_info with the mock effectsize
  info_result <- report_info(
    model,
    effectsize = mock_effectsize,
    parameters = params,
    include_effectsize = TRUE
  )
  info_text <- as.character(info_result)

  # Should NOT contain duplicate CI descriptions
  ci_pattern_count <- length(gregexpr(
    "Confidence Intervals.*computed using.*approximation",
    info_text
  )[[1]])
  expect_identical(
    ci_pattern_count,
    1L,
    info = paste(
      "Expected 1 CI description, got",
      ci_pattern_count,
      "in text:",
      info_text
    )
  )

  # Should contain the z-distribution info from effectsize, not t-distribution
  expect_true(grepl("z-distribution approximation", info_text, fixed = TRUE))
  expect_false(grepl("t-distribution approximation", info_text, fixed = TRUE))

  # Should contain properly joined text with " and " from regex fix
  expect_true(grepl("approximation and follow", info_text, fixed = TRUE))
})

Try the report package in your browser

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

report documentation built on Nov. 5, 2025, 7:38 p.m.