@@ -184,6 +184,156 @@ describe('Workbook — формулы', () => {
} )
} )
// ==================== ЕСЛИ с операторами сравнения ====================
describe ( 'ЕСЛИ с операторами = >= <>' , ( ) = > {
it ( 'ЕСЛИ(A1=5, ...) — равенство числу (совпадает)' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 5 )
sheet . setCell ( 'B1' , '=ЕСЛИ(A1=5, "Пять", "Другое")' )
expect ( wb . getValue ( 'Sheet1!B1' ) ) . toBe ( 'Пять' )
} )
it ( 'ЕСЛИ(A1=5, ...) — равенство числу (не совпадает)' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 7 )
sheet . setCell ( 'B1' , '=ЕСЛИ(A1=5, "Пять", "Другое")' )
expect ( wb . getValue ( 'Sheet1!B1' ) ) . toBe ( 'Другое' )
} )
it ( 'ЕСЛИ(A1=B1, ...) — сравнение двух ячеек (равны)' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 10 )
sheet . setCell ( 'B1' , 10 )
sheet . setCell ( 'C1' , '=ЕСЛИ(A1=B1, "Равны", "Н е равны")' )
expect ( wb . getValue ( 'Sheet1!C1' ) ) . toBe ( 'Равны' )
} )
it ( 'ЕСЛИ(A1=B1, ...) — сравнение двух ячеек (не равны)' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 10 )
sheet . setCell ( 'B1' , 20 )
sheet . setCell ( 'C1' , '=ЕСЛИ(A1=B1, "Равны", "Н е равны")' )
expect ( wb . getValue ( 'Sheet1!C1' ) ) . toBe ( 'Н е равны' )
} )
it ( 'ЕСЛИ(A1>=100, ...) — больше или равно (истина)' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 100 )
sheet . setCell ( 'B1' , '=ЕСЛИ(A1>=100, "Сотня+", A1)' )
expect ( wb . getValue ( 'Sheet1!B1' ) ) . toBe ( 'Сотня+' )
} )
it ( 'ЕСЛИ(A1>=100, ...) — больше или равно (ложь)' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 42 )
sheet . setCell ( 'B1' , '=ЕСЛИ(A1>=100, "Сотня+", A1)' )
expect ( wb . getValue ( 'Sheet1!B1' ) ) . toBe ( 42 )
} )
it ( 'ЕСЛИ(A1>10, ...) — строгое больше' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 15 )
sheet . setCell ( 'B1' , '=ЕСЛИ(A1>10, "Да", "Нет")' )
expect ( wb . getValue ( 'Sheet1!B1' ) ) . toBe ( 'Да' )
} )
it ( 'ЕСЛИ с И и операторами >= <=' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 5 )
sheet . setCell ( 'B1' , '=ЕСЛИ(И(A1>=0, A1<=10), "В диапазоне", "Вне")' )
expect ( wb . getValue ( 'Sheet1!B1' ) ) . toBe ( 'В диапазоне' )
} )
it ( 'ЕСЛИ с И и операторами >= <= — вне диапазона' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 15 )
sheet . setCell ( 'B1' , '=ЕСЛИ(И(A1>=0, A1<=10), "В диапазоне", "Вне")' )
expect ( wb . getValue ( 'Sheet1!B1' ) ) . toBe ( 'Вне' )
} )
it ( 'ЕСЛИ(A1>10, ...) — строгое больше (ложь)' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 5 )
sheet . setCell ( 'B1' , '=ЕСЛИ(A1>10, "Да", "Нет")' )
expect ( wb . getValue ( 'Sheet1!B1' ) ) . toBe ( 'Нет' )
} )
it ( 'ЕСЛИ с БОЛЬШЕ — истина' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'B1' , '=ЕСЛИ(БОЛЬШЕ(5, 3), 1, 0)' )
expect ( wb . getValue ( 'Sheet1!B1' ) ) . toBe ( 1 )
} )
it ( 'ЕСЛИ с БОЛЬШЕ — ложь' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'B1' , '=ЕСЛИ(БОЛЬШЕ(1, 3), 1, 0)' )
expect ( wb . getValue ( 'Sheet1!B1' ) ) . toBe ( 0 )
} )
it ( 'ЕСЛИ с равенством текста в ячейке' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 'Готово' )
sheet . setCell ( 'B1' , '=ЕСЛИ(A1="Готово", "✓", "✗")' )
expect ( wb . getValue ( 'Sheet1!B1' ) ) . toBe ( '✓' )
} )
it ( 'ЕСЛИ с неравенством текста в ячейке' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 'В работе' )
sheet . setCell ( 'B1' , '=ЕСЛИ(A1="Готово", "✓", "✗")' )
expect ( wb . getValue ( 'Sheet1!B1' ) ) . toBe ( '✗' )
} )
} )
describe ( 'Оператор <> (не равно)' , ( ) = > {
it ( 'ЕСЛИ(A1<>0, ...) — не равно (истина)' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 5 )
sheet . setCell ( 'B1' , '=ЕСЛИ(A1<>0, "Н е ноль", "Ноль")' )
expect ( wb . getValue ( 'Sheet1!B1' ) ) . toBe ( 'Н е ноль' )
} )
it ( 'ЕСЛИ(A1<>0, ...) — не равно (ложь)' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 0 )
sheet . setCell ( 'B1' , '=ЕСЛИ(A1<>0, "Н е ноль", "Ноль")' )
expect ( wb . getValue ( 'Sheet1!B1' ) ) . toBe ( 'Ноль' )
} )
it ( 'ЕСЛИ(A1<>B1, ...) — две ячейки не равны' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 10 )
sheet . setCell ( 'B1' , 20 )
sheet . setCell ( 'C1' , '=ЕСЛИ(A1<>B1, "Разные", "Одинаковые")' )
expect ( wb . getValue ( 'Sheet1!C1' ) ) . toBe ( 'Разные' )
} )
it ( 'ЕСЛИ(A1<>B1, ...) — две ячейки равны' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 10 )
sheet . setCell ( 'B1' , 10 )
sheet . setCell ( 'C1' , '=ЕСЛИ(A1<>B1, "Разные", "Одинаковые")' )
expect ( wb . getValue ( 'Sheet1!C1' ) ) . toBe ( 'Одинаковые' )
} )
it ( '<> внутри строкового литерала не трогается' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 1 )
sheet . setCell ( 'B1' , '=ЕСЛИ(A1=1, "a<>b", "нет")' )
expect ( wb . getValue ( 'Sheet1!B1' ) ) . toBe ( 'a<>b' )
} )
} )
describe ( 'Операторы внутри строковых литералов не трогаются' , ( ) = > {
it ( '= внутри строкового литерала остаётся как есть' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 1 )
sheet . setCell ( 'B1' , '=ЕСЛИ(A1=1, "x=y", "нет")' )
expect ( wb . getValue ( 'Sheet1!B1' ) ) . toBe ( 'x=y' )
} )
} )
// ==================== ЕПУСТО ====================
describe ( 'ЕПУСТО в формуле' , ( ) = > {
@@ -679,3 +829,130 @@ describe('CellUtils', () => {
expect ( CellUtils . createCellName ( 'B' , 3 ) ) . toBe ( 'B3' )
} )
} )
// ==================== Edge Cases ====================
describe ( 'Edge Cases функций через движок' , ( ) = > {
// 1. ОКРУГЛ с отрицательными разрядами: ОКРУГЛ(1234, -2) = 1200 в Excel
describe ( 'ОКРУГЛ с отрицательными разрядами' , ( ) = > {
it ( 'ОКРУГЛ(1234, -2) должно дать 1200' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , '=ОКРУГЛ(1234, -2)' )
expect ( wb . getValue ( 'Sheet1!A1' ) ) . toBe ( 1200 )
} )
it ( 'ОКРУГЛ(1550, -3) должно дать 2000' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , '=ОКРУГЛ(1550, -3)' )
expect ( wb . getValue ( 'Sheet1!A1' ) ) . toBe ( 2000 )
} )
} )
// 2. ЕСЛИ с числом как условие (0 = ложь, не-0 = истина)
describe ( 'ЕСЛИ с числовым условием' , ( ) = > {
it ( '0 как ложь' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 0 )
sheet . setCell ( 'B1' , '=ЕСЛИ(A1, "да", "нет")' )
expect ( wb . getValue ( 'Sheet1!B1' ) ) . toBe ( 'нет' )
} )
it ( 'ненулевое число как истина' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 42 )
sheet . setCell ( 'B1' , '=ЕСЛИ(A1, "да", "нет")' )
expect ( wb . getValue ( 'Sheet1!B1' ) ) . toBe ( 'да' )
} )
} )
// 3. СЦЕПИТЬ с числами
describe ( 'СЦЕПИТЬ с числами' , ( ) = > {
it ( 'число конвертируется в строку' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 42 )
sheet . setCell ( 'B1' , '=СЦЕПИТЬ("итого: ", A1)' )
expect ( wb . getValue ( 'Sheet1!B1' ) ) . toBe ( 'итого: 42' )
} )
} )
// 4. Несколько = в одной формуле
describe ( 'Несколько = в одной формуле' , ( ) = > {
it ( 'И(A1=1, B1=2) — о б а true' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 1 )
sheet . setCell ( 'B1' , 2 )
sheet . setCell ( 'C1' , '=ЕСЛИ(И(A1=1, B1=2), "да", "нет")' )
expect ( wb . getValue ( 'Sheet1!C1' ) ) . toBe ( 'да' )
} )
it ( 'И(A1=1, B1=2) — одно false' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 1 )
sheet . setCell ( 'B1' , 99 )
sheet . setCell ( 'C1' , '=ЕСЛИ(И(A1=1, B1=2), "да", "нет")' )
expect ( wb . getValue ( 'Sheet1!C1' ) ) . toBe ( 'нет' )
} )
} )
// 5. Пустая ячейка в сравнении (движок подставляет 0)
describe ( 'Пустая ячейка в сравнении с =' , ( ) = > {
it ( 'пустая ячейка = 0' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
// A1 не установлена — пустая, движок подставит 0
sheet . setCell ( 'B1' , '=ЕСЛИ(A1=0, "пусто/ноль", "есть значение")' )
expect ( wb . getValue ( 'Sheet1!B1' ) ) . toBe ( 'пусто/ноль' )
} )
} )
// 6. СТЕПЕНЬ(0, 0) — в Excel = 1
describe ( 'СТЕПЕНЬ edge cases' , ( ) = > {
it ( 'СТЕПЕНЬ(0, 0) = 1' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , '=СТЕПЕНЬ(0, 0)' )
expect ( wb . getValue ( 'Sheet1!A1' ) ) . toBe ( 1 )
} )
} )
// 7. М А К С — вариадический (как в Excel)
describe ( 'М А К С ' , ( ) = > {
// Обратная совместимость: 2 аргумента (как было раньше)
it ( 'М А К С (3, 7) = 7 — обратная совместимость' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , '=М А К С (3, 7)' )
expect ( wb . getValue ( 'Sheet1!A1' ) ) . toBe ( 7 )
} )
it ( 'М А К С (10, 5) = 10 — обратная совместимость' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , '=М А К С (10, 5)' )
expect ( wb . getValue ( 'Sheet1!A1' ) ) . toBe ( 10 )
} )
it ( 'М А К С (-5, 3) = 3 — обратная совместимость с отрицательными' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , '=М А К С (-5, 3)' )
expect ( wb . getValue ( 'Sheet1!A1' ) ) . toBe ( 3 )
} )
it ( 'М А К С с о ссылками на ячейки — обратная совместимость' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , 25 )
sheet . setCell ( 'A2' , 10 )
sheet . setCell ( 'B1' , '=М А К С (A1, A2)' )
expect ( wb . getValue ( 'Sheet1!B1' ) ) . toBe ( 25 )
} )
// Новое: 3+ аргумента
it ( 'М А К С (3, 7, 100) = 100 — вариадический' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , '=М А К С (3, 7, 100)' )
expect ( wb . getValue ( 'Sheet1!A1' ) ) . toBe ( 100 )
} )
it ( 'М А К С (1, 2, 3, 4, 5) = 5' , ( ) = > {
const { wb , sheet } = createWorkbookWithSheet ( )
sheet . setCell ( 'A1' , '=М А К С (1, 2, 3, 4, 5)' )
expect ( wb . getValue ( 'Sheet1!A1' ) ) . toBe ( 5 )
} )
} )
} )