|
| 1 | +use linkml_runtime::{load_json_file, validate, LinkMLValue}; |
| 2 | +use linkml_schemaview::identifier::{converter_from_schema, Identifier}; |
| 3 | +use linkml_schemaview::io::from_yaml; |
| 4 | +use linkml_schemaview::schemaview::SchemaView; |
| 5 | +use std::path::{Path, PathBuf}; |
| 6 | + |
| 7 | +fn data_path(name: &str) -> PathBuf { |
| 8 | + let mut p = PathBuf::from(env!("CARGO_MANIFEST_DIR")); |
| 9 | + p.push("tests"); |
| 10 | + p.push("data"); |
| 11 | + p.push(name); |
| 12 | + p |
| 13 | +} |
| 14 | + |
| 15 | +#[test] |
| 16 | +fn inlined_mapping_selects_subclass_by_typeuri() { |
| 17 | + // Load simple schema |
| 18 | + let schema = from_yaml(Path::new(&data_path("mapping_schema.yaml"))).unwrap(); |
| 19 | + let mut sv = SchemaView::new(); |
| 20 | + sv.add_schema(schema.clone()).unwrap(); |
| 21 | + let conv = converter_from_schema(&schema); |
| 22 | + |
| 23 | + // Base container class |
| 24 | + let bag = sv |
| 25 | + .get_class(&Identifier::new("Bag"), &conv) |
| 26 | + .unwrap() |
| 27 | + .expect("class not found"); |
| 28 | + |
| 29 | + // Load JSON data |
| 30 | + let v = load_json_file(Path::new(&data_path("mapping_data.json")), &sv, &bag, &conv).unwrap(); |
| 31 | + |
| 32 | + // Instance should validate |
| 33 | + assert!(validate(&v).is_ok()); |
| 34 | + |
| 35 | + // Ensure inlined mapping children select subclasses based on typeURI |
| 36 | + match v { |
| 37 | + LinkMLValue::Object { values, .. } => { |
| 38 | + let things = values.get("things").expect("things slot missing"); |
| 39 | + match things { |
| 40 | + LinkMLValue::Mapping { values, .. } => { |
| 41 | + match values.get("alpha").expect("alpha missing") { |
| 42 | + LinkMLValue::Object { class, .. } => assert_eq!(class.name(), "ThingA"), |
| 43 | + _ => panic!("alpha should be an object"), |
| 44 | + } |
| 45 | + match values.get("beta").expect("beta missing") { |
| 46 | + LinkMLValue::Object { class, .. } => assert_eq!(class.name(), "ThingB"), |
| 47 | + _ => panic!("beta should be an object"), |
| 48 | + } |
| 49 | + } |
| 50 | + _ => panic!("things should be a mapping"), |
| 51 | + } |
| 52 | + } |
| 53 | + _ => panic!("expected top-level object"), |
| 54 | + } |
| 55 | +} |
0 commit comments