1# Copyright © 2020 Arm Ltd and Contributors. All rights reserved. 2# SPDX-License-Identifier: MIT 3import inspect 4from typing import Tuple 5 6import pytest 7 8import pyarmnn._generated.pyarmnn as generated_armnn 9import pyarmnn._generated.pyarmnn as generated_deserializer 10import pyarmnn._generated.pyarmnn_onnxparser as generated_onnx 11import pyarmnn._generated.pyarmnn_tfliteparser as generated_tflite 12 13swig_independent_classes = ('IBackend', 14 'IDeviceSpec', 15 'IConnectableLayer', 16 'IInputSlot', 17 'IOutputSlot', 18 'IProfiler') 19 20 21def get_classes(swig_independent_classes: Tuple): 22 # We need to ignore some swig generated_armnn classes. This is because some are abstract classes 23 # They cannot be created with the swig generated_armnn wrapper, therefore they don't need a destructor. 24 # Swig also generates its own meta class - this needs to be ignored. 25 ignored_class_names = (*swig_independent_classes, '_SwigNonDynamicMeta') 26 return list(filter(lambda x: x[0] not in ignored_class_names, 27 inspect.getmembers(generated_armnn, inspect.isclass) + 28 inspect.getmembers(generated_deserializer, inspect.isclass) + 29 inspect.getmembers(generated_tflite, inspect.isclass) + 30 inspect.getmembers(generated_onnx, inspect.isclass))) 31 32 33@pytest.mark.parametrize("class_instance", get_classes(swig_independent_classes), ids=lambda x: 'class={}'.format(x[0])) 34class TestPyOwnedClasses: 35 36 def test_destructors_exist_per_class(self, class_instance): 37 assert getattr(class_instance[1], '__swig_destroy__', None) 38 39 def test_owned(self, class_instance): 40 assert getattr(class_instance[1], 'thisown', None) 41 42 43@pytest.mark.parametrize("class_instance", swig_independent_classes) 44class TestPyIndependentClasses: 45 46 def test_destructors_does_not_exist_per_class(self, class_instance): 47 assert not getattr(class_instance[1], '__swig_destroy__', None) 48 49 def test_not_owned(self, class_instance): 50 assert not getattr(class_instance[1], 'thisown', None) 51