]> SALOME platform Git repositories - tools/sat.git/commitdiff
Salome HOME
mv test_025_pyconf.py test_035 & test_030_pyconf_0_3_9.py test_039
authorChristian Van Wambeke <christian.van-wambeke@cea.fr>
Mon, 14 May 2018 08:28:55 +0000 (10:28 +0200)
committerChristian Van Wambeke <christian.van-wambeke@cea.fr>
Mon, 14 May 2018 08:28:55 +0000 (10:28 +0200)
test/test_024_logging.py
test/test_025_pyconf.py [deleted file]
test/test_030_pyconf_0_3_9.py [deleted file]
test/test_035_pyconf.py [new file with mode: 0755]
test/test_039_pyconf_0_3_9.py [new file with mode: 0755]

index 4f0854fb39544f98f4a6225f23fbd497601cdf53..bc3bd50c05d2a73ff8f908460efff7b9cd9dae37 100755 (executable)
@@ -65,7 +65,7 @@ class LoggerSat(LOGI.Logger):
   above log.debug(msg)
   to assume store long log asci in files txt under/outside files xml
   
-  see: /usr/lib/python2.7/logging/*.py &
+  see: /usr/lib64/python2.7/logging/*.py
   """
   
   _TRACE = LOGI.INFO - 2 # just below
@@ -150,89 +150,6 @@ class TestCase(unittest.TestCase):
     rec = stream_handler.buffer[-1]
     self.assertEqual(rec.levelname, "DEBUG")
     self.assertEqual(rec.msg, "!!! test debug")
-    
-
-  """     
-  def test_015(self):
-    t = DATT.DateTime("now")
-    self.assertTrue(t.isOk())
-    rrt = str(t)
-    DBG.write("test_015 str", rrt)
-    self.assertIn("20", rrt) # 2018 to 2099 ok
-    self.assertIn("-", rrt)
-    self.assertIn(":", rrt)
-    rrt = repr(t)
-    DBG.write("test_015 repr", rrt)
-    self.assertIn("DateTime", rrt)
-    self.assertIn("20", rrt) # 2018 to 2099 ok
-    self.assertIn("-", rrt)
-    self.assertIn(":", rrt)
-
-    
-  def test_020(self):
-    t1 = DATT.DateTime("now")
-    t2 = DATT.DateTime(t1)
-    self.assertTrue(t2.isOk())
-    self.assertEqual(t1, t2)
-    t2 = DATT.DateTime("now")
-    self.assertNotEqual(t1, t2) # microseconds differs
-    
-    DATT.sleep(3) # 3 second more
-    t2 = DATT.DateTime("now")
-    self.assertGreater(2, 1) # to be sure
-    self.assertGreater(str(t2), str(t1)) # seconds differs
-    self.assertGreater(repr(t2), repr(t1)) # seconds differs
-    self.assertGreater(t2, t1)
-    self.assertTrue(t2 > t1)
-    self.assertFalse(t2 == t1)
-    self.assertFalse(t2 < t1)
-    self.assertFalse(t2 <= t1)
-    
-  def test_040(self):
-    t1 = DATT.DateTime("now")
-    delta = DATT.DeltaTime(t1)
-    self.assertFalse(delta.isOk())
-    self.assertIn("Undefined", delta.toSeconds()) 
-    DBG.write("test_040 str", str(delta))
-    DBG.write("test_040 repr", repr(delta))   
-    with self.assertRaises(Exception):
-      delta.raiseIfKo()
-      DATT.DateTime().raiseIfKo()
-       
-  def test_042(self):
-    t1 = DATT.DateTime("now")
-    DATT.sleep(3.1) # 3.1 second more
-    t2 = DATT.DateTime("now")
-    self.assertTrue(t2 > t1)
-    delta = DATT.DeltaTime(t1, t2)
-    self.assertGreater(delta.toSeconds(), 3)
-    self.assertEqual(int(delta.toSeconds()), 3)
-    DBG.write("test_042 str", str(delta))
-    DBG.write("test_042 repr", repr(delta))
-    delta2 = delta.raiseIfKo()
-    self.assertEqual(delta2.toSeconds(), delta.toSeconds())
-    
-  def test_044(self):
-    for more in [0, 0.56789, 5.6789, 56.789, 61, 3661, 36061]:
-      t1 = DATT.DateTime("now")
-      t2 = DATT.DateTime(t1)
-      t2.addSeconds(more)
-      delta = DATT.DeltaTime(t1, t2)
-      r = delta.toStrHuman()
-      DBG.write("test_044 str", r)
-      if more < 60: 
-        self.assertIn("s", r)
-        self.assertNotIn("m", r)
-        self.assertNotIn("h", r)
-        continue
-      if more < 3600: 
-        self.assertIn("s", r)
-        self.assertIn("m", r)
-        self.assertNotIn("h", r)
-      else:
-        self.assertIn("s", r)
-        self.assertIn("m", r)
-        self.assertIn("h", r)"""
 
       
           
diff --git a/test/test_025_pyconf.py b/test/test_025_pyconf.py
deleted file mode 100755 (executable)
index 69c8f22..0000000
+++ /dev/null
@@ -1,263 +0,0 @@
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-
-#  Copyright (C) 2010-2018  CEA/DEN
-#
-#  This library is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU Lesser General Public
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
-#
-#  This library 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
-#  Lesser General Public License for more details.
-#
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-
-import os
-import sys
-import unittest
-
-import initializeTest # set PATH etc for test
-
-import src.debug as DBG # Easy print stderr (for DEBUG only)
-import src.pyconf as PYF # 0.3.7
-import config_0_3_9.config as PYF9 # TODO 0.3.9
-
-_EXAMPLES = {
-1 : """\
-  messages:
-  [
-    {
-      stream : "sys.stderr" # modified
-      message: 'Welcome'
-      name: 'Harry'
-    }
-    {
-      stream : "sys.stdout" # modified
-      message: 'Welkom'
-      name: 'Ruud'
-    }
-    {
-      stream : $messages[0].stream
-      message: 'Bienvenue'
-      name: "Yves"
-    }
-  ]
-""",
-
-2 : """\
-  aa: 111
-  bb: $aa + 222
-""",
-
-3 : """\
-  aa: Yves
-  bb: "Herve" # avoid Hervé -> 'utf8' codec can't decode byte
-""",
-
-4 : """\
-  aa: Yves
-  bb: "Hervé" # avoid Hervé -> 'utf8' codec can't decode byte
-""",
-
-5 : """\
-  aa: Yves
-  bb: "Herve"
-  cc: [ 
-    cc1
-    cc2
-    cc3
-    $bb + " hello"
-    ]
-  dd: { 
-   d1 : dd11 
-   d2 : dd22
-   d3 : dd33 
-   d4 : $bb + " bye"
-   }   
-""",
-
-# error circular
-6 : """\
-  aa: Yves
-  bb: $cc
-  cc: $bb
-""",
-
-7 : """\
-  aa: Yves
-  bb: $cc
-  cc: [ 
-    cc1
-    $bb
-    ]
-""",
-
-8 : """\
-  aa: Yves
-  bb: $cc
-  cc: { 
-    cc1: cc11
-    cc2: $bb
-    }
-""",
-
-}
-
-
-class TestCase(unittest.TestCase):
-  "Test the pyconf.py"""
-  
-  def test_000(self):
-    # one shot setUp() for this TestCase
-    # DBG.push_debug(True)
-    # SAT.setNotLocale() # test english
-    return
-
-  def test_010(self):
-    # pyconf.py doc example 0.3.7
-    # https://www.red-dove.com/config-doc/ is 0.3.9 !
-    # which, when run, would yield the console output:
-
-    expected = """\
-Welcome, Harry
-Welkom, Ruud
-Bienvenue, Yves
-"""
-    inStream = DBG.InStream(_EXAMPLES[1])
-    cfg = PYF.Config(inStream)
-    res = ''
-    for m in cfg.messages:
-        res += '%s, %s\n' % (m.message, m.name)
-    self.assertEqual(res, expected)
-    outStream = DBG.OutStream()
-    cfg.__save__(outStream) # sat renamed save() in __save__()
-    res = outStream.value
-    DBG.write("test_010 cfg", res)
-    self.assertTrue("name : 'Harry'" in res)
-    self.assertTrue("name : 'Ruud'" in res)
-    self.assertTrue("name : 'Yves'" in res)
-        
-  def test_020(self):
-    cfg = PYF.Config()
-    self.assertEqual(str(cfg), '{}')
-    self.assertEqual(cfg.__repr__(), '{}')
-    cfg.aa = "1111"
-    self.assertEqual(str(cfg), "{'aa': '1111'}")
-    cfg.bb = 2222
-    self.assertTrue("'bb': 2222" in str(cfg))
-    self.assertTrue("'aa': '1111'" in str(cfg))
-    cfg.cc = 3333.
-    self.assertTrue("'cc': 3333." in str(cfg))
-    
-  def test_030(self):
-    inStream = DBG.InStream(_EXAMPLES[2])
-    cfg = PYF.Config(inStream)
-    self.assertEqual(str(cfg),  "{'aa': 111, 'bb': $aa + 222}")
-    self.assertEqual(cfg.aa, 111)
-    self.assertEqual(cfg.bb, 333)
-      
-  def test_040(self):
-    inStream = DBG.InStream(_EXAMPLES[3])
-    cfg = PYF.Config(inStream)
-    self.assertEqual(cfg.aa, "Yves")
-    self.assertEqual(cfg.bb, "Herve")
-    self.assertEqual(type(cfg.bb), str)
-    cfg.bb = "Hervé" # try this
-    self.assertEqual(type(cfg.bb), str)
-    self.assertEqual(cfg.bb, "Hervé")
-    
-  def test_045(self):
-    # make Hervé valid with pyconf.py as 0.3.9
-    inStream = DBG.InStream(_EXAMPLES[4])
-    outStream = DBG.OutStream()
-    cfg = PYF9.Config(inStream)
-    cfg.save(outStream) # OK
-    # TODO: cfg = PYF.Config(inStream)
-    # cfg.__save__(outStream)  # KO and sat renamed save() in __save__()
-    res = outStream.value
-    DBG.write("test_045 cfg", res)
-    self.assertTrue("aa : 'Yves'" in res)
-    self.assertTrue(r"bb : 'Herv\xc3\xa9'" in res)
-    self.assertEqual(cfg.bb, "Hervé")
-    
-  def test_100(self):
-    inStream = DBG.InStream(_EXAMPLES[5])
-    outStream = DBG.OutStream()
-    cfg = PYF.Config(inStream) # KO
-    cfg.__save__(outStream) # sat renamed save() in __save__()
-    res = outStream.value
-    DBG.write("test_100 cfg save", res)
-    DBG.write("test_100 cfg debug", cfg)
-    DBG.write("test_100 cfg.cc debug", cfg.cc)
-    
-    cc = cfg.cc
-    # DBG.write("test_100 type cc[3]", dir(cc), True)
-    DBG.write("test_100 cc", [cc.data[i] for i in range(len(cc))])
-      
-  def test_100(self):
-    inStream = DBG.InStream(_EXAMPLES[5])
-    outStream = DBG.OutStream()
-    cfg = PYF.Config(inStream) # KO
-    cfg.__save__(outStream) # sat renamed save() in __save__()
-    res = outStream.value
-    DBG.write("test_100 cfg save", res)
-    DBG.write("test_100 cfg debug", cfg)
-    DBG.write("test_100 cfg.cc debug", cfg.cc)
-    
-    cc = cfg.cc
-    # DBG.write("test_100 type cc[3]", dir(cc), True)
-    DBG.write("test_100 cc", [cc.data[i] for i in range(len(cc))])
-      
-  def test_110(self):
-    inStream = DBG.InStream(_EXAMPLES[6])
-    outStream = DBG.OutStream()
-    cfg = PYF.Config(inStream)
-    cfg.__save__(outStream)
-    
-    res = outStream.value
-    DBG.write("test_110 cfg save", res)
-    self.assertNotIn("ERROR", res)
-    
-    res = DBG.getStrConfigDbg(cfg)
-    DBG.write("test_110 cfg debug", res)
-    self.assertIn("ERROR", res)
-    self.assertIn("unable to evaluate $cc", res)
-    self.assertIn("unable to evaluate $bb", res)
-    
-  def test_120(self):
-   for ii in [7, 8]:
-    inStream = DBG.InStream(_EXAMPLES[ii])
-    outStream = DBG.OutStream()
-    cfg = PYF.Config(inStream)
-    cfg.__save__(outStream)
-    
-    res = outStream.value
-    DBG.write("test_120 cfg save", res, True)
-    self.assertNotIn("ERROR", res)
-    
-    res = DBG.getStrConfigDbg(cfg)
-    DBG.write("test_120 cfg debug", res, True)
-    # no error circular !!!
-    # self.assertIn("ERROR", res) # no error circular !!!
-    # self.assertIn("unable to evaluate $cc", res)
-    # self.assertIn("unable to evaluate $bb", res)
-    res = cfg.bb
-    DBG.write("test_120 cfg.bb debug", res, True)
-
-    res = cfg.cc
-    DBG.write("test_120 cfg.cc debug", res, True)
-    
-  def test_999(self):
-    # one shot tearDown() for this TestCase
-    # SAT.setLocale() # end test english
-    # DBG.pop_debug()
-    return
-    
-if __name__ == '__main__':
-    unittest.main(exit=False)
-    pass
diff --git a/test/test_030_pyconf_0_3_9.py b/test/test_030_pyconf_0_3_9.py
deleted file mode 100755 (executable)
index 88994ae..0000000
+++ /dev/null
@@ -1,461 +0,0 @@
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-
-# Copyright 2004-2010 by Vinay Sajip. All Rights Reserved.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose and without fee is hereby granted,
-# provided that the above copyright notice appear in all copies and that
-# both that copyright notice and this permission notice appear in
-# supporting documentation, and that the name of Vinay Sajip
-# not be used in advertising or publicity pertaining to distribution
-# of the software without specific, written prior permission.
-# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
-# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
-# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""
-Test harness for the configuration module 'config' for Python.
-
-from test_config 0.3.9 modified to test 0.3.7.1
-this test obviously have FAILED (errors=6), 
-TODO, fix upgrading 0.3.9, or not.
-"""
-
-import unittest
-# import test_support
-
-import initializeTest # set PATH etc for test
-
-import src.pyconf as config
-from src.pyconf import Config, ConfigMerger, ConfigList
-from src.pyconf import ConfigError, ConfigFormatError, ConfigResolutionError
-import logging
-from StringIO import StringIO
-
-STREAMS = {
-    "simple_1" :
-"""
-message: 'Hello, world!'
-""",
-    "malformed_1" :
-"""
-123
-""",
-    "malformed_2" :
-"""
-[ 123, 'abc' ]
-""",
-    "malformed_3" :
-"""
-{ a : 7, b : 1.3, c : 'test' }
-""",
-    "malformed_4" :
-"""
-test: $a [7] # note space before bracket
-""",
-    "malformed_5" :
-"""
-test: 'abc'
-test: 'def'
-""",
-    "wellformed_1" :
-"""
-test: $a[7] # note no space before bracket
-""",
-    "boolean_1":
-"""
-test : False
-another_test: True
-""",
-    "boolean_2":
-"""
-test : false
-another_test: true
-""",
-    "none_1":
-"""
-test : None
-""",
-    "none_2":
-"""
-test : none
-""",
-    "number_1":
-"""
-root: 1
-stream: 1.7
-neg: -1
-negfloat: -2.0
-posexponent: 2.0999999e-08
-negexponent: -2.0999999e-08
-exponent: 2.0999999e08
-""",
-    "sequence_1":
-"""
-mixed: [ "VALIGN", [ 0, 0 ], [ -1, -1 ], "TOP" ]
-simple: [1, 2]
-nested: [1, [2, 3], [4, [5, 6]]]
-""",
-    "include_1":
-"""
-included: @'include_2'
-""",
-    "include_2":
-"""
-test: 123
-another_test: 'abc'
-""",
-    "expr_1":
-"""
-value1 : 10
-value2 : 5
-value3 : 'abc'
-value4 : 'ghi'
-value5 : 0
-value6 : { 'a' : $value1, 'b': $value2 }
-derived1 : $value1 + $value2
-derived2 : $value1 - $value2
-derived3 : $value1 * $value2
-derived4 : $value1 / $value2
-derived5 : $value1 % $value2
-derived6 : $value3 + $value4
-derived7 : $value3 + 'def' + $value4
-derived8 : $value3 - $value4 # meaningless
-derived9 : $value1 / $value5    # div by zero
-derived10 : $value1 % $value5   # div by zero
-derived11 : $value17    # doesn't exist
-derived12 : $value6.a + $value6.b
-""",
-    "eval_1":
-"""
-stderr : `sys.stderr`
-stdout : `sys.stdout`
-stdin : `sys.stdin`
-debug : `debug`
-DEBUG : `DEBUG`
-derived: $DEBUG * 10
-""",
-    "merge_1":
-"""
-value1: True
-value3: [1, 2, 3]
-value5: [ 7 ]
-value6: { 'a' : 1, 'c' : 3 }
-""",
-    "merge_2":
-"""
-value2: False
-value4: [4, 5, 6]
-value5: ['abc']
-value6: { 'b' : 2, 'd' : 4 }
-""",
-    "merge_3":
-"""
-value1: True
-value2: 3
-value3: [1, 3, 5]
-value4: [1, 3, 5]
-""",
-    "merge_4":
-"""
-value1: False
-value2: 4
-value3: [2, 4, 6]
-value4: [2, 4, 6]
-""",
-    "list_1":
-"""
-verbosity : 1
-""",
-    "list_2":
-"""
-verbosity : 2
-program_value: 4
-""",
-    "list_3":
-"""
-verbosity : 3
-suite_value: 5
-""",
-    "get_1":
-"""
-value1 : 123
-value2 : 'abcd'
-value3 : True
-value4 : None
-value5:
-{
-    value1 : 123
-    value2 : 'abcd'
-    value3 : True
-    value4 : None
-}
-""",
-    "multiline_1":
-"""
-value1: '''Value One
-Value Two
-'''
-value2: \"\"\"Value Three
-Value Four\"\"\"
-"""
-}
-
-def makeStream(name):
-    s = StringIO(STREAMS[name])
-    s.name = name
-    return s
-
-class OutStream(StringIO):
-    def close(self):
-        self.value = self.getvalue()
-        StringIO.close(self)
-
-class TestConfig(unittest.TestCase):
-
-    def setUp(self):
-        self.cfg = Config(None)
-
-    def tearDown(self):
-        del self.cfg
-
-    def test_010(self): # Creation(self):
-        self.assertEqual(0, len(self.cfg))  # should be empty
-
-    def test_020(self): # Simple(self):
-        self.cfg.load(makeStream("simple_1"))
-        self.failUnless('message' in self.cfg)
-        self.failIf('root' in self.cfg)
-        self.failIf('stream' in self.cfg)
-        self.failIf('load' in self.cfg)
-        self.failIf('__save__' in self.cfg)
-
-    def test_030(self): # ValueOnly(self):
-        self.assertRaises(ConfigError, self.cfg.load,
-           makeStream("malformed_1"))
-        self.assertRaises(ConfigError, self.cfg.load,
-           makeStream("malformed_2"))
-        self.assertRaises(ConfigError, self.cfg.load,
-           makeStream("malformed_3"))
-
-    def test_040(self): # BadBracket(self):
-        self.assertRaises(ConfigError, self.cfg.load,
-           makeStream("malformed_4"))
-
-    def test_050(self): # Duplicate(self):
-        self.assertRaises(ConfigError, self.cfg.load,
-           makeStream("malformed_5"))
-
-    def test_060(self): # GoodBracket(self):
-        self.cfg.load(makeStream("wellformed_1"))
-
-    def test_070(self): # Boolean(self):
-        self.cfg.load(makeStream("boolean_1"))
-        self.assertEqual(True, self.cfg.another_test)
-        self.assertEqual(False, self.cfg.test)
-
-    def test_080(self): # NotBoolean(self):
-        self.cfg.load(makeStream("boolean_2"))
-        self.assertEqual('true', self.cfg.another_test)
-        self.assertEqual('false', self.cfg.test)
-
-    def test_090(self): # None(self):
-        self.cfg.load(makeStream("none_1"))
-        self.assertEqual(None, self.cfg.test)
-
-    def test_100(self): # NotNone(self):
-        self.cfg.load(makeStream("none_2"))
-        self.assertEqual('none', self.cfg.test)
-
-    def test_110(self): # Number(self):
-        self.cfg.load(makeStream("number_1"))
-        self.assertEqual(1, self.cfg.root)
-        self.assertEqual(1.7, self.cfg.stream)
-        self.assertEqual(-1, self.cfg.neg)
-        self.assertEqual(-2.0, self.cfg.negfloat)
-        self.assertAlmostEqual(-2.0999999e-08, self.cfg.negexponent)
-        self.assertAlmostEqual(2.0999999e-08, self.cfg.posexponent)
-        self.assertAlmostEqual(2.0999999e08, self.cfg.exponent)
-
-    def test_120(self): # Change(self):
-        self.cfg.load(makeStream("simple_1"))
-        self.cfg.message = 'Goodbye, cruel world!'
-        self.assertEqual('Goodbye, cruel world!', self.cfg.message)
-
-    def test_130(self): # Save(self):
-        self.cfg.load(makeStream("simple_1"))
-        self.cfg.message = 'Goodbye, cruel world!'
-        out = OutStream()
-        self.cfg.__save__(out)
-        self.assertEqual("message : 'Goodbye, cruel world!'" + config.NEWLINE,
-           out.value)
-
-    def test_140(self): # Include(self):
-        config.streamOpener = makeStream
-        self.cfg = Config("include_1")
-        config.streamOpener = config.defaultStreamOpener
-        out = OutStream()
-        self.cfg.__save__(out)
-        s = "included :%s{%s  test : 123%s  another_test : 'abc'%s}%s" % (5 *
-           (config.NEWLINE,))
-        self.assertEqual(s, out.value)
-
-    def test_150(self): # Expression(self):
-        self.cfg.load(makeStream("expr_1"))
-        self.assertEqual(15, self.cfg.derived1)
-        self.assertEqual(5, self.cfg.derived2)
-        self.assertEqual(50, self.cfg.derived3)
-        self.assertEqual(2, self.cfg.derived4)
-        self.assertEqual(0, self.cfg.derived5)
-        self.assertEqual('abcghi', self.cfg.derived6)
-        self.assertEqual('abcdefghi', self.cfg.derived7)
-        self.assertRaises(TypeError, lambda x: x.derived8, self.cfg)
-        self.assertRaises(ZeroDivisionError, lambda x: x.derived9, self.cfg)
-        self.assertRaises(ZeroDivisionError, lambda x: x.derived10, self.cfg)
-        self.assertRaises(ConfigResolutionError,
-           lambda x: x.derived11, self.cfg)
-        self.assertEqual(15, self.cfg.derived12)
-
-    def test_160(self): # Eval(self):
-        import sys, logging
-        self.cfg.load(makeStream("eval_1"))
-        self.assertEqual(sys.stderr, self.cfg.stderr)
-        self.assertEqual(sys.stdout, self.cfg.stdout)
-        self.assertEqual(sys.stdin, self.cfg.stdin)
-        self.assertRaises(ConfigResolutionError, lambda x: x.debug, self.cfg)
-        self.cfg.addNamespace(logging.Logger)
-        self.assertEqual(logging.Logger.debug.im_func, self.cfg.debug)
-        self.assertRaises(ConfigResolutionError, lambda x: x.DEBUG, self.cfg)
-        self.cfg.addNamespace(logging)
-        self.assertEqual(logging.DEBUG, self.cfg.DEBUG)
-        self.cfg.removeNamespace(logging.Logger)
-        self.assertEqual(logging.debug, self.cfg.debug)
-        self.assertEqual(logging.DEBUG * 10, self.cfg.derived)
-
-    def test_170(self): # Functions(self):
-        makePath = config.makePath
-        isWord = config.isWord
-        self.assertEqual('suffix', makePath('', 'suffix'))
-        self.assertEqual('suffix', makePath(None, 'suffix'))
-        self.assertEqual('prefix.suffix', makePath('prefix', 'suffix'))
-        self.assertEqual('prefix[1]', makePath('prefix', '[1]'))
-        self.failUnless(isWord('a9'))
-        self.failUnless(isWord('9a'))    #perverse, but there you go
-        self.failIf(isWord(9))
-        self.failIf(isWord(None))
-        self.failIf(isWord(self))
-        self.failIf(isWord(''))
-
-    def test_180(self): # Merge(self):
-        cfg1 = Config()
-        cfg1.load(makeStream("merge_1"))
-        cfg2 = Config(makeStream("merge_2"))
-        ConfigMerger().merge(cfg1, cfg2)
-        merged = cfg1
-        cfg1 = Config()
-        cfg1.load(makeStream("merge_1"))
-        for i in xrange(0, 5):
-            key = 'value%d' % (i + 1,)
-            self.failUnless(key in merged)
-        self.assertEqual(len(cfg1.value5) + len(cfg2.value5),
-           len(merged.value5))
-        cfg3 = Config()
-        cfg3.load(makeStream("merge_3"))
-        cfg4 = Config(makeStream("merge_4"))
-        merger = ConfigMerger()
-        self.assertRaises(ConfigError, merger.merge, cfg3, cfg4)
-
-        cfg3 = Config(makeStream("merge_3"))
-        cfg4 = Config(makeStream("merge_4"))
-        merger = ConfigMerger(config.overwriteMergeResolve)
-        merger.merge(cfg3, cfg4)
-        self.assertEqual(False, cfg3['value1'])
-        self.assertEqual(4, cfg3['value2'])
-
-        def customMergeResolve(map1, map2, key):
-            if key == "value3":
-                rv = "overwrite"
-            else:
-                rv = config.overwriteMergeResolve(map1, map2, key)
-            return rv
-
-        cfg3 = Config(makeStream("merge_3"))
-        cfg4 = Config(makeStream("merge_4"))
-        merger = ConfigMerger(customMergeResolve)
-        merger.merge(cfg3, cfg4)
-        self.assertEqual("[2, 4, 6]", str(cfg3.value3))
-        self.assertEqual("[1, 3, 5, 2, 4, 6]", str(cfg3.value4))
-
-    def test_190(self): # List(self):
-        list = ConfigList()
-        list.append(Config(makeStream("list_1")))
-        list.append(Config(makeStream("list_2")))
-        list.append(Config(makeStream("list_3")))
-        self.assertEqual(1, list.getByPath('verbosity'))
-        self.assertEqual(4, list.getByPath('program_value'))
-        self.assertEqual(5, list.getByPath('suite_value'))
-        self.assertRaises(ConfigError, list.getByPath, 'nonexistent_value')
-
-    def test_200(self): # Get(self):
-        cfg = self.cfg
-        cfg.load(makeStream("get_1"))
-        self.assertEqual(123, cfg.get('value1'))
-        self.assertEqual(123, cfg.get('value1', -123))
-        self.assertEqual(-123, cfg.get('value11', -123))
-        self.assertEqual('abcd', cfg.get('value2'))
-        self.failUnless(cfg.get('value3'))
-        self.failIf(cfg.get('value4') is not None)
-        self.assertEqual(123, cfg.value5.get('value1'))
-        self.assertEqual(123, cfg.value5.get('value1', -123))
-        self.assertEqual(-123, cfg.value5.get('value11', -123))
-        self.assertEqual('abcd', cfg.value5.get('value2'))
-        self.failUnless(cfg.value5.get('value3'))
-        self.failIf(cfg.value5.get('value4') is not None)
-
-    def test_210(self): # Multiline(self):
-        cfg = self.cfg
-        cfg.load(makeStream("multiline_1"))
-        self.assertEqual("Value One\nValue Two\n", cfg.get('value1'))
-        self.assertEqual("Value Three\nValue Four", cfg.get('value2'))
-
-    def test_220(self): # Sequence(self):
-        cfg = self.cfg
-        strm = makeStream("sequence_1")
-        cfg.load(strm)
-        self.assertEqual(str(cfg.simple), "[1, 2]")
-        self.assertEqual(str(cfg.nested), "[1, [2, 3], [4, [5, 6]]]")
-        self.assertEqual(str(cfg.mixed), "['VALIGN', [0, 0], [-1, -1], 'TOP']")
-
-    def test_230(self): # JSON(self):
-        import os
-        curDir, tmp = os.path.split(__file__)
-        fileJson = os.path.join(curDir, 'config_0_3_9', 'styles.json')
-        data = StringIO('dummy: ' + open(fileJson, 'r').read())
-        self.cfg.load(data)
-
-def init_logging():
-    logging.basicConfig(level=logging.DEBUG, filename="test_config.log",
-                        filemode="w", format="%(asctime)s %(levelname)-5s %(name)-10s %(message)s")
-"""
-def test_main():
-    init_logging()
-    test_support.run_unittest(TestConfig)
-"""
-
-if __name__ == "__main__":
-    # test_main()
-    unittest.main(exit=False)
-    import sys
-    sys.stderr.write("""
-                     
-###########################################################
-WARNING: this test obviously have 'FAILED  (errors=6)', with config 0.3.7
-TODO:    fix upgrading 0.3.9, (or not).
-###########################################################
-""")
-    pass
-  
diff --git a/test/test_035_pyconf.py b/test/test_035_pyconf.py
new file mode 100755 (executable)
index 0000000..69c8f22
--- /dev/null
@@ -0,0 +1,263 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library 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
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import unittest
+
+import initializeTest # set PATH etc for test
+
+import src.debug as DBG # Easy print stderr (for DEBUG only)
+import src.pyconf as PYF # 0.3.7
+import config_0_3_9.config as PYF9 # TODO 0.3.9
+
+_EXAMPLES = {
+1 : """\
+  messages:
+  [
+    {
+      stream : "sys.stderr" # modified
+      message: 'Welcome'
+      name: 'Harry'
+    }
+    {
+      stream : "sys.stdout" # modified
+      message: 'Welkom'
+      name: 'Ruud'
+    }
+    {
+      stream : $messages[0].stream
+      message: 'Bienvenue'
+      name: "Yves"
+    }
+  ]
+""",
+
+2 : """\
+  aa: 111
+  bb: $aa + 222
+""",
+
+3 : """\
+  aa: Yves
+  bb: "Herve" # avoid Hervé -> 'utf8' codec can't decode byte
+""",
+
+4 : """\
+  aa: Yves
+  bb: "Hervé" # avoid Hervé -> 'utf8' codec can't decode byte
+""",
+
+5 : """\
+  aa: Yves
+  bb: "Herve"
+  cc: [ 
+    cc1
+    cc2
+    cc3
+    $bb + " hello"
+    ]
+  dd: { 
+   d1 : dd11 
+   d2 : dd22
+   d3 : dd33 
+   d4 : $bb + " bye"
+   }   
+""",
+
+# error circular
+6 : """\
+  aa: Yves
+  bb: $cc
+  cc: $bb
+""",
+
+7 : """\
+  aa: Yves
+  bb: $cc
+  cc: [ 
+    cc1
+    $bb
+    ]
+""",
+
+8 : """\
+  aa: Yves
+  bb: $cc
+  cc: { 
+    cc1: cc11
+    cc2: $bb
+    }
+""",
+
+}
+
+
+class TestCase(unittest.TestCase):
+  "Test the pyconf.py"""
+  
+  def test_000(self):
+    # one shot setUp() for this TestCase
+    # DBG.push_debug(True)
+    # SAT.setNotLocale() # test english
+    return
+
+  def test_010(self):
+    # pyconf.py doc example 0.3.7
+    # https://www.red-dove.com/config-doc/ is 0.3.9 !
+    # which, when run, would yield the console output:
+
+    expected = """\
+Welcome, Harry
+Welkom, Ruud
+Bienvenue, Yves
+"""
+    inStream = DBG.InStream(_EXAMPLES[1])
+    cfg = PYF.Config(inStream)
+    res = ''
+    for m in cfg.messages:
+        res += '%s, %s\n' % (m.message, m.name)
+    self.assertEqual(res, expected)
+    outStream = DBG.OutStream()
+    cfg.__save__(outStream) # sat renamed save() in __save__()
+    res = outStream.value
+    DBG.write("test_010 cfg", res)
+    self.assertTrue("name : 'Harry'" in res)
+    self.assertTrue("name : 'Ruud'" in res)
+    self.assertTrue("name : 'Yves'" in res)
+        
+  def test_020(self):
+    cfg = PYF.Config()
+    self.assertEqual(str(cfg), '{}')
+    self.assertEqual(cfg.__repr__(), '{}')
+    cfg.aa = "1111"
+    self.assertEqual(str(cfg), "{'aa': '1111'}")
+    cfg.bb = 2222
+    self.assertTrue("'bb': 2222" in str(cfg))
+    self.assertTrue("'aa': '1111'" in str(cfg))
+    cfg.cc = 3333.
+    self.assertTrue("'cc': 3333." in str(cfg))
+    
+  def test_030(self):
+    inStream = DBG.InStream(_EXAMPLES[2])
+    cfg = PYF.Config(inStream)
+    self.assertEqual(str(cfg),  "{'aa': 111, 'bb': $aa + 222}")
+    self.assertEqual(cfg.aa, 111)
+    self.assertEqual(cfg.bb, 333)
+      
+  def test_040(self):
+    inStream = DBG.InStream(_EXAMPLES[3])
+    cfg = PYF.Config(inStream)
+    self.assertEqual(cfg.aa, "Yves")
+    self.assertEqual(cfg.bb, "Herve")
+    self.assertEqual(type(cfg.bb), str)
+    cfg.bb = "Hervé" # try this
+    self.assertEqual(type(cfg.bb), str)
+    self.assertEqual(cfg.bb, "Hervé")
+    
+  def test_045(self):
+    # make Hervé valid with pyconf.py as 0.3.9
+    inStream = DBG.InStream(_EXAMPLES[4])
+    outStream = DBG.OutStream()
+    cfg = PYF9.Config(inStream)
+    cfg.save(outStream) # OK
+    # TODO: cfg = PYF.Config(inStream)
+    # cfg.__save__(outStream)  # KO and sat renamed save() in __save__()
+    res = outStream.value
+    DBG.write("test_045 cfg", res)
+    self.assertTrue("aa : 'Yves'" in res)
+    self.assertTrue(r"bb : 'Herv\xc3\xa9'" in res)
+    self.assertEqual(cfg.bb, "Hervé")
+    
+  def test_100(self):
+    inStream = DBG.InStream(_EXAMPLES[5])
+    outStream = DBG.OutStream()
+    cfg = PYF.Config(inStream) # KO
+    cfg.__save__(outStream) # sat renamed save() in __save__()
+    res = outStream.value
+    DBG.write("test_100 cfg save", res)
+    DBG.write("test_100 cfg debug", cfg)
+    DBG.write("test_100 cfg.cc debug", cfg.cc)
+    
+    cc = cfg.cc
+    # DBG.write("test_100 type cc[3]", dir(cc), True)
+    DBG.write("test_100 cc", [cc.data[i] for i in range(len(cc))])
+      
+  def test_100(self):
+    inStream = DBG.InStream(_EXAMPLES[5])
+    outStream = DBG.OutStream()
+    cfg = PYF.Config(inStream) # KO
+    cfg.__save__(outStream) # sat renamed save() in __save__()
+    res = outStream.value
+    DBG.write("test_100 cfg save", res)
+    DBG.write("test_100 cfg debug", cfg)
+    DBG.write("test_100 cfg.cc debug", cfg.cc)
+    
+    cc = cfg.cc
+    # DBG.write("test_100 type cc[3]", dir(cc), True)
+    DBG.write("test_100 cc", [cc.data[i] for i in range(len(cc))])
+      
+  def test_110(self):
+    inStream = DBG.InStream(_EXAMPLES[6])
+    outStream = DBG.OutStream()
+    cfg = PYF.Config(inStream)
+    cfg.__save__(outStream)
+    
+    res = outStream.value
+    DBG.write("test_110 cfg save", res)
+    self.assertNotIn("ERROR", res)
+    
+    res = DBG.getStrConfigDbg(cfg)
+    DBG.write("test_110 cfg debug", res)
+    self.assertIn("ERROR", res)
+    self.assertIn("unable to evaluate $cc", res)
+    self.assertIn("unable to evaluate $bb", res)
+    
+  def test_120(self):
+   for ii in [7, 8]:
+    inStream = DBG.InStream(_EXAMPLES[ii])
+    outStream = DBG.OutStream()
+    cfg = PYF.Config(inStream)
+    cfg.__save__(outStream)
+    
+    res = outStream.value
+    DBG.write("test_120 cfg save", res, True)
+    self.assertNotIn("ERROR", res)
+    
+    res = DBG.getStrConfigDbg(cfg)
+    DBG.write("test_120 cfg debug", res, True)
+    # no error circular !!!
+    # self.assertIn("ERROR", res) # no error circular !!!
+    # self.assertIn("unable to evaluate $cc", res)
+    # self.assertIn("unable to evaluate $bb", res)
+    res = cfg.bb
+    DBG.write("test_120 cfg.bb debug", res, True)
+
+    res = cfg.cc
+    DBG.write("test_120 cfg.cc debug", res, True)
+    
+  def test_999(self):
+    # one shot tearDown() for this TestCase
+    # SAT.setLocale() # end test english
+    # DBG.pop_debug()
+    return
+    
+if __name__ == '__main__':
+    unittest.main(exit=False)
+    pass
diff --git a/test/test_039_pyconf_0_3_9.py b/test/test_039_pyconf_0_3_9.py
new file mode 100755 (executable)
index 0000000..88994ae
--- /dev/null
@@ -0,0 +1,461 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+# Copyright 2004-2010 by Vinay Sajip. All Rights Reserved.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted,
+# provided that the above copyright notice appear in all copies and that
+# both that copyright notice and this permission notice appear in
+# supporting documentation, and that the name of Vinay Sajip
+# not be used in advertising or publicity pertaining to distribution
+# of the software without specific, written prior permission.
+# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
+# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+"""
+Test harness for the configuration module 'config' for Python.
+
+from test_config 0.3.9 modified to test 0.3.7.1
+this test obviously have FAILED (errors=6), 
+TODO, fix upgrading 0.3.9, or not.
+"""
+
+import unittest
+# import test_support
+
+import initializeTest # set PATH etc for test
+
+import src.pyconf as config
+from src.pyconf import Config, ConfigMerger, ConfigList
+from src.pyconf import ConfigError, ConfigFormatError, ConfigResolutionError
+import logging
+from StringIO import StringIO
+
+STREAMS = {
+    "simple_1" :
+"""
+message: 'Hello, world!'
+""",
+    "malformed_1" :
+"""
+123
+""",
+    "malformed_2" :
+"""
+[ 123, 'abc' ]
+""",
+    "malformed_3" :
+"""
+{ a : 7, b : 1.3, c : 'test' }
+""",
+    "malformed_4" :
+"""
+test: $a [7] # note space before bracket
+""",
+    "malformed_5" :
+"""
+test: 'abc'
+test: 'def'
+""",
+    "wellformed_1" :
+"""
+test: $a[7] # note no space before bracket
+""",
+    "boolean_1":
+"""
+test : False
+another_test: True
+""",
+    "boolean_2":
+"""
+test : false
+another_test: true
+""",
+    "none_1":
+"""
+test : None
+""",
+    "none_2":
+"""
+test : none
+""",
+    "number_1":
+"""
+root: 1
+stream: 1.7
+neg: -1
+negfloat: -2.0
+posexponent: 2.0999999e-08
+negexponent: -2.0999999e-08
+exponent: 2.0999999e08
+""",
+    "sequence_1":
+"""
+mixed: [ "VALIGN", [ 0, 0 ], [ -1, -1 ], "TOP" ]
+simple: [1, 2]
+nested: [1, [2, 3], [4, [5, 6]]]
+""",
+    "include_1":
+"""
+included: @'include_2'
+""",
+    "include_2":
+"""
+test: 123
+another_test: 'abc'
+""",
+    "expr_1":
+"""
+value1 : 10
+value2 : 5
+value3 : 'abc'
+value4 : 'ghi'
+value5 : 0
+value6 : { 'a' : $value1, 'b': $value2 }
+derived1 : $value1 + $value2
+derived2 : $value1 - $value2
+derived3 : $value1 * $value2
+derived4 : $value1 / $value2
+derived5 : $value1 % $value2
+derived6 : $value3 + $value4
+derived7 : $value3 + 'def' + $value4
+derived8 : $value3 - $value4 # meaningless
+derived9 : $value1 / $value5    # div by zero
+derived10 : $value1 % $value5   # div by zero
+derived11 : $value17    # doesn't exist
+derived12 : $value6.a + $value6.b
+""",
+    "eval_1":
+"""
+stderr : `sys.stderr`
+stdout : `sys.stdout`
+stdin : `sys.stdin`
+debug : `debug`
+DEBUG : `DEBUG`
+derived: $DEBUG * 10
+""",
+    "merge_1":
+"""
+value1: True
+value3: [1, 2, 3]
+value5: [ 7 ]
+value6: { 'a' : 1, 'c' : 3 }
+""",
+    "merge_2":
+"""
+value2: False
+value4: [4, 5, 6]
+value5: ['abc']
+value6: { 'b' : 2, 'd' : 4 }
+""",
+    "merge_3":
+"""
+value1: True
+value2: 3
+value3: [1, 3, 5]
+value4: [1, 3, 5]
+""",
+    "merge_4":
+"""
+value1: False
+value2: 4
+value3: [2, 4, 6]
+value4: [2, 4, 6]
+""",
+    "list_1":
+"""
+verbosity : 1
+""",
+    "list_2":
+"""
+verbosity : 2
+program_value: 4
+""",
+    "list_3":
+"""
+verbosity : 3
+suite_value: 5
+""",
+    "get_1":
+"""
+value1 : 123
+value2 : 'abcd'
+value3 : True
+value4 : None
+value5:
+{
+    value1 : 123
+    value2 : 'abcd'
+    value3 : True
+    value4 : None
+}
+""",
+    "multiline_1":
+"""
+value1: '''Value One
+Value Two
+'''
+value2: \"\"\"Value Three
+Value Four\"\"\"
+"""
+}
+
+def makeStream(name):
+    s = StringIO(STREAMS[name])
+    s.name = name
+    return s
+
+class OutStream(StringIO):
+    def close(self):
+        self.value = self.getvalue()
+        StringIO.close(self)
+
+class TestConfig(unittest.TestCase):
+
+    def setUp(self):
+        self.cfg = Config(None)
+
+    def tearDown(self):
+        del self.cfg
+
+    def test_010(self): # Creation(self):
+        self.assertEqual(0, len(self.cfg))  # should be empty
+
+    def test_020(self): # Simple(self):
+        self.cfg.load(makeStream("simple_1"))
+        self.failUnless('message' in self.cfg)
+        self.failIf('root' in self.cfg)
+        self.failIf('stream' in self.cfg)
+        self.failIf('load' in self.cfg)
+        self.failIf('__save__' in self.cfg)
+
+    def test_030(self): # ValueOnly(self):
+        self.assertRaises(ConfigError, self.cfg.load,
+           makeStream("malformed_1"))
+        self.assertRaises(ConfigError, self.cfg.load,
+           makeStream("malformed_2"))
+        self.assertRaises(ConfigError, self.cfg.load,
+           makeStream("malformed_3"))
+
+    def test_040(self): # BadBracket(self):
+        self.assertRaises(ConfigError, self.cfg.load,
+           makeStream("malformed_4"))
+
+    def test_050(self): # Duplicate(self):
+        self.assertRaises(ConfigError, self.cfg.load,
+           makeStream("malformed_5"))
+
+    def test_060(self): # GoodBracket(self):
+        self.cfg.load(makeStream("wellformed_1"))
+
+    def test_070(self): # Boolean(self):
+        self.cfg.load(makeStream("boolean_1"))
+        self.assertEqual(True, self.cfg.another_test)
+        self.assertEqual(False, self.cfg.test)
+
+    def test_080(self): # NotBoolean(self):
+        self.cfg.load(makeStream("boolean_2"))
+        self.assertEqual('true', self.cfg.another_test)
+        self.assertEqual('false', self.cfg.test)
+
+    def test_090(self): # None(self):
+        self.cfg.load(makeStream("none_1"))
+        self.assertEqual(None, self.cfg.test)
+
+    def test_100(self): # NotNone(self):
+        self.cfg.load(makeStream("none_2"))
+        self.assertEqual('none', self.cfg.test)
+
+    def test_110(self): # Number(self):
+        self.cfg.load(makeStream("number_1"))
+        self.assertEqual(1, self.cfg.root)
+        self.assertEqual(1.7, self.cfg.stream)
+        self.assertEqual(-1, self.cfg.neg)
+        self.assertEqual(-2.0, self.cfg.negfloat)
+        self.assertAlmostEqual(-2.0999999e-08, self.cfg.negexponent)
+        self.assertAlmostEqual(2.0999999e-08, self.cfg.posexponent)
+        self.assertAlmostEqual(2.0999999e08, self.cfg.exponent)
+
+    def test_120(self): # Change(self):
+        self.cfg.load(makeStream("simple_1"))
+        self.cfg.message = 'Goodbye, cruel world!'
+        self.assertEqual('Goodbye, cruel world!', self.cfg.message)
+
+    def test_130(self): # Save(self):
+        self.cfg.load(makeStream("simple_1"))
+        self.cfg.message = 'Goodbye, cruel world!'
+        out = OutStream()
+        self.cfg.__save__(out)
+        self.assertEqual("message : 'Goodbye, cruel world!'" + config.NEWLINE,
+           out.value)
+
+    def test_140(self): # Include(self):
+        config.streamOpener = makeStream
+        self.cfg = Config("include_1")
+        config.streamOpener = config.defaultStreamOpener
+        out = OutStream()
+        self.cfg.__save__(out)
+        s = "included :%s{%s  test : 123%s  another_test : 'abc'%s}%s" % (5 *
+           (config.NEWLINE,))
+        self.assertEqual(s, out.value)
+
+    def test_150(self): # Expression(self):
+        self.cfg.load(makeStream("expr_1"))
+        self.assertEqual(15, self.cfg.derived1)
+        self.assertEqual(5, self.cfg.derived2)
+        self.assertEqual(50, self.cfg.derived3)
+        self.assertEqual(2, self.cfg.derived4)
+        self.assertEqual(0, self.cfg.derived5)
+        self.assertEqual('abcghi', self.cfg.derived6)
+        self.assertEqual('abcdefghi', self.cfg.derived7)
+        self.assertRaises(TypeError, lambda x: x.derived8, self.cfg)
+        self.assertRaises(ZeroDivisionError, lambda x: x.derived9, self.cfg)
+        self.assertRaises(ZeroDivisionError, lambda x: x.derived10, self.cfg)
+        self.assertRaises(ConfigResolutionError,
+           lambda x: x.derived11, self.cfg)
+        self.assertEqual(15, self.cfg.derived12)
+
+    def test_160(self): # Eval(self):
+        import sys, logging
+        self.cfg.load(makeStream("eval_1"))
+        self.assertEqual(sys.stderr, self.cfg.stderr)
+        self.assertEqual(sys.stdout, self.cfg.stdout)
+        self.assertEqual(sys.stdin, self.cfg.stdin)
+        self.assertRaises(ConfigResolutionError, lambda x: x.debug, self.cfg)
+        self.cfg.addNamespace(logging.Logger)
+        self.assertEqual(logging.Logger.debug.im_func, self.cfg.debug)
+        self.assertRaises(ConfigResolutionError, lambda x: x.DEBUG, self.cfg)
+        self.cfg.addNamespace(logging)
+        self.assertEqual(logging.DEBUG, self.cfg.DEBUG)
+        self.cfg.removeNamespace(logging.Logger)
+        self.assertEqual(logging.debug, self.cfg.debug)
+        self.assertEqual(logging.DEBUG * 10, self.cfg.derived)
+
+    def test_170(self): # Functions(self):
+        makePath = config.makePath
+        isWord = config.isWord
+        self.assertEqual('suffix', makePath('', 'suffix'))
+        self.assertEqual('suffix', makePath(None, 'suffix'))
+        self.assertEqual('prefix.suffix', makePath('prefix', 'suffix'))
+        self.assertEqual('prefix[1]', makePath('prefix', '[1]'))
+        self.failUnless(isWord('a9'))
+        self.failUnless(isWord('9a'))    #perverse, but there you go
+        self.failIf(isWord(9))
+        self.failIf(isWord(None))
+        self.failIf(isWord(self))
+        self.failIf(isWord(''))
+
+    def test_180(self): # Merge(self):
+        cfg1 = Config()
+        cfg1.load(makeStream("merge_1"))
+        cfg2 = Config(makeStream("merge_2"))
+        ConfigMerger().merge(cfg1, cfg2)
+        merged = cfg1
+        cfg1 = Config()
+        cfg1.load(makeStream("merge_1"))
+        for i in xrange(0, 5):
+            key = 'value%d' % (i + 1,)
+            self.failUnless(key in merged)
+        self.assertEqual(len(cfg1.value5) + len(cfg2.value5),
+           len(merged.value5))
+        cfg3 = Config()
+        cfg3.load(makeStream("merge_3"))
+        cfg4 = Config(makeStream("merge_4"))
+        merger = ConfigMerger()
+        self.assertRaises(ConfigError, merger.merge, cfg3, cfg4)
+
+        cfg3 = Config(makeStream("merge_3"))
+        cfg4 = Config(makeStream("merge_4"))
+        merger = ConfigMerger(config.overwriteMergeResolve)
+        merger.merge(cfg3, cfg4)
+        self.assertEqual(False, cfg3['value1'])
+        self.assertEqual(4, cfg3['value2'])
+
+        def customMergeResolve(map1, map2, key):
+            if key == "value3":
+                rv = "overwrite"
+            else:
+                rv = config.overwriteMergeResolve(map1, map2, key)
+            return rv
+
+        cfg3 = Config(makeStream("merge_3"))
+        cfg4 = Config(makeStream("merge_4"))
+        merger = ConfigMerger(customMergeResolve)
+        merger.merge(cfg3, cfg4)
+        self.assertEqual("[2, 4, 6]", str(cfg3.value3))
+        self.assertEqual("[1, 3, 5, 2, 4, 6]", str(cfg3.value4))
+
+    def test_190(self): # List(self):
+        list = ConfigList()
+        list.append(Config(makeStream("list_1")))
+        list.append(Config(makeStream("list_2")))
+        list.append(Config(makeStream("list_3")))
+        self.assertEqual(1, list.getByPath('verbosity'))
+        self.assertEqual(4, list.getByPath('program_value'))
+        self.assertEqual(5, list.getByPath('suite_value'))
+        self.assertRaises(ConfigError, list.getByPath, 'nonexistent_value')
+
+    def test_200(self): # Get(self):
+        cfg = self.cfg
+        cfg.load(makeStream("get_1"))
+        self.assertEqual(123, cfg.get('value1'))
+        self.assertEqual(123, cfg.get('value1', -123))
+        self.assertEqual(-123, cfg.get('value11', -123))
+        self.assertEqual('abcd', cfg.get('value2'))
+        self.failUnless(cfg.get('value3'))
+        self.failIf(cfg.get('value4') is not None)
+        self.assertEqual(123, cfg.value5.get('value1'))
+        self.assertEqual(123, cfg.value5.get('value1', -123))
+        self.assertEqual(-123, cfg.value5.get('value11', -123))
+        self.assertEqual('abcd', cfg.value5.get('value2'))
+        self.failUnless(cfg.value5.get('value3'))
+        self.failIf(cfg.value5.get('value4') is not None)
+
+    def test_210(self): # Multiline(self):
+        cfg = self.cfg
+        cfg.load(makeStream("multiline_1"))
+        self.assertEqual("Value One\nValue Two\n", cfg.get('value1'))
+        self.assertEqual("Value Three\nValue Four", cfg.get('value2'))
+
+    def test_220(self): # Sequence(self):
+        cfg = self.cfg
+        strm = makeStream("sequence_1")
+        cfg.load(strm)
+        self.assertEqual(str(cfg.simple), "[1, 2]")
+        self.assertEqual(str(cfg.nested), "[1, [2, 3], [4, [5, 6]]]")
+        self.assertEqual(str(cfg.mixed), "['VALIGN', [0, 0], [-1, -1], 'TOP']")
+
+    def test_230(self): # JSON(self):
+        import os
+        curDir, tmp = os.path.split(__file__)
+        fileJson = os.path.join(curDir, 'config_0_3_9', 'styles.json')
+        data = StringIO('dummy: ' + open(fileJson, 'r').read())
+        self.cfg.load(data)
+
+def init_logging():
+    logging.basicConfig(level=logging.DEBUG, filename="test_config.log",
+                        filemode="w", format="%(asctime)s %(levelname)-5s %(name)-10s %(message)s")
+"""
+def test_main():
+    init_logging()
+    test_support.run_unittest(TestConfig)
+"""
+
+if __name__ == "__main__":
+    # test_main()
+    unittest.main(exit=False)
+    import sys
+    sys.stderr.write("""
+                     
+###########################################################
+WARNING: this test obviously have 'FAILED  (errors=6)', with config 0.3.7
+TODO:    fix upgrading 0.3.9, (or not).
+###########################################################
+""")
+    pass
+