Skip to content
30 changes: 29 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,29 @@
# module_test
Разработать набор модульных тестов
### Цель:

Научиться писать модульные тесты по 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 и ссылку на него указать при сдаче ДЗ.
27 changes: 27 additions & 0 deletions equasion/solution.go
Original file line number Diff line number Diff line change
@@ -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
}
87 changes: 87 additions & 0 deletions equasion/solve_test.go
Original file line number Diff line number Diff line change
@@ -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)
}