The Three Rules of TDD
- You are not allowed to write any production code unless it is to make a failing unit test pass.
- You are not allowed to write any more of a unit test than is sufficient to fail; and compilation failures are failures.
- You are not allowed to write any more production code than is sufficient to pass the one failing unit test.
Which means the workflow is:
- Write a failing test. Stop writing the test as soon as it fails.
- Write the minimal production code required for the test to pass. Stop writing any code once the test passes.
- Refactor the test code and the production code without altering the functionality. All tests should pass.
Usage
To run the tests, run npm run test
.
For a true TDD experience: use wallaby.js with the included wallaby.js
file.
Katas
Greeter
Before you start:
- Try not to read ahead.
- Do one task at a time. The trick is to learn to work incrementally.
This kata demonstrates the problems of static scoped functions and objects.
All tests should always pass, regardless of environment conditions.
- Write a
Greeter
class withgreet
function that receives aname
as input and outputsHello <name>
. The signature ofgreet
should not change throughout the kata. You are allowed to constructGreeter
object as you please. greet
trims the inputgreet
capitalizes the first letter of the namegreet
returnsGood morning <name>
when the time is 06:00-12:00greet
returnsGood evening <name>
when the time is 18:00-22:00greet
returnsGood night <name>
when the time is 22:00-06:00greet
logs into console each time it is called
String Calculator
Made popular by Roy Osherove.
Before you start:
- Try not to read ahead.
- Do one task at a time. The trick is to learn to work incrementally.
- Make sure you only test for correct inputs. there is no need to test for invalid inputs for this kata
This kata is one of the simplest and best ways to practice step-by-step fluent tdd, and provides an easy way to get proficient in a language.
Write a method add
under an object StringCalculator
that, given a delimited string, returns the sum of the numbers in the string.
- An empty string returns zero
'' => 0
- A single number returns the value
'1' => 1
'2' => 2
- Two numbers, comma delimited, returns the sum
'1,2' => 3
'10,20' => 30
- Two numbers, newline delimited, returns the sum
'1\n2' => 3
- Three numbers, delimited either way, returns the sum
'1\n2,3\n4' => 10
- Negative numbers throw an exception with the message
'-1,2,-3' => 'negatives not allowed: -1,-3'
stop here if you are a beginner. Continue if you can finish the steps so far in less than 30 minutes.
- Numbers greater than 1000 are ignored
- A single char delimiter can be defined on the first line starting with
//
(e.g//#\n1#2
for a ‘#’ as the delimiter) - A multi char delimiter can be defined on the first line starting with
//
(e.g.//###\n1###2
for ‘###’ as the delimiter)
Prime Factors
Made popular by Uncle Bob.
This kata demonstrates the transformation priority premise
.
Write a function generate
under a module PrimeFactors
that, given an integer, returns the list
containing the prime factors in numerical sequence.
- 1 should return
[]
- 2 should return
[2]
- 3 should return
[3]
- 4 should return
[2,2]
- 5 should return
[5]
- 6 should return
[2,3]
- 7 should return
[7]
- 8 should return
[2,2,2]
- 9 should return
[3,3]
- 4620 should return
[2,2,3,5,7,11]
Bowling Game
See the original presentation.
This kata demonstrates the power of doing tests first, and how up-front design decisions can change and give way to a simpler implementation by coding iteratively.
Write a BowlingGame
object with methods roll(pins)
and getScore()
.
This will be the game engine which follows the rules of bowling:
- The game consists of 10 frames, in each frame the player has the ability to knock down 10 pins.
- The score for the frame is the total number of pins knocked down + bonuses for
strikes
andspares
. - A
spare
is when the player knocks down all 10 pins in 2 tries. The bonus for a spare is the next roll. - A
strike
is when the player knocks down all 10 pins in 1 try. The bonus is the next 2 rolls. - In the tenth frame a player who rolls a spare / strike gets an extra roll(s) to complete the frame.
- No more than 3 rolls can be rolled in the 10th frame.
FizzBuzz
This kata is different on purpose: there is no example code to refer/compare to. It leaves more room for exploration of different approaches.
- Write a program that returns array of numbers from 1 to 100, while multiples of three return "Fizz" instead of the number, multiples of five return "Buzz". Multiples of both three and five return "FizzBuzz".
- Add a way to change range, instead of printing numbers from 1 to 100. Examples: numbers from 1 to 20, from 15 to 50.
- Add rules for 7 and 11: 7 returns "Foo", 11 returns "Boo" and multiples of both return "FooBoo".
- Add new rule for numbers smaller than 16 which return "Small" and a rule for numbers bigger than 95 which return "Big".
- Add ability to change rules for initial requirement, instead of "Fizz" (multiples of 3) return "Buzz", and instead of "Buzz" (multiples of 5) return "Fizz"
- Add new rule for "multiples of 3 and 5" return "FTW", and for "multiples of 3 or 5" return "GG"