import os import re import sys from os.path import abspath, dirname currdir = dirname(abspath(__file__)) + os.sep import unittest from pyutilib.component.core import Interface, PluginGlobals, ExtensionPoint, implements, Plugin from pyutilib.component.config.options import Option, OptionError, IOption, declare_option, FileOption, IntOption, FloatOption, DictOption, BoolOption PluginGlobals.add_env("testing.options") class IDummyOption(Interface): """An interface that supports the initialization of the directory for options that specify files. This is needed to correctly initialize relative paths for files.""" class DummyOption1(Option): """A test class that converts option data into float values.""" implements(IDummyOption) def convert(self, value, default): """Conversion routine.""" val = value[-1] if not val: return 0 try: return float(val) except ValueError: raise OptionError('Expected float, got %s' % repr(value)) except TypeError: raise OptionError('Expected string or float type, got %s' % repr(value)) PluginGlobals.pop_env() class TestOption(unittest.TestCase): def setUp(self): PluginGlobals.add_env("testing.options") PluginGlobals.clear_global_data(keys=['globals', 'a.b']) def tearDown(self): PluginGlobals.remove_env( "testing.options", cleanup=True, singleton=False) def test_init1(self): """Test Option construction""" try: Option() self.fail("expected failure") except OptionError: pass try: Option(None) self.fail("expected failure") except OptionError: pass try: Option("name", x=None) self.fail("expected failure") except OptionError: pass def test_init2(self): """Test Option construction""" FOO = Option("foo") self.assertEqual(FOO.name, "foo") self.assertTrue(FOO.default is None) self.assertTrue(FOO.section == "globals") self.assertTrue(FOO.section_re == None) self.assertTrue(FOO.__doc__ == "") def test_init3(self): """Test Option construction""" FOO = Option( name="foo", default=1, section="a", doc="b", section_re="re") self.assertEqual(FOO.name, "foo") self.assertEqual(FOO.default, 1) self.assertTrue(FOO.get_value() == 1) self.assertEqual(FOO.section, "a") self.assertEqual(FOO.section_re, "re") self.assertEqual(FOO.__doc__, "b") def test_set_get1(self): """Test set/get values""" class TMP_set_get1(Plugin): ep = ExtensionPoint(IDummyOption) declare_option("foo", local_name="opt", default=4, cls=DummyOption1) obj = TMP_set_get1() self.assertTrue(obj.opt == 4) self.assertTrue(obj.opt / 2 == 2) obj.opt = 6 self.assertTrue(obj.opt / 2 == 3) # # Verify that the TMP instance has value 6 # for pt in obj.ep: self.assertEqual(pt.get_value(), 6) def test_set_get2(self): """Test validate global nature of set/get""" class TMP_set_get2(Plugin): ep = ExtensionPoint(IOption) declare_option("foo", local_name="o1", default=4) declare_option("foo", local_name="o2", default=4) obj = TMP_set_get2() self.assertEqual(type(obj.o1), int) self.assertTrue(obj.o1 / 2 == 2) obj.o1 = 6 self.assertTrue(obj.o1 / 2 == 3) self.assertTrue(obj.o2 / 2 == 3) def test_set_get3(self): """Test validate nature of set/get for instance-specific options""" class TMP_set_get3(Plugin): ep = ExtensionPoint(IOption) def __init__(self, section): declare_option("o1", section=section, default=4) obj1 = TMP_set_get3("sec1") obj2 = TMP_set_get3("sec1") obj3 = TMP_set_get3("sec2") self.assertEqual(type(obj1.o1), int) self.assertTrue(obj1.o1 / 2 == 2) self.assertTrue(obj2.o1 / 2 == 2) self.assertTrue(obj3.o1 / 2 == 2) obj1.o1 = 6 self.assertTrue(obj1.o1 / 2 == 3) self.assertTrue(obj2.o1 / 2 == 3) self.assertTrue(obj3.o1 / 2 == 2) def test_repr(self): """Test string repn""" ep = ExtensionPoint(IOption) class TMP_repr(Plugin): declare_option("o1", default=4) declare_option("o2", section="foo", default=4) obj = TMP_repr() if re.match("\