diff --git a/CHANGES.md b/CHANGES.md index 1364cb663..9fd3cc1c8 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -23,15 +23,19 @@ - -- Added quality-of-life features to `CslStringList`: `len`, `is_empty`, `Debug` and `Iterator` implementations. +- Added quality-of-life features to `CslStringList`: `len`, `is_empty`, `Debug` and `Iterator` implementations. - -- Added ability to set color table for bands with palette color interpretation. +- Added ability to set color table for bands with palette color interpretation. Added ability to create a color ramp (interpolated) color table. - +- Added a wrapper for the `DriverManager` + + - + ## 0.13 - Add prebuild bindings for GDAL 3.5 @@ -110,7 +114,7 @@ - Added `Geometry::to_geo` method for GDAL to geo-types Geometry conversions. - - + - - Add `Rasterband::set_scale` and `Rasterband::set_offset` methods diff --git a/examples/metadata.rs b/examples/metadata.rs index 80b799620..8b7344b4f 100644 --- a/examples/metadata.rs +++ b/examples/metadata.rs @@ -2,7 +2,7 @@ fn main() { use gdal::{Dataset, Metadata}; use std::path::Path; - let driver = gdal::Driver::get_by_name("mem").unwrap(); + let driver = gdal::DriverManager::get_driver_by_name("mem").unwrap(); println!("driver description: {:?}", driver.description()); let path = Path::new("./fixtures/tinymarble.png"); diff --git a/examples/read_write_ogr.rs b/examples/read_write_ogr.rs index 39bfa5103..b9684aa37 100644 --- a/examples/read_write_ogr.rs +++ b/examples/read_write_ogr.rs @@ -1,7 +1,7 @@ use gdal::errors::Result; use gdal::spatial_ref::{CoordTransform, SpatialRef}; -use gdal::vector::*; -use gdal::{Dataset, Driver}; +use gdal::Dataset; +use gdal::{vector::*, DriverManager}; use std::fs; use std::path::Path; @@ -17,7 +17,7 @@ fn run() -> Result<()> { // Create a new dataset: let path = std::env::temp_dir().join("abcde.shp"); let _ = fs::remove_file(&path); - let drv = Driver::get_by_name("ESRI Shapefile")?; + let drv = DriverManager::get_driver_by_name("ESRI Shapefile")?; let mut ds = drv.create_vector_only(path.to_str().unwrap())?; let lyr = ds.create_layer(Default::default())?; diff --git a/examples/read_write_ogr_datetime.rs b/examples/read_write_ogr_datetime.rs index 6470d1c77..61561e7d1 100644 --- a/examples/read_write_ogr_datetime.rs +++ b/examples/read_write_ogr_datetime.rs @@ -1,9 +1,9 @@ -use gdal::vector::LayerAccess; +use gdal::{vector::LayerAccess, DriverManager}; fn run() -> gdal::errors::Result<()> { use chrono::Duration; use gdal::vector::{Defn, Feature, FieldDefn, FieldValue}; - use gdal::{Dataset, Driver}; + use gdal::Dataset; use std::ops::Add; use std::path::Path; @@ -15,7 +15,7 @@ fn run() -> gdal::errors::Result<()> { // Create a new dataset: let path = std::env::temp_dir().join("later.geojson"); let _ = std::fs::remove_file(&path); - let drv = Driver::get_by_name("GeoJSON")?; + let drv = DriverManager::get_driver_by_name("GeoJSON")?; let mut ds = drv.create_vector_only(path.to_str().unwrap())?; let lyr = ds.create_layer(Default::default())?; diff --git a/examples/write_ogr.rs b/examples/write_ogr.rs index b71cdc834..98ef0e550 100644 --- a/examples/write_ogr.rs +++ b/examples/write_ogr.rs @@ -1,13 +1,13 @@ use gdal::errors::Result; use gdal::vector::{Defn, Feature, FieldDefn, FieldValue, Geometry, LayerAccess, OGRFieldType}; -use gdal::Driver; +use gdal::DriverManager; use std::fs; /// Example 1, the detailed way: fn example_1() -> Result<()> { let path = std::env::temp_dir().join("output1.geojson"); let _ = fs::remove_file(&path); - let drv = Driver::get_by_name("GeoJSON")?; + let drv = DriverManager::get_driver_by_name("GeoJSON")?; let mut ds = drv.create_vector_only(path.to_str().unwrap())?; let lyr = ds.create_layer(Default::default())?; @@ -52,7 +52,7 @@ fn example_1() -> Result<()> { fn example_2() -> Result<()> { let path = std::env::temp_dir().join("output2.geojson"); let _ = fs::remove_file(&path); - let driver = Driver::get_by_name("GeoJSON")?; + let driver = DriverManager::get_driver_by_name("GeoJSON")?; let mut ds = driver.create_vector_only(path.to_str().unwrap())?; let mut layer = ds.create_layer(Default::default())?; diff --git a/src/driver.rs b/src/driver.rs index 6a18d4cf0..b8087b845 100644 --- a/src/driver.rs +++ b/src/driver.rs @@ -17,11 +17,7 @@ use crate::errors::*; static START: Once = Once::new(); pub fn _register_drivers() { - unsafe { - START.call_once(|| { - gdal_sys::GDALAllRegister(); - }); - } + START.call_once(DriverManager::register_all); } /// # Raster and Vector Driver API @@ -63,14 +59,9 @@ impl Driver { /// ```text /// Cloud optimized GeoTIFF generator /// ``` + #[deprecated(note = "Please use `DriverManager::get_driver_by_name()` instead")] pub fn get_by_name(name: &str) -> Result { - _register_drivers(); - let c_name = CString::new(name)?; - let c_driver = unsafe { gdal_sys::GDALGetDriverByName(c_name.as_ptr()) }; - if c_driver.is_null() { - return Err(_last_null_pointer_err("GDALGetDriverByName")); - }; - Ok(Driver { c_driver }) + DriverManager::get_driver_by_name(name) } /// Returns the driver with the given index, which must be less than the value returned by @@ -92,13 +83,9 @@ impl Driver { /// ```text /// 'VRT' is 'Virtual Raster' /// ``` + #[deprecated(note = "Please use `DriverManager::get_driver()` instead")] pub fn get(index: usize) -> Result { - _register_drivers(); - let c_driver = unsafe { gdal_sys::GDALGetDriver(index.try_into().unwrap()) }; - if c_driver.is_null() { - return Err(_last_null_pointer_err("GDALGetDriver")); - } - Ok(Driver { c_driver }) + DriverManager::get_driver(index) } /// Returns the number of registered drivers. @@ -112,10 +99,9 @@ impl Driver { /// ```text /// 203 drivers are registered /// ``` + #[deprecated(note = "Please use `DriverManager::count()` instead")] pub fn count() -> usize { - _register_drivers(); - let count = unsafe { gdal_sys::GDALGetDriverCount() }; - count.try_into().unwrap() + DriverManager::count() } /// Return the short name of a driver. @@ -149,9 +135,9 @@ impl Driver { /// /// ```rust, no_run /// # fn main() -> gdal::errors::Result<()> { - /// use gdal::Driver; + /// use gdal::DriverManager; /// use gdal::raster::GdalType; - /// let d = Driver::get_by_name("MEM")?; + /// let d = DriverManager::get_driver_by_name("MEM")?; /// let ds = d.create("in-memory", 64, 64, 3)?; /// assert_eq!(ds.raster_count(), 3); /// assert_eq!(ds.raster_size(), (64, 64)); @@ -178,9 +164,9 @@ impl Driver { /// /// ```rust, no_run /// # fn main() -> gdal::errors::Result<()> { - /// use gdal::Driver; + /// use gdal::DriverManager; /// use gdal::raster::GdalType; - /// let d = Driver::get_by_name("MEM")?; + /// let d = DriverManager::get_driver_by_name("MEM")?; /// let ds = d.create_with_band_type::("in-memory", 64, 64, 3)?; /// assert_eq!(ds.raster_count(), 3); /// assert_eq!(ds.raster_size(), (64, 64)); @@ -210,11 +196,11 @@ impl Driver { /// /// ```rust, no_run /// # fn main() -> gdal::errors::Result<()> { - /// use gdal::Driver; + /// use gdal::DriverManager; /// use gdal::raster::RasterCreationOption; /// use gdal::raster::GdalType; /// use gdal::spatial_ref::SpatialRef; - /// let d = Driver::get_by_name("BMP")?; + /// let d = DriverManager::get_driver_by_name("BMP")?; /// let options = [ /// RasterCreationOption { /// key: "WORLDFILE", @@ -366,3 +352,148 @@ impl MajorObject for Driver { } impl Metadata for Driver {} + +/// A wrapper around `GDALDriverManager`. +/// This struct helps listing and registering [`Driver`]s. +pub struct DriverManager; + +impl DriverManager { + /// Returns the number of registered drivers. + /// + /// # Example + /// + /// ```rust, no_run + /// use gdal::DriverManager; + /// println!("{} drivers are registered", DriverManager::count()); + /// ``` + /// ```text + /// 203 drivers are registered + /// ``` + pub fn count() -> usize { + _register_drivers(); + let count = unsafe { gdal_sys::GDALGetDriverCount() }; + count + .try_into() + .expect("The returned count should be zero or positive") + } + + /// Returns the driver with the given index, which must be less than the value returned by + /// `DriverManager::count()`. + /// + /// See also: [`count`](Self::count) + /// + /// # Example + /// + /// ```rust, no_run + /// use gdal::DriverManager; + /// # fn main() -> gdal::errors::Result<()> { + /// assert!(DriverManager::count() > 0); + /// let d = DriverManager::get_driver(0)?; + /// println!("'{}' is '{}'", d.short_name(), d.long_name()); + /// # Ok(()) + /// # } + /// ``` + /// ```text + /// 'VRT' is 'Virtual Raster' + /// ``` + pub fn get_driver(index: usize) -> Result { + _register_drivers(); + let c_driver = unsafe { gdal_sys::GDALGetDriver(index.try_into().unwrap()) }; + if c_driver.is_null() { + // `GDALGetDriver` just returns `null` and sets no error message + return Err(GdalError::NullPointer { + method_name: "GDALGetDriver", + msg: "Unable to find driver".to_string(), + }); + } + Ok(Driver { c_driver }) + } + + /// Returns the driver with the given short name or [`Err`] if not found. + /// + /// See also: [`count`](Self::count), [`get`](Self::get) + /// + /// # Example + /// + /// ```rust, no_run + /// use gdal::DriverManager; + /// # fn main() -> gdal::errors::Result<()> { + /// let cog_driver = DriverManager::get_driver_by_name("COG")?; + /// println!("{}", cog_driver.long_name()); + /// # Ok(()) + /// # } + /// ``` + /// ```text + /// Cloud optimized GeoTIFF generator + /// ``` + pub fn get_driver_by_name(name: &str) -> Result { + _register_drivers(); + let c_name = CString::new(name)?; + let c_driver = unsafe { gdal_sys::GDALGetDriverByName(c_name.as_ptr()) }; + if c_driver.is_null() { + // `GDALGetDriverByName` just returns `null` and sets no error message + return Err(GdalError::NullPointer { + method_name: "GDALGetDriverByName", + msg: "Unable to find driver".to_string(), + }); + }; + Ok(Driver { c_driver }) + } + + /// Register a driver for use. + /// + /// Wraps [`GDALRegisterDriver()`](https://gdal.org/api/raster_c_api.html#_CPPv418GDALRegisterDriver11GDALDriverH) + pub fn register_driver(driver: &Driver) -> usize { + let index = unsafe { gdal_sys::GDALRegisterDriver(driver.c_driver) }; + index + .try_into() + .expect("The returned index should be zero or positive") + } + + /// Deregister the passed driver. + /// + /// Wraps [`GDALDeregisterDriver()`](https://gdal.org/api/raster_c_api.html#_CPPv420GDALDeregisterDriver11GDALDriverH) + pub fn deregister_driver(driver: &Driver) { + unsafe { + gdal_sys::GDALDeregisterDriver(driver.c_driver); + } + } + + /// Register all known GDAL drivers. + /// + /// Wraps [`GDALAllRegister()`](https://gdal.org/api/raster_c_api.html#gdal_8h_1a9d40bc998bd6ed07ccde96028e85ae26) + pub fn register_all() { + unsafe { + gdal_sys::GDALAllRegister(); + } + } + + /// Prevents the automatic registration of all known GDAL drivers when first calling create, open, etc. + pub fn prevent_auto_registration() { + START.call_once(|| {}); + } + + /// Destroys the driver manager, i.e., unloads all drivers. + /// + /// Wraps [`GDALDestroyDriverManager()`](https://gdal.org/api/raster_c_api.html#_CPPv417GDALDestroyDriver11GDALDriverH) + pub fn destroy() { + unsafe { + gdal_sys::GDALDestroyDriverManager(); + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_driver_access() { + let driver = DriverManager::get_driver_by_name("GTiff").unwrap(); + assert_eq!(driver.short_name(), "GTiff"); + assert_eq!(driver.long_name(), "GeoTIFF"); + + assert!(DriverManager::count() > 0); + assert!(DriverManager::get_driver(0).is_ok()); + } +} diff --git a/src/lib.rs b/src/lib.rs index 46b8af8a1..a16357937 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -121,7 +121,7 @@ pub use dataset::{ Dataset, DatasetOptions, GdalOpenFlags, GeoTransform, GeoTransformEx, LayerIterator, LayerOptions, Transaction, }; -pub use driver::Driver; +pub use driver::{Driver, DriverManager}; pub use metadata::Metadata; #[cfg(test)] diff --git a/src/programs/raster/mdimtranslate.rs b/src/programs/raster/mdimtranslate.rs index 21a308b31..ffdf3f10f 100644 --- a/src/programs/raster/mdimtranslate.rs +++ b/src/programs/raster/mdimtranslate.rs @@ -230,7 +230,7 @@ mod tests { use super::*; - use crate::{DatasetOptions, Driver, GdalOpenFlags}; + use crate::{DatasetOptions, DriverManager, GdalOpenFlags}; #[test] #[cfg_attr(not(all(major_ge_3, minor_ge_4)), ignore)] @@ -277,7 +277,7 @@ mod tests { }; let dataset = Dataset::open_ex(&fixture, dataset_options).unwrap(); - let driver = Driver::get_by_name("MEM").unwrap(); + let driver = DriverManager::get_driver_by_name("MEM").unwrap(); let output_dataset = driver.create("", 5, 7, 1).unwrap(); let error = multi_dim_translate( diff --git a/src/raster/tests.rs b/src/raster/tests.rs index 789c4a0d7..c3ae30715 100644 --- a/src/raster/tests.rs +++ b/src/raster/tests.rs @@ -7,7 +7,7 @@ use crate::raster::{ }; use crate::test_utils::TempFixture; use crate::vsi::unlink_mem_file; -use crate::Driver; +use crate::DriverManager; use gdal_sys::GDALDataType; use std::path::Path; @@ -125,7 +125,7 @@ fn test_read_raster_with_average_resample() { #[test] fn test_write_raster() { - let driver = Driver::get_by_name("MEM").unwrap(); + let driver = DriverManager::get_driver_by_name("MEM").unwrap(); let dataset = driver.create("", 20, 10, 1).unwrap(); // create a 2x1 raster @@ -157,7 +157,7 @@ fn test_rename_remove_raster() { let mem_file_path_a = Path::new("/vsimem/030bd1d1-8955-4604-8e37-177dade13863"); let mem_file_path_b = Path::new("/vsimem/c7bfce32-2474-48fa-a907-2af95f83c824"); - let driver = Driver::get_by_name("GTiff").unwrap(); + let driver = DriverManager::get_driver_by_name("GTiff").unwrap(); dataset.create_copy(&driver, &mem_file_path_a, &[]).unwrap(); @@ -183,7 +183,7 @@ fn test_get_dataset_driver() { #[test] fn test_get_description() { - let driver = Driver::get_by_name("mem").unwrap(); + let driver = DriverManager::get_driver_by_name("mem").unwrap(); assert_eq!(driver.description().unwrap(), "MEM".to_string()); } @@ -234,7 +234,7 @@ fn test_get_metadata_item() { #[test] fn test_set_metadata_item() { - let driver = Driver::get_by_name("MEM").unwrap(); + let driver = DriverManager::get_driver_by_name("MEM").unwrap(); let mut dataset = driver.create("", 1, 1, 1).unwrap(); let key = "Test_Key"; @@ -249,7 +249,7 @@ fn test_set_metadata_item() { #[test] fn test_set_description() { - let driver = Driver::get_by_name("MEM").unwrap(); + let driver = DriverManager::get_driver_by_name("MEM").unwrap(); let dataset = driver.create("", 1, 1, 1).unwrap(); let mut band = dataset.rasterband(1).unwrap(); @@ -262,7 +262,7 @@ fn test_set_description() { #[test] fn test_create() { - let driver = Driver::get_by_name("MEM").unwrap(); + let driver = DriverManager::get_driver_by_name("MEM").unwrap(); let dataset = driver.create("", 10, 20, 3).unwrap(); assert_eq!(dataset.raster_size(), (10, 20)); assert_eq!(dataset.raster_count(), 3); @@ -271,7 +271,7 @@ fn test_create() { #[test] fn test_create_with_band_type() { - let driver = Driver::get_by_name("MEM").unwrap(); + let driver = DriverManager::get_driver_by_name("MEM").unwrap(); let dataset = driver .create_with_band_type::("", 10, 20, 3) .unwrap(); @@ -284,7 +284,7 @@ fn test_create_with_band_type() { #[test] fn test_create_with_band_type_with_options() { - let driver = Driver::get_by_name("GTiff").unwrap(); + let driver = DriverManager::get_driver_by_name("GTiff").unwrap(); let options = [ RasterCreationOption { key: "TILED", @@ -331,7 +331,7 @@ fn test_create_with_band_type_with_options() { #[test] fn test_create_copy() { - let driver = Driver::get_by_name("MEM").unwrap(); + let driver = DriverManager::get_driver_by_name("MEM").unwrap(); let dataset = Dataset::open(fixture!("tinymarble.png")).unwrap(); let copy = dataset.create_copy(&driver, "", &[]).unwrap(); assert_eq!(copy.raster_size(), (100, 50)); @@ -351,7 +351,7 @@ fn test_create_copy_with_options() { let copy = dataset .create_copy( - &Driver::get_by_name("GTiff").unwrap(), + &DriverManager::get_driver_by_name("GTiff").unwrap(), mem_file_path, &[ RasterCreationOption { @@ -380,7 +380,7 @@ fn test_create_copy_with_options() { #[test] #[allow(clippy::float_cmp)] fn test_geo_transform() { - let driver = Driver::get_by_name("MEM").unwrap(); + let driver = DriverManager::get_driver_by_name("MEM").unwrap(); let mut dataset = driver.create("", 20, 10, 1).unwrap(); let transform = [0., 1., 0., 0., 0., 1.]; assert!(dataset.set_geo_transform(&transform).is_ok()); @@ -389,10 +389,10 @@ fn test_geo_transform() { #[test] fn test_get_driver_by_name() { - let missing_driver = Driver::get_by_name("wtf"); + let missing_driver = DriverManager::get_driver_by_name("wtf"); assert!(missing_driver.is_err()); - let ok_driver = Driver::get_by_name("GTiff"); + let ok_driver = DriverManager::get_driver_by_name("GTiff"); assert!(ok_driver.is_ok()); let driver = ok_driver.unwrap(); assert_eq!(driver.short_name(), "GTiff"); @@ -432,7 +432,7 @@ fn open_mask_band() { #[test] fn create_mask_band() { - let driver = Driver::get_by_name("MEM").unwrap(); + let driver = DriverManager::get_driver_by_name("MEM").unwrap(); let dataset = driver.create("", 20, 10, 1).unwrap(); let mut rb = dataset.rasterband(1).unwrap(); rb.create_mask_band(false).unwrap(); @@ -522,7 +522,7 @@ fn test_read_block_data() { #[test] fn test_get_band_type() { - let driver = Driver::get_by_name("MEM").unwrap(); + let driver = DriverManager::get_driver_by_name("MEM").unwrap(); let dataset = driver.create("", 20, 10, 1).unwrap(); let rb = dataset.rasterband(1).unwrap(); assert_eq!(rb.band_type(), GDALDataType::GDT_Byte); @@ -530,7 +530,7 @@ fn test_get_band_type() { #[test] fn test_get_rasterband() { - let driver = Driver::get_by_name("MEM").unwrap(); + let driver = DriverManager::get_driver_by_name("MEM").unwrap(); let dataset = driver.create("", 20, 10, 1).unwrap(); let rasterband = dataset.rasterband(1); assert!(rasterband.is_ok()); @@ -554,7 +554,7 @@ fn test_get_no_data_value() { #[test] #[allow(clippy::float_cmp)] fn test_set_no_data_value() { - let driver = Driver::get_by_name("MEM").unwrap(); + let driver = DriverManager::get_driver_by_name("MEM").unwrap(); let dataset = driver.create("", 20, 10, 1).unwrap(); let mut rasterband = dataset.rasterband(1).unwrap(); assert_eq!(rasterband.no_data_value(), None); @@ -689,7 +689,7 @@ fn test_get_rasterband_color_interp() { #[test] fn test_set_rasterband_color_interp() { - let driver = Driver::get_by_name("MEM").unwrap(); + let driver = DriverManager::get_driver_by_name("MEM").unwrap(); let dataset = driver.create("", 1, 1, 1).unwrap(); let mut rasterband = dataset.rasterband(1).unwrap(); rasterband @@ -701,7 +701,7 @@ fn test_set_rasterband_color_interp() { #[test] fn test_set_rasterband_scale() { - let driver = Driver::get_by_name("MEM").unwrap(); + let driver = DriverManager::get_driver_by_name("MEM").unwrap(); let dataset = driver.create("", 1, 1, 1).unwrap(); let mut rasterband = dataset.rasterband(1).unwrap(); let scale = 1234.5678; @@ -711,7 +711,7 @@ fn test_set_rasterband_scale() { #[test] fn test_set_rasterband_offset() { - let driver = Driver::get_by_name("MEM").unwrap(); + let driver = DriverManager::get_driver_by_name("MEM").unwrap(); let dataset = driver.create("", 1, 1, 1).unwrap(); let mut rasterband = dataset.rasterband(1).unwrap(); let offset = -123.456; @@ -739,7 +739,7 @@ fn test_rasterize() { let rows = 5; let cols = 5; - let driver = Driver::get_by_name("MEM").unwrap(); + let driver = DriverManager::get_driver_by_name("MEM").unwrap(); let mut dataset = driver.create("", rows, cols, 1).unwrap(); let bands = [1]; diff --git a/src/vector/vector_tests/mod.rs b/src/vector/vector_tests/mod.rs index 6aa901871..0f7f65522 100644 --- a/src/vector/vector_tests/mod.rs +++ b/src/vector/vector_tests/mod.rs @@ -3,7 +3,7 @@ use super::{ OGRwkbGeometryType, OwnedLayer, }; use crate::spatial_ref::SpatialRef; -use crate::{assert_almost_eq, Dataset, DatasetOptions, Driver, GdalOpenFlags}; +use crate::{assert_almost_eq, Dataset, DatasetOptions, GdalOpenFlags}; mod convert_geo; mod sql; @@ -120,7 +120,10 @@ where #[cfg(test)] mod tests { use super::*; - use crate::errors::{GdalError, Result}; + use crate::{ + errors::{GdalError, Result}, + DriverManager, + }; use gdal_sys::OGRwkbGeometryType::{wkbLineString, wkbLinearRing, wkbPolygon}; #[test] @@ -755,7 +758,7 @@ mod tests { use std::fs; { - let driver = Driver::get_by_name("GeoJSON").unwrap(); + let driver = DriverManager::get_driver_by_name("GeoJSON").unwrap(); let mut ds = driver .create_vector_only(&fixture!("output.geojson")) .unwrap(); diff --git a/tests/driver-no-auto-register.rs b/tests/driver-no-auto-register.rs new file mode 100644 index 000000000..ab8e67ef7 --- /dev/null +++ b/tests/driver-no-auto-register.rs @@ -0,0 +1,73 @@ +mod utils; + +use gdal::{Dataset, DriverManager}; + +#[test] +/// Sequentially run tests +fn test_driver_no_auto_register() { + test_driver_manager_destruction(); + test_deregister_all_but_one(); + test_manually_registering_drivers(); +} + +fn test_manually_registering_drivers() { + DriverManager::prevent_auto_registration(); + DriverManager::destroy(); + + assert_eq!(DriverManager::count(), 0); + + assert!(Dataset::open(fixture!("tinymarble.tif")).is_err()); + + DriverManager::register_all(); + + assert!(Dataset::open(fixture!("tinymarble.tif")).is_ok()); + + let driver = DriverManager::get_driver_by_name("GTiff").unwrap(); + + DriverManager::deregister_driver(&driver); + + assert!(Dataset::open(fixture!("tinymarble.tif")).is_err()); + + DriverManager::register_driver(&driver); + + assert!(Dataset::open(fixture!("tinymarble.tif")).is_ok()); +} + +fn test_deregister_all_but_one() { + DriverManager::prevent_auto_registration(); + DriverManager::register_all(); + + assert!(DriverManager::count() > 0); + + let mut driver_index = 0; + for _ in 0..DriverManager::count() { + let driver = DriverManager::get_driver(driver_index).unwrap(); + + if driver.short_name() == "GTiff" { + driver_index += 1; + continue; + } + + DriverManager::deregister_driver(&driver); + } + + assert_eq!(DriverManager::count(), 1); +} + +fn test_driver_manager_destruction() { + DriverManager::prevent_auto_registration(); + + assert_eq!(DriverManager::count(), 0); + + DriverManager::register_all(); + + assert!(DriverManager::count() > 0); + + DriverManager::destroy(); + + assert_eq!(DriverManager::count(), 0); + + DriverManager::register_all(); + + assert!(DriverManager::count() > 0); +} diff --git a/tests/utils.rs b/tests/utils.rs new file mode 100644 index 000000000..29e6368a5 --- /dev/null +++ b/tests/utils.rs @@ -0,0 +1,14 @@ +#[macro_export] +macro_rules! fixture { + ($name:expr) => { + std::path::Path::new(file!()) + .parent() + .unwrap() + .parent() + .unwrap() + .join("fixtures") + .as_path() + .join($name) + .as_path() + }; +}