
data(nasa)
nasaLate <- nasa[
  nasa$date >= as.POSIXct("1998-01-01") &
    nasa$lat >= 20 &
    nasa$lat <= 40 &
    nasa$long >= -80 &
    nasa$long <= -60,
]

do_glyph <- function(...) {
  glyphs(
    nasaLate, # no lint
    "long", "day", "lat", "surftemp",
    height = 2.37, width = 2.38, ...
  )
}



do_gg <- function(dt) {
  ggplot2::ggplot(dt, ggplot2::aes(gx, gy, group = gid)) + # nolint
    add_ref_lines(dt, color = "red", size = 0.5) +
    add_ref_boxes(dt, color = "blue") +
    ggplot2::geom_path() +
    ggplot2::theme_bw() +
    ggplot2::labs(x = "", y = "") +
    ggplot2::xlim(-80, -60) +
    ggplot2::ylim(20, 40)
}

test_that("examples", {
  dt <- do_glyph()

  expect_true(all(c("gx", "gy", "gid") %in% names(dt)))
  expect_true(all(names(nasaLate) %in% names(dt)))

  p <- do_gg(dt)

  expect_equal(length(p$layers), 3)
  expect_equal(as.character(get("aes_params", envir = p$layers[[1]])$colour), "red")
  expect_equal(as.character(get("aes_params", envir = p$layers[[2]])$colour), "blue")
})

test_that("message", {
  expect_message(glyphs(nasaLate, "long", "day", "lat", "surftemp", height = 1), "Using width 2.38")
  expect_message(glyphs(nasaLate, "long", "day", "lat", "surftemp", width = 1), "Using height 2.37")
})


test_that("scales", {
  dt <- do_glyph(x_scale = log)
  dt$dayLog <- dt$day
  dt$day <- NULL
  dtm <- merge(dt, nasaLate)
  expect_true(all(dtm$dayLog == log(dtm$day)))

  dt <- do_glyph(y_scale = log)
  dt$surftempLog <- dt$surftemp
  dt$surftemp <- NULL
  dtm <- merge(dt, nasaLate)
  expect_true(all(dtm$surftempLog == log(dtm$surftemp)))

  for (scale_fn in c(range01, max1, mean0, min0, rescale01, rescale11)) {
    dt <- do_glyph(y_scale = scale_fn)
    dt$surftempScaled <- dt$surftemp
    dt$surftemp <- NULL
    dtm <- merge(dt, nasaLate)
    expect_true(all(dtm$surftempScaled != dtm$surftemp))
  }


  for (scale_fn in c(rescale01, rescale11)) {
    scale_fn2 <- function(x) {
      scale_fn(x, xlim = c(1 / 4, 3 / 4))
    }
    dt <- do_glyph(y_scale = scale_fn2)
    dt$surftempScaled <- dt$surftemp
    dt$surftemp <- NULL
    dtm <- merge(dt, nasaLate)
    expect_true(all(dtm$surftempScaled != dtm$surftemp))
  }
})

test_that("polar", {
  dt <- do_glyph(polar = TRUE)

  expect_equal(attr(dt, "polar"), TRUE)

  # idk how to test that polar happened

  p <- do_gg(dt)
  expect_equal(length(p$layers), 3)
})

test_that("fill", {
  dt <- do_glyph()

  # idk how to test that polar happened
  do_gg_fill <- function(...) {
    ggplot2::ggplot(dt, ggplot2::aes(gx, gy, group = gid)) +
      add_ref_lines(dt, color = "red", size = 0.5) +
      add_ref_boxes(dt, color = "blue", ...) +
      ggplot2::geom_path() +
      ggplot2::theme_bw() +
      ggplot2::labs(x = "", y = "") +
      ggplot2::xlim(-80, -60) +
      ggplot2::ylim(20, 40)
  }

  p <- do_gg_fill(fill = "green")
  expect_equal(mapping_string(get("aes_params", envir = p$layers[[2]])$fill), "\"green\"")
  p <- do_gg_fill(var_fill = "gid")
  expect_equal(mapping_string(get("mapping", envir = p$layers[[2]])$fill), "fill")
})

test_that("print", {
  dt <- do_glyph()
  txt <- capture.output(print(dt))
  expect_equal(txt[length(txt) - 2], "Cartesian glyphplot: ")
  expect_equal(txt[length(txt) - 1], "  Size: [2.38, 2.37]")
  expect_equal(txt[length(txt) - 0], "  Major axes: long, lat")

  dt <- do_glyph(polar = TRUE)
  txt <- capture.output(print(dt))
  expect_equal(txt[length(txt) - 2], "Polar glyphplot: ")
  expect_equal(txt[length(txt) - 1], "  Size: [2.38, 2.37]")
  expect_equal(txt[length(txt) - 0], "  Major axes: long, lat")

  txt <- capture.output(print(rel(0.95)))
  expect_equal(txt, "[1] 0.95 *")
})
