Running ‘testthat.R’ [88s/110s]
Running the tests in ‘tests/testthat.R’ failed.
Complete output:
  > library("testthat")
  > library("plotly")
  Loading required package: ggplot2
  
  Attaching package: 'plotly'
  
  The following object is masked from 'package:ggplot2':
  
      last_plot
  
  The following object is masked from 'package:stats':
  
      filter
  
  The following object is masked from 'package:graphics':
  
      layout
  
  > library("RSclient")
  > 
  > # report any differences in plot (list) hashes if this is a Travis pull request
  > report_diffs <- grepl("^[0-9]+$", Sys.getenv("TRAVIS_PULL_REQUEST"))
  > # build a ggplot2 comparison table?
  > build_table <- Sys.getenv("PLOTLY_TABLE") == "TRUE"
  > 
  > # stuff that should be done once (not everytime save_outputs() is called)
  > if (report_diffs || build_table) {
  +   message("Spinning up an independent R session with plotly's master branch installed")
  +   Rserve::Rserve(args = "--vanilla --RS-enable-remote")
  +   conn <- RSconnect()
  +   # ensure the seed is the same for randomized tests
  +   set.seed(1)
  +   RSeval(conn, "set.seed(1)")
  +   # we don't make assumptions about ggplot2 versioning,
  +   # but it is _strongly_ recommended to use the CRAN version (of ggplot2)
  +   RSeval(conn, "devtools::install_github('ropensci/plotly')")
  +   RSeval(conn, "library(plotly)")
  +   if (report_diffs) {
  +     # hash of the version being tested
  +     this_hash <- substr(Sys.getenv("TRAVIS_COMMIT"), 1, 7)
  +     # hash of version to compare with (master)
  +     master_hash <- RSeval(conn, "packageDescription('plotly')$GithubSHA1")
  +     master_hash <- substr(master_hash, 1, 7)
  +     # plotly-test-table repo hosts the diff pages & keeps track of previous versions
  +     table_dir <- normalizePath("../../plotly-test-table", mustWork = T)
  +     # Make sure we have appropriate versions of plotlyjs
  +     # (see plotly-test-table/template/template/index.html)
  +     file.copy(
  +       file.path("..", "inst", "htmlwidgets", "lib", "plotlyjs", "plotly-latest.min.js"),
  +       file.path(table_dir, "template", "New.min.js"),
  +       overwrite = TRUE
  +     )
  +     download.file(
  +       "https://raw.githubusercontent.com/ropensci/plotly/master/inst/htmlwidgets/lib/plotlyjs/plotly-latest.min.js", 
  +       file.path(table_dir, "template", "Old.min.js"),
  +       method = "curl"
  +     )
  +     # directory for placing test differences
  +     this_dir <- file.path(table_dir, this_hash)
  +     if (dir.exists(this_dir)) {
  +       message("Tests were already run on this commit. Nuking the old results...")
  +       unlink(this_dir, recursive = T)
  +     }
  +     master_dir <- file.path(table_dir, master_hash)
  +     # csv file that tracks plot hashes
  +     hash_file <- file.path(table_dir, "hashes.csv")
  +     if (!file.exists(hash_file)) {
  +       file.create(hash_file)
  +       cat("commit,test,hash\n", file = hash_file, append = T)
  +     }
  +     hash_info <- utils::read.csv(hash_file)
  +     master_info <- hash_info[hash_info$commit %in% master_hash, ]
  +   }
  + }
  > 
  > # Some tests make plot.ly HTTP requests and require a valid user account
  > # (see test-plotly-filename.R). For security reasons, these tests should be 
  > # skipped on pull requests (the .travis.yml file uses encrypted credentials
  > # & encrypted environment vars cannot be accessed on pull request builds)
  > skip_if_not_master <- function() {
  +   is_pr <- grepl("^[0-9]+$", Sys.getenv("TRAVIS_PULL_REQUEST"))
  +   is_r_release <- Sys.getenv("TRAVIS_R_VERSION_STRING", "release") == "release"
  +   if (!is_pr && is_r_release) return(invisible(TRUE))
  +   skip("plot.ly API calls are only tested on the master build on r-release")
  + }
  > 
  > # This function is called within testthat/test-*.R files.
  > # It takes a ggplot or plotly object as input, and it returns a figure
  > # object (aka the data behind the plot).
  > save_outputs <- function(gg, name) {
  +   print(paste("Running test:", name))
  +   p <- plotly_build(gg)$x[c("data", "layout")]
  +   has_diff <- if (report_diffs) {
  +     # save a hash of the R object
  +     plot_hash <- digest::digest(p)
  +     info <- paste(this_hash, name, plot_hash, sep = ",")
  +     cat(paste(info, "\n"), file = hash_file, append = T)
  +     test_info <- master_info[master_info$test %in% name, ]
  +     # is the plot hash different from master?
  +     !isTRUE(plot_hash == test_info$hash)
  +   } else FALSE
  +   if (has_diff || build_table) {
  +     RSassign(conn, gg)
  +     pm <- RSeval(conn, "tryCatch(plotly::plotly_build(gg)$x[c('data', 'layout')], error = function(e) e$message)")
  +     if (build_table) {
  +       # save pngs of ggplot
  +       filename <- paste0(gsub("\\s+", "-", name), ".png")
  +       ggFile <- paste("ggplot", filename, sep = "-")
  +       res <- tryCatch(ggsave(ggFile, gg), 
  +                       error = function(e) {
  +                         err <- qplot() + 
  +                           annotate('text', label = paste('Error:', e$message), 
  +                                    x = 1, y = 1, color = 'red')
  +                         ggsave(ggFile, err, width = 3, height = 2, units = 'in')
  +                       })
  +       img <- function(x, f) {
  +         tryCatch(plotly_IMAGE(x, out_file = f, width = 300, height = 400),
  +                  error = function(e) {
  +                    err <- qplot() + 
  +                      annotate('text', label = paste('Error:', e$message), 
  +                               x = 1, y = 1, color = 'red')
  +                    # TODO: convert pixels to inches?
  +                    ggsave(plotlyFile, err, width = 3, height = 2, units = 'in')
  +                  })
  +       }
  +       # save _this_ plotly version
  +       plotlyFile <- paste("plotly", this_hash, filename, sep = "-")
  +       res <- img(p, plotlyFile)
  +       # save _master_ plotly version
  +       plotlyFile <- paste("plotly", "master", filename, sep = "-")
  +       RSassign(conn, plotlyFile, "plotlyFile")
  +       RSassign(conn, img, "img")
  +       res <- RSeval(conn, "img(p, plotlyFile)")
  +     }
  +     # it could be that the hash didn't exist, so make sure they're different
  +     # before build a diff page
  +     if (plot_hash != digest::digest(pm)) {
  +       test_dir <- file.path(this_dir, gsub("\\s+", "-", name))
  +       if (dir.exists(test_dir)) stop(shQuote(name), " has already been used to save_outputs() in another test.")
  +       dir.create(test_dir, recursive = T)
  +       # copy over diffing template
  +       file.copy(
  +         dir(file.path(table_dir, "template", "template"), full.names = TRUE), test_dir
  +       )
  +       # overwrite the default JSON
  +       writeLines(
  +         paste("New =", plotly:::to_JSON(p)), 
  +         file.path(test_dir, "New.json")
  +       )
  +       writeLines(
  +         paste("Old =", plotly:::to_JSON(pm)), 
  +         file.path(test_dir, "Old.json")
  +       )
  +     }
  +   }
  +   p
  + }
  > 
  > # use me just like testthat::test_check()
  > test_run <- function(...) {
  +   # shut down the other R session on exit
  +   if (report_diffs || build_table) {
  +     on.exit(RSshutdown(conn))
  +     on.exit(RSclose(conn), add = TRUE)
  +   }
  +   test_check(...)
  + }
  > 
  > if (packageVersion("ggplot2") > "2.2.1") {
  +   test_run("plotly")
  + }
  [1] "Running test: cookbook-axes-flevels"
  [1] "Running test: cookbook-axes-ylim.hide"
  [1] "Running test: cookbook-axes-scale.hide"
  [1] "Running test: cookbook-axes-coord-ylim"
  [1] "Running test: cookbook-axes-linear-axes"
  [1] "Running test: cookbook-axes-log2-scale"
  [1] "Running test: cookbook-axes-log2-coord"
  [1] "Running test: cookbook-axes-log2-labels"
  [1] "Running test: cookbook-axes-scale_y_log10"
  [1] "Running test: cookbook-axes-scale_y_log10-labels"
  [1] "Running test: cookbook-axes-no-x-title"
  [1] "Running test: cookbook-axes-scale-name"
  [1] "Running test: cookbook-axes-fonts"
  [1] "Running test: cookbook-axes-label-funs"
  [1] "Running test: cookbook-axes-custom-formatter"
  [1] "Running test: cookbook-axes-blank-minor-major"
  [1] "Running test: cookbook-axes-blank-minor"
  [1] "Running test: cookbook-axes-blank-x"
  [1] "Running test: cookbook-axes-blank-y"
  [1] "Running test: cookbook-axes-basic-bar"
  [1] "Running test: cookbook-axes-basic-horizontal-line"
  [1] "Running test: cookbook-axes-dashed-red-line"
  [1] "Running test: cookbook-axes-bar-error-wide"
  [1] "Running test: cookbook-axes-bar-error-narrow"
  [1] "Running test: cookbook-axes-bar-error-diff"
  [1] "Running test: cookbook-axes-bar-dodge-color"
  [1] "Running test: cookbook-axes-bar-dodge-color-error"
  [1] "Running test: cookbook-axes-bar-dodge-color-err4"
  [1] "Running test: cookbook-axes-scatter-basic"
  [1] "Running test: cookbook-axes-scatter-hline"
  [1] "Running test: cookbook-axes-scatter-hline-vline"
  [1] "Running test: cookbook-axes-scatter-facet"
  [1] "Running test: cookbook-axes-scatter-facet-hline"
  [1] "Running test: cookbook-axes-scatter-facet-hline-vline"
  [1] "Running test: scatterplots-hollow"
  [1] "Running test: scatterplots-smooth-lm"
  [1] "Running test: scatterplots-smooth-lm-se-false"
  [1] "Running test: scatterplots-loess"
  [1] "Running test: scatterplots-color"
  [1] "Running test: scatterplots-scale-color-hue"
  [1] "Running test: scatterplots-full-range"
  [1] "Running test: scatterplots-shape"
  [1] "Running test: scatterplots-shape-manual"
  [1] "Running test: scatterplots-overlap"
  [1] "Running test: scatterplots-jitter"
  [1] "Running test: scatterplots-geom_jitter"
  [1] "Running test: cookbook-axes-single-abline"
  [1] "Running test: cookbook-axes-multiple-abline"
  [1] "Running test: area-simple"
  [1] "Running test: area-area-fillcolor"
  [1] "Running test: area-traces_order"
  [1] "Running test: bar-dodge"
  [1] "Running test: bar-stack"
  [1] "Running test: bar-identity"
  [1] "Running test: bar-dates"
  [1] "Running test: bar-nocolor"
  [1] "Running test: bar-color"
  [1] "Running test: bar-black-outline"
  [1] "Running test: bar-aes-fill-guides-color-none"
  [1] "Running test: bar-aes-colour-guides-fill-FALSE"
  [1] "Running test: bar-position-stack"
  [1] "Running test: bar-position-fill"
  [1] "Running test: bar-category-names"
  [1] "Running test: bar-coord-flip"
  [1] "Running test: boxplot"
  [1] "Running test: boxplot-datetime"
  [1] "Running test: boxplot-legends_for_fill"
  [1] "Running test: boxplot-fillcolor"
  [1] "Running test: col"
  [1] "Running test: contour"
  [1] "Running test: date-strings"
  [1] "Running test: date-class-Date"
  [1] "Running test: date-irregular-time-series"
  [1] "Running test: density-simple"
  [1] "Running test: density-fill"
  [1] "Running test: density-color"
  [1] "Running test: density-histogram"
  [1] "Running test: density-traces_order"
  [1] "Running test: density2d"
  [1] "Running test: density2dfill"
  [1] "Running test: errorbar-horizontal"
  [1] "Running test: errorbar"
  [1] "Running test: errorbar-unique-groups"
  [1] "Running test: barley"
  [1] "Running test: 3-panels"
  [1] "Running test: facet_wrap_free"
  [1] "Running test: facet_wrap_free_y"
  [1] "Running test: facet_wrap_free_x"
  [1] "Running test: facet_grid_free"
  [1] "Running test: facet_grid_free_y"
  [1] "Running test: facet_grid_free_x"
  [1] "Running test: facet_wrap_free_mult"
  [1] "Running test: facet_wrap"
  [1] "Running test: facet_wrap-labeller"
  [1] "Running test: facet_grid-labeller"
  [1] "Running test: facet_wrap-free_y"
  [1] "Running test: heatmap"
  [1] "Running test: heatmap-midpoint"
  [1] "Running test: heatmap-discrete"
  [1] "Running test: hex-basic"
  [1] "Running test: hex-bins"
  [1] "Running test: hex-binwidth"
  [1] "Running test: histogram-counts"
  [1] "Running test: histogram-density"
  [1] "Running test: histogram-fill"
  [1] "Running test: histogram-fixed-fill-color"
  [1] "Running test: histogram-density-binwidth"
  [1] "Running test: histogram-fill-factor"
  [1] "Running test: histogram-fill-factor-identity"
  [1] "Running test: histogram-fill-factor-dodge"
  [1] "Running test: histogram-fill-factor-facets"
  [1] "Running test: histogram-vline"
  [1] "Running test: histogram-dates"
  [1] "Running test: histogram-POSIXt-bins"
  [1] "Running test: histogram-Date-bins"
  [1] "Running test: hline"
  [1] "Running test: hline-multiple"
  [1] "Running test: hline-factor"
  [1] "Running test: jitter-basic"
  [1] "Running test: labels-ggtitle"
  [1] "Running test: labels-ylab"
  [1] "Running test: labels-angles"
  [1] "Running test: scatter_legend"
  [1] "Running test: legend-hide"
  [1] "Running test: legend-very-long-legend-items"
  [1] "Running test: legend-one-entry"
  [1] "Running test: legend-hide-legend"
  [1] "Running test: legend-many legend items"
  [1] "Running test: linetype-types"
  [1] "Running test: linetype-colors"
  ── 1. Failure: Translates both dates and datetimes (with dynamic ticks) correctl
  paste("date:", d$date) not equivalent to `dates1`.
  100/100 mismatches
  x[1]: "date: 2002-01-01"
  y[1]: "~date: 2002-01-01"
  
  x[2]: "date: 2002-02-01"
  y[2]: "~date: 2002-02-01"
  
  x[3]: "date: 2002-03-01"
  y[3]: "~date: 2002-03-01"
  
  x[4]: "date: 2002-04-01"
  y[4]: "~date: 2002-04-01"
  
  x[5]: "date: 2002-05-01"
  y[5]: "~date: 2002-05-01"
  
  ── 2. Failure: Translates both dates and datetimes (with dynamic ticks) correctl
  paste("date:", d2$date) not equivalent to `dates2`.
  100/100 mismatches
  x[1]: "date: 2002-01-01 01:00:00"
  y[1]: "~date: 2002-01-01 01:00:00"
  
  x[2]: "date: 2002-02-01 01:00:00"
  y[2]: "~date: 2002-02-01 01:00:00"
  
  x[3]: "date: 2002-03-01 01:00:00"
  y[3]: "~date: 2002-03-01 01:00:00"
  
  x[4]: "date: 2002-04-01 02:00:00"
  y[4]: "~date: 2002-04-01 02:00:00"
  
  x[5]: "date: 2002-05-01 02:00:00"
  y[5]: "~date: 2002-05-01 02:00:00"
  
  ── 3. Failure: geom_linerange() without a y aesthetic translates to a path (@tes
  unlist(l$data[[1]]$text) not equivalent to c(...).
  10/14 mismatches
  x[1]: "~x: 1<br />~ymin: 0"
  y[1]: "x: 1<br />ymin: 0"
  
  x[2]: "~x: 1<br />~ymax: 1"
  y[2]: "x: 1<br />ymax: 1"
  
  x[4]: "~x: 2<br />~ymin: 0"
  y[4]: "x: 2<br />ymin: 0"
  
  x[5]: "~x: 2<br />~ymax: 2"
  y[5]: "x: 2<br />ymax: 2"
  
  x[7]: "~x: 3<br />~ymin: 0"
  y[7]: "x: 3<br />ymin: 0"
  
  [1] "Running test: map-facet"
  [1] "Running test: path-lines-diff-from-paths"
  [1] "Running test: path-colors"
  [1] "Running test: path-colors2"
  [1] "Running test: path-colored-groups-stay-together"
  [1] "Running test: path-line-symbols"
  [1] "Running test: point-size-alpha"
  [1] "Running test: open-shapes"
  [1] "Running test: all-shapes"
  [1] "Running test: point-size-alpha2"
  [1] "Running test: polygon-black"
  ── 4. Failure: polygons with different hovertext must be different traces  (@tes
  info$data[[1]]$x not equivalent to c(10, 11, 11, 10, 10).
  5/5 mismatches (average diff: 2)
  [1] 12 - 10 == 2
  [2] 13 - 11 == 2
  [3] 13 - 11 == 2
  [4] 12 - 10 == 2
  [5] 12 - 10 == 2
  
  ── 5. Failure: polygons with different hovertext must be different traces  (@tes
  info$data[[2]]$x not equivalent to c(12, 13, 13, 12, 12).
  5/5 mismatches (average diff: 2)
  [1] 10 - 12 == -2
  [2] 11 - 13 == -2
  [3] 11 - 13 == -2
  [4] 10 - 12 == -2
  [5] 10 - 12 == -2
  
  ── 6. Failure: polygons with different hovertext must be different traces  (@tes
  sapply(info$data, "[[", "text") not equivalent to c("lab: left", "lab: right").
  2/2 mismatches
  x[1]: "~lab: NA"
  y[1]: "lab: left"
  
  x[2]: "~lab: ~"
  y[2]: "lab: right"
  
  [1] "Running test: polygon-aes-color"
  [1] "Running test: polygon-aes-fill"
  [1] "Running test: polygon-color-aes-fill"
  [1] "Running test: polygon-color-fill-aes-linetype"
  [1] "Running test: polygon-color-fill-aes-size"
  [1] "Running test: polygons-canada-borders"
  ── 7. Failure: borders become one trace with NA (@test-ggplot-polygons.R#147)  ─
  length(info$data) not equivalent to 1.
  1/1 mismatches
  [1] 2 - 1 == 1
  
  ── 8. Failure: borders become one trace with NA (@test-ggplot-polygons.R#149)  ─
  nchar(info$data[[1]]$text) not equivalent to 0.
  1/1 mismatches
  [1] 10 - 0 == 10
  
  [1] "Running test: polygon-star-group"
  ── 9. Failure: geom_polygon(aes(group)) -> 1 trace (@test-ggplot-polygons.R#162)
  length(has.data) not equivalent to `n.traces`.
  1/1 mismatches
  [1] 2 - 1 == 1
  
  ── 10. Failure: geom_polygon(aes(group)) -> 1 trace (@test-ggplot-polygons.R#165
  tr$x not equivalent to c(0, -1, 2, -2, 1, 0, NA, 10, 9, 12, 8, 11, 10).
  Lengths differ: 6 is not 13
  
  ── 11. Failure: geom_polygon(aes(group)) -> 1 trace (@test-ggplot-polygons.R#168
  tr$y not equivalent to c(2, 0, 1, 1, 0, 2, NA, 2, 0, 1, 1, 0, 2).
  Lengths differ: 6 is not 13
  
  [1] "Running test: polygon-star-group-color"
  ── 12. Failure: geom_polygon(aes(group), color) -> 1 trace (@test-ggplot-polygon
  length(has.data) not equivalent to `n.traces`.
  1/1 mismatches
  [1] 2 - 1 == 1
  
  ── 13. Failure: geom_polygon(aes(group), color) -> 1 trace (@test-ggplot-polygon
  tr$x not equivalent to c(0, -1, 2, -2, 1, 0, NA, 10, 9, 12, 8, 11, 10).
  Lengths differ: 6 is not 13
  
  ── 14. Failure: geom_polygon(aes(group), color) -> 1 trace (@test-ggplot-polygon
  tr$y not equivalent to c(2, 0, 1, 1, 0, 2, NA, 2, 0, 1, 1, 0, 2).
  Lengths differ: 6 is not 13
  
  [1] "Running test: polygon-star-fill-color"
  [1] "Running test: rect-black"
  [1] "Running test: rect-black4"
  [1] "Running test: rect-color"
  [1] "Running test: rect-fill"
  [1] "Running test: rect-fill-color"
  [1] "Running test: rect-fill-hex-alpha"
  [1] "Running test: ribbon-alpha"
  [1] "Running test: ribbon-group"
  [1] "Running test: ribbon-colour"
  [1] "Running test: ribbon-fill"
  [1] "Running test: segment"
  [1] "Running test: segment-multiple-non-numeric"
  [1] "Running test: sf"
  [1] "Running test: sf-fill-text"
  [1] "Running test: sf-points"
  [1] "Running test: size-is-a-vector"
  [1] "Running test: size-global-scaling"
  [1] "Running test: smooth-basic"
  [1] "Running test: smooth-se-false"
  [1] "Running test: smooth-group"
  [1] "Running test: smooth-colour"
  [1] "Running test: smooth-fill2"
  [1] "Running test: smooth-facet"
  ── 15. Failure: Basic geom_spoke() (@test-ggplot-spoke.R#20)  ──────────────────
  `angle` not equivalent to rep(paste0("angle: ", format(df$angle)), each = 2).
  200/200 mismatches
  x[1]: "~angle: 0.31248051"
  y[1]: "angle: 0.31248051"
  
  x[2]: "~angle: 0.31248051"
  y[2]: "angle: 0.31248051"
  
  x[3]: "~angle: 2.19748793"
  y[3]: "angle: 2.19748793"
  
  x[4]: "~angle: 2.19748793"
  y[4]: "angle: 2.19748793"
  
  x[5]: "~angle: 3.35709759"
  y[5]: "angle: 3.35709759"
  
  [1] "Running test: step-gg.hv"
  [1] "Running test: step-gg.vh"
  [1] "Running test: step-gg.hvh"
  [1] "Running test: step-gg.vhv"
  [1] "Running test: text"
  [1] "Running test: text-colour"
  [1] "Running test: theme-background"
  [1] "Running test: theme-ticks-and-grids"
  [1] "Running test: theme-ticks-default"
  [1] "Running test: theme-zeroline-default"
  [1] "Running test: theme-marker-default"
  [1] "Running test: theme-panel-border-1"
  [1] "Running test: theme-panel-border-2"
  [1] "Running test: ticks-boxes"
  [1] "Running test: ticks-boxes-facet-grid"
  [1] "Running test: ticks-boxes-scales-free"
  [1] "Running test: ticks-boxes-space-free"
  [1] "Running test: ticks-flip"
  [1] "Running test: ticks-flip-grid"
  [1] "Running test: ticks-flip-grid-free"
  [1] "Running test: ticks-limits-hide"
  [1] "Running test: ticks-limits-gap"
  [1] "Running test: ticks-breaks-nochange"
  [1] "Running test: ticks-breaks-more"
  [1] "Running test: ticks-breaks-less"
  [1] "Running test: ticks-scale-labels"
  [1] "Running test: ticks-hide-ticks-lines-labels"
  [1] "Running test: ticks-hide-ticks-labels"
  [1] "Running test: ticks-ycontinuous-ranges"
  [1] "Running test: ticks-ylim-ranges"
  [1] "Running test: ticks-yreverse-ranges"
  [1] "Running test: ticks-yreverse-limits-ranges"
  [1] "Running test: ticks-ylim-reversed-ranges"
  [1] "Running test: ticks-evenly-spaced-ticks"
  [1] "Running test: ticks-uneven"
  [1] "Running test: ticks-line-breaks"
  [1] "Running test: tooltip-datetime"
  ── 16. Failure: datetimes are displayed in tooltip properly (@test-ggplot-toolti
  paste0("time: ", test$time) not identical to sapply(txt, "[[", 1).
  100/100 mismatches
  x[1]: "time: 2016-03-12 16:33:56"
  y[1]: "~time: 2016-03-12 16:33:56"
  
  x[2]: "time: 2016-03-12 16:34:56"
  y[2]: "~time: 2016-03-12 16:34:56"
  
  x[3]: "time: 2016-03-12 16:35:56"
  y[3]: "~time: 2016-03-12 16:35:56"
  
  x[4]: "time: 2016-03-12 16:36:56"
  y[4]: "~time: 2016-03-12 16:36:56"
  
  x[5]: "time: 2016-03-12 16:37:56"
  y[5]: "~time: 2016-03-12 16:37:56"
  
  [1] "Running test: tooltip-date"
  ── 17. Failure: dates are displayed in tooltip properly (@test-ggplot-tooltip.R#
  paste0("time: ", test$time) not identical to sapply(txt, "[[", 1).
  100/100 mismatches
  x[1]: "time: 2016-03-12 00:00:01"
  y[1]: "~time: 2016-03-12 00:00:01"
  
  x[2]: "time: 2016-03-12 00:00:02"
  y[2]: "~time: 2016-03-12 00:00:02"
  
  x[3]: "time: 2016-03-12 00:00:03"
  y[3]: "~time: 2016-03-12 00:00:03"
  
  x[4]: "time: 2016-03-12 00:00:04"
  y[4]: "~time: 2016-03-12 00:00:04"
  
  x[5]: "time: 2016-03-12 00:00:05"
  y[5]: "~time: 2016-03-12 00:00:05"
  
  ── 18. Failure: tooltip argument respects ordering (@test-ggplot-tooltip.R#36)  
  all(grepl("^density", sapply(txt, "[[", 1))) isn't true.
  
  ── 19. Error: tooltip argument respects ordering (@test-ggplot-tooltip.R#37)  ──
  subscript out of bounds
  1: expect_true(all(grepl("^mpg", sapply(txt, "[[", 2)))) at testthat/test-ggplot-tooltip.R:37
  2: quasi_label(enquo(object), label)
  3: eval_bare(get_expr(quo), get_env(quo))
  4: grepl("^mpg", sapply(txt, "[[", 2))
  5: sapply(txt, "[[", 2)
  6: lapply(X = X, FUN = FUN, ...)
  
  [1] "Running test: heatmap-discrete-tooltip"
  [1] "Running test: group-lines-hovertext"
  ── 20. Failure: group domain is included in hovertext (@test-ggplot-tooltip.R#69
  all(grepl(pattern, txt)) isn't true.
  
  ── 21. Failure: tooltip elements are not crossed (@test-ggplot-tooltip.R#91)  ──
  `y_equal_ten` not equivalent to `sample_2`.
  4 element mismatches
  
  [1] "Running test: hovertext-display"
  [1] "Running test: violin"
  [1] "Running test: violin-aes"
  [1] "Running test: vline"
  [1] "Running test: vline-multiple"
  [1] "Running test: ylim-one-trace"
  [1] "Running test: error-simple"
  [1] "Running test: error-simple-line"
  [1] "Running test: error-simple-line-point"
  [1] "Running test: error-simple-line-point-crazy"
  [1] "Running test: error-rect-alpha"
  [1] "Running test: plotly-color-scatterplot-color-factor"
  [1] "Running test: plotly-color-scatterplot-color-factor-custom"
  [1] "Running test: plotly-color-scatterplot-color-factor-custom2"
  [1] "Running test: plotly-color-bar-color-factor-custom"
  [1] "Running test: plotly-color-scatterplot-color-numeric"
  [1] "Running test: plotly-color-scatterplot-color-numeric-custom"
  [1] "Running test: plotly-color-scatterplot-scatter3d-axes"
  [1] "Running test: plotly-color-color-manual"
  [1] "Running test: plotly-colorbar"
  [1] "Running test: plotly-colorbar-expand"
  [1] "Running test: plotly-colorbar-restrict"
  [1] "Running test: plotly-colorbar-z-expand"
  [1] "Running test: plotly-colorbar-z-restrict"
  [1] "Running test: plotly-NAs"
  [1] "Running test: plotly-NAs-connect"
  [1] "Running test: plotly-NAs-within-group"
  [1] "Running test: plotly-NAs-within-color"
  [1] "Running test: plotly-NAs-within-color2"
  [1] "Running test: plotly-no-NAs-for-irrelevant-group"
  [1] "Running test: plotly-linetype-linetype"
  [1] "Running test: plotly-linetype-linetype2"
  [1] "Running test: plotly-linetype-linetype3"
  [1] "Running test: plotly-linetype-manual"
  [1] "Running test: plotly-linetype-ordering"
  [1] "Running test: plotly-linetype-alphabetical"
  [1] "Running test: plotly-subplot-simple"
  [1] "Running test: plotly-subplot-simple2"
  [1] "Running test: plotly-subplot-group"
  [1] "Running test: plotly-subplot-shareX"
  [1] "Running test: plotly-subplot-shareY"
  [1] "Running test: plotly-subplot-shareBoth"
  [1] "Running test: plotly-subplot-width-height"
  [1] "Running test: plotly-subplot-recursive"
  [1] "Running test: plotly-subplot-plot-list"
  [1] "Running test: plotly-subplot-ggmatrix"
  [1] "Running test: plotly-subplot-geo-cartesian"
  [1] "Running test: plotly-subplot-subplot-legendgroup"
  [1] "Running test: plotly-symbol-scatterplot-symbol"
  [1] "Running test: plotly-symbol-scatterplot-symbol2"
  [1] "Running test: plotly-symbol-pch"
  [1] "Running test: plotly-symbol-logical"
  [1] "Running test: plotly-symbol-symbol-manual"
  [1] "Running test: plotly-symbol-ordering"
  [1] "Running test: plotly-symbol-alphabetical"
  [1] "Running test: plotly-scatterplot"
  [1] "Running test: plotly-bar-inference"
  [1] "Running test: plotly-box-data-array"
  [1] "Running test: plotly-group-within-trace"
  [1] "Running test: plotly-alpha-blending"
  [1] "Running test: plotly-alpha-no-color"
  [1] "Running test: plotly-factor-axis"
  [1] "Running test: plotly-character-axis"
  [1] "Running test: plotly-histogram"
  [1] "Running test: plotly-histogram-vert"
  [1] "Running test: plotly-inherit-FALSE"
  [1] "Running test: plotly-time-series-summary"
  ══ testthat results  ═══════════════════════════════════════════════════════════
  OK: 1134 SKIPPED: 27 FAILED: 21
  1. Failure: Translates both dates and datetimes (with dynamic ticks) correctly (@test-ggplot-lines.R#85) 
  2. Failure: Translates both dates and datetimes (with dynamic ticks) correctly (@test-ggplot-lines.R#86) 
  3. Failure: geom_linerange() without a y aesthetic translates to a path (@test-ggplot-lines.R#111) 
  4. Failure: polygons with different hovertext must be different traces  (@test-ggplot-polygons.R#25) 
  5. Failure: polygons with different hovertext must be different traces  (@test-ggplot-polygons.R#26) 
  6. Failure: polygons with different hovertext must be different traces  (@test-ggplot-polygons.R#31) 
  7. Failure: borders become one trace with NA (@test-ggplot-polygons.R#147) 
  8. Failure: borders become one trace with NA (@test-ggplot-polygons.R#149) 
  9. Failure: geom_polygon(aes(group)) -> 1 trace (@test-ggplot-polygons.R#162) 
  1. ...
  
  Error: testthat unit tests failed
  Execution halted