testthat::test_that('Symbols', {
  mapData <- data.frame(x = 1:2,
                        lng = c(-122, -121),
                        lat = c(41,42))
  m <- leaflet::leaflet()
  pal <- leaflet::colorNumeric('Reds', 1:4)
  # test args
  makeSymbol('notashape', width = 1, color = 'black') %>%
    testthat::expect_error()
  makeSymbol('rect', width = '1', color = 'black') %>%
    testthat::expect_error()
  makeSymbol('rect', width = 1, height = '1', color = 'black') %>%
    testthat::expect_error()
  makeSymbol('rect', width = 1, opacity = '1', color = 'black') %>%
    testthat::expect_error()
  makeSymbol('rect', width = 1, opacity = 1, fillOpacity = '1',
             color = 'black') %>%
    testthat::expect_error()
  makeSymbolIcons('notashape', width = 1, color = 'black') %>%
    testthat::expect_error()
  makeSymbolIcons('rect', width = '1', color = 'black') %>%
    testthat::expect_error()
  makeSymbolIcons('rect', width = 1, height = '1', color = 'black') %>%
    testthat::expect_error()
  makeSymbolIcons('rect', width = 1, opacity = '1', color = 'black') %>%
    testthat::expect_error()
  makeSymbolIcons('rect', width = 1, opacity = 1, fillOpacity = '1',
                  color = 'black') %>%
    testthat::expect_error()
  makeSymbolIcons(NA, width = 1, height = 1, opacity = 1, color = 'black') %>%
    testthat::expect_error()
  makeLegendSymbol(shape = 'rect', width = 1, color = 'black') %>%
    testthat::expect_error()
  makeLegendSymbol(label = '', shape = 'rect', width = 1, color = 'black') %>%
    testthat::expect_error()
  m %>%
    addSymbols(lat = ~lat, lng = ~lng, data = mapData) %>%
    testthat::expect_error()
  m %>%
    addSymbols(lat = ~lat, lng = ~lng, color = 'black',
               values = 1:11, data = mapData) %>%
    testthat::expect_error()
  m %>%
    addSymbols(lat = ~lat, lng = ~lng, color = 'black',
               shape = c('rect', 'notashape'),
               values = ~x, data = mapData) %>%
    testthat::expect_error()
  m %>%
    addSymbolsSize(lat = ~lat, lng = ~lng, data = mapData) %>%
    testthat::expect_error()
  m %>%
    addSymbolsSize(lat = ~lat, lng = ~lng,
                   values = ~x, data = mapData) %>%
    testthat::expect_error()
  m %>%
    addSymbolsSize(lat = ~lat, lng = ~lng, color = 'black',
               shape = c('notashape'),
               values = ~x, data = mapData) %>%
    testthat::expect_error()
  m %>%
    addSymbolsSize(lat = ~lat, lng = ~lng, color = 'black',
                   baseSize = -1,
                   values = ~x, data = mapData) %>%
    testthat::expect_error()
  # test shapes
  makeSymbol('rect', width = 1, height = 2,
             color = 'black', fillColor = 'blue',
             opacity = .9, fillOpacity = .7) %>%
    URLdecode() %>%
      testthat::expect_equal(
        'data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"3\" height=\"4\">\n  <rect id=\"rect\" x=\"1\" y=\"1\" height=\"2\" width=\"1\" stroke=\"black\" fill=\"blue\" stroke-opacity=\"0.9\" fill-opacity=\"0.7\"></rect>\n</svg>'
      )
  makeSymbol('circle', width = 1, height = 2,
             color = 'black', fillColor = 'blue',
             opacity = .9, fillOpacity = .7) %>%
    URLdecode() %>%
    testthat::expect_equal(
      'data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"3\" height=\"4\">\n  <circle id=\"circle\" cx=\"2\" cy=\"2\" r=\"1\" stroke=\"black\" fill=\"blue\" stroke-opacity=\"0.9\" fill-opacity=\"0.7\"></circle>\n</svg>'
    )
  makeSymbol('triangle', width = 1, height = 2,
             color = 'black', fillColor = 'blue',
             opacity = .9, fillOpacity = .7) %>%
    URLdecode() %>%
    testthat::expect_equal(
      'data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"3\" height=\"4\">\n  <polygon id=\"triangle\" points=\"1,3 2,3 1.5,1\" stroke=\"black\" fill=\"blue\" stroke-opacity=\"0.9\" fill-opacity=\"0.7\"></polygon>\n</svg>'
    )
  makeSymbol('plus', width = 1, height = 2,
             color = 'black', fillColor = 'blue',
             opacity = .9, fillOpacity = .7) %>%
    URLdecode() %>%
    testthat::expect_equal(
      'data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"3\" height=\"4\">\n  <polygon id=\"plus\" points=\"1.4,1 1.4,1.8 1,1.8 1,2.2 1.4,2.2 1.4,3 1.6,3 1.6,2.2 2,2.2 2,1.8 1.6,1.8 1.6,1 1.4,1\" stroke=\"black\" fill=\"blue\" stroke-opacity=\"0.9\" fill-opacity=\"0.7\"></polygon>\n</svg>'
      )
  makeSymbol('cross', width = 1, height = 2,
             color = 'black', fillColor = 'blue',
             opacity = .9, fillOpacity = .7) %>%
    URLdecode() %>%
    testthat::expect_equal(
      'data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"3\" height=\"4\">\n  <polygon id=\"cross\" points=\"1.14142135623731,1 1,1.28284271247462 1.35857864376269,2 1,2.71715728752538 1.14142135623731,3 1.5,2.28284271247462 1.85857864376269,3 2,2.71715728752538 1.64142135623731,2 2,1.28284271247462 1.85857864376269,1 1.5,1.71715728752538 1.14142135623731,1\" stroke=\"black\" fill=\"blue\" stroke-opacity=\"0.9\" fill-opacity=\"0.7\"></polygon>\n</svg>'
      )
  makeSymbol('diamond', width = 1, height = 2,
             color = 'black', fillColor = 'blue',
             opacity = .9, fillOpacity = .7) %>%
    URLdecode() %>%
    testthat::expect_equal(
      'data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"3\" height=\"4\">\n  <polygon id=\"diamond\" points=\"1.5,1 1,2 1.5,3 2,2 1.5,1\" stroke=\"black\" fill=\"blue\" stroke-opacity=\"0.9\" fill-opacity=\"0.7\"></polygon>\n</svg>'
      )
  makeSymbol('star', width = 1, height = 2,
             color = 'black', fillColor = 'blue',
             opacity = .9, fillOpacity = .7) %>%
    URLdecode() %>%
    testthat::expect_equal(
      'data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"3\" height=\"4\">\n  <polygon id=\"star\" points=\"1.4,1 1.4,1.5171572 1.1414214,1 1,1.2828428 1.2585786,1.8 1,1.8 1,2.2 1.2585786,2.2 1,2.7171572 1.1414214,3 1.4,2.4828428 1.4,3 1.6,3 1.6,2.4828428 1.8585786,3 2,2.7171572 1.7414214,2.2 2,2.2 2,1.8 1.7414214,1.8 2,1.2828428 1.8585786,1 1.6,1.5171572 1.6,1 1.4,1\" stroke=\"black\" fill=\"blue\" stroke-opacity=\"0.9\" fill-opacity=\"0.7\"></polygon>\n</svg>'
      )
  makeSymbol('stadium', width = 1, height = 2,
             color = 'black', fillColor = 'blue',
             opacity = .9, fillOpacity = .7) %>%
    URLdecode() %>%
    testthat::expect_equal(
      'data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"3\" height=\"4\">\n  <rect id=\"stadium\" x=\"1\" y=\"1\" height=\"2\" width=\"1\" rx=\"25%\" stroke=\"black\" fill=\"blue\" stroke-opacity=\"0.9\" fill-opacity=\"0.7\"></rect>\n</svg>'
      )
  makeSymbol('line', width = 1, height = 2,
             color = 'black', fillColor = 'blue',
             opacity = .9, fillOpacity = .7) %>%
    URLdecode() %>%
    testthat::expect_equal(
      'data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"3\" height=\"4\">\n  <line id=\"line\" x1=\"0\" x2=\"3\" y1=\"2\" y2=\"2\" stroke=\"black\" stroke-opacity=\"0.9\" fill-opacity=\"0.7\"></line>\n</svg>'
      )
  makeSymbol('polygon', width = 1, height = 2,
             color = 'black', fillColor = 'blue',
             opacity = .9, fillOpacity = .7) %>%
    URLdecode() %>%
    testthat::expect_equal(
      'data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"3\" height=\"4\">\n  <polygon id=\"polygon\" points=\"1.5,1 1.02447174185242,1.69098300562505 1.20610737385376,2.80901699437495 1.79389262614624,2.80901699437495 1.97552825814758,1.69098300562505 1.5,1\" stroke=\"black\" fill=\"blue\" stroke-opacity=\"0.9\" fill-opacity=\"0.7\"></polygon>\n</svg>'
      )
  makeSymbol('text', width = 1, height = 2,
             color = 'black', fillColor = 'blue',
             opacity = .9, fillOpacity = .7) %>%
    URLdecode() %>%
    testthat::expect_equal(
      'data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"3\" height=\"4\">\n  <text id=\"text\" x=\"50%\" y=\"50%\" dominant-baseline=\"central\" text-anchor=\"middle\" font-size=\"1px\" textLength=\"1\" lengthAdjust=\"spacingAndGlyphs\" fill=\"blue\" fill-opacity=\"0.7\" stroke=\"black\" stroke-opacity=\"0.9\" stroke-width=\"0\">abc</text>\n</svg>'
      )
  makeLegendSymbol(label = '', labelStyle = '', shape = 'rect', width = 1,
                   color = 'black') %>%
    as.character() %>%
    URLdecode() %>%
    testthat::expect_equal(
    '<img src="data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="3" height="3">
  <rect id="rect" x="1" y="1" height="1" width="1" stroke="black" fill="black" stroke-opacity="1" fill-opacity="1"></rect>
</svg>" style="vertical-align: middle; margin: 1px;"/>
<span style="vertical-align: middle; padding: 1px; "></span>')
  makeLegendSymbol(label = '', labelStyle = '', shape = 'rect', width = 1,
                   color = 'black', orientation = 'horizontal') %>%
    as.character() %>%
    URLdecode() %>%
    testthat::expect_equal(
      '<img src="data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="3" height="3">
  <rect id="rect" x="1" y="1" height="1" width="1" stroke="black" fill="black" stroke-opacity="1" fill-opacity="1" orientation="horizontal"></rect>
</svg>" style="vertical-align: middle; margin: 1px;"/>
<span style="vertical-align: middle; padding: 1px; "></span>')
  # test negative sizes
  sizeNumeric(values = 1:4, baseSize = -5) %>%
    testthat::expect_error()
  sizeBreaks(values = 1:4, breaks = 4, baseSize = -5) %>%
    testthat::expect_error()
  sizeBreaks(values = 1:4, breaks = -1, baseSize = 5) %>%
    testthat::expect_error()
  # test minSize/maxSize validation for sizeBreaks
  sizeBreaks(values = 1:4, breaks = 4, baseSize = 5, minSize = 6) %>%
    testthat::expect_error()
  sizeBreaks(values = 1:4, breaks = 4, baseSize = 5, maxSize = 4) %>%
    testthat::expect_error()
  sizeBreaks(values = 1:4, breaks = 4, baseSize = 5, minSize = 3, maxSize = 4) %>%
    testthat::expect_error()
  # test simple size outputs
  sizeNumeric(1:4, 5) %>%
    testthat::expect_equal(c(2, 4, 6, 8))
  sizeBreaks(1:4, 4, 5) %>%
    testthat::expect_equal(stats::setNames(c(2, 4, 6, 8), c(1, 2, 3, 4)))
  sizeBreaks(1:4, 1:4, 5) %>%
    testthat::expect_equal(stats::setNames(c(2, 4, 6, 8), c(1, 2, 3, 4)))
  # test sizeBreaks clamping
  testthat::expect_true(all(sizeBreaks(1:4, 4, 5, minSize = 3) >= 3))
  testthat::expect_true(all(sizeBreaks(1:4, 4, 5, maxSize = 7) <= 7))
  testthat::expect_true(all(sizeBreaks(1:4, 4, 5, minSize = 3, maxSize = 7) >= 3))
  testthat::expect_true(all(sizeBreaks(1:4, 4, 5, minSize = 3, maxSize = 7) <= 7))
  # test size icons args
  makeSymbolsSize(values = 1:4, shape = 'notashape', fillColor = 'black',
                  color = 'black', baseSize = 5) %>%
    testthat::expect_error()
  makeSymbolsSize(values = 1:4, shape = 'rect', fillColor = 'black',
                  color = 'black', baseSize = -5) %>%
    testthat::expect_error()
  makeSymbolsSize(values = 1:4, shape = 'rect', fillColor = 'black',
                  color = 'black', baseSize = 5, opacity = '1') %>%
    testthat::expect_error()
  makeSymbolsSize(values = 1:4, shape = c('rect', 'circle'),
                  fillColor = 'black',
                  color = 'black', baseSize = 5, opacity = 1) %>%
    testthat::expect_error()
  makeSymbolsSize(values = 1:4, shape = 'rect', fillColor = 'black',
                  color = 'black', baseSize = 5, opacity = 1,
                  strokeWidth = -1) %>%
    testthat::expect_error()
  makeSymbolsSize(values = 1:4, shape = 'rect', fillColor = 'black',
                  color = 'black', baseSize = 5, minSize = 6) %>%
    testthat::expect_error()
  makeSymbolsSize(values = 1:4, shape = 'rect', fillColor = 'black',
                  color = 'black', baseSize = 5, maxSize = 4) %>%
    testthat::expect_error()
  makeSymbolsSize(values = 1:4, shape = 'rect', fillColor = 'black',
                  color = 'black', baseSize = 5, minSize = 3, maxSize = 4) %>%
    testthat::expect_error()
  makeSymbolsSize(values = 1:4, shape = 'rect', baseSize = 5, opacity = 1) %>%
    testthat::expect_error()
  makeSymbolsSize(values = 1:4, shape = 'rect', baseSize = 5, opacity = 1,
                  color = 'black',
                  fillColor = c('black', 'blue')) %>%
    testthat::expect_error()
  # test size icons
  makeSymbolsSize(values = 1:4, shape = 'rect', fillColor = 'black',
                  color = 'black', baseSize = 5)$iconUrl[[1]] %>%
    URLdecode() %>%
    testthat::expect_equal(
      'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="4" height="4">
  <rect id="rect" x="1" y="1" height="2" width="2" stroke="black" fill="black" stroke-opacity="1" fill-opacity="1" stroke-width="1"></rect>
</svg>')
  makeSymbolsSize(values = 1:4, shape = 'rect', fillColor = 'blue',
                color = 'black', baseSize = 5)$iconUrl[[2]] %>%
    URLdecode() %>%
    testthat::expect_equal(
      'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="6" height="6">
  <rect id="rect" x="1" y="1" height="4" width="4" stroke="black" fill="blue" stroke-opacity="1" fill-opacity="1" stroke-width="1"></rect>
</svg>')
  makeSymbolsSize(values = 1:4, shape = 'rect', color = pal(4:1),
                  fillColor = pal(4:1),
                  baseSize = 5)$iconUrl[[3]] %>%
    URLdecode() %>%
    testthat::expect_equal(
      'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="8" height="8">
  <rect id="rect" x="1" y="1" height="6" width="6" stroke="#FDA081" fill="#FDA081" stroke-opacity="1" fill-opacity="1" stroke-width="1"></rect>
</svg>')
  makeSymbolsSize(values = 1:4, shape = 'rect', fillColor = pal(4:1),
                color = pal(1:4),
                baseSize = 5)$iconUrl[[4]] %>%
    URLdecode() %>%
    testthat::expect_equal(
      'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="10" height="10">
  <rect id="rect" x="1" y="1" height="8" width="8" stroke="#67000D" fill="#FFF5F0" stroke-opacity="1" fill-opacity="1" stroke-width="1"></rect>
</svg>')
  sizeNumeric(1:4, baseSize = 5) %>%
    testthat::expect_equal(c(2, 4, 6, 8))
  testthat::expect_true(all(sizeNumeric(1:4, baseSize = 5, minSize = 3) >= 3))
  testthat::expect_true(all(sizeNumeric(1:4, baseSize = 5, maxSize = 7) <= 7))
  testthat::expect_true(all(sizeNumeric(1:4, baseSize = 5, minSize = 3, maxSize = 7) >= 3))
  testthat::expect_true(all(sizeNumeric(1:4, baseSize = 5, minSize = 3, maxSize = 7) <= 7))
  mapData <- data.frame(x = 1:2, lat = c(41,42), lng = c(-122, -122))
  mapData$label <- c('A', 'B')
  m %>%
    addSymbols(lat = ~lat, lng = ~lng, color = 'black', data = mapData,
               label = ~label) %>%
    testthat::expect_no_error()
  m %>%
    addSymbols(lat = ~lat, lng = ~lng, color = 'black', data = mapData,
               label = c('A', 'B')) %>%
    testthat::expect_no_error()
  m %>%
    addSymbols(lat = ~lat, lng = ~lng, color = ~pal(x), fillColor = ~pal(x),
               values = ~x, data = mapData) %>%
    getElement('x') %>%
    getElement('calls') %>%
    getElement(1) %>%
    getElement('args') %>%
    getElement(3) %>%
    getElement('iconUrl') %>%
    getElement('data') %>%
    URLdecode() %>%
    testthat::expect_equal(
      c("data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"22\" height=\"22\">\n  <rect id=\"rect\" x=\"1\" y=\"1\" height=\"20\" width=\"20\" stroke=\"#FFF5F0\" fill=\"#FFF5F0\" stroke-opacity=\"1\" fill-opacity=\"1\" stroke-width=\"1\" stroke-dasharray=\"none\"></rect>\n</svg>",
        "data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"22\" height=\"22\">\n  <circle id=\"circle\" cx=\"11\" cy=\"11\" r=\"10\" stroke=\"#FDA081\" fill=\"#FDA081\" stroke-opacity=\"1\" fill-opacity=\"1\" stroke-width=\"1\" stroke-dasharray=\"none\"></circle>\n</svg>"
      ))
  m %>%
    addSymbolsSize(lat = ~lat, lng = ~lng, color = ~pal(x), fillColor = ~pal(x),
                   values = ~x, data = mapData) %>%
    getElement('x') %>%
    getElement('calls') %>%
    getElement(1) %>%
    getElement('args') %>%
    getElement(3) %>%
    getElement('iconUrl') %>%
    getElement('data') %>%
    URLdecode() %>%
    testthat::expect_equal(
      c("data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"15.3333333333333\" height=\"15.3333333333333\">\n  <rect id=\"rect\" x=\"1\" y=\"1\" height=\"13.3333333333333\" width=\"13.3333333333333\" stroke=\"#FFF5F0\" fill=\"#FFF5F0\" stroke-opacity=\"1\" fill-opacity=\"1\" stroke-width=\"1\" stroke-dasharray=\"none\"></rect>\n</svg>",
        "data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"28.6666666666667\" height=\"28.6666666666667\">\n  <rect id=\"rect\" x=\"1\" y=\"1\" height=\"26.6666666666667\" width=\"26.6666666666667\" stroke=\"#FDA081\" fill=\"#FDA081\" stroke-opacity=\"1\" fill-opacity=\"1\" stroke-width=\"1\" stroke-dasharray=\"none\"></rect>\n</svg>"
      ))
  drawPolygon(4) %>%
    testthat::expect_equal('0,0.5 0.5,0 1,0.5 0.5,1 0,0.5')
  symbolSvg('notashape', width = 20, height = 20, color = 'black', fillColor =
      'black', opacity = 1, fillOpacity = 1) %>%
    testthat::expect_error()
  # label overlay
  makeSymbol('circle', width = 20, color = 'black', label = 'A') %>%
    URLdecode() %>%
    testthat::expect_match('<text')
  makeSymbol('circle', width = 20, color = 'black') %>%
    URLdecode() %>%
    testthat::expect_no_match('<text')
  makeSymbol('rect', width = 20, color = 'black', label = 'B') %>%
    URLdecode() %>%
    testthat::expect_match('dominant-baseline')
})

testthat::test_that('Symbol Legends', {
  mapData <- data.frame(x = 1:2)
  pal <- leaflet::colorNumeric('Reds', mapData[['x']])
  factorPal <- leaflet::colorFactor('Set1', mapData[['x']])
  m <- leaflet::leaflet()
  # test args
  m %>%
    addLegendSize(data = mapData, values = ~x) %>%
    testthat::expect_error()
  m %>%
    addLegendSize(data = mapData, values = ~x, pal = pal,
                  fillColor = c('blue', 'red')) %>%
    testthat::expect_error()
  m %>%
    addLegendSize(data = mapData, values = ~x, color = 'black',
                  numberFormat = 'fun') %>%
    testthat::expect_error()
  m %>%
    addLegendSize(data = mapData, values = ~x, color = 'black',
                  shape = 'notashape') %>%
    testthat::expect_error()
  m %>%
    addLegendSize(data = mapData, values = ~x, color = 'black',
                  baseSize = 5, minSize = 6) %>%
    testthat::expect_error()
  m %>%
    addLegendSize(data = mapData, values = ~x, color = 'black',
                  baseSize = 5, maxSize = 4) %>%
    testthat::expect_error()
  m %>%
    addLegendSize(data = mapData, values = ~x, color = 'black',
                  baseSize = 5, minSize = 3, maxSize = 4) %>%
    testthat::expect_error()
  m %>%
    addLegendLine(data = mapData, values = ~x) %>%
    testthat::expect_error()
  m %>%
    addLegendLine(data = mapData, values = ~x) %>%
    testthat::expect_error()
  m %>%
    addLegendLine(data = mapData, values = ~x, color = 'black',
                  numberFormat = 'fun') %>%
    testthat::expect_error()
  m %>%
    addLegendLine(data = mapData, values = ~x, color = 'black',
                  baseSize = 5, minSize = 6) %>%
    testthat::expect_error()
  m %>%
    addLegendLine(data = mapData, values = ~x, color = 'black',
                  baseSize = 5, maxSize = 4) %>%
    testthat::expect_error()
  m %>%
    addLegendLine(data = mapData, values = ~x, color = 'black',
                  baseSize = 5, minSize = 3, maxSize = 4) %>%
    testthat::expect_error()
  m %>%
    addLegendSymbol(data = mapData, values = ~x) %>%
    testthat::expect_error()
  m %>%
    addLegendSymbol(data = mapData, values = ~x, pal = factorPal,
                    fillColor = c('blue', 'red', 'green')) %>%
    testthat::expect_error()
  m %>%
    addLegendSymbol(data = mapData, values = ~x,
                    color = c('black', 'grey', 'blue'),
                    pal = factorPal) %>%
    testthat::expect_error()
  m %>%
    addLegendSymbol(data = mapData, values = ~x, color = 'black',
                    shape = c('rect', 'notashape')) %>%
    testthat::expect_error()
  m %>%
    addLegendSymbol(data = mapData, values = ~x, color = 'black',
                    shape = c('rect')) %>%
    testthat::expect_error()
  # test size legends
  m %>%
    addLegendSize(data = mapData, values = ~x, pal = pal, breaks = 1,
                  color = 'black') %>%
    getElement(1) %>%
    getElement('calls') %>%
    getElement(1) %>%
    getElement('args') %>%
    getElement(1) %>%
    URLdecode() %>%
    testthat::expect_equal(
      '<div>
  <img src="data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="15.3333333333333" height="15.3333333333333">
  <rect id="rect" x="1" y="1" height="13.3333333333333" width="13.3333333333333" stroke="black" fill="#FFF5F0" stroke-opacity="1" fill-opacity="1" stroke-width="1"></rect>
</svg>" style="vertical-align: middle; margin: 5px; margin-right: 6.66666666666667px; margin-left: 6.66666666666667px" height="13.3333333333333" width="13.3333333333333"/>
  <span style="vertical-align: middle;">1</span>
</div>
<div>
  <img src="data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="28.6666666666667" height="28.6666666666667">
  <rect id="rect" x="1" y="1" height="26.6666666666667" width="26.6666666666667" stroke="black" fill="#67000D" stroke-opacity="1" fill-opacity="1" stroke-width="1"></rect>
</svg>" style="vertical-align: middle; margin: 5px; margin-right: 0px; margin-left: 0px" height="26.6666666666667" width="26.6666666666667"/>
  <span style="vertical-align: middle;">2</span>
</div>')
  m %>%
    addLegendSize(data = mapData, values = ~x, pal = pal, breaks = 1,
                  color = 'black', baseSize = 20, minSize = 5) %>%
    testthat::expect_no_error()
  m %>%
    addLegendSize(data = mapData, values = ~x, pal = pal, breaks = 1,
                  color = 'black', baseSize = 20, maxSize = 30) %>%
    testthat::expect_no_error()
  m %>%
    addLegendSize(data = mapData, values = ~x, pal = pal, breaks = 1,
                  color = 'black', baseSize = 20, minSize = 5, maxSize = 30) %>%
    testthat::expect_no_error()
  # test line legends
  m %>%
    addLegendLine(data = mapData, values = ~x, color = 'black', breaks = 1) %>%
    getElement(1) %>%
    getElement('calls') %>%
    getElement(1) %>%
    getElement('args') %>%
    getElement(1) %>%
    URLdecode() %>%
    testthat::expect_equal(
      '<div>
  <img src="data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="20" height="6.66666666666667">
  <rect id="rect" x="0" y="0" height="6.66666666666667" width="20" stroke="transparent" fill="black" stroke-opacity="1" fill-opacity="1" stroke-width="0"></rect>
</svg>" style="vertical-align: middle; margin: 5px; margin-right: 0px; margin-left: 0px" height="6.66666666666667" width="20"/>
  <span style="vertical-align: middle;">1</span>
</div>
<div>
  <img src="data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="20" height="13.3333333333333">
  <rect id="rect" x="0" y="0" height="13.3333333333333" width="20" stroke="transparent" fill="black" stroke-opacity="1" fill-opacity="1" stroke-width="0"></rect>
</svg>" style="vertical-align: middle; margin: 5px; margin-right: 0px; margin-left: 0px" height="13.3333333333333" width="20"/>
  <span style="vertical-align: middle;">2</span>
</div>')
  m %>%
    addLegendLine(data = mapData, values = ~x, color = 'black',
                  breaks = 1, baseSize = 10, minSize = 5) %>%
    testthat::expect_no_error()
  m %>%
    addLegendLine(data = mapData, values = ~x, color = 'black',
                  breaks = 1, baseSize = 10, maxSize = 15) %>%
    testthat::expect_no_error()
  m %>%
    addLegendLine(data = mapData, values = ~x, color = 'black',
                  breaks = 1, baseSize = 10, minSize = 5, maxSize = 15) %>%
    testthat::expect_no_error()
  m %>%
    addLegendSymbol(data = mapData, values = ~x, color = 'black',
                    pal = factorPal) %>%
    getElement(1) %>%
    getElement('calls') %>%
    getElement(1) %>%
    getElement('args') %>%
    getElement(1) %>%
    URLdecode() %>%
    testthat::expect_equal(
      '<div>
  <img src="data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="22" height="22">
  <rect id="rect" x="1" y="1" height="20" width="20" stroke="black" fill="#E41A1C" stroke-opacity="1" fill-opacity="1" stroke-width="1" stroke-dasharray="none"></rect>
</svg>" style="vertical-align: middle; margin: 5px; margin-right: 0px; margin-left: 0px" height="20" width="20"/>
  <span style="vertical-align: middle;">1</span>
</div>
<div>
  <img src="data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="22" height="22">
  <circle id="circle" cx="11" cy="11" r="10" stroke="black" fill="#4DAF4A" stroke-opacity="1" fill-opacity="1" stroke-width="1" stroke-dasharray="none"></circle>
</svg>" style="vertical-align: middle; margin: 5px; margin-right: 0px; margin-left: 0px" height="20" width="20"/>
  <span style="vertical-align: middle;">2</span>
</div>')

  mapData$label <- c('A', 'B')
  m %>%
    addLegendSymbol(data = mapData, values = ~x, color = 'black',
                    label = c('A', 'B')) %>%
    testthat::expect_no_error()
  m %>%
    addLegendSymbol(data = mapData, values = ~x, color = 'black',
                    label = ~label) %>%
    testthat::expect_no_error()
  m %>%
    addLegendSymbol(data = mapData, values = ~x, color = 'black',
                    label = c('A', 'B')) %>%
    getElement(1) %>%
    getElement('calls') %>%
    getElement(1) %>%
    getElement('args') %>%
    getElement(1) %>%
    URLdecode() %>%
    testthat::expect_match('<text')
  # Stacked
  m %>%
    addLegendSize(color = 'black', fillColor = 'red',
      values = 1:5, stacked = TRUE, breaks = 2, shape = 'circle') %>%
    invisible() %>%
    testthat::expect_invisible()
})

testthat::test_that('Image Legend', {
  m <- leaflet::leaflet()
  # test addLegendImage Args
  colors <- c('blue', 'red', 'yellow', 'green', 'orange', 'purple')
  leafImg <- system.file(sprintf('img/leaf-%s.png', colors),
                         package = 'leaflegend')
  testthat::expect_error(m %>% addLegendImage(images = leafImg,
                                              labels = colors,
                                              orientation = 'up'))
  testthat::expect_error(m %>% addLegendImage(images = leafImg,
                                              labels = colors,
                                              title = 1:2))
  testthat::expect_error(m %>% addLegendImage(images = seq_along(colors),
                                              labels = colors))
  testthat::expect_error(m %>% addLegendImage(images = leafImg[1:2],
                                              labels = colors))
  testthat::expect_error(m %>% addLegendImage(images = leafImg,
                                              labels = colors[1:2]))
  testthat::expect_error(m %>% addLegendImage(images = leafImg,
                                              labels = colors,
                                              width = -1))
  testthat::expect_error(m %>% addLegendImage(images = leafImg,
                                              labels = colors,
                                              height = -1))
  # test addLegendImage legends
  rectImg <- system.file('img/rect.png',
                         package = 'leaflegend')
  m %>% addLegendImage(images = rectImg, labels = 'rect',
                       orientation = 'horizontal') %>%
    getElement(1) %>%
    getElement('calls') %>%
    getElement(1) %>%
    getElement('args') %>%
    getElement(1) %>%
    testthat::expect_equal(
      '<span>
  <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABmJLR0QA/wD/AP+gvaeTAAAAKUlEQVQokWNkYGBwgGJiwAEWqOJ6IjUwMBGrcFTD4NLAwsDAcIAE9QcAil0DmynVMvUAAAAASUVORK5CYII=" style="vertical-align: middle; margin: 5px; margin-right: 0px; margin-left: 0px" height="20" width="20"/>
  <span style="font-size: 24px; vertical-align: middle;">rect</span>
</span>'
      )
  m %>% addLegendImage(
    images = makeSymbol('rect', width = 10, color = 'black'),
    labels = 'rect') %>%
    getElement(1) %>%
    getElement('calls') %>%
    getElement(1) %>%
    getElement('args') %>%
    getElement(1) %>%
    URLdecode() %>%
    testthat::expect_equal(
      '<div>
  <img src="data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="12" height="12">
  <rect id="rect" x="1" y="1" height="10" width="10" stroke="black" fill="black" stroke-opacity="1" fill-opacity="1"></rect>
</svg>" style="vertical-align: middle; margin: 5px; margin-right: 0px; margin-left: 0px" height="20" width="20"/>
  <span style="font-size: 24px; vertical-align: middle;">rect</span>
</div>'
    )
})

testthat::test_that('Numeric Legend', {
  mapData <- data.frame(x = 1:3)
  m <- leaflet::leaflet(mapData)
  pal <- leaflet::colorNumeric('Reds', mapData[['x']])
  # test args
  m %>% addLegendNumeric(pal = pal,
                         values = ~x,
                         orientation = 'up') %>%
    testthat::expect_error()
  m %>% addLegendNumeric(pal = pal,
                         values = ~x,
                         title = 1:2) %>%
    testthat::expect_error()
  m %>% addLegendNumeric(pal = pal,
                         values = ~x,
                         shape = 'circle') %>%
    testthat::expect_error()
  # is this test necessary
  m %>% addLegendNumeric(pal = pal,
                         values = ~x,
                         width = -1) %>%
    testthat::expect_error()
  m %>% addLegendNumeric(pal = pal,
                         values = ~x,
                         height = -1) %>%
    testthat::expect_error()
  m %>% addLegendNumeric(pal = pal,
                         values = ~x,
                         numberFormat = 'fun') %>%
    testthat::expect_error()
  m %>% addLegendNumeric(pal = pal,
                         values = ~x,
                         bins = -1) %>%
    testthat::expect_error()
  m %>% addLegendNumeric(pal = pal,
                         values = ~x,
                         decreasing = NULL) %>%
    testthat::expect_error()
  m %>% addLegendNumeric(pal = pal,
                         values = ~x,
                         decreasing = 'TRUE') %>%
    testthat::expect_error()
  m %>% addLegendNumeric(pal = pal,
                         values = ~x,
                         tickLength = -1) %>%
    testthat::expect_error()
  m %>% addLegendNumeric(pal = pal,
                         values = ~x,
                         tickWidth = -1) %>%
    testthat::expect_error()
  # test results
  numVert <- m %>% addLegendNumeric(pal = pal, values = c(1, NA, 3),
    decreasing = TRUE)
  numHori <- m %>% addLegendNumeric(pal = pal, values = c(1, NA, 3),
                                    orientation = 'horizontal',
    width = 100, height = 20)
  numVert %>%
    testthat::expect_no_error()
  numHori %>%
    testthat::expect_no_error()
  m %>%
    addLegendNumeric(pal = pal, values = ~x, bins = c(10, 11)) %>%
    testthat::expect_error()
  m %>%
    addLegendNumeric(pal = pal, values = ~x, bins = c(1, 3)) %>%
    testthat::expect_no_error()
  m %>%
    addLegendNumeric(pal = pal, values = ~x, orientation = 'horizontal',
                     bins = 5) %>%
    testthat::expect_no_error()
  m %>%
    addLegendNumeric(pal = pal, values = ~x, orientation = 'horizontal',
                     bins = c(1.5, 2, 2.5)) %>%
    testthat::expect_no_error()
  m %>%
    addLegendNumeric(pal = pal, values = ~x, orientation = 'horizontal',
                     bins = 5, decreasing = TRUE) %>%
    testthat::expect_no_error()
#   numVert %>%
#     getElement('x') %>%
#     getElement('calls') %>%
#     getElement(1) %>%
#     getElement('args') %>%
#     getElement(1) %>%
#     strsplit('<img') %>%
#     getElement(1) %>%
#     getElement(1) %>%
#     testthat::expect_equal(
#       expected = '<div style="display: flex;">
#   <div style="margin-right: 5px">
#     <svg width="24" height="100" style="margin: 1px;">
#       <defs>
#         <linearGradient id="gradient-c1NA3-1" x1="0" y1="0" x2="0" y2="1">
#           <stop offset="0.000%" stop-color="#FFF5F0"></stop>
#           <stop offset="25.000%" stop-color="#FCBBA1"></stop>
#           <stop offset="50.000%" stop-color="#FB6A4A"></stop>
#           <stop offset="75.000%" stop-color="#CB181D"></stop>
#           <stop offset="100.000%" stop-color="#67000D"></stop>
#         </linearGradient>
#       </defs>
#       <g>
#         <rect height="100" width="20" x="0" rx="0%" fill-opacity="1" fill="url(#gradient-c1NA3-1)"></rect>
#       </g>
#       <line x1="20" x2="24" y1="25" y2="25" stroke-width="1" stroke="black"></line>
#       <line x1="20" x2="24" y1="50" y2="50" stroke-width="1" stroke="black"></line>
#       <line x1="20" x2="24" y1="75" y2="75" stroke-width="1" stroke="black"></line>
#     </svg>
#   </div>
#   <div style="width: 19.535px; height: 100.000px; display: flex;&#10;        justify-content: flex-end; position: relative; " class="container">
#     <div style="position:absolute; top: 15.512%;">1.5</div>
#     <div style="position:absolute; top: 40.512%;">2</div>
#     <div style="position:absolute; top: 65.512%;">2.5</div>
#   </div>
#   <div style="width: 8px; position: relative;"></div>
# </div>
# <div style="margin-top: .3rem;">
#   ')
#   numVert %>%
#     getElement('x') %>%
#     getElement('calls') %>%
#     getElement(1) %>%
#     getElement('args') %>%
#     getElement(1) %>%
#     strsplit('<img') %>%
#     getElement(1) %>%
#     getElement(2) %>%
#     sprintf(fmt = '%2$s%1$s', '<img') %>%
#     URLdecode() %>%
#     testthat::expect_equal(
#       expected = '<img src="data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="20" height="20">
#   <rect id="rect" x="0" y="0" height="20" width="20" stroke="#808080" fill="#808080" stroke-opacity="1" fill-opacity="1" stroke-width="0"></rect>
# </svg>" style="vertical-align: middle; margin: 1px;"/>
#   <span style="vertical-align: middle; padding: 1px; ">NA</span>
# </div>')
#   numHori %>%
#     getElement('x') %>%
#     getElement('calls') %>%
#     getElement(1) %>%
#     getElement('args') %>%
#     getElement(1) %>%
#     strsplit('<img') %>%
#     getElement(1) %>%
#     sprintf(fmt = '%2$s%1$s', c('', '<img')) %>%
#     mapply(function(x,fun) fun(x), x = ., fun = c(identity, URLdecode)) %>%
#     paste0(collapse = '\n') %>%
#     testthat::expect_equal(
#       '<div style="margin-right: 3.90697674418605px; margin-left: 3.90697674418605px">
#   <svg width="20" height="104">
#     <defs>
#       <linearGradient id="gradient-c1NA3-1" x1="0" y1="0" x2="1" y2="0">
#         <stop offset="0.000%" stop-color="#FFF5F0"></stop>
#         <stop offset="100.000%" stop-color="#67000D"></stop>
#       </linearGradient>
#     </defs>
#     <g>
#       <rect height="100" width="20" x="0" ry="0%" fill-opacity="1" fill="url(#gradient-c1NA3-1)"></rect>
#     </g>
#     <line x1="0" x2="0" y1="100" y2="104" stroke-width="1" stroke="black"></line>
#     <line x1="20" x2="20" y1="100" y2="104" stroke-width="1" stroke="black"></line>
#   </svg>
# </div>
# <div style="width: 100%; height: 1rem; position: relative; ">
#   <div style="position:absolute; left:0px; top: 0px;">1</div>
#   <div style="position:absolute; left:20px; top: 0px;">3</div>
# </div>
# <div style="margin-top: .3rem;">
#
# <img src="data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100" height="100">
#   <rect id="rect" x="0" y="0" height="100" width="100" stroke="#808080" fill="#808080" stroke-opacity="1" fill-opacity="1" stroke-width="0"></rect>
# </svg>" style="vertical-align: middle; margin: 1px;"/>
#   <span style="vertical-align: middle; padding: 1px; ">NA</span>
# </div>')

})

testthat::test_that('Categorical Legends', {
  # test Quantile args
  mapData <- data.frame(x = 1:10,
                        y = rep(LETTERS[1:2], 5))
  m <- leaflet::leaflet(mapData)
  palQuantile <- leaflet::colorQuantile('Reds', mapData[['x']], n = 2)
  palBin <- leaflet::colorBin('Blues', mapData[['x']], bins = 2)
  palFactor <- leaflet::colorFactor('viridis', mapData[['y']])
  # test Quantile args
  m %>% addLegendQuantile(pal = palQuantile,
                          values = ~x,
                          orientation = 'up') %>%
    testthat::expect_error()
  m %>% addLegendQuantile(pal = palQuantile,
                          values = ~x,
                          title = 1:2) %>%
    testthat::expect_error()
  m %>% addLegendQuantile(pal = palQuantile,
                          values = ~x,
                          shape = 'notashape') %>%
    testthat::expect_error()
  m %>% addLegendQuantile(pal = palQuantile,
                          values = ~x,
                          width = -1) %>%
    testthat::expect_error()
  m %>% addLegendQuantile(pal = palQuantile,
                          values = ~x,
                          height = -1) %>%
    testthat::expect_error()
  m %>% addLegendQuantile(pal = palQuantile,
                          values = ~x,
                          numberFormat = 'fun') %>%
    testthat::expect_error()
  m %>% addLegendQuantile(pal = palQuantile,
    values = ~x,
    numberFormat = NULL) %>%
    testthat::expect_no_error()
  # test Bin args
  m %>% addLegendBin(pal = palBin,
                     orientation = 'up') %>%
    testthat::expect_error()
  m %>% addLegendBin(pal = palBin,
                     title = 1:2) %>%
    testthat::expect_error()
  m %>% addLegendBin(pal = palBin,
                     shape = 'notashape') %>%
    testthat::expect_error()
  m %>% addLegendBin(pal = palBin,
                     width = -1) %>%
    testthat::expect_error()
  m %>% addLegendBin(pal = palBin,
                     height = -1) %>%
    testthat::expect_error()
  m %>% addLegendBin(pal = palBin,
                     numberFormat = 'fun') %>%
    testthat::expect_error()
  # test labelCutpoints args
  m %>% addLegendBin(pal = palBin,
                     values = ~x,
                     labelCutpoints = TRUE,
                     orientation = 'horizontal') %>%
    testthat::expect_error()
  # test labelCutpoints results
  m %>% addLegendBin(pal = palBin, values = ~x, labelCutpoints = TRUE) %>%
    testthat::expect_no_error()
  m %>% addLegendBin(pal = palBin, values = ~x, labelCutpoints = TRUE,
                     shape = 'circle') %>%
    testthat::expect_no_error()
  m %>% addLegendBin(pal = palBin, values = ~x, labelCutpoints = TRUE,
                     width = 40, height = 30) %>%
    testthat::expect_no_error()
  m %>% addLegendBin(pal = palBin, values = ~x, labelCutpoints = TRUE,
                     tickLength = 8, tickWidth = 3) %>%
    testthat::expect_no_error()
  m %>% addLegendBin(pal = palBin, values = ~x, labelCutpoints = TRUE,
                     labelStyle = 'font-size: 14px;') %>%
    testthat::expect_no_error()
  m %>% addLegendBin(pal = palBin, values = ~x, labelCutpoints = TRUE,
                     numberFormat = function(x) sprintf('%.1f', x)) %>%
    testthat::expect_no_error()
  mapData$x[1] <- NA
  m %>% addLegendBin(pal = palBin, values = ~x, labelCutpoints = TRUE,
                     naLabel = 'Missing') %>%
    testthat::expect_no_error()
  mapData$x[1] <- 1L
  testthat::expect_equal(
    m %>% addLegendBin(pal = palBin,
                       values = ~x,
                       labelCutpoints = TRUE) %>%
      getElement(1) %>%
      getElement('calls') %>%
      getElement(1) %>%
      getElement('args') %>%
      getElement(1) %>%
      as.character() %>%
      URLdecode(),
    "<div style=\"position: relative; margin-top:.5em; margin-bottom:.5em; ;&#10;      width: calc(32px + 1em + 2px); height: calc(50px + 0em);\">\n  <img src=\"data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"32\" height=\"50\">\n  <svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"32\" height=\"50\">\n    <g transform=\"translate(0,1)\">\n      <rect id=\"rect\" x=\"0\" y=\"0\" height=\"24\" width=\"24\" stroke=\"#DEEBF7\" fill=\"#DEEBF7\" stroke-opacity=\"1\" fill-opacity=\"1\" stroke-width=\"0\"></rect>\n    </g>\n    <g transform=\"translate(0,25)\">\n      <rect id=\"rect\" x=\"0\" y=\"0\" height=\"24\" width=\"24\" stroke=\"#3182BD\" fill=\"#3182BD\" stroke-opacity=\"1\" fill-opacity=\"1\" stroke-width=\"0\"></rect>\n    </g>\n    <line x1=\"0\" x2=\"4\" y1=\"1\" y2=\"1\" stroke-width=\"1\" stroke=\"black\" transform=\"translate(24.000,0)\"></line>\n    <line x1=\"0\" x2=\"4\" y1=\"25\" y2=\"25\" stroke-width=\"1\" stroke=\"black\" transform=\"translate(24.000,0)\"></line>\n    <line x1=\"0\" x2=\"4\" y1=\"49\" y2=\"49\" stroke-width=\"1\" stroke=\"black\" transform=\"translate(24.000,0)\"></line>\n  </svg>\n</svg>\" style=\"margin-left: 1px;\"/>\n  <p style=\"position: absolute; margin: 0; top: calc(1.00px - .5em);&#10;        right: 0; line-height:1;\">0</p>\n  <p style=\"position: absolute; margin: 0; top: calc(25.00px - .5em);&#10;        right: 0; line-height:1;\">5</p>\n  <p style=\"position: absolute; margin: 0; top: calc(49.00px - .5em);&#10;        right: 0; line-height:1;\">10</p>\n</div>"
  )
  # test Factor args
  m %>% addLegendFactor(pal = palFactor,
                        values = ~y,
                        orientation = 'up') %>%
    testthat::expect_error()
  m %>% addLegendFactor(pal = palFactor,
                        values = ~y,
                        title = 1:2) %>%
    testthat::expect_error()
  m %>% addLegendFactor(pal = palFactor,
                        values = ~y,
                        shape = 'notashape') %>%
    testthat::expect_error()
  m %>% addLegendFactor(pal = palFactor,
                        values = ~y,
                        width = -1) %>%
    testthat::expect_error()
  m %>% addLegendFactor(pal = pal,
                        values = ~y,
                        height = -1) %>%
    testthat::expect_error()
  m %>% addLegendFactor(pal = palFactor,
                        values = ~y,
                        numberFormat = 'fun') %>%
    testthat::expect_error()
  # test results
  m %>% addLegendQuantile(pal = palQuantile,
                          values = ~x) %>%
    getElement(1) %>%
    getElement('calls') %>%
    getElement(1) %>%
    getElement('args') %>%
    getElement(1) %>%
    strsplit('\n') %>%
    getElement(1) %>%
    lapply(function(x) {
      if ( substring(x, 2,4) == 'img' ) {
        URLdecode(x)
      } else {
        x
      }
    }
    ) %>%
    paste0(collapse = '\n') %>%
    testthat::expect_equal(
      '<img src="data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="26" height="26">
  <rect id="rect" x="1" y="1" height="24" width="24" stroke="#FEE0D2" fill="#FEE0D2" stroke-opacity="1" fill-opacity="1" stroke-width="1"></rect>
</svg>" style="vertical-align: middle; margin: 1px;"/>
<span style="vertical-align: middle; padding: 1px; ">  0% -  50% (1 - 6)</span>
<br/>
<img src="data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="26" height="26">
  <rect id="rect" x="1" y="1" height="24" width="24" stroke="#DE2D26" fill="#DE2D26" stroke-opacity="1" fill-opacity="1" stroke-width="1"></rect>
</svg>" style="vertical-align: middle; margin: 1px;"/>
<span style="vertical-align: middle; padding: 1px; "> 50% - 100% (6 - 10)</span>
<br/>')
  m %>% addLegendBin(pal = palBin, values = ~x) %>%
    getElement(1) %>%
    getElement('calls') %>%
    getElement(1) %>%
    getElement('args') %>%
    getElement(1) %>%
    URLdecode() %>%
    testthat::expect_equal(
      '<img src="data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="26" height="26">
  <rect id="rect" x="1" y="1" height="24" width="24" stroke="#DEEBF7" fill="#DEEBF7" stroke-opacity="1" fill-opacity="1" stroke-width="1"></rect>
</svg>" style="vertical-align: middle; margin: 1px;"/>
<span style="vertical-align: middle; padding: 1px; "> 0 - 5</span>
<br/>
<img src="data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="26" height="26">
  <rect id="rect" x="1" y="1" height="24" width="24" stroke="#3182BD" fill="#3182BD" stroke-opacity="1" fill-opacity="1" stroke-width="1"></rect>
</svg>" style="vertical-align: middle; margin: 1px;"/>
<span style="vertical-align: middle; padding: 1px; "> 5 - 10</span>
<br/>')
  m %>% addLegendFactor(pal = palFactor,
                        values = ~y) %>%
    getElement(1) %>%
    getElement('calls') %>%
    getElement(1) %>%
    getElement('args') %>%
    getElement(1) %>%
    URLdecode() %>%
    testthat::expect_equal(
      '<img src="data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="26" height="26">
  <rect id="rect" x="1" y="1" height="24" width="24" stroke="#440154" fill="#440154" stroke-opacity="1" fill-opacity="1" stroke-width="1"></rect>
</svg>" style="vertical-align: middle; margin: 1px;"/>
<span style="vertical-align: middle; padding: 1px; "> A</span>
<br/>
<img src="data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="26" height="26">
  <rect id="rect" x="1" y="1" height="24" width="24" stroke="#FDE725" fill="#FDE725" stroke-opacity="1" fill-opacity="1" stroke-width="1"></rect>
</svg>" style="vertical-align: middle; margin: 1px;"/>
<span style="vertical-align: middle; padding: 1px; "> B</span>
<br/>')
})

testthat::test_that('Awesome Legends', {
  m <- leaflet::leaflet()
  iconSet <- leaflet::awesomeIconList(
    'home' = leaflet::makeAwesomeIcon()
  )
  # test args
  m %>%
    addLegendAwesomeIcon(iconSet = list()) %>%
    testthat::expect_error()
  m %>%
    addLegendAwesomeIcon(
      iconSet = leaflet::awesomeIconList(leaflet::makeAwesomeIcon())) %>%
    testthat::expect_error()
  m %>%
    addLegendAwesomeIcon(iconSet = iconSet, marker = NA) %>%
    testthat::expect_error()
  # test results
  m %>%
    addLegendAwesomeIcon(iconSet = iconSet) %>%
    getElement('dependencies') %>%
    vapply(getElement, 'name', FUN.VALUE = character(1)) %>%
    testthat::expect_contains(c('leaflet-awesomemarkers', 'bootstrap'))
  m %>%
    addLegendAwesomeIcon(iconSet = iconSet) %>%
    getElement(1) %>%
    getElement('calls') %>%
    getElement(1) %>%
    getElement('args') %>%
    getElement(1) %>%
    testthat::expect_equal(
      '<div>
  <div style="vertical-align: middle; display:&#10;          inline-block; position: relative;" class="awesome-marker-icon-blue awesome-marker ">
    <i class="glyphicon glyphicon-home " style="color: white; ; margin-right: 0px"></i>
  </div>
  <span style="vertical-align: middle;">home</span>
</div>')
  m %>%
    addLegendAwesomeIcon(iconSet = iconSet, orientation = 'horizontal',
                         title = 'Icons') %>%
    getElement(1) %>%
    getElement('calls') %>%
    getElement(1) %>%
    getElement('args') %>%
    getElement(1) %>%
    testthat::expect_equal(
      '<div>
  <strong>Icons</strong>
</div>
<span>
  <div style="vertical-align: middle; display:&#10;          inline-block; position: relative;" class="awesome-marker-icon-blue awesome-marker ">
    <i class="glyphicon glyphicon-home " style="color: white; ; margin-right: 0px"></i>
  </div>
  <span style="vertical-align: middle;">home</span>
</span>'
    )
})

testthat::test_that('Helper Functions', {
  parseValues(1:2) %>%
    testthat::expect_equal(1:2)
  m <- leaflet::leaflet()
  m %>%
    leaflegendAddControl(html = '<p>Test</p>', group = 'Test') %>%
    testthat::expect_error()
  m %>%
    leaflegendAddControl(className = '', group = 'Test') %>%
    testthat::expect_error()
  m %>%
    leaflegendAddControl(html = '',className = '', group = 'Test') %>%
    getElement(1) %>%
    getElement('calls') %>%
    getElement(1) %>%
    getElement('args') %>%
    getElement(4) %>%
    testthat::expect_equal(' leaflegend-group-Test')
  leafletAwesomeMarkersDependencies() %>%
    testthat::expect_equal(leaflet:::leafletAwesomeMarkersDependencies())
  leafletAmFontAwesomeDependencies() %>%
    testthat::expect_equal(leaflet:::leafletAmFontAwesomeDependencies())
  leafletAmIonIconDependencies() %>%
    testthat::expect_equal(leaflet:::leafletAmIonIconDependencies())
  leafletAmBootstrapDependencies() %>%
    testthat::expect_equal(leaflet:::leafletAmBootstrapDependencies())
  coalesceMissing(y = 1L) %>%
    testthat::expect_equal(1L)
  coalesceMissing(x = 2L, y = 1L) %>%
    testthat::expect_equal(2L)
  coalesceMissing(x = 1L) %>%
    testthat::expect_equal(1L)
})

testthat::test_that('pch', {
  defaultSize <- 20
  makeSymbol(shape = -1, width = defaultSize, color = 'black') |>
    testthat::expect_error()
  makeSymbol(shape = 1.5, width = defaultSize, color = 'black') |>
    testthat::expect_error()
  makeSymbol(shape = 26, width = defaultSize, color = 'black') |>
    testthat::expect_error()
  makeLegendSymbol(label = '', labelStyle = '', shape = 'open-rect', width = 1,
    color = 'black', orientation = 'horizontal') %>%
    as.character() %>%
    URLdecode() %>%
    testthat::expect_equal(
      '<img src="data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="3" height="3">
  <g transform="translate(1.000000 1.000000)">
    <rect id="open-rect" x="0" y="0" height="1" width="1" stroke="black" fill="transparent" stroke-opacity="1" orientation="horizontal"></rect>
  </g>
</svg>" style="vertical-align: middle; margin: 1px;"/>
<span style="vertical-align: middle; padding: 1px; "></span>')
  makeLegendSymbol(label = '', labelStyle = '', shape = 0, width = 1,
    color = 'black', orientation = 'horizontal') %>%
    as.character() %>%
    URLdecode() %>%
    testthat::expect_equal(
      '<img src="data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="3" height="3">
  <g transform="translate(1.000000 1.000000)">
    <rect id="open-rect" x="0" y="0" height="1" width="1" stroke="black" fill="transparent" stroke-opacity="1" orientation="horizontal"></rect>
  </g>
</svg>" style="vertical-align: middle; margin: 1px;"/>
<span style="vertical-align: middle; padding: 1px; "></span>')
  makeSymbol(availableShapes()[['pch']][26], width = 1, height = 2,
    color = 'black', fillColor = 'blue',
    opacity = .9, fillOpacity = .7) %>%
    URLdecode() %>%
    testthat::expect_equal(
      'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="3" height="4">
  <polygon id="triangle" points="1,3 2,3 1.5,1" stroke="black" fill="blue" stroke-opacity="0.9" fill-opacity="0.7" transform="rotate(180 2.000000 1.500000)"></polygon>
</svg>')
  pchSvg('notashape', width = 20, height = 20, color = 'black', fillColor =
      'black', opacity = 1, fillOpacity = 1, `stroke-width` = 2) %>%
    testthat::expect_error()
})

testthat::test_that('utils', {
  addTitle(htmltools::div('title'), list()) %>%
    as.character() %>%
    testthat::expect_equal('<div>
  <div>title</div>
</div>')
  addNa(hasNa = TRUE, htmlElements = list(), shape = 'rect', labels = 'NA',
    colors = 'grey', labelStyle = '', height = 10, width = 10, opacity = 1,
    fillOpacity = 1, strokeWidth = 0) %>%
    as.character() %>%
    URLdecode() %>%
    testthat::expect_equal('<div>
  <img src="data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="10" height="10">
  <rect id="rect" x="0" y="0" height="10" width="10" stroke="grey" fill="grey" stroke-opacity="1" fill-opacity="1" stroke-width="0"></rect>
</svg>" style="vertical-align: middle; margin: 1px;"/>
  <span style="vertical-align: middle; padding: 1px; ">NA</span>
</div>')
  verifyIconLibrary('bad') %>%
    testthat::expect_error()
})
