multi_poly <- structure(
  '{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{
"type": "MultiPolygon",
"coordinates": [[[[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0],
[102.0, 2.0]]], [[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0],
[100.0, 0.0]]]]
}}]}',
  class = c("geojson", "json")
)

multi_line <- structure(
  '{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{
"type": "MultiLineString",
"coordinates": [[[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0]],
[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0]]]
}}]}',
  class = c("geojson", "json")
)

multi_point <- structure(
  '{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{
  "type": "MultiPoint","coordinates": [ [100.0, 0.0], [101.0, 1.0] ]}}]}',
  class = c("geojson", "json")
)

test_that("ms_explode.geojson works", {
  out <- ms_explode(multi_poly)
  expect_s3_class(out, "geojson")
  expect_equal(nrow(geojson_sf(out)), 2)
  expect_snapshot_value(out, style = "json2")
  skip_if_not(has_sys_mapshaper())
  expect_s3_class(ms_explode(multi_poly, sys = TRUE), "geojson")
})

test_that("ms_explode.geojson errors correctly", {
  expect_error(ms_explode('{foo: "bar"}'), "Input is not valid geojson")
})

test_that("ms_explode.character works", {
  out <- ms_explode(unclass(multi_poly))
  expect_s3_class(out, "geojson")
  expect_equal(nrow(geojson_sf(out)), 2)
  expect_snapshot_value(out, style = "json2")
})

test_that("ms_explode.SpatialPolygonsDataFrame works", {
  spdf <- GeoJSON_to_sp(multi_poly)
  out <- ms_explode(spdf)
  expect_s4_class(out, "SpatialPolygonsDataFrame")
  # Temporarily remove due to bug in GDAL 2.1.0
  expect_equal(length(out@polygons), 2)
  skip_if_not(has_sys_mapshaper())
  expect_s4_class(ms_explode(spdf, sys = TRUE), "SpatialPolygonsDataFrame")
})

test_that("ms_explode works with lines", {
  expect_snapshot_value(ms_explode(multi_line), style = "json2")

  sp_lines <- GeoJSON_to_sp(multi_line)
  out <- ms_explode(sp_lines)
  out_disagg <- sp::disaggregate(sp_lines)
  expect_equivalent(
    lapply(out@lines, function(x) x@Lines[[1]]@coords),
    lapply(out_disagg@lines, function(x) x@Lines[[1]]@coords)
  )
  skip_if_not(has_sys_mapshaper())
  expect_s4_class(ms_explode(sp_lines, sys = TRUE), "SpatialLinesDataFrame")
})

test_that("ms_explode works with points", {
  expect_snapshot_value(ms_explode(multi_point), style = "json2")
})


test_that("ms_explode works with sf", {
  mp_sf <- read_sf(multi_point)
  out_sf <- ms_explode(mp_sf)
  expect_s3_class(out_sf, "sf")
  expect_equal(nrow(out_sf), 2)
  expect_s3_class(st_geometry(out_sf), "sfc_POINT")

  mp_sfc <- st_geometry(mp_sf)
  out_sfc <- ms_explode(mp_sfc)
  expect_s3_class(out_sfc, "sfc_POINT")
  expect_equal(length(out_sfc), 2)

  skip_if_not(has_sys_mapshaper())
  expect_s3_class(ms_explode(mp_sf, sys = TRUE), "sf")
})
