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 calculator() -> StringCalculator: return StringCalculator()
def test_extract_delimiter_with_arbitrary_length_delimiter(self): self.assertEqual( StringCalculator().extract_delimiter("//$$$\n1$$$2$$$3"), ("1$$$2$$$3", "$$$"))
def test_extract_delimiter_with_multiple_delimiter(self): self.assertEqual(StringCalculator().extract_delimiter("//$,@\n1$2@3"), ("1$2@3", "$,@"))
def test_delimiters_can_be_of_any_length(self): calc = StringCalculator() self.assertEqual(6, calc.add("//[***]\n1***2***3"))
def test_handle_negative_numbers_with_negative_inputs(self): self.assertRaises(Exception, StringCalculator().handle_negative_numbers, [1, -4, 5, -7])
def test_add_multiple_delimiters_bonus_three(self): self.assertEqual(StringCalculator().add("//$,@,*\n1$2@3*6"), 12)
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_large_numbers_bonus_one(self): self.assertEqual(StringCalculator().add("1000,2000,3"), 3)
def test_add_delimiters_arbitrary_length_bonus_two(self): self.assertEqual(StringCalculator().add("//$$\n1$$20$$3000"), 21)
def test_add_negative_inputs(self): self.assertRaises(Exception, StringCalculator().handle_negative_numbers, "1, -4, 5, -7")
def test_add_custom_delimiter(self): self.assertEqual(StringCalculator().add("//%\n1%3%4"), 8)
def test_add_comma_delimiter_with_new_line(self): self.assertEqual(StringCalculator().add("\n10, 3, 5"), 18)
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_add_multiple_delimiters_arbitrary_length_bonus_four(self): self.assertEqual(StringCalculator().add("//$$,@\n1$$20@3000"), 21)
def test_add_allow_new_lines_between_numbers(self): calc = StringCalculator() self.assertEqual(6, calc.add("1\n2,3"))
def test_add_list(self): self.assertEqual(StringCalculator().add_list([19, 2, 37]), 58)
def test_call_add_with_empty_string(self): calc = StringCalculator() self.assertEqual(0, calc.add(""))
def test_add_large_number(self): self.assertEqual(StringCalculator().add_list([19, 2, 1000]), 21)
def test_multiple_delimiters_of_any_length(self): calc = StringCalculator() self.assertEqual(15, calc.add("//[**][%=]\n1**2%=3**4**5"))
def test_add_empty_list(self): self.assertEqual(StringCalculator().add_list([]), 0)
def test_extract_delimiter_with_custom_delimiter(self): self.assertEqual(StringCalculator().extract_delimiter("//$\n1,2,3"), ("1,2,3", "$"))
def test_single_input(self): self.assertEqual(StringCalculator().add_list([1]), 1)
def test_add_empty_input(self): self.assertEqual(StringCalculator().add(""), 0)
def test_parse_input_with_comma(self): self.assertEqual(StringCalculator().parse_input("1,56,78"), [1, 56, 78])
def test_extract_delimiter_multiple_delimiters_arbitrary_length(self): self.assertEqual( StringCalculator().extract_delimiter("//$$$,@@\n1$$$2@@3"), ("1$$$2@@3", "$$$,@@"))
def test_parse_input_empty_string(self): self.assertEqual(StringCalculator().parse_input(""), [])
def setUp(self): self.calculator = StringCalculator()
def test_parse_input_single_input(self): self.assertEqual(StringCalculator().parse_input("1"), [1])
def test_call_add_with_two_numbers(self): calc = StringCalculator() self.assertEqual(3, calc.add("1,2"))
def test_add_comma_delimiter(self): self.assertEqual(StringCalculator().add("1,2,3"), 6)
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 test_parse_input_single_input_with_newline_suffix(self): self.assertEqual(StringCalculator().parse_input("1\n"), [1])
def test_add_supports_different_delimiters(self): calc = StringCalculator() self.assertEqual(3, calc.add("//;\n1;2"))
def test_parse_input_with_newline_and_comma(self): self.assertEqual(StringCalculator().parse_input("1,\n2,3"), [1, 2, 3])
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_parse_input_with_multiple_delimiters(self): self.assertEqual(StringCalculator().parse_input("1$2@3", "$,@"), [1, 2, 3])
def test_numbers_bigger_than_1000_should_be_ignored(self): calc = StringCalculator() self.assertEqual(2, calc.add("2,1001"))
def test_parse_input_with_arbitrary_length_delimiter(self): self.assertEqual(StringCalculator().parse_input("1$$$2$$$3", "$$$"), [1, 2, 3])
def test_multiple_delimiters(self): calc = StringCalculator() self.assertEqual(6, calc.add("//[*][%]\n1*2%3"))
def test_extract_delimiter_with_comma_delimiter(self): self.assertEqual(StringCalculator().extract_delimiter("//,\n1,2,3"), ("1,2,3", ","))
def test_call_add_with_one_number(self): calc = StringCalculator() self.assertEqual(1, calc.add("1"))