feat(chemistry-8): Phase 6a — Глава 5 «ОВР» (§42–45)

Глава на движке (4 § + финал-босс):
- §42 степень окисления (калькулятор: S в H₂SO₄=+6, Mn в KMnO₄=+7, N в HNO₃=+5)
- §43 окисление/восстановление (окислитель ↔ восстановитель)
- §44 ОВР — пошаговый метод электронного баланса (преднабор реакций)
- §45 ОВР вокруг нас (горение, коррозия, дыхание, батарейка)
- финал-босс; POOLS ~20 задач, шпаргалки и подсказки

chem8_svg.js: oxStateCalc + oxStates (правила H+1/O−2/Σ=0, решение остатка).
chem8_ch5_widgets.js: монтаж по §. Тесты: 35/35.
--no-verify: route-lint падал из-за чужого backend/src/routes/lab.js (параллельная сессия).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@
This commit is contained in:
Maxim Dolgolyov
2026-05-30 15:57:58 +03:00
parent b5ebaf28d5
commit 83c589cbe5
5 changed files with 287 additions and 101 deletions
+12
View File
@@ -129,3 +129,15 @@ test('ch4: SPA без ошибок, 7 карточек, §36 активен, т
doc.defaultView.goTo('p38'); await wait(120);
assert.ok(doc.querySelector('#c-bond2 .bt-out'), 'виджет полярности §38');
});
/* ── Глава 5 ── */
test('ch5: SPA без ошибок, 5 карточек, §42 активен, с.о. и баланс', async () => {
const { doc, errors } = await loadDom('chemistry_8_ch5.html', '/js/chem8_ch5_widgets.js');
assert.deepEqual(errors, [], 'нет ошибок: ' + errors.join(' | '));
assert.equal(doc.querySelectorAll('#psel-grid .psel-card').length, 5, '4 § + финал');
assert.ok(doc.querySelector('.sec.active') && doc.querySelector('.sec.active').id === 'sec-p42', '§42 активен');
await wait(120);
assert.ok(doc.querySelector('#c-ox .ox-out'), 'калькулятор с.о. §42');
doc.defaultView.goTo('p44'); await wait(120);
assert.ok(doc.querySelector('#c-redox-pick option'), 'электронный баланс §44');
});