|
|
#!/usr/bin/env python
|
|
|
# encoding: utf-8
|
|
|
"""
|
|
|
Tests for IPython.core.component
|
|
|
|
|
|
Authors:
|
|
|
|
|
|
* Brian Granger
|
|
|
* Fernando Perez (design help)
|
|
|
"""
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
# Copyright (C) 2008-2009 The IPython Development Team
|
|
|
#
|
|
|
# Distributed under the terms of the BSD License. The full license is in
|
|
|
# the file COPYING, distributed as part of this software.
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
# Imports
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
|
from unittest import TestCase
|
|
|
|
|
|
from IPython.core.component import Component, ComponentError
|
|
|
from IPython.utils.traitlets import (
|
|
|
TraitError, Int, Float, Str
|
|
|
)
|
|
|
from IPython.config.loader import Config
|
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
# Test cases
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
class TestComponentMeta(TestCase):
|
|
|
|
|
|
def test_get_instances(self):
|
|
|
class BaseComponent(Component):
|
|
|
pass
|
|
|
c1 = BaseComponent(None)
|
|
|
c2 = BaseComponent(c1)
|
|
|
self.assertEquals(BaseComponent.get_instances(),[c1,c2])
|
|
|
|
|
|
def test_get_instances_subclass(self):
|
|
|
class MyComponent(Component):
|
|
|
pass
|
|
|
class MyOtherComponent(MyComponent):
|
|
|
pass
|
|
|
c1 = MyComponent(None)
|
|
|
c2 = MyOtherComponent(c1)
|
|
|
c3 = MyOtherComponent(c2)
|
|
|
self.assertEquals(MyComponent.get_instances(), [c1, c2, c3])
|
|
|
self.assertEquals(MyOtherComponent.get_instances(), [c2, c3])
|
|
|
|
|
|
def test_get_instances_root(self):
|
|
|
class MyComponent(Component):
|
|
|
pass
|
|
|
class MyOtherComponent(MyComponent):
|
|
|
pass
|
|
|
c1 = MyComponent(None)
|
|
|
c2 = MyOtherComponent(c1)
|
|
|
c3 = MyOtherComponent(c2)
|
|
|
c4 = MyComponent(None)
|
|
|
c5 = MyComponent(c4)
|
|
|
self.assertEquals(MyComponent.get_instances(root=c1), [c1, c2, c3])
|
|
|
self.assertEquals(MyComponent.get_instances(root=c4), [c4, c5])
|
|
|
|
|
|
|
|
|
class TestComponent(TestCase):
|
|
|
|
|
|
def test_parent_child(self):
|
|
|
c1 = Component(None)
|
|
|
c2 = Component(c1)
|
|
|
c3 = Component(c1)
|
|
|
c4 = Component(c3)
|
|
|
self.assertEquals(c1.parent, None)
|
|
|
self.assertEquals(c2.parent, c1)
|
|
|
self.assertEquals(c3.parent, c1)
|
|
|
self.assertEquals(c4.parent, c3)
|
|
|
self.assertEquals(c1.children, [c2, c3])
|
|
|
self.assertEquals(c2.children, [])
|
|
|
self.assertEquals(c3.children, [c4])
|
|
|
self.assertEquals(c4.children, [])
|
|
|
|
|
|
def test_root(self):
|
|
|
c1 = Component(None)
|
|
|
c2 = Component(c1)
|
|
|
c3 = Component(c1)
|
|
|
c4 = Component(c3)
|
|
|
self.assertEquals(c1.root, c1.root)
|
|
|
self.assertEquals(c2.root, c1)
|
|
|
self.assertEquals(c3.root, c1)
|
|
|
self.assertEquals(c4.root, c1)
|
|
|
|
|
|
def test_change_parent(self):
|
|
|
c1 = Component(None)
|
|
|
c2 = Component(None)
|
|
|
c3 = Component(c1)
|
|
|
self.assertEquals(c3.root, c1)
|
|
|
self.assertEquals(c3.parent, c1)
|
|
|
self.assertEquals(c1.children,[c3])
|
|
|
c3.parent = c2
|
|
|
self.assertEquals(c3.root, c2)
|
|
|
self.assertEquals(c3.parent, c2)
|
|
|
self.assertEquals(c2.children,[c3])
|
|
|
self.assertEquals(c1.children,[])
|
|
|
|
|
|
def test_subclass_parent(self):
|
|
|
c1 = Component(None)
|
|
|
self.assertRaises(TraitError, setattr, c1, 'parent', 10)
|
|
|
|
|
|
class MyComponent(Component):
|
|
|
pass
|
|
|
c1 = Component(None)
|
|
|
c2 = MyComponent(c1)
|
|
|
self.assertEquals(MyComponent.parent.this_class, Component)
|
|
|
self.assertEquals(c2.parent, c1)
|
|
|
|
|
|
def test_bad_root(self):
|
|
|
c1 = Component(None)
|
|
|
c2 = Component(None)
|
|
|
c3 = Component(None)
|
|
|
self.assertRaises(ComponentError, setattr, c1, 'root', c2)
|
|
|
c1.parent = c2
|
|
|
self.assertEquals(c1.root, c2)
|
|
|
self.assertRaises(ComponentError, setattr, c1, 'root', c3)
|
|
|
|
|
|
|
|
|
class TestComponentConfig(TestCase):
|
|
|
|
|
|
def test_default(self):
|
|
|
c1 = Component(None)
|
|
|
c2 = Component(c1)
|
|
|
c3 = Component(c2)
|
|
|
self.assertEquals(c1.config, c2.config)
|
|
|
self.assertEquals(c2.config, c3.config)
|
|
|
|
|
|
def test_custom(self):
|
|
|
config = Config()
|
|
|
config.foo = 'foo'
|
|
|
config.bar = 'bar'
|
|
|
c1 = Component(None, config=config)
|
|
|
c2 = Component(c1)
|
|
|
c3 = Component(c2)
|
|
|
self.assertEquals(c1.config, config)
|
|
|
self.assertEquals(c2.config, config)
|
|
|
self.assertEquals(c3.config, config)
|
|
|
# Test that copies are not made
|
|
|
self.assert_(c1.config is config)
|
|
|
self.assert_(c2.config is config)
|
|
|
self.assert_(c3.config is config)
|
|
|
self.assert_(c1.config is c2.config)
|
|
|
self.assert_(c2.config is c3.config)
|
|
|
|
|
|
def test_inheritance(self):
|
|
|
class MyComponent(Component):
|
|
|
a = Int(1, config=True)
|
|
|
b = Float(1.0, config=True)
|
|
|
c = Str('no config')
|
|
|
config = Config()
|
|
|
config.MyComponent.a = 2
|
|
|
config.MyComponent.b = 2.0
|
|
|
c1 = MyComponent(None, config=config)
|
|
|
c2 = MyComponent(c1)
|
|
|
self.assertEquals(c1.a, config.MyComponent.a)
|
|
|
self.assertEquals(c1.b, config.MyComponent.b)
|
|
|
self.assertEquals(c2.a, config.MyComponent.a)
|
|
|
self.assertEquals(c2.b, config.MyComponent.b)
|
|
|
c4 = MyComponent(c2, config=Config())
|
|
|
self.assertEquals(c4.a, 1)
|
|
|
self.assertEquals(c4.b, 1.0)
|
|
|
|
|
|
def test_parent(self):
|
|
|
class Foo(Component):
|
|
|
a = Int(0, config=True)
|
|
|
b = Str('nope', config=True)
|
|
|
class Bar(Foo):
|
|
|
b = Str('gotit', config=False)
|
|
|
c = Float(config=True)
|
|
|
config = Config()
|
|
|
config.Foo.a = 10
|
|
|
config.Foo.b = "wow"
|
|
|
config.Bar.b = 'later'
|
|
|
config.Bar.c = 100.0
|
|
|
f = Foo(None, config=config)
|
|
|
b = Bar(f)
|
|
|
self.assertEquals(f.a, 10)
|
|
|
self.assertEquals(f.b, 'wow')
|
|
|
self.assertEquals(b.b, 'gotit')
|
|
|
self.assertEquals(b.c, 100.0)
|
|
|
|
|
|
|
|
|
class TestComponentName(TestCase):
|
|
|
|
|
|
def test_default(self):
|
|
|
class MyComponent(Component):
|
|
|
pass
|
|
|
c1 = Component(None)
|
|
|
c2 = MyComponent(None)
|
|
|
c3 = Component(c2)
|
|
|
self.assertNotEquals(c1.name, c2.name)
|
|
|
self.assertNotEquals(c1.name, c3.name)
|
|
|
|
|
|
def test_manual(self):
|
|
|
class MyComponent(Component):
|
|
|
pass
|
|
|
c1 = Component(None, name='foo')
|
|
|
c2 = MyComponent(None, name='bar')
|
|
|
c3 = Component(c2, name='bah')
|
|
|
self.assertEquals(c1.name, 'foo')
|
|
|
self.assertEquals(c2.name, 'bar')
|
|
|
self.assertEquals(c3.name, 'bah')
|
|
|
|