test_that("test character selection", {
    txt <- c("natural", "National", "denatured", "other")
    
    expect_identical(
        char_select(txt, "nat*", selection = "keep", valuetype = "glob",
                    case_insensitive = TRUE),
        c("natural", "National")
    )
    expect_identical(
        char_select(txt, "nat*", selection = "keep", valuetype = "glob",
                    case_insensitive = FALSE),
        c("natural")
    )
    expect_identical(
        char_select(txt, "nat*", selection = "remove", valuetype = "glob",
                    case_insensitive = TRUE),
        c("denatured", "other")
    )
    expect_identical(
        char_select(txt, "nat*", selection = "remove", valuetype = "glob",
                    case_insensitive = FALSE),
        c("National", "denatured", "other")
    )
    expect_identical(
        char_select(txt, "nat", selection = "keep", valuetype = "regex",
                    case_insensitive = TRUE),
        c("natural", "National", "denatured")
    )
    expect_identical(
        char_select(txt, "nat", selection = "keep", valuetype = "regex",
                    case_insensitive = FALSE),
        c("natural", "denatured")
    )
})

test_that("test character selection with named elements", {
    txt <- c(c1 = "aa", c2 = "ab", c3 = "aa", c4 = "bcd", c5 = "bcd")
    
    expect_identical(
        char_select(txt, "*b*", selection = "keep"),
        c(c2 = "ab", c4 = "bcd", c5 = "bcd")
    )
    expect_identical(
        char_select(txt, "a*", selection = "keep"),
        c(c1 = "aa", c2 = "ab", c3 = "aa")
    )
    
    expect_identical(
        char_select(txt, "*b*", selection = "remove"),
        c(c1 = "aa", c3 = "aa")
    )
    expect_identical(
        char_select(txt, "a*", selection = "remove"),
        c(c4 = "bcd", c5 = "bcd")
    )
})

test_that("test that char_remove and char_select work as shortcuts", {
    txt <- c("natural", "natural", "National", "denatured", "other")
  
    expect_identical(
        char_select(txt, "nat*", selection = "keep", valuetype = "glob",
                    case_insensitive = TRUE),
        char_keep(txt, "nat*", valuetype = "glob", case_insensitive = TRUE)
    )
    expect_identical(
        char_select(txt, "nat*", selection = "keep", valuetype = "glob",
                    case_insensitive = FALSE),
        char_keep(txt, "nat*", valuetype = "glob", case_insensitive = FALSE)
    )
    expect_identical(
        char_select(txt, "nat*", selection = "remove", valuetype = "glob",
                    case_insensitive = TRUE),
        char_remove(txt, "nat*", valuetype = "glob", case_insensitive = TRUE)
    )
    expect_identical(
        char_select(txt, "nat*", selection = "remove", valuetype = "glob",
                    case_insensitive = FALSE),
        char_remove(txt, "nat*", valuetype = "glob", case_insensitive = FALSE)
    )
    expect_identical(
        char_select(txt, "nat", selection = "keep", valuetype = "regex",
                    case_insensitive = TRUE),
        char_keep(txt, "nat", valuetype = "regex", case_insensitive = TRUE)
    )
    expect_identical(
        char_select(txt, "nat", selection = "keep", valuetype = "regex",
                    case_insensitive = FALSE),
        char_keep(txt, "nat", valuetype = "regex", case_insensitive = FALSE)
    )
})

test_that("char_select works with edge cases", {
    txt <- c(c1 = "aa", c2 = "ab", c3 = "aa", c4 = "bcd", c5 = "bcd")

    expect_identical(char_select(txt, "x*"), NULL)
    expect_identical(char_select(txt, "x*", selection = "remove"), txt)
    
    expect_identical(char_select(txt, c("aa*", "x*")), c(c1 = "aa", c3 = "aa"))
    expect_identical(char_remove(txt, c("aa*", "x*")), 
                     c(c2 = "ab", c4 = "bcd", c5 = "bcd"))
    
    expect_identical(char_remove(txt, "*"), character())
    expect_identical(char_remove(unname(txt), "*"), character())
    
    expect_identical(char_keep(txt, "*"), txt)
})

test_that("char_select works with list pattern", {
    txt <- c(c1 = "aa", c2 = "ab", c3 = "aa", c4 = "bcd", c5 = "bcd")
    
    expect_identical(
        char_keep(txt, list("x*", "b*")), 
        c(c4 = "bcd", c5 = "bcd")
    )
    expect_identical(
        char_remove(txt, list("x*", "b*")), 
        c(c1 = "aa", c2 = "ab", c3 = "aa")
    )
})

test_that("char_select works with dictionary pattern", {
    txt <- c(c1 = "aa", c2 = "ab", c3 = "aa", c4 = "bcd", c5 = "bcd")
    patt <- dictionary(list(one = "x*", two = "b*"))
    expect_identical(
        char_keep(txt, patt),
        c(c4 = "bcd", c5 = "bcd")
    )
    expect_identical(
        char_remove(txt, patt), 
        c(c1 = "aa", c2 = "ab", c3 = "aa")
    )
})
