]> git.friedersdorff.com Git - max/python_unittesting.git/blob - README.pdf
Add README that outlines unittesting
[max/python_unittesting.git] / README.pdf
1 %PDF-1.4
2 %\93\8c\8b\9e ReportLab Generated PDF document http://www.reportlab.com
3 1 0 obj
4 <<
5 /F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 5 0 R /F5 6 0 R /F6 9 0 R
6 >>
7 endobj
8 2 0 obj
9 <<
10 /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
11 >>
12 endobj
13 3 0 obj
14 <<
15 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
16 >>
17 endobj
18 4 0 obj
19 <<
20 /BaseFont /Courier-Bold /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
21 >>
22 endobj
23 5 0 obj
24 <<
25 /BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
26 >>
27 endobj
28 6 0 obj
29 <<
30 /BaseFont /Courier-Oblique /Encoding /WinAnsiEncoding /Name /F5 /Subtype /Type1 /Type /Font
31 >>
32 endobj
33 7 0 obj
34 <<
35 /Contents 19 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 18 0 R /Resources <<
36 /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
37 >> /Rotate 0 /Trans <<
38
39 >> 
40   /Type /Page
41 >>
42 endobj
43 8 0 obj
44 <<
45 /A <<
46 /S /URI /Type /Action /URI (https://projecteuler.net/project/resources/p102_triangles.txt)
47 >> /Border [ 0 0 0 ] /Rect [ 62.69291 717.0236 209.4129 729.0236 ] /Subtype /Link /Type /Annot
48 >>
49 endobj
50 9 0 obj
51 <<
52 /BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F6 /Subtype /Type1 /Type /Font
53 >>
54 endobj
55 10 0 obj
56 <<
57 /Annots [ 8 0 R ] /Contents 20 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 18 0 R /Resources <<
58 /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
59 >> /Rotate 0 
60   /Trans <<
61
62 >> /Type /Page
63 >>
64 endobj
65 11 0 obj
66 <<
67 /Outlines 13 0 R /PageLabels 21 0 R /PageMode /UseNone /Pages 18 0 R /Type /Catalog
68 >>
69 endobj
70 12 0 obj
71 <<
72 /Author () /CreationDate (D:20190313201115+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20190313201115+00'00') /Producer (ReportLab PDF Library - www.reportlab.com) 
73   /Subject (\(unspecified\)) /Title (Unit testing) /Trapped /False
74 >>
75 endobj
76 13 0 obj
77 <<
78 /Count 4 /First 14 0 R /Last 17 0 R /Type /Outlines
79 >>
80 endobj
81 14 0 obj
82 <<
83 /Dest [ 7 0 R /XYZ 62.69291 439.8236 0 ] /Next 15 0 R /Parent 13 0 R /Title (Why)
84 >>
85 endobj
86 15 0 obj
87 <<
88 /Dest [ 7 0 R /XYZ 62.69291 292.8236 0 ] /Next 16 0 R /Parent 13 0 R /Prev 14 0 R /Title (How)
89 >>
90 endobj
91 16 0 obj
92 <<
93 /Dest [ 7 0 R /XYZ 62.69291 187.8236 0 ] /Next 17 0 R /Parent 13 0 R /Prev 15 0 R /Title (What)
94 >>
95 endobj
96 17 0 obj
97 <<
98 /Dest [ 10 0 R /XYZ 62.69291 705.0236 0 ] /Parent 13 0 R /Prev 16 0 R /Title (Test driven development)
99 >>
100 endobj
101 18 0 obj
102 <<
103 /Count 2 /Kids [ 7 0 R 10 0 R ] /Type /Pages
104 >>
105 endobj
106 19 0 obj
107 <<
108 /Length 10422
109 >>
110 stream
111 1 0 0 1 0 0 cm  BT /F1 12 Tf 14.4 TL ET
112 q
113 1 0 0 1 62.69291 741.0236 cm
114 q
115 BT 1 0 0 1 0 4 Tm 179.9449 0 Td 24 TL /F2 20 Tf 0 0 0 rg (Unit testing) Tj T* -179.9449 0 Td ET
116 Q
117 Q
118 q
119 1 0 0 1 62.69291 695.0236 cm
120 q
121 BT 1 0 0 1 0 26 Tm 3.17248 Tw 12 TL /F1 10 Tf 0 0 0 rg (Unit testing means testing small portions \(individual functions, modules, classes\) of your program,) Tj T* 0 Tw .411654 Tw (independently of the rest, in an automated fashion. The tests usually consist of a set of functions that are) Tj T* 0 Tw (distributed along with the rest of the source code.) Tj T* ET
122 Q
123 Q
124 q
125 1 0 0 1 62.69291 641.0236 cm
126 q
127 0 0 0 rg
128 BT 1 0 0 1 0 38 Tm /F1 10 Tf 12 TL 2.051654 Tw (Each test will call part of the main source code, usually with some dummy data, and verify that the) Tj T* 0 Tw -0.101512 Tw (behaviour of the code is as expected. It is typical to test a few edge cases and boundary conditions in such) Tj T* 0 Tw .848735 Tw (a way. A primitive attempt to test a python function, that implements a mathematical function might look) Tj T* 0 Tw (like this:) Tj T* ET
129 Q
130 Q
131 q
132 1 0 0 1 62.69291 451.8236 cm
133 q
134 q
135 1 0 0 1 0 0 cm
136 q
137 1 0 0 1 6.6 6.6 cm
138 q
139 .662745 .662745 .662745 RG
140 .5 w
141 .960784 .960784 .862745 rg
142 n -6 -6 468.6898 180 re B*
143 Q
144 q
145 .960784 .960784 .862745 rg
146 n 0 156 18 12 re f*
147 .960784 .960784 .862745 rg
148 n 24 156 72 12 re f*
149 .960784 .960784 .862745 rg
150 n 96 156 6 12 re f*
151 .960784 .960784 .862745 rg
152 n 102 156 6 12 re f*
153 .960784 .960784 .862745 rg
154 n 108 156 12 12 re f*
155 .960784 .960784 .862745 rg
156 n 18 144 432 12 re f*
157 .960784 .960784 .862745 rg
158 n 0 132 306 12 re f*
159 .960784 .960784 .862745 rg
160 n 18 120 24 12 re f*
161 .960784 .960784 .862745 rg
162 n 48 120 24 12 re f*
163 .960784 .960784 .862745 rg
164 n 78 120 36 12 re f*
165 .960784 .960784 .862745 rg
166 n 120 120 12 12 re f*
167 .960784 .960784 .862745 rg
168 n 132 120 6 12 re f*
169 .960784 .960784 .862745 rg
170 n 138 120 18 12 re f*
171 .960784 .960784 .862745 rg
172 n 18 108 36 12 re f*
173 .960784 .960784 .862745 rg
174 n 60 108 18 12 re f*
175 .960784 .960784 .862745 rg
176 n 78 108 6 12 re f*
177 .960784 .960784 .862745 rg
178 n 84 108 6 12 re f*
179 .960784 .960784 .862745 rg
180 n 90 108 6 12 re f*
181 .960784 .960784 .862745 rg
182 n 96 108 6 12 re f*
183 .960784 .960784 .862745 rg
184 n 102 108 12 12 re f*
185 .960784 .960784 .862745 rg
186 n 114 108 6 12 re f*
187 .960784 .960784 .862745 rg
188 n 120 108 18 12 re f*
189 .960784 .960784 .862745 rg
190 n 138 108 12 12 re f*
191 .960784 .960784 .862745 rg
192 n 0 84 18 12 re f*
193 .960784 .960784 .862745 rg
194 n 24 84 96 12 re f*
195 .960784 .960784 .862745 rg
196 n 120 84 18 12 re f*
197 .960784 .960784 .862745 rg
198 n 18 72 36 12 re f*
199 .960784 .960784 .862745 rg
200 n 60 72 72 12 re f*
201 .960784 .960784 .862745 rg
202 n 132 72 6 12 re f*
203 .960784 .960784 .862745 rg
204 n 138 72 12 12 re f*
205 .960784 .960784 .862745 rg
206 n 150 72 6 12 re f*
207 .960784 .960784 .862745 rg
208 n 162 72 12 12 re f*
209 .960784 .960784 .862745 rg
210 n 180 72 6 12 re f*
211 .960784 .960784 .862745 rg
212 n 0 48 18 12 re f*
213 .960784 .960784 .862745 rg
214 n 24 48 90 12 re f*
215 .960784 .960784 .862745 rg
216 n 114 48 18 12 re f*
217 .960784 .960784 .862745 rg
218 n 18 36 36 12 re f*
219 .960784 .960784 .862745 rg
220 n 60 36 72 12 re f*
221 .960784 .960784 .862745 rg
222 n 132 36 6 12 re f*
223 .960784 .960784 .862745 rg
224 n 138 36 6 12 re f*
225 .960784 .960784 .862745 rg
226 n 144 36 6 12 re f*
227 .960784 .960784 .862745 rg
228 n 156 36 12 12 re f*
229 .960784 .960784 .862745 rg
230 n 174 36 6 12 re f*
231 .960784 .960784 .862745 rg
232 n 0 12 18 12 re f*
233 .960784 .960784 .862745 rg
234 n 24 12 150 12 re f*
235 .960784 .960784 .862745 rg
236 n 174 12 18 12 re f*
237 .960784 .960784 .862745 rg
238 n 18 0 36 12 re f*
239 .960784 .960784 .862745 rg
240 n 60 0 72 12 re f*
241 .960784 .960784 .862745 rg
242 n 132 0 6 12 re f*
243 .960784 .960784 .862745 rg
244 n 138 0 18 12 re f*
245 .960784 .960784 .862745 rg
246 n 156 0 6 12 re f*
247 .960784 .960784 .862745 rg
248 n 168 0 12 12 re f*
249 .960784 .960784 .862745 rg
250 n 186 0 6 12 re f*
251 .960784 .960784 .862745 rg
252 n 198 0 6 12 re f*
253 .960784 .960784 .862745 rg
254 n 204 0 6 12 re f*
255 .960784 .960784 .862745 rg
256 n 216 0 72 12 re f*
257 .960784 .960784 .862745 rg
258 n 288 0 6 12 re f*
259 .960784 .960784 .862745 rg
260 n 294 0 18 12 re f*
261 .960784 .960784 .862745 rg
262 n 312 0 6 12 re f*
263 .960784 .960784 .862745 rg
264 n 324 0 12 12 re f*
265 .960784 .960784 .862745 rg
266 n 342 0 6 12 re f*
267 BT 1 0 0 1 0 158 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (calc_deg_sin) Tj 0 0 0 rg (\() Tj 0 0 0 rg (x) Tj 0 0 0 rg (\):) Tj 0 0 0 rg  T* (   ) Tj /F5 10 Tf .729412 .129412 .129412 rg ("""This is an elaborate python function that calculates the mathematical) Tj T* (   function f\(x\)=sin\(x\), where x is in degrees. """) Tj /F4 10 Tf 0 0 0 rg  T* (   ) Tj /F3 10 Tf 0 .501961 0 rg (from) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 0 1 rg (math) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (import) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (pi) Tj 0 0 0 rg (,) Tj 0 0 0 rg (sin) Tj 0 0 0 rg  T* (   ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (sin) Tj 0 0 0 rg (\() Tj 0 0 0 rg (x) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (\() Tj 0 0 0 rg (pi) Tj .4 .4 .4 rg (/) Tj .4 .4 .4 rg (189) Tj 0 0 0 rg (\)\)) Tj 0 0 0 rg  T*  T* /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (test_sin_90_is_1) Tj 0 0 0 rg (\(\):) Tj 0 0 0 rg  T* (   ) Tj /F3 10 Tf 0 .501961 0 rg (assert) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (calc_deg_sin) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (90) Tj 0 0 0 rg (\)) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (==) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (1) Tj 0 0 0 rg  T*  T* /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (test_sin_0_is_0) Tj 0 0 0 rg (\(\):) Tj 0 0 0 rg  T* (   ) Tj /F3 10 Tf 0 .501961 0 rg (assert) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (calc_deg_sin) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (0) Tj 0 0 0 rg (\)) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (==) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (0) Tj 0 0 0 rg  T*  T* /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (test_sin_180_and_360_is_0) Tj 0 0 0 rg (\(\):) Tj 0 0 0 rg  T* (   ) Tj /F3 10 Tf 0 .501961 0 rg (assert) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (calc_deg_sin) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (180) Tj 0 0 0 rg (\)) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (==) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (0) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (&) Tj (&) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (calc_deg_sin) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (360) Tj 0 0 0 rg (\)) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (==) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (0) Tj T* ET
268 Q
269 Q
270 Q
271 Q
272 Q
273 q
274 1 0 0 1 62.69291 418.8236 cm
275 q
276 BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Why) Tj T* ET
277 Q
278 Q
279 q
280 1 0 0 1 62.69291 400.8236 cm
281 q
282 0 0 0 rg
283 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Unit testing is a useful thing to do for a number of reasons, including \(in no particular order\):) Tj T* ET
284 Q
285 Q
286 q
287 1 0 0 1 62.69291 394.8236 cm
288 Q
289 q
290 1 0 0 1 62.69291 394.8236 cm
291 Q
292 q
293 1 0 0 1 62.69291 382.8236 cm
294 0 0 0 rg
295 BT /F1 10 Tf 12 TL ET
296 q
297 1 0 0 1 6 -3 cm
298 q
299 0 0 0 rg
300 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
301 Q
302 Q
303 q
304 1 0 0 1 23 -3 cm
305 q
306 0 0 0 rg
307 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Unit tests document the expected behaviour of your program.) Tj T* ET
308 Q
309 Q
310 q
311 Q
312 Q
313 q
314 1 0 0 1 62.69291 376.8236 cm
315 Q
316 q
317 1 0 0 1 62.69291 352.8236 cm
318 0 0 0 rg
319 BT /F1 10 Tf 12 TL ET
320 q
321 1 0 0 1 6 9 cm
322 q
323 0 0 0 rg
324 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
325 Q
326 Q
327 q
328 1 0 0 1 23 -3 cm
329 q
330 0 0 0 rg
331 BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 1.40528 Tw (Unit tests allow you to verify that you did not make unintended changes to the behaviour of your) Tj T* 0 Tw (program when you add features, or change the implementation.) Tj T* ET
332 Q
333 Q
334 q
335 Q
336 Q
337 q
338 1 0 0 1 62.69291 346.8236 cm
339 Q
340 q
341 1 0 0 1 62.69291 322.8236 cm
342 0 0 0 rg
343 BT /F1 10 Tf 12 TL ET
344 q
345 1 0 0 1 6 9 cm
346 q
347 0 0 0 rg
348 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
349 Q
350 Q
351 q
352 1 0 0 1 23 -3 cm
353 q
354 0 0 0 rg
355 BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .753516 Tw (Unit tests catch many bugs before your program runs for real \(before you submit the job that takes) Tj T* 0 Tw (multiple days, but crashes right before it prints out the result\).) Tj T* ET
356 Q
357 Q
358 q
359 Q
360 Q
361 q
362 1 0 0 1 62.69291 316.8236 cm
363 Q
364 q
365 1 0 0 1 62.69291 304.8236 cm
366 0 0 0 rg
367 BT /F1 10 Tf 12 TL ET
368 q
369 1 0 0 1 6 -3 cm
370 q
371 0 0 0 rg
372 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
373 Q
374 Q
375 q
376 1 0 0 1 23 -3 cm
377 q
378 0 0 0 rg
379 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Unit tests allow you to conveniently play with unfamiliar libraries/apis/modules language features.) Tj T* ET
380 Q
381 Q
382 q
383 Q
384 Q
385 q
386 1 0 0 1 62.69291 304.8236 cm
387 Q
388 q
389 1 0 0 1 62.69291 271.8236 cm
390 q
391 BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (How) Tj T* ET
392 Q
393 Q
394 q
395 1 0 0 1 62.69291 229.8236 cm
396 q
397 0 0 0 rg
398 BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL -0.135662 Tw (Use a test runner. A test runner will find all functions in a file or module that are defined to be tests, and run) Tj T* 0 Tw .754431 Tw (them. It will also give you a convenient output of the result, and some basic statistics. Test runners vary) Tj T* 0 Tw (greatly in their ease of use, flexibility and the usefulness of their output.) Tj T* ET
399 Q
400 Q
401 q
402 1 0 0 1 62.69291 199.8236 cm
403 q
404 BT 1 0 0 1 0 14 Tm .386488 Tw 12 TL /F1 10 Tf 0 0 0 rg (In this case I am using ) Tj /F4 10 Tf 0 0 0 rg (pytest) Tj /F1 10 Tf 0 0 0 rg (. ) Tj /F4 10 Tf 0 0 0 rg (pytest) Tj /F1 10 Tf 0 0 0 rg ( will execute all top level functions in a file that start with ) Tj /F4 10 Tf 0 0 0 rg (test_) Tj /F1 10 Tf 0 0 0 rg (.) Tj T* 0 Tw (You run the tests in a file with ) Tj /F4 10 Tf 0 0 0 rg (pytest) Tj ( ) Tj (FILE) Tj ( ) Tj ([FILE]) Tj ( ) Tj ([FILE]...) Tj /F1 10 Tf 0 0 0 rg (.) Tj T* ET
405 Q
406 Q
407 q
408 1 0 0 1 62.69291 166.8236 cm
409 q
410 BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (What) Tj T* ET
411 Q
412 Q
413 q
414 1 0 0 1 62.69291 148.8236 cm
415 q
416 BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Look at the examples in this directory. The files staring with ) Tj /F4 10 Tf 0 0 0 rg (<) Tj (somenumber) Tj (>) Tj (_) Tj /F1 10 Tf 0 0 0 rg ( contain tests.) Tj T* ET
417 Q
418 Q
419 q
420 1 0 0 1 62.69291 130.8236 cm
421 q
422 0 0 0 rg
423 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The first file contains some basic tests. Some will fail, some will pass.) Tj T* ET
424 Q
425 Q
426 q
427 1 0 0 1 62.69291 88.82362 cm
428 q
429 BT 1 0 0 1 0 26 Tm 1.282126 Tw 12 TL /F1 10 Tf 0 0 0 rg (The second file contains tests that check if a function called ) Tj /F4 10 Tf 0 0 0 rg (incorrect_ackermann) Tj /F1 10 Tf 0 0 0 rg ( will produce the) Tj T* 0 Tw 2.160542 Tw (expected values for a number of different inputs \(hint: it won't\). Fix any problems that turn up \( the) Tj T* 0 Tw (definition of the ackermann function is at the very bottom of the file that implements it\).) Tj T* ET
430 Q
431 Q
432  
433 endstream
434 endobj
435 20 0 obj
436 <<
437 /Length 4562
438 >>
439 stream
440 1 0 0 1 0 0 cm  BT /F1 12 Tf 14.4 TL ET
441 q
442 1 0 0 1 62.69291 717.0236 cm
443 q
444 BT 1 0 0 1 0 38 Tm .472126 Tw 12 TL /F1 10 Tf 0 0 0 rg (The third file contains tests for two functions, ) Tj /F4 10 Tf 0 0 0 rg (collatz) Tj /F1 10 Tf 0 0 0 rg ( and ) Tj /F4 10 Tf 0 0 0 rg (longest_collatz) Tj /F1 10 Tf 0 0 0 rg (. These return the length) Tj T* 0 Tw .959986 Tw (of the collatz sequence for a particular integer, and the integer with the longest collatz sequence that is) Tj T* 0 Tw .25832 Tw (smaller than the input integer. Implement these functions so that they pass the tests. This is based on the) Tj T* 0 Tw 0 0 .501961 rg (Euler Project problem number 14) Tj T* ET
445 Q
446 Q
447 q
448 1 0 0 1 62.69291 684.0236 cm
449 q
450 BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Test driven development) Tj T* ET
451 Q
452 Q
453 q
454 1 0 0 1 62.69291 630.0236 cm
455 q
456 0 0 0 rg
457 BT 1 0 0 1 0 38 Tm /F1 10 Tf 12 TL 1.961235 Tw (Test driven development is a practice, whereby one first writes the tests that fully describe a certain) Tj T* 0 Tw 1.87881 Tw (feature \(or test for a particular bug\). These tests should all initially fail. Then one writes the simplest) Tj T* 0 Tw .537045 Tw (implementation that will make these tests pass. Doing things in this order forces one to be very thorough) Tj T* 0 Tw (with writing tests. It is a lot of work however.) Tj T* ET
458 Q
459 Q
460 q
461 1 0 0 1 62.69291 588.0236 cm
462 q
463 BT 1 0 0 1 0 26 Tm .04881 Tw 12 TL /F1 10 Tf 0 0 0 rg (Pick your favourite algorithm \(ideally one ) Tj /F6 10 Tf (you) Tj /F1 10 Tf ( can implement in python\). Write some tests for a function \(or) Tj T* 0 Tw 1.864983 Tw (functions\) that implements that algorithm, then implement that algorithm to pass the tests that you've) Tj T* 0 Tw (written.) Tj T* ET
464 Q
465 Q
466 q
467 1 0 0 1 62.69291 570.0236 cm
468 q
469 0 0 0 rg
470 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Some good algorithms to tests with might be:) Tj T* ET
471 Q
472 Q
473 q
474 1 0 0 1 62.69291 564.0236 cm
475 Q
476 q
477 1 0 0 1 62.69291 564.0236 cm
478 Q
479 q
480 1 0 0 1 62.69291 552.0236 cm
481 0 0 0 rg
482 BT /F1 10 Tf 12 TL ET
483 q
484 1 0 0 1 6 -3 cm
485 q
486 0 0 0 rg
487 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
488 Q
489 Q
490 q
491 1 0 0 1 23 -3 cm
492 q
493 0 0 0 rg
494 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Binary search) Tj T* ET
495 Q
496 Q
497 q
498 Q
499 Q
500 q
501 1 0 0 1 62.69291 546.0236 cm
502 Q
503 q
504 1 0 0 1 62.69291 534.0236 cm
505 0 0 0 rg
506 BT /F1 10 Tf 12 TL ET
507 q
508 1 0 0 1 6 -3 cm
509 q
510 0 0 0 rg
511 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
512 Q
513 Q
514 q
515 1 0 0 1 23 -3 cm
516 q
517 0 0 0 rg
518 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Your favourite sorting algorithm) Tj T* ET
519 Q
520 Q
521 q
522 Q
523 Q
524 q
525 1 0 0 1 62.69291 528.0236 cm
526 Q
527 q
528 1 0 0 1 62.69291 516.0236 cm
529 0 0 0 rg
530 BT /F1 10 Tf 12 TL ET
531 q
532 1 0 0 1 6 -3 cm
533 q
534 0 0 0 rg
535 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
536 Q
537 Q
538 q
539 1 0 0 1 23 -3 cm
540 q
541 0 0 0 rg
542 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (DFS/BFS) Tj T* ET
543 Q
544 Q
545 q
546 Q
547 Q
548 q
549 1 0 0 1 62.69291 510.0236 cm
550 Q
551 q
552 1 0 0 1 62.69291 498.0236 cm
553 0 0 0 rg
554 BT /F1 10 Tf 12 TL ET
555 q
556 1 0 0 1 6 -3 cm
557 q
558 0 0 0 rg
559 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
560 Q
561 Q
562 q
563 1 0 0 1 23 -3 cm
564 q
565 0 0 0 rg
566 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Calculating the edit distance between two strings) Tj T* ET
567 Q
568 Q
569 q
570 Q
571 Q
572 q
573 1 0 0 1 62.69291 492.0236 cm
574 Q
575 q
576 1 0 0 1 62.69291 480.0236 cm
577 0 0 0 rg
578 BT /F1 10 Tf 12 TL ET
579 q
580 1 0 0 1 6 -3 cm
581 q
582 0 0 0 rg
583 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
584 Q
585 Q
586 q
587 1 0 0 1 23 -3 cm
588 q
589 0 0 0 rg
590 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Kernel convolution) Tj T* ET
591 Q
592 Q
593 q
594 Q
595 Q
596 q
597 1 0 0 1 62.69291 474.0236 cm
598 Q
599 q
600 1 0 0 1 62.69291 462.0236 cm
601 0 0 0 rg
602 BT /F1 10 Tf 12 TL ET
603 q
604 1 0 0 1 6 -3 cm
605 q
606 0 0 0 rg
607 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
608 Q
609 Q
610 q
611 1 0 0 1 23 -3 cm
612 q
613 0 0 0 rg
614 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Maximum parsimony) Tj T* ET
615 Q
616 Q
617 q
618 Q
619 Q
620 q
621 1 0 0 1 62.69291 456.0236 cm
622 Q
623 q
624 1 0 0 1 62.69291 444.0236 cm
625 0 0 0 rg
626 BT /F1 10 Tf 12 TL ET
627 q
628 1 0 0 1 6 -3 cm
629 q
630 0 0 0 rg
631 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
632 Q
633 Q
634 q
635 1 0 0 1 23 -3 cm
636 q
637 0 0 0 rg
638 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Calculate the Levenshtein or edit distance between two strings) Tj T* ET
639 Q
640 Q
641 q
642 Q
643 Q
644 q
645 1 0 0 1 62.69291 438.0236 cm
646 Q
647 q
648 1 0 0 1 62.69291 414.0236 cm
649 0 0 0 rg
650 BT /F1 10 Tf 12 TL ET
651 q
652 1 0 0 1 6 9 cm
653 q
654 0 0 0 rg
655 BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
656 Q
657 Q
658 q
659 1 0 0 1 23 -3 cm
660 q
661 0 0 0 rg
662 BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 1.266098 Tw (Calculating the value of the fibonacci sequence, the sum of integers up to n, the first n primes or) Tj T* 0 Tw (some other such mathematical function) Tj T* ET
663 Q
664 Q
665 q
666 Q
667 Q
668 q
669 1 0 0 1 62.69291 414.0236 cm
670 Q
671  
672 endstream
673 endobj
674 21 0 obj
675 <<
676 /Nums [ 0 22 0 R 1 23 0 R ]
677 >>
678 endobj
679 22 0 obj
680 <<
681 /S /D /St 1
682 >>
683 endobj
684 23 0 obj
685 <<
686 /S /D /St 2
687 >>
688 endobj
689 xref
690 0 24
691 0000000000 65535 f 
692 0000000073 00000 n 
693 0000000154 00000 n 
694 0000000261 00000 n 
695 0000000373 00000 n 
696 0000000483 00000 n 
697 0000000588 00000 n 
698 0000000701 00000 n 
699 0000000906 00000 n 
700 0000001119 00000 n 
701 0000001234 00000 n 
702 0000001458 00000 n 
703 0000001564 00000 n 
704 0000001834 00000 n 
705 0000001908 00000 n 
706 0000002012 00000 n 
707 0000002129 00000 n 
708 0000002247 00000 n 
709 0000002372 00000 n 
710 0000002439 00000 n 
711 0000012914 00000 n 
712 0000017528 00000 n 
713 0000017578 00000 n 
714 0000017612 00000 n 
715 trailer
716 <<
717 /ID 
718 [<0e78adeec461ba0fa6ed6f6f883a9461><0e78adeec461ba0fa6ed6f6f883a9461>]
719 % ReportLab generated PDF document -- digest (http://www.reportlab.com)
720
721 /Info 12 0 R
722 /Root 11 0 R
723 /Size 24
724 >>
725 startxref
726 17646
727 %%EOF