|
2 | 2 | import unittest
|
3 | 3 | import logging
|
4 | 4 | from copy import copy
|
| 5 | +from typing import List |
5 | 6 |
|
6 | 7 | from linkml_runtime.linkml_model.meta import SchemaDefinition, ClassDefinition, SlotDefinitionName, SlotDefinition
|
7 | 8 | from linkml_runtime.loaders.yaml_loader import YAMLLoader
|
@@ -290,6 +291,37 @@ def test_merge_imports(self):
|
290 | 291 | all_c2_noi = copy(view.all_classes(imports=False))
|
291 | 292 | assert len(all_c2_noi) == len(all_c2)
|
292 | 293 |
|
| 294 | + def test_traversal(self): |
| 295 | + schema = SchemaDefinition(id='test', name='traversal-test') |
| 296 | + view = SchemaView(schema) |
| 297 | + view.add_class(ClassDefinition('Root', mixins=['RootMixin'])) |
| 298 | + view.add_class(ClassDefinition('A', is_a='Root', mixins=['Am1', 'Am2', 'AZ'])) |
| 299 | + view.add_class(ClassDefinition('B', is_a='A', mixins=['Bm1', 'Bm2', 'BY'])) |
| 300 | + view.add_class(ClassDefinition('C', is_a='B', mixins=['Cm1', 'Cm2', 'CX'])) |
| 301 | + view.add_class(ClassDefinition('RootMixin', mixin=True)) |
| 302 | + view.add_class(ClassDefinition('Am1', is_a='RootMixin', mixin=True)) |
| 303 | + view.add_class(ClassDefinition('Am2', is_a='RootMixin', mixin=True)) |
| 304 | + view.add_class(ClassDefinition('Bm1', is_a='Am1', mixin=True)) |
| 305 | + view.add_class(ClassDefinition('Bm2', is_a='Am2', mixin=True)) |
| 306 | + view.add_class(ClassDefinition('Cm1', is_a='Bm1', mixin=True)) |
| 307 | + view.add_class(ClassDefinition('Cm2', is_a='Bm2', mixin=True)) |
| 308 | + view.add_class(ClassDefinition('AZ', is_a='RootMixin', mixin=True)) |
| 309 | + view.add_class(ClassDefinition('BY', is_a='RootMixin', mixin=True)) |
| 310 | + view.add_class(ClassDefinition('CX', is_a='RootMixin', mixin=True)) |
| 311 | + def check(ancs: List, expected: List): |
| 312 | + #print(ancs) |
| 313 | + self.assertEqual(ancs, expected) |
| 314 | + check(view.class_ancestors('C', depth_first=True), |
| 315 | + ['C', 'Cm1', 'Cm2', 'CX', 'B', 'Bm1', 'Bm2', 'BY', 'A', 'Am1', 'Am2', 'AZ', 'Root', 'RootMixin']) |
| 316 | + check(view.class_ancestors('C', depth_first=False), |
| 317 | + ['C', 'Cm1', 'Cm2', 'CX', 'B', 'Bm1', 'Bm2', 'RootMixin', 'BY', 'A', 'Am1', 'Am2', 'AZ', 'Root']) |
| 318 | + check(view.class_ancestors('C', mixins=False), |
| 319 | + ['C', 'B', 'A', 'Root']) |
| 320 | + check(view.class_ancestors('C', is_a=False), |
| 321 | + ['C', 'Cm1', 'Cm2', 'CX']) |
| 322 | + |
| 323 | + |
| 324 | + |
293 | 325 | def test_slot_inheritance(self):
|
294 | 326 | schema = SchemaDefinition(id='test', name='test')
|
295 | 327 | view = SchemaView(schema)
|
|
0 commit comments