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))
Example #2
0
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)
Example #3
0
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"))