this change is triggered by the fact, that assigining a unit in the config file did no longer work. this change has several implications: 1) secop.properties must not import secop.datatypes: - as ValueType can not be imported, the default behaviour with 'mandatory' and 'default' arguments was slightly changed - instead of checking for DataType when exporting, a try/except was used 2) the datatype of datatype properties is sometimes not yet defined. a stub is used in this cases instead, which is later replaced by the proper datatype. The number of stubs may be reduced, but this should be done in a later change, as the diff will be much less readable. 3) in config files, datatype properties can be changed like parameter properties. HasProperties.setProperties/checkProperties/getProperties are overridden for this. the config editor seems still to work, an issue (probably py3) had to be fixed there Change-Id: I1efddf51f2c760510e913dbcaa099e8a89c9cab5 Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/21399 Tested-by: JenkinsCodeReview <bjoern_pedersen@frm2.tum.de> Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de> Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
120 lines
4.3 KiB
Python
120 lines
4.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
# *****************************************************************************
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify it under
|
|
# the terms of the GNU General Public License as published by the Free Software
|
|
# Foundation; either version 2 of the License, or (at your option) any later
|
|
# version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful, but WITHOUT
|
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
# details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License along with
|
|
# this program; if not, write to the Free Software Foundation, Inc.,
|
|
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
#
|
|
# Module authors:
|
|
# Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
|
|
#
|
|
# *****************************************************************************
|
|
"""test data types."""
|
|
|
|
import pytest
|
|
|
|
from secop.datatypes import IntRange, StringType, FloatRange, ValueType
|
|
from secop.errors import ProgrammingError, ConfigError
|
|
from secop.properties import Property, Properties, HasProperties
|
|
|
|
# args are: datatype, default, extname, export, mandatory, settable
|
|
V_test_Property = [
|
|
[(StringType(), 'default', 'extname', False, False),
|
|
dict(default='default', extname='extname', export=True, mandatory=False)],
|
|
[(IntRange(), '42', '_extname', False, True),
|
|
dict(default=42, extname='_extname', export=True, mandatory=True)],
|
|
[(IntRange(), '42', '_extname', True, False),
|
|
dict(default=42, extname='_extname', export=True, mandatory=False)],
|
|
[(IntRange(), 42, '_extname', True, True),
|
|
dict(default=42, extname='_extname', export=True, mandatory=True)],
|
|
[(IntRange(), 0, '', True, True),
|
|
dict(default=0, extname='', export=True, mandatory=True)],
|
|
[(IntRange(), 0, '', True, False),
|
|
dict(default=0, extname='', export=True, mandatory=False)],
|
|
[(IntRange(), 0, '', False, True),
|
|
dict(default=0, extname='', export=False, mandatory=True)],
|
|
[(IntRange(), 0, '', False, False),
|
|
dict(default=0, extname='', export=False, mandatory=False)],
|
|
[(IntRange(), None, '', None),
|
|
dict(default=0, extname='', export=False, mandatory=True)], # mandatory not given, no default -> mandatory
|
|
[(ValueType(), 1, '', False),
|
|
dict(default=1, extname='', export=False, mandatory=False)], # mandatory not given, default given -> NOT mandatory
|
|
]
|
|
@pytest.mark.parametrize('args, check', V_test_Property)
|
|
def test_Property(args, check):
|
|
p = Property('', *args)
|
|
result = {k: getattr(p, k) for k in check}
|
|
assert result == check
|
|
|
|
def test_Property_basic():
|
|
with pytest.raises(TypeError):
|
|
# pylint: disable=no-value-for-parameter
|
|
Property()
|
|
with pytest.raises(TypeError):
|
|
# pylint: disable=no-value-for-parameter
|
|
Property('')
|
|
with pytest.raises(ValueError):
|
|
Property('', 1)
|
|
Property('', IntRange(), '42', 'extname', False, False)
|
|
|
|
def test_Properties():
|
|
p = Properties()
|
|
with pytest.raises(ProgrammingError):
|
|
p[1] = 2
|
|
p['a'] = Property('', IntRange(), '42', export=True)
|
|
assert p['a'].default == 42
|
|
assert p['a'].export is True
|
|
assert p['a'].extname == '_a'
|
|
with pytest.raises(ProgrammingError):
|
|
p['a'] = 137
|
|
with pytest.raises(ProgrammingError):
|
|
del p[1]
|
|
with pytest.raises(ProgrammingError):
|
|
del p['a']
|
|
p['a'] = Property('', IntRange(), 0, export=False)
|
|
assert p['a'].default == 0
|
|
assert p['a'].export is False
|
|
assert p['a'].extname == ''
|
|
|
|
|
|
class c(HasProperties):
|
|
properties = {
|
|
'a' : Property('', IntRange(), 1),
|
|
}
|
|
|
|
class cl(c):
|
|
properties = {
|
|
'a' : Property('', IntRange(), 3),
|
|
'b' : Property('', FloatRange(), 3.14),
|
|
'minabc': Property('', IntRange(), 8),
|
|
'maxabc': Property('', IntRange(), 9),
|
|
'minx': Property('', IntRange(), 2),
|
|
'maxy': Property('', IntRange(), 1),
|
|
}
|
|
|
|
def test_HasProperties():
|
|
o = c()
|
|
assert o.properties['a'] == 1
|
|
o = cl()
|
|
assert o.properties['a'] == 3
|
|
assert o.properties['b'] == 3.14
|
|
|
|
def test_Property_checks():
|
|
o = c()
|
|
o.checkProperties()
|
|
o = cl()
|
|
o.checkProperties()
|
|
o.setProperty('maxabc', 1)
|
|
with pytest.raises(ConfigError):
|
|
o.checkProperties()
|