tests/testthat/test-bidi.R

test_that("Textshaping follows UNICODE Bidi conventions", {
  # First test from the unicode test file
  test_string <- gsub(
    " ",
    "\\u",
    "' 05D0 05D1 0028 05D2 05D3 005B 0026 0065 0066 005D 002E 0029 0067 0068'",
    fixed = TRUE
  )
  test_string <- eval(parse(text = test_string))
  shape <- shape_text(test_string, direction = "ltr")
  expect_equal(
    shape$shape$glyph,
    c(2L, 1L, 3L, 5L, 4L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L)
  )

  skip_on_cran()
  skip_on_ci()

  # Change to FALSE to run ALL tests locally
  skip_if(TRUE, "Skipping time consuming UNICODE Bidi tests")

  test_url <- "https://www.unicode.org/Public/UCD/latest/ucd/BidiCharacterTest.txt"
  tests <- read.csv2(test_url, header = FALSE, comment.char = "#")
  names(tests) <- c(
    "unicode",
    "ltr_set",
    "ltr_detected",
    "bidi_embedding",
    "visual_order"
  )
  tests$visual_order <- lapply(
    strsplit(tests$visual_order, " ", TRUE),
    as.integer
  )
  for (i in seq_len(nrow(tests))[-1]) {
    test_string <- paste0(
      "\"\\u",
      gsub(" ", "\\u", tests$unicode[i], fixed = TRUE),
      "\""
    )
    test_string <- eval(parse(text = test_string))
    dir <- c("ltr", "rtl", "auto")[tests$ltr_set[i] + 1]
    shape <- shape_text(test_string, direction = dir)

    expect_equal(
      shape$metrics$ltr,
      tests$ltr_detected[i] == 0,
      label = paste0("calculated direction [test ", i, "]")
    )

    true_ordering <- tests$visual_order[[i]] + 1L

    # We do the below to make sure that any ligature substitutions doesn't affect the
    # changes
    true_ordering <- intersect(true_ordering, shape$shape$glyph)
    calc_ordering <- intersect(shape$shape$glyph, true_ordering)

    expect_equal(
      calc_ordering,
      true_ordering,
      label = paste0("calculated visual order [test ", i, "]")
    )
  }
})

Try the textshaping package in your browser

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

textshaping documentation built on June 8, 2025, 10:26 a.m.