String Calculator
This classic kata guides you step by step through the implementation of a calculator that receives a String as input.
It is a good exercise on refactoring and incremental implementation. It is also a good candidate for practising TDD.
First step
Create a function add that takes a String and returns a String:
String add(String number)
- The method can take 0, 1 or 2 numbers separated by comma, and returns their sum.
- An empty string will return “0”.
- Example of inputs:
"","1","1.1,2.2".
Many numbers
Allow the add method to handle an unknow number of arguments.
Newline as separator
Allow the add method to handle newlines as separators:
"1\n2,3"should return"6"."175.2,\n35"is invalid and should return the message"Number expected but '\n' found at position 6."
Missing number in last position
Don’t allow the input to end in a separator.
"1,3,"is invalid and should return the messageNumber expected but EOF found.
Custom separators
Allow the add method to handle a different delimiter. To change the delimiter, the beginning of the input will contain a separate line that looks like this:
//[delimiter]\n[numbers]
"//;\n1;2"should return"3""//|\n1|2|3"should return"6""//sep\n2sep3"should return"5""//|\n1|2,3"is invalid and should return the message"'|' expected but ',' found at position 3."
All existing scenarios should work as before.
Negative numbers
Calling add with negative numbers will return the message "Negative not allowed : " listing all negative numbers that were in the list of numbers.
"-1,2"is invalid and should return the message"Negative not allowed : -1""2,-4,-5"is invalid and should return the message"Negative not allowed : -4, -5"
Multiple errors
Calling add with multiple errors will return all error messages separated by newlines.
"-1,,2"is invalid and return the message"Negative not allowed : -1\nNumber expected but ',' found at position 3.""-1,,-2"is invalid and return the message"Negative not allowed : -1\nNumber expected but ',' found at position 3.\nNegative not allowed : -2"
Errors management
Introduce an internal add function returning a number instead of a String, and test many solutions for the error messages.
- Exception
maybeand monad approch- POSIX return code with message managemement
- tuple with error struct like in Go
- etc.
Other operations
Write a function for multiply with same rules