From d73836e30a4a36ae143a1861669026236bda5bee Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Tue, 6 Oct 2026 17:49:50 +0400 Subject: [PATCH] =?UTF-8?q?test(task-11):=20T11.I2=20=E2=80=94=20=D1=86?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=20=D0=BE=D1=82=D1=81=D1=83=D1=82=D1=81=D1=82?= =?UTF-8?q?=D0=B2=D1=83=D0=B5=D1=82,=20=D1=87=D0=BB=D0=B5=D0=BD=D1=8B=3D0;?= =?UTF-8?q?=20real=20abs=5Fterms=20values?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit T11.I2: + test_target_absent_no_violations (INCOME: нет 2200; BALANCE: нет 1100) T11.I2: + test_target_present_members_absent_as_zero (1100=100 без подстатей → нарушение) test_relation_holds_with_abs_terms: Добавлены ненулевые значения 2210/2220/2330/2350 1С: 2210=-50, 2220=-30, 2330=-20, 2350=-10 66н: 2210=50, 2220=30, 2330=20, 2350=10 Refs #14 Co-Authored-By: Claude Haiku 4.5 Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b --- .../unit/parser/statements/test_checks.py | 46 ++++++++++++++++--- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/api/tests/unit/parser/statements/test_checks.py b/api/tests/unit/parser/statements/test_checks.py index f1f9559..8083ba0 100644 --- a/api/tests/unit/parser/statements/test_checks.py +++ b/api/tests/unit/parser/statements/test_checks.py @@ -94,16 +94,24 @@ def test_relation_holds_with_abs_terms(rules: Rules) -> None: one_c = [ line("2110", "1000"), line("2120", "-600"), - line("2100", "400"), # 2100 = 2110 - 2120 = 1000 - (-600) = 1600 (plain) | 1000 - abs(-600) = 400 (abs) - line("2200", "400"), # 2200 = 2100 - 2210 - 2220 = 400 - 0 - 0 = 400 (plain) | abs - line("2300", "400"), # 2300 = 2200 + 2310 + … = 400 + 0 + … = 400 + line("2100", "400"), # 1000 - (-600) = 1600 plain | 1000 - abs(-600) = 400 (abs) ✓ + line("2210", "-50"), + line("2220", "-30"), + line("2200", "320"), # 400 - (-50) - (-30) = 480 plain | 400 - 50 - 30 = 320 (abs) ✓ + line("2330", "-20"), + line("2350", "-10"), + line("2300", "290"), # 320 - (-20) - (-10) = 350 plain | 320 - 20 - 10 = 290 (abs) ✓ ] brackets = [ line("2110", "1000"), line("2120", "600"), - line("2100", "400"), # 2100 = 2110 - 2120 = 1000 - 600 = 400 - line("2200", "400"), # 2200 = 2100 - 2210 - 2220 = 400 - 0 - 0 = 400 - line("2300", "400"), # 2300 = 2200 + … = 400 + line("2100", "400"), # 1000 - 600 = 400 ✓ + line("2210", "50"), + line("2220", "30"), + line("2200", "320"), # 400 - 50 - 30 = 320 ✓ + line("2330", "20"), + line("2350", "10"), + line("2300", "290"), # 320 - 20 - 10 = 290 ✓ ] assert run_statement_checks(one_c, 1, "INCOME", rules)[0].relations_failed == [] @@ -153,3 +161,29 @@ def test_null_values_count_as_zero_and_empty_form_passes(rules: Rules) -> None: checks, _ = run_statement_checks(lines, 1, "BALANCE", rules) assert checks.relations_failed == [] + + +def test_target_absent_no_violations(rules: Rules) -> None: + """R-6: Если цели правила нет в данных, проверка пропускается → нарушений нет.""" + # INCOME: 2100, 2110, 2120 есть; 2200 НЕТУ → правило 2200 не проверяется + lines_income = [line("2110", "1000"), line("2120", "-600"), line("2100", "400")] + checks_income, _ = run_statement_checks(lines_income, 1, "INCOME", rules) + assert checks_income.relations_failed == [] + assert checks_income.soft_relations_failed == [] + + # BALANCE: только 1150 БЕЗ 1100 → правило 1100 не проверяется (1100 это цель правила) + lines_balance = [line("1150", "100")] + checks_balance, _ = run_statement_checks(lines_balance, 1, "BALANCE", rules) + assert checks_balance.relations_failed == [] + + +def test_target_present_members_absent_as_zero(rules: Rules) -> None: + """R-6: Цель есть, члены отсутствуют (= 0) → соотношение с нарушением.""" + # BALANCE: 1100 = 100 БЕЗ подстатей → 1100 = 0 + 0 + … = 0 (не совпадает с 100) + lines = [line("1100", "100")] + + checks, _ = run_statement_checks(lines, 1, "BALANCE", rules) + + # Правило 1100 = 1105 + … (strict: true) должно нарушиться + failed_relations = [item.relation for item in checks.relations_failed] + assert any("1100 =" in rel for rel in failed_relations)