TDD — методологія розробки: спочатку тести, потім код.
Цикл TDD (Red → Green → Refactor):
1. Red — пишемо тест (що провалюється)
2. Green — пишемо мінімальний код щоб тест пройшов
3. Refactor — покращуємо код (тести все ще зелені)
Приклад TDD для функції isPalindrome:
const isPalindrome = str => {
const s = str.toLowerCase().replace(/[^a-z]/g, '');
return s === [...s].reverse().join('');
};
console.log(isPalindrome('racecar'));
console.log(isPalindrome('level'));
console.log(isPalindrome('hello'));
console.log(isPalindrome('A man a plan a canal Panama'));
function groupBy(arr, key) {
return arr.reduce((acc, item) => {
(acc[item[key]] ??= []).push(item);
return acc;
}, {});
}
const team = [{name:'Аня',dept:'dev'},{name:'Богдан',dept:'qa'},{name:'Вова',dept:'dev'}];
const result = groupBy(team, 'dept');
console.log(JSON.stringify(result));
class Calculator {
constructor(val = 0) { this.result = val; }
add(n) { this.result += n; return this; }
subtract(n) { this.result -= n; return this; }
multiply(n) { this.result *= n; return this; }
divide(n) {
if (n === 0) throw new Error('Ділення на нуль');
this.result /= n;
return this;
}
}
// Статичні методи
Calculator.add = (a, b) => a + b;
Calculator.subtract = (a, b) => a - b;
Calculator.multiply = (a, b) => a * b;
Calculator.divide = (a, b) => { if (!b) throw new Error('Ділення на нуль'); return a/b; };
const tests = [
['add(2,3)', () => Calculator.add(2,3), 5],
['subtract(10,4)', () => Calculator.subtract(10,4), 6],
['multiply(3,7)', () => Calculator.multiply(3,7), 21],
['divide(15,3)', () => Calculator.divide(15,3), 5],
];
tests.forEach(([name, fn, expected]) => {
const r = fn();
console.log(`${name} = ${r} ${r === expected ? 'PASS' : 'FAIL'}`);
});
try { Calculator.divide(5,0); } catch(e) { console.log(`divide(5,0) throws PASS`); }
const chain = new Calculator(5).add(5).multiply(2).subtract(3).result;
console.log(`chain result: ${chain} ${chain === 17 ? 'PASS' : 'FAIL'}`);