Предыдущая серия была тут - http://18delphi.blogspot.ru/2013/11/gui.html
Попробуем развить тему.
Давайте попробуем поработать с контролом в фокусе и например ввести в него текст.
Это можно сделать несколькими способами.
Например через эмуляцию нажатия кнопок или непосредственно присваивая свойство Caption/Text.
И тот и другой способ - имеют право на жизнь. И служат разным целям.
Эмуляция нажатия кнопок - проверяет как контрол обрабатывает клавиатурный ввод. Непосредственное присваивание позволяет управлять состоянием контрола, для проверки дальнейшей бизнес-логики приложений.
Это разные уровни тестирования. Об уровнях тестирования я может быть расскажу как-нибудь потом.
А пока реализуем слова тестовой машины для работы с контролами.
Теперь напишем тест:
Он делает, что и задумывалось - находит контрол в фокусе и присваивает ему заданный текст.
Теперь напишем вспомогательное слово:
Тест теперь можно переписать так:
Опять же - "почти похоже" на кусок TestCase'а.
"На закуску" - реализуем слово для эмуляции нажатия на кнопку клавиатуры в контроле в фокусе.
Оно потом нам понадобится.
Вот это слово:
Теперь напишем тест:
Ну и опять напишем "вспомогательное слово":
Тогда тест можно переписать так:
Опять - "почти по-русски".
Мне кажется, что подобный "код" может читать и исполнять человек.
На этом - пока закончим.
Попробуем развить тему.
Давайте попробуем поработать с контролом в фокусе и например ввести в него текст.
Это можно сделать несколькими способами.
Например через эмуляцию нажатия кнопок или непосредственно присваивая свойство Caption/Text.
И тот и другой способ - имеют право на жизнь. И служат разным целям.
Эмуляция нажатия кнопок - проверяет как контрол обрабатывает клавиатурный ввод. Непосредственное присваивание позволяет управлять состоянием контрола, для проверки дальнейшей бизнес-логики приложений.
Это разные уровни тестирования. Об уровнях тестирования я может быть расскажу как-нибудь потом.
А пока реализуем слова тестовой машины для работы с контролами.
interface TkwFocusedControl = class(TscriptKeyWord) protected procedure DoIt(aContext : TscripContext); override; end;//TkwFocusedControl TkwEditSetText = class(TscriptKeyWord) protected procedure DoIt(aContext : TscripContext); override; end;//TkwEditSetText implementation procedure TkwFocusedControl.DoIt(aContext : TscripContext); var l_Control : TControl; begin l_Control := FindControl(Windows.GetFocus); Assert(l_Control <> nil); aContext.PushObject(l_Control); end; procedure TkwEditSetText.DoIt(aContext : TscripContext); var l_Text : String; l_Control : TControl; begin l_Control := aContext.PopObject; l_Text := aContext.PopString; Assert(l_Control Is TEdit); (l_Control As TEdit).Text := l_Text; // - это можно было бы сделать и через RTTI, но мы сделаем это напрямую end; initialization ScriptEngine.RegisterWord(TkwFocusedControl, 'FocusedControl'); ScriptEngine.RegisterWord(TkwEditSetText, 'EditSetText');
Теперь напишем тест:
OBJECT VAR l_Control FocusedControl =: l_Control 'Текст' l_Control EditSetText
Он делает, что и задумывалось - находит контрол в фокусе и присваивает ему заданный текст.
Теперь напишем вспомогательное слово:
PROCEDURE "Присвоить текст в текущий контрол" STRING IN aText OBJECT VAR l_Control FocusedControl =: l_Control aText l_Control EditSetText END //"Присвоить текст в текущий контрол"
Тест теперь можно переписать так:
"Присвоить текст {('Текст')} в текущий контрол"
Опять же - "почти похоже" на кусок TestCase'а.
"На закуску" - реализуем слово для эмуляции нажатия на кнопку клавиатуры в контроле в фокусе.
Оно потом нам понадобится.
Вот это слово:
interface
TkwKey = class(TscriptKeyWord)
{* Нажатие на кнопку клавиатуры.
Пример:
[code]
PROCEDURE "Нажать" STRING IN aString
aString Key
END // "Нажать"
[code] }
protected
// realized methods
procedure DoIt(aContext: TscriptContext); override;
end;//TkwKey
implementation
procedure TkwKey.DoIt(aContext: TscriptContext);
type
TSS = ssShift..ssDouble;
const
cMap : array [TSS] of Integer = (VK_Shift, VK_MENU, VK_Control,
0, 0, 0, 0);
var
l_SC : TShortCut;
l_K : Word;
l_Shift: TShiftState;
l_ShiftToCheck: TShiftState;
l_H : THandle;
l_KeyState: TKeyboardState;
l_NewKeyState: TKeyboardState;
I : Integer;
l_SS : TSS;
l_AltOnly : Boolean;
l_Alt : Boolean;
begin
l_H := GetFocus;
l_SC := TextToShortCut(aContext.PopString);
Assert(l_SC <> 0);
ShortCutToKey(l_SC, l_K, l_Shift);
l_ShiftToCheck := l_Shift;
l_AltOnly := false;
l_Alt := false;
l_Alt := ssAlt in l_ShiftToCheck;
GetKeyboardState(l_KeyState);
try
for I := Low(l_NewKeyState) to High(l_NewKeyState) do
l_NewKeyState[I] := 0;
for l_SS := Low(l_SS) to High(l_SS) do
begin
if (l_SS in l_Shift) then
begin
if (cMap[l_SS] <> 0) then
begin
l_ShiftToCheck := l_ShiftToCheck - [l_SS];
l_NewKeyState[cMap[l_SS]] := $81;
SetKeyboardState(l_NewKeyState);
if (cMap[l_SS] = vk_Menu) then
begin
//PostMessage(l_H, WM_KEYDOWN, cMap[l_SS], $20380001);
end//cMap[l_SS] = vk_Menu
else
PostMessage(l_H, WM_KEYDOWN, cMap[l_SS], $1510001);
ProcessMessages;
end;//cMap[l_SS] <> 0
end;//l_SS in l_Shift
end;//for l_SS
Assert(l_ShiftToCheck = []);
l_NewKeyState[l_K] := $81;
SetKeyboardState(l_NewKeyState);
if l_AltOnly then
begin
SendMessage(l_H, WM_SYSCHAR, l_K, 0);
end//l_AltOnly
else
begin
if l_Alt then
PostMessage(l_H, WM_SYSKEYDOWN, l_K, $20170001)
else
PostMessage(l_H, WM_KEYDOWN, l_K, $1510001);
ProcessMessages;
if l_Alt then
PostMessage(l_H, WM_SYSKEYUP, l_K, $E0170001)
else
PostMessage(l_H, WM_KEYUP, l_K, $1510001);
ProcessMessages;
end;//l_AltOnly
for l_SS := Low(l_SS) to High(l_SS) do
begin
if (l_SS in l_Shift) then
begin
if (cMap[l_SS] <> 0) then
begin
if (cMap[l_SS] = vk_Menu) then
begin
//PostMessage(l_H, WM_KEYUP, cMap[l_SS], $C0380001);
end//cMap[l_SS] = vk_Menu
else
PostMessage(l_H, WM_KEYUP, cMap[l_SS], $1510001);
ProcessMessages;
end;//cMap[l_SS] <> 0
end;//l_SS in l_Shift
end;//for l_SS
finally
SetKeyboardState(l_KeyState);
end;//try..finally
end;//TkwKey.DoIt
initialization
ScriptEngine.RegisterKeyWord(TkwKey, 'Key');
Теперь напишем тест:
'Enter' Key 'Tab' Key 'Shift-Tab' Key
Ну и опять напишем "вспомогательное слово":
PROCEDURE "Нажать" STRING IN aString aString Key END // "Нажать"
Тогда тест можно переписать так:
"Нажать {('Enter')}"
"Нажать {('Tab')}"
"Нажать {('Shift-Tab')}"
Опять - "почти по-русски".
Мне кажется, что подобный "код" может читать и исполнять человек.
На этом - пока закончим.
Комментариев нет:
Отправить комментарий