test_that("ogr_proc works", {
    dsn <- system.file("extdata/ynp_fires_1984_2022.gpkg", package="gdalraster")

    lyr <- new(GDALVector, dsn, "mtbs_perims")
    lyr$setAttributeFilter("ig_year >= 2000")

    lyr2 <- new(GDALVector, dsn, "mtbs_perims")
    lyr2$setAttributeFilter("incid_name = 'NORTH FORK'")

    dsn_tmp <- tempfile(fileext = ".gpkg")

    opt <- c("INPUT_PREFIX=input_",
             "METHOD_PREFIX=method_",
             "PROMOTE_TO_MULTI=YES")

    # intersection
    test_lyr_name <- "intersect_test"

    expect_no_error(lyr_out <- ogr_proc(mode = "Intersection",
                                        input_lyr = lyr,
                                        method_lyr = lyr2,
                                        out_dsn = dsn_tmp,
                                        out_lyr_name = test_lyr_name,
                                        out_geom_type = "MULTIPOLYGON",
                                        mode_opt = opt))

    expect_true(is(lyr_out, "Rcpp_GDALVector"))
    expect_equal(lyr_out$getGeomType(), "MULTIPOLYGON")
    expect_true(srs_is_same(lyr$getSpatialRef(), lyr_out$getSpatialRef()))
    lyr_out$returnGeomAs <- "WKT"
    d <- lyr_out$fetch(-1)
    expect_equal(nrow(d), 5)
    expect_equal(ncol(d), 20)
    expect_equal(min(d$input_ig_date), as.Date("2010-09-14"))
    expect_equal(max(d$input_ig_date), as.Date("2016-08-26"))
    # burn_bnd_ac is an int64 field
    expect_equal(sum(d$input_burn_bnd_ac), bit64::as.integer64(116770))
    expect_equal(unique(d$method_incid_name), "NORTH FORK")
    expect_equal(unique(d$method_ig_year), 1988)
    expect_equal(sum(sapply(d$geom, g_area)), 223994493)

    lyr_out$close()
    rm(lyr_out)
    rm(d)

    # append
    expect_no_error(lyr_out <- ogr_proc(mode = "Intersection",
                                        input_lyr = lyr,
                                        method_lyr = lyr2,
                                        out_dsn = dsn_tmp,
                                        out_lyr_name = test_lyr_name,
                                        out_geom_type = "MULTIPOLYGON",
                                        mode_opt = opt))

    lyr_out$returnGeomAs <- "WKT"
    d <- lyr_out$fetch(-1)
    expect_equal(nrow(d), 10)
    expect_equal(ncol(d), 20)
    expect_equal(sum(sapply(d$geom, g_area)), 223994493 * 2)

    lyr_out$close()
    rm(lyr_out)
    rm(d)

    # overwrite
    expect_no_error(lyr_out <- ogr_proc(mode = "Intersection",
                                        input_lyr = lyr,
                                        method_lyr = lyr2,
                                        out_dsn = dsn_tmp,
                                        out_lyr_name = test_lyr_name,
                                        out_geom_type = "MULTIPOLYGON",
                                        mode_opt = opt,
                                        overwrite = TRUE))

    lyr_out$returnGeomAs <- "WKT"
    d <- lyr_out$fetch(-1)
    expect_equal(nrow(d), 5)
    expect_equal(ncol(d), 20)
    expect_equal(sum(sapply(d$geom, g_area)), 223994493)

    lyr_out$close()
    rm(lyr_out)
    rm(d)

    # union
    test_lyr_name <- "union_test"
    expect_no_error(lyr_out <- ogr_proc(mode = "Union",
                                        input_lyr = lyr,
                                        method_lyr = lyr2,
                                        out_dsn = dsn_tmp,
                                        out_lyr_name = test_lyr_name,
                                        out_geom_type = "MULTIPOLYGON",
                                        mode_opt = opt))

    expect_equal(lyr_out$getFeatureCount(), 46)
    lyr_out$close()
    rm(lyr_out)

    # symdifference
    test_lyr_name <- "symdiff_test"
    expect_no_error(lyr_out <- ogr_proc(mode = "SymDifference",
                                        input_lyr = lyr,
                                        method_lyr = lyr2,
                                        out_dsn = dsn_tmp,
                                        out_lyr_name = test_lyr_name,
                                        out_geom_type = "MULTIPOLYGON",
                                        mode_opt = opt))

    expect_equal(lyr_out$getFeatureCount(), 41)
    lyr_out$close()
    rm(lyr_out)

    # erase
    test_lyr_name <- "erase_test"
    expect_no_error(lyr_out <- ogr_proc(mode = "Erase",
                                        input_lyr = lyr,
                                        method_lyr = lyr2,
                                        out_dsn = dsn_tmp,
                                        out_lyr_name = test_lyr_name,
                                        out_geom_type = "MULTIPOLYGON",
                                        mode_opt = opt))

    expect_equal(lyr_out$getFeatureCount(), 40)
    lyr_out$close()
    rm(lyr_out)

    # clip
    test_lyr_name <- "clip_test"
    expect_no_error(lyr_out <- ogr_proc(mode = "Clip",
                                        input_lyr = lyr,
                                        method_lyr = lyr2,
                                        out_dsn = dsn_tmp,
                                        out_lyr_name = test_lyr_name,
                                        out_geom_type = "MULTIPOLYGON",
                                        mode_opt = opt))

    expect_equal(lyr_out$getFeatureCount(), 5)
    lyr_out$close()
    rm(lyr_out)

    # identity
    test_lyr_name <- "identity_test"
    expect_no_error(lyr_out <- ogr_proc(mode = "Identity",
                                        input_lyr = lyr,
                                        method_lyr = lyr2,
                                        out_dsn = dsn_tmp,
                                        out_lyr_name = test_lyr_name,
                                        out_geom_type = "MULTIPOLYGON",
                                        mode_opt = opt))

    expect_equal(lyr_out$getFeatureCount(), 45)
    lyr_out$close()
    rm(lyr_out)

    # update
    test_lyr_name <- "update_test"
    expect_no_error(lyr_out <- ogr_proc(mode = "Update",
                                        input_lyr = lyr,
                                        method_lyr = lyr2,
                                        out_dsn = dsn_tmp,
                                        out_lyr_name = test_lyr_name,
                                        out_geom_type = "MULTIPOLYGON",
                                        mode_opt = "PROMOTE_TO_MULTI=YES"))

    expect_equal(lyr_out$getFeatureCount(), 41)
    lyr_out$close()
    rm(lyr_out)

    # shapefile output
    shp_tmp <- tempfile(fileext = ".shp")
    expect_no_error(lyr_out <- ogr_proc(mode = "Intersection",
                                        input_lyr = lyr,
                                        method_lyr = lyr2,
                                        out_dsn = shp_tmp,
                                        out_geom_type = "MULTIPOLYGON",
                                        mode_opt = opt))

    if (gdal_version_num() < gdal_compute_version(3, 14, 0))
        # SHPT_POLYGON shapefiles, reported as layers of type wkbPolygon
        expect_equal(lyr_out$getGeomType(), "POLYGON")
    else
        expect_equal(lyr_out$getGeomType(), "MULTIPOLYGON")

    expect_true(srs_is_same(lyr$getSpatialRef(), lyr_out$getSpatialRef()))
    lyr_out$returnGeomAs <- "WKT"
    d <- lyr_out$fetch(-1)
    expect_equal(nrow(d), 5)
    expect_equal(ncol(d), 20)
    expect_equal(sum(sapply(d$geom, g_area)), 223994493)

    lyr_out$close()
    rm(lyr_out)
    rm(d)

    # overwrite shapefile
    expect_no_error(lyr_out <- ogr_proc(mode = "Intersection",
                                        input_lyr = lyr,
                                        method_lyr = lyr2,
                                        out_dsn = shp_tmp,
                                        out_geom_type = "MULTIPOLYGON",
                                        mode_opt = opt,
                                        overwrite = TRUE))

    lyr_out$returnGeomAs <- "WKT"
    d <- lyr_out$fetch(-1)
    expect_equal(nrow(d), 5)
    expect_equal(ncol(d), 20)
    expect_equal(sum(sapply(d$geom, g_area)), 223994493)

    lyr_out$close()
    rm(lyr_out)
    rm(d)

    lyr$close()
    lyr2$close()
    deleteDataset(dsn_tmp)
    deleteDataset(shp_tmp)
})
