From 8fb0b7b4a12d6778a4f4aa71a6b4877b8abbe904 Mon Sep 17 00:00:00 2001 From: JOEL IVEY Date: Fri, 3 Jul 2015 14:17:15 -0700 Subject: [PATCH] Updates for M-Unit testing functionality Changes to functionality include: STARTUP and SHUTDOWN will be run in each routine instead of the first instance of STARTUP and SHUTDOWN encountered being the only ones that were run. This change was made because of possible suites of tests which have their own STARTUP and SHUTDOWN that need to be run. Also, it does not depend on the order in which test routines are run. While the coverage functionality can only be run on GT.M systems at the present time, the routine %utcover has been added to provide additional ability to run a number of unit tests at one time so that coverage across all of them can be obtained in one run, this includes the ability to specify entry at different APIs (e.g., if both verbose and nonverbose entries are available) as well as run code which is not part of a unit test to include in the analysis. The routine %uttcovr uses this functionality to provide a means of doing coverage analysis on the %ut routines and can be used as an example of its usage. A new tag (COV) has been added to the %ut routine (it simply calls the one in %ut1) so that all user APIs can be accessed within the %ut routine. A potential problem with setting up the %ut namespace in the local instance was addressed by Sam Habiel in the preinstall routine ZZUTPRE. --- ...0.KID => MASH-0_2-0_M-Unit_Test_150703.KID | 3774 +++++++++------- ...t => Packman Message MASH_0.2_0_150703.txt | 3842 ++++++++++------- Routines/%ut.m | 972 ++--- Routines/%ut1.m | 544 ++- Routines/%utcover.m | 138 + Routines/%utt1.m | 299 +- Routines/%utt2.m | 24 +- Routines/%utt3.m | 86 +- Routines/%utt4.m | 43 +- Routines/%utt5.m | 258 +- Routines/%utt6.m | 222 +- Routines/%uttcovr.m | 92 +- Routines/ZZUTPOST.m | 148 + Routines/ZZUTPRE.m | 42 + 14 files changed, 6190 insertions(+), 4294 deletions(-) rename MASH-0_1-0_M-Unit_Test_140910.KID => MASH-0_2-0_M-Unit_Test_150703.KID (65%) rename Packman Message MASH_0.1_0 140910.txt => Packman Message MASH_0.2_0_150703.txt (64%) create mode 100644 Routines/%utcover.m create mode 100644 Routines/ZZUTPOST.m create mode 100644 Routines/ZZUTPRE.m diff --git a/MASH-0_1-0_M-Unit_Test_140910.KID b/MASH-0_2-0_M-Unit_Test_150703.KID similarity index 65% rename from MASH-0_1-0_M-Unit_Test_140910.KID rename to MASH-0_2-0_M-Unit_Test_150703.KID index 13b6ddb..4855a1a 100644 --- a/MASH-0_1-0_M-Unit_Test_140910.KID +++ b/MASH-0_2-0_M-Unit_Test_150703.KID @@ -1,178 +1,234 @@ -KIDS Distribution saved on Sep 10, 2014@14:37:04 -Implements the M-Unit Test functionality. -**KIDS**:MASH*0.1*0^ +KIDS Distribution saved on Jul 03, 2015@13:42:04 +Updated version of M-Unit (%ut) of MASH UTILITIES +**KIDS**:MASH*0.2*0^ **INSTALL NAME** -MASH*0.1*0 -"BLD",5528,0) -MASH*0.1*0^MASH UTILITIES^0^3140910^y -"BLD",5528,1,0) -^^2^2^3140829^ -"BLD",5528,1,1,0) -M-Unit Test functionality to provide basic unit testing framework for M -"BLD",5528,1,2,0) -development. -"BLD",5528,4,0) +MASH*0.2*0 +"BLD",9544,0) +MASH*0.2*0^MASH UTILITIES^0^3150703^n +"BLD",9544,1,0) +^^24^24^3150703^^ +"BLD",9544,1,1,0) +Changes to functionality include: +"BLD",9544,1,2,0) + +"BLD",9544,1,3,0) +STARTUP and SHUTDOWN will be run in each routine instead of the first +"BLD",9544,1,4,0) +instance of STARTUP and SHUTDOWN encountered being the only ones that +"BLD",9544,1,5,0) +were run. This change was made because of possible suites of tests +"BLD",9544,1,6,0) +which have their own STARTUP and SHUTDOWN that need to be run. Also, +"BLD",9544,1,7,0) +it does not depend on the order in which test routines are run. +"BLD",9544,1,8,0) + +"BLD",9544,1,9,0) +While the coverage functionality can only be run on GT.M systems at +"BLD",9544,1,10,0) +the present time, the routine %utcover has been added to provide +"BLD",9544,1,11,0) +additional ability to run a number of unit tests at one time so that +"BLD",9544,1,12,0) +coverage across all of them can be obtained in one run, this includes +"BLD",9544,1,13,0) +the ability to specify entry at different APIs (e.g., if both verbose +"BLD",9544,1,14,0) +and nonverbose entries are available) as well as run code which is not +"BLD",9544,1,15,0) +part of a unit test to include in the analysis. The routine %uttcovr +"BLD",9544,1,16,0) +uses this functionality to provide a means of doing coverage analysis +"BLD",9544,1,17,0) +on the %ut routines and can be used as an example of its usage. +"BLD",9544,1,18,0) + +"BLD",9544,1,19,0) +A new tag (COV) has been added to the %ut routine (it simply calls +"BLD",9544,1,20,0) +the one in %ut1) so that all user APIs can be accessed within the %ut +"BLD",9544,1,21,0) +routine. +"BLD",9544,1,22,0) + +"BLD",9544,1,23,0) +A potential problem with setting up the %ut namespace in the local +"BLD",9544,1,24,0) +instance was addressed by Sam Habiel in the preinstall routine ZZUTPRE. +"BLD",9544,4,0) ^9.64PA^17.9001^1 -"BLD",5528,4,17.9001,0) +"BLD",9544,4,17.9001,0) 17.9001 -"BLD",5528,4,17.9001,222) +"BLD",9544,4,17.9001,222) y^y^f^^n^^y^o^n -"BLD",5528,4,"B",17.9001,17.9001) +"BLD",9544,4,"B",17.9001,17.9001) -"BLD",5528,"ABPKG") +"BLD",9544,6.3) +4 +"BLD",9544,"ABPKG") n -"BLD",5528,"INI") +"BLD",9544,"INI") ZZUTPRE -"BLD",5528,"INID") +"BLD",9544,"INID") ^n^n -"BLD",5528,"INIT") +"BLD",9544,"INIT") ZZUTPOST -"BLD",5528,"KRN",0) -^9.67PA^8989.52^19 -"BLD",5528,"KRN",.4,0) +"BLD",9544,"KRN",0) +^9.67PA^779.2^20 +"BLD",9544,"KRN",.4,0) .4 -"BLD",5528,"KRN",.401,0) +"BLD",9544,"KRN",.401,0) .401 -"BLD",5528,"KRN",.402,0) +"BLD",9544,"KRN",.402,0) .402 -"BLD",5528,"KRN",.403,0) +"BLD",9544,"KRN",.403,0) .403 -"BLD",5528,"KRN",.5,0) +"BLD",9544,"KRN",.5,0) .5 -"BLD",5528,"KRN",.84,0) +"BLD",9544,"KRN",.84,0) .84 -"BLD",5528,"KRN",3.6,0) +"BLD",9544,"KRN",3.6,0) 3.6 -"BLD",5528,"KRN",3.8,0) +"BLD",9544,"KRN",3.8,0) 3.8 -"BLD",5528,"KRN",9.2,0) +"BLD",9544,"KRN",9.2,0) 9.2 -"BLD",5528,"KRN",9.8,0) +"BLD",9544,"KRN",9.8,0) 9.8 -"BLD",5528,"KRN",9.8,"NM",0) -^9.68A^9^9 -"BLD",5528,"KRN",9.8,"NM",1,0) -ut^^0^B257937062 -"BLD",5528,"KRN",9.8,"NM",2,0) -ut1^^0^B87092328 -"BLD",5528,"KRN",9.8,"NM",3,0) -utt1^^0^B25860592 -"BLD",5528,"KRN",9.8,"NM",4,0) +"BLD",9544,"KRN",9.8,"NM",0) +^9.68A^10^10 +"BLD",9544,"KRN",9.8,"NM",1,0) +ut^^0^B268535658 +"BLD",9544,"KRN",9.8,"NM",2,0) +ut1^^0^B105832889 +"BLD",9544,"KRN",9.8,"NM",3,0) +utt1^^0^B26409996 +"BLD",9544,"KRN",9.8,"NM",4,0) utt2^^0^B473823 -"BLD",5528,"KRN",9.8,"NM",5,0) +"BLD",9544,"KRN",9.8,"NM",5,0) utt3^^0^B1493136 -"BLD",5528,"KRN",9.8,"NM",6,0) +"BLD",9544,"KRN",9.8,"NM",6,0) utt4^^0^B1419637 -"BLD",5528,"KRN",9.8,"NM",7,0) +"BLD",9544,"KRN",9.8,"NM",7,0) utt5^^0^B22421637 -"BLD",5528,"KRN",9.8,"NM",8,0) -utt6^^0^B29243478 -"BLD",5528,"KRN",9.8,"NM",9,0) -uttcovr^^0^B2835727 -"BLD",5528,"KRN",9.8,"NM","B","ut",1) +"BLD",9544,"KRN",9.8,"NM",8,0) +utt6^^0^B30140551 +"BLD",9544,"KRN",9.8,"NM",9,0) +uttcovr^^0^B88235384 +"BLD",9544,"KRN",9.8,"NM",10,0) +utcover^^0^B63651128 +"BLD",9544,"KRN",9.8,"NM","B","ut",1) -"BLD",5528,"KRN",9.8,"NM","B","ut1",2) +"BLD",9544,"KRN",9.8,"NM","B","ut1",2) -"BLD",5528,"KRN",9.8,"NM","B","utt1",3) +"BLD",9544,"KRN",9.8,"NM","B","utcover",10) -"BLD",5528,"KRN",9.8,"NM","B","utt2",4) +"BLD",9544,"KRN",9.8,"NM","B","utt1",3) -"BLD",5528,"KRN",9.8,"NM","B","utt3",5) +"BLD",9544,"KRN",9.8,"NM","B","utt2",4) -"BLD",5528,"KRN",9.8,"NM","B","utt4",6) +"BLD",9544,"KRN",9.8,"NM","B","utt3",5) -"BLD",5528,"KRN",9.8,"NM","B","utt5",7) +"BLD",9544,"KRN",9.8,"NM","B","utt4",6) -"BLD",5528,"KRN",9.8,"NM","B","utt6",8) +"BLD",9544,"KRN",9.8,"NM","B","utt5",7) -"BLD",5528,"KRN",9.8,"NM","B","uttcovr",9) +"BLD",9544,"KRN",9.8,"NM","B","utt6",8) -"BLD",5528,"KRN",19,0) +"BLD",9544,"KRN",9.8,"NM","B","uttcovr",9) + +"BLD",9544,"KRN",19,0) 19 -"BLD",5528,"KRN",19,"NM",0) +"BLD",9544,"KRN",19,"NM",0) ^9.68A^3^3 -"BLD",5528,"KRN",19,"NM",1,0) +"BLD",9544,"KRN",19,"NM",1,0) utMUNIT^^0 -"BLD",5528,"KRN",19,"NM",2,0) +"BLD",9544,"KRN",19,"NM",2,0) utMUNIT GROUP EDIT^^0 -"BLD",5528,"KRN",19,"NM",3,0) +"BLD",9544,"KRN",19,"NM",3,0) utMUNIT GROUP RUN^^0 -"BLD",5528,"KRN",19,"NM","B","utMUNIT",1) +"BLD",9544,"KRN",19,"NM","B","utMUNIT",1) -"BLD",5528,"KRN",19,"NM","B","utMUNIT GROUP EDIT",2) +"BLD",9544,"KRN",19,"NM","B","utMUNIT GROUP EDIT",2) -"BLD",5528,"KRN",19,"NM","B","utMUNIT GROUP RUN",3) +"BLD",9544,"KRN",19,"NM","B","utMUNIT GROUP RUN",3) -"BLD",5528,"KRN",19.1,0) +"BLD",9544,"KRN",19.1,0) 19.1 -"BLD",5528,"KRN",101,0) +"BLD",9544,"KRN",101,0) 101 -"BLD",5528,"KRN",409.61,0) +"BLD",9544,"KRN",409.61,0) 409.61 -"BLD",5528,"KRN",771,0) +"BLD",9544,"KRN",771,0) 771 -"BLD",5528,"KRN",870,0) +"BLD",9544,"KRN",779.2,0) +779.2 +"BLD",9544,"KRN",870,0) 870 -"BLD",5528,"KRN",8989.51,0) +"BLD",9544,"KRN",8989.51,0) 8989.51 -"BLD",5528,"KRN",8989.52,0) +"BLD",9544,"KRN",8989.52,0) 8989.52 -"BLD",5528,"KRN",8994,0) +"BLD",9544,"KRN",8994,0) 8994 -"BLD",5528,"KRN",8994,"NM",0) +"BLD",9544,"KRN",8994,"NM",0) ^9.68A^3^3 -"BLD",5528,"KRN",8994,"NM",1,0) +"BLD",9544,"KRN",8994,"NM",1,0) utMUNIT-TEST GROUP LOAD^^0 -"BLD",5528,"KRN",8994,"NM",2,0) +"BLD",9544,"KRN",8994,"NM",2,0) utMUNIT-TEST LOAD^^0 -"BLD",5528,"KRN",8994,"NM",3,0) +"BLD",9544,"KRN",8994,"NM",3,0) utMUNIT-TEST NEXT^^0 -"BLD",5528,"KRN",8994,"NM","B","utMUNIT-TEST GROUP LOAD",1) +"BLD",9544,"KRN",8994,"NM","B","utMUNIT-TEST GROUP LOAD",1) -"BLD",5528,"KRN",8994,"NM","B","utMUNIT-TEST LOAD",2) +"BLD",9544,"KRN",8994,"NM","B","utMUNIT-TEST LOAD",2) -"BLD",5528,"KRN",8994,"NM","B","utMUNIT-TEST NEXT",3) +"BLD",9544,"KRN",8994,"NM","B","utMUNIT-TEST NEXT",3) -"BLD",5528,"KRN","B",.4,.4) +"BLD",9544,"KRN","B",.4,.4) -"BLD",5528,"KRN","B",.401,.401) +"BLD",9544,"KRN","B",.401,.401) -"BLD",5528,"KRN","B",.402,.402) +"BLD",9544,"KRN","B",.402,.402) -"BLD",5528,"KRN","B",.403,.403) +"BLD",9544,"KRN","B",.403,.403) -"BLD",5528,"KRN","B",.5,.5) +"BLD",9544,"KRN","B",.5,.5) -"BLD",5528,"KRN","B",.84,.84) +"BLD",9544,"KRN","B",.84,.84) -"BLD",5528,"KRN","B",3.6,3.6) +"BLD",9544,"KRN","B",3.6,3.6) -"BLD",5528,"KRN","B",3.8,3.8) +"BLD",9544,"KRN","B",3.8,3.8) -"BLD",5528,"KRN","B",9.2,9.2) +"BLD",9544,"KRN","B",9.2,9.2) -"BLD",5528,"KRN","B",9.8,9.8) +"BLD",9544,"KRN","B",9.8,9.8) -"BLD",5528,"KRN","B",19,19) +"BLD",9544,"KRN","B",19,19) -"BLD",5528,"KRN","B",19.1,19.1) +"BLD",9544,"KRN","B",19.1,19.1) -"BLD",5528,"KRN","B",101,101) +"BLD",9544,"KRN","B",101,101) -"BLD",5528,"KRN","B",409.61,409.61) +"BLD",9544,"KRN","B",409.61,409.61) -"BLD",5528,"KRN","B",771,771) +"BLD",9544,"KRN","B",771,771) -"BLD",5528,"KRN","B",870,870) +"BLD",9544,"KRN","B",779.2,779.2) -"BLD",5528,"KRN","B",8989.51,8989.51) +"BLD",9544,"KRN","B",870,870) -"BLD",5528,"KRN","B",8989.52,8989.52) +"BLD",9544,"KRN","B",8989.51,8989.51) -"BLD",5528,"KRN","B",8994,8994) +"BLD",9544,"KRN","B",8989.52,8989.52) -"BLD",5528,"QUES",0) +"BLD",9544,"KRN","B",8994,8994) + +"BLD",9544,"QDEF") +^^^^NO^^^^NO^^NO +"BLD",9544,"QUES",0) ^9.62^^ "DATA",17.9001,1,0) TESTS FOR UNIT TEST ROUTINES @@ -203,7 +259,7 @@ y^y^f^^n^^y^o^n "FIA",17.9001,0,"RLRO") "FIA",17.9001,0,"VR") -0.1^MASH +0.2^MASH "FIA",17.9001,17.9001) 0 "FIA",17.9001,17.90011) @@ -214,77 +270,77 @@ y^y^f^^n^^y^o^n ZZUTPRE "INIT") ZZUTPOST -"KRN",19,10068,-1) +"KRN",19,11538,-1) 0^1 -"KRN",19,10068,0) +"KRN",19,11538,0) utMUNIT^M-Unit Tester^^B^^^^^^^^ -"KRN",19,10068,1,0) +"KRN",19,11538,1,0) ^^1^1^3140805^ -"KRN",19,10068,1,1,0) +"KRN",19,11538,1,1,0) This is the context option for M-Unit Test functionality. -"KRN",19,10068,"RPC",0) +"KRN",19,11538,"RPC",0) ^19.05P^3^3 -"KRN",19,10068,"RPC",1,0) +"KRN",19,11538,"RPC",1,0) utMUNIT-TEST GROUP LOAD -"KRN",19,10068,"RPC",2,0) +"KRN",19,11538,"RPC",2,0) utMUNIT-TEST LOAD -"KRN",19,10068,"RPC",3,0) +"KRN",19,11538,"RPC",3,0) utMUNIT-TEST NEXT -"KRN",19,10068,"U") +"KRN",19,11538,"U") M-UNIT TESTER -"KRN",19,10069,-1) +"KRN",19,11539,-1) 0^2 -"KRN",19,10069,0) +"KRN",19,11539,0) utMUNIT GROUP EDIT^M-Unit Test Group Edit^^E^^^^^^^^TOOLKIT -"KRN",19,10069,1,0) +"KRN",19,11539,1,0) ^19.06^6^6^3031030^^^ -"KRN",19,10069,1,1,0) +"KRN",19,11539,1,1,0) This option can be used to maintain a listing of unit tests related to a -"KRN",19,10069,1,2,0) +"KRN",19,11539,1,2,0) specific topic. The Group identifies the topic, and the unit tests -"KRN",19,10069,1,3,0) +"KRN",19,11539,1,3,0) related to that topic are added in the multiple. Unit Tests can be run -"KRN",19,10069,1,4,0) +"KRN",19,11539,1,4,0) by selecting a group, and all unit tests included in the multiple will be -"KRN",19,10069,1,5,0) +"KRN",19,11539,1,5,0) used for the test. In addition, any other references under the XTROU tag -"KRN",19,10069,1,6,0) +"KRN",19,11539,1,6,0) in any of the included test routines will be included in the run. -"KRN",19,10069,30) +"KRN",19,11539,30) %ut(17.9001, -"KRN",19,10069,31) +"KRN",19,11539,31) AEMQL -"KRN",19,10069,50) +"KRN",19,11539,50) 17.9001 -"KRN",19,10069,51) +"KRN",19,11539,51) .01;1 -"KRN",19,10069,"U") +"KRN",19,11539,"U") M-UNIT TEST GROUP EDIT -"KRN",19,10070,-1) +"KRN",19,11540,-1) 0^3 -"KRN",19,10070,0) +"KRN",19,11540,0) utMUNIT GROUP RUN^Run M-Unit Tests From Test Groups^^R^^^^^^^^TOOLKIT -"KRN",19,10070,1,0) +"KRN",19,11540,1,0) ^^2^2^3031030^ -"KRN",19,10070,1,1,0) +"KRN",19,11540,1,1,0) Provides a means of initiating a unit test run from the menu system based -"KRN",19,10070,1,2,0) +"KRN",19,11540,1,2,0) on entries in the M-UNIT TEST GROUP file (#17.9001). -"KRN",19,10070,25) +"KRN",19,11540,25) PICKSET^%ut -"KRN",19,10070,"U") +"KRN",19,11540,"U") RUN M-UNIT TESTS FROM TEST GRO -"KRN",8994,1866,-1) +"KRN",8994,3261,-1) 0^1 -"KRN",8994,1866,0) +"KRN",8994,3261,0) utMUNIT-TEST GROUP LOAD^GUISET^%ut^4^^^^1 -"KRN",8994,1867,-1) +"KRN",8994,3262,-1) 0^2 -"KRN",8994,1867,0) +"KRN",8994,3262,0) utMUNIT-TEST LOAD^GUILOAD^%ut^4^^^^1 -"KRN",8994,1868,-1) +"KRN",8994,3263,-1) 0^3 -"KRN",8994,1868,0) +"KRN",8994,3263,0) utMUNIT-TEST NEXT^GUINEXT^%ut^4^^^^1 "MBREQ") 0 @@ -296,24 +352,68 @@ REMOTE PROCEDURE 19;18;;;OPT^XPDTA;OPTF1^XPDIA;OPTE1^XPDIA;OPTF2^XPDIA;;OPTDEL^XPDIA "ORD",18,19,0) OPTION -"PKG",201,-1) +"PKG",222,-1) 1^1 -"PKG",201,0) +"PKG",222,0) MASH UTILITIES^%u^Utilities associated with the M Advanced Shell -"PKG",201,20,0) +"PKG",222,20,0) ^9.402P^^ -"PKG",201,22,0) +"PKG",222,22,0) ^9.49I^1^1 -"PKG",201,22,1,0) -0.1 -"PKG",201,22,1,"PAH",1,0) -0^3140910^2802 -"PKG",201,22,1,"PAH",1,1,0) -^^2^2^3140910 -"PKG",201,22,1,"PAH",1,1,1,0) -M-Unit Test functionality to provide basic unit testing framework for M -"PKG",201,22,1,"PAH",1,1,2,0) -development. +"PKG",222,22,1,0) +0.2 +"PKG",222,22,1,"PAH",1,0) +0^3150703 +"PKG",222,22,1,"PAH",1,1,0) +^^24^24^3150703 +"PKG",222,22,1,"PAH",1,1,1,0) +Changes to functionality include: +"PKG",222,22,1,"PAH",1,1,2,0) + +"PKG",222,22,1,"PAH",1,1,3,0) +STARTUP and SHUTDOWN will be run in each routine instead of the first +"PKG",222,22,1,"PAH",1,1,4,0) +instance of STARTUP and SHUTDOWN encountered being the only ones that +"PKG",222,22,1,"PAH",1,1,5,0) +were run. This change was made because of possible suites of tests +"PKG",222,22,1,"PAH",1,1,6,0) +which have their own STARTUP and SHUTDOWN that need to be run. Also, +"PKG",222,22,1,"PAH",1,1,7,0) +it does not depend on the order in which test routines are run. +"PKG",222,22,1,"PAH",1,1,8,0) + +"PKG",222,22,1,"PAH",1,1,9,0) +While the coverage functionality can only be run on GT.M systems at +"PKG",222,22,1,"PAH",1,1,10,0) +the present time, the routine %utcover has been added to provide +"PKG",222,22,1,"PAH",1,1,11,0) +additional ability to run a number of unit tests at one time so that +"PKG",222,22,1,"PAH",1,1,12,0) +coverage across all of them can be obtained in one run, this includes +"PKG",222,22,1,"PAH",1,1,13,0) +the ability to specify entry at different APIs (e.g., if both verbose +"PKG",222,22,1,"PAH",1,1,14,0) +and nonverbose entries are available) as well as run code which is not +"PKG",222,22,1,"PAH",1,1,15,0) +part of a unit test to include in the analysis. The routine %uttcovr +"PKG",222,22,1,"PAH",1,1,16,0) +uses this functionality to provide a means of doing coverage analysis +"PKG",222,22,1,"PAH",1,1,17,0) +on the %ut routines and can be used as an example of its usage. +"PKG",222,22,1,"PAH",1,1,18,0) + +"PKG",222,22,1,"PAH",1,1,19,0) +A new tag (COV) has been added to the %ut routine (it simply calls +"PKG",222,22,1,"PAH",1,1,20,0) +the one in %ut1) so that all user APIs can be accessed within the %ut +"PKG",222,22,1,"PAH",1,1,21,0) +routine. +"PKG",222,22,1,"PAH",1,1,22,0) + +"PKG",222,22,1,"PAH",1,1,23,0) +A potential problem with setting up the %ut namespace in the local +"PKG",222,22,1,"PAH",1,1,24,0) +instance was addressed by Sam Habiel in the preinstall routine ZZUTPRE. "QUES","XPF1",0) Y "QUES","XPF1","??") @@ -341,7 +441,7 @@ YO "QUES","XPI1","A") Want KIDS to INHIBIT LOGONs during the install "QUES","XPI1","B") -YES +NO "QUES","XPI1","M") D XPI1^XPDIQ "QUES","XPM1",0) @@ -361,7 +461,7 @@ Y "QUES","XPO1","A") Want KIDS to Rebuild Menu Trees Upon Completion of Install "QUES","XPO1","B") -YES +NO "QUES","XPO1","M") D XPO1^XPDIQ "QUES","XPZ1",0) @@ -371,7 +471,7 @@ Y "QUES","XPZ1","A") Want to DISABLE Scheduled Options, Menu Options, and Protocols "QUES","XPZ1","B") -YES +NO "QUES","XPZ1","M") D XPZ1^XPDIQ "QUES","XPZ2",0) @@ -385,377 +485,377 @@ NO "QUES","XPZ2","M") D XPZ2^XPDIQ "RTN") -11 +12 "RTN","ZZUTPOST") -0^^B30449799 +0^^B39206871 "RTN","ZZUTPOST",1,0) -ut01POST ;VEN-SMH/JLI - post install for M-Unit Test software ;08/28/14 12:29 +ut01POST ;VEN-SMH/JLI - post install for M-Unit Test software ;08/28/14 12:29 "RTN","ZZUTPOST",2,0) - ;;0.1;MASH UTILITIES + ;;0.1;MASH UTILITIES;;;Build 4 "RTN","ZZUTPOST",3,0) - N X,I + N X,I "RTN","ZZUTPOST",4,0) - I +$SY=47 D R X:$G(DTIME,300) D MES^XPDUTL(" ") + I +$SY=47 D R X:$G(DTIME,300) D MES^XPDUTL(" ") "RTN","ZZUTPOST",5,0) - . S X(1)=" " + . S X(1)=" " "RTN","ZZUTPOST",6,0) - . S X(2)="In the next section, as it tries to copy the ut* routines" + . S X(2)="In the next section, as it tries to copy the ut* routines" "RTN","ZZUTPOST",7,0) - . S X(3)="to %ut* routines watch for text that indicates the following:" + . S X(3)="to %ut* routines watch for text that indicates the following:" "RTN","ZZUTPOST",8,0) - . S X(4)=" " + . S X(4)=" " "RTN","ZZUTPOST",9,0) - . S X(5)="cp: cannot create regular file `/_ut.m': Permission denied" + . S X(5)="cp: cannot create regular file `/_ut.m': Permission denied" "RTN","ZZUTPOST",10,0) - . S X(6)=" " + . S X(6)=" " "RTN","ZZUTPOST",11,0) - . S X(7)="If this is seen, respond Yes at the prompt after the attempt:" + . S X(7)="If this is seen, respond Yes at the prompt after the attempt:" "RTN","ZZUTPOST",12,0) - . S X(8)=" Press ENTER to continue: " + . S X(8)=" Press ENTER to continue: " "RTN","ZZUTPOST",13,0) - . F I=1:1:18 D MES^XPDUTL(" ") ; create a blank screen for text + . F I=1:1:18 D MES^XPDUTL(" ") ; create a blank screen for text "RTN","ZZUTPOST",14,0) - . D MES^XPDUTL(.X) + . D MES^XPDUTL(.X) "RTN","ZZUTPOST",15,0) - . Q + . Q "RTN","ZZUTPOST",16,0) - D RENAME + D RENAME "RTN","ZZUTPOST",17,0) - I +$SY=47 D R X:$G(DTIME,300) I "Yy"[$E($G(X)) D GTMPROB + I +$SY=47 D R X:$G(DTIME,300) I "Yy"[$E($G(X)) D GTMPROB "RTN","ZZUTPOST",18,0) - . K X + . K X "RTN","ZZUTPOST",19,0) - . S X(1)=" " + . S X(1)=" " "RTN","ZZUTPOST",20,0) - . S X(2)=" Your entry on the next line may not echo" + . S X(2)=" Your entry on the next line may not echo" "RTN","ZZUTPOST",21,0) - . S X(3)="If error text was seen enter Y (and RETURN): NO// " + . S X(3)="If error text was seen enter Y (and RETURN): NO// " "RTN","ZZUTPOST",22,0) - . D MES^XPDUTL(.X) + . D MES^XPDUTL(.X) "RTN","ZZUTPOST",23,0) - . Q + . Q "RTN","ZZUTPOST",24,0) - Q + Q "RTN","ZZUTPOST",25,0) - ; + ; "RTN","ZZUTPOST",26,0) -RENAME ; +RENAME ; "RTN","ZZUTPOST",27,0) - N %S,%D ; Source, destination + N %S,%D ; Source, destination "RTN","ZZUTPOST",28,0) - S U="^" + S U="^" "RTN","ZZUTPOST",29,0) - S %S="ut^ut1^utt1^utt2^utt3^utt4^utt5^utt6^uttcovr" + S %S="ut^ut1^utt1^utt2^utt3^utt4^utt5^utt6^uttcovr" "RTN","ZZUTPOST",30,0) - S %D="%ut^%ut1^%utt1^%utt2^%utt3^%utt4^%utt5^%utt6^%uttcovr" + S %D="%ut^%ut1^%utt1^%utt2^%utt3^%utt4^%utt5^%utt6^%uttcovr" "RTN","ZZUTPOST",31,0) - ; + ; "RTN","ZZUTPOST",32,0) -MOVE ; rename % routines +MOVE ; rename % routines "RTN","ZZUTPOST",33,0) - N %,X,Y,M + N %,X,Y,M "RTN","ZZUTPOST",34,0) - F %=1:1:$L(%D,"^") D D MES(M) I +$SY=47 D MES(" ") + F %=1:1:$L(%D,"^") D D MES(M) I +$SY=47 D MES(" ") "RTN","ZZUTPOST",35,0) - . S M="",X=$P(%S,U,%) ; from + . S M="",X=$P(%S,U,%) ; from "RTN","ZZUTPOST",36,0) - . S Y=$P(%D,U,%) ; to + . S Y=$P(%D,U,%) ; to "RTN","ZZUTPOST",37,0) - . Q:X="" + . Q:X="" "RTN","ZZUTPOST",38,0) - . S M="Routine: "_$J(X,8) + . S M="Routine: "_$J(X,8) "RTN","ZZUTPOST",39,0) - . Q:Y="" I $T(^@X)="" S M=M_" Missing" Q + . Q:Y="" I $T(^@X)="" S M=M_" Missing" Q "RTN","ZZUTPOST",40,0) - . S M=M_" Loaded, " + . S M=M_" Loaded, " "RTN","ZZUTPOST",41,0) - . D COPY(X,Y) + . D COPY(X,Y) "RTN","ZZUTPOST",42,0) - . S M=M_"Saved as "_$J(Y,8) + . S M=M_"Saved as "_$J(Y,8) "RTN","ZZUTPOST",43,0) - ; + ; "RTN","ZZUTPOST",44,0) - QUIT ; END + QUIT ; END "RTN","ZZUTPOST",45,0) - ; + ; "RTN","ZZUTPOST",46,0) -COPY(FROM,TO) ; +COPY(FROM,TO) ; "RTN","ZZUTPOST",47,0) - N XVAL + N XVAL "RTN","ZZUTPOST",48,0) - I +$SYSTEM=0 S XVAL="ZL @FROM ZS @TO" X XVAL QUIT + I +$SYSTEM=0 S XVAL="ZL @FROM ZS @TO" X XVAL QUIT "RTN","ZZUTPOST",49,0) - I +$SYSTEM=47 DO QUIT + I +$SYSTEM=47 DO QUIT "RTN","ZZUTPOST",50,0) - . S FROM=$$PATH(FROM) + . S FROM=$$PATH(FROM) "RTN","ZZUTPOST",51,0) - . S TO=$$PATH(TO,"WRITE") + . S TO=$$PATH(TO,"WRITE") "RTN","ZZUTPOST",52,0) - . N CMD S CMD="cp "_FROM_" "_TO + . N CMD S CMD="cp "_FROM_" "_TO "RTN","ZZUTPOST",53,0) - . O "cp":(shell="/bin/sh":command=CMD:WRITEONLY)::"PIPE" + . O "cp":(shell="/bin/sh":command=CMD:WRITEONLY)::"PIPE" "RTN","ZZUTPOST",54,0) - . U "cp" C "cp" + . U "cp" C "cp" "RTN","ZZUTPOST",55,0) - QUIT + QUIT "RTN","ZZUTPOST",56,0) - ; + ; "RTN","ZZUTPOST",57,0) -PATH(ROUTINE,MODE) ; for GT.M return source file with path for a routine +PATH(ROUTINE,MODE) ; for GT.M return source file with path for a routine "RTN","ZZUTPOST",58,0) - ;input: ROUTINE=Name of routine + ;input: ROUTINE=Name of routine "RTN","ZZUTPOST",59,0) - ; MODE="READ" or "WRITE" defaults to READ + ; MODE="READ" or "WRITE" defaults to READ "RTN","ZZUTPOST",60,0) - ;output: Full filename + ;output: Full filename "RTN","ZZUTPOST",61,0) - ; + ; "RTN","ZZUTPOST",62,0) - S MODE=$G(MODE,"READ") ;set MODE to default value + S MODE=$G(MODE,"READ") ;set MODE to default value "RTN","ZZUTPOST",63,0) - N FILE S FILE=$TR(ROUTINE,"%","_")_".m" ;convert rtn name to filename + N FILE S FILE=$TR(ROUTINE,"%","_")_".m" ;convert rtn name to filename "RTN","ZZUTPOST",64,0) - N ZRO S ZRO=$ZRO + N ZRO S ZRO=$ZRO "RTN","ZZUTPOST",65,0) - ; + ; "RTN","ZZUTPOST",66,0) - ; Get source routine + ; Get source routine "RTN","ZZUTPOST",67,0) - N %ZR + N %ZR "RTN","ZZUTPOST",68,0) - I MODE="READ" D SILENT^%RSEL(ROUTINE,"SRC") Q %ZR(ROUTINE)_FILE + I MODE="READ" D SILENT^%RSEL(ROUTINE,"SRC") Q %ZR(ROUTINE)_FILE "RTN","ZZUTPOST",69,0) - ; + ; "RTN","ZZUTPOST",70,0) - ; We are writing. Parse directories and get 1st routine directory + ; We are writing. Parse directories and get 1st routine directory "RTN","ZZUTPOST",71,0) - N DIRS + N DIRS "RTN","ZZUTPOST",72,0) - D PARSEZRO(.DIRS,ZRO) + D PARSEZRO(.DIRS,ZRO) "RTN","ZZUTPOST",73,0) - N PATH S PATH=$$ZRO1ST(.DIRS) + N PATH S PATH=$$ZRO1ST(.DIRS) "RTN","ZZUTPOST",74,0) - ; + ; "RTN","ZZUTPOST",75,0) - QUIT PATH_FILE ;end of PATH return directory and filename + QUIT PATH_FILE ;end of PATH return directory and filename "RTN","ZZUTPOST",76,0) - ; + ; "RTN","ZZUTPOST",77,0) - ; + ; "RTN","ZZUTPOST",78,0) -PARSEZRO(DIRS,ZRO) ; Parse $zroutines properly into an array +PARSEZRO(DIRS,ZRO) ; Parse $zroutines properly into an array "RTN","ZZUTPOST",79,0) - N PIECE + N PIECE "RTN","ZZUTPOST",80,0) - N I + N I "RTN","ZZUTPOST",81,0) - F I=1:1:$L(ZRO," ") S PIECE(I)=$P(ZRO," ",I) + F I=1:1:$L(ZRO," ") S PIECE(I)=$P(ZRO," ",I) "RTN","ZZUTPOST",82,0) - N CNT S CNT=1 + N CNT S CNT=1 "RTN","ZZUTPOST",83,0) - F I=0:0 S I=$O(PIECE(I)) Q:'I D + F I=0:0 S I=$O(PIECE(I)) Q:'I D "RTN","ZZUTPOST",84,0) - . S DIRS(CNT)=$G(DIRS(CNT))_PIECE(I) + . S DIRS(CNT)=$G(DIRS(CNT))_PIECE(I) "RTN","ZZUTPOST",85,0) - . I DIRS(CNT)["("&(DIRS(CNT)[")") S CNT=CNT+1 QUIT + . I DIRS(CNT)["("&(DIRS(CNT)[")") S CNT=CNT+1 QUIT "RTN","ZZUTPOST",86,0) - . I DIRS(CNT)'["("&(DIRS(CNT)'[")") S CNT=CNT+1 QUIT + . I DIRS(CNT)'["("&(DIRS(CNT)'[")") S CNT=CNT+1 QUIT "RTN","ZZUTPOST",87,0) - . S DIRS(CNT)=DIRS(CNT)_" " ; prep for next piece + . S DIRS(CNT)=DIRS(CNT)_" " ; prep for next piece "RTN","ZZUTPOST",88,0) - QUIT + QUIT "RTN","ZZUTPOST",89,0) - ; + ; "RTN","ZZUTPOST",90,0) -ZRO1ST(DIRS) ; $$ Get first routine directory +ZRO1ST(DIRS) ; $$ Get first routine directory "RTN","ZZUTPOST",91,0) - N OUT ; $$ return + N OUT ; $$ return "RTN","ZZUTPOST",92,0) - N %1 S %1=DIRS(1) ; 1st directory + N %1 S %1=DIRS(1) ; 1st directory "RTN","ZZUTPOST",93,0) - ; Parse with (...) + ; Parse with (...) "RTN","ZZUTPOST",94,0) - I %1["(" DO + I %1["(" DO "RTN","ZZUTPOST",95,0) - . S OUT=$P(%1,"(",2) + . S OUT=$P(%1,"(",2) "RTN","ZZUTPOST",96,0) - . I OUT[" " S OUT=$P(OUT," ") + . I OUT[" " S OUT=$P(OUT," ") "RTN","ZZUTPOST",97,0) - . E S OUT=$P(OUT,")") + . E S OUT=$P(OUT,")") "RTN","ZZUTPOST",98,0) - ; no parens + ; no parens "RTN","ZZUTPOST",99,0) - E S OUT=%1 + E S OUT=%1 "RTN","ZZUTPOST",100,0) - ; + ; "RTN","ZZUTPOST",101,0) - ; Add trailing slash + ; Add trailing slash "RTN","ZZUTPOST",102,0) - I $E(OUT,$L(OUT))'="/" S OUT=OUT_"/" + I $E(OUT,$L(OUT))'="/" S OUT=OUT_"/" "RTN","ZZUTPOST",103,0) - QUIT OUT + QUIT OUT "RTN","ZZUTPOST",104,0) - ; + ; "RTN","ZZUTPOST",105,0) -MES(T,B) ;Write message. +MES(T,B) ;Write message. "RTN","ZZUTPOST",106,0) - S B=$G(B) + S B=$G(B) "RTN","ZZUTPOST",107,0) - I $L($T(BMES^XPDUTL)) D BMES^XPDUTL(T):B,MES^XPDUTL(T):'B Q + I $L($T(BMES^XPDUTL)) D BMES^XPDUTL(T):B,MES^XPDUTL(T):'B Q "RTN","ZZUTPOST",108,0) - W:B ! W !,T + W:B ! W !,T "RTN","ZZUTPOST",109,0) - Q + Q "RTN","ZZUTPOST",110,0) - ; + ; "RTN","ZZUTPOST",111,0) -TEST ; @TEST - TESTING TESTING +TEST ; @TEST - TESTING TESTING "RTN","ZZUTPOST",112,0) - ; + ; "RTN","ZZUTPOST",113,0) - N ZR S ZR="o(p r) /var/abc(/var/abc/r/) /abc/def $gtm_dist/libgtmutl.so vista.so" + N ZR S ZR="o(p r) /var/abc(/var/abc/r/) /abc/def $gtm_dist/libgtmutl.so vista.so" "RTN","ZZUTPOST",114,0) - N DIRS D PARSEZRO(.DIRS,ZR) + N DIRS D PARSEZRO(.DIRS,ZR) "RTN","ZZUTPOST",115,0) - N FIRSTDIR S FIRSTDIR=$$ZRO1ST(.DIRS) + N FIRSTDIR S FIRSTDIR=$$ZRO1ST(.DIRS) "RTN","ZZUTPOST",116,0) - I FIRSTDIR'="p" S $EC=",U1," + I FIRSTDIR'="p" S $EC=",U1," "RTN","ZZUTPOST",117,0) - ; + ; "RTN","ZZUTPOST",118,0) - N ZR S ZR="/var/abc(/var/abc/r/) o(p r) /abc/def $gtm_dist/libgtmutl.so vista.so" + N ZR S ZR="/var/abc(/var/abc/r/) o(p r) /abc/def $gtm_dist/libgtmutl.so vista.so" "RTN","ZZUTPOST",119,0) - N DIRS D PARSEZRO(.DIRS,ZR) + N DIRS D PARSEZRO(.DIRS,ZR) "RTN","ZZUTPOST",120,0) - N FIRSTDIR S FIRSTDIR=$$ZRO1ST(.DIRS) + N FIRSTDIR S FIRSTDIR=$$ZRO1ST(.DIRS) "RTN","ZZUTPOST",121,0) - I FIRSTDIR'="/var/abc/r/" S $EC=",U1," + I FIRSTDIR'="/var/abc/r/" S $EC=",U1," "RTN","ZZUTPOST",122,0) - ; + ; "RTN","ZZUTPOST",123,0) - N ZR S ZR="/abc/def /var/abc(/var/abc/r/) o(p r) $gtm_dist/libgtmutl.so vista.so" + N ZR S ZR="/abc/def /var/abc(/var/abc/r/) o(p r) $gtm_dist/libgtmutl.so vista.so" "RTN","ZZUTPOST",124,0) - N DIRS D PARSEZRO(.DIRS,ZR) + N DIRS D PARSEZRO(.DIRS,ZR) "RTN","ZZUTPOST",125,0) - N FIRSTDIR S FIRSTDIR=$$ZRO1ST(.DIRS) + N FIRSTDIR S FIRSTDIR=$$ZRO1ST(.DIRS) "RTN","ZZUTPOST",126,0) - I FIRSTDIR'="/abc/def" S $EC=",U1," + I FIRSTDIR'="/abc/def" S $EC=",U1," "RTN","ZZUTPOST",127,0) - ; + ; "RTN","ZZUTPOST",128,0) - WRITE "All tests have run successfully!",! + WRITE "All tests have run successfully!",! "RTN","ZZUTPOST",129,0) - QUIT + QUIT "RTN","ZZUTPOST",130,0) - ; + ; "RTN","ZZUTPOST",131,0) GTMPROB ; come here in case of error trying to run unit tests - checks whether renaming worked "RTN","ZZUTPOST",132,0) - N X + N X "RTN","ZZUTPOST",133,0) - S X(1)=" " + S X(1)=" " "RTN","ZZUTPOST",134,0) - S X(2)="*** An error occurred during renaming of routines to %ut*." + S X(2)="*** An error occurred during renaming of routines to %ut*." "RTN","ZZUTPOST",135,0) - S X(3)="*** The renaming has been seen to fail on one type of Linux system." + S X(3)="*** The renaming has been seen to fail on one type of Linux system." "RTN","ZZUTPOST",136,0) - S X(4)="*** In this case, at the Linux command line copy each ut*.m routine" + S X(4)="*** In this case, at the Linux command line copy each ut*.m routine" "RTN","ZZUTPOST",137,0) - S X(5)="*** (ut.m, ut1.m, utt1.m, utt2.m, utt3.m, utt4.m, utt5.m, utt6.m, and " + S X(5)="*** (ut.m, ut1.m, utt1.m, utt2.m, utt3.m, utt4.m, utt5.m, utt6.m, and " "RTN","ZZUTPOST",138,0) - S X(6)="*** uttcovr.m) to _ut*.m (e.g., 'cp ut.m _ut.m', 'cp ut1.m _ut1.m'," + S X(6)="*** uttcovr.m) to _ut*.m (e.g., 'cp ut.m _ut.m', 'cp ut1.m _ut1.m'," "RTN","ZZUTPOST",139,0) - S X(7)="*** 'cp utt1.m _utt1.m', etc., to 'cp uttcovr.m _uttcovr.m'). Then in GT.M" + S X(7)="*** 'cp utt1.m _utt1.m', etc., to 'cp uttcovr.m _uttcovr.m'). Then in GT.M" "RTN","ZZUTPOST",140,0) - S X(8)="*** use the command 'ZLINK %ut', then 'ZLINK %ut1', etc., these may" + S X(8)="*** use the command 'ZLINK %ut', then 'ZLINK %ut1', etc., these may" "RTN","ZZUTPOST",141,0) - S X(9)="*** indicate an undefined local variable error, but continue doing it." + S X(9)="*** indicate an undefined local variable error, but continue doing it." "RTN","ZZUTPOST",142,0) - S X(10)="*** When complete, use the M command 'DO ^%utt1' to run the unit tests on" + S X(10)="*** When complete, use the M command 'DO ^%utt1' to run the unit tests on" "RTN","ZZUTPOST",143,0) - S X(11)="*** the %ut and %ut1 routines to confirm they are working" + S X(11)="*** the %ut and %ut1 routines to confirm they are working" "RTN","ZZUTPOST",144,0) - S X(12)=" " + S X(12)=" " "RTN","ZZUTPOST",145,0) - S X(13)=" Press Enter to continue: " + S X(13)=" Press Enter to continue: " "RTN","ZZUTPOST",146,0) - D MES^XPDUTL(.X) + D MES^XPDUTL(.X) "RTN","ZZUTPOST",147,0) - R X:$G(DTIME,300) + R X:$G(DTIME,300) "RTN","ZZUTPOST",148,0) - Q + Q "RTN","ZZUTPRE") -0^^B3651860 +0^^B6741733 "RTN","ZZUTPRE",1,0) ut01PRE ;VEN/JLI - pre installation routine to set up MASH UTILITIES package and assign %ut routines and globals ;08/22/14 13:02 "RTN","ZZUTPRE",2,0) - ;;0.1;MASH UTILITIES + ;;0.2;MASH UTILITIES;;;Build 4 "RTN","ZZUTPRE",3,0) - ; + ; "RTN","ZZUTPRE",4,0) - ; The following is used to create, if it does not exist, the MASH UTILITIES + ; The following is used to create, if it does not exist, the MASH UTILITIES "RTN","ZZUTPRE",5,0) - ; package, and to assign the %u namespace to this package. This special + ; package, and to assign the %u namespace to this package. This special "RTN","ZZUTPRE",6,0) - ; processing is necessary, since the input transform currently will not accept a + ; processing is necessary, since the input transform currently will not accept a "RTN","ZZUTPRE",7,0) - ; % or lower case character in the namespace. + ; % or lower case character in the namespace. "RTN","ZZUTPRE",8,0) - I '$D(^DIC(9.4,"B","MASH UTILITIES")) N DIC,X S DIC="^DIC(9.4,",DIC(0)="",X="MASH UTILITIES",DIC("DR")="1////%u;2///Utilities associated with the M Advanced Shell" D FILE^DICN + I '$D(^DIC(9.4,"B","MASH UTILITIES")) N DIC,X S DIC="^DIC(9.4,",DIC(0)="",X="MASH UTILITIES",DIC("DR")="1////%u;2///Utilities associated with the M Advanced Shell" D FILE^DICN "RTN","ZZUTPRE",9,0) - ; and if necessary, as in CACHE, map %ut routine and namespace in the current account. + ; and if necessary, as in CACHE, map %ut routine and namespace in the current account. "RTN","ZZUTPRE",10,0) - I +$SY=0 D CACHEMAP ; This routine is CACHE specific + I +$SY=0 D CACHEMAP ; This routine is CACHE specific "RTN","ZZUTPRE",11,0) - Q + Q "RTN","ZZUTPRE",12,0) - ; The following code was provided by Sam Habiel to map % + ; The following code was provided by Sam Habiel to map % "RTN","ZZUTPRE",13,0) -CACHEMAP ; Map %ut* Globals and Routines away from %SYS in Cache +CACHEMAP ; Map %ut* Globals and Routines away from %SYS in Cache "RTN","ZZUTPRE",14,0) - ; Get current namespace + ; Get current namespace "RTN","ZZUTPRE",15,0) - N NMSP + N NMSP "RTN","ZZUTPRE",16,0) - I $P($P($ZV,") ",2),"(")<2012 S NMSP=$ZU(5) + I $P($P($ZV,") ",2),"(")<2012 S NMSP=$ZU(5) "RTN","ZZUTPRE",17,0) - I $P($P($ZV,") ",2),"(")>2011 S NMSP=$NAMESPACE + I $P($P($ZV,") ",2),"(")>2011 S NMSP=$NAMESPACE "RTN","ZZUTPRE",18,0) - ; + ; "RTN","ZZUTPRE",19,0) - ; Map %ut globals away from %SYS + ; Map %ut globals away from %SYS "RTN","ZZUTPRE",20,0) - ZN "%SYS" ; Go to SYS + ZN "%SYS" ; Go to SYS "RTN","ZZUTPRE",21,0) - N % S %=##class(Config.Configuration).GetGlobalMapping(NMSP,"%ut*","",NMSP,NMSP) + N % S %=##class(Config.Configuration).GetGlobalMapping(NMSP,"%ut*","",NMSP,NMSP) "RTN","ZZUTPRE",22,0) - I '% S %=##class(Config.Configuration).AddGlobalMapping(NMSP,"%ut*","",NMSP,NMSP) + I '% S %=##class(Config.Configuration).AddGlobalMapping(NMSP,"%ut*","",NMSP,NMSP) "RTN","ZZUTPRE",23,0) - I '% W !,"Error="_$SYSTEM.Status.GetErrorText(%) QUIT + I '% W !,"Error="_$SYSTEM.Status.GetErrorText(%) QUIT "RTN","ZZUTPRE",24,0) - ; + ; "RTN","ZZUTPRE",25,0) - ; Map %ut routines away from %SYS + ; Map %ut routines away from %SYS "RTN","ZZUTPRE",26,0) - N A S A("Database")=NMSP + N A S A("Database")=NMSP "RTN","ZZUTPRE",27,0) - N % S %=##Class(Config.MapRoutines).Get(NMSP,"%ut*",.A) + N % S %=##Class(Config.MapRoutines).Get(NMSP,"%ut*",.A) "RTN","ZZUTPRE",28,0) - S A("Database")=NMSP + S A("Database")=NMSP "RTN","ZZUTPRE",29,0) - I '% S %=##Class(Config.MapRoutines).Create(NMSP,"%ut*",.A) + I '% S %=##Class(Config.MapRoutines).Create(NMSP,"%ut*",.A) "RTN","ZZUTPRE",30,0) - I '% W !,"Error="_$SYSTEM.Status.GetErrorText(%) QUIT + I '% W !,"Error="_$SYSTEM.Status.GetErrorText(%) QUIT "RTN","ZZUTPRE",31,0) - ZN NMSP ; Go back + ZN NMSP ; Go back "RTN","ZZUTPRE",32,0) - QUIT + QUIT "RTN","ut") -0^1^B257937062 +0^1^B268535658 "RTN","ut",1,0) -%ut ;VEN-SMH/JLI - PRIMARY PROGRAM FOR M-UNIT TESTING ;08/29/14 09:31 +%ut ;VEN-SMH/JLI - PRIMARY PROGRAM FOR M-UNIT TESTING ; 7/2/15 1:12pm "RTN","ut",2,0) - ;;0.1;MASH UTILITIES; + ;;0.1;MASH UTILITIES;;;Build 4 "RTN","ut",3,0) ; "RTN","ut",4,0) @@ -837,901 +937,903 @@ CACHEMAP ; Map %ut* Globals and Routines away from %SYS in Cache "RTN","ut",42,0) ; Created M-UNIT TEST GROUP file at 17.9001 based on the 17.9001 file "RTN","ut",43,0) - Q + ; 141030 JLI - Removed tag TESTCOVR and code under it, not necessary "RTN","ut",44,0) - ; + ; since %uttcovr can handle all of the calling needed "RTN","ut",45,0) -EN(%utRNAM,%utVERB,%utBREAK) ; .SR Entry point with primary test routine name, optional 1 for verbose output + ; Added call to run routine %utt6 if run from the top, "RTN","ut",46,0) - N %utLIST,%utROU,%ut + ; since this will run the full range of unit tests "RTN","ut",47,0) - I '+$G(%utVERB) S %utVERB=0 + ; Modified STARTUP and SHUTDOWN commands to handle in "RTN","ut",48,0) - S %utLIST=1,%utROU(%utLIST)=%utRNAM + ; each routine where they are available, since only "RTN","ut",49,0) - D SETUT + ; running one STARTUP and SHUTDOWN (the first seen by "RTN","ut",50,0) - D EN1(.%utROU,%utLIST) + ; the program) restricted their use in suites of multiple "RTN","ut",51,0) - Q + ; tests. "RTN","ut",52,0) - ; + ; 150101 JLI - Added COV entry to %ut (in addition to current in %ut1) so it is easier "RTN","ut",53,0) -SETUT ; + ; to remember how to use it. "RTN","ut",54,0) - ; VEN/SMH 26JUL2013 + ; 150621 JLI - Added a global location to pick up summary data for a unit test call, so "RTN","ut",55,0) - I '($D(IO)#2) S IO=$P + ; programs running multiple calls can generate a summary if desired. "RTN","ut",56,0) - S U="^" + D ^%utt6 ; runs unit tests on all of it "RTN","ut",57,0) - ; VEN/SMH 26JUL2013 END + Q "RTN","ut",58,0) ; "RTN","ut",59,0) - ; ZEXCEPT: %ut -- NEWED ON ENTRY +EN(%utRNAM,%utVERB,%utBREAK) ; .SR Entry point with primary test routine name, optional 1 for verbose output "RTN","ut",60,0) - S %ut("IO")=IO + N %utLIST,%utROU,%ut "RTN","ut",61,0) - S %ut=1 ; set to identify unit test being run check with $$ISUTEST^%ut() + I '+$G(%utVERB) S %utVERB=0 "RTN","ut",62,0) - ; + S %utLIST=1,%utROU(%utLIST)=%utRNAM "RTN","ut",63,0) - ; ZEXCEPT: %utBREAK + K ^TMP("%ut",$J,"UTVALS") "RTN","ut",64,0) - I $G(%utBREAK) S %ut("BREAK")=1 + D SETUT "RTN","ut",65,0) - Q + D EN1(.%utROU,%utLIST) "RTN","ut",66,0) - ; + Q "RTN","ut",67,0) -EN1(%utROU,%utLIST) ; + ; "RTN","ut",68,0) - ; VEN/SMH 26JUL2013 - This block is refactored to fix problems with +SETUT ; "RTN","ut",69,0) - ; SETUP and TEARDOWN not happening at the right time + ; VEN/SMH 26JUL2013 "RTN","ut",70,0) - N %utERRL,%utK,%utI,%utJ,%utSTRT + I '($D(IO)#2) S IO=$P "RTN","ut",71,0) - ; ZEXCEPT: %utVERB -- ARGUMENT TO EN + S U="^" "RTN","ut",72,0) - ; ZEXCEPT: %utGUI -- CONDITIONALLY DEFINED BY GUINEXT + ; VEN/SMH 26JUL2013 END "RTN","ut",73,0) - ; ZEXCEPT: %ut -- NEWED IN EN + ; "RTN","ut",74,0) - ; + ; ZEXCEPT: %ut -- NEWED ON ENTRY "RTN","ut",75,0) - ; Structure map for %ut + S %ut("IO")=IO "RTN","ut",76,0) - ; -- CURR = Counter for routine number. Used as sub in %utROU + S %ut=1 ; set to identify unit test being run check with $$ISUTEST^%ut() "RTN","ut",77,0) - ; -- ECNT = Entry point count in loop (cf. NERT); VEN/SMH - Needed? + ; "RTN","ut",78,0) - ; -- FAIL = Number of failures + ; ZEXCEPT: %utBREAK "RTN","ut",79,0) - ; -- CHK = Number of checks ran (TF/EQ/FAIL) + I $G(%utBREAK) S %ut("BREAK")=1 "RTN","ut",80,0) - ; -- NENT = Number of entry points ran + Q "RTN","ut",81,0) - ; -- ERRN = Number of errors + ; "RTN","ut",82,0) - S %ut("CURR")=0,%ut("ECNT")=0,%ut("FAIL")=0,%ut("CHK")=0,%ut("NENT")=0,%ut("ERRN")=0 +EN1(%utROU,%utLIST) ; "RTN","ut",83,0) - ; + ; VEN/SMH 26JUL2013 - This block is refactored to fix problems with "RTN","ut",84,0) - ; -- GET LIST OF ROUTINES -- + ; SETUP and TEARDOWN not happening at the right time "RTN","ut",85,0) - ; first get any tree of routines from this one + N %utERRL,%utK,%utI,%utJ,%utSTRT "RTN","ut",86,0) - D GETTREE^%ut1(.%utROU,.%utLIST) + ; ZEXCEPT: %utVERB -- ARGUMENT TO EN "RTN","ut",87,0) - ; + ; ZEXCEPT: %utGUI -- CONDITIONALLY DEFINED BY GUINEXT "RTN","ut",88,0) - ; -- STARTUP -- + ; ZEXCEPT: %ut -- NEWED IN EN "RTN","ut",89,0) - ; 070224 - following code added to allow one overall STARTUP code JLI + ; "RTN","ut",90,0) - F S %ut("CURR")=%ut("CURR")+1 Q:'$D(%utROU(%ut("CURR"))) D I $G(%utSTRT)'="" D @%utSTRT Q + ; Structure map for %ut "RTN","ut",91,0) - . I $T(@("STARTUP^"_%utROU(%ut("CURR"))))'="" S %utSTRT="STARTUP^"_%utROU(%ut("CURR")) + ; -- CURR = Counter for routine number. Used as sub in %utROU "RTN","ut",92,0) - . Q + ; -- ECNT = Entry point count in loop (cf. NERT); VEN/SMH - Needed? "RTN","ut",93,0) - ; 070224 - end of addition JLI + ; -- FAIL = Number of failures "RTN","ut",94,0) - ; + ; -- CHK = Number of checks ran (TF/EQ/FAIL) "RTN","ut",95,0) - ; + ; -- NENT = Number of entry points ran "RTN","ut",96,0) - ; Now process each routine that has been referenced + ; -- ERRN = Number of errors "RTN","ut",97,0) - S %ut("CURR")=0 + S %ut("CURR")=0,%ut("ECNT")=0,%ut("FAIL")=0,%ut("CHK")=0,%ut("NENT")=0,%ut("ERRN")=0 "RTN","ut",98,0) - F S %ut("CURR")=%ut("CURR")+1 Q:'$D(%utROU(%ut("CURR"))) D + ; "RTN","ut",99,0) - . N %utETRY ; Test list to run + ; -- GET LIST OF ROUTINES -- "RTN","ut",100,0) - . ; + ; first get any tree of routines from this one "RTN","ut",101,0) - . ; Collect Test list. + D GETTREE^%ut1(.%utROU,.%utLIST) "RTN","ut",102,0) - . D CHEKTEST^%ut1(%utROU(%ut("CURR")),.%ut,.%utETRY) + ; "RTN","ut",103,0) - . ; + ; Now process each routine that has been referenced "RTN","ut",104,0) - . ; if a SETUP entry point exists, save it off in %ut + N CURRROU "RTN","ut",105,0) - . N %utSETUP S %utSETUP="SETUP^"_%utROU(%ut("CURR")) + S %ut("CURR")=0 "RTN","ut",106,0) - . S %ut("LINE")=$T(@%utSETUP) I %ut("LINE")'="" S %ut("SETUP")=%utSETUP + F S %ut("CURR")=%ut("CURR")+1 Q:'$D(%utROU(%ut("CURR"))) S CURRROU=%utROU(%ut("CURR")) D I $T(@("SHUTDOWN^"_CURRROU))'="" D @("SHUTDOWN^"_CURRROU) "RTN","ut",107,0) - . K %utSETUP ; we're done! + . ; 141018 - add ability to run STARTUP and SHUTDOWN in each routine JLI "RTN","ut",108,0) - . ; + . I $T(@("STARTUP^"_CURRROU))'="" D @("STARTUP^"_CURRROU) ; 141018 "RTN","ut",109,0) - . ; if a TEARDOWN entry point exists, ditto + . N %utETRY ; Test list to run "RTN","ut",110,0) - . N %utTEARDOWN S %utTEARDOWN="TEARDOWN^"_%utROU(%ut("CURR")) + . ; "RTN","ut",111,0) - . S %ut("LINE")=$T(@%utTEARDOWN) I %ut("LINE")'="" S %ut("TEARDOWN")=%utTEARDOWN + . ; Collect Test list. "RTN","ut",112,0) - . K %utTEARDOWN ; done here. + . D CHEKTEST^%ut1(%utROU(%ut("CURR")),.%ut,.%utETRY) "RTN","ut",113,0) . ; "RTN","ut",114,0) - . ; VEN/SMH 26JUL2013 - this block changed to correct running of setup and teardown + . ; if a SETUP entry point exists, save it off in %ut "RTN","ut",115,0) - . ; run each of the specified entry points + . S %ut("SETUP")="" ; 141018 need to clear any previous values JLI "RTN","ut",116,0) - . ; + . N %utSETUP S %utSETUP="SETUP^"_%utROU(%ut("CURR")) "RTN","ut",117,0) - . ; == THIS FOR/DO BLOCK IS THE CENTRAL TEST RUNNER == + . S %ut("LINE")=$T(@%utSETUP) I %ut("LINE")'="" S %ut("SETUP")=%utSETUP "RTN","ut",118,0) - . S %utI=0 + . K %utSETUP ; we're done! "RTN","ut",119,0) - . F S %utI=$O(%utETRY(%utI)) Q:%utI'>0 S %ut("ENUM")=%ut("ERRN")+%ut("FAIL") D + . ; "RTN","ut",120,0) - . . N $ETRAP S $ETRAP="D ERROR^%ut" + . ; if a TEARDOWN entry point exists, ditto "RTN","ut",121,0) - . . ; + . S %ut("TEARDOWN")="" ; 141018 need to clear any previous values JLI "RTN","ut",122,0) - . . ; Run Set-up Code (only if present) + . N %utTEARDOWN S %utTEARDOWN="TEARDOWN^"_%utROU(%ut("CURR")) "RTN","ut",123,0) - . . S %ut("ENT")=$G(%ut("SETUP")) ; Current entry + . S %ut("LINE")=$T(@%utTEARDOWN) I %ut("LINE")'="" S %ut("TEARDOWN")=%utTEARDOWN "RTN","ut",124,0) - . . S %ut("NAME")="Set-up Code" + . K %utTEARDOWN ; done here. "RTN","ut",125,0) - . . D:%ut("ENT")]"" @%ut("ENT") + . ; "RTN","ut",126,0) - . . ; + . ; VEN/SMH 26JUL2013 - this block changed to correct running of setup and teardown "RTN","ut",127,0) - . . ; Run actual test + . ; run each of the specified entry points "RTN","ut",128,0) - . . S %ut("ECNT")=%ut("ECNT")+1 + . ; "RTN","ut",129,0) - . . S %ut("NAME")=%utETRY(%utI,"NAME") + . ; == THIS FOR/DO BLOCK IS THE CENTRAL TEST RUNNER == "RTN","ut",130,0) - . . S %ut("ENT")=%utETRY(%utI)_"^"_%utROU(%ut("CURR")) + . S %utI=0 "RTN","ut",131,0) - . . I %utVERB,'$D(%utGUI) D VERBOSE1(.%utETRY,%utI) ; Say what we executed. + . F S %utI=$O(%utETRY(%utI)) Q:%utI'>0 S %ut("ENUM")=%ut("ERRN")+%ut("FAIL") D "RTN","ut",132,0) - . . D @%ut("ENT") + . . N $ETRAP S $ETRAP="D ERROR^%ut" "RTN","ut",133,0) . . ; "RTN","ut",134,0) - . . ; Run Teardown Code (only if present) + . . ; Run Set-up Code (only if present) "RTN","ut",135,0) - . . S %ut("ENT")=$G(%ut("TEARDOWN")) + . . S %ut("ENT")=$G(%ut("SETUP")) ; Current entry "RTN","ut",136,0) - . . S %ut("NAME")="Teardown Code" + . . S %ut("NAME")="Set-up Code" "RTN","ut",137,0) . . D:%ut("ENT")]"" @%ut("ENT") "RTN","ut",138,0) . . ; "RTN","ut",139,0) - . . ; ENUM = Number of errors + failures + . . ; Run actual test "RTN","ut",140,0) - . . ; Only print out the success message [OK] If our error number remains + . . S %ut("ECNT")=%ut("ECNT")+1 "RTN","ut",141,0) - . . ; the same as when we started the loop. + . . S %ut("NAME")=%utETRY(%utI,"NAME") "RTN","ut",142,0) - . . I %utVERB,'$D(%utGUI) D + . . S %ut("ENT")=%utETRY(%utI)_"^"_%utROU(%ut("CURR")) "RTN","ut",143,0) - . . . I %ut("ENUM")=(%ut("ERRN")+%ut("FAIL")) D VERBOSE(.%utETRY,%utI,1) I 1 + . . I %utVERB,'$D(%utGUI) D VERBOSE1(.%utETRY,%utI) ; Say what we executed. "RTN","ut",144,0) - . . . E D VERBOSE(.%utETRY,%utI,0) + . . D @%ut("ENT") "RTN","ut",145,0) - . ; + . . ; "RTN","ut",146,0) - . ; + . . ; Run Teardown Code (only if present) "RTN","ut",147,0) - . ; keep a %utCNT of number of entry points executed across all routines + . . S %ut("ENT")=$G(%ut("TEARDOWN")) "RTN","ut",148,0) - . S %ut("NENT")=%ut("NENT")+%ut("ENTN") + . . S %ut("NAME")="Teardown Code" "RTN","ut",149,0) - . Q + . . D:%ut("ENT")]"" @%ut("ENT") "RTN","ut",150,0) - ; + . . ; "RTN","ut",151,0) - ; -- SHUTDOWN -- + . . ; ENUM = Number of errors + failures "RTN","ut",152,0) - ; 070224 - following code added to allow one overall SHUTDOWN code JLI + . . ; Only print out the success message [OK] If our error number remains "RTN","ut",153,0) - N XTFINISH + . . ; the same as when we started the loop. "RTN","ut",154,0) - S %ut("CURR")=0 + . . I %utVERB,'$D(%utGUI) D "RTN","ut",155,0) - F S %ut("CURR")=%ut("CURR")+1 Q:'$D(%utROU(%ut("CURR"))) D I $G(XTFINISH)'="" D @XTFINISH Q + . . . I %ut("ENUM")=(%ut("ERRN")+%ut("FAIL")) D VERBOSE(.%utETRY,%utI,1) I 1 "RTN","ut",156,0) - . I $T(@("SHUTDOWN^"_%utROU(%ut("CURR"))))'="" S XTFINISH="SHUTDOWN^"_%utROU(%ut("CURR")) + . . . E D VERBOSE(.%utETRY,%utI,0) "RTN","ut",157,0) - . Q + . ; "RTN","ut",158,0) - ; 070224 - End of addition JLI + . ; "RTN","ut",159,0) - ; and output the results + . ; keep a %utCNT of number of entry points executed across all routines "RTN","ut",160,0) - D SETIO + . S %ut("NENT")=%ut("NENT")+%ut("ENTN") "RTN","ut",161,0) - W !!,"Ran ",%utLIST," Routine",$S(%utLIST>1:"s",1:""),", ",%ut("NENT")," Entry Tag",$S(%ut("NENT")>1:"s",1:"") + . Q "RTN","ut",162,0) - W !,"Checked ",%ut("CHK")," test",$S(%ut("CHK")>1:"s",1:""),", with ",%ut("FAIL")," failure",$S(%ut("FAIL")'=1:"s",1:"")," and encountered ",%ut("ERRN")," error",$S(%ut("ERRN")'=1:"s",1:""),"." + ; "RTN","ut",163,0) - D RESETIO + ; -- SHUTDOWN -- "RTN","ut",164,0) - Q + D SETIO "RTN","ut",165,0) - ; -- end EN1 + W !!,"Ran ",%utLIST," Routine",$S(%utLIST>1:"s",1:""),", ",%ut("NENT")," Entry Tag",$S(%ut("NENT")>1:"s",1:"") "RTN","ut",166,0) -VERBOSE(%utETRY,%utI,SUCCESS) ; Say whether we succeeded or failed. + W !,"Checked ",%ut("CHK")," test",$S(%ut("CHK")>1:"s",1:""),", with ",%ut("FAIL")," failure",$S(%ut("FAIL")'=1:"s",1:"")," and encountered ",%ut("ERRN")," error",$S(%ut("ERRN")'=1:"s",1:""),"." "RTN","ut",167,0) - ; ZEXCEPT: %ut - NEWED IN EN + S ^TMP("%ut",$J,"UTVALS")=%utLIST_U_%ut("NENT")_U_%ut("CHK")_U_%ut("FAIL")_U_%ut("ERRN") ; JLI 150621 so programs running several sets of unit tests can generate totals "RTN","ut",168,0) - D SETIO + D RESETIO "RTN","ut",169,0) - N I F I=$X+3:1:73 W "-" + Q "RTN","ut",170,0) - W ?73 + ; -- end EN1 "RTN","ut",171,0) - I $G(SUCCESS) W "[OK]" +VERBOSE(%utETRY,%utI,SUCCESS) ; Say whether we succeeded or failed. "RTN","ut",172,0) - E W "[FAIL]" + ; ZEXCEPT: %ut - NEWED IN EN "RTN","ut",173,0) - D RESETIO -"RTN","ut",174,0) - Q -"RTN","ut",175,0) - ; -"RTN","ut",176,0) -VERBOSE1(%utETRY,%utI) ; Print out the entry point info -"RTN","ut",177,0) - ; ZEXCEPT: %ut - NEWED IN EN -"RTN","ut",178,0) D SETIO -"RTN","ut",179,0) - W !,%utETRY(%utI) I $G(%utETRY(%utI,"NAME"))'="" W " - ",%utETRY(%utI,"NAME") -"RTN","ut",180,0) +"RTN","ut",174,0) + N I F I=$X+3:1:73 W "-" +"RTN","ut",175,0) + W ?73 +"RTN","ut",176,0) + I $G(SUCCESS) W "[OK]" +"RTN","ut",177,0) + E W "[FAIL]" +"RTN","ut",178,0) D RESETIO +"RTN","ut",179,0) + Q +"RTN","ut",180,0) + ; "RTN","ut",181,0) - Q +VERBOSE1(%utETRY,%utI) ; Print out the entry point info "RTN","ut",182,0) -CHKTF(XTSTVAL,XTERMSG) ; Entry point for checking True or False values + ; ZEXCEPT: %ut - NEWED IN EN "RTN","ut",183,0) - ; ZEXCEPT: %utERRL,%utGUI - CREATED IN SETUP, KILLED IN END + D SETIO "RTN","ut",184,0) - ; ZEXCEPT: %ut - NEWED IN EN + W !,%utETRY(%utI) I $G(%utETRY(%utI,"NAME"))'="" W " - ",%utETRY(%utI,"NAME") "RTN","ut",185,0) - ; ZEXCEPT: XTGUISEP - newed in GUINEXT + D RESETIO "RTN","ut",186,0) - I '$D(XTSTVAL) D NVLDARG Q + Q "RTN","ut",187,0) - I $G(XTERMSG)="" S XTERMSG="no failure message provided" + ; "RTN","ut",188,0) - S %ut("CHK")=$G(%ut("CHK"))+1 +CHKTF(XTSTVAL,XTERMSG) ; Entry point for checking True or False values "RTN","ut",189,0) - I '$D(%utGUI) D -"RTN","ut",190,0) - . D SETIO -"RTN","ut",191,0) - . I 'XTSTVAL W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " D -"RTN","ut",192,0) - . . W XTERMSG,! S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") -"RTN","ut",193,0) - . . I $D(%ut("BREAK")) BREAK ; Break upon failure -"RTN","ut",194,0) - . . Q -"RTN","ut",195,0) - . I XTSTVAL W "." -"RTN","ut",196,0) - . D RESETIO -"RTN","ut",197,0) - . Q -"RTN","ut",198,0) - I $D(%utGUI),'XTSTVAL S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_XTERMSG,%ut("FAIL")=%ut("FAIL")+1 -"RTN","ut",199,0) - Q -"RTN","ut",200,0) - ; -"RTN","ut",201,0) -CHKEQ(XTEXPECT,XTACTUAL,XTERMSG) ; Entry point for checking values to see if they are EQUAL -"RTN","ut",202,0) - N FAILMSG -"RTN","ut",203,0) - ; ZEXCEPT: %utERRL,%utGUI -CREATED IN SETUP, KILLED IN END -"RTN","ut",204,0) - ; ZEXCEPT: %ut -- NEWED IN EN -"RTN","ut",205,0) - ; ZEXCEPT: XTGUISEP - newed in GUINEXT -"RTN","ut",206,0) - I '$D(XTEXPECT)!'$D(XTACTUAL) D NVLDARG Q ; JLI 140824 changed from AND to OR, since both necessary, but only one might be entered -"RTN","ut",207,0) - S XTACTUAL=$G(XTACTUAL),XTEXPECT=$G(XTEXPECT) -"RTN","ut",208,0) - I $G(XTERMSG)="" S XTERMSG="no failure message provided" -"RTN","ut",209,0) - S %ut("CHK")=%ut("CHK")+1 -"RTN","ut",210,0) - I XTEXPECT'=XTACTUAL S FAILMSG="<"_XTEXPECT_"> vs <"_XTACTUAL_"> - " -"RTN","ut",211,0) - I '$D(%utGUI) D -"RTN","ut",212,0) - . D SETIO -"RTN","ut",213,0) - . I XTEXPECT'=XTACTUAL W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " W FAILMSG,XTERMSG,! D -"RTN","ut",214,0) - . . S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") -"RTN","ut",215,0) - . . I $D(%ut("BREAK")) BREAK ; Break upon failure -"RTN","ut",216,0) - . . Q -"RTN","ut",217,0) - . E W "." -"RTN","ut",218,0) - . D RESETIO -"RTN","ut",219,0) - . Q -"RTN","ut",220,0) - I $D(%utGUI),XTEXPECT'=XTACTUAL S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_FAILMSG_XTERMSG,%ut("FAIL")=%ut("FAIL")+1 -"RTN","ut",221,0) - Q -"RTN","ut",222,0) - ; -"RTN","ut",223,0) -FAIL(XTERMSG) ; Entry point for generating a failure message -"RTN","ut",224,0) - ; ZEXCEPT: %utERRL,%utGUI -CREATED IN SETUP, KILLED IN END -"RTN","ut",225,0) - ; ZEXCEPT: %ut -- NEWED ON ENTRY -"RTN","ut",226,0) - ; ZEXCEPT: XTGUISEP - newed in GUINEXT -"RTN","ut",227,0) - I $G(XTERMSG)="" S XTERMSG="no failure message provided" -"RTN","ut",228,0) - S %ut("CHK")=%ut("CHK")+1 -"RTN","ut",229,0) - I '$D(%utGUI) D -"RTN","ut",230,0) - . D SETIO -"RTN","ut",231,0) - . W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " W XTERMSG,! D -"RTN","ut",232,0) - . . S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") -"RTN","ut",233,0) - . . I $D(%ut("BREAK")) BREAK ; Break upon failure -"RTN","ut",234,0) - . . Q -"RTN","ut",235,0) - . D RESETIO -"RTN","ut",236,0) - . Q -"RTN","ut",237,0) - I $D(%utGUI) S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_XTERMSG,%ut("FAIL")=%ut("FAIL")+1 -"RTN","ut",238,0) - Q -"RTN","ut",239,0) -SUCCEED ; Entry point for forcing a success (Thx David Whitten) -"RTN","ut",240,0) ; ZEXCEPT: %utERRL,%utGUI - CREATED IN SETUP, KILLED IN END -"RTN","ut",241,0) +"RTN","ut",190,0) ; ZEXCEPT: %ut - NEWED IN EN -"RTN","ut",242,0) - ; Switch IO and write out the dot for activity -"RTN","ut",243,0) +"RTN","ut",191,0) + ; ZEXCEPT: XTGUISEP - newed in GUINEXT +"RTN","ut",192,0) + I '$D(XTSTVAL) D NVLDARG Q +"RTN","ut",193,0) + I $G(XTERMSG)="" S XTERMSG="no failure message provided" +"RTN","ut",194,0) + S %ut("CHK")=$G(%ut("CHK"))+1 +"RTN","ut",195,0) I '$D(%utGUI) D -"RTN","ut",244,0) +"RTN","ut",196,0) . D SETIO -"RTN","ut",245,0) - . W "." -"RTN","ut",246,0) +"RTN","ut",197,0) + . I 'XTSTVAL W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " D +"RTN","ut",198,0) + . . W XTERMSG,! S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") +"RTN","ut",199,0) + . . I $D(%ut("BREAK")) BREAK ; Break upon failure +"RTN","ut",200,0) + . . Q +"RTN","ut",201,0) + . I XTSTVAL W "." +"RTN","ut",202,0) . D RESETIO -"RTN","ut",247,0) +"RTN","ut",203,0) + . Q +"RTN","ut",204,0) + I $D(%utGUI),'XTSTVAL S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_XTERMSG,%ut("FAIL")=%ut("FAIL")+1 +"RTN","ut",205,0) + Q +"RTN","ut",206,0) ; -"RTN","ut",248,0) - ; Increment test counter -"RTN","ut",249,0) +"RTN","ut",207,0) +CHKEQ(XTEXPECT,XTACTUAL,XTERMSG) ; Entry point for checking values to see if they are EQUAL +"RTN","ut",208,0) + N FAILMSG +"RTN","ut",209,0) + ; ZEXCEPT: %utERRL,%utGUI -CREATED IN SETUP, KILLED IN END +"RTN","ut",210,0) + ; ZEXCEPT: %ut -- NEWED IN EN +"RTN","ut",211,0) + ; ZEXCEPT: XTGUISEP - newed in GUINEXT +"RTN","ut",212,0) + I '$D(XTEXPECT)!'$D(XTACTUAL) D NVLDARG Q ; JLI 140824 changed from AND to OR, since both necessary, but only one might be entered +"RTN","ut",213,0) + S XTACTUAL=$G(XTACTUAL),XTEXPECT=$G(XTEXPECT) +"RTN","ut",214,0) + I $G(XTERMSG)="" S XTERMSG="no failure message provided" +"RTN","ut",215,0) S %ut("CHK")=%ut("CHK")+1 +"RTN","ut",216,0) + I XTEXPECT'=XTACTUAL S FAILMSG="<"_XTEXPECT_"> vs <"_XTACTUAL_"> - " +"RTN","ut",217,0) + I '$D(%utGUI) D +"RTN","ut",218,0) + . D SETIO +"RTN","ut",219,0) + . I XTEXPECT'=XTACTUAL W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " W FAILMSG,XTERMSG,! D +"RTN","ut",220,0) + . . S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") +"RTN","ut",221,0) + . . I $D(%ut("BREAK")) BREAK ; Break upon failure +"RTN","ut",222,0) + . . Q +"RTN","ut",223,0) + . E W "." +"RTN","ut",224,0) + . D RESETIO +"RTN","ut",225,0) + . Q +"RTN","ut",226,0) + I $D(%utGUI),XTEXPECT'=XTACTUAL S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_FAILMSG_XTERMSG,%ut("FAIL")=%ut("FAIL")+1 +"RTN","ut",227,0) + Q +"RTN","ut",228,0) + ; +"RTN","ut",229,0) +FAIL(XTERMSG) ; Entry point for generating a failure message +"RTN","ut",230,0) + ; ZEXCEPT: %utERRL,%utGUI -CREATED IN SETUP, KILLED IN END +"RTN","ut",231,0) + ; ZEXCEPT: %ut -- NEWED ON ENTRY +"RTN","ut",232,0) + ; ZEXCEPT: XTGUISEP - newed in GUINEXT +"RTN","ut",233,0) + I $G(XTERMSG)="" S XTERMSG="no failure message provided" +"RTN","ut",234,0) + S %ut("CHK")=%ut("CHK")+1 +"RTN","ut",235,0) + I '$D(%utGUI) D +"RTN","ut",236,0) + . D SETIO +"RTN","ut",237,0) + . W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " W XTERMSG,! D +"RTN","ut",238,0) + . . S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") +"RTN","ut",239,0) + . . I $D(%ut("BREAK")) BREAK ; Break upon failure +"RTN","ut",240,0) + . . Q +"RTN","ut",241,0) + . D RESETIO +"RTN","ut",242,0) + . Q +"RTN","ut",243,0) + I $D(%utGUI) S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_XTERMSG,%ut("FAIL")=%ut("FAIL")+1 +"RTN","ut",244,0) + Q +"RTN","ut",245,0) + ; +"RTN","ut",246,0) +SUCCEED ; Entry point for forcing a success (Thx David Whitten) +"RTN","ut",247,0) + ; ZEXCEPT: %utERRL,%utGUI - CREATED IN SETUP, KILLED IN END +"RTN","ut",248,0) + ; ZEXCEPT: %ut - NEWED IN EN +"RTN","ut",249,0) + ; Switch IO and write out the dot for activity "RTN","ut",250,0) - QUIT + I '$D(%utGUI) D "RTN","ut",251,0) - ; + . D SETIO "RTN","ut",252,0) -CHKLEAKS(%utCODE,%utLOC,%utINPT) ; functionality to check for variable leaks on executing a section of code + . W "." "RTN","ut",253,0) - ; %utCODE - A string that specifies the code that is to be XECUTED and checked for leaks. + . D RESETIO "RTN","ut",254,0) - ; this should be a complete piece of code (e.g., "S X=$$NOW^XLFDT()" or "D EN^%ut(""ROUNAME"")") + ; "RTN","ut",255,0) - ; %utLOC - A string that is used to indicate the code tested for variable leaks + ; Increment test counter "RTN","ut",256,0) - ; %utINPT - An optional variable which may be passed by reference. This may + S %ut("CHK")=%ut("CHK")+1 "RTN","ut",257,0) - ; be used to pass any variable values, etc. into the code to be + QUIT "RTN","ut",258,0) - ; XECUTED. In this case, set the subscript to the variable name and the + ; "RTN","ut",259,0) - ; value of the subscripted variable to the desired value of the subscript. +CHKLEAKS(%utCODE,%utLOC,%utINPT) ; functionality to check for variable leaks on executing a section of code "RTN","ut",260,0) - ; e.g., (using NAME as my current namespace) + ; %utCODE - A string that specifies the code that is to be XECUTED and checked for leaks. "RTN","ut",261,0) - ; S CODE="S %utINPT=$$ENTRY^ROUTINE(ZZVALUE1,ZZVALUE2)" + ; this should be a complete piece of code (e.g., "S X=$$NOW^XLFDT()" or "D EN^%ut(""ROUNAME"")") "RTN","ut",262,0) - ; S NAMELOC="ENTRY^ROUTINE leak test" (or simply "ENTRY^ROUTINE") + ; %utLOC - A string that is used to indicate the code tested for variable leaks "RTN","ut",263,0) - ; S NAMEINPT("ZZVALUE1")=ZZVALUE1 + ; %utINPT - An optional variable which may be passed by reference. This may "RTN","ut",264,0) - ; S NAMEINPT("ZZVALUE2")=ZZVALUE2 + ; be used to pass any variable values, etc. into the code to be "RTN","ut",265,0) - ; D CHKLEAKS^%ut(CODE,NAMELOC,.NAMEINPT) + ; XECUTED. In this case, set the subscript to the variable name and the "RTN","ut",266,0) - ; + ; value of the subscripted variable to the desired value of the subscript. "RTN","ut",267,0) - ; If part of a unit test, any leaked variables in ENTRY^ROUTINE which result + ; e.g., (using NAME as my current namespace) "RTN","ut",268,0) - ; from running the code with the variables indicated will be shown as FAILUREs. + ; S CODE="S %utINPT=$$ENTRY^ROUTINE(ZZVALUE1,ZZVALUE2)" "RTN","ut",269,0) - ; + ; S NAMELOC="ENTRY^ROUTINE leak test" (or simply "ENTRY^ROUTINE") "RTN","ut",270,0) - ; If called outside of a unit test, any leaked variables will be printed to the + ; S NAMEINPT("ZZVALUE1")=ZZVALUE1 "RTN","ut",271,0) - ; current device. + ; S NAMEINPT("ZZVALUE2")=ZZVALUE2 "RTN","ut",272,0) - ; + ; D CHKLEAKS^%ut(CODE,NAMELOC,.NAMEINPT) "RTN","ut",273,0) - N (%utCODE,%utLOC,%utINPT,DUZ,IO,U,%utERRL,%ut,%utGUI,%utERR,%utI,%utJ,%utK,%utLIST,%utROU,%utSTRT,XTGUISEP) + ; "RTN","ut",274,0) - ; ZEXCEPT: %ut - part of exclusive NEW TESTS FOR EXISTENCE ONLY + ; If part of a unit test, any leaked variables in ENTRY^ROUTINE which result "RTN","ut",275,0) - ; ZEXCEPT: %utVAR - handled by exclusive NEW + ; from running the code with the variables indicated will be shown as FAILUREs. "RTN","ut",276,0) ; "RTN","ut",277,0) - ; ACTIVATE ANY VARIABLES PASSED AS SUBSCRIPTS TO %utINPT TO THEIR VALUES + ; If called outside of a unit test, any leaked variables will be printed to the "RTN","ut",278,0) - S %utVAR=" " F S %utVAR=$O(%utINPT(%utVAR)) Q:%utVAR="" S (@%utVAR)=%utINPT(%utVAR) + ; current device. "RTN","ut",279,0) - X %utCODE + ; "RTN","ut",280,0) - N ZZUTVAR S ZZUTVAR="%" + N (%utCODE,%utLOC,%utINPT,DUZ,IO,U,%utERRL,%ut,%utGUI,%utERR,%utI,%utJ,%utK,%utLIST,%utROU,%utSTRT,XTGUISEP) "RTN","ut",281,0) - I $G(%ut)=1 D + ; ZEXCEPT: %ut - part of exclusive NEW TESTS FOR EXISTENCE ONLY "RTN","ut",282,0) - . I $D(@ZZUTVAR),'$D(%utINPT(ZZUTVAR)) D FAIL^%ut(%utLOC_" VARIABLE LEAK: "_ZZUTVAR) + ; ZEXCEPT: %utVAR - handled by exclusive NEW "RTN","ut",283,0) - . F S ZZUTVAR=$O(@ZZUTVAR) Q:ZZUTVAR="" I $E(ZZUTVAR,1,3)'="%ut",'$D(%utINPT(ZZUTVAR)),",DUZ,IO,U,DTIME,ZZUTVAR,DT,%ut,XTGUISEP,"'[(","_ZZUTVAR_",") D FAIL^%ut(%utLOC_" VARIABLE LEAK: "_ZZUTVAR) + ; "RTN","ut",284,0) - . Q + ; ACTIVATE ANY VARIABLES PASSED AS SUBSCRIPTS TO %utINPT TO THEIR VALUES "RTN","ut",285,0) - I '($G(%ut)=1) D + S %utVAR=" " F S %utVAR=$O(%utINPT(%utVAR)) Q:%utVAR="" S (@%utVAR)=%utINPT(%utVAR) "RTN","ut",286,0) - . I $D(@ZZUTVAR),'$D(%utINPT(ZZUTVAR)) W !,%utLOC_" VARIABLE LEAK: "_ZZUTVAR + X %utCODE "RTN","ut",287,0) - . F S ZZUTVAR=$O(@ZZUTVAR) Q:ZZUTVAR="" I $E(ZZUTVAR,1,3)'="%ut",'$D(%utINPT(ZZUTVAR)),",DUZ,IO,U,DTIME,ZZUTVAR,DT,%ut,XTGUISEP,"'[(","_ZZUTVAR_",") W !,%utLOC_" VARIABLE LEAK: "_ZZUTVAR + N ZZUTVAR S ZZUTVAR="%" "RTN","ut",288,0) - . Q + I $G(%ut)=1 D "RTN","ut",289,0) - Q + . I $D(@ZZUTVAR),'$D(%utINPT(ZZUTVAR)) D FAIL^%ut(%utLOC_" VARIABLE LEAK: "_ZZUTVAR) "RTN","ut",290,0) - ; + . F S ZZUTVAR=$O(@ZZUTVAR) Q:ZZUTVAR="" I $E(ZZUTVAR,1,3)'="%ut",'$D(%utINPT(ZZUTVAR)),",DUZ,IO,U,DTIME,ZZUTVAR,DT,%ut,XTGUISEP,"'[(","_ZZUTVAR_",") D FAIL^%ut(%utLOC_" VARIABLE LEAK: "_ZZUTVAR) "RTN","ut",291,0) -NVLDARG ; generate message for invalid arguments to test + . Q "RTN","ut",292,0) - N XTERMSG + I '($G(%ut)=1) D "RTN","ut",293,0) - ; ZEXCEPT: %ut -- NEWED ON ENTRY + . I $D(@ZZUTVAR),'$D(%utINPT(ZZUTVAR)) W !,%utLOC_" VARIABLE LEAK: "_ZZUTVAR "RTN","ut",294,0) - ; ZEXCEPT: %utERRL,%utGUI -CREATED IN SETUP, KILLED IN END + . F S ZZUTVAR=$O(@ZZUTVAR) Q:ZZUTVAR="" I $E(ZZUTVAR,1,3)'="%ut",'$D(%utINPT(ZZUTVAR)),",DUZ,IO,U,DTIME,ZZUTVAR,DT,%ut,XTGUISEP,"'[(","_ZZUTVAR_",") W !,%utLOC_" VARIABLE LEAK: "_ZZUTVAR "RTN","ut",295,0) - ; ZEXCEPT: XTGUISEP - newed in GUINEXT + . Q "RTN","ut",296,0) - S XTERMSG="NO VALUES INPUT TO CHKEQ^%ut - no evaluation possible" + Q "RTN","ut",297,0) - I '$D(%utGUI) D + ; "RTN","ut",298,0) - . D SETIO +NVLDARG ; generate message for invalid arguments to test "RTN","ut",299,0) - . W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " W XTERMSG,! D + N XTERMSG "RTN","ut",300,0) - . . S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") + ; ZEXCEPT: %ut -- NEWED ON ENTRY "RTN","ut",301,0) - . . Q + ; ZEXCEPT: %utERRL,%utGUI -CREATED IN SETUP, KILLED IN END "RTN","ut",302,0) - . D RESETIO -"RTN","ut",303,0) - . Q -"RTN","ut",304,0) - I $D(%utGUI) S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_XTERMSG,%ut("FAIL")=%ut("FAIL")+1 -"RTN","ut",305,0) - Q -"RTN","ut",306,0) - ; -"RTN","ut",307,0) -ERROR ; record errors -"RTN","ut",308,0) - ; ZEXCEPT: %utERRL,%utGUI,%utERR -CREATED IN SETUP, KILLED IN END -"RTN","ut",309,0) - ; ZEXCEPT: %ut -- NEWED ON ENTRY -"RTN","ut",310,0) ; ZEXCEPT: XTGUISEP - newed in GUINEXT -"RTN","ut",311,0) - S %ut("CHK")=%ut("CHK")+1 -"RTN","ut",312,0) - I '$D(%utGUI) D ERROR1 -"RTN","ut",313,0) - I $D(%utGUI) D -"RTN","ut",314,0) - . S %ut("CNT")=%ut("CNT")+1 -"RTN","ut",315,0) - . S %utERR=%utERR+1 -"RTN","ut",316,0) - . S @%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"ERROR"_XTGUISEP_$S(+$SY=47:$ZS,1:$ZE) -"RTN","ut",317,0) - . Q -"RTN","ut",318,0) - S @($S(+$SY=47:"$ZS",1:"$ZE")_"="_""""""),$EC="" -"RTN","ut",319,0) - Q -"RTN","ut",320,0) - ; -"RTN","ut",321,0) -ERROR1 ; -"RTN","ut",322,0) - I $G(%ut("BREAK")) BREAK ; if we are asked to break upon error, please do so! -"RTN","ut",323,0) - ; ZEXCEPT: %utERRL -CREATED IN SETUP, KILLED IN END -"RTN","ut",324,0) - ; ZEXCEPT: %ut -- NEWED ON ENTRY -"RTN","ut",325,0) - D SETIO -"RTN","ut",326,0) - W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - Error: " W $S(+$SY=47:$ZS,1:$ZE),! D -"RTN","ut",327,0) - . S %ut("ERRN")=%ut("ERRN")+1,%utERRL(%ut("ERRN"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=$S(+$SY=47:$ZS,1:$ZE),%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") -"RTN","ut",328,0) - . Q -"RTN","ut",329,0) - D RESETIO -"RTN","ut",330,0) - Q -"RTN","ut",331,0) -SETIO ; Set M-Unit Device to write the results to... -"RTN","ut",332,0) - ; ZEXCEPT: %ut -- NEWED ON ENTRY -"RTN","ut",333,0) - I $IO'=%ut("IO") S (IO(0),%ut("DEV","OLD"))=$IO USE %ut("IO") SET IO=$IO -"RTN","ut",334,0) - QUIT -"RTN","ut",335,0) - ; -"RTN","ut",336,0) -RESETIO ; Reset $IO back to the original device if we changed it. -"RTN","ut",337,0) - ; ZEXCEPT: %ut -- NEWED ON ENTRY -"RTN","ut",338,0) - I $D(%ut("DEV","OLD")) S IO(0)=%ut("IO") U %ut("DEV","OLD") S IO=$IO K %ut("DEV","OLD") -"RTN","ut",339,0) - QUIT -"RTN","ut",340,0) - ; -"RTN","ut",341,0) -ISUTEST() ; .SUPPORTED API TO DETERMINE IF CURRENTLY IN UNIT TEST -"RTN","ut",342,0) - ; ZEXCEPT: %ut -- NEWED ON ENTRY -"RTN","ut",343,0) - Q $G(%ut)=1 -"RTN","ut",344,0) - ; -"RTN","ut",345,0) -PICKSET ; .OPT Interactive selection of MUnit Test Group -"RTN","ut",346,0) - N DIC,Y,%utROU,%utLIST,DIR -"RTN","ut",347,0) - S DIC=17.9001,DIC(0)="AEQM" D ^DIC Q:Y'>0 W ! -"RTN","ut",348,0) - D GETSET(+Y,.%utROU,.%utLIST) -"RTN","ut",349,0) - N DIC,Y,%ut -"RTN","ut",350,0) - D SETUT -"RTN","ut",351,0) - D EN1(.%utROU,%utLIST) -"RTN","ut",352,0) - S DIR(0)="EA",DIR("A")="Enter RETURN to continue:" D ^DIR K DIR -"RTN","ut",353,0) - Q -"RTN","ut",354,0) - ; -"RTN","ut",355,0) -RUNSET(SETNAME,VERBOSE) ; .SR Run with Specified Selection of MUnit Test Group -"RTN","ut",356,0) - N Y,%utROU,%utLIST,%utVERB -"RTN","ut",357,0) - Q:$G(SETNAME)="" -"RTN","ut",358,0) - S %utVERB=$G(VERBOSE,0) -"RTN","ut",359,0) - S Y=+$$FIND1^DIC(17.9001,"","X",SETNAME) Q:Y'>0 -"RTN","ut",360,0) - D GETSET(Y,.%utROU,.%utLIST) -"RTN","ut",361,0) - N Y,SETNAME,%ut -"RTN","ut",362,0) - D SETUT -"RTN","ut",363,0) - D EN1(.%utROU,%utLIST) -"RTN","ut",364,0) - Q -"RTN","ut",365,0) - ; -"RTN","ut",366,0) - ; DOSET CAN BE USED TO RUN A SET OF TESTS BASED ON THE IEN IN THE MUNIT TEST GROUP file (#17.9001) -"RTN","ut",367,0) -DOSET(IEN,%utVERB) ; 140731 JLI added %utVERB as a second argument -"RTN","ut",368,0) - ; IEN - Internal entry number for selected set of tests in the MUNIT TEST GROUP file (#17.9001) -"RTN","ut",369,0) - ; %utVERB - optional input that indicates verbose output is permitted -"RTN","ut",370,0) - ; -"RTN","ut",371,0) - N %utROU,%utLIST -"RTN","ut",372,0) - I '$D(%utVERB) S %utVERB=0 -"RTN","ut",373,0) - S %utLIST=0 -"RTN","ut",374,0) - D GETSET($G(IEN),.%utROU,.%utLIST) -"RTN","ut",375,0) - I %utLIST>0 N IEN,%ut D SETUT,EN1(.%utROU,%utLIST) -"RTN","ut",376,0) - Q -"RTN","ut",377,0) - ; -"RTN","ut",378,0) -GETSET(IEN,%utROU,%utLIST) ; JLI 140731 - called from PICKSET, RUNSET, DOSET, GUISET -"RTN","ut",379,0) - N IENS,%utROOT -"RTN","ut",380,0) - S IENS=IEN_"," D GETS^DIQ(17.9001,IENS,"1*","","%utROOT") -"RTN","ut",381,0) - S %utLIST=0,IENS="" F S IENS=$O(%utROOT(17.90011,IENS)) Q:IENS="" S %utLIST=%utLIST+1,%utROU(%utLIST)=%utROOT(17.90011,IENS,.01) -"RTN","ut",382,0) - Q -"RTN","ut",383,0) - ; -"RTN","ut",384,0) -GUISET(%utRSLT,XTSET) ; Entry point for GUI start with selected Test Set IEN - called by %ut-TEST GROUP LOAD rpc -"RTN","ut",385,0) - N %utROU,%utLIST,%ut -"RTN","ut",386,0) - D SETUT -"RTN","ut",387,0) - S %ut("RSLT")=$NA(^TMP("MUNIT-%utRSLT",$J)) K @%ut("RSLT") -"RTN","ut",388,0) - D GETSET(XTSET,.%utROU,.%utLIST) -"RTN","ut",389,0) - D GETLIST(.%utROU,%utLIST,%ut("RSLT")) -"RTN","ut",390,0) - S @%ut("RSLT")@(1)=(@%ut("RSLT")@(1))_"^1" ; 110719 mark as new version -"RTN","ut",391,0) - S %utRSLT=%ut("RSLT") -"RTN","ut",392,0) - Q -"RTN","ut",393,0) - ; -"RTN","ut",394,0) -GUILOAD(%utRSLT,%utROUN) ; Entry point for GUI start with %utROUN containing primary routine name - called by %ut-TEST LOAD rpc -"RTN","ut",395,0) - N %utROU,%ut -"RTN","ut",396,0) - D SETUT -"RTN","ut",397,0) - S %ut("RSLT")=$NA(^TMP("MUNIT-%utRSLT",$J)) K @%ut("RSLT") -"RTN","ut",398,0) - S %utROU(1)=%utROUN -"RTN","ut",399,0) - D GETLIST(.%utROU,1,%ut("RSLT")) -"RTN","ut",400,0) - S @%ut("RSLT")@(1)=(@%ut("RSLT")@(1))_"^1" ; 110719 mark as new version -"RTN","ut",401,0) - S %utRSLT=%ut("RSLT") -"RTN","ut",402,0) - Q -"RTN","ut",403,0) - ; -"RTN","ut",404,0) -GETLIST(%utROU,%utLIST,%utRSLT) ; called from GUISET, GUILOAD -"RTN","ut",405,0) - N I,%utROUL,%utROUN,%ut,XTCOMNT,XTVALUE,%utCNT -"RTN","ut",406,0) - S XTVALUE=$NA(^TMP("GUI-MUNIT",$J)) K @XTVALUE -"RTN","ut",407,0) - S %utCNT=0,XTCOMNT="" -"RTN","ut",408,0) - D GETTREE^%ut1(.%utROU,%utLIST) -"RTN","ut",409,0) - F I=1:1 Q:'$D(%utROU(I)) S %utROUL(%utROU(I))="" -"RTN","ut",410,0) - S %utROUN="" F S %utROUN=$O(%utROUL(%utROUN)) Q:%utROUN="" D LOAD(%utROUN,.%utCNT,XTVALUE,XTCOMNT,.%utROUL) -"RTN","ut",411,0) - M @%utRSLT=@XTVALUE -"RTN","ut",412,0) - K @%utRSLT@("SHUTDOWN") -"RTN","ut",413,0) - K @%utRSLT@("STARTUP") -"RTN","ut",414,0) - S @XTVALUE@("LASTROU")="" ; Use this to keep track of place in routines -"RTN","ut",415,0) - Q -"RTN","ut",416,0) - ; -"RTN","ut",417,0) - ; generate list of unit test routines, entry points and comments on test for entry point -"RTN","ut",418,0) -LOAD(%utROUN,%utNCNT,XTVALUE,XTCOMNT,%utROUL) ; called from GETLIST, and recursively from LOAD -"RTN","ut",419,0) - I $T(@("^"_%utROUN))="" S %utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_"^^*** ERROR - ROUTINE NAME NOT FOUND" Q -"RTN","ut",420,0) - S %utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_U_U_XTCOMNT -"RTN","ut",421,0) - ;N %utI,XTX1,XTX2,LINE -"RTN","ut",422,0) - N %utI,XTX1,XTX2,LINE,LIST,I -"RTN","ut",423,0) - ; 100622 JLI added code to identify STARTUP and TEARDOWN -"RTN","ut",424,0) - I $T(@("STARTUP^"_%utROUN))'="",'$D(@XTVALUE@("STARTUP")) S @XTVALUE@("STARTUP")="STARTUP^"_%utROUN -"RTN","ut",425,0) - I $T(@("SHUTDOWN^"_%utROUN))'="",'$D(@XTVALUE@("SHUTDOWN")) S @XTVALUE@("SHUTDOWN")="SHUTDOWN^"_%utROUN -"RTN","ut",426,0) - ; JLI 140731 handle @TEST identified test tags -"RTN","ut",427,0) - D NEWSTYLE^%ut1(.LIST,%utROUN) -"RTN","ut",428,0) - F I=1:1:LIST S %utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_U_LIST(I) -"RTN","ut",429,0) - ; JLI 140731 end of @TEST addition -"RTN","ut",430,0) - F %utI=1:1 S LINE=$T(@("XTENT+"_%utI_"^"_%utROUN)) S XTX1=$P(LINE,";",3) Q:XTX1="" S XTX2=$P(LINE,";",4),%utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_U_XTX1_U_XTX2 -"RTN","ut",431,0) - F %utI=1:1 S LINE=$T(@("XTROU+"_%utI_"^"_%utROUN)) S XTX1=$P(LINE,";",3) Q:XTX1="" S XTCOMNT=$P(LINE,";",4) I '$D(%utROUL(XTX1)) S %utROUL(XTX1)="" D LOAD(XTX1,.%utNCNT,XTVALUE,XTCOMNT,.%utROUL) -"RTN","ut",432,0) - Q -"RTN","ut",433,0) - ; -"RTN","ut",434,0) -GUINEXT(%utRSLT,%utLOC,XTGUISEP) ; Entry point for GUI execute next test - called by %ut-TEST NEXT rpc -"RTN","ut",435,0) - ; XTGUISEP - added 110719 to provide for changing separator for GUI -"RTN","ut",436,0) - ; return from ^ to another value ~~^~~ so that data returned -"RTN","ut",437,0) - ; is not affected by ^ values in the data - if not present -"RTN","ut",438,0) - ; sets value to default ^ -"RTN","ut",439,0) - N %utETRY,%utROUT,XTOLROU,XTVALUE,%utERR,%utGUI -"RTN","ut",440,0) - N %ut -"RTN","ut",441,0) - I $G(XTGUISEP)="" S XTGUISEP="^" -"RTN","ut",442,0) - D SETUT -"RTN","ut",443,0) - S %ut("LOC")=%utLOC -"RTN","ut",444,0) - S %ut("CURR")=0,%ut("ECNT")=0,%ut("FAIL")=0,%ut("CHK")=0,%ut("NENT")=0,%ut("ERRN")=0 -"RTN","ut",445,0) - S XTVALUE=$NA(^TMP("GUI-MUNIT",$J)) -"RTN","ut",446,0) - S %ut("RSLT")=$NA(^TMP("GUINEXT",$J)) K @%ut("RSLT") -"RTN","ut",447,0) - S %utRSLT=%ut("RSLT") -"RTN","ut",448,0) - S %utETRY=$P(%utLOC,U),%utROUT=$P(%utLOC,U,2),XTOLROU=$G(@XTVALUE@("LASTROU")) -"RTN","ut",449,0) - S %utGUI=1 -"RTN","ut",450,0) - S %ut("CHK")=0,%ut("CNT")=1,%utERR=0 -"RTN","ut",451,0) - ; I %utROUT'=XTOLROU D I %utROUT="" S @%utRSLT@(1)="" K @XTVALUE Q ;140731 JLI - commented out -"RTN","ut",452,0) - ;D I %utROUT="" S @%utRSLT@(1)="" K @XTVALUE Q ; 140731 JLI - replaced previous line - moves check for SHUTDOWN at end of processing -"RTN","ut",453,0) - D I %utROUT="" S @%utRSLT@(1)="" Q ; 140829 JLI - Have to leave XTVALUE intact, in case they simply run again for STARTUP, etc. -"RTN","ut",454,0) - . I XTOLROU="",$D(@XTVALUE@("STARTUP")) D -"RTN","ut",455,0) - . . S %ut("LOC")=@XTVALUE@("STARTUP") -"RTN","ut",456,0) - . . N $ETRAP S $ETRAP="D ERROR^%ut" -"RTN","ut",457,0) - . . D @(@XTVALUE@("STARTUP")) -"RTN","ut",458,0) +"RTN","ut",303,0) + S XTERMSG="NO VALUES INPUT TO CHKEQ^%ut - no evaluation possible" +"RTN","ut",304,0) + I '$D(%utGUI) D +"RTN","ut",305,0) + . D SETIO +"RTN","ut",306,0) + . W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " W XTERMSG,! D +"RTN","ut",307,0) + . . S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") +"RTN","ut",308,0) . . Q +"RTN","ut",309,0) + . D RESETIO +"RTN","ut",310,0) + . Q +"RTN","ut",311,0) + I $D(%utGUI) S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_XTERMSG,%ut("FAIL")=%ut("FAIL")+1 +"RTN","ut",312,0) + Q +"RTN","ut",313,0) + ; +"RTN","ut",314,0) +ERROR ; record errors +"RTN","ut",315,0) + ; ZEXCEPT: %utERRL,%utGUI,%utERR -CREATED IN SETUP, KILLED IN END +"RTN","ut",316,0) + ; ZEXCEPT: %ut -- NEWED ON ENTRY +"RTN","ut",317,0) + ; ZEXCEPT: XTGUISEP - newed in GUINEXT +"RTN","ut",318,0) + S %ut("CHK")=%ut("CHK")+1 +"RTN","ut",319,0) + I '$D(%utGUI) D ERROR1 +"RTN","ut",320,0) + I $D(%utGUI) D +"RTN","ut",321,0) + . S %ut("CNT")=%ut("CNT")+1 +"RTN","ut",322,0) + . S %utERR=%utERR+1 +"RTN","ut",323,0) + . S @%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"ERROR"_XTGUISEP_$S(+$SY=47:$ZS,1:$ZE) +"RTN","ut",324,0) + . Q +"RTN","ut",325,0) + S @($S(+$SY=47:"$ZS",1:"$ZE")_"="_""""""),$EC="" +"RTN","ut",326,0) + Q +"RTN","ut",327,0) + ; +"RTN","ut",328,0) +ERROR1 ; +"RTN","ut",329,0) + I $G(%ut("BREAK")) BREAK ; if we are asked to break upon error, please do so! +"RTN","ut",330,0) + ; ZEXCEPT: %utERRL -CREATED IN SETUP, KILLED IN END +"RTN","ut",331,0) + ; ZEXCEPT: %ut -- NEWED ON ENTRY +"RTN","ut",332,0) + D SETIO +"RTN","ut",333,0) + W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - Error: " W $S(+$SY=47:$ZS,1:$ZE),! D +"RTN","ut",334,0) + . S %ut("ERRN")=%ut("ERRN")+1,%utERRL(%ut("ERRN"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=$S(+$SY=47:$ZS,1:$ZE),%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") +"RTN","ut",335,0) + . Q +"RTN","ut",336,0) + D RESETIO +"RTN","ut",337,0) + Q +"RTN","ut",338,0) +SETIO ; Set M-Unit Device to write the results to... +"RTN","ut",339,0) + ; ZEXCEPT: %ut -- NEWED ON ENTRY +"RTN","ut",340,0) + I $IO'=%ut("IO") S (IO(0),%ut("DEV","OLD"))=$IO USE %ut("IO") SET IO=$IO +"RTN","ut",341,0) + QUIT +"RTN","ut",342,0) + ; +"RTN","ut",343,0) +RESETIO ; Reset $IO back to the original device if we changed it. +"RTN","ut",344,0) + ; ZEXCEPT: %ut -- NEWED ON ENTRY +"RTN","ut",345,0) + I $D(%ut("DEV","OLD")) S IO(0)=%ut("IO") U %ut("DEV","OLD") S IO=$IO K %ut("DEV","OLD") +"RTN","ut",346,0) + QUIT +"RTN","ut",347,0) + ; +"RTN","ut",348,0) +ISUTEST() ; .SUPPORTED API TO DETERMINE IF CURRENTLY IN UNIT TEST +"RTN","ut",349,0) + ; ZEXCEPT: %ut -- NEWED ON ENTRY +"RTN","ut",350,0) + Q $G(%ut)=1 +"RTN","ut",351,0) + ; +"RTN","ut",352,0) +PICKSET ; .OPT Interactive selection of MUnit Test Group +"RTN","ut",353,0) + N DIC,Y,%utROU,%utLIST,DIR S DIC=17.9001,DIC(0)="AEQM" D ^DIC Q:Y'>0 W ! D GETSET(+Y,.%utROU,.%utLIST) N DIC,Y,%ut D SETUT D EN1(.%utROU,%utLIST) S DIR(0)="EA",DIR("A")="Enter RETURN to continue:" D ^DIR K DIR +"RTN","ut",354,0) + Q +"RTN","ut",355,0) + ; +"RTN","ut",356,0) +RUNSET(SETNAME,VERBOSE) ; .SR Run with Specified Selection of MUnit Test Group +"RTN","ut",357,0) + N Y,%utROU,%utLIST,%utVERB +"RTN","ut",358,0) + Q:$G(SETNAME)="" +"RTN","ut",359,0) + S %utVERB=$G(VERBOSE,0) +"RTN","ut",360,0) + S Y=+$$FIND1^DIC(17.9001,"","X",SETNAME) Q:Y'>0 +"RTN","ut",361,0) + D GETSET(Y,.%utROU,.%utLIST) +"RTN","ut",362,0) + N Y,SETNAME,%ut +"RTN","ut",363,0) + D SETUT +"RTN","ut",364,0) + D EN1(.%utROU,%utLIST) +"RTN","ut",365,0) + Q +"RTN","ut",366,0) + ; +"RTN","ut",367,0) + ; DOSET CAN BE USED TO RUN A SET OF TESTS BASED ON THE IEN IN THE MUNIT TEST GROUP file (#17.9001) +"RTN","ut",368,0) +DOSET(IEN,%utVERB) ; 140731 JLI added %utVERB as a second argument +"RTN","ut",369,0) + ; IEN - Internal entry number for selected set of tests in the MUNIT TEST GROUP file (#17.9001) +"RTN","ut",370,0) + ; %utVERB - optional input that indicates verbose output is permitted +"RTN","ut",371,0) + ; +"RTN","ut",372,0) + N %utROU,%utLIST +"RTN","ut",373,0) + I '$D(%utVERB) S %utVERB=0 +"RTN","ut",374,0) + S %utLIST=0 +"RTN","ut",375,0) + D GETSET($G(IEN),.%utROU,.%utLIST) +"RTN","ut",376,0) + I %utLIST>0 N IEN,%ut D SETUT,EN1(.%utROU,%utLIST) +"RTN","ut",377,0) + Q +"RTN","ut",378,0) + ; +"RTN","ut",379,0) +GETSET(IEN,%utROU,%utLIST) ; JLI 140731 - called from PICKSET, RUNSET, DOSET, GUISET +"RTN","ut",380,0) + N IENS,%utROOT +"RTN","ut",381,0) + S IENS=IEN_"," D GETS^DIQ(17.9001,IENS,"1*","","%utROOT") +"RTN","ut",382,0) + S %utLIST=0,IENS="" F S IENS=$O(%utROOT(17.90011,IENS)) Q:IENS="" S %utLIST=%utLIST+1,%utROU(%utLIST)=%utROOT(17.90011,IENS,.01) +"RTN","ut",383,0) + Q +"RTN","ut",384,0) + ; +"RTN","ut",385,0) +COV(NMSP,COVCODE,VERBOSITY) ; simply make it callable from %ut1 as well (along with other APIs) JLI 150101 +"RTN","ut",386,0) + D COV^%ut1(NMSP,COVCODE,+$G(VERBOSITY)) ; see COV^%ut1 for description of arguments +"RTN","ut",387,0) + Q +"RTN","ut",388,0) + ; +"RTN","ut",389,0) +GUISET(%utRSLT,XTSET) ; Entry point for GUI start with selected Test Set IEN - called by %ut-TEST GROUP LOAD rpc +"RTN","ut",390,0) + N %utROU,%utLIST,%ut +"RTN","ut",391,0) + D SETUT +"RTN","ut",392,0) + S %ut("RSLT")=$NA(^TMP("MUNIT-%utRSLT",$J)) K @%ut("RSLT") +"RTN","ut",393,0) + D GETSET(XTSET,.%utROU,.%utLIST) +"RTN","ut",394,0) + D GETLIST(.%utROU,%utLIST,%ut("RSLT")) +"RTN","ut",395,0) + S @%ut("RSLT")@(1)=(@%ut("RSLT")@(1))_"^1" ; 110719 mark as new version +"RTN","ut",396,0) + S %utRSLT=%ut("RSLT") +"RTN","ut",397,0) + Q +"RTN","ut",398,0) + ; +"RTN","ut",399,0) +GUILOAD(%utRSLT,%utROUN) ; Entry point for GUI start with %utROUN containing primary routine name - called by %ut-TEST LOAD rpc +"RTN","ut",400,0) + N %utROU,%ut +"RTN","ut",401,0) + D SETUT +"RTN","ut",402,0) + S %ut("RSLT")=$NA(^TMP("MUNIT-%utRSLT",$J)) K @%ut("RSLT") +"RTN","ut",403,0) + S %utROU(1)=%utROUN +"RTN","ut",404,0) + D GETLIST(.%utROU,1,%ut("RSLT")) +"RTN","ut",405,0) + S @%ut("RSLT")@(1)=(@%ut("RSLT")@(1))_"^1" ; 110719 mark as new version +"RTN","ut",406,0) + S %utRSLT=%ut("RSLT") +"RTN","ut",407,0) + Q +"RTN","ut",408,0) + ; +"RTN","ut",409,0) +GETLIST(%utROU,%utLIST,%utRSLT) ; called from GUISET, GUILOAD +"RTN","ut",410,0) + N I,%utROUL,%utROUN,%ut,XTCOMNT,XTVALUE,%utCNT +"RTN","ut",411,0) + S XTVALUE=$NA(^TMP("GUI-MUNIT",$J)) K @XTVALUE +"RTN","ut",412,0) + S %utCNT=0,XTCOMNT="" +"RTN","ut",413,0) + D GETTREE^%ut1(.%utROU,%utLIST) +"RTN","ut",414,0) + F I=1:1 Q:'$D(%utROU(I)) S %utROUL(%utROU(I))="" +"RTN","ut",415,0) + S %utROUN="" F S %utROUN=$O(%utROUL(%utROUN)) Q:%utROUN="" D LOAD(%utROUN,.%utCNT,XTVALUE,XTCOMNT,.%utROUL) +"RTN","ut",416,0) + M @%utRSLT=@XTVALUE +"RTN","ut",417,0) + K @%utRSLT@("SHUTDOWN") +"RTN","ut",418,0) + K @%utRSLT@("STARTUP") +"RTN","ut",419,0) + S @XTVALUE@("LASTROU")="" ; Use this to keep track of place in routines +"RTN","ut",420,0) + Q +"RTN","ut",421,0) + ; +"RTN","ut",422,0) + ; generate list of unit test routines, entry points and comments on test for entry point +"RTN","ut",423,0) +LOAD(%utROUN,%utNCNT,XTVALUE,XTCOMNT,%utROUL) ; called from GETLIST, and recursively from LOAD +"RTN","ut",424,0) + I $T(@("^"_%utROUN))="" S %utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_"^^*** ERROR - ROUTINE NAME NOT FOUND" Q +"RTN","ut",425,0) + S %utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_U_U_XTCOMNT +"RTN","ut",426,0) + ;N %utI,XTX1,XTX2,LINE +"RTN","ut",427,0) + N %utI,XTX1,XTX2,LINE,LIST,I +"RTN","ut",428,0) + ; 100622 JLI added code to identify STARTUP and TEARDOWN +"RTN","ut",429,0) + I $T(@("STARTUP^"_%utROUN))'="",'$D(@XTVALUE@("STARTUP")) S @XTVALUE@("STARTUP")="STARTUP^"_%utROUN +"RTN","ut",430,0) + I $T(@("SHUTDOWN^"_%utROUN))'="",'$D(@XTVALUE@("SHUTDOWN")) S @XTVALUE@("SHUTDOWN")="SHUTDOWN^"_%utROUN +"RTN","ut",431,0) + ; JLI 140731 handle @TEST identified test tags +"RTN","ut",432,0) + D NEWSTYLE^%ut1(.LIST,%utROUN) +"RTN","ut",433,0) + F I=1:1:LIST S %utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_U_LIST(I) +"RTN","ut",434,0) + ; JLI 140731 end of @TEST addition +"RTN","ut",435,0) + F %utI=1:1 S LINE=$T(@("XTENT+"_%utI_"^"_%utROUN)) S XTX1=$P(LINE,";",3) Q:XTX1="" S XTX2=$P(LINE,";",4),%utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_U_XTX1_U_XTX2 +"RTN","ut",436,0) + F %utI=1:1 S LINE=$T(@("XTROU+"_%utI_"^"_%utROUN)) S XTX1=$P(LINE,";",3) Q:XTX1="" S XTCOMNT=$P(LINE,";",4) I '$D(%utROUL(XTX1)) S %utROUL(XTX1)="" D LOAD(XTX1,.%utNCNT,XTVALUE,XTCOMNT,.%utROUL) +"RTN","ut",437,0) + Q +"RTN","ut",438,0) + ; +"RTN","ut",439,0) +GUINEXT(%utRSLT,%utLOC,XTGUISEP) ; Entry point for GUI execute next test - called by %ut-TEST NEXT rpc +"RTN","ut",440,0) + ; XTGUISEP - added 110719 to provide for changing separator for GUI +"RTN","ut",441,0) + ; return from ^ to another value ~~^~~ so that data returned +"RTN","ut",442,0) + ; is not affected by ^ values in the data - if not present +"RTN","ut",443,0) + ; sets value to default ^ +"RTN","ut",444,0) + N %utETRY,%utROUT,XTOLROU,XTVALUE,%utERR,%utGUI +"RTN","ut",445,0) + N %ut +"RTN","ut",446,0) + I $G(XTGUISEP)="" S XTGUISEP="^" +"RTN","ut",447,0) + D SETUT +"RTN","ut",448,0) + S %ut("LOC")=%utLOC +"RTN","ut",449,0) + S %ut("CURR")=0,%ut("ECNT")=0,%ut("FAIL")=0,%ut("CHK")=0,%ut("NENT")=0,%ut("ERRN")=0 +"RTN","ut",450,0) + S XTVALUE=$NA(^TMP("GUI-MUNIT",$J)) +"RTN","ut",451,0) + S %ut("RSLT")=$NA(^TMP("GUINEXT",$J)) K @%ut("RSLT") +"RTN","ut",452,0) + S %utRSLT=%ut("RSLT") +"RTN","ut",453,0) + S %utETRY=$P(%utLOC,U),%utROUT=$P(%utLOC,U,2),XTOLROU=$G(@XTVALUE@("LASTROU")) +"RTN","ut",454,0) + S %utGUI=1 +"RTN","ut",455,0) + S %ut("CHK")=0,%ut("CNT")=1,%utERR=0 +"RTN","ut",456,0) + ; I %utROUT'=XTOLROU D I %utROUT="" S @%utRSLT@(1)="" K @XTVALUE Q ;140731 JLI - commented out +"RTN","ut",457,0) + ;D I %utROUT="" S @%utRSLT@(1)="" K @XTVALUE Q ; 140731 JLI - replaced previous line - moves check for SHUTDOWN at end of processing +"RTN","ut",458,0) + D I %utROUT="" S @%utRSLT@(1)="" Q ; 141018 JLI - Have to leave XTVALUE intact, in case they simply run again for STARTUP, etc. "RTN","ut",459,0) - . S @XTVALUE@("LASTROU")=%utROUT I %utROUT'="",$T(@("SETUP^"_%utROUT))'="" D + . I XTOLROU="",$D(@XTVALUE@("STARTUP")) D "RTN","ut",460,0) - . . S %ut("LOC")="SETUP^"_%utROUT + . . S %ut("LOC")=@XTVALUE@("STARTUP") "RTN","ut",461,0) . . N $ETRAP S $ETRAP="D ERROR^%ut" "RTN","ut",462,0) - . . D @("SETUP^"_%utROUT) + . . D @(@XTVALUE@("STARTUP")) "RTN","ut",463,0) . . Q "RTN","ut",464,0) - . I %utROUT="",$D(@XTVALUE@("SHUTDOWN")) D + . S @XTVALUE@("LASTROU")=%utROUT I %utROUT'="",$T(@("SETUP^"_%utROUT))'="" D "RTN","ut",465,0) - . . S %ut("LOC")=@XTVALUE@("SHUTDOWN") + . . S %ut("LOC")="SETUP^"_%utROUT "RTN","ut",466,0) . . N $ETRAP S $ETRAP="D ERROR^%ut" "RTN","ut",467,0) - . . D @(@XTVALUE@("SHUTDOWN")) + . . D @("SETUP^"_%utROUT) "RTN","ut",468,0) . . Q "RTN","ut",469,0) - . Q + . I %utROUT="",$D(@XTVALUE@("SHUTDOWN")) D "RTN","ut",470,0) - S %ut("LOC")=%utLOC + . . S %ut("LOC")=@XTVALUE@("SHUTDOWN") "RTN","ut",471,0) - S %ut("CHK")=0,%ut("CNT")=1,%utERR=0 + . . N $ETRAP S $ETRAP="D ERROR^%ut" "RTN","ut",472,0) - D ; to limit range of error trap so we continue through other tests + . . D @(@XTVALUE@("SHUTDOWN")) "RTN","ut",473,0) - . N $ETRAP S $ETRAP="D ERROR^%ut" + . . Q "RTN","ut",474,0) - . D @%ut("LOC") -"RTN","ut",475,0) . Q +"RTN","ut",475,0) + S %ut("LOC")=%utLOC "RTN","ut",476,0) - I $T(@("TEARDOWN^"_%utROUT))'="" D + S %ut("CHK")=0,%ut("CNT")=1,%utERR=0 "RTN","ut",477,0) - . S %ut("LOC")="TEARDOWN^"_%utROUT + D ; to limit range of error trap so we continue through other tests "RTN","ut",478,0) . N $ETRAP S $ETRAP="D ERROR^%ut" "RTN","ut",479,0) - . D @("TEARDOWN^"_%utROUT) + . D @%ut("LOC") "RTN","ut",480,0) . Q "RTN","ut",481,0) - S @%ut("RSLT")@(1)=%ut("CHK")_XTGUISEP_(%ut("CNT")-1-%utERR)_XTGUISEP_%utERR + I $T(@("TEARDOWN^"_%utROUT))'="" D "RTN","ut",482,0) - Q + . S %ut("LOC")="TEARDOWN^"_%utROUT "RTN","ut",483,0) - ; + . N $ETRAP S $ETRAP="D ERROR^%ut" "RTN","ut",484,0) -TESTCOVR ; entry under coverage analysis + . D @("TEARDOWN^"_%utROUT) "RTN","ut",485,0) - D ENTRY^%uttcovr ; does analysis while running various unit tests + . Q "RTN","ut",486,0) - Q + S @%ut("RSLT")@(1)=%ut("CHK")_XTGUISEP_(%ut("CNT")-1-%utERR)_XTGUISEP_%utERR "RTN","ut",487,0) + Q +"RTN","ut",488,0) ; "RTN","ut1") -0^2^B87092328 +0^2^B105832889 "RTN","ut1",1,0) -%ut1 ;VEN/SMH/JLI - CONTINUATION OF M-UNIT PROCESSING ;09/10/14 14:27 +%ut1 ;VEN/SMH/JLI - CONTINUATION OF M-UNIT PROCESSING ; 7/2/15 10:45pm "RTN","ut1",2,0) - ;;0.1;MASH UTILITIES; + ;;0.1;MASH UTILITIES;;;Build 4 "RTN","ut1",3,0) ; "RTN","ut1",4,0) @@ -1763,511 +1865,847 @@ TESTCOVR ; entry under coverage analysis "RTN","ut1",17,0) ; "RTN","ut1",18,0) - Q + D ^%utt6 ; runs unit tests from several perspectives "RTN","ut1",19,0) - ; + Q "RTN","ut1",20,0) -CHEKTEST(%utROU,%ut,%utUETRY) ; Collect Test list. + ; "RTN","ut1",21,0) - ; %utROU - input - Name of routine to check for tags with @TEST attribute +CHEKTEST(%utROU,%ut,%utUETRY) ; Collect Test list. "RTN","ut1",22,0) - ; %ut - input/output - passed by reference + ; %utROU - input - Name of routine to check for tags with @TEST attribute "RTN","ut1",23,0) - ; %utUETRY - input/output - passed by reference + ; %ut - input/output - passed by reference "RTN","ut1",24,0) - ; + ; %utUETRY - input/output - passed by reference "RTN","ut1",25,0) - ; Test list collected in two ways: + ; "RTN","ut1",26,0) - ; - @TEST on labellines + ; Test list collected in two ways: "RTN","ut1",27,0) - ; - Offsets of XTENT + ; - @TEST on labellines "RTN","ut1",28,0) - ; + ; - Offsets of XTENT "RTN","ut1",29,0) - S %ut("ENTN")=0 ; Number of test, sub to %utUETRY. + ; "RTN","ut1",30,0) - ; + S %ut("ENTN")=0 ; Number of test, sub to %utUETRY. "RTN","ut1",31,0) - ; This stanza and everything below is for collecting @TEST. -"RTN","ut1",32,0) - ; VEN/SMH - block refactored to use $TEXT instead of ^%ZOSF("LOAD") -"RTN","ut1",33,0) - N I,LIST -"RTN","ut1",34,0) - S I=$L($T(@(U_%utROU))) I I<0 Q "-1^Invalid Routine Name" -"RTN","ut1",35,0) - ; 140731 JLI - the following SMH code is replaced by the code below -"RTN","ut1",36,0) - ; Complexity galore: $TEXT loops through routine -"RTN","ut1",37,0) - ; IF tab or space isn't the first character ($C(9,32)) and line contains @TEST -"RTN","ut1",38,0) - ; Load that line as a testing entry point -"RTN","ut1",39,0) - ; F I=1:1 S LINE=$T(@("+"_I_U_%utROU)) Q:LINE="" I $C(9,32)'[$E(LINE),$$UP(LINE)["@TEST" D -"RTN","ut1",40,0) - ; . N TAGNAME,CHAR,NPAREN S TAGNAME="",NPAREN=0 -"RTN","ut1",41,0) - ; . F Q:LINE="" S CHAR=$E(LINE),LINE=$E(LINE,2,999) Q:CHAR="" Q:" ("[CHAR S TAGNAME=TAGNAME_CHAR -"RTN","ut1",42,0) - ; . ; should be no paren or arguments -"RTN","ut1",43,0) - ; . I CHAR="(" Q -"RTN","ut1",44,0) - ; . F Q:LINE="" S CHAR=$E(LINE) Q:" ;"'[CHAR S LINE=$E(LINE,2,999) -"RTN","ut1",45,0) - ; . I $$UP($E(LINE,1,5))="@TEST" S LINE=$E(LINE,6,999) D -"RTN","ut1",46,0) - ; . . S %ut("ENTN")=%ut("ENTN")+1,%utUETRY(%ut("ENTN"))=TAGNAME -"RTN","ut1",47,0) - ; . . F Q:LINE="" S CHAR=$E(LINE) Q:CHAR?1AN S LINE=$E(LINE,2,999) -"RTN","ut1",48,0) - ; . . S %utUETRY(%ut("ENTN"),"NAME")=LINE -"RTN","ut1",49,0) - ; JLI 140731 - end of code replaced by following code -"RTN","ut1",50,0) - ; JLI 140731 - the following code replaces the code above -"RTN","ut1",51,0) - D NEWSTYLE(.LIST,%utROU) -"RTN","ut1",52,0) - F I=1:1:LIST S %ut("ENTN")=%ut("ENTN")+1,%utUETRY(%ut("ENTN"))=$P(LIST(I),U),%utUETRY(%ut("ENTN"),"NAME")=$P(LIST(I),U,2,99) -"RTN","ut1",53,0) - ; JLI 140731 - end of replacement code -"RTN","ut1",54,0) ; +"RTN","ut1",32,0) + ; This stanza and everything below is for collecting @TEST. +"RTN","ut1",33,0) + ; VEN/SMH - block refactored to use $TEXT instead of ^%ZOSF("LOAD") +"RTN","ut1",34,0) + N I,LIST +"RTN","ut1",35,0) + S I=$L($T(@(U_%utROU))) I I<0 Q "-1^Invalid Routine Name" +"RTN","ut1",36,0) + ; 140731 JLI - the following SMH code is replaced by the code below +"RTN","ut1",37,0) + ; Complexity galore: $TEXT loops through routine +"RTN","ut1",38,0) + ; IF tab or space isn't the first character ($C(9,32)) and line contains @TEST +"RTN","ut1",39,0) + ; Load that line as a testing entry point +"RTN","ut1",40,0) + ; F I=1:1 S LINE=$T(@("+"_I_U_%utROU)) Q:LINE="" I $C(9,32)'[$E(LINE),$$UP(LINE)["@TEST" D +"RTN","ut1",41,0) + ; . N TAGNAME,CHAR,NPAREN S TAGNAME="",NPAREN=0 +"RTN","ut1",42,0) + ; . F Q:LINE="" S CHAR=$E(LINE),LINE=$E(LINE,2,999) Q:CHAR="" Q:" ("[CHAR S TAGNAME=TAGNAME_CHAR +"RTN","ut1",43,0) + ; . ; should be no paren or arguments +"RTN","ut1",44,0) + ; . I CHAR="(" Q +"RTN","ut1",45,0) + ; . F Q:LINE="" S CHAR=$E(LINE) Q:" ;"'[CHAR S LINE=$E(LINE,2,999) +"RTN","ut1",46,0) + ; . I $$UP($E(LINE,1,5))="@TEST" S LINE=$E(LINE,6,999) D +"RTN","ut1",47,0) + ; . . S %ut("ENTN")=%ut("ENTN")+1,%utUETRY(%ut("ENTN"))=TAGNAME +"RTN","ut1",48,0) + ; . . F Q:LINE="" S CHAR=$E(LINE) Q:CHAR?1AN S LINE=$E(LINE,2,999) +"RTN","ut1",49,0) + ; . . S %utUETRY(%ut("ENTN"),"NAME")=LINE +"RTN","ut1",50,0) + ; JLI 140731 - end of code replaced by following code +"RTN","ut1",51,0) + ; JLI 140731 - the following code replaces the code above +"RTN","ut1",52,0) + D NEWSTYLE(.LIST,%utROU) +"RTN","ut1",53,0) + F I=1:1:LIST S %ut("ENTN")=%ut("ENTN")+1,%utUETRY(%ut("ENTN"))=$P(LIST(I),U),%utUETRY(%ut("ENTN"),"NAME")=$P(LIST(I),U,2,99) +"RTN","ut1",54,0) + ; JLI 140731 - end of replacement code "RTN","ut1",55,0) ; "RTN","ut1",56,0) - ; This Stanza is to collect XTENT offsets + ; "RTN","ut1",57,0) - N %utUI F %utUI=1:1 S %ut("ELIN")=$T(@("XTENT+"_%utUI_"^"_%utROU)) Q:$P(%ut("ELIN"),";",3)="" D + ; This Stanza is to collect XTENT offsets "RTN","ut1",58,0) - . S %ut("ENTN")=%ut("ENTN")+1,%utUETRY(%ut("ENTN"))=$P(%ut("ELIN"),";",3),%utUETRY(%ut("ENTN"),"NAME")=$P(%ut("ELIN"),";",4) + N %utUI F %utUI=1:1 S %ut("ELIN")=$T(@("XTENT+"_%utUI_"^"_%utROU)) Q:$P(%ut("ELIN"),";",3)="" D "RTN","ut1",59,0) - . Q + . S %ut("ENTN")=%ut("ENTN")+1,%utUETRY(%ut("ENTN"))=$P(%ut("ELIN"),";",3),%utUETRY(%ut("ENTN"),"NAME")=$P(%ut("ELIN"),";",4) "RTN","ut1",60,0) - ; + . Q "RTN","ut1",61,0) - QUIT + ; "RTN","ut1",62,0) - ; + QUIT "RTN","ut1",63,0) - ; VEN/SMH 26JUL2013 - Moved GETTREE here. + ; "RTN","ut1",64,0) -GETTREE(%utROU,%utULIST) ; + ; VEN/SMH 26JUL2013 - Moved GETTREE here. "RTN","ut1",65,0) - ; first get any other routines this one references for running subsequently +GETTREE(%utROU,%utULIST) ; "RTN","ut1",66,0) - ; then any that they refer to as well + ; first get any other routines this one references for running subsequently "RTN","ut1",67,0) - ; this builds a tree of all routines referred to by any routine including each only once + ; then any that they refer to as well "RTN","ut1",68,0) - N %utUK,%utUI,%utUJ,%utURNAM,%utURLIN + ; this builds a tree of all routines referred to by any routine including each only once "RTN","ut1",69,0) - F %utUK=1:1 Q:'$D(%utROU(%utUK)) D + N %utUK,%utUI,%utUJ,%utURNAM,%utURLIN "RTN","ut1",70,0) - . F %utUI=1:1 S %utURLIN=$T(@("XTROU+"_%utUI_"^"_%utROU(%utUK))) S %utURNAM=$P(%utURLIN,";",3) Q:%utURNAM="" D + F %utUK=1:1 Q:'$D(%utROU(%utUK)) D "RTN","ut1",71,0) - . . F %utUJ=1:1:%utULIST I %utROU(%utUJ)=%utURNAM S %utURNAM="" Q + . F %utUI=1:1 S %utURLIN=$T(@("XTROU+"_%utUI_"^"_%utROU(%utUK))) S %utURNAM=$P(%utURLIN,";",3) Q:%utURNAM="" D "RTN","ut1",72,0) - . . I %utURNAM'="",$T(@("+1^"_%utURNAM))="" W:'$D(XWBOS) "Referenced routine ",%utURNAM," not found.",! Q + . . F %utUJ=1:1:%utULIST I %utROU(%utUJ)=%utURNAM S %utURNAM="" Q "RTN","ut1",73,0) - . . S:%utURNAM'="" %utULIST=%utULIST+1,%utROU(%utULIST)=%utURNAM + . . I %utURNAM'="",$T(@("+1^"_%utURNAM))="" W:'$D(XWBOS) "Referenced routine ",%utURNAM," not found.",! Q "RTN","ut1",74,0) - QUIT + . . S:%utURNAM'="" %utULIST=%utULIST+1,%utROU(%utULIST)=%utURNAM "RTN","ut1",75,0) - ; -"RTN","ut1",76,0) -NEWSTYLE(LIST,ROUNAME) ; JLI 140726 identify and return list of newstyle tags or entries for this routine -"RTN","ut1",77,0) - ; LIST - input, passed by reference - returns containing array with list of tags identified as tests -"RTN","ut1",78,0) - ; LIST indicates number of tags identified, LIST(n)=tag^test_info where tag is entry point for test -"RTN","ut1",79,0) - ; ROUNAME - input - routine name in which tests should be identified -"RTN","ut1",80,0) - ; -"RTN","ut1",81,0) - N I,VALUE,LINE -"RTN","ut1",82,0) - K LIST S LIST=0 -"RTN","ut1",83,0) - ; search routine by line for a tag and @TEST declaration -"RTN","ut1",84,0) - F I=1:1 S LINE=$T(@("+"_I_"^"_ROUNAME)) Q:LINE="" S VALUE=$$CHECKTAG(LINE) I VALUE'="" S LIST=LIST+1,LIST(LIST)=VALUE -"RTN","ut1",85,0) - Q -"RTN","ut1",86,0) - ; -"RTN","ut1",87,0) -CHECKTAG(LINE) ; JLI 140726 check line to determine @test TAG -"RTN","ut1",88,0) - ; LINE - input - Line of code to be checked -"RTN","ut1",89,0) - ; returns null line if not @TEST line, otherwise TAG^NOTE -"RTN","ut1",90,0) - N TAG,NOTE,CHAR -"RTN","ut1",91,0) - I $E(LINE)=" " Q "" ; test entry must have a tag -"RTN","ut1",92,0) - I $$UP(LINE)'["@TEST" Q "" ; must have @TEST declaration -"RTN","ut1",93,0) - I $P($$UP(LINE),"@TEST")["(" Q "" ; can't have an argument -"RTN","ut1",94,0) - S TAG=$P(LINE," "),LINE=$P(LINE," ",2,400),NOTE=$P($$UP(LINE),"@TEST"),LINE=$E(LINE,$L(NOTE)+5+1,$L(LINE)) -"RTN","ut1",95,0) - F Q:NOTE="" S CHAR=$E(NOTE),NOTE=$E(NOTE,2,$L(NOTE)) I " ;"'[CHAR Q ; -"RTN","ut1",96,0) - I $L(NOTE)'=0 Q "" ; @TEST must be first text on line -"RTN","ut1",97,0) - F Q:$E(LINE)'=" " S LINE=$E(LINE,2,$L(LINE)) ; remove leading spaces from test info -"RTN","ut1",98,0) - S TAG=TAG_U_LINE -"RTN","ut1",99,0) - Q TAG -"RTN","ut1",100,0) - ; -"RTN","ut1",101,0) - ; VEN/SMH 17DEC2013 - Remove dependence on VISTA - Uppercase here instead of XLFSTR. -"RTN","ut1",102,0) -UP(X) ; -"RTN","ut1",103,0) - Q $TR(X,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ") -"RTN","ut1",104,0) - ; -"RTN","ut1",105,0) -COV(NMSP,COVCODE,VERBOSITY) ; VEN/SMH - PUBLIC ENTRY POINT; Coverage calculations -"RTN","ut1",106,0) - ; NMSP: Namespace of the routines to analyze. End with * to include all routines. -"RTN","ut1",107,0) - ; Not using * will only include the routine with NMSP name. -"RTN","ut1",108,0) - ; e.g. PSOM* will include all routines starting with PSOM -"RTN","ut1",109,0) - ; PSOM will only include PSOM. -"RTN","ut1",110,0) - ; COVCODE: Mumps code to run over which coverage will be calculated. Typically Unit Tests. -"RTN","ut1",111,0) - ; VERBOSITY (optional): Scalar from -1 to 3. -"RTN","ut1",112,0) - ; - -1 = Global output in ^TMP("%utCOVREPORT",$J) -"RTN","ut1",113,0) - ; - 0 = Print only total coverage -"RTN","ut1",114,0) - ; - 1 = Break down by routine -"RTN","ut1",115,0) - ; - 2 = Break down by routine and tag -"RTN","ut1",116,0) - ; - 3 = Break down by routine and tag, and print lines that didn't execute for each tag. -"RTN","ut1",117,0) - ; -"RTN","ut1",118,0) - Q:'(+$SY=47) ; GT.M only! -"RTN","ut1",119,0) - ; -"RTN","ut1",120,0) - ; ZEXCEPT: CTRAP - not really a variable -"RTN","ut1",121,0) - S VERBOSITY=+$G(VERBOSITY) ; Get 0 if not passed. -"RTN","ut1",122,0) - N %ZR ; GT.M specific -"RTN","ut1",123,0) - D SILENT^%RSEL(NMSP,"SRC") ; GT.M specific. On Cache use $O(^$R(RTN)). -"RTN","ut1",124,0) - ; -"RTN","ut1",125,0) - N RN S RN="" -"RTN","ut1",126,0) - W "Loading routines to test coverage...",! -"RTN","ut1",127,0) - F S RN=$O(%ZR(RN)) Q:RN="" W RN," " D -"RTN","ut1",128,0) - . N L2 S L2=$T(+2^@RN) -"RTN","ut1",129,0) - . S L2=$TR(L2,$C(9,32)) ; Translate spaces and tabs out -"RTN","ut1",130,0) - . I $E(L2,1,2)'=";;" K %ZR(RN) ; Not a human produced routine -"RTN","ut1",131,0) - ; -"RTN","ut1",132,0) - N RTNS M RTNS=%ZR -"RTN","ut1",133,0) - K %ZR -"RTN","ut1",134,0) - ; -"RTN","ut1",135,0) - N GL -"RTN","ut1",136,0) - S GL=$NA(^TMP("%utCOVCOHORT",$J)) -"RTN","ut1",137,0) - K @GL -"RTN","ut1",138,0) - D RTNANAL(.RTNS,GL) -"RTN","ut1",139,0) - K ^TMP("%utCOVCOHORTSAV",$J) -"RTN","ut1",140,0) - M ^TMP("%utCOVCOHORTSAV",$J)=^TMP("%utCOVCOHORT",$J) -"RTN","ut1",141,0) - ; -"RTN","ut1",142,0) - ; -"RTN","ut1",143,0) - K ^TMP("%utCOVRESULT",$J) -"RTN","ut1",144,0) - VIEW "TRACE":1:$NA(^TMP("%utCOVRESULT",$J)) ; GT.M START PROFILING -"RTN","ut1",145,0) - DO ; Run the code, but keep our variables to ourselves. -"RTN","ut1",146,0) - . NEW $ETRAP,$ESTACK -"RTN","ut1",147,0) - . SET $ETRAP="Q:($ES&$Q) -9 Q:$ES W ""CTRL-C ENTERED""" -"RTN","ut1",148,0) - . USE $PRINCIPAL:(CTRAP=$C(3)) -"RTN","ut1",149,0) - . NEW (DUZ,IO,COVCODE,U,DILOCKTM,DISYS,DT,DTIME,IOBS,IOF,IOM,ION,IOS,IOSL,IOST,IOT,IOXY) -"RTN","ut1",150,0) - . XECUTE COVCODE -"RTN","ut1",151,0) - VIEW "TRACE":0:$NA(^TMP("%utCOVRESULT",$J)) ; GT.M STOP PROFILING -"RTN","ut1",152,0) - ; -"RTN","ut1",153,0) - D COVCOV($NA(^TMP("%utCOVCOHORT",$J)),$NA(^TMP("%utCOVRESULT",$J))) ; Venn diagram matching between globals -"RTN","ut1",154,0) - ; -"RTN","ut1",155,0) - ; Report -"RTN","ut1",156,0) - I VERBOSITY=-1 D -"RTN","ut1",157,0) - . K ^TMP("%utCOVREPORT",$J) -"RTN","ut1",158,0) - . D COVRPTGL($NA(^TMP("%utCOVCOHORTSAV",$J)),$NA(^TMP("%utCOVCOHORT",$J)),$NA(^TMP("%utCOVRESULT",$J)),$NA(^TMP("%utCOVREPORT",$J))) -"RTN","ut1",159,0) - E D COVRPT($NA(^TMP("%utCOVCOHORTSAV",$J)),$NA(^TMP("%utCOVCOHORT",$J)),$NA(^TMP("%utCOVRESULT",$J)),VERBOSITY) -"RTN","ut1",160,0) - ; -"RTN","ut1",161,0) QUIT -"RTN","ut1",162,0) +"RTN","ut1",76,0) ; +"RTN","ut1",77,0) +NEWSTYLE(LIST,ROUNAME) ; JLI 140726 identify and return list of newstyle tags or entries for this routine +"RTN","ut1",78,0) + ; LIST - input, passed by reference - returns containing array with list of tags identified as tests +"RTN","ut1",79,0) + ; LIST indicates number of tags identified, LIST(n)=tag^test_info where tag is entry point for test +"RTN","ut1",80,0) + ; ROUNAME - input - routine name in which tests should be identified +"RTN","ut1",81,0) + ; +"RTN","ut1",82,0) + N I,VALUE,LINE +"RTN","ut1",83,0) + K LIST S LIST=0 +"RTN","ut1",84,0) + ; search routine by line for a tag and @TEST declaration +"RTN","ut1",85,0) + F I=1:1 S LINE=$T(@("+"_I_"^"_ROUNAME)) Q:LINE="" S VALUE=$$CHECKTAG(LINE) I VALUE'="" S LIST=LIST+1,LIST(LIST)=VALUE +"RTN","ut1",86,0) + Q +"RTN","ut1",87,0) + ; +"RTN","ut1",88,0) +CHECKTAG(LINE) ; JLI 140726 check line to determine @test TAG +"RTN","ut1",89,0) + ; LINE - input - Line of code to be checked +"RTN","ut1",90,0) + ; returns null line if not @TEST line, otherwise TAG^NOTE +"RTN","ut1",91,0) + N TAG,NOTE,CHAR +"RTN","ut1",92,0) + I $E(LINE)=" " Q "" ; test entry must have a tag +"RTN","ut1",93,0) + I $$UP(LINE)'["@TEST" Q "" ; must have @TEST declaration +"RTN","ut1",94,0) + I $P($$UP(LINE),"@TEST")["(" Q "" ; can't have an argument +"RTN","ut1",95,0) + S TAG=$P(LINE," "),LINE=$P(LINE," ",2,400),NOTE=$P($$UP(LINE),"@TEST"),LINE=$E(LINE,$L(NOTE)+5+1,$L(LINE)) +"RTN","ut1",96,0) + F Q:NOTE="" S CHAR=$E(NOTE),NOTE=$E(NOTE,2,$L(NOTE)) I " ;"'[CHAR Q ; +"RTN","ut1",97,0) + I $L(NOTE)'=0 Q "" ; @TEST must be first text on line +"RTN","ut1",98,0) + F Q:$E(LINE)'=" " S LINE=$E(LINE,2,$L(LINE)) ; remove leading spaces from test info +"RTN","ut1",99,0) + S TAG=TAG_U_LINE +"RTN","ut1",100,0) + Q TAG +"RTN","ut1",101,0) + ; +"RTN","ut1",102,0) + ; VEN/SMH 17DEC2013 - Remove dependence on VISTA - Uppercase here instead of XLFSTR. +"RTN","ut1",103,0) +UP(X) ; +"RTN","ut1",104,0) + Q $TR(X,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ") +"RTN","ut1",105,0) + ; +"RTN","ut1",106,0) +COV(NMSP,COVCODE,VERBOSITY) ; VEN/SMH - PUBLIC ENTRY POINT; Coverage calculations +"RTN","ut1",107,0) + ; NMSP: Namespace of the routines to analyze. End with * to include all routines. +"RTN","ut1",108,0) + ; Not using * will only include the routine with NMSP name. +"RTN","ut1",109,0) + ; e.g. PSOM* will include all routines starting with PSOM +"RTN","ut1",110,0) + ; PSOM will only include PSOM. +"RTN","ut1",111,0) + ; COVCODE: Mumps code to run over which coverage will be calculated. Typically Unit Tests. +"RTN","ut1",112,0) + ; VERBOSITY (optional): Scalar from -1 to 3. +"RTN","ut1",113,0) + ; - -1 = Global output in ^TMP("%utCOVREPORT",$J) +"RTN","ut1",114,0) + ; - 0 = Print only total coverage +"RTN","ut1",115,0) + ; - 1 = Break down by routine +"RTN","ut1",116,0) + ; - 2 = Break down by routine and tag +"RTN","ut1",117,0) + ; - 3 = Break down by routine and tag, and print lines that didn't execute for each tag. +"RTN","ut1",118,0) + ; +"RTN","ut1",119,0) + ; ZEXCEPT: %utcovxx - SET and KILLED in this code at top level +"RTN","ut1",120,0) + Q:'(+$SY=47) ; GT.M only! +"RTN","ut1",121,0) + ; +"RTN","ut1",122,0) + ; ZEXCEPT: CTRAP - not really a variable +"RTN","ut1",123,0) + S VERBOSITY=+$G(VERBOSITY) ; Get 0 if not passed. +"RTN","ut1",124,0) + N %ZR ; GT.M specific +"RTN","ut1",125,0) + D SILENT^%RSEL(NMSP,"SRC") ; GT.M specific. On Cache use $O(^$R(RTN)). +"RTN","ut1",126,0) + ; +"RTN","ut1",127,0) + N RN S RN="" +"RTN","ut1",128,0) + W !,"Loading routines to test coverage...",! +"RTN","ut1",129,0) + F S RN=$O(%ZR(RN)) Q:RN="" W RN," " D +"RTN","ut1",130,0) + . N L2 S L2=$T(+2^@RN) +"RTN","ut1",131,0) + . S L2=$TR(L2,$C(9,32)) ; Translate spaces and tabs out +"RTN","ut1",132,0) + . I $E(L2,1,2)'=";;" K %ZR(RN) ; Not a human produced routine +"RTN","ut1",133,0) + ; +"RTN","ut1",134,0) + N RTNS M RTNS=%ZR +"RTN","ut1",135,0) + K %ZR +"RTN","ut1",136,0) + ; +"RTN","ut1",137,0) + N GL +"RTN","ut1",138,0) + S GL=$NA(^TMP("%utCOVCOHORT",$J)) +"RTN","ut1",139,0) + I '$D(^TMP("%utcovrunning",$J)) K @GL +"RTN","ut1",140,0) + D RTNANAL(.RTNS,GL) +"RTN","ut1",141,0) + I '$D(^TMP("%utcovrunning",$J)) D +"RTN","ut1",142,0) + . K ^TMP("%utCOVCOHORTSAV",$J) +"RTN","ut1",143,0) + . M ^TMP("%utCOVCOHORTSAV",$J)=^TMP("%utCOVCOHORT",$J) +"RTN","ut1",144,0) + . K ^TMP("%utCOVRESULT",$J) +"RTN","ut1",145,0) + . S ^TMP("%utcovrunning",$J)=1,%utcovxx=1 +"RTN","ut1",146,0) + . VIEW "TRACE":1:$NA(^TMP("%utCOVRESULT",$J)) ; GT.M START PROFILING +"RTN","ut1",147,0) + . Q +"RTN","ut1",148,0) + DO ; Run the code, but keep our variables to ourselves. +"RTN","ut1",149,0) + . NEW $ETRAP,$ESTACK +"RTN","ut1",150,0) + . SET $ETRAP="Q:($ES&$Q) -9 Q:$ES W ""CTRL-C ENTERED""" +"RTN","ut1",151,0) + . USE $PRINCIPAL:(CTRAP=$C(3)) +"RTN","ut1",152,0) + . NEW (DUZ,IO,COVCODE,U,DILOCKTM,DISYS,DT,DTIME,IOBS,IOF,IOM,ION,IOS,IOSL,IOST,IOT,IOXY) +"RTN","ut1",153,0) + . XECUTE COVCODE +"RTN","ut1",154,0) + . Q +"RTN","ut1",155,0) + ; GT.M STOP PROFILING if this is the original level that started it +"RTN","ut1",156,0) + I $D(^TMP("%utcovrunning",$J)),$D(%utcovxx) VIEW "TRACE":0:$NA(^TMP("%utCOVRESULT",$J)) K %utcovxx,^TMP("%utcovrunning",$J) +"RTN","ut1",157,0) + ; +"RTN","ut1",158,0) + I '$D(^TMP("%utcovrunning",$J)) D +"RTN","ut1",159,0) + . D COVCOV($NA(^TMP("%utCOVCOHORT",$J)),$NA(^TMP("%utCOVRESULT",$J))) ; Venn diagram matching between globals +"RTN","ut1",160,0) + . ; Report +"RTN","ut1",161,0) + . I VERBOSITY=-1 D +"RTN","ut1",162,0) + . . K ^TMP("%utCOVREPORT",$J) "RTN","ut1",163,0) -RTNANAL(RTNS,GL) ; [Private] - Routine Analysis + . . D COVRPTGL($NA(^TMP("%utCOVCOHORTSAV",$J)),$NA(^TMP("%utCOVCOHORT",$J)),$NA(^TMP("%utCOVRESULT",$J)),$NA(^TMP("%utCOVREPORT",$J))) "RTN","ut1",164,0) - ; Create a global similar to the trace global produced by GT.M in GL + . . Q "RTN","ut1",165,0) - ; Only non-comment lines are stored. + . E D COVRPT($NA(^TMP("%utCOVCOHORTSAV",$J)),$NA(^TMP("%utCOVCOHORT",$J)),$NA(^TMP("%utCOVRESULT",$J)),VERBOSITY) "RTN","ut1",166,0) - ; A tag is always stored. Tag,0 is stored only if there is code on the tag line (format list or actual code). + . Q "RTN","ut1",167,0) - ; tags by themselves don't count toward the total. + QUIT "RTN","ut1",168,0) ; "RTN","ut1",169,0) - N RTN S RTN="" +RTNANAL(RTNS,GL) ; [Private] - Routine Analysis "RTN","ut1",170,0) - F S RTN=$O(RTNS(RTN)) Q:RTN="" D ; for each routine + ; Create a global similar to the trace global produced by GT.M in GL "RTN","ut1",171,0) - . N TAG + ; Only non-comment lines are stored. "RTN","ut1",172,0) - . S TAG=RTN ; start the tags at the first + ; A tag is always stored. Tag,0 is stored only if there is code on the tag line (format list or actual code). "RTN","ut1",173,0) - . N I,LN F I=2:1 S LN=$T(@TAG+I^@RTN) Q:LN="" D ; for each line, starting with the 3rd line (2 off the first tag) + ; tags by themselves don't count toward the total. "RTN","ut1",174,0) - . . I $E(LN)?1A D QUIT ; formal line + ; "RTN","ut1",175,0) - . . . N T ; Terminator + N RTN S RTN="" "RTN","ut1",176,0) - . . . N J F J=1:1:$L(LN) S T=$E(LN,J) Q:T'?1AN ; Loop to... + F S RTN=$O(RTNS(RTN)) Q:RTN="" D ; for each routine "RTN","ut1",177,0) - . . . S TAG=$E(LN,1,J-1) ; Get tag + . N TAG "RTN","ut1",178,0) - . . . S @GL@(RTN,TAG)=TAG ; store line + . S TAG=RTN ; start the tags at the first "RTN","ut1",179,0) - . . . I T="(" S @GL@(RTN,TAG,0)=LN ; formal list + . N I,LN F I=2:1 S LN=$T(@TAG+I^@RTN) Q:LN="" D ; for each line, starting with the 3rd line (2 off the first tag) "RTN","ut1",180,0) - . . . E D ; No formal list + . . I $E(LN)?1A D QUIT ; formal line "RTN","ut1",181,0) - . . . . N LNTR S LNTR=$P(LN,TAG,2,999),LNTR=$TR(LNTR,$C(9,32)) ; Get rest of line, Remove spaces and tabs + . . . N T ; Terminator "RTN","ut1",182,0) - . . . . I $E(LNTR)=";" QUIT ; Comment + . . . N J F J=1:1:$L(LN) S T=$E(LN,J) Q:T'?1AN ; Loop to... "RTN","ut1",183,0) - . . . . S @GL@(RTN,TAG,0)=LN ; Otherwise, store for testing + . . . S TAG=$E(LN,1,J-1) ; Get tag "RTN","ut1",184,0) - . . . S I=0 ; Start offsets from zero (first one at the for will be 1) + . . . S @GL@(RTN,TAG)=TAG ; store line "RTN","ut1",185,0) - . . I $C(32,9)[$E(LN) D QUIT ; Regular line + . . . I T="(" S @GL@(RTN,TAG,0)=LN ; formal list "RTN","ut1",186,0) - . . . N LNTR S LNTR=$TR(LN,$C(32,9)) ; Remove all spaces and tabs + . . . E D ; No formal list "RTN","ut1",187,0) - . . . I $E(LNTR)=";" QUIT ; Comment line -- don't want. + . . . . N LNTR S LNTR=$P(LN,TAG,2,999),LNTR=$TR(LNTR,$C(9,32)) ; Get rest of line, Remove spaces and tabs "RTN","ut1",188,0) - . . . S @GL@(RTN,TAG,I)=LN ; Record line + . . . . I $E(LNTR)=";" QUIT ; Comment "RTN","ut1",189,0) - QUIT + . . . . S @GL@(RTN,TAG,0)=LN ; Otherwise, store for testing "RTN","ut1",190,0) - ; + . . . S I=0 ; Start offsets from zero (first one at the for will be 1) "RTN","ut1",191,0) -ACTLINES(GL) ; [Private] $$ ; Count active lines + . . I $C(32,9)[$E(LN) D QUIT ; Regular line "RTN","ut1",192,0) - ; + . . . N LNTR S LNTR=$TR(LN,$C(32,9,46)) ; Remove all spaces and tabs - JLI 150202 remove periods as well "RTN","ut1",193,0) - N CNT S CNT=0 + . . . I $E(LNTR)=";" QUIT ; Comment line -- don't want. "RTN","ut1",194,0) - N REF S REF=GL + . . . S @GL@(RTN,TAG,I)=LN ; Record line "RTN","ut1",195,0) - N GLQL S GLQL=$QL(GL) + QUIT "RTN","ut1",196,0) - F S REF=$Q(@REF) Q:REF="" Q:(GL'=$NA(@REF,GLQL)) D + ; "RTN","ut1",197,0) - . N REFQL S REFQL=$QL(REF) +ACTLINES(GL) ; [Private] $$ ; Count active lines "RTN","ut1",198,0) - . N LASTSUB S LASTSUB=$QS(REF,REFQL) + ; "RTN","ut1",199,0) - . I LASTSUB?1.N S CNT=CNT+1 + N CNT S CNT=0 "RTN","ut1",200,0) - QUIT CNT + N REF S REF=GL "RTN","ut1",201,0) - ; + N GLQL S GLQL=$QL(GL) "RTN","ut1",202,0) -COVCOV(C,R) ; [Private] - Analyze coverage Cohort vs Result + F S REF=$Q(@REF) Q:REF="" Q:(GL'=$NA(@REF,GLQL)) D "RTN","ut1",203,0) - N RTN S RTN="" + . N REFQL S REFQL=$QL(REF) "RTN","ut1",204,0) - F S RTN=$O(@C@(RTN)) Q:RTN="" D ; For each routine in cohort set + . N LASTSUB S LASTSUB=$QS(REF,REFQL) "RTN","ut1",205,0) - . I '$D(@R@(RTN)) QUIT ; Not present in result set + . I LASTSUB?1.N S CNT=CNT+1 "RTN","ut1",206,0) - . N TAG S TAG="" + QUIT CNT "RTN","ut1",207,0) - . F S TAG=$O(@R@(RTN,TAG)) Q:TAG="" D ; For each tag in the routine in the result set + ; "RTN","ut1",208,0) - . . N LN S LN="" +COVCOV(C,R) ; [Private] - Analyze coverage Cohort vs Result "RTN","ut1",209,0) - . . F S LN=$O(@R@(RTN,TAG,LN)) Q:LN="" D ; for each line in the tag in the routine in the result set -"RTN","ut1",210,0) - . . . I $D(@C@(RTN,TAG,LN)) K ^(LN) ; if present in cohort, kill off -"RTN","ut1",211,0) - QUIT -"RTN","ut1",212,0) - ; -"RTN","ut1",213,0) -COVRPT(C,S,R,V) ; [Private] - Coverage Report -"RTN","ut1",214,0) - ; C = COHORT - Global name -"RTN","ut1",215,0) - ; S = SURVIVORS - Global name -"RTN","ut1",216,0) - ; R = RESULT - Global name -"RTN","ut1",217,0) - ; V = Verbosity - Scalar from -1 to 3 -"RTN","ut1",218,0) - N ORIGLINES S ORIGLINES=$$ACTLINES(C) -"RTN","ut1",219,0) - N LEFTLINES S LEFTLINES=$$ACTLINES(S) -"RTN","ut1",220,0) - W !! -"RTN","ut1",221,0) - W "ORIG: "_ORIGLINES,! -"RTN","ut1",222,0) - W "LEFT: "_LEFTLINES,! -"RTN","ut1",223,0) - W "COVERAGE PERCENTAGE: "_$S(ORIGLINES:$J(ORIGLINES-LEFTLINES/ORIGLINES*100,"",2),1:100.00),! -"RTN","ut1",224,0) - W !! -"RTN","ut1",225,0) - W "BY ROUTINE:",! -"RTN","ut1",226,0) - I V=0 QUIT ; No verbosity. Don't print routine detail -"RTN","ut1",227,0) N RTN S RTN="" -"RTN","ut1",228,0) - F S RTN=$O(@C@(RTN)) Q:RTN="" D -"RTN","ut1",229,0) - . N O S O=$$ACTLINES($NA(@C@(RTN))) -"RTN","ut1",230,0) - . N L S L=$$ACTLINES($NA(@S@(RTN))) -"RTN","ut1",231,0) - . W ?3,RTN,?21,$S(O:$J(O-L/O*100,"",2),1:"100.00"),! -"RTN","ut1",232,0) - . I V=1 QUIT ; Just print the routine coverage for V=1 -"RTN","ut1",233,0) +"RTN","ut1",210,0) + F S RTN=$O(@C@(RTN)) Q:RTN="" D ; For each routine in cohort set +"RTN","ut1",211,0) + . I '$D(@R@(RTN)) QUIT ; Not present in result set +"RTN","ut1",212,0) . N TAG S TAG="" -"RTN","ut1",234,0) - . F S TAG=$O(@C@(RTN,TAG)) Q:TAG="" D -"RTN","ut1",235,0) - . . N O S O=$$ACTLINES($NA(@C@(RTN,TAG))) -"RTN","ut1",236,0) - . . N L S L=$$ACTLINES($NA(@S@(RTN,TAG))) -"RTN","ut1",237,0) - . . W ?5,TAG,?21,$S(O:$J(O-L/O*100,"",2),1:"100.00"),! -"RTN","ut1",238,0) - . . I V=2 QUIT ; Just print routine/tags coverage for V=2; V=3 print uncovered lines -"RTN","ut1",239,0) +"RTN","ut1",213,0) + . F S TAG=$O(@R@(RTN,TAG)) Q:TAG="" D ; For each tag in the routine in the result set +"RTN","ut1",214,0) . . N LN S LN="" -"RTN","ut1",240,0) - . . F S LN=$O(@S@(RTN,TAG,LN)) Q:LN="" W TAG_"+"_LN_": "_^(LN),! -"RTN","ut1",241,0) +"RTN","ut1",215,0) + . . F S LN=$O(@R@(RTN,TAG,LN)) Q:LN="" D ; for each line in the tag in the routine in the result set +"RTN","ut1",216,0) + . . . I $D(@C@(RTN,TAG,LN)) K ^(LN) ; if present in cohort, kill off +"RTN","ut1",217,0) QUIT -"RTN","ut1",242,0) +"RTN","ut1",218,0) ; -"RTN","ut1",243,0) -COVRPTGL(C,S,R,OUT) ; [Private] - Coverage Global for silent invokers -"RTN","ut1",244,0) +"RTN","ut1",219,0) +COVRPT(C,S,R,V) ; [Private] - Coverage Report +"RTN","ut1",220,0) ; C = COHORT - Global name -"RTN","ut1",245,0) +"RTN","ut1",221,0) ; S = SURVIVORS - Global name -"RTN","ut1",246,0) +"RTN","ut1",222,0) ; R = RESULT - Global name -"RTN","ut1",247,0) - ; OUT = OUTPUT - Global name -"RTN","ut1",248,0) - ; -"RTN","ut1",249,0) - N O S O=$$ACTLINES(C) -"RTN","ut1",250,0) - N L S L=$$ACTLINES(S) -"RTN","ut1",251,0) - S @OUT=(O-L)_"/"_O -"RTN","ut1",252,0) - N RTN,TAG,LN S (RTN,TAG,LN)="" -"RTN","ut1",253,0) - F S RTN=$O(@C@(RTN)) Q:RTN="" D -"RTN","ut1",254,0) - . N O S O=$$ACTLINES($NA(@C@(RTN))) -"RTN","ut1",255,0) - . N L S L=$$ACTLINES($NA(@S@(RTN))) -"RTN","ut1",256,0) - . S @OUT@(RTN)=(O-L)_"/"_O -"RTN","ut1",257,0) - . F S TAG=$O(@C@(RTN,TAG)) Q:TAG="" D -"RTN","ut1",258,0) - . . N O S O=$$ACTLINES($NA(@C@(RTN,TAG))) -"RTN","ut1",259,0) - . . N L S L=$$ACTLINES($NA(@S@(RTN,TAG))) -"RTN","ut1",260,0) - . . S @OUT@(RTN,TAG)=(O-L)_"/"_O -"RTN","ut1",261,0) - . . F S LN=$O(@S@(RTN,TAG,LN)) Q:LN="" S @OUT@(RTN,TAG,LN)=@S@(RTN,TAG,LN) -"RTN","ut1",262,0) - QUIT -"RTN","ut1",263,0) - ; -"RTN","ut1",264,0) -TESTCOVR ; entry under coverage analysis -"RTN","ut1",265,0) - D ENTRY^%uttcovr ; does analysis while running various unit tests -"RTN","ut1",266,0) +"RTN","ut1",223,0) + ; V = Verbosity - Scalar from -1 to 3 +"RTN","ut1",224,0) + ; JLI 150702 - modified to be able to do unit tests on setting up the text via COVRPTLS +"RTN","ut1",225,0) + N X +"RTN","ut1",226,0) + S X=$NA(^TMP("%ut1-covrpt",$J)) K @X +"RTN","ut1",227,0) + D COVRPTLS(C,S,R,V,X) +"RTN","ut1",228,0) + F I=1:1 Q:'$D(@X@(I)) W !,@X@(I) +"RTN","ut1",229,0) + K @X +"RTN","ut1",230,0) Q -"RTN","ut1",267,0) +"RTN","ut1",231,0) ; +"RTN","ut1",232,0) +COVRPTLS(C,S,R,V,X) ; +"RTN","ut1",233,0) + ; +"RTN","ut1",234,0) + N LINNUM S LINNUM=0 +"RTN","ut1",235,0) + N ORIGLINES S ORIGLINES=$$ACTLINES(C) +"RTN","ut1",236,0) + N LEFTLINES S LEFTLINES=$$ACTLINES(S) +"RTN","ut1",237,0) + ;W !! +"RTN","ut1",238,0) + S LINNUM=LINNUM+1,@X@(LINNUM)="",LINNUM=LINNUM+1,@X@(LINNUM)="" +"RTN","ut1",239,0) + ;W "ORIG: "_ORIGLINES,! +"RTN","ut1",240,0) + S LINNUM=LINNUM+1,@X@(LINNUM)="ORIG: "_ORIGLINES +"RTN","ut1",241,0) + ;W "LEFT: "_LEFTLINES,! +"RTN","ut1",242,0) + S LINNUM=LINNUM+1,@X@(LINNUM)="LEFT: "_LEFTLINES +"RTN","ut1",243,0) + ;W "COVERAGE PERCENTAGE: "_$S(ORIGLINES:$J(ORIGLINES-LEFTLINES/ORIGLINES*100,"",2),1:100.00),! +"RTN","ut1",244,0) + S LINNUM=LINNUM+1,@X@(LINNUM)="COVERAGE PERCENTAGE: "_$S(ORIGLINES:$J(ORIGLINES-LEFTLINES/ORIGLINES*100,"",2),1:100.00) +"RTN","ut1",245,0) + ;W !! +"RTN","ut1",246,0) + S LINNUM=LINNUM+1,@X@(LINNUM)="",LINNUM=LINNUM+1,@X@(LINNUM)="" +"RTN","ut1",247,0) + ;W "BY ROUTINE:",! +"RTN","ut1",248,0) + S LINNUM=LINNUM+1,@X@(LINNUM)="BY ROUTINE:" +"RTN","ut1",249,0) + I V=0 QUIT ; No verbosity. Don't print routine detail +"RTN","ut1",250,0) + N RTN S RTN="" +"RTN","ut1",251,0) + F S RTN=$O(@C@(RTN)) Q:RTN="" D +"RTN","ut1",252,0) + . N O S O=$$ACTLINES($NA(@C@(RTN))) +"RTN","ut1",253,0) + . N L S L=$$ACTLINES($NA(@S@(RTN))) +"RTN","ut1",254,0) + . ;W ?3,RTN,?21,$S(O:$J(O-L/O*100,"",2),1:"100.00"),! +"RTN","ut1",255,0) + . N XX S XX=" "_RTN_" ",XX=$E(XX,1,20) +"RTN","ut1",256,0) + . S LINNUM=LINNUM+1,@X@(LINNUM)=XX+$S(O:$J(O-L/O*100,"",2),1:"100.00") +"RTN","ut1",257,0) + . I V=1 QUIT ; Just print the routine coverage for V=1 +"RTN","ut1",258,0) + . N TAG S TAG="" +"RTN","ut1",259,0) + . F S TAG=$O(@C@(RTN,TAG)) Q:TAG="" D +"RTN","ut1",260,0) + . . N O S O=$$ACTLINES($NA(@C@(RTN,TAG))) +"RTN","ut1",261,0) + . . N L S L=$$ACTLINES($NA(@S@(RTN,TAG))) +"RTN","ut1",262,0) + . . ;W ?5,TAG,?21,$S(O:$J(O-L/O*100,"",2),1:"100.00"),! +"RTN","ut1",263,0) + . . S XX=" "_TAG_" ",XX=$E(XX,1,20) +"RTN","ut1",264,0) + . . S LINNUM=LINNUM+1,@X@(LINNUM)=XX_$S(O:$J(O-L/O*100,"",2),1:"100.00") +"RTN","ut1",265,0) + . . I V=2 QUIT ; Just print routine/tags coverage for V=2; V=3 print uncovered lines +"RTN","ut1",266,0) + . . N LN S LN="" +"RTN","ut1",267,0) + . . ;F S LN=$O(@S@(RTN,TAG,LN)) Q:LN="" W TAG_"+"_LN_": "_^(LN),! +"RTN","ut1",268,0) + . . F S LN=$O(@S@(RTN,TAG,LN)) Q:LN="" S LINNUM=LINNUM+1,@X@(LINNUM)=TAG_"+"_LN_": "_^(LN) +"RTN","ut1",269,0) + . . Q +"RTN","ut1",270,0) + . Q +"RTN","ut1",271,0) + QUIT +"RTN","ut1",272,0) + ; +"RTN","ut1",273,0) +COVRPTGL(C,S,R,OUT) ; [Private] - Coverage Global for silent invokers +"RTN","ut1",274,0) + ; C = COHORT - Global name +"RTN","ut1",275,0) + ; S = SURVIVORS - Global name +"RTN","ut1",276,0) + ; R = RESULT - Global name +"RTN","ut1",277,0) + ; OUT = OUTPUT - Global name +"RTN","ut1",278,0) + ; +"RTN","ut1",279,0) + N O S O=$$ACTLINES(C) +"RTN","ut1",280,0) + N L S L=$$ACTLINES(S) +"RTN","ut1",281,0) + S @OUT=(O-L)_"/"_O +"RTN","ut1",282,0) + N RTN,TAG,LN S (RTN,TAG,LN)="" +"RTN","ut1",283,0) + F S RTN=$O(@C@(RTN)) Q:RTN="" D +"RTN","ut1",284,0) + . N O S O=$$ACTLINES($NA(@C@(RTN))) +"RTN","ut1",285,0) + . N L S L=$$ACTLINES($NA(@S@(RTN))) +"RTN","ut1",286,0) + . S @OUT@(RTN)=(O-L)_"/"_O +"RTN","ut1",287,0) + . F S TAG=$O(@C@(RTN,TAG)) Q:TAG="" D +"RTN","ut1",288,0) + . . N O S O=$$ACTLINES($NA(@C@(RTN,TAG))) +"RTN","ut1",289,0) + . . N L S L=$$ACTLINES($NA(@S@(RTN,TAG))) +"RTN","ut1",290,0) + . . S @OUT@(RTN,TAG)=(O-L)_"/"_O +"RTN","ut1",291,0) + . . F S LN=$O(@S@(RTN,TAG,LN)) Q:LN="" S @OUT@(RTN,TAG,LN)=@S@(RTN,TAG,LN) +"RTN","ut1",292,0) + QUIT +"RTN","ut1",293,0) + ; +"RTN","utcover") +0^10^B63651128 +"RTN","utcover",1,0) +%utcover ;JLI - generic coverage and unit test runner ; 7/3/15 2:54am +"RTN","utcover",2,0) + ;;0.1;MASH UTILITIES;;;Build 4 +"RTN","utcover",3,0) + ; +"RTN","utcover",4,0) + Q +"RTN","utcover",5,0) + ; +"RTN","utcover",6,0) +TESTONLY(TESTROUS) ; RUN TESTS FOR SPECIFIED ROUTINES +"RTN","utcover",7,0) + ; input TESTROUS - passed by reference - array of routine names to run tests for +"RTN","utcover",8,0) + ; specify those to be called directly by including ^ as part of +"RTN","utcover",9,0) + ; TAG^ROUTINE or ^ROUTINE. +"RTN","utcover",10,0) + ; ROUTINE names without a ^ will be called as EN^%ut("ROUTINE") +"RTN","utcover",11,0) + ; Sometimes to get complete coverage, different entry points may +"RTN","utcover",12,0) + ; need to be called (e.g., at top and for VERBOSE), these should each +"RTN","utcover",13,0) + ; be included. +"RTN","utcover",14,0) + ; If the subscript is a number, it will take the list of comma separated +"RTN","utcover",15,0) + ; values as the routines. If the the subscript is not a number, it will +"RTN","utcover",16,0) + ; take it as a routine to be added to the list, then if the value of the +"RTN","utcover",17,0) + ; contains a comma separated list of routines, they will be added as well. +"RTN","utcover",18,0) + ; Thus a value of +"RTN","utcover",19,0) + ; TESTROUS(1)="A^ROU1,^ROU1,^ROU2,ROU3" +"RTN","utcover",20,0) + ; or a value of +"RTN","utcover",21,0) + ; TESTROUS("A^ROU1")="^ROU1,^ROU2,ROU3" +"RTN","utcover",22,0) + ; will both result in tests for +"RTN","utcover",23,0) + ; D A^ROU1,^ROU1,^ROU2,EN^%ut("ROU3") +"RTN","utcover",24,0) + K ^TMP("%utCOVER",$J,"TESTROUS") +"RTN","utcover",25,0) + M ^TMP("%utCOVER",$J,"TESTROUS")=TESTROUS +"RTN","utcover",26,0) + ; +"RTN","utcover",27,0) +COVENTRY ; setup of COVERAGE NEWs most variables, so TESTROUS passed by global +"RTN","utcover",28,0) + ; +"RTN","utcover",29,0) + N I,ROU,VAL,VALS,UTDATA,TESTS,TESTROUS +"RTN","utcover",30,0) + M TESTROUS=^TMP("%utCOVER",$J,"TESTROUS") +"RTN","utcover",31,0) + S ROU="" F S ROU=$O(TESTROUS(ROU)) Q:ROU="" D +"RTN","utcover",32,0) + . I ROU'=+ROU S TESTS(ROU)="" +"RTN","utcover",33,0) + . F I=1:1 S VAL=$P(TESTROUS(ROU),",",I) Q:VAL="" S TESTS(VAL)="" +"RTN","utcover",34,0) + . Q +"RTN","utcover",35,0) + S ROU="" F S ROU=$O(TESTS(ROU)) Q:ROU="" D +"RTN","utcover",36,0) + . W !!,"RUNNING ",ROU +"RTN","utcover",37,0) + . I ROU[U D @ROU +"RTN","utcover",38,0) + . I ROU'[U D @("EN^%ut("""_ROU_""")") +"RTN","utcover",39,0) + . S VALS=$G(^TMP("%ut",$J,"UTVALS")) I VALS="" Q +"RTN","utcover",40,0) + . F I=1:1 S VAL=$P(VALS,U,I) Q:VAL="" S UTDATA(I)=$G(UTDATA(I))+VAL +"RTN","utcover",41,0) + . K ^TMP("%ut",$J) +"RTN","utcover",42,0) + . Q +"RTN","utcover",43,0) + I $D(UTDATA) D +"RTN","utcover",44,0) + . W !!!,"------------ SUMMARY ------------" +"RTN","utcover",45,0) + . W !,"Ran ",UTDATA(1)," Routine",$S(UTDATA(1)>1:"s",1:""),", ",UTDATA(2)," Entry Tag",$S(UTDATA(2)>1:"s",1:"") +"RTN","utcover",46,0) + . W !,"Checked ",UTDATA(3)," test",$S(UTDATA(3)>1:"s",1:""),", with ",UTDATA(4)," failure",$S(UTDATA(4)'=1:"s",1:"")," and encountered ",UTDATA(5)," error",$S(UTDATA(5)'=1:"s",1:""),"." +"RTN","utcover",47,0) + . Q +"RTN","utcover",48,0) + Q +"RTN","utcover",49,0) + ; +"RTN","utcover",50,0) +COVERAGE(ROUNMSP,TESTROUS,XCLDROUS,RESLTLVL) ; run coverage analysis +"RTN","utcover",51,0) + ; input ROUNMSP - Namespace for routine(s) to be analyzed +"RTN","utcover",52,0) + ; ROUNAME will result in only the routine ROUNAME being analyzed +"RTN","utcover",53,0) + ; ROUN* will result in all routines beginning with ROUN being analyzed +"RTN","utcover",54,0) + ; input TESTROUS - passed by reference - see TESTROUS description for JUSTTEST +"RTN","utcover",55,0) + ; input XCLDROUS - passed by reference - routines passed in a manner similar to TESTROUS, +"RTN","utcover",56,0) + ; but only the routine names, whether as arguments or a comma separated +"RTN","utcover",57,0) + ; list of routines, will be excluded from the analysis of coverage. These +"RTN","utcover",58,0) + ; would normally be names of routines which are only for unit tests, or +"RTN","utcover",59,0) + ; others which should not be included in the analysis for some reason. +"RTN","utcover",60,0) + ; input RESLTLVL - This value determines the amount of information to be generated for the +"RTN","utcover",61,0) + ; analysis. A missing or null value will be considered to be level 1 +"RTN","utcover",62,0) + ; 1 - Listing of analysis only for routine overall +"RTN","utcover",63,0) + ; 2 - Listing of analysis for routine overall and for each TAG +"RTN","utcover",64,0) + ; 3 - Full analysis for each tag, and lists out those lines which were +"RTN","utcover",65,0) + ; not executed during the analysis +"RTN","utcover",66,0) + ; +"RTN","utcover",67,0) + N I,ROU,TYPE,VAL,XCLUDE +"RTN","utcover",68,0) + S RESLTLVL=$G(RESLTLVL,1) +"RTN","utcover",69,0) + I (RESLTLVL<1) S RESLTLVL=1 +"RTN","utcover",70,0) + I (RESLTLVL>3) S RESLTLVL=3 +"RTN","utcover",71,0) + M ^TMP("%utCOVER",$J,"TESTROUS")=TESTROUS ; +"RTN","utcover",72,0) + D COV^%ut1(ROUNMSP,"D COVENTRY^%utCOVER",-1) +"RTN","utcover",73,0) + K ^TMP("%utCOVER",$J,"TESTROUS") +"RTN","utcover",74,0) + S ROU="" F S ROU=$O(XCLDROUS(ROU)) Q:ROU="" D +"RTN","utcover",75,0) + . I ROU'=+ROU S XCLUDE(ROU)="" +"RTN","utcover",76,0) + . F I=1:1 S VAL=$P(XCLDROUS(ROU),",",I) Q:VAL="" S XCLUDE(VAL)="" +"RTN","utcover",77,0) + . Q +"RTN","utcover",78,0) + N TEXTGLOB S TEXTGLOB=$NA(^TMP("%utcover-text",$J)) +"RTN","utcover",79,0) + D LIST(.XCLUDE,RESLTLVL,TEXTGLOB) +"RTN","utcover",80,0) + F I=1:1 Q:'$D(@TEXTGLOB@(I)) W !,@TEXTGLOB@(I) +"RTN","utcover",81,0) + K @TEXTGLOB +"RTN","utcover",82,0) + Q +"RTN","utcover",83,0) + ; +"RTN","utcover",84,0) +LIST(XCLDROUS,TYPE,TEXTGLOB,GLOB) ; +"RTN","utcover",85,0) + ; ZEXCEPT: TYPE1 - NEWed and set below for recursion +"RTN","utcover",86,0) + ; input - ROULIST - a comma separated list of routine names that will +"RTN","utcover",87,0) + ; be used to identify desired routines. Any name +"RTN","utcover",88,0) + ; that begins with one of the specified values will +"RTN","utcover",89,0) + ; be included +"RTN","utcover",90,0) + ; input - TYPE - value indicating amount of detail desired +"RTN","utcover",91,0) + ; 3=full with listing of untouched lines +"RTN","utcover",92,0) + ; 2=moderated with listing by tags +"RTN","utcover",93,0) + ; 1=summary with listing by routine +"RTN","utcover",94,0) + ; input - TEXTGLOB - closed global location in which text is returned +"RTN","utcover",95,0) + ; input - GLOB - used for unit tests - specifies global to work with +"RTN","utcover",96,0) + ; so that coverage data is not impacted +"RTN","utcover",97,0) + ; +"RTN","utcover",98,0) + N CURRCOV,CURRLIN,LINCOV,LINE,LINTOT,ROULIST,ROUNAME,TAG,TOTCOV,TOTLIN,XVAL,LINNUM +"RTN","utcover",99,0) + ; +"RTN","utcover",100,0) + I '$D(GLOB) N GLOB S GLOB=$NA(^TMP("%utCOVREPORT",$J)) +"RTN","utcover",101,0) + D TRIMDATA(.XCLDROUS,GLOB) ; remove undesired routines from data +"RTN","utcover",102,0) + ; +"RTN","utcover",103,0) + N JOB,NAME,BASE +"RTN","utcover",104,0) + S TOTCOV=0,TOTLIN=0,LINNUM=0 +"RTN","utcover",105,0) + ; F NAME="%utCOVREPORT","%utCOVRESULT","%utCOVCOHORT","%utCOVCOHORTSAV" D +"RTN","utcover",106,0) + I TYPE>1 S ROUNAME="" F S ROUNAME=$O(@GLOB@(ROUNAME)) Q:ROUNAME="" S XVAL=^(ROUNAME) D +"RTN","utcover",107,0) + . S CURRCOV=$P(XVAL,"/"),CURRLIN=$P(XVAL,"/",2) +"RTN","utcover",108,0) + . S LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)="",LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)="" +"RTN","utcover",109,0) + . S LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)="Routine "_ROUNAME_" "_CURRCOV_" out of "_CURRLIN_" lines covered"_$S(CURRLIN>0:" ("_$P((100*CURRCOV)/CURRLIN,".")_"%)",1:"") +"RTN","utcover",110,0) + . I TYPE=2 S LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)=" - Summary" +"RTN","utcover",111,0) + . S TAG="" F S TAG=$O(@GLOB@(ROUNAME,TAG)) Q:TAG="" S XVAL=^(TAG) D +"RTN","utcover",112,0) + . . S LINCOV=$P(XVAL,"/"),LINTOT=$P(XVAL,"/",2) +"RTN","utcover",113,0) + . . S LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)=" Tag "_TAG_"^"_ROUNAME_" "_LINCOV_" out of "_LINTOT_" lines covered" +"RTN","utcover",114,0) + . . I TYPE=2 Q +"RTN","utcover",115,0) + . . I LINCOV=LINTOT Q +"RTN","utcover",116,0) + . . S LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)=" the following is a list of lines NOT covered" +"RTN","utcover",117,0) + . . S LINE="" F S LINE=$O(@GLOB@(ROUNAME,TAG,LINE)) Q:LINE="" D +"RTN","utcover",118,0) + . . . I LINE=0 S LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)=" "_TAG_" "_@GLOB@(ROUNAME,TAG,LINE) Q +"RTN","utcover",119,0) + . . . S LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)=" "_TAG_"+"_LINE_" "_@GLOB@(ROUNAME,TAG,LINE) +"RTN","utcover",120,0) + . . . Q +"RTN","utcover",121,0) + . . Q +"RTN","utcover",122,0) + . Q +"RTN","utcover",123,0) + ; for type=3 generate a summary at bottom after detail +"RTN","utcover",124,0) + I TYPE=3 N TYPE1 S TYPE1=2 D LIST(.XCLDROUS,2,TEXTGLOB,GLOB) K TYPE1 +"RTN","utcover",125,0) + I TYPE=2,$G(TYPE1) Q ; CAME IN FROM ABOVE LINE +"RTN","utcover",126,0) + ; summarize by just routine name +"RTN","utcover",127,0) + S LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)="",LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)="" +"RTN","utcover",128,0) + S ROUNAME="" F S ROUNAME=$O(@GLOB@(ROUNAME)) Q:ROUNAME="" S XVAL=^(ROUNAME) D +"RTN","utcover",129,0) + . S CURRCOV=$P(XVAL,"/"),CURRLIN=$P(XVAL,"/",2) +"RTN","utcover",130,0) + . S TOTCOV=TOTCOV+CURRCOV,TOTLIN=TOTLIN+CURRLIN +"RTN","utcover",131,0) + . S LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)="Routine "_ROUNAME_" "_CURRCOV_" out of "_CURRLIN_" lines covered"_$S(CURRLIN>0:" ("_$P((100*CURRCOV)/CURRLIN,".")_"%)",1:"") +"RTN","utcover",132,0) + . Q +"RTN","utcover",133,0) + S LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)="",LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)="" +"RTN","utcover",134,0) + S LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)="Overall Analysis "_TOTCOV_" out of "_TOTLIN_" lines covered"_$S(TOTLIN>0:" ("_$P((100*TOTCOV)/TOTLIN,".")_"% coverage)",1:"") +"RTN","utcover",135,0) + Q +"RTN","utcover",136,0) + ; +"RTN","utcover",137,0) +TRIMDATA(ROULIST,GLOB) ; +"RTN","utcover",138,0) + N ROUNAME +"RTN","utcover",139,0) + S ROUNAME="" F S ROUNAME=$O(ROULIST(ROUNAME)) Q:ROUNAME="" K @GLOB@(ROUNAME) +"RTN","utcover",140,0) + Q +"RTN","utcover",141,0) + ; "RTN","utt1") -0^3^B25860592 +0^3^B26409996 "RTN","utt1",1,0) %utt1 ; VEN/SMH - Testing routines for M-Unit;08/29/14 11:35 "RTN","utt1",2,0) - ;;0.1;MASH UTILITIES; + ;;0.1;MASH UTILITIES;;;Build 4 "RTN","utt1",3,0) %utNITT ; VEN/SMH - Testing routines for M-Unit;2014-04-01 2:04 PM "RTN","utt1",4,0) @@ -2564,12 +3002,14 @@ XTROU ; Routines containing additional tests ;;%utt5; "RTN","utt1",150,0) ;;%utt6; +"RTN","utt1",151,0) + ;;%uttcovr;coverage related tests "RTN","utt2") 0^4^B473823 "RTN","utt2",1,0) %utt2 ; VEN/SMH - Bad Ass Continuation of Unit Tests;08/04/14 09:12 "RTN","utt2",2,0) - ;;0.1;MASH UTILITIES; + ;;0.1;MASH UTILITIES;;;Build 4 "RTN","utt2",3,0) XTMUNITU ; VEN/SMH - Bad Ass Continuation of Unit Tests;2014-04-01 1:03 PM "RTN","utt2",4,0) @@ -2595,7 +3035,7 @@ XTENT ; "RTN","utt3",1,0) %utt3 ; VEN/SMH - Unit Tests Coverage Tests;08/14/14 14:02 "RTN","utt3",2,0) - ;;0.1;MASH UTILITIES; + ;;0.1;MASH UTILITIES;;;Build 4 "RTN","utt3",3,0) XTMUNITV ; VEN/SMH - Unit Tests Coverage Tests;2014-04-16 7:14 PM "RTN","utt3",4,0) @@ -2683,7 +3123,7 @@ INTERNAL(A) ; Counts "RTN","utt4",1,0) %utt4 ; VEN/SMH - Coverage Test Runner;08/23/14 08:33 "RTN","utt4",2,0) - ;;0.1;MASH UTILITIES; + ;;0.1;MASH UTILITIES;;;Build 4 "RTN","utt4",3,0) XTMUNITW ; VEN/SMH - Coverage Test Runner;2014-04-17 3:30 PM "RTN","utt4",4,0) @@ -2727,7 +3167,7 @@ MAIN ; @TEST - Test coverage calculations "RTN","utt5",1,0) %utt5 ;JLI - test for aspects of MUnit functionality ;08/29/14 11:23 "RTN","utt5",2,0) - ;;0.1;MASH UTILITIES; + ;;0.1;MASH UTILITIES;;;Build 4 "RTN","utt5",3,0) Q "RTN","utt5",4,0) @@ -2995,11 +3435,11 @@ XTENT ; "RTN","utt5",135,0) ;;ISUTEST;check ISUTEST inside unit test "RTN","utt6") -0^8^B29243478 +0^8^B30140551 "RTN","utt6",1,0) %utt6 ;JLI - Unit tests for MUnit functionality ;08/29/14 11:43 "RTN","utt6",2,0) - ;;0.1;MASH UTILITIES; + ;;0.1;MASH UTILITIES;;;Build 4 "RTN","utt6",3,0) ; "RTN","utt6",4,0) @@ -3115,117 +3555,123 @@ VERBOSE ; "RTN","utt6",59,0) ; "RTN","utt6",60,0) - ; now run the unit tests in this routine + W !!,"NOW RUNNING UNIT TESTS FOR %uttcovr",!! "RTN","utt6",61,0) - W !!,"NOW RUNNING UNIT TESTS FOR %utt6",!! + D EN^%ut("%uttcovr",VERBOSE) "RTN","utt6",62,0) - D EN^%ut("%utt6",VERBOSE) + ; "RTN","utt6",63,0) - K ^TMP("%utt5",$J),^TMP("%utt5_C",$J),^TMP("%utt5_G",$J),^TMP("%utt6",$J),^TMP("%utt6_GUISET",$J) + ; now run the unit tests in this routine "RTN","utt6",64,0) - ; clean up after GUI calls as well + W !!,"NOW RUNNING UNIT TESTS FOR %utt6",!! "RTN","utt6",65,0) - K ^TMP("GUI-MUNIT",$J),^TMP("GUINEXT",$J),^TMP("MUNIT-%utRSLT",$J) + D EN^%ut("%utt6",VERBOSE) "RTN","utt6",66,0) - Q + K ^TMP("%utt5",$J),^TMP("%utt5_C",$J),^TMP("%utt5_G",$J),^TMP("%utt6",$J),^TMP("%utt6_GUISET",$J) "RTN","utt6",67,0) - ; + ; clean up after GUI calls as well "RTN","utt6",68,0) - ; + K ^TMP("GUI-MUNIT",$J),^TMP("GUINEXT",$J),^TMP("MUNIT-%utRSLT",$J) "RTN","utt6",69,0) - ; WARNING -- WARNING -- WARNING + Q "RTN","utt6",70,0) - ; If the number of NEW STYLE tests in %utt5 is increased (it is currently 1), then the following + ; "RTN","utt6",71,0) - ; test will need to be updated to reflect the change(s) + ; "RTN","utt6",72,0) - ; END OF WARNING -- END OF WARNING -- END OF WARNING + ; WARNING -- WARNING -- WARNING "RTN","utt6",73,0) - ; + ; If the number of NEW STYLE tests in %utt5 is increased (it is currently 1), then the following "RTN","utt6",74,0) -NEWSTYLE ; tests return of valid new style or @TEST indicators + ; test will need to be updated to reflect the change(s) "RTN","utt6",75,0) - N LIST + ; END OF WARNING -- END OF WARNING -- END OF WARNING "RTN","utt6",76,0) - D NEWSTYLE^%ut1(.LIST,"%utt5") + ; "RTN","utt6",77,0) - D CHKEQ^%ut(LIST,1,"Returned an incorrect number ("_LIST_") of New Style indicators - should be one") +NEWSTYLE ; tests return of valid new style or @TEST indicators "RTN","utt6",78,0) - I LIST>0 D CHKEQ^%ut(LIST(1),"NEWSTYLE^identify new style test indicator functionality","Returned incorrect TAG^reason "_LIST(1)) + N LIST "RTN","utt6",79,0) - I LIST>0 D CHKEQ^%ut($G(LIST(2)),"","Returned a value for LIST(2) - should not have any value (i.e., null)") + D NEWSTYLE^%ut1(.LIST,"%utt5") "RTN","utt6",80,0) - Q + D CHKEQ^%ut(LIST,1,"Returned an incorrect number ("_LIST_") of New Style indicators - should be one") "RTN","utt6",81,0) - ; + I LIST>0 D CHKEQ^%ut(LIST(1),"NEWSTYLE^identify new style test indicator functionality","Returned incorrect TAG^reason "_LIST(1)) "RTN","utt6",82,0) -CKGUISET ; + I LIST>0 D CHKEQ^%ut($G(LIST(2)),"","Returned a value for LIST(2) - should not have any value (i.e., null)") "RTN","utt6",83,0) - ; ZEXCEPT: %utt6var - if present, is NEWed and created in code following VERBOSE + Q "RTN","utt6",84,0) - I '$D(%utt6var) Q + ; "RTN","utt6",85,0) - N MAX +CKGUISET ; "RTN","utt6",86,0) - S MAX=$O(^TMP("%utt6_GUISET",$J,""),-1) + ; ZEXCEPT: %utt6var - if present, is NEWed and created in code following VERBOSE "RTN","utt6",87,0) - D CHKTF^%ut(^TMP("%utt6_GUISET",$J,MAX)["%utt6^NEWSTYLE","GUISET returned incorrect list") + I '$D(%utt6var) Q "RTN","utt6",88,0) - Q + N MAX "RTN","utt6",89,0) - ; + S MAX=$O(^TMP("%utt6_GUISET",$J,""),-1) "RTN","utt6",90,0) -CHKCMDLN ; check command line processing of %utt5 + D CHKTF^%ut(^TMP("%utt6_GUISET",$J,MAX)["%utt6^NEWSTYLE","GUISET returned incorrect list") "RTN","utt6",91,0) - ; ZEXCEPT: JLIEXPCT,%utt6var - if present NEWed and created in code following VERBOSE tag + Q "RTN","utt6",92,0) - I '$D(%utt6var) Q + ; "RTN","utt6",93,0) - D CHKTF^%ut($D(^TMP("%utt5_C",$J,JLIEXPCT))=10,"Not enough entries in %utt5 expected "_JLIEXPCT) +CHKCMDLN ; check command line processing of %utt5 "RTN","utt6",94,0) - D CHKTF^%ut($D(^TMP("%utt5_C",$J,JLIEXPCT+1))=0,"Too many entries in %utt5 expected "_JLIEXPCT) -"RTN","utt6",95,0) - D CHKTF^%ut($O(^TMP("%utt5_C",$J,1,""))="STARTUP","Incorrect function for entry 1,'"_$O(^TMP("%utt5_C",$J,1,""))_"' should be 'STARTUP'") -"RTN","utt6",96,0) - D CHKTF^%ut($O(^TMP("%utt5_C",$J,JLIEXPCT,""))="SHUTDOWN","Incorrect function for entry "_JLIEXPCT_", '"_$O(^TMP("%utt5_C",$J,JLIEXPCT,""))_"' should be 'SHUTDOWN'") -"RTN","utt6",97,0) - Q -"RTN","utt6",98,0) - ; -"RTN","utt6",99,0) -CHKGUI ; check GUI processing of %utt5 -"RTN","utt6",100,0) ; ZEXCEPT: JLIEXPCT,%utt6var - if present NEWed and created in code following VERBOSE tag -"RTN","utt6",101,0) +"RTN","utt6",95,0) I '$D(%utt6var) Q -"RTN","utt6",102,0) - D CHKTF^%ut($D(^TMP("%utt5_G",$J,JLIEXPCT))=10,"Not enough entries in %utt5 expected "_JLIEXPCT) -"RTN","utt6",103,0) - D CHKTF^%ut($D(^TMP("%utt5_G",$J,JLIEXPCT+1))=0,"Too many entries in %utt5 expected "_JLIEXPCT) -"RTN","utt6",104,0) - D CHKTF^%ut($O(^TMP("%utt5_G",$J,1,""))="STARTUP","Incorrect function for entry 1,'"_$O(^TMP("%utt5Z_G",1,""))_"' should be 'STARTUP'") -"RTN","utt6",105,0) - D CHKTF^%ut($O(^TMP("%utt5_G",$J,JLIEXPCT,""))="SHUTDOWN","Incorrect function for entry "_JLIEXPCT_", '"_$O(^TMP("%utt5_G",$J,JLIEXPCT,""))_"' should be 'SHUTDOWN'") -"RTN","utt6",106,0) +"RTN","utt6",96,0) + D CHKTF^%ut($D(^TMP("%utt5_C",$J,JLIEXPCT))=10,"Not enough entries in %utt5 expected "_JLIEXPCT) +"RTN","utt6",97,0) + D CHKTF^%ut($D(^TMP("%utt5_C",$J,JLIEXPCT+1))=0,"Too many entries in %utt5 expected "_JLIEXPCT) +"RTN","utt6",98,0) + D CHKTF^%ut($O(^TMP("%utt5_C",$J,1,""))="STARTUP","Incorrect function for entry 1,'"_$O(^TMP("%utt5_C",$J,1,""))_"' should be 'STARTUP'") +"RTN","utt6",99,0) + D CHKTF^%ut($O(^TMP("%utt5_C",$J,JLIEXPCT,""))="SHUTDOWN","Incorrect function for entry "_JLIEXPCT_", '"_$O(^TMP("%utt5_C",$J,JLIEXPCT,""))_"' should be 'SHUTDOWN'") +"RTN","utt6",100,0) Q -"RTN","utt6",107,0) +"RTN","utt6",101,0) ; +"RTN","utt6",102,0) +CHKGUI ; check GUI processing of %utt5 +"RTN","utt6",103,0) + ; ZEXCEPT: JLIEXPCT,%utt6var - if present NEWed and created in code following VERBOSE tag +"RTN","utt6",104,0) + I '$D(%utt6var) Q +"RTN","utt6",105,0) + D CHKTF^%ut($D(^TMP("%utt5_G",$J,JLIEXPCT))=10,"Not enough entries in %utt5 expected "_JLIEXPCT) +"RTN","utt6",106,0) + D CHKTF^%ut($D(^TMP("%utt5_G",$J,JLIEXPCT+1))=0,"Too many entries in %utt5 expected "_JLIEXPCT) +"RTN","utt6",107,0) + D CHKTF^%ut($O(^TMP("%utt5_G",$J,1,""))="STARTUP","Incorrect function for entry 1,'"_$O(^TMP("%utt5Z_G",1,""))_"' should be 'STARTUP'") "RTN","utt6",108,0) -XTENT ; + D CHKTF^%ut($O(^TMP("%utt5_G",$J,JLIEXPCT,""))="SHUTDOWN","Incorrect function for entry "_JLIEXPCT_", '"_$O(^TMP("%utt5_G",$J,JLIEXPCT,""))_"' should be 'SHUTDOWN'") "RTN","utt6",109,0) - ;;CHKCMDLN;check command line processing of %utt5 + Q "RTN","utt6",110,0) - ;;CHKGUI;check GUI processing of %utt5 + ; "RTN","utt6",111,0) - ;;CKGUISET;check list of tests returned by GUISET +XTENT ; "RTN","utt6",112,0) + ;;CHKCMDLN;check command line processing of %utt5 +"RTN","utt6",113,0) + ;;CHKGUI;check GUI processing of %utt5 +"RTN","utt6",114,0) + ;;CKGUISET;check list of tests returned by GUISET +"RTN","utt6",115,0) ;;NEWSTYLE;test return of valid new style or @TEST indicators "RTN","uttcovr") -0^9^B2835727 +0^9^B88235384 "RTN","uttcovr",1,0) -%uttcovr ;JLI/JIVEYSOFT - runs coverage tests on %ut and %ut1 routines via unit tests ;09/10/14 14:34 +uttcovr ;JLI/JIVEYSOFT - runs coverage tests on %ut and %ut1 routines via unit tests ; 7/3/15 12:39pm "RTN","uttcovr",2,0) - ;;0.1;MASH UTILITIES; + ;;0.1;MASH UTILITIES;;;Build 4 "RTN","uttcovr",3,0) ; "RTN","uttcovr",4,0) @@ -3233,87 +3679,389 @@ XTENT ; "RTN","uttcovr",5,0) ; "RTN","uttcovr",6,0) - ; if SHOWALL is true (1) all coverage globals data are listed + ; Have it run the following entry points or, if no ^, call EN^%ut with routine name "RTN","uttcovr",7,0) - ; if SHOWALL is false (0), only the %utCOVREPORT global is listed + S RUNCODE(1)="^%utt1,%utt1,^%utt6,VERBOSE^%utt6,%uttcovr,^%ut,^%ut1,^%utcover" "RTN","uttcovr",8,0) - I '$D(SHOWALL) N SHOWALL S SHOWALL=0 + M ^TMP("%uttcovr",$J,"RUNCODE")=RUNCODE "RTN","uttcovr",9,0) - ; set global node so %utt4 doesn't run its own analysis + ; need this one separate, or it runs into infinite loop "RTN","uttcovr",10,0) - S ^TMP("%uttcovr",$J)=1 + S RUNCODE("ENTRY^%uttcovr")="" "RTN","uttcovr",11,0) - ; start analysis of %ut - it calls entry below + ; Have the analysis EXCLUDE the following routines from coverage - unit test routines "RTN","uttcovr",12,0) - D COV^%ut1("%ut","D TESTCOVR^%ut",-1) + S XCLUDE(1)="%utt1,%utt2,%utt3,%utt4,%utt5,%utt6,%uttcovr" "RTN","uttcovr",13,0) - D LIST("%ut") ; output results of analysis + M ^TMP("%uttcovr",$J,"XCLUDE")=XCLUDE "RTN","uttcovr",14,0) - ; start analysis of %ut1 + D COVERAGE^%utcover("%ut*",.RUNCODE,.XCLUDE,3) "RTN","uttcovr",15,0) - D COV^%ut1("%ut1","D TESTCOVR^%ut1",3) + Q "RTN","uttcovr",16,0) - D LIST("%ut1") + ; "RTN","uttcovr",17,0) - K ^TMP("%uttcovr",$J) -"RTN","uttcovr",18,0) - Q -"RTN","uttcovr",19,0) - ; -"RTN","uttcovr",20,0) -SHOWALL ; Entry to get all coverage globals listed -"RTN","uttcovr",21,0) - N SHOWALL -"RTN","uttcovr",22,0) - S SHOWALL=1 -"RTN","uttcovr",23,0) - D ^%uttcovr -"RTN","uttcovr",24,0) - Q -"RTN","uttcovr",25,0) - ; -"RTN","uttcovr",26,0) ENTRY ; -"RTN","uttcovr",27,0) - D ^%utt1 ; verbose -"RTN","uttcovr",28,0) - D EN^%ut("%utt1") ; non-verbose -"RTN","uttcovr",29,0) +"RTN","uttcovr",18,0) + ; The following are now specified in the initial call to COVERAGE^% +"RTN","uttcovr",19,0) + ;D ^%utt1 ; verbose +"RTN","uttcovr",20,0) + ;D EN^%ut("%utt1") ; non-verbose +"RTN","uttcovr",21,0) ; run tests from top of %utt6, runs both command line and gui analyses -"RTN","uttcovr",30,0) - D ^%utt6 ; non-verbose -"RTN","uttcovr",31,0) - D VERBOSE^%utt6 ; verbose -"RTN","uttcovr",32,0) - Q -"RTN","uttcovr",33,0) +"RTN","uttcovr",22,0) + ;D ^%utt6 ; non-verbose +"RTN","uttcovr",23,0) + ;D VERBOSE^%utt6 ; verbose +"RTN","uttcovr",24,0) + ; run tests from top of routines +"RTN","uttcovr",25,0) + ;D ^%ut +"RTN","uttcovr",26,0) + ;D ^%ut1 +"RTN","uttcovr",27,0) ; +"RTN","uttcovr",28,0) + ; these tests run outside of unit tests to handle CHKLEAKS calls not in unit tests +"RTN","uttcovr",29,0) + ; they need data set, so they are called in here +"RTN","uttcovr",30,0) + ; LEAKSOK ; +"RTN","uttcovr",31,0) + N CODE,LOCATN,MYVALS,X +"RTN","uttcovr",32,0) + S CODE="S X=$$NOW^XLFDT()",LOCATN="LEAKSOK TEST",MYVALS("X")="" +"RTN","uttcovr",33,0) + D CHKLEAKS^%ut(CODE,LOCATN,.MYVALS) ; should find no leaks "RTN","uttcovr",34,0) -LIST(ROU) ; + ; LEAKSBAD ; "RTN","uttcovr",35,0) - ; ZEXCEPT: SHOWALL - NEWed and set in SHOWALL or entering at %uttcovr + N CODE,LOCATN,MYVALS,X "RTN","uttcovr",36,0) - N JOB,NAME,BASE,GLOB + S CODE="S X=$$NOW^XLFDT()",LOCATN="LEAKSBAD TEST - X NOT SPECIFIED" "RTN","uttcovr",37,0) - S JOB=$J + D CHKLEAKS^%ut(CODE,LOCATN,.MYVALS) ; should find X since it isn't indicated "RTN","uttcovr",38,0) - W !!!,ROU_" COVERAGE ANALYSIS" + ; try to run coverage "RTN","uttcovr",39,0) - F NAME="%utCOVREPORT","%utCOVRESULT","%utCOVCOHORT","%utCOVCOHORTSAV" D + D COV^%ut("%ut1","D EN^%ut(""%utt5"")",3) "RTN","uttcovr",40,0) - . I 'SHOWALL,NAME'="%utCOVREPORT" Q + D COV^%ut("%ut1","D EN^%ut(""%utt5"")",-1) "RTN","uttcovr",41,0) - . W !!!,NAME," GLOBAL DATA",! + N RUNCODE S RUNCODE(1)="^%utt4,^%ut" ; M RUNCODE=^TMP("%uttcovr",$J,"RUNCODE") "RTN","uttcovr",42,0) - . S BASE="^TMP("""_NAME_""","_JOB,GLOB=BASE_")" + N XCLUDE M XCLUDE=^TMP("%uttcovr",$J,"XCLUDE") "RTN","uttcovr",43,0) - . I $D(GLOB)#2 W !,GLOB,"=",$G(@GLOB) + D TESTONLY^%utcover(.RUNCODE) "RTN","uttcovr",44,0) - . F S GLOB=$Q(@GLOB) Q:GLOB'[BASE I $D(GLOB)#2 W !,GLOB,"=",@GLOB + D COVERAGE^%utcover("%ut*",.RUNCODE,.XCLUDE,3) "RTN","uttcovr",45,0) - . Q + N GLT S GLT=$NA(^TMP("%uttcovr-text",$J)) K @GLT "RTN","uttcovr",46,0) + D LIST^%utcover(.XCLUDE,3,GLT) ; get coverage for listing and trimdata in %utcover +"RTN","uttcovr",47,0) + F I=1:1 Q:'$D(@GLT@(I)) W !,@GLT@(I) +"RTN","uttcovr",48,0) + K @GLT +"RTN","uttcovr",49,0) Q +"RTN","uttcovr",50,0) + ; +"RTN","uttcovr",51,0) +RTNANAL ; @TEST - routine analysis +"RTN","uttcovr",52,0) + N ROUS,GLB +"RTN","uttcovr",53,0) + S ROUS("%utt4")="" +"RTN","uttcovr",54,0) + S GLB=$NA(^TMP("%uttcovr-rtnanal",$J)) K @GLB +"RTN","uttcovr",55,0) + D RTNANAL^%ut1(.ROUS,GLB) +"RTN","uttcovr",56,0) + D CHKTF^%ut($D(@GLB@("%utt4","MAIN"))>1,"Not enough 'MAIN' nodes found") +"RTN","uttcovr",57,0) + D CHKTF^%ut($G(@GLB@("%utt4","MAIN",2))["+$SY=47","Check for GT.M not found in expected line") +"RTN","uttcovr",58,0) + D CHKTF^%ut($G(@GLB@("%utt4","MAIN",12))=" QUIT","Final QUIT not on expected line") +"RTN","uttcovr",59,0) + K @GLB +"RTN","uttcovr",60,0) + Q +"RTN","uttcovr",61,0) + ; +"RTN","uttcovr",62,0) +COVRPTGL ; @TEST - coverage report returning global +"RTN","uttcovr",63,0) + N GL1,GL2,GL3,GL4 +"RTN","uttcovr",64,0) + S GL1=$NA(^TMP("%utCOVCOHORTSAVx",$J)) K @GL1 +"RTN","uttcovr",65,0) + S GL2=$NA(^TMP("%utCOVCOHORTx",$J)) K @GL2 +"RTN","uttcovr",66,0) + S GL3=$NA(^TMP("%utCOVRESULTx",$J)) K @GL3 +"RTN","uttcovr",67,0) + S GL4=$NA(^TMP("%utCOVREPORTx",$J)) K @GL4 +"RTN","uttcovr",68,0) + D SETGLOBS(GL1,GL2) +"RTN","uttcovr",69,0) + D COVRPTGL^%ut1(GL1,GL2,GL3,GL4) +"RTN","uttcovr",70,0) + D CHKEQ^%ut($G(@GL4@("%ut1","ACTLINES")),"0/9","Wrong number of lines covered f>>or ACTLINES") +"RTN","uttcovr",71,0) + D CHKEQ^%ut($G(@GL4@("%ut1","ACTLINES",9))," QUIT CNT","Wrong result for last l>>ine not covered for ACTLINES") +"RTN","uttcovr",72,0) + D CHKEQ^%ut($G(@GL4@("%ut1","CHEKTEST")),"8/10","Wrong number of lines covered >>for CHEKTEST") +"RTN","uttcovr",73,0) + D CHKEQ^%ut($G(@GL4@("%ut1","CHEKTEST",39))," . Q","Wrong result for last line >>not covered for CHEKTEST") +"RTN","uttcovr",74,0) + K @GL1,@GL2,@GL3,@GL4 +"RTN","uttcovr",75,0) + Q +"RTN","uttcovr",76,0) + ; +"RTN","uttcovr",77,0) +COVRPTLS ; @TEST - coverage report returning text in global +"RTN","uttcovr",78,0) + N GL1,GL2,GL3,GL4,VRBOSITY +"RTN","uttcovr",79,0) + S GL1=$NA(^TMP("%utCOVCOHORTSAVx",$J)) K @GL1 +"RTN","uttcovr",80,0) + S GL2=$NA(^TMP("%utCOVCOHORTx",$J)) K @GL2 +"RTN","uttcovr",81,0) + S GL3=$NA(^TMP("%utCOVRESULTx",$J)) K @GL3 +"RTN","uttcovr",82,0) + S GL4=$NA(^TMP("%utCOVREPORTx",$J)) K @GL4 +"RTN","uttcovr",83,0) + D SETGLOBS(GL1,GL2) +"RTN","uttcovr",84,0) + S VRBOSITY=1 +"RTN","uttcovr",85,0) + D COVRPTLS^%ut1(GL1,GL2,GL3,VRBOSITY,GL4) +"RTN","uttcovr",86,0) + D CHKEQ^%ut("COVERAGE PERCENTAGE: 42.11",$G(@GL4@(5)),"Verbosity 1 - not expected percentage value") +"RTN","uttcovr",87,0) + D CHKEQ^%ut("42.11",$G(@GL4@(9)),"Verbosity 1 - not expected value for line 9") +"RTN","uttcovr",88,0) + D CHKTF^%ut('$D(@GL4@(10)),"Verbosity 1 - unexpected data in 10th line") +"RTN","uttcovr",89,0) + K @GL4 +"RTN","uttcovr",90,0) + ; +"RTN","uttcovr",91,0) + S VRBOSITY=2 +"RTN","uttcovr",92,0) + D COVRPTLS^%ut1(GL1,GL2,GL3,VRBOSITY,GL4) +"RTN","uttcovr",93,0) + D CHKEQ^%ut(" ACTLINES 0.00",$G(@GL4@(10)),"Verbosity 2 - not expected value for 10th line") +"RTN","uttcovr",94,0) + D CHKEQ^%ut(" CHEKTEST 80.00",$G(@GL4@(11)),"Verbosity 2 - not expected value for 11th line") +"RTN","uttcovr",95,0) + D CHKTF^%ut('$D(@GL4@(12)),"Verbosity 2 - unexpected data for 12th line") +"RTN","uttcovr",96,0) + K @GL4 +"RTN","uttcovr",97,0) + ; +"RTN","uttcovr",98,0) + S VRBOSITY=3 +"RTN","uttcovr",99,0) + D COVRPTLS^%ut1(GL1,GL2,GL3,VRBOSITY,GL4) +"RTN","uttcovr",100,0) + D CHKEQ^%ut(" ACTLINES 0.00",$G(@GL4@(10)),"Verbosity 3 - unexpected value for line 10") +"RTN","uttcovr",101,0) + D CHKEQ^%ut("ACTLINES+9: QUIT CNT",$G(@GL4@(19)),"Verbosity 3 - unexpected value for line 19") +"RTN","uttcovr",102,0) + D CHKEQ^%ut(" CHEKTEST 80.00",$G(@GL4@(20)),"Verbosity 3 - unexpected value for line 20") +"RTN","uttcovr",103,0) + D CHKEQ^%ut("CHEKTEST+39: . Q",$G(@GL4@(22)),"Verbosity 3 - unexpected value for line 22") +"RTN","uttcovr",104,0) + D CHKTF^%ut('$D(@GL4@(23)),"Verbosity 3 - unexpected line 23") +"RTN","uttcovr",105,0) + ; +"RTN","uttcovr",106,0) + K @GL1,@GL2,@GL3,@GL4 +"RTN","uttcovr",107,0) + Q +"RTN","uttcovr",108,0) + ; +"RTN","uttcovr",109,0) +TRIMDATA ; @TEST - TRIMDATA in %utcover +"RTN","uttcovr",110,0) + N GL1,XCLUD +"RTN","uttcovr",111,0) + S GL1=$NA(^TMP("%uttcovr-trimdata",$J)) K @GL1 +"RTN","uttcovr",112,0) + S @GL1@("GOOD",1)="1" +"RTN","uttcovr",113,0) + S @GL1@("BAD",1)="1" +"RTN","uttcovr",114,0) + S XCLUD("BAD")="" +"RTN","uttcovr",115,0) + D TRIMDATA^%utcover(.XCLUD,GL1) +"RTN","uttcovr",116,0) + D CHKTF^%ut($D(@GL1@("GOOD")),"GOOD ENTRY WAS REMOVED") +"RTN","uttcovr",117,0) + D CHKTF^%ut('$D(@GL1@("BAD")),"ENTRY WAS NOT TRIMMED") +"RTN","uttcovr",118,0) + K @GL1,XCLUD +"RTN","uttcovr",119,0) + Q +"RTN","uttcovr",120,0) + ; +"RTN","uttcovr",121,0) +LIST ; @TEST - LIST in %utcover +"RTN","uttcovr",122,0) + N GL1,GLT S GL1=$NA(^TMP("%uttcovr-list",$J)),GLT=$NA(^TMP("%uttcovr-text",$J)) +"RTN","uttcovr",123,0) + S @GL1@("%ut1")="89/160" +"RTN","uttcovr",124,0) + S @GL1@("%ut1","%ut1")="2/2" +"RTN","uttcovr",125,0) + S @GL1@("%ut1","ACTLINES")="0/9" +"RTN","uttcovr",126,0) + S @GL1@("%ut1","ACTLINES",0)="ACTLINES(GL) ; [Private] $$ ; Count active lines" +"RTN","uttcovr",127,0) + S @GL1@("%ut1","ACTLINES",2)=" N CNT S CNT=0" +"RTN","uttcovr",128,0) + S @GL1@("%ut1","ACTLINES",3)=" N REF S REF=GL" +"RTN","uttcovr",129,0) + S @GL1@("%ut1","ACTLINES",4)=" N GLQL S GLQL=$QL(GL)" +"RTN","uttcovr",130,0) + S @GL1@("%ut1","ACTLINES",5)=" F S REF=$Q(@REF) Q:REF="""" Q:(GL'=$NA(@REF,GLQL)) D" +"RTN","uttcovr",131,0) + S @GL1@("%ut1","ACTLINES",6)=" . N REFQL S REFQL=$QL(REF)" +"RTN","uttcovr",132,0) + S @GL1@("%ut1","ACTLINES",7)=" . N LASTSUB S LASTSUB=$QS(REF,REFQL)" +"RTN","uttcovr",133,0) + S @GL1@("%ut1","ACTLINES",8)=" . I LASTSUB?1.N S CNT=CNT+1" +"RTN","uttcovr",134,0) + S @GL1@("%ut1","ACTLINES",9)=" QUIT CNT" +"RTN","uttcovr",135,0) + S @GL1@("%ut1","CHECKTAG")="11/11" +"RTN","uttcovr",136,0) + S @GL1@("%ut1","CHEKTEST")="10/10" +"RTN","uttcovr",137,0) + N XCLUD S XCLUD("%utt1")="" +"RTN","uttcovr",138,0) + D LIST^%utcover(.XCLUD,1,GLT,GL1) +"RTN","uttcovr",139,0) + D CHKEQ^%ut("Routine %ut1 89 out of 160 lines covered (55%)",$G(@GLT@(3)),"Verbosity 1 - Unexpected text for line 3") +"RTN","uttcovr",140,0) + D CHKEQ^%ut("Overall Analysis 89 out of 160 lines covered (55% coverage)",$G(@GLT@(6)),"Verbosity 1 - unexpected text for line 6") +"RTN","uttcovr",141,0) + D CHKTF^%ut('$D(@GLT@(7)),"Verbosity 1 - Unexpected line 7 present") +"RTN","uttcovr",142,0) + K @GLT +"RTN","uttcovr",143,0) + ; +"RTN","uttcovr",144,0) + D LIST^%utcover(.XCLUD,2,GLT,GL1) +"RTN","uttcovr",145,0) + D CHKEQ^%ut(" - Summary",$G(@GLT@(4)),"Verbosity 2 - unexpected text at line 4") +"RTN","uttcovr",146,0) + D CHKEQ^%ut(" Tag ACTLINES^%ut1 0 out of 9 lines covered",$G(@GLT@(6)),"Verbosity 2 - unexpected text at line 6") +"RTN","uttcovr",147,0) + D CHKEQ^%ut(" Tag CHEKTEST^%ut1 10 out of 10 lines covered",$G(@GLT@(8)),"Verbosity 2 - unexpected text at line 8") +"RTN","uttcovr",148,0) + D CHKTF^%ut($D(@GLT@(14)),"Verbosity 2 - expected line at line 14") +"RTN","uttcovr",149,0) + D CHKTF^%ut('$D(@GLT@(15)),"Verbosity 2 - unexpected line at line 15") +"RTN","uttcovr",150,0) + K @GLT +"RTN","uttcovr",151,0) + ; +"RTN","uttcovr",152,0) + D LIST^%utcover(.XCLUD,3,GLT,GL1) +"RTN","uttcovr",153,0) + D CHKEQ^%ut(" Tag %ut1^%ut1 2 out of 2 lines covered",$G(@GLT@(5)),"Verbosity 3 - Incorrect text at line 5") +"RTN","uttcovr",154,0) + D CHKEQ^%ut(" ACTLINES+9 QUIT CNT",$G(@GLT@(15)),"Verbosity 3 - incorrect line 15") +"RTN","uttcovr",155,0) + D CHKTF^%ut($D(@GLT@(23)),"Verbosity 3 - expected data in line 23") +"RTN","uttcovr",156,0) + D CHKTF^%ut('$D(@GLT@(24)),"Verbosity 3 - did not expect a line 24") +"RTN","uttcovr",157,0) + ; +"RTN","uttcovr",158,0) + K @GL1,@GLT +"RTN","uttcovr",159,0) + Q +"RTN","uttcovr",160,0) + ; +"RTN","uttcovr",161,0) +SETGLOBS(GL1,GL2) ; +"RTN","uttcovr",162,0) + S @GL1@("%ut1","ACTLINES")="ACTLINES" +"RTN","uttcovr",163,0) + S @GL1@("%ut1","ACTLINES",0)="ACTLINES(GL) ; [Private] $$ ; Count active lines" +"RTN","uttcovr",164,0) + S @GL1@("%ut1","ACTLINES",2)=" N CNT S CNT=0" +"RTN","uttcovr",165,0) + S @GL1@("%ut1","ACTLINES",3)=" N REF S REF=GL" +"RTN","uttcovr",166,0) + S @GL1@("%ut1","ACTLINES",4)=" N GLQL S GLQL=$QL(GL)" +"RTN","uttcovr",167,0) + S @GL1@("%ut1","ACTLINES",5)=" F S REF=$Q(@REF) Q:REF="""" Q:(GL'=$NA(@REF,GLQL)) D" +"RTN","uttcovr",168,0) + S @GL1@("%ut1","ACTLINES",6)=" . N REFQL S REFQL=$QL(REF)" +"RTN","uttcovr",169,0) + S @GL1@("%ut1","ACTLINES",7)=" . N LASTSUB S LASTSUB=$QS(REF,REFQL)" +"RTN","uttcovr",170,0) + S @GL1@("%ut1","ACTLINES",8)=" . I LASTSUB?1.N S CNT=CNT+1" +"RTN","uttcovr",171,0) + S @GL1@("%ut1","ACTLINES",9)=" QUIT CNT" +"RTN","uttcovr",172,0) + S @GL1@("%ut1","CHEKTEST")="CHEKTEST" +"RTN","uttcovr",173,0) + S @GL1@("%ut1","CHEKTEST",0)="CHEKTEST(%utROU,%ut,%utUETRY) ; Collect Test list." +"RTN","uttcovr",174,0) + S @GL1@("%ut1","CHEKTEST",13)=" N I,LIST" +"RTN","uttcovr",175,0) + S @GL1@("%ut1","CHEKTEST",14)=" S I=$L($T(@(U_%utROU))) I I<0 Q ""-1^Invalid Routine Name""" +"RTN","uttcovr",176,0) + S @GL1@("%ut1","CHEKTEST",31)=" D NEWSTYLE(.LIST,%utROU)" +"RTN","uttcovr",177,0) + S @GL1@("%ut1","CHEKTEST",32)=" F I=1:1:LIST S %ut(""ENTN"")=%ut(""ENTN"")+1,%utUETRY(%ut(""ENTN""))=$P(LIST(I),U),%utUETRY(%ut(""ENTN""),""NAME"")=$P(LIST(I),U,2,99)" +"RTN","uttcovr",178,0) + S @GL1@("%ut1","CHEKTEST",37)=" N %utUI F %utUI=1:1 S %ut(""ELIN"")=$T(@(""XTENT+""_%utUI_""^""_%utROU)) Q:$P(%ut(""ELIN""),"";"",3)="""" D" +"RTN","uttcovr",179,0) + S @GL1@("%ut1","CHEKTEST",38)=" . S %ut(""ENTN"")=%ut(""ENTN"")+1,%utUETRY(%ut(""ENTN""))=$P(%ut(""ELIN""),"";"",3),%utUETRY(%ut(""ENTN""),""NAME"")=$P(%ut(""ELIN""),"";"",4)" +"RTN","uttcovr",180,0) + S @GL1@("%ut1","CHEKTEST",39)=" . Q" +"RTN","uttcovr",181,0) + S @GL1@("%ut1","CHEKTEST",41)=" QUIT" +"RTN","uttcovr",182,0) + S @GL1@("%ut1","CHEKTEST",9)=" S %ut(""ENTN"")=0 ; Number of test, sub to %utUETRY." +"RTN","uttcovr",183,0) + S @GL2@("%ut1","ACTLINES")="ACTLINES" +"RTN","uttcovr",184,0) + S @GL2@("%ut1","ACTLINES",0)="ACTLINES(GL) ; [Private] $$ ; Count active lines" +"RTN","uttcovr",185,0) + S @GL2@("%ut1","ACTLINES",2)=" N CNT S CNT=0" +"RTN","uttcovr",186,0) + S @GL2@("%ut1","ACTLINES",3)=" N REF S REF=GL" +"RTN","uttcovr",187,0) + S @GL2@("%ut1","ACTLINES",4)=" N GLQL S GLQL=$QL(GL)" +"RTN","uttcovr",188,0) + S @GL2@("%ut1","ACTLINES",5)=" F S REF=$Q(@REF) Q:REF="""" Q:(GL'=$NA(@REF,GLQL)) D" +"RTN","uttcovr",189,0) + S @GL2@("%ut1","ACTLINES",6)=" . N REFQL S REFQL=$QL(REF)" +"RTN","uttcovr",190,0) + S @GL2@("%ut1","ACTLINES",7)=" . N LASTSUB S LASTSUB=$QS(REF,REFQL)" +"RTN","uttcovr",191,0) + S @GL2@("%ut1","ACTLINES",8)=" . I LASTSUB?1.N S CNT=CNT+1" +"RTN","uttcovr",192,0) + S @GL2@("%ut1","ACTLINES",9)=" QUIT CNT" +"RTN","uttcovr",193,0) + S @GL2@("%ut1","CHEKTEST")="CHEKTEST" +"RTN","uttcovr",194,0) + S @GL2@("%ut1","CHEKTEST",38)=" . S %ut(""ENTN"")=%ut(""ENTN"")+1,%utUETRY(%ut(""ENTN""))=$P(%ut(""ELIN""),"";"",3),%utUETRY(%ut(""ENTN""),""NAME"")=$P(%ut(""ELIN""),"";"",4)" +"RTN","uttcovr",195,0) + S @GL2@("%ut1","CHEKTEST",39)=" . Q" +"RTN","uttcovr",196,0) + Q +"RTN","uttcovr",197,0) + ; "SEC","^DIC",17.9001,17.9001,0,"AUDIT") @ "SEC","^DIC",17.9001,17.9001,0,"DD") diff --git a/Packman Message MASH_0.1_0 140910.txt b/Packman Message MASH_0.2_0_150703.txt similarity index 64% rename from Packman Message MASH_0.1_0 140910.txt rename to Packman Message MASH_0.2_0_150703.txt index e495b70..675b5cf 100644 --- a/Packman Message MASH_0.1_0 140910.txt +++ b/Packman Message MASH_0.2_0_150703.txt @@ -1,145 +1,259 @@ -$TXT Created by IVEY,JOEL L at JIVEY3.JIVEYSOFT.COM (KIDS) on Wednesday, 09/10/14 at 14:37 +$TXT Created by IVEY,JOEL L at JIVEY3.JIVEYSOFT.COM (KIDS) on Friday, 07/03/15 at 13:44 -Implements the M-Unit Test functionality. +Changes to functionality include: + +STARTUP and SHUTDOWN will be run in each routine instead of the first +instance of STARTUP and SHUTDOWN encountered being the only ones that +were run. This change was made because of possible suites of tests +which have their own STARTUP and SHUTDOWN that need to be run. Also, +it does not depend on the order in which test routines are run. + +While the coverage functionality can only be run on GT.M systems at +the present time, the routine %utcover has been added to provide +additional ability to run a number of unit tests at one time so that +coverage across all of them can be obtained in one run, this includes +the ability to specify entry at different APIs (e.g., if both verbose +and nonverbose entries are available) as well as run code which is not +part of a unit test to include in the analysis. The routine %uttcovr +uses this functionality to provide a means of doing coverage analysis +on the %ut routines and can be used as an example of its usage. + +A new tag (COV) has been added to the %ut routine (it simply calls +the one in %ut1) so that all user APIs can be accessed within the %ut +routine. + +A potential problem with setting up the %ut namespace in the local +instance was addressed by Sam Habiel in the preinstall routine ZZUTPRE. $END TXT -$KID MASH*0.1*0 +$KID MASH*0.2*0 **INSTALL NAME** -MASH*0.1*0 -"BLD",5528,0) -MASH*0.1*0^MASH UTILITIES^0^3140910^y -"BLD",5528,1,0) -^^2^2^3140829^ -"BLD",5528,1,1,0) -M-Unit Test functionality to provide basic unit testing framework for M -"BLD",5528,1,2,0) -development. -"BLD",5528,4,0) +MASH*0.2*0 +"BLD",9544,0) +MASH*0.2*0^MASH UTILITIES^0^3150703^n +"BLD",9544,1,0) +^^24^24^3150703^^ +"BLD",9544,1,1,0) +Changes to functionality include: +"BLD",9544,1,2,0) + +"BLD",9544,1,3,0) +STARTUP and SHUTDOWN will be run in each routine instead of the first +"BLD",9544,1,4,0) +instance of STARTUP and SHUTDOWN encountered being the only ones that +"BLD",9544,1,5,0) +were run. This change was made because of possible suites of tests +"BLD",9544,1,6,0) +which have their own STARTUP and SHUTDOWN that need to be run. Also, +"BLD",9544,1,7,0) +it does not depend on the order in which test routines are run. +"BLD",9544,1,8,0) + +"BLD",9544,1,9,0) +While the coverage functionality can only be run on GT.M systems at +"BLD",9544,1,10,0) +the present time, the routine %utcover has been added to provide +"BLD",9544,1,11,0) +additional ability to run a number of unit tests at one time so that +"BLD",9544,1,12,0) +coverage across all of them can be obtained in one run, this includes +"BLD",9544,1,13,0) +the ability to specify entry at different APIs (e.g., if both verbose +"BLD",9544,1,14,0) +and nonverbose entries are available) as well as run code which is not +"BLD",9544,1,15,0) +part of a unit test to include in the analysis. The routine %uttcovr +"BLD",9544,1,16,0) +uses this functionality to provide a means of doing coverage analysis +"BLD",9544,1,17,0) +on the %ut routines and can be used as an example of its usage. +"BLD",9544,1,18,0) + +"BLD",9544,1,19,0) +A new tag (COV) has been added to the %ut routine (it simply calls +"BLD",9544,1,20,0) +the one in %ut1) so that all user APIs can be accessed within the %ut +"BLD",9544,1,21,0) +routine. +"BLD",9544,1,22,0) + +"BLD",9544,1,23,0) +A potential problem with setting up the %ut namespace in the local +"BLD",9544,1,24,0) +instance was addressed by Sam Habiel in the preinstall routine ZZUTPRE. +"BLD",9544,4,0) ^9.64PA^17.9001^1 -"BLD",5528,4,17.9001,0) +"BLD",9544,4,17.9001,0) 17.9001 -"BLD",5528,4,17.9001,222) +"BLD",9544,4,17.9001,222) y^y^f^^n^^y^o^n -"BLD",5528,4,"B",17.9001,17.9001) -"BLD",5528,"ABPKG") +"BLD",9544,4,"B",17.9001,17.9001) + +"BLD",9544,6.3) +5 +"BLD",9544,"ABPKG") n -"BLD",5528,"INI") +"BLD",9544,"INI") ZZUTPRE -"BLD",5528,"INID") +"BLD",9544,"INID") ^n^n -"BLD",5528,"INIT") +"BLD",9544,"INIT") ZZUTPOST -"BLD",5528,"KRN",0) -^9.67PA^8989.52^19 -"BLD",5528,"KRN",.4,0) +"BLD",9544,"KRN",0) +^9.67PA^779.2^20 +"BLD",9544,"KRN",.4,0) .4 -"BLD",5528,"KRN",.401,0) +"BLD",9544,"KRN",.401,0) .401 -"BLD",5528,"KRN",.402,0) +"BLD",9544,"KRN",.402,0) .402 -"BLD",5528,"KRN",.403,0) +"BLD",9544,"KRN",.403,0) .403 -"BLD",5528,"KRN",.5,0) +"BLD",9544,"KRN",.5,0) .5 -"BLD",5528,"KRN",.84,0) +"BLD",9544,"KRN",.84,0) .84 -"BLD",5528,"KRN",3.6,0) +"BLD",9544,"KRN",3.6,0) 3.6 -"BLD",5528,"KRN",3.8,0) +"BLD",9544,"KRN",3.8,0) 3.8 -"BLD",5528,"KRN",9.2,0) +"BLD",9544,"KRN",9.2,0) 9.2 -"BLD",5528,"KRN",9.8,0) +"BLD",9544,"KRN",9.8,0) 9.8 -"BLD",5528,"KRN",9.8,"NM",0) -^9.68A^9^9 -"BLD",5528,"KRN",9.8,"NM",1,0) -ut^^0^B257937062 -"BLD",5528,"KRN",9.8,"NM",2,0) -ut1^^0^B87092328 -"BLD",5528,"KRN",9.8,"NM",3,0) -utt1^^0^B25860592 -"BLD",5528,"KRN",9.8,"NM",4,0) +"BLD",9544,"KRN",9.8,"NM",0) +^9.68A^10^10 +"BLD",9544,"KRN",9.8,"NM",1,0) +ut^^0^B268535658 +"BLD",9544,"KRN",9.8,"NM",2,0) +ut1^^0^B105832889 +"BLD",9544,"KRN",9.8,"NM",3,0) +utt1^^0^B26409996 +"BLD",9544,"KRN",9.8,"NM",4,0) utt2^^0^B473823 -"BLD",5528,"KRN",9.8,"NM",5,0) +"BLD",9544,"KRN",9.8,"NM",5,0) utt3^^0^B1493136 -"BLD",5528,"KRN",9.8,"NM",6,0) +"BLD",9544,"KRN",9.8,"NM",6,0) utt4^^0^B1419637 -"BLD",5528,"KRN",9.8,"NM",7,0) +"BLD",9544,"KRN",9.8,"NM",7,0) utt5^^0^B22421637 -"BLD",5528,"KRN",9.8,"NM",8,0) -utt6^^0^B29243478 -"BLD",5528,"KRN",9.8,"NM",9,0) -uttcovr^^0^B2835727 -"BLD",5528,"KRN",9.8,"NM","B","ut",1) -"BLD",5528,"KRN",9.8,"NM","B","ut1",2) -"BLD",5528,"KRN",9.8,"NM","B","utt1",3) -"BLD",5528,"KRN",9.8,"NM","B","utt2",4) -"BLD",5528,"KRN",9.8,"NM","B","utt3",5) -"BLD",5528,"KRN",9.8,"NM","B","utt4",6) -"BLD",5528,"KRN",9.8,"NM","B","utt5",7) -"BLD",5528,"KRN",9.8,"NM","B","utt6",8) -"BLD",5528,"KRN",9.8,"NM","B","uttcovr",9) -"BLD",5528,"KRN",19,0) +"BLD",9544,"KRN",9.8,"NM",8,0) +utt6^^0^B30140551 +"BLD",9544,"KRN",9.8,"NM",9,0) +uttcovr^^0^B88235384 +"BLD",9544,"KRN",9.8,"NM",10,0) +utcover^^0^B63651128 +"BLD",9544,"KRN",9.8,"NM","B","ut",1) + +"BLD",9544,"KRN",9.8,"NM","B","ut1",2) + +"BLD",9544,"KRN",9.8,"NM","B","utcover",10) + +"BLD",9544,"KRN",9.8,"NM","B","utt1",3) + +"BLD",9544,"KRN",9.8,"NM","B","utt2",4) + +"BLD",9544,"KRN",9.8,"NM","B","utt3",5) + +"BLD",9544,"KRN",9.8,"NM","B","utt4",6) + +"BLD",9544,"KRN",9.8,"NM","B","utt5",7) + +"BLD",9544,"KRN",9.8,"NM","B","utt6",8) + +"BLD",9544,"KRN",9.8,"NM","B","uttcovr",9) + +"BLD",9544,"KRN",19,0) 19 -"BLD",5528,"KRN",19,"NM",0) +"BLD",9544,"KRN",19,"NM",0) ^9.68A^3^3 -"BLD",5528,"KRN",19,"NM",1,0) +"BLD",9544,"KRN",19,"NM",1,0) utMUNIT^^0 -"BLD",5528,"KRN",19,"NM",2,0) +"BLD",9544,"KRN",19,"NM",2,0) utMUNIT GROUP EDIT^^0 -"BLD",5528,"KRN",19,"NM",3,0) +"BLD",9544,"KRN",19,"NM",3,0) utMUNIT GROUP RUN^^0 -"BLD",5528,"KRN",19,"NM","B","utMUNIT",1) -"BLD",5528,"KRN",19,"NM","B","utMUNIT GROUP EDIT",2) -"BLD",5528,"KRN",19,"NM","B","utMUNIT GROUP RUN",3) -"BLD",5528,"KRN",19.1,0) +"BLD",9544,"KRN",19,"NM","B","utMUNIT",1) + +"BLD",9544,"KRN",19,"NM","B","utMUNIT GROUP EDIT",2) + +"BLD",9544,"KRN",19,"NM","B","utMUNIT GROUP RUN",3) + +"BLD",9544,"KRN",19.1,0) 19.1 -"BLD",5528,"KRN",101,0) +"BLD",9544,"KRN",101,0) 101 -"BLD",5528,"KRN",409.61,0) +"BLD",9544,"KRN",409.61,0) 409.61 -"BLD",5528,"KRN",771,0) +"BLD",9544,"KRN",771,0) 771 -"BLD",5528,"KRN",870,0) +"BLD",9544,"KRN",779.2,0) +779.2 +"BLD",9544,"KRN",870,0) 870 -"BLD",5528,"KRN",8989.51,0) +"BLD",9544,"KRN",8989.51,0) 8989.51 -"BLD",5528,"KRN",8989.52,0) +"BLD",9544,"KRN",8989.52,0) 8989.52 -"BLD",5528,"KRN",8994,0) +"BLD",9544,"KRN",8994,0) 8994 -"BLD",5528,"KRN",8994,"NM",0) +"BLD",9544,"KRN",8994,"NM",0) ^9.68A^3^3 -"BLD",5528,"KRN",8994,"NM",1,0) +"BLD",9544,"KRN",8994,"NM",1,0) utMUNIT-TEST GROUP LOAD^^0 -"BLD",5528,"KRN",8994,"NM",2,0) +"BLD",9544,"KRN",8994,"NM",2,0) utMUNIT-TEST LOAD^^0 -"BLD",5528,"KRN",8994,"NM",3,0) +"BLD",9544,"KRN",8994,"NM",3,0) utMUNIT-TEST NEXT^^0 -"BLD",5528,"KRN",8994,"NM","B","utMUNIT-TEST GROUP LOAD",1) -"BLD",5528,"KRN",8994,"NM","B","utMUNIT-TEST LOAD",2) -"BLD",5528,"KRN",8994,"NM","B","utMUNIT-TEST NEXT",3) -"BLD",5528,"KRN","B",.4,.4) -"BLD",5528,"KRN","B",.401,.401) -"BLD",5528,"KRN","B",.402,.402) -"BLD",5528,"KRN","B",.403,.403) -"BLD",5528,"KRN","B",.5,.5) -"BLD",5528,"KRN","B",.84,.84) -"BLD",5528,"KRN","B",3.6,3.6) -"BLD",5528,"KRN","B",3.8,3.8) -"BLD",5528,"KRN","B",9.2,9.2) -"BLD",5528,"KRN","B",9.8,9.8) -"BLD",5528,"KRN","B",19,19) -"BLD",5528,"KRN","B",19.1,19.1) -"BLD",5528,"KRN","B",101,101) -"BLD",5528,"KRN","B",409.61,409.61) -"BLD",5528,"KRN","B",771,771) -"BLD",5528,"KRN","B",870,870) -"BLD",5528,"KRN","B",8989.51,8989.51) -"BLD",5528,"KRN","B",8989.52,8989.52) -"BLD",5528,"KRN","B",8994,8994) -"BLD",5528,"QUES",0) +"BLD",9544,"KRN",8994,"NM","B","utMUNIT-TEST GROUP LOAD",1) + +"BLD",9544,"KRN",8994,"NM","B","utMUNIT-TEST LOAD",2) + +"BLD",9544,"KRN",8994,"NM","B","utMUNIT-TEST NEXT",3) + +"BLD",9544,"KRN","B",.4,.4) + +"BLD",9544,"KRN","B",.401,.401) + +"BLD",9544,"KRN","B",.402,.402) + +"BLD",9544,"KRN","B",.403,.403) + +"BLD",9544,"KRN","B",.5,.5) + +"BLD",9544,"KRN","B",.84,.84) + +"BLD",9544,"KRN","B",3.6,3.6) + +"BLD",9544,"KRN","B",3.8,3.8) + +"BLD",9544,"KRN","B",9.2,9.2) + +"BLD",9544,"KRN","B",9.8,9.8) + +"BLD",9544,"KRN","B",19,19) + +"BLD",9544,"KRN","B",19.1,19.1) + +"BLD",9544,"KRN","B",101,101) + +"BLD",9544,"KRN","B",409.61,409.61) + +"BLD",9544,"KRN","B",771,771) + +"BLD",9544,"KRN","B",779.2,779.2) + +"BLD",9544,"KRN","B",870,870) + +"BLD",9544,"KRN","B",8989.51,8989.51) + +"BLD",9544,"KRN","B",8989.52,8989.52) + +"BLD",9544,"KRN","B",8994,8994) + +"BLD",9544,"QDEF") +^^^^NO^^^^NO^^NO +"BLD",9544,"QUES",0) ^9.62^^ "DATA",17.9001,1,0) TESTS FOR UNIT TEST ROUTINES @@ -164,10 +278,13 @@ M-UNIT TEST GROUP "FIA",17.9001,0,1) y^y^f^^n^^y^o^n "FIA",17.9001,0,10) + "FIA",17.9001,0,11) + "FIA",17.9001,0,"RLRO") + "FIA",17.9001,0,"VR") -0.1^MASH +0.2^MASH "FIA",17.9001,17.9001) 0 "FIA",17.9001,17.90011) @@ -178,77 +295,77 @@ y^y^f^^n^^y^o^n ZZUTPRE "INIT") ZZUTPOST -"KRN",19,10068,-1) +"KRN",19,11538,-1) 0^1 -"KRN",19,10068,0) +"KRN",19,11538,0) utMUNIT^M-Unit Tester^^B^^^^^^^^ -"KRN",19,10068,1,0) +"KRN",19,11538,1,0) ^^1^1^3140805^ -"KRN",19,10068,1,1,0) +"KRN",19,11538,1,1,0) This is the context option for M-Unit Test functionality. -"KRN",19,10068,"RPC",0) +"KRN",19,11538,"RPC",0) ^19.05P^3^3 -"KRN",19,10068,"RPC",1,0) +"KRN",19,11538,"RPC",1,0) utMUNIT-TEST GROUP LOAD -"KRN",19,10068,"RPC",2,0) +"KRN",19,11538,"RPC",2,0) utMUNIT-TEST LOAD -"KRN",19,10068,"RPC",3,0) +"KRN",19,11538,"RPC",3,0) utMUNIT-TEST NEXT -"KRN",19,10068,"U") +"KRN",19,11538,"U") M-UNIT TESTER -"KRN",19,10069,-1) +"KRN",19,11539,-1) 0^2 -"KRN",19,10069,0) +"KRN",19,11539,0) utMUNIT GROUP EDIT^M-Unit Test Group Edit^^E^^^^^^^^TOOLKIT -"KRN",19,10069,1,0) +"KRN",19,11539,1,0) ^19.06^6^6^3031030^^^ -"KRN",19,10069,1,1,0) +"KRN",19,11539,1,1,0) This option can be used to maintain a listing of unit tests related to a -"KRN",19,10069,1,2,0) +"KRN",19,11539,1,2,0) specific topic. The Group identifies the topic, and the unit tests -"KRN",19,10069,1,3,0) +"KRN",19,11539,1,3,0) related to that topic are added in the multiple. Unit Tests can be run -"KRN",19,10069,1,4,0) +"KRN",19,11539,1,4,0) by selecting a group, and all unit tests included in the multiple will be -"KRN",19,10069,1,5,0) +"KRN",19,11539,1,5,0) used for the test. In addition, any other references under the XTROU tag -"KRN",19,10069,1,6,0) +"KRN",19,11539,1,6,0) in any of the included test routines will be included in the run. -"KRN",19,10069,30) +"KRN",19,11539,30) %ut(17.9001, -"KRN",19,10069,31) +"KRN",19,11539,31) AEMQL -"KRN",19,10069,50) +"KRN",19,11539,50) 17.9001 -"KRN",19,10069,51) +"KRN",19,11539,51) .01;1 -"KRN",19,10069,"U") +"KRN",19,11539,"U") M-UNIT TEST GROUP EDIT -"KRN",19,10070,-1) +"KRN",19,11540,-1) 0^3 -"KRN",19,10070,0) +"KRN",19,11540,0) utMUNIT GROUP RUN^Run M-Unit Tests From Test Groups^^R^^^^^^^^TOOLKIT -"KRN",19,10070,1,0) +"KRN",19,11540,1,0) ^^2^2^3031030^ -"KRN",19,10070,1,1,0) +"KRN",19,11540,1,1,0) Provides a means of initiating a unit test run from the menu system based -"KRN",19,10070,1,2,0) +"KRN",19,11540,1,2,0) on entries in the M-UNIT TEST GROUP file (#17.9001). -"KRN",19,10070,25) +"KRN",19,11540,25) PICKSET^%ut -"KRN",19,10070,"U") +"KRN",19,11540,"U") RUN M-UNIT TESTS FROM TEST GRO -"KRN",8994,1866,-1) +"KRN",8994,3261,-1) 0^1 -"KRN",8994,1866,0) +"KRN",8994,3261,0) utMUNIT-TEST GROUP LOAD^GUISET^%ut^4^^^^1 -"KRN",8994,1867,-1) +"KRN",8994,3262,-1) 0^2 -"KRN",8994,1867,0) +"KRN",8994,3262,0) utMUNIT-TEST LOAD^GUILOAD^%ut^4^^^^1 -"KRN",8994,1868,-1) +"KRN",8994,3263,-1) 0^3 -"KRN",8994,1868,0) +"KRN",8994,3263,0) utMUNIT-TEST NEXT^GUINEXT^%ut^4^^^^1 "MBREQ") 0 @@ -260,24 +377,68 @@ REMOTE PROCEDURE 19;18;;;OPT^XPDTA;OPTF1^XPDIA;OPTE1^XPDIA;OPTF2^XPDIA;;OPTDEL^XPDIA "ORD",18,19,0) OPTION -"PKG",201,-1) +"PKG",222,-1) 1^1 -"PKG",201,0) +"PKG",222,0) MASH UTILITIES^%u^Utilities associated with the M Advanced Shell -"PKG",201,20,0) +"PKG",222,20,0) ^9.402P^^ -"PKG",201,22,0) +"PKG",222,22,0) ^9.49I^1^1 -"PKG",201,22,1,0) -0.1 -"PKG",201,22,1,"PAH",1,0) -0^3140910^2802 -"PKG",201,22,1,"PAH",1,1,0) -^^2^2^3140910 -"PKG",201,22,1,"PAH",1,1,1,0) -M-Unit Test functionality to provide basic unit testing framework for M -"PKG",201,22,1,"PAH",1,1,2,0) -development. +"PKG",222,22,1,0) +0.2 +"PKG",222,22,1,"PAH",1,0) +0^3150703 +"PKG",222,22,1,"PAH",1,1,0) +^^24^24^3150703 +"PKG",222,22,1,"PAH",1,1,1,0) +Changes to functionality include: +"PKG",222,22,1,"PAH",1,1,2,0) + +"PKG",222,22,1,"PAH",1,1,3,0) +STARTUP and SHUTDOWN will be run in each routine instead of the first +"PKG",222,22,1,"PAH",1,1,4,0) +instance of STARTUP and SHUTDOWN encountered being the only ones that +"PKG",222,22,1,"PAH",1,1,5,0) +were run. This change was made because of possible suites of tests +"PKG",222,22,1,"PAH",1,1,6,0) +which have their own STARTUP and SHUTDOWN that need to be run. Also, +"PKG",222,22,1,"PAH",1,1,7,0) +it does not depend on the order in which test routines are run. +"PKG",222,22,1,"PAH",1,1,8,0) + +"PKG",222,22,1,"PAH",1,1,9,0) +While the coverage functionality can only be run on GT.M systems at +"PKG",222,22,1,"PAH",1,1,10,0) +the present time, the routine %utcover has been added to provide +"PKG",222,22,1,"PAH",1,1,11,0) +additional ability to run a number of unit tests at one time so that +"PKG",222,22,1,"PAH",1,1,12,0) +coverage across all of them can be obtained in one run, this includes +"PKG",222,22,1,"PAH",1,1,13,0) +the ability to specify entry at different APIs (e.g., if both verbose +"PKG",222,22,1,"PAH",1,1,14,0) +and nonverbose entries are available) as well as run code which is not +"PKG",222,22,1,"PAH",1,1,15,0) +part of a unit test to include in the analysis. The routine %uttcovr +"PKG",222,22,1,"PAH",1,1,16,0) +uses this functionality to provide a means of doing coverage analysis +"PKG",222,22,1,"PAH",1,1,17,0) +on the %ut routines and can be used as an example of its usage. +"PKG",222,22,1,"PAH",1,1,18,0) + +"PKG",222,22,1,"PAH",1,1,19,0) +A new tag (COV) has been added to the %ut routine (it simply calls +"PKG",222,22,1,"PAH",1,1,20,0) +the one in %ut1) so that all user APIs can be accessed within the %ut +"PKG",222,22,1,"PAH",1,1,21,0) +routine. +"PKG",222,22,1,"PAH",1,1,22,0) + +"PKG",222,22,1,"PAH",1,1,23,0) +A potential problem with setting up the %ut namespace in the local +"PKG",222,22,1,"PAH",1,1,24,0) +instance was addressed by Sam Habiel in the preinstall routine ZZUTPRE. "QUES","XPF1",0) Y "QUES","XPF1","??") @@ -305,7 +466,7 @@ YO "QUES","XPI1","A") Want KIDS to INHIBIT LOGONs during the install "QUES","XPI1","B") -YES +NO "QUES","XPI1","M") D XPI1^XPDIQ "QUES","XPM1",0) @@ -315,6 +476,7 @@ PO^VA(200,:EM "QUES","XPM1","A") Enter the Coordinator for Mail Group '|FLAG|' "QUES","XPM1","B") + "QUES","XPM1","M") D XPM1^XPDIQ "QUES","XPO1",0) @@ -324,7 +486,7 @@ Y "QUES","XPO1","A") Want KIDS to Rebuild Menu Trees Upon Completion of Install "QUES","XPO1","B") -YES +NO "QUES","XPO1","M") D XPO1^XPDIQ "QUES","XPZ1",0) @@ -334,7 +496,7 @@ Y "QUES","XPZ1","A") Want to DISABLE Scheduled Options, Menu Options, and Protocols "QUES","XPZ1","B") -YES +NO "QUES","XPZ1","M") D XPZ1^XPDIQ "QUES","XPZ2",0) @@ -348,377 +510,377 @@ NO "QUES","XPZ2","M") D XPZ2^XPDIQ "RTN") -11 +12 "RTN","ZZUTPOST") -0^^B30449799 +0^^B39206871 "RTN","ZZUTPOST",1,0) -ut01POST ;VEN-SMH/JLI - post install for M-Unit Test software ;08/28/14 12:29 +ut01POST ;VEN-SMH/JLI - post install for M-Unit Test software ;08/28/14 12:29 "RTN","ZZUTPOST",2,0) - ;;0.1;MASH UTILITIES + ;;0.1;MASH UTILITIES;;;Build 5 "RTN","ZZUTPOST",3,0) - N X,I + N X,I "RTN","ZZUTPOST",4,0) - I +$SY=47 D R X:$G(DTIME,300) D MES^XPDUTL(" ") + I +$SY=47 D R X:$G(DTIME,300) D MES^XPDUTL(" ") "RTN","ZZUTPOST",5,0) - . S X(1)=" " + . S X(1)=" " "RTN","ZZUTPOST",6,0) - . S X(2)="In the next section, as it tries to copy the ut* routines" + . S X(2)="In the next section, as it tries to copy the ut* routines" "RTN","ZZUTPOST",7,0) - . S X(3)="to %ut* routines watch for text that indicates the following:" + . S X(3)="to %ut* routines watch for text that indicates the following:" "RTN","ZZUTPOST",8,0) - . S X(4)=" " + . S X(4)=" " "RTN","ZZUTPOST",9,0) - . S X(5)="cp: cannot create regular file `/_ut.m': Permission denied" + . S X(5)="cp: cannot create regular file `/_ut.m': Permission denied" "RTN","ZZUTPOST",10,0) - . S X(6)=" " + . S X(6)=" " "RTN","ZZUTPOST",11,0) - . S X(7)="If this is seen, respond Yes at the prompt after the attempt:" + . S X(7)="If this is seen, respond Yes at the prompt after the attempt:" "RTN","ZZUTPOST",12,0) - . S X(8)=" Press ENTER to continue: " + . S X(8)=" Press ENTER to continue: " "RTN","ZZUTPOST",13,0) - . F I=1:1:18 D MES^XPDUTL(" ") ; create a blank screen for text + . F I=1:1:18 D MES^XPDUTL(" ") ; create a blank screen for text "RTN","ZZUTPOST",14,0) - . D MES^XPDUTL(.X) + . D MES^XPDUTL(.X) "RTN","ZZUTPOST",15,0) - . Q + . Q "RTN","ZZUTPOST",16,0) - D RENAME + D RENAME "RTN","ZZUTPOST",17,0) - I +$SY=47 D R X:$G(DTIME,300) I "Yy"[$E($G(X)) D GTMPROB + I +$SY=47 D R X:$G(DTIME,300) I "Yy"[$E($G(X)) D GTMPROB "RTN","ZZUTPOST",18,0) - . K X + . K X "RTN","ZZUTPOST",19,0) - . S X(1)=" " + . S X(1)=" " "RTN","ZZUTPOST",20,0) - . S X(2)=" Your entry on the next line may not echo" + . S X(2)=" Your entry on the next line may not echo" "RTN","ZZUTPOST",21,0) - . S X(3)="If error text was seen enter Y (and RETURN): NO// " + . S X(3)="If error text was seen enter Y (and RETURN): NO// " "RTN","ZZUTPOST",22,0) - . D MES^XPDUTL(.X) + . D MES^XPDUTL(.X) "RTN","ZZUTPOST",23,0) - . Q + . Q "RTN","ZZUTPOST",24,0) - Q + Q "RTN","ZZUTPOST",25,0) - ; + ; "RTN","ZZUTPOST",26,0) -RENAME ; +RENAME ; "RTN","ZZUTPOST",27,0) - N %S,%D ; Source, destination + N %S,%D ; Source, destination "RTN","ZZUTPOST",28,0) - S U="^" + S U="^" "RTN","ZZUTPOST",29,0) - S %S="ut^ut1^utt1^utt2^utt3^utt4^utt5^utt6^uttcovr" + S %S="ut^ut1^utt1^utt2^utt3^utt4^utt5^utt6^uttcovr" "RTN","ZZUTPOST",30,0) - S %D="%ut^%ut1^%utt1^%utt2^%utt3^%utt4^%utt5^%utt6^%uttcovr" + S %D="%ut^%ut1^%utt1^%utt2^%utt3^%utt4^%utt5^%utt6^%uttcovr" "RTN","ZZUTPOST",31,0) - ; + ; "RTN","ZZUTPOST",32,0) -MOVE ; rename % routines +MOVE ; rename % routines "RTN","ZZUTPOST",33,0) - N %,X,Y,M + N %,X,Y,M "RTN","ZZUTPOST",34,0) - F %=1:1:$L(%D,"^") D D MES(M) I +$SY=47 D MES(" ") + F %=1:1:$L(%D,"^") D D MES(M) I +$SY=47 D MES(" ") "RTN","ZZUTPOST",35,0) - . S M="",X=$P(%S,U,%) ; from + . S M="",X=$P(%S,U,%) ; from "RTN","ZZUTPOST",36,0) - . S Y=$P(%D,U,%) ; to + . S Y=$P(%D,U,%) ; to "RTN","ZZUTPOST",37,0) - . Q:X="" + . Q:X="" "RTN","ZZUTPOST",38,0) - . S M="Routine: "_$J(X,8) + . S M="Routine: "_$J(X,8) "RTN","ZZUTPOST",39,0) - . Q:Y="" I $T(^@X)="" S M=M_" Missing" Q + . Q:Y="" I $T(^@X)="" S M=M_" Missing" Q "RTN","ZZUTPOST",40,0) - . S M=M_" Loaded, " + . S M=M_" Loaded, " "RTN","ZZUTPOST",41,0) - . D COPY(X,Y) + . D COPY(X,Y) "RTN","ZZUTPOST",42,0) - . S M=M_"Saved as "_$J(Y,8) + . S M=M_"Saved as "_$J(Y,8) "RTN","ZZUTPOST",43,0) - ; + ; "RTN","ZZUTPOST",44,0) - QUIT ; END + QUIT ; END "RTN","ZZUTPOST",45,0) - ; + ; "RTN","ZZUTPOST",46,0) -COPY(FROM,TO) ; +COPY(FROM,TO) ; "RTN","ZZUTPOST",47,0) - N XVAL + N XVAL "RTN","ZZUTPOST",48,0) - I +$SYSTEM=0 S XVAL="ZL @FROM ZS @TO" X XVAL QUIT + I +$SYSTEM=0 S XVAL="ZL @FROM ZS @TO" X XVAL QUIT "RTN","ZZUTPOST",49,0) - I +$SYSTEM=47 DO QUIT + I +$SYSTEM=47 DO QUIT "RTN","ZZUTPOST",50,0) - . S FROM=$$PATH(FROM) + . S FROM=$$PATH(FROM) "RTN","ZZUTPOST",51,0) - . S TO=$$PATH(TO,"WRITE") + . S TO=$$PATH(TO,"WRITE") "RTN","ZZUTPOST",52,0) - . N CMD S CMD="cp "_FROM_" "_TO + . N CMD S CMD="cp "_FROM_" "_TO "RTN","ZZUTPOST",53,0) - . O "cp":(shell="/bin/sh":command=CMD:WRITEONLY)::"PIPE" + . O "cp":(shell="/bin/sh":command=CMD:WRITEONLY)::"PIPE" "RTN","ZZUTPOST",54,0) - . U "cp" C "cp" + . U "cp" C "cp" "RTN","ZZUTPOST",55,0) - QUIT + QUIT "RTN","ZZUTPOST",56,0) - ; + ; "RTN","ZZUTPOST",57,0) -PATH(ROUTINE,MODE) ; for GT.M return source file with path for a routine +PATH(ROUTINE,MODE) ; for GT.M return source file with path for a routine "RTN","ZZUTPOST",58,0) - ;input: ROUTINE=Name of routine + ;input: ROUTINE=Name of routine "RTN","ZZUTPOST",59,0) - ; MODE="READ" or "WRITE" defaults to READ + ; MODE="READ" or "WRITE" defaults to READ "RTN","ZZUTPOST",60,0) - ;output: Full filename + ;output: Full filename "RTN","ZZUTPOST",61,0) - ; + ; "RTN","ZZUTPOST",62,0) - S MODE=$G(MODE,"READ") ;set MODE to default value + S MODE=$G(MODE,"READ") ;set MODE to default value "RTN","ZZUTPOST",63,0) - N FILE S FILE=$TR(ROUTINE,"%","_")_".m" ;convert rtn name to filename + N FILE S FILE=$TR(ROUTINE,"%","_")_".m" ;convert rtn name to filename "RTN","ZZUTPOST",64,0) - N ZRO S ZRO=$ZRO + N ZRO S ZRO=$ZRO "RTN","ZZUTPOST",65,0) - ; + ; "RTN","ZZUTPOST",66,0) - ; Get source routine + ; Get source routine "RTN","ZZUTPOST",67,0) - N %ZR + N %ZR "RTN","ZZUTPOST",68,0) - I MODE="READ" D SILENT^%RSEL(ROUTINE,"SRC") Q %ZR(ROUTINE)_FILE + I MODE="READ" D SILENT^%RSEL(ROUTINE,"SRC") Q %ZR(ROUTINE)_FILE "RTN","ZZUTPOST",69,0) - ; + ; "RTN","ZZUTPOST",70,0) - ; We are writing. Parse directories and get 1st routine directory + ; We are writing. Parse directories and get 1st routine directory "RTN","ZZUTPOST",71,0) - N DIRS + N DIRS "RTN","ZZUTPOST",72,0) - D PARSEZRO(.DIRS,ZRO) + D PARSEZRO(.DIRS,ZRO) "RTN","ZZUTPOST",73,0) - N PATH S PATH=$$ZRO1ST(.DIRS) + N PATH S PATH=$$ZRO1ST(.DIRS) "RTN","ZZUTPOST",74,0) - ; + ; "RTN","ZZUTPOST",75,0) - QUIT PATH_FILE ;end of PATH return directory and filename + QUIT PATH_FILE ;end of PATH return directory and filename "RTN","ZZUTPOST",76,0) - ; + ; "RTN","ZZUTPOST",77,0) - ; + ; "RTN","ZZUTPOST",78,0) -PARSEZRO(DIRS,ZRO) ; Parse $zroutines properly into an array +PARSEZRO(DIRS,ZRO) ; Parse $zroutines properly into an array "RTN","ZZUTPOST",79,0) - N PIECE + N PIECE "RTN","ZZUTPOST",80,0) - N I + N I "RTN","ZZUTPOST",81,0) - F I=1:1:$L(ZRO," ") S PIECE(I)=$P(ZRO," ",I) + F I=1:1:$L(ZRO," ") S PIECE(I)=$P(ZRO," ",I) "RTN","ZZUTPOST",82,0) - N CNT S CNT=1 + N CNT S CNT=1 "RTN","ZZUTPOST",83,0) - F I=0:0 S I=$O(PIECE(I)) Q:'I D + F I=0:0 S I=$O(PIECE(I)) Q:'I D "RTN","ZZUTPOST",84,0) - . S DIRS(CNT)=$G(DIRS(CNT))_PIECE(I) + . S DIRS(CNT)=$G(DIRS(CNT))_PIECE(I) "RTN","ZZUTPOST",85,0) - . I DIRS(CNT)["("&(DIRS(CNT)[")") S CNT=CNT+1 QUIT + . I DIRS(CNT)["("&(DIRS(CNT)[")") S CNT=CNT+1 QUIT "RTN","ZZUTPOST",86,0) - . I DIRS(CNT)'["("&(DIRS(CNT)'[")") S CNT=CNT+1 QUIT + . I DIRS(CNT)'["("&(DIRS(CNT)'[")") S CNT=CNT+1 QUIT "RTN","ZZUTPOST",87,0) - . S DIRS(CNT)=DIRS(CNT)_" " ; prep for next piece + . S DIRS(CNT)=DIRS(CNT)_" " ; prep for next piece "RTN","ZZUTPOST",88,0) - QUIT + QUIT "RTN","ZZUTPOST",89,0) - ; + ; "RTN","ZZUTPOST",90,0) -ZRO1ST(DIRS) ; $$ Get first routine directory +ZRO1ST(DIRS) ; $$ Get first routine directory "RTN","ZZUTPOST",91,0) - N OUT ; $$ return + N OUT ; $$ return "RTN","ZZUTPOST",92,0) - N %1 S %1=DIRS(1) ; 1st directory + N %1 S %1=DIRS(1) ; 1st directory "RTN","ZZUTPOST",93,0) - ; Parse with (...) + ; Parse with (...) "RTN","ZZUTPOST",94,0) - I %1["(" DO + I %1["(" DO "RTN","ZZUTPOST",95,0) - . S OUT=$P(%1,"(",2) + . S OUT=$P(%1,"(",2) "RTN","ZZUTPOST",96,0) - . I OUT[" " S OUT=$P(OUT," ") + . I OUT[" " S OUT=$P(OUT," ") "RTN","ZZUTPOST",97,0) - . E S OUT=$P(OUT,")") + . E S OUT=$P(OUT,")") "RTN","ZZUTPOST",98,0) - ; no parens + ; no parens "RTN","ZZUTPOST",99,0) - E S OUT=%1 + E S OUT=%1 "RTN","ZZUTPOST",100,0) - ; + ; "RTN","ZZUTPOST",101,0) - ; Add trailing slash + ; Add trailing slash "RTN","ZZUTPOST",102,0) - I $E(OUT,$L(OUT))'="/" S OUT=OUT_"/" + I $E(OUT,$L(OUT))'="/" S OUT=OUT_"/" "RTN","ZZUTPOST",103,0) - QUIT OUT + QUIT OUT "RTN","ZZUTPOST",104,0) - ; + ; "RTN","ZZUTPOST",105,0) -MES(T,B) ;Write message. +MES(T,B) ;Write message. "RTN","ZZUTPOST",106,0) - S B=$G(B) + S B=$G(B) "RTN","ZZUTPOST",107,0) - I $L($T(BMES^XPDUTL)) D BMES^XPDUTL(T):B,MES^XPDUTL(T):'B Q + I $L($T(BMES^XPDUTL)) D BMES^XPDUTL(T):B,MES^XPDUTL(T):'B Q "RTN","ZZUTPOST",108,0) - W:B ! W !,T + W:B ! W !,T "RTN","ZZUTPOST",109,0) - Q + Q "RTN","ZZUTPOST",110,0) - ; + ; "RTN","ZZUTPOST",111,0) -TEST ; @TEST - TESTING TESTING +TEST ; @TEST - TESTING TESTING "RTN","ZZUTPOST",112,0) - ; + ; "RTN","ZZUTPOST",113,0) - N ZR S ZR="o(p r) /var/abc(/var/abc/r/) /abc/def $gtm_dist/libgtmutl.so vista.so" + N ZR S ZR="o(p r) /var/abc(/var/abc/r/) /abc/def $gtm_dist/libgtmutl.so vista.so" "RTN","ZZUTPOST",114,0) - N DIRS D PARSEZRO(.DIRS,ZR) + N DIRS D PARSEZRO(.DIRS,ZR) "RTN","ZZUTPOST",115,0) - N FIRSTDIR S FIRSTDIR=$$ZRO1ST(.DIRS) + N FIRSTDIR S FIRSTDIR=$$ZRO1ST(.DIRS) "RTN","ZZUTPOST",116,0) - I FIRSTDIR'="p" S $EC=",U1," + I FIRSTDIR'="p" S $EC=",U1," "RTN","ZZUTPOST",117,0) - ; + ; "RTN","ZZUTPOST",118,0) - N ZR S ZR="/var/abc(/var/abc/r/) o(p r) /abc/def $gtm_dist/libgtmutl.so vista.so" + N ZR S ZR="/var/abc(/var/abc/r/) o(p r) /abc/def $gtm_dist/libgtmutl.so vista.so" "RTN","ZZUTPOST",119,0) - N DIRS D PARSEZRO(.DIRS,ZR) + N DIRS D PARSEZRO(.DIRS,ZR) "RTN","ZZUTPOST",120,0) - N FIRSTDIR S FIRSTDIR=$$ZRO1ST(.DIRS) + N FIRSTDIR S FIRSTDIR=$$ZRO1ST(.DIRS) "RTN","ZZUTPOST",121,0) - I FIRSTDIR'="/var/abc/r/" S $EC=",U1," + I FIRSTDIR'="/var/abc/r/" S $EC=",U1," "RTN","ZZUTPOST",122,0) - ; + ; "RTN","ZZUTPOST",123,0) - N ZR S ZR="/abc/def /var/abc(/var/abc/r/) o(p r) $gtm_dist/libgtmutl.so vista.so" + N ZR S ZR="/abc/def /var/abc(/var/abc/r/) o(p r) $gtm_dist/libgtmutl.so vista.so" "RTN","ZZUTPOST",124,0) - N DIRS D PARSEZRO(.DIRS,ZR) + N DIRS D PARSEZRO(.DIRS,ZR) "RTN","ZZUTPOST",125,0) - N FIRSTDIR S FIRSTDIR=$$ZRO1ST(.DIRS) + N FIRSTDIR S FIRSTDIR=$$ZRO1ST(.DIRS) "RTN","ZZUTPOST",126,0) - I FIRSTDIR'="/abc/def" S $EC=",U1," + I FIRSTDIR'="/abc/def" S $EC=",U1," "RTN","ZZUTPOST",127,0) - ; + ; "RTN","ZZUTPOST",128,0) - WRITE "All tests have run successfully!",! + WRITE "All tests have run successfully!",! "RTN","ZZUTPOST",129,0) - QUIT + QUIT "RTN","ZZUTPOST",130,0) - ; + ; "RTN","ZZUTPOST",131,0) GTMPROB ; come here in case of error trying to run unit tests - checks whether renaming worked "RTN","ZZUTPOST",132,0) - N X + N X "RTN","ZZUTPOST",133,0) - S X(1)=" " + S X(1)=" " "RTN","ZZUTPOST",134,0) - S X(2)="*** An error occurred during renaming of routines to %ut*." + S X(2)="*** An error occurred during renaming of routines to %ut*." "RTN","ZZUTPOST",135,0) - S X(3)="*** The renaming has been seen to fail on one type of Linux system." + S X(3)="*** The renaming has been seen to fail on one type of Linux system." "RTN","ZZUTPOST",136,0) - S X(4)="*** In this case, at the Linux command line copy each ut*.m routine" + S X(4)="*** In this case, at the Linux command line copy each ut*.m routine" "RTN","ZZUTPOST",137,0) - S X(5)="*** (ut.m, ut1.m, utt1.m, utt2.m, utt3.m, utt4.m, utt5.m, utt6.m, and " + S X(5)="*** (ut.m, ut1.m, utt1.m, utt2.m, utt3.m, utt4.m, utt5.m, utt6.m, and " "RTN","ZZUTPOST",138,0) - S X(6)="*** uttcovr.m) to _ut*.m (e.g., 'cp ut.m _ut.m', 'cp ut1.m _ut1.m'," + S X(6)="*** uttcovr.m) to _ut*.m (e.g., 'cp ut.m _ut.m', 'cp ut1.m _ut1.m'," "RTN","ZZUTPOST",139,0) - S X(7)="*** 'cp utt1.m _utt1.m', etc., to 'cp uttcovr.m _uttcovr.m'). Then in GT.M" + S X(7)="*** 'cp utt1.m _utt1.m', etc., to 'cp uttcovr.m _uttcovr.m'). Then in GT.M" "RTN","ZZUTPOST",140,0) - S X(8)="*** use the command 'ZLINK %ut', then 'ZLINK %ut1', etc., these may" + S X(8)="*** use the command 'ZLINK %ut', then 'ZLINK %ut1', etc., these may" "RTN","ZZUTPOST",141,0) - S X(9)="*** indicate an undefined local variable error, but continue doing it." + S X(9)="*** indicate an undefined local variable error, but continue doing it." "RTN","ZZUTPOST",142,0) - S X(10)="*** When complete, use the M command 'DO ^%utt1' to run the unit tests on" + S X(10)="*** When complete, use the M command 'DO ^%utt1' to run the unit tests on" "RTN","ZZUTPOST",143,0) - S X(11)="*** the %ut and %ut1 routines to confirm they are working" + S X(11)="*** the %ut and %ut1 routines to confirm they are working" "RTN","ZZUTPOST",144,0) - S X(12)=" " + S X(12)=" " "RTN","ZZUTPOST",145,0) - S X(13)=" Press Enter to continue: " + S X(13)=" Press Enter to continue: " "RTN","ZZUTPOST",146,0) - D MES^XPDUTL(.X) + D MES^XPDUTL(.X) "RTN","ZZUTPOST",147,0) - R X:$G(DTIME,300) + R X:$G(DTIME,300) "RTN","ZZUTPOST",148,0) - Q + Q "RTN","ZZUTPRE") -0^^B3651860 +0^^B6741733 "RTN","ZZUTPRE",1,0) ut01PRE ;VEN/JLI - pre installation routine to set up MASH UTILITIES package and assign %ut routines and globals ;08/22/14 13:02 "RTN","ZZUTPRE",2,0) - ;;0.1;MASH UTILITIES + ;;0.2;MASH UTILITIES;;;Build 5 "RTN","ZZUTPRE",3,0) - ; + ; "RTN","ZZUTPRE",4,0) - ; The following is used to create, if it does not exist, the MASH UTILITIES + ; The following is used to create, if it does not exist, the MASH UTILITIES "RTN","ZZUTPRE",5,0) - ; package, and to assign the %u namespace to this package. This special + ; package, and to assign the %u namespace to this package. This special "RTN","ZZUTPRE",6,0) - ; processing is necessary, since the input transform currently will not accept a + ; processing is necessary, since the input transform currently will not accept a "RTN","ZZUTPRE",7,0) - ; % or lower case character in the namespace. + ; % or lower case character in the namespace. "RTN","ZZUTPRE",8,0) - I '$D(^DIC(9.4,"B","MASH UTILITIES")) N DIC,X S DIC="^DIC(9.4,",DIC(0)="",X="MASH UTILITIES",DIC("DR")="1////%u;2///Utilities associated with the M Advanced Shell" D FILE^DICN + I '$D(^DIC(9.4,"B","MASH UTILITIES")) N DIC,X S DIC="^DIC(9.4,",DIC(0)="",X="MASH UTILITIES",DIC("DR")="1////%u;2///Utilities associated with the M Advanced Shell" D FILE^DICN "RTN","ZZUTPRE",9,0) - ; and if necessary, as in CACHE, map %ut routine and namespace in the current account. + ; and if necessary, as in CACHE, map %ut routine and namespace in the current account. "RTN","ZZUTPRE",10,0) - I +$SY=0 D CACHEMAP ; This routine is CACHE specific + I +$SY=0 D CACHEMAP ; This routine is CACHE specific "RTN","ZZUTPRE",11,0) - Q + Q "RTN","ZZUTPRE",12,0) - ; The following code was provided by Sam Habiel to map % + ; The following code was provided by Sam Habiel to map % "RTN","ZZUTPRE",13,0) -CACHEMAP ; Map %ut* Globals and Routines away from %SYS in Cache +CACHEMAP ; Map %ut* Globals and Routines away from %SYS in Cache "RTN","ZZUTPRE",14,0) - ; Get current namespace + ; Get current namespace "RTN","ZZUTPRE",15,0) - N NMSP + N NMSP "RTN","ZZUTPRE",16,0) - I $P($P($ZV,") ",2),"(")<2012 S NMSP=$ZU(5) + I $P($P($ZV,") ",2),"(")<2012 S NMSP=$ZU(5) "RTN","ZZUTPRE",17,0) - I $P($P($ZV,") ",2),"(")>2011 S NMSP=$NAMESPACE + I $P($P($ZV,") ",2),"(")>2011 S NMSP=$NAMESPACE "RTN","ZZUTPRE",18,0) - ; + ; "RTN","ZZUTPRE",19,0) - ; Map %ut globals away from %SYS + ; Map %ut globals away from %SYS "RTN","ZZUTPRE",20,0) - ZN "%SYS" ; Go to SYS + ZN "%SYS" ; Go to SYS "RTN","ZZUTPRE",21,0) - N % S %=##class(Config.Configuration).GetGlobalMapping(NMSP,"%ut*","",NMSP,NMSP) + N % S %=##class(Config.Configuration).GetGlobalMapping(NMSP,"%ut*","",NMSP,NMSP) "RTN","ZZUTPRE",22,0) - I '% S %=##class(Config.Configuration).AddGlobalMapping(NMSP,"%ut*","",NMSP,NMSP) + I '% S %=##class(Config.Configuration).AddGlobalMapping(NMSP,"%ut*","",NMSP,NMSP) "RTN","ZZUTPRE",23,0) - I '% W !,"Error="_$SYSTEM.Status.GetErrorText(%) QUIT + I '% W !,"Error="_$SYSTEM.Status.GetErrorText(%) QUIT "RTN","ZZUTPRE",24,0) - ; + ; "RTN","ZZUTPRE",25,0) - ; Map %ut routines away from %SYS + ; Map %ut routines away from %SYS "RTN","ZZUTPRE",26,0) - N A S A("Database")=NMSP + N A S A("Database")=NMSP "RTN","ZZUTPRE",27,0) - N % S %=##Class(Config.MapRoutines).Get(NMSP,"%ut*",.A) + N % S %=##Class(Config.MapRoutines).Get(NMSP,"%ut*",.A) "RTN","ZZUTPRE",28,0) - S A("Database")=NMSP + S A("Database")=NMSP "RTN","ZZUTPRE",29,0) - I '% S %=##Class(Config.MapRoutines).Create(NMSP,"%ut*",.A) + I '% S %=##Class(Config.MapRoutines).Create(NMSP,"%ut*",.A) "RTN","ZZUTPRE",30,0) - I '% W !,"Error="_$SYSTEM.Status.GetErrorText(%) QUIT + I '% W !,"Error="_$SYSTEM.Status.GetErrorText(%) QUIT "RTN","ZZUTPRE",31,0) - ZN NMSP ; Go back + ZN NMSP ; Go back "RTN","ZZUTPRE",32,0) - QUIT + QUIT "RTN","ut") -0^1^B257937062 +0^1^B268535658 "RTN","ut",1,0) -%ut ;VEN-SMH/JLI - PRIMARY PROGRAM FOR M-UNIT TESTING ;08/29/14 09:31 +%ut ;VEN-SMH/JLI - PRIMARY PROGRAM FOR M-UNIT TESTING ; 7/2/15 1:12pm "RTN","ut",2,0) - ;;0.1;MASH UTILITIES; + ;;0.1;MASH UTILITIES;;;Build 5 "RTN","ut",3,0) ; "RTN","ut",4,0) @@ -800,901 +962,903 @@ CACHEMAP ; Map %ut* Globals and Routines away from %SYS in Cache "RTN","ut",42,0) ; Created M-UNIT TEST GROUP file at 17.9001 based on the 17.9001 file "RTN","ut",43,0) - Q + ; 141030 JLI - Removed tag TESTCOVR and code under it, not necessary "RTN","ut",44,0) - ; + ; since %uttcovr can handle all of the calling needed "RTN","ut",45,0) -EN(%utRNAM,%utVERB,%utBREAK) ; .SR Entry point with primary test routine name, optional 1 for verbose output + ; Added call to run routine %utt6 if run from the top, "RTN","ut",46,0) - N %utLIST,%utROU,%ut + ; since this will run the full range of unit tests "RTN","ut",47,0) - I '+$G(%utVERB) S %utVERB=0 + ; Modified STARTUP and SHUTDOWN commands to handle in "RTN","ut",48,0) - S %utLIST=1,%utROU(%utLIST)=%utRNAM + ; each routine where they are available, since only "RTN","ut",49,0) - D SETUT + ; running one STARTUP and SHUTDOWN (the first seen by "RTN","ut",50,0) - D EN1(.%utROU,%utLIST) + ; the program) restricted their use in suites of multiple "RTN","ut",51,0) - Q + ; tests. "RTN","ut",52,0) - ; + ; 150101 JLI - Added COV entry to %ut (in addition to current in %ut1) so it is easier "RTN","ut",53,0) -SETUT ; + ; to remember how to use it. "RTN","ut",54,0) - ; VEN/SMH 26JUL2013 + ; 150621 JLI - Added a global location to pick up summary data for a unit test call, so "RTN","ut",55,0) - I '($D(IO)#2) S IO=$P + ; programs running multiple calls can generate a summary if desired. "RTN","ut",56,0) - S U="^" + D ^%utt6 ; runs unit tests on all of it "RTN","ut",57,0) - ; VEN/SMH 26JUL2013 END + Q "RTN","ut",58,0) ; "RTN","ut",59,0) - ; ZEXCEPT: %ut -- NEWED ON ENTRY +EN(%utRNAM,%utVERB,%utBREAK) ; .SR Entry point with primary test routine name, optional 1 for verbose output "RTN","ut",60,0) - S %ut("IO")=IO + N %utLIST,%utROU,%ut "RTN","ut",61,0) - S %ut=1 ; set to identify unit test being run check with $$ISUTEST^%ut() + I '+$G(%utVERB) S %utVERB=0 "RTN","ut",62,0) - ; + S %utLIST=1,%utROU(%utLIST)=%utRNAM "RTN","ut",63,0) - ; ZEXCEPT: %utBREAK + K ^TMP("%ut",$J,"UTVALS") "RTN","ut",64,0) - I $G(%utBREAK) S %ut("BREAK")=1 + D SETUT "RTN","ut",65,0) - Q + D EN1(.%utROU,%utLIST) "RTN","ut",66,0) - ; + Q "RTN","ut",67,0) -EN1(%utROU,%utLIST) ; + ; "RTN","ut",68,0) - ; VEN/SMH 26JUL2013 - This block is refactored to fix problems with +SETUT ; "RTN","ut",69,0) - ; SETUP and TEARDOWN not happening at the right time + ; VEN/SMH 26JUL2013 "RTN","ut",70,0) - N %utERRL,%utK,%utI,%utJ,%utSTRT + I '($D(IO)#2) S IO=$P "RTN","ut",71,0) - ; ZEXCEPT: %utVERB -- ARGUMENT TO EN + S U="^" "RTN","ut",72,0) - ; ZEXCEPT: %utGUI -- CONDITIONALLY DEFINED BY GUINEXT + ; VEN/SMH 26JUL2013 END "RTN","ut",73,0) - ; ZEXCEPT: %ut -- NEWED IN EN + ; "RTN","ut",74,0) - ; + ; ZEXCEPT: %ut -- NEWED ON ENTRY "RTN","ut",75,0) - ; Structure map for %ut + S %ut("IO")=IO "RTN","ut",76,0) - ; -- CURR = Counter for routine number. Used as sub in %utROU + S %ut=1 ; set to identify unit test being run check with $$ISUTEST^%ut() "RTN","ut",77,0) - ; -- ECNT = Entry point count in loop (cf. NERT); VEN/SMH - Needed? + ; "RTN","ut",78,0) - ; -- FAIL = Number of failures + ; ZEXCEPT: %utBREAK "RTN","ut",79,0) - ; -- CHK = Number of checks ran (TF/EQ/FAIL) + I $G(%utBREAK) S %ut("BREAK")=1 "RTN","ut",80,0) - ; -- NENT = Number of entry points ran + Q "RTN","ut",81,0) - ; -- ERRN = Number of errors + ; "RTN","ut",82,0) - S %ut("CURR")=0,%ut("ECNT")=0,%ut("FAIL")=0,%ut("CHK")=0,%ut("NENT")=0,%ut("ERRN")=0 +EN1(%utROU,%utLIST) ; "RTN","ut",83,0) - ; + ; VEN/SMH 26JUL2013 - This block is refactored to fix problems with "RTN","ut",84,0) - ; -- GET LIST OF ROUTINES -- + ; SETUP and TEARDOWN not happening at the right time "RTN","ut",85,0) - ; first get any tree of routines from this one + N %utERRL,%utK,%utI,%utJ,%utSTRT "RTN","ut",86,0) - D GETTREE^%ut1(.%utROU,.%utLIST) + ; ZEXCEPT: %utVERB -- ARGUMENT TO EN "RTN","ut",87,0) - ; + ; ZEXCEPT: %utGUI -- CONDITIONALLY DEFINED BY GUINEXT "RTN","ut",88,0) - ; -- STARTUP -- + ; ZEXCEPT: %ut -- NEWED IN EN "RTN","ut",89,0) - ; 070224 - following code added to allow one overall STARTUP code JLI + ; "RTN","ut",90,0) - F S %ut("CURR")=%ut("CURR")+1 Q:'$D(%utROU(%ut("CURR"))) D I $G(%utSTRT)'="" D @%utSTRT Q + ; Structure map for %ut "RTN","ut",91,0) - . I $T(@("STARTUP^"_%utROU(%ut("CURR"))))'="" S %utSTRT="STARTUP^"_%utROU(%ut("CURR")) + ; -- CURR = Counter for routine number. Used as sub in %utROU "RTN","ut",92,0) - . Q + ; -- ECNT = Entry point count in loop (cf. NERT); VEN/SMH - Needed? "RTN","ut",93,0) - ; 070224 - end of addition JLI + ; -- FAIL = Number of failures "RTN","ut",94,0) - ; + ; -- CHK = Number of checks ran (TF/EQ/FAIL) "RTN","ut",95,0) - ; + ; -- NENT = Number of entry points ran "RTN","ut",96,0) - ; Now process each routine that has been referenced + ; -- ERRN = Number of errors "RTN","ut",97,0) - S %ut("CURR")=0 + S %ut("CURR")=0,%ut("ECNT")=0,%ut("FAIL")=0,%ut("CHK")=0,%ut("NENT")=0,%ut("ERRN")=0 "RTN","ut",98,0) - F S %ut("CURR")=%ut("CURR")+1 Q:'$D(%utROU(%ut("CURR"))) D + ; "RTN","ut",99,0) - . N %utETRY ; Test list to run + ; -- GET LIST OF ROUTINES -- "RTN","ut",100,0) - . ; + ; first get any tree of routines from this one "RTN","ut",101,0) - . ; Collect Test list. + D GETTREE^%ut1(.%utROU,.%utLIST) "RTN","ut",102,0) - . D CHEKTEST^%ut1(%utROU(%ut("CURR")),.%ut,.%utETRY) + ; "RTN","ut",103,0) - . ; + ; Now process each routine that has been referenced "RTN","ut",104,0) - . ; if a SETUP entry point exists, save it off in %ut + N CURRROU "RTN","ut",105,0) - . N %utSETUP S %utSETUP="SETUP^"_%utROU(%ut("CURR")) + S %ut("CURR")=0 "RTN","ut",106,0) - . S %ut("LINE")=$T(@%utSETUP) I %ut("LINE")'="" S %ut("SETUP")=%utSETUP + F S %ut("CURR")=%ut("CURR")+1 Q:'$D(%utROU(%ut("CURR"))) S CURRROU=%utROU(%ut("CURR")) D I $T(@("SHUTDOWN^"_CURRROU))'="" D @("SHUTDOWN^"_CURRROU) "RTN","ut",107,0) - . K %utSETUP ; we're done! + . ; 141018 - add ability to run STARTUP and SHUTDOWN in each routine JLI "RTN","ut",108,0) - . ; + . I $T(@("STARTUP^"_CURRROU))'="" D @("STARTUP^"_CURRROU) ; 141018 "RTN","ut",109,0) - . ; if a TEARDOWN entry point exists, ditto + . N %utETRY ; Test list to run "RTN","ut",110,0) - . N %utTEARDOWN S %utTEARDOWN="TEARDOWN^"_%utROU(%ut("CURR")) + . ; "RTN","ut",111,0) - . S %ut("LINE")=$T(@%utTEARDOWN) I %ut("LINE")'="" S %ut("TEARDOWN")=%utTEARDOWN + . ; Collect Test list. "RTN","ut",112,0) - . K %utTEARDOWN ; done here. + . D CHEKTEST^%ut1(%utROU(%ut("CURR")),.%ut,.%utETRY) "RTN","ut",113,0) . ; "RTN","ut",114,0) - . ; VEN/SMH 26JUL2013 - this block changed to correct running of setup and teardown + . ; if a SETUP entry point exists, save it off in %ut "RTN","ut",115,0) - . ; run each of the specified entry points + . S %ut("SETUP")="" ; 141018 need to clear any previous values JLI "RTN","ut",116,0) - . ; + . N %utSETUP S %utSETUP="SETUP^"_%utROU(%ut("CURR")) "RTN","ut",117,0) - . ; == THIS FOR/DO BLOCK IS THE CENTRAL TEST RUNNER == + . S %ut("LINE")=$T(@%utSETUP) I %ut("LINE")'="" S %ut("SETUP")=%utSETUP "RTN","ut",118,0) - . S %utI=0 + . K %utSETUP ; we're done! "RTN","ut",119,0) - . F S %utI=$O(%utETRY(%utI)) Q:%utI'>0 S %ut("ENUM")=%ut("ERRN")+%ut("FAIL") D + . ; "RTN","ut",120,0) - . . N $ETRAP S $ETRAP="D ERROR^%ut" + . ; if a TEARDOWN entry point exists, ditto "RTN","ut",121,0) - . . ; + . S %ut("TEARDOWN")="" ; 141018 need to clear any previous values JLI "RTN","ut",122,0) - . . ; Run Set-up Code (only if present) + . N %utTEARDOWN S %utTEARDOWN="TEARDOWN^"_%utROU(%ut("CURR")) "RTN","ut",123,0) - . . S %ut("ENT")=$G(%ut("SETUP")) ; Current entry + . S %ut("LINE")=$T(@%utTEARDOWN) I %ut("LINE")'="" S %ut("TEARDOWN")=%utTEARDOWN "RTN","ut",124,0) - . . S %ut("NAME")="Set-up Code" + . K %utTEARDOWN ; done here. "RTN","ut",125,0) - . . D:%ut("ENT")]"" @%ut("ENT") + . ; "RTN","ut",126,0) - . . ; + . ; VEN/SMH 26JUL2013 - this block changed to correct running of setup and teardown "RTN","ut",127,0) - . . ; Run actual test + . ; run each of the specified entry points "RTN","ut",128,0) - . . S %ut("ECNT")=%ut("ECNT")+1 + . ; "RTN","ut",129,0) - . . S %ut("NAME")=%utETRY(%utI,"NAME") + . ; == THIS FOR/DO BLOCK IS THE CENTRAL TEST RUNNER == "RTN","ut",130,0) - . . S %ut("ENT")=%utETRY(%utI)_"^"_%utROU(%ut("CURR")) + . S %utI=0 "RTN","ut",131,0) - . . I %utVERB,'$D(%utGUI) D VERBOSE1(.%utETRY,%utI) ; Say what we executed. + . F S %utI=$O(%utETRY(%utI)) Q:%utI'>0 S %ut("ENUM")=%ut("ERRN")+%ut("FAIL") D "RTN","ut",132,0) - . . D @%ut("ENT") + . . N $ETRAP S $ETRAP="D ERROR^%ut" "RTN","ut",133,0) . . ; "RTN","ut",134,0) - . . ; Run Teardown Code (only if present) + . . ; Run Set-up Code (only if present) "RTN","ut",135,0) - . . S %ut("ENT")=$G(%ut("TEARDOWN")) + . . S %ut("ENT")=$G(%ut("SETUP")) ; Current entry "RTN","ut",136,0) - . . S %ut("NAME")="Teardown Code" + . . S %ut("NAME")="Set-up Code" "RTN","ut",137,0) . . D:%ut("ENT")]"" @%ut("ENT") "RTN","ut",138,0) . . ; "RTN","ut",139,0) - . . ; ENUM = Number of errors + failures + . . ; Run actual test "RTN","ut",140,0) - . . ; Only print out the success message [OK] If our error number remains + . . S %ut("ECNT")=%ut("ECNT")+1 "RTN","ut",141,0) - . . ; the same as when we started the loop. + . . S %ut("NAME")=%utETRY(%utI,"NAME") "RTN","ut",142,0) - . . I %utVERB,'$D(%utGUI) D + . . S %ut("ENT")=%utETRY(%utI)_"^"_%utROU(%ut("CURR")) "RTN","ut",143,0) - . . . I %ut("ENUM")=(%ut("ERRN")+%ut("FAIL")) D VERBOSE(.%utETRY,%utI,1) I 1 + . . I %utVERB,'$D(%utGUI) D VERBOSE1(.%utETRY,%utI) ; Say what we executed. "RTN","ut",144,0) - . . . E D VERBOSE(.%utETRY,%utI,0) + . . D @%ut("ENT") "RTN","ut",145,0) - . ; + . . ; "RTN","ut",146,0) - . ; + . . ; Run Teardown Code (only if present) "RTN","ut",147,0) - . ; keep a %utCNT of number of entry points executed across all routines + . . S %ut("ENT")=$G(%ut("TEARDOWN")) "RTN","ut",148,0) - . S %ut("NENT")=%ut("NENT")+%ut("ENTN") + . . S %ut("NAME")="Teardown Code" "RTN","ut",149,0) - . Q + . . D:%ut("ENT")]"" @%ut("ENT") "RTN","ut",150,0) - ; + . . ; "RTN","ut",151,0) - ; -- SHUTDOWN -- + . . ; ENUM = Number of errors + failures "RTN","ut",152,0) - ; 070224 - following code added to allow one overall SHUTDOWN code JLI + . . ; Only print out the success message [OK] If our error number remains "RTN","ut",153,0) - N XTFINISH + . . ; the same as when we started the loop. "RTN","ut",154,0) - S %ut("CURR")=0 + . . I %utVERB,'$D(%utGUI) D "RTN","ut",155,0) - F S %ut("CURR")=%ut("CURR")+1 Q:'$D(%utROU(%ut("CURR"))) D I $G(XTFINISH)'="" D @XTFINISH Q + . . . I %ut("ENUM")=(%ut("ERRN")+%ut("FAIL")) D VERBOSE(.%utETRY,%utI,1) I 1 "RTN","ut",156,0) - . I $T(@("SHUTDOWN^"_%utROU(%ut("CURR"))))'="" S XTFINISH="SHUTDOWN^"_%utROU(%ut("CURR")) + . . . E D VERBOSE(.%utETRY,%utI,0) "RTN","ut",157,0) - . Q + . ; "RTN","ut",158,0) - ; 070224 - End of addition JLI + . ; "RTN","ut",159,0) - ; and output the results + . ; keep a %utCNT of number of entry points executed across all routines "RTN","ut",160,0) - D SETIO + . S %ut("NENT")=%ut("NENT")+%ut("ENTN") "RTN","ut",161,0) - W !!,"Ran ",%utLIST," Routine",$S(%utLIST>1:"s",1:""),", ",%ut("NENT")," Entry Tag",$S(%ut("NENT")>1:"s",1:"") + . Q "RTN","ut",162,0) - W !,"Checked ",%ut("CHK")," test",$S(%ut("CHK")>1:"s",1:""),", with ",%ut("FAIL")," failure",$S(%ut("FAIL")'=1:"s",1:"")," and encountered ",%ut("ERRN")," error",$S(%ut("ERRN")'=1:"s",1:""),"." + ; "RTN","ut",163,0) - D RESETIO + ; -- SHUTDOWN -- "RTN","ut",164,0) - Q + D SETIO "RTN","ut",165,0) - ; -- end EN1 + W !!,"Ran ",%utLIST," Routine",$S(%utLIST>1:"s",1:""),", ",%ut("NENT")," Entry Tag",$S(%ut("NENT")>1:"s",1:"") "RTN","ut",166,0) -VERBOSE(%utETRY,%utI,SUCCESS) ; Say whether we succeeded or failed. + W !,"Checked ",%ut("CHK")," test",$S(%ut("CHK")>1:"s",1:""),", with ",%ut("FAIL")," failure",$S(%ut("FAIL")'=1:"s",1:"")," and encountered ",%ut("ERRN")," error",$S(%ut("ERRN")'=1:"s",1:""),"." "RTN","ut",167,0) - ; ZEXCEPT: %ut - NEWED IN EN + S ^TMP("%ut",$J,"UTVALS")=%utLIST_U_%ut("NENT")_U_%ut("CHK")_U_%ut("FAIL")_U_%ut("ERRN") ; JLI 150621 so programs running several sets of unit tests can generate totals "RTN","ut",168,0) - D SETIO + D RESETIO "RTN","ut",169,0) - N I F I=$X+3:1:73 W "-" + Q "RTN","ut",170,0) - W ?73 + ; -- end EN1 "RTN","ut",171,0) - I $G(SUCCESS) W "[OK]" +VERBOSE(%utETRY,%utI,SUCCESS) ; Say whether we succeeded or failed. "RTN","ut",172,0) - E W "[FAIL]" + ; ZEXCEPT: %ut - NEWED IN EN "RTN","ut",173,0) - D RESETIO -"RTN","ut",174,0) - Q -"RTN","ut",175,0) - ; -"RTN","ut",176,0) -VERBOSE1(%utETRY,%utI) ; Print out the entry point info -"RTN","ut",177,0) - ; ZEXCEPT: %ut - NEWED IN EN -"RTN","ut",178,0) D SETIO -"RTN","ut",179,0) - W !,%utETRY(%utI) I $G(%utETRY(%utI,"NAME"))'="" W " - ",%utETRY(%utI,"NAME") -"RTN","ut",180,0) +"RTN","ut",174,0) + N I F I=$X+3:1:73 W "-" +"RTN","ut",175,0) + W ?73 +"RTN","ut",176,0) + I $G(SUCCESS) W "[OK]" +"RTN","ut",177,0) + E W "[FAIL]" +"RTN","ut",178,0) D RESETIO +"RTN","ut",179,0) + Q +"RTN","ut",180,0) + ; "RTN","ut",181,0) - Q +VERBOSE1(%utETRY,%utI) ; Print out the entry point info "RTN","ut",182,0) -CHKTF(XTSTVAL,XTERMSG) ; Entry point for checking True or False values + ; ZEXCEPT: %ut - NEWED IN EN "RTN","ut",183,0) - ; ZEXCEPT: %utERRL,%utGUI - CREATED IN SETUP, KILLED IN END + D SETIO "RTN","ut",184,0) - ; ZEXCEPT: %ut - NEWED IN EN + W !,%utETRY(%utI) I $G(%utETRY(%utI,"NAME"))'="" W " - ",%utETRY(%utI,"NAME") "RTN","ut",185,0) - ; ZEXCEPT: XTGUISEP - newed in GUINEXT + D RESETIO "RTN","ut",186,0) - I '$D(XTSTVAL) D NVLDARG Q + Q "RTN","ut",187,0) - I $G(XTERMSG)="" S XTERMSG="no failure message provided" + ; "RTN","ut",188,0) - S %ut("CHK")=$G(%ut("CHK"))+1 +CHKTF(XTSTVAL,XTERMSG) ; Entry point for checking True or False values "RTN","ut",189,0) - I '$D(%utGUI) D -"RTN","ut",190,0) - . D SETIO -"RTN","ut",191,0) - . I 'XTSTVAL W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " D -"RTN","ut",192,0) - . . W XTERMSG,! S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") -"RTN","ut",193,0) - . . I $D(%ut("BREAK")) BREAK ; Break upon failure -"RTN","ut",194,0) - . . Q -"RTN","ut",195,0) - . I XTSTVAL W "." -"RTN","ut",196,0) - . D RESETIO -"RTN","ut",197,0) - . Q -"RTN","ut",198,0) - I $D(%utGUI),'XTSTVAL S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_XTERMSG,%ut("FAIL")=%ut("FAIL")+1 -"RTN","ut",199,0) - Q -"RTN","ut",200,0) - ; -"RTN","ut",201,0) -CHKEQ(XTEXPECT,XTACTUAL,XTERMSG) ; Entry point for checking values to see if they are EQUAL -"RTN","ut",202,0) - N FAILMSG -"RTN","ut",203,0) - ; ZEXCEPT: %utERRL,%utGUI -CREATED IN SETUP, KILLED IN END -"RTN","ut",204,0) - ; ZEXCEPT: %ut -- NEWED IN EN -"RTN","ut",205,0) - ; ZEXCEPT: XTGUISEP - newed in GUINEXT -"RTN","ut",206,0) - I '$D(XTEXPECT)!'$D(XTACTUAL) D NVLDARG Q ; JLI 140824 changed from AND to OR, since both necessary, but only one might be entered -"RTN","ut",207,0) - S XTACTUAL=$G(XTACTUAL),XTEXPECT=$G(XTEXPECT) -"RTN","ut",208,0) - I $G(XTERMSG)="" S XTERMSG="no failure message provided" -"RTN","ut",209,0) - S %ut("CHK")=%ut("CHK")+1 -"RTN","ut",210,0) - I XTEXPECT'=XTACTUAL S FAILMSG="<"_XTEXPECT_"> vs <"_XTACTUAL_"> - " -"RTN","ut",211,0) - I '$D(%utGUI) D -"RTN","ut",212,0) - . D SETIO -"RTN","ut",213,0) - . I XTEXPECT'=XTACTUAL W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " W FAILMSG,XTERMSG,! D -"RTN","ut",214,0) - . . S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") -"RTN","ut",215,0) - . . I $D(%ut("BREAK")) BREAK ; Break upon failure -"RTN","ut",216,0) - . . Q -"RTN","ut",217,0) - . E W "." -"RTN","ut",218,0) - . D RESETIO -"RTN","ut",219,0) - . Q -"RTN","ut",220,0) - I $D(%utGUI),XTEXPECT'=XTACTUAL S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_FAILMSG_XTERMSG,%ut("FAIL")=%ut("FAIL")+1 -"RTN","ut",221,0) - Q -"RTN","ut",222,0) - ; -"RTN","ut",223,0) -FAIL(XTERMSG) ; Entry point for generating a failure message -"RTN","ut",224,0) - ; ZEXCEPT: %utERRL,%utGUI -CREATED IN SETUP, KILLED IN END -"RTN","ut",225,0) - ; ZEXCEPT: %ut -- NEWED ON ENTRY -"RTN","ut",226,0) - ; ZEXCEPT: XTGUISEP - newed in GUINEXT -"RTN","ut",227,0) - I $G(XTERMSG)="" S XTERMSG="no failure message provided" -"RTN","ut",228,0) - S %ut("CHK")=%ut("CHK")+1 -"RTN","ut",229,0) - I '$D(%utGUI) D -"RTN","ut",230,0) - . D SETIO -"RTN","ut",231,0) - . W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " W XTERMSG,! D -"RTN","ut",232,0) - . . S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") -"RTN","ut",233,0) - . . I $D(%ut("BREAK")) BREAK ; Break upon failure -"RTN","ut",234,0) - . . Q -"RTN","ut",235,0) - . D RESETIO -"RTN","ut",236,0) - . Q -"RTN","ut",237,0) - I $D(%utGUI) S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_XTERMSG,%ut("FAIL")=%ut("FAIL")+1 -"RTN","ut",238,0) - Q -"RTN","ut",239,0) -SUCCEED ; Entry point for forcing a success (Thx David Whitten) -"RTN","ut",240,0) ; ZEXCEPT: %utERRL,%utGUI - CREATED IN SETUP, KILLED IN END -"RTN","ut",241,0) +"RTN","ut",190,0) ; ZEXCEPT: %ut - NEWED IN EN -"RTN","ut",242,0) - ; Switch IO and write out the dot for activity -"RTN","ut",243,0) +"RTN","ut",191,0) + ; ZEXCEPT: XTGUISEP - newed in GUINEXT +"RTN","ut",192,0) + I '$D(XTSTVAL) D NVLDARG Q +"RTN","ut",193,0) + I $G(XTERMSG)="" S XTERMSG="no failure message provided" +"RTN","ut",194,0) + S %ut("CHK")=$G(%ut("CHK"))+1 +"RTN","ut",195,0) I '$D(%utGUI) D -"RTN","ut",244,0) +"RTN","ut",196,0) . D SETIO -"RTN","ut",245,0) - . W "." -"RTN","ut",246,0) +"RTN","ut",197,0) + . I 'XTSTVAL W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " D +"RTN","ut",198,0) + . . W XTERMSG,! S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") +"RTN","ut",199,0) + . . I $D(%ut("BREAK")) BREAK ; Break upon failure +"RTN","ut",200,0) + . . Q +"RTN","ut",201,0) + . I XTSTVAL W "." +"RTN","ut",202,0) . D RESETIO -"RTN","ut",247,0) +"RTN","ut",203,0) + . Q +"RTN","ut",204,0) + I $D(%utGUI),'XTSTVAL S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_XTERMSG,%ut("FAIL")=%ut("FAIL")+1 +"RTN","ut",205,0) + Q +"RTN","ut",206,0) ; -"RTN","ut",248,0) - ; Increment test counter -"RTN","ut",249,0) +"RTN","ut",207,0) +CHKEQ(XTEXPECT,XTACTUAL,XTERMSG) ; Entry point for checking values to see if they are EQUAL +"RTN","ut",208,0) + N FAILMSG +"RTN","ut",209,0) + ; ZEXCEPT: %utERRL,%utGUI -CREATED IN SETUP, KILLED IN END +"RTN","ut",210,0) + ; ZEXCEPT: %ut -- NEWED IN EN +"RTN","ut",211,0) + ; ZEXCEPT: XTGUISEP - newed in GUINEXT +"RTN","ut",212,0) + I '$D(XTEXPECT)!'$D(XTACTUAL) D NVLDARG Q ; JLI 140824 changed from AND to OR, since both necessary, but only one might be entered +"RTN","ut",213,0) + S XTACTUAL=$G(XTACTUAL),XTEXPECT=$G(XTEXPECT) +"RTN","ut",214,0) + I $G(XTERMSG)="" S XTERMSG="no failure message provided" +"RTN","ut",215,0) S %ut("CHK")=%ut("CHK")+1 +"RTN","ut",216,0) + I XTEXPECT'=XTACTUAL S FAILMSG="<"_XTEXPECT_"> vs <"_XTACTUAL_"> - " +"RTN","ut",217,0) + I '$D(%utGUI) D +"RTN","ut",218,0) + . D SETIO +"RTN","ut",219,0) + . I XTEXPECT'=XTACTUAL W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " W FAILMSG,XTERMSG,! D +"RTN","ut",220,0) + . . S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") +"RTN","ut",221,0) + . . I $D(%ut("BREAK")) BREAK ; Break upon failure +"RTN","ut",222,0) + . . Q +"RTN","ut",223,0) + . E W "." +"RTN","ut",224,0) + . D RESETIO +"RTN","ut",225,0) + . Q +"RTN","ut",226,0) + I $D(%utGUI),XTEXPECT'=XTACTUAL S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_FAILMSG_XTERMSG,%ut("FAIL")=%ut("FAIL")+1 +"RTN","ut",227,0) + Q +"RTN","ut",228,0) + ; +"RTN","ut",229,0) +FAIL(XTERMSG) ; Entry point for generating a failure message +"RTN","ut",230,0) + ; ZEXCEPT: %utERRL,%utGUI -CREATED IN SETUP, KILLED IN END +"RTN","ut",231,0) + ; ZEXCEPT: %ut -- NEWED ON ENTRY +"RTN","ut",232,0) + ; ZEXCEPT: XTGUISEP - newed in GUINEXT +"RTN","ut",233,0) + I $G(XTERMSG)="" S XTERMSG="no failure message provided" +"RTN","ut",234,0) + S %ut("CHK")=%ut("CHK")+1 +"RTN","ut",235,0) + I '$D(%utGUI) D +"RTN","ut",236,0) + . D SETIO +"RTN","ut",237,0) + . W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " W XTERMSG,! D +"RTN","ut",238,0) + . . S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") +"RTN","ut",239,0) + . . I $D(%ut("BREAK")) BREAK ; Break upon failure +"RTN","ut",240,0) + . . Q +"RTN","ut",241,0) + . D RESETIO +"RTN","ut",242,0) + . Q +"RTN","ut",243,0) + I $D(%utGUI) S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_XTERMSG,%ut("FAIL")=%ut("FAIL")+1 +"RTN","ut",244,0) + Q +"RTN","ut",245,0) + ; +"RTN","ut",246,0) +SUCCEED ; Entry point for forcing a success (Thx David Whitten) +"RTN","ut",247,0) + ; ZEXCEPT: %utERRL,%utGUI - CREATED IN SETUP, KILLED IN END +"RTN","ut",248,0) + ; ZEXCEPT: %ut - NEWED IN EN +"RTN","ut",249,0) + ; Switch IO and write out the dot for activity "RTN","ut",250,0) - QUIT + I '$D(%utGUI) D "RTN","ut",251,0) - ; + . D SETIO "RTN","ut",252,0) -CHKLEAKS(%utCODE,%utLOC,%utINPT) ; functionality to check for variable leaks on executing a section of code + . W "." "RTN","ut",253,0) - ; %utCODE - A string that specifies the code that is to be XECUTED and checked for leaks. + . D RESETIO "RTN","ut",254,0) - ; this should be a complete piece of code (e.g., "S X=$$NOW^XLFDT()" or "D EN^%ut(""ROUNAME"")") + ; "RTN","ut",255,0) - ; %utLOC - A string that is used to indicate the code tested for variable leaks + ; Increment test counter "RTN","ut",256,0) - ; %utINPT - An optional variable which may be passed by reference. This may + S %ut("CHK")=%ut("CHK")+1 "RTN","ut",257,0) - ; be used to pass any variable values, etc. into the code to be + QUIT "RTN","ut",258,0) - ; XECUTED. In this case, set the subscript to the variable name and the + ; "RTN","ut",259,0) - ; value of the subscripted variable to the desired value of the subscript. +CHKLEAKS(%utCODE,%utLOC,%utINPT) ; functionality to check for variable leaks on executing a section of code "RTN","ut",260,0) - ; e.g., (using NAME as my current namespace) + ; %utCODE - A string that specifies the code that is to be XECUTED and checked for leaks. "RTN","ut",261,0) - ; S CODE="S %utINPT=$$ENTRY^ROUTINE(ZZVALUE1,ZZVALUE2)" + ; this should be a complete piece of code (e.g., "S X=$$NOW^XLFDT()" or "D EN^%ut(""ROUNAME"")") "RTN","ut",262,0) - ; S NAMELOC="ENTRY^ROUTINE leak test" (or simply "ENTRY^ROUTINE") + ; %utLOC - A string that is used to indicate the code tested for variable leaks "RTN","ut",263,0) - ; S NAMEINPT("ZZVALUE1")=ZZVALUE1 + ; %utINPT - An optional variable which may be passed by reference. This may "RTN","ut",264,0) - ; S NAMEINPT("ZZVALUE2")=ZZVALUE2 + ; be used to pass any variable values, etc. into the code to be "RTN","ut",265,0) - ; D CHKLEAKS^%ut(CODE,NAMELOC,.NAMEINPT) + ; XECUTED. In this case, set the subscript to the variable name and the "RTN","ut",266,0) - ; + ; value of the subscripted variable to the desired value of the subscript. "RTN","ut",267,0) - ; If part of a unit test, any leaked variables in ENTRY^ROUTINE which result + ; e.g., (using NAME as my current namespace) "RTN","ut",268,0) - ; from running the code with the variables indicated will be shown as FAILUREs. + ; S CODE="S %utINPT=$$ENTRY^ROUTINE(ZZVALUE1,ZZVALUE2)" "RTN","ut",269,0) - ; + ; S NAMELOC="ENTRY^ROUTINE leak test" (or simply "ENTRY^ROUTINE") "RTN","ut",270,0) - ; If called outside of a unit test, any leaked variables will be printed to the + ; S NAMEINPT("ZZVALUE1")=ZZVALUE1 "RTN","ut",271,0) - ; current device. + ; S NAMEINPT("ZZVALUE2")=ZZVALUE2 "RTN","ut",272,0) - ; + ; D CHKLEAKS^%ut(CODE,NAMELOC,.NAMEINPT) "RTN","ut",273,0) - N (%utCODE,%utLOC,%utINPT,DUZ,IO,U,%utERRL,%ut,%utGUI,%utERR,%utI,%utJ,%utK,%utLIST,%utROU,%utSTRT,XTGUISEP) + ; "RTN","ut",274,0) - ; ZEXCEPT: %ut - part of exclusive NEW TESTS FOR EXISTENCE ONLY + ; If part of a unit test, any leaked variables in ENTRY^ROUTINE which result "RTN","ut",275,0) - ; ZEXCEPT: %utVAR - handled by exclusive NEW + ; from running the code with the variables indicated will be shown as FAILUREs. "RTN","ut",276,0) ; "RTN","ut",277,0) - ; ACTIVATE ANY VARIABLES PASSED AS SUBSCRIPTS TO %utINPT TO THEIR VALUES + ; If called outside of a unit test, any leaked variables will be printed to the "RTN","ut",278,0) - S %utVAR=" " F S %utVAR=$O(%utINPT(%utVAR)) Q:%utVAR="" S (@%utVAR)=%utINPT(%utVAR) + ; current device. "RTN","ut",279,0) - X %utCODE + ; "RTN","ut",280,0) - N ZZUTVAR S ZZUTVAR="%" + N (%utCODE,%utLOC,%utINPT,DUZ,IO,U,%utERRL,%ut,%utGUI,%utERR,%utI,%utJ,%utK,%utLIST,%utROU,%utSTRT,XTGUISEP) "RTN","ut",281,0) - I $G(%ut)=1 D + ; ZEXCEPT: %ut - part of exclusive NEW TESTS FOR EXISTENCE ONLY "RTN","ut",282,0) - . I $D(@ZZUTVAR),'$D(%utINPT(ZZUTVAR)) D FAIL^%ut(%utLOC_" VARIABLE LEAK: "_ZZUTVAR) + ; ZEXCEPT: %utVAR - handled by exclusive NEW "RTN","ut",283,0) - . F S ZZUTVAR=$O(@ZZUTVAR) Q:ZZUTVAR="" I $E(ZZUTVAR,1,3)'="%ut",'$D(%utINPT(ZZUTVAR)),",DUZ,IO,U,DTIME,ZZUTVAR,DT,%ut,XTGUISEP,"'[(","_ZZUTVAR_",") D FAIL^%ut(%utLOC_" VARIABLE LEAK: "_ZZUTVAR) + ; "RTN","ut",284,0) - . Q + ; ACTIVATE ANY VARIABLES PASSED AS SUBSCRIPTS TO %utINPT TO THEIR VALUES "RTN","ut",285,0) - I '($G(%ut)=1) D + S %utVAR=" " F S %utVAR=$O(%utINPT(%utVAR)) Q:%utVAR="" S (@%utVAR)=%utINPT(%utVAR) "RTN","ut",286,0) - . I $D(@ZZUTVAR),'$D(%utINPT(ZZUTVAR)) W !,%utLOC_" VARIABLE LEAK: "_ZZUTVAR + X %utCODE "RTN","ut",287,0) - . F S ZZUTVAR=$O(@ZZUTVAR) Q:ZZUTVAR="" I $E(ZZUTVAR,1,3)'="%ut",'$D(%utINPT(ZZUTVAR)),",DUZ,IO,U,DTIME,ZZUTVAR,DT,%ut,XTGUISEP,"'[(","_ZZUTVAR_",") W !,%utLOC_" VARIABLE LEAK: "_ZZUTVAR + N ZZUTVAR S ZZUTVAR="%" "RTN","ut",288,0) - . Q + I $G(%ut)=1 D "RTN","ut",289,0) - Q + . I $D(@ZZUTVAR),'$D(%utINPT(ZZUTVAR)) D FAIL^%ut(%utLOC_" VARIABLE LEAK: "_ZZUTVAR) "RTN","ut",290,0) - ; + . F S ZZUTVAR=$O(@ZZUTVAR) Q:ZZUTVAR="" I $E(ZZUTVAR,1,3)'="%ut",'$D(%utINPT(ZZUTVAR)),",DUZ,IO,U,DTIME,ZZUTVAR,DT,%ut,XTGUISEP,"'[(","_ZZUTVAR_",") D FAIL^%ut(%utLOC_" VARIABLE LEAK: "_ZZUTVAR) "RTN","ut",291,0) -NVLDARG ; generate message for invalid arguments to test + . Q "RTN","ut",292,0) - N XTERMSG + I '($G(%ut)=1) D "RTN","ut",293,0) - ; ZEXCEPT: %ut -- NEWED ON ENTRY + . I $D(@ZZUTVAR),'$D(%utINPT(ZZUTVAR)) W !,%utLOC_" VARIABLE LEAK: "_ZZUTVAR "RTN","ut",294,0) - ; ZEXCEPT: %utERRL,%utGUI -CREATED IN SETUP, KILLED IN END + . F S ZZUTVAR=$O(@ZZUTVAR) Q:ZZUTVAR="" I $E(ZZUTVAR,1,3)'="%ut",'$D(%utINPT(ZZUTVAR)),",DUZ,IO,U,DTIME,ZZUTVAR,DT,%ut,XTGUISEP,"'[(","_ZZUTVAR_",") W !,%utLOC_" VARIABLE LEAK: "_ZZUTVAR "RTN","ut",295,0) - ; ZEXCEPT: XTGUISEP - newed in GUINEXT + . Q "RTN","ut",296,0) - S XTERMSG="NO VALUES INPUT TO CHKEQ^%ut - no evaluation possible" + Q "RTN","ut",297,0) - I '$D(%utGUI) D + ; "RTN","ut",298,0) - . D SETIO +NVLDARG ; generate message for invalid arguments to test "RTN","ut",299,0) - . W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " W XTERMSG,! D + N XTERMSG "RTN","ut",300,0) - . . S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") + ; ZEXCEPT: %ut -- NEWED ON ENTRY "RTN","ut",301,0) - . . Q + ; ZEXCEPT: %utERRL,%utGUI -CREATED IN SETUP, KILLED IN END "RTN","ut",302,0) - . D RESETIO -"RTN","ut",303,0) - . Q -"RTN","ut",304,0) - I $D(%utGUI) S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_XTERMSG,%ut("FAIL")=%ut("FAIL")+1 -"RTN","ut",305,0) - Q -"RTN","ut",306,0) - ; -"RTN","ut",307,0) -ERROR ; record errors -"RTN","ut",308,0) - ; ZEXCEPT: %utERRL,%utGUI,%utERR -CREATED IN SETUP, KILLED IN END -"RTN","ut",309,0) - ; ZEXCEPT: %ut -- NEWED ON ENTRY -"RTN","ut",310,0) ; ZEXCEPT: XTGUISEP - newed in GUINEXT -"RTN","ut",311,0) - S %ut("CHK")=%ut("CHK")+1 -"RTN","ut",312,0) - I '$D(%utGUI) D ERROR1 -"RTN","ut",313,0) - I $D(%utGUI) D -"RTN","ut",314,0) - . S %ut("CNT")=%ut("CNT")+1 -"RTN","ut",315,0) - . S %utERR=%utERR+1 -"RTN","ut",316,0) - . S @%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"ERROR"_XTGUISEP_$S(+$SY=47:$ZS,1:$ZE) -"RTN","ut",317,0) - . Q -"RTN","ut",318,0) - S @($S(+$SY=47:"$ZS",1:"$ZE")_"="_""""""),$EC="" -"RTN","ut",319,0) - Q -"RTN","ut",320,0) - ; -"RTN","ut",321,0) -ERROR1 ; -"RTN","ut",322,0) - I $G(%ut("BREAK")) BREAK ; if we are asked to break upon error, please do so! -"RTN","ut",323,0) - ; ZEXCEPT: %utERRL -CREATED IN SETUP, KILLED IN END -"RTN","ut",324,0) - ; ZEXCEPT: %ut -- NEWED ON ENTRY -"RTN","ut",325,0) - D SETIO -"RTN","ut",326,0) - W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - Error: " W $S(+$SY=47:$ZS,1:$ZE),! D -"RTN","ut",327,0) - . S %ut("ERRN")=%ut("ERRN")+1,%utERRL(%ut("ERRN"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=$S(+$SY=47:$ZS,1:$ZE),%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") -"RTN","ut",328,0) - . Q -"RTN","ut",329,0) - D RESETIO -"RTN","ut",330,0) - Q -"RTN","ut",331,0) -SETIO ; Set M-Unit Device to write the results to... -"RTN","ut",332,0) - ; ZEXCEPT: %ut -- NEWED ON ENTRY -"RTN","ut",333,0) - I $IO'=%ut("IO") S (IO(0),%ut("DEV","OLD"))=$IO USE %ut("IO") SET IO=$IO -"RTN","ut",334,0) - QUIT -"RTN","ut",335,0) - ; -"RTN","ut",336,0) -RESETIO ; Reset $IO back to the original device if we changed it. -"RTN","ut",337,0) - ; ZEXCEPT: %ut -- NEWED ON ENTRY -"RTN","ut",338,0) - I $D(%ut("DEV","OLD")) S IO(0)=%ut("IO") U %ut("DEV","OLD") S IO=$IO K %ut("DEV","OLD") -"RTN","ut",339,0) - QUIT -"RTN","ut",340,0) - ; -"RTN","ut",341,0) -ISUTEST() ; .SUPPORTED API TO DETERMINE IF CURRENTLY IN UNIT TEST -"RTN","ut",342,0) - ; ZEXCEPT: %ut -- NEWED ON ENTRY -"RTN","ut",343,0) - Q $G(%ut)=1 -"RTN","ut",344,0) - ; -"RTN","ut",345,0) -PICKSET ; .OPT Interactive selection of MUnit Test Group -"RTN","ut",346,0) - N DIC,Y,%utROU,%utLIST,DIR -"RTN","ut",347,0) - S DIC=17.9001,DIC(0)="AEQM" D ^DIC Q:Y'>0 W ! -"RTN","ut",348,0) - D GETSET(+Y,.%utROU,.%utLIST) -"RTN","ut",349,0) - N DIC,Y,%ut -"RTN","ut",350,0) - D SETUT -"RTN","ut",351,0) - D EN1(.%utROU,%utLIST) -"RTN","ut",352,0) - S DIR(0)="EA",DIR("A")="Enter RETURN to continue:" D ^DIR K DIR -"RTN","ut",353,0) - Q -"RTN","ut",354,0) - ; -"RTN","ut",355,0) -RUNSET(SETNAME,VERBOSE) ; .SR Run with Specified Selection of MUnit Test Group -"RTN","ut",356,0) - N Y,%utROU,%utLIST,%utVERB -"RTN","ut",357,0) - Q:$G(SETNAME)="" -"RTN","ut",358,0) - S %utVERB=$G(VERBOSE,0) -"RTN","ut",359,0) - S Y=+$$FIND1^DIC(17.9001,"","X",SETNAME) Q:Y'>0 -"RTN","ut",360,0) - D GETSET(Y,.%utROU,.%utLIST) -"RTN","ut",361,0) - N Y,SETNAME,%ut -"RTN","ut",362,0) - D SETUT -"RTN","ut",363,0) - D EN1(.%utROU,%utLIST) -"RTN","ut",364,0) - Q -"RTN","ut",365,0) - ; -"RTN","ut",366,0) - ; DOSET CAN BE USED TO RUN A SET OF TESTS BASED ON THE IEN IN THE MUNIT TEST GROUP file (#17.9001) -"RTN","ut",367,0) -DOSET(IEN,%utVERB) ; 140731 JLI added %utVERB as a second argument -"RTN","ut",368,0) - ; IEN - Internal entry number for selected set of tests in the MUNIT TEST GROUP file (#17.9001) -"RTN","ut",369,0) - ; %utVERB - optional input that indicates verbose output is permitted -"RTN","ut",370,0) - ; -"RTN","ut",371,0) - N %utROU,%utLIST -"RTN","ut",372,0) - I '$D(%utVERB) S %utVERB=0 -"RTN","ut",373,0) - S %utLIST=0 -"RTN","ut",374,0) - D GETSET($G(IEN),.%utROU,.%utLIST) -"RTN","ut",375,0) - I %utLIST>0 N IEN,%ut D SETUT,EN1(.%utROU,%utLIST) -"RTN","ut",376,0) - Q -"RTN","ut",377,0) - ; -"RTN","ut",378,0) -GETSET(IEN,%utROU,%utLIST) ; JLI 140731 - called from PICKSET, RUNSET, DOSET, GUISET -"RTN","ut",379,0) - N IENS,%utROOT -"RTN","ut",380,0) - S IENS=IEN_"," D GETS^DIQ(17.9001,IENS,"1*","","%utROOT") -"RTN","ut",381,0) - S %utLIST=0,IENS="" F S IENS=$O(%utROOT(17.90011,IENS)) Q:IENS="" S %utLIST=%utLIST+1,%utROU(%utLIST)=%utROOT(17.90011,IENS,.01) -"RTN","ut",382,0) - Q -"RTN","ut",383,0) - ; -"RTN","ut",384,0) -GUISET(%utRSLT,XTSET) ; Entry point for GUI start with selected Test Set IEN - called by %ut-TEST GROUP LOAD rpc -"RTN","ut",385,0) - N %utROU,%utLIST,%ut -"RTN","ut",386,0) - D SETUT -"RTN","ut",387,0) - S %ut("RSLT")=$NA(^TMP("MUNIT-%utRSLT",$J)) K @%ut("RSLT") -"RTN","ut",388,0) - D GETSET(XTSET,.%utROU,.%utLIST) -"RTN","ut",389,0) - D GETLIST(.%utROU,%utLIST,%ut("RSLT")) -"RTN","ut",390,0) - S @%ut("RSLT")@(1)=(@%ut("RSLT")@(1))_"^1" ; 110719 mark as new version -"RTN","ut",391,0) - S %utRSLT=%ut("RSLT") -"RTN","ut",392,0) - Q -"RTN","ut",393,0) - ; -"RTN","ut",394,0) -GUILOAD(%utRSLT,%utROUN) ; Entry point for GUI start with %utROUN containing primary routine name - called by %ut-TEST LOAD rpc -"RTN","ut",395,0) - N %utROU,%ut -"RTN","ut",396,0) - D SETUT -"RTN","ut",397,0) - S %ut("RSLT")=$NA(^TMP("MUNIT-%utRSLT",$J)) K @%ut("RSLT") -"RTN","ut",398,0) - S %utROU(1)=%utROUN -"RTN","ut",399,0) - D GETLIST(.%utROU,1,%ut("RSLT")) -"RTN","ut",400,0) - S @%ut("RSLT")@(1)=(@%ut("RSLT")@(1))_"^1" ; 110719 mark as new version -"RTN","ut",401,0) - S %utRSLT=%ut("RSLT") -"RTN","ut",402,0) - Q -"RTN","ut",403,0) - ; -"RTN","ut",404,0) -GETLIST(%utROU,%utLIST,%utRSLT) ; called from GUISET, GUILOAD -"RTN","ut",405,0) - N I,%utROUL,%utROUN,%ut,XTCOMNT,XTVALUE,%utCNT -"RTN","ut",406,0) - S XTVALUE=$NA(^TMP("GUI-MUNIT",$J)) K @XTVALUE -"RTN","ut",407,0) - S %utCNT=0,XTCOMNT="" -"RTN","ut",408,0) - D GETTREE^%ut1(.%utROU,%utLIST) -"RTN","ut",409,0) - F I=1:1 Q:'$D(%utROU(I)) S %utROUL(%utROU(I))="" -"RTN","ut",410,0) - S %utROUN="" F S %utROUN=$O(%utROUL(%utROUN)) Q:%utROUN="" D LOAD(%utROUN,.%utCNT,XTVALUE,XTCOMNT,.%utROUL) -"RTN","ut",411,0) - M @%utRSLT=@XTVALUE -"RTN","ut",412,0) - K @%utRSLT@("SHUTDOWN") -"RTN","ut",413,0) - K @%utRSLT@("STARTUP") -"RTN","ut",414,0) - S @XTVALUE@("LASTROU")="" ; Use this to keep track of place in routines -"RTN","ut",415,0) - Q -"RTN","ut",416,0) - ; -"RTN","ut",417,0) - ; generate list of unit test routines, entry points and comments on test for entry point -"RTN","ut",418,0) -LOAD(%utROUN,%utNCNT,XTVALUE,XTCOMNT,%utROUL) ; called from GETLIST, and recursively from LOAD -"RTN","ut",419,0) - I $T(@("^"_%utROUN))="" S %utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_"^^*** ERROR - ROUTINE NAME NOT FOUND" Q -"RTN","ut",420,0) - S %utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_U_U_XTCOMNT -"RTN","ut",421,0) - ;N %utI,XTX1,XTX2,LINE -"RTN","ut",422,0) - N %utI,XTX1,XTX2,LINE,LIST,I -"RTN","ut",423,0) - ; 100622 JLI added code to identify STARTUP and TEARDOWN -"RTN","ut",424,0) - I $T(@("STARTUP^"_%utROUN))'="",'$D(@XTVALUE@("STARTUP")) S @XTVALUE@("STARTUP")="STARTUP^"_%utROUN -"RTN","ut",425,0) - I $T(@("SHUTDOWN^"_%utROUN))'="",'$D(@XTVALUE@("SHUTDOWN")) S @XTVALUE@("SHUTDOWN")="SHUTDOWN^"_%utROUN -"RTN","ut",426,0) - ; JLI 140731 handle @TEST identified test tags -"RTN","ut",427,0) - D NEWSTYLE^%ut1(.LIST,%utROUN) -"RTN","ut",428,0) - F I=1:1:LIST S %utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_U_LIST(I) -"RTN","ut",429,0) - ; JLI 140731 end of @TEST addition -"RTN","ut",430,0) - F %utI=1:1 S LINE=$T(@("XTENT+"_%utI_"^"_%utROUN)) S XTX1=$P(LINE,";",3) Q:XTX1="" S XTX2=$P(LINE,";",4),%utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_U_XTX1_U_XTX2 -"RTN","ut",431,0) - F %utI=1:1 S LINE=$T(@("XTROU+"_%utI_"^"_%utROUN)) S XTX1=$P(LINE,";",3) Q:XTX1="" S XTCOMNT=$P(LINE,";",4) I '$D(%utROUL(XTX1)) S %utROUL(XTX1)="" D LOAD(XTX1,.%utNCNT,XTVALUE,XTCOMNT,.%utROUL) -"RTN","ut",432,0) - Q -"RTN","ut",433,0) - ; -"RTN","ut",434,0) -GUINEXT(%utRSLT,%utLOC,XTGUISEP) ; Entry point for GUI execute next test - called by %ut-TEST NEXT rpc -"RTN","ut",435,0) - ; XTGUISEP - added 110719 to provide for changing separator for GUI -"RTN","ut",436,0) - ; return from ^ to another value ~~^~~ so that data returned -"RTN","ut",437,0) - ; is not affected by ^ values in the data - if not present -"RTN","ut",438,0) - ; sets value to default ^ -"RTN","ut",439,0) - N %utETRY,%utROUT,XTOLROU,XTVALUE,%utERR,%utGUI -"RTN","ut",440,0) - N %ut -"RTN","ut",441,0) - I $G(XTGUISEP)="" S XTGUISEP="^" -"RTN","ut",442,0) - D SETUT -"RTN","ut",443,0) - S %ut("LOC")=%utLOC -"RTN","ut",444,0) - S %ut("CURR")=0,%ut("ECNT")=0,%ut("FAIL")=0,%ut("CHK")=0,%ut("NENT")=0,%ut("ERRN")=0 -"RTN","ut",445,0) - S XTVALUE=$NA(^TMP("GUI-MUNIT",$J)) -"RTN","ut",446,0) - S %ut("RSLT")=$NA(^TMP("GUINEXT",$J)) K @%ut("RSLT") -"RTN","ut",447,0) - S %utRSLT=%ut("RSLT") -"RTN","ut",448,0) - S %utETRY=$P(%utLOC,U),%utROUT=$P(%utLOC,U,2),XTOLROU=$G(@XTVALUE@("LASTROU")) -"RTN","ut",449,0) - S %utGUI=1 -"RTN","ut",450,0) - S %ut("CHK")=0,%ut("CNT")=1,%utERR=0 -"RTN","ut",451,0) - ; I %utROUT'=XTOLROU D I %utROUT="" S @%utRSLT@(1)="" K @XTVALUE Q ;140731 JLI - commented out -"RTN","ut",452,0) - ;D I %utROUT="" S @%utRSLT@(1)="" K @XTVALUE Q ; 140731 JLI - replaced previous line - moves check for SHUTDOWN at end of processing -"RTN","ut",453,0) - D I %utROUT="" S @%utRSLT@(1)="" Q ; 140829 JLI - Have to leave XTVALUE intact, in case they simply run again for STARTUP, etc. -"RTN","ut",454,0) - . I XTOLROU="",$D(@XTVALUE@("STARTUP")) D -"RTN","ut",455,0) - . . S %ut("LOC")=@XTVALUE@("STARTUP") -"RTN","ut",456,0) - . . N $ETRAP S $ETRAP="D ERROR^%ut" -"RTN","ut",457,0) - . . D @(@XTVALUE@("STARTUP")) -"RTN","ut",458,0) +"RTN","ut",303,0) + S XTERMSG="NO VALUES INPUT TO CHKEQ^%ut - no evaluation possible" +"RTN","ut",304,0) + I '$D(%utGUI) D +"RTN","ut",305,0) + . D SETIO +"RTN","ut",306,0) + . W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " W XTERMSG,! D +"RTN","ut",307,0) + . . S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") +"RTN","ut",308,0) . . Q +"RTN","ut",309,0) + . D RESETIO +"RTN","ut",310,0) + . Q +"RTN","ut",311,0) + I $D(%utGUI) S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_XTERMSG,%ut("FAIL")=%ut("FAIL")+1 +"RTN","ut",312,0) + Q +"RTN","ut",313,0) + ; +"RTN","ut",314,0) +ERROR ; record errors +"RTN","ut",315,0) + ; ZEXCEPT: %utERRL,%utGUI,%utERR -CREATED IN SETUP, KILLED IN END +"RTN","ut",316,0) + ; ZEXCEPT: %ut -- NEWED ON ENTRY +"RTN","ut",317,0) + ; ZEXCEPT: XTGUISEP - newed in GUINEXT +"RTN","ut",318,0) + S %ut("CHK")=%ut("CHK")+1 +"RTN","ut",319,0) + I '$D(%utGUI) D ERROR1 +"RTN","ut",320,0) + I $D(%utGUI) D +"RTN","ut",321,0) + . S %ut("CNT")=%ut("CNT")+1 +"RTN","ut",322,0) + . S %utERR=%utERR+1 +"RTN","ut",323,0) + . S @%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"ERROR"_XTGUISEP_$S(+$SY=47:$ZS,1:$ZE) +"RTN","ut",324,0) + . Q +"RTN","ut",325,0) + S @($S(+$SY=47:"$ZS",1:"$ZE")_"="_""""""),$EC="" +"RTN","ut",326,0) + Q +"RTN","ut",327,0) + ; +"RTN","ut",328,0) +ERROR1 ; +"RTN","ut",329,0) + I $G(%ut("BREAK")) BREAK ; if we are asked to break upon error, please do so! +"RTN","ut",330,0) + ; ZEXCEPT: %utERRL -CREATED IN SETUP, KILLED IN END +"RTN","ut",331,0) + ; ZEXCEPT: %ut -- NEWED ON ENTRY +"RTN","ut",332,0) + D SETIO +"RTN","ut",333,0) + W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - Error: " W $S(+$SY=47:$ZS,1:$ZE),! D +"RTN","ut",334,0) + . S %ut("ERRN")=%ut("ERRN")+1,%utERRL(%ut("ERRN"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=$S(+$SY=47:$ZS,1:$ZE),%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") +"RTN","ut",335,0) + . Q +"RTN","ut",336,0) + D RESETIO +"RTN","ut",337,0) + Q +"RTN","ut",338,0) +SETIO ; Set M-Unit Device to write the results to... +"RTN","ut",339,0) + ; ZEXCEPT: %ut -- NEWED ON ENTRY +"RTN","ut",340,0) + I $IO'=%ut("IO") S (IO(0),%ut("DEV","OLD"))=$IO USE %ut("IO") SET IO=$IO +"RTN","ut",341,0) + QUIT +"RTN","ut",342,0) + ; +"RTN","ut",343,0) +RESETIO ; Reset $IO back to the original device if we changed it. +"RTN","ut",344,0) + ; ZEXCEPT: %ut -- NEWED ON ENTRY +"RTN","ut",345,0) + I $D(%ut("DEV","OLD")) S IO(0)=%ut("IO") U %ut("DEV","OLD") S IO=$IO K %ut("DEV","OLD") +"RTN","ut",346,0) + QUIT +"RTN","ut",347,0) + ; +"RTN","ut",348,0) +ISUTEST() ; .SUPPORTED API TO DETERMINE IF CURRENTLY IN UNIT TEST +"RTN","ut",349,0) + ; ZEXCEPT: %ut -- NEWED ON ENTRY +"RTN","ut",350,0) + Q $G(%ut)=1 +"RTN","ut",351,0) + ; +"RTN","ut",352,0) +PICKSET ; .OPT Interactive selection of MUnit Test Group +"RTN","ut",353,0) + N DIC,Y,%utROU,%utLIST,DIR S DIC=17.9001,DIC(0)="AEQM" D ^DIC Q:Y'>0 W ! D GETSET(+Y,.%utROU,.%utLIST) N DIC,Y,%ut D SETUT D EN1(.%utROU,%utLIST) S DIR(0)="EA",DIR("A")="Enter RETURN to continue:" D ^DIR K DIR +"RTN","ut",354,0) + Q +"RTN","ut",355,0) + ; +"RTN","ut",356,0) +RUNSET(SETNAME,VERBOSE) ; .SR Run with Specified Selection of MUnit Test Group +"RTN","ut",357,0) + N Y,%utROU,%utLIST,%utVERB +"RTN","ut",358,0) + Q:$G(SETNAME)="" +"RTN","ut",359,0) + S %utVERB=$G(VERBOSE,0) +"RTN","ut",360,0) + S Y=+$$FIND1^DIC(17.9001,"","X",SETNAME) Q:Y'>0 +"RTN","ut",361,0) + D GETSET(Y,.%utROU,.%utLIST) +"RTN","ut",362,0) + N Y,SETNAME,%ut +"RTN","ut",363,0) + D SETUT +"RTN","ut",364,0) + D EN1(.%utROU,%utLIST) +"RTN","ut",365,0) + Q +"RTN","ut",366,0) + ; +"RTN","ut",367,0) + ; DOSET CAN BE USED TO RUN A SET OF TESTS BASED ON THE IEN IN THE MUNIT TEST GROUP file (#17.9001) +"RTN","ut",368,0) +DOSET(IEN,%utVERB) ; 140731 JLI added %utVERB as a second argument +"RTN","ut",369,0) + ; IEN - Internal entry number for selected set of tests in the MUNIT TEST GROUP file (#17.9001) +"RTN","ut",370,0) + ; %utVERB - optional input that indicates verbose output is permitted +"RTN","ut",371,0) + ; +"RTN","ut",372,0) + N %utROU,%utLIST +"RTN","ut",373,0) + I '$D(%utVERB) S %utVERB=0 +"RTN","ut",374,0) + S %utLIST=0 +"RTN","ut",375,0) + D GETSET($G(IEN),.%utROU,.%utLIST) +"RTN","ut",376,0) + I %utLIST>0 N IEN,%ut D SETUT,EN1(.%utROU,%utLIST) +"RTN","ut",377,0) + Q +"RTN","ut",378,0) + ; +"RTN","ut",379,0) +GETSET(IEN,%utROU,%utLIST) ; JLI 140731 - called from PICKSET, RUNSET, DOSET, GUISET +"RTN","ut",380,0) + N IENS,%utROOT +"RTN","ut",381,0) + S IENS=IEN_"," D GETS^DIQ(17.9001,IENS,"1*","","%utROOT") +"RTN","ut",382,0) + S %utLIST=0,IENS="" F S IENS=$O(%utROOT(17.90011,IENS)) Q:IENS="" S %utLIST=%utLIST+1,%utROU(%utLIST)=%utROOT(17.90011,IENS,.01) +"RTN","ut",383,0) + Q +"RTN","ut",384,0) + ; +"RTN","ut",385,0) +COV(NMSP,COVCODE,VERBOSITY) ; simply make it callable from %ut1 as well (along with other APIs) JLI 150101 +"RTN","ut",386,0) + D COV^%ut1(NMSP,COVCODE,+$G(VERBOSITY)) ; see COV^%ut1 for description of arguments +"RTN","ut",387,0) + Q +"RTN","ut",388,0) + ; +"RTN","ut",389,0) +GUISET(%utRSLT,XTSET) ; Entry point for GUI start with selected Test Set IEN - called by %ut-TEST GROUP LOAD rpc +"RTN","ut",390,0) + N %utROU,%utLIST,%ut +"RTN","ut",391,0) + D SETUT +"RTN","ut",392,0) + S %ut("RSLT")=$NA(^TMP("MUNIT-%utRSLT",$J)) K @%ut("RSLT") +"RTN","ut",393,0) + D GETSET(XTSET,.%utROU,.%utLIST) +"RTN","ut",394,0) + D GETLIST(.%utROU,%utLIST,%ut("RSLT")) +"RTN","ut",395,0) + S @%ut("RSLT")@(1)=(@%ut("RSLT")@(1))_"^1" ; 110719 mark as new version +"RTN","ut",396,0) + S %utRSLT=%ut("RSLT") +"RTN","ut",397,0) + Q +"RTN","ut",398,0) + ; +"RTN","ut",399,0) +GUILOAD(%utRSLT,%utROUN) ; Entry point for GUI start with %utROUN containing primary routine name - called by %ut-TEST LOAD rpc +"RTN","ut",400,0) + N %utROU,%ut +"RTN","ut",401,0) + D SETUT +"RTN","ut",402,0) + S %ut("RSLT")=$NA(^TMP("MUNIT-%utRSLT",$J)) K @%ut("RSLT") +"RTN","ut",403,0) + S %utROU(1)=%utROUN +"RTN","ut",404,0) + D GETLIST(.%utROU,1,%ut("RSLT")) +"RTN","ut",405,0) + S @%ut("RSLT")@(1)=(@%ut("RSLT")@(1))_"^1" ; 110719 mark as new version +"RTN","ut",406,0) + S %utRSLT=%ut("RSLT") +"RTN","ut",407,0) + Q +"RTN","ut",408,0) + ; +"RTN","ut",409,0) +GETLIST(%utROU,%utLIST,%utRSLT) ; called from GUISET, GUILOAD +"RTN","ut",410,0) + N I,%utROUL,%utROUN,%ut,XTCOMNT,XTVALUE,%utCNT +"RTN","ut",411,0) + S XTVALUE=$NA(^TMP("GUI-MUNIT",$J)) K @XTVALUE +"RTN","ut",412,0) + S %utCNT=0,XTCOMNT="" +"RTN","ut",413,0) + D GETTREE^%ut1(.%utROU,%utLIST) +"RTN","ut",414,0) + F I=1:1 Q:'$D(%utROU(I)) S %utROUL(%utROU(I))="" +"RTN","ut",415,0) + S %utROUN="" F S %utROUN=$O(%utROUL(%utROUN)) Q:%utROUN="" D LOAD(%utROUN,.%utCNT,XTVALUE,XTCOMNT,.%utROUL) +"RTN","ut",416,0) + M @%utRSLT=@XTVALUE +"RTN","ut",417,0) + K @%utRSLT@("SHUTDOWN") +"RTN","ut",418,0) + K @%utRSLT@("STARTUP") +"RTN","ut",419,0) + S @XTVALUE@("LASTROU")="" ; Use this to keep track of place in routines +"RTN","ut",420,0) + Q +"RTN","ut",421,0) + ; +"RTN","ut",422,0) + ; generate list of unit test routines, entry points and comments on test for entry point +"RTN","ut",423,0) +LOAD(%utROUN,%utNCNT,XTVALUE,XTCOMNT,%utROUL) ; called from GETLIST, and recursively from LOAD +"RTN","ut",424,0) + I $T(@("^"_%utROUN))="" S %utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_"^^*** ERROR - ROUTINE NAME NOT FOUND" Q +"RTN","ut",425,0) + S %utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_U_U_XTCOMNT +"RTN","ut",426,0) + ;N %utI,XTX1,XTX2,LINE +"RTN","ut",427,0) + N %utI,XTX1,XTX2,LINE,LIST,I +"RTN","ut",428,0) + ; 100622 JLI added code to identify STARTUP and TEARDOWN +"RTN","ut",429,0) + I $T(@("STARTUP^"_%utROUN))'="",'$D(@XTVALUE@("STARTUP")) S @XTVALUE@("STARTUP")="STARTUP^"_%utROUN +"RTN","ut",430,0) + I $T(@("SHUTDOWN^"_%utROUN))'="",'$D(@XTVALUE@("SHUTDOWN")) S @XTVALUE@("SHUTDOWN")="SHUTDOWN^"_%utROUN +"RTN","ut",431,0) + ; JLI 140731 handle @TEST identified test tags +"RTN","ut",432,0) + D NEWSTYLE^%ut1(.LIST,%utROUN) +"RTN","ut",433,0) + F I=1:1:LIST S %utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_U_LIST(I) +"RTN","ut",434,0) + ; JLI 140731 end of @TEST addition +"RTN","ut",435,0) + F %utI=1:1 S LINE=$T(@("XTENT+"_%utI_"^"_%utROUN)) S XTX1=$P(LINE,";",3) Q:XTX1="" S XTX2=$P(LINE,";",4),%utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_U_XTX1_U_XTX2 +"RTN","ut",436,0) + F %utI=1:1 S LINE=$T(@("XTROU+"_%utI_"^"_%utROUN)) S XTX1=$P(LINE,";",3) Q:XTX1="" S XTCOMNT=$P(LINE,";",4) I '$D(%utROUL(XTX1)) S %utROUL(XTX1)="" D LOAD(XTX1,.%utNCNT,XTVALUE,XTCOMNT,.%utROUL) +"RTN","ut",437,0) + Q +"RTN","ut",438,0) + ; +"RTN","ut",439,0) +GUINEXT(%utRSLT,%utLOC,XTGUISEP) ; Entry point for GUI execute next test - called by %ut-TEST NEXT rpc +"RTN","ut",440,0) + ; XTGUISEP - added 110719 to provide for changing separator for GUI +"RTN","ut",441,0) + ; return from ^ to another value ~~^~~ so that data returned +"RTN","ut",442,0) + ; is not affected by ^ values in the data - if not present +"RTN","ut",443,0) + ; sets value to default ^ +"RTN","ut",444,0) + N %utETRY,%utROUT,XTOLROU,XTVALUE,%utERR,%utGUI +"RTN","ut",445,0) + N %ut +"RTN","ut",446,0) + I $G(XTGUISEP)="" S XTGUISEP="^" +"RTN","ut",447,0) + D SETUT +"RTN","ut",448,0) + S %ut("LOC")=%utLOC +"RTN","ut",449,0) + S %ut("CURR")=0,%ut("ECNT")=0,%ut("FAIL")=0,%ut("CHK")=0,%ut("NENT")=0,%ut("ERRN")=0 +"RTN","ut",450,0) + S XTVALUE=$NA(^TMP("GUI-MUNIT",$J)) +"RTN","ut",451,0) + S %ut("RSLT")=$NA(^TMP("GUINEXT",$J)) K @%ut("RSLT") +"RTN","ut",452,0) + S %utRSLT=%ut("RSLT") +"RTN","ut",453,0) + S %utETRY=$P(%utLOC,U),%utROUT=$P(%utLOC,U,2),XTOLROU=$G(@XTVALUE@("LASTROU")) +"RTN","ut",454,0) + S %utGUI=1 +"RTN","ut",455,0) + S %ut("CHK")=0,%ut("CNT")=1,%utERR=0 +"RTN","ut",456,0) + ; I %utROUT'=XTOLROU D I %utROUT="" S @%utRSLT@(1)="" K @XTVALUE Q ;140731 JLI - commented out +"RTN","ut",457,0) + ;D I %utROUT="" S @%utRSLT@(1)="" K @XTVALUE Q ; 140731 JLI - replaced previous line - moves check for SHUTDOWN at end of processing +"RTN","ut",458,0) + D I %utROUT="" S @%utRSLT@(1)="" Q ; 141018 JLI - Have to leave XTVALUE intact, in case they simply run again for STARTUP, etc. "RTN","ut",459,0) - . S @XTVALUE@("LASTROU")=%utROUT I %utROUT'="",$T(@("SETUP^"_%utROUT))'="" D + . I XTOLROU="",$D(@XTVALUE@("STARTUP")) D "RTN","ut",460,0) - . . S %ut("LOC")="SETUP^"_%utROUT + . . S %ut("LOC")=@XTVALUE@("STARTUP") "RTN","ut",461,0) . . N $ETRAP S $ETRAP="D ERROR^%ut" "RTN","ut",462,0) - . . D @("SETUP^"_%utROUT) + . . D @(@XTVALUE@("STARTUP")) "RTN","ut",463,0) . . Q "RTN","ut",464,0) - . I %utROUT="",$D(@XTVALUE@("SHUTDOWN")) D + . S @XTVALUE@("LASTROU")=%utROUT I %utROUT'="",$T(@("SETUP^"_%utROUT))'="" D "RTN","ut",465,0) - . . S %ut("LOC")=@XTVALUE@("SHUTDOWN") + . . S %ut("LOC")="SETUP^"_%utROUT "RTN","ut",466,0) . . N $ETRAP S $ETRAP="D ERROR^%ut" "RTN","ut",467,0) - . . D @(@XTVALUE@("SHUTDOWN")) + . . D @("SETUP^"_%utROUT) "RTN","ut",468,0) . . Q "RTN","ut",469,0) - . Q + . I %utROUT="",$D(@XTVALUE@("SHUTDOWN")) D "RTN","ut",470,0) - S %ut("LOC")=%utLOC + . . S %ut("LOC")=@XTVALUE@("SHUTDOWN") "RTN","ut",471,0) - S %ut("CHK")=0,%ut("CNT")=1,%utERR=0 + . . N $ETRAP S $ETRAP="D ERROR^%ut" "RTN","ut",472,0) - D ; to limit range of error trap so we continue through other tests + . . D @(@XTVALUE@("SHUTDOWN")) "RTN","ut",473,0) - . N $ETRAP S $ETRAP="D ERROR^%ut" + . . Q "RTN","ut",474,0) - . D @%ut("LOC") -"RTN","ut",475,0) . Q +"RTN","ut",475,0) + S %ut("LOC")=%utLOC "RTN","ut",476,0) - I $T(@("TEARDOWN^"_%utROUT))'="" D + S %ut("CHK")=0,%ut("CNT")=1,%utERR=0 "RTN","ut",477,0) - . S %ut("LOC")="TEARDOWN^"_%utROUT + D ; to limit range of error trap so we continue through other tests "RTN","ut",478,0) . N $ETRAP S $ETRAP="D ERROR^%ut" "RTN","ut",479,0) - . D @("TEARDOWN^"_%utROUT) + . D @%ut("LOC") "RTN","ut",480,0) . Q "RTN","ut",481,0) - S @%ut("RSLT")@(1)=%ut("CHK")_XTGUISEP_(%ut("CNT")-1-%utERR)_XTGUISEP_%utERR + I $T(@("TEARDOWN^"_%utROUT))'="" D "RTN","ut",482,0) - Q + . S %ut("LOC")="TEARDOWN^"_%utROUT "RTN","ut",483,0) - ; + . N $ETRAP S $ETRAP="D ERROR^%ut" "RTN","ut",484,0) -TESTCOVR ; entry under coverage analysis + . D @("TEARDOWN^"_%utROUT) "RTN","ut",485,0) - D ENTRY^%uttcovr ; does analysis while running various unit tests + . Q "RTN","ut",486,0) - Q + S @%ut("RSLT")@(1)=%ut("CHK")_XTGUISEP_(%ut("CNT")-1-%utERR)_XTGUISEP_%utERR "RTN","ut",487,0) + Q +"RTN","ut",488,0) ; "RTN","ut1") -0^2^B87092328 +0^2^B105832889 "RTN","ut1",1,0) -%ut1 ;VEN/SMH/JLI - CONTINUATION OF M-UNIT PROCESSING ;09/10/14 14:27 +%ut1 ;VEN/SMH/JLI - CONTINUATION OF M-UNIT PROCESSING ; 7/2/15 10:45pm "RTN","ut1",2,0) - ;;0.1;MASH UTILITIES; + ;;0.1;MASH UTILITIES;;;Build 5 "RTN","ut1",3,0) ; "RTN","ut1",4,0) @@ -1726,511 +1890,847 @@ TESTCOVR ; entry under coverage analysis "RTN","ut1",17,0) ; "RTN","ut1",18,0) - Q + D ^%utt6 ; runs unit tests from several perspectives "RTN","ut1",19,0) - ; + Q "RTN","ut1",20,0) -CHEKTEST(%utROU,%ut,%utUETRY) ; Collect Test list. + ; "RTN","ut1",21,0) - ; %utROU - input - Name of routine to check for tags with @TEST attribute +CHEKTEST(%utROU,%ut,%utUETRY) ; Collect Test list. "RTN","ut1",22,0) - ; %ut - input/output - passed by reference + ; %utROU - input - Name of routine to check for tags with @TEST attribute "RTN","ut1",23,0) - ; %utUETRY - input/output - passed by reference + ; %ut - input/output - passed by reference "RTN","ut1",24,0) - ; + ; %utUETRY - input/output - passed by reference "RTN","ut1",25,0) - ; Test list collected in two ways: + ; "RTN","ut1",26,0) - ; - @TEST on labellines + ; Test list collected in two ways: "RTN","ut1",27,0) - ; - Offsets of XTENT + ; - @TEST on labellines "RTN","ut1",28,0) - ; + ; - Offsets of XTENT "RTN","ut1",29,0) - S %ut("ENTN")=0 ; Number of test, sub to %utUETRY. + ; "RTN","ut1",30,0) - ; + S %ut("ENTN")=0 ; Number of test, sub to %utUETRY. "RTN","ut1",31,0) - ; This stanza and everything below is for collecting @TEST. -"RTN","ut1",32,0) - ; VEN/SMH - block refactored to use $TEXT instead of ^%ZOSF("LOAD") -"RTN","ut1",33,0) - N I,LIST -"RTN","ut1",34,0) - S I=$L($T(@(U_%utROU))) I I<0 Q "-1^Invalid Routine Name" -"RTN","ut1",35,0) - ; 140731 JLI - the following SMH code is replaced by the code below -"RTN","ut1",36,0) - ; Complexity galore: $TEXT loops through routine -"RTN","ut1",37,0) - ; IF tab or space isn't the first character ($C(9,32)) and line contains @TEST -"RTN","ut1",38,0) - ; Load that line as a testing entry point -"RTN","ut1",39,0) - ; F I=1:1 S LINE=$T(@("+"_I_U_%utROU)) Q:LINE="" I $C(9,32)'[$E(LINE),$$UP(LINE)["@TEST" D -"RTN","ut1",40,0) - ; . N TAGNAME,CHAR,NPAREN S TAGNAME="",NPAREN=0 -"RTN","ut1",41,0) - ; . F Q:LINE="" S CHAR=$E(LINE),LINE=$E(LINE,2,999) Q:CHAR="" Q:" ("[CHAR S TAGNAME=TAGNAME_CHAR -"RTN","ut1",42,0) - ; . ; should be no paren or arguments -"RTN","ut1",43,0) - ; . I CHAR="(" Q -"RTN","ut1",44,0) - ; . F Q:LINE="" S CHAR=$E(LINE) Q:" ;"'[CHAR S LINE=$E(LINE,2,999) -"RTN","ut1",45,0) - ; . I $$UP($E(LINE,1,5))="@TEST" S LINE=$E(LINE,6,999) D -"RTN","ut1",46,0) - ; . . S %ut("ENTN")=%ut("ENTN")+1,%utUETRY(%ut("ENTN"))=TAGNAME -"RTN","ut1",47,0) - ; . . F Q:LINE="" S CHAR=$E(LINE) Q:CHAR?1AN S LINE=$E(LINE,2,999) -"RTN","ut1",48,0) - ; . . S %utUETRY(%ut("ENTN"),"NAME")=LINE -"RTN","ut1",49,0) - ; JLI 140731 - end of code replaced by following code -"RTN","ut1",50,0) - ; JLI 140731 - the following code replaces the code above -"RTN","ut1",51,0) - D NEWSTYLE(.LIST,%utROU) -"RTN","ut1",52,0) - F I=1:1:LIST S %ut("ENTN")=%ut("ENTN")+1,%utUETRY(%ut("ENTN"))=$P(LIST(I),U),%utUETRY(%ut("ENTN"),"NAME")=$P(LIST(I),U,2,99) -"RTN","ut1",53,0) - ; JLI 140731 - end of replacement code -"RTN","ut1",54,0) ; +"RTN","ut1",32,0) + ; This stanza and everything below is for collecting @TEST. +"RTN","ut1",33,0) + ; VEN/SMH - block refactored to use $TEXT instead of ^%ZOSF("LOAD") +"RTN","ut1",34,0) + N I,LIST +"RTN","ut1",35,0) + S I=$L($T(@(U_%utROU))) I I<0 Q "-1^Invalid Routine Name" +"RTN","ut1",36,0) + ; 140731 JLI - the following SMH code is replaced by the code below +"RTN","ut1",37,0) + ; Complexity galore: $TEXT loops through routine +"RTN","ut1",38,0) + ; IF tab or space isn't the first character ($C(9,32)) and line contains @TEST +"RTN","ut1",39,0) + ; Load that line as a testing entry point +"RTN","ut1",40,0) + ; F I=1:1 S LINE=$T(@("+"_I_U_%utROU)) Q:LINE="" I $C(9,32)'[$E(LINE),$$UP(LINE)["@TEST" D +"RTN","ut1",41,0) + ; . N TAGNAME,CHAR,NPAREN S TAGNAME="",NPAREN=0 +"RTN","ut1",42,0) + ; . F Q:LINE="" S CHAR=$E(LINE),LINE=$E(LINE,2,999) Q:CHAR="" Q:" ("[CHAR S TAGNAME=TAGNAME_CHAR +"RTN","ut1",43,0) + ; . ; should be no paren or arguments +"RTN","ut1",44,0) + ; . I CHAR="(" Q +"RTN","ut1",45,0) + ; . F Q:LINE="" S CHAR=$E(LINE) Q:" ;"'[CHAR S LINE=$E(LINE,2,999) +"RTN","ut1",46,0) + ; . I $$UP($E(LINE,1,5))="@TEST" S LINE=$E(LINE,6,999) D +"RTN","ut1",47,0) + ; . . S %ut("ENTN")=%ut("ENTN")+1,%utUETRY(%ut("ENTN"))=TAGNAME +"RTN","ut1",48,0) + ; . . F Q:LINE="" S CHAR=$E(LINE) Q:CHAR?1AN S LINE=$E(LINE,2,999) +"RTN","ut1",49,0) + ; . . S %utUETRY(%ut("ENTN"),"NAME")=LINE +"RTN","ut1",50,0) + ; JLI 140731 - end of code replaced by following code +"RTN","ut1",51,0) + ; JLI 140731 - the following code replaces the code above +"RTN","ut1",52,0) + D NEWSTYLE(.LIST,%utROU) +"RTN","ut1",53,0) + F I=1:1:LIST S %ut("ENTN")=%ut("ENTN")+1,%utUETRY(%ut("ENTN"))=$P(LIST(I),U),%utUETRY(%ut("ENTN"),"NAME")=$P(LIST(I),U,2,99) +"RTN","ut1",54,0) + ; JLI 140731 - end of replacement code "RTN","ut1",55,0) ; "RTN","ut1",56,0) - ; This Stanza is to collect XTENT offsets + ; "RTN","ut1",57,0) - N %utUI F %utUI=1:1 S %ut("ELIN")=$T(@("XTENT+"_%utUI_"^"_%utROU)) Q:$P(%ut("ELIN"),";",3)="" D + ; This Stanza is to collect XTENT offsets "RTN","ut1",58,0) - . S %ut("ENTN")=%ut("ENTN")+1,%utUETRY(%ut("ENTN"))=$P(%ut("ELIN"),";",3),%utUETRY(%ut("ENTN"),"NAME")=$P(%ut("ELIN"),";",4) + N %utUI F %utUI=1:1 S %ut("ELIN")=$T(@("XTENT+"_%utUI_"^"_%utROU)) Q:$P(%ut("ELIN"),";",3)="" D "RTN","ut1",59,0) - . Q + . S %ut("ENTN")=%ut("ENTN")+1,%utUETRY(%ut("ENTN"))=$P(%ut("ELIN"),";",3),%utUETRY(%ut("ENTN"),"NAME")=$P(%ut("ELIN"),";",4) "RTN","ut1",60,0) - ; + . Q "RTN","ut1",61,0) - QUIT + ; "RTN","ut1",62,0) - ; + QUIT "RTN","ut1",63,0) - ; VEN/SMH 26JUL2013 - Moved GETTREE here. + ; "RTN","ut1",64,0) -GETTREE(%utROU,%utULIST) ; + ; VEN/SMH 26JUL2013 - Moved GETTREE here. "RTN","ut1",65,0) - ; first get any other routines this one references for running subsequently +GETTREE(%utROU,%utULIST) ; "RTN","ut1",66,0) - ; then any that they refer to as well + ; first get any other routines this one references for running subsequently "RTN","ut1",67,0) - ; this builds a tree of all routines referred to by any routine including each only once + ; then any that they refer to as well "RTN","ut1",68,0) - N %utUK,%utUI,%utUJ,%utURNAM,%utURLIN + ; this builds a tree of all routines referred to by any routine including each only once "RTN","ut1",69,0) - F %utUK=1:1 Q:'$D(%utROU(%utUK)) D + N %utUK,%utUI,%utUJ,%utURNAM,%utURLIN "RTN","ut1",70,0) - . F %utUI=1:1 S %utURLIN=$T(@("XTROU+"_%utUI_"^"_%utROU(%utUK))) S %utURNAM=$P(%utURLIN,";",3) Q:%utURNAM="" D + F %utUK=1:1 Q:'$D(%utROU(%utUK)) D "RTN","ut1",71,0) - . . F %utUJ=1:1:%utULIST I %utROU(%utUJ)=%utURNAM S %utURNAM="" Q + . F %utUI=1:1 S %utURLIN=$T(@("XTROU+"_%utUI_"^"_%utROU(%utUK))) S %utURNAM=$P(%utURLIN,";",3) Q:%utURNAM="" D "RTN","ut1",72,0) - . . I %utURNAM'="",$T(@("+1^"_%utURNAM))="" W:'$D(XWBOS) "Referenced routine ",%utURNAM," not found.",! Q + . . F %utUJ=1:1:%utULIST I %utROU(%utUJ)=%utURNAM S %utURNAM="" Q "RTN","ut1",73,0) - . . S:%utURNAM'="" %utULIST=%utULIST+1,%utROU(%utULIST)=%utURNAM + . . I %utURNAM'="",$T(@("+1^"_%utURNAM))="" W:'$D(XWBOS) "Referenced routine ",%utURNAM," not found.",! Q "RTN","ut1",74,0) - QUIT + . . S:%utURNAM'="" %utULIST=%utULIST+1,%utROU(%utULIST)=%utURNAM "RTN","ut1",75,0) - ; -"RTN","ut1",76,0) -NEWSTYLE(LIST,ROUNAME) ; JLI 140726 identify and return list of newstyle tags or entries for this routine -"RTN","ut1",77,0) - ; LIST - input, passed by reference - returns containing array with list of tags identified as tests -"RTN","ut1",78,0) - ; LIST indicates number of tags identified, LIST(n)=tag^test_info where tag is entry point for test -"RTN","ut1",79,0) - ; ROUNAME - input - routine name in which tests should be identified -"RTN","ut1",80,0) - ; -"RTN","ut1",81,0) - N I,VALUE,LINE -"RTN","ut1",82,0) - K LIST S LIST=0 -"RTN","ut1",83,0) - ; search routine by line for a tag and @TEST declaration -"RTN","ut1",84,0) - F I=1:1 S LINE=$T(@("+"_I_"^"_ROUNAME)) Q:LINE="" S VALUE=$$CHECKTAG(LINE) I VALUE'="" S LIST=LIST+1,LIST(LIST)=VALUE -"RTN","ut1",85,0) - Q -"RTN","ut1",86,0) - ; -"RTN","ut1",87,0) -CHECKTAG(LINE) ; JLI 140726 check line to determine @test TAG -"RTN","ut1",88,0) - ; LINE - input - Line of code to be checked -"RTN","ut1",89,0) - ; returns null line if not @TEST line, otherwise TAG^NOTE -"RTN","ut1",90,0) - N TAG,NOTE,CHAR -"RTN","ut1",91,0) - I $E(LINE)=" " Q "" ; test entry must have a tag -"RTN","ut1",92,0) - I $$UP(LINE)'["@TEST" Q "" ; must have @TEST declaration -"RTN","ut1",93,0) - I $P($$UP(LINE),"@TEST")["(" Q "" ; can't have an argument -"RTN","ut1",94,0) - S TAG=$P(LINE," "),LINE=$P(LINE," ",2,400),NOTE=$P($$UP(LINE),"@TEST"),LINE=$E(LINE,$L(NOTE)+5+1,$L(LINE)) -"RTN","ut1",95,0) - F Q:NOTE="" S CHAR=$E(NOTE),NOTE=$E(NOTE,2,$L(NOTE)) I " ;"'[CHAR Q ; -"RTN","ut1",96,0) - I $L(NOTE)'=0 Q "" ; @TEST must be first text on line -"RTN","ut1",97,0) - F Q:$E(LINE)'=" " S LINE=$E(LINE,2,$L(LINE)) ; remove leading spaces from test info -"RTN","ut1",98,0) - S TAG=TAG_U_LINE -"RTN","ut1",99,0) - Q TAG -"RTN","ut1",100,0) - ; -"RTN","ut1",101,0) - ; VEN/SMH 17DEC2013 - Remove dependence on VISTA - Uppercase here instead of XLFSTR. -"RTN","ut1",102,0) -UP(X) ; -"RTN","ut1",103,0) - Q $TR(X,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ") -"RTN","ut1",104,0) - ; -"RTN","ut1",105,0) -COV(NMSP,COVCODE,VERBOSITY) ; VEN/SMH - PUBLIC ENTRY POINT; Coverage calculations -"RTN","ut1",106,0) - ; NMSP: Namespace of the routines to analyze. End with * to include all routines. -"RTN","ut1",107,0) - ; Not using * will only include the routine with NMSP name. -"RTN","ut1",108,0) - ; e.g. PSOM* will include all routines starting with PSOM -"RTN","ut1",109,0) - ; PSOM will only include PSOM. -"RTN","ut1",110,0) - ; COVCODE: Mumps code to run over which coverage will be calculated. Typically Unit Tests. -"RTN","ut1",111,0) - ; VERBOSITY (optional): Scalar from -1 to 3. -"RTN","ut1",112,0) - ; - -1 = Global output in ^TMP("%utCOVREPORT",$J) -"RTN","ut1",113,0) - ; - 0 = Print only total coverage -"RTN","ut1",114,0) - ; - 1 = Break down by routine -"RTN","ut1",115,0) - ; - 2 = Break down by routine and tag -"RTN","ut1",116,0) - ; - 3 = Break down by routine and tag, and print lines that didn't execute for each tag. -"RTN","ut1",117,0) - ; -"RTN","ut1",118,0) - Q:'(+$SY=47) ; GT.M only! -"RTN","ut1",119,0) - ; -"RTN","ut1",120,0) - ; ZEXCEPT: CTRAP - not really a variable -"RTN","ut1",121,0) - S VERBOSITY=+$G(VERBOSITY) ; Get 0 if not passed. -"RTN","ut1",122,0) - N %ZR ; GT.M specific -"RTN","ut1",123,0) - D SILENT^%RSEL(NMSP,"SRC") ; GT.M specific. On Cache use $O(^$R(RTN)). -"RTN","ut1",124,0) - ; -"RTN","ut1",125,0) - N RN S RN="" -"RTN","ut1",126,0) - W "Loading routines to test coverage...",! -"RTN","ut1",127,0) - F S RN=$O(%ZR(RN)) Q:RN="" W RN," " D -"RTN","ut1",128,0) - . N L2 S L2=$T(+2^@RN) -"RTN","ut1",129,0) - . S L2=$TR(L2,$C(9,32)) ; Translate spaces and tabs out -"RTN","ut1",130,0) - . I $E(L2,1,2)'=";;" K %ZR(RN) ; Not a human produced routine -"RTN","ut1",131,0) - ; -"RTN","ut1",132,0) - N RTNS M RTNS=%ZR -"RTN","ut1",133,0) - K %ZR -"RTN","ut1",134,0) - ; -"RTN","ut1",135,0) - N GL -"RTN","ut1",136,0) - S GL=$NA(^TMP("%utCOVCOHORT",$J)) -"RTN","ut1",137,0) - K @GL -"RTN","ut1",138,0) - D RTNANAL(.RTNS,GL) -"RTN","ut1",139,0) - K ^TMP("%utCOVCOHORTSAV",$J) -"RTN","ut1",140,0) - M ^TMP("%utCOVCOHORTSAV",$J)=^TMP("%utCOVCOHORT",$J) -"RTN","ut1",141,0) - ; -"RTN","ut1",142,0) - ; -"RTN","ut1",143,0) - K ^TMP("%utCOVRESULT",$J) -"RTN","ut1",144,0) - VIEW "TRACE":1:$NA(^TMP("%utCOVRESULT",$J)) ; GT.M START PROFILING -"RTN","ut1",145,0) - DO ; Run the code, but keep our variables to ourselves. -"RTN","ut1",146,0) - . NEW $ETRAP,$ESTACK -"RTN","ut1",147,0) - . SET $ETRAP="Q:($ES&$Q) -9 Q:$ES W ""CTRL-C ENTERED""" -"RTN","ut1",148,0) - . USE $PRINCIPAL:(CTRAP=$C(3)) -"RTN","ut1",149,0) - . NEW (DUZ,IO,COVCODE,U,DILOCKTM,DISYS,DT,DTIME,IOBS,IOF,IOM,ION,IOS,IOSL,IOST,IOT,IOXY) -"RTN","ut1",150,0) - . XECUTE COVCODE -"RTN","ut1",151,0) - VIEW "TRACE":0:$NA(^TMP("%utCOVRESULT",$J)) ; GT.M STOP PROFILING -"RTN","ut1",152,0) - ; -"RTN","ut1",153,0) - D COVCOV($NA(^TMP("%utCOVCOHORT",$J)),$NA(^TMP("%utCOVRESULT",$J))) ; Venn diagram matching between globals -"RTN","ut1",154,0) - ; -"RTN","ut1",155,0) - ; Report -"RTN","ut1",156,0) - I VERBOSITY=-1 D -"RTN","ut1",157,0) - . K ^TMP("%utCOVREPORT",$J) -"RTN","ut1",158,0) - . D COVRPTGL($NA(^TMP("%utCOVCOHORTSAV",$J)),$NA(^TMP("%utCOVCOHORT",$J)),$NA(^TMP("%utCOVRESULT",$J)),$NA(^TMP("%utCOVREPORT",$J))) -"RTN","ut1",159,0) - E D COVRPT($NA(^TMP("%utCOVCOHORTSAV",$J)),$NA(^TMP("%utCOVCOHORT",$J)),$NA(^TMP("%utCOVRESULT",$J)),VERBOSITY) -"RTN","ut1",160,0) - ; -"RTN","ut1",161,0) QUIT -"RTN","ut1",162,0) +"RTN","ut1",76,0) ; +"RTN","ut1",77,0) +NEWSTYLE(LIST,ROUNAME) ; JLI 140726 identify and return list of newstyle tags or entries for this routine +"RTN","ut1",78,0) + ; LIST - input, passed by reference - returns containing array with list of tags identified as tests +"RTN","ut1",79,0) + ; LIST indicates number of tags identified, LIST(n)=tag^test_info where tag is entry point for test +"RTN","ut1",80,0) + ; ROUNAME - input - routine name in which tests should be identified +"RTN","ut1",81,0) + ; +"RTN","ut1",82,0) + N I,VALUE,LINE +"RTN","ut1",83,0) + K LIST S LIST=0 +"RTN","ut1",84,0) + ; search routine by line for a tag and @TEST declaration +"RTN","ut1",85,0) + F I=1:1 S LINE=$T(@("+"_I_"^"_ROUNAME)) Q:LINE="" S VALUE=$$CHECKTAG(LINE) I VALUE'="" S LIST=LIST+1,LIST(LIST)=VALUE +"RTN","ut1",86,0) + Q +"RTN","ut1",87,0) + ; +"RTN","ut1",88,0) +CHECKTAG(LINE) ; JLI 140726 check line to determine @test TAG +"RTN","ut1",89,0) + ; LINE - input - Line of code to be checked +"RTN","ut1",90,0) + ; returns null line if not @TEST line, otherwise TAG^NOTE +"RTN","ut1",91,0) + N TAG,NOTE,CHAR +"RTN","ut1",92,0) + I $E(LINE)=" " Q "" ; test entry must have a tag +"RTN","ut1",93,0) + I $$UP(LINE)'["@TEST" Q "" ; must have @TEST declaration +"RTN","ut1",94,0) + I $P($$UP(LINE),"@TEST")["(" Q "" ; can't have an argument +"RTN","ut1",95,0) + S TAG=$P(LINE," "),LINE=$P(LINE," ",2,400),NOTE=$P($$UP(LINE),"@TEST"),LINE=$E(LINE,$L(NOTE)+5+1,$L(LINE)) +"RTN","ut1",96,0) + F Q:NOTE="" S CHAR=$E(NOTE),NOTE=$E(NOTE,2,$L(NOTE)) I " ;"'[CHAR Q ; +"RTN","ut1",97,0) + I $L(NOTE)'=0 Q "" ; @TEST must be first text on line +"RTN","ut1",98,0) + F Q:$E(LINE)'=" " S LINE=$E(LINE,2,$L(LINE)) ; remove leading spaces from test info +"RTN","ut1",99,0) + S TAG=TAG_U_LINE +"RTN","ut1",100,0) + Q TAG +"RTN","ut1",101,0) + ; +"RTN","ut1",102,0) + ; VEN/SMH 17DEC2013 - Remove dependence on VISTA - Uppercase here instead of XLFSTR. +"RTN","ut1",103,0) +UP(X) ; +"RTN","ut1",104,0) + Q $TR(X,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ") +"RTN","ut1",105,0) + ; +"RTN","ut1",106,0) +COV(NMSP,COVCODE,VERBOSITY) ; VEN/SMH - PUBLIC ENTRY POINT; Coverage calculations +"RTN","ut1",107,0) + ; NMSP: Namespace of the routines to analyze. End with * to include all routines. +"RTN","ut1",108,0) + ; Not using * will only include the routine with NMSP name. +"RTN","ut1",109,0) + ; e.g. PSOM* will include all routines starting with PSOM +"RTN","ut1",110,0) + ; PSOM will only include PSOM. +"RTN","ut1",111,0) + ; COVCODE: Mumps code to run over which coverage will be calculated. Typically Unit Tests. +"RTN","ut1",112,0) + ; VERBOSITY (optional): Scalar from -1 to 3. +"RTN","ut1",113,0) + ; - -1 = Global output in ^TMP("%utCOVREPORT",$J) +"RTN","ut1",114,0) + ; - 0 = Print only total coverage +"RTN","ut1",115,0) + ; - 1 = Break down by routine +"RTN","ut1",116,0) + ; - 2 = Break down by routine and tag +"RTN","ut1",117,0) + ; - 3 = Break down by routine and tag, and print lines that didn't execute for each tag. +"RTN","ut1",118,0) + ; +"RTN","ut1",119,0) + ; ZEXCEPT: %utcovxx - SET and KILLED in this code at top level +"RTN","ut1",120,0) + Q:'(+$SY=47) ; GT.M only! +"RTN","ut1",121,0) + ; +"RTN","ut1",122,0) + ; ZEXCEPT: CTRAP - not really a variable +"RTN","ut1",123,0) + S VERBOSITY=+$G(VERBOSITY) ; Get 0 if not passed. +"RTN","ut1",124,0) + N %ZR ; GT.M specific +"RTN","ut1",125,0) + D SILENT^%RSEL(NMSP,"SRC") ; GT.M specific. On Cache use $O(^$R(RTN)). +"RTN","ut1",126,0) + ; +"RTN","ut1",127,0) + N RN S RN="" +"RTN","ut1",128,0) + W !,"Loading routines to test coverage...",! +"RTN","ut1",129,0) + F S RN=$O(%ZR(RN)) Q:RN="" W RN," " D +"RTN","ut1",130,0) + . N L2 S L2=$T(+2^@RN) +"RTN","ut1",131,0) + . S L2=$TR(L2,$C(9,32)) ; Translate spaces and tabs out +"RTN","ut1",132,0) + . I $E(L2,1,2)'=";;" K %ZR(RN) ; Not a human produced routine +"RTN","ut1",133,0) + ; +"RTN","ut1",134,0) + N RTNS M RTNS=%ZR +"RTN","ut1",135,0) + K %ZR +"RTN","ut1",136,0) + ; +"RTN","ut1",137,0) + N GL +"RTN","ut1",138,0) + S GL=$NA(^TMP("%utCOVCOHORT",$J)) +"RTN","ut1",139,0) + I '$D(^TMP("%utcovrunning",$J)) K @GL +"RTN","ut1",140,0) + D RTNANAL(.RTNS,GL) +"RTN","ut1",141,0) + I '$D(^TMP("%utcovrunning",$J)) D +"RTN","ut1",142,0) + . K ^TMP("%utCOVCOHORTSAV",$J) +"RTN","ut1",143,0) + . M ^TMP("%utCOVCOHORTSAV",$J)=^TMP("%utCOVCOHORT",$J) +"RTN","ut1",144,0) + . K ^TMP("%utCOVRESULT",$J) +"RTN","ut1",145,0) + . S ^TMP("%utcovrunning",$J)=1,%utcovxx=1 +"RTN","ut1",146,0) + . VIEW "TRACE":1:$NA(^TMP("%utCOVRESULT",$J)) ; GT.M START PROFILING +"RTN","ut1",147,0) + . Q +"RTN","ut1",148,0) + DO ; Run the code, but keep our variables to ourselves. +"RTN","ut1",149,0) + . NEW $ETRAP,$ESTACK +"RTN","ut1",150,0) + . SET $ETRAP="Q:($ES&$Q) -9 Q:$ES W ""CTRL-C ENTERED""" +"RTN","ut1",151,0) + . USE $PRINCIPAL:(CTRAP=$C(3)) +"RTN","ut1",152,0) + . NEW (DUZ,IO,COVCODE,U,DILOCKTM,DISYS,DT,DTIME,IOBS,IOF,IOM,ION,IOS,IOSL,IOST,IOT,IOXY) +"RTN","ut1",153,0) + . XECUTE COVCODE +"RTN","ut1",154,0) + . Q +"RTN","ut1",155,0) + ; GT.M STOP PROFILING if this is the original level that started it +"RTN","ut1",156,0) + I $D(^TMP("%utcovrunning",$J)),$D(%utcovxx) VIEW "TRACE":0:$NA(^TMP("%utCOVRESULT",$J)) K %utcovxx,^TMP("%utcovrunning",$J) +"RTN","ut1",157,0) + ; +"RTN","ut1",158,0) + I '$D(^TMP("%utcovrunning",$J)) D +"RTN","ut1",159,0) + . D COVCOV($NA(^TMP("%utCOVCOHORT",$J)),$NA(^TMP("%utCOVRESULT",$J))) ; Venn diagram matching between globals +"RTN","ut1",160,0) + . ; Report +"RTN","ut1",161,0) + . I VERBOSITY=-1 D +"RTN","ut1",162,0) + . . K ^TMP("%utCOVREPORT",$J) "RTN","ut1",163,0) -RTNANAL(RTNS,GL) ; [Private] - Routine Analysis + . . D COVRPTGL($NA(^TMP("%utCOVCOHORTSAV",$J)),$NA(^TMP("%utCOVCOHORT",$J)),$NA(^TMP("%utCOVRESULT",$J)),$NA(^TMP("%utCOVREPORT",$J))) "RTN","ut1",164,0) - ; Create a global similar to the trace global produced by GT.M in GL + . . Q "RTN","ut1",165,0) - ; Only non-comment lines are stored. + . E D COVRPT($NA(^TMP("%utCOVCOHORTSAV",$J)),$NA(^TMP("%utCOVCOHORT",$J)),$NA(^TMP("%utCOVRESULT",$J)),VERBOSITY) "RTN","ut1",166,0) - ; A tag is always stored. Tag,0 is stored only if there is code on the tag line (format list or actual code). + . Q "RTN","ut1",167,0) - ; tags by themselves don't count toward the total. + QUIT "RTN","ut1",168,0) ; "RTN","ut1",169,0) - N RTN S RTN="" +RTNANAL(RTNS,GL) ; [Private] - Routine Analysis "RTN","ut1",170,0) - F S RTN=$O(RTNS(RTN)) Q:RTN="" D ; for each routine + ; Create a global similar to the trace global produced by GT.M in GL "RTN","ut1",171,0) - . N TAG + ; Only non-comment lines are stored. "RTN","ut1",172,0) - . S TAG=RTN ; start the tags at the first + ; A tag is always stored. Tag,0 is stored only if there is code on the tag line (format list or actual code). "RTN","ut1",173,0) - . N I,LN F I=2:1 S LN=$T(@TAG+I^@RTN) Q:LN="" D ; for each line, starting with the 3rd line (2 off the first tag) + ; tags by themselves don't count toward the total. "RTN","ut1",174,0) - . . I $E(LN)?1A D QUIT ; formal line + ; "RTN","ut1",175,0) - . . . N T ; Terminator + N RTN S RTN="" "RTN","ut1",176,0) - . . . N J F J=1:1:$L(LN) S T=$E(LN,J) Q:T'?1AN ; Loop to... + F S RTN=$O(RTNS(RTN)) Q:RTN="" D ; for each routine "RTN","ut1",177,0) - . . . S TAG=$E(LN,1,J-1) ; Get tag + . N TAG "RTN","ut1",178,0) - . . . S @GL@(RTN,TAG)=TAG ; store line + . S TAG=RTN ; start the tags at the first "RTN","ut1",179,0) - . . . I T="(" S @GL@(RTN,TAG,0)=LN ; formal list + . N I,LN F I=2:1 S LN=$T(@TAG+I^@RTN) Q:LN="" D ; for each line, starting with the 3rd line (2 off the first tag) "RTN","ut1",180,0) - . . . E D ; No formal list + . . I $E(LN)?1A D QUIT ; formal line "RTN","ut1",181,0) - . . . . N LNTR S LNTR=$P(LN,TAG,2,999),LNTR=$TR(LNTR,$C(9,32)) ; Get rest of line, Remove spaces and tabs + . . . N T ; Terminator "RTN","ut1",182,0) - . . . . I $E(LNTR)=";" QUIT ; Comment + . . . N J F J=1:1:$L(LN) S T=$E(LN,J) Q:T'?1AN ; Loop to... "RTN","ut1",183,0) - . . . . S @GL@(RTN,TAG,0)=LN ; Otherwise, store for testing + . . . S TAG=$E(LN,1,J-1) ; Get tag "RTN","ut1",184,0) - . . . S I=0 ; Start offsets from zero (first one at the for will be 1) + . . . S @GL@(RTN,TAG)=TAG ; store line "RTN","ut1",185,0) - . . I $C(32,9)[$E(LN) D QUIT ; Regular line + . . . I T="(" S @GL@(RTN,TAG,0)=LN ; formal list "RTN","ut1",186,0) - . . . N LNTR S LNTR=$TR(LN,$C(32,9)) ; Remove all spaces and tabs + . . . E D ; No formal list "RTN","ut1",187,0) - . . . I $E(LNTR)=";" QUIT ; Comment line -- don't want. + . . . . N LNTR S LNTR=$P(LN,TAG,2,999),LNTR=$TR(LNTR,$C(9,32)) ; Get rest of line, Remove spaces and tabs "RTN","ut1",188,0) - . . . S @GL@(RTN,TAG,I)=LN ; Record line + . . . . I $E(LNTR)=";" QUIT ; Comment "RTN","ut1",189,0) - QUIT + . . . . S @GL@(RTN,TAG,0)=LN ; Otherwise, store for testing "RTN","ut1",190,0) - ; + . . . S I=0 ; Start offsets from zero (first one at the for will be 1) "RTN","ut1",191,0) -ACTLINES(GL) ; [Private] $$ ; Count active lines + . . I $C(32,9)[$E(LN) D QUIT ; Regular line "RTN","ut1",192,0) - ; + . . . N LNTR S LNTR=$TR(LN,$C(32,9,46)) ; Remove all spaces and tabs - JLI 150202 remove periods as well "RTN","ut1",193,0) - N CNT S CNT=0 + . . . I $E(LNTR)=";" QUIT ; Comment line -- don't want. "RTN","ut1",194,0) - N REF S REF=GL + . . . S @GL@(RTN,TAG,I)=LN ; Record line "RTN","ut1",195,0) - N GLQL S GLQL=$QL(GL) + QUIT "RTN","ut1",196,0) - F S REF=$Q(@REF) Q:REF="" Q:(GL'=$NA(@REF,GLQL)) D + ; "RTN","ut1",197,0) - . N REFQL S REFQL=$QL(REF) +ACTLINES(GL) ; [Private] $$ ; Count active lines "RTN","ut1",198,0) - . N LASTSUB S LASTSUB=$QS(REF,REFQL) + ; "RTN","ut1",199,0) - . I LASTSUB?1.N S CNT=CNT+1 + N CNT S CNT=0 "RTN","ut1",200,0) - QUIT CNT + N REF S REF=GL "RTN","ut1",201,0) - ; + N GLQL S GLQL=$QL(GL) "RTN","ut1",202,0) -COVCOV(C,R) ; [Private] - Analyze coverage Cohort vs Result + F S REF=$Q(@REF) Q:REF="" Q:(GL'=$NA(@REF,GLQL)) D "RTN","ut1",203,0) - N RTN S RTN="" + . N REFQL S REFQL=$QL(REF) "RTN","ut1",204,0) - F S RTN=$O(@C@(RTN)) Q:RTN="" D ; For each routine in cohort set + . N LASTSUB S LASTSUB=$QS(REF,REFQL) "RTN","ut1",205,0) - . I '$D(@R@(RTN)) QUIT ; Not present in result set + . I LASTSUB?1.N S CNT=CNT+1 "RTN","ut1",206,0) - . N TAG S TAG="" + QUIT CNT "RTN","ut1",207,0) - . F S TAG=$O(@R@(RTN,TAG)) Q:TAG="" D ; For each tag in the routine in the result set + ; "RTN","ut1",208,0) - . . N LN S LN="" +COVCOV(C,R) ; [Private] - Analyze coverage Cohort vs Result "RTN","ut1",209,0) - . . F S LN=$O(@R@(RTN,TAG,LN)) Q:LN="" D ; for each line in the tag in the routine in the result set -"RTN","ut1",210,0) - . . . I $D(@C@(RTN,TAG,LN)) K ^(LN) ; if present in cohort, kill off -"RTN","ut1",211,0) - QUIT -"RTN","ut1",212,0) - ; -"RTN","ut1",213,0) -COVRPT(C,S,R,V) ; [Private] - Coverage Report -"RTN","ut1",214,0) - ; C = COHORT - Global name -"RTN","ut1",215,0) - ; S = SURVIVORS - Global name -"RTN","ut1",216,0) - ; R = RESULT - Global name -"RTN","ut1",217,0) - ; V = Verbosity - Scalar from -1 to 3 -"RTN","ut1",218,0) - N ORIGLINES S ORIGLINES=$$ACTLINES(C) -"RTN","ut1",219,0) - N LEFTLINES S LEFTLINES=$$ACTLINES(S) -"RTN","ut1",220,0) - W !! -"RTN","ut1",221,0) - W "ORIG: "_ORIGLINES,! -"RTN","ut1",222,0) - W "LEFT: "_LEFTLINES,! -"RTN","ut1",223,0) - W "COVERAGE PERCENTAGE: "_$S(ORIGLINES:$J(ORIGLINES-LEFTLINES/ORIGLINES*100,"",2),1:100.00),! -"RTN","ut1",224,0) - W !! -"RTN","ut1",225,0) - W "BY ROUTINE:",! -"RTN","ut1",226,0) - I V=0 QUIT ; No verbosity. Don't print routine detail -"RTN","ut1",227,0) N RTN S RTN="" -"RTN","ut1",228,0) - F S RTN=$O(@C@(RTN)) Q:RTN="" D -"RTN","ut1",229,0) - . N O S O=$$ACTLINES($NA(@C@(RTN))) -"RTN","ut1",230,0) - . N L S L=$$ACTLINES($NA(@S@(RTN))) -"RTN","ut1",231,0) - . W ?3,RTN,?21,$S(O:$J(O-L/O*100,"",2),1:"100.00"),! -"RTN","ut1",232,0) - . I V=1 QUIT ; Just print the routine coverage for V=1 -"RTN","ut1",233,0) +"RTN","ut1",210,0) + F S RTN=$O(@C@(RTN)) Q:RTN="" D ; For each routine in cohort set +"RTN","ut1",211,0) + . I '$D(@R@(RTN)) QUIT ; Not present in result set +"RTN","ut1",212,0) . N TAG S TAG="" -"RTN","ut1",234,0) - . F S TAG=$O(@C@(RTN,TAG)) Q:TAG="" D -"RTN","ut1",235,0) - . . N O S O=$$ACTLINES($NA(@C@(RTN,TAG))) -"RTN","ut1",236,0) - . . N L S L=$$ACTLINES($NA(@S@(RTN,TAG))) -"RTN","ut1",237,0) - . . W ?5,TAG,?21,$S(O:$J(O-L/O*100,"",2),1:"100.00"),! -"RTN","ut1",238,0) - . . I V=2 QUIT ; Just print routine/tags coverage for V=2; V=3 print uncovered lines -"RTN","ut1",239,0) +"RTN","ut1",213,0) + . F S TAG=$O(@R@(RTN,TAG)) Q:TAG="" D ; For each tag in the routine in the result set +"RTN","ut1",214,0) . . N LN S LN="" -"RTN","ut1",240,0) - . . F S LN=$O(@S@(RTN,TAG,LN)) Q:LN="" W TAG_"+"_LN_": "_^(LN),! -"RTN","ut1",241,0) +"RTN","ut1",215,0) + . . F S LN=$O(@R@(RTN,TAG,LN)) Q:LN="" D ; for each line in the tag in the routine in the result set +"RTN","ut1",216,0) + . . . I $D(@C@(RTN,TAG,LN)) K ^(LN) ; if present in cohort, kill off +"RTN","ut1",217,0) QUIT -"RTN","ut1",242,0) +"RTN","ut1",218,0) ; -"RTN","ut1",243,0) -COVRPTGL(C,S,R,OUT) ; [Private] - Coverage Global for silent invokers -"RTN","ut1",244,0) +"RTN","ut1",219,0) +COVRPT(C,S,R,V) ; [Private] - Coverage Report +"RTN","ut1",220,0) ; C = COHORT - Global name -"RTN","ut1",245,0) +"RTN","ut1",221,0) ; S = SURVIVORS - Global name -"RTN","ut1",246,0) +"RTN","ut1",222,0) ; R = RESULT - Global name -"RTN","ut1",247,0) - ; OUT = OUTPUT - Global name -"RTN","ut1",248,0) - ; -"RTN","ut1",249,0) - N O S O=$$ACTLINES(C) -"RTN","ut1",250,0) - N L S L=$$ACTLINES(S) -"RTN","ut1",251,0) - S @OUT=(O-L)_"/"_O -"RTN","ut1",252,0) - N RTN,TAG,LN S (RTN,TAG,LN)="" -"RTN","ut1",253,0) - F S RTN=$O(@C@(RTN)) Q:RTN="" D -"RTN","ut1",254,0) - . N O S O=$$ACTLINES($NA(@C@(RTN))) -"RTN","ut1",255,0) - . N L S L=$$ACTLINES($NA(@S@(RTN))) -"RTN","ut1",256,0) - . S @OUT@(RTN)=(O-L)_"/"_O -"RTN","ut1",257,0) - . F S TAG=$O(@C@(RTN,TAG)) Q:TAG="" D -"RTN","ut1",258,0) - . . N O S O=$$ACTLINES($NA(@C@(RTN,TAG))) -"RTN","ut1",259,0) - . . N L S L=$$ACTLINES($NA(@S@(RTN,TAG))) -"RTN","ut1",260,0) - . . S @OUT@(RTN,TAG)=(O-L)_"/"_O -"RTN","ut1",261,0) - . . F S LN=$O(@S@(RTN,TAG,LN)) Q:LN="" S @OUT@(RTN,TAG,LN)=@S@(RTN,TAG,LN) -"RTN","ut1",262,0) - QUIT -"RTN","ut1",263,0) - ; -"RTN","ut1",264,0) -TESTCOVR ; entry under coverage analysis -"RTN","ut1",265,0) - D ENTRY^%uttcovr ; does analysis while running various unit tests -"RTN","ut1",266,0) +"RTN","ut1",223,0) + ; V = Verbosity - Scalar from -1 to 3 +"RTN","ut1",224,0) + ; JLI 150702 - modified to be able to do unit tests on setting up the text via COVRPTLS +"RTN","ut1",225,0) + N X +"RTN","ut1",226,0) + S X=$NA(^TMP("%ut1-covrpt",$J)) K @X +"RTN","ut1",227,0) + D COVRPTLS(C,S,R,V,X) +"RTN","ut1",228,0) + F I=1:1 Q:'$D(@X@(I)) W !,@X@(I) +"RTN","ut1",229,0) + K @X +"RTN","ut1",230,0) Q -"RTN","ut1",267,0) +"RTN","ut1",231,0) ; +"RTN","ut1",232,0) +COVRPTLS(C,S,R,V,X) ; +"RTN","ut1",233,0) + ; +"RTN","ut1",234,0) + N LINNUM S LINNUM=0 +"RTN","ut1",235,0) + N ORIGLINES S ORIGLINES=$$ACTLINES(C) +"RTN","ut1",236,0) + N LEFTLINES S LEFTLINES=$$ACTLINES(S) +"RTN","ut1",237,0) + ;W !! +"RTN","ut1",238,0) + S LINNUM=LINNUM+1,@X@(LINNUM)="",LINNUM=LINNUM+1,@X@(LINNUM)="" +"RTN","ut1",239,0) + ;W "ORIG: "_ORIGLINES,! +"RTN","ut1",240,0) + S LINNUM=LINNUM+1,@X@(LINNUM)="ORIG: "_ORIGLINES +"RTN","ut1",241,0) + ;W "LEFT: "_LEFTLINES,! +"RTN","ut1",242,0) + S LINNUM=LINNUM+1,@X@(LINNUM)="LEFT: "_LEFTLINES +"RTN","ut1",243,0) + ;W "COVERAGE PERCENTAGE: "_$S(ORIGLINES:$J(ORIGLINES-LEFTLINES/ORIGLINES*100,"",2),1:100.00),! +"RTN","ut1",244,0) + S LINNUM=LINNUM+1,@X@(LINNUM)="COVERAGE PERCENTAGE: "_$S(ORIGLINES:$J(ORIGLINES-LEFTLINES/ORIGLINES*100,"",2),1:100.00) +"RTN","ut1",245,0) + ;W !! +"RTN","ut1",246,0) + S LINNUM=LINNUM+1,@X@(LINNUM)="",LINNUM=LINNUM+1,@X@(LINNUM)="" +"RTN","ut1",247,0) + ;W "BY ROUTINE:",! +"RTN","ut1",248,0) + S LINNUM=LINNUM+1,@X@(LINNUM)="BY ROUTINE:" +"RTN","ut1",249,0) + I V=0 QUIT ; No verbosity. Don't print routine detail +"RTN","ut1",250,0) + N RTN S RTN="" +"RTN","ut1",251,0) + F S RTN=$O(@C@(RTN)) Q:RTN="" D +"RTN","ut1",252,0) + . N O S O=$$ACTLINES($NA(@C@(RTN))) +"RTN","ut1",253,0) + . N L S L=$$ACTLINES($NA(@S@(RTN))) +"RTN","ut1",254,0) + . ;W ?3,RTN,?21,$S(O:$J(O-L/O*100,"",2),1:"100.00"),! +"RTN","ut1",255,0) + . N XX S XX=" "_RTN_" ",XX=$E(XX,1,20) +"RTN","ut1",256,0) + . S LINNUM=LINNUM+1,@X@(LINNUM)=XX+$S(O:$J(O-L/O*100,"",2),1:"100.00") +"RTN","ut1",257,0) + . I V=1 QUIT ; Just print the routine coverage for V=1 +"RTN","ut1",258,0) + . N TAG S TAG="" +"RTN","ut1",259,0) + . F S TAG=$O(@C@(RTN,TAG)) Q:TAG="" D +"RTN","ut1",260,0) + . . N O S O=$$ACTLINES($NA(@C@(RTN,TAG))) +"RTN","ut1",261,0) + . . N L S L=$$ACTLINES($NA(@S@(RTN,TAG))) +"RTN","ut1",262,0) + . . ;W ?5,TAG,?21,$S(O:$J(O-L/O*100,"",2),1:"100.00"),! +"RTN","ut1",263,0) + . . S XX=" "_TAG_" ",XX=$E(XX,1,20) +"RTN","ut1",264,0) + . . S LINNUM=LINNUM+1,@X@(LINNUM)=XX_$S(O:$J(O-L/O*100,"",2),1:"100.00") +"RTN","ut1",265,0) + . . I V=2 QUIT ; Just print routine/tags coverage for V=2; V=3 print uncovered lines +"RTN","ut1",266,0) + . . N LN S LN="" +"RTN","ut1",267,0) + . . ;F S LN=$O(@S@(RTN,TAG,LN)) Q:LN="" W TAG_"+"_LN_": "_^(LN),! +"RTN","ut1",268,0) + . . F S LN=$O(@S@(RTN,TAG,LN)) Q:LN="" S LINNUM=LINNUM+1,@X@(LINNUM)=TAG_"+"_LN_": "_^(LN) +"RTN","ut1",269,0) + . . Q +"RTN","ut1",270,0) + . Q +"RTN","ut1",271,0) + QUIT +"RTN","ut1",272,0) + ; +"RTN","ut1",273,0) +COVRPTGL(C,S,R,OUT) ; [Private] - Coverage Global for silent invokers +"RTN","ut1",274,0) + ; C = COHORT - Global name +"RTN","ut1",275,0) + ; S = SURVIVORS - Global name +"RTN","ut1",276,0) + ; R = RESULT - Global name +"RTN","ut1",277,0) + ; OUT = OUTPUT - Global name +"RTN","ut1",278,0) + ; +"RTN","ut1",279,0) + N O S O=$$ACTLINES(C) +"RTN","ut1",280,0) + N L S L=$$ACTLINES(S) +"RTN","ut1",281,0) + S @OUT=(O-L)_"/"_O +"RTN","ut1",282,0) + N RTN,TAG,LN S (RTN,TAG,LN)="" +"RTN","ut1",283,0) + F S RTN=$O(@C@(RTN)) Q:RTN="" D +"RTN","ut1",284,0) + . N O S O=$$ACTLINES($NA(@C@(RTN))) +"RTN","ut1",285,0) + . N L S L=$$ACTLINES($NA(@S@(RTN))) +"RTN","ut1",286,0) + . S @OUT@(RTN)=(O-L)_"/"_O +"RTN","ut1",287,0) + . F S TAG=$O(@C@(RTN,TAG)) Q:TAG="" D +"RTN","ut1",288,0) + . . N O S O=$$ACTLINES($NA(@C@(RTN,TAG))) +"RTN","ut1",289,0) + . . N L S L=$$ACTLINES($NA(@S@(RTN,TAG))) +"RTN","ut1",290,0) + . . S @OUT@(RTN,TAG)=(O-L)_"/"_O +"RTN","ut1",291,0) + . . F S LN=$O(@S@(RTN,TAG,LN)) Q:LN="" S @OUT@(RTN,TAG,LN)=@S@(RTN,TAG,LN) +"RTN","ut1",292,0) + QUIT +"RTN","ut1",293,0) + ; +"RTN","utcover") +0^10^B63651128 +"RTN","utcover",1,0) +%utcover ;JLI - generic coverage and unit test runner ; 7/3/15 2:54am +"RTN","utcover",2,0) + ;;0.1;MASH UTILITIES;;;Build 5 +"RTN","utcover",3,0) + ; +"RTN","utcover",4,0) + Q +"RTN","utcover",5,0) + ; +"RTN","utcover",6,0) +TESTONLY(TESTROUS) ; RUN TESTS FOR SPECIFIED ROUTINES +"RTN","utcover",7,0) + ; input TESTROUS - passed by reference - array of routine names to run tests for +"RTN","utcover",8,0) + ; specify those to be called directly by including ^ as part of +"RTN","utcover",9,0) + ; TAG^ROUTINE or ^ROUTINE. +"RTN","utcover",10,0) + ; ROUTINE names without a ^ will be called as EN^%ut("ROUTINE") +"RTN","utcover",11,0) + ; Sometimes to get complete coverage, different entry points may +"RTN","utcover",12,0) + ; need to be called (e.g., at top and for VERBOSE), these should each +"RTN","utcover",13,0) + ; be included. +"RTN","utcover",14,0) + ; If the subscript is a number, it will take the list of comma separated +"RTN","utcover",15,0) + ; values as the routines. If the the subscript is not a number, it will +"RTN","utcover",16,0) + ; take it as a routine to be added to the list, then if the value of the +"RTN","utcover",17,0) + ; contains a comma separated list of routines, they will be added as well. +"RTN","utcover",18,0) + ; Thus a value of +"RTN","utcover",19,0) + ; TESTROUS(1)="A^ROU1,^ROU1,^ROU2,ROU3" +"RTN","utcover",20,0) + ; or a value of +"RTN","utcover",21,0) + ; TESTROUS("A^ROU1")="^ROU1,^ROU2,ROU3" +"RTN","utcover",22,0) + ; will both result in tests for +"RTN","utcover",23,0) + ; D A^ROU1,^ROU1,^ROU2,EN^%ut("ROU3") +"RTN","utcover",24,0) + K ^TMP("%utCOVER",$J,"TESTROUS") +"RTN","utcover",25,0) + M ^TMP("%utCOVER",$J,"TESTROUS")=TESTROUS +"RTN","utcover",26,0) + ; +"RTN","utcover",27,0) +COVENTRY ; setup of COVERAGE NEWs most variables, so TESTROUS passed by global +"RTN","utcover",28,0) + ; +"RTN","utcover",29,0) + N I,ROU,VAL,VALS,UTDATA,TESTS,TESTROUS +"RTN","utcover",30,0) + M TESTROUS=^TMP("%utCOVER",$J,"TESTROUS") +"RTN","utcover",31,0) + S ROU="" F S ROU=$O(TESTROUS(ROU)) Q:ROU="" D +"RTN","utcover",32,0) + . I ROU'=+ROU S TESTS(ROU)="" +"RTN","utcover",33,0) + . F I=1:1 S VAL=$P(TESTROUS(ROU),",",I) Q:VAL="" S TESTS(VAL)="" +"RTN","utcover",34,0) + . Q +"RTN","utcover",35,0) + S ROU="" F S ROU=$O(TESTS(ROU)) Q:ROU="" D +"RTN","utcover",36,0) + . W !!,"RUNNING ",ROU +"RTN","utcover",37,0) + . I ROU[U D @ROU +"RTN","utcover",38,0) + . I ROU'[U D @("EN^%ut("""_ROU_""")") +"RTN","utcover",39,0) + . S VALS=$G(^TMP("%ut",$J,"UTVALS")) I VALS="" Q +"RTN","utcover",40,0) + . F I=1:1 S VAL=$P(VALS,U,I) Q:VAL="" S UTDATA(I)=$G(UTDATA(I))+VAL +"RTN","utcover",41,0) + . K ^TMP("%ut",$J) +"RTN","utcover",42,0) + . Q +"RTN","utcover",43,0) + I $D(UTDATA) D +"RTN","utcover",44,0) + . W !!!,"------------ SUMMARY ------------" +"RTN","utcover",45,0) + . W !,"Ran ",UTDATA(1)," Routine",$S(UTDATA(1)>1:"s",1:""),", ",UTDATA(2)," Entry Tag",$S(UTDATA(2)>1:"s",1:"") +"RTN","utcover",46,0) + . W !,"Checked ",UTDATA(3)," test",$S(UTDATA(3)>1:"s",1:""),", with ",UTDATA(4)," failure",$S(UTDATA(4)'=1:"s",1:"")," and encountered ",UTDATA(5)," error",$S(UTDATA(5)'=1:"s",1:""),"." +"RTN","utcover",47,0) + . Q +"RTN","utcover",48,0) + Q +"RTN","utcover",49,0) + ; +"RTN","utcover",50,0) +COVERAGE(ROUNMSP,TESTROUS,XCLDROUS,RESLTLVL) ; run coverage analysis +"RTN","utcover",51,0) + ; input ROUNMSP - Namespace for routine(s) to be analyzed +"RTN","utcover",52,0) + ; ROUNAME will result in only the routine ROUNAME being analyzed +"RTN","utcover",53,0) + ; ROUN* will result in all routines beginning with ROUN being analyzed +"RTN","utcover",54,0) + ; input TESTROUS - passed by reference - see TESTROUS description for JUSTTEST +"RTN","utcover",55,0) + ; input XCLDROUS - passed by reference - routines passed in a manner similar to TESTROUS, +"RTN","utcover",56,0) + ; but only the routine names, whether as arguments or a comma separated +"RTN","utcover",57,0) + ; list of routines, will be excluded from the analysis of coverage. These +"RTN","utcover",58,0) + ; would normally be names of routines which are only for unit tests, or +"RTN","utcover",59,0) + ; others which should not be included in the analysis for some reason. +"RTN","utcover",60,0) + ; input RESLTLVL - This value determines the amount of information to be generated for the +"RTN","utcover",61,0) + ; analysis. A missing or null value will be considered to be level 1 +"RTN","utcover",62,0) + ; 1 - Listing of analysis only for routine overall +"RTN","utcover",63,0) + ; 2 - Listing of analysis for routine overall and for each TAG +"RTN","utcover",64,0) + ; 3 - Full analysis for each tag, and lists out those lines which were +"RTN","utcover",65,0) + ; not executed during the analysis +"RTN","utcover",66,0) + ; +"RTN","utcover",67,0) + N I,ROU,TYPE,VAL,XCLUDE +"RTN","utcover",68,0) + S RESLTLVL=$G(RESLTLVL,1) +"RTN","utcover",69,0) + I (RESLTLVL<1) S RESLTLVL=1 +"RTN","utcover",70,0) + I (RESLTLVL>3) S RESLTLVL=3 +"RTN","utcover",71,0) + M ^TMP("%utCOVER",$J,"TESTROUS")=TESTROUS ; +"RTN","utcover",72,0) + D COV^%ut1(ROUNMSP,"D COVENTRY^%utCOVER",-1) +"RTN","utcover",73,0) + K ^TMP("%utCOVER",$J,"TESTROUS") +"RTN","utcover",74,0) + S ROU="" F S ROU=$O(XCLDROUS(ROU)) Q:ROU="" D +"RTN","utcover",75,0) + . I ROU'=+ROU S XCLUDE(ROU)="" +"RTN","utcover",76,0) + . F I=1:1 S VAL=$P(XCLDROUS(ROU),",",I) Q:VAL="" S XCLUDE(VAL)="" +"RTN","utcover",77,0) + . Q +"RTN","utcover",78,0) + N TEXTGLOB S TEXTGLOB=$NA(^TMP("%utcover-text",$J)) +"RTN","utcover",79,0) + D LIST(.XCLUDE,RESLTLVL,TEXTGLOB) +"RTN","utcover",80,0) + F I=1:1 Q:'$D(@TEXTGLOB@(I)) W !,@TEXTGLOB@(I) +"RTN","utcover",81,0) + K @TEXTGLOB +"RTN","utcover",82,0) + Q +"RTN","utcover",83,0) + ; +"RTN","utcover",84,0) +LIST(XCLDROUS,TYPE,TEXTGLOB,GLOB) ; +"RTN","utcover",85,0) + ; ZEXCEPT: TYPE1 - NEWed and set below for recursion +"RTN","utcover",86,0) + ; input - ROULIST - a comma separated list of routine names that will +"RTN","utcover",87,0) + ; be used to identify desired routines. Any name +"RTN","utcover",88,0) + ; that begins with one of the specified values will +"RTN","utcover",89,0) + ; be included +"RTN","utcover",90,0) + ; input - TYPE - value indicating amount of detail desired +"RTN","utcover",91,0) + ; 3=full with listing of untouched lines +"RTN","utcover",92,0) + ; 2=moderated with listing by tags +"RTN","utcover",93,0) + ; 1=summary with listing by routine +"RTN","utcover",94,0) + ; input - TEXTGLOB - closed global location in which text is returned +"RTN","utcover",95,0) + ; input - GLOB - used for unit tests - specifies global to work with +"RTN","utcover",96,0) + ; so that coverage data is not impacted +"RTN","utcover",97,0) + ; +"RTN","utcover",98,0) + N CURRCOV,CURRLIN,LINCOV,LINE,LINTOT,ROULIST,ROUNAME,TAG,TOTCOV,TOTLIN,XVAL,LINNUM +"RTN","utcover",99,0) + ; +"RTN","utcover",100,0) + I '$D(GLOB) N GLOB S GLOB=$NA(^TMP("%utCOVREPORT",$J)) +"RTN","utcover",101,0) + D TRIMDATA(.XCLDROUS,GLOB) ; remove undesired routines from data +"RTN","utcover",102,0) + ; +"RTN","utcover",103,0) + N JOB,NAME,BASE +"RTN","utcover",104,0) + S TOTCOV=0,TOTLIN=0,LINNUM=0 +"RTN","utcover",105,0) + ; F NAME="%utCOVREPORT","%utCOVRESULT","%utCOVCOHORT","%utCOVCOHORTSAV" D +"RTN","utcover",106,0) + I TYPE>1 S ROUNAME="" F S ROUNAME=$O(@GLOB@(ROUNAME)) Q:ROUNAME="" S XVAL=^(ROUNAME) D +"RTN","utcover",107,0) + . S CURRCOV=$P(XVAL,"/"),CURRLIN=$P(XVAL,"/",2) +"RTN","utcover",108,0) + . S LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)="",LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)="" +"RTN","utcover",109,0) + . S LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)="Routine "_ROUNAME_" "_CURRCOV_" out of "_CURRLIN_" lines covered"_$S(CURRLIN>0:" ("_$P((100*CURRCOV)/CURRLIN,".")_"%)",1:"") +"RTN","utcover",110,0) + . I TYPE=2 S LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)=" - Summary" +"RTN","utcover",111,0) + . S TAG="" F S TAG=$O(@GLOB@(ROUNAME,TAG)) Q:TAG="" S XVAL=^(TAG) D +"RTN","utcover",112,0) + . . S LINCOV=$P(XVAL,"/"),LINTOT=$P(XVAL,"/",2) +"RTN","utcover",113,0) + . . S LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)=" Tag "_TAG_"^"_ROUNAME_" "_LINCOV_" out of "_LINTOT_" lines covered" +"RTN","utcover",114,0) + . . I TYPE=2 Q +"RTN","utcover",115,0) + . . I LINCOV=LINTOT Q +"RTN","utcover",116,0) + . . S LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)=" the following is a list of lines NOT covered" +"RTN","utcover",117,0) + . . S LINE="" F S LINE=$O(@GLOB@(ROUNAME,TAG,LINE)) Q:LINE="" D +"RTN","utcover",118,0) + . . . I LINE=0 S LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)=" "_TAG_" "_@GLOB@(ROUNAME,TAG,LINE) Q +"RTN","utcover",119,0) + . . . S LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)=" "_TAG_"+"_LINE_" "_@GLOB@(ROUNAME,TAG,LINE) +"RTN","utcover",120,0) + . . . Q +"RTN","utcover",121,0) + . . Q +"RTN","utcover",122,0) + . Q +"RTN","utcover",123,0) + ; for type=3 generate a summary at bottom after detail +"RTN","utcover",124,0) + I TYPE=3 N TYPE1 S TYPE1=2 D LIST(.XCLDROUS,2,TEXTGLOB,GLOB) K TYPE1 +"RTN","utcover",125,0) + I TYPE=2,$G(TYPE1) Q ; CAME IN FROM ABOVE LINE +"RTN","utcover",126,0) + ; summarize by just routine name +"RTN","utcover",127,0) + S LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)="",LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)="" +"RTN","utcover",128,0) + S ROUNAME="" F S ROUNAME=$O(@GLOB@(ROUNAME)) Q:ROUNAME="" S XVAL=^(ROUNAME) D +"RTN","utcover",129,0) + . S CURRCOV=$P(XVAL,"/"),CURRLIN=$P(XVAL,"/",2) +"RTN","utcover",130,0) + . S TOTCOV=TOTCOV+CURRCOV,TOTLIN=TOTLIN+CURRLIN +"RTN","utcover",131,0) + . S LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)="Routine "_ROUNAME_" "_CURRCOV_" out of "_CURRLIN_" lines covered"_$S(CURRLIN>0:" ("_$P((100*CURRCOV)/CURRLIN,".")_"%)",1:"") +"RTN","utcover",132,0) + . Q +"RTN","utcover",133,0) + S LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)="",LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)="" +"RTN","utcover",134,0) + S LINNUM=LINNUM+1,@TEXTGLOB@(LINNUM)="Overall Analysis "_TOTCOV_" out of "_TOTLIN_" lines covered"_$S(TOTLIN>0:" ("_$P((100*TOTCOV)/TOTLIN,".")_"% coverage)",1:"") +"RTN","utcover",135,0) + Q +"RTN","utcover",136,0) + ; +"RTN","utcover",137,0) +TRIMDATA(ROULIST,GLOB) ; +"RTN","utcover",138,0) + N ROUNAME +"RTN","utcover",139,0) + S ROUNAME="" F S ROUNAME=$O(ROULIST(ROUNAME)) Q:ROUNAME="" K @GLOB@(ROUNAME) +"RTN","utcover",140,0) + Q +"RTN","utcover",141,0) + ; "RTN","utt1") -0^3^B25860592 +0^3^B26409996 "RTN","utt1",1,0) %utt1 ; VEN/SMH - Testing routines for M-Unit;08/29/14 11:35 "RTN","utt1",2,0) - ;;0.1;MASH UTILITIES; + ;;0.1;MASH UTILITIES;;;Build 5 "RTN","utt1",3,0) %utNITT ; VEN/SMH - Testing routines for M-Unit;2014-04-01 2:04 PM "RTN","utt1",4,0) @@ -2527,12 +3027,14 @@ XTROU ; Routines containing additional tests ;;%utt5; "RTN","utt1",150,0) ;;%utt6; +"RTN","utt1",151,0) + ;;%uttcovr;coverage related tests "RTN","utt2") 0^4^B473823 "RTN","utt2",1,0) %utt2 ; VEN/SMH - Bad Ass Continuation of Unit Tests;08/04/14 09:12 "RTN","utt2",2,0) - ;;0.1;MASH UTILITIES; + ;;0.1;MASH UTILITIES;;;Build 5 "RTN","utt2",3,0) XTMUNITU ; VEN/SMH - Bad Ass Continuation of Unit Tests;2014-04-01 1:03 PM "RTN","utt2",4,0) @@ -2558,7 +3060,7 @@ XTENT ; "RTN","utt3",1,0) %utt3 ; VEN/SMH - Unit Tests Coverage Tests;08/14/14 14:02 "RTN","utt3",2,0) - ;;0.1;MASH UTILITIES; + ;;0.1;MASH UTILITIES;;;Build 5 "RTN","utt3",3,0) XTMUNITV ; VEN/SMH - Unit Tests Coverage Tests;2014-04-16 7:14 PM "RTN","utt3",4,0) @@ -2646,7 +3148,7 @@ INTERNAL(A) ; Counts "RTN","utt4",1,0) %utt4 ; VEN/SMH - Coverage Test Runner;08/23/14 08:33 "RTN","utt4",2,0) - ;;0.1;MASH UTILITIES; + ;;0.1;MASH UTILITIES;;;Build 5 "RTN","utt4",3,0) XTMUNITW ; VEN/SMH - Coverage Test Runner;2014-04-17 3:30 PM "RTN","utt4",4,0) @@ -2690,7 +3192,7 @@ MAIN ; @TEST - Test coverage calculations "RTN","utt5",1,0) %utt5 ;JLI - test for aspects of MUnit functionality ;08/29/14 11:23 "RTN","utt5",2,0) - ;;0.1;MASH UTILITIES; + ;;0.1;MASH UTILITIES;;;Build 5 "RTN","utt5",3,0) Q "RTN","utt5",4,0) @@ -2958,11 +3460,11 @@ XTENT ; "RTN","utt5",135,0) ;;ISUTEST;check ISUTEST inside unit test "RTN","utt6") -0^8^B29243478 +0^8^B30140551 "RTN","utt6",1,0) %utt6 ;JLI - Unit tests for MUnit functionality ;08/29/14 11:43 "RTN","utt6",2,0) - ;;0.1;MASH UTILITIES; + ;;0.1;MASH UTILITIES;;;Build 5 "RTN","utt6",3,0) ; "RTN","utt6",4,0) @@ -3078,117 +3580,123 @@ VERBOSE ; "RTN","utt6",59,0) ; "RTN","utt6",60,0) - ; now run the unit tests in this routine + W !!,"NOW RUNNING UNIT TESTS FOR %uttcovr",!! "RTN","utt6",61,0) - W !!,"NOW RUNNING UNIT TESTS FOR %utt6",!! + D EN^%ut("%uttcovr",VERBOSE) "RTN","utt6",62,0) - D EN^%ut("%utt6",VERBOSE) + ; "RTN","utt6",63,0) - K ^TMP("%utt5",$J),^TMP("%utt5_C",$J),^TMP("%utt5_G",$J),^TMP("%utt6",$J),^TMP("%utt6_GUISET",$J) + ; now run the unit tests in this routine "RTN","utt6",64,0) - ; clean up after GUI calls as well + W !!,"NOW RUNNING UNIT TESTS FOR %utt6",!! "RTN","utt6",65,0) - K ^TMP("GUI-MUNIT",$J),^TMP("GUINEXT",$J),^TMP("MUNIT-%utRSLT",$J) + D EN^%ut("%utt6",VERBOSE) "RTN","utt6",66,0) - Q + K ^TMP("%utt5",$J),^TMP("%utt5_C",$J),^TMP("%utt5_G",$J),^TMP("%utt6",$J),^TMP("%utt6_GUISET",$J) "RTN","utt6",67,0) - ; + ; clean up after GUI calls as well "RTN","utt6",68,0) - ; + K ^TMP("GUI-MUNIT",$J),^TMP("GUINEXT",$J),^TMP("MUNIT-%utRSLT",$J) "RTN","utt6",69,0) - ; WARNING -- WARNING -- WARNING + Q "RTN","utt6",70,0) - ; If the number of NEW STYLE tests in %utt5 is increased (it is currently 1), then the following + ; "RTN","utt6",71,0) - ; test will need to be updated to reflect the change(s) + ; "RTN","utt6",72,0) - ; END OF WARNING -- END OF WARNING -- END OF WARNING + ; WARNING -- WARNING -- WARNING "RTN","utt6",73,0) - ; + ; If the number of NEW STYLE tests in %utt5 is increased (it is currently 1), then the following "RTN","utt6",74,0) -NEWSTYLE ; tests return of valid new style or @TEST indicators + ; test will need to be updated to reflect the change(s) "RTN","utt6",75,0) - N LIST + ; END OF WARNING -- END OF WARNING -- END OF WARNING "RTN","utt6",76,0) - D NEWSTYLE^%ut1(.LIST,"%utt5") + ; "RTN","utt6",77,0) - D CHKEQ^%ut(LIST,1,"Returned an incorrect number ("_LIST_") of New Style indicators - should be one") +NEWSTYLE ; tests return of valid new style or @TEST indicators "RTN","utt6",78,0) - I LIST>0 D CHKEQ^%ut(LIST(1),"NEWSTYLE^identify new style test indicator functionality","Returned incorrect TAG^reason "_LIST(1)) + N LIST "RTN","utt6",79,0) - I LIST>0 D CHKEQ^%ut($G(LIST(2)),"","Returned a value for LIST(2) - should not have any value (i.e., null)") + D NEWSTYLE^%ut1(.LIST,"%utt5") "RTN","utt6",80,0) - Q + D CHKEQ^%ut(LIST,1,"Returned an incorrect number ("_LIST_") of New Style indicators - should be one") "RTN","utt6",81,0) - ; + I LIST>0 D CHKEQ^%ut(LIST(1),"NEWSTYLE^identify new style test indicator functionality","Returned incorrect TAG^reason "_LIST(1)) "RTN","utt6",82,0) -CKGUISET ; + I LIST>0 D CHKEQ^%ut($G(LIST(2)),"","Returned a value for LIST(2) - should not have any value (i.e., null)") "RTN","utt6",83,0) - ; ZEXCEPT: %utt6var - if present, is NEWed and created in code following VERBOSE + Q "RTN","utt6",84,0) - I '$D(%utt6var) Q + ; "RTN","utt6",85,0) - N MAX +CKGUISET ; "RTN","utt6",86,0) - S MAX=$O(^TMP("%utt6_GUISET",$J,""),-1) + ; ZEXCEPT: %utt6var - if present, is NEWed and created in code following VERBOSE "RTN","utt6",87,0) - D CHKTF^%ut(^TMP("%utt6_GUISET",$J,MAX)["%utt6^NEWSTYLE","GUISET returned incorrect list") + I '$D(%utt6var) Q "RTN","utt6",88,0) - Q + N MAX "RTN","utt6",89,0) - ; + S MAX=$O(^TMP("%utt6_GUISET",$J,""),-1) "RTN","utt6",90,0) -CHKCMDLN ; check command line processing of %utt5 + D CHKTF^%ut(^TMP("%utt6_GUISET",$J,MAX)["%utt6^NEWSTYLE","GUISET returned incorrect list") "RTN","utt6",91,0) - ; ZEXCEPT: JLIEXPCT,%utt6var - if present NEWed and created in code following VERBOSE tag + Q "RTN","utt6",92,0) - I '$D(%utt6var) Q + ; "RTN","utt6",93,0) - D CHKTF^%ut($D(^TMP("%utt5_C",$J,JLIEXPCT))=10,"Not enough entries in %utt5 expected "_JLIEXPCT) +CHKCMDLN ; check command line processing of %utt5 "RTN","utt6",94,0) - D CHKTF^%ut($D(^TMP("%utt5_C",$J,JLIEXPCT+1))=0,"Too many entries in %utt5 expected "_JLIEXPCT) -"RTN","utt6",95,0) - D CHKTF^%ut($O(^TMP("%utt5_C",$J,1,""))="STARTUP","Incorrect function for entry 1,'"_$O(^TMP("%utt5_C",$J,1,""))_"' should be 'STARTUP'") -"RTN","utt6",96,0) - D CHKTF^%ut($O(^TMP("%utt5_C",$J,JLIEXPCT,""))="SHUTDOWN","Incorrect function for entry "_JLIEXPCT_", '"_$O(^TMP("%utt5_C",$J,JLIEXPCT,""))_"' should be 'SHUTDOWN'") -"RTN","utt6",97,0) - Q -"RTN","utt6",98,0) - ; -"RTN","utt6",99,0) -CHKGUI ; check GUI processing of %utt5 -"RTN","utt6",100,0) ; ZEXCEPT: JLIEXPCT,%utt6var - if present NEWed and created in code following VERBOSE tag -"RTN","utt6",101,0) +"RTN","utt6",95,0) I '$D(%utt6var) Q -"RTN","utt6",102,0) - D CHKTF^%ut($D(^TMP("%utt5_G",$J,JLIEXPCT))=10,"Not enough entries in %utt5 expected "_JLIEXPCT) -"RTN","utt6",103,0) - D CHKTF^%ut($D(^TMP("%utt5_G",$J,JLIEXPCT+1))=0,"Too many entries in %utt5 expected "_JLIEXPCT) -"RTN","utt6",104,0) - D CHKTF^%ut($O(^TMP("%utt5_G",$J,1,""))="STARTUP","Incorrect function for entry 1,'"_$O(^TMP("%utt5Z_G",1,""))_"' should be 'STARTUP'") -"RTN","utt6",105,0) - D CHKTF^%ut($O(^TMP("%utt5_G",$J,JLIEXPCT,""))="SHUTDOWN","Incorrect function for entry "_JLIEXPCT_", '"_$O(^TMP("%utt5_G",$J,JLIEXPCT,""))_"' should be 'SHUTDOWN'") -"RTN","utt6",106,0) +"RTN","utt6",96,0) + D CHKTF^%ut($D(^TMP("%utt5_C",$J,JLIEXPCT))=10,"Not enough entries in %utt5 expected "_JLIEXPCT) +"RTN","utt6",97,0) + D CHKTF^%ut($D(^TMP("%utt5_C",$J,JLIEXPCT+1))=0,"Too many entries in %utt5 expected "_JLIEXPCT) +"RTN","utt6",98,0) + D CHKTF^%ut($O(^TMP("%utt5_C",$J,1,""))="STARTUP","Incorrect function for entry 1,'"_$O(^TMP("%utt5_C",$J,1,""))_"' should be 'STARTUP'") +"RTN","utt6",99,0) + D CHKTF^%ut($O(^TMP("%utt5_C",$J,JLIEXPCT,""))="SHUTDOWN","Incorrect function for entry "_JLIEXPCT_", '"_$O(^TMP("%utt5_C",$J,JLIEXPCT,""))_"' should be 'SHUTDOWN'") +"RTN","utt6",100,0) Q -"RTN","utt6",107,0) +"RTN","utt6",101,0) ; +"RTN","utt6",102,0) +CHKGUI ; check GUI processing of %utt5 +"RTN","utt6",103,0) + ; ZEXCEPT: JLIEXPCT,%utt6var - if present NEWed and created in code following VERBOSE tag +"RTN","utt6",104,0) + I '$D(%utt6var) Q +"RTN","utt6",105,0) + D CHKTF^%ut($D(^TMP("%utt5_G",$J,JLIEXPCT))=10,"Not enough entries in %utt5 expected "_JLIEXPCT) +"RTN","utt6",106,0) + D CHKTF^%ut($D(^TMP("%utt5_G",$J,JLIEXPCT+1))=0,"Too many entries in %utt5 expected "_JLIEXPCT) +"RTN","utt6",107,0) + D CHKTF^%ut($O(^TMP("%utt5_G",$J,1,""))="STARTUP","Incorrect function for entry 1,'"_$O(^TMP("%utt5Z_G",1,""))_"' should be 'STARTUP'") "RTN","utt6",108,0) -XTENT ; + D CHKTF^%ut($O(^TMP("%utt5_G",$J,JLIEXPCT,""))="SHUTDOWN","Incorrect function for entry "_JLIEXPCT_", '"_$O(^TMP("%utt5_G",$J,JLIEXPCT,""))_"' should be 'SHUTDOWN'") "RTN","utt6",109,0) - ;;CHKCMDLN;check command line processing of %utt5 + Q "RTN","utt6",110,0) - ;;CHKGUI;check GUI processing of %utt5 + ; "RTN","utt6",111,0) - ;;CKGUISET;check list of tests returned by GUISET +XTENT ; "RTN","utt6",112,0) + ;;CHKCMDLN;check command line processing of %utt5 +"RTN","utt6",113,0) + ;;CHKGUI;check GUI processing of %utt5 +"RTN","utt6",114,0) + ;;CKGUISET;check list of tests returned by GUISET +"RTN","utt6",115,0) ;;NEWSTYLE;test return of valid new style or @TEST indicators "RTN","uttcovr") -0^9^B2835727 +0^9^B88235384 "RTN","uttcovr",1,0) -%uttcovr ;JLI/JIVEYSOFT - runs coverage tests on %ut and %ut1 routines via unit tests ;09/10/14 14:34 +uttcovr ;JLI/JIVEYSOFT - runs coverage tests on %ut and %ut1 routines via unit tests ; 7/3/15 12:39pm "RTN","uttcovr",2,0) - ;;0.1;MASH UTILITIES; + ;;0.1;MASH UTILITIES;;;Build 5 "RTN","uttcovr",3,0) ; "RTN","uttcovr",4,0) @@ -3196,87 +3704,389 @@ XTENT ; "RTN","uttcovr",5,0) ; "RTN","uttcovr",6,0) - ; if SHOWALL is true (1) all coverage globals data are listed + ; Have it run the following entry points or, if no ^, call EN^%ut with routine name "RTN","uttcovr",7,0) - ; if SHOWALL is false (0), only the %utCOVREPORT global is listed + S RUNCODE(1)="^%utt1,%utt1,^%utt6,VERBOSE^%utt6,%uttcovr,^%ut,^%ut1,^%utcover" "RTN","uttcovr",8,0) - I '$D(SHOWALL) N SHOWALL S SHOWALL=0 + M ^TMP("%uttcovr",$J,"RUNCODE")=RUNCODE "RTN","uttcovr",9,0) - ; set global node so %utt4 doesn't run its own analysis + ; need this one separate, or it runs into infinite loop "RTN","uttcovr",10,0) - S ^TMP("%uttcovr",$J)=1 + S RUNCODE("ENTRY^%uttcovr")="" "RTN","uttcovr",11,0) - ; start analysis of %ut - it calls entry below + ; Have the analysis EXCLUDE the following routines from coverage - unit test routines "RTN","uttcovr",12,0) - D COV^%ut1("%ut","D TESTCOVR^%ut",-1) + S XCLUDE(1)="%utt1,%utt2,%utt3,%utt4,%utt5,%utt6,%uttcovr" "RTN","uttcovr",13,0) - D LIST("%ut") ; output results of analysis + M ^TMP("%uttcovr",$J,"XCLUDE")=XCLUDE "RTN","uttcovr",14,0) - ; start analysis of %ut1 + D COVERAGE^%utcover("%ut*",.RUNCODE,.XCLUDE,3) "RTN","uttcovr",15,0) - D COV^%ut1("%ut1","D TESTCOVR^%ut1",3) + Q "RTN","uttcovr",16,0) - D LIST("%ut1") + ; "RTN","uttcovr",17,0) - K ^TMP("%uttcovr",$J) -"RTN","uttcovr",18,0) - Q -"RTN","uttcovr",19,0) - ; -"RTN","uttcovr",20,0) -SHOWALL ; Entry to get all coverage globals listed -"RTN","uttcovr",21,0) - N SHOWALL -"RTN","uttcovr",22,0) - S SHOWALL=1 -"RTN","uttcovr",23,0) - D ^%uttcovr -"RTN","uttcovr",24,0) - Q -"RTN","uttcovr",25,0) - ; -"RTN","uttcovr",26,0) ENTRY ; -"RTN","uttcovr",27,0) - D ^%utt1 ; verbose -"RTN","uttcovr",28,0) - D EN^%ut("%utt1") ; non-verbose -"RTN","uttcovr",29,0) +"RTN","uttcovr",18,0) + ; The following are now specified in the initial call to COVERAGE^% +"RTN","uttcovr",19,0) + ;D ^%utt1 ; verbose +"RTN","uttcovr",20,0) + ;D EN^%ut("%utt1") ; non-verbose +"RTN","uttcovr",21,0) ; run tests from top of %utt6, runs both command line and gui analyses -"RTN","uttcovr",30,0) - D ^%utt6 ; non-verbose -"RTN","uttcovr",31,0) - D VERBOSE^%utt6 ; verbose -"RTN","uttcovr",32,0) - Q -"RTN","uttcovr",33,0) +"RTN","uttcovr",22,0) + ;D ^%utt6 ; non-verbose +"RTN","uttcovr",23,0) + ;D VERBOSE^%utt6 ; verbose +"RTN","uttcovr",24,0) + ; run tests from top of routines +"RTN","uttcovr",25,0) + ;D ^%ut +"RTN","uttcovr",26,0) + ;D ^%ut1 +"RTN","uttcovr",27,0) ; +"RTN","uttcovr",28,0) + ; these tests run outside of unit tests to handle CHKLEAKS calls not in unit tests +"RTN","uttcovr",29,0) + ; they need data set, so they are called in here +"RTN","uttcovr",30,0) + ; LEAKSOK ; +"RTN","uttcovr",31,0) + N CODE,LOCATN,MYVALS,X +"RTN","uttcovr",32,0) + S CODE="S X=$$NOW^XLFDT()",LOCATN="LEAKSOK TEST",MYVALS("X")="" +"RTN","uttcovr",33,0) + D CHKLEAKS^%ut(CODE,LOCATN,.MYVALS) ; should find no leaks "RTN","uttcovr",34,0) -LIST(ROU) ; + ; LEAKSBAD ; "RTN","uttcovr",35,0) - ; ZEXCEPT: SHOWALL - NEWed and set in SHOWALL or entering at %uttcovr + N CODE,LOCATN,MYVALS,X "RTN","uttcovr",36,0) - N JOB,NAME,BASE,GLOB + S CODE="S X=$$NOW^XLFDT()",LOCATN="LEAKSBAD TEST - X NOT SPECIFIED" "RTN","uttcovr",37,0) - S JOB=$J + D CHKLEAKS^%ut(CODE,LOCATN,.MYVALS) ; should find X since it isn't indicated "RTN","uttcovr",38,0) - W !!!,ROU_" COVERAGE ANALYSIS" + ; try to run coverage "RTN","uttcovr",39,0) - F NAME="%utCOVREPORT","%utCOVRESULT","%utCOVCOHORT","%utCOVCOHORTSAV" D + D COV^%ut("%ut1","D EN^%ut(""%utt5"")",3) "RTN","uttcovr",40,0) - . I 'SHOWALL,NAME'="%utCOVREPORT" Q + D COV^%ut("%ut1","D EN^%ut(""%utt5"")",-1) "RTN","uttcovr",41,0) - . W !!!,NAME," GLOBAL DATA",! + N RUNCODE S RUNCODE(1)="^%utt4,^%ut" ; M RUNCODE=^TMP("%uttcovr",$J,"RUNCODE") "RTN","uttcovr",42,0) - . S BASE="^TMP("""_NAME_""","_JOB,GLOB=BASE_")" + N XCLUDE M XCLUDE=^TMP("%uttcovr",$J,"XCLUDE") "RTN","uttcovr",43,0) - . I $D(GLOB)#2 W !,GLOB,"=",$G(@GLOB) + D TESTONLY^%utcover(.RUNCODE) "RTN","uttcovr",44,0) - . F S GLOB=$Q(@GLOB) Q:GLOB'[BASE I $D(GLOB)#2 W !,GLOB,"=",@GLOB + D COVERAGE^%utcover("%ut*",.RUNCODE,.XCLUDE,3) "RTN","uttcovr",45,0) - . Q + N GLT S GLT=$NA(^TMP("%uttcovr-text",$J)) K @GLT "RTN","uttcovr",46,0) + D LIST^%utcover(.XCLUDE,3,GLT) ; get coverage for listing and trimdata in %utcover +"RTN","uttcovr",47,0) + F I=1:1 Q:'$D(@GLT@(I)) W !,@GLT@(I) +"RTN","uttcovr",48,0) + K @GLT +"RTN","uttcovr",49,0) Q +"RTN","uttcovr",50,0) + ; +"RTN","uttcovr",51,0) +RTNANAL ; @TEST - routine analysis +"RTN","uttcovr",52,0) + N ROUS,GLB +"RTN","uttcovr",53,0) + S ROUS("%utt4")="" +"RTN","uttcovr",54,0) + S GLB=$NA(^TMP("%uttcovr-rtnanal",$J)) K @GLB +"RTN","uttcovr",55,0) + D RTNANAL^%ut1(.ROUS,GLB) +"RTN","uttcovr",56,0) + D CHKTF^%ut($D(@GLB@("%utt4","MAIN"))>1,"Not enough 'MAIN' nodes found") +"RTN","uttcovr",57,0) + D CHKTF^%ut($G(@GLB@("%utt4","MAIN",2))["+$SY=47","Check for GT.M not found in expected line") +"RTN","uttcovr",58,0) + D CHKTF^%ut($G(@GLB@("%utt4","MAIN",12))=" QUIT","Final QUIT not on expected line") +"RTN","uttcovr",59,0) + K @GLB +"RTN","uttcovr",60,0) + Q +"RTN","uttcovr",61,0) + ; +"RTN","uttcovr",62,0) +COVRPTGL ; @TEST - coverage report returning global +"RTN","uttcovr",63,0) + N GL1,GL2,GL3,GL4 +"RTN","uttcovr",64,0) + S GL1=$NA(^TMP("%utCOVCOHORTSAVx",$J)) K @GL1 +"RTN","uttcovr",65,0) + S GL2=$NA(^TMP("%utCOVCOHORTx",$J)) K @GL2 +"RTN","uttcovr",66,0) + S GL3=$NA(^TMP("%utCOVRESULTx",$J)) K @GL3 +"RTN","uttcovr",67,0) + S GL4=$NA(^TMP("%utCOVREPORTx",$J)) K @GL4 +"RTN","uttcovr",68,0) + D SETGLOBS(GL1,GL2) +"RTN","uttcovr",69,0) + D COVRPTGL^%ut1(GL1,GL2,GL3,GL4) +"RTN","uttcovr",70,0) + D CHKEQ^%ut($G(@GL4@("%ut1","ACTLINES")),"0/9","Wrong number of lines covered f>>or ACTLINES") +"RTN","uttcovr",71,0) + D CHKEQ^%ut($G(@GL4@("%ut1","ACTLINES",9))," QUIT CNT","Wrong result for last l>>ine not covered for ACTLINES") +"RTN","uttcovr",72,0) + D CHKEQ^%ut($G(@GL4@("%ut1","CHEKTEST")),"8/10","Wrong number of lines covered >>for CHEKTEST") +"RTN","uttcovr",73,0) + D CHKEQ^%ut($G(@GL4@("%ut1","CHEKTEST",39))," . Q","Wrong result for last line >>not covered for CHEKTEST") +"RTN","uttcovr",74,0) + K @GL1,@GL2,@GL3,@GL4 +"RTN","uttcovr",75,0) + Q +"RTN","uttcovr",76,0) + ; +"RTN","uttcovr",77,0) +COVRPTLS ; @TEST - coverage report returning text in global +"RTN","uttcovr",78,0) + N GL1,GL2,GL3,GL4,VRBOSITY +"RTN","uttcovr",79,0) + S GL1=$NA(^TMP("%utCOVCOHORTSAVx",$J)) K @GL1 +"RTN","uttcovr",80,0) + S GL2=$NA(^TMP("%utCOVCOHORTx",$J)) K @GL2 +"RTN","uttcovr",81,0) + S GL3=$NA(^TMP("%utCOVRESULTx",$J)) K @GL3 +"RTN","uttcovr",82,0) + S GL4=$NA(^TMP("%utCOVREPORTx",$J)) K @GL4 +"RTN","uttcovr",83,0) + D SETGLOBS(GL1,GL2) +"RTN","uttcovr",84,0) + S VRBOSITY=1 +"RTN","uttcovr",85,0) + D COVRPTLS^%ut1(GL1,GL2,GL3,VRBOSITY,GL4) +"RTN","uttcovr",86,0) + D CHKEQ^%ut("COVERAGE PERCENTAGE: 42.11",$G(@GL4@(5)),"Verbosity 1 - not expected percentage value") +"RTN","uttcovr",87,0) + D CHKEQ^%ut("42.11",$G(@GL4@(9)),"Verbosity 1 - not expected value for line 9") +"RTN","uttcovr",88,0) + D CHKTF^%ut('$D(@GL4@(10)),"Verbosity 1 - unexpected data in 10th line") +"RTN","uttcovr",89,0) + K @GL4 +"RTN","uttcovr",90,0) + ; +"RTN","uttcovr",91,0) + S VRBOSITY=2 +"RTN","uttcovr",92,0) + D COVRPTLS^%ut1(GL1,GL2,GL3,VRBOSITY,GL4) +"RTN","uttcovr",93,0) + D CHKEQ^%ut(" ACTLINES 0.00",$G(@GL4@(10)),"Verbosity 2 - not expected value for 10th line") +"RTN","uttcovr",94,0) + D CHKEQ^%ut(" CHEKTEST 80.00",$G(@GL4@(11)),"Verbosity 2 - not expected value for 11th line") +"RTN","uttcovr",95,0) + D CHKTF^%ut('$D(@GL4@(12)),"Verbosity 2 - unexpected data for 12th line") +"RTN","uttcovr",96,0) + K @GL4 +"RTN","uttcovr",97,0) + ; +"RTN","uttcovr",98,0) + S VRBOSITY=3 +"RTN","uttcovr",99,0) + D COVRPTLS^%ut1(GL1,GL2,GL3,VRBOSITY,GL4) +"RTN","uttcovr",100,0) + D CHKEQ^%ut(" ACTLINES 0.00",$G(@GL4@(10)),"Verbosity 3 - unexpected value for line 10") +"RTN","uttcovr",101,0) + D CHKEQ^%ut("ACTLINES+9: QUIT CNT",$G(@GL4@(19)),"Verbosity 3 - unexpected value for line 19") +"RTN","uttcovr",102,0) + D CHKEQ^%ut(" CHEKTEST 80.00",$G(@GL4@(20)),"Verbosity 3 - unexpected value for line 20") +"RTN","uttcovr",103,0) + D CHKEQ^%ut("CHEKTEST+39: . Q",$G(@GL4@(22)),"Verbosity 3 - unexpected value for line 22") +"RTN","uttcovr",104,0) + D CHKTF^%ut('$D(@GL4@(23)),"Verbosity 3 - unexpected line 23") +"RTN","uttcovr",105,0) + ; +"RTN","uttcovr",106,0) + K @GL1,@GL2,@GL3,@GL4 +"RTN","uttcovr",107,0) + Q +"RTN","uttcovr",108,0) + ; +"RTN","uttcovr",109,0) +TRIMDATA ; @TEST - TRIMDATA in %utcover +"RTN","uttcovr",110,0) + N GL1,XCLUD +"RTN","uttcovr",111,0) + S GL1=$NA(^TMP("%uttcovr-trimdata",$J)) K @GL1 +"RTN","uttcovr",112,0) + S @GL1@("GOOD",1)="1" +"RTN","uttcovr",113,0) + S @GL1@("BAD",1)="1" +"RTN","uttcovr",114,0) + S XCLUD("BAD")="" +"RTN","uttcovr",115,0) + D TRIMDATA^%utcover(.XCLUD,GL1) +"RTN","uttcovr",116,0) + D CHKTF^%ut($D(@GL1@("GOOD")),"GOOD ENTRY WAS REMOVED") +"RTN","uttcovr",117,0) + D CHKTF^%ut('$D(@GL1@("BAD")),"ENTRY WAS NOT TRIMMED") +"RTN","uttcovr",118,0) + K @GL1,XCLUD +"RTN","uttcovr",119,0) + Q +"RTN","uttcovr",120,0) + ; +"RTN","uttcovr",121,0) +LIST ; @TEST - LIST in %utcover +"RTN","uttcovr",122,0) + N GL1,GLT S GL1=$NA(^TMP("%uttcovr-list",$J)),GLT=$NA(^TMP("%uttcovr-text",$J)) +"RTN","uttcovr",123,0) + S @GL1@("%ut1")="89/160" +"RTN","uttcovr",124,0) + S @GL1@("%ut1","%ut1")="2/2" +"RTN","uttcovr",125,0) + S @GL1@("%ut1","ACTLINES")="0/9" +"RTN","uttcovr",126,0) + S @GL1@("%ut1","ACTLINES",0)="ACTLINES(GL) ; [Private] $$ ; Count active lines" +"RTN","uttcovr",127,0) + S @GL1@("%ut1","ACTLINES",2)=" N CNT S CNT=0" +"RTN","uttcovr",128,0) + S @GL1@("%ut1","ACTLINES",3)=" N REF S REF=GL" +"RTN","uttcovr",129,0) + S @GL1@("%ut1","ACTLINES",4)=" N GLQL S GLQL=$QL(GL)" +"RTN","uttcovr",130,0) + S @GL1@("%ut1","ACTLINES",5)=" F S REF=$Q(@REF) Q:REF="""" Q:(GL'=$NA(@REF,GLQL)) D" +"RTN","uttcovr",131,0) + S @GL1@("%ut1","ACTLINES",6)=" . N REFQL S REFQL=$QL(REF)" +"RTN","uttcovr",132,0) + S @GL1@("%ut1","ACTLINES",7)=" . N LASTSUB S LASTSUB=$QS(REF,REFQL)" +"RTN","uttcovr",133,0) + S @GL1@("%ut1","ACTLINES",8)=" . I LASTSUB?1.N S CNT=CNT+1" +"RTN","uttcovr",134,0) + S @GL1@("%ut1","ACTLINES",9)=" QUIT CNT" +"RTN","uttcovr",135,0) + S @GL1@("%ut1","CHECKTAG")="11/11" +"RTN","uttcovr",136,0) + S @GL1@("%ut1","CHEKTEST")="10/10" +"RTN","uttcovr",137,0) + N XCLUD S XCLUD("%utt1")="" +"RTN","uttcovr",138,0) + D LIST^%utcover(.XCLUD,1,GLT,GL1) +"RTN","uttcovr",139,0) + D CHKEQ^%ut("Routine %ut1 89 out of 160 lines covered (55%)",$G(@GLT@(3)),"Verbosity 1 - Unexpected text for line 3") +"RTN","uttcovr",140,0) + D CHKEQ^%ut("Overall Analysis 89 out of 160 lines covered (55% coverage)",$G(@GLT@(6)),"Verbosity 1 - unexpected text for line 6") +"RTN","uttcovr",141,0) + D CHKTF^%ut('$D(@GLT@(7)),"Verbosity 1 - Unexpected line 7 present") +"RTN","uttcovr",142,0) + K @GLT +"RTN","uttcovr",143,0) + ; +"RTN","uttcovr",144,0) + D LIST^%utcover(.XCLUD,2,GLT,GL1) +"RTN","uttcovr",145,0) + D CHKEQ^%ut(" - Summary",$G(@GLT@(4)),"Verbosity 2 - unexpected text at line 4") +"RTN","uttcovr",146,0) + D CHKEQ^%ut(" Tag ACTLINES^%ut1 0 out of 9 lines covered",$G(@GLT@(6)),"Verbosity 2 - unexpected text at line 6") +"RTN","uttcovr",147,0) + D CHKEQ^%ut(" Tag CHEKTEST^%ut1 10 out of 10 lines covered",$G(@GLT@(8)),"Verbosity 2 - unexpected text at line 8") +"RTN","uttcovr",148,0) + D CHKTF^%ut($D(@GLT@(14)),"Verbosity 2 - expected line at line 14") +"RTN","uttcovr",149,0) + D CHKTF^%ut('$D(@GLT@(15)),"Verbosity 2 - unexpected line at line 15") +"RTN","uttcovr",150,0) + K @GLT +"RTN","uttcovr",151,0) + ; +"RTN","uttcovr",152,0) + D LIST^%utcover(.XCLUD,3,GLT,GL1) +"RTN","uttcovr",153,0) + D CHKEQ^%ut(" Tag %ut1^%ut1 2 out of 2 lines covered",$G(@GLT@(5)),"Verbosity 3 - Incorrect text at line 5") +"RTN","uttcovr",154,0) + D CHKEQ^%ut(" ACTLINES+9 QUIT CNT",$G(@GLT@(15)),"Verbosity 3 - incorrect line 15") +"RTN","uttcovr",155,0) + D CHKTF^%ut($D(@GLT@(23)),"Verbosity 3 - expected data in line 23") +"RTN","uttcovr",156,0) + D CHKTF^%ut('$D(@GLT@(24)),"Verbosity 3 - did not expect a line 24") +"RTN","uttcovr",157,0) + ; +"RTN","uttcovr",158,0) + K @GL1,@GLT +"RTN","uttcovr",159,0) + Q +"RTN","uttcovr",160,0) + ; +"RTN","uttcovr",161,0) +SETGLOBS(GL1,GL2) ; +"RTN","uttcovr",162,0) + S @GL1@("%ut1","ACTLINES")="ACTLINES" +"RTN","uttcovr",163,0) + S @GL1@("%ut1","ACTLINES",0)="ACTLINES(GL) ; [Private] $$ ; Count active lines" +"RTN","uttcovr",164,0) + S @GL1@("%ut1","ACTLINES",2)=" N CNT S CNT=0" +"RTN","uttcovr",165,0) + S @GL1@("%ut1","ACTLINES",3)=" N REF S REF=GL" +"RTN","uttcovr",166,0) + S @GL1@("%ut1","ACTLINES",4)=" N GLQL S GLQL=$QL(GL)" +"RTN","uttcovr",167,0) + S @GL1@("%ut1","ACTLINES",5)=" F S REF=$Q(@REF) Q:REF="""" Q:(GL'=$NA(@REF,GLQL)) D" +"RTN","uttcovr",168,0) + S @GL1@("%ut1","ACTLINES",6)=" . N REFQL S REFQL=$QL(REF)" +"RTN","uttcovr",169,0) + S @GL1@("%ut1","ACTLINES",7)=" . N LASTSUB S LASTSUB=$QS(REF,REFQL)" +"RTN","uttcovr",170,0) + S @GL1@("%ut1","ACTLINES",8)=" . I LASTSUB?1.N S CNT=CNT+1" +"RTN","uttcovr",171,0) + S @GL1@("%ut1","ACTLINES",9)=" QUIT CNT" +"RTN","uttcovr",172,0) + S @GL1@("%ut1","CHEKTEST")="CHEKTEST" +"RTN","uttcovr",173,0) + S @GL1@("%ut1","CHEKTEST",0)="CHEKTEST(%utROU,%ut,%utUETRY) ; Collect Test list." +"RTN","uttcovr",174,0) + S @GL1@("%ut1","CHEKTEST",13)=" N I,LIST" +"RTN","uttcovr",175,0) + S @GL1@("%ut1","CHEKTEST",14)=" S I=$L($T(@(U_%utROU))) I I<0 Q ""-1^Invalid Routine Name""" +"RTN","uttcovr",176,0) + S @GL1@("%ut1","CHEKTEST",31)=" D NEWSTYLE(.LIST,%utROU)" +"RTN","uttcovr",177,0) + S @GL1@("%ut1","CHEKTEST",32)=" F I=1:1:LIST S %ut(""ENTN"")=%ut(""ENTN"")+1,%utUETRY(%ut(""ENTN""))=$P(LIST(I),U),%utUETRY(%ut(""ENTN""),""NAME"")=$P(LIST(I),U,2,99)" +"RTN","uttcovr",178,0) + S @GL1@("%ut1","CHEKTEST",37)=" N %utUI F %utUI=1:1 S %ut(""ELIN"")=$T(@(""XTENT+""_%utUI_""^""_%utROU)) Q:$P(%ut(""ELIN""),"";"",3)="""" D" +"RTN","uttcovr",179,0) + S @GL1@("%ut1","CHEKTEST",38)=" . S %ut(""ENTN"")=%ut(""ENTN"")+1,%utUETRY(%ut(""ENTN""))=$P(%ut(""ELIN""),"";"",3),%utUETRY(%ut(""ENTN""),""NAME"")=$P(%ut(""ELIN""),"";"",4)" +"RTN","uttcovr",180,0) + S @GL1@("%ut1","CHEKTEST",39)=" . Q" +"RTN","uttcovr",181,0) + S @GL1@("%ut1","CHEKTEST",41)=" QUIT" +"RTN","uttcovr",182,0) + S @GL1@("%ut1","CHEKTEST",9)=" S %ut(""ENTN"")=0 ; Number of test, sub to %utUETRY." +"RTN","uttcovr",183,0) + S @GL2@("%ut1","ACTLINES")="ACTLINES" +"RTN","uttcovr",184,0) + S @GL2@("%ut1","ACTLINES",0)="ACTLINES(GL) ; [Private] $$ ; Count active lines" +"RTN","uttcovr",185,0) + S @GL2@("%ut1","ACTLINES",2)=" N CNT S CNT=0" +"RTN","uttcovr",186,0) + S @GL2@("%ut1","ACTLINES",3)=" N REF S REF=GL" +"RTN","uttcovr",187,0) + S @GL2@("%ut1","ACTLINES",4)=" N GLQL S GLQL=$QL(GL)" +"RTN","uttcovr",188,0) + S @GL2@("%ut1","ACTLINES",5)=" F S REF=$Q(@REF) Q:REF="""" Q:(GL'=$NA(@REF,GLQL)) D" +"RTN","uttcovr",189,0) + S @GL2@("%ut1","ACTLINES",6)=" . N REFQL S REFQL=$QL(REF)" +"RTN","uttcovr",190,0) + S @GL2@("%ut1","ACTLINES",7)=" . N LASTSUB S LASTSUB=$QS(REF,REFQL)" +"RTN","uttcovr",191,0) + S @GL2@("%ut1","ACTLINES",8)=" . I LASTSUB?1.N S CNT=CNT+1" +"RTN","uttcovr",192,0) + S @GL2@("%ut1","ACTLINES",9)=" QUIT CNT" +"RTN","uttcovr",193,0) + S @GL2@("%ut1","CHEKTEST")="CHEKTEST" +"RTN","uttcovr",194,0) + S @GL2@("%ut1","CHEKTEST",38)=" . S %ut(""ENTN"")=%ut(""ENTN"")+1,%utUETRY(%ut(""ENTN""))=$P(%ut(""ELIN""),"";"",3),%utUETRY(%ut(""ENTN""),""NAME"")=$P(%ut(""ELIN""),"";"",4)" +"RTN","uttcovr",195,0) + S @GL2@("%ut1","CHEKTEST",39)=" . Q" +"RTN","uttcovr",196,0) + Q +"RTN","uttcovr",197,0) + ; "SEC","^DIC",17.9001,17.9001,0,"AUDIT") @ "SEC","^DIC",17.9001,17.9001,0,"DD") @@ -3296,6 +4106,7 @@ FIELD^^2^3 "^DD",17.9001,17.9001,0,"DT") 3140812 "^DD",17.9001,17.9001,0,"IX","B",17.9001,.01) + "^DD",17.9001,17.9001,0,"NM","MUNIT TEST GROUP") "^DD",17.9001,17.9001,0,"VRPK") @@ -3339,6 +4150,7 @@ TEST ROUTINE SUB-FIELD^^.01^1 "^DD",17.9001,17.90011,0,"DT") 3140731 "^DD",17.9001,17.90011,0,"IX","B",17.90011,.01) + "^DD",17.9001,17.90011,0,"NM","TEST ROUTINE") "^DD",17.9001,17.90011,0,"UP") @@ -3362,6 +4174,7 @@ DESCRIPTION FOR GROUP SUB-FIELD^^.01^1 "^DD",17.9001,17.90012,0,"DT") 3140812 "^DD",17.9001,17.90012,0,"NM","DESCRIPTION FOR GROUP") + "^DD",17.9001,17.90012,0,"UP") 17.9001 "^DD",17.9001,17.90012,.01,0) @@ -3391,4 +4204,5 @@ M-UNIT TEST GROUP^17.9001 "^DIC",17.9001,17.9001,0,"GL") ^%ut(17.9001, "^DIC",17.9001,"B","M-UNIT TEST GROUP",17.9001) -$END KID MASH*0.1*0 + +$END KID MASH*0.2*0 diff --git a/Routines/%ut.m b/Routines/%ut.m index e659cfe..e12747e 100644 --- a/Routines/%ut.m +++ b/Routines/%ut.m @@ -1,485 +1,487 @@ -%ut ;VEN-SMH/JLI - PRIMARY PROGRAM FOR M-UNIT TESTING ;08/24/14 21:45 - ;;0.1;MASH UTILITIES; - ; - ; This routine and its companion, %ut1, provide the basic functionality for - ; running unit tests on parts of M programs either at the command line level - ; or via the M-Unit GUI application for windows operating systems. - ; - ; Original by Dr. Joel Ivey - ; Contributions by Dr. Sam Habiel - ; - ; 100622 JLI - corrected typo in comments where %utINPT was listed as %utINP - ; 100622 JLI - removed a comment which indicated data could potentially be returned from the called routine - ; in the %utINPT array. - ; 100622 JLI - added code to handle STARTUP and SHUTDOWN from GUI app - ; 110719 JLI - modified separators in GUI handling from ^ to ~~^~~ - ; in the variable XTGUISEP if using a newer version of the - ; GUI app (otherwise, it is simply set to ^) since results - ; with a series of ^ embedded disturbed the output reported - ; 130726 SMH - Fixed SETUP and TEARDOWN so that they run before/after each - ; test rather than once. General refactoring. - ; 130726 SMH - SETUT initialized IO in case it's not there to $P. Inits vars - ; using DT^DICRW. - ; 131217 SMH - Change call in SETUP to S U="^" instead of DT^DICRW - ; 131218 SMH - Any checks to $ZE will also check $ZS for GT.M. - ; 131218 SMH - Remove calls to %ZISUTL to manage devices to prevent dependence on VISTA. - ; Use %utNIT("DEV","OLD") for old devices - ; 140109 SMH - Add parameter %utBREAK - Break upon error - ; 1402 SMH - Break will cause the break to happen even on failed tests. - ; 140401 SMH - Added Succeed entry point for take it into your hands tester. - ; 140401 SMH - Reformatted the output of M-Unit so that the test's name - ; will print BEFORE the execution of the test. This has been - ; really confusing for beginning users of M-Unit, so this was - ; necessary. - ; 140401 SMH - OK message gets printed at the end of --- as [OK]. - ; 140401 SMH - FAIL message now prints. Previously, OK failed to be printed. - ; Unfortunately, that's rather passive aggressive. Now it - ; explicitly says that a test failed. - ; 140503 SMH - Fixed IO issues all over the routine. Much simpler now. - ; 140731 JLI - Combined routine changes between JLI and SMH - ; Moved routines from %utNIT and %utNIT1 to %ut and %ut1 - ; Updated unit test routines (%utt1 to %utt6) - ; Created M-UNIT TEST GROUP file at 17.9001 based on the 17.9001 file - Q - ; -EN(%utRNAM,%utVERB,%utBREAK) ; .SR Entry point with primary test routine name, optional 1 for verbose output - N %utLIST,%utROU,%ut - I '+$G(%utVERB) S %utVERB=0 - S %utLIST=1,%utROU(%utLIST)=%utRNAM - D SETUT - D EN1(.%utROU,%utLIST) - Q - ; -SETUT ; - ; VEN/SMH 26JUL2013 - I '($D(IO)#2) S IO=$P - S U="^" - ; VEN/SMH 26JUL2013 END - ; - ; ZEXCEPT: %ut -- NEWED ON ENTRY - S %ut("IO")=IO - S %ut=1 ; set to identify unit test being run check with $$ISUTEST^%ut() - ; - ; ZEXCEPT: %utBREAK - I $G(%utBREAK) S %ut("BREAK")=1 - Q - ; -EN1(%utROU,%utLIST) ; - ; VEN/SMH 26JUL2013 - This block is refactored to fix problems with - ; SETUP and TEARDOWN not happening at the right time - N %utERRL,%utK,%utI,%utJ,%utSTRT - ; ZEXCEPT: %utVERB -- ARGUMENT TO EN - ; ZEXCEPT: %utGUI -- CONDITIONALLY DEFINED BY GUINEXT - ; ZEXCEPT: %ut -- NEWED IN EN - ; - ; Structure map for %ut - ; -- CURR = Counter for routine number. Used as sub in %utROU - ; -- ECNT = Entry point count in loop (cf. NERT); VEN/SMH - Needed? - ; -- FAIL = Number of failures - ; -- CHK = Number of checks ran (TF/EQ/FAIL) - ; -- NENT = Number of entry points ran - ; -- ERRN = Number of errors - S %ut("CURR")=0,%ut("ECNT")=0,%ut("FAIL")=0,%ut("CHK")=0,%ut("NENT")=0,%ut("ERRN")=0 - ; - ; -- GET LIST OF ROUTINES -- - ; first get any tree of routines from this one - D GETTREE^%ut1(.%utROU,.%utLIST) - ; - ; -- STARTUP -- - ; 070224 - following code added to allow one overall STARTUP code JLI - F S %ut("CURR")=%ut("CURR")+1 Q:'$D(%utROU(%ut("CURR"))) D I $G(%utSTRT)'="" D @%utSTRT Q - . I $T(@("STARTUP^"_%utROU(%ut("CURR"))))'="" S %utSTRT="STARTUP^"_%utROU(%ut("CURR")) - . Q - ; 070224 - end of addition JLI - ; - ; - ; Now process each routine that has been referenced - S %ut("CURR")=0 - F S %ut("CURR")=%ut("CURR")+1 Q:'$D(%utROU(%ut("CURR"))) D - . N %utETRY ; Test list to run - . ; - . ; Collect Test list. - . D CHEKTEST^%ut1(%utROU(%ut("CURR")),.%ut,.%utETRY) - . ; - . ; if a SETUP entry point exists, save it off in %ut - . N %utSETUP S %utSETUP="SETUP^"_%utROU(%ut("CURR")) - . S %ut("LINE")=$T(@%utSETUP) I %ut("LINE")'="" S %ut("SETUP")=%utSETUP - . K %utSETUP ; we're done! - . ; - . ; if a TEARDOWN entry point exists, ditto - . N %utTEARDOWN S %utTEARDOWN="TEARDOWN^"_%utROU(%ut("CURR")) - . S %ut("LINE")=$T(@%utTEARDOWN) I %ut("LINE")'="" S %ut("TEARDOWN")=%utTEARDOWN - . K %utTEARDOWN ; done here. - . ; - . ; VEN/SMH 26JUL2013 - this block changed to correct running of setup and teardown - . ; run each of the specified entry points - . ; - . ; == THIS FOR/DO BLOCK IS THE CENTRAL TEST RUNNER == - . S %utI=0 - . F S %utI=$O(%utETRY(%utI)) Q:%utI'>0 S %ut("ENUM")=%ut("ERRN")+%ut("FAIL") D - . . N $ETRAP S $ETRAP="D ERROR^%ut" - . . ; - . . ; Run Set-up Code (only if present) - . . S %ut("ENT")=$G(%ut("SETUP")) ; Current entry - . . S %ut("NAME")="Set-up Code" - . . D:%ut("ENT")]"" @%ut("ENT") - . . ; - . . ; Run actual test - . . S %ut("ECNT")=%ut("ECNT")+1 - . . S %ut("NAME")=%utETRY(%utI,"NAME") - . . S %ut("ENT")=%utETRY(%utI)_"^"_%utROU(%ut("CURR")) - . . I %utVERB,'$D(%utGUI) D VERBOSE1(.%utETRY,%utI) ; Say what we executed. - . . D @%ut("ENT") - . . ; - . . ; Run Teardown Code (only if present) - . . S %ut("ENT")=$G(%ut("TEARDOWN")) - . . S %ut("NAME")="Teardown Code" - . . D:%ut("ENT")]"" @%ut("ENT") - . . ; - . . ; ENUM = Number of errors + failures - . . ; Only print out the success message [OK] If our error number remains - . . ; the same as when we started the loop. - . . I %utVERB,'$D(%utGUI) D - . . . I %ut("ENUM")=(%ut("ERRN")+%ut("FAIL")) D VERBOSE(.%utETRY,%utI,1) I 1 - . . . E D VERBOSE(.%utETRY,%utI,0) - . ; - . ; - . ; keep a %utCNT of number of entry points executed across all routines - . S %ut("NENT")=%ut("NENT")+%ut("ENTN") - . Q - ; - ; -- SHUTDOWN -- - ; 070224 - following code added to allow one overall SHUTDOWN code JLI - N XTFINISH - S %ut("CURR")=0 - F S %ut("CURR")=%ut("CURR")+1 Q:'$D(%utROU(%ut("CURR"))) D I $G(XTFINISH)'="" D @XTFINISH Q - . I $T(@("SHUTDOWN^"_%utROU(%ut("CURR"))))'="" S XTFINISH="SHUTDOWN^"_%utROU(%ut("CURR")) - . Q - ; 070224 - End of addition JLI - ; and output the results - D SETIO - W !!,"Ran ",%utLIST," Routine",$S(%utLIST>1:"s",1:""),", ",%ut("NENT")," Entry Tag",$S(%ut("NENT")>1:"s",1:"") - W !,"Checked ",%ut("CHK")," test",$S(%ut("CHK")>1:"s",1:""),", with ",%ut("FAIL")," failure",$S(%ut("FAIL")'=1:"s",1:"")," and encountered ",%ut("ERRN")," error",$S(%ut("ERRN")'=1:"s",1:""),"." - D RESETIO - Q - ; -- end EN1 -VERBOSE(%utETRY,%utI,SUCCESS) ; Say whether we succeeded or failed. - ; ZEXCEPT: %ut - NEWED IN EN - D SETIO - N I F I=$X+3:1:73 W "-" - W ?73 - I $G(SUCCESS) W "[OK]" - E W "[FAIL]" - D RESETIO - Q - ; -VERBOSE1(%utETRY,%utI) ; Print out the entry point info - ; ZEXCEPT: %ut - NEWED IN EN - D SETIO - W !,%utETRY(%utI) I $G(%utETRY(%utI,"NAME"))'="" W " - ",%utETRY(%utI,"NAME") - D RESETIO - Q -CHKTF(XTSTVAL,XTERMSG) ; Entry point for checking True or False values - ; ZEXCEPT: %utERRL,%utGUI - CREATED IN SETUP, KILLED IN END - ; ZEXCEPT: %ut - NEWED IN EN - ; ZEXCEPT: XTGUISEP - newed in GUINEXT - I '$D(XTSTVAL) D NVLDARG Q - I $G(XTERMSG)="" S XTERMSG="no failure message provided" - S %ut("CHK")=$G(%ut("CHK"))+1 - I '$D(%utGUI) D - . D SETIO - . I 'XTSTVAL W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " D - . . W XTERMSG,! S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") - . . I $D(%ut("BREAK")) BREAK ; Break upon failure - . . Q - . I XTSTVAL W "." - . D RESETIO - . Q - I $D(%utGUI),'XTSTVAL S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_XTERMSG - Q - ; -CHKEQ(XTEXPECT,XTACTUAL,XTERMSG) ; Entry point for checking values to see if they are EQUAL - N FAILMSG - ; ZEXCEPT: %utERRL,%utGUI -CREATED IN SETUP, KILLED IN END - ; ZEXCEPT: %ut -- NEWED IN EN - ; ZEXCEPT: XTGUISEP - newed in GUINEXT - I '$D(XTEXPECT)!'$D(XTACTUAL) D NVLDARG Q ; JLI 140824 changed from AND to OR, since both necessary, but only one might be entered - S XTACTUAL=$G(XTACTUAL),XTEXPECT=$G(XTEXPECT) - I $G(XTERMSG)="" S XTERMSG="no failure message provided" - S %ut("CHK")=%ut("CHK")+1 - I XTEXPECT'=XTACTUAL S FAILMSG="<"_XTEXPECT_"> vs <"_XTACTUAL_"> - " - I '$D(%utGUI) D - . D SETIO - . I XTEXPECT'=XTACTUAL W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " W FAILMSG,XTERMSG,! D - . . S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") - . . I $D(%ut("BREAK")) BREAK ; Break upon failure - . . Q - . E W "." - . D RESETIO - . Q - I $D(%utGUI),XTEXPECT'=XTACTUAL S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_FAILMSG_XTERMSG - Q - ; -FAIL(XTERMSG) ; Entry point for generating a failure message - ; ZEXCEPT: %utERRL,%utGUI -CREATED IN SETUP, KILLED IN END - ; ZEXCEPT: %ut -- NEWED ON ENTRY - ; ZEXCEPT: XTGUISEP - newed in GUINEXT - I $G(XTERMSG)="" S XTERMSG="no failure message provided" - S %ut("CHK")=%ut("CHK")+1 - I '$D(%utGUI) D - . D SETIO - . W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " W XTERMSG,! D - . . S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") - . . I $D(%ut("BREAK")) BREAK ; Break upon failure - . . Q - . D RESETIO - . Q - I $D(%utGUI) S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_XTERMSG - Q -SUCCEED ; Entry point for forcing a success (Thx David Whitten) - ; ZEXCEPT: %utERRL,%utGUI - CREATED IN SETUP, KILLED IN END - ; ZEXCEPT: %ut - NEWED IN EN - ; Switch IO and write out the dot for activity - I '$D(%utGUI) D - . D SETIO - . W "." - . D RESETIO - ; - ; Increment test counter - S %ut("CHK")=%ut("CHK")+1 - QUIT - ; -CHKLEAKS(%utCODE,%utLOC,%utINPT) ; functionality to check for variable leaks on executing a section of code - ; %utCODE - A string that specifies the code that is to be XECUTED and checked for leaks. - ; this should be a complete piece of code (e.g., "S X=$$NOW^XLFDT()" or "D EN^%ut(""ROUNAME"")") - ; %utLOC - A string that is used to indicate the code tested for variable leaks - ; %utINPT - An optional variable which may be passed by reference. This may - ; be used to pass any variable values, etc. into the code to be - ; XECUTED. In this case, set the subscript to the variable name and the - ; value of the subscripted variable to the desired value of the subscript. - ; e.g., (using NAME as my current namespace) - ; S CODE="S %utINPT=$$ENTRY^ROUTINE(ZZVALUE1,ZZVALUE2)" - ; S NAMELOC="ENTRY^ROUTINE leak test" (or simply "ENTRY^ROUTINE") - ; S NAMEINPT("ZZVALUE1")=ZZVALUE1 - ; S NAMEINPT("ZZVALUE2")=ZZVALUE2 - ; D CHKLEAKS^%ut(CODE,NAMELOC,.NAMEINPT) - ; - ; If part of a unit test, any leaked variables in ENTRY^ROUTINE which result - ; from running the code with the variables indicated will be shown as FAILUREs. - ; - ; If called outside of a unit test, any leaked variables will be printed to the - ; current device. - ; - N (%utCODE,%utLOC,%utINPT,DUZ,IO,U,%utERRL,%ut,%utGUI,%utI,%utJ,%utK,%utLIST,%utROU,%utSTRT) - ; ZEXCEPT: %ut - part of exclusive NEW TESTS FOR EXISTENCE ONLY - ; ZEXCEPT: %utVAR - handled by exclusive NEW - ; - ; ACTIVATE ANY VARIABLES PASSED AS SUBSCRIPTS TO %utINPT TO THEIR VALUES - S %utVAR=" " F S %utVAR=$O(%utINPT(%utVAR)) Q:%utVAR="" S (@%utVAR)=%utINPT(%utVAR) - X %utCODE - N ZZUTVAR S ZZUTVAR="%" - I $G(%ut)=1 D - . I $D(@ZZUTVAR),'$D(%utINPT(ZZUTVAR)) D FAIL^%ut(%utLOC_" VARIABLE LEAK: "_ZZUTVAR) - . F S ZZUTVAR=$O(@ZZUTVAR) Q:ZZUTVAR="" I $E(ZZUTVAR,1,3)'="%ut",'$D(%utINPT(ZZUTVAR)),",DUZ,IO,U,DTIME,ZZUTVAR,DT,%ut,"'[(","_ZZUTVAR_",") D FAIL^%ut(%utLOC_" VARIABLE LEAK: "_ZZUTVAR) - . Q - I '($G(%ut)=1) D - . I $D(@ZZUTVAR),'$D(%utINPT(ZZUTVAR)) W !,%utLOC_" VARIABLE LEAK: "_ZZUTVAR - . F S ZZUTVAR=$O(@ZZUTVAR) Q:ZZUTVAR="" I $E(ZZUTVAR,1,3)'="%ut",'$D(%utINPT(ZZUTVAR)),",DUZ,IO,U,DTIME,ZZUTVAR,DT,%ut,"'[(","_ZZUTVAR_",") W !,%utLOC_" VARIABLE LEAK: "_ZZUTVAR - . Q - Q - ; -NVLDARG ; generate message for invalid arguments to test - N XTERMSG - ; ZEXCEPT: %ut -- NEWED ON ENTRY - ; ZEXCEPT: %utERRL,%utGUI -CREATED IN SETUP, KILLED IN END - ; ZEXCEPT: XTGUISEP - newed in GUINEXT - S XTERMSG="NO VALUES INPUT TO CHKEQ^%ut - no evaluation possible" - I '$D(%utGUI) D - . D SETIO - . W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " W XTERMSG,! D - . . S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") - . . Q - . D RESETIO - . Q - I $D(%utGUI) S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_XTERMSG - Q - ; -ERROR ; record errors - ; ZEXCEPT: %utERRL,%utGUI,%utERR -CREATED IN SETUP, KILLED IN END - ; ZEXCEPT: %ut -- NEWED ON ENTRY - ; ZEXCEPT: XTGUISEP - newed in GUINEXT - S %ut("CHK")=%ut("CHK")+1 - I '$D(%utGUI) D ERROR1 - I $D(%utGUI) D - . S %ut("CNT")=%ut("CNT")+1 - . S %utERR=%utERR+1 - . S @%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"ERROR"_XTGUISEP_$S(+$SY=47:$ZS,1:$ZE) - . Q - S @($S(+$SY=47:"$ZS",1:"$ZE")_"="_""""""),$EC="" - Q - ; -ERROR1 ; - I $G(%ut("BREAK")) BREAK ; if we are asked to break upon error, please do so! - ; ZEXCEPT: %utERRL -CREATED IN SETUP, KILLED IN END - ; ZEXCEPT: %ut -- NEWED ON ENTRY - D SETIO - W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - Error: " W $S(+$SY=47:$ZS,1:$ZE),! D - . S %ut("ERRN")=%ut("ERRN")+1,%utERRL(%ut("ERRN"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=$S(+$SY=47:$ZS,1:$ZE),%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") - . Q - D RESETIO - Q -SETIO ; Set M-Unit Device to write the results to... - ; ZEXCEPT: %ut -- NEWED ON ENTRY - I $IO'=%ut("IO") S (IO(0),%ut("DEV","OLD"))=$IO USE %ut("IO") SET IO=$IO - QUIT - ; -RESETIO ; Reset $IO back to the original device if we changed it. - ; ZEXCEPT: %ut -- NEWED ON ENTRY - I $D(%ut("DEV","OLD")) S IO(0)=%ut("IO") U %ut("DEV","OLD") S IO=$IO K %ut("DEV","OLD") - QUIT - ; -ISUTEST() ; .SUPPORTED API TO DETERMINE IF CURRENTLY IN UNIT TEST - ; ZEXCEPT: %ut -- NEWED ON ENTRY - Q $G(%ut)=1 - ; -PICKSET ; .OPT Interactive selection of MUnit Test Group - N DIC,Y,%utROU,%utLIST,DIR - S DIC=17.9001,DIC(0)="AEQM" D ^DIC Q:Y'>0 W ! - D GETSET(+Y,.%utROU,.%utLIST) - N DIC,Y,%ut - D SETUT - D EN1(.%utROU,%utLIST) - S DIR(0)="EA",DIR("A")="Enter RETURN to continue:" D ^DIR K DIR - Q - ; -RUNSET(SETNAME,VERBOSE) ; .SR Run with Specified Selection of MUnit Test Group - N Y,%utROU,%utLIST,%utVERB - Q:$G(SETNAME)="" - S %utVERB=$G(VERBOSE,0) - S Y=+$$FIND1^DIC(17.9001,"","X",SETNAME) Q:Y'>0 - D GETSET(Y,.%utROU,.%utLIST) - N Y,SETNAME,%ut - D SETUT - D EN1(.%utROU,%utLIST) - Q - ; - ; DOSET CAN BE USED TO RUN A SET OF TESTS BASED ON THE IEN IN THE MUNIT TEST GROUP file (#17.9001) -DOSET(IEN,%utVERB) ; 140731 JLI added %utVERB as a second argument - ; IEN - Internal entry number for selected set of tests in the MUNIT TEST GROUP file (#17.9001) - ; %utVERB - optional input that indicates verbose output is permitted - ; - N %utROU,%utLIST - I '$D(%utVERB) S %utVERB=0 - S %utLIST=0 - D GETSET($G(IEN),.%utROU,.%utLIST) - I %utLIST>0 N IEN,%ut D SETUT,EN1(.%utROU,%utLIST) - Q - ; -GETSET(IEN,%utROU,%utLIST) ; JLI 140731 - called from PICKSET, RUNSET, DOSET, GUISET - N IENS,%utROOT - S IENS=IEN_"," D GETS^DIQ(17.9001,IENS,"1*","","%utROOT") - S %utLIST=0,IENS="" F S IENS=$O(%utROOT(17.90011,IENS)) Q:IENS="" S %utLIST=%utLIST+1,%utROU(%utLIST)=%utROOT(17.90011,IENS,.01) - Q - ; -GUISET(%utRSLT,XTSET) ; Entry point for GUI start with selected Test Set IEN - called by %ut-TEST GROUP LOAD rpc - N %utROU,%utLIST,%ut - D SETUT - S %ut("RSLT")=$NA(^TMP("MUNIT-%utRSLT",$J)) K @%ut("RSLT") - D GETSET(XTSET,.%utROU,.%utLIST) - D GETLIST(.%utROU,%utLIST,%ut("RSLT")) - S @%ut("RSLT")@(1)=(@%ut("RSLT")@(1))_"^1" ; 110719 mark as new version - S %utRSLT=%ut("RSLT") - Q - ; -GUILOAD(%utRSLT,%utROUN) ; Entry point for GUI start with %utROUN containing primary routine name - called by %ut-TEST LOAD rpc - N %utROU,%ut - D SETUT - S %ut("RSLT")=$NA(^TMP("MUNIT-%utRSLT",$J)) K @%ut("RSLT") - S %utROU(1)=%utROUN - D GETLIST(.%utROU,1,%ut("RSLT")) - S @%ut("RSLT")@(1)=(@%ut("RSLT")@(1))_"^1" ; 110719 mark as new version - S %utRSLT=%ut("RSLT") - Q - ; -GETLIST(%utROU,%utLIST,%utRSLT) ; called from GUISET, GUILOAD - N I,%utROUL,%utROUN,%ut,XTCOMNT,XTVALUE,%utCNT - S XTVALUE=$NA(^TMP("GUI-MUNIT",$J)) K @XTVALUE - S %utCNT=0,XTCOMNT="" - D GETTREE^%ut1(.%utROU,%utLIST) - F I=1:1 Q:'$D(%utROU(I)) S %utROUL(%utROU(I))="" - S %utROUN="" F S %utROUN=$O(%utROUL(%utROUN)) Q:%utROUN="" D LOAD(%utROUN,.%utCNT,XTVALUE,XTCOMNT,.%utROUL) - M @%utRSLT=@XTVALUE - K @%utRSLT@("SHUTDOWN") - K @%utRSLT@("STARTUP") - S @XTVALUE@("LASTROU")="" ; Use this to keep track of place in routines - Q - ; - ; generate list of unit test routines, entry points and comments on test for entry point -LOAD(%utROUN,%utNCNT,XTVALUE,XTCOMNT,%utROUL) ; called from GETLIST, and recursively from LOAD - I $T(@("^"_%utROUN))="" S %utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_"^^*** ERROR - ROUTINE NAME NOT FOUND" Q - S %utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_U_U_XTCOMNT - ;N %utI,XTX1,XTX2,LINE - N %utI,XTX1,XTX2,LINE,LIST,I - ; 100622 JLI added code to identify STARTUP and TEARDOWN - I $T(@("STARTUP^"_%utROUN))'="",'$D(@XTVALUE@("STARTUP")) S @XTVALUE@("STARTUP")="STARTUP^"_%utROUN - I $T(@("SHUTDOWN^"_%utROUN))'="",'$D(@XTVALUE@("SHUTDOWN")) S @XTVALUE@("SHUTDOWN")="SHUTDOWN^"_%utROUN - ; JLI 140731 handle @TEST identified test tags - D NEWSTYLE^%ut1(.LIST,%utROUN) - F I=1:1:LIST S %utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_U_LIST(I) - ; JLI 140731 end of @TEST addition - F %utI=1:1 S LINE=$T(@("XTENT+"_%utI_"^"_%utROUN)) S XTX1=$P(LINE,";",3) Q:XTX1="" S XTX2=$P(LINE,";",4),%utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_U_XTX1_U_XTX2 - F %utI=1:1 S LINE=$T(@("XTROU+"_%utI_"^"_%utROUN)) S XTX1=$P(LINE,";",3) Q:XTX1="" S XTCOMNT=$P(LINE,";",4) I '$D(%utROUL(XTX1)) S %utROUL(XTX1)="" D LOAD(XTX1,.%utNCNT,XTVALUE,XTCOMNT,.%utROUL) - Q - ; -GUINEXT(%utRSLT,%utLOC,XTGUISEP) ; Entry point for GUI execute next test - called by %ut-TEST NEXT rpc - ; XTGUISEP - added 110719 to provide for changing separator for GUI - ; return from ^ to another value ~~^~~ so that data returned - ; is not affected by ^ values in the data - if not present - ; sets value to default ^ - N %utETRY,%utROUT,XTOLROU,XTVALUE,%utERR,%utGUI - N %ut - I $G(XTGUISEP)="" S XTGUISEP="^" - D SETUT - S %ut("LOC")=%utLOC - S %ut("CURR")=0,%ut("ECNT")=0,%ut("FAIL")=0,%ut("CHK")=0,%ut("NENT")=0,%ut("ERRN")=0 - S XTVALUE=$NA(^TMP("GUI-MUNIT",$J)) - S %ut("RSLT")=$NA(^TMP("GUINEXT",$J)) K @%ut("RSLT") - S %utRSLT=%ut("RSLT") - S %utETRY=$P(%utLOC,U),%utROUT=$P(%utLOC,U,2),XTOLROU=$G(@XTVALUE@("LASTROU")) - S %utGUI=1 - ; I %utROUT'=XTOLROU D I %utROUT="" S @%utRSLT@(1)="" K @XTVALUE Q ;140731 JLI - commented out - D I %utROUT="" S @%utRSLT@(1)="" K @XTVALUE Q ; 140731 JLI - replaced previous line - moves check for SHUTDOWN at end of processing - . I XTOLROU="",$D(@XTVALUE@("STARTUP")) D - . . S %ut("LOC")=@XTVALUE@("STARTUP") - . . N $ETRAP S $ETRAP="D ERROR^%ut" - . . D @(@XTVALUE@("STARTUP")) - . . Q - . S @XTVALUE@("LASTROU")=%utROUT I %utROUT'="",$T(@("SETUP^"_%utROUT))'="" D - . . S %ut("LOC")="SETUP^"_%utROUT - . . N $ETRAP S $ETRAP="D ERROR^%ut" - . . D @("SETUP^"_%utROUT) - . . Q - . I %utROUT="",$D(@XTVALUE@("SHUTDOWN")) D - . . S %ut("LOC")=@XTVALUE@("SHUTDOWN") - . . N $ETRAP S $ETRAP="D ERROR^%ut" - . . D @(@XTVALUE@("SHUTDOWN")) - . . Q - . Q - S %ut("LOC")=%utLOC - S %ut("CHK")=0,%ut("CNT")=1,%utERR=0 - D ; to limit range of error trap so we continue through other tests - . N $ETRAP S $ETRAP="D ERROR^%ut" - . D @%ut("LOC") - . Q - I $T(@("TEARDOWN^"_%utROUT))'="" D - . S %ut("LOC")="TEARDOWN^"_%utROUT - . N $ETRAP S $ETRAP="D ERROR^%ut" - . D @("TEARDOWN^"_%utROUT) - . Q - S @%ut("RSLT")@(1)=%ut("CHK")_XTGUISEP_(%ut("CNT")-1-%utERR)_XTGUISEP_%utERR - Q - ; -TESTCOVR ; entry under coverage analysis - D ENTRY^%uttcovr ; does analysis while running various unit tests - Q - ; +%ut ;VEN-SMH/JLI - PRIMARY PROGRAM FOR M-UNIT TESTING ;08/29/14 09:31 + ;;0.1;MASH UTILITIES;; + ; + ; This routine and its companion, %ut1, provide the basic functionality for + ; running unit tests on parts of M programs either at the command line level + ; or via the M-Unit GUI application for windows operating systems. + ; + ; Original by Dr. Joel Ivey + ; Contributions by Dr. Sam Habiel + ; + ; 100622 JLI - corrected typo in comments where %utINPT was listed as %utINP + ; 100622 JLI - removed a comment which indicated data could potentially be returned from the called routine + ; in the %utINPT array. + ; 100622 JLI - added code to handle STARTUP and SHUTDOWN from GUI app + ; 110719 JLI - modified separators in GUI handling from ^ to ~~^~~ + ; in the variable XTGUISEP if using a newer version of the + ; GUI app (otherwise, it is simply set to ^) since results + ; with a series of ^ embedded disturbed the output reported + ; 130726 SMH - Fixed SETUP and TEARDOWN so that they run before/after each + ; test rather than once. General refactoring. + ; 130726 SMH - SETUT initialized IO in case it's not there to $P. Inits vars + ; using DT^DICRW. + ; 131217 SMH - Change call in SETUP to S U="^" instead of DT^DICRW + ; 131218 SMH - Any checks to $ZE will also check $ZS for GT.M. + ; 131218 SMH - Remove calls to %ZISUTL to manage devices to prevent dependence on VISTA. + ; Use %utNIT("DEV","OLD") for old devices + ; 140109 SMH - Add parameter %utBREAK - Break upon error + ; 1402 SMH - Break will cause the break to happen even on failed tests. + ; 140401 SMH - Added Succeed entry point for take it into your hands tester. + ; 140401 SMH - Reformatted the output of M-Unit so that the test's name + ; will print BEFORE the execution of the test. This has been + ; really confusing for beginning users of M-Unit, so this was + ; necessary. + ; 140401 SMH - OK message gets printed at the end of --- as [OK]. + ; 140401 SMH - FAIL message now prints. Previously, OK failed to be printed. + ; Unfortunately, that's rather passive aggressive. Now it + ; explicitly says that a test failed. + ; 140503 SMH - Fixed IO issues all over the routine. Much simpler now. + ; 140731 JLI - Combined routine changes between JLI and SMH + ; Moved routines from %utNIT and %utNIT1 to %ut and %ut1 + ; Updated unit test routines (%utt1 to %utt6) + ; Created M-UNIT TEST GROUP file at 17.9001 based on the 17.9001 file + Q + ; +EN(%utRNAM,%utVERB,%utBREAK) ; .SR Entry point with primary test routine name, optional 1 for verbose output + N %utLIST,%utROU,%ut + I '+$G(%utVERB) S %utVERB=0 + S %utLIST=1,%utROU(%utLIST)=%utRNAM + D SETUT + D EN1(.%utROU,%utLIST) + Q + ; +SETUT ; + ; VEN/SMH 26JUL2013 + I '($D(IO)#2) S IO=$P + S U="^" + ; VEN/SMH 26JUL2013 END + ; + ; ZEXCEPT: %ut -- NEWED ON ENTRY + S %ut("IO")=IO + S %ut=1 ; set to identify unit test being run check with $$ISUTEST^%ut() + ; + ; ZEXCEPT: %utBREAK + I $G(%utBREAK) S %ut("BREAK")=1 + Q + ; +EN1(%utROU,%utLIST) ; + ; VEN/SMH 26JUL2013 - This block is refactored to fix problems with + ; SETUP and TEARDOWN not happening at the right time + N %utERRL,%utK,%utI,%utJ,%utSTRT + ; ZEXCEPT: %utVERB -- ARGUMENT TO EN + ; ZEXCEPT: %utGUI -- CONDITIONALLY DEFINED BY GUINEXT + ; ZEXCEPT: %ut -- NEWED IN EN + ; + ; Structure map for %ut + ; -- CURR = Counter for routine number. Used as sub in %utROU + ; -- ECNT = Entry point count in loop (cf. NERT); VEN/SMH - Needed? + ; -- FAIL = Number of failures + ; -- CHK = Number of checks ran (TF/EQ/FAIL) + ; -- NENT = Number of entry points ran + ; -- ERRN = Number of errors + S %ut("CURR")=0,%ut("ECNT")=0,%ut("FAIL")=0,%ut("CHK")=0,%ut("NENT")=0,%ut("ERRN")=0 + ; + ; -- GET LIST OF ROUTINES -- + ; first get any tree of routines from this one + D GETTREE^%ut1(.%utROU,.%utLIST) + ; + ; -- STARTUP -- + ; 070224 - following code added to allow one overall STARTUP code JLI + F S %ut("CURR")=%ut("CURR")+1 Q:'$D(%utROU(%ut("CURR"))) D I $G(%utSTRT)'="" D @%utSTRT Q + . I $T(@("STARTUP^"_%utROU(%ut("CURR"))))'="" S %utSTRT="STARTUP^"_%utROU(%ut("CURR")) + . Q + ; 070224 - end of addition JLI + ; + ; + ; Now process each routine that has been referenced + S %ut("CURR")=0 + F S %ut("CURR")=%ut("CURR")+1 Q:'$D(%utROU(%ut("CURR"))) D + . N %utETRY ; Test list to run + . ; + . ; Collect Test list. + . D CHEKTEST^%ut1(%utROU(%ut("CURR")),.%ut,.%utETRY) + . ; + . ; if a SETUP entry point exists, save it off in %ut + . N %utSETUP S %utSETUP="SETUP^"_%utROU(%ut("CURR")) + . S %ut("LINE")=$T(@%utSETUP) I %ut("LINE")'="" S %ut("SETUP")=%utSETUP + . K %utSETUP ; we're done! + . ; + . ; if a TEARDOWN entry point exists, ditto + . N %utTEARDOWN S %utTEARDOWN="TEARDOWN^"_%utROU(%ut("CURR")) + . S %ut("LINE")=$T(@%utTEARDOWN) I %ut("LINE")'="" S %ut("TEARDOWN")=%utTEARDOWN + . K %utTEARDOWN ; done here. + . ; + . ; VEN/SMH 26JUL2013 - this block changed to correct running of setup and teardown + . ; run each of the specified entry points + . ; + . ; == THIS FOR/DO BLOCK IS THE CENTRAL TEST RUNNER == + . S %utI=0 + . F S %utI=$O(%utETRY(%utI)) Q:%utI'>0 S %ut("ENUM")=%ut("ERRN")+%ut("FAIL") D + . . N $ETRAP S $ETRAP="D ERROR^%ut" + . . ; + . . ; Run Set-up Code (only if present) + . . S %ut("ENT")=$G(%ut("SETUP")) ; Current entry + . . S %ut("NAME")="Set-up Code" + . . D:%ut("ENT")]"" @%ut("ENT") + . . ; + . . ; Run actual test + . . S %ut("ECNT")=%ut("ECNT")+1 + . . S %ut("NAME")=%utETRY(%utI,"NAME") + . . S %ut("ENT")=%utETRY(%utI)_"^"_%utROU(%ut("CURR")) + . . I %utVERB,'$D(%utGUI) D VERBOSE1(.%utETRY,%utI) ; Say what we executed. + . . D @%ut("ENT") + . . ; + . . ; Run Teardown Code (only if present) + . . S %ut("ENT")=$G(%ut("TEARDOWN")) + . . S %ut("NAME")="Teardown Code" + . . D:%ut("ENT")]"" @%ut("ENT") + . . ; + . . ; ENUM = Number of errors + failures + . . ; Only print out the success message [OK] If our error number remains + . . ; the same as when we started the loop. + . . I %utVERB,'$D(%utGUI) D + . . . I %ut("ENUM")=(%ut("ERRN")+%ut("FAIL")) D VERBOSE(.%utETRY,%utI,1) I 1 + . . . E D VERBOSE(.%utETRY,%utI,0) + . ; + . ; + . ; keep a %utCNT of number of entry points executed across all routines + . S %ut("NENT")=%ut("NENT")+%ut("ENTN") + . Q + ; + ; -- SHUTDOWN -- + ; 070224 - following code added to allow one overall SHUTDOWN code JLI + N XTFINISH + S %ut("CURR")=0 + F S %ut("CURR")=%ut("CURR")+1 Q:'$D(%utROU(%ut("CURR"))) D I $G(XTFINISH)'="" D @XTFINISH Q + . I $T(@("SHUTDOWN^"_%utROU(%ut("CURR"))))'="" S XTFINISH="SHUTDOWN^"_%utROU(%ut("CURR")) + . Q + ; 070224 - End of addition JLI + ; and output the results + D SETIO + W !!,"Ran ",%utLIST," Routine",$S(%utLIST>1:"s",1:""),", ",%ut("NENT")," Entry Tag",$S(%ut("NENT")>1:"s",1:"") + W !,"Checked ",%ut("CHK")," test",$S(%ut("CHK")>1:"s",1:""),", with ",%ut("FAIL")," failure",$S(%ut("FAIL")'=1:"s",1:"")," and encountered ",%ut("ERRN")," error",$S(%ut("ERRN")'=1:"s",1:""),"." + D RESETIO + Q + ; -- end EN1 +VERBOSE(%utETRY,%utI,SUCCESS) ; Say whether we succeeded or failed. + ; ZEXCEPT: %ut - NEWED IN EN + D SETIO + N I F I=$X+3:1:73 W "-" + W ?73 + I $G(SUCCESS) W "[OK]" + E W "[FAIL]" + D RESETIO + Q + ; +VERBOSE1(%utETRY,%utI) ; Print out the entry point info + ; ZEXCEPT: %ut - NEWED IN EN + D SETIO + W !,%utETRY(%utI) I $G(%utETRY(%utI,"NAME"))'="" W " - ",%utETRY(%utI,"NAME") + D RESETIO + Q +CHKTF(XTSTVAL,XTERMSG) ; Entry point for checking True or False values + ; ZEXCEPT: %utERRL,%utGUI - CREATED IN SETUP, KILLED IN END + ; ZEXCEPT: %ut - NEWED IN EN + ; ZEXCEPT: XTGUISEP - newed in GUINEXT + I '$D(XTSTVAL) D NVLDARG Q + I $G(XTERMSG)="" S XTERMSG="no failure message provided" + S %ut("CHK")=$G(%ut("CHK"))+1 + I '$D(%utGUI) D + . D SETIO + . I 'XTSTVAL W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " D + . . W XTERMSG,! S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") + . . I $D(%ut("BREAK")) BREAK ; Break upon failure + . . Q + . I XTSTVAL W "." + . D RESETIO + . Q + I $D(%utGUI),'XTSTVAL S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_XTERMSG,%ut("FAIL")=%ut("FAIL")+1 + Q + ; +CHKEQ(XTEXPECT,XTACTUAL,XTERMSG) ; Entry point for checking values to see if they are EQUAL + N FAILMSG + ; ZEXCEPT: %utERRL,%utGUI -CREATED IN SETUP, KILLED IN END + ; ZEXCEPT: %ut -- NEWED IN EN + ; ZEXCEPT: XTGUISEP - newed in GUINEXT + I '$D(XTEXPECT)!'$D(XTACTUAL) D NVLDARG Q ; JLI 140824 changed from AND to OR, since both necessary, but only one might be entered + S XTACTUAL=$G(XTACTUAL),XTEXPECT=$G(XTEXPECT) + I $G(XTERMSG)="" S XTERMSG="no failure message provided" + S %ut("CHK")=%ut("CHK")+1 + I XTEXPECT'=XTACTUAL S FAILMSG="<"_XTEXPECT_"> vs <"_XTACTUAL_"> - " + I '$D(%utGUI) D + . D SETIO + . I XTEXPECT'=XTACTUAL W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " W FAILMSG,XTERMSG,! D + . . S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") + . . I $D(%ut("BREAK")) BREAK ; Break upon failure + . . Q + . E W "." + . D RESETIO + . Q + I $D(%utGUI),XTEXPECT'=XTACTUAL S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_FAILMSG_XTERMSG,%ut("FAIL")=%ut("FAIL")+1 + Q + ; +FAIL(XTERMSG) ; Entry point for generating a failure message + ; ZEXCEPT: %utERRL,%utGUI -CREATED IN SETUP, KILLED IN END + ; ZEXCEPT: %ut -- NEWED ON ENTRY + ; ZEXCEPT: XTGUISEP - newed in GUINEXT + I $G(XTERMSG)="" S XTERMSG="no failure message provided" + S %ut("CHK")=%ut("CHK")+1 + I '$D(%utGUI) D + . D SETIO + . W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " W XTERMSG,! D + . . S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") + . . I $D(%ut("BREAK")) BREAK ; Break upon failure + . . Q + . D RESETIO + . Q + I $D(%utGUI) S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_XTERMSG,%ut("FAIL")=%ut("FAIL")+1 + Q +SUCCEED ; Entry point for forcing a success (Thx David Whitten) + ; ZEXCEPT: %utERRL,%utGUI - CREATED IN SETUP, KILLED IN END + ; ZEXCEPT: %ut - NEWED IN EN + ; Switch IO and write out the dot for activity + I '$D(%utGUI) D + . D SETIO + . W "." + . D RESETIO + ; + ; Increment test counter + S %ut("CHK")=%ut("CHK")+1 + QUIT + ; +CHKLEAKS(%utCODE,%utLOC,%utINPT) ; functionality to check for variable leaks on executing a section of code + ; %utCODE - A string that specifies the code that is to be XECUTED and checked for leaks. + ; this should be a complete piece of code (e.g., "S X=$$NOW^XLFDT()" or "D EN^%ut(""ROUNAME"")") + ; %utLOC - A string that is used to indicate the code tested for variable leaks + ; %utINPT - An optional variable which may be passed by reference. This may + ; be used to pass any variable values, etc. into the code to be + ; XECUTED. In this case, set the subscript to the variable name and the + ; value of the subscripted variable to the desired value of the subscript. + ; e.g., (using NAME as my current namespace) + ; S CODE="S %utINPT=$$ENTRY^ROUTINE(ZZVALUE1,ZZVALUE2)" + ; S NAMELOC="ENTRY^ROUTINE leak test" (or simply "ENTRY^ROUTINE") + ; S NAMEINPT("ZZVALUE1")=ZZVALUE1 + ; S NAMEINPT("ZZVALUE2")=ZZVALUE2 + ; D CHKLEAKS^%ut(CODE,NAMELOC,.NAMEINPT) + ; + ; If part of a unit test, any leaked variables in ENTRY^ROUTINE which result + ; from running the code with the variables indicated will be shown as FAILUREs. + ; + ; If called outside of a unit test, any leaked variables will be printed to the + ; current device. + ; + N (%utCODE,%utLOC,%utINPT,DUZ,IO,U,%utERRL,%ut,%utGUI,%utERR,%utI,%utJ,%utK,%utLIST,%utROU,%utSTRT,XTGUISEP) + ; ZEXCEPT: %ut - part of exclusive NEW TESTS FOR EXISTENCE ONLY + ; ZEXCEPT: %utVAR - handled by exclusive NEW + ; + ; ACTIVATE ANY VARIABLES PASSED AS SUBSCRIPTS TO %utINPT TO THEIR VALUES + S %utVAR=" " F S %utVAR=$O(%utINPT(%utVAR)) Q:%utVAR="" S (@%utVAR)=%utINPT(%utVAR) + X %utCODE + N ZZUTVAR S ZZUTVAR="%" + I $G(%ut)=1 D + . I $D(@ZZUTVAR),'$D(%utINPT(ZZUTVAR)) D FAIL^%ut(%utLOC_" VARIABLE LEAK: "_ZZUTVAR) + . F S ZZUTVAR=$O(@ZZUTVAR) Q:ZZUTVAR="" I $E(ZZUTVAR,1,3)'="%ut",'$D(%utINPT(ZZUTVAR)),",DUZ,IO,U,DTIME,ZZUTVAR,DT,%ut,XTGUISEP,"'[(","_ZZUTVAR_",") D FAIL^%ut(%utLOC_" VARIABLE LEAK: "_ZZUTVAR) + . Q + I '($G(%ut)=1) D + . I $D(@ZZUTVAR),'$D(%utINPT(ZZUTVAR)) W !,%utLOC_" VARIABLE LEAK: "_ZZUTVAR + . F S ZZUTVAR=$O(@ZZUTVAR) Q:ZZUTVAR="" I $E(ZZUTVAR,1,3)'="%ut",'$D(%utINPT(ZZUTVAR)),",DUZ,IO,U,DTIME,ZZUTVAR,DT,%ut,XTGUISEP,"'[(","_ZZUTVAR_",") W !,%utLOC_" VARIABLE LEAK: "_ZZUTVAR + . Q + Q + ; +NVLDARG ; generate message for invalid arguments to test + N XTERMSG + ; ZEXCEPT: %ut -- NEWED ON ENTRY + ; ZEXCEPT: %utERRL,%utGUI -CREATED IN SETUP, KILLED IN END + ; ZEXCEPT: XTGUISEP - newed in GUINEXT + S XTERMSG="NO VALUES INPUT TO CHKEQ^%ut - no evaluation possible" + I '$D(%utGUI) D + . D SETIO + . W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - " W XTERMSG,! D + . . S %ut("FAIL")=%ut("FAIL")+1,%utERRL(%ut("FAIL"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=XTERMSG,%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") + . . Q + . D RESETIO + . Q + I $D(%utGUI) S %ut("CNT")=%ut("CNT")+1,@%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"FAILURE"_XTGUISEP_XTERMSG,%ut("FAIL")=%ut("FAIL")+1 + Q + ; +ERROR ; record errors + ; ZEXCEPT: %utERRL,%utGUI,%utERR -CREATED IN SETUP, KILLED IN END + ; ZEXCEPT: %ut -- NEWED ON ENTRY + ; ZEXCEPT: XTGUISEP - newed in GUINEXT + S %ut("CHK")=%ut("CHK")+1 + I '$D(%utGUI) D ERROR1 + I $D(%utGUI) D + . S %ut("CNT")=%ut("CNT")+1 + . S %utERR=%utERR+1 + . S @%ut("RSLT")@(%ut("CNT"))=%ut("LOC")_XTGUISEP_"ERROR"_XTGUISEP_$S(+$SY=47:$ZS,1:$ZE) + . Q + S @($S(+$SY=47:"$ZS",1:"$ZE")_"="_""""""),$EC="" + Q + ; +ERROR1 ; + I $G(%ut("BREAK")) BREAK ; if we are asked to break upon error, please do so! + ; ZEXCEPT: %utERRL -CREATED IN SETUP, KILLED IN END + ; ZEXCEPT: %ut -- NEWED ON ENTRY + D SETIO + W !,%ut("ENT")," - " W:%ut("NAME")'="" %ut("NAME")," - Error: " W $S(+$SY=47:$ZS,1:$ZE),! D + . S %ut("ERRN")=%ut("ERRN")+1,%utERRL(%ut("ERRN"))=%ut("NAME"),%utERRL(%ut("FAIL"),"MSG")=$S(+$SY=47:$ZS,1:$ZE),%utERRL(%ut("FAIL"),"ENTRY")=%ut("ENT") + . Q + D RESETIO + Q +SETIO ; Set M-Unit Device to write the results to... + ; ZEXCEPT: %ut -- NEWED ON ENTRY + I $IO'=%ut("IO") S (IO(0),%ut("DEV","OLD"))=$IO USE %ut("IO") SET IO=$IO + QUIT + ; +RESETIO ; Reset $IO back to the original device if we changed it. + ; ZEXCEPT: %ut -- NEWED ON ENTRY + I $D(%ut("DEV","OLD")) S IO(0)=%ut("IO") U %ut("DEV","OLD") S IO=$IO K %ut("DEV","OLD") + QUIT + ; +ISUTEST() ; .SUPPORTED API TO DETERMINE IF CURRENTLY IN UNIT TEST + ; ZEXCEPT: %ut -- NEWED ON ENTRY + Q $G(%ut)=1 + ; +PICKSET ; .OPT Interactive selection of MUnit Test Group + N DIC,Y,%utROU,%utLIST,DIR + S DIC=17.9001,DIC(0)="AEQM" D ^DIC Q:Y'>0 W ! + D GETSET(+Y,.%utROU,.%utLIST) + N DIC,Y,%ut + D SETUT + D EN1(.%utROU,%utLIST) + S DIR(0)="EA",DIR("A")="Enter RETURN to continue:" D ^DIR K DIR + Q + ; +RUNSET(SETNAME,VERBOSE) ; .SR Run with Specified Selection of MUnit Test Group + N Y,%utROU,%utLIST,%utVERB + Q:$G(SETNAME)="" + S %utVERB=$G(VERBOSE,0) + S Y=+$$FIND1^DIC(17.9001,"","X",SETNAME) Q:Y'>0 + D GETSET(Y,.%utROU,.%utLIST) + N Y,SETNAME,%ut + D SETUT + D EN1(.%utROU,%utLIST) + Q + ; + ; DOSET CAN BE USED TO RUN A SET OF TESTS BASED ON THE IEN IN THE MUNIT TEST GROUP file (#17.9001) +DOSET(IEN,%utVERB) ; 140731 JLI added %utVERB as a second argument + ; IEN - Internal entry number for selected set of tests in the MUNIT TEST GROUP file (#17.9001) + ; %utVERB - optional input that indicates verbose output is permitted + ; + N %utROU,%utLIST + I '$D(%utVERB) S %utVERB=0 + S %utLIST=0 + D GETSET($G(IEN),.%utROU,.%utLIST) + I %utLIST>0 N IEN,%ut D SETUT,EN1(.%utROU,%utLIST) + Q + ; +GETSET(IEN,%utROU,%utLIST) ; JLI 140731 - called from PICKSET, RUNSET, DOSET, GUISET + N IENS,%utROOT + S IENS=IEN_"," D GETS^DIQ(17.9001,IENS,"1*","","%utROOT") + S %utLIST=0,IENS="" F S IENS=$O(%utROOT(17.90011,IENS)) Q:IENS="" S %utLIST=%utLIST+1,%utROU(%utLIST)=%utROOT(17.90011,IENS,.01) + Q + ; +GUISET(%utRSLT,XTSET) ; Entry point for GUI start with selected Test Set IEN - called by %ut-TEST GROUP LOAD rpc + N %utROU,%utLIST,%ut + D SETUT + S %ut("RSLT")=$NA(^TMP("MUNIT-%utRSLT",$J)) K @%ut("RSLT") + D GETSET(XTSET,.%utROU,.%utLIST) + D GETLIST(.%utROU,%utLIST,%ut("RSLT")) + S @%ut("RSLT")@(1)=(@%ut("RSLT")@(1))_"^1" ; 110719 mark as new version + S %utRSLT=%ut("RSLT") + Q + ; +GUILOAD(%utRSLT,%utROUN) ; Entry point for GUI start with %utROUN containing primary routine name - called by %ut-TEST LOAD rpc + N %utROU,%ut + D SETUT + S %ut("RSLT")=$NA(^TMP("MUNIT-%utRSLT",$J)) K @%ut("RSLT") + S %utROU(1)=%utROUN + D GETLIST(.%utROU,1,%ut("RSLT")) + S @%ut("RSLT")@(1)=(@%ut("RSLT")@(1))_"^1" ; 110719 mark as new version + S %utRSLT=%ut("RSLT") + Q + ; +GETLIST(%utROU,%utLIST,%utRSLT) ; called from GUISET, GUILOAD + N I,%utROUL,%utROUN,%ut,XTCOMNT,XTVALUE,%utCNT + S XTVALUE=$NA(^TMP("GUI-MUNIT",$J)) K @XTVALUE + S %utCNT=0,XTCOMNT="" + D GETTREE^%ut1(.%utROU,%utLIST) + F I=1:1 Q:'$D(%utROU(I)) S %utROUL(%utROU(I))="" + S %utROUN="" F S %utROUN=$O(%utROUL(%utROUN)) Q:%utROUN="" D LOAD(%utROUN,.%utCNT,XTVALUE,XTCOMNT,.%utROUL) + M @%utRSLT=@XTVALUE + K @%utRSLT@("SHUTDOWN") + K @%utRSLT@("STARTUP") + S @XTVALUE@("LASTROU")="" ; Use this to keep track of place in routines + Q + ; + ; generate list of unit test routines, entry points and comments on test for entry point +LOAD(%utROUN,%utNCNT,XTVALUE,XTCOMNT,%utROUL) ; called from GETLIST, and recursively from LOAD + I $T(@("^"_%utROUN))="" S %utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_"^^*** ERROR - ROUTINE NAME NOT FOUND" Q + S %utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_U_U_XTCOMNT + ;N %utI,XTX1,XTX2,LINE + N %utI,XTX1,XTX2,LINE,LIST,I + ; 100622 JLI added code to identify STARTUP and TEARDOWN + I $T(@("STARTUP^"_%utROUN))'="",'$D(@XTVALUE@("STARTUP")) S @XTVALUE@("STARTUP")="STARTUP^"_%utROUN + I $T(@("SHUTDOWN^"_%utROUN))'="",'$D(@XTVALUE@("SHUTDOWN")) S @XTVALUE@("SHUTDOWN")="SHUTDOWN^"_%utROUN + ; JLI 140731 handle @TEST identified test tags + D NEWSTYLE^%ut1(.LIST,%utROUN) + F I=1:1:LIST S %utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_U_LIST(I) + ; JLI 140731 end of @TEST addition + F %utI=1:1 S LINE=$T(@("XTENT+"_%utI_"^"_%utROUN)) S XTX1=$P(LINE,";",3) Q:XTX1="" S XTX2=$P(LINE,";",4),%utNCNT=%utNCNT+1,@XTVALUE@(%utNCNT)=%utROUN_U_XTX1_U_XTX2 + F %utI=1:1 S LINE=$T(@("XTROU+"_%utI_"^"_%utROUN)) S XTX1=$P(LINE,";",3) Q:XTX1="" S XTCOMNT=$P(LINE,";",4) I '$D(%utROUL(XTX1)) S %utROUL(XTX1)="" D LOAD(XTX1,.%utNCNT,XTVALUE,XTCOMNT,.%utROUL) + Q + ; +GUINEXT(%utRSLT,%utLOC,XTGUISEP) ; Entry point for GUI execute next test - called by %ut-TEST NEXT rpc + ; XTGUISEP - added 110719 to provide for changing separator for GUI + ; return from ^ to another value ~~^~~ so that data returned + ; is not affected by ^ values in the data - if not present + ; sets value to default ^ + N %utETRY,%utROUT,XTOLROU,XTVALUE,%utERR,%utGUI + N %ut + I $G(XTGUISEP)="" S XTGUISEP="^" + D SETUT + S %ut("LOC")=%utLOC + S %ut("CURR")=0,%ut("ECNT")=0,%ut("FAIL")=0,%ut("CHK")=0,%ut("NENT")=0,%ut("ERRN")=0 + S XTVALUE=$NA(^TMP("GUI-MUNIT",$J)) + S %ut("RSLT")=$NA(^TMP("GUINEXT",$J)) K @%ut("RSLT") + S %utRSLT=%ut("RSLT") + S %utETRY=$P(%utLOC,U),%utROUT=$P(%utLOC,U,2),XTOLROU=$G(@XTVALUE@("LASTROU")) + S %utGUI=1 + S %ut("CHK")=0,%ut("CNT")=1,%utERR=0 + ; I %utROUT'=XTOLROU D I %utROUT="" S @%utRSLT@(1)="" K @XTVALUE Q ;140731 JLI - commented out + ;D I %utROUT="" S @%utRSLT@(1)="" K @XTVALUE Q ; 140731 JLI - replaced previous line - moves check for SHUTDOWN at end of processing + D I %utROUT="" S @%utRSLT@(1)="" Q ; 140829 JLI - Have to leave XTVALUE intact, in case they simply run again for STARTUP, etc. + . I XTOLROU="",$D(@XTVALUE@("STARTUP")) D + . . S %ut("LOC")=@XTVALUE@("STARTUP") + . . N $ETRAP S $ETRAP="D ERROR^%ut" + . . D @(@XTVALUE@("STARTUP")) + . . Q + . S @XTVALUE@("LASTROU")=%utROUT I %utROUT'="",$T(@("SETUP^"_%utROUT))'="" D + . . S %ut("LOC")="SETUP^"_%utROUT + . . N $ETRAP S $ETRAP="D ERROR^%ut" + . . D @("SETUP^"_%utROUT) + . . Q + . I %utROUT="",$D(@XTVALUE@("SHUTDOWN")) D + . . S %ut("LOC")=@XTVALUE@("SHUTDOWN") + . . N $ETRAP S $ETRAP="D ERROR^%ut" + . . D @(@XTVALUE@("SHUTDOWN")) + . . Q + . Q + S %ut("LOC")=%utLOC + S %ut("CHK")=0,%ut("CNT")=1,%utERR=0 + D ; to limit range of error trap so we continue through other tests + . N $ETRAP S $ETRAP="D ERROR^%ut" + . D @%ut("LOC") + . Q + I $T(@("TEARDOWN^"_%utROUT))'="" D + . S %ut("LOC")="TEARDOWN^"_%utROUT + . N $ETRAP S $ETRAP="D ERROR^%ut" + . D @("TEARDOWN^"_%utROUT) + . Q + S @%ut("RSLT")@(1)=%ut("CHK")_XTGUISEP_(%ut("CNT")-1-%utERR)_XTGUISEP_%utERR + Q + ; +TESTCOVR ; entry under coverage analysis + D ENTRY^%uttcovr ; does analysis while running various unit tests + Q + ; diff --git a/Routines/%ut1.m b/Routines/%ut1.m index 6559fb1..f076a76 100644 --- a/Routines/%ut1.m +++ b/Routines/%ut1.m @@ -1,277 +1,267 @@ -%ut1 ;VEN/SMH/JLI - CONTINUATION OF M-UNIT PROCESSING ;2014-09-10 7:41 PM - ;;0.1;MASH UTILITIES; - ; - ;following is original header from XTMUNIT1 in unreleased patch XT*7.3*81 VA code - ;XTMUNIT1 ;JLI/FO-OAK-CONTINUATION OF UNIT TEST ROUTINE ;2014-04-17 5:26 PM - ;;7.3;TOOLKIT;**81**;APR 25 1995;Build 24 - ; - ; - ; Original by Dr. Joel Ivey - ; Major contributions by Dr. Sam Habiel - ; - ; Changes: - ; 130726 SMH - Moved test collection logic from %utUNIT to here (multiple places) - ; 131218 SMH - dependence on XLFSTR removed - ; 131218 SMH - CHEKTEST refactored to use $TEXT instead of ^%ZOSF("LOAD") - ; 131218 SMH - CATCHERR now nulls out $ZS if on GT.M - ; - ; TODO: find this routine and add to repo. - D EN^%ut("%utt3") - Q - ; -CHEKTEST(%utROU,%ut,%utUETRY) ; Collect Test list. - ; %utROU - input - Name of routine to check for tags with @TEST attribute - ; %ut - input/output - passed by reference - ; %utUETRY - input/output - passed by reference - ; - ; Test list collected in two ways: - ; - @TEST on labellines - ; - Offsets of XTENT - ; - S %ut("ENTN")=0 ; Number of test, sub to %utUETRY. - ; - ; This stanza and everything below is for collecting @TEST. - ; VEN/SMH - block refactored to use $TEXT instead of ^%ZOSF("LOAD") - N I,LIST - S I=$L($T(@(U_%utROU))) I I<0 Q "-1^Invalid Routine Name" - N $ETRAP S $ETRAP="D CATCHERR^%ut1" - ; 140731 JLI - the following SMH code is replaced by the code below - ; Complexity galore: $TEXT loops through routine - ; IF tab or space isn't the first character ($C(9,32)) and line contains @TEST - ; Load that line as a testing entry point - ; F I=1:1 S LINE=$T(@("+"_I_U_%utROU)) Q:LINE="" I $C(9,32)'[$E(LINE),$$UP(LINE)["@TEST" D - ; . N TAGNAME,CHAR,NPAREN S TAGNAME="",NPAREN=0 - ; . F Q:LINE="" S CHAR=$E(LINE),LINE=$E(LINE,2,999) Q:CHAR="" Q:" ("[CHAR S TAGNAME=TAGNAME_CHAR - ; . ; should be no paren or arguments - ; . I CHAR="(" Q - ; . F Q:LINE="" S CHAR=$E(LINE) Q:" ;"'[CHAR S LINE=$E(LINE,2,999) - ; . I $$UP($E(LINE,1,5))="@TEST" S LINE=$E(LINE,6,999) D - ; . . S %ut("ENTN")=%ut("ENTN")+1,%utUETRY(%ut("ENTN"))=TAGNAME - ; . . F Q:LINE="" S CHAR=$E(LINE) Q:CHAR?1AN S LINE=$E(LINE,2,999) - ; . . S %utUETRY(%ut("ENTN"),"NAME")=LINE - ; JLI 140731 - end of code replaced by following code - ; JLI 140731 - the following code replaces the code above - D NEWSTYLE(.LIST,%utROU) - F I=1:1:LIST S %ut("ENTN")=%ut("ENTN")+1,%utUETRY(%ut("ENTN"))=$P(LIST(I),U),%utUETRY(%ut("ENTN"),"NAME")=$P(LIST(I),U,2,99) - ; JLI 140731 - end of replacement code - ; - ; - ; This Stanza is to collect XTENT offsets - N %utUI F %utUI=1:1 S %ut("ELIN")=$T(@("XTENT+"_%utUI_"^"_%utROU)) Q:$P(%ut("ELIN"),";",3)="" D - . S %ut("ENTN")=%ut("ENTN")+1,%utUETRY(%ut("ENTN"))=$P(%ut("ELIN"),";",3),%utUETRY(%ut("ENTN"),"NAME")=$P(%ut("ELIN"),";",4) - . Q - ; - QUIT - ; - ; VEN/SMH - Is this catch needed anymore? -CATCHERR ; catch error on trying to load file if it doesn't exist ; JLI 120806 - W !,"In CATCHERR",! ; JLI 140910 DEBUG - S $ZE="",$EC="" - I +$SY=47 S $ZS="" ; VEN/SMH fur GT.M. - QUIT - ; - ; VEN/SMH 26JUL2013 - Moved GETTREE here. -GETTREE(%utROU,%utULIST) ; - ; first get any other routines this one references for running subsequently - ; then any that they refer to as well - ; this builds a tree of all routines referred to by any routine including each only once - N %utUK,%utUI,%utUJ,%utURNAM,%utURLIN - F %utUK=1:1 Q:'$D(%utROU(%utUK)) D - . F %utUI=1:1 S %utURLIN=$T(@("XTROU+"_%utUI_"^"_%utROU(%utUK))) S %utURNAM=$P(%utURLIN,";",3) Q:%utURNAM="" D - . . F %utUJ=1:1:%utULIST I %utROU(%utUJ)=%utURNAM S %utURNAM="" Q - . . I %utURNAM'="",$T(@("+1^"_%utURNAM))="" W:'$D(XWBOS) "Referenced routine ",%utURNAM," not found.",! Q - . . S:%utURNAM'="" %utULIST=%utULIST+1,%utROU(%utULIST)=%utURNAM - QUIT - ; -NEWSTYLE(LIST,ROUNAME) ; JLI 140726 identify and return list of newstyle tags or entries for this routine - ; LIST - input, passed by reference - returns containing array with list of tags identified as tests - ; LIST indicates number of tags identified, LIST(n)=tag^test_info where tag is entry point for test - ; ROUNAME - input - routine name in which tests should be identified - ; - N I,VALUE,LINE - K LIST S LIST=0 - ; search routine by line for a tag and @TEST declaration - F I=1:1 S LINE=$T(@("+"_I_"^"_ROUNAME)) Q:LINE="" S VALUE=$$CHECKTAG(LINE) I VALUE'="" S LIST=LIST+1,LIST(LIST)=VALUE - Q - ; -CHECKTAG(LINE) ; JLI 140726 check line to determine @test TAG - ; LINE - input - Line of code to be checked - ; returns null line if not @TEST line, otherwise TAG^NOTE - N TAG,NOTE,CHAR - I $E(LINE)=" " Q "" ; test entry must have a tag - I $$UP(LINE)'["@TEST" Q "" ; must have @TEST declaration - I $P($$UP(LINE),"@TEST")["(" Q "" ; can't have an argument - S TAG=$P(LINE," "),LINE=$P(LINE," ",2,400),NOTE=$P($$UP(LINE),"@TEST"),LINE=$E(LINE,$L(NOTE)+5+1,$L(LINE)) - F Q:NOTE="" S CHAR=$E(NOTE),NOTE=$E(NOTE,2,$L(NOTE)) I " ;"'[CHAR Q ; - I $L(NOTE)'=0 Q "" ; @TEST must be first text on line - F Q:$E(LINE)'=" " S LINE=$E(LINE,2,$L(LINE)) ; remove leading spaces from test info - S TAG=TAG_U_LINE - Q TAG - ; - ; VEN/SMH 17DEC2013 - Remove dependence on VISTA - Uppercase here instead of XLFSTR. -UP(X) ; - Q $TR(X,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ") - ; -COV(NMSP,COVCODE,VERBOSITY) ; VEN/SMH - PUBLIC ENTRY POINT; Coverage calculations - ; NMSP: Namespace of the routines to analyze. End with * to include all routines. - ; Not using * will only include the routine with NMSP name. - ; e.g. PSOM* will include all routines starting with PSOM - ; PSOM will only include PSOM. - ; COVCODE: Mumps code to run over which coverage will be calculated. Typically Unit Tests. - ; VERBOSITY (optional): Scalar from -1 to 3. - ; - -1 = Global output in ^TMP("%utCOVREPORT",$J) - ; - 0 = Print only total coverage - ; - 1 = Break down by routine - ; - 2 = Break down by routine and tag - ; - 3 = Break down by routine and tag, and print lines that didn't execute for each tag. - ; - Q:'(+$SY=47) ; GT.M only! - ; - ; ZEXCEPT: CTRAP - not really a variable - S VERBOSITY=+$G(VERBOSITY) ; Get 0 if not passed. - N %ZR ; GT.M specific - D SILENT^%RSEL(NMSP,"SRC") ; GT.M specific. On Cache use $O(^$R(RTN)). - ; - N RN S RN="" - W "Loading routines to test coverage...",! - F S RN=$O(%ZR(RN)) Q:RN="" W RN," " D - . N L2 S L2=$T(+2^@RN) - . S L2=$TR(L2,$C(9,32)) ; Translate spaces and tabs out - . I $E(L2,1,2)'=";;" K %ZR(RN) ; Not a human produced routine - ; - N RTNS M RTNS=%ZR - K %ZR - ; - N GL - S GL=$NA(^TMP("%utCOVCOHORT",$J)) - K @GL - D RTNANAL(.RTNS,GL) - K ^TMP("%utCOVCOHORTSAV",$J) - M ^TMP("%utCOVCOHORTSAV",$J)=^TMP("%utCOVCOHORT",$J) - ; - ; - K ^TMP("%utCOVRESULT",$J) - VIEW "TRACE":1:$NA(^TMP("%utCOVRESULT",$J)) ; GT.M START PROFILING - DO ; Run the code, but keep our variables to ourselves. - . NEW $ETRAP,$ESTACK - . SET $ETRAP="Q:($ES&$Q) -9 Q:$ES W ""CTRL-C ENTERED""" - . USE $PRINCIPAL:(CTRAP=$C(3)) - . NEW (DUZ,IO,COVCODE,U,DILOCKTM,DISYS,DT,DTIME,IOBS,IOF,IOM,ION,IOS,IOSL,IOST,IOT,IOXY) - . XECUTE COVCODE - VIEW "TRACE":0:$NA(^TMP("%utCOVRESULT",$J)) ; GT.M STOP PROFILING - ; - D COVCOV($NA(^TMP("%utCOVCOHORT",$J)),$NA(^TMP("%utCOVRESULT",$J))) ; Venn diagram matching between globals - ; - ; Report - I VERBOSITY=-1 D - . K ^TMP("%utCOVREPORT",$J) - . D COVRPTGL($NA(^TMP("%utCOVCOHORTSAV",$J)),$NA(^TMP("%utCOVCOHORT",$J)),$NA(^TMP("%utCOVRESULT",$J)),$NA(^TMP("%utCOVREPORT",$J))) - E D COVRPT($NA(^TMP("%utCOVCOHORTSAV",$J)),$NA(^TMP("%utCOVCOHORT",$J)),$NA(^TMP("%utCOVRESULT",$J)),VERBOSITY) - ; - QUIT - ; -RTNANAL(RTNS,GL) ; [Private] - Routine Analysis - ; Create a global similar to the trace global produced by GT.M in GL - ; Only non-comment lines are stored. - ; A tag is always stored. Tag,0 is stored only if there is code on the tag line (format list or actual code). - ; tags by themselves don't count toward the total. - ; - N RTN S RTN="" - F S RTN=$O(RTNS(RTN)) Q:RTN="" D ; for each routine - . N TAG - . S TAG=RTN ; start the tags at the first - . N I,LN F I=2:1 S LN=$T(@TAG+I^@RTN) Q:LN="" D ; for each line, starting with the 3rd line (2 off the first tag) - . . I $E(LN)?1A D QUIT ; formal line - . . . N T ; Terminator - . . . N J F J=1:1:$L(LN) S T=$E(LN,J) Q:T'?1AN ; Loop to... - . . . S TAG=$E(LN,1,J-1) ; Get tag - . . . S @GL@(RTN,TAG)=TAG ; store line - . . . I T="(" S @GL@(RTN,TAG,0)=LN ; formal list - . . . E D ; No formal list - . . . . N LNTR S LNTR=$P(LN,TAG,2,999),LNTR=$TR(LNTR,$C(9,32)) ; Get rest of line, Remove spaces and tabs - . . . . I $E(LNTR)=";" QUIT ; Comment - . . . . S @GL@(RTN,TAG,0)=LN ; Otherwise, store for testing - . . . S I=0 ; Start offsets from zero (first one at the for will be 1) - . . I $C(32,9)[$E(LN) D QUIT ; Regular line - . . . N LNTR S LNTR=$TR(LN,$C(32,9)) ; Remove all spaces and tabs - . . . I $E(LNTR)=";" QUIT ; Comment line -- don't want. - . . . S @GL@(RTN,TAG,I)=LN ; Record line - QUIT - ; -ACTLINES(GL) ; [Private] $$ ; Count active lines - ; - N CNT S CNT=0 - N REF S REF=GL - N GLQL S GLQL=$QL(GL) - F S REF=$Q(@REF) Q:REF="" Q:(GL'=$NA(@REF,GLQL)) D - . N REFQL S REFQL=$QL(REF) - . N LASTSUB S LASTSUB=$QS(REF,REFQL) - . I LASTSUB?1.N S CNT=CNT+1 - QUIT CNT - ; -COVCOV(C,R) ; [Private] - Analyze coverage Cohort vs Result - N RTN S RTN="" - F S RTN=$O(@C@(RTN)) Q:RTN="" D ; For each routine in cohort set - . I '$D(@R@(RTN)) QUIT ; Not present in result set - . N TAG S TAG="" - . F S TAG=$O(@R@(RTN,TAG)) Q:TAG="" D ; For each tag in the routine in the result set - . . N LN S LN="" - . . F S LN=$O(@R@(RTN,TAG,LN)) Q:LN="" D ; for each line in the tag in the routine in the result set - . . . I $D(@C@(RTN,TAG,LN)) K ^(LN) ; if present in cohort, kill off - QUIT - ; -COVRPT(C,S,R,V) ; [Private] - Coverage Report - ; C = COHORT - Global name - ; S = SURVIVORS - Global name - ; R = RESULT - Global name - ; V = Verbosity - Scalar from -1 to 3 - N ORIGLINES S ORIGLINES=$$ACTLINES(C) - N LEFTLINES S LEFTLINES=$$ACTLINES(S) - W !! - W "ORIG: "_ORIGLINES,! - W "LEFT: "_LEFTLINES,! - W "COVERAGE PERCENTAGE: "_$S(ORIGLINES:$J(ORIGLINES-LEFTLINES/ORIGLINES*100,"",2),1:100.00),! - W !! - W "BY ROUTINE:",! - I V=0 QUIT ; No verbosity. Don't print routine detail - N RTN S RTN="" - F S RTN=$O(@C@(RTN)) Q:RTN="" D - . N O S O=$$ACTLINES($NA(@C@(RTN))) - . N L S L=$$ACTLINES($NA(@S@(RTN))) - . W ?3,RTN,?21,$S(O:$J(O-L/O*100,"",2),1:"100.00"),! - . I V=1 QUIT ; Just print the routine coverage for V=1 - . N TAG S TAG="" - . F S TAG=$O(@C@(RTN,TAG)) Q:TAG="" D - . . N O S O=$$ACTLINES($NA(@C@(RTN,TAG))) - . . N L S L=$$ACTLINES($NA(@S@(RTN,TAG))) - . . W ?5,TAG,?21,$S(O:$J(O-L/O*100,"",2),1:"100.00"),! - . . I V=2 QUIT ; Just print routine/tags coverage for V=2; V=3 print uncovered lines - . . N LN S LN="" - . . F S LN=$O(@S@(RTN,TAG,LN)) Q:LN="" W TAG_"+"_LN_": "_^(LN),! - QUIT - ; -COVRPTGL(C,S,R,OUT) ; [Private] - Coverage Global for silent invokers - ; C = COHORT - Global name - ; S = SURVIVORS - Global name - ; R = RESULT - Global name - ; OUT = OUTPUT - Global name - ; - N O S O=$$ACTLINES(C) - N L S L=$$ACTLINES(S) - S @OUT=(O-L)_"/"_O - N RTN,TAG,LN S (RTN,TAG,LN)="" - F S RTN=$O(@C@(RTN)) Q:RTN="" D - . N O S O=$$ACTLINES($NA(@C@(RTN))) - . N L S L=$$ACTLINES($NA(@S@(RTN))) - . S @OUT@(RTN)=(O-L)_"/"_O - . F S TAG=$O(@C@(RTN,TAG)) Q:TAG="" D - . . N O S O=$$ACTLINES($NA(@C@(RTN,TAG))) - . . N L S L=$$ACTLINES($NA(@S@(RTN,TAG))) - . . S @OUT@(RTN,TAG)=(O-L)_"/"_O - . . F S LN=$O(@S@(RTN,TAG,LN)) Q:LN="" S @OUT@(RTN,TAG,LN)=@S@(RTN,TAG,LN) - QUIT - ; -TESTCOVR ; entry under coverage analysis - D ENTRY^%uttcovr ; does analysis while running various unit tests - Q - ; +%ut1 ;VEN/SMH/JLI - CONTINUATION OF M-UNIT PROCESSING ;09/10/14 14:27 + ;;0.1;MASH UTILITIES;; + ; + ;following is original header from XTMUNIT1 in unreleased patch XT*7.3*81 VA code + ;XTMUNIT1 ;JLI/FO-OAK-CONTINUATION OF UNIT TEST ROUTINE ;2014-04-17 5:26 PM + ;;7.3;TOOLKIT;**81**;APR 25 1995;Build 24 + ; + ; + ; Original by Dr. Joel Ivey + ; Major contributions by Dr. Sam Habiel + ; + ; Changes: + ; 130726 SMH - Moved test collection logic from %utUNIT to here (multiple places) + ; 131218 SMH - dependence on XLFSTR removed + ; 131218 SMH - CHEKTEST refactored to use $TEXT instead of ^%ZOSF("LOAD") + ; 131218 SMH - CATCHERR now nulls out $ZS if on GT.M + ; + Q + ; +CHEKTEST(%utROU,%ut,%utUETRY) ; Collect Test list. + ; %utROU - input - Name of routine to check for tags with @TEST attribute + ; %ut - input/output - passed by reference + ; %utUETRY - input/output - passed by reference + ; + ; Test list collected in two ways: + ; - @TEST on labellines + ; - Offsets of XTENT + ; + S %ut("ENTN")=0 ; Number of test, sub to %utUETRY. + ; + ; This stanza and everything below is for collecting @TEST. + ; VEN/SMH - block refactored to use $TEXT instead of ^%ZOSF("LOAD") + N I,LIST + S I=$L($T(@(U_%utROU))) I I<0 Q "-1^Invalid Routine Name" + ; 140731 JLI - the following SMH code is replaced by the code below + ; Complexity galore: $TEXT loops through routine + ; IF tab or space isn't the first character ($C(9,32)) and line contains @TEST + ; Load that line as a testing entry point + ; F I=1:1 S LINE=$T(@("+"_I_U_%utROU)) Q:LINE="" I $C(9,32)'[$E(LINE),$$UP(LINE)["@TEST" D + ; . N TAGNAME,CHAR,NPAREN S TAGNAME="",NPAREN=0 + ; . F Q:LINE="" S CHAR=$E(LINE),LINE=$E(LINE,2,999) Q:CHAR="" Q:" ("[CHAR S TAGNAME=TAGNAME_CHAR + ; . ; should be no paren or arguments + ; . I CHAR="(" Q + ; . F Q:LINE="" S CHAR=$E(LINE) Q:" ;"'[CHAR S LINE=$E(LINE,2,999) + ; . I $$UP($E(LINE,1,5))="@TEST" S LINE=$E(LINE,6,999) D + ; . . S %ut("ENTN")=%ut("ENTN")+1,%utUETRY(%ut("ENTN"))=TAGNAME + ; . . F Q:LINE="" S CHAR=$E(LINE) Q:CHAR?1AN S LINE=$E(LINE,2,999) + ; . . S %utUETRY(%ut("ENTN"),"NAME")=LINE + ; JLI 140731 - end of code replaced by following code + ; JLI 140731 - the following code replaces the code above + D NEWSTYLE(.LIST,%utROU) + F I=1:1:LIST S %ut("ENTN")=%ut("ENTN")+1,%utUETRY(%ut("ENTN"))=$P(LIST(I),U),%utUETRY(%ut("ENTN"),"NAME")=$P(LIST(I),U,2,99) + ; JLI 140731 - end of replacement code + ; + ; + ; This Stanza is to collect XTENT offsets + N %utUI F %utUI=1:1 S %ut("ELIN")=$T(@("XTENT+"_%utUI_"^"_%utROU)) Q:$P(%ut("ELIN"),";",3)="" D + . S %ut("ENTN")=%ut("ENTN")+1,%utUETRY(%ut("ENTN"))=$P(%ut("ELIN"),";",3),%utUETRY(%ut("ENTN"),"NAME")=$P(%ut("ELIN"),";",4) + . Q + ; + QUIT + ; + ; VEN/SMH 26JUL2013 - Moved GETTREE here. +GETTREE(%utROU,%utULIST) ; + ; first get any other routines this one references for running subsequently + ; then any that they refer to as well + ; this builds a tree of all routines referred to by any routine including each only once + N %utUK,%utUI,%utUJ,%utURNAM,%utURLIN + F %utUK=1:1 Q:'$D(%utROU(%utUK)) D + . F %utUI=1:1 S %utURLIN=$T(@("XTROU+"_%utUI_"^"_%utROU(%utUK))) S %utURNAM=$P(%utURLIN,";",3) Q:%utURNAM="" D + . . F %utUJ=1:1:%utULIST I %utROU(%utUJ)=%utURNAM S %utURNAM="" Q + . . I %utURNAM'="",$T(@("+1^"_%utURNAM))="" W:'$D(XWBOS) "Referenced routine ",%utURNAM," not found.",! Q + . . S:%utURNAM'="" %utULIST=%utULIST+1,%utROU(%utULIST)=%utURNAM + QUIT + ; +NEWSTYLE(LIST,ROUNAME) ; JLI 140726 identify and return list of newstyle tags or entries for this routine + ; LIST - input, passed by reference - returns containing array with list of tags identified as tests + ; LIST indicates number of tags identified, LIST(n)=tag^test_info where tag is entry point for test + ; ROUNAME - input - routine name in which tests should be identified + ; + N I,VALUE,LINE + K LIST S LIST=0 + ; search routine by line for a tag and @TEST declaration + F I=1:1 S LINE=$T(@("+"_I_"^"_ROUNAME)) Q:LINE="" S VALUE=$$CHECKTAG(LINE) I VALUE'="" S LIST=LIST+1,LIST(LIST)=VALUE + Q + ; +CHECKTAG(LINE) ; JLI 140726 check line to determine @test TAG + ; LINE - input - Line of code to be checked + ; returns null line if not @TEST line, otherwise TAG^NOTE + N TAG,NOTE,CHAR + I $E(LINE)=" " Q "" ; test entry must have a tag + I $$UP(LINE)'["@TEST" Q "" ; must have @TEST declaration + I $P($$UP(LINE),"@TEST")["(" Q "" ; can't have an argument + S TAG=$P(LINE," "),LINE=$P(LINE," ",2,400),NOTE=$P($$UP(LINE),"@TEST"),LINE=$E(LINE,$L(NOTE)+5+1,$L(LINE)) + F Q:NOTE="" S CHAR=$E(NOTE),NOTE=$E(NOTE,2,$L(NOTE)) I " ;"'[CHAR Q ; + I $L(NOTE)'=0 Q "" ; @TEST must be first text on line + F Q:$E(LINE)'=" " S LINE=$E(LINE,2,$L(LINE)) ; remove leading spaces from test info + S TAG=TAG_U_LINE + Q TAG + ; + ; VEN/SMH 17DEC2013 - Remove dependence on VISTA - Uppercase here instead of XLFSTR. +UP(X) ; + Q $TR(X,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ") + ; +COV(NMSP,COVCODE,VERBOSITY) ; VEN/SMH - PUBLIC ENTRY POINT; Coverage calculations + ; NMSP: Namespace of the routines to analyze. End with * to include all routines. + ; Not using * will only include the routine with NMSP name. + ; e.g. PSOM* will include all routines starting with PSOM + ; PSOM will only include PSOM. + ; COVCODE: Mumps code to run over which coverage will be calculated. Typically Unit Tests. + ; VERBOSITY (optional): Scalar from -1 to 3. + ; - -1 = Global output in ^TMP("%utCOVREPORT",$J) + ; - 0 = Print only total coverage + ; - 1 = Break down by routine + ; - 2 = Break down by routine and tag + ; - 3 = Break down by routine and tag, and print lines that didn't execute for each tag. + ; + Q:'(+$SY=47) ; GT.M only! + ; + ; ZEXCEPT: CTRAP - not really a variable + S VERBOSITY=+$G(VERBOSITY) ; Get 0 if not passed. + N %ZR ; GT.M specific + D SILENT^%RSEL(NMSP,"SRC") ; GT.M specific. On Cache use $O(^$R(RTN)). + ; + N RN S RN="" + W "Loading routines to test coverage...",! + F S RN=$O(%ZR(RN)) Q:RN="" W RN," " D + . N L2 S L2=$T(+2^@RN) + . S L2=$TR(L2,$C(9,32)) ; Translate spaces and tabs out + . I $E(L2,1,2)'=";;" K %ZR(RN) ; Not a human produced routine + ; + N RTNS M RTNS=%ZR + K %ZR + ; + N GL + S GL=$NA(^TMP("%utCOVCOHORT",$J)) + K @GL + D RTNANAL(.RTNS,GL) + K ^TMP("%utCOVCOHORTSAV",$J) + M ^TMP("%utCOVCOHORTSAV",$J)=^TMP("%utCOVCOHORT",$J) + ; + ; + K ^TMP("%utCOVRESULT",$J) + VIEW "TRACE":1:$NA(^TMP("%utCOVRESULT",$J)) ; GT.M START PROFILING + DO ; Run the code, but keep our variables to ourselves. + . NEW $ETRAP,$ESTACK + . SET $ETRAP="Q:($ES&$Q) -9 Q:$ES W ""CTRL-C ENTERED""" + . USE $PRINCIPAL:(CTRAP=$C(3)) + . NEW (DUZ,IO,COVCODE,U,DILOCKTM,DISYS,DT,DTIME,IOBS,IOF,IOM,ION,IOS,IOSL,IOST,IOT,IOXY) + . XECUTE COVCODE + VIEW "TRACE":0:$NA(^TMP("%utCOVRESULT",$J)) ; GT.M STOP PROFILING + ; + D COVCOV($NA(^TMP("%utCOVCOHORT",$J)),$NA(^TMP("%utCOVRESULT",$J))) ; Venn diagram matching between globals + ; + ; Report + I VERBOSITY=-1 D + . K ^TMP("%utCOVREPORT",$J) + . D COVRPTGL($NA(^TMP("%utCOVCOHORTSAV",$J)),$NA(^TMP("%utCOVCOHORT",$J)),$NA(^TMP("%utCOVRESULT",$J)),$NA(^TMP("%utCOVREPORT",$J))) + E D COVRPT($NA(^TMP("%utCOVCOHORTSAV",$J)),$NA(^TMP("%utCOVCOHORT",$J)),$NA(^TMP("%utCOVRESULT",$J)),VERBOSITY) + ; + QUIT + ; +RTNANAL(RTNS,GL) ; [Private] - Routine Analysis + ; Create a global similar to the trace global produced by GT.M in GL + ; Only non-comment lines are stored. + ; A tag is always stored. Tag,0 is stored only if there is code on the tag line (format list or actual code). + ; tags by themselves don't count toward the total. + ; + N RTN S RTN="" + F S RTN=$O(RTNS(RTN)) Q:RTN="" D ; for each routine + . N TAG + . S TAG=RTN ; start the tags at the first + . N I,LN F I=2:1 S LN=$T(@TAG+I^@RTN) Q:LN="" D ; for each line, starting with the 3rd line (2 off the first tag) + . . I $E(LN)?1A D QUIT ; formal line + . . . N T ; Terminator + . . . N J F J=1:1:$L(LN) S T=$E(LN,J) Q:T'?1AN ; Loop to... + . . . S TAG=$E(LN,1,J-1) ; Get tag + . . . S @GL@(RTN,TAG)=TAG ; store line + . . . I T="(" S @GL@(RTN,TAG,0)=LN ; formal list + . . . E D ; No formal list + . . . . N LNTR S LNTR=$P(LN,TAG,2,999),LNTR=$TR(LNTR,$C(9,32)) ; Get rest of line, Remove spaces and tabs + . . . . I $E(LNTR)=";" QUIT ; Comment + . . . . S @GL@(RTN,TAG,0)=LN ; Otherwise, store for testing + . . . S I=0 ; Start offsets from zero (first one at the for will be 1) + . . I $C(32,9)[$E(LN) D QUIT ; Regular line + . . . N LNTR S LNTR=$TR(LN,$C(32,9)) ; Remove all spaces and tabs + . . . I $E(LNTR)=";" QUIT ; Comment line -- don't want. + . . . S @GL@(RTN,TAG,I)=LN ; Record line + QUIT + ; +ACTLINES(GL) ; [Private] $$ ; Count active lines + ; + N CNT S CNT=0 + N REF S REF=GL + N GLQL S GLQL=$QL(GL) + F S REF=$Q(@REF) Q:REF="" Q:(GL'=$NA(@REF,GLQL)) D + . N REFQL S REFQL=$QL(REF) + . N LASTSUB S LASTSUB=$QS(REF,REFQL) + . I LASTSUB?1.N S CNT=CNT+1 + QUIT CNT + ; +COVCOV(C,R) ; [Private] - Analyze coverage Cohort vs Result + N RTN S RTN="" + F S RTN=$O(@C@(RTN)) Q:RTN="" D ; For each routine in cohort set + . I '$D(@R@(RTN)) QUIT ; Not present in result set + . N TAG S TAG="" + . F S TAG=$O(@R@(RTN,TAG)) Q:TAG="" D ; For each tag in the routine in the result set + . . N LN S LN="" + . . F S LN=$O(@R@(RTN,TAG,LN)) Q:LN="" D ; for each line in the tag in the routine in the result set + . . . I $D(@C@(RTN,TAG,LN)) K ^(LN) ; if present in cohort, kill off + QUIT + ; +COVRPT(C,S,R,V) ; [Private] - Coverage Report + ; C = COHORT - Global name + ; S = SURVIVORS - Global name + ; R = RESULT - Global name + ; V = Verbosity - Scalar from -1 to 3 + N ORIGLINES S ORIGLINES=$$ACTLINES(C) + N LEFTLINES S LEFTLINES=$$ACTLINES(S) + W !! + W "ORIG: "_ORIGLINES,! + W "LEFT: "_LEFTLINES,! + W "COVERAGE PERCENTAGE: "_$S(ORIGLINES:$J(ORIGLINES-LEFTLINES/ORIGLINES*100,"",2),1:100.00),! + W !! + W "BY ROUTINE:",! + I V=0 QUIT ; No verbosity. Don't print routine detail + N RTN S RTN="" + F S RTN=$O(@C@(RTN)) Q:RTN="" D + . N O S O=$$ACTLINES($NA(@C@(RTN))) + . N L S L=$$ACTLINES($NA(@S@(RTN))) + . W ?3,RTN,?21,$S(O:$J(O-L/O*100,"",2),1:"100.00"),! + . I V=1 QUIT ; Just print the routine coverage for V=1 + . N TAG S TAG="" + . F S TAG=$O(@C@(RTN,TAG)) Q:TAG="" D + . . N O S O=$$ACTLINES($NA(@C@(RTN,TAG))) + . . N L S L=$$ACTLINES($NA(@S@(RTN,TAG))) + . . W ?5,TAG,?21,$S(O:$J(O-L/O*100,"",2),1:"100.00"),! + . . I V=2 QUIT ; Just print routine/tags coverage for V=2; V=3 print uncovered lines + . . N LN S LN="" + . . F S LN=$O(@S@(RTN,TAG,LN)) Q:LN="" W TAG_"+"_LN_": "_^(LN),! + QUIT + ; +COVRPTGL(C,S,R,OUT) ; [Private] - Coverage Global for silent invokers + ; C = COHORT - Global name + ; S = SURVIVORS - Global name + ; R = RESULT - Global name + ; OUT = OUTPUT - Global name + ; + N O S O=$$ACTLINES(C) + N L S L=$$ACTLINES(S) + S @OUT=(O-L)_"/"_O + N RTN,TAG,LN S (RTN,TAG,LN)="" + F S RTN=$O(@C@(RTN)) Q:RTN="" D + . N O S O=$$ACTLINES($NA(@C@(RTN))) + . N L S L=$$ACTLINES($NA(@S@(RTN))) + . S @OUT@(RTN)=(O-L)_"/"_O + . F S TAG=$O(@C@(RTN,TAG)) Q:TAG="" D + . . N O S O=$$ACTLINES($NA(@C@(RTN,TAG))) + . . N L S L=$$ACTLINES($NA(@S@(RTN,TAG))) + . . S @OUT@(RTN,TAG)=(O-L)_"/"_O + . . F S LN=$O(@S@(RTN,TAG,LN)) Q:LN="" S @OUT@(RTN,TAG,LN)=@S@(RTN,TAG,LN) + QUIT + ; +TESTCOVR ; entry under coverage analysis + D ENTRY^%uttcovr ; does analysis while running various unit tests + Q + ; diff --git a/Routines/%utcover.m b/Routines/%utcover.m new file mode 100644 index 0000000..245cb1f --- /dev/null +++ b/Routines/%utcover.m @@ -0,0 +1,138 @@ +%utcover ;JLI - generic coverage and unit test runner ;07/02/15 09:56 + ;;1.0;MASH UTILITIES;; + ; + Q + ; +TESTONLY(TESTROUS) ; RUN TESTS FOR SPECIFIED ROUTINES + ; input TESTROUS - passed by reference - array of routine names to run tests for + ; specify those to be called directly by including ^ as part of + ; TAG^ROUTINE or ^ROUTINE. + ; ROUTINE names without a ^ will be called as EN^%ut("ROUTINE") + ; Sometimes to get complete coverage, different entry points may + ; need to be called (e.g., at top and for VERBOSE), these should each + ; be included. + ; If the subscript is a number, it will take the list of comma separated + ; values as the routines. If the the subscript is not a number, it will + ; take it as a routine to be added to the list, then if the value of the + ; contains a comma separated list of routines, they will be added as well. + ; Thus a value of + ; TESTROUS(1)="A^ROU1,^ROU1,^ROU2,ROU3" + ; or a value of + ; TESTROUS("A^ROU1")="^ROU1,^ROU2,ROU3" + ; will both result in tests for + ; D A^ROU1,^ROU1,^ROU2,EN^%ut("ROU3") + K ^TMP("%utCOVER",$J,"TESTROUS") + M ^TMP("%utCOVER",$J,"TESTROUS")=TESTROUS + ; +COVENTRY ; setup of COVERAGE NEWs most variables, so TESTROUS passed by global + ; + N I,ROU,VAL,VALS,UTDATA,TESTS,TESTROUS + M TESTROUS=^TMP("%utCOVER",$J,"TESTROUS") + S ROU="" F S ROU=$O(TESTROUS(ROU)) Q:ROU="" D + . I ROU'=+ROU S TESTS(ROU)="" + . F I=1:1 S VAL=$P(TESTROUS(ROU),",",I) Q:VAL="" S TESTS(VAL)="" + . Q + S ROU="" F S ROU=$O(TESTS(ROU)) Q:ROU="" D + . W !!,"RUNNING ",ROU + . I ROU[U D @ROU + . I ROU'[U D @("EN^%ut("""_ROU_""")") + . S VALS=$G(^TMP("%ut",$J,"UTVALS")) I VALS="" Q + . F I=1:1 S VAL=$P(VALS,U,I) Q:VAL="" S UTDATA(I)=$G(UTDATA(I))+VAL + . K ^TMP("%ut",$J,"UTVALS") + . Q + I $D(UTDATA) D + . W !!!,"------------ SUMMARY ------------" + . W !,"Ran ",UTDATA(1)," Routine",$S(UTDATA(1)>1:"s",1:""),", ",UTDATA(2)," Entry Tag",$S(UTDATA(2)>1:"s",1:"") + . W !,"Checked ",UTDATA(3)," test",$S(UTDATA(3)>1:"s",1:""),", with ",UTDATA(4)," failure",$S(UTDATA(4)'=1:"s",1:"")," and encountered ",UTDATA(5)," error",$S(UTDATA(5)'=1:"s",1:""),"." + . Q + K ^TMP("%utCOVER",$J,"TESTROUS") + Q + ; +COVERAGE(ROUNMSP,TESTROUS,XCLDROUS,RESLTLVL) ; run coverage analysis + ; input ROUNMSP - Namespace for routine(s) to be analyzed + ; ROUNAME will result in only the routine ROUNAME being analyzed + ; ROUN* will result in all routines beginning with ROUN being analyzed + ; input TESTROUS - passed by reference - see TESTROUS description for JUSTTEST + ; input XCLDROUS - passed by reference - routines passed in a manner similar to TESTROUS, + ; but only the routine names, whether as arguments or a comma separated + ; list of routines, will be excluded from the analysis of coverage. These + ; would normally be names of routines which are only for unit tests, or + ; others which should not be included in the analysis for some reason. + ; input RESLTLVL - This value determines the amount of information to be generated for the + ; analysis. A missing or null value will be considered to be level 1 + ; 1 - Listing of analysis only for routine overall + ; 2 - Listing of analysis for routine overall and for each TAG + ; 3 - Full analysis for each tag, and lists out those lines which were + ; not executed during the analysis + ; + N I,ROU,TYPE,VAL,XCLUDE + S RESLTLVL=$G(RESLTLVL,1) + I RESLTLVL<1 S RESLTLVL=1 + I RESLTLVL>3 S RESLTLVL=3 + M ^TMP("%utCOVER",$J,"TESTROUS")=TESTROUS ; + D COV^%ut(ROUNMSP,"D COVENTRY^%utCOVER",-1) + K ^TMP("%utCOVER",$J,"TESTROUS") + S ROU="" F S ROU=$O(XCLDROUS(ROU)) Q:ROU="" D + . I ROU'=+ROU S XCLUDE(ROU)="" + . F I=1:1 S VAL=$P(XCLDROUS(ROU),",",I) Q:VAL="" S XCLUDE(VAL)="" + . Q + D LIST(.XCLUDE,RESLTLVL) + Q + ; +LIST(XCLDROUS,TYPE) ; + ; ZEXCEPT: TYPE1 - NEWed and set below for recursion + ; input - ROULIST - a comma separated list of routine names that will + ; be used to identify desired routines. Any name + ; that begins with one of the specified values will + ; be included + ; input - TYPE - value indicating amount of detail desired + ; 1=summary with listing by routine + ; 2=moderate with listing by tags + ; 3=full with listing of untouched lines + ; + N CURRCOV,CURRLIN,LINCOV,LINE,LINTOT,ROULIST,ROUNAME,TAG,TOTCOV,TOTLIN,XVAL + ; + D TRIMDATA(.XCLDROUS) ; remove undesired routines from data + ; + N JOB,NAME,BASE,GLOB + S GLOB=$NA(^TMP("%utCOVREPORT",$J)) + S TOTCOV=0,TOTLIN=0 + ; F NAME="%utCOVREPORT","%utCOVRESULT","%utCOVCOHORT","%utCOVCOHORTSAV" D + I TYPE>1 S ROUNAME="" F S ROUNAME=$O(@GLOB@(ROUNAME)) Q:ROUNAME="" S XVAL=^(ROUNAME) D + . S CURRCOV=$P(XVAL,"/"),CURRLIN=$P(XVAL,"/",2) + . W !!,"Routine ",ROUNAME," ",CURRCOV," out of ",CURRLIN," lines covered" + . I CURRLIN>0 W " (",$P((100*CURRCOV)/CURRLIN,"."),"%)" + . I TYPE=2 W " - Summary" + . S TAG="" F S TAG=$O(@GLOB@(ROUNAME,TAG)) Q:TAG="" S XVAL=^(TAG) D + . . S LINCOV=$P(XVAL,"/"),LINTOT=$P(XVAL,"/",2) + . . W !," Tag ",TAG,"^",ROUNAME," ",LINCOV," out of ",LINTOT," lines covered" + . . I TYPE=2 Q + . . I LINCOV=LINTOT Q + . . W !," the following is a list of lines NOT covered" + . . S LINE="" F S LINE=$O(@GLOB@(ROUNAME,TAG,LINE)) Q:LINE="" D + . . . I LINE=0 W !," ",TAG," ",@GLOB@(ROUNAME,TAG,LINE) Q + . . . W !," ",TAG,"+",LINE," ",@GLOB@(ROUNAME,TAG,LINE) + . . . Q + . . Q + . Q + ; for type=3 generate a summary at bottom after detail + I TYPE=3 N TYPE1 S TYPE1=2 D LIST(.XCLDROUS,2) K TYPE1 + I TYPE=2,$G(TYPE1) Q ; CAME IN FROM ABOVE LINE + ; summarize by just routine name + W !! + S ROUNAME="" F S ROUNAME=$O(@GLOB@(ROUNAME)) Q:ROUNAME="" S XVAL=^(ROUNAME) D + . S CURRCOV=$P(XVAL,"/"),CURRLIN=$P(XVAL,"/",2) + . S TOTCOV=TOTCOV+CURRCOV,TOTLIN=TOTLIN+CURRLIN + . W !,"Routine ",ROUNAME," ",CURRCOV," out of ",CURRLIN," lines covered" + . I CURRLIN>0 W " (",$P((100*CURRCOV)/CURRLIN,"."),"%)" + W !!,"Overall Analysis ",TOTCOV," out of ",TOTLIN," lines covered" + I TOTLIN>0 W " (",$P((100*TOTCOV)/TOTLIN,"."),"% coverage)" + Q + ; +TRIMDATA(ROULIST) ; + N TYPNAME,ROUNAME + F TYPNAME="%utCOVREPORT","%utCOVRESULT","%utCOVCOHORT","%utCOVCOHORTSAV" D + . S ROUNAME="" F S ROUNAME=$O(ROULIST(ROUNAME)) Q:ROUNAME="" K ^TMP(TYPNAME,$J,ROUNAME) + . Q + Q + ; diff --git a/Routines/%utt1.m b/Routines/%utt1.m index faa5d59..0da83a8 100644 --- a/Routines/%utt1.m +++ b/Routines/%utt1.m @@ -1,149 +1,150 @@ -%utt1 ; VEN/SMH - Testing routines for M-Unit;08/28/14 11:42 - ;;0.1;MASH UTILITIES; -%utNITT ; VEN/SMH - Testing routines for M-Unit;2014-04-01 2:04 PM - ; - ; THIS ROUTINE IS THE UNIFIED UNIT TESTER FOR ALL OF M-UNIT. - ; - ; Dear Users, - ; - ; I know about about the irony of a test suite for the testing suite, - ; so stop snikering. Aside from that, it's actually going to be hard. - ; - ; Truly yours, - ; - ; Sam H - ; - D EN^%ut($T(+0),1) ; Run tests here, be verbose. - QUIT - ; -STARTUP ; M-Unit Start-Up - This runs before anything else. - S ^TMP($J,"%ut","STARTUP")="" - S KBANCOUNT=1 - QUIT - ; -SHUTDOWN ; M-Unit Shutdown - This runs after everything else is done. - K ^TMP($J,"%ut","STARTUP") - K KBANCOUNT - QUIT - ; - ; - ; -SETUP ; This runs before every test. - S KBANCOUNT=KBANCOUNT+1 - QUIT - ; -TEARDOWN ; This runs after every test - S KBANCOUNT=KBANCOUNT-1 - QUIT - ; - ; - ; -T1 ; @TEST - Make sure Start-up Ran - D CHKTF($D(^TMP($J,"%ut","STARTUP")),"Start-up node on ^TMP must exist") - QUIT - ; -T2 ; @TEST - Make sure Set-up runs - D CHKEQ(KBANCOUNT,2,"KBANCount not incremented properly at SETUP") - QUIT - ; -T3 ; @TEST - Make sure Teardown runs - D CHKEQ(KBANCOUNT,2,"KBANCount not decremented properly at TEARDOWN") - QUIT - ; -T4 ; Specified in XTMTAG - ; 140731 JLI - note that this will fail when run from the GUI runner, since it calls each tag separately - I $G(%utGUI) D CHKEQ(%utETRY,"T4","T4 should be the value for %utETRY in the GUI Runner") - I '$G(%utGUI) D CHKEQ(%utETRY(4),"T4","T4 should be the collected as the fourth entry in %utETRY") - QUIT - ; -T5 ; ditto - D CHKTF(0,"This is an intentional failure.") - D CHKEQ(%ut("FAIL"),1,"By this point, we should have failed one test") - D FAIL^%ut("Intentionally throwing a failure") - D CHKEQ(%ut("FAIL"),2,"By this point, we should have failed two tests") - ; S %ut("FAIL")=0 ; Okay... Boy's and Girls... as the developer I can do that. - QUIT - ; -T6 ; ditto - N TESTCOUNT S TESTCOUNT=%ut("CHK") - D SUCCEED^%ut - D SUCCEED^%ut - D CHKEQ(%ut("CHK"),TESTCOUNT+2,"Succeed should increment the number of tests") - QUIT - ; -T7 ; Make sure we write to principal even though we are on another device - ; This is a rather difficult test to carry out for GT.M and Cache... - N D - I +$SY=47 S D="/tmp/test.txt" ; All GT.M ; VMS not supported. - I +$SY=0 D ; All Cache - . I $ZVERSION(1)=2 S D=$SYSTEM.Util.GetEnviron("temp")_"\test.txt" I 1 ; Windows - . E S D="/tmp/test.txt" ; not windows; VMS not supported. - I +$SY=0 O D:"NWS" ; Cache new file - I +$SY=47 O D:(newversion) ; GT.M new file - U D - WRITE "HELLO",! - WRITE "HELLO",! - C D - ; - ; Now open back the file, and read the hello, but open in read only so - ; M-Unit will error out if it will write something out there. - ; - ; Per VISTA conventions, current IO device should be IO, old is IO(0). - ; - I +$SY=0 O D:"R" - I +$SY=47 O D:(readonly) - U D - N X READ X:1 - D CHKTF(X="HELLO") ; This should write to the screen the dot not to the file. - D CHKTF(($$LO($IO)=$$LO(D)),"IO device didn't get reset back") ; $$LO is b/c of a bug in Cache/Windows. $IO is not the same cas D. - I +$SY=0 C D:"D" - I +$SY=47 C D:(delete) - U $P - S IO=$IO - QUIT - ; - ; At the moment T8^%utt1 throws a fail, with no message - ; in the GUI runner. For some reason, both X and Y - ; variables are returned as null strings, while in the - ; command line runner, Y has a value containing the - ; word being sought - ; -T8 ; If IO starts with another device, write to that device as if it's the pricipal device - N D - I +$SY=47 S D="/tmp/test.txt" ; All GT.M ; VMS not supported. - I +$SY=0 D ; All Cache - . I $ZVERSION(1)=2 S D=$SYSTEM.Util.GetEnviron("temp")_"\test.txt" I 1 ; Windows - . E S D="/tmp/test.txt" ; not windows; VMS not supported. - I +$SY=0 O D:"NWS" ; Cache new file - I +$SY=47 O D:(newversion) ; GT.M new file - S IO=D - U D - D ^%utt4 ; Run some Unit Tests - C D - I +$SY=0 O D:"R" ; Cache read only - I +$SY=47 O D:(readonly) ; GT.M read only - U D - N X,Y R X:1,Y:1 - I +$SY=0 C D:"D" - I +$SY=47 C D:(delete) - D CHKTF(Y["MAIN") - S IO=$P - QUIT - ; -LO(X) Q $TR(X,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz") - ; Shortcut methods for M-Unit -CHKTF(X,Y) D CHKTF^%ut(X,$G(Y)) QUIT -CHKEQ(A,B,M) D CHKEQ^%ut(A,B,$G(M)) QUIT - ; -XTENT ; Entry points - ;;T4;Entry point using XTMENT - ;;T5;Error count check - ;;T6;Succeed Entry Point - ;;T7;Make sure we write to principal even though we are on another device - ;;T8;If IO starts with another device, write to that device as if it's the pricipal device - ; -XTROU ; Routines containing additional tests - ;;%utt2; old %utNITU - ;;%utt4; old %utNITW - ;;%utt5; - ;;%utt6; +%utt1 ; VEN/SMH - Testing routines for M-Unit;08/29/14 11:35 + ;;0.1;MASH UTILITIES;; +%utNITT ; VEN/SMH - Testing routines for M-Unit;2014-04-01 2:04 PM + ; + ; THIS ROUTINE IS THE UNIFIED UNIT TESTER FOR ALL OF M-UNIT. + ; + ; Dear Users, + ; + ; I know about about the irony of a test suite for the testing suite, + ; so stop snikering. Aside from that, it's actually going to be hard. + ; + ; Truly yours, + ; + ; Sam H + ; + D EN^%ut($T(+0),1) ; Run tests here, be verbose. + QUIT + ; +STARTUP ; M-Unit Start-Up - This runs before anything else. + S ^TMP($J,"%ut","STARTUP")="" + S KBANCOUNT=1 + QUIT + ; +SHUTDOWN ; M-Unit Shutdown - This runs after everything else is done. + K ^TMP($J,"%ut","STARTUP") + K KBANCOUNT + QUIT + ; + ; + ; +SETUP ; This runs before every test. + S KBANCOUNT=KBANCOUNT+1 + QUIT + ; +TEARDOWN ; This runs after every test + S KBANCOUNT=KBANCOUNT-1 + QUIT + ; + ; + ; +T1 ; @TEST - Make sure Start-up Ran + D CHKTF($D(^TMP($J,"%ut","STARTUP")),"Start-up node on ^TMP must exist") + QUIT + ; +T2 ; @TEST - Make sure Set-up runs + D CHKEQ(KBANCOUNT,2,"KBANCount not incremented properly at SETUP") + QUIT + ; +T3 ; @TEST - Make sure Teardown runs + D CHKEQ(KBANCOUNT,2,"KBANCount not decremented properly at TEARDOWN") + QUIT + ; +T4 ; Specified in XTMTAG + ; 140731 JLI - note that this will fail when run from the GUI runner, since it calls each tag separately + I $G(%utGUI) D CHKEQ(%utETRY,"T4","T4 should be the value for %utETRY in the GUI Runner") + I '$G(%utGUI) D CHKEQ(%utETRY(4),"T4","T4 should be the collected as the fourth entry in %utETRY") + QUIT + ; +T5 ; ditto + D CHKTF(0,"This is an intentional failure.") + D CHKEQ(%ut("FAIL"),1,"By this point, we should have failed one test") + D FAIL^%ut("Intentionally throwing a failure") + D CHKEQ(%ut("FAIL"),2,"By this point, we should have failed two tests") + ; S %ut("FAIL")=0 ; Okay... Boy's and Girls... as the developer I can do that. + QUIT + ; +T6 ; ditto + N TESTCOUNT S TESTCOUNT=%ut("CHK") + D SUCCEED^%ut + D SUCCEED^%ut + D CHKEQ(%ut("CHK"),TESTCOUNT+2,"Succeed should increment the number of tests") + QUIT + ; +T7 ; Make sure we write to principal even though we are on another device + ; This is a rather difficult test to carry out for GT.M and Cache... + N D + I +$SY=47 S D="/tmp/test.txt" ; All GT.M ; VMS not supported. + I +$SY=0 D ; All Cache + . I $ZVERSION(1)=2 S D=$SYSTEM.Util.GetEnviron("temp")_"\test.txt" I 1 ; Windows + . E S D="/tmp/test.txt" ; not windows; VMS not supported. + I +$SY=0 O D:"NWS" ; Cache new file + I +$SY=47 O D:(newversion) ; GT.M new file + U D + WRITE "HELLO",! + WRITE "HELLO",! + C D + ; + ; Now open back the file, and read the hello, but open in read only so + ; M-Unit will error out if it will write something out there. + ; + ; Per VISTA conventions, current IO device should be IO, old is IO(0). + ; + I +$SY=0 O D:"R" + I +$SY=47 O D:(readonly) + U D + N X READ X:1 + D CHKTF(X="HELLO") ; This should write to the screen the dot not to the file. + D CHKTF(($$LO($IO)=$$LO(D)),"IO device didn't get reset back") ; $$LO is b/c of a bug in Cache/Windows. $IO is not the same cas D. + I +$SY=0 C D:"D" + I +$SY=47 C D:(delete) + U $P + S IO=$IO + QUIT + ; + ; At the moment T8^%utt1 throws a fail, with no message + ; in the GUI runner. For some reason, both X and Y + ; variables are returned as null strings, while in the + ; command line runner, Y has a value containing the + ; word being sought + ; +T8 ; If IO starts with another device, write to that device as if it's the pricipal device + N D + I +$SY=47 S D="/tmp/test.txt" ; All GT.M ; VMS not supported. + I +$SY=0 D ; All Cache + . I $ZVERSION(1)=2 S D=$SYSTEM.Util.GetEnviron("temp")_"\test.txt" I 1 ; Windows + . E S D="/tmp/test.txt" ; not windows; VMS not supported. + I +$SY=0 O D:"NWS" ; Cache new file + I +$SY=47 O D:(newversion) ; GT.M new file + S IO=D + U D + D ^%utt4 ; Run some Unit Tests + C D + I +$SY=0 O D:"R" ; Cache read only + I +$SY=47 O D:(readonly) ; GT.M read only + U D + N X,Y,Z R X:1,Y:1,Z:1 + I +$SY=0 C D:"D" + I +$SY=47 C D:(delete) + ;D CHKTF(Y["MAIN") ; JLI 140829 commented out, gui doesn't run verbose + D CHKTF((Y["MAIN")!(Z["Ran 1 Routine"),"Write to system during test didn't work") + S IO=$P + QUIT + ; +LO(X) Q $TR(X,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz") + ; Shortcut methods for M-Unit +CHKTF(X,Y) D CHKTF^%ut(X,$G(Y)) QUIT +CHKEQ(A,B,M) D CHKEQ^%ut(A,B,$G(M)) QUIT + ; +XTENT ; Entry points + ;;T4;Entry point using XTMENT + ;;T5;Error count check + ;;T6;Succeed Entry Point + ;;T7;Make sure we write to principal even though we are on another device + ;;T8;If IO starts with another device, write to that device as if it's the pricipal device + ; +XTROU ; Routines containing additional tests + ;;%utt2; old %utNITU + ;;%utt4; old %utNITW + ;;%utt5; + ;;%utt6; diff --git a/Routines/%utt2.m b/Routines/%utt2.m index 4b42d24..b2d62ea 100644 --- a/Routines/%utt2.m +++ b/Routines/%utt2.m @@ -1,12 +1,12 @@ -%utt2 ; VEN/SMH - Bad Ass Continuation of Unit Tests;08/04/14 09:12 - ;;0.1;MASH UTILITIES; -XTMUNITU ; VEN/SMH - Bad Ass Continuation of Unit Tests;2014-04-01 1:03 PM - ; -T11 ; @TEST An @TEST Entry point in Another Routine invoked through XTROU offsets - D CHKTF^%ut(1) - QUIT -T12 ; - D CHKTF^%ut(1) - QUIT -XTENT ; - ;;T12;An XTENT offset entry point in Another Routine invoked through XTROU offsets +%utt2 ; VEN/SMH - Bad Ass Continuation of Unit Tests;08/04/14 09:12 + ;;0.1;MASH UTILITIES;; +XTMUNITU ; VEN/SMH - Bad Ass Continuation of Unit Tests;2014-04-01 1:03 PM + ; +T11 ; @TEST An @TEST Entry point in Another Routine invoked through XTROU offsets + D CHKTF^%ut(1) + QUIT +T12 ; + D CHKTF^%ut(1) + QUIT +XTENT ; + ;;T12;An XTENT offset entry point in Another Routine invoked through XTROU offsets diff --git a/Routines/%utt3.m b/Routines/%utt3.m index b55fec1..feb7f35 100644 --- a/Routines/%utt3.m +++ b/Routines/%utt3.m @@ -1,43 +1,43 @@ -%utt3 ; VEN/SMH - Unit Tests Coverage Tests;08/14/14 14:02 - ;;0.1;MASH UTILITIES; -XTMUNITV ; VEN/SMH - Unit Tests Coverage Tests;2014-04-16 7:14 PM - ; - ; *** BE VERY CAREFUL IN MODIFIYING THIS ROUTINE *** - ; *** THE UNIT TEST COUNTS ACTIVE AND INACTIVE LINES OF CODE *** - ; *** IF YOU MODIFY THIS, MODIFY XTMUNITW AS WELL *** - ; - ; Coverage tester in %utt4 - ; 20 Lines of code - ; 5 do not run as they are dead code - ; Expected Coverage: 15/20 = 75% - ; -STARTUP ; Doesn't count - N X ; Counts - S X=1 ; Counts - QUIT ; Counts - ; -SHUTDOWN K X,Y QUIT ; Counts; ZEXCEPT: X,Y - ; -SETUP S Y=$G(Y)+1 QUIT ; Counts - ; -TEARDOWN ; Doesn't count - S Y=Y-1 ; Counts - QUIT ; Counts - ; -T1 ; @TEST Test 1 - D CHKTF^%ut($D(Y)) ; Counts - QUIT ; Counts - ; -T2 ; @TEST Test 2 - D INTERNAL(1) ; Counts - D CHKTF^%ut(1) ; Counts - QUIT ; Counts - S X=1 ; Dead code - QUIT ; Dead code - ; -INTERNAL(A) ; Counts - S A=A+1 ; Counts - QUIT ; Counts - S A=2 ; Dead code - S Y=2 ; Dead code - QUIT ; Dead code +%utt3 ; VEN/SMH - Unit Tests Coverage Tests;08/14/14 14:02 + ;;0.1;MASH UTILITIES;; +XTMUNITV ; VEN/SMH - Unit Tests Coverage Tests;2014-04-16 7:14 PM + ; + ; *** BE VERY CAREFUL IN MODIFIYING THIS ROUTINE *** + ; *** THE UNIT TEST COUNTS ACTIVE AND INACTIVE LINES OF CODE *** + ; *** IF YOU MODIFY THIS, MODIFY XTMUNITW AS WELL *** + ; + ; Coverage tester in %utt4 + ; 20 Lines of code + ; 5 do not run as they are dead code + ; Expected Coverage: 15/20 = 75% + ; +STARTUP ; Doesn't count + N X ; Counts + S X=1 ; Counts + QUIT ; Counts + ; +SHUTDOWN K X,Y QUIT ; Counts; ZEXCEPT: X,Y + ; +SETUP S Y=$G(Y)+1 QUIT ; Counts + ; +TEARDOWN ; Doesn't count + S Y=Y-1 ; Counts + QUIT ; Counts + ; +T1 ; @TEST Test 1 + D CHKTF^%ut($D(Y)) ; Counts + QUIT ; Counts + ; +T2 ; @TEST Test 2 + D INTERNAL(1) ; Counts + D CHKTF^%ut(1) ; Counts + QUIT ; Counts + S X=1 ; Dead code + QUIT ; Dead code + ; +INTERNAL(A) ; Counts + S A=A+1 ; Counts + QUIT ; Counts + S A=2 ; Dead code + S Y=2 ; Dead code + QUIT ; Dead code diff --git a/Routines/%utt4.m b/Routines/%utt4.m index 5ee6712..9dec328 100644 --- a/Routines/%utt4.m +++ b/Routines/%utt4.m @@ -1,22 +1,21 @@ -%utt4 ; VEN/SMH - Coverage Test Runner;2014-08-28 8:37 PM - ;;0.1;MASH UTILITIES; -XTMUNITW ; VEN/SMH - Coverage Test Runner;2014-04-17 3:30 PM - ;;7.3;KERNEL TOOLKIT;; - ; - ; This tests code in XTMUNITV for coverage - D EN^%ut($T(+0),1) QUIT - ; -MAIN ; @TEST - Test coverage calculations - Q:$D(^TMP("%uttcovr",$J)) ; already running coverage analysis from %uttcovr - Q:$$ISUTEST^%ut ; already running a unit test - Q:'(+$SY=47) ; GT.M ONLY - ;D COV^%ut1("XTMUNITV","D EN^%ut(""XTMUNITV"",1)",-1) ; Only produce output global. - D COV^%ut1("%utt3","D EN^%ut(""%utt3"",1)",-1) ; Only produce output global. - D CHKEQ^%ut(^TMP("%utCOVREPORT",$J),"15/20") - ;D CHKEQ^%ut(^TMP("XTMCOVREPORT",$J,"XTMUNITV","INTERNAL"),"3/6") - D CHKEQ^%ut(^TMP("%utCOVREPORT",$J,"%utt3","INTERNAL"),"3/6") - ;D CHKTF^%ut($D(^TMP("XTMCOVREPORT",$J,"XTMUNITV","T2",4))) - D CHKTF^%ut($D(^TMP("%utCOVREPORT",$J,"%utt3","T2",4))) - ;D CHKEQ^%ut(^TMP("XTMCOVREPORT",$J,"XTMUNITV","SETUP"),"1/1") - D CHKEQ^%ut(^TMP("%utCOVREPORT",$J,"%utt3","SETUP"),"1/1") - QUIT +%utt4 ; VEN/SMH - Coverage Test Runner;08/23/14 08:33 + ;;0.1;MASH UTILITIES;; +XTMUNITW ; VEN/SMH - Coverage Test Runner;2014-04-17 3:30 PM + ;;7.3;KERNEL TOOLKIT;; + ; + ; This tests code in XTMUNITV for coverage + D EN^%ut($T(+0),1) QUIT + ; +MAIN ; @TEST - Test coverage calculations + Q:$D(^TMP("%uttcovr",$J)) ; already running coverage analysis from %uttcovr + Q:'(+$SY=47) ; GT.M ONLY + ;D COV^%ut1("XTMUNITV","D EN^%ut(""XTMUNITV"",1)",-1) ; Only produce output global. + D COV^%ut1("%utt3","D EN^%ut(""%utt3"",1)",-1) ; Only produce output global. + D CHKEQ^%ut(^TMP("%utCOVREPORT",$J),"15/20") + ;D CHKEQ^%ut(^TMP("XTMCOVREPORT",$J,"XTMUNITV","INTERNAL"),"3/6") + D CHKEQ^%ut(^TMP("%utCOVREPORT",$J,"%utt3","INTERNAL"),"3/6") + ;D CHKTF^%ut($D(^TMP("XTMCOVREPORT",$J,"XTMUNITV","T2",4))) + D CHKTF^%ut($D(^TMP("%utCOVREPORT",$J,"%utt3","T2",4))) + ;D CHKEQ^%ut(^TMP("XTMCOVREPORT",$J,"XTMUNITV","SETUP"),"1/1") + D CHKEQ^%ut(^TMP("%utCOVREPORT",$J,"%utt3","SETUP"),"1/1") + QUIT diff --git a/Routines/%utt5.m b/Routines/%utt5.m index 6978a06..a56a8e8 100644 --- a/Routines/%utt5.m +++ b/Routines/%utt5.m @@ -1,123 +1,135 @@ -%utt5 ;JLI - test for aspects of MUnit functionality ;08/24/14 21:31 - ;;0.1;MASH UTILITIES; - Q - ; -OLDSTYLE ; - ; ZEXCEPT: %ut - Newed in EN^%zu - ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 - I $D(%utt6var) S %ut("ENT")="OLDSTYLE",%utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"OLDSTYLE")="" - D CHKEQ^%ut(5,5,"SET EQUAL ON PURPOSE - OLDSTYLE DONE") - D CHKTF^%ut(4=4,"MY EQUAL VALUE") - Q - ; -OLDSTYL1 ; - ; ZEXCEPT: %ut - Newed in EN^%zu - ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 - I $D(%utt6var) S %ut("ENT")="OLDSTYL1",%utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"OLDSTYL1")="" - D CHKEQ^%ut(4,4,"SET EQUAL ON PURPOSE - OLDSTYL1 DONE") - Q - ; -NEWSTYLE ; @TEST identify new style test indicator functionality - ; ZEXCEPT: %ut - Newed in EN^%zu - ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 - I $D(%utt6var) S %ut("ENT")="NEWSTYLE" S %utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"NEWSTYLE")="" - D CHKEQ^%ut(4,4,"SET EQUAL ON PURPOSE - NEWSTYLE DONE") - Q - ; -BADCHKEQ ; - ; ZEXCEPT: %ut - Newed in EN^%zu - ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 - I $D(%utt6var) S %ut("ENT")="BADCHKEQ" S %utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"BADCHKEQ")="" - D CHKEQ^%ut(4,3,"SET UNEQUAL ON PURPOSE - SHOULD FAIL") - Q - ; -BADCHKTF ; - ; ZEXCEPT: %ut - Newed in EN^%zu - ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 - I $D(%utt6var) S %ut("ENT")="BADCHKTF" S %utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"BADCHKTF")="" - D CHKTF^%ut(0,"SET FALSE (0) ON PURPOSE - SHOULD FAIL") - Q - ; -BADERROR ; - ; ZEXCEPT: %ut - Newed in EN^%zu - ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 - N X - I $D(%utt6var) S %ut("ENT")="BADERROR" S %utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"BADERROR")="" - ; following syntax error is on purpose to throw an error - S X= ; syntax error on purpose - Q - ; -CALLFAIL ; - ; ZEXCEPT: %ut - Newed in EN^%zu - ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 - N X - I $D(%utt6var) S %ut("ENT")="CALLFAIL" S %utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"CALLFAIL")="" - D FAIL^%ut("Called FAIL to test it") - Q - ; -LEAKSOK ; - N CODE,LOCATN,MYVALS,X - S CODE="S X=$$NOW^XLFDT()",LOCATN="LEAKSOK TEST",MYVALS("X")="" - D CHKLEAKS^%ut(CODE,LOCATN,.MYVALS) ; should find no leaks - Q - ; -LEAKSBAD ; - N CODE,LOCATN,MYVALS,X - S CODE="S X=$$NOW^XLFDT()",LOCATN="LEAKSBAD TEST - X NOT SPECIFIED" - D CHKLEAKS^%ut(CODE,LOCATN,.MYVALS) ; should find X since it isn't indicated - Q - ; -NVLDARG1 ; - D CHKEQ^%ut(1) - Q - ; -ISUTEST ; - D CHKTF^%ut($$ISUTEST^%ut,"ISUTEST returned FALSE!") - Q - ; -BADFORM1(X) ; @TEST should not be selected - arguments - ; ZEXCEPT: %ut - Newed in EN^%zu - ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 - I $D(%utt6var) S %ut("ENT")="NEWSTYLE" S %utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"BADFORM1")="" - D CHKEQ^%ut(4,3,"SHOULD NOT BE SELECTED - ARGUMENTS - BADFORM1") - Q - ; -BADFORM2 ; ABC @TEST should not be selected - @TEST NOT FIRST - ; ZEXCEPT: %ut - Newed in EN^%zu - ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 - I $D(%utt6var) S %utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"BADFORM2")="" - D CHKEQ^%ut(4,3,"SHOULD NOT BE SELECTED - @TEST NOT FIRST - BADFORM2") - Q - ; -STARTUP ; - ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 - I $D(%utt6var),$D(^TMP("%utt5",$J)) K ^TMP("%utt5",$J) - I $D(%utt6var) S %utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"STARTUP")="" - Q - ; -SHUTDOWN ; - ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 - I $D(%utt6var) S %utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"SHUTDOWN")="" - Q - ; -SETUP ; - ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 - I $D(%utt6var) S %utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"SETUP")="" - Q - ; -TEARDOWN ; - ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 - I $D(%utt6var) S %utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"TEARDOWN")="" - Q - ; -XTENT ; - ;;OLDSTYLE; identify old style test indicator functionality - ;;OLDSTYL1; identify old style test indicator 2 - ;;BADCHKEQ; CHKEQ should fail on unequal value - ;;BADCHKTF; CHKTF should fail on false value - ;;BADERROR; throws an error on purpose - ;;CALLFAIL; called FAIL to test it - ;;LEAKSOK;check leaks should be ok - ;;LEAKSBAD;check leaks with leak - ;;NVLDARG1;check invalid arg in CHKEQ - ;;ISUTEST;check ISUTEST inside unit test +%utt5 ;JLI - test for aspects of MUnit functionality ;08/29/14 11:23 + ;;0.1;MASH UTILITIES;; + Q + ; +OLDSTYLE ; + ; ZEXCEPT: %ut - Newed in EN^%zu + ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 + I $D(%utt6var) S %ut("ENT")="OLDSTYLE",%utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"OLDSTYLE")="" + D CHKEQ^%ut(5,5,"SET EQUAL ON PURPOSE - OLDSTYLE DONE") + D CHKTF^%ut(4=4,"MY EQUAL VALUE") + Q + ; +OLDSTYL1 ; + ; ZEXCEPT: %ut - Newed in EN^%zu + ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 + I $D(%utt6var) S %ut("ENT")="OLDSTYL1",%utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"OLDSTYL1")="" + D CHKEQ^%ut(4,4,"SET EQUAL ON PURPOSE - OLDSTYL1 DONE") + Q + ; +NEWSTYLE ; @TEST identify new style test indicator functionality + ; ZEXCEPT: %ut - Newed in EN^%zu + ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 + I $D(%utt6var) S %ut("ENT")="NEWSTYLE" S %utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"NEWSTYLE")="" + D CHKEQ^%ut(4,4,"SET EQUAL ON PURPOSE - NEWSTYLE DONE") + Q + ; +BADCHKEQ ; + ; ZEXCEPT: %ut - Newed in EN^%zu + ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 + I $D(%utt6var) S %ut("ENT")="BADCHKEQ" S %utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"BADCHKEQ")="" + D CHKEQ^%ut(4,3,"SET UNEQUAL ON PURPOSE - SHOULD FAIL") + Q + ; +BADCHKTF ; + ; ZEXCEPT: %ut - Newed in EN^%zu + ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 + I $D(%utt6var) S %ut("ENT")="BADCHKTF" S %utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"BADCHKTF")="" + D CHKTF^%ut(0,"SET FALSE (0) ON PURPOSE - SHOULD FAIL") + Q + ; +BADERROR ; + ; ZEXCEPT: %ut - Newed in EN^%zu + ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 + N X + I $D(%utt6var) S %ut("ENT")="BADERROR" S %utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"BADERROR")="" + ; following syntax error is on purpose to throw an error + S X= ; syntax error on purpose + Q + ; +CALLFAIL ; + ; ZEXCEPT: %ut - Newed in EN^%zu + ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 + N X + I $D(%utt6var) S %ut("ENT")="CALLFAIL" S %utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"CALLFAIL")="" + D FAIL^%ut("Called FAIL to test it") + Q + ; +LEAKSOK ; + N CODE,LOCATN,MYVALS,X + S CODE="S X=$$NOW^XLFDT()",LOCATN="LEAKSOK TEST",MYVALS("X")="" + D CHKLEAKS^%ut(CODE,LOCATN,.MYVALS) ; should find no leaks + Q + ; +LEAKSBAD ; + N CODE,LOCATN,MYVALS,X + S CODE="S X=$$NOW^XLFDT()",LOCATN="LEAKSBAD TEST - X NOT SPECIFIED" + D CHKLEAKS^%ut(CODE,LOCATN,.MYVALS) ; should find X since it isn't indicated + Q + ; +NVLDARG1 ; + D CHKEQ^%ut(1) + Q + ; +ISUTEST ; + D CHKTF^%ut($$ISUTEST^%ut,"ISUTEST returned FALSE!") + Q + ; +BADFORM1(X) ; @TEST should not be selected - arguments + ; ZEXCEPT: %ut - Newed in EN^%zu + ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 + I $D(%utt6var) S %ut("ENT")="NEWSTYLE" S %utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"BADFORM1")="" + D CHKEQ^%ut(4,3,"SHOULD NOT BE SELECTED - ARGUMENTS - BADFORM1") + Q + ; +BADFORM2 ; ABC @TEST should not be selected - @TEST NOT FIRST + ; ZEXCEPT: %ut - Newed in EN^%zu + ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 + I $D(%utt6var) S %utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"BADFORM2")="" + D CHKEQ^%ut(4,3,"SHOULD NOT BE SELECTED - @TEST NOT FIRST - BADFORM2") + Q + ; +STARTUP ; + ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 + ; ZEXCEPT: KBANCOUNT created here, killed in SHUTDOWN + I $D(%utt6var),$D(^TMP("%utt5",$J)) K ^TMP("%utt5",$J) + I $D(%utt6var) S %utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"STARTUP")="" + ; following brought from %utt1, since only one STARTUP can RUN in a set + I '$D(%utt6var) D + . S ^TMP($J,"%ut","STARTUP")="" + . S KBANCOUNT=1 + . Q + Q + ; +SHUTDOWN ; + ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 + ; ZEXCEPT: KBANCOUNT created in STARTUP, killed here + I $D(%utt6var) S %utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"SHUTDOWN")="" + ; following brought from %utt1, since only one SHUTDOWN can RUN in a set + I '$D(%utt6var) D + . K ^TMP($J,"%ut","STARTUP") + . K KBANCOUNT + . Q + Q + ; +SETUP ; + ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 + I $D(%utt6var) S %utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"SETUP")="" + Q + ; +TEARDOWN ; + ; ZEXCEPT: %utt6cnt,%utt6var - if present, NEWED following top entry of routine %utt6 + I $D(%utt6var) S %utt6cnt=$G(%utt6cnt)+1,^TMP("%utt5",$J,%utt6cnt,"TEARDOWN")="" + Q + ; +XTENT ; + ;;OLDSTYLE; identify old style test indicator functionality + ;;OLDSTYL1; identify old style test indicator 2 + ;;BADCHKEQ; CHKEQ should fail on unequal value + ;;BADCHKTF; CHKTF should fail on false value + ;;BADERROR; throws an error on purpose + ;;CALLFAIL; called FAIL to test it + ;;LEAKSOK;check leaks should be ok + ;;LEAKSBAD;check leaks with leak + ;;NVLDARG1;check invalid arg in CHKEQ + ;;ISUTEST;check ISUTEST inside unit test diff --git a/Routines/%utt6.m b/Routines/%utt6.m index a4aef02..6a7ddc6 100644 --- a/Routines/%utt6.m +++ b/Routines/%utt6.m @@ -1,110 +1,112 @@ -%utt6 ;JLI - Unit tests for MUnit functionality ;08/28/14 11:52 - ;;0.1;MASH UTILITIES; - ; - ; This routine uses ZZUTJLI2 as a test routine, it does not include the routine as an extension, - ; since it uses it for tests. - ; - ; ZZUTJLI2 currently contains 3 tests (2 old style, 1 new style), it also specifies STARTUP and - ; SHUTDOWN (should be 1 each) and SETUP and TEARDOWN (should be 3 each, 1 for each test) enteries, each of these - ; creates an entry under the ^TMP("ZZUTJLI2" global node, indicating function then continues the process. - ; Should be 2+3n entries (1+1 for STARTUP and SHUTDOWN, then 3 for each of the tests (SETUP, test, - ; and TEARDOWN). - ; - ; This first section is more of a functional test, since it checks the full unit test processing from both - ; a command line and a GUI call approach. Data for analysis is saved under ^TMP("ZZUTJLI2_C", for command - ; line and ^TMP("ZZUTJLI2_G", for gui processing. - ; - ; The counts for the command line processing are based on the number of unit test tags - ; determined for the GUI processing as well. The numbers are 2 (startup and shutdown) - ; + 3 x the number of tests present. - ; - ; run unit tests by command line - N VERBOSE - S VERBOSE=0 -VERBOSE ; - I '$D(VERBOSE) N VERBOSE S VERBOSE=1 - N ZZUTCNT,JLICNT,JLIEXPCT,JLII,JLIX,ZZUTRSLT,%utt5,%utt6,%utt6var - W !!,"RUNNING COMMAND LINE TESTS VIA DOSET^%ut",! - D DOSET^%ut(1,VERBOSE) ; run `1 in M-UNIT TEST GROUP file - ; - W !!!,"Running command line tests by RUNSET^%ut",! - D RUNSET^%ut("TESTS FOR UNIT TEST ROUTINES") - ; - ; Call GUISET to obtain list of tags via entry in M-UNIT TEST GROUP file - ; silent to the user - D GUISET^%ut(.%utt6,1) - K ^TMP("%utt6_GUISET",$J) M ^TMP("%utt6_GUISET",$J)=@%utt6 - ; - W !!!,"RUNNING COMMAND LINE UNIT TESTS FOR %utt5",! - N ZZUTCNT,JLICNT,JLIEXPCT,JLII,JLIX,ZZUTRSLT - S ZZUTCNT=0 - K ^TMP("%utt5",$J) ; kill any contents of data storage - D EN^%ut("%utt5",VERBOSE) ; should do STARTUP(1x), then SETUP, test, TEARDOWN (each together 3x) and SHUTDOWN (1x) - K ^TMP("%utt5_C",$J) M ^TMP("%utt5_C",$J)=^TMP("%utt5",$J) - ; - ; now run unit tests by GUI - first determines unit test tags - W !!!,"RUNNING UNIT TESTS FOR %utt5 VIA GUI CALLS - Silent",! - S ZZUTCNT=0 - K ^TMP("%utt5",$J),^TMP("%utt6",$J) - D GUILOAD^%ut(.%utt6,"%utt5") - M ^TMP("%utt6",$J)=@%utt6 - S %utt6=$NA(^TMP("%utt6",$J)) - ; then run each tag separately - ; JLICNT is count of unit test tags, which can be determined for GUI call for each unit test tag - S JLICNT=0 F JLII=1:1 S JLIX=$G(@%utt6@(JLII)) Q:JLIX="" I $P(JLIX,U,2)'="" S JLICNT=JLICNT+1 D GUINEXT^%ut(.ZZUTRSLT,$P(JLIX,U,2)_U_$P(JLIX,U)) - ; and close it with a null routine name - D GUINEXT^%ut(.ZZUTRSLT,"") - K ^TMP("%utt5_G",$J) M ^TMP("%utt5_G",$J)=^TMP("%utt5",$J) - S JLIEXPCT=2+(3*JLICNT) ; number of lines that should be in the global nodes for command line and GUI - ; - ; now run the unit tests in this routine - W !!,"NOW RUNNING UNIT TESTS FOR %utt6",!! - D EN^%ut("%utt6",VERBOSE) - K ^TMP("%utt5",$J),^TMP("%utt5_C",$J),^TMP("%utt5_G",$J),^TMP("%utt6",$J),^TMP("%utt6_GUISET",$J) - Q - ; - ; - ; WARNING -- WARNING -- WARNING - ; If the number of NEW STYLE tests in %utt5 is increased (it is currently 1), then the following - ; test will need to be updated to reflect the change(s) - ; END OF WARNING -- END OF WARNING -- END OF WARNING - ; -NEWSTYLE ; tests return of valid new style or @TEST indicators - N LIST - D NEWSTYLE^%ut1(.LIST,"%utt5") - D CHKEQ^%ut(LIST,1,"Returned an incorrect number ("_LIST_") of New Style indicators - should be one") - I LIST>0 D CHKEQ^%ut(LIST(1),"NEWSTYLE^identify new style test indicator functionality","Returned incorrect TAG^reason "_LIST(1)) - I LIST>0 D CHKEQ^%ut($G(LIST(2)),"","Returned a value for LIST(2) - should not have any value (i.e., null)") - Q - ; -CKGUISET ; - ; ZEXCEPT: %utt6var - if present, is NEWed and created in code following VERBOSE - I '$D(%utt6var) Q - N MAX - S MAX=$O(^TMP("%utt6_GUISET",$J,""),-1) - D CHKTF^%ut(^TMP("%utt6_GUISET",$J,MAX)["%utt6^NEWSTYLE","GUISET returned incorrect list") - Q - ; -CHKCMDLN ; check command line processing of %utt5 - ; ZEXCEPT: JLIEXPCT,%utt6var - if present NEWed and created in code following VERBOSE tag - I '$D(%utt6var) Q - D CHKTF^%ut($D(^TMP("%utt5_C",$J,JLIEXPCT))=10,"Not enough entries in %utt5 expected "_JLIEXPCT) - D CHKTF^%ut($D(^TMP("%utt5_C",$J,JLIEXPCT+1))=0,"Too many entries in %utt5 expected "_JLIEXPCT) - D CHKTF^%ut($O(^TMP("%utt5_C",$J,1,""))="STARTUP","Incorrect function for entry 1,'"_$O(^TMP("%utt5_C",$J,1,""))_"' should be 'STARTUP'") - D CHKTF^%ut($O(^TMP("%utt5_C",$J,JLIEXPCT,""))="SHUTDOWN","Incorrect function for entry "_JLIEXPCT_", '"_$O(^TMP("%utt5_C",$J,JLIEXPCT,""))_"' should be 'SHUTDOWN'") - Q - ; -CHKGUI ; check GUI processing of %utt5 - ; ZEXCEPT: JLIEXPCT,%utt6var - if present NEWed and created in code following VERBOSE tag - I '$D(%utt6var) Q - D CHKTF^%ut($D(^TMP("%utt5_G",$J,JLIEXPCT))=10,"Not enough entries in %utt5 expected "_JLIEXPCT) - D CHKTF^%ut($D(^TMP("%utt5_G",$J,JLIEXPCT+1))=0,"Too many entries in %utt5 expected "_JLIEXPCT) - D CHKTF^%ut($O(^TMP("%utt5_G",$J,1,""))="STARTUP","Incorrect function for entry 1,'"_$O(^TMP("%utt5Z_G",1,""))_"' should be 'STARTUP'") - D CHKTF^%ut($O(^TMP("%utt5_G",$J,JLIEXPCT,""))="SHUTDOWN","Incorrect function for entry "_JLIEXPCT_", '"_$O(^TMP("%utt5_G",$J,JLIEXPCT,""))_"' should be 'SHUTDOWN'") - Q - ; -XTENT ; - ;;CHKCMDLN;check command line processing of %utt5 - ;;CHKGUI;check GUI processing of %utt5 - ;;CKGUISET;check list of tests returned by GUISET - ;;NEWSTYLE;test return of valid new style or @TEST indicators +%utt6 ;JLI - Unit tests for MUnit functionality ;08/29/14 11:43 + ;;0.1;MASH UTILITIES;; + ; + ; This routine uses ZZUTJLI2 as a test routine, it does not include the routine as an extension, + ; since it uses it for tests. + ; + ; ZZUTJLI2 currently contains 3 tests (2 old style, 1 new style), it also specifies STARTUP and + ; SHUTDOWN (should be 1 each) and SETUP and TEARDOWN (should be 3 each, 1 for each test) enteries, each of these + ; creates an entry under the ^TMP("ZZUTJLI2" global node, indicating function then continues the process. + ; Should be 2+3n entries (1+1 for STARTUP and SHUTDOWN, then 3 for each of the tests (SETUP, test, + ; and TEARDOWN). + ; + ; This first section is more of a functional test, since it checks the full unit test processing from both + ; a command line and a GUI call approach. Data for analysis is saved under ^TMP("ZZUTJLI2_C", for command + ; line and ^TMP("ZZUTJLI2_G", for gui processing. + ; + ; The counts for the command line processing are based on the number of unit test tags + ; determined for the GUI processing as well. The numbers are 2 (startup and shutdown) + ; + 3 x the number of tests present. + ; + ; run unit tests by command line + N VERBOSE + S VERBOSE=0 +VERBOSE ; + I '$D(VERBOSE) N VERBOSE S VERBOSE=1 + N ZZUTCNT,JLICNT,JLIEXPCT,JLII,JLIX,ZZUTRSLT,%utt5,%utt6,%utt6var + W !!,"RUNNING COMMAND LINE TESTS VIA DOSET^%ut",! + D DOSET^%ut(1,VERBOSE) ; run `1 in M-UNIT TEST GROUP file + ; + W !!!,"Running command line tests by RUNSET^%ut",! + D RUNSET^%ut("TESTS FOR UNIT TEST ROUTINES") + ; + ; Call GUISET to obtain list of tags via entry in M-UNIT TEST GROUP file + ; silent to the user + D GUISET^%ut(.%utt6,1) + K ^TMP("%utt6_GUISET",$J) M ^TMP("%utt6_GUISET",$J)=@%utt6 + ; + W !!!,"RUNNING COMMAND LINE UNIT TESTS FOR %utt5",! + N ZZUTCNT,JLICNT,JLIEXPCT,JLII,JLIX,ZZUTRSLT + S ZZUTCNT=0 + K ^TMP("%utt5",$J) ; kill any contents of data storage + D EN^%ut("%utt5",VERBOSE) ; should do STARTUP(1x), then SETUP, test, TEARDOWN (each together 3x) and SHUTDOWN (1x) + K ^TMP("%utt5_C",$J) M ^TMP("%utt5_C",$J)=^TMP("%utt5",$J) + ; + ; now run unit tests by GUI - first determines unit test tags + W !!!,"RUNNING UNIT TESTS FOR %utt5 VIA GUI CALLS - Silent",! + S ZZUTCNT=0 + K ^TMP("%utt5",$J),^TMP("%utt6",$J) + D GUILOAD^%ut(.%utt6,"%utt5") + M ^TMP("%utt6",$J)=@%utt6 + S %utt6=$NA(^TMP("%utt6",$J)) + ; then run each tag separately + ; JLICNT is count of unit test tags, which can be determined for GUI call for each unit test tag + S JLICNT=0 F JLII=1:1 S JLIX=$G(@%utt6@(JLII)) Q:JLIX="" I $P(JLIX,U,2)'="" S JLICNT=JLICNT+1 D GUINEXT^%ut(.ZZUTRSLT,$P(JLIX,U,2)_U_$P(JLIX,U)) + ; and close it with a null routine name + D GUINEXT^%ut(.ZZUTRSLT,"") + K ^TMP("%utt5_G",$J) M ^TMP("%utt5_G",$J)=^TMP("%utt5",$J) + S JLIEXPCT=2+(3*JLICNT) ; number of lines that should be in the global nodes for command line and GUI + ; + ; now run the unit tests in this routine + W !!,"NOW RUNNING UNIT TESTS FOR %utt6",!! + D EN^%ut("%utt6",VERBOSE) + K ^TMP("%utt5",$J),^TMP("%utt5_C",$J),^TMP("%utt5_G",$J),^TMP("%utt6",$J),^TMP("%utt6_GUISET",$J) + ; clean up after GUI calls as well + K ^TMP("GUI-MUNIT",$J),^TMP("GUINEXT",$J),^TMP("MUNIT-%utRSLT",$J) + Q + ; + ; + ; WARNING -- WARNING -- WARNING + ; If the number of NEW STYLE tests in %utt5 is increased (it is currently 1), then the following + ; test will need to be updated to reflect the change(s) + ; END OF WARNING -- END OF WARNING -- END OF WARNING + ; +NEWSTYLE ; tests return of valid new style or @TEST indicators + N LIST + D NEWSTYLE^%ut1(.LIST,"%utt5") + D CHKEQ^%ut(LIST,1,"Returned an incorrect number ("_LIST_") of New Style indicators - should be one") + I LIST>0 D CHKEQ^%ut(LIST(1),"NEWSTYLE^identify new style test indicator functionality","Returned incorrect TAG^reason "_LIST(1)) + I LIST>0 D CHKEQ^%ut($G(LIST(2)),"","Returned a value for LIST(2) - should not have any value (i.e., null)") + Q + ; +CKGUISET ; + ; ZEXCEPT: %utt6var - if present, is NEWed and created in code following VERBOSE + I '$D(%utt6var) Q + N MAX + S MAX=$O(^TMP("%utt6_GUISET",$J,""),-1) + D CHKTF^%ut(^TMP("%utt6_GUISET",$J,MAX)["%utt6^NEWSTYLE","GUISET returned incorrect list") + Q + ; +CHKCMDLN ; check command line processing of %utt5 + ; ZEXCEPT: JLIEXPCT,%utt6var - if present NEWed and created in code following VERBOSE tag + I '$D(%utt6var) Q + D CHKTF^%ut($D(^TMP("%utt5_C",$J,JLIEXPCT))=10,"Not enough entries in %utt5 expected "_JLIEXPCT) + D CHKTF^%ut($D(^TMP("%utt5_C",$J,JLIEXPCT+1))=0,"Too many entries in %utt5 expected "_JLIEXPCT) + D CHKTF^%ut($O(^TMP("%utt5_C",$J,1,""))="STARTUP","Incorrect function for entry 1,'"_$O(^TMP("%utt5_C",$J,1,""))_"' should be 'STARTUP'") + D CHKTF^%ut($O(^TMP("%utt5_C",$J,JLIEXPCT,""))="SHUTDOWN","Incorrect function for entry "_JLIEXPCT_", '"_$O(^TMP("%utt5_C",$J,JLIEXPCT,""))_"' should be 'SHUTDOWN'") + Q + ; +CHKGUI ; check GUI processing of %utt5 + ; ZEXCEPT: JLIEXPCT,%utt6var - if present NEWed and created in code following VERBOSE tag + I '$D(%utt6var) Q + D CHKTF^%ut($D(^TMP("%utt5_G",$J,JLIEXPCT))=10,"Not enough entries in %utt5 expected "_JLIEXPCT) + D CHKTF^%ut($D(^TMP("%utt5_G",$J,JLIEXPCT+1))=0,"Too many entries in %utt5 expected "_JLIEXPCT) + D CHKTF^%ut($O(^TMP("%utt5_G",$J,1,""))="STARTUP","Incorrect function for entry 1,'"_$O(^TMP("%utt5Z_G",1,""))_"' should be 'STARTUP'") + D CHKTF^%ut($O(^TMP("%utt5_G",$J,JLIEXPCT,""))="SHUTDOWN","Incorrect function for entry "_JLIEXPCT_", '"_$O(^TMP("%utt5_G",$J,JLIEXPCT,""))_"' should be 'SHUTDOWN'") + Q + ; +XTENT ; + ;;CHKCMDLN;check command line processing of %utt5 + ;;CHKGUI;check GUI processing of %utt5 + ;;CKGUISET;check list of tests returned by GUISET + ;;NEWSTYLE;test return of valid new style or @TEST indicators diff --git a/Routines/%uttcovr.m b/Routines/%uttcovr.m index 72df422..323a035 100644 --- a/Routines/%uttcovr.m +++ b/Routines/%uttcovr.m @@ -1,46 +1,46 @@ -%uttcovr ;JLI/JIVEYSOFT - runs coverage tests on %ut and %ut1 routines via unit tests ;2014-09-10 5:19 PM - ;;0.1;MASH UTILITIES; - ; - I '(+$SY=47) W !,"This coverage analysis is currently only available in GT.M" Q ; GT.M only! - ; - ; if SHOWALL is true (1) all coverage globals data are listed - ; if SHOWALL is false (0), only the %utCOVREPORT global is listed - I '$D(SHOWALL) N SHOWALL S SHOWALL=0 - ; set global node so %utt4 doesn't run its own analysis - S ^TMP("%uttcovr",$J)=1 - ; start analysis of %ut - it calls entry below - D COV^%ut1("%ut","D TESTCOVR^%ut",3) - D LIST("%ut") ; output results of analysis - ; start analysis of %ut1 - D COV^%ut1("%ut1","D TESTCOVR^%ut1",3) - D LIST("%ut1") - K ^TMP("%uttcovr",$J) - Q - ; -SHOWALL ; Entry to get all coverage globals listed - N SHOWALL - S SHOWALL=1 - D ^%uttcovr - Q - ; -ENTRY ; - D ^%utt1 ; verbose - D EN^%ut("%utt1") ; non-verbose - ; run tests from top of %utt6, runs both command line and gui analyses - D ^%utt6 ; non-verbose - D VERBOSE^%utt6 ; verbose - Q - ; -LIST(ROU) ; - ; ZEXCEPT: SHOWALL - NEWed and set in SHOWALL or entering at %uttcovr - N JOB,NAME,BASE,GLOB - S JOB=$J - W !!!,ROU_" COVERAGE ANALYSIS" - F NAME="%utCOVREPORT","%utCOVRESULT","%utCOVCOHORT","%utCOVCOHORTSAV" D - . I 'SHOWALL,NAME'="%utCOVREPORT" Q - . W !!!,NAME," GLOBAL DATA",! - . S BASE="^TMP("""_NAME_""","_JOB,GLOB=BASE_")" - . I $D(GLOB)#2 W !,GLOB,"=",$G(@GLOB) - . F S GLOB=$Q(@GLOB) Q:GLOB'[BASE I $D(GLOB)#2 W !,GLOB,"=",@GLOB - . Q - Q +%uttcovr ;JLI/JIVEYSOFT - runs coverage tests on %ut and %ut1 routines via unit tests ;09/10/14 14:34 + ;;0.1;MASH UTILITIES;; + ; + I '(+$SY=47) W !,"This coverage analysis is currently only available in GT.M" Q ; GT.M only! + ; + ; if SHOWALL is true (1) all coverage globals data are listed + ; if SHOWALL is false (0), only the %utCOVREPORT global is listed + I '$D(SHOWALL) N SHOWALL S SHOWALL=0 + ; set global node so %utt4 doesn't run its own analysis + S ^TMP("%uttcovr",$J)=1 + ; start analysis of %ut - it calls entry below + D COV^%ut1("%ut","D TESTCOVR^%ut",-1) + D LIST("%ut") ; output results of analysis + ; start analysis of %ut1 + D COV^%ut1("%ut1","D TESTCOVR^%ut1",3) + D LIST("%ut1") + K ^TMP("%uttcovr",$J) + Q + ; +SHOWALL ; Entry to get all coverage globals listed + N SHOWALL + S SHOWALL=1 + D ^%uttcovr + Q + ; +ENTRY ; + D ^%utt1 ; verbose + D EN^%ut("%utt1") ; non-verbose + ; run tests from top of %utt6, runs both command line and gui analyses + D ^%utt6 ; non-verbose + D VERBOSE^%utt6 ; verbose + Q + ; +LIST(ROU) ; + ; ZEXCEPT: SHOWALL - NEWed and set in SHOWALL or entering at %uttcovr + N JOB,NAME,BASE,GLOB + S JOB=$J + W !!!,ROU_" COVERAGE ANALYSIS" + F NAME="%utCOVREPORT","%utCOVRESULT","%utCOVCOHORT","%utCOVCOHORTSAV" D + . I 'SHOWALL,NAME'="%utCOVREPORT" Q + . W !!!,NAME," GLOBAL DATA",! + . S BASE="^TMP("""_NAME_""","_JOB,GLOB=BASE_")" + . I $D(GLOB)#2 W !,GLOB,"=",$G(@GLOB) + . F S GLOB=$Q(@GLOB) Q:GLOB'[BASE I $D(GLOB)#2 W !,GLOB,"=",@GLOB + . Q + Q diff --git a/Routines/ZZUTPOST.m b/Routines/ZZUTPOST.m new file mode 100644 index 0000000..20f1455 --- /dev/null +++ b/Routines/ZZUTPOST.m @@ -0,0 +1,148 @@ +ut01POST ;VEN-SMH/JLI - post install for M-Unit Test software ;08/28/14 12:29 + ;;0.1;MASH UTILITIES;; + N X,I + I +$SY=47 D R X:$G(DTIME,300) D MES^XPDUTL(" ") + . S X(1)=" " + . S X(2)="In the next section, as it tries to copy the ut* routines" + . S X(3)="to %ut* routines watch for text that indicates the following:" + . S X(4)=" " + . S X(5)="cp: cannot create regular file `/_ut.m': Permission denied" + . S X(6)=" " + . S X(7)="If this is seen, respond Yes at the prompt after the attempt:" + . S X(8)=" Press ENTER to continue: " + . F I=1:1:18 D MES^XPDUTL(" ") ; create a blank screen for text + . D MES^XPDUTL(.X) + . Q + D RENAME + I +$SY=47 D R X:$G(DTIME,300) I "Yy"[$E($G(X)) D GTMPROB + . K X + . S X(1)=" " + . S X(2)=" Your entry on the next line may not echo" + . S X(3)="If error text was seen enter Y (and RETURN): NO// " + . D MES^XPDUTL(.X) + . Q + Q + ; +RENAME ; + N %S,%D ; Source, destination + S U="^" + S %S="ut^ut1^utt1^utt2^utt3^utt4^utt5^utt6^uttcovr" + S %D="%ut^%ut1^%utt1^%utt2^%utt3^%utt4^%utt5^%utt6^%uttcovr" + ; +MOVE ; rename % routines + N %,X,Y,M + F %=1:1:$L(%D,"^") D D MES(M) I +$SY=47 D MES(" ") + . S M="",X=$P(%S,U,%) ; from + . S Y=$P(%D,U,%) ; to + . Q:X="" + . S M="Routine: "_$J(X,8) + . Q:Y="" I $T(^@X)="" S M=M_" Missing" Q + . S M=M_" Loaded, " + . D COPY(X,Y) + . S M=M_"Saved as "_$J(Y,8) + ; + QUIT ; END + ; +COPY(FROM,TO) ; + N XVAL + I +$SYSTEM=0 S XVAL="ZL @FROM ZS @TO" X XVAL QUIT + I +$SYSTEM=47 DO QUIT + . S FROM=$$PATH(FROM) + . S TO=$$PATH(TO,"WRITE") + . N CMD S CMD="cp "_FROM_" "_TO + . O "cp":(shell="/bin/sh":command=CMD:WRITEONLY)::"PIPE" + . U "cp" C "cp" + QUIT + ; +PATH(ROUTINE,MODE) ; for GT.M return source file with path for a routine + ;input: ROUTINE=Name of routine + ; MODE="READ" or "WRITE" defaults to READ + ;output: Full filename + ; + S MODE=$G(MODE,"READ") ;set MODE to default value + N FILE S FILE=$TR(ROUTINE,"%","_")_".m" ;convert rtn name to filename + N ZRO S ZRO=$ZRO + ; + ; Get source routine + N %ZR + I MODE="READ" D SILENT^%RSEL(ROUTINE,"SRC") Q %ZR(ROUTINE)_FILE + ; + ; We are writing. Parse directories and get 1st routine directory + N DIRS + D PARSEZRO(.DIRS,ZRO) + N PATH S PATH=$$ZRO1ST(.DIRS) + ; + QUIT PATH_FILE ;end of PATH return directory and filename + ; + ; +PARSEZRO(DIRS,ZRO) ; Parse $zroutines properly into an array + N PIECE + N I + F I=1:1:$L(ZRO," ") S PIECE(I)=$P(ZRO," ",I) + N CNT S CNT=1 + F I=0:0 S I=$O(PIECE(I)) Q:'I D + . S DIRS(CNT)=$G(DIRS(CNT))_PIECE(I) + . I DIRS(CNT)["("&(DIRS(CNT)[")") S CNT=CNT+1 QUIT + . I DIRS(CNT)'["("&(DIRS(CNT)'[")") S CNT=CNT+1 QUIT + . S DIRS(CNT)=DIRS(CNT)_" " ; prep for next piece + QUIT + ; +ZRO1ST(DIRS) ; $$ Get first routine directory + N OUT ; $$ return + N %1 S %1=DIRS(1) ; 1st directory + ; Parse with (...) + I %1["(" DO + . S OUT=$P(%1,"(",2) + . I OUT[" " S OUT=$P(OUT," ") + . E S OUT=$P(OUT,")") + ; no parens + E S OUT=%1 + ; + ; Add trailing slash + I $E(OUT,$L(OUT))'="/" S OUT=OUT_"/" + QUIT OUT + ; +MES(T,B) ;Write message. + S B=$G(B) + I $L($T(BMES^XPDUTL)) D BMES^XPDUTL(T):B,MES^XPDUTL(T):'B Q + W:B ! W !,T + Q + ; +TEST ; @TEST - TESTING TESTING + ; + N ZR S ZR="o(p r) /var/abc(/var/abc/r/) /abc/def $gtm_dist/libgtmutl.so vista.so" + N DIRS D PARSEZRO(.DIRS,ZR) + N FIRSTDIR S FIRSTDIR=$$ZRO1ST(.DIRS) + I FIRSTDIR'="p" S $EC=",U1," + ; + N ZR S ZR="/var/abc(/var/abc/r/) o(p r) /abc/def $gtm_dist/libgtmutl.so vista.so" + N DIRS D PARSEZRO(.DIRS,ZR) + N FIRSTDIR S FIRSTDIR=$$ZRO1ST(.DIRS) + I FIRSTDIR'="/var/abc/r/" S $EC=",U1," + ; + N ZR S ZR="/abc/def /var/abc(/var/abc/r/) o(p r) $gtm_dist/libgtmutl.so vista.so" + N DIRS D PARSEZRO(.DIRS,ZR) + N FIRSTDIR S FIRSTDIR=$$ZRO1ST(.DIRS) + I FIRSTDIR'="/abc/def" S $EC=",U1," + ; + WRITE "All tests have run successfully!",! + QUIT + ; +GTMPROB ; come here in case of error trying to run unit tests - checks whether renaming worked + N X + S X(1)=" " + S X(2)="*** An error occurred during renaming of routines to %ut*." + S X(3)="*** The renaming has been seen to fail on one type of Linux system." + S X(4)="*** In this case, at the Linux command line copy each ut*.m routine" + S X(5)="*** (ut.m, ut1.m, utt1.m, utt2.m, utt3.m, utt4.m, utt5.m, utt6.m, and " + S X(6)="*** uttcovr.m) to _ut*.m (e.g., 'cp ut.m _ut.m', 'cp ut1.m _ut1.m'," + S X(7)="*** 'cp utt1.m _utt1.m', etc., to 'cp uttcovr.m _uttcovr.m'). Then in GT.M" + S X(8)="*** use the command 'ZLINK %ut', then 'ZLINK %ut1', etc., these may" + S X(9)="*** indicate an undefined local variable error, but continue doing it." + S X(10)="*** When complete, use the M command 'DO ^%utt1' to run the unit tests on" + S X(11)="*** the %ut and %ut1 routines to confirm they are working" + S X(12)=" " + S X(13)=" Press Enter to continue: " + D MES^XPDUTL(.X) + R X:$G(DTIME,300) + Q diff --git a/Routines/ZZUTPRE.m b/Routines/ZZUTPRE.m new file mode 100644 index 0000000..ed3144c --- /dev/null +++ b/Routines/ZZUTPRE.m @@ -0,0 +1,42 @@ +ut01PRE ;VEN/JLI - pre installation routine to set up MASH UTILITIES package and assign %ut routines and globals ;08/22/14 13:02 + ;;0.1;MASH UTILITIES;; + ; + ; The following is used to create, if it does not exist, the MASH UTILITIES + ; package, and to assign the %u namespace to this package. This special + ; processing is necessary, since the input transform currently will not accept a + ; % or lower case character in the namespace. + I '$D(^DIC(9.4,"B","MASH UTILITIES")) N DIC,X S DIC="^DIC(9.4,",DIC(0)="",X="MASH UTILITIES",DIC("DR")="1////%u;2///Utilities associated with the M Advanced Shell" D FILE^DICN + ; and if necessary, as in CACHE, map %ut routine and namespace in the current account. + I +$SY=0 D CACHEMAP ; This routine is CACHE specific + Q + ; The following code was provided by Sam Habiel to map % +CACHEMAP ; Map %ut* Globals and Routines away from %SYS in Cache + ; Get current namespace + N NMSP + I $P($P($ZV,") ",2),"(")<2012 S NMSP=$ZU(5) + I $P($P($ZV,") ",2),"(")>2011 S NMSP=$NAMESPACE + ; + N $ET S $ET="ZN NMSP D ^%ZTER S $EC=""""" + ; + ZN "%SYS" ; Go to SYS + ; + ; Props + N % S %=##Class(Config.Namespaces).Get(NMSP,.PROP) ; Get all namespace properties + I '% W !,"Error="_$SYSTEM.Status.GetErrorText(%) S $EC=",U-CONFIG-FAIL," QUIT + ; + N DBG S DBG=PROP("Globals") ; get the database globals location + N DBR S DBR=PROP("Routines") ; get the database routines location + ; + ; Map %ut globals away from %SYS + N % S %=##class(Config.Configuration).GetGlobalMapping(NMSP,"%ut*","",DBG,DBG) + I '% S %=##class(Config.Configuration).AddGlobalMapping(NMSP,"%ut*","",DBG,DBG) + I '% W !,"Error="_$SYSTEM.Status.GetErrorText(%) S $EC=",U-CONFIG-FAIL," QUIT + ; + ; Map %ut routines away from %SYS + N PROPRTN S PROPRTN("Database")=DBR + N % S %=##Class(Config.MapRoutines).Get(NMSP,"%ut*",.PROPRTN) + N PROPRTN S PROPRTN("Database")=DBR ; Cache seems to like deleting this + I '% S %=##Class(Config.MapRoutines).Create(NMSP,"%ut*",.PROPRTN) + I '% W !,"Error="_$SYSTEM.Status.GetErrorText(%) S $EC=",U-CONFIG-FAIL," QUIT + ZN NMSP ; Go back + QUIT