From a3e5c61aba9df89897fab9c8efc04bdb89ce2034 Mon Sep 17 00:00:00 2001
From: Srikant
Date: Tue, 24 Jan 2012 16:01:00 +0530
Subject: Added slides and script.

Self evaluation questions are need to be added.
---
 TDD/getting_started_with_tdd/tdd1.tex        | 304 +++++++++++++++++++++++++++
 TDD/getting_started_with_tdd/tdd1_script.rst | 205 ++++++++++++++++++
 2 files changed, 509 insertions(+)
 create mode 100644 TDD/getting_started_with_tdd/tdd1.tex
 create mode 100755 TDD/getting_started_with_tdd/tdd1_script.rst

(limited to 'TDD')

diff --git a/TDD/getting_started_with_tdd/tdd1.tex b/TDD/getting_started_with_tdd/tdd1.tex
new file mode 100644
index 0000000..f056ce5
--- /dev/null
+++ b/TDD/getting_started_with_tdd/tdd1.tex
@@ -0,0 +1,304 @@
+\documentclass[12pt,presentation]{beamer}
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage{fixltx2e}
+\usepackage{graphicx}
+\usepackage{longtable}
+\usepackage{float}
+\usepackage{wrapfig}
+\usepackage{soul}
+\usepackage{textcomp}
+\usepackage{marvosym}
+\usepackage{wasysym}
+\usepackage{latexsym}
+\usepackage{amssymb}
+\usepackage{hyperref}
+\tolerance=1000
+\usepackage[english]{babel} \usepackage{ae,aecompl}
+\usepackage{mathpazo,courier,euler} \usepackage[scaled=.95]{helvet}
+\usepackage{listings}
+\lstset{language=Python, basicstyle=\ttfamily\bfseries,
+commentstyle=\color{red}\itshape, stringstyle=\color{green},
+showstringspaces=false, keywordstyle=\color{blue}\bfseries}
+\providecommand{\alert}[1]{\textbf{#1}}
+
+\title{SEES: Test Driven Development}
+\author{FOSSEE}
+
+\usetheme{Warsaw}\usecolortheme{default}\useoutertheme{infolines}\setbeamercovered{transparent}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+\begin{document}
+
+\begin{frame}
+\begin{center}
+\vspace{12pt}
+\textcolor{blue}{\huge Test Driven Development \\Part I}
+\end{center}
+\vspace{18pt}
+\begin{center}
+\vspace{10pt}
+\includegraphics[scale=0.95]{../images/fossee-logo.png}\\
+\vspace{5pt}
+\scriptsize Developed by FOSSEE Team, IIT-Bombay. \\ 
+\scriptsize Funded by National Mission on Education through ICT\\
+\scriptsize  MHRD,Govt. of India\\
+\includegraphics[scale=0.30]{../images/iitb-logo.png}\\
+\end{center}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Introduction}
+
+\begin{frame}
+  \frametitle{Objectives}
+  At the end of this tutorial, you will be able to,
+  \begin{itemize}
+  \item Know what is TDD.
+  \item Understand the use of test cases.
+  \item Write simple tests for a function.
+ 
+  \end{itemize}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}
+\frametitle{Pre-requisite}
+\label{sec-3}
+
+Spoken tutorial on -
+\begin{itemize}
+\item Getting started with functions.
+\end{itemize}
+\end{frame}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{frame}
+  \frametitle{What is TDD?}
+  The basic steps of TDD are roughly as follows --
+  \begin{enumerate}
+  \item Decide upon the feature to implement and the methodology of
+    testing it.
+  \item Write the tests for the feature decided upon.
+  \item Just write enough code, so that the test can be run, but it fails.
+  \item Improve the code, to just pass the test and at the same time
+    passing all previous tests.
+  \item Run the tests to see, that all of them run successfully.
+  \item Refactor the code you've just written -- optimize the algorithm,
+    remove duplication, add documentation, etc.
+  \item Run the tests again, to see that all the tests still pass.
+  
+  \end{enumerate}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{First Test}
+
+\begin{frame}[fragile]
+  \frametitle{First Test -- fibonacci}
+  \begin{itemize}
+  \item simple program -- Returns nth fibonacci number
+  \item What are our code units?
+    \begin{itemize}
+    \item Only one function \texttt{fibonacci}
+    \item Takes one number as argument
+    \item Returns one number, which is the nth number of fibonacci series.
+    \end{itemize}
+\begin{lstlisting}
+c = fibonacci(3)
+\end{lstlisting}
+  \item c will contain 3rd number of fibonacci series,counting from 0.
+  \end{itemize}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{frame}[fragile]
+  \frametitle{Test Cases}
+  \begin{itemize}
+  \item Important to have test cases and expected outputs even before
+    writing the first test!
+  \item $n=3$, $fibonacci=2$
+  \item $n=4$, $fibonacci=3$
+  \item Tests are just a series of assertions
+  \item True or False, depending on expected and actual behavior
+  \end{itemize}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{frame}[fragile]
+  \frametitle{Test Cases -- Code}
+\begin{lstlisting}
+tc1 = fibonacci(3)
+if tc1 != 2:
+    print "Failed for n=3. Expected 2. \
+    Obtained %d instead." % tc1
+    exit(1)
+
+tc2 = fibonacci(4)
+if tc2 != 3:
+    print "Failed for n=4. Expected 3. \
+    Obtained %d instead." % tc2
+    exit(1)
+
+print "All tests passed!"
+\end{lstlisting}
+\begin{itemize}
+\item The function \texttt{fibonacci} doesn't even exist!
+\end{itemize}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{frame}[fragile]
+  \frametitle{Stubs}
+  \begin{itemize}
+  \item First write a very minimal definition of \texttt{fibonacci}
+    \begin{lstlisting}
+def fibonacci(a):
+    pass
+    \end{lstlisting}
+  \item Written just, so that the tests can run
+  \item Obviously, the tests are going to fail
+  \end{itemize}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}[fragile]
+  \frametitle{\texttt{fibonacci.py}}
+\begin{lstlisting}
+def fibonacci(n):
+    pass
+
+if __name__ == '__main__':
+    tc1 = fibonacci(3)
+    if tc1 != 2:
+        print "Failed for n=3. \
+        Expected 2. Obtained %d instead." % tc1
+        exit(1)
+    tc2 = fibonacci(4)
+    if tc2 != 3:
+        print "Failed for n=4. \
+        Expected 3. Obtained %d instead." % tc2
+        exit(1)
+    print "All tests passed!"
+\end{lstlisting}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}[fragile]
+  \frametitle{First run}
+\begin{lstlisting}
+$ python fibonacci.py
+Traceback (most recent call last):
+  File "fibonacci.py", line 8, in <module> 
+  print "Failed for n=3. Expected 2. 
+  Obtained %d instead." % tc1
+TypeError: %d format: 
+a number is required, not NoneType
+\end{lstlisting} %$
+
+  \begin{itemize}
+  \item We have our code unit stub, and a failing test. 
+  \item The next step is to write code, so that the test just passes.
+  \end{itemize}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}[fragile]
+  \frametitle{Euclidean Algorithm}
+  \begin{itemize}
+  \item Modify the \texttt{fibonacci} stub function
+  \item Then, run the script to see if the tests pass.
+  \end{itemize}
+\begin{lstlisting}
+def fibonacci(n):
+    a, b = 0, 1
+    for i in range(n):
+        a, b = b, a + b
+    return a
+
+\end{lstlisting}
+\begin{lstlisting}
+$ python fibonacci.py
+All tests passed!
+\end{lstlisting} %$
+  \begin{itemize}
+  \item \alert{Success!}
+  \end{itemize}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{frame}[fragile]
+  \frametitle{Euclidean Algorithm -- Recursive}
+  \begin{itemize}
+  \item Final improvement -- make \texttt{fibonacci} recursive
+  \item More readable and easier to understand
+\begin{lstlisting}
+def fibonacci(n):
+    if n == 0:
+        return 0
+    elif n == 1:
+        return 1
+    else:
+        return fibonacci(n-1) + fibonacci(n-2)
+        
+\end{lstlisting}
+  \item Check that the tests pass again
+  \end{itemize}
+\end{frame}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}
+\frametitle{Summary}
+\label{sec-8}
+
+  In this tutorial, we have learnt to,
+
+
+\begin{itemize}
+\item Undestand the basic steps involved in Test driven development.
+\item Design a TDD approach for a given \texttt{fibonacci} function.
+
+\end{itemize}
+\end{frame}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}[fragile]
+\frametitle{Evaluation}
+\label{sec-9}
+
+
+\begin{enumerate}
+\item ?
+\vspace{8pt}
+\item ? 
+\end{enumerate}
+\end{frame}
+\begin{frame}
+\frametitle{Solutions}
+\label{sec-10}
+
+
+\begin{enumerate}
+\item 
+\vspace{15pt}
+\item 
+\end{enumerate}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{frame}
+
+  \begin{block}{}
+  \begin{center}
+  \textcolor{blue}{\Large THANK YOU!} 
+  \end{center}
+  \end{block}
+\begin{block}{}
+  \begin{center}
+    For more Information, visit our website\\
+    \url{http://fossee.in/}
+  \end{center}  
+  \end{block}
+\end{frame}
+
+
+\end{document}
diff --git a/TDD/getting_started_with_tdd/tdd1_script.rst b/TDD/getting_started_with_tdd/tdd1_script.rst
new file mode 100755
index 0000000..9da1613
--- /dev/null
+++ b/TDD/getting_started_with_tdd/tdd1_script.rst
@@ -0,0 +1,205 @@
+.. Objectives
+.. ----------
+   
+   .. At the end of this tutorial, you will be able to:
+   
+   ..   1. Know what is TDD.
+   ..   2. Understand the use of test cases.
+   ..   3. Write simple tests for a function.
+
+.. Prerequisites
+.. -------------
+
+..   1. Getting started with functions
+
+ 
+Script
+------
+
+.. L1
+
+{{{ Show the  first slide containing title, name of the production
+team along with the logo of MHRD }}}
+
+.. R1
+
+Hello friends and Welcome to the tutorial on 
+'Test driven development - Part 1'.
+
+.. L2
+
+{{{ Show slide with objectives }}} 
+
+.. R2
+
+At the end of this tutorial, you will be able to,
+
+ 1. understand basics of Test Driven Development.
+ #. understand the use test cases.
+ #. write simple tests for a function.
+
+.. L3
+
+{{{ Switch to the slide3, pre-requisite slide }}}
+
+.. R3
+
+Before beginning this tutorial,we would suggest you to complete the 
+tutorial on "Getting started with functions".
+
+.. R4
+
+Test-driven development is a software development 
+process that relies on the repetition of a very short 
+development cycle.
+In TDD,one writes a failing automated test case that 
+defines a desired improvement or new function, then produces
+code to pass that test and finally refactors the new code to
+acceptable standards.
+
+
+.. L4
+
+{{{ Switch to slide4 ,What is TDD?}}}
+
+
+.. R5
+
+To illustrate TDD, lets take a simple program. Consider a 
+function ``fibonacci``, that takes one argument and returns 
+the nth number of ``fibonacci`` series.
+
+.. L5
+
+{{{ Switch to slide5, First test- fibonacci }}}
+
+.. R6 
+
+To test ``fibonacci`` function, we need test
+cases.
+As shown in this slide,
+test cases are expected outputs for a given set of inputs.
+
+
+.. L6
+
+{{{ Switch to slide6, Test cases }}}
+
+.. R7
+
+The sample code for test cases is shown here. Observe that if 
+any ``if`` statement is executed, test aborts after printing the
+error message.
+
+.. L7
+ 
+{{{ Switch to slide7, Test cases-Code }}}
+
+.. R8
+
+The ``fibonacci`` function is written just enough so that 
+test can run.
+
+
+.. L8
+
+{{{ switch to slide8, Stubs }}}
+
+.. R9
+
+Combine the function and test cases and put them together in 
+``fibonacci.py`` file.Add the test cases after name=main idiom.
+
+.. L9
+
+{{{ Switch to slide9, fibonacci.py }}}
+
+.. R10
+
+Lets run fibonacci.py by typing ``python fibonacci.py``.
+As we haven't written any meaningful code in our ``fibonacci``
+function, it fails immediately.
+Our next step is to write just minimum code to pass our tests.
+
+.. L10
+
+{{{ Run the fibonacci.py in terminal and show the error output.}}}
+::
+     
+    python fibonacci.py
+
+.. R11
+
+Modify the fibonacci stub function with given code. 
+Save and run it again as `` python fibonacci.py``. 
+{{{ pause }}}
+Observe that, there will be no errors, as 
+the test passes successfully.
+
+.. L11
+
+{{{ switch to slide-11, Euclidean Algorithm }}}
+Switch to terminal and modify fibonacci function in ``nano``
+editor and run.
+::
+
+    python fibonacci.py
+   
+.. R12
+
+The same ``fibonacci`` function is modified to make it more readable
+and easy to understand using recursion.
+Pause this video here.Replace the ``fibonacci`` function with recursive one.
+Run the modified ``fibonacci.py`` file. The test should pass again 
+without any errors.
+After successfully achieving this result, you can resume the video.
+
+.. L12
+
+{{{ Show slide12, Euclidean Algorithm- Recursive}}}
+
+
+.. R13
+
+This brings us to the end of the tutorial.In this tutorial,
+ we have learnt to,
+ 
+ 1. Undestand the basic steps involved in Test driven development.
+ #. Design a Test driven approach for a given ``fibonacci`` function.
+
+
+.. L13
+
+{{{ switch to slide-13,Summary }}}
+
+.. R14
+
+Here are some self assessment questions for you to solve
+ 1.
+
+ 2. 
+
+.. L14
+
+{{{ switch to slide-14, Evaluation }}}
+
+.. R15
+
+And the answers are,
+ 1.
+
+ 2.
+
+.. L15
+
+{{{ switch to slide-15 ,Solutions}}}
+
+.. R16
+
+Hope you have enjoyed this tutorial and found it useful.
+Thank you!
+
+.. L16
+
+{{{ Switch to slide-16, Thankyou}}}
+
-- 
cgit 


From b5a5acdddb2ef001e9c97a2959b0dbff9096423c Mon Sep 17 00:00:00 2001
From: Srikant
Date: Tue, 24 Jan 2012 16:13:23 +0530
Subject: removed the old slide.tex

---
 TDD/getting_started_with_tdd/slide.tex | 352 ---------------------------------
 1 file changed, 352 deletions(-)
 delete mode 100644 TDD/getting_started_with_tdd/slide.tex

(limited to 'TDD')

diff --git a/TDD/getting_started_with_tdd/slide.tex b/TDD/getting_started_with_tdd/slide.tex
deleted file mode 100644
index 54875f9..0000000
--- a/TDD/getting_started_with_tdd/slide.tex
+++ /dev/null
@@ -1,352 +0,0 @@
-\documentclass[12pt,presentation]{beamer}
-\usepackage[utf8]{inputenc}
-\usepackage[T1]{fontenc}
-\usepackage{fixltx2e}
-\usepackage{graphicx}
-\usepackage{longtable}
-\usepackage{float}
-\usepackage{wrapfig}
-\usepackage{soul}
-\usepackage{textcomp}
-\usepackage{marvosym}
-\usepackage{wasysym}
-\usepackage{latexsym}
-\usepackage{amssymb}
-\usepackage{hyperref}
-\tolerance=1000
-\usepackage[english]{babel} \usepackage{ae,aecompl}
-\usepackage{mathpazo,courier,euler} \usepackage[scaled=.95]{helvet}
-\usepackage{listings}
-\lstset{language=Python, basicstyle=\ttfamily\bfseries,
-commentstyle=\color{red}\itshape, stringstyle=\color{green},
-showstringspaces=false, keywordstyle=\color{blue}\bfseries}
-\providecommand{\alert}[1]{\textbf{#1}}
-
-\title{Getting started with TDD}
-\author{FOSSEE}
-\institute{IIT Bombay}
-
-\usetheme{Warsaw}\usecolortheme{default}\useoutertheme{infolines}\setbeamercovered{transparent}
-
-\AtBeginSection[]
-{
-  \begin{frame}<beamer>
-    \frametitle{Outline}
-    \tableofcontents[currentsection]
-  \end{frame}
-}
-
-\begin{document}
-
-\begin{frame}
-
-\begin{center}
-\vspace{12pt}
-\textcolor{blue}{\huge Getting started with Test Driven Development}
-\end{center}
-\vspace{18pt}
-\begin{center}
-\vspace{10pt}
-\includegraphics[scale=0.95]{../../images/fossee-logo.png}\\
-\vspace{5pt}
-\scriptsize Developed by FOSSEE Team, IIT-Bombay. \\ 
-\scriptsize Funded by National Mission on Education through ICT\\
-\scriptsize  MHRD,Govt. of India\\
-\includegraphics[scale=0.30]{../../images/iitb-logo.png}\\
-\end{center}
-\end{frame}
-
-\begin{frame}
-\frametitle{Outline}
-\setcounter{tocdepth}{3}
-\tableofcontents
-\end{frame}
-
-\section{Introduction}
-
-\begin{frame}
-  \frametitle{Objectives}
-  At the end of this section, you will be able to:
-  \begin{itemize}
-  \item Understand the concept of Test Driven Development.
-  \item Write your code using the TDD paradigm.
-  \end{itemize}
-\end{frame}
-
-
-\begin{frame}
-\frametitle{Pre-requisite}
-\label{sec-3}
-
-Spoken tutorial on Basic Python
-\begin{itemize}
-\item Topic of tutorial here
-\end{itemize}
-\end{frame}
-
-
-\begin{frame}
-  \frametitle{What is TDD?}
-  The basic steps of TDD are roughly as follows --
-  \begin{enumerate}
-  \item Decide upon the feature to implement and the methodology of
-    testing it.
-  \item Write the tests for the feature decided upon.
-  \item Just write enough code, so that the test can be run, but it fails.
-  \item Improve the code, to just pass the test and at the same time
-    passing all previous tests.
-  \item Run the tests to see, that all of them run successfully.
-  \item Refactor the code you've just written -- optimize the algorithm,
-    remove duplication, add documentation, etc.
-  \item Run the tests again, to see that all the tests still pass.
-  \item Go back to 1.
-  \end{enumerate}
-\end{frame}
-
-\section{First Test}
-
-\begin{frame}[fragile]
-  \frametitle{First Test -- GCD}
-  \begin{itemize}
-  \item simple program -- GCD of two numbers
-  \item What are our code units?
-    \begin{itemize}
-    \item Only one function \texttt{gcd}
-    \item Takes two numbers as arguments
-    \item Returns one number, which is their GCD
-    \end{itemize}
-\begin{lstlisting}
-c = gcd(44, 23)
-\end{lstlisting}
-  \item c will contain the GCD of the two numbers.
-  \end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]
-  \frametitle{Test Cases}
-  \begin{itemize}
-  \item Important to have test cases and expected outputs even before
-    writing the first test!
-  \item $a=48$, $b=48$, $GCD=48$
-  \item $a=44$, $b=19$, $GCD=1$
-  \item Tests are just a series of assertions
-  \item True or False, depending on expected and actual behavior
-  \end{itemize}
-
-\end{frame}
-
-\begin{frame}[fragile]
-  \frametitle{Test Cases -- Code}
-\begin{lstlisting}
-tc1 = gcd(48, 64)
-if tc1 != 16:
-    print "Failed for a=48, b=64. Expected 16. \
-    Obtained %d instead." % tc1
-    exit(1)
-
-tc2 = gcd(44, 19)
-if tc2 != 1:
-    print "Failed for a=44, b=19. Expected 1. \
-    Obtained %d instead." % tc2
-    exit(1)
-
-print "All tests passed!"
-\end{lstlisting}
-\begin{itemize}
-\item The function \texttt{gcd} doesn't even exist!
-\end{itemize}
-\end{frame}
-
-
-\begin{frame}[fragile]
-  \frametitle{Stubs}
-  \begin{itemize}
-  \item First write a very minimal definition of \texttt{gcd}
-    \begin{lstlisting}
-def gcd(a, b):
-    pass
-    \end{lstlisting}
-  \item Written just, so that the tests can run
-  \item Obviously, the tests are going to fail
-  \end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]
-  \frametitle{\texttt{gcd.py}}
-\begin{lstlisting}
-def gcd(a, b):
-    pass
-
-if __name__ == '__main__':
-    tc1 = gcd(48, 64)
-    if tc1 != 16:
-        print "Failed for a=48 and b=64. \
-        Expected 16. Obtained %d instead." % tc1
-        exit(1)
-    tc2 = gcd(44, 19)
-    if tc2 != 1:
-        print "Failed for a=44 and b=19. \
-        Expected 1. Obtained %d instead." % tc2
-        exit(1)
-    print "All tests passed!"
-\end{lstlisting}
-\end{frame}
-
-\begin{frame}[fragile]
-  \frametitle{First run}
-\begin{lstlisting}
-$ python gcd.py
-Traceback (most recent call last):
-  File "gcd.py", line 7, in <module> 
-  print "Failed for a=48 and b=64. Expected 16. 
-  Obtained %d instead." % tc1
-TypeError: %d format: 
-a number is required, not NoneType
-\end{lstlisting} %$
-
-  \begin{itemize}
-  \item We have our code unit stub, and a failing test. 
-  \item The next step is to write code, so that the test just passes.
-  \end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]
-  \frametitle{Euclidean Algorithm}
-  \begin{itemize}
-  \item Modify the \texttt{gcd} stub function
-  \item Then, run the script to see if the tests pass.
-  \end{itemize}
-\begin{lstlisting}
-def gcd(a, b):
-    if a == 0:
-        return b
-    while b != 0:
-        if a > b:
-            a = a - b
-        else:
-            b = b - a
-    return a
-\end{lstlisting}
-\begin{lstlisting}
-$ python gcd.py
-All tests passed!
-\end{lstlisting} %$
-  \begin{itemize}
-  \item \alert{Success!}
-  \end{itemize}
-\end{frame}
-
-
-\begin{frame}[fragile]
-  \frametitle{Euclidean Algorithm -- Modulo}
-  \begin{itemize}
-  \item Repeated subtraction can be replaced by a modulo
-  \item modulo of \texttt{a\%b} is always less than b
-  \item when \texttt{a < b}, \texttt{a\%b} equals \texttt{a}
-  \item Combine these two observations, and modify the code
-\begin{lstlisting}
-def gcd(a, b):
-    while b != 0:
-        a, b = b, a % b
-    return a
-\end{lstlisting}
-  \item Check that the tests pass again
-  \end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]
-  \frametitle{Euclidean Algorithm -- Recursive}
-  \begin{itemize}
-  \item Final improvement -- make \texttt{gcd} recursive
-  \item More readable and easier to understand
-\begin{lstlisting}
-def gcd(a, b):
-    if b == 0:
-        return a
-    return gcd(b, a%b)
-\end{lstlisting}
-  \item Check that the tests pass again
-  \end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]
-  \frametitle{Document \texttt{gcd}}
-  \begin{itemize}
-  \item Undocumented function is as good as unusable
-  \item Let's add a docstring \& We have our first test!
-  \end{itemize}
-\begin{lstlisting}
-def gcd(a, b):
-    """Returns the Greatest Common Divisor of the 
-    two integers passed as arguments.
-
-    Args:
-      a: an integer
-      b: another integer
-
-    Returns: Greatest Common Divisor of a and b
-    """
-    if b == 0:
-        return a
-    return gcd(b, a%b)
-\end{lstlisting}
-\end{frame}
-
-
-\begin{frame}[fragile]
-  \frametitle{Persistent Test Cases}
-  \begin{itemize}
-  \item Tests should be pre-determined and written, before the code
-  \item Test Data is repeatedly used; Hence, saved in persistent
-    format
-  \item Let's save data for GCD tests in a text file. 
-  \item The file shall have multiple lines of test data
-  \item Each line corresponds to a single test case
-  \item Each line consists of three comma separated values --
-    \begin{itemize}
-    \item First two coloumns are the integers for which the GCD has to be
-      computed
-    \item Third coloumn is the expected GCD to the preceding two
-      numbers.
-    \end{itemize}
-  \item Let us call our data file \texttt{gcd\_testcases.dat}
-  \end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]
-  \frametitle{Modify \texttt{gcd.py}}
-\begin{lstlisting}
-if __name__ == '__main__':
-    for line in open('gcd_testcases.dat'):
-        values = line.split(', ')
-        a = int(values[0])
-        b = int(values[1])
-        g = int(values[2])
-
-        tc = gcd(a, b)
-        if tc != g:
-            print "Failed for a=%d and b=%d.\
-            Expected %d. Obtained %d instead."\
-            % (a, b, g, tc)
-            exit(1)
-
-    print "All tests passed!"
-\end{lstlisting}
-\end{frame}
-
-\begin{frame}
-
-  \begin{block}{}
-  \begin{center}
-  \textcolor{blue}{\Large THANK YOU!} 
-  \end{center}
-  \end{block}
-\begin{block}{}
-  \begin{center}
-    For more Information, visit our website\\
-    \url{http://fossee.in/}
-  \end{center}  
-  \end{block}
-\end{frame}
-
-\end{document}
-- 
cgit 


From 2965bf37bb8fc6c6d672d6775612531e4a3074ba Mon Sep 17 00:00:00 2001
From: Srikant
Date: Tue, 24 Jan 2012 16:19:59 +0530
Subject: Added supporting files.

Added script and slides for 'using_python_framework_for_tdd',
math_utils diretory contains files used in the tutorials,
two_column.py is added to convert script.rst into
two column format.Use it as:
$ two_column.py tdd1_script.rst
image dir contains png files for iitb logo's etc.
---
 TDD/images/fossee-logo.png                         | Bin 0 -> 13587 bytes
 TDD/images/iitb-logo.png                           | Bin 0 -> 13756 bytes
 TDD/math_utils/fibonacci.py                        |   7 +
 TDD/math_utils/fibonacci_testcases.dat             |   8 +
 TDD/math_utils/test_fibonacci.py                   |  27 ++
 TDD/two_column.py                                  |  84 +++++
 TDD/using_python_framework_for_tdd/tdd2.tex        | 365 +++++++++++++++++++++
 TDD/using_python_framework_for_tdd/tdd2_script.rst | 198 +++++++++++
 TDD/using_python_frameworks_for_TDD/slide.tex      | 299 -----------------
 9 files changed, 689 insertions(+), 299 deletions(-)
 create mode 100644 TDD/images/fossee-logo.png
 create mode 100644 TDD/images/iitb-logo.png
 create mode 100644 TDD/math_utils/fibonacci.py
 create mode 100644 TDD/math_utils/fibonacci_testcases.dat
 create mode 100644 TDD/math_utils/test_fibonacci.py
 create mode 100755 TDD/two_column.py
 create mode 100644 TDD/using_python_framework_for_tdd/tdd2.tex
 create mode 100755 TDD/using_python_framework_for_tdd/tdd2_script.rst
 delete mode 100644 TDD/using_python_frameworks_for_TDD/slide.tex

(limited to 'TDD')

diff --git a/TDD/images/fossee-logo.png b/TDD/images/fossee-logo.png
new file mode 100644
index 0000000..49d1797
Binary files /dev/null and b/TDD/images/fossee-logo.png differ
diff --git a/TDD/images/iitb-logo.png b/TDD/images/iitb-logo.png
new file mode 100644
index 0000000..38ec17e
Binary files /dev/null and b/TDD/images/iitb-logo.png differ
diff --git a/TDD/math_utils/fibonacci.py b/TDD/math_utils/fibonacci.py
new file mode 100644
index 0000000..0f454d6
--- /dev/null
+++ b/TDD/math_utils/fibonacci.py
@@ -0,0 +1,7 @@
+def fibonacci(n):
+    if n == 0:
+        return 0
+    elif n == 1:
+        return 1
+    else:
+        return fibonacci(n-1) + fibonacci(n-2)
diff --git a/TDD/math_utils/fibonacci_testcases.dat b/TDD/math_utils/fibonacci_testcases.dat
new file mode 100644
index 0000000..c5dae1a
--- /dev/null
+++ b/TDD/math_utils/fibonacci_testcases.dat
@@ -0,0 +1,8 @@
+0, 0
+1, 1
+2, 1
+3, 2
+4, 3
+5, 5
+6, 8
+7, 13
diff --git a/TDD/math_utils/test_fibonacci.py b/TDD/math_utils/test_fibonacci.py
new file mode 100644
index 0000000..ee3393f
--- /dev/null
+++ b/TDD/math_utils/test_fibonacci.py
@@ -0,0 +1,27 @@
+import fibonacci
+import unittest
+
+class TestFibonacciFunction(unittest.TestCase):
+
+    def setUp(self):
+        self.test_file = open('fibonacci_testcases.dat')
+        self.test_cases = []
+        for line in self.test_file:
+            values = line.split(', ')
+            n = int(values[0])
+            a = int(values[1])
+            
+            self.test_cases.append([n, a])
+
+    def test_fibonacci(self):
+        for case in self.test_cases:
+            n = case[0]
+            a = case[1]
+            self.assertEqual(fibonacci.fibonacci(n),a)
+
+    def tearDown(self):
+        self.test_file.close()
+        del self.test_cases
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/TDD/two_column.py b/TDD/two_column.py
new file mode 100755
index 0000000..4134b2e
--- /dev/null
+++ b/TDD/two_column.py
@@ -0,0 +1,84 @@
+#!/usr/bin/env python
+# This script generates two column format from the script file. 
+import re, optparse
+
+num = 0
+content = {}
+
+def parse_script(script):
+    """Parse the file, and get each cell's content into a dictionary."""
+    where = 'HEAD'
+    txt = ''
+    global num
+    for line in open(script):
+        if line.startswith('..'):
+            loc = re.findall(".. ((L|R)(\d+))", line)
+            if loc:
+                # Next cell has been found
+                # Save previous cell data 
+                content[where] = txt
+
+                txt = ''
+                where = loc[0][0]
+                num = int(loc[0][2]) if int(loc[0][2]) > num else num
+                continue
+            else:
+                pass
+        txt += line
+    content[where] = txt  # Saving the content of the last cell. 
+
+def write_two_col(content, two_col):
+    """ Write the content to a file, in two column format."""
+    f = open(two_col, 'w')
+    f.write('%s' %content['HEAD'])
+
+    f.write("\n\n+%s+%s+\n" %('-'*82, '-'*82))
+    for i in range(1, num+1):
+        l = '%s%s' %('L', i)
+        r = '%s%s' %('R', i)
+
+        # Split each side text into individual lines
+        if l in content:
+            ltext = content[l].strip().splitlines()
+        else:
+            ltext = ['']
+        if r in content:
+            rtext = content[r].strip().splitlines()
+        else:
+            rtext = ['']
+
+        # Ensure that both sides have the same number of lines
+        ltext.extend(['']*(len(rtext) - len(ltext)))
+        rtext.extend(['']*(len(ltext) - len(rtext)))
+
+        # Write each of the lines in respective columns
+        for k in range(len(ltext)):
+            f.write("| %-80s | %-80s |\n" %(ltext[k], rtext[k]))
+
+        # Horizontal division
+        f.write("+%s+%s+\n" %('-'*82, '-'*82))
+
+    f.close()
+
+if __name__ == '__main__':
+    parser = optparse.OptionParser()
+    parser.add_option("-i", default="script.rst", dest="input",
+                      help="Input file. 'script.rst' is used by default.")
+    parser.add_option("-o", default="script2col.rst", dest="output",
+                      help="Output file. script2col.rst is used by default.")
+
+    parser.description = """Converts a script file into two column format."""
+
+    parser.epilog = \
+    """Make sure that you check the validity of the formatting of both
+the INPUT and the OUTPUT files, using rst2html. Also, Make sure that
+each line, in the INPUT file, is less than 80 chars long."""
+    
+    (options, args) = parser.parse_args()
+
+    script, two_col = options.input, options.output
+
+    parse_script(script)
+    write_two_col(content, two_col)
+
+    print "Converted %s to 2 column format and saved as %s" %(script, two_col)
diff --git a/TDD/using_python_framework_for_tdd/tdd2.tex b/TDD/using_python_framework_for_tdd/tdd2.tex
new file mode 100644
index 0000000..561f4a2
--- /dev/null
+++ b/TDD/using_python_framework_for_tdd/tdd2.tex
@@ -0,0 +1,365 @@
+\documentclass[12pt,presentation]{beamer}
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage{fixltx2e}
+\usepackage{graphicx}
+\usepackage{longtable}
+\usepackage{float}
+\usepackage{wrapfig}
+\usepackage{soul}
+\usepackage{textcomp}
+\usepackage{marvosym}
+\usepackage{wasysym}
+\usepackage{latexsym}
+\usepackage{amssymb}
+\usepackage{hyperref}
+\tolerance=1000
+\usepackage[english]{babel} \usepackage{ae,aecompl}
+\usepackage{mathpazo,courier,euler} \usepackage[scaled=.95]{helvet}
+\usepackage{listings}
+\lstset{language=Python, basicstyle=\ttfamily\bfseries,
+commentstyle=\color{red}\itshape, stringstyle=\color{green},
+showstringspaces=false, keywordstyle=\color{blue}\bfseries}
+\providecommand{\alert}[1]{\textbf{#1}}
+
+\title{SEES: Test Driven Development}
+\author{FOSSEE}
+
+\usetheme{Warsaw}\usecolortheme{default}\useoutertheme{infolines}\setbeamercovered{transparent}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+\begin{document}
+
+\begin{frame}
+\begin{center}
+\vspace{12pt}
+\textcolor{blue}{\huge Test Driven Development \\Part II}
+\end{center}
+\vspace{18pt}
+\begin{center}
+\vspace{10pt}
+\includegraphics[scale=0.95]{../images/fossee-logo.png}\\
+\vspace{5pt}
+\scriptsize Developed by FOSSEE Team, IIT-Bombay. \\ 
+\scriptsize Funded by National Mission on Education through ICT\\
+\scriptsize  MHRD,Govt. of India\\
+\includegraphics[scale=0.30]{../images/iitb-logo.png}\\
+\end{center}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Introduction}
+
+\begin{frame}
+  \frametitle{Objectives}
+  At the end of this tutorial, you will be able to,
+  \begin{itemize}
+  \item Know what are persistent test cases.
+  \item Write doctest \& unittest for any given function.
+  \item Understand the use of nosetest.
+ 
+  \end{itemize}
+  \end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{frame}
+\frametitle{Pre-requisite}
+\label{sec-3}
+
+Spoken tutorial on -
+\begin{itemize}
+\item Test Driven Development -- Part I
+\end{itemize}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{frame}[fragile]
+  \frametitle{Persistent Test Cases}
+  \begin{itemize}
+  \item Tests should be pre-determined and written, before the code
+  \item Test Data is repeatedly used; Hence, saved in persistent
+    format
+  \item Let's save data for fibonacci tests in a text file. 
+  \item The file shall have multiple lines of test data
+  \item Each line corresponds to a single test case
+  \item Each line consists of two comma separated values --
+    \begin{itemize}
+    \item First coloumn is the integer which has to be
+      passed to the function.
+    \item Second coloumn is the return value from the function.
+    \end{itemize}
+  \item Let us call our data file \texttt{fibonacci\_testcases.dat}
+  \end{itemize}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}[fragile]
+  \frametitle{Modify \texttt{fibonacci.py}}
+\begin{lstlisting}
+if __name__ == '__main__':
+    for line in open('fibonacci_testcases.dat'):
+        values = line.split(', ')
+        n = int(values[0])
+        a = int(values[1])
+
+        tc = fibonacci(n)
+        if tc != a:
+            print "Failed for n=%d.\
+            Expected %d. Obtained %d instead."\
+            % (n, a, tc)
+            exit(1)
+
+    print "All tests passed!"
+\end{lstlisting}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Python Testing Frameworks}
+
+\begin{frame}[fragile]
+  \frametitle{Python Testing Frameworks}
+  \begin{itemize}
+  \item Testing frameworks essentially, ease the job of the user
+  \item Python provides two frameworks for testing code
+    \begin{itemize}
+    \item \texttt{unittest} framework
+    \item \texttt{doctest} module
+    \end{itemize}
+  \end{itemize}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\subsection{\texttt{doctest} module}
+
+\begin{frame}[fragile]
+  \frametitle{doctest}
+  \begin{itemize}
+  \item Documentation always accompanies a well written piece of code
+  \item Use \texttt{docstring} to document functions or modules
+  \item Along with description and usage, examples can be added
+  \item Interactive interpreter session inputs and outputs are
+    copy-pasted 
+  \item \texttt{doctest} module picks up all such interactive examples
+  \item Executes them and determines if the code runs, as documented
+  \end{itemize}
+  Let's use the \texttt{doctest} module for our \texttt{fibonacci} function
+\end{frame}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{frame}[fragile]
+  \frametitle{doctest for \texttt{fibonacci.py}}
+\begin{tiny}
+\begin{lstlisting}
+def fibonacci(n):
+    """Returns the nth fibonacci number.
+
+    Args:
+      n: an integer
+    
+    
+    >>> fibonacci(3)
+    2
+    >>> fibonacci(4)
+    3
+    """
+    if n == 0:
+        return 0
+    elif n == 1:
+        return 1
+    else:
+        return fibonacci(n-1) + fibonacci(n-2) 
+\end{lstlisting}
+\end{tiny}
+\begin{itemize}
+\item We have added examples to the \texttt{docstring}
+\item Now we need to tell the \texttt{doctest} module to execute
+\end{itemize}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}[fragile]
+  \frametitle{doctest for \texttt{fibonacci.py} \ldots}
+\begin{lstlisting}
+if __name__ == "__main__":
+    import doctest
+    doctest.testmod()
+\end{lstlisting}
+\begin{itemize}
+\item \texttt{testmod} automatically picks all sample sessions
+\item Executes them and compares output with documented output
+\item It doesn't give any output, when all the results match 
+\item Complains only when one or more tests fail. 
+\end{itemize}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}[fragile]
+  \frametitle{\texttt{doctest} -- Execution}
+  \begin{itemize}
+  \item Run the doctests by running \texttt{fibonacci.py}
+\begin{lstlisting}
+$ python fibonacci.py
+\end{lstlisting} %$
+  \item All the tests pass, and doctest gives no output
+  \item For a more detailed report we can run with -v argument
+\begin{lstlisting}
+$ python fibonacci.py -v
+\end{lstlisting} %$
+  \item If the output contains a blank line, use \texttt{<BLANKLINE>}
+  \item To see a failing test case, replace \texttt{return a} with \texttt{b}
+  \end{itemize}
+\end{frame}
+
+\subsection{\texttt{unittest} framework}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}[fragile]
+  \frametitle{\texttt{unittest}}
+  \begin{itemize}
+  \item It won't be long, before we complain about the power of
+    \texttt{doctest} 
+  \item \texttt{unittest} framework can efficiently automate tests
+  \item Easily initialize code and data for executing the specific
+    tests
+  \item Cleanly shut them down once the tests are executed
+  \item Easily aggregate tests into collections and improved reporting
+  \end{itemize}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{frame}[fragile]
+  \frametitle{\texttt{unittest}ing \texttt{fibonacci.py}}
+  \begin{itemize}
+  \item Subclass the \texttt{TestCase} class in \texttt{unittest}
+  \item Place all the test code as methods of this class
+  \item Use the test cases present in \texttt{fibonacci\_testcases.dat}
+  \item Place the code in \texttt{test\_fibonacci.py} 
+  \end{itemize}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}[fragile,allowframebreaks]
+  \frametitle{\texttt{test\_fibonacci.py}}
+\small
+\begin{lstlisting}
+import fibonacci
+import unittest
+
+class TestFibonacciFunction(unittest.TestCase):
+
+    def setUp(self):
+        self.test_file = \
+        open('fibonacci_testcases.dat')
+        self.test_cases = []
+        for line in self.test_file:
+            values = line.split(', ')
+            n = int(values[0])
+            a = int(values[1])
+            
+            self.test_cases.append([n, a])
+
+    def test_fibonacci(self):
+        for case in self.test_cases:
+            n = case[0]
+            a = case[1]
+            self.assertEqual(fibonacci.fibonacci(n),a)
+
+    def tearDown(self):
+        self.test_file.close()
+        del self.test_cases
+
+if __name__ == '__main__':
+    unittest.main()
+\end{lstlisting}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}[fragile]
+  \frametitle{\texttt{test\_fibonacci.py}}
+  \begin{itemize}
+  \item \texttt{setUp} -- we read all the test data and store it in a
+    list
+  \item \texttt{tearDown} -- delete the data to free up memory and
+    close open file
+  \item \texttt{test\_fibonacci} -- actual test code
+  \item \texttt{assertEqual} -- compare actual result with expected one
+  \item Write documentation for above code. 
+  \end{itemize}
+\end{frame}
+
+\section{\texttt{nose}}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}[fragile]
+  \frametitle{\texttt{nose} tests}
+  \begin{itemize}
+  \item It is not easy to organize, choose and run tests scattered
+    across multiple files. 
+  \item \texttt{nose} module aggregate these tests automatically
+  \item Can aggregate \texttt{unittests} and \texttt{doctests}
+  \item Allows us to pick and choose which tests to run
+  \item Helps output the test-results and aggregate them in various
+    formats
+  \item Not part of the Python distribution itself
+\begin{lstlisting}
+$ easy_install nose
+\end{lstlisting} %$
+  \item Run the following command in the top level directory
+\begin{lstlisting}
+$ nosetests
+\end{lstlisting} %$
+  \end{itemize}
+\end{frame}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}
+\frametitle{Summary}
+\label{sec-8}
+
+  In this tutorial, we have learnt to,
+
+
+\begin{itemize}
+\item Use of persistent test cases for better control.
+\item Undestand the use of doctest \& unittest.
+\item Understand the use of nosetest .
+
+\end{itemize}
+\end{frame}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}[fragile]
+\frametitle{Evaluation}
+\label{sec-9}
+
+
+\begin{enumerate}
+\item ?
+\vspace{8pt}
+\item ? 
+\end{enumerate}
+\end{frame}
+\begin{frame}
+\frametitle{Solutions}
+\label{sec-10}
+
+
+\begin{enumerate}
+\item 
+\vspace{15pt}
+\item 
+\end{enumerate}
+\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{frame}
+
+  \begin{block}{}
+  \begin{center}
+  \textcolor{blue}{\Large THANK YOU!} 
+  \end{center}
+  \end{block}
+\begin{block}{}
+  \begin{center}
+    For more Information, visit our website\\
+    \url{http://fossee.in/}
+  \end{center}  
+  \end{block}
+\end{frame}
+
+
+\end{document}
diff --git a/TDD/using_python_framework_for_tdd/tdd2_script.rst b/TDD/using_python_framework_for_tdd/tdd2_script.rst
new file mode 100755
index 0000000..85c96d5
--- /dev/null
+++ b/TDD/using_python_framework_for_tdd/tdd2_script.rst
@@ -0,0 +1,198 @@
+.. Objectives
+.. ----------
+   
+   .. At the end of this tutorial, you will be able to:
+   
+   ..   1. Know what is TDD.
+   ..   2. Understand the use of test cases.
+   ..   3. Write simple tests for a function.
+
+.. Prerequisites
+.. -------------
+
+..   1. Test driven development - Part 1
+
+ 
+Script
+------
+
+.. L1
+
+{{{ Show the  first slide containing title, name of the production
+team along with the logo of MHRD }}}
+
+.. R1
+
+Hello friends and Welcome to the tutorial on 
+'Test driven development - Part 2'.
+
+.. L2
+
+{{{ Show slide with objectives }}} 
+
+.. R2
+
+At the end of this tutorial, you will be able to,
+
+ 1. understand use of persistent test cases.
+ #. write doctest and unittest for any given function.
+ #. and understand the use of nosetest.
+
+.. L3
+
+{{{ Switch to the slide3, pre-requisite slide }}}
+
+.. R3
+
+Before beginning this tutorial,we would suggest you to complete the 
+tutorial on "Test driven development-part 1".
+
+.. R4
+
+
+
+.. L4
+
+{{{ Switch to slide4 ,Persistent test cases}}}
+
+
+.. R5
+
+To illustrate TDD, lets take a simple program. Consider a 
+function ``fibonacci``, that takes one argument and returns 
+the nth number of ``fibonacci`` series.
+
+.. L5
+
+{{{ Switch to slide5, First test- fibonacci }}}
+
+.. R6 
+
+To test ``fibonacci`` function, we need test
+cases.
+As shown in this slide,
+test cases are expected outputs for a given set of inputs.
+
+
+.. L6
+
+{{{ Switch to slide6, Test cases }}}
+
+.. R7
+
+The sample code for test cases is shown here. Observe that if 
+any ``if`` statement is executed, test aborts after printing the
+error message.
+
+.. L7
+ 
+{{{ Switch to slide7, Test cases-Code }}}
+
+.. R8
+
+The ``fibonacci`` function is written just enough so that 
+test can run.
+
+
+.. L8
+
+{{{ switch to slide8, Stubs }}}
+
+.. R9
+
+Combine the function and test cases and put them together in 
+``fibonacci.py`` file.Add the test cases after name=main idiom.
+
+.. L9
+
+{{{ Switch to slide9, fibonacci.py }}}
+
+.. R10
+
+Lets run fibonacci.py by typing ``python fibonacci.py``.
+As we haven't written any meaningful code in our ``fibonacci``
+function, it fails immediately.
+Our next step is to write just minimum code to pass our tests.
+
+.. L10
+
+{{{ Run the fibonacci.py in terminal and show the error output.}}}
+::
+     
+    python fibonacci.py
+
+.. R11
+
+Modify the fibonacci stub function with given code. 
+Save and run it again as `` python fibonacci.py``. 
+{{{ pause }}}
+Observe that, there will be no errors, as 
+the test passes successfully.
+
+.. L11
+
+{{{ switch to slide-11, Euclidean Algorithm }}}
+Switch to terminal and modify fibonacci function in ``nano``
+editor and run.
+::
+
+    python fibonacci.py
+   
+.. R12
+
+The same ``fibonacci`` function is modified to make it more readable
+and easy to understand using recursion.
+Pause this video here.Replace the ``fibonacci`` function with recursive one.
+Run the modified ``fibonacci.py`` file. The test should pass again 
+without any errors.
+After successfully achieving this result, you can resume the video.
+
+.. L12
+
+{{{ Show slide12, Euclidean Algorithm- Recursive}}}
+
+
+.. R13
+
+This brings us to the end of the tutorial.In this tutorial,
+ we have learnt to,
+ 
+ 1. Undestand the basic steps involved in Test driven development.
+ #. Design a Test driven approach for a given ``fibonacci`` function.
+
+
+.. L13
+
+{{{ switch to slide-13,Summary }}}
+
+.. R14
+
+Here are some self assessment questions for you to solve
+ 1.
+
+ 2. 
+
+.. L14
+
+{{{ switch to slide-14, Evaluation }}}
+
+.. R15
+
+And the answers are,
+ 1.
+
+ 2.
+
+.. L15
+
+{{{ switch to slide-15 ,Solutions}}}
+
+.. R16
+
+Hope you have enjoyed this tutorial and found it useful.
+Thank you!
+
+.. L16
+
+{{{ Switch to slide-16, Thankyou}}}
+
diff --git a/TDD/using_python_frameworks_for_TDD/slide.tex b/TDD/using_python_frameworks_for_TDD/slide.tex
deleted file mode 100644
index a6308c4..0000000
--- a/TDD/using_python_frameworks_for_TDD/slide.tex
+++ /dev/null
@@ -1,299 +0,0 @@
-\documentclass[12pt,presentation]{beamer}
-\usepackage[utf8]{inputenc}
-\usepackage[T1]{fontenc}
-\usepackage{fixltx2e}
-\usepackage{graphicx}
-\usepackage{longtable}
-\usepackage{float}
-\usepackage{wrapfig}
-\usepackage{soul}
-\usepackage{textcomp}
-\usepackage{marvosym}
-\usepackage{wasysym}
-\usepackage{latexsym}
-\usepackage{amssymb}
-\usepackage{hyperref}
-\tolerance=1000
-\usepackage[english]{babel} \usepackage{ae,aecompl}
-\usepackage{mathpazo,courier,euler} \usepackage[scaled=.95]{helvet}
-\usepackage{listings}
-\lstset{language=Python, basicstyle=\ttfamily\bfseries,
-commentstyle=\color{red}\itshape, stringstyle=\color{green},
-showstringspaces=false, keywordstyle=\color{blue}\bfseries}
-\providecommand{\alert}[1]{\textbf{#1}}
-
-\title{Getting started with TDD}
-\author{FOSSEE}
-\institute{IIT Bombay}
-
-\usetheme{Warsaw}\usecolortheme{default}\useoutertheme{infolines}\setbeamercovered{transparent}
-
-\AtBeginSection[]
-{
-  \begin{frame}<beamer>
-    \frametitle{Outline}
-    \tableofcontents[currentsection]
-  \end{frame}
-}
-
-\begin{document}
-\begin{frame}
-
-\begin{center}
-\vspace{12pt}
-\textcolor{blue}{\huge Using Python Testing Frameworks}
-\end{center}
-\vspace{18pt}
-\begin{center}
-\vspace{10pt}
-\includegraphics[scale=0.95]{../../images/fossee-logo.png}\\
-\vspace{5pt}
-\scriptsize Developed by FOSSEE Team, IIT-Bombay. \\ 
-\scriptsize Funded by National Mission on Education through ICT\\
-\scriptsize  MHRD,Govt. of India\\
-\includegraphics[scale=0.30]{../../images/iitb-logo.png}\\
-\end{center}
-\end{frame}
-
-
-\begin{frame}
-  \frametitle{Objectives}
-  At the end of this section, you will be able to:
-  \begin{itemize}
-  \item Use doctests to test your Python code.
-  \item Use unittests to test your Python code.
-  \item Use the nose module to test your code.
-  \end{itemize}
-\end{frame}
-
-\begin{frame}
-\frametitle{Pre-requisite}
-\label{sec-3}
-
-Spoken tutorial on Basic Python
-\begin{itemize}
-\item Topic of tutorial here
-\end{itemize}
-\end{frame}
-
-
-\section{Python Testing Frameworks}
-
-\begin{frame}[fragile]
-  \frametitle{Python Testing Frameworks}
-  \begin{itemize}
-  \item Testing frameworks essentially, ease the job of the user
-  \item Python provides two frameworks for testing code
-    \begin{itemize}
-    \item \texttt{unittest} framework
-    \item \texttt{doctest} module
-    \end{itemize}
-  \end{itemize}
-\end{frame}
-
-\subsection{\texttt{doctest} module}
-
-\begin{frame}[fragile]
-  \frametitle{doctest}
-  \begin{itemize}
-  \item Documentation always accompanies a well written piece of code
-  \item Use \texttt{docstring} to document functions or modules
-  \item Along with description and usage, examples can be added
-  \item Interactive interpreter session inputs and outputs are
-    copy-pasted 
-  \item \texttt{doctest} module picks up all such interactive examples
-  \item Executes them and determines if the code runs, as documented
-  \end{itemize}
-  Let's use the \texttt{doctest} module for our \texttt{gcd} function
-\end{frame}
-
-
-\begin{frame}[fragile]
-  \frametitle{doctest for \texttt{gcd.py}}
-\begin{tiny}
-\begin{lstlisting}
-def gcd(a, b):
-    """Returns the Greatest Common Divisor of the two integers
-    passed as arguments.
-
-    Args:
-      a: an integer
-      b: another integer
-
-    Returns: Greatest Common Divisor of a and b
-
-    >>> gcd(48, 64)
-    16
-    >>> gcd(44, 19)
-    1
-    """
-    if b == 0:
-        return a
-    return gcd(b, a%b) 
-\end{lstlisting}
-\end{tiny}
-\begin{itemize}
-\item We have added examples to the \texttt{docstring}
-\item Now we need to tell the \texttt{doctest} module to execute
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]
-  \frametitle{doctest for \texttt{gcd.py} \ldots}
-\begin{lstlisting}
-if __name__ == "__main__":
-    import doctest
-    doctest.testmod()
-\end{lstlisting}
-\begin{itemize}
-\item \texttt{testmod} automatically picks all sample sessions
-\item Executes them and compares output with documented output
-\item It doesn't give any output, when all the results match 
-\item Complains only when one or more tests fail. 
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]
-  \frametitle{\texttt{doctest} -- Execution}
-  \begin{itemize}
-  \item Run the doctests by running \texttt{gcd.py}
-\begin{lstlisting}
-$ python gcd.py
-\end{lstlisting} %$
-  \item All the tests pass, and doctest gives no output
-  \item For a more detailed report we can run with -v argument
-\begin{lstlisting}
-$ python gcd.py -v
-\end{lstlisting} %$
-  \item If the output contains a blank line, use \texttt{<BLANKLINE>}
-  \item To see a failing test case, replace \texttt{return a} with \texttt{b}
-  \end{itemize}
-\end{frame}
-
-\subsection{\texttt{unittest} framework}
-
-\begin{frame}[fragile]
-  \frametitle{\texttt{unittest}}
-  \begin{itemize}
-  \item It won't be long, before we complain about the power of
-    \texttt{doctest} 
-  \item \texttt{unittest} framework can efficiently automate tests
-  \item Easily initialize code and data for executing the specific
-    tests
-  \item Cleanly shut them down once the tests are executed
-  \item Easily aggregate tests into collections and improved reporting
-  \end{itemize}
-\end{frame}
-
-
-\begin{frame}[fragile]
-  \frametitle{\texttt{unittest}}
-  \begin{itemize}
-  \item It won't be long, before we complain about the power of
-    \texttt{doctest} 
-  \item \texttt{unittest} framework can efficiently automate tests
-  \item Easily initialize code and data for executing the specific
-    tests
-  \item Cleanly shut them down once the tests are executed
-  \item Easily aggregate tests into collections and improved reporting
-  \end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]
-  \frametitle{\texttt{unittest}ing \texttt{gcd.py}}
-  \begin{itemize}
-  \item Subclass the \texttt{TestCase} class in \texttt{unittest}
-  \item Place all the test code as methods of this class
-  \item Use the test cases present in \texttt{gcd\_testcases.dat}
-  \item Place the code in \texttt{test\_gcd.py} 
-  \end{itemize}
-\end{frame}
-
-\begin{frame}[fragile,allowframebreaks]
-  \frametitle{\texttt{test\_gcd.py}}
-\small
-\begin{lstlisting}
-import gcd
-import unittest
-
-class TestGcdFunction(unittest.TestCase):
-
-    def setUp(self):
-        self.test_file = open('gcd_testcases.dat')
-        self.test_cases = []
-        for line in self.test_file:
-            values = line.split(', ')
-            a = int(values[0])
-            b = int(values[1])
-            g = int(values[2])
-
-            self.test_cases.append([a, b, g])
-
-    def test_gcd(self):
-        for case in self.test_cases:
-            a = case[0]
-            b = case[1]
-            g = case[2]
-            self.assertEqual(gcd.gcd(a, b), g)
-
-    def tearDown(self):
-        self.test_file.close()
-        del self.test_cases
-
-if __name__ == '__main__':
-    unittest.main()
-\end{lstlisting}
-\end{frame}
-
-\begin{frame}[fragile]
-  \frametitle{\texttt{test\_gcd.py}}
-  \begin{itemize}
-  \item \texttt{setUp} -- we read all the test data and store it in a
-    list
-  \item \texttt{tearDown} -- delete the data to free up memory and
-    close open file
-  \item \texttt{test\_gcd} -- actual test code
-  \item \texttt{assertEqual} -- compare actual result with expected one
-  \item Write documentation for above code. 
-  \end{itemize}
-\end{frame}
-
-\section{\texttt{nose}}
-
-\begin{frame}[fragile]
-  \frametitle{\texttt{nose} tests}
-  \begin{itemize}
-  \item It is not easy to organize, choose and run tests scattered
-    across multiple files. 
-  \item \texttt{nose} module aggregate these tests automatically
-  \item Can aggregate \texttt{unittests} and \texttt{doctests}
-  \item Allows us to pick and choose which tests to run
-  \item Helps output the test-results and aggregate them in various
-    formats
-  \item Not part of the Python distribution itself
-\begin{lstlisting}
-$ easy_install nose
-\end{lstlisting} %$
-  \item Run the following command in the top level directory
-\begin{lstlisting}
-$ nosetests
-\end{lstlisting} %$
-  \end{itemize}
-\end{frame}
-
-\begin{frame}
-
-  \begin{block}{}
-  \begin{center}
-  \textcolor{blue}{\Large THANK YOU!} 
-  \end{center}
-  \end{block}
-\begin{block}{}
-  \begin{center}
-    For more Information, visit our website\\
-    \url{http://fossee.in/}
-  \end{center}  
-  \end{block}
-\end{frame}
-
-\end{document}
-- 
cgit