tests/testthat/test-rank-classification.R

# ==============================================================================
# TEST SUITE 2: Rank Classification
# ==============================================================================
# Validates .splist_classify() and .transform_split_classify()
# Based on critical rank validation issues found during development

test_that("Binomial names are classified as Rank 2", {
  input <- c(
    "Cattleya maxima",
    "Polylepis incana",
    "Puya raimondii"
  )

  result <- peruflorads43:::.splist_classify(input) |>
    peruflorads43:::.transform_split_classify()

  expect_equal(result$Rank, c(2L, 2L, 2L))
  expect_false(any(is.na(result$Orig.Genus)))
  expect_false(any(is.na(result$Orig.Species)))
  expect_true(all(is.na(result$Orig.Infraspecies)))
})

test_that("Trinomial names are classified as Rank 3", {
  # Issue discovered: Must have both Orig.Infra.Rank AND Orig.Infraspecies
  input <- c(
    "Cattleya maxima var. alba",
    "Polylepis incana subsp. incana",
    "Gentianella bicolor f. bicolor"
  )

  result <- peruflorads43:::.splist_classify(input) |>
    peruflorads43:::.transform_split_classify()

  expect_equal(result$Rank, c(3L, 3L, 3L))
  expect_false(any(is.na(result$Orig.Genus)))
  expect_false(any(is.na(result$Orig.Species)))
  expect_false(any(is.na(result$Orig.Infraspecies)))
  expect_false(any(is.na(result$Orig.Infra.Rank)))

  # Infraspecies_2 should be NA for Rank 3
  expect_true(all(is.na(result$Orig.Infraspecies_2)))
})

test_that("Quaternomial names are classified as Rank 4", {
  # Critical issue: Rank 4 requires BOTH levels of infraspecies
  input <- c(
    "Haageocereus acranthus subsp. olowinskianus f. deflexispinus"
  )

  result <- peruflorads43:::.splist_classify(input) |>
    peruflorads43:::.transform_split_classify()

  expect_equal(result$Rank, 4L)
  expect_false(is.na(result$Orig.Genus))
  expect_false(is.na(result$Orig.Species))
  expect_false(is.na(result$Orig.Infraspecies))
  expect_false(is.na(result$Orig.Infra.Rank))
  expect_false(is.na(result$Orig.Infraspecies_2))
  expect_false(is.na(result$Orig.Infra.Rank_2))

  expect_equal(result$Orig.Infra.Rank, "SUBSP.")
  expect_equal(result$Orig.Infra.Rank_2, "F.")
})

test_that("Genus-only names are classified as Rank 1", {
  # Issue discovered: "Microchilus" should be Rank 1
  input <- c("Microchilus", "Cattleya", "Polylepis")

  result <- peruflorads43:::.splist_classify(input) |>
    peruflorads43:::.transform_split_classify()

  expect_equal(result$Rank, c(1L, 1L, 1L))
  expect_false(any(is.na(result$Orig.Genus)))
  expect_true(all(is.na(result$Orig.Species)))
})

test_that("Authors are separated correctly", {
  input <- c(
    "Cattleya maxima Lindl.",
    "Polylepis incana Kunth",
    "Puya raimondii Harms"
  )

  result <- peruflorads43:::.splist_classify(input) |>
    peruflorads43:::.transform_split_classify()

  expect_equal(result$Author, c("LINDL.", "KUNTH", "HARMS"))
})

test_that("Multiple infraspecific categories are ordered correctly", {
  # First non-empty infraspecific category should be level 1
  # Second should be level 2
  input <- "Species alba var. rubra f. compacta"

  result <- peruflorads43:::.splist_classify(input) |>
    peruflorads43:::.transform_split_classify()

  expect_equal(result$Orig.Infraspecies, "RUBRA")
  expect_equal(result$Orig.Infra.Rank, "VAR.")
  expect_equal(result$Orig.Infraspecies_2, "COMPACTA")
  expect_equal(result$Orig.Infra.Rank_2, "F.")
})

Try the peruflorads43 package in your browser

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

peruflorads43 documentation built on Nov. 24, 2025, 10:15 a.m.