Skip to content

Commit dcab8b6

Browse files
committed
рефакторинг метода Скопировать, с тестом
1 parent b18881a commit dcab8b6

File tree

2 files changed

+55
-31
lines changed

2 files changed

+55
-31
lines changed

src/OneScript.StandardLibrary/Collections/ValueTable/ValueTable.cs

Lines changed: 15 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -546,59 +546,43 @@ public ValueTable CopyColumns(string columnNames = null)
546546
[ContextMethod("Скопировать", "Copy")]
547547
public ValueTable Copy(IValue rows = null, string columnNames = null)
548548
{
549-
var Result = CopyColumns(columnNames);
549+
var result = CopyColumns(columnNames);
550550
var columns = GetProcessingColumnList(columnNames);
551551

552-
IEnumerable<ValueTableRow> requestedRows;
553-
if (rows == null)
554-
{
555-
requestedRows = _rows;
556-
}
557-
else
558-
{
559-
if (rows is StructureImpl structure)
560-
requestedRows = FindRows(structure).Select(x => x as ValueTableRow);
561-
else if (rows is ArrayImpl array)
562-
requestedRows = GetRowsEnumByArray(array);
563-
else
564-
throw RuntimeException.InvalidArgumentType();
565-
}
552+
IEnumerable<ValueTableRow> requestedRows = rows switch
553+
{
554+
null => _rows,
555+
StructureImpl structure => FindRows(structure).Select(x => x as ValueTableRow),
556+
ArrayImpl array => GetRowsEnumByArray(array),
557+
_ => throw RuntimeException.InvalidArgumentType(),
558+
};
566559

567560
var columnMap = new Dictionary<ValueTableColumn, ValueTableColumn>();
568561
foreach (var column in columns)
569562
{
570-
var destinationColumn = Result.Columns.FindColumnByName(column.Name);
563+
var destinationColumn = result.Columns.FindColumnByName(column.Name);
571564
columnMap.Add(column, destinationColumn);
572565
}
573566

574567
foreach (var row in requestedRows)
575568
{
576-
var new_row = Result.Add();
569+
var new_row = result.Add();
577570
foreach (var Column in columns)
578571
{
579572
new_row.Set(columnMap[Column], row.Get(Column));
580573
}
581574
}
582575

583-
return Result;
576+
return result;
584577
}
585578

586-
private IEnumerable<ValueTableRow> GetRowsEnumByArray(IValue rows)
587-
{
588-
IEnumerable<ValueTableRow> requestedRows;
589-
var rowsArray = rows as ArrayImpl;
579+
private IEnumerable<ValueTableRow> GetRowsEnumByArray(ArrayImpl rowsArray)
580+
{
590581
if (rowsArray == null)
591582
throw RuntimeException.InvalidArgumentType();
592583

593-
requestedRows = rowsArray.Select(x =>
594-
{
595-
var vtr = x as ValueTableRow;
596-
if (vtr == null || vtr.Owner() != this)
597-
throw RuntimeException.InvalidArgumentValue();
598-
599-
return vtr;
600-
});
601-
return requestedRows;
584+
return rowsArray.Select(x => x is ValueTableRow vtr && vtr.Owner() == this ? vtr
585+
: throw RuntimeException.InvalidArgumentValue());
602586
}
603587

604588
private struct ValueTableSortRule

tests/valuetable.os

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@
3030
ВсеТесты.Добавить("ТестДолжен_НайтиНесколькоСтрокВТаблице");
3131
ВсеТесты.Добавить("ТестДолжен_СкопироватьТаблицуПолностью");
3232
ВсеТесты.Добавить("ТестДолжен_СкопироватьТаблицуПоМассивуСтрок");
33+
ВсеТесты.Добавить("ТестДолжен_ПроверитьИсключениеПриКопированииТаблицыПоМассивуСтрок");
3334
ВсеТесты.Добавить("ТестДолжен_СкопироватьТаблицуНесколькоКолонок");
35+
ВсеТесты.Добавить("ТестДолжен_СкопироватьТаблицуПоОтбору");
3436
ВсеТесты.Добавить("ТестДолжен_ПроверитьСверткуБезУказанияКолонок");
3537

3638
ВсеТесты.Добавить("ТестДолжен_ЗагрузитьКолонку");
@@ -537,6 +539,44 @@
537539

538540
КонецПроцедуры
539541

542+
Процедура ТестДолжен_СкопироватьТаблицуПоОтбору() Экспорт
543+
544+
Т = СоздатьТаблицуСДанными();
545+
Т.Добавить().Значение = 4;
546+
547+
Отбор = Новый Структура("Значение", 4);
548+
Т2 = Т.Скопировать(Отбор,"Ключ");
549+
550+
юТест.ПроверитьНеравенство(Т, Т2);
551+
юТест.ПроверитьРавенство(2, Т2.Количество());
552+
юТест.ПроверитьРавенство(1, Т2.Колонки.Количество());
553+
юТест.ПроверитьРавенство("Ключ4", Т2[0].Ключ);
554+
юТест.ПроверитьРавенство(Неопределено, Т2[1].Ключ);
555+
556+
КонецПроцедуры
557+
558+
Процедура ТестДолжен_ПроверитьИсключениеПриКопированииТаблицыПоМассивуСтрок() Экспорт
559+
560+
Т = СоздатьТаблицуСДанными();
561+
562+
Т0 = Новый ТаблицаЗначений();
563+
Т0.Колонки.Добавить("Тест");
564+
Т0.Добавить().Тест = 1;
565+
566+
МассивСтрок = Новый Массив;
567+
МассивСтрок.Добавить(Т0[0]);
568+
569+
Попытка
570+
Т2 = Т.Скопировать(МассивСтрок);
571+
Исключение
572+
Возврат;
573+
КонецПопытки;
574+
575+
ВызватьИсключение "Ожидали исключение, но его не было";
576+
577+
КонецПроцедуры
578+
579+
540580
Процедура ТестДолжен_ПроверитьСверткуБезУказанияКолонок() Экспорт
541581

542582
Перем Т;

0 commit comments

Comments
 (0)