nc2parquet 0.2.0

High-performance NetCDF to Parquet converter with cloud storage support
Documentation
#[cfg(test)]
mod input_tests {
    use crate::input::{FilterConfig, JobConfig};

    #[test]
    fn test_job_config_from_json() {
        let json = r#"
        {
            "nc_key": "examples/data/simple_xy.nc",
            "variable_name": "data",
            "parquet_key": "test.parquet",
            "filters": [
                {
                    "kind": "range",
                    "params": {
                        "dimension_name": "x",
                        "min_value": 1.0,
                        "max_value": 4.0
                    }
                }
            ]
        }"#;

        let config = JobConfig::from_json(json).unwrap();
        assert_eq!(config.nc_key, "examples/data/simple_xy.nc");
        assert_eq!(config.variable_name, "data");
        assert_eq!(config.parquet_key, "test.parquet");
        assert_eq!(config.filters.len(), 1);
    }

    #[test]
    fn test_filter_config_range() {
        let json = r#"
        {
            "kind": "range",
            "params": {
                "dimension_name": "time",
                "min_value": 0.0,
                "max_value": 1.0
            }
        }"#;

        let filter_config: FilterConfig = serde_json::from_str(json).unwrap();
        assert_eq!(filter_config.kind(), "range");

        filter_config.to_filter().unwrap();
    }

    #[test]
    fn test_filter_config_2d_point() {
        let json = r#"
        {
            "kind": "2d_point",
            "params": {
                "lat_dimension_name": "latitude",
                "lon_dimension_name": "longitude",
                "points": [
                    [30.0, -120.0],
                    [40.0, -100.0]
                ],
                "tolerance": 5.0
            }
        }"#;

        let filter_config: FilterConfig = serde_json::from_str(json).unwrap();
        assert_eq!(filter_config.kind(), "2d_point");

        filter_config.to_filter().unwrap();
    }

    #[test]
    fn test_filter_config_list() {
        let json = r#"
        {
            "kind": "list",
            "params": {
                "dimension_name": "level",
                "values": [0.0, 1.0]
            }
        }"#;

        let filter_config: FilterConfig = serde_json::from_str(json).unwrap();
        assert_eq!(filter_config.kind(), "list");

        filter_config.to_filter().unwrap();
    }

    #[test]
    fn test_filter_config_3d_point() {
        let json = r#"
        {
            "kind": "3d_point",
            "params": {
                "time_dimension_name": "time",
                "lat_dimension_name": "latitude",
                "lon_dimension_name": "longitude",
                "steps": [0.0, 1.0],
                "points": [[35.0, -110.0], [45.0, -85.0]],
                "tolerance": 5.0
            }
        }"#;

        let filter_config: FilterConfig = serde_json::from_str(json).unwrap();
        assert_eq!(filter_config.kind(), "3d_point");

        filter_config.to_filter().unwrap();
    }

    #[test]
    fn test_multiple_filters_config_with_real_data() {
        let json = r#"
        {
            "nc_key": "examples/data/pres_temp_4D.nc",
            "variable_name": "temperature",
            "parquet_key": "filtered_output.parquet",
            "filters": [
                {
                    "kind": "range",
                    "params": {
                        "dimension_name": "time",
                        "min_value": 0.0,
                        "max_value": 1.0
                    }
                },
                {
                    "kind": "2d_point",
                    "params": {
                        "lat_dimension_name": "latitude",
                        "lon_dimension_name": "longitude",
                        "points": [[30.0, -120.0]],
                        "tolerance": 5.0
                    }
                }
            ]
        }"#;

        let config = JobConfig::from_json(json).unwrap();
        assert_eq!(config.filters.len(), 2);
        assert_eq!(config.filters[0].kind(), "range");
        assert_eq!(config.filters[1].kind(), "2d_point");
    }
}

#[cfg(test)]
mod utility_tests {
    use crate::input::{FilterConfig, JobConfig};

    #[test]
    fn test_json_parsing_errors() {
        let invalid_json = "{ invalid json }";
        let result = JobConfig::from_json(invalid_json);
        assert!(result.is_err());

        let incomplete_json = r#"
        {
            "nc_key": "test.nc"
        }"#;
        let result = JobConfig::from_json(incomplete_json);
        assert!(result.is_err());
    }

    #[test]
    fn test_filter_config_invalid_kind() {
        let invalid_filter = r#"
        {
            "kind": "invalid_filter_type",
            "params": {}
        }"#;

        let result: Result<FilterConfig, _> = serde_json::from_str(invalid_filter);
        assert!(result.is_err());
    }

    #[test]
    fn test_empty_filters_array() {
        let json = r#"
        {
            "nc_key": "test.nc",
            "variable_name": "temp",
            "parquet_key": "test.parquet",
            "filters": []
        }"#;

        let config = JobConfig::from_json(json).unwrap();
        assert_eq!(config.filters.len(), 0);
    }
}