Skip to content

Commit

Permalink
fix #1364: контроль параметров при вызове через Рефлектор +тесты (v2)
Browse files Browse the repository at this point in the history
  • Loading branch information
Mr-Rm committed Oct 20, 2023
1 parent 70474cc commit 7794aaa
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 12 deletions.
29 changes: 17 additions & 12 deletions src/OneScript.StandardLibrary/Reflector.cs
Original file line number Diff line number Diff line change
Expand Up @@ -79,26 +79,31 @@ public IValue CallMethod(IRuntimeContextInstance target, string methodName, Arra

private static IValue[] GetArgsToPass(ArrayImpl arguments, ParameterInfo[] parameters)
{
var argsToPass = new List<IValue>();
if (arguments != null)
{
argsToPass.AddRange(arguments);
}

if (parameters.Length < argsToPass.Count)
var argValues = arguments?.ToArray() ?? Array.Empty<IValue>();
// ArrayImpl не может (не должен!) содержать null или NotAValidValue

if (argValues.Length > parameters.Length)
throw RuntimeException.TooManyArgumentsPassed();

for (int i = 0; i < argsToPass.Count; i++)
var argsToPass = new IValue[parameters.Length];

int i = 0;
for (; i < argValues.Length; i++)
{
if (parameters[i].IsByRef())
argsToPass[i] = Variable.Create(argsToPass[i], $"reflectorArg{i}");
argsToPass[i] = Variable.Create(argValues[i], "");
else
argsToPass[i] = argValues[i];
}
while (argsToPass.Count < parameters.Length)
for (; i < parameters.Length; i++)
{
argsToPass.Add(null);
if (!parameters[i].HasDefaultValue)
throw RuntimeException.TooFewArgumentsPassed();

// else keep null as a default value
}

return argsToPass.ToArray();
return argsToPass;
}

/// <summary>
Expand Down
44 changes: 44 additions & 0 deletions tests/reflector.os
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@
ВсеТесты.Добавить("ТестДолжен_ПроверитьМетод_ПолучитьТаблицуСвойств");

ВсеТесты.Добавить("ТестДолжен_ПроверитьВызовМетодаСПараметрамиПоУмолчанию");
ВсеТесты.Добавить("ТестДолжен_ПроверитьВызовМетодаБезПараметровПоУмолчанию");
ВсеТесты.Добавить("ТестДолжен_ПроверитьПередачуПараметровПоУмолчанию");

ВсеТесты.Добавить("ТестДолжен_ПроверитьМетодСуществуетДляТипа");
ВсеТесты.Добавить("ТестДолжен_ПроверитьПолучитьТаблицуМетодовДляТипа");
ВсеТесты.Добавить("ТестДолжен_ПроверитьПолучитьТаблицуСвойствДляСистемногоТипа");
Expand Down Expand Up @@ -420,6 +423,47 @@

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

Процедура ТестДолжен_ПроверитьВызовМетодаБезПараметровПоУмолчанию() Экспорт
Рефлектор = Новый Рефлектор;

Массив = Новый Массив(1);
Арг = Новый Массив;
Арг.Добавить(0);

Ошибка = Ложь;
Попытка
Рефлектор.ВызватьМетод(Массив, "Установить", Арг);
Ч = Массив[0];
Ошибка = Истина;
Исключение
Сообщение = ОписаниеОшибки();
Если СтрНайти(Сообщение,"NullReferenceException") <> 0 Тогда
Ошибка = Истина;
КонецЕсли;
КонецПопытки;

Если Ошибка Тогда
юТест.ТестПровален("Вызов рефлектора с недостаточным количеством параметров без умолчания");
КонецЕсли;

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

Процедура ТестПередачиПараметровПоУмолчанию(Пар1, Пар2="п2") Экспорт
юТест.ПроверитьРавенство(Пар1, "п1", "Тест передачи параметров: параметр 1");
юТест.ПроверитьРавенство(Пар2, "п2", "Тест передачи параметров: параметр 2");
КонецПроцедуры

Процедура ТестДолжен_ПроверитьПередачуПараметровПоУмолчанию() Экспорт
Рефлектор = Новый Рефлектор;

Массив = Новый Массив(1);
Арг = Новый Массив;
Арг.Добавить("п1");
Рефлектор.ВызватьМетод(ЭтотОбъект, "ТестПередачиПараметровПоУмолчанию", Арг);

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


Процедура ТестДолжен_ПроверитьМетодСуществуетДляТипа() Экспорт

Рефлектор = Новый Рефлектор;
Expand Down

0 comments on commit 7794aaa

Please sign in to comment.