python 3.5 support
[tiramisu.git] / test / test_dereference.py
index be8dfde..a1e7652 100644 (file)
@@ -1,12 +1,15 @@
 # coding: utf-8
-import autopath
-#from py.test import raises
+from .autopath import do_autopath
+do_autopath()
 
-from tiramisu.config import Config
-from tiramisu.option import BoolOption, OptionDescription
+from tiramisu.config import Config, GroupConfig, MetaConfig
+from tiramisu.option import BoolOption, IntOption, StrOption, OptionDescription, submulti
 import weakref
 
 
+IS_DEREFABLE = True
+
+
 def test_deref_storage():
     b = BoolOption('b', '')
     o = OptionDescription('od', '', [b])
@@ -44,16 +47,23 @@ def test_deref_config():
 
 
 def test_deref_option():
+    global IS_DEREFABLE
     b = BoolOption('b', '')
     o = OptionDescription('od', '', [b])
     w = weakref.ref(b)
     del(b)
-    assert w() is not None
+    try:
+        assert w() is not None
+    except AssertionError:
+        IS_DEREFABLE = False
+        return
     del(o)
     assert w() is None
 
 
 def test_deref_optiondescription():
+    if not IS_DEREFABLE:
+        return
     b = BoolOption('b', '')
     o = OptionDescription('od', '', [b])
     w = weakref.ref(o)
@@ -64,9 +74,11 @@ def test_deref_optiondescription():
 
 
 def test_deref_option_cache():
+    if not IS_DEREFABLE:
+        return
     b = BoolOption('b', '')
     o = OptionDescription('od', '', [b])
-    o.impl_build_cache()
+    o.impl_build_cache_option()
     w = weakref.ref(b)
     del(b)
     assert w() is not None
@@ -75,9 +87,11 @@ def test_deref_option_cache():
 
 
 def test_deref_optiondescription_cache():
+    if not IS_DEREFABLE:
+        return
     b = BoolOption('b', '')
     o = OptionDescription('od', '', [b])
-    o.impl_build_cache()
+    o.impl_build_cache_option()
     w = weakref.ref(o)
     del(b)
     assert w() is not None
@@ -86,6 +100,8 @@ def test_deref_optiondescription_cache():
 
 
 def test_deref_option_config():
+    if not IS_DEREFABLE:
+        return
     b = BoolOption('b', '')
     o = OptionDescription('od', '', [b])
     c = Config(o)
@@ -99,6 +115,8 @@ def test_deref_option_config():
 
 
 def test_deref_optiondescription_config():
+    if not IS_DEREFABLE:
+        return
     b = BoolOption('b', '')
     o = OptionDescription('od', '', [b])
     c = Config(o)
@@ -109,3 +127,55 @@ def test_deref_optiondescription_config():
     assert w() is not None
     del(c)
     assert w() is None
+
+
+def test_deref_groupconfig():
+    if not IS_DEREFABLE:
+        return
+    i1 = IntOption('i1', '')
+    od1 = OptionDescription('od1', '', [i1])
+    od2 = OptionDescription('od2', '', [od1])
+    conf1 = Config(od2, 'conf1')
+    conf2 = Config(od2, 'conf2')
+    meta = GroupConfig([conf1, conf2])
+    w = weakref.ref(conf1)
+    del(conf1)
+    assert w() is not None
+    del(meta)
+    assert w() is None
+
+
+def test_deref_metaconfig():
+    if not IS_DEREFABLE:
+        return
+    i1 = IntOption('i1', '')
+    od1 = OptionDescription('od1', '', [i1])
+    od2 = OptionDescription('od2', '', [od1])
+    conf1 = Config(od2, 'conf1')
+    conf2 = Config(od2, 'conf2')
+    meta = MetaConfig([conf1, conf2])
+    w = weakref.ref(conf1)
+    del(conf1)
+    assert w() is not None
+    del(meta)
+    assert w() is None
+
+
+def test_deref_submulti():
+    if not IS_DEREFABLE:
+        return
+    multi = StrOption('multi', '', multi=submulti)
+    od = OptionDescription('od', '', [multi])
+    cfg = Config(od)
+    cfg.cfgimpl_get_settings().remove('cache')
+    w = weakref.ref(cfg.multi)
+    assert w() is None
+    cfg.multi.append([])
+    w = weakref.ref(cfg.multi)
+    assert w() is None
+    m = cfg.multi
+    w = weakref.ref(m)
+    z = weakref.ref(w()[0])
+    del(m)
+    assert w() is None
+    assert z() is None