Source code for bases.algorithm.parameter_test

# -*- coding: utf-8 -*-
# bases/algorithm/parameter_test.py

from __future__ import absolute_import # PEP328
from builtins import object
from bases.algorithm.parameter import (
        ParameterBase, ParameterNumerical, ParameterFloat, ParameterLog,
        factory,
        ParameterNameError, DefaultValueError, ValueRangeError,
        SuffixError, SteppingError, DecimalsError, DisplayValuesError)
from bases.algorithm import Parameter, NumberGenerator, RandomUniform
from nose.tools import raises

[docs]class Dummy(object):
[docs] def dummyFunc(value): pass
[docs]def testParameterName(): @raises(ParameterNameError) def testName(newName): p = Parameter(name, 0) for name in (None, "", 1.3, 0): yield testName, name
@raises(Exception) def testParameterDefaultValue1(): p = Parameter("testpar") @raises(DefaultValueError) def testParameterDefaultValue2(): p = Parameter("testpar", None)
[docs]def testParameterNumerical(): ptype = Parameter("testpar", 3, valueRange = (1, 5), suffix = "mm", stepping = 1) p = ptype() assert p.value() == 3 assert p.valueRange() == (1, 5) assert p.suffix() == "mm" assert p.stepping() == 1 assert p.displayValues() is None p.setValue(4) assert p.value() == 4 assert ptype.value() == 3 p.setValueRange((2,3)) assert ptype.valueRange() == (1, 5) assert p.valueRange() == (2, 3)
[docs]def testParameterNumericalValueRange(): @raises(ValueRangeError) def testValueRange(newRange): p = Parameter("testpar", 1, valueRange = newRange) for valueRange in (None, (None, 1), (1, None), (None, None), (1, 2, 3), "", ("", ), (1, ""), ("", 1), ("", 1.0), (1.0, "")): yield testValueRange, valueRange
[docs]def testParameterNumericalSuffix(): @raises(SuffixError) def testSuffix(newSuffix): p = Parameter("testpar", 1, valueRange = (1, 5), suffix = newSuffix) for suffix in ("", 1, 1.0): yield testSuffix, suffix
[docs]def testParameterNumericalStepping(): @raises(SteppingError) def testStepping(stepping): p = Parameter("testpar", 1, valueRange = (1, 5), stepping = "bla") for stepping in ("", "bla", None): yield testStepping, stepping
[docs]def testParameterNumericalDisplayValues(): dv = {1: 'one', 2: 'two', 3: 'three'} p = Parameter("testpar", 1, valueRange = (1, 5), displayValues = dv)() for key, value in dv.items(): assert key in p.displayValues() assert p.displayValues(key) == value
[docs]def testParameterFloat(): @raises(DecimalsError) def testDecimals(newDecimals): p = Parameter("testpar", 1.0, valueRange = (1, 5), decimals = newDecimals) for value in ("", "bla", (1, 2), -1): yield testDecimals, value
[docs]def testParameterBaseCopy(): p1 = Parameter(name = "p", value = "a", displayName = "displayname", onValueUpdate = Dummy().dummyFunc)() p2 = p1.copy() assert isinstance(p1, ParameterBase) assert isinstance(p2, ParameterBase) assert p1 == p2 p1.setValue("b") assert p1.value() != p2.value() p1.setDisplayName("q") assert p1.displayName() != p2.displayName()
[docs]def testParameterNumericalCopy(): p1 = Parameter(name = "p", value = 1, displayName = "displayname", valueRange = (1, 5), suffix = "suf", stepping = 1, displayValues = {}, generator = NumberGenerator )() p2 = p1.copy() assert isinstance(p1, ParameterNumerical) assert isinstance(p2, ParameterNumerical) assert p1 == p2 p1.setValueRange((2, 3)) assert p1.valueRange() != p2.valueRange() p1.setSuffix("suv") assert p1.suffix() != p2.suffix() p1.setStepping(2) assert p1.stepping() != p2.stepping() p1.setDisplayValues({1: "suv"}) assert p1.displayValues() != p2.displayValues() p1.setGenerator(RandomUniform) assert p1.generator() != p2.generator()
[docs]def testParameterFloatCopy(): p1 = Parameter(name = "p", value = 1.0, displayName = "displayname", valueRange = (1, 5), suffix = "suf", stepping = 1, displayValues = {}, generator = NumberGenerator, decimals = 2 )() p2 = p1.copy() assert isinstance(p1, ParameterBase) assert isinstance(p2, ParameterBase) assert p1 == p2 p1.setDecimals(4) assert p1.decimals() != p2.decimals()
[docs]def testParameterCompare(): def compareParameters(pType, kwargs): p1 = Parameter(**kwargs)() p2 = Parameter(**kwargs)() assert isinstance(p1, pType) assert p1 == p2 for pType, kwargs in ( (ParameterBase, dict(name = "p", value = "1")), (ParameterBase, dict(name = "p", value = "a", displayName = "displayname")), (ParameterBase, dict(name = "p", value = "12", displayName = "displayname", description = "description")), (ParameterNumerical, dict(name = "p", value = 1, valueRange = (1, 5), onValueUpdate = Dummy().dummyFunc)), (ParameterNumerical, dict(name = "p", value = 1.0, valueRange = (1, 5), suffix = "suf")), (ParameterNumerical, dict(name = "p", value = 1.0, valueRange = (1, 5), suffix = "suf", stepping = 1.0)), (ParameterFloat, dict(name = "p", value = 1.0, valueRange = (1, 5))), (ParameterFloat, dict(name = "p", value = 1.0, valueRange = (1, 5), decimals = 4)), (ParameterLog, dict(name = "p", value = 1.0, valueRange = (2., 4), cls = ParameterLog)), ): yield compareParameters, pType, kwargs
[docs]def testParameterSerialize(): import pickle import utils.pickleinstancemethods pType = factory(name = "radius", value = 3.4, valueRange = (1,5), decimals = 3) p = pType() p.setOnValueUpdate(Dummy().dummyFunc) p.setValue(5.2) data = pickle.dumps(p) p2 = pickle.loads(data) # verify the attributes of the instances are the same assert p == p2 # also verify the attributes of the underlying classes to match assert type(p).attributes() == type(p2).attributes()
# vim: set ts=4 sts=4 sw=4 tw=0: