cjval 0.8.0

Schema-validation of CityJSON+CityJSONSeq datasets
Documentation
use crate::cjval::CJValidator;
use cjval;
use serde_json::json;

use serde_json::Value;

fn get_data1() -> Value {
    let j_mininal = r#"
        {
            "type": "CityJSON",
            "version": "1.1",
            "CityObjects":
            {
                "LondonTower": { 
                    "type": "Building",
                    "geometry": [
                        {
                          "type": "MultiSurface",
                          "lod": "2",
                          "boundaries": [
                            [[0, 3, 2, 1]], [[4, 5, 6, 8]], [[0, 1, 5, 4]]
                          ]
                        }
                    ]
                }
            },
            "vertices": [
                [0, 0, 0],
                [1000, 0, 0],
                [1000, 1000, 0],
                [1000, 88, 0],
                [1000, 7, 0],
                [1000, 6, 33],
                [1000, 4, 0],
                [1000, 3, 43]
            ],
            "transform":
            {
                "scale": [0.001, 0.001, 0.001],
                "translate": [ 0.0, 0.0, 0.0]
            }
        }
        "#;
    let v: Value = serde_json::from_str(&j_mininal).unwrap();
    v
}

fn get_data2() -> Value {
    let j_mininal = r#"
        {
            "type": "CityJSON",
            "version": "1.1",
            "CityObjects":
            {
                "un": { 
                    "type": "CityFurniture",
                    "geometry": [
                        {
                          "type": "MultiPoint",
                          "lod": "1",
                          "boundaries": [2, 0, 8]
                        }
                    ]
                },
                "deux": { 
                    "type": "CityFurniture",
                    "geometry": [
                        {
                          "type": "MultiLineString",
                          "lod": "1",
                          "boundaries": [ [2, 0, 8], [3, 8] ]
                        }
                    ]
                }                
            },
            "vertices": [
                [0, 0, 0],
                [1000, 0, 0],
                [1000, 1000, 0],
                [1000, 88, 0],
                [1000, 7, 0],
                [1000, 6, 33],
                [1000, 4, 0],
                [1000, 3, 43],
                [100, 20, 45]
            ],
            "transform":
            {
                "scale": [0.001, 0.001, 0.001],
                "translate": [ 0.0, 0.0, 0.0]
            }
        }
        "#;
    let v: Value = serde_json::from_str(&j_mininal).unwrap();
    v
}

#[test]
fn wrong_vertex_index_1() {
    let j = get_data1();
    let v: CJValidator = CJValidator::from_str(&j.to_string());
    let re = v.validate();
    assert!(!re["wrong_vertex_index"].is_valid());
}

#[test]
fn wrong_vertex_index_2() {
    let mut j = get_data2();
    let mut v: CJValidator = CJValidator::from_str(&j.to_string());
    let re = v.validate();
    assert!(re["wrong_vertex_index"].is_valid());

    j["CityObjects"]["un"]["geometry"][0]["boundaries"]
        .as_array_mut()
        .unwrap()
        .push(json!(77));
    v = CJValidator::from_str(&j.to_string());
    let re = v.validate();
    assert!(!re["wrong_vertex_index"].is_valid());
}