среда, 2 сентября 2015 г.

#1134. Коротко. Делаем тесты к скриптовым словам №2

Предыдущая серия была тут - Делаем тесты к скриптовым словам.

Я немножко доработал запуск тестов и вместо "вязанки":

USES
 Documentation.ms.dict
 string.ms.dict
 Testing.ms.dict
;
 
RunTests (+)?
 %REMARK 'Запускаем "стандартные тесты" для слова (+)?'
RunTests ?(+)
 %REMARK 'Запускаем "стандартные тесты" для слова ?(+)'
RunTests strings:CatSep>
 %REMARK 'Запускаем "стандартные тесты" для слова strings:CatSep>'
RunTests any:Cat
 %REMARK 'Запускаем "стандартные тесты" для слова any:Cat'

Получил вызов всех тестов одной строчкой:

USES
 string.ms.dict
 Testing.ms.dict
;

RunTests.in.array @[ (+)? ?(+) strings:CatSep> any:Cat ]
 %REMARK 'Запускаем тесты к указанным скриптовым словам'


А сделано всё это через некоторую "магию" (ну если она конечно интересна):

// Testing.ms.dict

MACRO RunTests.in.array
 ARRAY RIGHT IN aWords
  %REMARK 'aWords ссылка на список слов справа от RunTests'
 %SUMMARY 'Выполняет тесты для списка слов aWords' ;
 ( aWords |^@ DO ) DoRunTestsA
; // RunTests.in.array

// DogAndBracket.ms.dict

USES
 axiom:Tl3TokenType
 axiom_push.ms.dict
 core.ms.dict
 io.ms.dict
 macro.ms.dict
 NoCapsLock.ms.dict
 params.ms.dict
 arrays.ms.dict
;

INTEGER String TYPE TOKEN
INTEGER TYPE TOKEN_TYPE
 // - вообще говоря это дложен быть Tl3TokenType, но там проблема с проверкой типов

Procedure axiom:Push
 TOKEN in aSymbol
 TOKEN_TYPE in aTokenType

 aTokenType Case
  Tl3TokenType::l3_ttSymbol 
   ( aSymbol Ctx:Parser:PushSymbol )
  Tl3TokenType::l3_ttString 
   ( aSymbol Ctx:Parser:PushString )
  Tl3TokenType::l3_ttInteger
   ( aSymbol Ctx:Parser:PushInt )
  Default 
   ( Error [ 'Неожиданный тип токена: ' aTokenType Tl3TokenType:ValueToName ] )
 end // aTokenType Case
; // axiom:Push 

Procedure DogAndBracket
 String in aBracketOpen
 String in aBracketClose
 INTERFACE var l_Parser 
 Ctx:Parser >>> l_Parser
 ARRAY var l_A
 l_A := [ ]

 l_Parser pop:Parser:NextToken
 while true
 begin
  String var l_Token
  l_Parser pop:Parser:TokenLongString >>> l_Token
  TOKEN_TYPE var l_TokenType
  l_Parser pop:Parser:TokenType >>> l_TokenType
  if ( l_TokenType = Tl3TokenType::l3_ttSymbol ) then
  begin

   ( l_Token = NameOf ( ) ?Fail 'Вложенные скобки пока не поддерживаются'
   ( l_Token = NameOf [ ) ?Fail 'Вложенные скобки пока не поддерживаются'

   if ( l_Token = aBracketClose ) then
   begin
    aBracketOpen Ctx:Parser:PushSymbol
    l_A .slice> 2 .for> 
    begin
     TOKEN in aSymbol
     TOKEN_TYPE in aTokenType
     axiom:PushSymbol @ 
     aSymbol aTokenType axiom:Push 
    end
    l_Token Ctx:Parser:PushSymbol 
    break
   end //l_Token = aBracketClose
  end // l_TokenType = Tl3TokenType::l3_ttSymbol
  if ( l_TokenType = Tl3TokenType::l3_ttInteger ) then
  begin
   l_Parser pop:Parser:TokenInt >>>[] l_A
  end // l_TokenType = Tl3TokenType::l3_ttInteger
  else
  begin
   l_Token >>>[] l_A
  end // l_TokenType = Tl3TokenType::l3_ttInteger
  l_TokenType >>>[] l_A
  l_Parser pop:Parser:NextToken
 end // while true
; // DogAndBracket

MACRO @(
 NameOf (
  NameOf ) 
   DogAndBracket
; // @(

MACRO @[
 NameOf [
  NameOf ]
   DogAndBracket
; // @[

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

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