Expected `original` to equal `matched`.
Differences:
`actual`:   "Oligoryzomys sp. C"
`expected`: "Oligoryzomys sp. c"

# TEST SUITE 1: Tests de Integración Completa
test_that("Flujo completo de matching funciona end-to-end", {
# Test 1.1: Tomar muestra de especies del dataset y hacer matching
result <- validate_peru_mammals(sample_species, quiet = TRUE)
# Test 1.2: Verificar que los matches son correctos
test_that("Matching preserva orden de input", {
result <- validate_peru_mammals(species_ordered, quiet = TRUE)
# Test 1.3: Verificar que el orden se mantiene
# TEST SUITE 2: Edge Cases - Nombres Problemáticos
test_that("Manejo de caracteres especiales", {
result_num <- validate_peru_mammals("Species123", quiet = TRUE)
result_hyphen <- validate_peru_mammals("Genus-species", quiet = TRUE)
result_dot <- validate_peru_mammals("Genus sp.", quiet = TRUE)
result_paren <- validate_peru_mammals("Genus (species)", quiet = TRUE)
# test_that("Manejo de strings extremos", {
#   long_string <- paste(rep("word", 50), collapse = " ")
#   result_long <- validate_peru_mammals(long_string, quiet = TRUE)
#   result_empty <- validate_peru_mammals("", quiet = TRUE)
#   result_spaces <- validate_peru_mammals("   ", quiet = TRUE)
#   # Test 2.8: Tabulaciones y saltos de línea
#   result_whitespace <- validate_peru_mammals("\t\n", quiet = TRUE)
test_that("Manejo de caracteres Unicode y acentos", {
result_accent <- validate_peru_mammals("Génus spécies", quiet = TRUE)
result_unicode <- validate_peru_mammals("Genüs spëcies", quiet = TRUE)
# TEST SUITE 3: Edge Cases - Vectores Especiales
test_that("Manejo de vectores edge case", {
result_single <- validate_peru_mammals("Akodon torques", quiet = TRUE)
many_nas <- c(NA, NA, "Akodon torques", NA, "Mus musculus", NA)
result_nas <- validate_peru_mammals(many_nas, quiet = TRUE)
# result_all_nas <- validate_peru_mammals(all_nas, quiet = TRUE)
empties <- c("", "", "Akodon torques", "")
result_empties <- validate_peru_mammals(empties, quiet = TRUE)
# Test 3.5: Vector con todo el mismo valor repetido
result_repeated <- validate_peru_mammals(repeated, quiet = TRUE)
# TEST SUITE 4: Edge Cases - Fuzzy Matching Límites
test_that("Fuzzy matching con distancias extremas", {
result_1char <- validate_peru_mammals("Akodn torques", quiet = TRUE)  # Falta una 'o'
result_2char <- validate_peru_mammals("Akdn torques", quiet = TRUE)  # Faltan 'o' y 'o'
# Test 4.3: Nombre completamente diferente (no debe hacer match)
result_different <- validate_peru_mammals("Xxxxx yyyyy", quiet = TRUE)
result_transpose <- validate_peru_mammals("Akdoon torques", quiet = TRUE)
test_that("Fuzzy matching con nombres similares", {
# Test 4.5: Si hay géneros similares, fuzzy debería elegir el más cercano
# Esto dependerá de qué géneros realmente existan en peru_mammals
# Test 4.6: Especies del mismo género con nombres similares
akodon_species <- subset(peru_mammals, genus == "Akodon")
sp1_typo <- paste0(substr(sp1, 1, nchar(sp1)-1), "x")
result_sp_typo <- validate_peru_mammals(paste("Akodon", sp1_typo), quiet = TRUE)
test_that("Performance con datasets grandes", {
# Test 5.1: Lista grande de especies válidas
large_valid <- rep(c("Akodon torques", "Mus musculus",
result_large <- validate_peru_mammals(large_valid, quiet = TRUE)
# Performance debe ser razonable (< 30 segundos)
execution_time <- as.numeric(difftime(end_time, start_time, units = "secs"))
test_that("Performance con muchos fuzzy matches", {
# Test 5.2: Lista con muchos typos (fuzzy matching intensivo)
result_typos <- validate_peru_mammals(rep(typos, 10), quiet = FALSE)
# TEST SUITE 6: Integración con Ecorregiones
test_that("Integración entre especies y ecorregiones", {
# Test 6.1: Matching de especies y lookup de ecorregiones
match_result <- validate_peru_mammals(test_species, quiet = TRUE)
# Para cada especie matched, debe haber info de ecorregiones disponible
# Puede o no tener ecorregiones, pero la búsqueda debe funcionar
test_that("Workflow completo: match + lookup de metadatos", {
# Test 6.2: Flujo completo de usuario típico
user_input <- c("Akodon torques", "Invalid name", "Mus musculus")
match_result <- validate_peru_mammals(user_input, quiet = TRUE)
valid_matches <- subset(match_result, matched == TRUE)
# Paso 3: Lookup de información adicional
species_info <- subset(peru_mammals, scientific_name == species_name)
# TEST SUITE 7: Consistencia de Resultados
# Test 7.1: Múltiples ejecuciones dan mismo resultado
species_list <- c("Akodon torques", "Mus musculus", "Genus unknown")
results[[i]] <- validate_peru_mammals(species_list, quiet = TRUE)
# Todos los resultados deben ser idénticos
# Test 7.2: Una llamada no afecta a la siguiente
result1 <- validate_peru_mammals("Akodon torques", quiet = TRUE)
result2 <- validate_peru_mammals("Mus musculus", quiet = TRUE)
result3 <- validate_peru_mammals("Akodon torques", quiet = TRUE)
# Primera y tercera llamada deben dar exactamente el mismo resultado
# TEST SUITE 8: Compatibilidad con dplyr/tidyverse
test_that("Resultados son compatibles con tidyverse", {
# Test 8.1: Resultado se puede usar con %>%
result <- validate_peru_mammals(c("Akodon torques", "Mus musculus"), quiet = TRUE) %>%
# Test 8.2: Se puede hacer join con otros datasets
match_result <- validate_peru_mammals(c("Akodon torques", "Mus musculus"), quiet = TRUE)
by = c("Matched.Name" = "scientific_name"))
# TEST SUITE 9: Validación de Mensajes de Error
test_that("Mensajes de error son informativos", {
#   validate_peru_mammals("Akodon torques", quiet = TRUE),
test_that("Casos conocidos mantienen comportamiento esperado", {
# Test 10.1: Especies comunes que deben hacer match
result <- validate_peru_mammals(common_species, quiet = TRUE)
result_genus <- validate_peru_mammals("Akodon", quiet = TRUE)
result_invalid <- validate_peru_mammals("Fakeus nonexistus", quiet = TRUE)
# TEST SUITE 12: Validación Cruzada de Datos
test_that("Datos son internamente consistentes", {
# Test 12.1: Todas las especies en ecoregions están en el dataset principal
info = paste("Missing species:", paste(missing_species, collapse = ", ")))
# Test 12.2: pm_ids son únicos y consistentes