def testConstraint_06_afterwards_2(self):
        tn = unique_name()
        bn = unique_name()

        p = getTree(tn)
        p[bn] = "bork"  # passes
        
        treedict.addConstraint(unique_name(), bn,["bork", "bork1"])
    def testConstraint_09_branches_in_tree_names_03_control(self):
        tn = unique_name()
        tnb = tn + '.b'
        p = getTree(tnb)

        treedict.addConstraint(tnb, 'a', [1], "not 1")

        # shouldn't throw
        p.a = 1
    def testConstraint_25_Links_01(self):
        tn = unique_name()
        p = treedict.getTree(tn)
        treedict.addConstraint(tn, 'a.b.link.v', [1], "not 1")

        p.d.v = 1
        p.a.b.link = p.d

        self.assert_(p.a.b.link.v == 1)
    def testConstraint_09_branches_in_tree_names_02(self):
        tn = unique_name()

        p = getTree(tn)

        treedict.addConstraint(tn + '.b', 'a', [1], "not 1")

        # shouldn't throw
        p.b.a = 2
    def testConstraint_06_afterwards_2_copy(self):
        tn = unique_name()
        bn = unique_name()

        p = getTree(tn)
        p[bn] = "bork"  # passes
        q = p.copy(deep = True)
        q[bn] = "bork1"  # passes

        treedict.addConstraint(tn, bn, ["bork", "bork1"])
    def testConstraint_25_Links_03_set_in_linked_root(self):
        tn = unique_name()
        p = treedict.getTree(tn)
        treedict.addConstraint(tn, 'a.b.link.v', [1], "not 1")

        p.a.b.link = p.d

        def f():
            p.d.v = 1

        self.assertRaises(ValueError, f)
    def testConstraint_25_Links_02_bad_value(self):
        tn = unique_name()
        p = treedict.getTree(tn)
        treedict.addConstraint(tn, 'a.b.link.v', [1], "not 1")

        p.d.v = 2

        def f():
            p.a.b.link = p.d
        
        self.assertRaises(ValueError, f)
    def testConstraint_30_Link_Conf_01_control(self):
        
        tn = unique_name()
        p = treedict.getTree(tn)

        treedict.addConstraint(tn, 'a.b.c', [1], "not 1")

        p.aa.a.bb.b.c = 1
        p.a = p.aa.a

        def f():
           p.a.b = p.a.bb.b 
    def testConstraint_09_branches_in_tree_names_03(self):
        tn = unique_name()
        tnb = tn + '.b'

        p = getTree(tnb)

        treedict.addConstraint(tnb, 'a', [1], "not 1")

        # should throw
        def f():
            p.a = 2

        self.assertRaises(ValueError, f)
    def testConstraint_08_branch_copy_2(self):
        tn = unique_name()

        treedict.addConstraint(tn, 'a.b.c', [1], "not 1")
        
        p = getTree(tn)
        p.makeBranch('a.b')
        q = p.a.b.copy()

        def f():
            q.c = 2  # should be bad

        self.assertRaises(ValueError, f)
    def testConstraint_26_global_Links_01(self):
        tn = unique_name()
        bn = unique_name()

        link_key = bn + '.a.b.link'

        p = treedict.getTree(tn)
        treedict.addConstraint(tn, link_key + '.v', [1], "not 1")

        p[link_key] = p.d
        p.d.v = 1

        self.assert_(p[link_key].v == 1)
    def testConstraint_16_constraint_not_added_on_failure__control(self):
        tn = unique_name()
        
        p = getTree(tn)
        p["a.b.c.d"] = 1

        treedict.addConstraint(tn, 'a.b.c.d', [1], "not 1")
            
        # Should now throw, as the constraint is in place
        def f():
            p["a.b.c.d"] = 2

        self.assertRaises(ValueError, f)
    def testConstraint_30_Link_Conf_06_control(self):
        
        tn = unique_name()
        p = treedict.getTree(tn)

        treedict.addConstraint(tn, 'a.v', [1], "not 1")

        p.c = p.aa.c
        p.aa.bb.c = p.aa.bb.cc
        p.aa.c = p.aa.bb.c
        p.a = p.c

        def f():
            p.aa.bb.cc.dd.v = 1
    def testConstraint_22_IntermediatesMustBeBranches_01(self):
        tn = unique_name()
        
        treedict.addConstraint(tn, 'a.b.c.d.v', [1], "not 1")

        p = treedict.getTree(tn)

        def f():
            p["a.b"] = 1

        self.assertRaises(ValueError, f)

        # control
        p.a.makeBranch("b")
    def testConstraint_30_Link_Conf_01(self):
        
        tn = unique_name()
        p = treedict.getTree(tn)

        treedict.addConstraint(tn, 'a.b.c', [1], "not 1")

        p.aa.a.bb.b.c = 2
        p.a = p.aa.a

        def f():
           p.a.b = p.a.bb.b 

        self.assertRaises(ValueError, f)
    def testConstraint_22_IntermediatesMustBeBranches_02_after(self):
        tn = unique_name()
        
        p = treedict.getTree(tn)

        p["a.b"] = 1

        def f():
            treedict.addConstraint(tn, 'a.b.c.d.v', [1], "not 1")

        self.assertRaises(ValueError, f)

        # control
        treedict.addConstraint(tn, 'a.b', [1], "not 1")
    def testConstraint_26_global_Links_03_set_in_linked_root(self):
        tn = unique_name()
        bn = unique_name()

        link_key = bn + '.a.b.link'

        p = treedict.getTree(tn)
        treedict.addConstraint(tn, link_key + '.v', [1], "not 1")

        p.d.v = 2

        def f():
            p[link_key] = p.d

        self.assertRaises(ValueError, f)
    def testConstraint_26_global_Links_02_bad_value(self):
        tn = unique_name()
        bn = unique_name()

        link_key = bn + '.a.b.link'

        p = treedict.getTree(tn)
        treedict.addConstraint(tn, link_key + '.v', [1], "not 1")

        p[link_key] = p.d

        def f():
            p.d.v = 2

        self.assertRaises(ValueError, f)
    def testConstraint_24_CopyingBranchTracks(self):
        # A regression test

        tn = unique_name()

        p = treedict.getTree(tn)

        treedict.addConstraint(tn, 'a.b.c.d.v', [1], "not 1")

        p.a.b.c.d.v = 1
        
        pc = p.a.b.copy()
        
        # would raise an error earlier
        pc.a.b.v = 1
    def testConstraint_30_Link_Conf_06(self):
        
        tn = unique_name()
        p = treedict.getTree(tn)

        treedict.addConstraint(tn, 'a.v', [1], "not 1")

        p.c = p.aa.c
        p.aa.bb.c = p.aa.bb.cc
        p.aa.c = p.aa.bb.c
        p.a = p.c

        def f():
            p.aa.bb.cc.dd.v = 2
            
        self.assertRaises(ValueError, f)
    def testConstraint_23_IntermediatesMustBeBranches_copied_02_after(self):
        tn = unique_name()
        
        pb = treedict.getTree(tn)

        pb.makeBranch('a.b')
        p = pb.a.b.copy()

        p["c.d"] = 1

        def f():
            treedict.addConstraint(tn, 'a.b.c.d.v', [1], "not 1")
            
        self.assertRaises(ValueError, f)

        # control
        treedict.addConstraint(tn, 'a.b.c.d', [1], "not 1")
    def testConstraint_15_no_change_on_failure(self):
        tn = unique_name()
        
        p = getTree(tn)
        p.b   = 123
        p.c.b = 'bork'
        
        p1 = p.copy()

        treedict.addConstraint(tn, 'a.b.c.d', [1], "not 1")

        def f():
            p["a.b.c.d"] = 2
            
        self.assertRaises(ValueError, f)

        self.assert_(p == p1)
    def testConstraint_18_copying_original_tracks_constraints_01_after(self):

        tn = unique_name()
        bn = unique_name()
        
        p1 = getTree(tn)
        p2 = p1.copy()

        p2[bn] = 2

        # Should throw
        def f():
            treedict.addConstraint(tn, bn, [1], "not 1")

        self.assertRaises(ValueError, f)

        # The control; should pass
        treedict.addConstraint(tn, bn, [2], "not 2")
    def testConstraint_10_copying_02(self):
        tn, bn = unique_name(), unique_name()

        p1 = getTree(tn)
        p1c = p1.makeBranch(bn).copy()
        p2 = getTree(bn)
        
        treedict.addConstraint(bn, 'a', [1], "not 1")

        # Should work fine; not part of p2's family
        p1c.a = 2
        self.assert_(p1c.branchName() == bn)
        
        # Should throw, cause it's part of p2's family
        def f(): p2.a = 2

        self.assertRaises(ValueError, f)

        # Shouldn't throw, it passes
        p2.a = 1
    def testConstraint_29_Links_deeper_reference(self):
        tn = unique_name()
        p = treedict.getTree(tn)
        treedict.addConstraint(tn, 'l1.v', [1], "not 1")

        p.l1 = p.l2
        p.l2 = p.l3
        p.l3 = p.l4
        p.l4 = p.l5
        p.l5 = p.l6
        p.l6 = p.l7

        p.l7.v = 1

        self.assert_(p.l1.v == 1)
        self.assert_(p.l2.v == 1)
        self.assert_(p.l3.v == 1)
        self.assert_(p.l4.v == 1)
        self.assert_(p.l5.v == 1)
        self.assert_(p.l6.v == 1)
        self.assert_(p.l7.v == 1)
    def testConstraint_18_copying_original_tracks_constraints_02_after(self):

        tn = unique_name()
        bn = unique_name()
        
        p = getTree(tn)
        p.a = 1
        p.b = 2

        for i in range(1000):
            p = p.copy(deep = True)

        p[bn] = 2
            
        # Should throw
        def f():
            treedict.addConstraint(tn, bn, [1], "not 1")

        self.assertRaises(ValueError, f)

        # The control; should pass
        treedict.addConstraint(tn, bn, [2], "not 2")
    def testConstraint_10_copying_01(self):

        tn, bn = unique_name(), unique_name()

        p1 = getTree(tn)
        p1.makeBranch(bn)

        p2 = getTree(bn)
        p1c = p1[bn].copy()

        treedict.addConstraint(tn, bn +'.a', [1], "not 1")
        
        # Should work
        p2.a = 2

        def f():
            # Should throw, cause it's part of p1's family
            p1c.a = 2

        self.assertRaises(ValueError, f)

        # Shouldn't throw, cause it passes
        p1c.a = 1
 def f():
     treedict.addConstraint(tn, 'a.b.c.d.v', [1], "not 1")
 def f():
     treedict.addConstraint(tn, bn, [1], "not 1")
        def f(): treedict.addConstraint(bn, 'a', [1], "not 1")

        self.assertRaises(ValueError, f)