Предыдущая серия была тут - Делаем тесты к скриптовым словам.
Я немножко доработал запуск тестов и вместо "вязанки":
Получил вызов всех тестов одной строчкой:
А сделано всё это через некоторую "магию" (ну если она конечно интересна):
Я немножко доработал запуск тестов и вместо "вязанки":
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 ; // @[
Комментариев нет:
Отправить комментарий