testthat::skip_if_not(getRversion() >= "4.3.0")


ss <- data.frame(State=paste("some long text", c("CA", "NY", "TX")),
                 Prop.Inv=c(0, 1, 0.7),
                 Year=c(1984, 2015, 1999))

fg <- ggplot() +
  geom_point(aes(x=State, y=Prop.Inv), data=ss) +
  xlab("STATE SOME REALLY REALLY LONG TEXT THAT MAY OVERLAP TICKS")

## TODO: change the details of getTicks and expect_rotate_anchor to
## test plotly web pages.
getTicks <- function(html, p.name){
  xp <- sprintf('//svg[@id="%s"]//g[@id="xaxis"]//text', p.name)
  nodes <- getNodeSet(html, xp)
  stopifnot(length(nodes) > 0)
  sapply(nodes, xmlAttrs)
}
expect_rotate_anchor <- function(info, rotate, anchor){
  return()#TODO:remove.
  not <- getTicks(info$html, 'not')
  expect_match(not["style", ], "text-anchor: middle", fixed=TRUE)
  expect_match(not["transform", ], "rotate(0", fixed=TRUE)
  rotated <- getTicks(info$html, 'rotated')
  expect_match(rotated["style", ], paste("text-anchor:", anchor), fixed=TRUE)
  expect_match(rotated["transform", ], paste0("rotate(", rotate), fixed=TRUE)

  e.axis <- remDr$findElement(using="css selector", "g#xaxis")
  e.text <- e.axis$findChildElement("css selector", "text")
  tick.loc <- e.text$getElementLocation()
  tick.size <- e.text$getElementSize()
  ## Subtract a magic number that lets the test pass for un-rotated
  ## labels in firefox.
  tick.bottom.y <- tick.loc$y + tick.size$height - 6
  e.title <- remDr$findElement("css selector", "text#xtitle")
  title.loc <- e.title$getElementLocation()
  expect_true(tick.bottom.y < title.loc$y)
}

## TODO: implement renderHTML which should upload and plot the data,
## then download the rendered HTML using RSelenium to control a
## headless browser.
renderHTML <- function(gg){
  gg2list(gg)
}

test_that('no axis rotation is fine', {
  info <- renderHTML(fg)
  expect_rotate_anchor(info, "0", "middle")
})

test_that('axis.text.x=element_text(angle=90)"', {
  rotated <- fg+theme(axis.text.x=element_text(angle=90))
  info <- renderHTML(rotated)
  expect_rotate_anchor(info, "-90", "end")
})

test_that('axis.text.x=element_text(angle=70) means transform="rotate(-70)"', {
  rotated <- fg+theme(axis.text.x=element_text(angle=70))
  info <- renderHTML(rotated)
  expect_rotate_anchor(info, "-70", "end")
})

## test_that('hjust=0.75 is an error', {
##   problem <- fg+theme(axis.text.x=element_text(hjust=0.75)
##   expect_error({
##     info <- renderHTML(problem)
##   }, "ggplotly only supports hjust values 0, 0.5, 1")
## })
