USES WordsTranslation.script WordsTuning.script SysUtils.script Mouse.script Editor.script Controls.script Forms.script ; CONST mbOk 1 CONST mbYes 2 CONST mbNo 3 CONST "Серый цвет" 15790320 // TnsFileFormat = (ns_ffRTF, ns_ffTxt, ns_ffHTML, ns_ffXML, ns_ffEvd, ns_ffNull); CONST ns_ffRTF 0 CONST ns_ffTxt 1 CONST ns_ffHTML 2 CONST ns_ffXML 3 CONST ns_ffEvd 4 : " и проверить наличие диалога с кнопкой" IN aProc INTEGER IN aButton aButton CASE mbOk wait:Ok mbYes wait:Yes mbNo wait:No DEFAULT ( 'Неизвестная кнопка диалога' RAISE ) ENDCASE TRY aProc DO FINALLY TRY waited:? 'Не дождались диалога' ASSERTS // - убеждаемся, что диалог про конец поиска таки был EXCEPT "Сравнить текущее исключение с эталоном" DROP // - удаляем результат waited:? со стека, т.к. прилетела ересь 'Нарушен баланс скобок Wait' RAISE END END ; : "и проверить наличие диалога" IN aProc "{(aProc)} и проверить наличие диалога с кнопкой {(mbOk)}" ; : " и проверить наличие диалога с кнопкой Да" IN aProc "{(aProc)} и проверить наличие диалога с кнопкой {(mbYes)}" ; : " и проверить наличие диалога с кнопкой Нет" IN aProc "{(aProc)} и проверить наличие диалога с кнопкой {(mbNo)}" ; : " и проверить наличие диалога с кнопкой Ok" IN aProc "{(aProc)} и проверить наличие диалога с кнопкой {(mbOk)}" ; : " и проверить наличие диалога с кнопкой Ок" IN aProc "{(aProc)} и проверить наличие диалога с кнопкой Ok" ; : " и проверить отсутствие диалога" IN aProc TRY "{(aProc)} и проверить наличие диалога" EXCEPT "Сравнить текущее исключение с эталоном" END ; USES F1ControlsDefinition.script ; OBJECT FUNCTION "Найти основное меню" "Найти окно по имени {(форма::MainMenuNew)}" =: Result ; // "Найти основное меню" : "Установить фокус в документ" OBJECT VAR l_FocusedControl nil =: l_FocusedControl : FindLocally DocumentText byname:control:push pop:control:SetFocus [[ 'Не удалось поставить фокус в документ.' ' Текущий контрол: ' l_FocusedControl pop:component:Name ]] strings:Cat ASSERTS ; : FindGlobally true ANYUSERTYPE DocumentText Форма_документа TryFocusOnForm [[ 'Не удалось поставить фокус в документ на форме: ' Форма_документа ' Текущий контрол: ' l_FocusedControl pop:component:Name ]] strings:Cat ASSERTS ; focused:control:push =: l_FocusedControl l_FocusedControl IsVoid ? ( 'Не нашлось контрола в фокусе' RAISE ) l_FocusedControl pop:object:IsNil ? ( 'Контрол в фокусе почему-то равен nil' RAISE ) l_FocusedControl pop:component:Name контрол::ContentsTree SameText ? ( FindGlobally EXIT ) l_FocusedControl pop:component:Name контрол::lstExternalObjects SameText ? ( FindGlobally EXIT ) l_FocusedControl pop:component:Name контрол::lstComments SameText ? ( FindGlobally EXIT ) l_FocusedControl pop:component:Name контрол::lstBookmarks SameText ? ( FindGlobally EXIT ) l_FocusedControl pop:component:Name контрол::pnRight SameText ? ( FindGlobally EXIT ) // - это для сборки ААК l_FocusedControl pop:component:Name DocumentFlash SameText ? ( EXIT ) FindLocally ; //"Установить фокус в документ" USES EVDSchema.script DocumentNumbers.script ; : "Открываем" Открыть 3 LOOP ProcessMessages OnTest "Установить фокус в документ" ; : "Найти далее" "Найти далее без проверки" "Сравнить абзац текущего редактора с эталоном" ; : "Найти далее и убедиться, что ничего не нашлось" "{(@ "Найти далее без проверки")} и проверить наличие диалога" ; : "Удалось перевести фокус в оглавление?" "Удалось перевести фокус в {(контрол::ContentsTree)}?" ; : "Проверить, что удалось перевести фокус в оглавление" "Удалось перевести фокус в оглавление?" 'Не удалось перевести фокус в оглавление' ASSERTS ; : "Перевести фокус в оглавление" "Перевести фокус в {(контрол::ContentsTree)} на форме {(форма::Contents)}" ; : "Перевести фокус в комментарии" "Перевести фокус в {(контрол::lstComments)} на форме {(форма::Contents)}" ; : "Перевести фокус в закладки" "Перевести фокус в {(контрол::lstBookmarks)} на форме {(форма::Contents)}" ; : "Перевести фокус в панель контекстного поиска на вкладке Структура документа" "Перевести фокус в {(контрол::ContextFilter)} на форме {(форма::Contents)}" "Дождаться переключения вкладок" focused:control:push pop:component:Name 'InternalEditor' SameStr 'Не удалось поставить фокус в оглавление' ASSERTS focused:control:push pop:object:ClassName 'TnscComboBoxWithFilter' SameStr 'Не смоли встать в контекстный фильтр оглавления' ASSERTS // - здесь на самом деле нужна проверка, что фокус встал во вложенный редактор ; : "Во время фильтрации не должно быть ошибок" f1::WasBeep ! 'Во время фильтрации били ошибки' ASSERTS ; : "Импортировать консультацию" VAR l_File script:FileName '.xml' sysutils:ChangeFileExt sysutils:ExtractFileName >>> l_File l_File f1::ImportConsultation OnTest ; : "Перевести фокус в консультации" "Перевести фокус в {(контрол::FoldersTree)} на форме {(форма::FoldersTree)}" ; : "Перевести фокус в Документы на контроле" true ANYUSERTYPE контрол::UnderControlList форма::UnderControl TryFocusOnForm 'Не смогли поставить фокус в Документы на контроле' ASSERTS //"Перевести фокус в {(контрол::UnderControlList)} на форме {(форма::UnderControl)}" ; : "Проверить активность вкладки Предупреждение" OnTest "Перевести фокус в {(контрол::Viewer)} на форме {(форма::Warning)} типа {(Простое_предупреждение)}" // - тут надо проверить, что предупреждение таки открылось "Сравнить текст редактора {(контрол::Viewer:push)} с эталоном" ; : "А активна ли вкладка предупреждения?" false Простое_предупреждение контрол::Viewer форма::Warning TryFocusOnForm ; : "Открыть вкладку Предупреждение с жёлтой медали с часами" оп::Предупреждение_о_неактуальной_редакции_Показать_текст_предупреждения "А активна ли вкладка предупреждения?" ! IF // - тут обрабатываем ситуацию, когда вкладка только что спряталась оп::Предупреждение_о_неактуальной_редакции_Показать_текст_предупреждения ENDIF ; : "Открыть вкладку Предупреждение с жёлтой медали с восклицательным знаком" OnTest оп::Предупреждение_(юридическое)_Показать_текст_предупреждения "А активна ли вкладка предупреждения?" ! IF // - тут обрабатываем ситуацию, когда вкладка только что спряталась оп::Предупреждение_(юридическое)_Показать_текст_предупреждения ENDIF ; : "Открыта ли форма БП?" false 0 контрол::ContextEdit форма::NewBaseSearch TryFocusOnForm ; : "Проверить, что открыта форма БП" "Открыта ли форма БП?" 'Форма БП не открыта' ASSERTS ; : "Проверить, что НЕ открыта форма БП" "Открыта ли форма БП?" ! 'Форма БП ОТКРЫТА. А не должна бы' ASSERTS ; : "В БП ищем контекст" STRING IN aString "Открыта ли форма БП?" ! IF // - проверяем, что форма БП - не открыта (чтобы не сбить текущую вкладку ручным вызовом) БП // - иначе - открываем её ELSE "Выделить весь текст в текущем редакторе" // - выделяем содержимое редактора, чтобы перетереть его ENDIF "Ввести строку {(aString)}" // - ещё бы сделать нажатие на вкладку, но для этого надо уметь искать её по имени "Нажать {('Enter')}" ; : "В БП ищем контекст по типу" STRING IN aString STRING IN aType VAR l_VG "Открыта ли форма БП?" ! IF // - проверяем, что форма БП - не открыта (чтобы не сбить текущую вкладку ручным вызовом) БП // - иначе - открываем её ELSE "Выделить весь текст в текущем редакторе" // - выделяем содержимое редактора, чтобы перетереть его ENDIF "Ввести строку {(aString)}" //[[ 'Для начала поиска выбираем вид "' aType '"' ]] strings:Cat ToDo // - ещё бы сделать нажатие на вкладку, но для этого надо уметь искать её по имени aType focused:control:push pop:control:GetParentForm pop:control:FindVGControlByName =: l_VG l_VG vg:control:GetIsChecked IF // - если вкладка уже выбрана, то по SetIsChecked не произойдёт OnChange "Нажать {('Enter')}" //aType vg:control:Click // - Click в БП не обрабатывается ELSE true l_VG vg:control:SetIsChecked ENDIF // - нажимаем на кнопку, соответствующую выбраному типу OnTest 200 SLEEP // - шаманство, чтобы выставилось правильное значение в кнопке Ещё, наверное это как-то с триггерами связано OnTest //"Нажать {('Enter')}" ; : "Жмём кнопку Искать раз" INTEGER IN aCount "{(aCount)} раз {(@ "Найти далее")}" ; : "Открываем новостную ленту" wait:Ok TRY моп::Мониторинги_Новостная_лента OnTest FINALLY waited:? ASSERT END "Дождаться переключения вкладок" ; : "Проверить вкладку документа" IN aUserType "Перевести фокус в {(DocumentText)} на форме {(форма::Text)} типа {(aUserType)}" // - тут надо проверить, что вкладка таки открылась "Сравнить текст с эталоном" ; : "Открыть вкладку" IN aProc IN aUserType aProc DO "Проверить вкладку {(aUserType)} документа" ; : "Открываем справку" "Открыть вкладку {(@ оп::Документ_Справка_к_документу)} {(dftRelatedDoc)}" ; WordAlias "Открываем Справку" "Открываем справку" : "Открываем аннотацию" "Открыть вкладку {(@ оп::Документ_Аннотация)} {(dftAnnotation)}" ; : "Закрыть вкладку консультаций" "Перевести фокус в консультации" "Закрыть текущую вкладку" // Иначе получаем некорректный результат при повторном прогоне K266418093 // С этой функциональностью вообще-то неплохо бы разобраться отдельно. ; : "А активна ли вкладка Документы на контроле?" false 0 контрол::UnderControlList форма::UnderControl TryFocusOnForm ; // "А активна ли вкладка Документы на контроле?" : "Закрыть вкладку Документы на контроле" "А активна ли вкладка Документы на контроле?" IF "Перевести фокус в Документы на контроле" "Закрыть текущую вкладку" ENDIF ; // "Закрыть вкладку Документы на контроле" : "Ищем в названии и в тексте" STRING IN aStr1 STRING IN aStr2 OBJECT VAR l_QC ППР "Убедиться, что фокус в редакторе" focused:control:push >>> l_QC 'AT_TEXT_NAME' aStr1 l_QC pop:QueryCard:SetAttribute 'AT_TEXT_BODY' aStr2 l_QC pop:QueryCard:SetAttribute "Нажать Искать" ; : "Ищем в названии" STRING IN aStr1 OBJECT VAR l_QC ППР "Убедиться, что фокус в редакторе" focused:control:push >>> l_QC 'AT_TEXT_NAME' aStr1 l_QC pop:QueryCard:SetAttribute //"Ввести {(aStr1)}" "Нажать Искать" ; : "Перевести фокус в список" focused:control:push pop:component:Name tvList ?!= ? ( "Перевести фокус в {(tvList)} на форме {(форма::List)}" ) ; : "Открыть текущий документ списка" "Перевести фокус в список" "Нажать {('Enter')}" OnTest ; : "Открыть текущий документ списка и сравнить его с эталоном" "Открыть текущий документ списка" "Сравнить текст с эталоном" ; : "Сравнить текст информации о списке с эталоном" "Сравнить текст редактора {(контрол::ListInfoViewer:push)} с эталоном" ; : "Открыть информацию о списке" оп::Список_Справка_к_списку OnTest "Дождаться переключения вкладок" OnTest ; // "Открыть информацию о списке" : "Проверить информацию о списке" "Открыть информацию о списке" "Сравнить текст информации о списке с эталоном" ; : "Проверить информацию о списке и первый документ" "Проверить информацию о списке" "Перевести фокус в список" "Открыть текущий документ списка и сравнить его с эталоном" ; : "Перевести фокус в документ" "Перевести фокус в {(DocumentText)} на форме {(Форма_документа)}" OnTest ; : "Перевести фокус в правую редакцию" "Перевести фокус в {(DocumentText)} на форме {(форма::RightEdition)}" ; : "Перевести фокус в левую редакцию" "Перевести фокус в {(DocumentText)} на форме {(форма::LeftEdition)}" ; : "Перевести фокус в список редакций левой редакции" "Перевести фокус в {(контрол::EditionChoose)} на форме {(форма::LeftEdition)}" ; : "Перевести фокус в список редакций правой редакции" "Перевести фокус в {(контрол::EditionChoose)} на форме {(форма::RightEdition)}" ; : "Сравнить даты обеих редакций с эталоном" "Перевести фокус в список редакций левой редакции" контрол::EditionChoose:push pop:control:Caption . "Перевести фокус в список редакций правой редакции" контрол::EditionChoose:push pop:control:Caption . ; : "Нажать Del" "Нажать {('Del')}" ; : "Встать на последнюю консультацию" OnTest cc:End контрол::FoldersTree:push pop:control:Caption 'Неподтвержденные' SameStr 'Не попали на папку неподтверждённых консультаций' ASSERTS cc:Up контрол::FoldersTree:push pop:control:Caption 'Ответы' SameStr IF cc:TreeExpand // - обрабатываем ситуацию, когда папка Отвеченные оказывается закрытой // всё остальное шаманство с OnTest похоже не нужно, но пусть пока будет ELSE контрол::FoldersTree:push pop:control:Caption 'Неподтвержденные' SameStr IF cc:Up контрол::FoldersTree:push pop:control:Caption 'Ответы' SameStr 'Не встали на папку Ответы' ASSERTS cc:TreeExpand ELSE //false контрол::FoldersTree:push pop:control:Caption ASSERTS ENDIF ENDIF cc:End cc:Up // Перейти к импортированной консультации ; : "Удалить последнюю консультацию" "Перевести фокус в консультации" OnTest "Встать на последнюю консультацию" wait:Yes TRY //cc:Del // - данная команда OVC на этом дереве не работает поэтому посылаем кнопку // но по-хорошему вообще надо вызывать операцию сущности "Нажать Del" // - удаляем один элемент списка FINALLY waited:? 'Не было диалога подтверждения удаления консультации' ASSERTS // - убеждаемся, что диалог удаления таки был END ; : "Выполнить со вкладкой консультаций" IN aProc "Открыть вкладку консультаций" TRY aProc DO FINALLY "Закрыть вкладку консультаций" END ; : "Выполнить с импортированой консультацией" IN aProc "Перевести фокус в консультации" "Импортировать консультацию" TRY aProc DO FINALLY "Удалить последнюю консультацию" END ; USES Reminders.script ; : "Импортировать консультацию, проверить наличие баллона и текст консультации" : Действия : Действия : TryHarder : TryHarder1 3 LOOP OnTest "Перевести фокус в консультации" ; // TryHarder 2 LOOP TryHarder1 3 LOOP OnTest ; // TryHarder TryHarder "Нажать на медаль {("Синяя медаль о наличии консультаций")} и проверить наличие баллона" TryHarder "Встать на последнюю консультацию" // Перейти к импортированной консультации "Нажать {('Enter')}" // Открыть выбранную консультацию "Сравнить текст с эталоном" ; "Выполнить {(@ Действия)} с импортированой консультацией" ; "Выполнить {(@ Действия)} со вкладкой консультаций" ; : "Прокрутить документ от конца к началу" : "Достигли начала документа" "Убедиться, что фокус в редакторе" focused:control:push pop:editor:AtTop ; : "Не достигли начала документа" "Достигли начала документа" ! ; "Установить фокус в документ" ProcessMessages cc:LastPage ProcessMessages VAR "Предельное количество" 800 >>> "Предельное количество" ПОКА ( "Не достигли начала документа" И ( "Предельное количество" >0 ) ) BEGIN --! "Предельное количество" "Установить фокус в документ" cc:PrevPage ProcessMessages END "Предельное количество" >0 'Не добежали до начала документа' ASSERTS // - проверяем, что таки добежали до начала документа ; : "Открыть список конфигураций" BOOLEAN VAR l_Found "Удалось перевести фокус в {(контрол::tvConfs)}?" =: l_Found l_Found ! IF моп::Установки_Список_конфигураций "Дождаться переключения вкладок" ENDIF // l_Found ! IF ; // "Открыть список конфигураций" : "Закрыть список конфигураций" BOOLEAN VAR l_Found "Удалось перевести фокус в {(контрол::tvConfs)}?" =: l_Found l_Found IF моп::Установки_Список_конфигураций OnTest "Дождаться переключения вкладок" ENDIF // l_Found IF ; // "Закрыть список конфигураций" : "Открыть список конфигураций и перевести туда фокус" "Открыть список конфигураций" "Перевести фокус в {(контрол::tvConfs)} на форме {(форма::ConfigurationList)}" "Дождаться переключения вкладок" ; // "Открыть список конфигураций и перевести туда фокус" : "Проверить, что текущая конфигурация стандартная" "Открыть список конфигураций и перевести туда фокус" TRY INTERFACE VAR l_Node TRY контрол::tvConfs:push tree:CurrentNode =: l_Node l_Node Node:Text 'Основная (активная)' SameStr [[ 'Похоже, что конфигурация не стандартная Текст ноды: ' l_Node Node:Text ]] strings:Cat ASSERTS FINALLY nil =: l_Node END FINALLY "Закрыть текущую вкладку" END ; // "Проверить, что текущая конфигурация стандартная" : "Сравнить список с эталоном" OBJECT IN aList aList ЯВЛЯЕТСЯ class::TvtLister IF aList pop:control:Caption . ELSE INTEGER VAR Count INTEGER VAR Item 0 >>> Item aList tree:GetItemsCount =: Count Item Count FOR Item aList tree:GetItem Node:Text "Заменить непечатаемые символы" . ++! Item NEXT ENDIF ; // "Сравнить список с эталоном" : "Сравнить текущий список с эталоном" "Сравнить список {(focused:control:push)} с эталоном" ; BOOLEAN FUNCTION "Расширенно найти ссылку в дереве" BOOLEAN IN aProc STRING IN aContext STRING IN aControl false =: Result STRING VAR l_Name focused:control:push pop:component:Name =: l_Name l_Name РАВНО aControl [[ 'Почему то в фокусе ' l_Name ' а не ' aControl ]] strings:Cat ASSERTS : "Ищем ноду по контексту" IN aProc INTEGER VAR "Предельное количество" 500 >>> "Предельное количество" BOOLEAN VAR Сделано НЕТ >>> Сделано INTERFACE VAR l_Node VAR l_CompareOp контрол::tvConfs РАВНО aControl IF @ StartsStr =: l_CompareOp ELSE @ SameStr =: l_CompareOp ENDIF TRY ПОКА ( НЕ Сделано И ( "Предельное количество" >0 ) ) BEGIN --! "Предельное количество" aControl byname:control:push tree:CurrentNode >>> l_Node STRING VAR l_Text l_Node Node:Text =: l_Text aContext l_Text l_CompareOp DO IF ДА >>> Сделано true =: Result ELSE // l_Node Node:IsLast IF // ДА >>> Сделано // ELSE // "Стрелка вниз" // ENDIF // Node:IsLast - не совсем нам подходит, она говорит в РОДИТЕЛЕ, а не во ВСЁМ ДЕРЕВЕ TRY aProc DO EXCEPT // - наверное добежали до конца дерева ДА >>> Сделано END ENDIF END FINALLY nil =: l_Node END ; // "Ищем ноду по контексту" @ "Стрелка вниз" "Ищем ноду по контексту" Result IF aProc ? ( "Нажать {('Enter')}" ) OnTest ELSE контрол::tvConfs РАВНО aControl IF // - Заплатка для борьбы с непереключением конфигураций @ "Стрелка вверх" "Ищем ноду по контексту" Result IF aProc ? ( "Нажать {('Enter')}" ) OnTest ENDIF // Result IF ENDIF // контрол::tvConfs РАВНО aControl IF ENDIF // Result IF ; // "Расширенно найти ссылку в дереве" : "Найти документ в списке" STRING IN aContext "Расширенно {(false)} найти ссылку {(aContext)} в дереве {(контрол::tvList)}" ; // "Найти документ в списке" : "Найти документ в списке и открыть его" STRING IN aContext "Расширенно {(false)} найти ссылку {(aContext)} в дереве {(контрол::tvList)}" IF "Нажать {('Enter')}" ELSE 'Документ в списке не найден!' . ENDIF ; // "Найти документ в списке" BOOLEAN FUNCTION "Перейти по ссылке в дереве" STRING IN aContext STRING IN aControl false =: Result "Расширенно {(true)} найти ссылку {(aContext)} в дереве {(aControl)}" IF true =: Result ENDIF ; // Перейти по ссылке в дереве" : "Переключиться на конфигурацию" STRING IN aContext "Открыть список конфигураций и перевести туда фокус" "Переместиться в начало дерева" "Перейти по ссылке {(aContext)} в дереве {(контрол::tvConfs)}" ! IF "Открыть список конфигураций и перевести туда фокус" "Переместиться в начало дерева" "Сравнить текущий список с эталоном" "Закрыть список конфигураций" false [[ 'Не удалось переключить конфигурацию на :' aContext ]] strings:Cat ASSERTS ELSE "Закрыть список конфигураций" // - т.к. конфигурация могла быть активной и Enter мог не срабоать ENDIF // "Перейти по ссылке {(aContext)} в дереве {(aControl)}" ! "Дождаться переключения вкладок" ; // "Переключиться на конфигурацию" : "Поработать с расширенной конфигурацией" IN aProc "Переключиться на конфигурацию {('Расширенная')}" TRY aProc DO FINALLY "Открыть список конфигураций и перевести туда фокус" // Это для того, чтобы фокус не потерять, а то он почему-то теряется "Переключиться на конфигурацию {('Основная')}" END // TRY..FINALLY ; // "Поработать с расширенной конфигурацией" : "Сделать в расширенной конфигурации" IN aProc aProc "Поработать с расширенной конфигурацией" ; // "Сделать в расширенной конфигурации" : "Вернуться к найденному" "Вернуться к найденному без проверки" "Сравнить абзац текущего редактора с эталоном" ; : "Вернуться к найденному, что ничего не нашлось" false 'Не реализовано' ASSERTS // - по-хорошему тут видимо надо курсор запоминать и сравнивать после попытки поиска // т.к. код, который написан ниже - не приводит к желаемому результату wait:Ok TRY "Вернуться к найденному без проверки" FINALLY waited:? 'Не было диалога про конец поиска' ASSERTS // - убеждаемся, что диалог про конец поиска таки был END ; CONST cWaitDelta 300 // см. Diff_Form cWaitDelta : "Следующее изменение" оп::Редакция_Следующее_изменение cWaitDelta SLEEP OnTest ; : "Предыдущее изменение" оп::Редакция_Предыдущее_изменение cWaitDelta SLEEP OnTest ; : "Переключить базу на" STRING IN aNewBase [[ 'callbubat.cmd' ( aNewBase "НЕ РАВНО" '' ) ? ( ' "' aNewBase '"' ) ]] strings:Cat WinExec 2000 SLEEP OnTest ; : "Переключаем базы" "Переключить базу на {('')}" ; : "Поработать с переключённой базой" IN aProc TRY "Переключаем базы" aProc DO FINALLY "Переключаем базы" END ; : "Выполнить с переключённой базой" IN aProc aProc "Поработать с переключённой базой" ; // CONST tb24Date '24.09.2004' // CONST tb27Date '27.09.2004' CONST tb24Date '24.05.2013' CONST tb27Date '27.05.2013' STRING VAR tb24Name [ tb24Date '.2004' '04' string:Replace '.' '' string:Replace =: tb24Name ] STRING VAR tb27Name [ tb27Date '.2004' '04' string:Replace '.' '' string:Replace =: tb27Name ] : ТБ24 f1:BaseDate tb24Date SameText ! IF "Переключаем базы" f1:BaseDate tb24Date SameText 'База не ТБ24, а ' f1:BaseDate Cat ASSERTS ENDIF ; : ТБ27 f1:BaseDate tb27Date SameText ! IF "Переключаем базы" f1:BaseDate tb27Date SameText 'База не ТБ27, а ' f1:BaseDate Cat ASSERTS ENDIF ; USES DocumentProcessing.script ; : "Проверить наличие комментария и удалить его" IN aProc aProc CheckCommentAndDeleteIfExists ; : "Открываем 2006 документ" : "Таки открываем" "Открываем {(2006)}" cc:Down //cc:Down ; @ "Таки открываем" "Проверить наличие комментария и удалить его" ; : "Вставляем любой комментарий в начало документа" "В начало документа" "Ввести {('любой комментарий')}" Ctrl-Z ; : "Вставляем из буфера обмена любой комментарий в начало документа" "В начало документа" //cc:Down cc:Down cc:ExtendEnd cc:Copy "В начало документа" cc:Paste //Ctrl-Z //Ctrl-Z cc:Up cc:Up "Удалить текущий комментарий и проверить что он удалился" // - подчищаем за собой ; : "Установить фокус во флеш" OnTest OBJECT VAR Parent focused:control:push pop:control:GetAnotherParentForm =: Parent "Найти контрол {(DocumentFlash)} на форме {(Parent)}" pop:control:SetFocus 'Не удалось установить фокус во флеш' ASSERTS ; : "Проверить что номер кадра флеша равен" IN aNum DocumentFlash byname:control:push pop:flash:GetFrame РАВНО aNum 'Номера кадров не совпадают' ASSERTS ; : "Открыть Гражданский кодекс" "Открываем {(ГК)}" ; : "Открыть ГК" "Открываем {(ГК)}" ; : "Открыть НК" "Открываем {(НК)}" ; : "Открываем НК" "Открываем {(НК)}" ; : "Сравнить обе редакции с эталоном" "Перевести фокус в правую редакцию" "Сравнить текст с эталоном" "Перевести фокус в левую редакцию" "Сравнить текст с эталоном" ; : "Сравнить текущие абзацы обеих редакций с эталоном" "Перевести фокус в правую редакцию" "Сравнить абзац текущего редактора с эталоном" "Перевести фокус в левую редакцию" "Сравнить абзац текущего редактора с эталоном" ; : "Потянуть вертикальный скроллер контрола вниз" OBJECT IN aControl aControl pop:control:VScrollerVisible 'У контрола нет вертикального скроллбара' ASSERTS VAR X VAR Y // Получаем верхний правый угол контрола "Померить ширину {(aControl)}" >>> X 0 >>> Y // Переводим в координаты экрана "Привести координаты {( @ X @ Y )} для контрола {(aControl)} к экранным" // поправка на размер скроллера. Надо бы GetSystemMetrics использовать...или как там его X 10 - >>> X Y 25 + >>> Y : Тянем_потянем "Установить курсор мыши по координатам {(X Y)}" Y 100 + >>> Y THREAD ( "Зажать левую кнопку мыши" "Установить курсор мыши по координатам {(X Y)}" "Отпустить левую кнопку мыши" ) 50 SLEEP ; "Запомнить позицию мыши и выполнить {(@ Тянем_потянем)}" ; : "Перевести фокус в дерево терминов" "Перевести фокус в {('WordsTree')} на форме {(форма::Diction)}" OnTest ; : "Перевести фокус в текст" "Перевести фокус в документ" ; : "Проверить, что имя комментария в оглавлении поменялось" //'Проверить, что имя комментария в оглавлении поменялось' ToDo "Перевести фокус в комментарии" "Сравнить текущий список с эталоном" ; // "Проверить, что имя комментария в оглавлении поменялось" : "Поставить на контроль" wait:No TRY TRY оп::Документ_Поставить_на_контроль EXCEPT // - давим ошибку от диалога о том, что документ таки был поставлен на контроль // а по-хорошему надо сделать слово waitforsome:No:Ok wait:No TRY оп::Документ_Поставить_на_контроль FINALLY waited:? ASSERT END // - это такая хитрая проверка, что документ таки поставился на контроль // но по-хорошему надо просто сделать ручку для того, чтобы проверить на контроле документ или нет END FINALLY waited:? IF // - документ уже был на контроле ENDIF END ; : "Снять с контроля" wait:Yes TRY оп::Документ_Поставить_на_контроль FINALLY waited:? 'Не было подтверждения про снятие с контроля' ASSERTS END ; : "Выполнить с документом установленным на контроль" IN aProc IN aDoc "Открываем {(aDoc)}" "Поставить на контроль" TRY aProc DO FINALLY "Открываем {(aDoc)}" "Снять с контроля" END ; : "Выполнить с документами на контроле" IN aProc "Открыть вкладку Документы на контроле" TRY aProc DO FINALLY "Закрыть вкладку Документы на контроле" END ; : "Сравнить список изменённых параграфов с эталоном" //OnTest // http://mdp.garant.ru/pages/viewpage.action?pageId=296622673&focusedCommentId=296631645#comment-296631645 // - если раскомментировать, то разные списки будут получаться гораздо реже OBJECT VAR l_Editor "Убедиться, что фокус в редакторе" focused:control:push >>> l_Editor ПОКА ( DocumentText DiffIterator:HasNext ) BEGIN VAR l_ParaNum DocumentText DiffIterator:Next >>> l_ParaNum l_ParaNum . /* DocumentText */ l_ParaNum l_Editor pop:editor:GetParaByID IF Para:Text . ELSE 'Параграф не найден' . ENDIF END ; // "Сравнить список изменённых параграфов с эталоном" : "В левом окне из комбобокса выбрать редакцию с текстом" STRING IN aText OBJECT VAR l_Tree "Перевести фокус в список редакций левой редакции" VAR "Предельное количество" 100 >>> "Предельное количество" focused:control:push >>> l_Tree ПОКА ( контрол::EditionChoose l_Tree pop:ComboTree:CurrentNode Node:Text aText SWAP StartsStr ! И ( "Предельное количество" >0 ) ) BEGIN --! "Предельное количество" "Нажать {('Down')}" END "Нажать {('Enter')}" "Перевести фокус в список редакций левой редакции" STRING VAR l_Text контрол::EditionChoose:push pop:control:Caption >>> l_Text aText l_Text StartsStr 'Выбралась неверная редакция: ' l_Text Cat ASSERTS "Перевести фокус в список редакций правой редакции" ; : "В левом окне из комбобокса выбрать редакцию с 15.08.2004 по 17.08.2004" "В левом окне из комбобокса выбрать редакцию с текстом {('15.08.2004 - 17.08.2004')}" ; : "Закрываем форму контекстного поиска" "Вызываем форму контекстного поиска" // - ставим фокус или открываем форму "Нажать {('Esc')}" ; : "Закрываем БП" "Перевести фокус в {(контрол::ContextEdit)} на форме {(форма::NewBaseSearch)} типа {(0)}" "Нажать {('Esc')}" // БП // "Нажать {('Esc')}" ; : "Проверить, что форма БП одна" : Действия_с_контролом OBJECT IN aCtrl aCtrl ЯВЛЯЕТСЯ class::TNewBaseSearchForm IF aCtrl pop:vcm:form:FormID . ENDIF ; // Действия_с_контролом "выполнить для всех контролов {("Найти главное окно")}" Действия_с_контролом ; : "Проверить наличие формы БП" "Проверить, что открыта форма БП" //'Проверить наличие формы БП' ToDo ; : "Проверить, что попали в Новости-онлайн" OnTest форма::InternetAgent byname:control:push pop:control:CanFocus [[ 'Не удалось перейти по интернет-ссылке. Текущая форма: ' focused:control:push pop:control:GetAnotherParentForm pop:object:ClassName ]] strings:Cat ASSERTS ; // "Проверить, что попали в Новости-онлайн" : "Проверить, что текущий контрол - браузер" "Проверить, что попали в Новости-онлайн" ; // "Проверить, что текущий контрол - браузер" : "Проверить, что находимся в ОМ" OnTest контрол::ContextEdit:push pop:control:CanFocus 'Не удалось перейти в ОМ' ASSERTS ; : "Нажатием F7 открываем ППР" ППР OnTest ; : "Открываем Конституцию" "Открыть Конституцию" ; : "Открываем вкладку Справка" "Открываем Справку" ; : "Выполнить и если было исключение, то выполнить" IN aProc1 IN aProc2 TRY aProc1 DO EXCEPT "Сравнить текущее исключение с эталоном" aProc2 DO END ; : "Боремся с плавающим оглавлением" ANYUSERTYPE форма::Contents vcm:FindForm IF OBJECT VAR l_ContentsForm >>> l_ContentsForm OBJECT VAR l_Form l_ContentsForm pop:control:GetAnotherParentForm =: l_Form l_Form pop:object:IsNil ! IF l_Form pop:form:FormStyle РАВНО fsStayOnTop IF // - только если оглавление в плавающем состоянии l_Form pop:control:Visible IF //l_Form pop:component:Name . l_Form pop:control:Hide //"Закрыть текущую вкладку" ENDIF ENDIF ENDIF ENDIF ; : "Закрыть плавающее оглавление" "Боремся с плавающим оглавлением" ; : "Перевести фокус в дерево редакций" true ANYUSERTYPE контрол::RedactionTree форма::Redactions TryFocusOnForm 'Не удалось поставить фокус в дерево редакций' ASSERTS ; : "Список редакций без перевода фокуса" "Боремся с плавающим оглавлением" оп::Редакции_документа_Список_редакций ; // "Список редакций без перевода фокуса" : "Список редакций" "Список редакций без перевода фокуса" OnTest "Перевести фокус в дерево редакций" ; // "Список редакций" : "Открываем вкладку 'Текст документа' в синхронном просмотре списка" "Дождаться переключения вкладок" OBJECT VAR "Нужная кнопка" "Найти контрол {('bt_enSynchroView_ShowText')} на форме {("Найти главное окно")}" =: "Нужная кнопка" "Нужная кнопка" "Узнать, существует ли объект" ! 'Не нашли кнопку Текст документа' ASSERTS "Нужная кнопка" "Кликнуть" ; // "Открываем вкладку 'Текст документа' в синхронном просмотре списка" : "Открыть вкладку синхронного просмотра текста без сравнения с эталоном" //"Проверить вкладку {(dftDocSynchroView)} документа" //"Перевести фокус в {(DocumentText)} на форме {(Форма_документа)} типа {(dftDocSynchroView)}" true dftDocSynchroView DocumentText Форма_документа TryFocusOnForm ! ? ( true тип_формы::dftAnnotationSynchroView DocumentText Форма_документа TryFocusOnForm 'Не удалось переключиться на вкладку синхронного просмотра документа' ASSERTS ) оп::Синхронный_просмотр_Текст_документа OnTest "Дождаться переключения вкладок" "Открываем вкладку 'Текст документа' в синхронном просмотре списка" true dftDocSynchroView DocumentText Форма_документа TryFocusOnForm 'Таки не удалось переключиться на вкладку синхронного просмотра документа' ASSERTS "Дождаться переключения вкладок" ; : "Открыть вкладку синхронного просмотра текста" "Открыть вкладку синхронного просмотра текста без сравнения с эталоном" "Сравнить текст с эталоном" ; : "в поле 'Утрата силы' поставить" STRING IN aStr "Убедиться, что фокус в редакторе" 'AT_LC_ABOLISHED_DATE' aStr focused:control:push pop:QueryCard:SetAttribute ; : "в поле 'Слова в названии' ввести" STRING IN aStr "Убедиться, что фокус в редакторе" 'AT_TEXT_NAME' aStr focused:control:push pop:QueryCard:SetAttribute ; : "в поле 'Слова в тексте' ввести" STRING IN aStr "Убедиться, что фокус в редакторе" 'AT_TEXT_BODY' aStr focused:control:push pop:QueryCard:SetAttribute ; : "в поле 'Тип' ввести" STRING IN aStr "Убедиться, что фокус в редакторе" 'AT_TYPE' aStr focused:control:push pop:QueryCard:SetAttribute ; : "в поле 'Орган/Источник' ввести с операцией" STRING IN aStr INTEGER IN aL "Убедиться, что фокус в редакторе" aL 'AT_SOURCE' aStr focused:control:push pop:QueryCard:Attribute:SetWithLogicOperation ; : "в поле 'Орган/Источник' ввести" STRING IN aStr "Убедиться, что фокус в редакторе" 'AT_SOURCE' aStr focused:control:push pop:QueryCard:SetAttribute ; : "в поле 'Вступление в силу' поставить" STRING IN aStr 'AT_LC_IN_DATE' aStr focused:control:push pop:QueryCard:SetAttribute ; : "в поле 'Искать в недействующих редакциях' поставить" STRING IN aStr 'AT_EDITION' aStr focused:control:push pop:QueryCard:SetAttribute ; : "в поле 'Страна' ввести" STRING IN aStr 'AT_PHARM_COUNTRY' aStr focused:control:push pop:QueryCard:SetAttribute ; : "Открыть вкладку Перевод" true dftTranslation DocumentText Форма_документа TryFocusOnForm 'Не удалось переключиться на вкладку Перевод' ASSERTS OnTest "Дождаться переключения вкладок" "Сравнить текст с эталоном" ; // "Открыть вкладку Перевод" : БАЗА STRING IN aStr 'Нужно взять базу из: ' aStr Cat ToDo ; // БАЗА : "Выбрать 'Текущая страница'" OBJECT VAR "Текущая страница" контрол::rbPrintCurrent focused:control:push pop:control:GetAnotherParentForm pop:control:FindControlByName =: "Текущая страница" //"Текущая страница" pop:control:Click //"Текущая страница" pop:RadioButton:GetChecked ! true "Текущая страница" pop:RadioButton:SetChecked OnTest nil =: "Текущая страница" //'Выбрать "Текущая страница"' ToDo ; // "Выбрать 'Текущая страница'" : "Вызвать диалог печати по CTRL-P, выбрать в области печати 'Текущая страница' и нажать 'Печать'" : Действия //"Задержка имени Димы Инишева" "Ctrl-P" ; // Действия : Действия1 "Выбрать 'Текущая страница'" //Ok оп::Завершение_работы_Ок OnTest ; // Действия1 //"Задержка имени Димы Инишева" //Действия @ Действия MODAL Действия1 ; : "Проверяем, что в кнопке Ещё выбран тип" STRING IN aType //[[ 'Проверяем, что в кнопке Ещё выбран тип "' aType '"' ]] strings:Cat ToDo "Открыта ли форма БП?" ! IF "Дождаться переключения вкладок" ENDIF "Проверить, что открыта форма БП" aType focused:control:push pop:control:GetParentForm pop:control:FindVGControlByName vg:control:GetIsChecked [[ 'Не выбран тип ' aType ]] strings:Cat ASSERTS ; : "Сбрасываем вкладку БП в умолчательное состояние" БП // - пока так, за счёт ByUser // http://mdp.garant.ru/pages/viewpage.action?pageId=300026165&focusedCommentId=319489482#comment-319489482 ; : "Посчитать количество кнопок для типов БП" 'Все документы' focused:control:push pop:control:GetParentForm pop:control:FindVGControlByName vg:control:CountSiblingLikeMe . ; : "! Тест в разработке" script:FileName sysutils:ExtractFileName ' в состоянии разработки' Cat ToDo ; : "Список всех документов" ППР "Нажать Искать" //OnTest ; : "Открыть вкладку Список редакций" "Список редакций" ; : "Поставить фокус в дерево ситуаций второго уровня в Стандартной ППС" true тип_формы::astNone контрол::AttributeTree форма::TreeAttributeSelect TryFocusOnForm 'Поставить фокус в дерево ситуаций второго уровня в Стандартной ППС' ASSERTS ; : "Открыть любую редакцию в новом окне" "Перевести фокус в дерево редакций" "Открыть текущую редакцию в новом окне" ; : "Сравнить список документов типа с эталоном" INTEGER IN aListType true aListType контрол::tvList форма::List TryFocusOnForm 'Не удалось поставить фокус в список для сравнения с эталоном' ASSERTS //"Перевести фокус в список" "Сравнить текущий список с эталоном" ; // "Сравнить список документов с эталоном" : "Сравнить список документов с эталоном" "Перевести фокус в список" "Сравнить текущий список с эталоном" ; // "Сравнить список документов с эталоном" : "В документе не должно быть комментариев" INTEGER VAR "Номер документа" "Номер документа" DocumentText textform:GetDocumentID =: "Номер документа" BOOLEAN VAR "Есть комментарии" true =: "Есть комментарии" BOOLEAN VAR "Было удаление комментария" false =: "Было удаление комментария" INTEGER VAR l_Guard 0 =: l_Guard ПОКА "Есть комментарии" BEGIN ++! l_Guard l_Guard 100 < 'Похоже что зациклились' ASSERTS true ANYUSERTYPE контрол::lstComments форма::Contents TryFocusOnForm IF OBJECT VAR "Текущий контрол" focused:control:push =: "Текущий контрол" "Текущий контрол" pop:component:Name РАВНО контрол::lstComments IF "Текущий контрол" pop:control:Visible IF "Нажать Del" true =: "Было удаление комментария" ENDIF // "Текущий контрол" pop:control:Visible IF ENDIF // "Текущий контрол" pop:component:Name РАВНО контрол::lstComments IF ELSE false =: "Есть комментарии" ENDIF END // ПОКА "Есть комментарии" "Было удаление комментария" IF // - тут переоткрываем документ "Закрыть F1." "Открываем {("Номер документа")}" "Установить фокус в документ" ENDIF // "Было удаление комментария" ; // "В документе не должно быть комментариев" : "Открываем первую пользовательскую вкладку" "Дождаться переключения вкладок" true тип_формы::lftUserCR1 tvList форма::List TryFocusOnForm 'Не удалось открыть первую пользовательскую вкладку' ASSERTS OnTest "Дождаться переключения вкладок" ; : "Открываем вторую пользовательскую вкладку" "Дождаться переключения вкладок" true тип_формы::lftUserCR2 tvList форма::List TryFocusOnForm 'Не удалось открыть вторую пользовательскую вкладку' ASSERTS OnTest "Дождаться переключения вкладок" ; : "Открываем вкладку 'Судебная практика'" "Открываем первую пользовательскую вкладку" ; USES DocumentList.script ; : "Найти в документе строку" STRING IN aText : Действия "Поиск контекста" "Ввести строку {(aText)}" "Нажать {('Enter')}" OnTest ; // Действия "Выполнить {(@ Действия)} и восстановить фокус" ; // "Найти в документе строку" : "Ищем контекст и сравниваем с эталоном найденный абзац" STRING IN aText "Найти в документе строку {(aText)}" "Сравнить абзац текущего редактора с эталоном" ; : "Выполняем . Проверяем, что комментарий таки удалился из базы и подчищаем за собой" IN aProc // -------------- "Закрыть F1." aProc DO TRY "Проверяем отсутствие комментария в текущем редакторе" EXCEPT "Удалить текущий комментарий и проверить что он удалился" // - чистим за собой, чтобы другие тесты всё же прошли RAISE END // http://mdp.garant.ru/pages/viewpage.action?pageId=280009251&focusedCommentId=321990725#comment-321990725 // Читаем ВСЮ ветку // -------------- ; : "Ставим указатель мыши на ссылку в баллоне синей медали о наличии консультаций" "Нажать на синюю медаль о наличии консультаций и проверить наличие баллона" "Установить фокус в баллон синей медаль о наличии консультаций" "Ставим указатель мыши на конец текущего параграфа редактора {(focused:control:push)} со смещением {(-20 -10)}" ; : "Открыть структуру документа" BOOLEAN VAR l_Found true ANYUSERTYPE контрол::ContentsTree форма::Contents TryFocusOnForm =: l_Found l_Found ! IF true ANYUSERTYPE контрол::lstExternalObjects форма::Contents TryFocusOnForm =: l_Found ENDIF l_Found ! IF оп::Документ_Структура_документа OnTest ENDIF true ANYUSERTYPE контрол::ContentsTree форма::Contents TryFocusOnForm ! IF true ANYUSERTYPE контрол::lstExternalObjects форма::Contents TryFocusOnForm 'Не смогли установить фокус в структуру документа' ASSERTS ENDIF ; : "Закрыть структуру документа" BOOLEAN VAR l_Found true ANYUSERTYPE контрол::ContentsTree форма::Contents TryFocusOnForm =: l_Found l_Found IF оп::Документ_Структура_документа OnTest ENDIF ; : "Сохранить активное окно" //form:GetHandle focused:control:push pop:control:GetTopParentForm pop:control:GetHandle ; : "Выполнить с новым окном Гаранта и переключиться на предыдущее окно" IN aProc VAR l_Main "Сохранить активное окно" >>> l_Main TRY "Открыть новое окно гаранта" aProc DO FINALLY l_Main "Восстановить активное окно" END ; : "Открыть новое окно Гаранта. Переключиться на старое. Выполнить и закрыть новое окно" IN aProc VAR l_Main 0 >>> l_Main : Действия "Сохранить активное окно" >>> l_Main ; "Выполнить {(@ Действия)} с новым окном Гаранта и переключиться на предыдущее окно" TRY OnTest aProc DO FINALLY l_Main !=0 'Не удалось запомнить активное окно' ASSERTS l_Main "Закрыть сохраненное окно" END ; VAR g_TimerNum [ 0 >>> g_TimerNum ] : "Померить время" IN aProc ++! g_TimerNum VAR l_TimerNumS g_TimerNum IntToStr >>> l_TimerNumS StartTimer TRY aProc DO application:ActionIdle // - чтобы перечитались данные прецедента FINALLY '' l_TimerNumS StopTimerEx END ; // "Померить время" : "Померить время и сравнить с эталоном" IN aProc ++! g_TimerNum VAR l_TimerNumS g_TimerNum IntToStr >>> l_TimerNumS // VAR l_ScriptName // script:FileName sysutils:ExtractFileName >>> l_ScriptName StartTimer TRY aProc DO application:ActionIdle // - чтобы перечитались данные прецедента FINALLY // l_ScriptName l_TimerNumS StopTimerEx //l_TimerNumS StopTimer '' l_TimerNumS StopTimerEx DROP END [[ 'Замер № ' l_TimerNumS '. Померить время и сравнить с эталоном' ]] strings:Cat ToDo ; // "Померить время и сравнить с эталоном" : "Проверить навигацию по ссылкам" "Перейти к следующей ссылке" "Сравнить выделенный текст текущего редактора с эталоном" "Перейти к следующей ссылке" "Сравнить выделенный текст текущего редактора с эталоном" "Перейти к предыдущей ссылке" "Сравнить выделенный текст текущего редактора с эталоном" //"Перейти по текущей ссылке" // - ссылка там в пустоту, поэтому - закомментировано ; : "Тут приехала эмуляция изменения документа МГО" true DocumentText textform:SetNeedShowIntranetWarning OnTest ; : "Нажать на ссылку в баллоне медали" STRING IN medal OBJECT VAR "Редактор из баллона" medal byname:control:push pop:reminder:FindEditor =: "Редактор из баллона" "Редактор из баллона" pop:object:IsNil ! 'Редактор из баллона не найден' ASSERTS "Редактор из баллона" pop:editor:NextHyperlink "Редактор из баллона" pop:editor:JumpToHyperlink ; // "Нажать на ссылку в баллоне медали" : "Нажать на ссылку в баллоне МГО" "Нажать на ссылку в баллоне медали {("Синяя медаль МГО")}" ; // "Нажать на ссылку в баллоне МГО" : "В БП ищем контекст по типу и проверяем получившийся список" STRING IN aContext STRING IN aType "В БП ищем контекст {(aContext)} по типу {(aType)}" "Проверяем, что в кнопке Ещё выбран тип {(aType)}" "Проверить информацию о списке" ; : "Перебрать иерархию вложенности контролов" OBJECT IN aControl IN aProc ПОКА ( aControl pop:object:IsNil ! ) BEGIN aControl aProc DO aControl pop:control:GetParent >>> aControl END ; : "Напечатать иерархию вложенности контролов" OBJECT IN aControl : "Печатаем контрол" IN aControl [[ aControl ЯВЛЯЕТСЯ class::TvcmForm IF // - т.к. у формы к Name могут приклеиваться циферки, которые всю малину портят aControl pop:vcm:form:FormID ELSE aControl pop:component:Name ENDIF //class::TvcmForm aControl pop:object:Inherits ' : ' aControl pop:object:ClassName ]] strings:Cat . ; aControl @ "Печатаем контрол" "Перебрать иерархию вложенности контролов" ; : "Проверить, что высоты контролов больше 0" OBJECT IN aControl : "Печатаем контрол" IN aControl aControl pop:control:GetHeight >0 [[ 'Высота контрола ' aControl pop:component:Name ' : ' aControl pop:object:ClassName ' почему-то меньше или равна 0' ]] strings:Cat ASSERTS ; aControl @ "Печатаем контрол" "Перебрать иерархию вложенности контролов" ; // "Проверить, что высоты контролов больше 0" : "Проверить, что форма БП вставлена в нужную зону" "Проверить, что открыта форма БП" VAR l_Form 0 >>> l_Form ANYUSERTYPE форма::NewBaseSearch vcm:FindForm ASSERT >>> l_Form l_Form "Напечатать иерархию вложенности контролов" l_Form "Проверить, что высоты контролов больше 0" ; : "Ищем контекст и проверяем, что он нашёлся" STRING IN aContext VAR l_WasDialog false =: l_WasDialog wait:Ok TRY "Ищем контекст {(aContext)} и сравниваем с эталоном найденный абзац" FINALLY TRY waited:? IF // - убеждаемся, что диалог про конец поиска таки был true =: l_WasDialog ENDIF EXCEPT "Сравнить текущее исключение с эталоном" DROP // - удаляем результат waited:? со стека, т.к. прилетела ересь 'Нарушен баланс скобок Wait' END END l_WasDialog ! 'Контекст не найден' ASSERTS ; : "Лекарственные средства, разрешённые к применению" моп::Инфарм_Список_выпускаемых_препаратов OnTest ; // "Лекарственные средства, разрешённые к применению" : "Кнопка автораспахивания левого навигатора" OnTest OBJECT VAR "Форма в которую вставлено оглавление" focused:control:push pop:control:GetAnotherParentForm =: "Форма в которую вставлено оглавление" OBJECT VAR "Основная форма приложения" "Форма в которую вставлено оглавление" pop:control:GetAnotherParentForm =: "Основная форма приложения" OBJECT VAR "Левый навигатор" контрол::LeftNavigator "Основная форма приложения" pop:control:FindControlByName =: "Левый навигатор" "Левый навигатор" pop:object:IsNil ! 'Не удалось найти левый навигатор' ASSERTS OBJECT VAR "Кнопка придочивания" 'AUTOHIDEOFF' "Левый навигатор" pop:control:FindControlByName =: "Кнопка придочивания" "Кнопка придочивания" pop:object:IsNil ! 'Не удалось найти кнопку придочивания левого навигатора' ASSERTS "Кнопка придочивания" ; // "Кнопка автораспахивания левого навигатора" : "Сделать левый навигатор автораспахивающимся" OBJECT VAR l_DockButton "Кнопка автораспахивания левого навигатора" =: l_DockButton l_DockButton pop:TB97Button:GetIsDown IF l_DockButton pop:control:Click ENDIF OnTest ; // "Сделать левый навигатор автораспахивающимся" : "Сделать левый навигатор НЕавтораспахивающимся" OBJECT VAR l_DockButton "Кнопка автораспахивания левого навигатора" =: l_DockButton l_DockButton pop:TB97Button:GetIsDown ! IF l_DockButton pop:control:Click ENDIF OnTest ; // "Сделать левый навигатор Неавтораспахивающимся" CONST cBmpClose 'CLOSE' : "Проверяем отсутствие крестика" OBJECT VAR "Форма плавающего навигатора" focused:control:push pop:control:GetAnotherParentForm pop:control:GetAnotherParentForm =: "Форма плавающего навигатора" OBJECT VAR "Кнопка закрытия" cBmpClose "Форма плавающего навигатора" pop:control:FindControlByName =: "Кнопка закрытия" "Кнопка закрытия" pop:object:IsNil IF false [[ 'Кнопка ' cBmpClose ' не была создана' ]] strings:Cat ASSERTS ELSE "Кнопка закрытия" pop:control:Visible ! 'Кнопка закрытия оглавления почему-то стала видимой' ASSERTS ENDIF ; // "Проверяем отсутствие крестика" : "Проверяем отсутствие крестика непосредственно в текущей форме" OBJECT VAR "Текущий контрол" focused:control:push =: "Текущий контрол" "Текущий контрол" "Напечатать иерархию вложенности контролов" OBJECT VAR "Форма оглавления" "Текущий контрол" pop:control:GetAnotherParentForm =: "Форма оглавления" OBJECT VAR "Объект в котором ищем кнопку закрытия" "Форма оглавления" =: "Объект в котором ищем кнопку закрытия" "Объект в котором ищем кнопку закрытия" "Напечатать иерархию вложенности контролов" CONST BtnClose 'BtnClose' OBJECT VAR "Кнопка закрытия" BtnClose "Объект в котором ищем кнопку закрытия" pop:control:FindControlByName =: "Кнопка закрытия" "Кнопка закрытия" pop:object:IsNil IF //false [[ 'Кнопка ' BtnClose ' не была создана' ]] strings:Cat ASSERTS // - типа всё хорошо, не создана, ну и хер бы с ней ELSE "Кнопка закрытия" pop:control:Visible ! 'Кнопка закрытия оглавления почему-то стала видимой' ASSERTS ENDIF ; // "Проверяем отсутствие крестика непосредственно в текущей форме" : "Сделать вкладку на форме плавающей" STRING IN aControl STRING IN aForm "Перевести фокус в {(aControl)} на форме {(aForm)}" OBJECT VAR "Текущий контрол" focused:control:push =: "Текущий контрол" OBJECT VAR "Форма вкладки" "Текущий контрол" pop:control:GetAnotherParentForm =: "Форма вкладки" "Форма вкладки" pop:object:IsNil ! 'Не нашли форму вкладки' ASSERTS "Форма вкладки" pop:vcm:form:IsFloatingState ! IF "Форма вкладки" pop:control:Undock OnTest "Перевести фокус в {(aControl)} на форме {(aForm)}" ENDIF ; // "Сделать вкладку на форме плавающей" : "Сделать вкладку на форме неплавающей" STRING IN aControl STRING IN aForm "Перевести фокус в {(aControl)} на форме {(aForm)}" OBJECT VAR "Текущий контрол" focused:control:push =: "Текущий контрол" OBJECT VAR "Форма вкладки" "Текущий контрол" pop:control:GetAnotherParentForm =: "Форма вкладки" "Форма вкладки" pop:object:IsNil ! 'Не нашли форму вкладки' ASSERTS "Форма вкладки" pop:vcm:form:IsFloatingState IF OBJECT VAR "Форма плавающего навигатора" "Форма вкладки" pop:control:GetAnotherParentForm =: "Форма плавающего навигатора" "Форма плавающего навигатора" pop:object:IsNil ! 'Не нашли форму плавающего навиатора' ASSERTS OBJECT VAR "Кнопка придочивания" 'HIDELEFT' "Форма плавающего навигатора" pop:control:FindControlByName =: "Кнопка придочивания" "Кнопка придочивания" pop:object:IsNil ! 'Не нашли кнопку придочивания' ASSERTS "Кнопка придочивания" pop:control:Click OnTest "Перевести фокус в {(aControl)} на форме {(aForm)}" ENDIF ; // "Сделать вкладку на форме неплавающей" : "Сделать вкладку меню плавающей" "Сделать вкладку {(контрол::NavigatorTree)} на форме {(форма::Navigator)} плавающей" ; : "Сделать вкладку меню неплавающей" "Сделать вкладку {(контрол::NavigatorTree)} на форме {(форма::Navigator)} неплавающей" ; : "Сделать оглавление плавающим" : X1 "Сделать вкладку {(контрол::ContentsTree)} на форме {(форма::Contents)} плавающей" ; : X2 "Сделать вкладку {(контрол::lstExternalObjects)} на форме {(форма::Contents)} плавающей" ; "Выполнить {(@ X1)} и если было исключение, то выполнить {(@ X2)}" ; : "Сделать оглавление неплавающим" : X1 "Сделать вкладку {(контрол::ContentsTree)} на форме {(форма::Contents)} неплавающей" ; : X2 "Сделать вкладку {(контрол::lstExternalObjects)} на форме {(форма::Contents)} неплавающей" ; "Выполнить {(@ X1)} и если было исключение, то выполнить {(@ X2)}" ; : "Перевести фокус в список внешних объектов" "Перевести фокус в {(контрол::lstExternalObjects)} на форме {(форма::Contents)}" ; // "Перевести фокус в список внешних объектов" WORDWORKER "Выполнить подавив исключение" VAR l_WasException false =: l_WasException "Выполнить {(@ ( WordToWork DO ) )} и если было исключение, то выполнить {(@ ( true =: l_WasException ) )}" l_WasException [[ 'Тест ' script:FileName ' почему-то стал проходить' ]] strings:Cat ASSERTS ; // анти-тест WORDWORKER анти-тест VAR l_WasException false =: l_WasException "Выполнить {(@ ( WordToWork DO ) )} и если было исключение, то выполнить {(@ ( true =: l_WasException ) )}" l_WasException [[ 'Тест ' script:FileName ' почему-то стал проходить' ]] strings:Cat ASSERTS ; // анти-тест : "Проверить, что вкладка с атрибутами документа видимая" OBJECT VAR "Форма с атрибутами документа" nil =: "Форма с атрибутами документа" ANYUSERTYPE форма::Attributes vcm:FindForm ASSERT =: "Форма с атрибутами документа" "Форма с атрибутами документа" "Проверить, что высоты контролов больше 0" ; // "Проверить, что вкладка с атрибутами документа видимая" : "Открыть вкладку на всё окно" OBJECT VAR "Текущий контрол" OBJECT VAR "Текущая форма" OBJECT VAR "Кнопка открытия в текущем окне" focused:control:push =: "Текущий контрол" "Текущий контрол" pop:control:GetAnotherParentForm =: "Текущая форма" 'BtnOpen' "Текущая форма" pop:control:FindControlByName =: "Кнопка открытия в текущем окне" "Кнопка открытия в текущем окне" pop:control:Click ; // "Открыть вкладку на всё окно" : "Установить фокус в атрибуты документа" false ANYUSERTYPE контрол::tvAttributes форма::Attributes TryFocusOnForm 'Не удалось поставить фокус в информацию о документе' ASSERTS ; // "Установить фокус в атрибуты документа" : "Проверить что дерево атрибутов документа не пустое" INTERFACE VAR l_Node контрол::tvAttributes:push tree:CurrentNode =: l_Node TRY l_Node nil ?!= 'Дерево атрибутов пустое' ASSERTS FINALLY nil =: l_Node END ; // "Проверить что дерево атрибутов документа не пустое" : "Перейти по ссылке на в области" STRING IN aContext STRING IN aControl ОМ "Перевести фокус в {(aControl)} на форме {(форма::MainMenuNew)}" "Переместиться в начало дерева" "Перейти по ссылке {(aContext)} в дереве {(aControl)}" 'Не удалось перейти по ссылке' ASSERTS ; // "Перейти по ссылке на в области" : "Сохранить таблицу стилей и сравнить с эталоном" STRING VAR StylesFile script:FileName '.evs' sysutils:ChangeFileExt sysutils:ExtractFileName =: StylesFile StylesFile StyleTable:SaveToFile StylesFile '%' tests:CheckEtalon ; // "Сохранить таблицу стилей и сравнить с эталоном" : "Меню во вкладке" true ANYUSERTYPE контрол::NavigatorTree форма::Navigator TryFocusOnForm ! ? "Меню во вкладке без проверки" true ANYUSERTYPE контрол::NavigatorTree форма::Navigator TryFocusOnForm 'Не удалось поставить фокус в меню во вкладке' ASSERTS ; // "Меню во вкладке" : "Закрыть меню во вкладке" true ANYUSERTYPE контрол::NavigatorTree форма::Navigator TryFocusOnForm ? "Меню во вкладке без проверки" ; // "Меню во вкладке" : "Выполнить с меню во вкладке и закрыть её" IN aProc "Меню во вкладке" TRY aProc DO FINALLY "Закрыть меню во вкладке" END ; // Выполнить с меню во вкладке и закрыть её" : "Установить фокус в меню во вкладке" false ANYUSERTYPE контрол::NavigatorTree форма::Navigator TryFocusOnForm 'Не удалось установить фокус в меню во вкладке' ASSERTS ; // "Установить фокус в меню во вкладке" : "А активна ли вкладка Меню?" false 0 контрол::NavigatorTree форма::Navigator TryFocusOnForm ; // "А активна ли вкладка Меню?" : "Закрыть меню во вкладке после проверки" "А активна ли вкладка Меню?" IF "Установить фокус в меню во вкладке" "Закрыть меню во вкладке" ENDIF ; // "Закрыть меню во вкладке после проверки" : "Уменьшить окно" OBJECT IN "Окно" CONST wsNormal 0 wsNormal "Окно" pop:form:SetWindowState ; // "Уменьшить окно" : "Развернуть окно" OBJECT IN "Окно" CONST wsMaximized 2 wsMaximized "Окно" pop:form:SetWindowState ; // "Развернуть окно" : "Свернуть окно" OBJECT IN "Окно" CONST wsMinimized 1 wsMinimized "Окно" pop:form:SetWindowState ; // "Свернуть окно" : "Сворачиваем дерево оглавления" "Открыть структуру документа" "Перевести фокус в оглавление" оп::Дерево_Свернуть_все "Переместиться в начало дерева" ; // "Сворачиваем дерево оглавления" : "Спускаемся в дереве на уровень вниз" cc:TreeExpand "Стрелка вниз" ; // "Спускаемся в дереве на уровень вниз" : "При помощи Shift выделяем элементов" IN aNum VAR l_Finish focused:control:push pop:Lister:GetCurrent aNum + >>> l_Finish // Подсчитываем конец выделения l_Finish focused:control:push pop:Lister:SelectWithShift // Ну и выделяем ; // "При помощи Shift выделяем элементов" : "Проверить, что медаль полностью видна" STRING IN aReminder : "Получить окно по координатам и проверить, что оно совпадает с медалью" "Найти контрол по дескриптору в стеке {(WindowFromPoint)}" pop:component:Name РАВНО aReminder ASSERT ; // "Получить окно по координатам и проверить, что оно совпадает с медалью" INTEGER VAR m_left 0 >>> m_left INTEGER VAR m_top 0 >>> m_top INTEGER VAR m_height INTEGER VAR m_width INTEGER VAR m_height_half INTEGER VAR m_width_half OBJECT VAR l_Reminder aReminder byname:control:push >>> l_Reminder //0 0 aReminder byname:control:push pop:control:ClientToScreen =: m_top =: m_left "Привести координаты {(@ m_left @ m_top)} для контрола {(l_Reminder)} к экранным" //aReminder byname:control:push pop:control:GetHeight =: m_height //aReminder byname:control:push pop:control:GetWidth =: m_width "Померить высоту {(l_Reminder)}" >>> m_height "Померить ширину {(l_Reminder)}" >>> m_width m_height 2/ =: m_height_half m_width 2/ =: m_width_half INTEGER VAR X INTEGER VAR Y m_left =: X m_top m_height_half + =: Y X Y "Получить окно по координатам и проверить, что оно совпадает с медалью" m_left m_width_half + =: X m_top =: Y X Y "Получить окно по координатам и проверить, что оно совпадает с медалью" m_left m_width + 4 - =: X m_top m_height_half + =: Y X Y "Получить окно по координатам и проверить, что оно совпадает с медалью" m_left m_width_half + =: X m_top m_height + 4 - =: Y X Y "Получить окно по координатам и проверить, что оно совпадает с медалью" ; // "Проверить, что медаль полностью видна" : "Построить список ссылок на фрагмент и сравнить его с эталоном" оп::Выделенные_элементы_Ссылки_на_фрагмент //оп::Синхронный_просмотр_Список_ссылок_на_документ true тип_формы::lftRCToPart контрол::tvList форма::List TryFocusOnForm 'Не удалось поставить фокус в список ссылок на фрагмент' ASSERTS "Сравнить список документов типа {(тип_формы::lftRCToPart)} с эталоном" //"Сравнить список документов с эталоном" ; // "Построить список ссылок на фрагмент и сравнить его с эталоном" : "Сравнить историю навигации с эталоном" VAR l_Index 0 =: l_Index vcm:History:GetBackCount LOOP ( l_Index vcm:History:GetBackItem . ++! l_Index ) ; // "Сравнить историю навигации с эталоном" : "Сравнить историю навигации на кнопке Вперед с эталоном" VAR l_Index 0 =: l_Index vcm:History:GetForwardCount LOOP ( l_Index vcm:History:GetForwardItem . ++! l_Index ) ; // "Сравнить историю навигации на кнопке Вперед с эталоном" OBJECT FUNCTION "Найти саб-панель" контрол::SubPanel focused:control:push pop:control:GetAnotherParentForm pop:control:FindControlByName =: Result Result pop:object:IsNil ! 'Не нашли саб-панель' ASSERTS ; WordAlias "Найти панель меток" "Найти саб-панель" : "Установить указатель мыши на точку для вызова КМ для панели меток рядом с редактором" INTEGER IN X0 INTEGER IN Y0 VAR x VAR y focused:control:push pop:editor:CursorCoordsToScreen >>> y >>> x x X0 + >>> x y Y0 + >>> y x y "Найти панель меток" pop:control:ScreenToClient ; : "Сравнить меню с эталоном расширенно" OBJECT IN aMenu BOOLEAN IN anItemName FORWARD DoItem INTEGER VAR l_Indent : DoItem OBJECT IN anItem VAR l_Index 0 =: l_Index anItem menuitem:GetCount LOOP ( VAR l_Item l_Index anItem menuitem:GetItem =: l_Item l_Item menuitem:IsVisible ? ( [[ l_Indent #32 char:Dupe anItemName ? ( 'name' l_Item pop:object:GetStrProp ':' Cat ) l_Item menuitem:GetCaption l_Item menuitem:IsEnabled ! ? ( ' [Запрещён]' ' ' l_Item pop:component:Name ) ]] strings:Cat . ++! l_Indent TRY l_Item DoItem FINALLY --! l_Indent END // TRY..FINALLY ) // l_Item menuitem:IsVisible ++! l_Index ) // anItem menuitem:GetCount LOOP ; // DoItem 0 =: l_Indent aMenu DoItem ; // "Сравнить меню с эталоном" : "Сравнить меню с эталоном" OBJECT IN aMenu "Сравнить меню {(aMenu)} с эталоном расширенно {(false)}" ; : "Сравнить контекстное меню для контрола для точки с эталоном" OBJECT IN aControl INTEGER IN anX INTEGER IN anY OBJECT VAR l_Menu anX anY aControl pop:control:GetPopupMenu >>> l_Menu ( l_Menu pop:object:IsNil ) IF 'У контрола нет контекстного меню' . ELSE l_Menu "Сравнить меню с эталоном" ENDIF ; // "Сравнить контекстное меню для контрола для точки с эталоном" : "Сравнить контекстное меню для точки с эталоном" INTEGER IN anX INTEGER IN anY "Сравнить контекстное меню для контрола {(focused:control:push)} для точки {(anX anY)} с эталоном" ; : "Сравнить контекстное меню с эталоном" "Сравнить контекстное меню для точки {(0 0)} с эталоном" ; // "Сравнить контекстное меню с эталоном" : "Сравнить контекстное меню контрола с эталоном расширенно" OBJECT IN aControl OBJECT VAR l_Menu 0 0 aControl pop:control:GetPopupMenu >>> l_Menu "Сравнить меню {(l_Menu)} с эталоном расширенно {(true)}" ; // "Сравнить контекстное меню с эталоном" : "Сравнить контекстное меню с эталоном расширенно" "Сравнить контекстное меню {(focused:control:push)} контрола с эталоном расширенно" ; // "Сравнить контекстное меню с эталоном" : "Проверить, что в контекстном меню нет операции Сравнение редакций" "Сравнить контекстное меню с эталоном" ; // "Проверить, что в контекстном меню нет операции Сравнение редакций" : "Двойной клик" 2 раза "Клик левой кнопкой мыши" ; // "Двойной клик" : "Сравнить контекстное меню контрола с эталоном" STRING IN aControl FORWARD DoItem INTEGER VAR l_Indent : DoItem OBJECT IN anItem VAR l_Index 0 =: l_Index anItem menuitem:GetCount LOOP ( VAR l_Item l_Index anItem menuitem:GetItem =: l_Item l_Item menuitem:IsVisible ? ( [[ l_Indent #32 char:Dupe l_Item menuitem:GetCaption ]] strings:Cat . ++! l_Indent TRY l_Item DoItem FINALLY --! l_Indent END // TRY..FINALLY ) // l_Item menuitem:IsVisible ++! l_Index ) // anItem menuitem:GetCount LOOP ; // DoItem 0 =: l_Indent 0 0 aControl byname:control:push pop:control:GetPopupMenu DoItem ; // "Сравнить контекстное меню контрола с эталоном" WORDWORKER "Временно выключен" 'Временно выключен' ToDo ; // "Временно выключен" : "Открыть журнал работы" BOOLEAN VAR l_Found true ANYUSERTYPE контрол::JournalTree форма::WorkJournal TryFocusOnForm =: l_Found l_Found ! IF моп::Журнал_работы_OpenJournal "Перевести фокус в {(контрол::JournalTree)} на форме {(форма::WorkJournal)}" "Дождаться переключения вкладок" ENDIF ; // "Открыть журнал работы" : "Закрыть журнал работы" BOOLEAN VAR l_Found true ANYUSERTYPE контрол::JournalTree форма::WorkJournal TryFocusOnForm =: l_Found l_Found IF моп::Журнал_работы_OpenJournal "Дождаться переключения вкладок" ENDIF ; // "Закрыть журнал работы" : "Очистить журнал работы" "Открыть журнал работы" оп::Журнал_Очистить "Закрыть журнал работы" ; // "Очистить журнал работы" : "Перевести фокус в дерево медицинских терминов" "Перевести фокус в {('WordsTree')} на форме {(форма::CommonDiction)}" OnTest ; : "Перевести фокус в последние открытые документы" false ANYUSERTYPE контрол::tvLastOpenDocs форма::MainMenuNew TryFocusOnForm 'Не удалось перевести фокус в последние открытые документы' ASSERTS ; : "в поле 'Орган/Источник' ОИЗ ввести" STRING IN aStr "Убедиться, что фокус в редакторе" 'AT_SOURCE_REVIEW' aStr focused:control:push pop:QueryCard:SetAttribute ; : "в поле 'Дата принятия С' ввести" STRING IN aStr "Убедиться, что фокус в редакторе" 'AT_PUBLISHING_DATE' aStr focused:control:push pop:QueryCard:SetAttribute ; : "в поле 'Дата принятия ПО' ввести" STRING IN aStr "Убедиться, что фокус в редакторе" 'AT_PUBLISHING_DATE#2' aStr focused:control:push pop:QueryCard:SetAttribute ; : "Сохранить выделенный текст в формате" STRING INTEGER IN aFormat STRING VAR "Выделенный текст" "Убедиться, что фокус в редакторе" aFormat focused:control:push pop:editor:GetSelectionText =: "Выделенный текст" ; : "в поле 'Тип' ввести с операцией" STRING IN aStr INTEGER IN aL "Убедиться, что фокус в редакторе" aL 'AT_TYPE' aStr focused:control:push pop:QueryCard:Attribute:SetWithLogicOperation ; CONST cPagesNotFound 'Не нашли область вкладок' OBJECT FUNCTION "Найти область вкладок" : Действия OBJECT IN Контрол ( Контрол ЯВЛЯЕТСЯ class::TnscFormsPageControl ) И ( Контрол pop:component:Name РАВНО контрол::ChildZone ) И ( Контрол pop:control:Visible ) И ( Контрол pop:control:GetParent pop:control:Visible ) И ( Контрол pop:control:GetParent pop:control:GetParent pop:control:Visible ) // И ( Контрол pop:control:GetHeight БОЛЬШЕ 0 ) // И ( Контрол pop:control:GetParent pop:control:GetHeight БОЛЬШЕ 0 ) ? ( Контрол =: Result "Закончить перебор контролов" ) ; nil =: Result 2 раза "Дождаться переключения вкладок" focused:control:push pop:control:GetTopParentForm "выполнить для всех контролов" Действия Result pop:object:IsNil ? ( 2 раза "Дождаться переключения вкладок" focused:control:push pop:control:GetTopParentForm "выполнить для всех контролов" Действия ) Result pop:object:IsNil ! cPagesNotFound ASSERTS ; /* "Дождаться переключения вкладок" OBJECT VAR "Нужная форма" OBJECT VAR "Форма толкового словаря" focused:control:push 2 раза "Получить родительскую форму" =: "Форма толкового словаря" // "Форма толкового словаря" . "Контрол {("Форма толкового словаря")} является формой с именем {(форма::DictionContainer)}?" IF // "Форма толкового словаря" =: "Нужная форма" "Найти контрол {(контрол::ChildZone)} на форме {("Форма толкового словаря")}" =: "Нужная форма" "Нужная форма" pop:object:IsNil ! 'Не нашли ChildZone в DictionContainer' ASSERTS // "Нужная форма" . 0 "Нужная форма" pop:control:GetControl =: "Нужная форма" "Нужная форма" pop:object:IsNil ! 'Не нашли вложенный контрол в ChildZone в DictionContainer' ASSERTS // "Нужная форма" . ELSE "Найти главное окно" =: "Нужная форма" ENDIF контрол::ChildZone "Нужная форма" pop:control:FindControlByName =: Result Result pop:object:IsNil ! 'Не нашли область вкладок' ASSERTS ;*/ OBJECT FUNCTION "Найти окно атрибутов" "Найти окно по имени {('cfAttributeSelect')}" =: Result ; : "Открыть по внешнему номеру" IN aNum aNum 100000 - =: aNum "Открываем {(aNum)}" ; STRING FUNCTION CutNumbers STRING W-STRING IN "Текущая строка" '' =: Result CONST "Цифры" '1234567890' CHAR VAR "Символ" ПОКА ( "Текущая строка" WString:IsNil ! ) ( WString:[]++! "Текущая строка" =: "Символ" "Цифры" "Символ" WString:HasAnyOf ? BREAK Result "Символ" char:ToString Cat =: Result ) ; : "Поставить фокус в левую половину ААК" "Перевести фокус в {(контрол::Text)} на форме {(форма::Text)} типа {(тип_формы::dftAACLeft)}" ; : "Поставить фокус в правую половину ААК" "Перевести фокус в {(контрол::Text)} на форме {(форма::Text)} типа {(тип_формы::dftAACRight)}" ; WordAlias "Перевести фокус в левую половину ААК" "Поставить фокус в левую половину ААК" WordAlias "Перевести фокус в правую половину ААК" "Поставить фокус в правую половину ААК" : "См. ежедневные поступления новых документов в разделе Новости онлайн" ОМ OBJECT VAR "Рубрикатор" "Перейти по ссылке на {('Новые поступления')} в области {(контрол::tvLawNews)}" focused:control:push pop:control:GetAnotherParentForm =: "Рубрикатор" 'NewDocLabel' "Рубрикатор" pop:control:FindControlByName pop:control:SetFocus ASSERT ; : "Сравнить оценку документа с эталоном" DocumentText document:LikeState . ; : "Открываем Справку из меню" оп::Документ_Справка_к_документу "Дождаться переключения вкладок" ; CONST ActivePageProperty 'ActivePage' : "Сравнить с эталоном имя активной вкладки" OBJECT VAR "Область вкладок" "Найти область вкладок" =: "Область вкладок" "Область вкладок" pop:object:ClassName . "Напечатать иерархию вложенности контролов {("Область вкладок")}" ActivePageProperty "Область вкладок" pop:object:GetObjProp pop:control:Caption . ; // "Сравнить с эталоном имя активной вкладки" : "В области вкладок перейти на" STRING IN aTab OBJECT VAR PageControl OBJECT VAR Page INTEGER VAR i "Найти область вкладок" =: PageControl ActivePageProperty PageControl pop:object:GetObjProp pop:control:Caption РАВНО aTab ? ( EXIT ) 0 >>> i @ ( true ) WHILE ( i PageControl pop:PageControl:PageByIndex >>> Page Page pop:control:Caption aTab == ? ( i 'TabIndex' PageControl pop:object:SetOrdProp "Дождаться переключения вкладок" ActivePageProperty PageControl pop:object:GetObjProp pop:control:Caption "НЕ РАВНО" aTab ? ( 'Не получилось переключить вкладку' ASSERTS ) EXIT ) i 1 + >>> i i 20 > ? ( 'Что-то многовато вкладок' RAISE ) ) ; : "Перевести фокус в справку" "Перевести фокус в {(DocumentText)} на форме {(форма::Text)} типа {(dftRelatedDoc)}" ; : "Сравнить первого ребёнка дерева с эталоном" STRING IN aList aList byname:control:push tree:CurrentNode nil ?!= IF ПОКА ( aList byname:control:push tree:CurrentNode:IsExpanded ) BEGIN "Стрелка вниз" END aList byname:control:push tree:CurrentNode Node:Text . ELSE 'Журнал работы пуст' . ENDIF ; : "Открыть документ через диалог ввода номера" STRING IN aDoc @ ( "Нажать {('Alt+N')}" ) MODAL ( "Ввести {(aDoc)}" "Нажать {('Enter')}" ) ; : "Получить заголовок контрола" OBJECT IN aControl "Дождаться переключения вкладок" aControl pop:control:Caption . ; : "Получить заголовок текущего контрола" "Получить заголовок контрола {(focused:control:push)}" ; : "Заголовок текущего контрола" "Контрол в фокусе"pop:control:Caption ; // "Заголовок текущего контрола" CONST DocInfoTabCaption 'Информация о документе' : "Открыть информацию о документе" OBJECT VAR "Область вкладок" "Найти область вкладок" =: "Область вкладок" ( ActivePageProperty "Область вкладок" pop:object:GetObjProp pop:control:Caption "НЕ РАВНО" DocInfoTabCaption ) IF оп::Документ_Информация_о_документе ENDIF ; : "Закрыть информацию о документе" OBJECT VAR "Область вкладок" "Найти область вкладок" =: "Область вкладок" ActivePageProperty "Область вкладок" pop:object:GetObjProp pop:control:Caption РАВНО DocInfoTabCaption IF оп::Документ_Информация_о_документе ENDIF ; WordAlias "Получить оценку документа" "Сравнить оценку документа с эталоном" : "Проверить, что скроллера в левой части ААК нет" OBJECT VAR "Текущая форма" OBJECT VAR "Скроллер" "Найти окно {(форма::AACContainer)} по имени" =: "Текущая форма" "Найти контрол {(контрол::scrLeft)} на форме {("Текущая форма")}" =: "Скроллер" "Скроллер" pop:control:Visible ! 'Скроллер виден, хотя не должен.' ASSERTS OBJECT VAR "Текущий контрол" "Найти контрол {(контрол::pnLeftEx)} на форме {("Текущая форма")}" =: "Текущий контрол" "Текущий контрол" pop:control:VScrollerVisible ! 'Внутренний скроллер виден, хотя не должен.' ASSERTS ; : "Выставить форме размеры и " INTEGER IN formW INTEGER IN formH OBJECT IN aProc "Найти главное окно" "Уменьшить окно" formW "Найти главное окно" "Установить ширину" formH "Найти главное окно" "Установить высоту" TRY aProc DO FINALLY "Найти главное окно" "Развернуть окно" END ; OBJECT FUNCTION "Найти сплиттер в ААК" OBJECT VAR "Текущая форма" "Найти окно {(форма::AACContainer)} по имени" =: "Текущая форма" "Текущая форма" pop:object:IsNil ! 'Форма ААК-Текст не найдена' ASSERTS "Найти контрол {(контрол::pnLeftEx)} на форме {("Текущая форма")}" =: Result Result pop:object:IsNil ! 'Сплиттер в ААК-Текст не найден' ASSERTS ; : "Выставить форме размеры ширину левой части ААК в и " INTEGER IN formW INTEGER IN formH INTEGER IN aW OBJECT IN aProc : Действия OBJECT VAR "Сплиттер" "Найти сплиттер в ААК" =: "Сплиттер" INTEGER VAR width_left_aak "Сплиттер" "Померить ширину" =: width_left_aak aW "Сплиттер" "Установить ширину" TRY aProc DO FINALLY width_left_aak "Сплиттер" "Установить ширину" END ; // Действия "Выставить форме размеры {(formW formH)} и {(@ Действия)}" ; : "Сравнить область вкладок с эталоном" : Действия "Найти область вкладок" pop:PageControl:GetAllPageCaptions . ; "Дождаться переключения вкладок" //"Выполнить {(@ Действия)} обработав исключение {(cPagesNotFound)}" "Выполнить {(@ Действия)} и если было исключение, то выполнить {(@ NOP)}" ; : "Сравнить список последних открытых документов с эталоном" "Перевести фокус в последние открытые документы" "Сравнить текущий список с эталоном" ; : "Проверить иерархию вложенности текущего контрола" focused:control:push "Напечатать иерархию вложенности контролов" ; WORDWORKER "начинается с" W-STRING IN aStr WordToWork DO aStr WString:Starts ; // "начинается с" : "Получить пути к старой и новой базам" STRING IN aNewBase STRING VAR "Имя входного файла" 'C:\Program Files\Garant-Server\garant.ini' =: "Имя входного файла" "Имя входного файла" sysutils:FileExists ! ? ( 'C:\Program Files (x86)\Garant-Server\garant.ini' =: "Имя входного файла" ) STRING VAR "Старая база" '' =: "Старая база" STRING VAR "Новая база" '' =: "Новая база" INTEGER VAR l_BaseNum 0 =: l_BaseNum : "Обработать строку входного файла" W-STRING IN "Строка считанная из входного файла" WORDWORKER "Строка начинается с" VAR l_Begin WordToWork DO =: l_Begin "Строка считанная из входного файла" "начинается с" l_Begin ; // "Строка начинается с" STRING VAR l_String "Строка считанная из входного файла" WString:ToString =: l_String RULES ( "Строка начинается с" '-GCMActiveDataPath=' ) ( '=' string:SplitTo! l_String //=: l_String DROP l_String StrToInt =: l_BaseNum ) ( "Строка начинается с" ( [[ '-GCMDataPath' l_BaseNum IntToStr '=' ]] strings:Cat ) ) ( '=' string:SplitTo! l_String DROP l_String =: "Старая база" '\' string:RSplitTo! l_String '' == IF l_String =: "Старая база" '\' string:RSplitTo! l_String DROP ENDIF [[ l_String '\' aNewBase ]] strings:Cat =: l_String l_String =: "Новая база" ) ; // RULES ; // "Обработать строку входного файла" FILE VAR "Входной файл" "Имя входного файла" file:OpenRead =: "Входной файл" TRY "Входной файл" file:ReadLines "Обработать строку входного файла" FINALLY nil =: "Входной файл" END "Старая база" "Новая база" ; : "Выполнить с базой" OBJECT IN aProc STRING IN aBase STRING VAR "Предыдущая база" STRING VAR "Новая база" "Получить пути к старой и новой базам {(aBase)}" =: "Новая база" =: "Предыдущая база" "Новая база" sysutils:DirectoryExists [[ 'Директория базы не существует: ' "Новая база" ]] strings:Cat ASSERTS [[ "Новая база" '\' 'data.ndt' ]] strings:Cat sysutils:FileExists [[ 'Похоже, что база не существует: ' "Новая база" ]] strings:Cat ASSERTS "Переключить базу на {("Новая база")}" TRY //"Новая база" . //"Предыдущая база" . aProc DO FINALLY "Переключить базу на {("Предыдущая база")}" END ; : "Сравнить информацию о базе с эталоном" "Сравнить дату базы с эталоном" "Сравнить имя комплекта с эталоном" "Сравнить владельца комплекта с эталоном" ; : "Кликнуть по скроллеру в левой половине ААК" OBJECT VAR "Текущая форма" OBJECT VAR "Скроллер" "Найти окно {(форма::AACContainer)} по имени" =: "Текущая форма" "Найти контрол {(контрол::scrLeft)} на форме {("Текущая форма")}" =: "Скроллер" "Скроллер" "Кликнуть" ; : "Проверить, что в левой половине ААК скроллер есть" OBJECT VAR "Текущая форма" OBJECT VAR "Скроллер" "Найти окно {(форма::AACContainer)} по имени" =: "Текущая форма" "Найти контрол {(контрол::scrLeft)} на форме {("Текущая форма")}" =: "Скроллер" "Скроллер" pop:control:Visible 'Скроллер не виден, хотя должен быть видимым.' ASSERTS ; : "Сравнить текст обоих частей ААК с эталоном" "Перевести фокус в левую половину ААК" "Выделить всё" "Сравнить выделенный текст текущего редактора с эталоном" '-------------------------------------------------------' . "Перевести фокус в правую половину ААК" "Выделить всё" "Сравнить выделенный текст текущего редактора с эталоном" ; FORWARD "Проверить видимость пунктов меню связанных с комментариями" FORWARD "Проверить видимость пунктов меню связанных с сортировкой списка" : "Сравнить с эталоном пункт главного меню" STRING IN aItem aItem РАВНО 'Документы' ? ( "Проверить видимость пунктов меню связанных с комментариями" "Проверить видимость пунктов меню связанных с сортировкой списка" ) aItem "Найти главное окно" pop:form:FindMenuItem "Сравнить меню с эталоном" ; : "Переключиться на вкладку" STRING IN aName OBJECT VAR l_PageControl OBJECT VAR "Закладка" INTEGER VAR Ind INTEGER VAR X INTEGER VAR Y "Найти область вкладок" >>> l_PageControl aName l_PageControl pop:PageControl:FindPageByCaption =: Ind Ind l_PageControl pop:PageControl:PageByIndex =: "Закладка" "Закладка" pop:object:IsNil ! [[ 'Не нашли вкладку ' aName ]] strings:Cat ASSERTS "Запомнить позицию мыши" TRY 20 >>> X "Померить высоту {(l_PageControl)}" >>> Y Y 10 - >>> Y "Установить курсор мыши по координатам {(X Y)} относительно контрола {("Закладка")}" "Клик левой кнопкой мыши" FINALLY "Восстановить позицию мыши" END OnTest // описание работы слова [$424387103] ; // "Переключиться на вкладку" : "Поставить фокус в левую половину ААК-Содержания" true тип_формы::dftAACContentsLeft контрол::Text форма::Text TryFocusOnForm ASSERT ; : "Поставить фокус в правую половину ААК-Содержания" true тип_формы::dftAACContentsRight контрол::Text форма::Text TryFocusOnForm ASSERT ; : "Установить фокус во вкладку Фильтры" false ANYUSERTYPE контрол::FiltersList форма::Filters TryFocusOnForm 'Не удалось установить фокус во вкладку Фильтры' ASSERTS ; OBJECT FUNCTION "Найти форму ААК" "Найти окно по имени {(форма::AACContainer)}" =: Result Result pop:object:IsNil ! 'Форма ААК не найдена' ASSERTS ; OBJECT FUNCTION "Найти плашку в ААК" контрол::edWriteToUs "Найти форму ААК" pop:control:FindControlByName =: Result Result pop:object:IsNil ! 'Плашка не найдена' ASSERTS ; : "Перейти по ссылке 'Напишите нам' в ААК" "Найти плашку в ААК" pop:editor:NextHyperlink "Найти плашку в ААК" pop:editor:JumpToHyperlink ; : "Сравнить иконку элемента в списке с эталоном" INTEGER IN aItem STRING IN aList aItem aList byname:control:push tree:GetItemImageIndex . ; : "Получить список в массив" IN aMassive INTERFACE VAR l_Node INTERFACE VAR l_Node_next BOOLEAN VAR Сделано НЕТ >>> Сделано ПОКА ( НЕ Сделано ) BEGIN контрол::tvList:push tree:CurrentNode =: l_Node l_Node Node:Text >>>[] aMassive "Стрелка вниз" контрол::tvList:push tree:CurrentNode =: l_Node_next ( l_Node_next Node:Text ) РАВНО ( l_Node Node:Text ) IF ДА >>> Сделано ENDIF END ; : "Проверить, что массив совпадает с массивом" IN aMass1 IN aMass2 INTEGER VAR item 0 >>> item ( aMass1 array:Count aMass2 "НЕ РАВНО" array:Count ) IF false 'Массивы имеют разный размер' ASSERTS ELSE 0 aMass1 array:Count FOR ( item aMass1 [i] ) РАВНО ( item aMass2 [i] ) IF ++! item ELSE false 'Массивы не совпадают' ASSERTS ENDIF NEXT ENDIF ; : "Получить имя вкладки с индексом" INTEGER IN aItem aItem "Найти область вкладок" pop:PageControl:PageCaptionByIndex . ; : "Построить список по первой ветке рубрикатора с историей" "Меню во вкладке" "Свернуть текущее дерево" "Переместиться в начало дерева" "Стрелка вниз" "Спускаемся в дереве на уровень вниз" "Нажать {('Enter')}" "Установить фокус в меню во вкладке" "Стрелка вниз" "Нажать {('Enter')}" "Установить фокус в меню во вкладке" ; : "Получить имя текущего элемента дерева" STRING IN aControl INTERFACE VAR l_Node aControl byname:control:push tree:CurrentNode =: l_Node l_Node Node:Text . ; : "Сравнить контекстное меню для контрола с эталоном" OBJECT IN aControl "Сравнить контекстное меню для контрола {(aControl)} для точки {(0 0)} с эталоном" ; : "Вызвать из главного меню" STRING IN aItem aItem "Найти главное окно" pop:form:FindMenuItem menuitem:Click "Дать системе перерисоваться" ; : "Перевести фокус в поле 'Слова в тексте' в ППР" "Убедиться, что фокус в редакторе" 'AT_TEXT_BODY' focused:control:push pop:QueryCard:Attribute:SetFocus ; : "Перевести фокус в поле 'Тип' в ППР" "Убедиться, что фокус в редакторе" 'AT_TYPE' focused:control:push pop:QueryCard:Attribute:SetFocus ; : "Перевести фокус в поле 'Номер' в ППР" "Убедиться, что фокус в редакторе" 'AT_REG_NUM' focused:control:push pop:QueryCard:Attribute:SetFocus ; : "Перевести фокус в поле 'Дата принятия' в ППР" "Убедиться, что фокус в редакторе" 'AT_PUBLISHING_DATE' focused:control:push pop:QueryCard:Attribute:SetFocus ; : "Перевести фокус в поле 'Вид правовой информации' в ППР" "Убедиться, что фокус в редакторе" 'AT_PREFIX' focused:control:push pop:QueryCard:Attribute:SetFocus ; : "Построить список по первой ветке рубрикатора" "Меню во вкладке" "Свернуть текущее дерево" "Переместиться в начало дерева" "Стрелка вниз" 2 раза "Спускаемся в дереве на уровень вниз" "Нажать {('Enter')}" "Закрыть меню во вкладке" "Перевести фокус в список" ; : "Пролистать список поэлементно вниз" INTERFACE VAR l_Node INTERFACE VAR l_Node_next BOOLEAN VAR Сделано НЕТ >>> Сделано ПОКА ( НЕ Сделано ) BEGIN контрол::tvList:push tree:CurrentNode =: l_Node "Стрелка вниз" контрол::tvList:push tree:CurrentNode =: l_Node_next ( l_Node_next Node:Text ) РАВНО ( l_Node Node:Text ) IF ДА >>> Сделано ENDIF END ; : "Получить размеры и координаты контрола" OBJECT IN aControl [[ 'Left = ' aControl "Померить отступ слева" IntToStr ]] strings:Cat . [[ 'Top = ' aControl "Померить отступ сверху" IntToStr ]] strings:Cat . [[ 'Width = ' aControl "Померить ширину" IntToStr ]] strings:Cat . [[ 'Height = ' aControl "Померить высоту" IntToStr ]] strings:Cat . ; // "Получить размеры и координаты контрола" : "Сравнить с эталоном размеры контрола" OBJECT IN aControl [[ 'Width = ' aControl "Померить ширину" IntToStr ]] strings:Cat . [[ 'Height = ' aControl "Померить высоту" IntToStr ]] strings:Cat . ; // "Сравнить с эталоном размеры контрола" OBJECT FUNCTION "Элемент статусбара окна" INTEGER IN aItem OBJECT IN aWindow OBJECT VAR "Статусбар" контрол::StatusBar aWindow pop:control:FindControlByName =: "Статусбар" aItem "Статусбар" StatusBar:OrderedControl =: Result Result pop:object:IsNil ! 'Не удалось найти на статусбаре этот элемент ' ASSERTS ; : "Количество элементов статусбара окна" OBJECT IN aWindow OBJECT VAR "Статусбар" контрол::StatusBar aWindow pop:control:FindControlByName =: "Статусбар" "Статусбар" pop:object:IsNil ! 'Не удалось найти на статусбаре этот элемент ' ASSERTS "Статусбар" pop:control:ControlCount ; // "Количество элементов статусбара" : "Сравнить статусбар окна с эталоном" OBJECT IN aWindow OBJECT VAR "Панель статусбара" CONST cSeparator 'Загрузка документа' STRING VAR str1 STRING VAR str2 INTEGER VAR item 0 >>> item "Дождаться переключения вкладок" "Количество элементов статусбара окна {(aWindow)}" 1 - LOOP ( "Элемент {(item)} статусбара окна {(aWindow)}" =: "Панель статусбара" "Панель статусбара" pop:control:Visible IF "Панель статусбара" pop:control:Caption =: str1 ( str1 "НЕ РАВНО" '' ) IF str1 cSeparator string:Split =: str2 =: str1 ( str2 "НЕ РАВНО" '' ) IF [[ str2 '[' '' string:Replace ']' '' string:Replace >>> str2 ]] str2 sysutils:ExtractFileName >>> str2 [[ str1 cSeparator ' ' str2 ]] strings:Cat >>> str1 ENDIF "Панель статусбара" pop:control:Enabled IF str1 . ELSE str1 ' [Запрещён]' Cat . ENDIF ENDIF ENDIF ++! item ) ; // "Сравнить статусбар окна с эталоном" : "Сравнить статусбар с эталоном" "Сравнить статусбар окна {( "Найти главное окно" )} с эталоном" ; // "Сравнить статусбар с эталоном" : "Установить окно оболочки на передний план" 'ГАРАНТ аэро' FindWindowByCaption SetForegroundWindow ; : "Сравнить развёрнутый список с эталоном" STRING IN aList "Развернуть текущее дерево" focused:control:push pop:object:ClassName 'TvtLister' SameText IF aList byname:control:push pop:control:Caption . ELSE INTERFACE VAR l_Node INTERFACE VAR l_Node_next BOOLEAN VAR Сделано НЕТ >>> Сделано ПОКА ( НЕ Сделано ) BEGIN aList byname:control:push tree:CurrentNode =: l_Node l_Node Node:Text . "Стрелка вниз" aList byname:control:push tree:CurrentNode =: l_Node_next ( l_Node_next Node:Text ) РАВНО ( l_Node Node:Text ) IF ДА >>> Сделано ENDIF END ENDIF ; // "Сравнить развёрнутый список с эталоном" : "Сравнить дерево атрибутов модального окна с эталоном" "Обработать Enter модально" ( "Сравнить развёрнутый список {(контрол::AttributeTree)} с эталоном" ) ; : "Перенести элемент оглавления в текст" INTEGER IN aItem OBJECT VAR "Элемент оглавления" INTEGER VAR i_left INTEGER VAR i_top INTEGER VAR i_width "Сделать оглавление неплавающим" "Открыть структуру документа" "Проверить, что удалось перевести фокус в оглавление" focused:control:push =: "Элемент оглавления" aItem контрол::ContentsTree:push tree:GetItem:Left =: i_left aItem контрол::ContentsTree:push tree:GetItem:Top =: i_top aItem контрол::ContentsTree:push tree:GetItem:Width =: i_width i_top 5 + =: i_top i_left 25 + =: i_left i_width 2 * =: i_width "Запомнить позицию мыши" //i_left i_top "Элемент оглавления" pop:control:ClientToScreen mouse:SetCursorPosition "Установить курсор мыши по координатам {(i_left i_top)} относительно контрола {("Элемент оглавления")}" TRY THREAD ( 1500 SLEEP //i_width i_top "Элемент оглавления" pop:control:ClientToScreen mouse:SetCursorPosition "Установить курсор мыши по координатам {(i_width i_top)} относительно контрола {("Элемент оглавления")}" "Дать системе перерисоваться" "Отпустить левую кнопку мыши" "Дать системе перерисоваться" ) "Зажать левую кнопку мыши" FINALLY "Восстановить позицию мыши" END ; // "Перенести элемент оглавления в текст" : "Переключиться на вкладку в БП" STRING IN aType БП true aType focused:control:push pop:control:GetParentForm pop:control:FindVGControlByName vg:control:SetIsChecked ; : "Вызвать диалог печати по CTRL-P, в поле 'Номера страниц' ввести и нажать 'Печать'" STRING IN aSym : Действия "Перевести фокус в {(контрол::edPrintInterval)} на форме {(форма::PrintDialog)}" "Ввести {(aSym)}" оп::Завершение_работы_Ок "Дать системе перерисоваться" ; @ "Ctrl-P" MODAL ( Действия ) ; : "Вызвать диалог печати по CTRL-P, в поле 'Сделать копий' ввести и нажать 'Печать'" STRING IN aSym : Действия "Перевести фокус в {(контрол::edCopyCount)} на форме {(форма::PrintDialog)}" "Ввести {(aSym)}" оп::Завершение_работы_Ок "Дать системе перерисоваться" ; @ "Ctrl-P" MODAL ( Действия ) ; : "Проверить, что в главном окне нет скроллера" true "Найти основное меню" pop:control:VScrollerVisible ! 'Скроллер виден, хотя не должен' ASSERTS ; : "Проверить, что в главном окне есть скроллер" true "Найти основное меню" pop:control:VScrollerVisible 'Скроллер не виден, хотя должен' ASSERTS ; : "Найти максимальное значение в массиве" IN aMass INTEGER VAR it INTEGER VAR max 0 >>> it 0 aMass [i] =: max 0 aMass array:Count FOR it aMass [i] max > IF it aMass [i] =: max ENDIF ++! it NEXT max ; // "Найти максимальное значение в массиве" : "Найти минимальное значение в массиве" IN aMass INTEGER VAR it INTEGER VAR min 0 >>> it 0 aMass [i] =: min 0 aMass array:Count FOR it aMass [i] min < IF it aMass [i] =: min ENDIF ++! it NEXT min ; // "Найти минимальное значение в массиве" : "Найти среднее значение в массиве" IN aMass INTEGER VAR sum INTEGER VAR aver 0 @ + ITERATE aMass =: sum sum aMass array:Count / =: aver aver ; // "Найти среднее значение в массиве" : "Получить маскимальное, минимальное и среднее значения для массива" IN aMass INTEGER VAR max INTEGER VAR min INTEGER VAR aver "Найти максимальное значение в массиве {(aMass)}" =: max "Найти минимальное значение в массиве {(aMass)}" =: min "Найти среднее значение в массиве {(aMass)}" =: aver [[ 'Max = ' max IntToStr ]] strings:Cat . [[ 'Min = ' min IntToStr ]] strings:Cat . [[ 'Average = ' aver IntToStr ]] strings:Cat . ; // "Получить маскимальное, минимальное и среднее значения для массива" : "Установить фокус в контекстный фильтр вкладки Меню" "Перевести фокус в {(контрол::ContextFilter)} на форме {(форма::Navigator)}" ; : "Скопировать одно слово в буфер" cc:ExtWordRight "Копировать" ; : "Переход к следующему термину с фокусом в тексте" "Перевести фокус в дерево терминов" "Переходим к следующему термину" "Перевести фокус в документ" ; : "Сравнить заголовок окна оболочки с эталоном" "Найти главное окно" pop:control:Caption . ; : "Закрыть форму по крестику" STRING IN aForm OBJECT VAR "Текущая форма" "Найти контрол {(aForm)} на форме {("Найти главное окно")}" =: "Текущая форма" "Текущая форма" pop:object:IsNil ! [[ 'Не удалось найти форму ' aForm ]] strings:Cat ASSERTS OBJECT VAR "Крестик" 'BtnClose' "Текущая форма" pop:control:FindControlByName =: "Крестик" "Крестик" pop:object:IsNil ! 'Не удалось найти кнопку закрытия' ASSERTS "Крестик" "Кликнуть" ; // "Закрыть форму по крестику" : "Создать фильтр с именем и с параметром для" STRING IN aName IN aProc IN aKZ aKZ DO "Открыть фильтры" : Действия1 : Действия2 "Ввести {(aName)}" "Нажать Ok" ; aProc DO @ ( "Нажать Ok" ) MODAL ( Действия2 ) ; @ оп::Фильтры_Создать_новый_фильтр MODAL ( Действия1 ) "Дождаться переключения вкладок" "Закрыть фильтры" ; // "Создать фильтр с именем и с параметром" : "Удалить фильтр с именем для" STRING IN aName IN aKZ VAR Сделано НЕТ >>> Сделано INTERFACE VAR l_Node aKZ DO "Открыть фильтры" ПОКА ( НЕ Сделано ) BEGIN контрол::FiltersList:push tree:CurrentNode =: l_Node l_Node Node:IsLast IF ДА >>> Сделано ENDIF ( l_Node Node:Text "НЕ РАВНО" aName ) IF "Стрелка вниз" ELSE wait:Yes TRY "Нажать {('Del')}" FINALLY waited:? ASSERT END ENDIF END "Дождаться переключения вкладок" "Закрыть фильтры" ; // "Удалить фильтр с именем" : "Применить фильтр с именем" STRING IN aFilter OBJECT VAR l_Tree VAR Сделано НЕТ >>> Сделано INTERFACE VAR l_Node INTEGER VAR l_NodeIndex 0 >>> l_NodeIndex "Открыть фильтры" // подразумевается, что мы тут можем открыть фильтры контрол::FiltersList:push >>> l_Tree "Переместиться в начало дерева" ПОКА ( НЕ Сделано ) BEGIN "Текущая нода дерева {(l_Tree)}" >>> l_Node l_Node Node:IsLast >>> Сделано ( l_Node Node:Text "НЕ РАВНО" aFilter ) IF "Стрелка вниз" ELSE ДА >>> Сделано true l_NodeIndex l_Tree tree:SetSelected ENDIF l_NodeIndex 1 + >>> l_NodeIndex END ; : "Удалить фильтр с именем" STRING IN aFilter OBJECT VAR l_Tree VAR Сделано НЕТ >>> Сделано INTERFACE VAR l_Node "Открыть фильтры" // подразумевается, что мы тут можем открыть фильтры контрол::FiltersList:push >>> l_Tree "Переместиться в начало дерева" ПОКА ( НЕ Сделано ) BEGIN "Текущая нода дерева {(l_Tree)}" >>> l_Node l_Node Node:IsLast >>> Сделано ( l_Node Node:Text "НЕ РАВНО" aFilter ) IF "Стрелка вниз" ELSE wait:Yes TRY "Нажать {('Del')}" FINALLY waited:? ASSERT END true =: Сделано ENDIF END ; : "Перезаписать фильтр с именем новым параметром для" STRING IN aName IN aProc IN aKZ VAR Сделано НЕТ >>> Сделано INTERFACE VAR l_Node : Действия aProc DO wait:Yes TRY "Нажать Ok" FINALLY waited:? ASSERT END ; aKZ DO "Открыть фильтры" ПОКА ( НЕ Сделано ) BEGIN контрол::FiltersList:push tree:CurrentNode =: l_Node l_Node Node:IsLast IF ДА >>> Сделано ENDIF ( l_Node Node:Text "НЕ РАВНО" aName ) IF "Стрелка вниз" ELSE @ оп::Фильтр_Редактировать_фильтр MODAL ( Действия ) ENDIF END "Дождаться переключения вкладок" ; // "Перезаписать фильтр с именем новым параметром" : "Сравнить фильтр с именем с эталоном для" STRING IN aName IN aKZ VAR Сделано НЕТ >>> Сделано INTERFACE VAR l_Node aKZ DO "Открыть фильтры" ПОКА ( НЕ Сделано ) BEGIN контрол::FiltersList:push tree:CurrentNode =: l_Node l_Node Node:IsLast IF ДА >>> Сделано ENDIF ( l_Node Node:Text "НЕ РАВНО" aName ) IF "Стрелка вниз" ELSE @ оп::Фильтр_Редактировать_фильтр MODAL ( "Сравнить текст редактора {(контрол::Editor:push)} с эталоном" ) ENDIF END "Дождаться переключения вкладок" "Закрыть фильтры" ; // "Сравнить фильтр с именем с эталоном" : "Померить минимальную ширину правой и левой частей ААК" OBJECT VAR "Левая часть ААК" OBJECT VAR "Правая часть ААК" "Найти контрол {(контрол::pnLeftEx)} на форме {("Найти главное окно")}" =: "Левая часть ААК" "Левая часть ААК" pop:object:IsNil ! 'Не найдена левая часть ААК' ASSERTS "Найти контрол {(контрол::pnRightEx)} на форме {("Найти главное окно")}" =: "Правая часть ААК" "Правая часть ААК" pop:object:IsNil ! 'Не найдена правая часть ААК' ASSERTS INTEGER VAR width_form "Найти главное окно" "Померить ширину" =: width_form INTEGER VAR width_aak "Левая часть ААК" "Померить ширину" =: width_aak TRY 0 "Левая часть ААК" "Установить ширину" [[ 'Минимальная ширина левой части ААК = ' ( "Левая часть ААК" "Померить ширину" ) IntToStr ]] strings:Cat . width_form "Левая часть ААК" "Установить ширину" [[ 'Минимальная ширина правой части ААК = ' ( "Правая часть ААК" "Померить ширину" ) IntToStr ]] strings:Cat . FINALLY width_aak "Левая часть ААК" "Установить ширину" END ; // "Померить минимальную ширину правой и левой частей ААК" : "Очистить историю" vcm:History:GetBackCount раз "Удалить последний элемент истории" ; : "Поставить на контроль и выполнить" IN aProc "Поставить на контроль" TRY aProc DO FINALLY "Снять с контроля" END ; WordAlias "тест с падением" анти-тест : ПЗ OBJECT VAR "Панель задач" форма::TasksPanel "Найти главное окно" pop:control:FindControlByName =: "Панель задач" "Панель задач" pop:object:IsNil ? ( моп::Окна_Панель_задач OnTest ) ; : "Закрыть вкладку ПЗ" OBJECT VAR "Панель задач" форма::TasksPanel "Найти главное окно" pop:control:FindControlByName =: "Панель задач" "Панель задач" pop:object:IsNil ! ? ( моп::Окна_Панель_задач OnTest ) ; : "Сравнить ПЗ с эталоном" : Действия OBJECT IN aControl : Действия1 OBJECT IN aControl aControl ЯВЛЯЕТСЯ class::TnscTasksPanelTreeView ? ( aControl pop:control:SetFocus ASSERT "Переместиться в начало дерева" //aControl pop:control:Name . aControl "Сравнить список с эталоном" ) ; '' . aControl pop:control:Caption . '---------------' . aControl EnumerateControls Действия1 ; ПЗ TRY OBJECT VAR "Панель задач" форма::TasksPanel "Найти главное окно" pop:control:FindControlByName =: "Панель задач" контрол::tpvMain "Панель задач" pop:control:FindControlByName =: "Панель задач" "Панель задач" EnumerateControls Действия FINALLY "Закрыть вкладку ПЗ" END ; // "Сравнить ПЗ с эталоном" : "Установить закладку на документ" : Действия OBJECT VAR "Форма сохранения в МД" OBJECT VAR "Кнопка ОК" focused:control:push 2 раза "Получить родительскую форму" =: "Форма сохранения в МД" "Форма сохранения в МД" pop:object:IsNil ! 'Не нашли форму сохранения в МД' ASSERTS 'bt_enResult_opOk' "Форма сохранения в МД" pop:control:FindControlByName =: "Кнопка ОК" "Кнопка ОК" "Кликнуть" ; 3 раза "Дождаться переключения вкладок" @ ( оп::Документ_Установить_закладку... ) MODAL ( Действия ) ; // "Установить закладку на документ" : "Мои документы" BOOLEAN VAR l_Found true ANYUSERTYPE контрол::FoldersTree форма::FoldersTree TryFocusOnForm =: l_Found l_Found ! IF моп::Папки_Мои_документы ENDIF true ANYUSERTYPE контрол::FoldersTree форма::FoldersTree TryFocusOnForm 'Не смогли установить фокус в МД' ASSERTS "Переместиться в начало дерева" "Свернуть текущее дерево" ; : "Закрыть вкладку Мои документы" BOOLEAN VAR l_Found true ANYUSERTYPE контрол::FoldersTree форма::FoldersTree TryFocusOnForm =: l_Found l_Found IF моп::Папки_Мои_документы "Дождаться переключения вкладок" ENDIF ; : "Закрыть синюю медаль документов на контроле" ОМ "Синяя медаль документов на контроле" byname:control:push pop:control:Visible ? ( "Синяя медаль документов на контроле" byname:control:push pop:control:Click "Синяя медаль документов на контроле" byname:control:push pop:reminder:FindEditor pop:control:SetFocus 'Не удалось поставить фокус в редактор баллона' ASSERTS OBJECT VAR "Форма баллона" focused:control:push 2 раза ( "Получить родительскую форму" ) =: "Форма баллона" OBJECT VAR "Крестик баллона" 'CloseButton' "Форма баллона" pop:control:FindVGControlByName =: "Крестик баллона" "Крестик баллона" vg:control:Click "Закрыть вкладку Документы на контроле" ) ; // "Закрыть синюю медаль документов на контроле" : "Сравнить содержимое тулбаров с эталоном расширенно" BOOLEAN IN aCheckEnabled : Действия OBJECT IN aObj ( aObj ЯВЛЯЕТСЯ class::TvcmToolbar ) ? ( ( aObj pop:control:Visible И ( aObj pop:control:ControlCount БОЛЬШЕ 1 ) ) ? ( aObj . 'Order = ' 'DockRow' aObj pop:object:GetOrdProp IntToStr Cat . '---------------' . aObj EnumerateControls ( OBJECT IN aControl ( aControl "НЕ ЯВЛЯЕТСЯ" class::Ttb97MoreButton ) ? ( aControl . ( aControl "НЕ ЯВЛЯЕТСЯ" class::TvcmComboBox ) ? ( aControl pop:control:Caption . aCheckEnabled ? ( 'Активность:' aControl "Убедиться, что контрол активен" ToPrintable Cat . ) ) ) ) '' . ) ) ; : "Получить содержимое тулбаров" "Найти главное окно" "выполнить для всех контролов" Действия ; "Выставить форме размеры {(1400 900)} и {(@ "Получить содержимое тулбаров")}" ; // "Сравнить содержимое тулбаров с эталоном расширенно" : "Сравнить содержимое тулбаров с эталоном" OnTest "Сравнить содержимое тулбаров с эталоном расширенно {(false)}" ; : "Сравнить содержимое тулбаров с эталоном полностью" "Сравнить содержимое тулбаров с эталоном расширенно {(true)}" ; : "Проверить, что нельзя перевести фокус в на форме типа" STRING IN aControl STRING IN aForm INTEGER IN aUserType true aUserType aControl aForm TryFocusOnForm ! [[ 'Удалось поставить фокус в ' aControl ' на форме ' aForm ' типа ' aUserType IntToStr ', хотя такой возможности быть не должно!' ]] strings:Cat ASSERTS ; : "Проверить, что нельзя перевести фокус в на форме" STRING IN aControl STRING IN aForm "Проверить, что нельзя перевести фокус в {(aControl)} на форме {(aForm)} типа {(ANYUSERTYPE)}" ; : "Проверить, что нельзя перевести фокус в комментарии" "Проверить, что нельзя перевести фокус в {(контрол::lstComments)} на форме {(форма::Contents)}" ; : "Открыть список документов с комментариями" "Мои документы" "Развернуть текущее дерево" TRY "Перейти по ссылке {('Документы с комментариями пользователя')} в дереве {(контрол::FoldersTree)}" "Перевести фокус в список" FINALLY "Закрыть вкладку Мои документы" END ; // "Открыть список документов с комментариями" : "Пункт меню видим?" OBJECT IN anItem 'Checked' anItem pop:object:GetOrdProp РАВНО 0 ! ; WORDWORKER "Выполнить с пунктом меню 'сортировка списка'" VAR Item 'Документы' "Найти главное окно" pop:form:FindMenuItem =: Item 1 Item menuitem:GetItem =: Item application:ActionIdle Item "Пункт меню видим?" Item WordToWork DO ; : "Проверить видимость пунктов меню связанных с сортировкой списка" "Выполнить с пунктом меню 'сортировка списка'" ( BOOLEAN IN aVisible OBJECT IN anItem ) ; WORDWORKER "Выполнить с пунктом меню 'информация об изменениях документа'" VAR Item 'Документы/Комментарии' "Найти главное окно" pop:form:FindMenuItem =: Item 1 Item menuitem:GetItem =: Item application:ActionIdle Item "Пункт меню видим?" Item WordToWork DO ; : "Проверить видимость пунктов меню связанных с комментариями" "Выполнить с пунктом меню 'информация об изменениях документа'" ( BOOLEAN IN aVisible OBJECT IN anItem ) ; : "Включить информацию об изменениях документа" "Выполнить с пунктом меню 'информация об изменениях документа'" ( BOOLEAN IN aVisible OBJECT IN anItem aVisible ! ? ( anItem menuitem:Click ) 'Включить информацию об изменениях документа' РАВНО ( anItem menuitem:GetCaption ) ASSERT ) ; : "Выключить информацию об изменениях документа" "Выполнить с пунктом меню 'информация об изменениях документа'" ( BOOLEAN IN aVisible OBJECT IN anItem aVisible ? ( anItem menuitem:Click ) 'Выключить информацию об изменениях документа' РАВНО ( anItem menuitem:GetCaption ) ASSERT ) ; : "Выполнить с включёнными версионными комментариями" IN aProc "Выполнить с пунктом меню 'информация об изменениях документа'" ( BOOLEAN IN aVisible OBJECT IN anItem aVisible IF aProc DO ELSE "Включить информацию об изменениях документа" TRY aProc DO FINALLY "Перевести фокус в текст" "Выключить информацию об изменениях документа" END ENDIF ) ; // "Выполнить с включёнными версионными комментариями" : "Выполнить с выключенными версионными комментариями" IN aProc "Выполнить с пунктом меню 'информация об изменениях документа'" ( BOOLEAN IN aVisible OBJECT IN anItem aVisible ! IF aProc DO ELSE "Выключить информацию об изменениях документа" TRY aProc DO FINALLY "Перевести фокус в текст" "Включить информацию об изменениях документа" END ENDIF ) ; // "Выполнить с выключенными версионными комментариями" : "Нажать в текущем редакторе на ссылку на графическую копию" VAR Editor VAR x VAR y "Стрелка вверх" focused:control:push >>> Editor Editor pop:editor:ParaCoordsToScreen >>> y >>> x x 5 + >>> x y 5 - >>> y x y mouse:SetCursorPosition "Клик левой кнопкой мыши" ; : "Перейти на элемент свёрнутого списка" INTEGER IN aItem оп::Дерево_Свернуть_все aItem 1 - раз "Стрелка вниз" ; : "Открыть мои документы и выполнить" IN aProc "Мои документы" TRY aProc DO FINALLY "Закрыть вкладку Мои документы" END ; : "Открыть панель задач и выполнить" IN aProc ПЗ TRY aProc DO FINALLY "Закрыть вкладку ПЗ" END ; : "Открываем НК из ОМ" ОМ "Перевести фокус в {(контрол::tvReferences)} на форме {(форма::MainMenuNew)}" "Перейти по ссылке {('Кодексы Российской Федерации')} в дереве {(контрол::tvReferences)}" "Нажать {('Enter')}" ; : "Обновить главное меню приложения" "Список всех документов" "Дать системе перерисоваться" "Проверить видимость пунктов меню связанных с сортировкой списка" // - ХАК! это чтобы пункты про сортировку обновить ; : "Выставить форме размеры ширину навигатора в и " INTEGER IN formW INTEGER IN formH INTEGER IN aW OBJECT IN aProc : Действия INTEGER VAR width_navigator контрол::LeftNavigator:push "Померить ширину" =: width_navigator aW контрол::LeftNavigator:push "Установить ширину" TRY aProc DO FINALLY width_navigator контрол::LeftNavigator:push "Установить ширину" END ; // Действия "Выставить форме размеры {(formW formH)} и {(@ Действия)}" ; // "Выставить форме размеры ширину навигатора в и " OBJECT FUNCTION "Левый навигатор" "Найти контрол {(контрол::LeftNavigator)} на форме {("Найти главное окно")}" =: Result Result pop:object:IsNil ! 'Не удалось найти левый навигатор' ASSERTS ; // "Левый навигатор" OBJECT FUNCTION "Кнопка свертывания левого навигатора" "Дать системе перерисоваться" 'HIDELEFT' "Левый навигатор" pop:control:FindControlByName =: Result Result pop:object:IsNil ! 'Не удалось найти кнопку свертывания левого навигатора' ASSERTS ; // "Кнопка свертывания левого навигатора" : "Сделать левый навигатор свернутым" "Левый навигатор" "Померить ширину" 31 <> IF "Кнопка свертывания левого навигатора" "Кликнуть" ENDIF "Дать системе перерисоваться" ; // "Сделать левый навигатор свернутым" : "Сделать левый навигатор развернутым" "Левый навигатор" "Померить ширину" 31 == IF "Кнопка свертывания левого навигатора" "Кликнуть" ENDIF "Дать системе перерисоваться" ; // "Сделать левый навигатор развернутым" : "Запомнить ширину левого навигатора и выполнить" IN aProc VAR aWidht "Левый навигатор" "Померить ширину" >>> aWidht TRY aProc DO FINALLY aWidht "Левый навигатор" "Установить ширину" END ; // "Запомнить ширину левого навигатора и выполнить" : "Убедиться, что БП присутствует на форме и померить его высоту" OBJECT IN aForm OBJECT VAR "Базовый поиск" "Проверить, что открыта форма БП" "Найти контрол {(контрол::BaseSearchPanel)} на форме {(aForm)}" =: "Базовый поиск" "Проверить, что контрол {("Базовый поиск")} видимый" "Базовый поиск" pop:control:GetHeight . ; : "Сделать с изменением состояния и размеров окна" OBJECT IN aProc OBJECT IN aForm VAR aState VAR L VAR T VAR W VAR H aForm pop:form:GetWindowState >>> aState aForm "Померить отступ слева" >>> L aForm "Померить отступ сверху" >>> T aForm "Померить ширину" >>> W aForm "Померить высоту" >>> H TRY aProc DO FINALLY aState aForm pop:form:SetWindowState L aForm pop:control:SetLeft T aForm pop:control:SetTop W aForm "Установить ширину" H aForm "Установить высоту" END ; // "Сделать с изменением состояния и размеров окна" BOOLEAN FUNCTION "Является ли фильтр автоприменяемым?" INTEGER IN aItem ( aItem контрол::FiltersList:push tree:GetItemImageIndex РАВНО 25 ) =: Result ; // "Является ли фильтр автоприменяемым?" : "Сделать фильтр автоприменяемым" INTEGER IN aItem "Установить фокус во вкладку Фильтры" "Является ли фильтр {(aItem)} автоприменяемым?" ! ? ( "Переместиться в начало дерева" aItem раз "Стрелка вниз" оп::Фильтр_Применять_автоматически ) ; // "Сделать фильтр автоприменяемым" : "Сделать фильтр НЕавтоприменяемым" INTEGER IN aItem "Установить фокус во вкладку Фильтры" "Является ли фильтр {(aItem)} автоприменяемым?" ? ( "Переместиться в начало дерева" aItem раз "Стрелка вниз" оп::Фильтр_Применять_автоматически ) ; // "Сделать фильтр НЕавтоприменяемым" : "Убедиться, что фильтр автоприменяемый" INTEGER IN aItem "Установить фокус во вкладку Фильтры" "Переместиться в начало дерева" aItem раз "Стрелка вниз" "Является ли фильтр {(aItem)} автоприменяемым?" 'Фильтр не является автоприменяемым' ASSERTS ; // "Убедиться, что фильтр автоприменяемый" : "Сравнить левую часть ААК-Содержания с эталоном" "Поставить фокус в левую половину ААК-Содержания" "Выделить всё" "Сравнить выделенный текст текущего редактора с эталоном" ; // "Сравнить левую часть ААК-Содержания с эталоном" : "Сравнить правую часть ААК-Содержания с эталоном" "Поставить фокус в правую половину ААК-Содержания" "Выделить всё" "Сравнить выделенный текст текущего редактора с эталоном" ; // "Сравнить правую часть ААК-Содержания с эталоном" : "Сравнить текст обеих частей ААК-Содержания с эталоном" "Сравнить левую часть ААК-Содержания с эталоном" '-------------------------------------------------------' . "Сравнить правую часть ААК-Содержания с эталоном" ; // "Сравнить текст обоих частей ААК-Содержания с эталоном" BOOLEAN FUNCTION "Имеет ли документ на контроле статус изменён?" INTEGER IN aItem ( aItem контрол::UnderControlList:push tree:GetItemImageIndex РАВНО 8 ) =: Result ; // "Имеет ли документ на контроле статус изменён?" : "Убедиться, что документ на контроле имеет статус изменён" INTEGER IN aItem "Установить фокус в {(контрол::UnderControlList:push)}" "Переместиться в начало дерева" aItem раз "Стрелка вниз" "Имеет ли документ {(aItem)} на контроле статус изменён?" 'Документ на контроле не имеет статуса изменён' ASSERTS ; // "Убедиться, что документ на контроле имеет статус изменён" : "Поставить на контроль, подавив Нарушен баланс скобок Wait" TRY "Поставить на контроль" EXCEPT DROP // - удаляем результат со стека, т.к. прилетела ересь 'Нарушен баланс скобок Wait' END ; // "Поставить на контроль, подавив Нарушен баланс скобок Wait" : "Удалить документ с вкладки Документы на контроле, подавив Нарушен баланс скобок Wait" TRY "Ответить один раз Да для {(@ "Нажать Del")}" EXCEPT DROP // - удаляем результат со стека, т.к. прилетела ересь 'Нарушен баланс скобок Wait' END ; // "Удалить документ с вкладки Документы на контроле, подавив Нарушен баланс скобок Wait" : "Сделать с комментариями в документе" IN aProc IN aDoc "Открываем {(aDoc)}" TRY aProc DO FINALLY "Открываем {(aDoc)}" "В документе не должно быть комментариев" END ; // "Сделать с комментариями в документе" : "Установить фокус в контекстный фильтр списка Инфарма" OBJECT VAR "Контекстный фильтр" "Найти контрол {('InternalEditor')} на форме {("Найти главное окно")}" =: "Контекстный фильтр" "Установить фокус в {("Контекстный фильтр")}" ; // "Установить фокус в контекстный фильтр списка Инфарма" : "Основное меню Инфарма" моп::Инфарм_Основное_меню_ИнФарм ; // "Основное меню Инфарма" : "Список всех препаратов" "Основное меню Инфарма" "Нажать {('Enter')}" "Нажать Искать" ; // "Список всех препаратов" OBJECT FUNCTION "Проверить доступность кнопки" IN aControl aControl "Найти главное окно" pop:control:FindControlByName =: Result Result pop:control:Enabled . ; // "Проверить доступность кнопки" STRING FUNCTION "Узнать, в каком поле КЗ стоит фокус" OBJECT IN aQueryCard aQueryCard ЯВЛЯЕТСЯ class::TevQueryCardEditor ASSERT aQueryCard pop:QueryCard:GetCurrentReqName >>> Result ; // "Узнать, в каком поле КЗ стоит фокус" : "Сравнить с эталоном активное поле текущей КЗ" focused:control:push "Узнать, в каком поле КЗ стоит фокус" . ; // "Сравнить с эталоном активное поле текущей КЗ" : "Установить курсор мыши на ссылку в плашке ААК" VAR x VAR y "Найти плашку в ААК" pop:editor:ParaEndCoordsToScreen >>> y >>> x x 40 - >>> x y 15 - >>> y x y mouse:SetCursorPosition ; // "Установить курсор мыши на ссылку в плашке ААК" : "Клик по встроенному скроллеру редактора" OBJECT IN anEditor //"Найти главное окно" pop:control:GetHandle SetForegroundWindow VAR X VAR Y VAR W VAR H anEditor ЯВЛЯЕТСЯ class::TnscEditor [[ 'Фокус не в редакторе, а в ' anEditor pop:component:Name ':' anEditor pop:object:ClassName ]] strings:Cat ASSERTS anEditor pop:control:VScrollerVisible IF "Запомнить позицию мыши" TRY anEditor pop:control:GetWidth >>> W anEditor pop:control:GetHeight >>> H W 5 - >>> X H 2 / >>> Y //X Y anEditor pop:control:ClientToScreen >>> Y >>> X //X Y mouse:SetCursorPosition "Установить курсор мыши по координатам {(X Y)} относительно контрола {(anEditor)}" "Клик левой кнопкой мыши" FINALLY "Восстановить позицию мыши" END ENDIF ; // "Клик по встроенному скроллеру редактора" : "Клик по встроенному скроллеру редактора в фокусе" "Клик по встроенному скроллеру редактора {(focused:control:push)}" ; : "в поле 'Вид правовой информации' ввести" STRING IN aStr "Убедиться, что фокус в редакторе" 'AT_PREFIX' aStr focused:control:push pop:QueryCard:SetAttribute ; // "в поле 'Вид правовой информации' ввести" : "Выполнить в списке документов с комментарями" IN aProc "Мои документы" "Развернуть текущее дерево" TRY "Перейти по ссылке {('Документы с комментариями пользователя')} в дереве {(контрол::FoldersTree)}" "Перевести фокус в список" aProc DO FINALLY "Закрыть вкладку Мои документы" END ; // "Выполнить в списке документов с комментарями" BOOLEAN FUNCTION "Имеет ли расширенная конфигурация признак измененности?" ( 1 контрол::tvConfs:push tree:GetItemImageIndex РАВНО 2 ) =: Result ; // "Имеет ли расширенная конфигурация признак измененности?" : "Убедиться, что расширенная конфигурация имеет признак измененности" "Установить фокус в {(контрол::tvConfs:push)}" "Имеет ли расширенная конфигурация признак измененности?" 'Расширенная конфигурация не имеет признака измененности' ASSERTS ; //"Убедиться, что расширенная конфигурация имеет признак измененности" : "Убедиться, что расширенная конфигурация не имеет признака измененности" "Установить фокус в {(контрол::tvConfs:push)}" "Имеет ли расширенная конфигурация признак измененности?" ! 'Расширенная конфигурация имеет признак измененности' ASSERTS ; //"Убедиться, что расширенная конфигурация не имеет признака измененности" : "Перевести фокус в поле 'Запрос в службу Правовой поддержки онлайн' в ППО" "Убедиться, что фокус в редакторе" 'AT_LAW_SUPPORT_TEXT' focused:control:push pop:QueryCard:Attribute:SetFocus ; // "Перевести фокус в поле 'Запрос в службу Правовой поддержки онлайн' в ППО" : "Ищем в тексте КЗ Инфарма контекст" STRING IN aStr1 "Поиск лекарственного средства" "Убедиться, что фокус в редакторе" OBJECT VAR l_QC focused:control:push >>> l_QC 'AT_PHARM_TEXT' aStr1 l_QC pop:QueryCard:SetAttribute "Нажать Искать" ; // "Ищем в тексте КЗ Инфарма контекст" STRING IN aStr1 : "Сохранить текущий объект в Мои документы и выполнить" IN aProc : Действия OBJECT VAR "Форма сохранения в МД" OBJECT VAR "Кнопка ОК" focused:control:push 2 раза "Получить родительскую форму" =: "Форма сохранения в МД" "Форма сохранения в МД" pop:object:IsNil ! 'Не нашли форму сохранения в МД' ASSERTS 'bt_enResult_opOk' "Форма сохранения в МД" pop:control:FindControlByName =: "Кнопка ОК" "Кнопка ОК" "Кликнуть" ; // Действия : Удаляем_объект 3 раза "Дождаться переключения вкладок" "Дать системе перерисоваться" "Развернуть текущее дерево" "Стрелка вниз" "Ответить один раз Да для {(@ "Нажать Del")}" ; // Удаляем_список 3 раза "Дождаться переключения вкладок" @ ( "Сохранить в Мои документы" ) MODAL ( Действия ) TRY aProc DO FINALLY "Дать системе перерисоваться" "Открыть мои документы и выполнить {(@ Удаляем_объект )}" END ; // "Сохранить текущий объект в Мои документы и выполнить" : "Установить фокус в контекстный фильтр ТС" "Перевести фокус в {(контрол::ContextFilter)} на форме {(форма::Diction)}" ; // "Установить фокус в контекстный фильтр ТС" : "Проверить, что введено в контекстый фильтр" OBJECT VAR "Контекстный фильтр" "Найти контрол {('InternalEditor')} на форме {("Найти главное окно")}" =: "Контекстный фильтр" "Контекстный фильтр" pop:control:Caption . ; // "Проверить, что введено в контекстый фильтр" : "Сравнить название текущего термина с эталоном" INTERFACE VAR l_Node контрол::WordsTree:push tree:CurrentNode =: l_Node l_Node Node:Text . ; //"Сравнить название текущего термина с эталоном" : "Померить левые отступы для контрола" OBJECT IN aControl aControl pop:editor:GetLeftIndentDelta . aControl "Померить отступ слева" . ; // "Померить левые отступы для контрола" OBJECT FUNCTION "Проверить доступность кнопки в модальном окне" IN aControl OBJECT VAR "Модальная форма" focused:control:push pop:control:GetAnotherParentForm =: "Модальная форма" aControl "Модальная форма" pop:control:FindControlByName =: Result Result pop:control:Enabled . ; // "Проверить доступность кнопки в модальном окне" : "Восстановить все настройки текущей конфигурации" : Действия OBJECT VAR "Кнопка Восстановить все" OBJECT VAR "Модальная форма" focused:control:push pop:control:GetAnotherParentForm =: "Модальная форма" "Найти контрол {('bt_enResult_opRestoreAllSettings')} на форме {("Модальная форма")}" =: "Кнопка Восстановить все" "Кнопка Восстановить все" pop:object:IsNil ! 'Не нашли кнопку Восстановить все' ASSERTS "Кнопка Восстановить все" "Кликнуть" OnTest ; // Действия : Сохраняем_размеры "Найти главное окно" "Развернуть окно" @ "Настройка конфигурации" MODAL ( "Ответить один раз Да для {(@ Действия )}" ) ; // Сохраняем_размеры "Сделать {(@ Сохраняем_размеры )} с изменением состояния и размеров окна {("Найти главное окно")}" ; // "Восстановить все настройки текущей конфигурации" OBJECT FUNCTION "Видимый элемент статусбара" INTEGER IN aItem OBJECT IN aStatusBar OBJECT VAR l_Item INTEGER VAR I INTEGER VAR l_VisibleIndex 0 >>> I 0 >>> l_VisibleIndex aStatusBar StatusBar:OrderedControlsCount раз ( I aStatusBar StatusBar:OrderedControl =: l_Item l_Item pop:control:Visible ? ( l_VisibleIndex РАВНО aItem ? ( l_Item >>> Result EXIT ) l_VisibleIndex 1 + >>> l_VisibleIndex ) I 1 + >>> I ) ; // "Видимый элемент статусбара" : "в поле 'Статус регистрации' ввести с операцией" STRING IN aStr INTEGER IN aL "Убедиться, что фокус в редакторе" 'AT_PHARM_REG_STATUS' focused:control:push pop:QueryCard:Attribute:SetFocus aL 'AT_PHARM_REG_STATUS' aStr focused:control:push pop:QueryCard:Attribute:SetWithLogicOperation ; // "в поле 'Статус регистрации' ввести с операцией" : "Проверить, доступно ли изменение логического условия для поля КЗ" STRING IN aStr "Убедиться, что фокус в редакторе" aStr focused:control:push pop:QueryCard:Attribute:IsLogicOperationEnabled . ; // "Проверить, доступно ли изменение логического условия для поля КЗ" : "Проверить, какое логическое условие введено для поля КЗ" STRING IN aStr "Убедиться, что фокус в редакторе" aStr focused:control:push pop:QueryCard:Attribute:GetLogicOperation . ; // "Проверить, какое логическое условие введено для поля КЗ" : "Для всех видимых элементов статусбара выполнить" OBJECT IN aStatusBar OBJECT IN aProc OBJECT VAR l_Item INTEGER VAR I INTEGER VAR l_VisibleIndex INTEGER VAR l_Count 0 >>> I 0 >>> l_VisibleIndex aStatusBar StatusBar:OrderedControlsCount >>> l_Count l_Count раз ( I aStatusBar StatusBar:OrderedControl =: l_Item l_Item pop:control:Visible ? ( l_VisibleIndex РАВНО l_Count ? ( EXIT ) l_Item aProc DO l_VisibleIndex 1 + >>> l_VisibleIndex ) I 1 + >>> I ) ; // "Для всех видимых элементов статусбара выполнить" : "Вызвать Список редакций из статусной строки и сделать" IN aProc : Действия OnTest "Перевести фокус в дерево редакций" aProc DO OnTest ; // Действия : "Открываем Список редакций из статусной строки" : Ищем_нужную_кнопку OBJECT IN l_It l_It "Заголовок контрола" РАВНО 'Выбрать другие редакции' IF @ ( l_It "Кликнуть" ) MODAL Действия ENDIF ; // Ищем_нужную_кнопку "Для всех видимых элементов статусбара {(контрол::StatusBar:push)} выполнить {(@ Ищем_нужную_кнопку )}" ; // "Открываем Список редакций из статусной строки" "Открываем Список редакций из статусной строки" ; // "Вызвать Список редакций из статусной строки и сделать" : "Вызвать Список редакций из статусной строки" "Вызвать Список редакций из статусной строки и сделать {(@ NOP)}" ; // "Вызвать Список редакций из статусной строки" : "Открываем вкладку 'Комментарии' в синхронном просмотре списка" "Дождаться переключения вкладок" OBJECT VAR "Нужная кнопка" "Найти контрол {('bt_enSynchroView_ShowUserCRList2')} на форме {("Найти главное окно")}" =: "Нужная кнопка" "Нужная кнопка" pop:object:IsNil ! 'Не нашли кнопку Комментарии' ASSERTS "Нужная кнопка" "Кликнуть" OnTest "Дождаться переключения вкладок" ; // "Открываем вкладку 'Комментарии' в синхронном просмотре списка" : "Открыть сохраненный объект из Моих документов и выполнить" IN aProc "Мои документы" "Развернуть текущее дерево" TRY "Стрелка вниз" "Нажать {('Enter')}" aProc DO FINALLY "Закрыть вкладку Мои документы" END ; // "Открыть список документов с комментариями" OBJECT FUNCTION "Найти сплиттер в ААК-содержании" OBJECT VAR "Текущая форма" "Найти окно {(форма::AACContentsContainer)} по имени" =: "Текущая форма" "Текущая форма" pop:object:IsNil ! 'Форма ААК-Содержание не найдена' ASSERTS "Найти контрол {(контрол::pnLeftEx)} на форме {("Текущая форма")}" =: Result Result pop:object:IsNil ! 'Сплиттер в ААК-Содержании не найден' ASSERTS ; // "Найти сплиттер в ААК-содержании" : "Померить ширину левой части ААК-Содержания" OBJECT VAR "Сплиттер" "Найти сплиттер в ААК-содержании" =: "Сплиттер" "Сплиттер" "Померить ширину" . ; // "Померить ширину левой части ААК-Содержания" : "Выполнить над свернутой группой КЗ" IN aProc STRING IN aStr ППР BOOLEAN VAR l_Status OBJECT VAR l_QC "Убедиться, что фокус в редакторе" focused:control:push >>> l_QC aStr l_QC pop:QueryCard:Attribute:GetCollapsed >>> l_Status aStr l_QC pop:QueryCard:Attribute:GetCollapsed IF aStr true l_QC pop:QueryCard:Attribute:SetCollapsed ENDIF aProc DO aStr l_Status ! l_QC pop:QueryCard:Attribute:SetCollapsed ; // "Выполнить над свернутой группой КЗ" : "Сделать с документом , открытым из Журнала работы" IN aProc IN aDoc "Очистить журнал работы" "Открываем {(aDoc)}" ОМ TRY "Открыть журнал работы" 2 раза "Спускаемся в дереве на уровень вниз" "Нажать {('Enter')}" aProc DO FINALLY "Закрыть журнал работы" END ; // "Сделать с документом , открытым из Журнала работы" : "Нажать кнопку Отмена в Настройке конфигурации" OBJECT VAR "Отмена" OBJECT VAR "Модальная форма" focused:control:push pop:control:GetAnotherParentForm =: "Модальная форма" "Найти контрол {('bt_enResult_opCancel')} на форме {("Модальная форма")}" =: "Отмена" "Отмена" pop:object:IsNil ! 'Не нашли кнопку Отмена' ASSERTS "Отмена" "Кликнуть" ; // "Нажать кнопку Отмена в Настройке конфигурации" : "Кликаем Ок в Настройке конфигурации" OBJECT VAR "Кнопка Ок" OBJECT VAR "Модальная форма" focused:control:push pop:control:GetAnotherParentForm =: "Модальная форма" "Найти контрол {('bt_enResult_opOk')} на форме {("Модальная форма")}" =: "Кнопка Ок" "Кнопка Ок" pop:object:IsNil ! 'Не нашли кнопку Ок' ASSERTS "Кнопка Ок" "Кликнуть" ; // "Кликаем Ок в Настройке конфигурации" : "Закрыть форму БП" "Открыта ли форма БП?" IF "Перевести фокус в {(контрол::ContextEdit)} на форме {(форма::NewBaseSearch)} типа {(0)}" "Закрыть текущую вкладку" ENDIF ; // "Закрыть форму БП" OBJECT FUNCTION "Вкладка синхронного просмотра документа" "Открыть вкладку синхронного просмотра текста без сравнения с эталоном" "Дождаться переключения вкладок" контрол::ChildZonePanel "Найти главное окно" pop:control:FindControlByName =: Result Result pop:object:IsNil ! 'Вкладка синхронного просмотра не найдена' ASSERTS ; // "Вкладка синхронного просмотра документа" : "Вывести окно оболочки на первый план" "Найти главное окно" pop:control:GetHandle SetForegroundWindow ; // "Вывести окно оболочки на первый план" BOOLEAN FUNCTION "Получить состояние чекбокса" OBJECT IN aCheckBox 'Checked' aCheckBox pop:object:GetOrdProp РАВНО 1 >>> Result ; // "Получить состояние чекбокса" : "Убедиться, что контрол класса" OBJECT IN aControl STRING IN aClass aControl ЯВЛЯЕТСЯ aClass [[ 'Контрол относится к другому классу: ' aControl pop:object:ClassName ', а не: ' aClass ]] strings:Cat ASSERTS ; // "Убедиться, что контрол класса" : "Убедиться, что текущий контрол" STRING IN aClass OBJECT VAR l_Control focused:control:push =: l_Control l_Control ЯВЛЯЕТСЯ aClass [[ 'Фокус на контроле, который относится к другому классу: ' l_Control pop:object:ClassName ', а не: ' aClass ]] strings:Cat ASSERTS ; // "Убедиться, что текущий контрол" OBJECT FUNCTION "Панель задач" OBJECT VAR "Панель задач" форма::TasksPanel "Найти главное окно" pop:control:FindControlByName =: "Панель задач" контрол::tpvMain "Панель задач" pop:control:FindControlByName =: Result ; // "Панель задач" WORDWORKER "Выполнить с редактором стилей" @ "Редактор стилей" MODAL ( WordToWork DO ) "Дать системе перерисоваться" ; : "Нажать на кнопку контекстного фильтра" OBJECT VAR "Кнопка контекстного фильтра" "Найти контрол {('ContextFilterButton')} на форме {("Найти главное окно")}" =: "Кнопка контекстного фильтра" "Кнопка контекстного фильтра" pop:object:IsNil ! 'Не нашли кнопку контекстного фильтра' ASSERTS "Кнопка контекстного фильтра" "Кликнуть" ; // "Нажать на кнопку контекстного фильтра" INTEGER FUNCTION "Количество открытых вкладок Хрома" 0 >>> Result : "Перебор дочерних окон" INTEGER IN hChild ( hChild GetClassName РАВНО 'Chrome_WidgetWin_0' ) И ( hChild GetWindowText НЕРАВНО '' ) ? ( Result 1 + >>> Result ) ; : "Перебор главных окон Хрома" INTEGER IN hWnd STRING VAR lClass hWnd GetClassName >>> lClass ( lClass РАВНО 'Chrome_WidgetWin_0' ) ИЛИ ( lClass РАВНО 'Chrome_WidgetWin_1' ) ? ( @ "Перебор дочерних окон" hWnd IterateChildWindows ) ; @ "Перебор главных окон Хрома" IterateWindows ; // "Количество открытых вкладок Хрома" : "Выполнить и сравнить с эталоном количество вновь открытых вкладок Хрома" IN aProc INTEGER VAR Count_Wnd_Start INTEGER VAR Count_Wnd_Finish "Количество открытых вкладок Хрома" >>> Count_Wnd_Start TRY aProc DO FINALLY 1500 SLEEP "Вывести окно оболочки на первый план" "Количество открытых вкладок Хрома" >>> Count_Wnd_Finish Count_Wnd_Finish Count_Wnd_Start - . END ; // "Выполнить и сравнить с эталоном количество вновь открытых вкладок Хрома" : "Сравнить с эталоном имя текущего контрола" focused:control:push "Узнать имя контрола" . ; // "Сравнить с эталоном имя текущего контрола" : "Перевести фокус в поле 'Орган/Источник' в ППР" "Убедиться, что фокус в редакторе" 'AT_SOURCE' focused:control:push pop:QueryCard:Attribute:SetFocus ; // "Перевести фокус в поле 'Орган/Источник' в ППР" : "А активна ли вкладка Совещание онлайн?" false 0 контрол::trContactList форма::ContactList TryFocusOnForm ; // "А активна ли вкладка Совещание онлайн?" : "Установить фокус в комбокс фильтра пользователей вкладки Совещание онлайн" OBJECT VAR "Комбобокс" "Найти контрол {('bt_enChat_opUserFilter')} на форме {("Найти главное окно")}" =: "Комбобокс" "Установить фокус в {("Комбобокс")}" ; // "Установить фокус в комбокс фильтра пользователей вкладки Совещание онлайн" : "Открыть вкладку Совещание онлайн" "Открыть вкладку с контактами" OBJECT VAR "Вкладка Совещание Онлайн" "Найти контрол {(контрол::trContactList )} на форме {("Найти главное окно")}" >>> "Вкладка Совещание Онлайн" "Вкладка Совещание Онлайн" pop:object:IsNil ! 'Вкладка Совещание онлайн не открылась' ASSERTS ; // "Открыть вкладку Совещание онлайн" : "Закрыть вкладку Совещание онлайн" "А активна ли вкладка Совещание онлайн?" IF "Установить фокус в комбокс фильтра пользователей вкладки Совещание онлайн" "Закрыть текущую вкладку" ENDIF ; // "Закрыть вкладку Совещание онлайн" : "Выполнить с вкладкой Совещание онлайн" IN aProc "Открыть вкладку Совещание онлайн" "Установить фокус в комбокс фильтра пользователей вкладки Совещание онлайн" "Дать системе перерисоваться" TRY aProc DO FINALLY "Закрыть вкладку Совещание онлайн" END ; // "Выполнить с вкладкой Совещание онлайн" : "Установить фокус в редактор отправленных сообщений" OBJECT VAR "Текущая форма" "Найти окно {(форма::ChatWindow)} по имени" =: "Текущая форма" "Найти контрол {( контрол::HistoryEditor)} на форме {( "Текущая форма" )}" pop:control:SetFocus ; // "Установить фокус в редактор отправленных сообщений" : "Кликаем кнопку в окне чата" IN aControl OBJECT VAR "Кнопка" OBJECT VAR "Текущая форма" "Найти окно {(форма::ChatWindow)} по имени" =: "Текущая форма" "Найти контрол {( aControl )} на форме {( "Текущая форма" )}" =: "Кнопка" "Кнопка" pop:object:IsNil ! 'Не нашли кнопку Восстановить все' ASSERTS "Кнопка" "Кликнуть" ; // "Кликаем кнопку в окне чата" : "Отправить сообщение" "Кликаем кнопку {('bt_enResult_opOkExt')} в окне чата" ; // "Отправить сообщение" : "Отменить отправку сообщений" "Кликаем кнопку {('bt_enResult_opCancel')} в окне чата" ; // "Отменить отправку сообщений" : "Установить фокус в список контактов" OBJECT VAR "Список пользователей" контрол::trContactList:push =: "Список пользователей" "Установить фокус в {("Список пользователей")}" ; // "Установить фокус в список контактов" : "Выбрать первого пользователя, открыть диалог и выполнить" IN aProc @ ( "Добавить пользователя для переписки" ) MODAL ( "Нажать {('Enter')}" ) TRY aProc DO FINALLY "Отменить отправку сообщений" "Открыть историю переписки" "Очистить историю переписки" "Нажать {('Esc')}" "Дать системе перерисоваться" "Установить фокус в список контактов" "Нажать {('Del')}" END ; // "Выбрать первого пользователя, открыть диалог и выполнить" : "Открываем вкладку 'Судебная практика' в синхронном просмотре списка" "Дождаться переключения вкладок" OBJECT VAR "Нужная кнопка" "Найти контрол {('bt_enSynchroView_ShowUserCRList1')} на форме {("Найти главное окно")}" =: "Нужная кнопка" "Нужная кнопка" pop:object:IsNil ! 'Не нашли кнопку Судебная практика' ASSERTS "Нужная кнопка" "Кликнуть" OnTest "Дождаться переключения вкладок" ; // "Открываем вкладку 'Судебная практика' в синхронном просмотре списка" : "Сравнить с эталоном количество найденных в документе вхождений с искомым контекстом" "Убедиться, что фокус в редакторе" "Найти далее без проверки" 'Text' "Форма БП" .TNewBaseSearchForm.FoundCountLabel pop:object:GetStrProp . ; // "Сравнить с эталоном количество найденных в документе вхождений с искомым контекстом" : "Выполнить с развёрнутым полем Регистрация в МЮ" OBJECT IN aProc OBJECT VAR КЗ focused:control:push >>> КЗ 'AT_REG_IN_MU' false КЗ pop:QueryCard:Attribute:SetCollapsed TRY aProc DO FINALLY 'AT_REG_IN_MU' true КЗ pop:QueryCard:Attribute:SetCollapsed END ; // "Выполнить с развёрнутым полем Регистрация в МЮ" : "Удалить пользователя" "Установить фокус в список контактов" "Нажать {('Del')}" ; : "Нажать на пункт главного меню на форме" STRING IN aStr OBJECT IN aForm aStr aForm pop:form:FindMenuItem menuitem:Click ; // "Нажать на пункт главного меню на форме " OBJECT FUNCTION "Найти пункт контекстного меню с именем" OBJECT IN aMenu STRING IN aStr INTEGER VAR l_ItemIndex 0 >>> l_ItemIndex BOOLEAN VAR l_Found false >>> l_Found aMenu menuitem:GetCount раз ( l_ItemIndex aMenu menuitem:GetItem >>> Result Result menuitem:GetCaption aStr SameText >>> l_Found l_Found ? EXIT l_ItemIndex 1 + >>> l_ItemIndex ) ( l_Found ! ) ? ( nil >>> Result ) ; : "Нажать на пункт контекстного меню контрола" STRING IN aStr OBJECT IN aControl // обработки второго и глубже уровней вложенности пунктов меню нет // при необходимости допилим OBJECT VAR l_Menu OBJECT VAR l_Item 10 10 aControl pop:control:GetPopupMenu >>> l_Menu "Найти пункт контекстного меню {(l_Menu)} с именем {(aStr)}" >>> l_Item ( l_Item "НЕ РАВНО" nil ) 'Не нашли пункт контекстного меню' ASSERTS l_Item menuitem:Click ; //"Нажать на пункт контекстного меню контрола" : "Выполнить с документом , открытым в новом окнe Гаранта и переключиться на предыдущее окно" IN aProc IN aDoc VAR l_Main "Сохранить активное окно" >>> l_Main TRY "Открываем {(aDoc)}" "Открыть в новом окне" aProc DO FINALLY l_Main "Восстановить активное окно" END ; // "Выполнить с документом, открытым в новом окнe Гаранта и переключиться на предыдущее окно" : "Поставить галочку в чекбоксе" "Убедиться, что текущий контрол {( 'TvtCheckBox' )}" OBJECT VAR l_CheckBox "Контрол в фокусе" >>> l_CheckBox "Получить состояние чекбокса {(l_CheckBox)}" ! IF "Нажать {('Space')}" ELSE 'Чекбокс уже отмечен!' . ENDIF ; // "Поставить галочку в чекбоксе" : "Выбрать следующее значение в комбобоксе" "Убедиться, что текущий контрол {( 'TvtComboBoxQS' )}" ( "Контрол в фокусе" pop:control:Caption 'Слева' SameStr ) IF ( "Нажать {('Right')}" ) ELSE 'Значение комбобокса не Слева!' . ENDIF ; // "Поставить галочку в чекбоксе" : "Нажать кнопку Восстановить все в Настройке конфигурации" OBJECT VAR "Восстановить все" OBJECT VAR "Модальная форма" "Контрол в фокусе" pop:control:GetAnotherParentForm =: "Модальная форма" "Найти контрол {('bt_enResult_opRestoreAllSettings')} по имени на форме {("Модальная форма")}" >>> "Восстановить все" "Восстановить все" "Кликнуть" ; // "Нажать кнопку Восстановить все в Настройке конфигурации" : "Измерить высоту ноды дерева " OBJECT IN aControl aControl "Высота ноды дерева" . ; // "Измерить высоту ноды дерева " : "Установить фокус в Дерево стилей" "Перевести фокус в {(контрол::f_StyleTreeView)} на форме {(форма::StyleEditorNavigator)}" OnTest ; // "Установить фокус в Дерево стилей" : "Сравнить контекстное меню скроллера контрола с эталоном" OBJECT IN aControl INTEGER VAR X OBJECT VAR Контрол aControl >>> Контрол Контрол "Померить ширину" =: X X 5 - >>> X "Сравнить контекстное меню для контрола {( Контрол )} для точки {( X 25 )} с эталоном" ; // "Сравнить контекстное меню скроллера контрола с эталоном" : "Имитируя интеграцию с MS Word найти контекст в поле " STRING IN aContext STRING IN aQueryCard [[ '' ]] strings:Cat integration:OpenLink ; // "Имитируя интеграцию с MS Word найти контекст в поле " : "Выполнить и нажать Да" IN aProc wait:Yes TRY aProc DO FINALLY waited:? ASSERT END ; // "Выполнить и нажать Да" : "Получить выделенные элементы списка в формате" STRING INTEGER IN aFormat // cc:Copy // - затычка, иначе не будет правильно имя формата в код формата преобразовываться aFormat "Контрол в фокусе" "Сравнить выделенные элементы списка в нужном формате" ; // "Сравнить выделенные элементы списка с эталоном в формате" : "Сравнить выделенные элементы списка с эталоном в формате RTF" "Получить выделенные элементы списка в формате {(ns_ffRTF)}" . ; // "Сравнить выделенные элементы списка с эталоном в формате RTF" : "Ищем строку в эталоне списка" STRING IN aStr STRING VAR Etalon "Получить выделенные элементы списка в формате {(ns_ffRTF)}" >>> Etalon Etalon aStr "Определить позицию найденной строки в эталоне" БОЛЬШЕ 0 IF ( [[ ' Строка: ' aStr ' найдена. ' ]] strings:Cat . EXIT ) ELSE ( [[ ' Строка: ' aStr ' не найдена. ' ]] strings:Cat . ) ENDIF ; // "Ищем строку в эталоне списка" : "Установить курсор по координатам относительно контрола и сравнить с эталоном хинт и контекстное меню" INTEGER IN X INTEGER IN Y OBJECT IN aControl : Действия "Установить курсор мыши по координатам {( X Y )} относительно контрола {(aControl)}" 9 раз ( "Дать системе перерисоваться" 100 SLEEP ) "Сравнить текст хинта с эталоном" "Сравнить контекстное меню для контрола {(aControl)} для точки {( X Y )} с эталоном" ; // Действия "Запомнить позицию мыши и выполнить {(@ Действия)}" ; // "Установить курсор по координатам относительно контрола и сравнить с эталоном хинт и контекстное меню" : "Установить курсор по координатам относительно контрола и сравнить с эталоном его хинт" INTEGER IN X INTEGER IN Y OBJECT IN aControl : Действия "Установить курсор мыши по координатам {( X Y )} относительно контрола {(aControl)}" "Дождаться переключения вкладок" 9 раз ( "Дать системе перерисоваться" 100 SLEEP ) "Сравнить текст хинта с эталоном" ; // Действия "Запомнить позицию мыши и выполнить {(@ Действия)}" ; // "Установить курсор по координатам относительно контрола и сравнить с эталоном его хинт" WORDWORKER "Выполнить с пунктом меню 'показ моих комментариев'" VAR Item 'Документы/Комментарии' "Найти главное окно" pop:form:FindMenuItem =: Item 2 Item menuitem:GetItem =: Item application:ActionIdle Item "Пункт меню видим?" Item WordToWork DO ; // "Выполнить с пунктом меню 'показ моих комментариев'" : "Включить показ моих комментариев" "Выполнить с пунктом меню 'показ моих комментариев'" ( BOOLEAN IN aVisible OBJECT IN anItem aVisible ! ? ( anItem menuitem:Click ) 'Показать мои комментарии' РАВНО ( anItem menuitem:GetCaption ) ASSERT ) ; : "Выключить показ моих комментариев" "Выполнить с пунктом меню 'показ моих комментариев'" ( BOOLEAN IN aVisible OBJECT IN anItem aVisible ? ( anItem menuitem:Click ) 'Скрыть мои комментарии' РАВНО ( anItem menuitem:GetCaption ) ASSERT ) ; : "Сделать с выключенными пользовательскими комментариями" IN aProc "Выключить показ моих комментариев" "Дать системе перерисоваться" TRY aProc DO FINALLY "Включить показ моих комментариев" END ; // "Сделать с выключенными пользовательскими комментариями" : "Имитируя интеграцию с MS Word найти контекст через БП" STRING IN aContext [[ ' 'aContext' ' ]] strings:Cat integration:OpenLink ; // "Имитируя интеграцию с MS Word найти контекст через БП" : "Перевести фокус в дерево советов дня" "Перевести фокус в {('WordsTree')} на форме {(форма::CommonDiction)}" OnTest ; // "Перевести фокус в дерево советов дня" : "Удалить фильтр без закрытия вкладки с именем для" STRING IN aName IN aKZ VAR Сделано НЕТ >>> Сделано INTERFACE VAR l_Node aKZ DO "Открыть фильтры" ПОКА ( НЕ Сделано ) BEGIN контрол::FiltersList:push "Текущая нода дерева" =: l_Node l_Node "Предыдущая нода" IF ДА >>> Сделано ENDIF ( l_Node "Текст ноды" "НЕ РАВНО" aName ) IF "Стрелка вниз" ELSE : Нашли_фильтр "Нажать Del" ; // Нашли_фильтр "Выполнить {(@ Нашли_фильтр )} и нажать Да" ENDIF END ; // "Удалить фильтр без закрытия вкладки с именем для" : "Сделать вкладку Список редакций плавающей" "Сделать вкладку {(контрол::RedactionTree)} на форме {(форма::Redactions)} плавающей" ; : "Сделать вкладку Список редакций неплавающей" "Сделать вкладку {(контрол::RedactionTree)} на форме {(форма::Redactions)} неплавающей" ; : "Стоит ли галочка у элемента дерева" INTEGER IN aNode OBJECT IN aControl INTEGER VAR l_ImageIndex BOOLEAN VAR l_Checked aNode "Узнать индекс иконки в дереве {(aControl)}" >>> l_ImageIndex ( l_ImageIndex РАВНО 11 ) ИЛИ ( l_ImageIndex РАВНО 13 ) ИЛИ ( l_ImageIndex РАВНО 15 ) >>> l_Checked l_Checked IF [[ 'Галочка у редакции ' aNode IntToStr ' ЕСТЬ!' ]] strings:Cat . ELSE [[ 'Галочки у редакции ' aNode IntToStr ' НЕТ!' ]] strings:Cat . ENDIF ; : "Стоит ли галочка у верхней редакции?" "Стоит ли галочка у элемента {(0)} дерева {(контрол::RedactionTree:push)}" ; // "Стоит ли галочка у верхней редакции?" : "Стоит ли галочка у нижней редакции?" INTEGER VAR ItemsCount контрол::RedactionTree:push "Узнать количество элементов дерева" >>> ItemsCount ItemsCount 1 - >>> ItemsCount "Стоит ли галочка у элемента {(ItemsCount)} дерева {(контрол::RedactionTree:push)}" ; // "Стоит ли галочка у нижней редакции?" BOOLEAN FUNCTION IsEven INTEGER IN aValue aValue 2 / 2 * РАВНО aValue >>> Result ; : "См. ежедневный мониторинг законодательства в разделе Новости онлайн" ОМ OBJECT VAR "Рубрикатор" "Перейти по ссылке на {('Мониторинг законодательства')} в области {(контрол::tvLawNews)}" "Контрол в фокусе" "Получить родительскую форму" =: "Рубрикатор" 'NewDocLabel' "Найти контрол по имени на форме {("Рубрикатор")}" "Установить фокус" ASSERT ; : "Установить фокус в рубрикатор" контрол::RubricatorList:push "Установить фокус" 'Не удалось установить фокус в рубрикатор' ASSERTS ; : "Сравнить с эталоном имя последнего фильтра на вкладке Фильтры" // Проверяем, что пользовательский фильтр удалился ОМ "Очистить историю" ППР "Открыть фильтры" "Перейти к концу" "Получить имя текущего элемента дерева {(контрол::FiltersList)}" ; // "Сравнить с эталоном имя последнего фильтра на вкладке Фильтры" : "Установить фокус в контекстный фильтр" "Установить фокус в контекстный фильтр списка Инфарма" ; // "Установить фокус в контекстный фильтр" : "Перевести фокус в поле 'Страна' в КЗ ИнФарма" "Убедиться, что фокус в редакторе" 'AT_PHARM_COUNTRY' "Контрол в фокусе" "Установить фокус в поле КЗ" ; : "Установить фокус в поле 'Орган/Источник' в КЗ ОИЗ" "Убедиться, что фокус в редакторе" 'AT_SOURCE_REVIEW' "Контрол в фокусе" "Установить фокус в поле КЗ" ; : "Узнать, были ли во время фильтрации ошибки" "Узнать, корректен ли контекст (был ли звуковой сигнал)" IF 'Некорретный контекст (звуковой сигнал был)' . ELSE 'Корретный контекст (звукового сигнала не было)' . ENDIF ; // "Узнать, были ли во время фильтрации ошибки" : "Выполнить с вкладкой Список конфигураций" IN aProc "Открыть список конфигураций и перевести туда фокус" "Дать системе перерисоваться" TRY aProc DO FINALLY "Закрыть список конфигураций" END ; // "Выполнить с вкладкой Список конфигураций" : "в поле 'Раздел/Тема' ввести с операцией" STRING IN aStr INTEGER IN aL "Убедиться, что фокус в редакторе" aL 'AT_CLASS' aStr "Контрол в фокусе" "Ввести текст в поле КЗ с операцией" ; : "Ввести контекст первого уровня" STRING IN aContext // специальное слово для выбора контекста первого уровня (для КЗ) "Обработать Enter модально" ( OBJECT VAR Parent "Контрол в фокусе" "Получить родительскую форму" =: Parent "Найти контрол {('InternalEditor')} на форме {( Parent )}" "Установить фокус" "Ввести строку {(aContext)}" "Дождаться переключения вкладок" контрол::AttributeTree:push "Установить фокус" "Перейти к концу" "Нажать {('Enter')}" ) ; // "Ввести контекст первого уровня" : "Узнать позицию вертикального скроллбара у текущего редактора" true "Контрол в фокусе" "Узнать положение скроллера" ; // "Узнать позицию вертикального скроллбара у текущего редактора" : "Узнать позицию вертикального скроллбара у контрола" OBJECT IN aControl true aControl "Узнать положение скроллера" ; // "Узнать позицию вертикального скроллбара у контрола" : "Узнать максимальное положение вертикального скроллбара у текущего редактора" true "Контрол в фокусе" "Узнать максимальное положение скроллера" ; // "Узнать позицию вертикального скроллбара у текущего редактора" : "Убедиться, что вертикальный скроллер контрола прокручен до конца" OBJECT IN aCtrl INTEGER VAR l_Pos INTEGER VAR l_Min INTEGER VAR l_Max INTEGER VAR l_Page true aCtrl "Информация о скроллбаре" >>> l_Max >>> l_Min >>> l_Page >>> l_Pos ( l_Pos "БОЛЬШЕ ИЛИ РАВНО" ( ( l_Max l_Min - ) l_Page - ) ) 'Вертикальный скроллер не в конце!' ASSERTS ; // "Убедиться, что вертикальный скроллер контрола прокручен до конца" : "Перевести фокус в поле 'Информационный блок' в ППР" "Убедиться, что фокус в редакторе" 'AT_BASES' "Контрол в фокусе" "Установить фокус в поле КЗ" ; // "Перевести фокус в поле 'Информационный блок' в ППР" : "Установить фокус на кнопку Типа наследования группы Цвет" 'f_FontForeColorInheritanceButton' "Диалог редактора стилей" "Найти контрол по имени на форме" "Установить фокус" OnTest ; // "Установить фокус на кнопку Типа наследования группы Цвет" : "Установить фокус в комбобокс выбора цвета" 'f_FontForeColorBox' "Измененный диалог редактора стилей" "Найти контрол по имени на форме" "Установить фокус" OnTest ; // "Установить фокус в комбобокс выбора цвета" : "Установить фокус в поле 'E-mail' в ППО" "Убедиться, что фокус в редакторе" 'AT_EMAIL' "Контрол в фокусе" "Установить фокус в поле КЗ" ; // "Установить фокус в поле 'E-mail' в ППО" : "Потянуть вертикальный скроллер контрола вверх" OBJECT IN aControl aControl pop:control:VScrollerVisible 'У контрола нет вертикального скроллбара' ASSERTS VAR X VAR Y VAR Yy // Получаем верхний правый угол контрола "Померить ширину {(aControl)}" >>> X "Померить высоту {(aControl)}" >>> Y Y >>> Yy // Переводим в координаты экрана "Привести координаты {( @ X @ Y )} для контрола {(aControl)} к экранным" // поправка на размер скроллера. Надо бы GetSystemMetrics использовать...или как там его X 10 - >>> X Y 50 - >>> Y : Тянем_потянем "Установить курсор мыши по координатам {(X Y)}" Y ( Yy 80 - ) - >>> Y THREAD ( "Зажать левую кнопку мыши" "Установить курсор мыши по координатам {(X Y)}" "Отпустить левую кнопку мыши" ) 50 SLEEP ; "Запомнить позицию мыши и выполнить {(@ Тянем_потянем)}" ; // "Потянуть вертикальный скроллер контрола вверх" : "Создать фильтр и выполнить с ним , а потом удалить" OBJECT IN Действия : aFilter "Полный путь скрипта" "Имя скрипта" ; : Сохраняем_фильтр "Дождаться переключения вкладок" "Ввести строку {(aFilter)}" Действия DO "Нажать Ok" ; // Сохраняем_фильтр : Создаем_фильтр @ ( "Нажать Ok" ) MODAL ( Сохраняем_фильтр ) ; // Создаем_фильтр ППР "Открыть фильтры" @ ( "Создать новый фильтр" ) MODAL ( Создаем_фильтр ) ППР "Дождаться переключения вкладок" "Открыть фильтры" 5 раз ( 200 SLEEP OnTest ) "Удалить фильтр с именем {(aFilter)}" ; // "Создать фильтр и выполнить с ним а потом удалить : "Свернуть и сразу развернуть главное окно" "Дождаться переключения вкладок" OBJECT VAR Главное_окно "Найти главное окно" >>> Главное_окно THREAD ( 5 раз ( 100 SLEEP OnTest ) "Развернуть окно {(Главное_окно)}" ) "Свернуть окно {(Главное_окно)}" 20 раз ( 100 SLEEP OnTest ) "Дождаться переключения вкладок" ; // "Свернуть и сразу развернуть главное окно" : "Выполнить с вкладкой Журнал работы" IN aProc "Открыть журнал работы" "Развернуть текущее дерево" "Дождаться переключения вкладок" TRY aProc DO FINALLY "Закрыть журнал работы" END ; // "Выполнить с вкладкой Журнал работы" BOOLEAN FUNCTION "Узнать, активна ли кнопка Найти в панели БП?" 'Enabled' "Форма БП" .TNewBaseSearchForm.FindBtn pop:object:GetOrdProp РАВНО 1 >>> Result ; : "Выделена ли нода дерева ?" INTEGER IN aNode OBJECT IN aControl aNode aControl "Узнать, выделена ли нода дерева?" . ; // "Выделена ли нода дерева ?" : "Отделить текст в эталоне" '----------' . ; // "Отделить текст в эталоне" : "Открыть гиперссылку в новом окне, выполнить в нём и переключиться на предыдущее окно" IN aProc VAR l_Main "Сохранить активное окно" >>> l_Main TRY "Открыть гиперссылку в новом окне" aProc DO FINALLY l_Main "Восстановить активное окно" END ; // "Открыть гиперссылку в новом окне, выполнить в нём и переключиться на предыдущее окно" : "Установить фокус в поле 'Дата принятия С' " "Убедиться, что фокус в редакторе" 'AT_PUBLISHING_DATE' "Контрол в фокусе" "Установить фокус в поле КЗ" ; : "в поле 'Международное наименование' ввести" STRING IN aStr "Убедиться, что фокус в редакторе" 'AT_PHARM_INTERNATIONAL_NAME' aStr "Контрол в фокусе" pop:QueryCard:SetAttribute ; : "Проверить, что введено в контексный фильтр левого навигатора" OBJECT VAR "Контекстный фильтр" "Найти контрол {('InternalEditor')} на форме {("Левый навигатор")}" =: "Контекстный фильтр" "Контекстный фильтр" "Заголовок контрола" . ; // "Проверить, что введено в контексный фильтр левого навигатора" : "Проверить, выделен ли элемент в контроле класса TvtLister" IN aNum IN aControl OBJECT VAR Lister "Найти контрол {(aControl)} на форме {("Найти главное окно")}" >>> Lister aNum Lister "Узнать, выделен ли элемент в списке" IF [[ 'Элемент ' aNum IntToStr ' выделен!' ]] strings:Cat . ELSE [[ 'Элемент ' aNum IntToStr ' не выделен!' ]] strings:Cat . ENDIF ; //"Проверить, выделен ли элемент в контроле " : "Выбрать в дереве атрибутов контекст" STRING IN aString @ ( "Нажать {('Enter')}" ) MODAL ( ( "Перейти по ссылке {( aString )} в дереве {(контрол::AttributeTree)}" ) ) ; // "Выбрать в дереве атрибутов контекст" : "Установить фокус в поле 'Раздел/Тема' " "Убедиться, что фокус в редакторе" 'AT_CLASS' "Контрол в фокусе" "Установить фокус в поле КЗ" ; // "Установить фокус в поле 'Раздел/Тема' " : "Выполнить с включёнными метками на саб-панели" IN aProc "Показывать метки" TRY aProc DO FINALLY "Перевести фокус в текст" "Показывать метки" END ; // "Выполнить с включёнными метками на саб-панели" : "Выполнить для проверки скрипта " IN aProc IN aNum : Действия "Открываем {(3000)}" aNum раз ( "Перейти к следующей ссылке" ) "Перейти по текущей ссылке" 'Запускаем скрипт по ссылке:' . "Сравнить текущий список с эталоном" "Отделить текст в эталоне" "Дождаться переключения вкладок" : скрипт 'Запускаем скрипт вручную:' . aProc DO ; // скрипт @ скрипт RunSearch "Сравнить текущий список с эталоном" ; // Действия "Выполнить {(@ Действия)} с базой {('scripts')}" ; // "Выполнить для проверки скрипта " : "Проверка, закрылся ли баллон 'Информация об изменениях' " "Открываем НК" "В документе не должно быть комментариев" 6 раза ( "Перейти на параграф вниз" ) "Переместиться в начало строки" "Выделить слово справа" "Контрол в фокусе" "Выделенный текст редактора" "Заменить непечатаемые символы" РАВНО 'Часть ' ! IF 'Вероятно, не закрылся баллон Информация об изменениях!' . ENDIF ; // "Проверка, закрылся ли баллон 'Информация об изменениях' " : "Установить курсор мыши на ссылку 'информация об изменениях' в НК" VAR Editor VAR x VAR y "Открываем НК" "Контрол в фокусе" >>> Editor Editor pop:editor:ParaMiddleCoordsToScreen >>> y >>> x y 80 + >>> y x y "Установить курсор мыши по координатам" "Узнать индекс курсора мыши" "Узнать имя индекс курсора мыши" РАВНО 'crHandPoint' ! IF 'Не попали на ссылку Информация об изменениях! Тест прератил работу!' . HALT ENDIF ; // "Установить курсор мыши на ссылку 'информация об изменениях' в НК" : "Сравнить с эталоном курсор мыши и хинт над выделенной сссылкой" : Действия VAR x VAR y "Контрол в фокусе" pop:editor:CursorCoordsToScreen >>> y >>> x y 18 - >>> y x 30 - >>> x x y "Установить курсор мыши по координатам" 9 раз ( "Дать системе перерисоваться" 100 SLEEP ) [[ 'Курсор: ' "Узнать индекс курсора мыши" "Узнать имя индекс курсора мыши" ]] strings:Cat . [[ 'Хинт: ' "Узнать текущий хинт" ]] strings:Cat . ; // Действия "Запомнить позицию мыши и выполнить {(@ Действия )}" ; // "Сравнить с эталоном курсор мыши и хинт над выделенной сссылкой" : "Выполнить с зажатой клавишей" IN aProc STRING IN aString TRY "Зажать кнопку {(aString)}" aProc DO FINALLY "Отпустить кнопку {(aString)}" END ; // "Выполнить с зажатой клавишей" : "Открываем вкладку 'Справка к документу' в синхронном просмотре списка" "Дождаться переключения вкладок" OBJECT VAR "Нужная кнопка" "Найти контрол {('bt_enSynchroView_ShowRelated')} на форме {("Найти главное окно")}" =: "Нужная кнопка" "Нужная кнопка" "Узнать, существует ли объект" ! 'Не нашли кнопку Справка к документу' ASSERTS "Нужная кнопка" "Кликнуть" ; // "Открываем вкладку 'Справка к документу' в синхронном просмотре списка" : "Кликаем кнопку на тулбаре" IN aControl "Дождаться переключения вкладок" OBJECT VAR "Нужная кнопка" "Найти контрол {(aControl)} на форме {("Найти главное окно")}" =: "Нужная кнопка" "Нужная кнопка" "Кликнуть" ; // "Кликаем кнопку на тулбаре" : "Путь до контрола: раз вниз, раз Tab" IN aNumDown IN aNumTab aNumDown ( "Стрелка вниз" ) aNumTab ( "Нажать {('Tab')}" ) ; // "Путь до контрола: раз вниз, раз Tab" : "Проверка хинта для контрола" OBJECT IN aControl : Действия "Установить курсор мыши по координатам {( 5 5 )} относительно контрола {(aControl)}" "Дождаться переключения вкладок" 9 раз ( "Дать системе перерисоваться" 100 SLEEP ) "Узнать, виден ли хинт" IF 'Хинт:' . "Сравнить текст хинта с эталоном" ELSE 'Хинта нет.' . ENDIF ; // Действия "Запомнить позицию мыши и выполнить {(@ Действия)}" ; // "Проверка хинта для контрола" : "Сохраняем объект в папку Мои документы с именем " STRING IN aName : Действия "Ввести строку {(aName)}" OBJECT VAR "Форма сохранения в МД" OBJECT VAR "Кнопка ОК" "Контрол в фокусе" 2 раза "Получить родительскую форму" =: "Форма сохранения в МД" "Форма сохранения в МД" "Узнать, существует ли объект" ! 'Не нашли форму сохранения в МД' ASSERTS 'bt_enResult_opOk' "Форма сохранения в МД" "Найти контрол по имени на форме" =: "Кнопка ОК" "Кнопка ОК" "Кликнуть" ; // Действия 3 раза "Дождаться переключения вкладок" @ ( "Сохранить в Мои документы" ) MODAL ( Действия ) ; // "Сохраняем объект в папку Мои документы с именем " .... USES WordsTranslation.script WordsTuning.script SysUtils.script Mouse.script Editor.script Controls.script Forms.script HLTCLike.script ; : "Сравнить с эталоном текст редактора " OBJECT IN aControl aControl "Установить фокус" "Дождаться переключения вкладок" "Выделить всё" "Сравнить выделенный текст текущего редактора с эталоном" ; // "Сравнить с эталоном текст редактора" : "Вывести в эталон размеры и координаты контрола с округлением до " OBJECT IN aControl IN aNum VAR L VAR T VAR W VAR H ( ( aControl "Померить отступ слева" aNum / ) aNum * ) >>> L [[ 'Left = ' L IntToStr ]] strings:Cat . ( ( aControl "Померить отступ сверху" aNum / ) aNum * ) >>> T [[ 'Top = ' T IntToStr ]] strings:Cat . ( ( aControl "Померить ширину" aNum / ) aNum * ) >>> W [[ 'Width = ' W IntToStr ]] strings:Cat . ( ( aControl "Померить высоту" aNum / ) aNum * ) >>> H [[ 'Height = ' H IntToStr ]] strings:Cat . ; // "Получить размеры и координаты контрола" : "Вывести в эталон размеры контрола с округлением до " OBJECT IN aControl IN aNum VAR W VAR H ( ( aControl "Померить ширину" aNum / ) aNum * ) >>> W [[ 'Width = ' W IntToStr ]] strings:Cat . ( ( aControl "Померить высоту" aNum / ) aNum * ) >>> H [[ 'Height = ' H IntToStr ]] strings:Cat . ; // "Сравнить с эталоном размеры контрола" : "Аккуратно сравнить с эталоном целочисленное свойство объекта" STRING IN aProp OBJECT IN anObj aProp anObj pop:object:HasProp ? ( STRING VAR l_Value aProp anObj pop:object:GetOrdProp IntToStr >>> l_Value [[ aProp ': ' l_Value ]] strings:Cat . ) ; : "Аккуратно сравнить с эталоном объектное свойство объекта" STRING IN aProp OBJECT IN anObj aProp anObj pop:object:HasProp ? ( STRING VAR l_Value aProp anObj pop:object:GetObjProp pop:object:IsNil IF 'nil' ELSE 'assigned' ENDIF >>> l_Value [[ aProp ': ' l_Value ]] strings:Cat . ) ; : "Аккуратно сравнить с эталоном целочисленные свойства объекта" IN anOrdProps OBJECT IN anObj INTEGER VAR l_Loop 0 >>> l_Loop anOrdProps array:Count раз ( "Аккуратно сравнить с эталоном целочисленное свойство {( l_Loop anOrdProps [i] )} объекта {(anObj)}" l_Loop 1 + >>> l_Loop ) ; : "Проверить расширенно параметры и контекстное меню контролов, содержимое тулбаров для формы" BOOLEAN IN aToolbar STRING IN aForm OBJECT FUNCTION "Форма от которой начинаем перебор" "Найти окно по имени {(aForm)}" =: Result ; : Действия_с_контролом OBJECT IN aCtrl aCtrl "Узнать, существует ли объект" ! IF ( 'TvcmDockPanel' aCtrl pop:object:Inherits ) ИЛИ ( 'TvcmToolButtonDef' aCtrl pop:object:Inherits ) ИЛИ ( 'TvcmDockDef' aCtrl pop:object:Inherits ) ИЛИ ( 'TvcmToolbar' aCtrl pop:object:Inherits ) ИЛИ ( aCtrl "Узнать имя контрола" РАВНО '' ) IF EXIT ELSE ( aCtrl ЯВЛЯЕТСЯ class::Ten_MainMenuNew ) IF 'en_MainMenuNew : Ten_MainMenuNew' . aCtrl "Заголовок контрола" . // такая вот заплатка, чтобы не получать разницы с эталоном из-за разного номера en_MainMenuNew ELSE aCtrl . ( aCtrl "Имя компонента" РАВНО контрол::ShellInfoLabel ) ИЛИ ( aCtrl "Имя компонента" РАВНО 'dD1EqD2' ) ИЛИ ( aCtrl "Имя компонента" РАВНО 'dD1Only' ) ИЛИ ( aCtrl "Имя компонента" РАВНО 'dD2Only' ) ИЛИ ( aCtrl "Имя компонента" РАВНО 'dD1' ) ИЛИ ( aCtrl "Имя компонента" РАВНО 'dD2' ) ИЛИ ( aCtrl "Имя компонента" РАВНО контрол::trContactList ) IF 'Заголовок не сравниваем' . ELSE aCtrl "Заголовок контрола" . ENDIF // заголовок контрола ENDIF // исключаю MainMenuNew ( 'TPanel' aCtrl pop:object:Inherits ) ИЛИ ( aCtrl ЯВЛЯЕТСЯ class::TvtPanel ) ИЛИ ( aCtrl ЯВЛЯЕТСЯ class::TnscEditor ) IF "Аккуратно сравнить с эталоном целочисленные свойства {( [[ 'BevelWidth' 'BorderStyle' 'BevelOuter' 'BevelInner' ]] )} объекта {(aCtrl)}" ENDIF ( aCtrl "Перейти к родительской форме" "Узнать, существует ли объект" ) И ( aCtrl "Форма от которой начинаем перебор" ?== ) IF // ( aCtrl pop:control:GetMainForm aCtrl ?== ) IF 'Position:' 'Position' aCtrl "Узнать численную переменную объекта" IntToStr Cat . // "Сравнить с эталоном размеры контрола {(aCtrl)}" "Вывести в эталон размеры контрола {(aCtrl)} с округлением до {(5)}" ELSE // "Получить размеры и координаты контрола {(aCtrl)}" "Вывести в эталон размеры и координаты контрола {(aCtrl)} с округлением до {(5)}" ENDIF // исключаем координаты "Аккуратно сравнить с эталоном целочисленные свойства {( [[ 'TabOrder' 'ImageIndex' 'TabStop' 'Align' 'Anchors' 'BorderWidth' 'ReadOnly' ]] )} объекта {(aCtrl)}" "Аккуратно сравнить с эталоном объектное свойство {('Images')} объекта {(aCtrl)}" ( aCtrl ЯВЛЯЕТСЯ class::TvtLabel ) IF "Аккуратно сравнить с эталоном целочисленное свойство {('Transparent')} объекта {(aCtrl)}" ENDIF // Transparent ( aCtrl ЯВЛЯЕТСЯ class::TnscTreeView ) ИЛИ ( aCtrl ЯВЛЯЕТСЯ class::TnscEditor ) IF 'Вертикальный скроллер:' aCtrl "Узнать, есть ли у контрола вертикальный скроллер" ToPrintable Cat . 'Горизонтальный скроллер:' aCtrl "Узнать, есть ли у контрола горизонтальный скроллер" ToPrintable Cat . ENDIF // скроллеры для деревьев и редакторов ( 'Ttb97MoreButton' aCtrl pop:object:Inherits ) IF 'Не сравниваем контекстное меню' . ELSE "Сравнить контекстное меню для контрола {(aCtrl)} для точки {( 0 0 )} с эталоном" ENDIF // исключаем контекстное меню для Ttb97MoreButton aCtrl ЯВЛЯЕТСЯ class::TnscEditor IF '--- Текст редактора: ---' . "Сравнить с эталоном текст редактора {(aCtrl)}" ENDIF ENDIF // исключаем TvcmDockPanel '---------------' . ENDIF // проверка контрола ; // Действия_с_контролом '--------------- Контрол в фокусе: ------------------' . "Контрол в фокусе" . '--------------- Перечень дочерних контролов, их размеры, координаты и контекстное меню: -------------------' . 'Форма:' . "Аккуратно сравнить с эталоном целочисленное свойство {('BorderStyle')} объекта {("Форма от которой начинаем перебор")}" '---------------' . "выполнить для всех контролов {("Форма от которой начинаем перебор")}" Действия_с_контролом aToolbar ? ( '--------------- Содержимое тулбаров: -------------------' . "Сравнить содержимое тулбаров с эталоном полностью" ) ; // "Проверить расширенно параметры и контекстное меню контролов, содержимое тулбаров для окна : "Проверить параметры и контекстное меню контролов, содержимое тулбаров для формы" STRING IN aForm "Проверить расширенно параметры и контекстное меню контролов, содержимое тулбаров {(true)} для формы {(aForm)}" ; // "Проверить параметры и контекстное меню контролов, содержимое тулбаров для формы" : "Проверить параметры и контекстное меню контролов для формы" STRING IN aForm "Проверить расширенно параметры и контекстное меню контролов, содержимое тулбаров {(false)} для формы {(aForm)}" ; // "Проверить параметры и контекстное меню контролов для формы" : "Подготовить окно Гаранта (запомнить состояние и размеры) к сравнению формы с эталоном и выполнить для ее открытия и сравнения " STRING IN aForm OBJECT IN aProc : Сравнить_контролы_и_их_контекстные_меню_с_эталоном aProc DO ; // Сравнить_контролы_и_их_контекстные_меню_с_эталоном : Установить_размеры_окну "Выставить форме размеры {( 1150 800 )} и {(@ Сравнить_контролы_и_их_контекстные_меню_с_эталоном )}" ; // Установить_размеры_окну "Восстановить все настройки текущей конфигурации" "Сделать {(@ Установить_размеры_окну )} с изменением состояния и размеров окна {("Найти главное окно")}" ; // "Подготовить окно Гаранта (запомнить состояние и размеры) к сравнению формы с эталоном и выполнить для ее открытия и сравнения " : "Сравнить содержимое тулбара на форме с эталоном" STRING IN aForm : Действия OBJECT IN aObj ( aObj ЯВЛЯЕТСЯ class::TvcmToolbar ) ? ( ( aObj pop:control:Visible И ( aObj pop:control:ControlCount БОЛЬШЕ 1 ) ) ? ( aObj . 'Order = ' 'DockRow' aObj pop:object:GetOrdProp IntToStr Cat . '---------------' . aObj EnumerateControls ( OBJECT IN aControl ( aControl "НЕ ЯВЛЯЕТСЯ" class::Ttb97MoreButton ) ? ( aControl . ( aControl "НЕ ЯВЛЯЕТСЯ" class::TvcmComboBox ) ? ( aControl pop:control:Caption . 'Активность:' aControl "Убедиться, что контрол активен" ToPrintable Cat . '---' . ) ) ) '' . ) ) ; OBJECT VAR work_form "Найти окно по имени {(aForm)}" >>> work_form work_form "выполнить для всех контролов" Действия ; // "Сравнить содержимое тулбара на форме с эталоном" : "Сделать в обеих конфигурациях" OBJECT IN Действия Действия DO '*********------------Расширенная конфигурация:---------------********' . ОМ "Сделать {(Действия)} в расширенной конфигурации" ; /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// STRING FUNCTION "пробелов" INTEGER IN aCount aCount ' ' char:Dupe >>> Result ; : "Аккуратно сравнить с эталоном целочисленное свойство объекта с отступом" STRING IN aProp OBJECT IN anObj INTEGER IN aLevel STRING VAR l_Indent "{(aLevel)} пробелов" >>> l_Indent aProp anObj pop:object:HasProp ? ( STRING VAR l_Value aProp anObj pop:object:GetOrdProp IntToStr >>> l_Value [[ l_Indent aProp ': ' l_Value ]] strings:Cat . ) ; : "Аккуратно сравнить с эталоном объектное свойство объекта с отступом" STRING IN aProp OBJECT IN anObj INTEGER IN aLevel STRING VAR l_Indent "{(aLevel)} пробелов" >>> l_Indent aProp anObj pop:object:HasProp ? ( STRING VAR l_Value aProp anObj pop:object:GetObjProp pop:object:IsNil IF 'nil' ELSE 'assigned' ENDIF >>> l_Value [[ l_Indent aProp ': ' l_Value ]] strings:Cat . ) ; : "Аккуратно сравнить с эталоном целочисленные свойства объекта с отступом" IN anOrdProps OBJECT IN anObj INTEGER IN aLevel INTEGER VAR l_Loop 0 >>> l_Loop anOrdProps array:Count раз ( "Аккуратно сравнить с эталоном целочисленное свойство {( l_Loop anOrdProps [i] )} объекта {(anObj)} с отступом {(aLevel)}" l_Loop 1 + >>> l_Loop ) ; : "Вывести в эталон размеры и координаты контрола с округлением до и отступом" OBJECT IN aControl INTEGER IN aNum INTEGER IN aLevel VAR L VAR T VAR W VAR H STRING VAR l_Indent "{(aLevel)} пробелов" >>> l_Indent ( ( aControl "Померить отступ слева" aNum / ) aNum * ) >>> L [[ l_Indent 'Left: ' L IntToStr ]] strings:Cat . ( ( aControl "Померить отступ сверху" aNum / ) aNum * ) >>> T [[ l_Indent 'Top: ' T IntToStr ]] strings:Cat . ( ( aControl "Померить ширину" aNum / ) aNum * ) >>> W [[ l_Indent 'Width: ' W IntToStr ]] strings:Cat . ( ( aControl "Померить высоту" aNum / ) aNum * ) >>> H [[ l_Indent 'Height: ' H IntToStr ]] strings:Cat . ; // "Получить размеры и координаты контрола" : "Сравнить с эталоном свойства контрола с отступом" OBJECT IN aControl INTEGER IN aLevel STRING VAR l_Indent "{(aLevel)} пробелов" >>> l_Indent ( aControl ЯВЛЯЕТСЯ class::TCustomForm ) И ( aControl pop:control:GetParent pop:object:IsNil ) IF "Аккуратно сравнить с эталоном целочисленное свойство {('Position')} объекта {(aControl)} с отступом {(aLevel)}" ELSE "Вывести в эталон размеры и координаты контрола {(aControl)} с округлением до {(5)} и отступом {(aLevel)}" ENDIF "Аккуратно сравнить с эталоном целочисленные свойства {( [['BevelWidth' 'BorderStyle' 'BevelOuter' 'BevelInner' 'TabOrder' 'ImageIndex' 'TabStop' 'Align' 'Anchors' 'BorderWidth' 'ReadOnly' 'Transparent' ]] )} объекта {(aControl)} с отступом {(aLevel)}" "Аккуратно сравнить с эталоном объектное свойство {('Images')} объекта {(aControl)} с отступом {(aLevel)}" ( aControl ЯВЛЯЕТСЯ class::TnscTreeView ) ИЛИ ( aControl ЯВЛЯЕТСЯ class::TnscEditor ) ? ( [[ l_Indent 'Вертикальный скроллер: ' "Узнать, есть ли у контрола {(aControl)} вертикальный скроллер" ToPrintable ]] strings:Cat . [[ l_Indent 'Горизонтальный скроллер: ' "Узнать, есть ли у контрола {(aControl)} горизонтальный скроллер" ToPrintable ]] strings:Cat . ) ( aControl ЯВЛЯЕТСЯ 'Ttb97MoreButton' ) IF l_Indent 'Не сравниваем контекстное меню' Cat . ELSE l_Indent 'Контекстное меню:' Cat . "Сравнить контекстное меню для контрола {(aControl)} для точки {( 0 0 )} с эталоном" l_Indent ';' Cat . ENDIF // исключаем контекстное меню для Ttb97MoreButton ( aControl ЯВЛЯЕТСЯ class::TnscEditor ) IF '--- Текст редактора: ---' . "Сравнить с эталоном текст редактора {(aControl)}" ENDIF ; FORWARD "Сравнить с эталоном контрол с отступом" : "Сравнить с эталоном контрол с отступом" OBJECT IN aControl INTEGER IN aLevel STRING VAR l_Indent "{(aLevel)} пробелов" >>> l_Indent l_Indent aControl ToPrintable Cat . "Сравнить с эталоном свойства контрола {(aControl)} с отступом {( 1 aLevel + )}" ( aControl ЯВЛЯЕТСЯ class::TWinControl ) ? ( ARRAY l_ControlsArray : FillArray OBJECT IN aChildControl aChildControl >>>[] l_ControlsArray ; aControl EnumerateControls FillArray INTEGER VAR l_Loop 0 >>> l_Loop l_ControlsArray array:Count раз ( "Сравнить с эталоном контрол {( l_Loop l_ControlsArray [i] )} с отступом {( 1 aLevel + )}" 1 l_Loop + >>> l_Loop ) ) l_Indent ';' Cat . ; : "По-новому сравнить с эталоном форму" OBJECT IN aForm "Сравнить с эталоном контрол {(aForm)} с отступом {(0)}" ; 'aContext' 'aContext'
Блог человека, который 18-ть лет программирует на Delphi. И 25 лет программирует вообще. VCL, UML, MDA, тесты. Это не "учебник", это - "заметки на полях".
Там ещё "не совсем по-русски", но уже "не совсем" FORTH... Что - показательно...
ОтветитьУдалитьА удобно ли переключать раскладку клавиатуры туда-сюда? Ведь код на двух языках по сути.
ОтветитьУдалить1. "ПРОМЕЖУТОЧНЫЙ" словарь. Это - ВАЖНО. ПРОМЕЖУТОЧНЫЙ. НЕ для "конечных тестировщиков". Хотя, волей случая, "конечные тестировщики" являются и "РАЗРАБОТЧИКАМИ".
Удалить2. Punto Switcher - для "совсем ленивых".
3. Я ЛИЧНО и без Punto Switcher - обхожусь. "Cut'n'Paste".
4. СМЕШЕНИЕ языков - это КРИТЕРИЙ того, что "в коде что-то не так". СМЕШЕНИЕ "хорошо" ЛИШЬ для ПРОМЕЖУТОЧНОГО словаря.
Не хватает какой-то общей инструкции для добавления новых слов. По-этому получается немного запутанно и витиевато.
ОтветитьУдалитьАндрей, эта "инструкция" называется "применение шаблонов (паттернов) проектирования для построения тестов". Её физически - ДЕЙСТВИТЕЛЬНО нет. Пока. Она "размазана" по "умам разработчиков". И по вашему - в частности. Хорошо бы конечно, чтобы ОНА - БЫЛА. И это - следующий этап. "Нет ничего невозможного для людей с интеллектом" :-)
УдалитьЧасть "инструкции", касающейся "его" проекта, Дима вам сегодня кстати изобразил. Остаётся для начала только взять и записать её. Именно как инструкцию. А далее - следовать ей, дополнять и развивать. Ну и может быть - ПЕРЕСМАТРИВАТЬ. По мере необходимости. Если такая - возникнет.
Удалить