пятница, 18 октября 2013 г.

Почти полный "промежуточный" словарь "тестов по-русски"

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
 [[  '
  
   
     'aContext'
   
  '
 ]] 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'
    
   
     '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)}"
;

6 комментариев:

  1. Там ещё "не совсем по-русски", но уже "не совсем" FORTH... Что - показательно...

    ОтветитьУдалить
  2. А удобно ли переключать раскладку клавиатуры туда-сюда? Ведь код на двух языках по сути.

    ОтветитьУдалить
    Ответы
    1. 1. "ПРОМЕЖУТОЧНЫЙ" словарь. Это - ВАЖНО. ПРОМЕЖУТОЧНЫЙ. НЕ для "конечных тестировщиков". Хотя, волей случая, "конечные тестировщики" являются и "РАЗРАБОТЧИКАМИ".
      2. Punto Switcher - для "совсем ленивых".
      3. Я ЛИЧНО и без Punto Switcher - обхожусь. "Cut'n'Paste".
      4. СМЕШЕНИЕ языков - это КРИТЕРИЙ того, что "в коде что-то не так". СМЕШЕНИЕ "хорошо" ЛИШЬ для ПРОМЕЖУТОЧНОГО словаря.

      Удалить
  3. Не хватает какой-то общей инструкции для добавления новых слов. По-этому получается немного запутанно и витиевато.

    ОтветитьУдалить
    Ответы
    1. Андрей, эта "инструкция" называется "применение шаблонов (паттернов) проектирования для построения тестов". Её физически - ДЕЙСТВИТЕЛЬНО нет. Пока. Она "размазана" по "умам разработчиков". И по вашему - в частности. Хорошо бы конечно, чтобы ОНА - БЫЛА. И это - следующий этап. "Нет ничего невозможного для людей с интеллектом" :-)

      Удалить
    2. Часть "инструкции", касающейся "его" проекта, Дима вам сегодня кстати изобразил. Остаётся для начала только взять и записать её. Именно как инструкцию. А далее - следовать ей, дополнять и развивать. Ну и может быть - ПЕРЕСМАТРИВАТЬ. По мере необходимости. Если такая - возникнет.

      Удалить