library(ggplot2) # --- civilytics_colors ------------------------------------------------------- test_that("civilytics_colors is a named character vector of hex codes", { expect_type(civilytics_colors, "character") expect_named(civilytics_colors) expect_true(all(grepl("^#[0-9A-Fa-f]{6}$", civilytics_colors))) }) test_that("civilytics_colors contains expected brand keys", { expected <- c("paper", "ink", "accent", "navy", "navy_dark", "accent_dark", "paper_2", "rule") expect_true(all(expected %in% names(civilytics_colors))) }) test_that("civilytics_colors values match brand specification", { expect_equal(unname(civilytics_colors["paper"]), "#FAF7F2") expect_equal(unname(civilytics_colors["ink"]), "#0E1A2B") expect_equal(unname(civilytics_colors["accent"]), "#C25311") expect_equal(unname(civilytics_colors["navy_dark"]), "#1A2E4A") expect_equal(unname(civilytics_colors["accent_dark"]),"#E07840") }) # --- civilytics_pal ---------------------------------------------------------- test_that("civilytics_pal returns character vector of hex codes", { result <- civilytics_pal() expect_type(result, "character") expect_true(all(grepl("^#[0-9A-Fa-f]{6}$", result))) }) test_that("civilytics_pal respects n argument", { expect_length(civilytics_pal("main", n = 3), 3) expect_length(civilytics_pal("sequential", n = 5), 5) }) test_that("civilytics_pal interpolates when n exceeds palette size", { result <- civilytics_pal("main", n = 10) expect_length(result, 10) expect_true(all(grepl("^#[0-9A-Fa-f]{6}$", result))) }) test_that("civilytics_pal errors on unknown palette name", { expect_error(civilytics_pal("nope"), "'nope' is not a valid Civilytics palette") }) test_that("civilytics_pal supports all three named palettes", { expect_no_error(civilytics_pal("main")) expect_no_error(civilytics_pal("sequential")) expect_no_error(civilytics_pal("diverging")) }) # --- scale_color/fill_civilytics --------------------------------------------- test_that("scale_color_civilytics returns a Scale object (discrete)", { sc <- scale_color_civilytics() expect_s3_class(sc, "Scale") }) test_that("scale_color_civilytics returns a Scale object (continuous)", { sc <- scale_color_civilytics("sequential", discrete = FALSE) expect_s3_class(sc, "Scale") }) test_that("scale_fill_civilytics returns a Scale object (discrete)", { sc <- scale_fill_civilytics() expect_s3_class(sc, "Scale") }) test_that("scale_fill_civilytics returns a Scale object (continuous)", { sc <- scale_fill_civilytics("sequential", discrete = FALSE) expect_s3_class(sc, "Scale") }) test_that("scale_color_civilytics works in a ggplot", { p <- ggplot(mpg, aes(displ, hwy, colour = class)) + geom_point() + scale_color_civilytics() expect_no_error(ggplot_build(p)) }) test_that("scale_fill_civilytics works in a ggplot", { p <- ggplot(mpg, aes(class, fill = class)) + geom_bar() + scale_fill_civilytics() expect_no_error(ggplot_build(p)) }) # --- theme_civilytics -------------------------------------------------------- test_that("theme_civilytics returns a complete ggplot2 theme", { th <- theme_civilytics() expect_s3_class(th, "theme") expect_true(attr(th, "complete")) }) test_that("theme_civilytics applies to a ggplot without error", { p <- ggplot(mpg, aes(displ, hwy)) + geom_point() + theme_civilytics() expect_no_error(ggplot_build(p)) }) test_that("theme_civilytics uses brand ink color for text", { th <- theme_civilytics() expect_equal(th$text$colour, unname(civilytics_colors["ink"])) }) test_that("theme_civilytics uses brand paper color for plot background", { th <- theme_civilytics() expect_equal(th$plot.background$fill, unname(civilytics_colors["paper"])) }) test_that("theme_civilytics uses paper_2 for strip background by default", { th <- theme_civilytics() expect_equal(th$strip.background$fill, unname(civilytics_colors["paper_2"])) }) test_that("theme_civilytics strip_color parameter is respected", { th <- theme_civilytics(strip_color = "#FF0000") expect_equal(th$strip.background$fill, "#FF0000") }) test_that("theme_civilytics font_size parameter scales text elements", { th_big <- theme_civilytics(font_size = 20) th_sml <- theme_civilytics(font_size = 10) expect_gt(th_big$text$size, th_sml$text$size) }) # --- theme_civilytics_dark --------------------------------------------------- test_that("theme_civilytics_dark returns a complete ggplot2 theme", { th <- theme_civilytics_dark() expect_s3_class(th, "theme") expect_true(attr(th, "complete")) }) test_that("theme_civilytics_dark applies to a ggplot without error", { p <- ggplot(mpg, aes(displ, hwy)) + geom_point() + theme_civilytics_dark() expect_no_error(ggplot_build(p)) }) test_that("theme_civilytics_dark uses paper color as ink (light text on dark bg)", { th <- theme_civilytics_dark() expect_equal(th$text$colour, unname(civilytics_colors["paper"])) }) test_that("theme_civilytics_dark uses navy_dark as background", { th <- theme_civilytics_dark() expect_equal(th$plot.background$fill, unname(civilytics_colors["navy_dark"])) }) test_that("theme_civilytics_dark uses navy for strip background", { th <- theme_civilytics_dark() expect_equal(th$strip.background$fill, unname(civilytics_colors["navy"])) }) # --- make_logo_grob ---------------------------------------------------------- test_that("make_logo_grob returns a gg object for light variant", { logo <- make_logo_grob("light") expect_s3_class(logo, "gg") }) test_that("make_logo_grob returns a gg object for dark variant", { logo <- make_logo_grob("dark") expect_s3_class(logo, "gg") }) test_that("make_logo_grob defaults to light variant", { expect_no_error(make_logo_grob()) }) test_that("make_logo_grob errors on invalid variant", { expect_error(make_logo_grob("purple")) })