Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,10 @@ public ValueTableColumnCollection(ValueTable owner)
/// <returns>КолонкаТаблицыЗначений</returns>
[ContextMethod("Добавить", "Add")]
public ValueTableColumn Add(string name, TypeDescription type = null, string title = null, int width = 0)
{
{
if (!Utils.IsValidIdentifier(name))
throw ColumnException.WrongColumnName(name);

if (FindColumnByName(name) != null)
throw ColumnException.DuplicatedColumnName(name);

Expand All @@ -67,6 +70,9 @@ public ValueTableColumn Add(string name, TypeDescription type = null, string tit
[ContextMethod("Вставить", "Insert")]
public ValueTableColumn Insert(int index, string name, TypeDescription type = null, string title = null, int width = 0)
{
if (!Utils.IsValidIdentifier(name))
throw ColumnException.WrongColumnName(name);

if (FindColumnByName(name) != null)
throw ColumnException.DuplicatedColumnName(name);

Expand Down Expand Up @@ -125,7 +131,7 @@ public IValue Find(string name)
public void Delete(IValue column)
{
var vtColumn = GetColumnByIIndex(column);
_owner.ForEach((ValueTableRow x)=>
_owner.ForEach((ValueTableRow x) =>
{
x.OnOwnerColumnRemoval(vtColumn);
});
Expand All @@ -150,10 +156,7 @@ public ValueTableColumn FindColumnByName(string name)
return _columns.Find(column => _namesComparer.Equals(name, column.Name));
}

public ValueTableColumn FindColumnByIndex(int index)
{
return _columns[index];
}
public ValueTableColumn FindColumnByIndex(int index) => _columns[index];

public IEnumerator<ValueTableColumn> GetEnumerator()
{
Expand All @@ -170,10 +173,7 @@ System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()

public override bool IsIndexed => true;

public override IValue GetIndexedValue(IValue index)
{
return GetColumnByIIndex(index);
}
public override IValue GetIndexedValue(IValue index) => GetColumnByIIndex(index);

public override int GetPropertyNumber(string name)
{
Expand All @@ -183,11 +183,8 @@ public override int GetPropertyNumber(string name)
return idx;
}

public override int GetPropCount()
{
return _columns.Count;
}

public override int GetPropCount() => _columns.Count;

public override string GetPropName(int propNum)
{
return FindColumnByIndex(propNum).Name;
Expand All @@ -198,39 +195,30 @@ public override IValue GetPropValue(int propNum)
return FindColumnByIndex(propNum);
}

public override bool IsPropWritable(int propNum)
{
return false;
}

public override bool IsPropReadable(int propNum)
{
return true;
}
public override bool IsPropWritable(int propNum) => false;

public override bool IsPropReadable(int propNum) => true;

public ValueTableColumn GetColumnByIIndex(IValue index)
{
if (index.SystemType == BasicTypes.String)
{
ValueTableColumn Column = FindColumnByName(index.ToString());
if (Column == null)
throw PropertyAccessException.PropNotFoundException(index.ToString());
return Column;
return FindColumnByName(index.ToString())
?? throw PropertyAccessException.PropNotFoundException(index.ToString());
}

if (index.SystemType == BasicTypes.Number)
{
int i_index = Decimal.ToInt32(index.AsNumber());
if (i_index < 0 || i_index >= Count())
throw RuntimeException.InvalidArgumentValue();
throw RuntimeException.IndexOutOfRange();

ValueTableColumn Column = FindColumnByIndex(i_index);
return Column;
return FindColumnByIndex(i_index);
}

if (index is ValueTableColumn)
if (index is ValueTableColumn column)
{
return index as ValueTableColumn;
return column;
}

throw RuntimeException.InvalidArgumentType();
Expand All @@ -247,13 +235,12 @@ public int GetColumnNumericIndex(IValue index)
{
int iIndex = Decimal.ToInt32(index.AsNumber());
if (iIndex < 0 || iIndex >= Count())
throw RuntimeException.InvalidArgumentValue();
throw RuntimeException.IndexOutOfRange();

return iIndex;
}

var column = index as ValueTableColumn;
if (column != null)
if (index is ValueTableColumn column)
{
return IndexOf(column);
}
Expand Down
7 changes: 5 additions & 2 deletions src/ScriptEngine/Machine/Contexts/ContextValuesMarshaller.cs
Original file line number Diff line number Diff line change
Expand Up @@ -242,8 +242,11 @@ private static object ConvertValueType(IValue value, Type type, IBslProcess proc
valueObj = value.AsBoolean();
}
else if (typeof(IRuntimeContextInstance).IsAssignableFrom(type))
{
valueObj = value.AsObject();
{
if (value.GetType().IsAssignableTo(type))
valueObj = value.AsObject();
else
throw new InvalidCastException();
}
else if (value is EnumerationValue && typeof(EnumerationValue).IsAssignableFrom(type))
{
Expand Down
54 changes: 54 additions & 0 deletions tests/valuetable.os
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,12 @@
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗапятуюВИменахКолонок_СПустыми");
ВсеТесты.Добавить("ТестДолжен_ПроверитьИсключениеДляИндекса");

ВсеТесты.Добавить("ТестДолжен_ВызватьИсключениеПриДобавленииКолонкиСНевернымИменем");
ВсеТесты.Добавить("ТестДолжен_ВызватьИсключениеПриВставкеКолонкиСНевернымИменем");
ВсеТесты.Добавить("ТестДолжен_ВызватьИсключениеНаПоискеИндексаКолонкиСНевернымПримитивнымТипом");
ВсеТесты.Добавить("ТестДолжен_ВызватьИсключениеНаПоискеИндексаКолонкиСНевернымОбъектнымТипом");


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

КонецФункции
Expand Down Expand Up @@ -1234,3 +1240,51 @@

ВызватьИсключение "Ожидали исключение, но его не было";
КонецПроцедуры

Процедура ТестДолжен_ВызватьИсключениеПриДобавленииКолонкиСНевернымИменем() Экспорт
ТЗ = Новый ТаблицаЗначений();
Попытка
ТЗ.Колонки.Добавить("!@#");
Исключение
Возврат;
КонецПопытки;

ВызватьИсключение "Должно было быть выдано исключение, но его не было";
КонецПроцедуры

Процедура ТестДолжен_ВызватьИсключениеПриВставкеКолонкиСНевернымИменем() Экспорт
ТЗ = Новый ТаблицаЗначений();
Попытка
ТЗ.Колонки.Вставить(0,"!@#");
Исключение
Возврат;
КонецПопытки;

ВызватьИсключение "Должно было быть выдано исключение, но его не было";
КонецПроцедуры

Процедура ТестДолжен_ВызватьИсключениеНаПоискеИндексаКолонкиСНевернымПримитивнымТипом() Экспорт
ТЗ = Новый ТаблицаЗначений();
Попытка
ТЗ.Колонки.Индекс(0);
Исключение
Ошибка = ИнформацияОбОшибке().Описание;
юТест.ПроверитьНеРавенство(Найти(Ошибка,"Неверный тип аргумента"), 0, "Неверный вид ошибки: "+Ошибка);
Возврат;
КонецПопытки;

ВызватьИсключение "Должно было быть выдано исключение, но его не было";
КонецПроцедуры

Процедура ТестДолжен_ВызватьИсключениеНаПоискеИндексаКолонкиСНевернымОбъектнымТипом() Экспорт
ТЗ = Новый ТаблицаЗначений();
Попытка
ТЗ.Колонки.Индекс(ТЗ);
Исключение
Ошибка = ИнформацияОбОшибке().Описание;
юТест.ПроверитьНеРавенство(Найти(Ошибка,"Неверный тип аргумента"), 0, "Неверный вид ошибки: "+Ошибка);
Возврат;
КонецПопытки;

ВызватьИсключение "Должно было быть выдано исключение, но его не было";
КонецПроцедуры