1001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchakaimport timeit
2001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchakaimport unittest
3001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchakaimport sys
4001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchakafrom StringIO import StringIO
5001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchakaimport time
6001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchakafrom textwrap import dedent
7001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
809d7e7ec0e277db87104b77254d9c323ed6e6df1Serhiy Storchakafrom test.test_support import run_unittest
909d7e7ec0e277db87104b77254d9c323ed6e6df1Serhiy Storchakafrom test.test_support import captured_stdout
1009d7e7ec0e277db87104b77254d9c323ed6e6df1Serhiy Storchakafrom test.test_support import captured_stderr
11001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
12001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka# timeit's default number of iterations.
13001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy StorchakaDEFAULT_NUMBER = 1000000
14001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
15001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka# timeit's default number of repetitions.
16001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy StorchakaDEFAULT_REPEAT = 3
17001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
18001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka# XXX: some tests are commented out that would improve the coverage but take a
19001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka# long time to run because they test the default number of loops, which is
20001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka# large.  The tests could be enabled if there was a way to override the default
21001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka# number of loops during testing, but this would require changing the signature
22001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka# of some functions that use the default as a default argument.
23001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
24001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchakaclass FakeTimer:
25001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    BASE_TIME = 42.0
26001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def __init__(self, seconds_per_increment=1.0):
27001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.count = 0
28001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.setup_calls = 0
29001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.seconds_per_increment=seconds_per_increment
30001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        timeit._fake_timer = self
31001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
32001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def __call__(self):
33001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        return self.BASE_TIME + self.count * self.seconds_per_increment
34001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
35001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def inc(self):
36001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.count += 1
37001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
38001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def setup(self):
39001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.setup_calls += 1
40001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
41001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def wrap_timer(self, timer):
42001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        """Records 'timer' and returns self as callable timer."""
43001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.saved_timer = timer
44001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        return self
45001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
46001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchakaclass TestTimeit(unittest.TestCase):
47001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
48001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def tearDown(self):
49001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        try:
50001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka            del timeit._fake_timer
51001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        except AttributeError:
52001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka            pass
53001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
54001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_reindent_empty(self):
55001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(timeit.reindent("", 0), "")
56001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(timeit.reindent("", 4), "")
57001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
58001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_reindent_single(self):
59001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(timeit.reindent("pass", 0), "pass")
60001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(timeit.reindent("pass", 4), "pass")
61001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
62001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_reindent_multi_empty(self):
63001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(timeit.reindent("\n\n", 0), "\n\n")
64001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(timeit.reindent("\n\n", 4), "\n    \n    ")
65001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
66001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_reindent_multi(self):
67001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(timeit.reindent(
68001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka            "print()\npass\nbreak", 0),
69001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka            "print()\npass\nbreak")
70001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(timeit.reindent(
71001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka            "print()\npass\nbreak", 4),
72001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka            "print()\n    pass\n    break")
73001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
74001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_timer_invalid_stmt(self):
75001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertRaises(ValueError, timeit.Timer, stmt=None)
7673c086389a81f81d20a9f87eb95cebd15b6ced58Serhiy Storchaka        self.assertRaises(SyntaxError, timeit.Timer, stmt='return')
7773c086389a81f81d20a9f87eb95cebd15b6ced58Serhiy Storchaka        self.assertRaises(SyntaxError, timeit.Timer, stmt='yield')
7873c086389a81f81d20a9f87eb95cebd15b6ced58Serhiy Storchaka        self.assertRaises(SyntaxError, timeit.Timer, stmt='break')
7973c086389a81f81d20a9f87eb95cebd15b6ced58Serhiy Storchaka        self.assertRaises(SyntaxError, timeit.Timer, stmt='continue')
80001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
81001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_timer_invalid_setup(self):
82001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertRaises(ValueError, timeit.Timer, setup=None)
8373c086389a81f81d20a9f87eb95cebd15b6ced58Serhiy Storchaka        self.assertRaises(SyntaxError, timeit.Timer, setup='return')
8473c086389a81f81d20a9f87eb95cebd15b6ced58Serhiy Storchaka        self.assertRaises(SyntaxError, timeit.Timer, setup='yield')
8573c086389a81f81d20a9f87eb95cebd15b6ced58Serhiy Storchaka        self.assertRaises(SyntaxError, timeit.Timer, setup='break')
8673c086389a81f81d20a9f87eb95cebd15b6ced58Serhiy Storchaka        self.assertRaises(SyntaxError, timeit.Timer, setup='continue')
87001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
88001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    fake_setup = "import timeit; timeit._fake_timer.setup()"
89001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    fake_stmt = "import timeit; timeit._fake_timer.inc()"
90001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
91001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def fake_callable_setup(self):
92001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.fake_timer.setup()
93001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
94001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def fake_callable_stmt(self):
95001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.fake_timer.inc()
96001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
97001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def timeit(self, stmt, setup, number=None):
98001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.fake_timer = FakeTimer()
99001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        t = timeit.Timer(stmt=stmt, setup=setup, timer=self.fake_timer)
100001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        kwargs = {}
101001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        if number is None:
102001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka            number = DEFAULT_NUMBER
103001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        else:
104001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka            kwargs['number'] = number
105001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        delta_time = t.timeit(**kwargs)
106001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(self.fake_timer.setup_calls, 1)
107001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(self.fake_timer.count, number)
108001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(delta_time, number)
109001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
110001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    # Takes too long to run in debug build.
111001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    #def test_timeit_default_iters(self):
112001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    #    self.timeit(self.fake_stmt, self.fake_setup)
113001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
114001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_timeit_zero_iters(self):
115001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.timeit(self.fake_stmt, self.fake_setup, number=0)
116001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
117001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_timeit_few_iters(self):
118001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.timeit(self.fake_stmt, self.fake_setup, number=3)
119001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
120001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_timeit_callable_stmt(self):
121001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.timeit(self.fake_callable_stmt, self.fake_setup, number=3)
122001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
12359ea508bb84006b8e93ff036aa8d9f0a3fa232c7Serhiy Storchaka    def test_timeit_callable_setup(self):
12459ea508bb84006b8e93ff036aa8d9f0a3fa232c7Serhiy Storchaka        self.timeit(self.fake_stmt, self.fake_callable_setup, number=3)
12559ea508bb84006b8e93ff036aa8d9f0a3fa232c7Serhiy Storchaka
126001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_timeit_callable_stmt_and_setup(self):
127001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.timeit(self.fake_callable_stmt,
128001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka                self.fake_callable_setup, number=3)
129001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
130001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    # Takes too long to run in debug build.
131001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    #def test_timeit_function(self):
132001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    #    delta_time = timeit.timeit(self.fake_stmt, self.fake_setup,
133001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    #            timer=FakeTimer())
134001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    #    self.assertEqual(delta_time, DEFAULT_NUMBER)
135001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
136001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_timeit_function_zero_iters(self):
137001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        delta_time = timeit.timeit(self.fake_stmt, self.fake_setup, number=0,
138001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka                timer=FakeTimer())
139001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(delta_time, 0)
140001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
141001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def repeat(self, stmt, setup, repeat=None, number=None):
142001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.fake_timer = FakeTimer()
143001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        t = timeit.Timer(stmt=stmt, setup=setup, timer=self.fake_timer)
144001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        kwargs = {}
145001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        if repeat is None:
146001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka            repeat = DEFAULT_REPEAT
147001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        else:
148001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka            kwargs['repeat'] = repeat
149001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        if number is None:
150001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka            number = DEFAULT_NUMBER
151001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        else:
152001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka            kwargs['number'] = number
153001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        delta_times = t.repeat(**kwargs)
154001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(self.fake_timer.setup_calls, repeat)
155001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(self.fake_timer.count, repeat * number)
156001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(delta_times, repeat * [float(number)])
157001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
158001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    # Takes too long to run in debug build.
159001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    #def test_repeat_default(self):
160001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    #    self.repeat(self.fake_stmt, self.fake_setup)
161001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
162001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_repeat_zero_reps(self):
163001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.repeat(self.fake_stmt, self.fake_setup, repeat=0)
164001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
165001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_repeat_zero_iters(self):
166001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.repeat(self.fake_stmt, self.fake_setup, number=0)
167001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
168001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_repeat_few_reps_and_iters(self):
169001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.repeat(self.fake_stmt, self.fake_setup, repeat=3, number=5)
170001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
171001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_repeat_callable_stmt(self):
172001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.repeat(self.fake_callable_stmt, self.fake_setup,
173001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka                repeat=3, number=5)
174001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
17559ea508bb84006b8e93ff036aa8d9f0a3fa232c7Serhiy Storchaka    def test_repeat_callable_setup(self):
17659ea508bb84006b8e93ff036aa8d9f0a3fa232c7Serhiy Storchaka        self.repeat(self.fake_stmt, self.fake_callable_setup,
17759ea508bb84006b8e93ff036aa8d9f0a3fa232c7Serhiy Storchaka                repeat=3, number=5)
17859ea508bb84006b8e93ff036aa8d9f0a3fa232c7Serhiy Storchaka
179001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_repeat_callable_stmt_and_setup(self):
180001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.repeat(self.fake_callable_stmt, self.fake_callable_setup,
181001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka                repeat=3, number=5)
182001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
183001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    # Takes too long to run in debug build.
184001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    #def test_repeat_function(self):
185001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    #    delta_times = timeit.repeat(self.fake_stmt, self.fake_setup,
186001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    #            timer=FakeTimer())
187001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    #    self.assertEqual(delta_times, DEFAULT_REPEAT * [float(DEFAULT_NUMBER)])
188001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
189001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_repeat_function_zero_reps(self):
190001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        delta_times = timeit.repeat(self.fake_stmt, self.fake_setup, repeat=0,
191001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka                timer=FakeTimer())
192001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(delta_times, [])
193001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
194001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_repeat_function_zero_iters(self):
195001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        delta_times = timeit.repeat(self.fake_stmt, self.fake_setup, number=0,
196001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka                timer=FakeTimer())
197001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(delta_times, DEFAULT_REPEAT * [0.0])
198001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
199001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def assert_exc_string(self, exc_string, expected_exc_name):
200001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        exc_lines = exc_string.splitlines()
201001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertGreater(len(exc_lines), 2)
202001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertTrue(exc_lines[0].startswith('Traceback'))
203001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertTrue(exc_lines[-1].startswith(expected_exc_name))
204001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
205001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_print_exc(self):
206001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        s = StringIO()
2075312a7f912088361e2a1fccd5daeaa9dc4ff5fd3Serhiy Storchaka        t = timeit.Timer("1.0/0.0")
208001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        try:
209001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka            t.timeit()
210001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        except:
211001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka            t.print_exc(s)
212001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assert_exc_string(s.getvalue(), 'ZeroDivisionError')
213001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
214001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    MAIN_DEFAULT_OUTPUT = "10 loops, best of 3: 1 sec per loop\n"
215001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
216001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def run_main(self, seconds_per_increment=1.0, switches=None, timer=None):
217001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        if timer is None:
218001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka            timer = FakeTimer(seconds_per_increment=seconds_per_increment)
219001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        if switches is None:
220001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka            args = []
221001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        else:
222001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka            args = switches[:]
223001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        args.append(self.fake_stmt)
224001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        # timeit.main() modifies sys.path, so save and restore it.
225001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        orig_sys_path = sys.path[:]
226001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        with captured_stdout() as s:
227001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka            timeit.main(args=args, _wrap_timer=timer.wrap_timer)
228001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        sys.path[:] = orig_sys_path[:]
229001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        return s.getvalue()
230001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
231001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_main_bad_switch(self):
232001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        s = self.run_main(switches=['--bad-switch'])
233001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(s, dedent("""\
234001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka            option --bad-switch not recognized
235001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka            use -h/--help for command line help
236001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka            """))
237001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
238001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_main_seconds(self):
239001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        s = self.run_main(seconds_per_increment=5.5)
240001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(s, "10 loops, best of 3: 5.5 sec per loop\n")
241001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
242001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_main_milliseconds(self):
243001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        s = self.run_main(seconds_per_increment=0.0055)
244001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(s, "100 loops, best of 3: 5.5 msec per loop\n")
245001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
246001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_main_microseconds(self):
247001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        s = self.run_main(seconds_per_increment=0.0000025, switches=['-n100'])
248001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(s, "100 loops, best of 3: 2.5 usec per loop\n")
249001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
250001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_main_fixed_iters(self):
251001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        s = self.run_main(seconds_per_increment=2.0, switches=['-n35'])
252001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(s, "35 loops, best of 3: 2 sec per loop\n")
253001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
254001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_main_setup(self):
255001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        s = self.run_main(seconds_per_increment=2.0,
256001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka                switches=['-n35', '-s', 'print("CustomSetup")'])
257001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(s, "CustomSetup\n" * 3 +
258001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka                "35 loops, best of 3: 2 sec per loop\n")
259001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
260001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_main_fixed_reps(self):
261001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        s = self.run_main(seconds_per_increment=60.0, switches=['-r9'])
262001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(s, "10 loops, best of 9: 60 sec per loop\n")
263001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
264001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_main_negative_reps(self):
265001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        s = self.run_main(seconds_per_increment=60.0, switches=['-r-5'])
266001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(s, "10 loops, best of 1: 60 sec per loop\n")
267001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
268001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    @unittest.skipIf(sys.flags.optimize >= 2, "need __doc__")
269001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_main_help(self):
270001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        s = self.run_main(switches=['-h'])
271001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(s, timeit.__doc__)
272001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
273001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_main_using_time(self):
274001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        fake_timer = FakeTimer()
275001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        s = self.run_main(switches=['-t'], timer=fake_timer)
276001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(s, self.MAIN_DEFAULT_OUTPUT)
277001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertIs(fake_timer.saved_timer, time.time)
278001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
279001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_main_using_clock(self):
280001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        fake_timer = FakeTimer()
281001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        s = self.run_main(switches=['-c'], timer=fake_timer)
282001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(s, self.MAIN_DEFAULT_OUTPUT)
283001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertIs(fake_timer.saved_timer, time.clock)
284001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
285001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_main_verbose(self):
286001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        s = self.run_main(switches=['-v'])
287001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(s, dedent("""\
288001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka                10 loops -> 10 secs
289001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka                raw times: 10 10 10
290001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka                10 loops, best of 3: 1 sec per loop
291001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka            """))
292001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
293001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_main_very_verbose(self):
294001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        s = self.run_main(seconds_per_increment=0.000050, switches=['-vv'])
295001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assertEqual(s, dedent("""\
296001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka                10 loops -> 0.0005 secs
297001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka                100 loops -> 0.005 secs
298001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka                1000 loops -> 0.05 secs
299001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka                10000 loops -> 0.5 secs
300001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka                raw times: 0.5 0.5 0.5
301001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka                10000 loops, best of 3: 50 usec per loop
302001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka            """))
303001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
304001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_main_exception(self):
305001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        with captured_stderr() as error_stringio:
306b84e5daf915296984d46f8fe44547e7bc2924700Serhiy Storchaka            s = self.run_main(switches=['1.0/0.0'])
307001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assert_exc_string(error_stringio.getvalue(), 'ZeroDivisionError')
308001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
309001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    def test_main_exception_fixed_reps(self):
310001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        with captured_stderr() as error_stringio:
311b84e5daf915296984d46f8fe44547e7bc2924700Serhiy Storchaka            s = self.run_main(switches=['-n1', '1.0/0.0'])
312001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka        self.assert_exc_string(error_stringio.getvalue(), 'ZeroDivisionError')
313001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
314001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
315001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchakadef test_main():
316001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    run_unittest(TestTimeit)
317001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka
318001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchakaif __name__ == '__main__':
319001320720090976b8a44b2aaf7c5a10ce66f40b9Serhiy Storchaka    test_main()
320