feat(chemistry7): Phase 1 Волна 3 — Глава 1, §§7–9

§7 Химическая формула (разбор формулы на состав, индекс/коэффициент),
§8 Относительная молекулярная масса (калькулятор M_r через Chem8.molarMass),
§9 Валентность (конструктор формулы по валентности через НОК индексов).
Теория, тренажёры задач. Тест: 9/9 pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-05-30 18:29:40 +03:00
parent 4a424505a8
commit bc50a0d9f1
3 changed files with 161 additions and 4 deletions
+13
View File
@@ -95,6 +95,19 @@ test('ch1 Волна 2: интерактивы §4–§6 монтируются
assert.deepEqual(errors, [], 'нет ошибок: ' + errors.join(' | '));
});
test('ch1 Волна 3: интерактивы §7–§9 монтируются и считают', async () => {
const { doc, errors } = await loadDom('chemistry_7_ch1.html');
doc.defaultView.goTo('p7'); await wait(100);
assert.ok(doc.querySelector('#p7-out'), 'парсер формулы §7');
assert.match(doc.querySelector('#p7-out').textContent, /4/, 'H2SO4 → 4 атома O в разборе');
doc.defaultView.goTo('p8'); await wait(100);
assert.match(doc.querySelector('#p8-out').textContent, /100/, 'M_r(CaCO3)=100');
doc.defaultView.goTo('p9'); await wait(100);
assert.ok(doc.querySelector('#p9-bld #p9-a'), 'конструктор валентности §9');
assert.match(doc.querySelector('#p9-bout').textContent, /Al/, 'формула по валентности построена');
assert.deepEqual(errors, [], 'нет ошибок: ' + errors.join(' | '));
});
test('ch1: переход к §9 и финалу строит заглушку без ошибок', async () => {
const { doc, errors } = await loadDom('chemistry_7_ch1.html');
doc.defaultView.goTo('p9'); await wait(80);