def test_parse_term_with_valid_strings(self):
        with self.subTest('2'):
            term = Term.parse_term('2')
            expected_term = Term.constant(2)

            self.assertEqual(term, expected_term)

        with self.subTest('x'):
            term = Term.parse_term('x')
            expected_term = Term(coeff=1, variable='x', power=1)

            self.assertEqual(term, expected_term)

        with self.subTest('x^2'):
            term = Term.parse_term('x^2')
            expected_term = Term(coeff=1, variable='x', power=2)

            self.assertEqual(term, expected_term)

        with self.subTest('2*x'):
            term = Term.parse_term('2*x')
            expected_term = Term(coeff=2, variable='x', power=1)

            self.assertEqual(term, expected_term)

        with self.subTest('2*x^2'):
            term = Term.parse_term('2*x^2')
            expected_term = Term(coeff=2, variable='x', power=2)

            self.assertEqual(term, expected_term)
    def parse_from_string(cls, s):
        unparsed_terms = s.split('+')

        terms = [Term.parse_term(t) for t in unparsed_terms]

        return cls(terms)
 def test_parse_term_with_invalid_string(self):
     with self.assertRaises(Exception):
         Term.parse_term('2*2*x')