import unittest
from my_string_calculator import StringCalculator 

class TestStudent4CasesOnMe(unittest.TestCase):
    def setUp(self):
        self.calculator = StringCalculator()

    def test_empty_string_returns_zero(self):
        self.assertEqual(self.calculator.add(""), 0)

    def test_single_number_returns_value(self):
        self.assertEqual(self.calculator.add("1"), 1)

    def test_two_numbers_return_sum(self):
        self.assertEqual(self.calculator.add("1,2"), 3)

    def test_add_multiple_numbers(self):
        self.assertEqual(self.calculator.add("1,2,3,4,5"), 15)

    def test_add_numbers_with_newlines(self):
        self.assertEqual(self.calculator.add("1\n2\n3"), 6)

    def test_add_negative_numbers(self):
        with self.assertRaises(ValueError) as e:
            self.calculator.add("-1,2,-3")
        self.assertEqual(str(e.exception), "Negatives not allowed: -1, -3")

    def test_add_numbers_with_custom_delimiter(self):
        self.assertEqual(self.calculator.add("//;\n1;2;3"), 6)

    def test_add_numbers_with_custom_delimiter_different_symbol(self):
        self.assertEqual(self.calculator.add("//#\n4#5#6"), 15)

    def test_custom_delimiter_with_multiple_numbers(self):
        self.assertEqual(self.calculator.add("//:\n1:2:3:4:5:6"), 21)

    def test_add_numbers_greater_than_1000(self):
        self.assertEqual(self.calculator.add("1,1001,2,3"), 6)

    def test_add_numbers_with_newlines_and_ignore_above_1000(self):
        self.assertEqual(self.calculator.add("1\n2\n1000\n1001"), 1003)

    def test_add_numbers_with_custom_delimiter_long_length(self):
        self.assertEqual(self.calculator.add("//[***]\n1***2***3"), 6)

    def test_custom_long_delimiter_with_large_number_ignored(self):
        self.assertEqual(self.calculator.add("//[***]\n1***1001***2"), 3)

    def test_custom_long_delimiter_with_negative_numbers(self):
        with self.assertRaises(ValueError) as e:
            self.calculator.add("//[***]\n1***-2***3***-4")
        self.assertEqual(str(e.exception), "Negatives not allowed: -2, -4")

if __name__ == "__main__":
    unittest.main()