Skip to content

Commit

Permalink
#113: Коллекция колонок таблицы значений.
Browse files Browse the repository at this point in the history
  • Loading branch information
dmpas committed Oct 18, 2022
1 parent f671f27 commit 609f04c
Show file tree
Hide file tree
Showing 3 changed files with 168 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,17 @@ public V8ValueTableColumn add(String name, IValue typeDescription, IValue title,
return column;
}

@ContextMethod(name = "Вставить", alias = "Insert")
public V8ValueTableColumn insert(int index, String name, IValue typeDescription, IValue title, IValue width) {
if (hasColumn(name)) {
throw MachineException.invalidArgumentValueException();
}
final var column = createColumn(name, typeDescription, title, width);
columns.add(index, column);

return column;
}

V8ValueTableColumn copy(V8ValueTableColumn column) {
final var newColumn = column.copyTo(owner);
columns.add(newColumn);
Expand All @@ -144,6 +155,64 @@ public int count() {
return columns.size();
}

@ContextMethod(name = "Получить", alias = "Get")
public IValue get(int index) {
return columns.get(index);
}

@ContextMethod(name = "Очистить", alias = "Clear")
public void clear() {
for (var column: columns) {
owner.columnRemoved((V8ValueTableColumn) column);
}
columns.clear();
}

@ContextMethod(name = "Индекс", alias = "IndexOf")
public int indexOf(V8ValueTableColumn column) {
return columns.indexOf(column);
}
@ContextMethod(name = "Сдвинуть", alias = "Move")
public void move(IValue row, IValue offset) {
final var intOffset = offset.getRawValue().asNumber().intValue();
final var sourceIndex = indexByValue(row);
final var newIndex = evalIndex(sourceIndex, intOffset);

final var tmp = columns.get(sourceIndex);
if (sourceIndex < newIndex) {
columns.add(newIndex + 1, tmp);
columns.remove(sourceIndex);
} else {
columns.remove(sourceIndex);
columns.add(newIndex, tmp);
}
}

private int indexByValue(IValue param) {
final var index = param.getRawValue();
if (index instanceof V8ValueTableColumn) {
final var castedColumn = (V8ValueTableColumn) index;
int columnIndex = columns.indexOf(castedColumn);
if (columnIndex == -1) {
throw MachineException.invalidArgumentValueException();
}
return columnIndex;
}
final var intIndex = index.asNumber().intValueExact();
if (intIndex < 0 || intIndex >= columns.size()) {
throw MachineException.indexValueOutOfRangeException();
}
return intIndex;
}

private int evalIndex(int sourceIndex, int offset) {
var destIndex = sourceIndex + offset;
if (destIndex < 0 || destIndex >= columns.size()) {
throw MachineException.indexValueOutOfRangeException();
}
return destIndex;
}

@Override
public ContextInfo getContextInfo() {
return INFO;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,11 @@ Collection<DynamicTest> testFixedMap() throws IOException {
return getTestsFromScript(Path.of("src/test/resources/tests/fixed-map.os"));
}

@TestFactory
Collection<DynamicTest> testValueTableColumnCollection() throws IOException {
return getTestsFromScript(Path.of("src/test/resources/tests/valuetable-columncollection.os"));
}

@TestFactory
Collection<DynamicTest> testValueTable() throws IOException {
return getTestsFromScript(Path.of("src/test/resources/tests/valuetable.os"));
Expand Down
94 changes: 94 additions & 0 deletions engine/src/test/resources/tests/valuetable-columncollection.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
///////////////////////////////////////////////////////////////////////
//
// Тест проверки работы таблицы значений
//
//
///////////////////////////////////////////////////////////////////////

Перем юТест;

////////////////////////////////////////////////////////////////////
// Программный интерфейс

Функция Версия() Экспорт
Возврат "0.2";
КонецФункции

Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт

юТест = ЮнитТестирование;
ВсеТесты = Новый Массив;

ВсеТесты.Добавить("ТестДолжен_СоздатьКолонкуТаблицыЗначений");
ВсеТесты.Добавить("ТестДолжен_СдвинутьКолонкуТаблицыЗначений");

Возврат ВсеТесты;

КонецФункции

Процедура ТестДолжен_СоздатьКолонкуТаблицыЗначений() Экспорт

Т = Новый ТаблицаЗначений;

ОписаниеТипаКолонки = Новый ОписаниеТипов("Число");
К1 = Т.Колонки.Добавить("Колонка1", ОписаниеТипаКолонки, "Колонка 1", 4);
юТест.ПроверитьРавенство(К1.Имя, "Колонка1");
юТест.ПроверитьРавенство(К1.Заголовок, "Колонка 1");
юТест.ПроверитьРавенство(ТипЗнч1.ТипЗначения), Тип("ОписаниеТипов"));
юТест.ПроверитьРавенство(К1.Ширина, 4);

К0 = Т.Колонки.Вставить(0, "Колонка0", ОписаниеТипаКолонки, "Колонка 0", 4);
юТест.ПроверитьРавенство(К0.Имя, "Колонка0");
юТест.ПроверитьРавенство(К0.Заголовок, "Колонка 0");
юТест.ПроверитьРавенство(ТипЗнч0.ТипЗначения), Тип("ОписаниеТипов"));
юТест.ПроверитьРавенство(К0.Ширина, 4);

юТест.ПроверитьРавенство(Т.Колонки.Получить(0), К0);
юТест.ПроверитьРавенство(Т.Колонки.Получить(1), К1);

юТест.ПроверитьРавенство(Т.Колонки.Индекс(К0), 0);
юТест.ПроверитьРавенство(Т.Колонки.Индекс(К1), 1);

юТест.ПроверитьРавенство(Т.Колонки.Количество(), 2);

Т.Колонки.Очистить();
юТест.ПроверитьРавенство(Т.Колонки.Количество(), 0);

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

Процедура ТестДолжен_СдвинутьКолонкуТаблицыЗначений() Экспорт

Т = Новый ТаблицаЗначений;

ОписаниеТипаКолонки = Новый ОписаниеТипов("Число");
К0 = Т.Колонки.Добавить("Колонка0");
К1 = Т.Колонки.Добавить("Колонка1");
К2 = Т.Колонки.Добавить("Колонка2");
К3 = Т.Колонки.Добавить("Колонка3");
К4 = Т.Колонки.Добавить("Колонка4");

юТест.ПроверитьРавенство(Т.Колонки.Количество(), 5);

Т.Колонки.Сдвинуть(4, -1);
юТест.ПроверитьРавенство(Т.Колонки.Индекс(К4), 3);

Т.Колонки.Сдвинуть(К4, 1);
юТест.ПроверитьРавенство(Т.Колонки.Индекс(К4), 4);

БылоИсключение = Ложь;
Попытка
Т.Колонки.Сдвинуть(К0, -1);
Исключение
БылоИсключение = Истина;
КонецПопытки;
юТест.ПроверитьИстину(БылоИсключение, "Сдвиг за пределы");

БылоИсключение = Ложь;
Попытка
Т.Колонки.Сдвинуть(К4, 1);
Исключение
БылоИсключение = Истина;
КонецПопытки;
юТест.ПроверитьИстину(БылоИсключение, "Сдвиг за пределы");

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

0 comments on commit 609f04c

Please sign in to comment.