вторник, 5 ноября 2013 г.

GUI-тестирование "по-русски". Использование "классического" RTTI для работы со свойствами объектов приложения

Вот тут - http://18delphi.blogspot.ru/2013/11/gui_4.html я описывал как можно изменить свойство объекта приложения при помощи "специально выделенной ручки".

Там было описано слово EditSetText.


Теперь мы попробуем использовать RTTI для примерно тех же целей.


Напишем более "низкоуровневые" слова на Delphi. 


А слово EditSetText - определим уже в "пользовательском словаре".

Итак:


Вот что мы имеем "со стороны Delphi":



interface

 TkwObjectGetStringProp = class(TscriptKeyWord)
  protected
   procedure DoIt(aContext: TscriptContext); override;
 end;//TkwObjectGetStrProp 

 TkwObjectSetStringProp = class(TscriptKeyWord)
  protected
   procedure DoIt(aContext: TscriptContext); override;
 end;//TkwObjectGetStrProp

implementation

procedure TkwObjectGetStringProp.DoIt(aContext: TscriptContext);
var
 l_Object : TObject;
 l_PropertyName : String;
begin
 l_Object := aContext.PopObject;
 l_PropertyName := aContext.PopString;
 aContext.PushString(GetStrProp(l_Object, l_PropertyName));
end;

procedure TkwObjectSetStringProp.DoIt(aContext: TscriptContext);
var
 l_Object : TObject;
 l_PropertyName : String;
 l_PropertyValue : String;
begin
 l_Object := aContext.PopObject;
 l_PropertyName := aContext.PopString;
 l_PropertyValue := aContext.PopString;
 SetStrProp(l_Object, l_PropertyName, l_V);
 SetStrProp(l_Object, l_PropertyName, l_PropertyValue);
end;

initialization
 ScriptEngine.RegisterKeyWord(TkwObjectGetStringProp, 'ObjectGetStringProp');
 ScriptEngine.RegisterKeyWord(TkwObjectSetStringProp, 'ObjectSetStringProp');

Обработку ошибок - пока намерено опускаю.

 Понятное, дело, что точно так же можно определить и ObjectGetIntegerProp, ObjectSetIntegerProp и ObjectGetBooleanProp, ObjectSetBooleanProp ти т.д. и т.п.

 Теперь как "преображается" наше слово EditSetText:

PROCEDURE EditSetText STRING IN aText OBJECT IN aControl
 aText 'Text' aControl ObjectSetStringProp
END // EditSetText

В "пару" ему можно написать слово получения текста:

FUNCTION EditGetText OBJECT IN aControl
 'Text' aControl ObjectGetStringProp
END // EditSetText

Весь остальной код предыдущего примера - остаётся без изменений.

Т.е. например слово "Присвоить текст в текущий контрол" - остаётся без изменений:

PROCEDURE "Присвоить текст в текущий контрол" STRING IN aText
 OBJECT VAR l_Control
 FocusedControl =: l_Control
 aText l_Control EditSetText
END //"Присвоить текст в текущий контрол"

Обработку ошибок тут - я опять же, пока - намеренно - опустил.

Комментариев нет:

Отправить комментарий