def test_add_unknown_amount_of_numbers(self): calc = StringCalculator() theList = range(1, randint(10, 1000), 1) shuffle(theList) theStrLst = ",".join(map(lambda x: "%s" % x, theList)) self.assertEqual(reduce(lambda x, y: x + y, theList), calc.add(theStrLst))
def main(): if len(sys.argv) == 2: calculator = StringCalculator() decoded_input = decode(sys.argv[1], 'unicode_escape') result = calculator.add(decoded_input) print(result) else: print( "Usage: python main.py //[delimiter]\\n[delimiter separated numbers]" ) sys.exit(1)
class StringCalculatorsTest(unittest.TestCase): def setUp(self): self.calculator = StringCalculator() def test_stringcalculator_emptylist_shouldreturn0(self): self.assertEqual(0, self.calculator.add("")) def test_stringcalculator_listof1_shouldreturn1(self): self.assertEqual(1, self.calculator.add("1")) def test_stringcalculator_listofN_shouldreturnN(self): rand = randint(1, 1000) self.assertEqual(1, self.calculator.add("1")) self.assertEqual(7, self.calculator.add("7")) self.assertEqual(99, self.calculator.add("99")) self.assertEqual(0, self.calculator.add("0")) self.assertEqual(rand, self.calculator.add(str(rand))) def test_stringcalculator_listoftwo_shouldreturnsumoftwo(self): self.assertEqual(self.calculator.add("1,2"), 3) self.assertEqual(self.calculator.add("5,10"), 15) self.assertEqual(self.calculator.add("88,9"), 88 + 9) rand1 = randint(1, 1000) rand2 = randint(1, 1000) self.assertEqual( self.calculator.add('{0!s},{1!s}'.format(rand1, rand2)), rand1 + rand2) def test_stringcalculator_listendingwithcomma_shouldnotbreak(self): self.assertEqual(self.calculator.add("1,"), 1) def test_stringcalculator_liststartingwithcomma_shouldnotbreak(self): self.assertEqual(self.calculator.add(",8"), 8) def test_stringcalculator_listwithmultipleemptycommas_shouldnotbreak(self): self.assertEqual(self.calculator.add(",,,,8,,,,"), 8) self.assertEqual(self.calculator.add(",,3,,,,5,,"), 8) self.assertEqual(self.calculator.add("3,,,,,,5,,"), 8) self.assertEqual(self.calculator.add(",,3,,,,,,5"), 8) self.assertEqual(self.calculator.add("3,,,,,,,,5"), 8) def test_stringcalculator_multiplenumber_shouldreturnsum(self): self.assertEqual(self.calculator.add("1,2,3,4"), 10) self.assertEqual(self.calculator.add("2,2,2,2,2,2,2,2,2,2"), 20) def test_stringcalculator_newlinesarelikecommas_shouldreturnsum(self): self.assertEqual(self.calculator.add("1\n2,3"), 6) self.assertEqual(self.calculator.add("1\n,,"), 1) def test_stringcalculator_changedelimiterintheformat_shouldreturnsum(self): self.assertEqual(self.calculator.add("//;\n1;2"), 3) self.assertEqual(self.calculator.add("//kk\n1kk2"), 3) self.assertEqual(self.calculator.add("///\n1/2"), 3) def test_stringcalculator_passingnegativenumber_shouldthrowexception(self): with self.assertRaises(NegativeNotAllowedException) as ctx: self.calculator.add("1,-2") exc = ctx.exception self.assertEqual("negatives not allowed: -2", str(exc)) def test_stringcalculator_numberbiggerthan1000_shouldbeignore(self): self.assertEqual(self.calculator.add("1001,1"), 1) self.assertEqual(self.calculator.add("1000,1"), 1001)
def test_multiple_delimiters_of_any_length(self): calc = StringCalculator() self.assertEqual(15, calc.add("//[**][%=]\n1**2%=3**4**5"))
def test_call_add_with_one_number(self): calc = StringCalculator() self.assertEqual(1, calc.add("1"))
def test_empty_string(self): self.assertEqual(StringCalculator.add(''), 0)
def test_one_char_separat(self): self.assertEqual(StringCalculator.add('//#\n1#2#3#1000'), 6)
def test_negative_number(self): self.assertEqual(StringCalculator.add('-1,2,-3'), 'отрицательные числа запрещены: -1,-3')
def test_if_separated_new_line(self): self.assertEqual(StringCalculator.add('1\n2'), 3)
def test_negative_number_will_throw_an_exception(self): calc = StringCalculator() try: calc.add("-1") except Exception, m: self.assertEqual("negatives not allowed: -1", m.message)
def test_add_supports_different_delimiters(self): calc = StringCalculator() self.assertEqual(3, calc.add("//;\n1;2"))
def test_add_allow_new_lines_between_numbers(self): calc = StringCalculator() self.assertEqual(6, calc.add("1\n2,3"))
def test_call_add_with_an_arbitrary_number_of_numbers(self): calc = StringCalculator() sumIs55 = ",".join(map(lambda x: "%s" % x, range(1, 11))) self.assertEqual(55, calc.add(sumIs55))
def test_call_add_with_two_numbers(self): calc = StringCalculator() self.assertEqual(3, calc.add("1,2"))
class TestStringCalculator(unittest.TestCase): def setUp(self): self.logger = Mock(spec_set=['write']) self.webservice = Mock(spec_set=['logging_failed']) self.calc = StringCalculator(self.logger, self.webservice) self.valid_input = '1,2' self.sum_of_valid_input = 3 def test_add_emptyString_returnsZero(self): self.assertEqual(0, self.calc.add('')) def test_add_singleNumber_returnsSameNumber(self): self.assertEqual(5, self.calc.add('5')) def test_add_twoNumbers_returnsSum(self): self.assertEqual(7, self.calc.add('2,5')) def test_add_fourNumbers_returnsSum(self): self.assertEqual(20, self.calc.add('3,7,9,1')) def test_add_threeNumbersWithNewline_returnsSum(self): self.assertEqual(8, self.calc.add('2\n5,1')) def test_add_customDelimiter_returnsSum(self): self.assertEqual(8, self.calc.add('//;\n2;1;5')) def test_add_negativeNumber_raisesException(self): self.assertRaisesRegex(ValueError, 'negatives not allowed', lambda: self.calc.add('1,-1')) def test_add_numberLargerThan1000_returnsSumLargeNumberIgnored(self): self.assertEqual(2, self.calc.add('2,1001')) def test_add_multiCharDelimiter_returnsSum(self): self.assertEqual(6, self.calc.add('//[***]\n1***2***3')) def test_add_multipleDelimiters_returnsSum(self): self.assertEqual(6, self.calc.add('//[*][%]\n1*2%3')) def test_add_multipleDelimitersMultiChar_returnsSum(self): self.assertEqual(6, self.calc.add('//[*][%%]\n1*2%%3')) def test_add_validInput_logsResult(self): self.calc.add(self.valid_input) self.logger.write.assert_called_with('{}\n'.format(self.sum_of_valid_input)) def test_add_loggerRaisesException_notifiesWebservice(self): logging_error_message = 'Logging failed' self.logger.write.side_effect = RuntimeError(logging_error_message) self.calc.add(self.valid_input) self.webservice.logging_failed.assert_called_with(logging_error_message)
def test_if_separated_comma(self): self.assertEqual(StringCalculator.add('10,20'), 30)
def test_multiple_negatives_will_throw_an_exception_with_all_of_them(self): calc = StringCalculator() try: calc.add("-1,-3,4,-5") except Exception, m: self.assertEqual("negatives not allowed: -1,-3,-5", m.message)
def test_more_two_numbers_with_diff_separate(self): self.assertEqual(StringCalculator.add('1\n2,3\n4'), 10)
def test_numbers_bigger_than_1000_should_be_ignored(self): calc = StringCalculator() self.assertEqual(2, calc.add("2,1001"))
def test_ignore_number_more_1000(self): self.assertEqual(StringCalculator.add('1000, 2, 3'), 5)
def test_call_add_with_empty_string(self): calc = StringCalculator() self.assertEqual(0, calc.add(""))
def test_multi_char_separat(self): self.assertEqual(StringCalculator.add('//###\n1###2###5'), 8)
def test_delimiters_can_be_of_any_length(self): calc = StringCalculator() self.assertEqual(6, calc.add("//[***]\n1***2***3"))
def test_single_number(self): self.assertEqual(StringCalculator.add('10'), 10)
def test_multiple_delimiters(self): calc = StringCalculator() self.assertEqual(6, calc.add("//[*][%]\n1*2%3"))