diff --git a/README.md b/README.md index 625d3ab..7dbc831 100644 --- a/README.md +++ b/README.md @@ -1 +1,29 @@ -# module_test \ No newline at end of file +Разработать набор модульных тестов +### Цель: + +Научиться писать модульные тесты по TDD, так как модульные тесты является важной частью концепции Time To Market и часто применяется в современных проектах. +### Описание + +1. Создать проект на gitlab/github. + +2. Настроить CI, чтобы можно было собирать проект и прогонять тесты. + +Необходимо реализовать операцию нахождения квадратного уравнения. Предположим, что эта операция описывается следующей функцией c поправкой на конкретный язык программирования. В ООП языках эта функция реализуется в виде метода класса. +``` +solve(double a, double b, double c): double[] +``` +здесь a, b, c - коэффициенты квадратного уравнения, функция возвращает список корней квадратного уравнения. + +3. Написать тест, который проверяет, что для уравнения x^2+1 = 0 корней нет (возвращается пустой массив) +4. Написать минимальную реализацию функции solve, которая удовлетворяет данному тесту. +5. Написать тест, который проверяет, что для уравнения x^2-1 = 0 есть два корня кратности 1 (x1=1, x2=-1) +6. Написать минимальную реализацию функции solve, которая удовлетворяет тесту из п.5. +7. Написать тест, который проверяет, что для уравнения x^2+2x+1 = 0 есть один корень кратности 2 (x1= x2 = -1). +8. Написать минимальную реализацию функции solve, которая удовлетворяет тесту из п.7. +9. Написать тест, который проверяет, что коэффициент a не может быть равен 0. В этом случае solve выбрасывает исключение. **Примечание**. Учесть, что a имеет тип double и сравнивать с 0 через == нельзя. +10. Написать минимальную реализацию функции solve, которая удовлетворяет тесту из п.9. +11. С учетом того, что дискриминант тоже нельзя сравнивать с 0 через знак равенства, подобрать такие коэффициенты квадратного уравнения для случая одного корня кратности два, чтобы дискриминант был отличный от нуля, но меньше заданного эпсилон. Эти коэффициенты должны заменить коэффициенты в тесте из п. 7. +12. При необходимости поправить реализацию квадратного уравнения. +13. Посмотреть какие еще значения могут принимать числа типа double, кроме числовых и написать тест с их использованием на все коэффициенты. solve должен выбрасывать исключение. +14. Написать минимальную реализацию функции solve, которая удовлетворяет тесту из п.13. +15. Сделать merge request/pull request и ссылку на него указать при сдаче ДЗ. \ No newline at end of file diff --git a/equasion/solution.go b/equasion/solution.go new file mode 100644 index 0000000..2ef53d0 --- /dev/null +++ b/equasion/solution.go @@ -0,0 +1,27 @@ +package Solve +import ( + "errors" + "math" + ) + +func solve(a float64,b float64,c float64) ([]float64, error){ + result := make([]float64, 0, 3) + epsilon := float64(7.)/3 - float64(4.)/3 - float64(1.) + if math.IsNaN(a) || math.IsNaN(b) || math.IsNaN(c) { + return result, errors.New("One of parameters is NaN") + } + if math.IsInf(a, 0) || math.IsInf(b, 0) || math.IsInf(c, 0) { + return result, errors.New("One of paramets is Inf") + } + if math.Abs(a) < epsilon { + return result, errors.New("a == 0") + } + d := b * b - 4 * a * c + if math.Abs(d) < epsilon { + result = append(result, ((-1)* b) / (2 * a)) + } else if !math.IsNaN(math.Sqrt(d)) { + result = append(result, ((-1) * b + math.Sqrt(d)) / (2 * a)) + result = append(result, ((-1) * b - math.Sqrt(d)) / (2 * a)) + } + return result, nil +} \ No newline at end of file diff --git a/equasion/solve_test.go b/equasion/solve_test.go new file mode 100644 index 0000000..e538f9e --- /dev/null +++ b/equasion/solve_test.go @@ -0,0 +1,87 @@ +package Solve + +import ( + "github.com/stretchr/testify/assert" + "testing" + "math" +) + +func TestSolveTwo(t *testing.T) { + var A float64 = 1 + var B float64 = 0 + var C float64 = -1 + expected := []float64 {1, -1} + actual, err := solve(A, B, C) + + assert.Nil(t, err) + assert.Equal(t, expected, actual) +} +func TestSolveZero(t *testing.T) { + var A float64 = 1 + var B float64 = 0 + var C float64 = 1 + expected := make([]float64, 0) + actual, err := solve(A, B, C) + + assert.Nil(t, err) + assert.Equal(t, expected, actual) +} + +func TestSolveOne(t *testing.T) { + var A float64 = 1 + var B float64 = 2 + var C float64= 1 + expected := []float64 {-1} + actual, err := solve(A, B, C) + + assert.Nil(t, err) + assert.Equal(t, expected, actual) +} + +func TestSolveAZero(t *testing.T) { + var A float64 = 0 + var B float64 = 1 + var C float64 = 1 + + _, err := solve(A, B, C) + + assert.NotNil(t, err) +} +func TestSolveAEps(t *testing.T) { + var A float64 = 1e-10 + var B float64 = 1 + var C float64 = 1 + + _, err := solve(A, B, C) + + assert.Nil(t, err) +} +func TestSolveDEps(t *testing.T) { + var A float64 = 1e-5 + var B float64 = -2.5 * 1e-5 + var C float64= 1e-5 + expected := []float64 {1.9999999999999996, 0.5000000000000001} + actual, err := solve(A, B, C) + + assert.Nil(t, err) + assert.Equal(t, expected, actual) +} + +func TestSolveNan(t *testing.T) { + A := math.NaN() + B := math.NaN() + C := math.NaN() + + _, err := solve(A, B, C) + + assert.NotNil(t, err) +} +func TestSolveInf(t *testing.T) { + A := math.Inf(0) + B := math.Inf(0) + C := math.Inf(0) + + _, err := solve(A, B, C) + + assert.NotNil(t, err) +}