# coding: utf-8 from .autopath import do_autopath do_autopath() import weakref import pytest from tiramisu import BoolOption, IntOption, StrOption, IPOption, NetmaskOption, \ SymLinkOption, OptionDescription, DynOptionDescription, submulti, \ Config, GroupConfig, MetaConfig, Params, ParamOption, Calculation from tiramisu.storage import list_sessions def teardown_function(function): assert list_sessions() == [], 'session list is not empty when leaving "{}"'.format(function.__name__) IS_DEREFABLE = True def funcname(*args, **kwargs): return value @pytest.mark.asyncio async def test_deref_storage(): b = BoolOption('b', '') o = OptionDescription('od', '', [b]) c = await Config(o) w = weakref.ref(c._config_bag.context.cfgimpl_get_values()._p_) del(c) assert w() is None @pytest.mark.asyncio async def test_deref_value(): b = BoolOption('b', '') o = OptionDescription('od', '', [b]) c = await Config(o) w = weakref.ref(c._config_bag.context.cfgimpl_get_values()) del(c) assert w() is None @pytest.mark.asyncio async def test_deref_setting(): b = BoolOption('b', '') o = OptionDescription('od', '', [b]) c = await Config(o) w = weakref.ref(c._config_bag.context.cfgimpl_get_settings()) del(c) assert w() is None @pytest.mark.asyncio async def test_deref_config(): b = BoolOption('b', '') o = OptionDescription('od', '', [b]) c = await Config(o) w = weakref.ref(c) del(c) assert w() is None @pytest.mark.asyncio async def test_deref_option(): global IS_DEREFABLE b = BoolOption('b', '') o = OptionDescription('od', '', [b]) w = weakref.ref(b) del(b) try: assert w() is not None except AssertionError: IS_DEREFABLE = False return del(o) assert w() is None @pytest.mark.asyncio async def test_deref_optiondescription(): if not IS_DEREFABLE: return b = BoolOption('b', '') o = OptionDescription('od', '', [b]) w = weakref.ref(o) del(b) assert w() is not None del(o) assert w() is None @pytest.mark.asyncio async def test_deref_option_cache(): if not IS_DEREFABLE: return b = BoolOption('b', '') o = OptionDescription('od', '', [b]) await o._build_cache() w = weakref.ref(b) del(b) assert w() is not None del(o) assert w() is None @pytest.mark.asyncio async def test_deref_optiondescription_cache(): if not IS_DEREFABLE: return b = BoolOption('b', '') o = OptionDescription('od', '', [b]) await o._build_cache() w = weakref.ref(o) del(b) assert w() is not None del(o) assert w() is None @pytest.mark.asyncio async def test_deref_option_config(): if not IS_DEREFABLE: return b = BoolOption('b', '') o = OptionDescription('od', '', [b]) c = await Config(o) w = weakref.ref(b) del(b) assert w() is not None del(o) assert w() is not None del(c) assert w() is None @pytest.mark.asyncio async def test_deref_optiondescription_config(): if not IS_DEREFABLE: return b = BoolOption('b', '') o = OptionDescription('od', '', [b]) c = await Config(o) w = weakref.ref(o) del(b) assert w() is not None del(o) assert w() is not None del(c) assert w() is None @pytest.mark.asyncio async def test_deref_validator(): if not IS_DEREFABLE: return a = StrOption('a', '', default='yes') b = StrOption('b', '', validators=[Calculation(funcname, Params(ParamOption(a)))], default='val') od = OptionDescription('root', '', [a, b]) cfg = await Config(od) w = weakref.ref(a) x = weakref.ref(b) y = weakref.ref(od) z = weakref.ref(cfg) assert w() is not None assert x() is not None assert w() is not None assert x() is not None del(a) del(b) assert w() is not None assert x() is not None assert w() is not None assert x() is not None del(od) assert w() is not None assert x() is not None assert w() is not None assert x() is not None del(cfg) assert y() is None assert z() is None @pytest.mark.asyncio async def test_deref_callback(): if not IS_DEREFABLE: return a = StrOption('a', "", 'val') b = StrOption('b', "", Calculation(funcname, Params((ParamOption(a),)))) od = OptionDescription('root', '', [a, b]) cfg = await Config(od) w = weakref.ref(a) x = weakref.ref(b) y = weakref.ref(od) z = weakref.ref(cfg) assert w() is not None assert x() is not None assert w() is not None assert x() is not None del(a) del(b) assert w() is not None assert x() is not None assert w() is not None assert x() is not None del(od) assert w() is not None assert x() is not None assert w() is not None assert x() is not None del(cfg) assert y() is None assert z() is None @pytest.mark.asyncio async def test_deref_symlink(): if not IS_DEREFABLE: return a = BoolOption("a", "", default=False) b = SymLinkOption("b", a) od = OptionDescription('root', '', [a, b]) cfg = await Config(od) w = weakref.ref(a) x = weakref.ref(b) y = weakref.ref(od) z = weakref.ref(cfg) assert w() is not None assert x() is not None assert w() is not None assert x() is not None del(a) del(b) assert w() is not None assert x() is not None assert w() is not None assert x() is not None del(od) assert w() is not None assert x() is not None assert w() is not None assert x() is not None del(cfg) assert y() is None assert z() is None @pytest.mark.asyncio async def test_deref_dyn(): if not IS_DEREFABLE: return a = StrOption('a', '', ['val1', 'val2'], multi=True) b = StrOption('b', '') dod = DynOptionDescription('dod', '', [b], suffixes=Calculation(funcname, Params((ParamOption(a),)))) od = OptionDescription('od', '', [dod, a]) cfg = await Config(od) w = weakref.ref(a) x = weakref.ref(b) y = weakref.ref(od) z = weakref.ref(cfg) assert w() is not None assert x() is not None assert w() is not None assert x() is not None del(a) del(b) assert w() is not None assert x() is not None assert w() is not None assert x() is not None del(od) del(dod) assert w() is not None assert x() is not None assert w() is not None assert x() is not None del(cfg) assert y() is None assert z() is None