/
javapractice
/
java-practice-antlr4
Обзор
Документация
Войти
/
javapractice
/
java-practice-antlr4
Код
Запросы
0
Задачи
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
src/test/java/com/example/calc/CalculatorTest.java
136 строк
5 KB
Кузьма Даждъбогин
Javadoc на классах, методах и unit-тестах
08 авг 2026, 11:37
08 авг 2026, 11:37
e717695
Код
Авторство
О чём код?
package com.example.calc; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.ValueSource; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; /** * Unit-тесты {@link Calculator}: обязательный набор случаев из раздела 7 * файла docs/analitic.md. Консоль в тестах не участвует, дробные результаты * сравниваются с дельтой {@code 1e-9}. */ class CalculatorTest { private static final double DELTA = 1e-9; private final Calculator calculator = new Calculator(); /** * Базовые бинарные операции: сложение, вычитание, умножение, * деление, возведение в степень. */ @ParameterizedTest @CsvSource({ "2+3, 5", "7-10, -3", "4*2.5, 10", "1/4, 0.25", "2^10, 1024" }) void basicOperations(String expression, double expected) { assertEquals(expected, calculator.evaluate(expression), DELTA); } /** * Приоритет операций, скобки и левоассоциативность * вычитания и деления. */ @ParameterizedTest @CsvSource({ "2+3*4, 14", "(2+3)*4, 20", "10-2-3, 5", "100/10/2, 5" }) void precedenceAndLeftAssociativity(String expression, double expected) { assertEquals(expected, calculator.evaluate(expression), DELTA); } /** Правоассоциативность степени: {@code 2^3^2} = {@code 2^(3^2)} = 512. */ @Test void powerIsRightAssociative() { assertEquals(512, calculator.evaluate("2^3^2"), DELTA); } /** * Унарный минус, включая конвенцию раздела 3.1 аналитики: * унарный минус связывает сильнее степени, {@code -2^2} = 4. * Регрессия на случай изменения порядка альтернатив грамматики. */ @ParameterizedTest @CsvSource({ "-5, -5", "2*-3, -6", "-2^2, 4", "2^-2, 0.25" }) void unaryMinus(String expression, double expected) { assertEquals(expected, calculator.evaluate(expression), DELTA); } /** Дробные числа; {@code 0.1+0.2} сравнивается с дельтой. */ @ParameterizedTest @CsvSource({ "3.14+0.86, 4.0", "0.1+0.2, 0.3" }) void fractionalNumbers(String expression, double expected) { assertEquals(expected, calculator.evaluate(expression), DELTA); } /** * Формат вывода: целое без дробной части ({@code 5}, а не {@code 5.0}), * дробное с точкой, {@code -0.0} нормализуется в {@code 0}. */ @ParameterizedTest @CsvSource({ "2+3, 5", "1/4, 0.25", "-0, 0", "10-10, 0" }) void outputFormat(String expression, String expected) { assertEquals(expected, Calculator.format(calculator.evaluate(expression))); } /** * Ошибки разбора: неполные и некорректные выражения дают * {@link CalcException}, а не падение программы; случай {@code 2 3} * проверяет якорь EOF в стартовом правиле. */ @ParameterizedTest @ValueSource(strings = {"2+", "2++3", "(2+3", "", "abc", "2 3"}) void parseErrors(String expression) { assertThrows(CalcException.class, () -> calculator.evaluate(expression)); } /** * Неподдерживаемые формы чисел; случай {@code 1.2.3} даёт ошибку * лексера и проверяет, что свой error listener повешен и на lexer. */ @ParameterizedTest @ValueSource(strings = {".5", "5.", "1e5", "+5", "1.2.3"}) void unsupportedNumberForms(String expression) { assertThrows(CalcException.class, () -> calculator.evaluate(expression)); } /** * Ошибки вычисления: деление на ноль и переполнение степени — * {@link CalcException}, а не {@code Infinity} или {@code NaN}. */ @ParameterizedTest @ValueSource(strings = {"1/0", "10^1000"}) void evaluationErrors(String expression) { assertThrows(CalcException.class, () -> calculator.evaluate(expression)); } /** Пробелы вокруг и внутри выражения игнорируются. */ @Test void whitespaceIsIgnored() { assertEquals(5, calculator.evaluate(" 2 + 3 "), DELTA); } }