~bzr-pqm/bzr/bzr.dev

1551.2.27 by Aaron Bentley
Got propogation under test
1
# Copyright (C) 2006 by Canonical Ltd
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
1551.2.28 by Aaron Bentley
Ensure all ProgressBar implementations can be used as parents
17
from StringIO import StringIO
18
19
from bzrlib.progress import *
1551.2.27 by Aaron Bentley
Got propogation under test
20
from bzrlib.tests import TestCase
21
1551.2.29 by Aaron Bentley
Got stack handling under test
22
class FakeStack:
23
    def __init__(self, top):
24
        self.__top = top
25
26
    def top(self):
27
        return self.__top
28
1551.2.27 by Aaron Bentley
Got propogation under test
29
class TestProgress(TestCase):
30
    def setUp(self):
1551.2.29 by Aaron Bentley
Got stack handling under test
31
        q = DummyProgress()
32
        self.top = ChildProgress(_stack=FakeStack(q))
1551.2.27 by Aaron Bentley
Got propogation under test
33
34
    def test_propogation(self):
35
        self.top.update('foobles', 1, 2)
36
        self.assertEqual(self.top.message, 'foobles')
37
        self.assertEqual(self.top.current, 1)
38
        self.assertEqual(self.top.total, 2)
39
        self.assertEqual(self.top.child_fraction, 0)
1551.2.29 by Aaron Bentley
Got stack handling under test
40
        child = ChildProgress(_stack=FakeStack(self.top))
1551.2.27 by Aaron Bentley
Got propogation under test
41
        child.update('baubles', 2, 4)
42
        self.assertEqual(self.top.message, 'foobles')
43
        self.assertEqual(self.top.current, 1)
44
        self.assertEqual(self.top.total, 2)
45
        self.assertEqual(self.top.child_fraction, 0.5)
1551.2.29 by Aaron Bentley
Got stack handling under test
46
        grandchild = ChildProgress(_stack=FakeStack(child))
1551.2.27 by Aaron Bentley
Got propogation under test
47
        grandchild.update('barbells', 1, 2)
48
        self.assertEqual(self.top.child_fraction, 0.625)
49
        self.assertEqual(child.child_fraction, 0.5)
50
        child.update('baubles', 3, 4)
51
        self.assertEqual(child.child_fraction, 0)
52
        self.assertEqual(self.top.child_fraction, 0.75)
53
        grandchild.update('barbells', 1, 2)
54
        self.assertEqual(self.top.child_fraction, 0.875)
55
        grandchild.update('barbells', 2, 2)
56
        self.assertEqual(self.top.child_fraction, 1)
57
        child.update('baubles', 4, 4)
58
        self.assertEqual(self.top.child_fraction, 1)
59
        #test clamping
60
        grandchild.update('barbells', 2, 2)
61
        self.assertEqual(self.top.child_fraction, 1)
1551.2.28 by Aaron Bentley
Ensure all ProgressBar implementations can be used as parents
62
63
    def test_implementations(self):
64
        for implementation in (TTYProgressBar, DotsProgressBar, 
65
                               DummyProgress):
66
            self.check_parent_handling(implementation)
67
68
    def check_parent_handling(self, parentclass):
69
        top = parentclass(to_file=StringIO())
70
        top.update('foobles', 1, 2)
1551.2.29 by Aaron Bentley
Got stack handling under test
71
        child = ChildProgress(_stack=FakeStack(top))
1551.2.28 by Aaron Bentley
Ensure all ProgressBar implementations can be used as parents
72
        child.update('baubles', 4, 4)
73
        top.update('lala', 2, 2)
74
        child.update('baubles', 4, 4)
1551.2.29 by Aaron Bentley
Got stack handling under test
75
76
    def test_stacking(self):
77
        self.check_stack(TTYProgressBar, ChildProgress)
78
        self.check_stack(DotsProgressBar, ChildProgress)
79
        self.check_stack(DummyProgress, DummyProgress)
80
81
    def check_stack(self, parent_class, child_class):
82
        stack = ProgressBarStack(klass=parent_class, to_file=StringIO())
83
        parent = stack.get_nested()
84
        try:
85
            self.assertIs(parent.__class__, parent_class)
86
            child = stack.get_nested()
87
            try:
88
                self.assertIs(child.__class__, child_class)
89
            finally:
90
                child.finished()
91
        finally:
92
            parent.finished()