feat(math5): Глава 1 — §1 «Как решать задачу», §2 «Чтение и запись. Разряды», финал
§1: 4 шага решения (Пойа) + тренажёр «на каком шаге ученик» + решатель задач. §2: натуральные числа и нуль, классы/разряды, интерактивная разрядная таблица (ввод числа → раскладка по классам единицы/тысячи/миллионы) + тренажёр «цифра в разряде». Финал главы 1 — 5 боссов (разряды/округление/действия/степень). Шпаргалки/типсы/глоссарий для §1/§2/финала. §3–17 пока заглушки движка. Тесты math5: 8/8. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -62,7 +62,7 @@ test('engine: init() вызывается ПОСЛЕ экспортов (общ
|
||||
});
|
||||
|
||||
for (const ch of CHAPTERS) {
|
||||
test(`${ch.file}: SPA без ошибок, ${ch.cards} карточек, активен § 1, заглушка`, async () => {
|
||||
test(`${ch.file}: SPA без ошибок, ${ch.cards} карточек, активен § 1`, async () => {
|
||||
const { doc, errors } = await loadDom(ch.file);
|
||||
assert.deepEqual(errors, [], 'нет ошибок: ' + errors.join(' | '));
|
||||
assert.equal(doc.querySelectorAll('#psel-grid .psel-card').length, ch.cards, ch.cards + ' карточек');
|
||||
@@ -70,12 +70,34 @@ for (const ch of CHAPTERS) {
|
||||
assert.ok(active && active.id === 'sec-p1', 'активен sec-p1');
|
||||
const body = doc.querySelector('#p1-body');
|
||||
assert.ok(body && body.children.length > 0, 'тело § 1 заполнено');
|
||||
assert.ok(doc.querySelector('#p1-body .m6-placeholder'), 'заглушка § 1 (нет билдера — ожидаемо в каркасе)');
|
||||
assert.ok(doc.querySelector('#p1-body [data-read]'), 'кнопка прочтения § 1');
|
||||
assert.ok(doc.querySelector('#psel-grid .psel-card.final'), 'есть карточка финала');
|
||||
});
|
||||
}
|
||||
|
||||
test('ch2/ch3: §§ без билдеров — заглушка движка (каркас ждёт наполнения)', async () => {
|
||||
for (const f of ['math_5_ch2.html', 'math_5_ch3.html']) {
|
||||
const { doc } = await loadDom(f);
|
||||
assert.ok(doc.querySelector('#p1-body .m6-placeholder'), f + ': заглушка § 1');
|
||||
}
|
||||
});
|
||||
|
||||
test('ch1: §1 «как решать задачу», §2 «разрядная таблица», финал-боссы', async () => {
|
||||
const { doc, errors } = await loadDom('math_5_ch1.html');
|
||||
const win = doc.defaultView;
|
||||
assert.ok(!doc.querySelector('#p1-body .m6-placeholder'), '§1 наполнен (не заглушка)');
|
||||
assert.equal(doc.querySelectorAll('#p1-iv1 [data-step]').length, 4, '§1: 4 кнопки шагов');
|
||||
assert.ok(doc.querySelector('#p1-iv2 #p1-pa'), '§1: тренажёр-решатель задач');
|
||||
win.goTo('p2'); await wait(80);
|
||||
assert.ok(doc.querySelector('#p2-pv-out table'), '§2: разрядная таблица построена');
|
||||
assert.ok(doc.querySelector('#p2-iv2 #p2-qa'), '§2: тренажёр «цифра в разряде»');
|
||||
win.goTo('final'); await wait(80);
|
||||
assert.ok(doc.querySelector('#fin-go'), 'финал: арена боссов');
|
||||
win.bumpProgress('final', 100); await wait(20);
|
||||
assert.ok(win.M6STATE.achievements.has('ch1_done'), 'достижение «Глава 1 пройдена»');
|
||||
assert.deepEqual(errors, [], 'нет ошибок: ' + errors.join(' | '));
|
||||
});
|
||||
|
||||
test('хаб math-5: 3 главы, курсовой финал, ачивка-полоса', async () => {
|
||||
const { doc, errors } = await loadDom('math_5_hub.html');
|
||||
assert.deepEqual(errors, [], 'нет ошибок: ' + errors.join(' | '));
|
||||
|
||||
Reference in New Issue
Block a user