public void Circle_PerimeterCalculateTest()
        {
            // arrange
            double radius   = 10;
            int    expected = (int)(62.83184 * 100.0); //убираем дробную часть

            // act
            СircleClass item = new СircleClass();

            double actual_double = item.PerimeterCalculate(radius);
            int    actual        = (int)(actual_double * 100.0); //убираем дробную часть

            // assert
            Assert.AreEqual(expected, actual);
        }
        public void Сircle_ParceParametersTest()
        {
            // arrange
            string[] parameters = new string[]
            {
                "\"type\":circle",
                "\"radius\":10",
            };
            int expectedPerimeter = (int)(62.83184 * 100.0); //убираем дробную часть

            // act
            СircleClass item = new СircleClass();

            item.ParceParameters(parameters);

            double actual_double = item.PerimeterGet();
            int    actual        = (int)(actual_double * 100.0); //убираем дробную часть

            // assert
            Assert.AreEqual(expectedPerimeter, actual);
        }
        //**********************************************************************************************
        // РАЗБОР ДОКУМЕНТА
        //**********************************************************************************************
        /// <summary>
        /// Получение данных из документа.
        /// </summary>
        /// <param name="document"></param>
        void DataParcer(FlowDocument document)
        {
            List <FigureClass> Shapes = new List <FigureClass> {
            };                                                                             //Список фигур в документе.
            List <string> blocks      = new List <string> {
            };                                                                             //Промежуточный список для хранения блоков с параметрами для каждой фигуры.
            List <DeltaShapesValueClass> deltaShapes = new List <DeltaShapesValueClass>(); //Список для расчета средних значений периметра и площади для каждого типа фигур.

            //0. Преобразуем документ в строку
            String input = new TextRange(document.ContentStart, document.ContentEnd).Text;

            input = Regex.Replace(input, @"[ \r\n\t]", ""); //Избавляемся от пробелов, переносов.
            input = input.ToLower();                        //Переводим в нижний регистр

            //Патерн для разбиения строки на блоки.
            String pattern = @"\{([^\{\}]+)\}";     //где, \{	Совпадение с открывающей скобкой.

            // ([^\{\}]+)  Совпадение с любым символом, который не является открывающей или закрывающей круглой скобкой один или несколько раз.
            // \}   Совпадение с закрывающей скобкой

            //1. Извлечение блоков из строки на основе шаблона
            foreach (Match match in Regex.Matches(input, pattern))
            {
                blocks.Add(match.Groups[1].Value);
            }
            //Количество элементов больше 0?
            if (blocks.Count == 0)
            {
                ClearAnswer();
                return;//Пусто. Выход
            }


            //2. Извлечение данных из блоков
            foreach (var item in blocks)
            {
                string type = "";
                //2.1. Существует ли параметр типа фигуры в строке
                if (item.IndexOf("type") == -1) //не существует
                {
                    //Удаляем элемент из списка.
                    blocks.Remove(item);
                    continue;
                }

                //2.2. Разбиение блока на массив строк с параметрами.
                string[] parameters = item.Split(';', StringSplitOptions.RemoveEmptyEntries);

                //2.3. Определение типа фигуры
                foreach (var array_element in parameters)
                {
                    //Ищем параметр type
                    if (array_element.IndexOf("type") == -1) //не тот параметр
                    {
                        continue;                            //Далее
                    }
                    else//Нашли
                    {
                        type = GetType(array_element); //Проверяем, определен ли данный тип фигуры
                        break;
                    }
                }

                if (type == "")//Тип фигуры не определен
                {
                    //Удаляем элемент из списка.
                    blocks.Remove(item);
                    continue;
                }

                //3. Получаем остальные параметры. Для каждого типа фигуры свой набор параметров.
                switch (type)
                {
                case FIGURE_CIRCLE:
                    СircleClass circle = new СircleClass();
                    circle.ParceParameters(parameters);                            //Разбор параметров и рассчет значений площади и периметра.
                    Shapes.Add(circle);                                            //Добавляем элемент в список фигур
                    DeltaShapes_AddTypeIfDoesnotExist(FIGURE_CIRCLE, deltaShapes); //Добавить тип фигуры в список используемых фигур.
                    break;

                case FIGURE_RECTANGLE:
                    RectangleClass rectangle = new RectangleClass();
                    rectangle.ParceParameters(parameters);
                    Shapes.Add(rectangle);
                    DeltaShapes_AddTypeIfDoesnotExist(FIGURE_RECTANGLE, deltaShapes);
                    break;

                case FIGURE_SQUARE:
                    SquareClass square = new SquareClass();
                    square.ParceParameters(parameters);
                    Shapes.Add(square);
                    DeltaShapes_AddTypeIfDoesnotExist(FIGURE_SQUARE, deltaShapes);
                    break;

                case FIGURE_TRAPEZOID:
                    TrapezoidClass trapezoid = new TrapezoidClass();
                    trapezoid.ParceParameters(parameters);
                    Shapes.Add(trapezoid);
                    DeltaShapes_AddTypeIfDoesnotExist(FIGURE_TRAPEZOID, deltaShapes);
                    break;

                case FIGURE_TRIANGLE:
                    TriangleClass triangle = new TriangleClass();
                    triangle.ParceParameters(parameters);
                    Shapes.Add(triangle);
                    DeltaShapes_AddTypeIfDoesnotExist(FIGURE_TRIANGLE, deltaShapes);
                    break;
                }
            }

            //По заданию, неоходимо найти:
            //1. Средний периметр и площадь всех фигур
            //2. Фигура наибольшей площади
            //3. Тип фигуры с наибольшим значением среднего периметра среди всех других типов фигур.

            double deltaPerimeter = 0;                    //Средний периметр
            double deltaArea      = 0;                    //Средняя площадь

            double maxArea           = 0;                 //Значение площади
            string maxAreaTypeFigure = "Пусто";           //Тип фигуры

            double maxDeltaPerimeter           = 0;       //Наибольший средний периметр
            string maxDeltaPerimeterTypeFigure = "Пусто"; //Тип фигуры с наибольшим средним периметром

            //Находим.
            foreach (var figure in Shapes)
            {
                //Получаем значения периметра и площади для каждой фигуры
                deltaPerimeter += figure.PerimeterGet();
                deltaArea      += figure.AreaGet();

                //Ищем фигуру наибольшей площади
                if (maxArea < figure.AreaGet())
                {
                    maxArea           = figure.AreaGet();
                    maxAreaTypeFigure = figure.TypeGet();
                }
                //Увеличить среднее значение площади и периметра для конкретного типа фигур
                DeltaShapes_AddTypeItem(figure.TypeGet(), figure.PerimeterGet(), figure.AreaGet(), deltaShapes);
            }
            //Расчет среднего значения периметра и площади всех фигур
            deltaPerimeter /= Shapes.Count;
            deltaArea      /= Shapes.Count;
            //Расчет среднего значения периметра и площади для каждого типа фигур
            DeltaShapes_CalculateDelta(deltaShapes);
            //Ищем тип фигуры с наибольшим значением среднего периметра среди всех других типов фигур
            foreach (var item in deltaShapes)
            {
                if (maxDeltaPerimeter < item.Perimeter)
                {
                    maxDeltaPerimeter           = item.Perimeter;
                    maxDeltaPerimeterTypeFigure = item.Type;
                }
            }

            //Отображаем ответ
            deltaPerimeterTextBlock.Text              = String.Format("Cредний периметр: {0:f2}(м)", deltaPerimeter);
            deltaAreaTextBlock.Text                   = String.Format("Cредняя площадь: {0:f2} (кв.м)", deltaArea);
            maxAreaTypeFigureTextBlock.Text           = String.Format("Фигура наибольшей площади: {0} ({1:f2}кв.м)", maxAreaTypeFigure, maxArea);
            maxDeltaPerimeterTypeFigureTextBlock.Text = String.Format("Тип фигуры с наибольшим средним периметром: {0} ({1:f2}м)", maxDeltaPerimeterTypeFigure, maxDeltaPerimeter);
        }