public void Triangle_ParceParametersTest() { // arrange string[] parameters = new string[] { "\"type\":triangle", "\"side_a\":2", "\"side_b\":2", "\"side_c\":2", }; double expectedPerimeter = 6; // act TriangleClass item = new TriangleClass(); item.ParceParameters(parameters); double actual = item.PerimeterGet(); // 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); }