OSDN Git Service

Version 3.00
[vbslib/main.git] / _src / Test / vbsool_test / vbslib / vbslib300 / TestScript.vbs
1 Option Explicit \r
2 \r
3 ' vbslib  ver3.00  Sep.22, 2009\r
4 ' Copyright (c) 2008-2009, T's-Neko at Sage Plaisir 21 (Japan)\r
5 ' All rights reserved. Based on 3-clause BSD license.\r
6 \r
7 Dim  g_SrcPath\r
8 Dim  g_TestScript_Path\r
9      g_TestScript_Path = g_SrcPath\r
10 \r
11 \r
12 ' Global Variable\r
13 Dim  g_Test, g_echo_on\r
14 \r
15 Function  InitializeModule\r
16   g_echo_on = True\r
17   Set  g_Test = New TestScript : ErrCheck\r
18 End Function\r
19 Dim  g_InitializeModule\r
20 Set  g_InitializeModule = GetRef( "InitializeModule" )\r
21 \r
22 Const  Err_TestPass = 21\r
23 Const  Err_TestSkip = 22\r
24 Const  Err_TestFail = 23\r
25 \r
26  \r
27 '********************************************************************************\r
28 '  <<< [call_vbs_t] >>> \r
29 '   - The difference of call_vbs is not depend on vbslib.\r
30 '   - path, func as string, param as variant\r
31 '********************************************************************************\r
32 Function  call_vbs_t( ByVal path, ByVal func, param )\r
33   Dim oldDir, f, funcX, in_interpret, en, ed, es\r
34 \r
35   in_interpret = False\r
36   oldDir = g_sh.CurrentDirectory\r
37 \r
38   path = g_sh.ExpandEnvironmentStrings( path )\r
39   path = g_fs.GetAbsolutePathName( path )\r
40 \r
41   '-----------------------------------------\r
42   ' Interpret\r
43 \r
44   g_SrcPath = path\r
45 \r
46   On Error Resume Next\r
47 \r
48     g_sh.CurrentDirectory = g_fs.GetParentFolderName( path )\r
49     If Err=0 Then  Set f = g_fs.OpenTextFile( g_fs.GetFileName( path ) )\r
50     If Err=0 Then  in_interpret = True : ExecuteGlobal f.ReadAll()\r
51     If Err=&h411 Then  in_interpret = False : Err.Clear  ' Ignore symbol override error\r
52     If Err=0 Then  in_interpret = False\r
53     If Err=0 Then  Set funcX = GetRef( func )\r
54 \r
55   en = Err.Number : es = Err.Source : ed = Err.Description : On Error GoTo 0\r
56   If en <> 0 Then\r
57     If in_interpret Then\r
58       ed = ed + " Syntax Error in """ + g_fs.GetFileName( path ) _\r
59               + """. Please double click """ _\r
60               + g_fs.GetFileName( path ) + """."\r
61     End If\r
62     If en = &h35 Then  ed = "Not found file '" + path\r
63     If en = 5 Then  ed = "Not found func name '" + func + "' in " + path\r
64   End If\r
65   f.Close\r
66 \r
67 \r
68   '-----------------------------------------\r
69   ' Call\r
70   If en = 0 Then\r
71     On Error Resume Next\r
72       call_vbs_t = funcX( param )\r
73     en = Err.Number : es = Err.Source : ed = Err.Description : On Error GoTo 0\r
74   End If\r
75 \r
76 \r
77   '-----------------------------------------\r
78   ' Finally\r
79   g_sh.CurrentDirectory = oldDir\r
80   g_SrcPath = Empty\r
81 \r
82   If en <> 0 Then  Err.Raise en, es, ed\r
83 End Function\r
84 \r
85 \r
86 \r
87  \r
88 '********************************************************************************\r
89 '  <<< [call_vbs_d] >>> \r
90 '********************************************************************************\r
91 Function  call_vbs_d( ByVal path, ByVal func, param )\r
92   Dim oldDir, f, funcX, in_call, in_interpret, en\r
93 \r
94   oldDir = g_sh.CurrentDirectory\r
95 \r
96   path = g_sh.ExpandEnvironmentStrings( path )\r
97   path = g_fs.GetAbsolutePathName( path )\r
98   g_SrcPath = path\r
99 \r
100   g_sh.CurrentDirectory = g_fs.GetParentFolderName( path )\r
101 \r
102   Set f = g_fs.OpenTextFile( g_fs.GetFileName( path ) )\r
103   ExecuteGlobal f.ReadAll()\r
104   f.Close\r
105   Set funcX = GetRef( func )  ' If error, Not found func symbol\r
106   call_vbs_d = funcX( param )\r
107   g_sh.CurrentDirectory = oldDir\r
108   g_SrcPath = Empty\r
109 End Function\r
110 \r
111 \r
112 \r
113  \r
114 '*-------------------------------------------------------------------------*\r
115 '* \81\9f<<<< [TestScript] Class >>>> */ \r
116 '*-------------------------------------------------------------------------*\r
117 \r
118 Class  TestScript\r
119   Public  m_nPass  ' as integer\r
120   Public  m_nSkip  ' as integer\r
121   Public  m_nFail  ' as integer\r
122   Public  m_Log    ' as Text File\r
123   Public  m_DefLogFName  ' as string\r
124   Public  m_MemLog  ' as string. Empty=disabled, (""or string)=enabled\r
125   Public  m_Path    ' as string\r
126   Public  m_ManualTests() ' as string\r
127   Public  m_ManualTestsPath() ' as string\r
128   Public  m_Debug  ' as boolean\r
129   Public  m_Pass   ' as boolean\r
130  \r
131 '********************************************************************************\r
132 '  <<< [TestScript::Class_Initialize] >>> \r
133 '********************************************************************************\r
134 Private Sub  Class_Initialize\r
135   m_DefLogFName = "Test_logs.txt"\r
136   m_Debug = g_Debug\r
137   ReDim  m_ManualTests(-1)\r
138   ReDim  m_ManualTestsPath(-1)\r
139 End Sub\r
140 \r
141 \r
142  \r
143 '********************************************************************************\r
144 '  <<< [TestScript::Class_Terminate] >>> \r
145 '********************************************************************************\r
146 Private Sub  Class_Terminate\r
147   If Not IsEmpty( m_Log ) Then  Finish\r
148 End Sub\r
149 \r
150 \r
151  \r
152 '********************************************************************************\r
153 '  <<< [TestScript::Start] >>> \r
154 '********************************************************************************\r
155 Public Sub  Start\r
156   Dim  sub_test ' Boolean\r
157 \r
158   Set m_Log = g_fs.CreateTextFile( m_DefLogFName, True, (g_TextFileCreateFormat = F_Unicode) )\r
159   m_MemLog = Empty\r
160   ReDim  m_ManualTests(-1)\r
161   ReDim  m_ManualTestsPath(-1)\r
162 \r
163   sub_test = False\r
164   If WScript.Arguments.Count >= 1 Then\r
165     If WScript.Arguments(0) = "-sub_test" Then sub_test = True\r
166   End If\r
167 \r
168   If Not sub_test Then  echo  "Test Start : " & g_fs.GetFileName( Wscript.ScriptFullName )\r
169 \r
170   m_nPass = 0\r
171   m_nSkip = 0\r
172   m_nFail = 0\r
173 End Sub\r
174 \r
175 \r
176  \r
177 '********************************************************************************\r
178 '  <<< [TestScript::Do_] >>> \r
179 '********************************************************************************\r
180 Public Sub  Do_( ByVal vbs_path, ByVal func, ByVal param )\r
181   Dim  en,ed,es, def_log_fname, b_echo_err_func, b_echo_err_file\r
182 \r
183   If g_debug Then  Debug  vbs_path, func, param :  Exit Sub\r
184 \r
185   m_Path = vbs_path\r
186 \r
187 \r
188   '//=== Call Me.Start\r
189   If IsEmpty( m_Log ) And func <> "test_current" Then\r
190     def_log_fname = m_DefLogFName\r
191     m_DefLogFName = g_fs.GetParentFolderName( vbs_path ) + "\" + def_log_fname\r
192     Me.Start\r
193   End If\r
194 \r
195 \r
196   '//=== Echo the Test title\r
197   If func <> "test_current" Then\r
198     echo "=========================================================="\r
199     If g_fs.GetFileName( g_fs.GetParentFolderName( vbs_path ) ) = "" Then\r
200       echo "((( [" & g_fs.GetFileName( vbs_path ) & "] - " & func & " )))"\r
201     Else\r
202       echo "((( [" & g_fs.GetFileName( g_fs.GetParentFolderName( vbs_path ) ) & "\" _\r
203            & g_fs.GetFileName( vbs_path ) & "] - " & func & " )))"\r
204     End If\r
205   End If\r
206 \r
207 \r
208   '//=== Call the Test function\r
209   On Error Resume Next\r
210 \r
211     call_vbs_t  vbs_path, func, param\r
212 \r
213   en = Err.Number : ed = Err.Description : es = Err.Source : On Error GoTo 0\r
214 \r
215 \r
216   '//=== Echo the Test result\r
217   If en = 0 Then\r
218    If func <> "test_current" Then\r
219     m_nFail = m_nFail + 1\r
220     echo "[FAIL] Test is not Pass"\r
221     b_echo_err_func = True\r
222    End If\r
223   ElseIf en = Err_TestPass Then\r
224    If func <> "test_current" Then\r
225     m_nPass = m_nPass + 1\r
226     '// echo "Pass." is already done in Pass function\r
227    End If\r
228   ElseIf en = Err_TestSkip Then\r
229     m_nSkip = m_nSkip + 1\r
230     echo ed\r
231     b_echo_err_func = True\r
232   ElseIf en = Err_TestFail Then\r
233     m_nFail = m_nFail + 1\r
234     echo "[FAIL] " & ed\r
235     b_echo_err_func = True\r
236   Else\r
237     m_nFail = m_nFail + 1\r
238     If en >= 0 and en <= &h7FFF Then\r
239       echo "[FAIL] [ERROR](" & en & ") " & ed\r
240     Else\r
241       echo "[FAIL] [ERROR](" & Hex(en) & ") " & ed\r
242     End If\r
243     If en >= 1000 and en <=4096 Then\r
244       b_echo_err_file = True\r
245     Else\r
246       b_echo_err_func = True\r
247     End If\r
248   End If\r
249   If b_echo_err_func Then\r
250     echo " in """ & func & """ function in """ & vbs_path & """"\r
251   ElseIf b_echo_err_file Then\r
252     echo " in """ & vbs_path & """"\r
253   End If\r
254 \r
255 \r
256   '//=== Call Me.Finish\r
257   If Not IsEmpty( def_log_fname ) Then\r
258     Me.Finish\r
259     m_DefLogFName = def_log_fname\r
260   End If\r
261 \r
262   m_Path = Empty\r
263 End Sub\r
264 \r
265 \r
266  \r
267 '********************************************************************************\r
268 '  <<< [TestScript::Debug] >>> \r
269 '********************************************************************************\r
270 Public Sub  Debug( ByVal vbs_path, ByVal func, ByVal param )\r
271   echo "=========================================================="\r
272   echo "<<< [" & g_fs.GetFileName( g_fs.GetParentFolderName( vbs_path ) ) & "\" _\r
273            & g_fs.GetFileName( vbs_path ) & "] - " & func & " >>>"\r
274   echo "Debug Mode ..."\r
275 \r
276   m_Path = vbs_path\r
277 \r
278   m_Debug = True\r
279   call_vbs_d  vbs_path, func, param\r
280   m_Debug = False\r
281 \r
282   if m_Pass Then\r
283     If func <> "test_current" Then\r
284       m_nPass = m_nPass + 1\r
285       echo "Pass."\r
286     End If\r
287   End If\r
288 \r
289   m_Path = Empty\r
290 End Sub\r
291 \r
292 \r
293  \r
294 '********************************************************************************\r
295 '  <<< [TestScript::WriteLogLine] >>> \r
296 '********************************************************************************\r
297 Public Sub  WriteLogLine( Message )\r
298   If not IsEmpty( m_Log ) Then\r
299     m_Log.WriteLine  Message\r
300   End If\r
301   If not IsEmpty( m_MemLog ) Then\r
302     m_MemLog = m_MemLog + Message + vbCRLF\r
303   End If\r
304 End Sub\r
305  \r
306 '********************************************************************************\r
307 '  <<< [TestScript::AddManualTest] >>> \r
308 '********************************************************************************\r
309 Public Sub  AddManualTest( TestSymbol )\r
310   ReDim Preserve  m_ManualTests( UBound( m_ManualTests ) + 1 )\r
311   m_ManualTests( UBound( m_ManualTests ) ) = TestSymbol\r
312   ReDim Preserve  m_ManualTestsPath( UBound( m_ManualTestsPath ) + 1 )\r
313   m_ManualTestsPath( UBound( m_ManualTestsPath ) ) = m_Path\r
314 End Sub\r
315 \r
316 \r
317  \r
318 '********************************************************************************\r
319 '  <<< [TestScript::Raise] >>> \r
320 '********************************************************************************\r
321 Public Sub  Raise( en, ed )\r
322   m_nFail = m_nFail + 1\r
323   If en >= 0 and en <= &h7FFF Then\r
324     echo "[FAIL] [ERROR](" & en & ") " & ed\r
325   Else\r
326     echo "[FAIL] [ERROR](" & Hex(en) & ") " & ed\r
327   End If\r
328 End Sub\r
329 \r
330 \r
331  \r
332 '********************************************************************************\r
333 '  <<< [TestScript::Finish] >>> \r
334 '********************************************************************************\r
335 Public Sub  Finish\r
336   Dim  TestSymbol, sub_test ' Boolean\r
337   Dim  i\r
338 \r
339   i=0\r
340   For Each TestSymbol In m_ManualTests\r
341     echo  "[ManualTest] " + TestSymbol + " in """ + m_ManualTestsPath(i) + """"\r
342     i=i+1\r
343   Next\r
344 \r
345   m_MemLog = Empty\r
346 \r
347   sub_test = False\r
348   If WScript.Arguments.Count >= 1 Then\r
349     If WScript.Arguments(0) = "-sub_test" Then sub_test = True\r
350   End If\r
351 \r
352   If sub_test Then\r
353     If m_nFail = 0 Then WScript.Quit 0  Else WScript.Quit 1  End If\r
354   Else\r
355     echo "=========================================================="\r
356     echo "Test Finish (Pass=" & m_nPass & ", Manual=" & UBound(m_ManualTests)+1 & _\r
357          ", Skip=" & m_nSkip & ", Fail=" & m_nFail & ")"\r
358     echo ""\r
359   End If\r
360 \r
361   ReDim  m_ManualTests(-1)\r
362   m_Log = Empty\r
363 End Sub\r
364 \r
365 \r
366 \r
367 \r
368 \r
369  \r
370 End Class \r
371  \r
372 '*-------------------------------------------------------------------------*\r
373 '* \81\9f<<<< [Tests] Class >>>> */ \r
374 '*-------------------------------------------------------------------------*\r
375 Class Tests\r
376 \r
377   Private  m_Sets  ' As Dictionary of UnitTest. key is UnitTest::Symbol\r
378   Private  m_BaseFolderPath  ' as string. All Test ROOT\r
379   Private  m_Prompt  ' as TestPrompt or Empty\r
380   Private  m_CurrentSymbol  ' as string of current test symbol or ALL or ALL_R\r
381   Private  m_CurrentSubSymbol  ' as string\r
382   Private  m_CurrentTest   ' as UnitTest of m_CurrentSymbol\r
383   Public   CurrentTestPriority   ' as integer  small is high priority\r
384   Private  m_bAllTest  ' as boolean\r
385   Private  m_AllFName  ' as string\r
386   Private  m_Symbol  ' as string of doing test symbol\r
387   Public   bTargetDebug  ' as boolean\r
388   Public   c_ErrDblSymbol  ' as const number\r
389   Public   m_bDisableAddTestScript  ' as boolean\r
390   Public   m_bAutoDiff  ' as boolean\r
391   Public   m_bSkipSection  ' as boolean\r
392 \r
393   '----------------------------------\r
394   Public Property Get  Sets : Set Sets = m_Sets : End Property\r
395   Public Property Get  BaseFolderPath : BaseFolderPath = m_BaseFolderPath : End Property\r
396   Public Property Let  BaseFolderPath( x ) : m_BaseFolderPath = x : End Property\r
397   Public Property Set  Prompt( x ) : Set m_Prompt = x : End Property\r
398   Public Property Get  Prompt : Set Prompt = m_Prompt : End Property\r
399   Public Property Get  CurrentSymbol : CurrentSymbol = m_CurrentSymbol : End Property\r
400   Public Property Get  CurrentTest : If IsObject(m_CurrentTest) Then Set CurrentTest = m_CurrentTest : Else CurrentTest = m_CurrentTest : End If : End Property\r
401   Public Property Get  bAllTest : bAllTest = m_bAllTest : End Property\r
402   Public Property Get  Symbol : Symbol = m_Symbol : End Property\r
403  \r
404 '********************************************************************************\r
405 '  <<< [Tests::Class_Initialize] >>> \r
406 '********************************************************************************\r
407 Private  Sub  Class_Initialize\r
408   Set m_Sets = CreateObject("Scripting.Dictionary")\r
409   m_BaseFolderPath = g_fs.GetParentFolderName( WScript.ScriptFullName )\r
410   m_CurrentSymbol = "ALL"\r
411   m_AllFName = "T_ALL.vbs"\r
412   m_bAllTest = False\r
413   Me.bTargetDebug = False\r
414   Me.c_ErrDblSymbol = 1010\r
415   m_bDisableAddTestScript = False\r
416   m_bAutoDiff = False\r
417   m_bSkipSection = not IsEmpty( g_SkipSection )\r
418   If not m_bSkipSection Then  SkipToSection  0\r
419 End Sub\r
420 \r
421  \r
422 '********************************************************************************\r
423 '  <<< [Tests::AddTestScriptAuto] >>> \r
424 '********************************************************************************\r
425 Public Function  AddTestScriptAuto( BasePath, FName )\r
426   m_AllFName = FName\r
427   AddTestScriptAuto_EnumSubFolders  g_fs.GetFolder( BasePath ), FName\r
428 End Function\r
429 \r
430 \r
431 Private Sub AddTestScriptAuto_EnumSubFolders( fo, FName )\r
432   Dim  subfo\r
433 \r
434   If g_fs.FileExists( fo.Path + "\" + FName ) Then\r
435     AddTestScript  g_fs.GetFileName( fo.Path ), fo.Path + "\" + FName\r
436   End If\r
437   For Each subfo in fo.SubFolders\r
438     AddTestScriptAuto_EnumSubFolders subfo, FName\r
439   Next\r
440 End Sub\r
441  \r
442 '********************************************************************************\r
443 '  <<< [Tests::AddTestScript] >>> \r
444 '********************************************************************************\r
445 Public Function  AddTestScript( Symbol, Path )\r
446   Dim  test\r
447 \r
448   If Not g_fs.FileExists( Path ) Then  Err.Raise 53,,"\83t\83@\83C\83\8b\82ª\8c©\82Â\82©\82è\82Ãœ\82¹\82ñ " + Path\r
449   If m_bDisableAddTestScript Then  Exit Function\r
450 \r
451   Set test = new UnitTest : ErrCheck\r
452   test.Symbol = Symbol\r
453   test.ScriptPath = g_fs.GetAbsolutePathName( Path )\r
454   If m_Sets.Exists( test.Symbol ) Then _\r
455     Err.Raise c_ErrDblSymbol,"class Tests", "[ERROR] Already defined the symbol '"+Symbol+"' in "+ _\r
456     m_Sets.Item(Symbol).ScriptPath\r
457   m_Sets.Add  test.Symbol, test\r
458 \r
459   Me.CurrentTestPriority = 1000\r
460   If g_debug Then  call_vbs_d  Path, "test_current", Me _\r
461   Else             call_vbs_t  Path, "test_current", Me\r
462   test.Priority = Me.CurrentTestPriority\r
463 \r
464   Set AddTestScript = test\r
465 End Function\r
466 \r
467  \r
468 '********************************************************************************\r
469 '  <<< [Tests::SetCurrentSymbol] >>> \r
470 '********************************************************************************\r
471 Public Function SetCurrentSymbol( Symbol_or_Path )\r
472   Dim  key, item, b\r
473 \r
474   SetCurrentSymbol = 0\r
475 \r
476   '// ALL and ALL_R is special symbol\r
477   If Symbol_or_Path = "ALL" or Symbol_or_Path = "ALL_R" Then  m_CurrentSymbol = Symbol_or_Path : _\r
478     m_CurrentTest = Empty : Exit Function\r
479 \r
480   '// Search by test symbol\r
481   For Each key in m_Sets.Keys()\r
482     If key = Symbol_or_Path Then  m_CurrentSymbol = Symbol_or_Path : _\r
483       Set m_CurrentTest = m_Sets.Item( m_CurrentSymbol ) : Exit Function\r
484   Next\r
485 \r
486   '// Search by path\r
487   For Each item in m_Sets.Items()\r
488     If item.ScriptPath = Symbol_or_Path Then  m_CurrentSymbol = item.Symbol : _\r
489       Set m_CurrentTest = m_Sets.Item( m_CurrentSymbol ) : Exit Function\r
490   Next\r
491 \r
492   '// If Symbol is path, Add test symbol\r
493   If g_fs.FileExists( Symbol_or_Path ) Then\r
494     If UCase(g_fs.GetFileName( Symbol_or_Path )) = UCase(m_AllFName) Then _\r
495       m_CurrentSymbol = g_fs.GetFileName( g_fs.GetParentFolderName( g_fs.GetAbsolutePathName(Symbol_or_Path) ) ) _\r
496     Else  m_CurrentSymbol = g_fs.GetBaseName( Symbol_or_Path )\r
497 \r
498     b = True : If m_Sets.Exists( m_CurrentSymbol ) Then _\r
499       b = ( m_Sets.Item( m_CurrentSymbol ).ScriptPath <> g_fs.GetAbsolutePathName( Symbol_or_Path ) )\r
500     If b Then  'If Not m_Sets.Exists( m_CurrentSymbol ) or _\r
501                '  m_Sets.Item( m_CurrentSymbol ).ScriptPath <> g_fs.GetAbsolutePathName( Symbol_or_Path ) Then\r
502       AddTestScript  m_CurrentSymbol, Symbol_or_Path\r
503     End If\r
504     Set m_CurrentTest = m_Sets.Item( m_CurrentSymbol )\r
505     Exit Function\r
506   End If\r
507 \r
508   '// Error: Symbol\r
509   echo "[ERROR] Not found symbol or path """ + Symbol_or_Path + """. CurrentDirectory = " & g_sh.CurrentDirectory\r
510   SetCurrentSymbol = 1\r
511 End Function\r
512 \r
513 \r
514  \r
515 '********************************************************************************\r
516 '  <<< [Tests::DoTest] >>> \r
517 '********************************************************************************\r
518 Public Sub  DoTest( Func, bReverse )\r
519 \r
520   If m_CurrentSymbol = "ALL" Or m_CurrentSymbol = "ALL_R" Then\r
521     Redim  utests(-1)\r
522 \r
523     If bReverse Then\r
524       ShakerSort_fromDic  m_Sets, utests, -1, GetRef("CmpUnitTestPriorityDec"), Empty\r
525     Else\r
526       ShakerSort_fromDic  m_Sets, utests, +1, GetRef("CmpUnitTestPriorityInc"), Empty\r
527     End If\r
528 \r
529     g_Test.m_DefLogFName = m_BaseFolderPath + "\" + g_fs.GetFileName( g_Test.m_DefLogFName )\r
530     g_Test.Start\r
531     If m_bAutoDiff Then  g_Test.m_MemLog = ""\r
532     For Each m_CurrentTest in utests\r
533       TestCurrentSetup\r
534       g_Test.Do_  m_CurrentTest.ScriptPath, "test_current", Me\r
535       TestSetup\r
536       g_Test.Do_  m_CurrentTest.ScriptPath, Func, Me\r
537       If Me.AutoDiff Then  g_Test.Finish : m_bAllTest = False : Exit Sub\r
538     Next\r
539     g_Test.Finish\r
540   Else\r
541     g_Test.m_DefLogFName = g_fs.GetParentFolderName( m_CurrentTest.ScriptPath ) + "\" + g_fs.GetFileName( g_Test.m_DefLogFName )\r
542     g_Test.Start\r
543     If m_bAutoDiff Then  g_Test.m_MemLog = ""\r
544     Set m_CurrentTest = m_Sets.Item( m_CurrentSymbol )\r
545     TestCurrentSetup\r
546     g_Test.Do_  m_CurrentTest.ScriptPath, "test_current", Me\r
547     TestSetup\r
548     g_Test.Do_  m_CurrentTest.ScriptPath, Func, Me\r
549     If Me.AutoDiff Then  g_Test.Finish : m_bAllTest = False : Exit Sub\r
550     g_Test.Finish\r
551   End If\r
552 End Sub\r
553 \r
554  \r
555 '********************************************************************************\r
556 '  <<< [Tests::DebugTest] >>> \r
557 '********************************************************************************\r
558 Public Sub  DebugTest( Func, bReverse )\r
559   If m_CurrentSymbol = "ALL" Or m_CurrentSymbol = "ALL_R" Then\r
560     Dim  items(), i\r
561 \r
562     i = m_Sets.Count - 1\r
563     ReDim Preserve items( i )\r
564     If bReverse Then\r
565       For Each m_CurrentTest in m_Sets.Items()\r
566         Set items( i ) = m_CurrentTest\r
567         i = i - 1\r
568       Next\r
569     Else\r
570       i = 0\r
571       For Each m_CurrentTest in m_Sets.Items()\r
572         Set items( i ) = m_CurrentTest\r
573         i = i + 1\r
574       Next\r
575     End If\r
576 \r
577     g_Test.m_DefLogFName = m_BaseFolderPath + "\" + g_fs.GetFileName( g_Test.m_DefLogFName )\r
578     g_Test.Start\r
579     For Each m_CurrentTest in items\r
580       If NotSkipSection() Then\r
581         TestCurrentSetup\r
582         g_Test.Debug  m_CurrentTest.ScriptPath, "test_current", Me\r
583         TestSetup\r
584         g_Test.Debug  m_CurrentTest.ScriptPath, Func, Me\r
585       End If\r
586     Next\r
587     g_Test.Finish\r
588   Else\r
589     g_Test.m_DefLogFName = g_fs.GetParentFolderName( m_CurrentTest.ScriptPath ) + "\" + g_fs.GetFileName( g_Test.m_DefLogFName )\r
590     g_Test.Start\r
591     Set m_CurrentTest = m_Sets.Item( m_CurrentSymbol )\r
592     TestCurrentSetup\r
593     g_Test.Debug  m_CurrentTest.ScriptPath, "test_current", Me\r
594     TestSetup\r
595     g_Test.Debug  m_CurrentTest.ScriptPath, Func, Me\r
596     g_Test.Finish\r
597   End If\r
598 End Sub\r
599 \r
600  \r
601 '********************************************************************************\r
602 '  <<< [Tests::DoAllTest] >>> \r
603 '********************************************************************************\r
604 Public Sub  DoAllTest()\r
605   m_bAllTest = True\r
606   If m_CurrentSymbol = "ALL" Or m_CurrentSymbol = "ALL_R" Then\r
607     Redim  utests_inc(-1), utests_dec(-1)\r
608 \r
609     ShakerSort_fromDic  m_Sets, utests_inc, +1, GetRef("CmpUnitTestPriorityInc"), Empty\r
610     ShakerSort_fromDic  m_Sets, utests_dec, -1, GetRef("CmpUnitTestPriorityDec"), Empty\r
611 \r
612     g_Test.m_DefLogFName = m_BaseFolderPath + "\" + g_fs.GetFileName( g_Test.m_DefLogFName )\r
613     g_Test.Start\r
614     If m_bAutoDiff Then  g_Test.m_MemLog = ""\r
615 \r
616     For Each m_CurrentTest in utests_inc\r
617       If NotSkipSection() Then\r
618         TestCurrentSetup\r
619         g_Test.Do_  m_CurrentTest.ScriptPath, "test_current", Me\r
620         If Me.AutoDiff Then  g_Test.Finish : m_bAllTest = False : Exit Sub\r
621       End If\r
622     Next\r
623     For Each m_CurrentTest in utests_inc\r
624       If NotSkipSection() Then\r
625         TestSetup\r
626         g_Test.Do_  m_CurrentTest.ScriptPath, "test_build", Me\r
627         If Me.AutoDiff Then  g_Test.Finish : m_bAllTest = False : Exit Sub\r
628       End If\r
629     Next\r
630     For Each m_CurrentTest in utests_inc\r
631       If NotSkipSection() Then\r
632         TestSetup\r
633         g_Test.Do_  m_CurrentTest.ScriptPath, "test_setup", Me\r
634         If Me.AutoDiff Then  g_Test.Finish : m_bAllTest = False : Exit Sub\r
635       End If\r
636     Next\r
637     For Each m_CurrentTest in utests_inc\r
638       If NotSkipSection() Then\r
639         TestSetup\r
640         g_Test.Do_  m_CurrentTest.ScriptPath, "test_start", Me\r
641         If Me.AutoDiff Then  g_Test.Finish : m_bAllTest = False : Exit Sub\r
642       End If\r
643     Next\r
644     For Each m_CurrentTest in utests_dec\r
645       If NotSkipSection() Then\r
646         TestSetup\r
647         g_Test.Do_  m_CurrentTest.ScriptPath, "test_check", Me\r
648         If Me.AutoDiff Then  g_Test.Finish : m_bAllTest = False : Exit Sub\r
649       End If\r
650     Next\r
651     For Each m_CurrentTest in utests_dec\r
652       If NotSkipSection() Then\r
653         TestSetup\r
654         g_Test.Do_  m_CurrentTest.ScriptPath, "test_clean", Me\r
655         If Me.AutoDiff Then  g_Test.Finish : m_bAllTest = False : Exit Sub\r
656       End If\r
657     Next\r
658     If m_bSkipSection Then  g_Test.Raise  1, "SkipToSection \82ð\83J\83b\83g\82µ\82Ä\82­\82¾\82³\82¢\81B"\r
659     g_Test.Finish\r
660   Else\r
661     Set m_CurrentTest = m_Sets.Item( m_CurrentSymbol )\r
662     g_Test.m_DefLogFName = g_fs.GetParentFolderName( m_CurrentTest.ScriptPath ) + "\" + g_fs.GetFileName( g_Test.m_DefLogFName )\r
663     g_Test.Start\r
664     If m_bAutoDiff Then  g_Test.m_MemLog = ""\r
665     If NotSkipSection() Then\r
666       TestCurrentSetup\r
667       g_Test.Do_  m_CurrentTest.ScriptPath, "test_current", Me\r
668     End If\r
669     If NotSkipSection() Then\r
670       TestSetup\r
671       g_Test.Do_  m_CurrentTest.ScriptPath, "test_build", Me\r
672       If Me.AutoDiff Then  g_Test.Finish : m_bAllTest = False : Exit Sub\r
673     End If\r
674     If NotSkipSection() Then\r
675       TestSetup\r
676       g_Test.Do_  m_CurrentTest.ScriptPath, "test_setup", Me\r
677       If Me.AutoDiff Then  g_Test.Finish : m_bAllTest = False : Exit Sub\r
678     End If\r
679     If NotSkipSection() Then\r
680       TestSetup\r
681       g_Test.Do_  m_CurrentTest.ScriptPath, "test_start", Me\r
682       If Me.AutoDiff Then  g_Test.Finish : m_bAllTest = False : Exit Sub\r
683     End If\r
684     If NotSkipSection() Then\r
685       TestSetup\r
686       g_Test.Do_  m_CurrentTest.ScriptPath, "test_check", Me\r
687       If Me.AutoDiff Then  g_Test.Finish : m_bAllTest = False : Exit Sub\r
688     End If\r
689     If NotSkipSection() Then\r
690       TestSetup\r
691       g_Test.Do_  m_CurrentTest.ScriptPath, "test_clean", Me\r
692       If Me.AutoDiff Then  g_Test.Finish : m_bAllTest = False : Exit Sub\r
693     End If\r
694     If m_bSkipSection Then  g_Test.Raise  1, "SkipToSection \82ð\83J\83b\83g\82µ\82Ä\82­\82¾\82³\82¢\81B"\r
695     g_Test.Finish\r
696   End If\r
697 \r
698   m_bAllTest = False\r
699 End Sub\r
700 \r
701 \r
702  \r
703 '********************************************************************************\r
704 '  <<< [Tests::TestCurrentSetup] >>> \r
705 '********************************************************************************\r
706 Private Sub  TestCurrentSetup()\r
707   m_Symbol = m_CurrentTest.Symbol\r
708   CurrentTestPriority = m_CurrentTest.Priority\r
709   g_Test.m_Pass = True\r
710 End Sub\r
711 \r
712  \r
713 '********************************************************************************\r
714 '  <<< [Tests::TestSetup] >>> \r
715 '********************************************************************************\r
716 Private Sub  TestSetup()\r
717   m_Symbol = m_CurrentTest.Symbol\r
718   g_Test.m_Pass = False\r
719 End Sub\r
720 \r
721  \r
722 '********************************************************************************\r
723 '  <<< [Tests::SetCur] >>> \r
724 '********************************************************************************\r
725 Public Sub  SetCur( SubSymbol )\r
726   m_CurrentSubSymbol = SubSymbol\r
727 End Sub\r
728 \r
729  \r
730 '********************************************************************************\r
731 '  <<< [Tests::IsCur] >>> \r
732 '********************************************************************************\r
733 Public Function  IsCur( SubSymbol )\r
734   If m_CurrentSubSymbol = "ALL" Or m_CurrentSubSymbol = "ALL_R" Or _\r
735      m_CurrentSubSymbol = SubSymbol Then\r
736     IsCur = True\r
737   Else\r
738     IsCur = False\r
739   End IF\r
740 End Function\r
741 \r
742  \r
743 '********************************************************************************\r
744 '  <<< [Tests::AutoDiff] >>> \r
745 '********************************************************************************\r
746 Public Function  AutoDiff()\r
747   If m_bAutoDiff and g_Test.m_nFail > 0 Then\r
748     Dim  f : Set f = new StringStream : ErrCheck\r
749     ReDim  path(1)\r
750     Dim    n_path, line\r
751 \r
752 \r
753     '//=== parse the output of fc command\r
754     n_path = 0\r
755     f.SetString  g_Test.m_MemLog\r
756     Do Until f.AtEndOfStream\r
757       line = f.ReadLine\r
758       If Left( line, 6 ) = "***** " Then\r
759         path( n_path ) = Mid( line, 7 )\r
760         n_path = n_path + 1\r
761         If n_path = 2 Then Exit Do\r
762       End If\r
763     Loop\r
764     f = Empty\r
765 \r
766 \r
767     '//=== Start Diff tool\r
768     If not IsEmpty( path(1) ) Then\r
769       path(0) = GetAbsPath( path(0), g_fs.GetParentFolderName( m_CurrentTest.ScriptPath ) )\r
770       path(1) = GetAbsPath( path(1), g_fs.GetParentFolderName( m_CurrentTest.ScriptPath ) )\r
771       If IsDefined("Setting_getDiffCmdLine") Then\r
772         line = """" + Setting_getDiffCmdLine(0) + """ """ + path(0) + """ """ + path(1) + """"\r
773         CreateFile  g_fs.GetParentFolderName( m_CurrentTest.ScriptPath ) + "\Test_diff.bat", _\r
774                     "start """" " + line\r
775         g_sh.Run  line\r
776       Else\r
777         echo  "[WARNING] Cannot open diff tool : not defined Setting_getDiffCmdLine"\r
778       End If\r
779       AutoDiff = True : Exit Function\r
780     End If\r
781 \r
782   End If\r
783   AutoDiff = False\r
784 End Function\r
785 \r
786  \r
787 '********************************************************************************\r
788 '  <<< [Tests::OpenFailFolder] >>> \r
789 '********************************************************************************\r
790 Public Sub  OpenFailFolder()\r
791   echo  ">OpenFailFolder"\r
792   Dim  ec\r
793   Set  ec = new EchoOff : ErrCheck\r
794 \r
795   Dim  f, line, i, s\r
796   Dim  ds_:Set ds_= new CurDirStack : ErrCheck\r
797 \r
798   Set f = OpenTextFile( g_Test.m_DefLogFName )\r
799   ec = Empty\r
800 \r
801   Do Until f.AtEndOfStream\r
802     line = f.ReadLine\r
803     If Left( line, 6 ) = "[FAIL]" Then\r
804 \r
805       '//=== Open fail folder and ReTest\r
806       echo  line\r
807       line = f.ReadLine\r
808       echo  line\r
809 \r
810       Set ec = new EchoOff : ErrCheck\r
811       i = 1\r
812       s = MeltQuot( line, i )\r
813       If i > 0 Then\r
814         s = MeltQuot( line, i )\r
815         If not IsEmpty( s ) Then\r
816 \r
817           Setting_openFolder  s\r
818 \r
819           If LCase( g_fs.GetFileName( s ) ) = "test.vbs" Then\r
820             CreateFile  g_fs.GetParentFolderName( s ) + "\Test_debugger.bat", _\r
821                         "cscript //x  Test.vbs /g_debug:1 /set_input:8.5.5."\r
822             echo "Created debug.bat"\r
823             Sleep 1000\r
824             echo "Run Test.vbs AutoDiff mode"\r
825             g_sh.Run  "cscript """ + s + """ /set_input:8.5.2.9.",,True\r
826 \r
827             '// echo "Run Test.vbs AutoDiff mode"\r
828             '// cd g_fs.GetParentFolderName( s )\r
829             '// g_sh.Run  "debug.bat"\r
830           End If\r
831         End If\r
832       End If\r
833 \r
834 \r
835       '//=== Change from [FAIL] to [FAIL:Checked] in Test_logs.txt file\r
836       f = Empty\r
837       Set f = StartReplace( "Test_logs.txt", "Test_logs_replacing.txt", False )\r
838       i = 0\r
839       Do Until f.r.AtEndOfStream\r
840         line = f.r.ReadLine\r
841         If i = 0 and InStr( line, "[FAIL]" ) > 0 Then\r
842           line = Replace( line, "[FAIL]", "[FAIL:Checked]" )\r
843           i = 1\r
844         End If\r
845         f.w.WriteLine  line\r
846       Loop\r
847       f.Finish\r
848       ec = Empty\r
849       Exit Sub\r
850     End If\r
851   Loop\r
852   Raise  1, "No Fail"\r
853 End Sub\r
854  \r
855 '********************************************************************************\r
856 '  <<< [Tests::NextFail] >>> \r
857 '********************************************************************************\r
858 Public Sub  NextFail()\r
859   Dim  f, line, i, s\r
860   Dim  ds_:Set ds_= new CurDirStack : ErrCheck\r
861 \r
862   Set f = OpenTextFile( g_Test.m_DefLogFName )\r
863 \r
864   Do Until f.AtEndOfStream\r
865     line = f.ReadLine\r
866     If Left( line, 6 ) = "[FAIL]" Then\r
867 \r
868       '//=== Open fail folder\r
869       echo  line\r
870       line = f.ReadLine\r
871       echo  line\r
872       i = 1\r
873       s = MeltQuot( line, i )\r
874       If i > 0 Then\r
875         s = MeltQuot( line, i )\r
876         If not IsEmpty( s ) Then\r
877           Setting_openFolder  s\r
878           If LCase( g_fs.GetFileName( s ) ) = "test.vbs" Then\r
879             CreateFile  g_fs.GetParentFolderName( s ) + "\Test_debugger.bat", _\r
880                         "cscript //x  Test.vbs /g_debug:1 /set_input:8.5.5."\r
881             echo "Created debug.bat"\r
882             Sleep 1000\r
883             echo "Run Test.vbs AutoDiff mode"\r
884             g_sh.Run  "cscript """ + s + """ /set_input:8.5.2.9.",,True\r
885 \r
886             '// echo "Run Test.vbs AutoDiff mode"\r
887             '// cd g_fs.GetParentFolderName( s )\r
888             '// g_sh.Run  "debug.bat"\r
889           End If\r
890         End If\r
891       End If\r
892 \r
893 \r
894       '//=== Change from [FAIL] to [FAIL:Checked] in Test_logs.txt file\r
895       f = Empty\r
896       Set f = StartReplace( "Test_logs.txt", "Test_logs_replacing.txt", False )\r
897       i = 0\r
898       Do Until f.r.AtEndOfStream\r
899         line = f.r.ReadLine\r
900         If i = 0 and InStr( line, "[FAIL]" ) > 0 Then\r
901           line = Replace( line, "[FAIL]", "[FAIL:Checked]" )\r
902           i = 1\r
903         End If\r
904         f.w.WriteLine  line\r
905       Loop\r
906       f = Empty\r
907       Exit Sub\r
908     End If\r
909   Loop\r
910   Raise  1, "No Fail"\r
911 End Sub\r
912  \r
913 End Class \r
914  \r
915 '********************************************************************************\r
916 '  <<< [CmpUnitTestPriorityInc] >>> \r
917 '********************************************************************************\r
918 Function  CmpUnitTestPriorityInc( left, right, param )\r
919   CmpUnitTestPriorityInc = left.Priority - right.Priority\r
920 End Function\r
921  \r
922 '********************************************************************************\r
923 '  <<< [CmpUnitTestPriorityDec] >>> \r
924 '********************************************************************************\r
925 Function  CmpUnitTestPriorityDec( left, right, param )\r
926   CmpUnitTestPriorityDec = right.Priority - left.Priority\r
927 End Function\r
928  \r
929 '*-------------------------------------------------------------------------*\r
930 '* \81\9f<<<< [UnitTest] Class >>>> */ \r
931 '*-------------------------------------------------------------------------*\r
932 Class UnitTest\r
933 \r
934   Public  Symbol     ' As String\r
935   Public  ScriptPath ' As String\r
936   Public  Priority   ' As Integer\r
937 \r
938   '----------------------------------\r
939   Private  Sub  Class_Initialize\r
940     Symbol = "NoSymbol"\r
941     ScriptPath = ""\r
942   End Sub\r
943 \r
944   Public  Function  Value\r
945     Value = "[" & Symbol & "]" & vbCR & vbLF & " " & ScriptPath\r
946   End Function\r
947 \r
948   Public Function  PathToAbs( BaseFolderPath )\r
949     Dim  s\r
950     PathToAbs = True\r
951     s = g_fs.GetAbsolutePathName( BaseFolderPath & "\" & ScriptPath )\r
952     If Not g_fs.FileExists( s ) Then  echo "[ERROR] Not found " + ScriptPath + ", Base=" + BaseFolderPath : PathToAbs = False\r
953     ScriptPath = s\r
954   End Function\r
955 \r
956 End Class\r
957 \r
958 \r
959  \r
960 '*-------------------------------------------------------------------------*\r
961 '* \81\9f<<<< Test Result >>>> */ \r
962 '*-------------------------------------------------------------------------*\r
963 \r
964  \r
965 '********************************************************************************\r
966 '  <<< [Pass] >>> \r
967 '********************************************************************************\r
968 Sub  Pass\r
969   Dim  b : b = g_EchoObj.m_bEchoOff : g_EchoObj.m_bEchoOff = False\r
970   echo  "Pass."\r
971   g_EchoObj.m_bEchoOff = b\r
972 \r
973   Err.Raise  Err_TestPass, WScript.ScriptFullName, "Pass."\r
974 End Sub\r
975 \r
976 \r
977 \r
978  \r
979 '********************************************************************************\r
980 '  <<< [Fail] >>> \r
981 '********************************************************************************\r
982 Sub  Fail()\r
983   Err.Raise  Err_TestFail,, "Fail the Test"\r
984 End Sub\r
985 \r
986 \r
987 \r
988  \r
989 '********************************************************************************\r
990 '  <<< [Skip] >>> \r
991 '********************************************************************************\r
992 Sub  Skip()\r
993   Err.Raise  Err_TestSkip,, "[SKIP] Skip the Test"\r
994 End Sub\r
995 \r
996 \r
997 \r
998  \r
999 '********************************************************************************\r
1000 '  <<< [ManualTest] >>> \r
1001 '********************************************************************************\r
1002 Sub  ManualTest( TestSymbol )\r
1003   Dim  b : b = g_EchoObj.m_bEchoOff : g_EchoObj.m_bEchoOff = False\r
1004   echo  "((( ["+TestSymbol+"] )))"\r
1005   echo  "This is ManualTest."\r
1006   g_EchoObj.m_bEchoOff = b\r
1007 \r
1008   g_Test.AddManualTest  TestSymbol\r
1009 End Sub\r
1010 \r
1011  \r
1012 '*-------------------------------------------------------------------------*\r
1013 '* \81\9f<<<< Tools for Test Program >>>> */ \r
1014 '*-------------------------------------------------------------------------*\r
1015 \r
1016  \r
1017 '********************************************************************************\r
1018 '  <<< [EchoTestStart] >>> \r
1019 '********************************************************************************\r
1020 Sub  EchoTestStart( TestSymbol )\r
1021   echo  "((( ["+TestSymbol+"] )))"\r
1022 End Sub\r
1023 \r
1024 \r
1025  \r
1026 '********************************************************************************\r
1027 '  <<< [CheckTestErrLevel] >>> \r
1028 '********************************************************************************\r
1029 Sub  CheckTestErrLevel( r )\r
1030   If r = Err_TestSkip Then\r
1031     Skip\r
1032   ElseIf r <> Err_TestPass Then\r
1033     Fail\r
1034   End If\r
1035 End Sub\r
1036 \r
1037 \r
1038  \r
1039 '********************************************************************************\r
1040 '  <<< [ConvertToAbsPath] >>> \r
1041 '********************************************************************************\r
1042 Sub  ConvertToAbsPath( SrcPath, DstPath )\r
1043   Dim  src, dst, dst_parent, line, p1, p2, path\r
1044 \r
1045   Set  src = OpenTextFile( SrcPath )\r
1046   mkdir_for  DstPath\r
1047   echo  ">ConvertToAbsPath """ + SrcPath + """, """ + DstPath + """"\r
1048   g_AppKey.AddNewWritableFolder  DstPath\r
1049   Set  dst = g_fs.CreateTextFile( DstPath, True, (g_TextFileConvertFormat = F_Unicode) )\r
1050 \r
1051   Do Until src.AtEndOfStream\r
1052     line = src.ReadLine\r
1053     Do\r
1054       p1 = InStr( line, "%AbsPath(" )\r
1055       If p1 = 0 Then Exit Do\r
1056       p2 = InStr( p1 + 9, line, ")%" )\r
1057       path = Mid( line, p1+9, p2-p1-9 )\r
1058       path = GetAbsPath( path, g_fs.GetParentFolderName( g_fs.GetAbsolutePathName( SrcPath ) ) )\r
1059       line = Left( line, p1 - 1 ) + path + Mid( line, p2 + 2 )\r
1060     Loop\r
1061     line = Replace( line, "%DesktopPath%", g_sh.SpecialFolders("Desktop") )\r
1062     dst.WriteLine  line\r
1063   Loop\r
1064   src = Empty\r
1065   dst = Empty\r
1066 End Sub\r
1067 \r
1068  \r
1069 '********************************************************************************\r
1070 '  <<< [OpenTextFile] >>> \r
1071 '********************************************************************************\r
1072 Function  OpenTextFile( Path )\r
1073   Dim  en, ed\r
1074 \r
1075   On Error Resume Next\r
1076      Set OpenTextFile = g_fs.OpenTextFile( Path,,,-2 )\r
1077   en = Err.Number : ed = Err.Description : On Error GoTo 0\r
1078   If en = E_FileNotExist or en = E_PathNotFound  Then  Err.raise  en,,ed+" : "+Path\r
1079   If en <> 0 Then  Err.Raise en,,ed\r
1080 End Function\r
1081 \r
1082 \r
1083  \r