def test_虚部の条件(self):
        with self.subTest("実部は整数以外の型であってはならない"):
            self.assertRaises(ImaginaryPartConditionError,
                              lambda: PurelyImaginaryNumber("1"))

        with self.subTest("実部は0であってはならない"):
            self.assertRaises(ImaginaryPartConditionError,
                              lambda: PurelyImaginaryNumber(0))
    def test_2つの純虚数の同一性の判定(self):
        with self.subTest("3i と 3i は同一である"):
            self.assertEqual(PurelyImaginaryNumber(3),
                             PurelyImaginaryNumber(3))

        with self.subTest("3i と 4i は同一ではない"):
            self.assertNotEqual(PurelyImaginaryNumber(3),
                                PurelyImaginaryNumber(4))
    def test_純虚数の生成とその文字列表現(self):
        with self.subTest("正常系: 2 -> '2i'"):
            self.assertEqual("2i", PurelyImaginaryNumber(2).notation())

        with self.subTest("準正常系: 1 -> 'i'"):
            self.assertEqual("i", PurelyImaginaryNumber(1).notation())

        with self.subTest("準正常系: -1 -> '-i'"):
            self.assertEqual("-i", PurelyImaginaryNumber(-1).notation())
    def test_check_equality(self):
        with self.subTest('check being equal'):
            i_4_1 = PurelyImaginaryNumber(MyInt(4))
            i_4_2 = PurelyImaginaryNumber(MyInt(4))
            self.assertTrue(i_4_1 == i_4_2)

        with self.subTest('check not being equal'):
            i_4 = PurelyImaginaryNumber(MyInt(4))
            i_2 = PurelyImaginaryNumber(MyInt(2))
            self.assertFalse(i_4 == i_2)
    def test_purely_imaginary_number(self):
        with self.subTest('create 4i'):
            i_4 = PurelyImaginaryNumber(MyInt(4))
            expected = '4i'
            actual = str(i_4)
            self.assertEqual(expected, actual)

        with self.subTest('create -2i'):
            minus_i_2 = PurelyImaginaryNumber(MyInt(-2))
            expected = '-2i'
            actual = str(minus_i_2)
            self.assertEqual(expected, actual)
    def test_purely_imaginary_number_with_1(self):
        with self.subTest('create i'):
            i_1 = PurelyImaginaryNumber(MyInt(1))
            expected = 'i'
            actual = str(i_1)
            self.assertEqual(expected, actual)

        with self.subTest('create -i'):
            minus_i_1 = PurelyImaginaryNumber(MyInt(-1))
            expected = '-i'
            actual = str(minus_i_1)
            self.assertEqual(expected, actual)
    def test_conjugate(self):
        with self.subTest('check 4'):
            i_4 = PurelyImaginaryNumber(MyInt(4))
            minus_i_4 = PurelyImaginaryNumber(MyInt(-4))
            self.assertTrue(i_4.is_conjugate_to(minus_i_4))

        with self.subTest('check 1'):
            i_1 = PurelyImaginaryNumber(MyInt(1))
            minus_i_1 = PurelyImaginaryNumber(MyInt(-1))
            self.assertTrue(i_1.is_conjugate_to(minus_i_1))
    def test_共役な純虚数(self):
        with self.subTest("正常系: 3i と共役な純虚数は -3i"):
            self.assertEqual(PurelyImaginaryNumber(-3),
                             PurelyImaginaryNumber(3).to_conjugate())

        with self.subTest("準正常系: i と共役な純虚数は -i"):
            self.assertEqual(PurelyImaginaryNumber(-1),
                             PurelyImaginaryNumber(1).to_conjugate())

        with self.subTest("準正常系: -i と共役な純虚数は i"):
            self.assertEqual(PurelyImaginaryNumber(1),
                             PurelyImaginaryNumber(-1).to_conjugate())
class ImaginaryNumber:
    def __init__(self, real_part: int, imaginary_part: int):
        self.real_part = RealNumber(real_part)
        self.imaginary_part = PurelyImaginaryNumber(imaginary_part)

    def __eq__(self, other: ImaginaryNumber) -> bool:
        return (self.real_part
                == other.real_part) and (self.imaginary_part
                                         == other.imaginary_part)

    def notation(self) -> str:
        if self.imaginary_part.value > 0:
            return f"{self.real_part.value} + {self.imaginary_part.notation()}"

        if self.imaginary_part.value < 0:
            return f"{self.real_part.value} - {self.imaginary_part.to_conjugate().notation()}"

    def to_conjugate(self) -> ImaginaryNumber:
        return ImaginaryNumber(self.real_part.value,
                               self.imaginary_part.to_conjugate().value)
 def __init__(self, real_part: int, imaginary_part: int):
     self.real_part = RealNumber(real_part)
     self.imaginary_part = PurelyImaginaryNumber(imaginary_part)
 def test_raise_zero_error(self):
     with self.assertRaises(ValueError):
         PurelyImaginaryNumber(MyInt(0))