def check(self, reply, clue): if not self._is_valid_expression(reply, self.is_equation): # Reply is not a valid chemical formula/equation if self.is_equation: return False, "Ответ не является корректным химическим уравнением" return False, "Ответ не является корректной химической формулой" if self.is_equation: return chemical_equations_equal(self.source.expression, reply) return compare_chemical_expression(self.source.expression, reply)
def _is_valid_expression(self, expression, is_equation=False): try: if is_equation: left_expr, arrow, right_expr = split_on_arrow(expression) compare_chemical_expression(left_expr, 'H') compare_chemical_expression(right_expr, 'H') else: compare_chemical_expression(expression, 'H') except ParseException: return False return True
def test_compare_equal_factors_differently_set(self): self.assertTrue( compare_chemical_expression("6/2H^+ + OH^-", " OH^- + 3H^+ "))
def test_compare_one_superscript_explicitly_set(self): self.assertTrue( compare_chemical_expression("H^+ + OH^1-", " OH^- + H^+ "))
def test_complex_all_grammar(self): self.assertTrue( compare_chemical_expression("5[Ni(NH3)4]^2+ + 5/2SO4^2-", "5/2SO4^2- + 5[Ni(NH3)4]^2+"))
def test_complex_additivity_wrong(self): self.assertFalse( compare_chemical_expression( "5(H1H212)^70010- + 2H20 + 7/2HCl + H2O", "2H20 + 7/2HCl + H2O + 5(H1H212)^70011-"))
def test_compare_same_factors(self): self.assertTrue( compare_chemical_expression("3H2O + 2CO2", "2CO2 + 3H2O "))
def test_compare_different_order_no_phases_no_factors_no_ions(self): self.assertTrue(compare_chemical_expression("H2O + CO2", "CO2 + H2O"))
def test_compare_phases_ignored(self): self.assertTrue( compare_chemical_expression("H2O(s) + CO2", "H2O+CO2", ignore_state=True))
def test_compare_float_factors(self): self.assertTrue( compare_chemical_expression("7/2H^+ + 3/5OH^-", " 3/5OH^- + 7/2H^+ "))
def test_compare_wrong_factors_ions(self): self.assertFalse( compare_chemical_expression("2H^+ + 3OH^-", " 2OH^- + 3H^+ "))
def test_compare_correct_factors_ions_and_one(self): self.assertTrue( compare_chemical_expression("3H^+ + 2OH^-", " 2OH^- + 3H^+ "))
def test_compare_parent_groups_ions(self): self.assertTrue( compare_chemical_expression("Fe(OH)^2- + (OH)^-", " (OH)^- + Fe(OH)^2- "))
def test_compare_wrong_ions(self): self.assertFalse( compare_chemical_expression("H^+ + OH^-", " OH^- + H^- "))
def test_compare_correct_ions(self): self.assertTrue( compare_chemical_expression("H^+ + OH^-", " OH^- + H^+ "))
def test_compare_one_subscript_explicitly_set(self): self.assertFalse(compare_chemical_expression("H2 + CO2", "H2 + C102"))
def test_compare_incorrect_order_of_atoms_in_molecule(self): self.assertFalse(compare_chemical_expression("H2O + CO2", "O2C + OH2"))
def test_compare_phases_not_ignored_explicitly(self): self.assertFalse( compare_chemical_expression("H2O(s) + CO2", "H2O+CO2", ignore_state=False))
def test_compare_different_order_three_multimolecule(self): self.assertTrue( compare_chemical_expression("H2O + Fe(OH)3 + CO2", "CO2 + H2O + Fe(OH)3"))
def test_compare_phases_not_ignored(self): # same as previous self.assertFalse(compare_chemical_expression("H2O(s) + CO2", "H2O+CO2"))
def test_compare_different_factors(self): self.assertFalse( compare_chemical_expression("2H2O + 3CO2", "2CO2 + 3H2O "))
def test_complex_additivity(self): self.assertTrue( compare_chemical_expression( "5(H1H212)^70010- + 2H20 + 7/2HCl + H2O", "7/2HCl + 2H20 + H2O + 5(H1H212)^70010-"))