Загрузка данных


Для этого задания нужно сделать **два проекта** в одном решении: библиотеку с решением квадратного уравнения и проект xUnit с тестами. Тестовый проект должен ссылаться на библиотеку — именно так он получает доступ к проверяемому коду.[1]

Ниже — готовый вариант по вашему заданию, дополненный проверками одного корня и отсутствия действительных корней.

## 1. Основной проект — `QuadraticSolution`

Создайте проект типа «Библиотека классов» и замените содержимое файла `Class1.cs` следующим кодом. Сам файл переименуйте в `QuadraticSolver.cs`.

```csharp
using System;

namespace QuadraticSolution
{
    public class QuadraticSolver
    {
        public (int RootCount, double? X1, double? X2) Solve(
            double a, double b, double c)
        {
            if (a == 0)
            {
                throw new ArgumentException(
                    "Коэффициент 'a' не может быть равен нулю.");
            }

            double discriminant = b * b - 4 * a * c;

            if (discriminant < 0)
            {
                return (0, null, null);
            }

            if (discriminant == 0)
            {
                return (1, -b / (2 * a), null);
            }

            double sqrtD = Math.Sqrt(discriminant);

            double x1 = (-b - sqrtD) / (2 * a);
            double x2 = (-b + sqrtD) / (2 * a);

            return (2, x1, x2);
        }
    }
}
```

Это логика из вашего задания: метод возвращает количество действительных корней и их значения. Здесь не нужны `Main()` и ввод через `Console.ReadLine()` — значения коэффициентов будут передавать тесты.

## 2. Тестовый проект — `QuadraticSolution.Tests`

В том же решении создайте проект «xUnit Test Project». Затем в его разделе «Зависимости» выберите «Добавить ссылку на проект», отметьте `QuadraticSolution` и нажмите OK.[2]

В тестовом проекте переименуйте `UnitTest1.cs` в `QuadraticSolverTests.cs` и вставьте:

```csharp
using System;
using Xunit;
using QuadraticSolution;

namespace QuadraticSolution.Tests
{
    public class QuadraticSolverTests
    {
        [Fact]
        public void Solve_TwoRoots_ReturnsCorrectValues()
        {
            // Подготовка
            var solver = new QuadraticSolver();

            // Действие: x² - 3x + 2 = 0
            var result = solver.Solve(1, -3, 2);

            // Проверка
            Assert.Equal(2, result.RootCount);
            Assert.Equal((double?)1.0, result.X1);
            Assert.Equal((double?)2.0, result.X2);
        }

        [Fact]
        public void Solve_OneRoot_ReturnsCorrectValue()
        {
            // Подготовка
            var solver = new QuadraticSolver();

            // Действие: x² - 2x + 1 = 0
            var result = solver.Solve(1, -2, 1);

            // Проверка
            Assert.Equal(1, result.RootCount);
            Assert.Equal((double?)1.0, result.X1);
            Assert.Null(result.X2);
        }

        [Fact]
        public void Solve_NoRealRoots_ReturnsZeroRoots()
        {
            // Подготовка
            var solver = new QuadraticSolver();

            // Действие: x² + 1 = 0
            var result = solver.Solve(1, 0, 1);

            // Проверка
            Assert.Equal(0, result.RootCount);
            Assert.Null(result.X1);
            Assert.Null(result.X2);
        }

        [Fact]
        public void Solve_AIsZero_ThrowsException()
        {
            // Подготовка
            var solver = new QuadraticSolver();

            // Действие и проверка
            Assert.Throws<ArgumentException>(
                () => solver.Solve(0, 5, 2));
        }
    }
}
```

Первые и последний тесты соответствуют вашему образцу. Два дополнительных проверяют оставшиеся ветви метода.

## 3. Что проверяют тесты

| Тест | Коэффициенты | Ожидаемый результат по коду |
|---|---|---|
| Два корня | `a = 1`, `b = -3`, `c = 2` | `X1 = 1`, `X2 = 2` |
| Один корень | `a = 1`, `b = -2`, `c = 1` | `X1 = 1`, `X2 = null` |
| Нет действительных корней | `a = 1`, `b = 0`, `c = 1` | Количество корней — `0`, оба значения — `null` |
| Недопустимое значение `a` | `a = 0`, `b = 5`, `c = 2` | Исключение `ArgumentException` |

Тесты построены по схеме Arrange–Act–Assert: сначала подготовка объекта, затем вызов метода, после этого проверка результата. Это стандартный подход к организации модульных тестов.[3]

## 4. Как запустить

1. Откройте меню «Тест» → «Обозреватель тестов».
2. Нажмите «Выполнить все тесты».
3. Посмотрите результаты в обозревателе: он показывает успешно пройденные, проваленные и ещё не запущенные тесты.[2][3]

Ожидаемый результат для приведённого варианта — четыре успешно пройденных теста. Это ожидаемый результат по коду, а не отчёт о фактическом запуске в вашей Visual Studio.

Источники
[1] Unit testing C# in .NET using dotnet test and xUnit - Microsoft Learn https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-csharp-with-xunit
[2] Get started with unit testing - Visual Studio (Windows) | Microsoft Learn https://learn.microsoft.com/en-us/visualstudio/test/getting-started-with-unit-testing?view=visualstudio
[3] Unit test basics with Test Explorer - Visual Studio - Microsoft Learn https://learn.microsoft.com/en-us/visualstudio/test/unit-test-basics?view=visualstudio
[4] Tutorial: Test a .NET class library - Microsoft Learn https://learn.microsoft.com/en-us/dotnet/core/tutorials/test-class-library
[5] Testing with the xUnit Framework - Overview (2 of 12) - Microsoft Learn https://learn.microsoft.com/en-us/shows/visual-studio-toolbox/testing-with-the-xunit-framework-overview-2-of-12-automated-software-testing
[6] Best practices for writing unit tests - .NET - Microsoft Learn https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-best-practices
[7] Testing in .NET - Microsoft Learn https://learn.microsoft.com/en-us/dotnet/core/testing/
[8] Unit test basics with Test Explorer - Visual Studio (Windows) https://learn.microsoft.com/en-sg/visualstudio/test/unit-test-basics?view=vs-2022
[9] Unit test tools and tasks - Visual Studio - Microsoft Learn https://learn.microsoft.com/en-us/visualstudio/test/unit-test-your-code?view=visualstudio
[10] C# - Asserting two objects are equal in unit tests - Stack Overflow https://stackoverflow.com/questions/23530982/c-sharp-asserting-two-objects-are-equal-in-unit-tests