context("line")

test_that("linedata works", {
  testthat::skip_if_not(require("ncdf4"))
  lineData <- get_fixture_data("linestring")
  nc_file <- write_geometry(nc_file=tempfile(), geom_data = lineData)
  nc<-nc_open(nc_file)

  expect_equal(as.numeric(ncvar_get(nc, pkg.env$x_nodes)), st_coordinates(lineData)[,"X"])
  expect_equal(as.numeric(ncvar_get(nc, pkg.env$y_nodes)), st_coordinates(lineData)[,"Y"])

  expect_equivalent(ncatt_get(nc, pkg.env$geom_container_var_name, pkg.env$geom_type_attr_name)$value,
                    "line")

  returnLineData<-read_geometry(nc_file)
  check_geom(lineData, returnLineData)
})

test_that("multiLine data works", {
  testthat::skip_if_not(require("ncdf4"))
  lineData <- get_fixture_data("multilinestring")
  nc_file <- write_geometry(nc_file=tempfile(), geom_data = lineData)
  nc<-nc_open(nc_file)

  num_coords <- c(nrow(st_geometry(lineData)[[1]][[1]]),
  								nrow(st_geometry(lineData)[[1]][[2]]))
  
  expect_equal(as.numeric(ncvar_get(nc,pkg.env$node_count_var_name)),
               sum(num_coords))

  expect_equal(as.numeric(ncvar_get(nc,pkg.env$part_node_count_var_name)),
               num_coords)

  returnLineData<-read_geometry(nc_file)
  check_geom(lineData, returnLineData)
})

test_that("multiline data frame works", {
  testthat::skip_if_not(require("ncdf4"))
  lineData <- get_fixture_data("multilinestring")
  testdata<-as.data.frame(list("name"=c("test_name"), "id"=c(1)), stringsAsFactors = FALSE)
  lineData <- sf::st_sf(dplyr::bind_cols(lineData, testdata))
  nc_file <- write_geometry(nc_file=tempfile(), geom_data = lineData)

  nc<-nc_open(nc_file)
  
  returnLineData<-read_geometry(nc_file)
  check_geom(lineData, returnLineData)
})

test_that("shapefile line data works", {
  testthat::skip_if_not(require("ncdf4"))
  lineData <- sf::st_zm(sf::read_sf("data/NHDLine/NHDLine.gpkg"))
  nc_file <- write_geometry(nc_file=tempfile(), 
                      geom_data = lineData)
  nc<-nc_open(nc_file)
  returnLineData<-read_geometry(nc_file)
  check_geom(lineData, returnLineData)
  sf::st_geometry(lineData) <- NULL
  sf::st_geometry(returnLineData) <- NULL
  for(name in names(lineData)) {
    if(class(lineData[name][[1]]) == "Date") lineData[[name]] <- as.character(lineData[[name]])
    expect_equal(class(lineData[name][[1]]), class(returnLineData[name][[1]]))
  }
  for(name in names(lineData)) {
    if(is.character(returnLineData[name][[1]])) lineData[name][is.na(lineData[name])] <- ""
    expect_equal(c(lineData[name]), c(returnLineData[name]))
  }
})

test_that("NHDPlus Multilinestring", {
  f <- system.file("extdata/nhdp_flowline_sample.gpkg", package = "ncdfgeom")
  
  test_dat <- sf::read_sf(f)
  
  test_nc <- expect_warning(write_geometry(tempfile(), test_dat), "Found more than two dimensions in geometry. Removing Z and M content.")
  
  test_dat_2 <- read_geometry(test_nc)
  
  expect_equal(class(test_dat_2$FDATE), "character") # coerced to character
  expect_equal(class(sf::st_geometry(test_dat_2)[[1]])[1], "XY") 
  
})

