import re import unittest class StringCalculator: def add(self, numbers: str) -> int: # Feature 1: Leerer String ergibt 0 if not numbers: return 0 # Vorbereitung für weiter features if numbers.startswith("//"): delimiter_end_index = numbers.index("\n") delimiter = numbers[2:delimiter_end_index] numbers = numbers[delimiter_end_index + 1:] numbers = numbers.replace(delimiter, ",") # Feature 3: Erlaube Zeilenumbrüche als Trenner numbers = numbers.replace("\n", ",") # Aufteilen der Zahlen durch Komma number_list = numbers.split(",") # Feature 4: Negativzahlen abfangen negatives = [] for num in number_list: if num.strip() != "": value = int(num) if value < 0: negatives.append(value) # Exception bei negativen Zahlen if negatives: raise ValueError(f"Negative numbers are not allowed: {', '.join(map(str, negatives))}") # Feature 2: Beliebig viele Zahlen summieren return sum(int(n) for n in number_list if n.strip() != "") class TestStringCalculator(unittest.TestCase): """Test suite for the StringCalculator class.""" def setUp(self): """neue Instanz des StringCalculators vor jedem Test""" self.calculator = StringCalculator() def test_empty_string_returns_zero(self): """Feature 1: Leerer String soll 0 ergeben""" self.assertEqual(self.calculator.add(""), 0) def test_single_number_returns_value(self): """Ein einzelner Wert soll zurückgegeben werden""" self.assertEqual(self.calculator.add("1"), 1) def test_two_numbers_return_sum(self): """Zwei Zahlen sollen summiert werden""" self.assertEqual(self.calculator.add("1,2"), 3) def test_add_multiple_numbers(self): """Feature 2: Mehrere Zahlen summieren""" self.assertEqual(self.calculator.add("1,2,3,4,5"), 15) def test_add_numbers_with_newlines(self): """Feature 3: Zeilenumbrüche als Trennzeichen""" self.assertEqual(self.calculator.add("1\n2\n3"), 6) def test_add_negative_numbers(self): """Feature 4: Negative Zahlen sollen Fehler werfen""" with self.assertRaises(ValueError) as e: self.calculator.add("-1,2,-3") self.assertEqual(str(e.exception), "Negative numbers are not allowed: -1, -3") def test_add_numbers_with_custom_delimiter(self): """Feature 5: Benutzerdefiniertes Trennzeichen""" self.assertEqual(self.calculator.add("//;\n1;2;3"), 6) def test_add_numbers_with_custom_delimiter_different_symbol(self): """Feature 5: Benutzerdefiniertes Trennzeichen mit anderem Symbol""" self.assertEqual(self.calculator.add("//#\n4#5#6"), 15) def test_custom_delimiter_with_multiple_numbers(self): """ Kombinierter Test für: feature 5 und feature 2 Erwartet wird die korrekte Addition von sechs durch ein benutzerdefiniertes Zeichen getrennten Zahlen. """ self.assertEqual(self.calculator.add("//:\n1:2:3:4:5:6"), 21) if __name__ == '__main__': unittest.main()