Ejemplo n.º 1
0
    def __parse_object(self, name: str, values: dict) -> DataObject:
        required = {'_xpath', '_xref', '_ref'}
        path_value = required & values.keys()
        if len(path_value) != 1:
            error = f'QueryBuilder - DataObject({name}) is missing an anchor. Possible anchors are \'_xpath\', \'_ref\' or \'_xref\''
            self.logger.error(error)
            raise ValueError(error)

        if '_xpath' in path_value:
            xpath = values['_xpath'].split(self.__path_separator)[-1]
            path = DataQuery.XPath(xpath)
        elif '_xref' in path_value:
            xpath = values['_xref'].split(self.__path_separator)[-1]
            path = DataQuery.XPath(xpath, True)
        else:
            ref = values['_ref'].split(self.__path_separator)[-1]
            path = DataQuery.Reference(ref)

        data_values = []
        for key, value in values.items():
            if key in required:
                continue

            if isinstance(value, dict):
                data_object = self.__parse_object(key, value)
                data_values.append(data_object)
            else:
                data_value = self.__parse_value(key, value)
                data_values.append(data_value)

        return DataObject(name, path, data_values)
def test_returns_empty_list_if_reference_not_found(only_value):
    data_object = DataObject('CAN Cluster', DataQuery.Reference('/Cluster/CAN1'),
                             [DataValue('Name', DataQuery(DataQuery.XPath('./SHORT-NAME')))])

    query_handler = QueryHandler()
    result = query_handler.handle_queries(arxml, [data_object])

    assert result['CAN Cluster'] == []
def test_returns_none_value_if_no_attribute_found_with_specified_name():
    data_object = DataObject('CAN Cluster', DataQuery.Reference('/Cluster/CAN'),
                             [DataValue('UUID', DataQuery(DataQuery.XPath('.'), value='@S'))])

    query_handler = QueryHandler()
    result = query_handler.handle_queries(arxml, [data_object])

    assert isinstance(result['CAN Cluster'], dict)
    assert result['CAN Cluster']['UUID'] is None
def test_returns_none_value_if_no_element_found_with_xpath():
    data_object = DataObject('CAN Cluster', DataQuery.Reference('/Cluster/CAN'),
                             [DataValue('Name', DataQuery(DataQuery.XPath('/SHORT-NAME')))])

    query_handler = QueryHandler()
    result = query_handler.handle_queries(arxml, [data_object])

    assert isinstance(result['CAN Cluster'], dict)
    assert result['CAN Cluster']['Name'] is None
def simple_object_by_ref():
    return DataObject('CAN Cluster', DataQuery.Reference('/Cluster/CAN'), [
        DataValue('Name', DataQuery(DataQuery.XPath('./SHORT-NAME'))),
        DataValue(
            'Baudrate',
            DataQuery(
                DataQuery.XPath('CAN-CLUSTER-VARIANTS/CAN-CLUSTER-CONDITIONAL/BAUDRATE'),
                format=DataQuery.Format.Integer)),
        DataValue('Language', DataQuery(DataQuery.XPath('LONG-NAME/L-4'), value='@L')),
        DataValue('Long Name', DataQuery(DataQuery.XPath('LONG-NAME/L-4')))
    ])
def test_handle_inline_reference():
    data_object = DataObject('SignalMapping', DataQuery.Reference('/PDU/TxMessage'), [
        DataValue(
            'Name',
            DataQuery(
                DataQuery.XPath(
                    '&(I-SIGNAL-TO-PDU-MAPPINGS/I-SIGNAL-TO-I-PDU-MAPPING/I-SIGNAL-REF)SHORT-NAME',
                    True)))
    ])

    query_handler = QueryHandler()
    results = query_handler.handle_queries(arxml, [data_object])

    assert isinstance(results, dict)
    assert isinstance(results['SignalMapping'], dict)
    assert results['SignalMapping']['Name'] == 'Signal1'
Ejemplo n.º 7
0
def test_reference_containing_namespaces_raise_value_error():
    with pytest.raises(ValueError):
        DataQuery(DataQuery.Reference('/ar:Signals'))
Ejemplo n.º 8
0
import pytest

from arxml_data_extractor.query.data_query import DataQuery


@pytest.mark.parametrize("path, value, format", [
    (DataQuery.Reference('/Signals/Signal1'), 'text', DataQuery.Format.String),
    (DataQuery.Reference('/Signals/Signal1'), 'tag', DataQuery.Format.Integer),
    (DataQuery.Reference('/Signals/Signal1'), '@', DataQuery.Format.Float),
    (DataQuery.Reference('/Signals/Signal1'), '@attribute',
     DataQuery.Format.Date),
    (DataQuery.XPath('/SHORT-NAME', False), 'text', DataQuery.Format.String),
    (DataQuery.XPath('/SHORT-NAME', True), 'tag', DataQuery.Format.Integer),
    (DataQuery.XPath('/SHORT-NAME'), '@', DataQuery.Format.Float),
    (DataQuery.XPath('/SHORT-NAME'), '@attribute', DataQuery.Format.Date),
])
def test_create_data_query(path, value, format):
    query = DataQuery(path, value, format)

    assert query.path == path
    assert query.value == value
    assert query.format == format


@pytest.mark.parametrize("path, value", [
    (DataQuery.Reference('/Signals/Signal1'), 'text'),
    (DataQuery.Reference('/Signals/Signal1'), '@attribute'),
    (DataQuery.XPath('/SHORT-NAME', True), 'tag'),
    (DataQuery.XPath('/SHORT-NAME'), '@'),
])
def test_create_data_query_with_default_format(path, value):
Ejemplo n.º 9
0
from arxml_data_extractor.query.data_object import DataObject
from arxml_data_extractor.query.data_value import DataValue


@pytest.fixture
def value():
    query = DataQuery(DataQuery.XPath('/SHORT-NAME'))
    return DataValue('Name', query)


@pytest.mark.parametrize("name, path", [
    ('Signal', DataQuery.XPath('//I-SIGNALS')),
    ('Signal123', DataQuery.XPath('//I-SIGNALS')),
    ('Signal_123', DataQuery.XPath('//I-SIGNALS')),
    ('Signal 123', DataQuery.XPath('//I-SIGNALS')),
    ('Signal 123', DataQuery.Reference('/Signals')),
])
def test_create_data_object(name, path, value):
    data_object = DataObject(name, path, [value])

    assert data_object.name == name
    assert data_object.path == path
    assert data_object.values[0] == value


def test_values_contain_data_objects(value):
    sub_object = DataObject('Timings', DataQuery.XPath('//TIMING'), [value])
    data_object = DataObject('Signals', DataQuery.XPath('//I-SIGNALS'),
                             [sub_object])

    assert data_object.name == 'Signals'
def only_value():
    return DataValue(
        'CAN Cluster',
        DataQuery(DataQuery.Reference('/Cluster/CAN1'), 'text', DataQuery.Format.String))