Macros for SAS Application Developers
https://github.com/sasjs/core
Loading...
Searching...
No Matches
mv_castabsave.test.sas
Go to the documentation of this file.
1/**
2 @file
3 @brief Testing mv_castabsave macro
4
5 <h4> SAS Macros </h4>
6 @li mf_uid.sas
7 @li mp_assert.sas
8 @li mp_assertscope.sas
9 @li mv_castabsave.sas
10
11 @sasjslint {"noBannedStrings": false}
12**/
13
14options mprint;
15
16/* -------------------------------------------------------------------- */
17/* Setup: start a CAS session and load a table that has a tracked */
18/* source file so mv_castabsave can discover it via the REST API */
19/* -------------------------------------------------------------------- */
20cas mysess;
21caslib _all_ assign;
22
23%let testcaslib=Public;
24
25proc cas;
26 table.caslibInfo result=r / ;
27 found=0;
28 do row over r.CASLibInfo;
29 if upcase(row.Name)=upcase("&testcaslib") then found=1;
30 end;
31 if found=0 then do;
32 print "ERROR: caslib &testcaslib not available";
33 exit;
34 end;
35quit;
36%put NOTE: Using testcaslib=&testcaslib;
37
38%let tab1=T%mf_uid();
39
40/* Load sashelp.class into CAS, save as sashdat, reload from that file
41 so the table has a tracked source path (needed for REST discovery) */
42proc casutil;
43 load data=sashelp.class
44 outcaslib="&testcaslib" casout="&tab1" replace;
45 save casdata="&tab1" incaslib="&testcaslib"
46 casout="&tab1..sashdat" outcaslib="&testcaslib" replace;
47 /* Drop any existing global-scope version before promoting */
48 /* runs twice (with quiet) as first would drop local scope if exists */
49 droptable casdata="&tab1" incaslib="&testcaslib" quiet;
50 droptable casdata="&tab1" incaslib="&testcaslib" quiet;
51
52 load casdata="&tab1..sashdat" incaslib="&testcaslib"
53 casout="&tab1" outcaslib="&testcaslib" promote;
54quit;
55
56libname mylib cas caslib="&testcaslib";
57
58
59/* -------------------------------------------------------------------- */
60%put TEST 1 - save in-memory table back to disk + no scope leakage;
61/* -------------------------------------------------------------------- */
62
63/* Source file is removed so that the reload proves mv_castabsave
64 created the file from scratch, not that a prior version existed */
65proc casutil;
66 deletesource casdata="&tab1..sashdat"
67 incaslib="&testcaslib" quiet;
68quit;
69
70/* Insert a sentinel row - it must survive the full save/drop/reload */
71data work.appendme;
72 set mylib.&tab1;
73 name='TESTROW';
74 output;
75 stop;
76proc casutil;
77 load data=work.appendme casout="&tab1" outcaslib="&testcaslib" append;
78quit;
79
80%mp_assertscope(SNAPSHOT)
81
82%mv_castabsave(lib=mylib, table=&tab1, mdebug=1)
83
84%mp_assertscope(COMPARE,
85 desc=Check mv_castabsave does not leak macro variables into GLOBAL scope,
86 ignorelist=MC0_JADP1LEN MC0_JADP2LEN MC0_JADP3LEN MC0_JADPNUM MC0_JADVLEN
87)
88
89proc casutil;
90 droptable casdata="&tab1" incaslib="&testcaslib" quiet;
91 droptable casdata="&tab1" incaslib="&testcaslib" quiet;
92 load casdata="&tab1..sashdat" incaslib="&testcaslib"
93 casout="&tab1" outcaslib="&testcaslib" promote;
94quit;
95
96%let _rowcount=0;
97proc sql noprint;
98 select count(*) into :_rowcount
99 from mylib.&tab1
100 where name='TESTROW';
101quit;
102
103%mp_assert(
104 iftrue=(&_rowcount=1),
105 desc=Check inserted row survives mv_castabsave round-trip to disk
106)
107
108
109/* -------------------------------------------------------------------- */
110%put TEST 2 - save overwrites an existing source file;
111/* -------------------------------------------------------------------- */
112
113/* Source file already exists from the TEST 1 save - append a new row */
114data work.appendme;
115 set mylib.&tab1;
116 name='TESTROW2';
117 output;
118 stop;
119proc casutil;
120 load data=work.appendme casout="&tab1"
121 outcaslib="&testcaslib" append;
122quit;
123
124%mv_castabsave(lib=mylib, table=&tab1, mdebug=1)
125
126proc casutil;
127 droptable casdata="&tab1" incaslib="&testcaslib" quiet;
128 droptable casdata="&tab1" incaslib="&testcaslib" quiet;
129 load casdata="&tab1..sashdat" incaslib="&testcaslib"
130 casout="&tab1" outcaslib="&testcaslib" promote;
131quit;
132
133%let _rowcount=0;
134proc sql noprint;
135 select count(*) into :_rowcount
136 from mylib.&tab1
137 where name='TESTROW2';
138quit;
139
140%mp_assert(
141 iftrue=(&_rowcount=1),
142 desc=Check inserted row survives save over an existing source file
143)
144
145
146/* -------------------------------------------------------------------- */
147/* Teardown */
148/* -------------------------------------------------------------------- */
149libname mylib clear;
150
151proc casutil;
152 droptable casdata="&tab1" incaslib="&testcaslib" quiet;
153 deletesource casdata="&tab1..sashdat"
154 incaslib="&testcaslib" quiet;
155quit;
156
157cas mysess terminate;
158
159%let syscc=0;