PROGRAM Etalon.ms.script
USES
axiom_push.ms.dict
;
USES
io.ms.dict
;
USES
DumpStack.ms.dict
;
USES
SaveVarAndDo.ms.dict
;
USES
Testing.ms.dict
;
USES
CompileTimeVar.ms.dict
;
Test&Dump Etalon.ms.script.test
FILE VAR g_OutFile
%REMARK 'Текущий файл'
( nil >>> g_OutFile )
INTEGER VAR g_EtalonLevel
( 0 >>> g_EtalonLevel )
ARRAY VAR g_EtalonPath
( [ 0 ] >>> g_EtalonPath )
PROCEDURE Out
IN aValue
g_OutFile IsNil ?FAIL 'Файл для вывода не открыт'
aValue ToPrintable g_OutFile File:WriteLn
; // Out
CONST cCompareUtilCmd 'q:\afc.cmd'
%REMARK 'Путь к утилите сравнения'
PROCEDURE Etalon.do
IN aLambda
CONST cPathSep '\'
BOOLEAN FUNCTION FileIsEmpty
STRING IN aFileName
aFileName FileSize 0 == >>> Result
; // FileIsEmpty
PROCEDURE DeleteEmptyFile
STRING IN aFileName
aFileName FileIsEmpty ? (
aFileName sysutils:FileExists ? (
aFileName DeleteFile DROP
) // aFileName sysutils:FileExists
) // aFileName FileSize 0 ==
; // DeleteEmptyFile
STRING VAR l_EtalonFileName
STRING VAR l_CurrentDir
script:FileName sysutils:ExtractFilePath >>> l_CurrentDir
script:FileName sysutils:ExtractFileName >>> l_EtalonFileName
if ( l_CurrentDir IsNil ) then
begin
sysutils:GetCurrentDir >>> l_CurrentDir
end // l_CurrentDir IsNil
[
l_EtalonFileName
[ g_EtalonPath .map> IntToStr .for> ( '.' SWAP Cat ) ] strings:Cat
] strings:Cat >>> l_EtalonFileName
CONST cPrnExt '.prn'
STRING VAR l_OutFileName
l_EtalonFileName >>> l_OutFileName
l_OutFileName cPrnExt Cat >>> l_OutFileName
[ l_CurrentDir 'Etalons' [ l_EtalonFileName cPrnExt '.etalon' ] strings:Cat ] cPathSep strings:CatSep >>> l_EtalonFileName
STRING VAR l_OutDir
[ l_CurrentDir 'Out' ] cPathSep strings:CatSep >>> l_OutDir
l_OutDir sysutils:ForceDirectories ?ASSURE [ 'Не удалось создать директорию ' l_OutDir ]
[ l_OutDir l_OutFileName ] cPathSep strings:CatSep >>> l_OutFileName
TF g_OutFile (
l_OutFileName File:OpenWrite >>> g_OutFile
DumpStackTo (
aLambda DO
) Out
nil >>> g_OutFile
) // TF g_OutFile
if ( l_EtalonFileName sysutils:FileExists ) then
begin
'' l_EtalonFileName l_OutFileName CompareFiles ! ? (
cCompareUtilCmd sysutils:FileExists ?ASSURE [ 'Не найдена утилита сравнения: ' cCompareUtilCmd ]
STRING VAR l_Compare
[ cCompareUtilCmd ' ' l_EtalonFileName ' ' l_OutFileName ] strings:Cat >>> l_Compare
l_Compare WinExec
%REMARK 'Вызываем внешнюю утилиту сравнения файлов'
)
end // l_EtalonFileName sysutils:FileExists
else
begin
$20 l_EtalonFileName l_OutFileName CopyFile
end // l_EtalonFileName sysutils:FileExists
l_EtalonFileName DeleteEmptyFile
l_OutFileName DeleteEmptyFile
; // Etalon.do
PROCEDURE Etalon
^ IN aLambda
ARRAY VAR l_EtalonPathCopy
[ g_EtalonPath .for> NOP ] >>> l_EtalonPathCopy
INTEGER VAR l_EtalonPathCount
l_EtalonPathCopy Array:Count >>> l_EtalonPathCount
g_EtalonLevel >= 0 ?ASSURE [ 'g_EtalonLevel is bad: ' g_EtalonLevel IntToStr ]
TF g_EtalonLevel (
INC g_EtalonLevel
if ( g_EtalonLevel > l_EtalonPathCount ) then
begin
0 >>>[] g_EtalonPath
end
aLambda Etalon.do
if ( g_EtalonLevel < ( g_EtalonPath Array:Count ) ) then
begin
l_EtalonPathCopy >>> g_EtalonPath
end
INTEGER VAR l_Index
g_EtalonPath Array:Count >>> l_Index
Dec l_Index
l_Index >= 0 ?ASSURE 'Индекс не может быть отрицательным'
INTEGER VAR l_Value
l_Index g_EtalonPath Array:Item >>> l_Value
l_Value >= 0 ?ASSURE 'Значение не может быть отрицательным'
Inc l_Value
l_Index g_EtalonPath Array:Item := l_Value
) // TF g_EtalonLevel
; // Etalon
Etalon ( script:FileName sysutils:ExtractFileName )
Etalon (
( 1 2 + )
Etalon 'Inner1'
Etalon 'Inner2'
'Outer1'
)
Etalon 'Outer2'
Etalon 'Hello world'
Etalon ()
Etalon []
Etalon 1
Etalon 'Another string'
Etalon ''
Etalon (
'Root'
Etalon 'Nested1'
Etalon (
'Nested2'
Etalon 'Nested2.1'
Etalon 'Nested2.2'
Etalon 'Nested2.3'
)
Etalon (
'Nested3'
Etalon (
'Nested3.1'
Etalon 'Nested3.1.1'
Etalon 'Nested3.1.2'
)
Etalon 'Nested3.2'
Etalon (
'Nested3.3'
Etalon 'Nested3.3.1'
)
Etalon 'Nested3.4'
Etalon 'Nested3.5'
)
Etalon 'Nested4'
Etalon 'Nested5'
)
; // Etalon.ms.script.test
Etalon.ms.script.test
Заметки о тестировании, программировании и прочий "поток сознания", который жалко писать "в стол"
понедельник, 7 декабря 2015 г.
#1136. Работа с эталонами. Обеспечиваем рекурсию. Только код
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий