From 54546cc0c684773a94376eadde258e38678e108a Mon Sep 17 00:00:00 2001 From: DDieterich Date: Fri, 29 Jun 2018 22:13:41 -0500 Subject: [PATCH 001/141] Post Release Updates --- docs/README.txt | 16 +--------------- releases/wtplsql_core_install_1.0.0.zip | Bin 93738 -> 0 bytes src/{core => }/RELEASE_NOTES.txt | 0 .../README.txt | 0 .../README.txt | 0 .../update_all_stats.sql | 0 .../upgrade.sql | 0 .../upgradeO.LST | 0 src/core/wt_version.tab | 2 +- 9 files changed, 2 insertions(+), 16 deletions(-) delete mode 100644 releases/wtplsql_core_install_1.0.0.zip rename src/{core => }/RELEASE_NOTES.txt (100%) rename src/core/downgrades/{Current_to_V1.0.0 => V1.1.0_to_V1.0.0}/README.txt (100%) rename src/core/upgrades/{V1.0.0_to_Current => V1.0.0_to_V1.1.0}/README.txt (100%) rename src/core/upgrades/{V1.0.0_to_Current => V1.0.0_to_V1.1.0}/update_all_stats.sql (100%) rename src/core/upgrades/{V1.0.0_to_Current => V1.0.0_to_V1.1.0}/upgrade.sql (100%) rename src/core/upgrades/{V1.0.0_to_Current => V1.0.0_to_V1.1.0}/upgradeO.LST (100%) diff --git a/docs/README.txt b/docs/README.txt index ef58485..c4811a6 100644 --- a/docs/README.txt +++ b/docs/README.txt @@ -1,16 +1,2 @@ -Files and Directories ---------------------- - -File Name Description ------------ ------------ -Core Core Documentation -Demo Demonstration Documentation -README.md README Markdown file for "github.io" -_config.yml YAML Configuration File for this Website - - -Local Documentation URL ------------------------ -file://README.htm -(Double-click on the README.htm file) +All documentation is in web pages that start at README.htm diff --git a/releases/wtplsql_core_install_1.0.0.zip b/releases/wtplsql_core_install_1.0.0.zip deleted file mode 100644 index f413d564805e04a61f728a4b28221ef0623e16d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93738 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

>rOAbn^-BMENfdjkJ@jgR+INcDx*A743oNG)V z0v-R8RH#rdS-FB|Sfh+%rD^>$sxu-cYr5e_R;xz;XKAu_$(;~K0#R#v0J!?j>>XEG zz=c`}*zr^>SCkyY6iTWRKsF#~2S{_Q0D+86Vr}%1fRF_}AedJTze^0jxEcu1D|HDM zRoulSO0w0z>_7m{lBU?_IeDwZyy)ycipF$oSNwJ{RNSmko zMCpndrqDkz^-hM@WJc));i8>%aC(D2CnEG>x7vW(3uBG0&D2DChz_#hT4-PLem}x@h8{q_scD?D&Akx|P zX=29mglqF@&QQ@6_r&TAL!eyGrWHsHwW5qbs3|prbcE$P2@>?> zwlaX^r|rLMp$~#}EareI8c{I%ko`p2_!@n*#a$V9q{90!xwSoqgTEuO_SpCA3Vk1c z8{_QoG?%F3%cgI8rjV`x z3pOxKTS}R{sZ>*d0voWT6O=7>a^ay3`b8H<6v>F% zLHMT1w@sVZx>{`)u0tR7P`o{|t}?(RQ>mr^1$HpLXGm-5>%fd#VlVn2yr9h-Fn=Qp z-z&;!)b;n(@Pd+ojJkf3otk}7nU92Cy}kfSvl-@K!HP`qhiF{X3hLlz|LCb8!e`iWP zwb4E%iL!`v(V<*Ugr-7=wy;-fzliZSJ81!<%*&3szR(sOLeHsG_k2|6PLQds$1mST zw1v$>-(o7`dYMzKlLwI2U_4C|rdCyfib`1+Ym7GLC;IFp)HWanY)2;v%fD@pHU&ZA ziG0zW$S94xDdkLml###BAFS5e@ zezo^k;fgh}yOhGhmawqP)r`%$rN7*U~>sf3Jo6Omb@-Hl`m$%GrnCmGIhaRC#L) zl~TWN@CUi>l(L}NLZ=HFpMXXMrcXqpwH*3y@#44JC?(Yk_HJeYp znJg8lA|HKOl#`#?zrmF;sy&p8t3HPq`H7h(k{FMSKCig%_L<%oG z#>@H$@PHN4#An7VGqdvR$yO_??xhN-FNs-{WxhQYOn@FjN#hthyoun_FLst^|K=Q@ zj?{n}3L*jIojF8KIWHxRzOcAtI=65^HoNdDS1n2R0q+TuY`$6Zz|Mk2wQm}&`f=BgNT4a%F4ulqFw~gB|-lW!-`I0mM{;xcb zzD4DOVRdX&Jm=-GFuB(RlFakOczWAfgorcQbaF!k5d-Sbv{ALD)|<8FyVd}n@j$dQ zr{Y-}a-}J%zvHH-;WGC2OnE_UZk&e_G52}Gl2{1KE#BjjuV8Hc2EXdVu=l>iq+^P3&v zQA+wP%ZURt=&XGzKV_=+I!RkXJg+PXT{E1FN%pE?RCaj9+e==wTy5L~nz%~m!m!yZ zn|YsP&qlL{U3B z^hIcu{;J)=p>v{hmBoa!;vk-4!xy2Uxuku(1t_-2)fVpJ7M9W&me&*z+lUS=_@ow` zigh698W5$Nf$Nsw$u($Yjf%Z!|IM!54HQ6)(PGM$z$NE`u-pV$gq2Qn3S(!BbqPaV zs+`%3*7I(>m()KLCT2wKx97>WGlRR0kLQtA`DL=I@S?_^O(-d5+5x;Iomgfe^6Xx>fWnb`AM;a7yS zvyB%^J1(SJ3KgwS6blmBEkOaB$^n!`zxi0+44I92OB)BN4-P`V z?p&LJ3sMlr!C2|{b=|YW?Un^k=6Z1hs6Xa0-{6I%Aq2;RPfYm}$FyD8qL4g1!PM=( zZ`azHQ#IpKK{Lb5jo#fmM=vHLjC*j-%emWOrnCQb%$Gg5`>l=9TgG&5=D>VoeyhO6 zlYL<)e^c0ox%o4ecZ|$~!2~{FQps_Xcg>VvS6%KL-X3GnK)Gi^gY+@&IS|@wt>B*$ zl3Gcw9N>}^9ao8Q0PyT=xd|)rL|dLE?tV)h6Q1&@we=lNfto`8Hk>j+BVFQuAdZk5 z$OlgvoO>mP7Hza_9v?RlDIAp}5pf)}*z&Po9+?{+o1iNpD`rRDC=(8_@sM1`_T)mi zQU$q0r!gfl7e;(`J0F~PRv;|{#|$}NLqqK0GsJ(nP~5HLeN8aRclPYx!ve{iBMj|r zSsKIRSb^2GMC%O|naa@zz!+LNqN(EzTxY9FKpW{#X(*r%Ic;Hy+b#vg\NonJbN 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 Date: Sat, 7 Jul 2018 03:29:16 -0500 Subject: [PATCH 002/141] Working on GUI --- src/core/upgrades/V1.0.0_to_V1.1.0/README.txt | 2 +- .../V1.0.0_to_V1.1.0}/RELEASE_NOTES.txt | 0 .../upgrades/V1.1.0_to_Current/README.txt | 15 + .../V1.1.0_to_Current/RELEASE_NOTES.txt | 14 + src/core/wt_results.tab | 3 + src/core/wt_test_runs.tab | 6 +- src/core/wtplsql.pkb | 5 +- src/gui/Notes.txt | 193 + src/gui/f700.sql | 12593 ++++++++++++++++ src/gui/wt_test_runs_gui_tree.vw | 52 + 10 files changed, 12876 insertions(+), 7 deletions(-) rename src/{ => core/upgrades/V1.0.0_to_V1.1.0}/RELEASE_NOTES.txt (100%) create mode 100644 src/core/upgrades/V1.1.0_to_Current/README.txt create mode 100644 src/core/upgrades/V1.1.0_to_Current/RELEASE_NOTES.txt create mode 100644 src/gui/Notes.txt create mode 100644 src/gui/f700.sql create mode 100644 src/gui/wt_test_runs_gui_tree.vw diff --git a/src/core/upgrades/V1.0.0_to_V1.1.0/README.txt b/src/core/upgrades/V1.0.0_to_V1.1.0/README.txt index a319016..43fbb79 100644 --- a/src/core/upgrades/V1.0.0_to_V1.1.0/README.txt +++ b/src/core/upgrades/V1.0.0_to_V1.1.0/README.txt @@ -1,6 +1,6 @@ White Box PL/SQL Testing - src/core/upgrades/V1.0.0_to_Current/README.txt + V1.0.0 to V1.1.0 ReadMe FILE DESCRIPTION ---------------------- ----------------------- diff --git a/src/RELEASE_NOTES.txt b/src/core/upgrades/V1.0.0_to_V1.1.0/RELEASE_NOTES.txt similarity index 100% rename from src/RELEASE_NOTES.txt rename to src/core/upgrades/V1.0.0_to_V1.1.0/RELEASE_NOTES.txt diff --git a/src/core/upgrades/V1.1.0_to_Current/README.txt b/src/core/upgrades/V1.1.0_to_Current/README.txt new file mode 100644 index 0000000..08d9e6e --- /dev/null +++ b/src/core/upgrades/V1.1.0_to_Current/README.txt @@ -0,0 +1,15 @@ + + White Box PL/SQL Testing + V1.1.0 to Current ReadMe + +FILE DESCRIPTION +---------------------- ----------------------- +upgrade.sql Main upgrade script +upgradeO.LST Example of successful results from Demo Installation + + +Install Procedure: +------------------ +1) sqlplus SYS/password as SYSDBA @upgrade +2) exit +3) Compare upgrade.LST to upgradeO.LST diff --git a/src/core/upgrades/V1.1.0_to_Current/RELEASE_NOTES.txt b/src/core/upgrades/V1.1.0_to_Current/RELEASE_NOTES.txt new file mode 100644 index 0000000..87d4d49 --- /dev/null +++ b/src/core/upgrades/V1.1.0_to_Current/RELEASE_NOTES.txt @@ -0,0 +1,14 @@ + +wtPLSQL 1.2.0 Release Notes: + +New Features: +------------- + -) Modified indexes on WT_TEST_RUNS + -) Modified indexes on WT_RESULTS + -) Added APEX GUI Add-on. + -) Added reporting views. + +Detailed Changes: +----------------- +View Changes: + view_all_stats.vw diff --git a/src/core/wt_results.tab b/src/core/wt_results.tab index 6421982..443a0d8 100644 --- a/src/core/wt_results.tab +++ b/src/core/wt_results.tab @@ -19,6 +19,9 @@ create table wt_results ,constraint wt_results_ck1 check (status in ('PASS','FAIL')) ) pctfree 0; +create index wt_results_ix1 + on wt_results(testcase, test_run_id); + comment on table wt_results is 'Results data from Test Runs.'; comment on column wt_results.test_run_id is 'Foreign Key for the Test Run, Primary Key part 1.'; comment on column wt_results.result_seq is 'Sequence number for this Result, Primary Key part 2.'; diff --git a/src/core/wt_test_runs.tab b/src/core/wt_test_runs.tab index e2c7bfa..9712d75 100644 --- a/src/core/wt_test_runs.tab +++ b/src/core/wt_test_runs.tab @@ -21,13 +21,13 @@ create table wt_test_runs ,end_dtm timestamp ,error_message varchar2(4000) ,constraint wt_test_runs_pk primary key (id) - ,constraint wt_test_runs_nk1 unique (start_dtm, runner_name, runner_owner) + ,constraint wt_test_runs_nk1 unique (runner_name, runner_owner, start_dtm) ,constraint wt_test_runs_fk1 foreign key (profiler_runid) references plsql_profiler_runs (runid) disable ) pctfree 0; -create index wt_test_runs_idx1 - on wt_test_runs (start_dtm); +create index wt_test_runs_ix1 + on wt_test_runs(start_dtm, dbout_name); comment on table wt_test_runs is 'Test Run data for each execution of the WTPLSQL_RUN procedure.'; comment on column wt_test_runs.id is 'Primary (Surrogate) Key for each Test Run'; diff --git a/src/core/wtplsql.pkb b/src/core/wtplsql.pkb index 554bcce..60b7a50 100644 --- a/src/core/wtplsql.pkb +++ b/src/core/wtplsql.pkb @@ -32,9 +32,8 @@ begin end if; -- Check for Valid Runner Name select count(*) into l_package_check - from all_arguments - where owner = USER - and object_name = 'WTPLSQL_RUN' + from user_arguments + where object_name = 'WTPLSQL_RUN' and package_name = g_test_runs_rec.runner_name and argument_name is null and position = 1 diff --git a/src/gui/Notes.txt b/src/gui/Notes.txt new file mode 100644 index 0000000..ffe46d0 --- /dev/null +++ b/src/gui/Notes.txt @@ -0,0 +1,193 @@ + +Test Case Names include the Test Runner Name. + (No Global Test Cases) +DBOUTs are not global either. + (DBOUTs must be connected to a Test Runner) + (Cannot aggregate source lines across multiple Test Runs) + +3 - Tabs: Home, Run Test, Test Runner, Test Case + +* Home Page + * Page Template Body 1 + * Control HTML: Region Sequence 11 Column 1 + * P1_OWNER: Test Runner Owner (LOV from Search TEST RUNS, Can be NULL, default USER) + * P1_UPDATE_BUTTON: (Button, displayed only if owner = USER) + * P1_NUM_RUNNERS: Test Runners (Read Only) + * P1_NUM_DBOUTS: DBOUT Profiles (Read Only) + * P1_NUM_CASES: Test Cases (Read Only) + * Test Runners Status Summary: Chart Region Sequence 12 Column 2 + * PASS/FAIL/ERR + * Pie Chart + * DBOUT Profiles Status Summary: Chart Region Sequence 13 Column 3 + * EXCL/EXEC/UNKN/NOTX + * Pie Chart + * Top Test Case Failures: Chart Region Sequence 21 Column 1 + * Top (Latest) Test Runner Failure % + * Column Chart + * Links to Test Cases Page + * Top Test Runner Failures: Chart Region Sequence 22 Column 2 + * Top (Latest) Test Runner Failure % + * Column Chart + * Links to Test Cases Page + * Top DBOUT NotExec Lines: Chart Region Sequence 23 Column 3 + * Top (Latest) DBOUT Lines Not-Executed % + * Column Chart + * Links to Test Runner Page + * Top Test Runner Age: Chart Region Sequence 31 Column 1 + * Oldest Test Runner Test Run Days + * Column Chart + * Links to Test Runner Page + * Top Test Runner Durations: Chart Region Sequence 32 Column 2 + * Top (Latest) Test Runner Long Duration Minutes + * Column Chart + * Links to Test Runner Page + * Top DBOUT LineExec Times: Chart Region Sequence 33 Column 3 + * Top (Latest) DBOUT Long LineExec Seconds + * Column Chart + * Links to Test Runner Page + * Page Template Body 2 + * P1_RUNNER_JOBS: Report Region Sequence 50 Column 1 + * List of Jobs from ALL_SCHEDULED_JOBS + (For OWNER or OWNERS from WT_TEST_RUNS) + * Status + * Job Start Date/Time + * Job Duration + * Job Name + * List Latest Test Runs + * Link to Stop Job + * P1_RUNNER_ERRORS: Report Region Sequence 51 Column 1 + * Test Runners with Errors + * Test Run ID + * Test Runner + * DBOUT Profiled + * Test Run Date/Time + * Test Runner Error + * Links to Run Test Page, if owner = USER + * Links to Test Runner Page +* Run Test Page + (Current Schema) + * Page Template Body 2 + * HTML Region Sequence 10 Column 1 + * Test Runner (Search-able LOV from Search for WTPLSQL_RUN) + * Execute (Button, then Go to Home Page) + (DBMS_SCHEDULER.CREATE_JOB) + * Job Name - wtPLSQL USER.TEST_RUNNER + * Job Type - PLSQL_BLOCK + * Job Action - begin wtplsql.test_run('TEST_RUNNER'); end; + * Enabled - TRUE + * Auto Drop - TRUE + * Report Region Sequence 20 Column 1 + * List of Jobs from USER_SCHEDULER_JOBS + * Status + * Job Start Date/Time + * Job Duration + * Job Name + * Order by Job Name + * Link to Stop Job (If OWNER = USER) + + +* Test Runner Page + (Single Test Run ID) + + * Page Template Body 1 + + * Control + * HTML Region Sequence 11 Column 1 (Column Span) + + * Test Run ID Tree + * Test Run ID (Read Only) + * Test Runner "OWNER.NAME" (Read Only) (Run Link) + + * Total Number of Test Cases (Read Only) + * Run Date/Time (Read Only) + * DBOUT Name "OWNER.NAME(TYPE)" (Read Only, Can be NULL) + + * Go To Run ID (Pop-Up LOV) + * Show Trend Charts (LOV, Boolean, Default: Y) + * Delete Test Runner (Button with Confirmation, displayed only if OWNER = USER) + + * Test Runner Status + * Chart Region Sequence 12 Column 2 + * Pie Chart + * PASS/FAIL/ERR + + * DBOUT Profile Status + * Chart Region Sequence 22 Column 2 + * Pie Chart + * EXCL/EXEC/UNKN/NOTX + + * Page Template Body 2 + + * Test Runner Status Trend + * Chart Region Sequence 21 Column 1 + * Line Chart (Stacked using SQL) + * PASS/FAIL/ERR + * Display if Show Trend Charts + * Links to Other Test Run IDs, Same Page + + * DBOUT Profile Status Trend + * Chart Region Sequence 22 Column 2 + * Line Chart (Stacked using SQL) + * EXCL/EXEC/UNKN/NOTX + * Display if Show Trend Charts + * Links to Other Test Run IDs, Same Page + + * Top Test Case Failures + * Chart Region Sequence 23 Column 3 + * Column Chart + * Display if Show Trend Charts + * Links to Test Cases + + * Test Runner Duration Trend (Minutes) + * Chart Region Sequence 31 Column 1 + * Line Chart + * Display if Show Trend Charts + * Links to Other Test Run IDs, Same Page + + * Maximum LineExec Trend + * Chart Region Sequence 32 Column 1 + * Column Chart + * Display if Show Trend Charts + * Links to Other Test Run IDs, Same Page + + * Top Test Case Long Duration Minutes + * Chart Region Sequence 33 Column 3 + * Column Chart + * Display if Show Trend Charts + * Links to Test Cases + + * Page Template Body 3 + * HTML Region Sequence 10 Column 1 + * Test Results Details + * Links to Test Cases + * HTML Region Sequence 20 Column 1 + * Code Coverage Details (Optional, HTML Text) + +* Test Case Page + (Single Test Run ID, Single Test Case) + * Page Template Body 1 + * HTML Region Sequence 11 Column 1 + * Test Run ID (Read Only) + * Test Runner OWNER (Read Only) + * Test Runner (Read Only) + * Run Date/Time (Read Only) + * Test Case (Read Only) + * Set Test Case (LOV, existing for Test Run ID) + * Update (back to same page) (Button or after update trigger) + * Go To Test Runner Page (Button) + * Go To Run Test Page (Button, Displayed only if Owner is USER) + * Chart Region Sequence 12 Column 2 + * PASS/FAIL/ERR Pie Chart + * Chart Region Sequence 21 Column 1 + * PASS/FAIL/ERR Trend + * Bar Vertical Chart + * Links to Other Test Run Date/Time + * Chart Region Sequence 22 Column 2 + * Duration Trend + * Bar Horizontal Chart + * Links to Other Test Run Date/Time + * Page Template Body 2 + * HTML Region Sequence 10 Column 1 + * Test Case Results Summary + * HTML Region Sequence 20 Column 1 + * Test Case Results Details diff --git a/src/gui/f700.sql b/src/gui/f700.sql new file mode 100644 index 0000000..192a11e --- /dev/null +++ b/src/gui/f700.sql @@ -0,0 +1,12593 @@ +set define off +set verify off +set serveroutput on size 1000000 +set feedback off +WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK +begin wwv_flow.g_import_in_progress := true; end; +/ + + +--application/set_environment +prompt APPLICATION 700 - wtPLSQL Core GUI +-- +-- Application Export: +-- Application: 700 +-- Name: wtPLSQL Core GUI +-- Date and Time: 03:27 Saturday July 7, 2018 +-- Exported By: WTP +-- Flashback: 0 +-- Export Type: Application Export +-- Version: 4.0.2.00.09 + +-- Import: +-- Using application builder +-- or +-- Using SQL*Plus as the Oracle user APEX_040000 or as the owner (parsing schema) of the application. + +-- Application Statistics: +-- Pages: 6 +-- Items: 31 +-- Computations: 0 +-- Validations: 0 +-- Processes: 9 +-- Regions: 27 +-- Buttons: 0 +-- Dynamic Actions: 2 +-- Shared Components +-- Breadcrumbs: 1 +-- Entries 2 +-- Items: 1 +-- Computations: 0 +-- Processes: 1 +-- Parent Tabs: 0 +-- Tab Sets: 1 +-- Tabs: 5 +-- NavBars: 1 +-- Lists: 0 +-- Shortcuts: 0 +-- Themes: 1 +-- Templates: +-- Page: 15 +-- List: 15 +-- Report: 10 +-- Label: 5 +-- Region: 25 +-- Messages: 0 +-- Build Options: 0 + + +-- AAAA PPPPP EEEEEE XX XX +-- AA AA PP PP EE XX XX +-- AA AA PP PP EE XX XX +-- AAAAAAAAAA PPPPP EEEE XXXX +-- AA AA PP EE XX XX +-- AA AA PP EE XX XX +-- AA AA PP EEEEEE XX XX +prompt Set Credentials... + +begin + + -- Assumes you are running the script connected to SQL*Plus as the Oracle user APEX_040000 or as the owner (parsing schema) of the application. + wwv_flow_api.set_security_group_id(p_security_group_id=>nvl(wwv_flow_application_install.get_workspace_id,4779017982861389)); + +end; +/ + +begin wwv_flow.g_import_in_progress := true; end; +/ +begin + +select value into wwv_flow_api.g_nls_numeric_chars from nls_session_parameters where parameter='NLS_NUMERIC_CHARACTERS'; + +end; + +/ +begin execute immediate 'alter session set nls_numeric_characters=''.,'''; + +end; + +/ +begin wwv_flow.g_browser_language := 'en'; end; +/ +prompt Check Compatibility... + +begin + +-- This date identifies the minimum version required to import this file. +wwv_flow_api.set_version(p_version_yyyy_mm_dd=>'2010.05.13'); + +end; +/ + +prompt Set Application ID... + +begin + + -- SET APPLICATION ID + wwv_flow.g_flow_id := nvl(wwv_flow_application_install.get_application_id,700); + wwv_flow_api.g_id_offset := nvl(wwv_flow_application_install.get_offset,0); +null; + +end; +/ + +--application/delete_application + +begin + + -- Remove Application +wwv_flow_api.remove_flow(nvl(wwv_flow_application_install.get_application_id,700)); + +end; +/ + + +begin + +wwv_flow_audit.remove_audit_trail(nvl(wwv_flow_application_install.get_application_id,700)); +null; + +end; +/ + +--application/create_application + +begin + +wwv_flow_api.create_flow( + p_id => nvl(wwv_flow_application_install.get_application_id,700), + p_display_id=> nvl(wwv_flow_application_install.get_application_id,700), + p_owner => nvl(wwv_flow_application_install.get_schema,'WTP'), + p_name => nvl(wwv_flow_application_install.get_application_name,'wtPLSQL Core GUI'), + p_alias => nvl(wwv_flow_application_install.get_application_alias,'WTPLSQLCORE'), + p_page_view_logging => 'YES', + p_default_page_template=> 4837525507414910 + wwv_flow_api.g_id_offset, + p_printer_friendly_template=> 4837724123414910 + wwv_flow_api.g_id_offset, + p_default_region_template=> 4840201642414912 + wwv_flow_api.g_id_offset, + p_error_template=> 4837131094414910 + wwv_flow_api.g_id_offset, + p_page_protection_enabled_y_n=> 'Y', + p_checksum_salt_last_reset => '20180707032706', + p_max_session_length_sec=> 28800, + p_home_link=> 'f?p=&APP_ID.:1:&SESSION.', + p_flow_language=> 'en', + p_flow_language_derived_from=> 'FLOW_PRIMARY_LANGUAGE', + p_allow_feedback_yn=> 'N', + p_date_format=> 'DD-MON-YYYY HH24:MI:SS', + p_flow_image_prefix => nvl(wwv_flow_application_install.get_image_prefix,'/i/'), + p_publish_yn=> 'N', + p_documentation_banner=> '', + p_authentication=> 'CUSTOM2', + p_login_url=> '', + p_logout_url=> 'wwv_flow_custom_auth_std.logout?p_this_flow=&APP_ID.&p_next_flow_page_sess=&APP_ID.:1', + p_application_tab_set=> 1, + p_logo_image => 'TEXT:wtPLSQL - White Box Testing Framework', + p_public_url_prefix => '', + p_public_user=> 'APEX_PUBLIC_USER', + p_dbauth_url_prefix => '', + p_proxy_server=> nvl(wwv_flow_application_install.get_proxy,''), + p_cust_authentication_process=> '.'||to_char(4845319779414920 + wwv_flow_api.g_id_offset)||'.', + p_cust_authentication_page=> '', + p_custom_auth_login_url=> '', + p_flow_version=> 'wtPLSQL Core GUI V1.2.0', + p_flow_status=> 'AVAILABLE_W_EDIT_LINK', + p_flow_unavailable_text=> 'This application is currently unavailable at this time.', + p_build_status=> 'RUN_AND_BUILD', + p_exact_substitutions_only=> 'Y', + p_vpd=> '', + p_csv_encoding=> 'Y', + p_auto_time_zone=> 'N', + p_default_error_display_loc=> 'INLINE_WITH_FIELD_AND_NOTIFICATION', + p_theme_id => 7, + p_default_label_template => 4843803724414915 + wwv_flow_api.g_id_offset, + p_default_report_template => 4843113555414914 + wwv_flow_api.g_id_offset, + p_default_list_template => 4842217442414913 + wwv_flow_api.g_id_offset, + p_default_menu_template => 4844109108414915 + wwv_flow_api.g_id_offset, + p_default_button_template => 4838226535414911 + wwv_flow_api.g_id_offset, + p_default_chart_template => 4839217975414912 + wwv_flow_api.g_id_offset, + p_default_form_template => 4839304121414912 + wwv_flow_api.g_id_offset, + p_default_wizard_template => 4840913627414912 + wwv_flow_api.g_id_offset, + p_default_tabform_template => 4840201642414912 + wwv_flow_api.g_id_offset, + p_default_reportr_template =>4840201642414912 + wwv_flow_api.g_id_offset, + p_default_menur_template => 4838801336414912 + wwv_flow_api.g_id_offset, + p_default_listr_template => 4839116402414912 + wwv_flow_api.g_id_offset, + p_default_irr_template => 4839831975414912 + wwv_flow_api.g_id_offset, + p_last_updated_by => 'WTP', + p_last_upd_yyyymmddhh24miss=> '20180707032706', + p_required_roles=> wwv_flow_utilities.string_to_table2('')); + + +end; +/ + +prompt ...authorization schemes +-- + +begin + +null; + +end; +/ + +--application/shared_components/navigation/navigation_bar +prompt ...navigation bar entries +-- + +begin + +wwv_flow_api.create_icon_bar_item( + p_id => 4845410456414920 + wwv_flow_api.g_id_offset, + p_flow_id => wwv_flow.g_flow_id, + p_icon_sequence=> 200, + p_icon_image => '', + p_icon_subtext=> 'Logout', + p_icon_target=> '&LOGOUT_URL.', + p_icon_image_alt=> 'Logout', + p_icon_height=> 32, + p_icon_width=> 32, + p_icon_height2=> 24, + p_icon_width2=> 24, + p_nav_entry_is_feedback_yn => 'N', + p_icon_bar_disp_cond=> '', + p_icon_bar_disp_cond_type=> '', + p_begins_on_new_line=> '', + p_cell_colspan => 1, + p_onclick=> '', + p_icon_bar_comment=> ''); + + +end; +/ + +prompt ...application processes +-- +--application/shared_components/logic/application_processes/initialize_p1_owner + +begin + +declare + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +p:=p||'begin'||chr(10)|| +' :P1_OWNER := ''1st Time'';'||chr(10)|| +'end;'; + +wwv_flow_api.create_flow_process( + p_id => 4876315026134588 + wwv_flow_api.g_id_offset, + p_flow_id => wwv_flow.g_flow_id, + p_process_sequence=> 1, + p_process_point => 'AFTER_AUTHENTICATION', + p_process_type=> 'PLSQL', + p_process_name=> 'Initialize P1_OWNER', + p_process_sql_clob=> p, + p_process_error_message=> '#SQLERRM#', + p_process_when=> '', + p_process_when_type=> '', + p_process_comment=> ''); +end; + +null; + +end; +/ + +prompt ...application items +-- +--application/shared_components/logic/application_items/fsp_after_login_url + +begin + +wwv_flow_api.create_flow_item( + p_id=> 4849121938416019 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_name=> 'FSP_AFTER_LOGIN_URL', + p_data_type=> 'VARCHAR', + p_is_persistent=> 'Y', + p_protection_level=> '', + p_item_comment=> ''); + +null; + +end; +/ + +prompt ...application level computations +-- + +begin + +null; + +end; +/ + +prompt ...Application Tabs +-- + +begin + +--application/shared_components/navigation/tabs/standard/t_dashboard +wwv_flow_api.create_tab ( + p_id=> 4846811586414924 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_tab_set=> 'TS1', + p_tab_sequence=> 10, + p_tab_name=> 'T_DASHBOARD', + p_tab_text => 'Dashboard', + p_tab_step => 1, + p_tab_also_current_for_pages => '', + p_tab_parent_tabset=>'', + p_tab_comment => ''); + +--application/shared_components/navigation/tabs/standard/t_run_test +wwv_flow_api.create_tab ( + p_id=> 4847411144414925 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_tab_set=> 'TS1', + p_tab_sequence=> 20, + p_tab_name=> 'T_RUN_TEST', + p_tab_text => 'Run Test', + p_tab_step => 2, + p_tab_also_current_for_pages => '', + p_tab_parent_tabset=>'', + p_tab_comment => ''); + +--application/shared_components/navigation/tabs/standard/t_test_runner +wwv_flow_api.create_tab ( + p_id=> 4848009034414926 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_tab_set=> 'TS1', + p_tab_sequence=> 30, + p_tab_name=> 'T_TEST_RUNNER', + p_tab_text => 'Test Runner', + p_tab_step => 3, + p_tab_also_current_for_pages => '', + p_tab_parent_tabset=>'', + p_tab_comment => ''); + +--application/shared_components/navigation/tabs/standard/t_test_case +wwv_flow_api.create_tab ( + p_id=> 4848601687414926 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_tab_set=> 'TS1', + p_tab_sequence=> 40, + p_tab_name=> 'T_TEST_CASE', + p_tab_text => 'Test Case', + p_tab_step => 4, + p_tab_also_current_for_pages => '', + p_tab_parent_tabset=>'', + p_tab_comment => ''); + +--application/shared_components/navigation/tabs/standard/t_about +wwv_flow_api.create_tab ( + p_id=> 4905926268694339 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_tab_set=> 'TS1', + p_tab_sequence=> 50, + p_tab_name=> 'T_ABOUT', + p_tab_text => 'About', + p_tab_step => 5, + p_tab_also_current_for_pages => '', + p_tab_parent_tabset=>'', + p_tab_comment => ''); + + +end; +/ + +prompt ...Application Parent Tabs +-- + +begin + +null; + +end; +/ + +prompt ...Shared Lists of values +-- +--application/shared_components/user_interface/lov/y_or_n + +begin + +wwv_flow_api.create_list_of_values ( + p_id => 4923728354614299 + wwv_flow_api.g_id_offset, + p_flow_id => wwv_flow.g_flow_id, + p_lov_name => 'Y_OR_N', + p_lov_query=> '.'||to_char(4923728354614299 + wwv_flow_api.g_id_offset)||'.'); + +null; + +end; +/ + + +begin + +wwv_flow_api.create_static_lov_data ( + p_id=>4924006022614301 + wwv_flow_api.g_id_offset, + p_lov_id=>4923728354614299 + wwv_flow_api.g_id_offset, + p_lov_disp_sequence=>1, + p_lov_disp_value=>'Yes', + p_lov_return_value=>'Y', + p_lov_data_comment=> ''); + +null; + +end; +/ + + +begin + +wwv_flow_api.create_static_lov_data ( + p_id=>4924205788614301 + wwv_flow_api.g_id_offset, + p_lov_id=>4923728354614299 + wwv_flow_api.g_id_offset, + p_lov_disp_sequence=>2, + p_lov_disp_value=>'No', + p_lov_return_value=>'N', + p_lov_data_comment=> ''); + +null; + +end; +/ + +prompt ...Application Trees +-- +--application/pages/page_groups +prompt ...page groups +-- + +begin + +null; + +end; +/ + +--application/comments +prompt ...comments: requires application express 2.2 or higher +-- + +--application/pages/page_00001 +prompt ...PAGE 1: Dashboard +-- + +begin + +wwv_flow_api.create_page ( + p_flow_id => wwv_flow.g_flow_id + ,p_id => 1 + ,p_tab_set => 'TS1' + ,p_name => 'Dashboard' + ,p_step_title => 'Home' + ,p_allow_duplicate_submissions => 'Y' + ,p_step_sub_title => 'Home' + ,p_step_sub_title_type => 'TEXT_WITH_SUBSTITUTIONS' + ,p_first_item => 'AUTO_FIRST_ITEM' + ,p_include_apex_css_js_yn => 'Y' + ,p_autocomplete_on_off => 'ON' + ,p_page_is_public_y_n => 'N' + ,p_protection_level => 'N' + ,p_cache_page_yn => 'N' + ,p_cache_timeout_seconds => 21600 + ,p_cache_by_user_yn => 'N' + ,p_help_text => +'No help is available for this page.' + ,p_last_updated_by => 'WTP' + ,p_last_upd_yyyymmddhh24miss => '20180707015518' + ); +null; + +end; +/ + +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||' '; + +wwv_flow_api.create_page_plug ( + p_id=> 4846907308414925 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 1, + p_plug_name=> 'Control', + p_region_name=>'', + p_plug_template=> 4840201642414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 11, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_source=> s, + p_plug_source_type=> 'STATIC_TEXT', + p_translate_title=> 'Y', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4854109180566690 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 1, + p_plug_name=> 'Test Runners Status Summary', + p_region_name=>'', + p_plug_template=> 4840201642414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 12, + p_plug_display_column=> 2, + p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4854324865566692+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 1, + p_region_id => 4854109180566690+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DPie', + p_chart_title =>'', + p_chart_name =>'chart_4854324865566692', + p_chart_width =>300, + p_chart_height =>150, + p_chart_animation =>'N', + p_display_attr =>':H:::::Left::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#99FF99,#FFFF99,#FF6699', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'::', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'::', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'with q_max_start as ('||chr(10)|| +'select runner_owner'||chr(10)|| +' ,runner_name'||chr(10)|| +' ,max(start_dtm) MAX_START_DTM'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where :P1_OWNER is NULL'||chr(10)|| +' or :P1_OWNER = runner_owner'||chr(10)|| +' group by runner_owner'||chr(10)|| +' ,runner_name'||chr(10)|| +'), q1 as ('||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''PASS'' LABEL'||chr(10)|| +' ,sum(res.passes) VALUE'||chr(10)|| +' from q_max_start ms'||chr(10)|| +' join wt_test_runs run'||chr(10)|| +' on run.runner_own'; + +a1:=a1||'er = ms.runner_owner'||chr(10)|| +' and run.runner_name = ms.runner_name'||chr(10)|| +' and run.start_dtm = ms.max_start_dtm'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' having sum(res.passes) > 0'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''FAIL'' LABEL'||chr(10)|| +' ,sum(res.failures) VALUE'||chr(10)|| +' from q_max_start ms'||chr(10)|| +' join wt_test_runs run'||chr(10)|| +' on '; + +a1:=a1||' run.runner_owner = ms.runner_owner'||chr(10)|| +' and run.runner_name = ms.runner_name'||chr(10)|| +' and run.start_dtm = ms.max_start_dtm'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' having sum(res.failures) > 0'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''ERR'' LABEL'||chr(10)|| +' ,sum(res.errors) VALUE'||chr(10)|| +' from q_max_start ms'||chr(10)|| +' join wt_test_runs run'||chr(10)|| +' '; + +a1:=a1||' on run.runner_owner = ms.runner_owner'||chr(10)|| +' and run.runner_name = ms.runner_name'||chr(10)|| +' and run.start_dtm = ms.max_start_dtm'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' having sum(res.errors) > 0'||chr(10)|| +')'||chr(10)|| +'select link, label, value'||chr(10)|| +' from q1'||chr(10)|| +' order by label desc'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4854410354566693+wwv_flow_api.g_id_offset, + p_chart_id => 4854324865566692+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4855306596029607 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 1, + p_plug_name=> 'DBOUT Profiles Status Summary', + p_region_name=>'', + p_plug_template=> 4840201642414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 13, + p_plug_display_column=> 3, + p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_display_when_condition => ':P1_NUM_RUNNERS > 0', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4855509614029610+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 1, + p_region_id => 4855306596029607+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DPie', + p_chart_title =>'', + p_chart_name =>'chart_4854324865566692', + p_chart_width =>300, + p_chart_height =>150, + p_chart_animation =>'N', + p_display_attr =>':H:::::Left::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#0099FF,#99FF99,#FF6699,#FFFF99', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'::', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'::', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'with q_max_start as ('||chr(10)|| +'select runner_owner'||chr(10)|| +' ,runner_name'||chr(10)|| +' ,max(start_dtm) MAX_START_DTM'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where :P1_OWNER is NULL'||chr(10)|| +' or :P1_OWNER = runner_owner'||chr(10)|| +' group by runner_owner'||chr(10)|| +' ,runner_name'||chr(10)|| +'), q1 as ('||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''EXCL'' LABEL'||chr(10)|| +' ,sum(excluded_lines) VALUE'||chr(10)|| +' from q_max_start ms'||chr(10)|| +' join wt_test_runs run'||chr(10)|| +' on ru'; + +a1:=a1||'n.runner_owner = ms.runner_owner'||chr(10)|| +' and run.runner_name = ms.runner_name'||chr(10)|| +' and run.start_dtm = ms.max_start_dtm'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' having sum(excluded_lines) > 0'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''EXEC'' LABEL'||chr(10)|| +' ,sum(executed_lines) VALUE'||chr(10)|| +' from q_max_start ms'||chr(10)|| +' join wt_test_run'; + +a1:=a1||'s run'||chr(10)|| +' on run.runner_owner = ms.runner_owner'||chr(10)|| +' and run.runner_name = ms.runner_name'||chr(10)|| +' and run.start_dtm = ms.max_start_dtm'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' having sum(executed_lines) > 0'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''NOTX'' LABEL'||chr(10)|| +' ,sum(notexec_lines) VALUE'||chr(10)|| +' from q_max_start ms'||chr(10)|| +' '; + +a1:=a1||' join wt_test_runs run'||chr(10)|| +' on run.runner_owner = ms.runner_owner'||chr(10)|| +' and run.runner_name = ms.runner_name'||chr(10)|| +' and run.start_dtm = ms.max_start_dtm'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' having sum(notexec_lines) > 0'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''UNKN'' LABEL'||chr(10)|| +' ,sum(unknown_lines) VALUE'||chr(10)|| +' fr'; + +a1:=a1||'om q_max_start ms'||chr(10)|| +' join wt_test_runs run'||chr(10)|| +' on run.runner_owner = ms.runner_owner'||chr(10)|| +' and run.runner_name = ms.runner_name'||chr(10)|| +' and run.start_dtm = ms.max_start_dtm'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' having sum(unknown_lines) > 0'||chr(10)|| +')'||chr(10)|| +'select link, label, value'||chr(10)|| +' from q1'||chr(10)|| +' order by label'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4855610331029611+wwv_flow_api.g_id_offset, + p_chart_id => 4855509614029610+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4857720139336331 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 1, + p_plug_name=> 'Top Test Runner Failures', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 22, + p_plug_display_column=> 2, + p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_display_when_condition => ':P1_NUM_RUNNERS > 0', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4857903544336332+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 1, + p_region_id => 4857720139336331+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DColumn', + p_chart_title =>'', + p_chart_name =>'chart_4857903544336332', + p_chart_width =>300, + p_chart_height =>150, + p_chart_animation =>'N', + p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#FFFF00', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'Failures', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>90, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'with q_max_start as ('||chr(10)|| +'select runner_owner'||chr(10)|| +' ,runner_name'||chr(10)|| +' ,max(start_dtm) MAX_START_DTM'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where :P1_OWNER is NULL'||chr(10)|| +' or :P1_OWNER = runner_owner'||chr(10)|| +' group by runner_owner'||chr(10)|| +' ,runner_name'||chr(10)|| +'), q_top_failures as ('||chr(10)|| +'select ms.runner_owner || ''.'' ||'||chr(10)|| +' ms.runner_name RUNNER'||chr(10)|| +' ,res.failures'||chr(10)|| +' from q_max_start ms'||chr(10)|| +' join wt_test_runs run'||chr(10)|| +' '; + +a1:=a1||' on run.runner_owner = ms.runner_owner'||chr(10)|| +' and run.runner_name = ms.runner_name'||chr(10)|| +' and run.start_dtm = ms.max_start_dtm'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where res.failures > 0'||chr(10)|| +' order by failures desc, RUNNER'||chr(10)|| +')'||chr(10)|| +'--select * from q_max_start;'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,runner LABEL'||chr(10)|| +' ,failures VALUE'||chr(10)|| +' from q_top_failures'||chr(10)|| +' w'; + +a1:=a1||'here rownum <= 10'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4858000738336332+wwv_flow_api.g_id_offset, + p_chart_id => 4857903544336332+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4858315631526698 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 1, + p_plug_name=> 'Top Test Runner Durations', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 32, + p_plug_display_column=> 2, + p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_display_when_condition => ':P1_NUM_RUNNERS > 0', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4858521402526708+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 1, + p_region_id => 4858315631526698+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DColumn', + p_chart_title =>'', + p_chart_name =>'chart_4857903544336332', + p_chart_width =>300, + p_chart_height =>150, + p_chart_animation =>'N', + p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#3366FF', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>1, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'Seconds', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>1, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>90, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'with q_max_start as ('||chr(10)|| +'select runner_owner'||chr(10)|| +' ,runner_name'||chr(10)|| +' ,max(start_dtm) MAX_START_DTM'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where :P1_OWNER is NULL'||chr(10)|| +' or :P1_OWNER = runner_owner'||chr(10)|| +' group by runner_owner'||chr(10)|| +' ,runner_name'||chr(10)|| +'), q_top_duration as ('||chr(10)|| +'select ms.runner_owner || ''.'' ||'||chr(10)|| +' ms.runner_name RUNNER'||chr(10)|| +' ,extract(day from (run.end_dtm -'||chr(10)|| +' run.start_dtm)*8'; + +a1:=a1||'6400*100)/100'||chr(10)|| +' DURATION_SECS'||chr(10)|| +' from q_max_start ms'||chr(10)|| +' join wt_test_runs run'||chr(10)|| +' on run.runner_owner = ms.runner_owner'||chr(10)|| +' and run.runner_name = ms.runner_name'||chr(10)|| +' and run.start_dtm = ms.max_start_dtm'||chr(10)|| +' where extract(day from (run.end_dtm -'||chr(10)|| +' run.start_dtm)*86400*100)/100 > 0'||chr(10)|| +' order by duration_secs desc'; + +a1:=a1||', RUNNER'||chr(10)|| +')'||chr(10)|| +'--select * from q_max_start;'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,runner LABEL'||chr(10)|| +' ,duration_secs VALUE'||chr(10)|| +' from q_top_duration'||chr(10)|| +' where rownum <= 10'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4858612747526709+wwv_flow_api.g_id_offset, + p_chart_id => 4858521402526708+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4859830202458220 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 1, + p_plug_name=> 'Top Test Runner Age', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 31, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_display_when_condition => ':P1_NUM_RUNNERS > 0', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4860011375458221+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 1, + p_region_id => 4859830202458220+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DColumn', + p_chart_title =>'', + p_chart_name =>'chart_4857903544336332', + p_chart_width =>300, + p_chart_height =>150, + p_chart_animation =>'N', + p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#CCCCCC', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>1, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'Days', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>1, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>90, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'with q_max_start as ('||chr(10)|| +'select runner_owner'||chr(10)|| +' ,runner_name'||chr(10)|| +' ,max(start_dtm) MAX_START_DTM'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where :P1_OWNER is NULL'||chr(10)|| +' or :P1_OWNER = runner_owner'||chr(10)|| +' group by runner_owner'||chr(10)|| +' ,runner_name'||chr(10)|| +'), q_top_duration as ('||chr(10)|| +'select ms.runner_owner || ''.'' ||'||chr(10)|| +' ms.runner_name RUNNER'||chr(10)|| +' ,extract(day from (sysdate - run.start_dtm)*10)/10'||chr(10)|| +' '; + +a1:=a1||' AGE_DAYS'||chr(10)|| +' from q_max_start ms'||chr(10)|| +' join wt_test_runs run'||chr(10)|| +' on run.runner_owner = ms.runner_owner'||chr(10)|| +' and run.runner_name = ms.runner_name'||chr(10)|| +' and run.start_dtm = ms.max_start_dtm'||chr(10)|| +' where run.start_dtm is not null'||chr(10)|| +' and extract(day from (sysdate - run.start_dtm)*10)/10 > 0'||chr(10)|| +' order by AGE_DAYS desc, RUNNER'||chr(10)|| +')'||chr(10)|| +'--select * from q_max_start;'||chr(10)|| +'select '; + +a1:=a1||'NULL LINK'||chr(10)|| +' ,runner LABEL'||chr(10)|| +' ,age_days VALUE'||chr(10)|| +' from q_top_duration'||chr(10)|| +' where rownum <= 10'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4860108666458221+wwv_flow_api.g_id_offset, + p_chart_id => 4860011375458221+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4860309181584610 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 1, + p_plug_name=> 'Top DBOUT NotExec Lines', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 23, + p_plug_display_column=> 3, + p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_display_when_condition => ':P1_NUM_DBOUTS > 0', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4860500924584610+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 1, + p_region_id => 4860309181584610+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DColumn', + p_chart_title =>'', + p_chart_name =>'chart_4857903544336332', + p_chart_width =>300, + p_chart_height =>150, + p_chart_animation =>'N', + p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#FF0066', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'Source Lines', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>90, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'with q_max_start as ('||chr(10)|| +'select runner_owner'||chr(10)|| +' ,runner_name'||chr(10)|| +' ,max(start_dtm) MAX_START_DTM'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where :P1_OWNER is NULL'||chr(10)|| +' or :P1_OWNER = runner_owner'||chr(10)|| +' group by runner_owner'||chr(10)|| +' ,runner_name'||chr(10)|| +'), q_top_notexec as ('||chr(10)|| +'select run.dbout_owner || ''.'' ||'||chr(10)|| +' run.dbout_name || ''('' ||'||chr(10)|| +' run.dbout_type || '')'' DBOUT'||chr(10)|| +' ,res.notexec_lines'||chr(10)|| +' from q_max_start ms'||chr(10)|| +' '; + +a1:=a1||' join wt_test_runs run'||chr(10)|| +' on run.runner_owner = ms.runner_owner'||chr(10)|| +' and run.runner_name = ms.runner_name'||chr(10)|| +' and run.start_dtm = ms.max_start_dtm'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where run.dbout_name is not null'||chr(10)|| +' and res.notexec_lines > 0'||chr(10)|| +' order by notexec_lines desc, DBOUT'||chr(10)|| +')'||chr(10)|| +'--select * from q_max_start;'||chr(10)|| +'select NULL '; + +a1:=a1||' LINK'||chr(10)|| +' ,dbout LABEL'||chr(10)|| +' ,notexec_lines VALUE'||chr(10)|| +' from q_top_notexec'||chr(10)|| +' where rownum <= 10'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4860628410584610+wwv_flow_api.g_id_offset, + p_chart_id => 4860500924584610+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4861210200133728 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 1, + p_plug_name=> 'Top Test Case Failures', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 21, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_display_when_condition => ':P1_NUM_RUNNERS > 0', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4861429150133729+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 1, + p_region_id => 4861210200133728+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DColumn', + p_chart_title =>'', + p_chart_name =>'chart_4857903544336332', + p_chart_width =>300, + p_chart_height =>150, + p_chart_animation =>'N', + p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#FFFF00', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'Failures', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>90, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'with q_max_start as ('||chr(10)|| +'select runner_owner'||chr(10)|| +' ,runner_name'||chr(10)|| +' ,max(start_dtm) MAX_START_DTM'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where :P1_OWNER is NULL'||chr(10)|| +' or :P1_OWNER = runner_owner'||chr(10)|| +' group by runner_owner'||chr(10)|| +' ,runner_name'||chr(10)|| +'), q_top_failures as ('||chr(10)|| +'select ms.runner_owner || ''.'' ||'||chr(10)|| +' ms.runner_name || '':'' ||'||chr(10)|| +' tc.testcase TESTCASE'||chr(10)|| +' ,tc.failures'||chr(10)|| +' from q_max_start ms'||chr(10)|| +' jo'; + +a1:=a1||'in wt_test_runs run'||chr(10)|| +' on run.runner_owner = ms.runner_owner'||chr(10)|| +' and run.runner_name = ms.runner_name'||chr(10)|| +' and run.start_dtm = ms.max_start_dtm'||chr(10)|| +' join wt_testcase_stats tc'||chr(10)|| +' on tc.test_run_id = run.id'||chr(10)|| +' where tc.failures > 0'||chr(10)|| +' order by failures desc, TESTCASE'||chr(10)|| +')'||chr(10)|| +'--select * from q_max_start;'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,testcase LABEL'||chr(10)|| +' ,'; + +a1:=a1||'failures VALUE'||chr(10)|| +' from q_top_failures'||chr(10)|| +' where rownum <= 10'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4861511054133729+wwv_flow_api.g_id_offset, + p_chart_id => 4861429150133729+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4861614487144344 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 1, + p_plug_name=> 'Top DBOUT LineExec Times', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 33, + p_plug_display_column=> 3, + p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_display_when_condition => ':P1_NUM_RUNNERS > 0', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4861806074144344+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 1, + p_region_id => 4861614487144344+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DColumn', + p_chart_title =>'', + p_chart_name =>'chart_4857903544336332', + p_chart_width =>300, + p_chart_height =>150, + p_chart_animation =>'N', + p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#3366FF', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'Milliseconds', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>90, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'with q_max_start as ('||chr(10)|| +'select runner_owner'||chr(10)|| +' ,runner_name'||chr(10)|| +' ,max(start_dtm) MAX_START_DTM'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where :P1_OWNER is NULL'||chr(10)|| +' or :P1_OWNER = runner_owner'||chr(10)|| +' group by runner_owner'||chr(10)|| +' ,runner_name'||chr(10)|| +'), q_top_duration as ('||chr(10)|| +'select run.dbout_owner || ''.'' ||'||chr(10)|| +' run.dbout_name || ''('' ||'||chr(10)|| +' run.dbout_type || '')'' DBOUT'||chr(10)|| +' ,res.max_executed_usecs/1000 MAX_MSEC'; + +a1:=a1||'S'||chr(10)|| +' from q_max_start ms'||chr(10)|| +' join wt_test_runs run'||chr(10)|| +' on run.runner_owner = ms.runner_owner'||chr(10)|| +' and run.runner_name = ms.runner_name'||chr(10)|| +' and run.start_dtm = ms.max_start_dtm'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where res.max_executed_usecs > 0'||chr(10)|| +' order by MAX_MSECS desc, DBOUT'||chr(10)|| +')'||chr(10)|| +'--select * from q_max_start;'||chr(10)|| +'select NULL '; + +a1:=a1||' LINK'||chr(10)|| +' ,dbout LABEL'||chr(10)|| +' ,max_msecs VALUE'||chr(10)|| +' from q_top_duration'||chr(10)|| +' where rownum <= 10'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4861925325144344+wwv_flow_api.g_id_offset, + p_chart_id => 4861806074144344+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||'select system_status STATUS'||chr(10)|| +' ,owner'||chr(10)|| +' ,job JOB_ID'||chr(10)|| +' ,status TEST_RUNNER'||chr(10)|| +' ,created CREATED_DATE'||chr(10)|| +' ,system_modified MODIFIED_DATE'||chr(10)|| +' from apex_plsql_jobs'||chr(10)|| +' where system_status != ''COMPLETE'''; + +wwv_flow_api.create_report_region ( + p_id=> 4868303731390297 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 1, + p_name=> 'List of Non-Complete APEX PLSQL Jobs', + p_region_name=>'', + p_template=> 4840201642414912+ wwv_flow_api.g_id_offset, + p_display_sequence=> 50, + p_report_attributes=>'style="color:#0088FF"', + p_display_column=> 1, + p_display_point=> 'BEFORE_SHOW_ITEMS', + p_source=> s, + p_source_type=> 'SQL_QUERY', + p_display_error_message=> '#SQLERRM#', + p_plug_caching=> 'NOT_CACHED', + p_customized=> '0', + p_translate_title=> 'Y', + p_ajax_enabled=> 'Y', + p_query_row_template=> 4843113555414914+ wwv_flow_api.g_id_offset, + p_query_headings_type=> 'COLON_DELMITED_LIST', + p_query_num_rows=> '15', + p_query_options=> 'DERIVED_REPORT_COLUMNS', + p_query_show_nulls_as=> ' - ', + p_query_break_cols=> '0', + p_query_no_data_found=> 'no data found', + p_query_num_rows_type=> 'NEXT_PREVIOUS_LINKS', + p_pagination_display_position=> 'BOTTOM_LEFT', + p_csv_output=> 'N', + p_query_asc_image=> 'apex/builder/dup.gif', + p_query_asc_image_attr=> 'width="16" height="16" alt="" ', + p_query_desc_image=> 'apex/builder/ddown.gif', + p_query_desc_image_attr=> 'width="16" height="16" alt="" ', + p_plug_query_strip_html=> 'Y', + p_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4881232628476372 + wwv_flow_api.g_id_offset, + p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 1, + p_form_element_id=> null, + p_column_alias=> 'STATUS', + p_column_display_sequence=> 4, + p_column_heading=> 'Status', + p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4868904911390304 + wwv_flow_api.g_id_offset, + p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 2, + p_form_element_id=> null, + p_column_alias=> 'OWNER', + p_column_display_sequence=> 2, + p_column_heading=> 'Owner', + p_column_alignment=>'LEFT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4883106339673259 + wwv_flow_api.g_id_offset, + p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 3, + p_form_element_id=> null, + p_column_alias=> 'JOB_ID', + p_column_display_sequence=> 1, + p_column_heading=> 'Job ID', + p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', + p_default_sort_column_sequence=>1, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4895626533688122 + wwv_flow_api.g_id_offset, + p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 4, + p_form_element_id=> null, + p_column_alias=> 'TEST_RUNNER', + p_column_display_sequence=> 3, + p_column_heading=> 'Test Runner', + p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'Y', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4883218347673259 + wwv_flow_api.g_id_offset, + p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 5, + p_form_element_id=> null, + p_column_alias=> 'CREATED_DATE', + p_column_display_sequence=> 5, + p_column_heading=> 'Created Date', + p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4883328315673259 + wwv_flow_api.g_id_offset, + p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 6, + p_form_element_id=> null, + p_column_alias=> 'MODIFIED_DATE', + p_column_display_sequence=> 6, + p_column_heading=> 'Modified Date', + p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||'with q_max_start as ('||chr(10)|| +'select runner_owner'||chr(10)|| +' ,runner_name'||chr(10)|| +' ,max(start_dtm) MAX_START_DTM'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where :P1_OWNER is NULL'||chr(10)|| +' or :P1_OWNER = runner_owner'||chr(10)|| +' group by runner_owner'||chr(10)|| +' ,runner_name'||chr(10)|| +')'||chr(10)|| +'select run.id'||chr(10)|| +' ,q1.runner_owner || ''.'' ||'||chr(10)|| +' q1.runner_name TEST_RUNNER'||chr(10)|| +' ,run.dbout_owner || ''.'' ||'||chr(10)|| +' run.dbout_name || ''('' ||'||chr(10)|| +' run.dbout_type || '; + +s:=s||''')'' DBOUT_PROFILED'||chr(10)|| +' ,run.start_dtm'||chr(10)|| +' ,run.error_message'||chr(10)|| +' from q_max_start q1'||chr(10)|| +' join wt_test_runs run'||chr(10)|| +' on run.runner_owner = q1.runner_owner'||chr(10)|| +' and run.runner_name = q1.runner_name'||chr(10)|| +' and run.start_dtm = q1.max_start_dtm'||chr(10)|| +' where run.error_message is not null'; + +wwv_flow_api.create_report_region ( + p_id=> 4869425043509942 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 1, + p_name=> 'Test Runner Errors', + p_region_name=>'', + p_template=> 4840201642414912+ wwv_flow_api.g_id_offset, + p_display_sequence=> 51, + p_report_attributes=>'style="color:#FF0000"', + p_display_column=> 1, + p_display_point=> 'BEFORE_SHOW_ITEMS', + p_source=> s, + p_source_type=> 'SQL_QUERY', + p_display_error_message=> '#SQLERRM#', + p_plug_caching=> 'NOT_CACHED', + p_customized=> '0', + p_translate_title=> 'Y', + p_ajax_enabled=> 'Y', + p_query_row_template=> 4843113555414914+ wwv_flow_api.g_id_offset, + p_query_headings_type=> 'COLON_DELMITED_LIST', + p_query_num_rows=> '15', + p_query_options=> 'DERIVED_REPORT_COLUMNS', + p_query_show_nulls_as=> ' - ', + p_query_break_cols=> '0', + p_query_no_data_found=> 'no data found', + p_query_num_rows_type=> 'NEXT_PREVIOUS_LINKS', + p_pagination_display_position=> 'BOTTOM_LEFT', + p_csv_output=> 'N', + p_prn_output=> 'N', + p_prn_format=> 'PDF', + p_prn_output_show_link=> 'Y', + p_prn_output_link_text=> 'Print', + p_prn_content_disposition=> 'ATTACHMENT', + p_prn_document_header=> 'APEX', + p_prn_units=> 'INCHES', + p_prn_paper_size=> 'LETTER', + p_prn_width_units=> 'PERCENTAGE', + p_prn_width=> 11, + p_prn_height=> 8.5, + p_prn_orientation=> 'HORIZONTAL', + p_prn_page_header_font_color=> '#000000', + p_prn_page_header_font_family=> 'Helvetica', + p_prn_page_header_font_weight=> 'normal', + p_prn_page_header_font_size=> '12', + p_prn_page_footer_font_color=> '#000000', + p_prn_page_footer_font_family=> 'Helvetica', + p_prn_page_footer_font_weight=> 'normal', + p_prn_page_footer_font_size=> '12', + p_prn_header_bg_color=> '#9bafde', + p_prn_header_font_color=> '#ffffff', + p_prn_header_font_family=> 'Helvetica', + p_prn_header_font_weight=> 'normal', + p_prn_header_font_size=> '10', + p_prn_body_bg_color=> '#efefef', + p_prn_body_font_color=> '#000000', + p_prn_body_font_family=> 'Helvetica', + p_prn_body_font_weight=> 'normal', + p_prn_body_font_size=> '10', + p_prn_border_width=> .5, + p_prn_page_header_alignment=> 'CENTER', + p_prn_page_footer_alignment=> 'CENTER', + p_query_asc_image=> 'apex/builder/dup.gif', + p_query_asc_image_attr=> 'width="16" height="16" alt="" ', + p_query_desc_image=> 'apex/builder/ddown.gif', + p_query_desc_image_attr=> 'width="16" height="16" alt="" ', + p_plug_query_strip_html=> 'Y', + p_comment=>''); +end; +/ + +-- maintain plug_column_width attribute for 2.2 and greater +begin +execute immediate 'begin wwv_flow_api.set_region_column_width ( + p_id=>4869425043509942 + wwv_flow_api.g_id_offset, + p_flow_id=>wwv_flow.g_flow_id, + p_page_id=>1, + p_plug_column_width=>''style="color:red"''); end;'; +exception when others then null; +end; +/ + +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4871606819864244 + wwv_flow_api.g_id_offset, + p_region_id=> 4869425043509942 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 1, + p_form_element_id=> null, + p_column_alias=> 'ID', + p_column_display_sequence=> 1, + p_column_heading=> 'Test Run ID', + p_column_alignment=>'LEFT', + p_heading_alignment=>'RIGHT', + p_default_sort_column_sequence=>1, + p_default_sort_dir=>'desc', + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_print_col_width=> '20', + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4869808842509943 + wwv_flow_api.g_id_offset, + p_region_id=> 4869425043509942 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 2, + p_form_element_id=> null, + p_column_alias=> 'TEST_RUNNER', + p_column_display_sequence=> 2, + p_column_heading=> 'Test Runner Package', + p_column_alignment=>'LEFT', + p_heading_alignment=>'LEFT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_lov_show_nulls=> 'NO', + p_is_required=> false, + p_pk_col_source=> s, + p_lov_display_extra=> 'YES', + p_include_in_export=> 'Y', + p_print_col_width=> '20', + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4869907123509943 + wwv_flow_api.g_id_offset, + p_region_id=> 4869425043509942 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 3, + p_form_element_id=> null, + p_column_alias=> 'DBOUT_PROFILED', + p_column_display_sequence=> 3, + p_column_heading=> 'DB Object Under Test', + p_column_alignment=>'LEFT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_include_in_export=> 'Y', + p_print_col_width=> '20', + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4870003732509943 + wwv_flow_api.g_id_offset, + p_region_id=> 4869425043509942 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 4, + p_form_element_id=> null, + p_column_alias=> 'START_DTM', + p_column_display_sequence=> 4, + p_column_heading=> 'Start Date/Time', + p_column_alignment=>'LEFT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_include_in_export=> 'Y', + p_print_col_width=> '20', + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4870105383509943 + wwv_flow_api.g_id_offset, + p_region_id=> 4869425043509942 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 5, + p_form_element_id=> null, + p_column_alias=> 'ERROR_MESSAGE', + p_column_display_sequence=> 5, + p_column_heading=> 'Error Message', + p_column_alignment=>'LEFT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_include_in_export=> 'Y', + p_print_col_width=> '20', + p_column_comment=>''); +end; +/ + +begin + +null; + +end; +/ + + +begin + +wwv_flow_api.create_page_branch( + p_id=>4852128982276097 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 1, + p_branch_action=> 'f?p=&FLOW_ID.:1:&SESSION.', + p_branch_point=> 'AFTER_PROCESSING', + p_branch_type=> 'REDIRECT_URL', + p_branch_sequence=> 99, + p_save_state_before_branch_yn=>'Y', + p_branch_comment=> ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4851514010066641 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 1, + p_name=>'P1_OWNER', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 10, + p_item_plug_id => 4846907308414925+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Test Runner Owner:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_POPUP_LOV', + p_lov=> 'select runner_owner DISPLAY'||chr(10)|| +' ,runner_owner VALUE'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' group by runner_owner'||chr(10)|| +' order by runner_owner', + p_lov_display_null=> 'YES', + p_lov_translated=> 'N', + p_lov_null_text=>'All Owners', + p_lov_null_value=> '', + p_cSize=> 20, + p_cMaxlength=> 128, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843706770414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'NO', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'ENTERABLE', + p_attribute_02 => 'FIRST_ROWSET', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4852421357324186 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 1, + p_name=>'P1_NUM_RUNNERS', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 30, + p_item_plug_id => 4846907308414925+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'NO', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Test Runners:', + p_source=>'with q1 as ('||chr(10)|| +'select runner_owner, runner_name'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where :P1_OWNER is NULL'||chr(10)|| +' or :P1_OWNER = runner_owner'||chr(10)|| +' group by runner_owner, runner_name'||chr(10)|| +')'||chr(10)|| +'select count(*) from q1', + p_source_type=> 'QUERY', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4852904959385757 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 1, + p_name=>'P1_NUM_DBOUTS', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 40, + p_item_plug_id => 4846907308414925+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Named DBOUTs:', + p_source=>'with q1 as ('||chr(10)|| +'select dbout_owner, dbout_name, dbout_type'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where :P1_OWNER is NULL'||chr(10)|| +' or :P1_OWNER = runner_owner'||chr(10)|| +' group by dbout_owner, dbout_name, dbout_type'||chr(10)|| +')'||chr(10)|| +'select count(*) from q1', + p_source_type=> 'QUERY', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4853512324444641 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 1, + p_name=>'P1_NUM_CASES', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 50, + p_item_plug_id => 4846907308414925+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Test Cases:', + p_source=>'with q1 as ('||chr(10)|| +'select runner_owner, runner_name, testcase'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_testcase_stats case'||chr(10)|| +' on case.test_run_id = run.id'||chr(10)|| +' where :P1_OWNER is NULL'||chr(10)|| +' or :P1_OWNER = runner_owner'||chr(10)|| +' group by runner_owner, runner_name, testcase'||chr(10)|| +')'||chr(10)|| +'select count(*) from q1', + p_source_type=> 'QUERY', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4885303924098377 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 1, + p_name=>'P1_JOBS_ENABLED', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 60, + p_item_plug_id => 4868303731390297+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'NO', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'PLSQL', + p_attribute_03 => 'begin'||chr(10)|| +' if apex_plsql_job.jobs_are_enabled'||chr(10)|| +' then'||chr(10)|| +' htp.p(''APEX PLSQL Jobs are Enabled'');'||chr(10)|| +' else'||chr(10)|| +' htp.p(''*** APEX PLSQL Jobs are NOT Enabled ***'');'||chr(10)|| +' end if;'||chr(10)|| +'end;', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4929328361080445 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 1, + p_name=>'P1_SPACER_01', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 70, + p_item_plug_id => 4846907308414925+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>' ', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843706770414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + + +begin + +wwv_flow_api.create_page_da_event ( + p_id => 4928723466050705 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_page_id => 1 + ,p_name => 'Submit After LOV Change' + ,p_event_sequence => 10 + ,p_triggering_element_type => 'ITEM' + ,p_triggering_element => 'P1_OWNER' + ,p_bind_type => 'bind' + ,p_bind_event_type => 'change' + ); +wwv_flow_api.create_page_da_action ( + p_id => 4929031293050707 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_page_id => 1 + ,p_event_id => 4928723466050705 + wwv_flow_api.g_id_offset + ,p_event_result => 'TRUE' + ,p_action_sequence => 10 + ,p_execute_on_page_init => 'N' + ,p_action => 'NATIVE_SUBMIT_PAGE' + ,p_attribute_01 => 'REFRESH' + ,p_stop_execution_on_error => 'Y' + ); +null; + +end; +/ + + +begin + +declare + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +p:=p||'begin'||chr(10)|| +' if :P1_OWNER = ''1st Time'''||chr(10)|| +' then'||chr(10)|| +' begin'||chr(10)|| +' select max(runner_owner)'||chr(10)|| +' into :P1_OWNER'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where runner_owner <= :APP_USER;'||chr(10)|| +' exception when NO_DATA_FOUND'||chr(10)|| +' then'||chr(10)|| +' begin'||chr(10)|| +' select min(runner_owner)'||chr(10)|| +' into :P1_OWNER'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where runner_owner >= :APP_USER;'||chr(10)|| +' '; + +p:=p||' exception when NO_DATA_FOUND'||chr(10)|| +' then'||chr(10)|| +' :P1_OWNER := NULL;'||chr(10)|| +' end;'||chr(10)|| +' end;'||chr(10)|| +' end if;'||chr(10)|| +'end;'; + +wwv_flow_api.create_page_process( + p_id => 4900928128520593 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id => 1, + p_process_sequence=> 10, + p_process_point=> 'BEFORE_HEADER', + p_process_type=> 'PLSQL', + p_process_name=> 'P1_INIT_OWNER', + p_process_sql_clob => p, + p_process_error_message=> '', + p_process_success_message=> '', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; +null; + +end; +/ + + +begin + +--------------------------------------- +-- ...updatable report columns for page 1 +-- + +begin + +null; +end; +null; + +end; +/ + + +--application/pages/page_00002 +prompt ...PAGE 2: Run Test +-- + +begin + +wwv_flow_api.create_page ( + p_flow_id => wwv_flow.g_flow_id + ,p_id => 2 + ,p_tab_set => 'TS1' + ,p_name => 'Run Test' + ,p_step_title => 'Run Test' + ,p_allow_duplicate_submissions => 'Y' + ,p_step_sub_title => 'Run Test' + ,p_step_sub_title_type => 'TEXT_WITH_SUBSTITUTIONS' + ,p_first_item => 'AUTO_FIRST_ITEM' + ,p_include_apex_css_js_yn => 'Y' + ,p_autocomplete_on_off => 'ON' + ,p_page_is_public_y_n => 'N' + ,p_protection_level => 'N' + ,p_cache_page_yn => 'N' + ,p_cache_timeout_seconds => 21600 + ,p_cache_by_user_yn => 'N' + ,p_help_text => +'No help is available for this page.' + ,p_last_updated_by => 'WTP' + ,p_last_upd_yyyymmddhh24miss => '20180706095952' + ); +null; + +end; +/ + +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s := null; +wwv_flow_api.create_page_plug ( + p_id=> 4847515458414925 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 2, + p_plug_name=> 'Run Test', + p_region_name=>'', + p_plug_template=> 4838619911414911+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 1, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'STATIC_TEXT', + p_translate_title=> 'Y', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||'select system_status STATUS'||chr(10)|| +' ,owner'||chr(10)|| +' ,job JOB_ID'||chr(10)|| +' ,status TEST_RUNNER'||chr(10)|| +' ,created CREATED_DATE'||chr(10)|| +' ,system_modified MODIFIED_DATE'||chr(10)|| +' from apex_plsql_jobs'; + +wwv_flow_api.create_page_plug ( + p_id=> 4885513244116318 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 2, + p_plug_name=> 'APEX PLSQL Jobs', + p_region_name=>'', + p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 4, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'DYNAMIC_QUERY', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_show_nulls_as => ' - ', + p_plug_display_condition_type => '', + p_pagination_display_position=>'BOTTOM_RIGHT', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'select system_status STATUS'||chr(10)|| +' ,owner'||chr(10)|| +' ,job JOB_ID'||chr(10)|| +' ,status TEST_RUNNER'||chr(10)|| +' ,created CREATED_DATE'||chr(10)|| +' ,system_modified MODIFIED_DATE'||chr(10)|| +' from apex_plsql_jobs'; + +wwv_flow_api.create_worksheet( + p_id=> 4885631457116318+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 2, + p_region_id=> 4885513244116318+wwv_flow_api.g_id_offset, + p_name=> 'List of APEX PLSQL Jobs', + p_folder_id=> null, + p_alias=> '', + p_report_id_item=> '', + p_max_row_count=> '10000', + p_max_row_count_message=> 'This query returns more than #MAX_ROW_COUNT# rows, please filter your data to ensure complete results.', + p_no_data_found_message=> 'No data found.', + p_max_rows_per_page=>'10', + p_search_button_label=>'', + p_page_items_to_submit=>'', + p_sort_asc_image=>'', + p_sort_asc_image_attr=>'', + p_sort_desc_image=>'', + p_sort_desc_image_attr=>'', + p_sql_query => a1, + p_status=>'AVAILABLE_FOR_OWNER', + p_allow_report_saving=>'Y', + p_allow_save_rpt_public=>'N', + p_allow_report_categories=>'N', + p_show_nulls_as=>'-', + p_pagination_type=>'ROWS_X_TO_Y', + p_pagination_display_pos=>'BOTTOM_LEFT', + p_show_finder_drop_down=>'Y', + p_show_display_row_count=>'N', + p_show_search_bar=>'Y', + p_show_search_textbox=>'Y', + p_show_actions_menu=>'Y', + p_report_list_mode=>'TABS', + p_show_detail_link=>'N', + p_show_select_columns=>'Y', + p_show_rows_per_page=>'Y', + p_show_filter=>'Y', + p_show_sort=>'Y', + p_show_control_break=>'Y', + p_show_highlight=>'Y', + p_show_computation=>'Y', + p_show_aggregate=>'Y', + p_show_chart=>'Y', + p_show_group_by=>'Y', + p_show_notify=>'N', + p_show_calendar=>'N', + p_show_flashback=>'Y', + p_show_reset=>'Y', + p_show_download=>'Y', + p_show_help=>'Y', + p_download_formats=>'CSV:HTML:EMAIL', + p_allow_exclude_null_values=>'N', + p_allow_hide_extra_columns=>'N', + p_icon_view_enabled_yn=>'N', + p_icon_view_columns_per_row=>1, + p_detail_view_enabled_yn=>'N', + p_owner=>'WTP'); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4886006079116325+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 2, + p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, + p_db_column_name =>'JOB_ID', + p_display_order =>1, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'C', + p_column_label =>'Job ID', + p_report_label =>'Job ID', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4885924971116325+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 2, + p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, + p_db_column_name =>'OWNER', + p_display_order =>2, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'B', + p_column_label =>'Owner', + p_report_label =>'Owner', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4902120303603523+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 2, + p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, + p_db_column_name =>'TEST_RUNNER', + p_display_order =>3, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'F', + p_column_label =>'Test Runner', + p_report_label =>'Test Runner', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4885819894116324+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 2, + p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, + p_db_column_name =>'STATUS', + p_display_order =>4, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'A', + p_column_label =>'Status', + p_report_label =>'Status', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4886115192116325+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 2, + p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, + p_db_column_name =>'CREATED_DATE', + p_display_order =>5, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'D', + p_column_label =>'Created Date', + p_report_label =>'Created Date', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'DATE', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4886225579116325+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 2, + p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, + p_db_column_name =>'MODIFIED_DATE', + p_display_order =>6, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'E', + p_column_label =>'Modified Date', + p_report_label =>'Modified Date', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'DATE', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +declare + rc1 varchar2(32767) := null; +begin +rc1:=rc1||'JOB_ID:OWNER:TEST_RUNNER:STATUS:CREATED_DATE:MODIFIED_DATE'; + +wwv_flow_api.create_worksheet_rpt( + p_id => 4886308472128052+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 2, + p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, + p_session_id => null, + p_base_report_id => null+wwv_flow_api.g_id_offset, + p_application_user => 'APXWS_DEFAULT', + p_report_seq =>10, + p_report_alias =>'48864', + p_status =>'PUBLIC', + p_category_id =>null+wwv_flow_api.g_id_offset, + p_is_default =>'Y', + p_display_rows =>10, + p_report_columns =>rc1, + p_sort_column_1 =>'JOB_ID', + p_sort_direction_1 =>'DESC', + p_flashback_enabled =>'N', + p_calendar_display_column =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_condition( + p_id => 4902300049635451+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 2, + p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, + p_report_id => 4886308472128052+wwv_flow_api.g_id_offset, + p_condition_type =>'FILTER', + p_allow_delete =>'Y', + p_column_name =>'STATUS', + p_operator =>'!=', + p_expr =>'COMPLETE', + p_condition_sql =>'"STATUS" != #APXWS_EXPR#', + p_condition_display =>'#APXWS_COL_NAME# != ''COMPLETE'' ', + p_enabled =>'Y', + p_column_format =>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||'
'||chr(10)|| +'
'||chr(10)|| +''||chr(10)|| +'APEX PLSQL Job Logs:'||chr(10)|| +''; + +wwv_flow_api.create_page_plug ( + p_id=> 4888312946252430 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 2, + p_plug_name=> 'Space and Title', + p_region_name=>'', + p_plug_template=> 4839912075414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 3, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'STATIC_TEXT', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'QUERY_COLUMNS', + p_plug_query_num_rows_type => 'NEXT_PREVIOUS_LINKS', + p_plug_query_row_count_max => 500, + p_plug_query_show_nulls_as => ' - ', + p_plug_display_condition_type => '', + p_pagination_display_position=>'BOTTOM_RIGHT', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||'
'||chr(10)|| +'
'||chr(10)|| +''||chr(10)|| +'APEX PLSQL Job Logs Cleanup:'||chr(10)|| +''; + +wwv_flow_api.create_page_plug ( + p_id=> 4891414311501831 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 2, + p_plug_name=> 'Purge Jobs', + p_region_name=>'', + p_plug_template=> 4839912075414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 2, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'STATIC_TEXT', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'QUERY_COLUMNS', + p_plug_query_num_rows => 15, + p_plug_query_num_rows_type => 'NEXT_PREVIOUS_LINKS', + p_plug_query_row_count_max => 500, + p_plug_query_show_nulls_as => ' - ', + p_plug_display_condition_type => '', + p_pagination_display_position=>'BOTTOM_RIGHT', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ + +begin + +null; + +end; +/ + + +begin + +wwv_flow_api.create_page_branch( + p_id=>4877001457701994 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 2, + p_branch_action=> 'f?p=&APP_ID.:2:&SESSION.::&DEBUG.:::', + p_branch_point=> 'AFTER_PROCESSING', + p_branch_type=> 'REDIRECT_URL', + p_branch_sequence=> 99, + p_save_state_before_branch_yn=>'Y', + p_branch_comment=> ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4875003523525673 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 2, + p_name=>'P2_TEST_RUNNER', + p_data_type=> 'VARCHAR', + p_is_required=> true, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 1, + p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Test Runner:', + p_source=>'select min(package_name)'||chr(10)|| +' from user_arguments'||chr(10)|| +' where object_name = ''WTPLSQL_RUN'''||chr(10)|| +' and argument_name is null'||chr(10)|| +' and position = 1'||chr(10)|| +' and sequence = 0', + p_source_type=> 'QUERY', + p_display_as=> 'NATIVE_POPUP_LOV', + p_lov=> 'select package_name DISPLAY'||chr(10)|| +' ,package_name RETURN'||chr(10)|| +' from user_arguments'||chr(10)|| +' where object_name = ''WTPLSQL_RUN'''||chr(10)|| +' and argument_name is null'||chr(10)|| +' and position = 1'||chr(10)|| +' and sequence = 0'||chr(10)|| +' order by package_name', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'NO', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'NOT_ENTERABLE', + p_attribute_02 => 'FIRST_ROWSET', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4876813883701993 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 2, + p_name=>'P2_CREATE_JOB', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 2, + p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'NO', + p_item_default=> 'CREATE_JOB', + p_prompt=>'Run Test', + p_source=>'CREATE_JOB', + p_source_type=> 'STATIC', + p_display_as=> 'BUTTON', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> null, + p_cMaxlength=> 2000, + p_cHeight=> null, + p_tag_attributes => 'template:'||to_char(4838226535414911 + wwv_flow_api.g_id_offset), + p_begin_on_new_line=> 'NO', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'LEFT', + p_field_alignment=> 'LEFT', + p_is_persistent=> 'N', + p_button_execute_validations=>'Y', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4878816026232509 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 2, + p_name=>'P2_LAST_JOB_ID', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 3, + p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Last Job ID: ', + p_source=>'select max(job) from apex_plsql_jobs;', + p_source_type=> 'QUERY', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4884208416023999 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 2, + p_name=>'P2_JOBS_ENABLED', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 4, + p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'NO', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'PLSQL', + p_attribute_03 => 'begin'||chr(10)|| +' if apex_plsql_job.jobs_are_enabled'||chr(10)|| +' then'||chr(10)|| +' htp.p(''APEX PLSQL Jobs are Enabled'');'||chr(10)|| +' else'||chr(10)|| +' htp.p(''*** APEX PLSQL Jobs are NOT Enabled ***'');'||chr(10)|| +' end if;'||chr(10)|| +'end;', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4889602986280871 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 2, + p_name=>'P2_PURGE_DAYS', + p_data_type=> 'VARCHAR', + p_is_required=> true, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 3, + p_item_plug_id => 4891414311501831+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Older Than (Days):', + p_format_mask=>'999', + p_source=>'5', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_NUMBER_FIELD', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 3, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => '1', + p_attribute_02 => '999', + p_attribute_03 => 'right', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4889829698317005 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 2, + p_name=>'P2_PURGE_LOGS', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 4, + p_item_plug_id => 4891414311501831+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'NO', + p_item_default=> 'PURGE_LOGS', + p_prompt=>'Purge Job Logs', + p_source=>'PURGE_LOGS', + p_source_type=> 'STATIC', + p_display_as=> 'BUTTON', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> null, + p_cMaxlength=> 2000, + p_cHeight=> null, + p_begin_on_new_line=> 'NO', + p_begin_on_new_field=> 'NO', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'LEFT', + p_field_alignment=> 'LEFT', + p_is_persistent=> 'N', + p_button_execute_validations=>'Y', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4890910455472266 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 2, + p_name=>'P2_NUM_LOGS', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 2, + p_item_plug_id => 4891414311501831+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'NO', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Number of Logs:', + p_source=>'select count(*) from apex_plsql_jobs', + p_source_type=> 'QUERY', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4893230521026887 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 2, + p_name=>'P2_LOGS_AGE', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 1, + p_item_plug_id => 4891414311501831+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'NO', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Oldest Logs (Days):', + p_source=>'select round(sysdate - min(created)) from apex_plsql_jobs', + p_source_type=> 'QUERY', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + + +begin + +declare + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +p:=p||'begin'||chr(10)|| +' :P2_LAST_JOB_ID := apex_plsql_job.submit_process'||chr(10)|| +' (p_sql => ''begin wtplsql.test_run('''''' ||'||chr(10)|| +' :P2_TEST_RUNNER ||''''''); end;'''||chr(10)|| +' ,p_status => substr(:P2_TEST_RUNNER,1,100) );'||chr(10)|| +'end;'; + +wwv_flow_api.create_page_process( + p_id => 4876513059692293 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id => 2, + p_process_sequence=> 10, + p_process_point=> 'AFTER_SUBMIT', + p_process_type=> 'PLSQL', + p_process_name=> 'SUBMIT_PROCESS', + p_process_sql_clob => p, + p_process_error_message=> 'Create Job Failed', + p_process_when_button_id=>4876813883701993 + wwv_flow_api.g_id_offset, + p_process_success_message=> 'Create Job was Successful', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; +null; + +end; +/ + + +begin + +declare + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +p:=p||'begin'||chr(10)|| +' for buff in ('||chr(10)|| +' select id from apex_plsql_jobs'||chr(10)|| +' where created < sysdate - :P2_PURGE_DAYS )'||chr(10)|| +' loop'||chr(10)|| +' apex_plsql_job.purge_process(buff.id);'||chr(10)|| +' end loop;'||chr(10)|| +'end;'; + +wwv_flow_api.create_page_process( + p_id => 4890226759353997 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id => 2, + p_process_sequence=> 20, + p_process_point=> 'AFTER_SUBMIT', + p_process_type=> 'PLSQL', + p_process_name=> 'PURGE_LOGS', + p_process_sql_clob => p, + p_process_error_message=> 'Log Purge Failure', + p_process_when_button_id=>4889829698317005 + wwv_flow_api.g_id_offset, + p_process_success_message=> 'Logs Successfully Purged', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; +null; + +end; +/ + + +begin + +--------------------------------------- +-- ...updatable report columns for page 2 +-- + +begin + +null; +end; +null; + +end; +/ + + +--application/pages/page_00003 +prompt ...PAGE 3: Test Runner +-- + +begin + +wwv_flow_api.create_page ( + p_flow_id => wwv_flow.g_flow_id + ,p_id => 3 + ,p_tab_set => 'TS1' + ,p_name => 'Test Runner' + ,p_step_title => 'Test Runner' + ,p_allow_duplicate_submissions => 'Y' + ,p_step_sub_title => 'Test Runner' + ,p_step_sub_title_type => 'TEXT_WITH_SUBSTITUTIONS' + ,p_first_item => 'AUTO_FIRST_ITEM' + ,p_include_apex_css_js_yn => 'Y' + ,p_autocomplete_on_off => 'ON' + ,p_step_template => 4837222651414910 + wwv_flow_api.g_id_offset + ,p_page_is_public_y_n => 'N' + ,p_protection_level => 'N' + ,p_cache_page_yn => 'N' + ,p_cache_timeout_seconds => 21600 + ,p_cache_by_user_yn => 'N' + ,p_help_text => +'No help is available for this page.' + ,p_last_updated_by => 'WTP' + ,p_last_upd_yyyymmddhh24miss => '20180707032321' + ); +null; + +end; +/ + +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s := null; +wwv_flow_api.create_page_plug ( + p_id=> 4848108018414926 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_plug_name=> 'Test Runner', + p_region_name=>'', + p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 11, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_source=> s, + p_plug_source_type=> 'STATIC_TEXT', + p_translate_title=> 'Y', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||'select case when connect_by_isleaf = 1 then 0'||chr(10)|| +' when level = 1 then 1'||chr(10)|| +' else -1'||chr(10)|| +' end as status, '||chr(10)|| +' level, '||chr(10)|| +' "TEXT" as title, '||chr(10)|| +' null as icon, '||chr(10)|| +' "ID" as value, '||chr(10)|| +' null as tooltip, '||chr(10)|| +' ''f?p=&APP_ID.:3:''||:APP_SESSION||''::::P3_TEST_RUN_ID:''||"ID" as link '||chr(10)|| +'from "#OWNER#"."WT_TEST_RUNS_TREE"'||chr(10)|| +'start with "PAREN'; + +s:=s||'T_ID" is null'||chr(10)|| +'connect by prior "ID" = "PARENT_ID"'; + +wwv_flow_api.create_page_plug ( + p_id=> 4914618551787988 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_plug_name=> 'Test Runs Tree', + p_region_name=>'', + p_plug_template=> 4840201642414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 10, + p_plug_display_column=> 1, + p_plug_display_point=> 'REGION_POSITION_02', + p_plug_source=> s, + p_plug_source_type=> 'JSTREE', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'select case when connect_by_isleaf = 1 then 0'||chr(10)|| +' when level = 1 then 1'||chr(10)|| +' else -1'||chr(10)|| +' end STATUS'||chr(10)|| +' ,level'||chr(10)|| +' ,"TEXT" TITLE'||chr(10)|| +' ,null ICON'||chr(10)|| +' ,"ID" VALUE'||chr(10)|| +' ,"TEXT"'; + +a1:=a1||' TOOLTIP'||chr(10)|| +' ,case when id > 0 then'||chr(10)|| +' ''f?p=&APP_ID.:3:''||:APP_SESSION||''::::P3_TEST_RUN_ID:''||"ID"'||chr(10)|| +' else NULL end LINK'||chr(10)|| +' from "#OWNER#"."WT_TEST_RUNS_GUI_TREE"'||chr(10)|| +' start with "PARENT_ID" is null'||chr(10)|| +' connect by prior "ID" = "PARENT_ID"'; + +wwv_flow_api.create_jstree( + p_id => 4914517648787988+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 3, + p_region_id => 4914618551787988+wwv_flow_api.g_id_offset, + p_tree_template =>'classic', + p_tree_source =>'', + p_tree_query =>a1, + p_tree_node_title =>'TEXT', + p_tree_node_value =>'ID', + p_tree_node_icon =>'', + p_tree_node_link =>'', + p_tree_node_hints =>'ID', + p_tree_start_item =>'PARENT_ID', + p_tree_start_value =>'', + p_tree_button_option =>'', + p_show_node_link =>'', + p_node_link_checksum_type =>null, + p_tree_comment =>'', + p_show_hints =>'DB', + p_tree_has_focus =>'N', + p_tree_hint_text =>'', + p_tree_click_action =>'S', + p_selected_node =>'P3_TEST_RUN_ID'); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4927702379997301 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_plug_name=> 'Test Runner Status', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 12, + p_plug_display_column=> 2, + p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4927915384997301+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 3, + p_region_id => 4927702379997301+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DPie', + p_chart_title =>'', + p_chart_name =>'chart_4927915384997301', + p_chart_width =>300, + p_chart_height =>200, + p_chart_animation =>'N', + p_display_attr =>':H:::::Left::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#99FF99,#FFFF99,#FF6699', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'::', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'::', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'with q1 as ('||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''PASS'' LABEL'||chr(10)|| +' ,sum(res.passes) VALUE'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where id = :P3_TEST_RUN_ID'||chr(10)|| +' having sum(res.passes) > 0'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''FAIL'' LABEL'||chr(10)|| +' ,sum(res.failures) VALUE'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join'; + +a1:=a1||' wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where id = :P3_TEST_RUN_ID'||chr(10)|| +' having sum(res.failures) > 0'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''ERR'' LABEL'||chr(10)|| +' ,sum(res.errors) VALUE'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where id = :P3_TEST_RUN_ID'||chr(10)|| +' having sum(res.errors) > 0'||chr(10)|| +')'||chr(10)|| +'select link, label,'; + +a1:=a1||' value'||chr(10)|| +' from q1'||chr(10)|| +' order by label desc'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4928017042997302+wwv_flow_api.g_id_offset, + p_chart_id => 4927915384997301+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'', + p_action_link_checksum_type =>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4930902107252669 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_plug_name=> 'DBOUT Profile Status', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 13, + p_plug_display_column=> 3, + p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4931121643252671+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 3, + p_region_id => 4930902107252669+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DPie', + p_chart_title =>'', + p_chart_name =>'chart_4927915384997301', + p_chart_width =>300, + p_chart_height =>200, + p_chart_animation =>'N', + p_display_attr =>':H:::::Left::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#0099FF,#99FF99,#FF6699,#FFFF99', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'::', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'::', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'with q1 as ('||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''EXCL'' LABEL'||chr(10)|| +' ,sum(excluded_lines) VALUE'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where id = :P3_TEST_RUN_ID'||chr(10)|| +' having sum(excluded_lines) > 0'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''EXEC'' LABEL'||chr(10)|| +' ,sum(executed_lines) VALUE'||chr(10)|| +' from wt_test'; + +a1:=a1||'_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where id = :P3_TEST_RUN_ID'||chr(10)|| +' having sum(executed_lines) > 0'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''NOTX'' LABEL'||chr(10)|| +' ,sum(notexec_lines) VALUE'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where id = :P3_TEST_RUN_ID'||chr(10)|| +' having sum(note'; + +a1:=a1||'xec_lines) > 0'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''UNKN'' LABEL'||chr(10)|| +' ,sum(unknown_lines) VALUE'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where id = :P3_TEST_RUN_ID'||chr(10)|| +' having sum(unknown_lines) > 0'||chr(10)|| +')'||chr(10)|| +'select link, label, value'||chr(10)|| +' from q1'||chr(10)|| +' order by label'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4931210998252672+wwv_flow_api.g_id_offset, + p_chart_id => 4931121643252671+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4932622090476124 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_plug_name=> 'Test Runner Status Trend', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 21, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => 'PLSQL_EXPRESSION', + p_plug_display_when_condition => ':P3_SHOW_TREND=''Y''', + p_plug_display_when_cond2=>'Y', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4932831378476124+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 3, + p_region_id => 4932622090476124+wwv_flow_api.g_id_offset, + p_default_chart_type =>'Stacked2DColumn', + p_chart_title =>'', + p_chart_name =>'chart_4932831378476124', + p_chart_width =>300, + p_chart_height =>200, + p_chart_animation =>'N', + p_display_attr =>'::::Y:N:Left::V:Y:Circle:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#99FF99,#FFFF99,#FF6699', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'select NULL LINK'||chr(10)|| +' ,run.id LABEL'||chr(10)|| +' ,res.passes PASS'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| +' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| +' order by run.id'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4932905763476124+wwv_flow_api.g_id_offset, + p_chart_id => 4932831378476124+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>10, + p_series_name =>'Pass', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'select NULL LINK'||chr(10)|| +' ,run.id LABEL'||chr(10)|| +' ,res.failures FAIL'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| +' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| +' order by run.id'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4933904400593950+wwv_flow_api.g_id_offset, + p_chart_id => 4932831378476124+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>20, + p_series_name =>'Fail', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'select NULL LINK'||chr(10)|| +' ,run.id LABEL'||chr(10)|| +' ,res.errors ERR'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| +' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| +' order by run.id'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4934008387632959+wwv_flow_api.g_id_offset, + p_chart_id => 4932831378476124+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>30, + p_series_name =>'Error', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4934122379722218 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_plug_name=> 'DBOUT Profile Status Trend', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 22, + p_plug_display_column=> 2, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => 'PLSQL_EXPRESSION', + p_plug_display_when_condition => ':P3_SHOW_TREND=''Y''', + p_plug_display_when_cond2=>'Y', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4934324926722219+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 3, + p_region_id => 4934122379722218+wwv_flow_api.g_id_offset, + p_default_chart_type =>'Stacked2DColumn', + p_chart_title =>'', + p_chart_name =>'chart_4932831378476124', + p_chart_width =>300, + p_chart_height =>200, + p_chart_animation =>'N', + p_display_attr =>'::::Y:N:Left::V:Y:Circle:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#99FF99,#0099FF,#FFFF99,#FF6699', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'select NULL LINK'||chr(10)|| +' ,run.id LABEL'||chr(10)|| +' ,res.executed_lines EXEC'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| +' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| +' order by run.id'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4934601765722219+wwv_flow_api.g_id_offset, + p_chart_id => 4934324926722219+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>10, + p_series_name =>'Executed', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'select NULL LINK'||chr(10)|| +' ,run.id LABEL'||chr(10)|| +' ,res.excluded_lines EXCL'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| +' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| +' order by run.id'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4934721303769138+wwv_flow_api.g_id_offset, + p_chart_id => 4934324926722219+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>20, + p_series_name =>'Excluded', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'select NULL LINK'||chr(10)|| +' ,run.id LABEL'||chr(10)|| +' ,res.unknown_lines UNKN'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| +' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| +' order by run.id'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4934527525722219+wwv_flow_api.g_id_offset, + p_chart_id => 4934324926722219+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>30, + p_series_name =>'Unknown', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'select NULL LINK'||chr(10)|| +' ,run.id LABEL'||chr(10)|| +' ,res.notexec_lines NOTX'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| +' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| +' order by run.id'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4934406303722219+wwv_flow_api.g_id_offset, + p_chart_id => 4934324926722219+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>40, + p_series_name =>'Not Executed', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4935906636831213 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_plug_name=> 'Top Test Case Failures', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 23, + p_plug_display_column=> 3, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => 'PLSQL_EXPRESSION', + p_plug_display_when_condition => ':P3_SHOW_TREND=''Y''', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4936119233831213+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 3, + p_region_id => 4935906636831213+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DColumn', + p_chart_title =>'', + p_chart_name =>'chart_4857903544336332', + p_chart_width =>300, + p_chart_height =>200, + p_chart_animation =>'N', + p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#FFFF00', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'Failures', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'with q_top_failures as ('||chr(10)|| +'select run.runner_owner || ''.'' ||'||chr(10)|| +' run.runner_name || '':'' ||'||chr(10)|| +' tc.testcase TESTCASE'||chr(10)|| +' ,tc.failures'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_testcase_stats tc'||chr(10)|| +' on tc.test_run_id = run.id'||chr(10)|| +' where run.id = :P3_TEST_RUN_ID'||chr(10)|| +' order by failures desc, TESTCASE'||chr(10)|| +')'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,testcase LABEL'||chr(10)|| +' ,failures '; + +a1:=a1||' VALUE'||chr(10)|| +' from q_top_failures'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4936205597831214+wwv_flow_api.g_id_offset, + p_chart_id => 4936119233831213+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ + +begin + +null; + +end; +/ + + +begin + +wwv_flow_api.create_page_branch( + p_id=>4923132166541430 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_branch_action=> 'f?p=&FLOW_ID.:3:&SESSION.', + p_branch_point=> 'AFTER_PROCESSING', + p_branch_type=> 'REDIRECT_URL', + p_branch_sequence=> 99, + p_save_state_before_branch_yn=>'Y', + p_branch_comment=> ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4902724562737162 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_name=>'P3_TEST_RUN_ID', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 1, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Test Run ID:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'Y', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4903101050383315 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_name=>'P3_RUNNER_OWNER', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 2, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Runner Owner:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4903616465425595 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_name=>'P3_START_DTM', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 5, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Start Date/Time:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4903901489440175 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_name=>'P3_RUNNER_NAME_DISP', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 3, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Runner Name:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'N', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4904730944600100 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_name=>'P3_DBOUT_OWNER', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 7, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'DBOUT Owner:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4911112682701919 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_name=>'P3_NUM_TESTCASES', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 6, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Num Testcases:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4918501858218652 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_name=>'P3_DBOUT_TYPE', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 9, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'DBOUT Type:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4919509411391193 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_name=>'P3_DBOUT_NAME', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 8, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'DBOUT Name:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4922532107511287 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_name=>'P3_GOTO_RUN_ID', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 10, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Go To Run ID:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_POPUP_LOV', + p_lov=> 'select id || '': '' ||'||chr(10)|| +' runner_owner || ''.'' ||'||chr(10)|| +' runner_name || '', '' ||'||chr(10)|| +' to_char(start_dtm,''YYYY/MM/DD HH24:MI:SS'') DISPLAY'||chr(10)|| +' ,id RETURN'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' order by id desc', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 10, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'NO', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'NOT_ENTERABLE', + p_attribute_02 => 'NO_FETCH', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4924510262627933 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_name=>'P3_SHOW_TREND', + p_data_type=> 'VARCHAR', + p_is_required=> true, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 12, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Show Trend:', + p_source=>'Y', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_RADIOGROUP', + p_named_lov=> 'Y_OR_N', + p_lov=> '.'||to_char(4923728354614299 + wwv_flow_api.g_id_offset)||'.', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => '2', + p_attribute_02 => 'SUBMIT', + p_attribute_03 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4924831864643727 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_name=>'P3_DELETE', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 22, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'NO', + p_item_default=> 'DELETE', + p_prompt=>'DELETE Test Runner', + p_source=>'DELETE', + p_source_type=> 'STATIC', + p_display_as=> 'BUTTON', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> null, + p_cMaxlength=> 2000, + p_cHeight=> null, + p_tag_attributes => 'template:'||to_char(4838306817414911 + wwv_flow_api.g_id_offset), + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT', + p_is_persistent=> 'N', + p_button_execute_validations=>'Y', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4926105066666886 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_name=>'P3_SPACER', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 20, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>' ', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4933725384514861 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_name=>'P3_RUNNER_NAME', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 4, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_HIDDEN', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> null, + p_cMaxlength=> 4000, + p_cHeight=> null, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'NO', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'LEFT', + p_field_alignment=> 'LEFT', + p_is_persistent=> 'Y', + p_attribute_01 => 'N', + p_item_comment => ''); + + +end; +/ + + +begin + +wwv_flow_api.create_page_da_event ( + p_id => 4931927743335808 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_page_id => 3 + ,p_name => 'Submit After LOV Change' + ,p_event_sequence => 10 + ,p_triggering_element_type => 'ITEM' + ,p_triggering_element => 'P3_GOTO_RUN_ID' + ,p_bind_type => 'bind' + ,p_bind_event_type => 'change' + ); +wwv_flow_api.create_page_da_action ( + p_id => 4932206270335808 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_page_id => 3 + ,p_event_id => 4931927743335808 + wwv_flow_api.g_id_offset + ,p_event_result => 'TRUE' + ,p_action_sequence => 10 + ,p_execute_on_page_init => 'N' + ,p_action => 'NATIVE_SUBMIT_PAGE' + ,p_attribute_01 => 'REFRESH' + ,p_stop_execution_on_error => 'Y' + ); +null; + +end; +/ + + +begin + +declare + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +p:=p||'declare'||chr(10)|| +' --'||chr(10)|| +' page varchar2(5); -- Destination Page'||chr(10)|| +' clear_cache varchar2(4000); -- Comma Delimited Names'||chr(10)|| +' item_names varchar2(4000); -- Comma Delimited Names'||chr(10)|| +' item_values varchar2(4000); -- Comma Delimited Values'||chr(10)|| +' --'||chr(10)|| +'begin'||chr(10)|| +' --'||chr(10)|| +' if :P3_GOTO_RUN_ID is NOT NULL'||chr(10)|| +' then'||chr(10)|| +' :P3_TEST_RUN_ID := :P3_GOTO_RUN_ID;'||chr(10)|| +' :P3_GOTO_RUN_ID := NULL;'||chr(10)|| +' else'||chr(10)|| +' if '; + +p:=p||':P3_TEST_RUN_ID is NULL'||chr(10)|| +' then'||chr(10)|| +' select max(id) into :P3_TEST_RUN_ID'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where runner_owner = :APP_USER;'||chr(10)|| +' end if;'||chr(10)|| +' if :P3_TEST_RUN_ID is NULL'||chr(10)|| +' then'||chr(10)|| +' select max(id) into :P3_TEST_RUN_ID'||chr(10)|| +' from wt_test_runs;'||chr(10)|| +' end if;'||chr(10)|| +' end if;'||chr(10)|| +' --'||chr(10)|| +' if :P3_TEST_RUN_ID is NOT NULL'||chr(10)|| +' then'||chr(10)|| +' for buff in ('||chr(10)|| +' select runner_ow'; + +p:=p||'ner'||chr(10)|| +' ,to_char(start_dtm,''YYYY/MM/DD HH24:MI:SS'') START_DTM'||chr(10)|| +' ,dbout_owner'||chr(10)|| +' ,dbout_name'||chr(10)|| +' ,dbout_type'||chr(10)|| +' ,runner_name'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where id = :P3_TEST_RUN_ID )'||chr(10)|| +' loop'||chr(10)|| +' --'||chr(10)|| +' :P3_RUNNER_OWNER := buff.runner_owner;'||chr(10)|| +' :P3_RUNNER_NAME := buff.runner_name;'||chr(10)|| +' :P3_START_DTM :'; + +p:=p||'= buff.start_dtm;'||chr(10)|| +' :P3_DBOUT_OWNER := buff.dbout_owner;'||chr(10)|| +' :P3_DBOUT_NAME := buff.dbout_name;'||chr(10)|| +' :P3_DBOUT_TYPE := buff.dbout_type;'||chr(10)|| +' --'||chr(10)|| +' if buff.runner_owner = :APP_USER'||chr(10)|| +' then'||chr(10)|| +' page := ''2'';'||chr(10)|| +' item_names := ''P'' || page || ''_TEST_RUNNER'';'||chr(10)|| +' item_values := buff.runner_name;'||chr(10)|| +' '; + +p:=p||' :P3_RUNNER_NAME_DISP := '''' || buff.runner_name ||'||chr(10)|| +' '; + +p:=p||' '' (Click to Run)'' ;'||chr(10)|| +' else'||chr(10)|| +' :P3_RUNNER_NAME_DISP := buff.runner_name;'||chr(10)|| +' end if;'||chr(10)|| +' --'||chr(10)|| +' end loop;'||chr(10)|| +' --'||chr(10)|| +' select count(*) into :P3_NUM_TESTCASES'||chr(10)|| +' from wt_testcase_stats'||chr(10)|| +' where test_run_id = :P3_TEST_RUN_ID;'||chr(10)|| +' --'||chr(10)|| +' end if;'||chr(10)|| +'end;'; + +wwv_flow_api.create_page_process( + p_id => 4919220015384831 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id => 3, + p_process_sequence=> 10, + p_process_point=> 'BEFORE_HEADER', + p_process_type=> 'PLSQL', + p_process_name=> 'Initialize Items', + p_process_sql_clob => p, + p_process_error_message=> '', + p_process_success_message=> '', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; +null; + +end; +/ + + +begin + +declare + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +p:=p||'begin'||chr(10)|| +' delete from wt_test_runs'||chr(10)|| +' where runner_owner = :P3_RUNNER_OWNER'||chr(10)|| +' and runner_name = :P3_RUNNER_NAME;'||chr(10)|| +' :P3_TEST_RUN_ID := NULL;'||chr(10)|| +'end;'; + +wwv_flow_api.create_page_process( + p_id => 4927320293945637 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id => 3, + p_process_sequence=> 10, + p_process_point=> 'ON_SUBMIT_BEFORE_COMPUTATION', + p_process_type=> 'PLSQL', + p_process_name=> 'Delete Test Runs', + p_process_sql_clob => p, + p_process_error_message=> '', + p_process_when_button_id=>4924831864643727 + wwv_flow_api.g_id_offset, + p_process_success_message=> '', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; +null; + +end; +/ + + +begin + +--------------------------------------- +-- ...updatable report columns for page 3 +-- + +begin + +null; +end; +null; + +end; +/ + + +--application/pages/page_00004 +prompt ...PAGE 4: Test Case +-- + +begin + +wwv_flow_api.create_page ( + p_flow_id => wwv_flow.g_flow_id + ,p_id => 4 + ,p_tab_set => 'TS1' + ,p_name => 'Test Case' + ,p_step_title => 'Test Case' + ,p_allow_duplicate_submissions => 'Y' + ,p_step_sub_title => 'Test Case' + ,p_step_sub_title_type => 'TEXT_WITH_SUBSTITUTIONS' + ,p_first_item => 'AUTO_FIRST_ITEM' + ,p_include_apex_css_js_yn => 'Y' + ,p_autocomplete_on_off => 'ON' + ,p_page_is_public_y_n => 'N' + ,p_protection_level => 'N' + ,p_cache_page_yn => 'N' + ,p_cache_timeout_seconds => 21600 + ,p_cache_by_user_yn => 'N' + ,p_help_text => +'No help is available for this page.' + ,p_last_updated_by => 'WTP' + ,p_last_upd_yyyymmddhh24miss => '20180706095947' + ); +null; + +end; +/ + +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s := null; +wwv_flow_api.create_page_plug ( + p_id=> 4848709383414926 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_plug_name=> 'Test Case', + p_region_name=>'', + p_plug_template=> 4840201642414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 10, + p_plug_display_column=> 1, + p_plug_display_point=> 'AFTER_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'STATIC_TEXT', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ + +begin + +null; + +end; +/ + + +begin + +null; + +end; +/ + + +begin + +--------------------------------------- +-- ...updatable report columns for page 4 +-- + +begin + +null; +end; +null; + +end; +/ + + +--application/pages/page_00005 +prompt ...PAGE 5: About +-- + +begin + +wwv_flow_api.create_page ( + p_flow_id => wwv_flow.g_flow_id + ,p_id => 5 + ,p_tab_set => 'TS1' + ,p_name => 'About' + ,p_alias => 'ABOUT' + ,p_step_title => 'About' + ,p_allow_duplicate_submissions => 'Y' + ,p_step_sub_title_type => 'TEXT_WITH_SUBSTITUTIONS' + ,p_first_item => 'NO_FIRST_ITEM' + ,p_include_apex_css_js_yn => 'Y' + ,p_autocomplete_on_off => 'ON' + ,p_page_is_public_y_n => 'N' + ,p_protection_level => 'N' + ,p_cache_page_yn => 'N' + ,p_cache_timeout_seconds => 21600 + ,p_cache_by_user_yn => 'N' + ,p_last_updated_by => 'WTP' + ,p_last_upd_yyyymmddhh24miss => '20180706204723' + ); +null; + +end; +/ + +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||'select install_dtm'||chr(10)|| +' ,action'||chr(10)|| +' ,text'||chr(10)|| +' from wt_version'; + +wwv_flow_api.create_report_region ( + p_id=> 4906213947718211 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 5, + p_name=> 'wtPLSQL Core Installation History:', + p_region_name=>'', + p_template=> 4838619911414911+ wwv_flow_api.g_id_offset, + p_display_sequence=> 30, + p_display_column=> 1, + p_display_point=> 'AFTER_SHOW_ITEMS', + p_source=> s, + p_source_type=> 'SQL_QUERY', + p_display_error_message=> '#SQLERRM#', + p_plug_caching=> 'NOT_CACHED', + p_customized=> '0', + p_translate_title=> 'Y', + p_ajax_enabled=> 'Y', + p_query_row_template=> 4843113555414914+ wwv_flow_api.g_id_offset, + p_query_headings_type=> 'COLON_DELMITED_LIST', + p_query_num_rows=> '15', + p_query_options=> 'DERIVED_REPORT_COLUMNS', + p_query_show_nulls_as=> ' - ', + p_query_break_cols=> '0', + p_query_no_data_found=> 'no data found', + p_query_num_rows_type=> 'NEXT_PREVIOUS_LINKS', + p_pagination_display_position=> 'BOTTOM_RIGHT', + p_csv_output=> 'N', + p_query_asc_image=> 'apex/builder/dup.gif', + p_query_asc_image_attr=> 'width="16" height="16" alt="" ', + p_query_desc_image=> 'apex/builder/ddown.gif', + p_query_desc_image_attr=> 'width="16" height="16" alt="" ', + p_plug_query_strip_html=> 'Y', + p_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4906513668718218 + wwv_flow_api.g_id_offset, + p_region_id=> 4906213947718211 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 1, + p_form_element_id=> null, + p_column_alias=> 'INSTALL_DTM', + p_column_display_sequence=> 1, + p_column_heading=> 'INSTALL_DTM', + p_column_alignment=>'LEFT', + p_default_sort_column_sequence=>1, + p_default_sort_dir=>'desc', + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4906620342718218 + wwv_flow_api.g_id_offset, + p_region_id=> 4906213947718211 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 2, + p_form_element_id=> null, + p_column_alias=> 'ACTION', + p_column_display_sequence=> 2, + p_column_heading=> 'ACTION', + p_column_alignment=>'LEFT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4906723875718218 + wwv_flow_api.g_id_offset, + p_region_id=> 4906213947718211 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 3, + p_form_element_id=> null, + p_column_alias=> 'TEXT', + p_column_display_sequence=> 3, + p_column_heading=> 'TEXT', + p_column_alignment=>'LEFT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||'#APP_VERSION#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +''||chr(10)|| +'Use GitHub “issues” for support. (A free GitHub account will be required to create a new issue. Issues can be searched without an account.)
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +''||chr(10)|| +'Find more information at wtPLSQL Website.
'||chr(10)|| +'
'||chr(10)|| +'
'; + +wwv_flow_api.create_page_plug ( + p_id=> 4907318411766797 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 5, + p_plug_name=> 'About', + p_region_name=>'', + p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 20, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'STATIC_TEXT_WITH_SHORTCUTS', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 4843113555414914+ wwv_flow_api.g_id_offset, + p_plug_query_headings_type=> 'QUERY_COLUMNS', + p_plug_query_num_rows => 15, + p_plug_query_num_rows_type => 'NEXT_PREVIOUS_LINKS', + p_plug_query_row_count_max => 500, + p_plug_query_show_nulls_as => ' - ', + p_plug_display_condition_type => '', + p_pagination_display_position=>'BOTTOM_RIGHT', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||'
'||chr(10)|| +'
'; + +wwv_flow_api.create_page_plug ( + p_id=> 4907909454792629 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 5, + p_plug_name=> 'Version', + p_region_name=>'', + p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 10, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_source=> s, + p_plug_source_type=> 'STATIC_TEXT', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 4843113555414914+ wwv_flow_api.g_id_offset, + p_plug_query_headings_type=> 'QUERY_COLUMNS', + p_plug_query_num_rows => 15, + p_plug_query_num_rows_type => 'NEXT_PREVIOUS_LINKS', + p_plug_query_row_count_max => 500, + p_plug_query_show_nulls_as => ' - ', + p_plug_display_condition_type => '', + p_pagination_display_position=>'BOTTOM_RIGHT', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ + +begin + +null; + +end; +/ + + +begin + +null; + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4907225553759367 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 5, + p_name=>'P5_WT_VERSION', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 10, + p_item_plug_id => 4907909454792629+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'NO', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'wtPLSQL Core Version', + p_source=>'begin'||chr(10)|| +' for buff in (select text from wt_version'||chr(10)|| +' where install_dtm ='||chr(10)|| +' (select max(install_dtm)'||chr(10)|| +' from wt_version) )'||chr(10)|| +' loop'||chr(10)|| +' return buff.text;'||chr(10)|| +' end loop;'||chr(10)|| +' return '''';'||chr(10)|| +'end;', + p_source_type=> 'FUNCTION_BODY', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + + +begin + +--------------------------------------- +-- ...updatable report columns for page 5 +-- + +begin + +null; +end; +null; + +end; +/ + + +--application/pages/page_00101 +prompt ...PAGE 101: Login +-- + +begin + +wwv_flow_api.create_page ( + p_flow_id => wwv_flow.g_flow_id + ,p_id => 101 + ,p_name => 'Login' + ,p_alias => 'LOGIN' + ,p_step_title => 'Login' + ,p_step_sub_title_type => 'TEXT_WITH_SUBSTITUTIONS' + ,p_first_item => 'AUTO_FIRST_ITEM' + ,p_include_apex_css_js_yn => 'Y' + ,p_autocomplete_on_off => 'OFF' + ,p_step_template => 4836711590414909 + wwv_flow_api.g_id_offset + ,p_page_is_public_y_n => 'N' + ,p_cache_page_yn => 'N' + ,p_last_updated_by => 'WTP' + ,p_last_upd_yyyymmddhh24miss => '20180706000357' + ); +null; + +end; +/ + +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s := null; +wwv_flow_api.create_page_plug ( + p_id=> 4845720626414921 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 101, + p_plug_name=> 'Login', + p_region_name=>'', + p_plug_template=> 4839304121414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 10, + p_plug_display_column=> 1, + p_plug_display_point=> 'AFTER_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'STATIC_TEXT', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ + +begin + +null; + +end; +/ + + +begin + +null; + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4845806651414922 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 101, + p_name=>'P101_USERNAME', + p_data_type=> '', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 10, + p_item_plug_id => 4845720626414921+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> '', + p_prompt=>'Username', + p_display_as=> 'NATIVE_TEXT_FIELD', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 40, + p_cMaxlength=> 100, + p_cHeight=> null, + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 2, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'N', + p_attribute_03 => 'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4845920534414922 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 101, + p_name=>'P101_PASSWORD', + p_data_type=> '', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 20, + p_item_plug_id => 4845720626414921+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> '', + p_prompt=>'Password', + p_display_as=> 'NATIVE_PASSWORD', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 40, + p_cMaxlength=> 100, + p_cHeight=> null, + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_attribute_01 => 'Y', + p_attribute_02 => 'Y', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4846006439414922 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 101, + p_name=>'P101_LOGIN', + p_data_type=> '', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 30, + p_item_plug_id => 4845720626414921+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> '', + p_item_default=> 'Login', + p_prompt=>'Login', + p_source=>'LOGIN', + p_source_type=> 'STATIC', + p_display_as=> 'BUTTON', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> null, + p_cMaxlength=> null, + p_cHeight=> null, + p_tag_attributes => 'template:'||to_char(4838226535414911 + wwv_flow_api.g_id_offset), + p_begin_on_new_line=> 'NO', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'LEFT', + p_field_alignment=> 'LEFT', + p_is_persistent=> 'Y', + p_item_comment => ''); + + +end; +/ + + +begin + +declare + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +p:=p||'begin'||chr(10)|| +'owa_util.mime_header(''text/html'', FALSE);'||chr(10)|| +'owa_cookie.send('||chr(10)|| +' name=>''LOGIN_USERNAME_COOKIE'','||chr(10)|| +' value=>lower(:P101_USERNAME));'||chr(10)|| +'exception when others then null;'||chr(10)|| +'end;'; + +wwv_flow_api.create_page_process( + p_id => 4846217300414922 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id => 101, + p_process_sequence=> 10, + p_process_point=> 'AFTER_SUBMIT', + p_process_type=> 'PLSQL', + p_process_name=> 'Set Username Cookie', + p_process_sql_clob => p, + p_process_error_message=> '', + p_process_success_message=> '', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; +null; + +end; +/ + + +begin + +declare + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +p:=p||'wwv_flow_custom_auth_std.login('||chr(10)|| +' P_UNAME => :P101_USERNAME,'||chr(10)|| +' P_PASSWORD => :P101_PASSWORD,'||chr(10)|| +' P_SESSION_ID => v(''APP_SESSION''),'||chr(10)|| +' P_FLOW_PAGE => :APP_ID||'':1'''||chr(10)|| +' );'; + +wwv_flow_api.create_page_process( + p_id => 4846117403414922 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id => 101, + p_process_sequence=> 20, + p_process_point=> 'AFTER_SUBMIT', + p_process_type=> 'PLSQL', + p_process_name=> 'Login', + p_process_sql_clob => p, + p_process_error_message=> '', + p_process_success_message=> '', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; +null; + +end; +/ + + +begin + +declare + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +p:=p||'101'; + +wwv_flow_api.create_page_process( + p_id => 4846420685414923 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id => 101, + p_process_sequence=> 30, + p_process_point=> 'AFTER_SUBMIT', + p_process_type=> 'CLEAR_CACHE_FOR_PAGES', + p_process_name=> 'Clear Page(s) Cache', + p_process_sql_clob => p, + p_process_error_message=> '', + p_process_success_message=> '', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; +null; + +end; +/ + + +begin + +declare + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +p:=p||'declare'||chr(10)|| +' v varchar2(255) := null;'||chr(10)|| +' c owa_cookie.cookie;'||chr(10)|| +'begin'||chr(10)|| +' c := owa_cookie.get(''LOGIN_USERNAME_COOKIE'');'||chr(10)|| +' :P101_USERNAME := c.vals(1);'||chr(10)|| +'exception when others then null;'||chr(10)|| +'end;'; + +wwv_flow_api.create_page_process( + p_id => 4846327512414923 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id => 101, + p_process_sequence=> 10, + p_process_point=> 'BEFORE_HEADER', + p_process_type=> 'PLSQL', + p_process_name=> 'Get Username Cookie', + p_process_sql_clob => p, + p_process_error_message=> '', + p_process_success_message=> '', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; +null; + +end; +/ + + +begin + +--------------------------------------- +-- ...updatable report columns for page 101 +-- + +begin + +null; +end; +null; + +end; +/ + +prompt ...lists +-- +--application/shared_components/navigation/breadcrumbs +prompt ...breadcrumbs +-- + +begin + +wwv_flow_api.create_menu ( + p_id=> 4846524976414923 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_name=> ' Breadcrumb'); + +wwv_flow_api.create_menu_option ( + p_id=>4847624895414926 + wwv_flow_api.g_id_offset, + p_menu_id=>4846524976414923 + wwv_flow_api.g_id_offset, + p_parent_id=>0, + p_option_sequence=>20, + p_short_name=>'Run Test', + p_long_name=>'', + p_link=>'f?p=700:2:&SESSION.', + p_page_id=>2, + p_also_current_for_pages=> ''); + +wwv_flow_api.create_menu_option ( + p_id=>4848215650414926 + wwv_flow_api.g_id_offset, + p_menu_id=>4846524976414923 + wwv_flow_api.g_id_offset, + p_parent_id=>0, + p_option_sequence=>30, + p_short_name=>'Test Runner', + p_long_name=>'', + p_link=>'f?p=700:3:&SESSION.', + p_page_id=>3, + p_also_current_for_pages=> ''); + +null; + +end; +/ + +prompt ...page templates for application: 700 +-- +--application/shared_components/user_interface/templates/page/login +prompt ......Page template 4836711590414909 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +c1:=c1||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +' #TITLE#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' #HEAD#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#FORM_OPEN#'||chr(10)|| +''; + +c2:=c2||'#FORM_CLOSE#'||chr(10)|| +''||chr(10)|| +''; + +c3:=c3||'
'||chr(10)|| +'
#SUCCESS_MESSAGE##NOTIFICATION_MESSAGE##GLOBAL_NOTIFICATION#
'||chr(10)|| +'
#REGION_POSITION_02##BOX_BODY##REGION_POSITION_03#
'||chr(10)|| +'
'||chr(10)|| +''; + +wwv_flow_api.create_template( + p_id=> 4836711590414909 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_name=> 'Login', + p_body_title=> '', + p_header_template=> c1, + p_box=> c3, + p_footer_template=> c2, + p_success_message=> '
'||chr(10)|| +' '||chr(10)|| +' #SUCCESS_MESSAGE#'||chr(10)|| +'
', + p_current_tab=> '', + p_current_tab_font_attr=> '', + p_non_current_tab=> '', + p_non_current_tab_font_attr => '', + p_top_current_tab=> '', + p_top_current_tab_font_attr => '', + p_top_non_curr_tab=> '', + p_top_non_curr_tab_font_attr=> '', + p_current_image_tab=> '', + p_non_current_image_tab=> '', + p_notification_message=> '
'||chr(10)|| +' #MESSAGE#'||chr(10)|| +'
', + p_navigation_bar=> '#BAR_BODY#', + p_navbar_entry=> '
#TEXT#
', + p_app_tab_before_tabs=>'', + p_app_tab_current_tab=>'', + p_app_tab_non_current_tab=>'', + p_app_tab_after_tabs=>'', + p_region_table_cattributes=> ' summary="" cellpadding="0" border="0" cellspacing="0"', + p_theme_id => 7, + p_theme_class_id => 6, + p_translate_this_template => 'N', + p_template_comment => '18'); +end; + +null; + +end; +/ + +--application/shared_components/user_interface/templates/page/no_tabs_left_sidebar_fixed_width_div_based +prompt ......Page template 4836803791414910 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +c1:=c1||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +' #TITLE#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' #HEAD#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#FORM_OPEN#'||chr(10)|| +''; + +c2:=c2||''||chr(10)|| +'#FORM_CLOSE#'||chr(10)|| +''||chr(10)|| +''; + +c3:=c3||''||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'  '||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
#REGION_POSITION_01##REGION_POSITION_04#
'||chr(10)|| +'
#SUCCESS_MESSAGE##NOTIFICATION_MESSAGE##GLOBAL_NOTIFICATION#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +'
'||chr(10)|| +' #BOX_BODY##REGION_POSITION_03#'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'; + +wwv_flow_api.create_template( + p_id=> 4836803791414910 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_name=> 'No Tabs - Left Sidebar (fixed-width / DIV based)', + p_body_title=> '', + p_header_template=> c1, + p_box=> c3, + p_footer_template=> c2, + p_success_message=> '
'||chr(10)|| +' '||chr(10)|| +' #SUCCESS_MESSAGE#'||chr(10)|| +'
', + p_current_tab=> '', + p_current_tab_font_attr=> '', + p_non_current_tab=> '', + p_non_current_tab_font_attr => '', + p_top_current_tab=> '', + p_top_current_tab_font_attr => '', + p_top_non_curr_tab=> '', + p_top_non_curr_tab_font_attr=> '', + p_current_image_tab=> '', + p_non_current_image_tab=> '', + p_notification_message=> '
'||chr(10)|| +' #MESSAGE#'||chr(10)|| +'
', + p_navigation_bar=> '#BAR_BODY#', + p_navbar_entry=> '
#TEXT#
', + p_app_tab_before_tabs=>'', + p_app_tab_current_tab=>'', + p_app_tab_non_current_tab=>'', + p_app_tab_after_tabs=>'', + p_region_table_cattributes=> 'summary="" cellpadding="0" border="0" cellspacing="0" width="100%"', + p_sidebar_def_reg_pos => 'REGION_POSITION_02', + p_breadcrumb_def_reg_pos => 'REGION_POSITION_01', + p_theme_id => 7, + p_theme_class_id => 17, + p_translate_this_template => 'N', + p_template_comment => ''); +end; + +null; + +end; +/ + +--application/shared_components/user_interface/templates/page/no_tabs_left_and_right_sidebar_fixed_width_div_left_and_optional_table_based_right +prompt ......Page template 4836929045414910 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +c1:=c1||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +' #TITLE#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' #HEAD#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#FORM_OPEN#'||chr(10)|| +''; + +c2:=c2||''||chr(10)|| +'#FORM_CLOSE#'||chr(10)|| +''||chr(10)|| +''; + +c3:=c3||''||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'  '||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
#REGION_POSITION_01##REGION_POSITION_04#
'||chr(10)|| +'
#SUCCESS_MESSAGE##NOTIFICATION_MESSAGE##GLOBAL_NOTIFICATION#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +'
#BOX_BODY##REGION_POSITION_03#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'; + +wwv_flow_api.create_template( + p_id=> 4836929045414910 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_name=> 'No Tabs - Left and Right Sidebar (fixed-width / DIV left and optional table-based right)', + p_body_title=> '', + p_header_template=> c1, + p_box=> c3, + p_footer_template=> c2, + p_success_message=> '
'||chr(10)|| +' '||chr(10)|| +' #SUCCESS_MESSAGE#'||chr(10)|| +'
', + p_current_tab=> '', + p_current_tab_font_attr=> '', + p_non_current_tab=> '', + p_non_current_tab_font_attr => '', + p_top_current_tab=> '', + p_top_current_tab_font_attr => '', + p_top_non_curr_tab=> '', + p_top_non_curr_tab_font_attr=> '', + p_current_image_tab=> '', + p_non_current_image_tab=> '', + p_notification_message=> '
'||chr(10)|| +' #MESSAGE#'||chr(10)|| +'
', + p_navigation_bar=> '#BAR_BODY#', + p_navbar_entry=> '
#TEXT#
', + p_app_tab_before_tabs=>'', + p_app_tab_current_tab=>'', + p_app_tab_non_current_tab=>'', + p_app_tab_after_tabs=>'', + p_region_table_cattributes=> 'summary="" cellpadding="0" border="0" cellspacing="0" width="100%"', + p_sidebar_def_reg_pos => 'REGION_POSITION_02', + p_breadcrumb_def_reg_pos => 'REGION_POSITION_01', + p_theme_id => 7, + p_theme_class_id => 17, + p_translate_this_template => 'N', + p_template_comment => ''); +end; + +null; + +end; +/ + +--application/shared_components/user_interface/templates/page/no_tabs_right_sidebar_fixed_width_div_based +prompt ......Page template 4837019193414910 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +c1:=c1||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +' #TITLE#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' #HEAD#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#FORM_OPEN#'||chr(10)|| +''; + +c2:=c2||''||chr(10)|| +'#FORM_CLOSE#'||chr(10)|| +''||chr(10)|| +''; + +c3:=c3||''||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'  '||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
#REGION_POSITION_01##REGION_POSITION_04#
'||chr(10)|| +'
#SUCCESS_MESSAGE##NOTIFICATION_MESSAGE##GLOBAL_NOTIFICATION#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +'
#REGION_POSITION_02##BOX_BODY#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +''; + +wwv_flow_api.create_template( + p_id=> 4837019193414910 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_name=> 'No Tabs - Right Sidebar (fixed-width / DIV based)', + p_body_title=> '', + p_header_template=> c1, + p_box=> c3, + p_footer_template=> c2, + p_success_message=> '
'||chr(10)|| +' '||chr(10)|| +' #SUCCESS_MESSAGE#'||chr(10)|| +'
', + p_current_tab=> '', + p_current_tab_font_attr=> '', + p_non_current_tab=> '', + p_non_current_tab_font_attr => '', + p_top_current_tab=> '', + p_top_current_tab_font_attr => '', + p_top_non_curr_tab=> '', + p_top_non_curr_tab_font_attr=> '', + p_current_image_tab=> '', + p_non_current_image_tab=> '', + p_notification_message=> '
'||chr(10)|| +' #MESSAGE#'||chr(10)|| +'
', + p_navigation_bar=> '#BAR_BODY#', + p_navbar_entry=> '
#TEXT#
', + p_app_tab_before_tabs=>'', + p_app_tab_current_tab=>'', + p_app_tab_non_current_tab=>'', + p_app_tab_after_tabs=>'', + p_region_table_cattributes=> ' summary="" cellpadding="0" border="0" cellspacing="0" width="100%"', + p_sidebar_def_reg_pos => 'REGION_POSITION_02', + p_breadcrumb_def_reg_pos => 'REGION_POSITION_01', + p_theme_id => 7, + p_theme_class_id => 3, + p_translate_this_template => 'N', + p_template_comment => ''); +end; + +null; + +end; +/ + +--application/shared_components/user_interface/templates/page/no_tabs_right_sidebar_optional_table_based +prompt ......Page template 4837131094414910 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +c1:=c1||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +' #TITLE#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' #HEAD#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#FORM_OPEN#'||chr(10)|| +''; + +c2:=c2||''||chr(10)|| +'#FORM_CLOSE#'||chr(10)|| +''||chr(10)|| +''; + +c3:=c3||''||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'  '||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
#REGION_POSITION_01##REGION_POSITION_04#
'||chr(10)|| +'
#SUCCESS_MESSAGE##NOTIFICATION_MESSAGE##GLOBAL_NOTIFICATION#
'||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '; + +c3:=c3||' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +'
#REGION_POSITION_02##BOX_BODY##REGION_POSITION_03#
'||chr(10)|| +'
'; + +wwv_flow_api.create_template( + p_id=> 4837131094414910 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_name=> 'No Tabs - Right Sidebar (optional / table-based)', + p_body_title=> '', + p_header_template=> c1, + p_box=> c3, + p_footer_template=> c2, + p_success_message=> '
'||chr(10)|| +' '||chr(10)|| +' #SUCCESS_MESSAGE#'||chr(10)|| +'
', + p_current_tab=> '', + p_current_tab_font_attr=> '', + p_non_current_tab=> '', + p_non_current_tab_font_attr => '', + p_top_current_tab=> '', + p_top_current_tab_font_attr => '', + p_top_non_curr_tab=> '', + p_top_non_curr_tab_font_attr=> '', + p_current_image_tab=> '', + p_non_current_image_tab=> '', + p_notification_message=> '
'||chr(10)|| +' #MESSAGE#'||chr(10)|| +'
', + p_navigation_bar=> '#BAR_BODY#', + p_navbar_entry=> '
#TEXT#
', + p_app_tab_before_tabs=>'', + p_app_tab_current_tab=>'', + p_app_tab_non_current_tab=>'', + p_app_tab_after_tabs=>'', + p_region_table_cattributes=> ' summary="" cellpadding="0" border="0" cellspacing="0" width="100%"', + p_sidebar_def_reg_pos => 'REGION_POSITION_02', + p_breadcrumb_def_reg_pos => 'REGION_POSITION_01', + p_theme_id => 7, + p_theme_class_id => 3, + p_error_page_template => '
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' #INTERNAL_MESSAGE#'||chr(10)|| +' #MESSAGE#'||chr(10)|| +'

'||chr(10)|| +' '||chr(10)|| +'

'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
', + p_translate_this_template => 'N', + p_template_comment => ''); +end; + +null; + +end; +/ + +--application/shared_components/user_interface/templates/page/one_level_tabs_left_sidebar_fixed_width_div_based +prompt ......Page template 4837222651414910 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +c1:=c1||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +' #TITLE#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' #HEAD#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#FORM_OPEN#'||chr(10)|| +''; + +c2:=c2||''||chr(10)|| +'#FORM_CLOSE#'||chr(10)|| +''||chr(10)|| +''; + +c3:=c3||''||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' #TAB_CELLS#'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'#REGION_POSITION_01##REGION_POSITION_04#'||chr(10)|| +'
#SUCCESS_MESSAGE##NOTIFICATION_MESSAGE##GLOBAL_NOTIFICATION#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +'
'||chr(10)|| +' #BOX_BODY##REGION_POSITION_03#'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'; + +wwv_flow_api.create_template( + p_id=> 4837222651414910 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_name=> 'One Level Tabs - Left Sidebar (fixed-width / DIV based)', + p_body_title=> '', + p_header_template=> c1, + p_box=> c3, + p_footer_template=> c2, + p_success_message=> '
'||chr(10)|| +' '||chr(10)|| +' #SUCCESS_MESSAGE#'||chr(10)|| +'
', + p_current_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
'||chr(10)|| +'', + p_current_tab_font_attr=> '', + p_non_current_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
'||chr(10)|| +'', + p_non_current_tab_font_attr => '', + p_top_current_tab=> '', + p_top_current_tab_font_attr => '', + p_top_non_curr_tab=> '', + p_top_non_curr_tab_font_attr=> '', + p_current_image_tab=> '', + p_non_current_image_tab=> '', + p_notification_message=> '
'||chr(10)|| +' #MESSAGE#'||chr(10)|| +'
', + p_navigation_bar=> '#BAR_BODY#', + p_navbar_entry=> '
#TEXT#
', + p_app_tab_before_tabs=>'', + p_app_tab_current_tab=>'', + p_app_tab_non_current_tab=>'', + p_app_tab_after_tabs=>'', + p_region_table_cattributes=> ' summary="" cellpadding="0" border="0" cellspacing="0" width="100%"', + p_sidebar_def_reg_pos => 'REGION_POSITION_02', + p_breadcrumb_def_reg_pos => 'REGION_POSITION_01', + p_theme_id => 7, + p_theme_class_id => 16, + p_translate_this_template => 'N', + p_template_comment => ''); +end; + +null; + +end; +/ + +--application/shared_components/user_interface/templates/page/one_level_tabs_left_and_right_sidebar_fixed_width_div_left_and_optional_table_based_right +prompt ......Page template 4837316808414910 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +c1:=c1||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +' #TITLE#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' #HEAD#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#FORM_OPEN#'||chr(10)|| +''; + +c2:=c2||''||chr(10)|| +'#FORM_CLOSE#'||chr(10)|| +''||chr(10)|| +''; + +c3:=c3||''||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' #TAB_CELLS#'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'#REGION_POSITION_01##REGION_POSITION_04#'||chr(10)|| +'
#SUCCESS_MESSAGE##NOTIFICATION_MESSAGE##GLOBAL_NOTIFICATION#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +'
#BOX_BODY##REGION_POSITION_03#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'; + +wwv_flow_api.create_template( + p_id=> 4837316808414910 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_name=> 'One Level Tabs - Left and Right Sidebar (fixed-width / DIV left and optional table-based right)', + p_body_title=> '', + p_header_template=> c1, + p_box=> c3, + p_footer_template=> c2, + p_success_message=> '
'||chr(10)|| +' '||chr(10)|| +' #SUCCESS_MESSAGE#'||chr(10)|| +'
', + p_current_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
'||chr(10)|| +'', + p_current_tab_font_attr=> '', + p_non_current_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
'||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'', + p_non_current_tab_font_attr => '', + p_top_current_tab=> '', + p_top_current_tab_font_attr => '', + p_top_non_curr_tab=> '', + p_top_non_curr_tab_font_attr=> '', + p_current_image_tab=> '', + p_non_current_image_tab=> '', + p_notification_message=> '
'||chr(10)|| +' #MESSAGE#'||chr(10)|| +'
', + p_navigation_bar=> '#BAR_BODY#', + p_navbar_entry=> '
#TEXT#
', + p_app_tab_before_tabs=>'', + p_app_tab_current_tab=>'', + p_app_tab_non_current_tab=>'', + p_app_tab_after_tabs=>'', + p_region_table_cattributes=> ' summary="" cellpadding="0" border="0" cellspacing="0" width="100%"', + p_sidebar_def_reg_pos => 'REGION_POSITION_02', + p_breadcrumb_def_reg_pos => 'REGION_POSITION_01', + p_theme_id => 7, + p_theme_class_id => 16, + p_translate_this_template => 'N', + p_template_comment => ''); +end; + +null; + +end; +/ + +--application/shared_components/user_interface/templates/page/one_level_tabs_right_sidebar_fixed_width_div_based +prompt ......Page template 4837413408414910 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +c1:=c1||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +' #TITLE#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' #HEAD#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#FORM_OPEN#'||chr(10)|| +''; + +c2:=c2||''||chr(10)|| +'#FORM_CLOSE#'||chr(10)|| +''||chr(10)|| +''; + +c3:=c3||''||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' #TAB_CELLS#'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'#REGION_POSITION_01##REGION_POSITION_04#'||chr(10)|| +'
#SUCCESS_MESSAGE##NOTIFICATION_MESSAGE##GLOBAL_NOTIFICATION#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +'
#REGION_POSITION_02##BOX_BODY#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +''; + +wwv_flow_api.create_template( + p_id=> 4837413408414910 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_name=> 'One Level Tabs - Right Sidebar (fixed-width / DIV based)', + p_body_title=> '', + p_header_template=> c1, + p_box=> c3, + p_footer_template=> c2, + p_success_message=> '
'||chr(10)|| +' '||chr(10)|| +' #SUCCESS_MESSAGE#'||chr(10)|| +'
', + p_current_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
'||chr(10)|| +'', + p_current_tab_font_attr=> '', + p_non_current_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
'||chr(10)|| +'', + p_non_current_tab_font_attr => '', + p_top_current_tab=> '', + p_top_current_tab_font_attr => '', + p_top_non_curr_tab=> '', + p_top_non_curr_tab_font_attr=> '', + p_current_image_tab=> '', + p_non_current_image_tab=> '', + p_notification_message=> '
'||chr(10)|| +' #MESSAGE#'||chr(10)|| +'
', + p_navigation_bar=> '#BAR_BODY#', + p_navbar_entry=> '
#TEXT#
', + p_app_tab_before_tabs=>'', + p_app_tab_current_tab=>'', + p_app_tab_non_current_tab=>'', + p_app_tab_after_tabs=>'', + p_region_table_cattributes=> '', + p_breadcrumb_def_reg_pos => 'REGION_POSITION_01', + p_theme_id => 7, + p_theme_class_id => 8, + p_translate_this_template => 'N', + p_template_comment => ''); +end; + +null; + +end; +/ + +--application/shared_components/user_interface/templates/page/one_level_tabs_right_sidebar_optional_table_based +prompt ......Page template 4837525507414910 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +c1:=c1||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +' #TITLE#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' #HEAD#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#FORM_OPEN#'||chr(10)|| +''; + +c2:=c2||''||chr(10)|| +'#FORM_CLOSE#'||chr(10)|| +''||chr(10)|| +''; + +c3:=c3||''||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' #TAB_CELLS#'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'#REGION_POSITION_01##REGION_POSITION_04#'||chr(10)|| +'
#SUCCESS_MESSAGE##NOTIFICATION_MESSAGE##GLOBAL_NOTIFICATION#
'||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +'
#REGION_POSITION_02##BOX_BODY##REGION_POSITION_03# '||chr(10)|| +'
'||chr(10)|| +'
'; + +wwv_flow_api.create_template( + p_id=> 4837525507414910 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_name=> 'One Level Tabs - Right Sidebar (optional / table-based)', + p_body_title=> '', + p_header_template=> c1, + p_box=> c3, + p_footer_template=> c2, + p_success_message=> '
'||chr(10)|| +' '||chr(10)|| +' #SUCCESS_MESSAGE#'||chr(10)|| +'
', + p_current_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
', + p_current_tab_font_attr=> '', + p_non_current_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
'||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'', + p_non_current_tab_font_attr => '', + p_top_current_tab=> '', + p_top_current_tab_font_attr => '', + p_top_non_curr_tab=> '', + p_top_non_curr_tab_font_attr=> '', + p_current_image_tab=> '', + p_non_current_image_tab=> '', + p_notification_message=> '
'||chr(10)|| +' #MESSAGE#'||chr(10)|| +'
', + p_navigation_bar=> '#BAR_BODY#', + p_navbar_entry=> '
#TEXT#
', + p_app_tab_before_tabs=>'', + p_app_tab_current_tab=>'', + p_app_tab_non_current_tab=>'', + p_app_tab_after_tabs=>'', + p_region_table_cattributes=> '', + p_breadcrumb_def_reg_pos => 'REGION_POSITION_01', + p_theme_id => 7, + p_theme_class_id => 1, + p_translate_this_template => 'N', + p_template_comment => ''); +end; + +null; + +end; +/ + +--application/shared_components/user_interface/templates/page/popup +prompt ......Page template 4837613823414910 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +c1:=c1||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#TITLE#'||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#HEAD#'||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#FORM_OPEN#'; + +c2:=c2||'#FORM_CLOSE#'||chr(10)|| +''; + +c3:=c3||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'
#SUCCESS_MESSAGE##NOTIFICATION_MESSAGE#
#BOX_BODY##REGION_POSITION_01##REGION_POSITION_02##REGION_POSITION_04##REGION_POSITION_05##REGION_POSITION_06##REGION_POSITION_07##REGION_POSITION_08#
#REGION_POSITION_03#
'; + +wwv_flow_api.create_template( + p_id=> 4837613823414910 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_name=> 'Popup', + p_body_title=> '', + p_header_template=> c1, + p_box=> c3, + p_footer_template=> c2, + p_success_message=> '
#SUCCESS_MESSAGE#
', + p_current_tab=> '', + p_current_tab_font_attr=> '', + p_non_current_tab=> '', + p_non_current_tab_font_attr => '', + p_top_current_tab=> '', + p_top_current_tab_font_attr => '', + p_top_non_curr_tab=> '', + p_top_non_curr_tab_font_attr=> '', + p_current_image_tab=> '', + p_non_current_image_tab=> '', + p_notification_message=> '
#MESSAGE#
', + p_navigation_bar=> '#BAR_BODY#', + p_navbar_entry=> '#TEXT#', + p_app_tab_before_tabs=>'', + p_app_tab_current_tab=>'', + p_app_tab_non_current_tab=>'', + p_app_tab_after_tabs=>'', + p_region_table_cattributes=> ' summary="" cellpadding="0" border="0" cellspacing="0" width="100%"', + p_theme_id => 7, + p_theme_class_id => 4, + p_translate_this_template => 'N', + p_template_comment => ''); +end; + +null; + +end; +/ + +--application/shared_components/user_interface/templates/page/printer_friendly +prompt ......Page template 4837724123414910 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +c1:=c1||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +' #TITLE#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' #HEAD#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#FORM_OPEN#'||chr(10)|| +''; + +c2:=c2||'#FORM_CLOSE#'||chr(10)|| +''; + +c3:=c3||''||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +'
#REGION_POSITION_02##BOX_BODY##REGION_POSITION_03#
'||chr(10)|| +'
'||chr(10)|| +''; + +wwv_flow_api.create_template( + p_id=> 4837724123414910 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_name=> 'Printer Friendly', + p_body_title=> '', + p_header_template=> c1, + p_box=> c3, + p_footer_template=> c2, + p_success_message=> '', + p_current_tab=> '', + p_current_tab_font_attr=> '', + p_non_current_tab=> '', + p_non_current_tab_font_attr => '', + p_top_current_tab=> '', + p_top_current_tab_font_attr => '', + p_top_non_curr_tab=> '', + p_top_non_curr_tab_font_attr=> '', + p_current_image_tab=> '', + p_non_current_image_tab=> '', + p_notification_message=> '', + p_navigation_bar=> '', + p_navbar_entry=> '', + p_app_tab_before_tabs=>'', + p_app_tab_current_tab=>'', + p_app_tab_non_current_tab=>'', + p_app_tab_after_tabs=>'', + p_region_table_cattributes=> ' summary="" cellpadding="0" border="0" cellspacing="0" width="100%"', + p_theme_id => 7, + p_theme_class_id => 5, + p_translate_this_template => 'N', + p_template_comment => '3'); +end; + +null; + +end; +/ + +--application/shared_components/user_interface/templates/page/two_level_tabs_left_sidebar_fixed_width_div_based +prompt ......Page template 4837820641414910 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +c1:=c1||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +' #TITLE#'||chr(10)|| +' #HEAD#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'<'; + +c1:=c1||'!--[if lte IE 6]>
#OUTDATED_BROWSER#
'||chr(10)|| +'#FORM_OPEN#'||chr(10)|| +''; + +c2:=c2||''||chr(10)|| +'#FORM_CLOSE#'||chr(10)|| +''||chr(10)|| +''; + +c3:=c3||''||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +' #TAB_CELLS#'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +''||chr(10)|| +'
#REGION_POSITION_01##REGION_POSITION_04#
'||chr(10)|| +'
#SUCCESS_MESSAGE##NOTIFICATION_MESSAGE##GLOBAL_NOTIFICATION#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +'
'||chr(10)|| +' #BOX_BODY##REGION_POSITION_03#'||chr(10)|| +' '; + +c3:=c3||'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +''; + +wwv_flow_api.create_template( + p_id=> 4837820641414910 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_name=> 'Two Level Tabs - Left Sidebar (fixed-width / DIV based)', + p_body_title=> '', + p_header_template=> c1, + p_box=> c3, + p_footer_template=> c2, + p_success_message=> '
'||chr(10)|| +' '||chr(10)|| +' #SUCCESS_MESSAGE#'||chr(10)|| +'
', + p_current_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
'||chr(10)|| +'', + p_current_tab_font_attr=> '', + p_non_current_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
'||chr(10)|| +'', + p_non_current_tab_font_attr => '', + p_top_current_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
'||chr(10)|| +''||chr(10)|| +'', + p_top_current_tab_font_attr => '', + p_top_non_curr_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
'||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'', + p_top_non_curr_tab_font_attr=> '', + p_current_image_tab=> '', + p_non_current_image_tab=> '', + p_notification_message=> '
'||chr(10)|| +' #MESSAGE#'||chr(10)|| +'
', + p_navigation_bar=> '#BAR_BODY#', + p_navbar_entry=> '
#TEXT#
', + p_app_tab_before_tabs=>'', + p_app_tab_current_tab=>'', + p_app_tab_non_current_tab=>'', + p_app_tab_after_tabs=>'', + p_region_table_cattributes=> ' summary="" cellpadding="0" border="0" cellspacing="0" width="100%"', + p_sidebar_def_reg_pos => 'REGION_POSITION_02', + p_breadcrumb_def_reg_pos => 'REGION_POSITION_01', + p_theme_id => 7, + p_theme_class_id => 18, + p_translate_this_template => 'N', + p_template_comment => ''); +end; + +null; + +end; +/ + +--application/shared_components/user_interface/templates/page/two_level_tabs_left_and_right_sidebar_fixed_width_div_left_and_optional_table_based_right +prompt ......Page template 4837929553414911 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +c1:=c1||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +' #TITLE#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' #HEAD#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#FORM_OPEN#'||chr(10)|| +''; + +c2:=c2||''||chr(10)|| +'#FORM_CLOSE#'||chr(10)|| +''||chr(10)|| +''; + +c3:=c3||''||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +' #TAB_CELLS#'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +''||chr(10)|| +'
#REGION_POSITION_01##REGION_POSITION_04#
'||chr(10)|| +'
#SUCCESS_MESSAGE##NOTIFICATION_MESSAGE##GLOBAL_NOTIFICATION#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +'
#BOX_BODY##REGION_POSITION_03#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +''; + +wwv_flow_api.create_template( + p_id=> 4837929553414911 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_name=> 'Two Level Tabs - Left and Right Sidebar (fixed-width / DIV left and optional table-based right)', + p_body_title=> '', + p_header_template=> c1, + p_box=> c3, + p_footer_template=> c2, + p_success_message=> '
'||chr(10)|| +' '||chr(10)|| +' #SUCCESS_MESSAGE#'||chr(10)|| +'
', + p_current_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
'||chr(10)|| +'', + p_current_tab_font_attr=> '', + p_non_current_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
', + p_non_current_tab_font_attr => '', + p_top_current_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
'||chr(10)|| +''||chr(10)|| +'', + p_top_current_tab_font_attr => '', + p_top_non_curr_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
'||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'', + p_top_non_curr_tab_font_attr=> '', + p_current_image_tab=> '', + p_non_current_image_tab=> '', + p_notification_message=> '
'||chr(10)|| +' #MESSAGE#'||chr(10)|| +'
', + p_navigation_bar=> '#BAR_BODY#', + p_navbar_entry=> '
#TEXT#
', + p_app_tab_before_tabs=>'', + p_app_tab_current_tab=>'', + p_app_tab_non_current_tab=>'', + p_app_tab_after_tabs=>'', + p_region_table_cattributes=> ' summary="" cellpadding="0" border="0" cellspacing="0" width="100%"', + p_sidebar_def_reg_pos => 'REGION_POSITION_02', + p_breadcrumb_def_reg_pos => 'REGION_POSITION_01', + p_theme_id => 7, + p_theme_class_id => 18, + p_translate_this_template => 'N', + p_template_comment => ''); +end; + +null; + +end; +/ + +--application/shared_components/user_interface/templates/page/two_level_tabs_right_sidebar_fixed_width_div_based +prompt ......Page template 4838023662414911 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +c1:=c1||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +' #TITLE#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' #HEAD#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#FORM_OPEN#'||chr(10)|| +''; + +c2:=c2||''||chr(10)|| +'#FORM_CLOSE#'||chr(10)|| +''||chr(10)|| +''; + +c3:=c3||''||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +' #TAB_CELLS#'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +''||chr(10)|| +'
#REGION_POSITION_01##REGION_POSITION_04#
'||chr(10)|| +'
#SUCCESS_MESSAGE##NOTIFICATION_MESSAGE##GLOBAL_NOTIFICATION#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +'
#REGION_POSITION_02##BOX_BODY#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +''; + +wwv_flow_api.create_template( + p_id=> 4838023662414911 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_name=> 'Two Level Tabs - Right Sidebar (fixed-width / DIV based)', + p_body_title=> '', + p_header_template=> c1, + p_box=> c3, + p_footer_template=> c2, + p_success_message=> '
'||chr(10)|| +' '||chr(10)|| +' #SUCCESS_MESSAGE#'||chr(10)|| +'
', + p_current_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
', + p_current_tab_font_attr=> '', + p_non_current_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
', + p_non_current_tab_font_attr => '', + p_top_current_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
'||chr(10)|| +''||chr(10)|| +'', + p_top_current_tab_font_attr => '', + p_top_non_curr_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
'||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'', + p_top_non_curr_tab_font_attr=> '', + p_current_image_tab=> '', + p_non_current_image_tab=> '', + p_notification_message=> '
'||chr(10)|| +' #MESSAGE#'||chr(10)|| +'
', + p_navigation_bar=> '#BAR_BODY#', + p_navbar_entry=> '
#TEXT#
', + p_app_tab_before_tabs=>'', + p_app_tab_current_tab=>'', + p_app_tab_non_current_tab=>'', + p_app_tab_after_tabs=>'', + p_region_table_cattributes=> ' summary="" cellpadding="0" border="0" cellspacing="0" width="100%"', + p_breadcrumb_def_reg_pos => 'REGION_POSITION_01', + p_theme_id => 7, + p_theme_class_id => 2, + p_translate_this_template => 'N', + p_template_comment => ''); +end; + +null; + +end; +/ + +--application/shared_components/user_interface/templates/page/two_level_tabs_right_sidebar_optional_table_based +prompt ......Page template 4838107174414911 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +c1:=c1||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +' #TITLE#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' #HEAD#'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#FORM_OPEN#'||chr(10)|| +''; + +c2:=c2||''||chr(10)|| +'#FORM_CLOSE#'||chr(10)|| +''||chr(10)|| +''; + +c3:=c3||''||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +' #TAB_CELLS#'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +''||chr(10)|| +'
#REGION_POSITION_01##REGION_POSITION_04#
'||chr(10)|| +'
#SUCCESS_MESSAGE##NOTIFICATION_MESSAGE##GLOBAL_NOTIFICATION#
'||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +'
#REGI'; + +c3:=c3||'ON_POSITION_02##BOX_BODY##REGION_POSITION_03#
'||chr(10)|| +'
'; + +wwv_flow_api.create_template( + p_id=> 4838107174414911 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_name=> 'Two Level Tabs - Right Sidebar (optional / table-based)', + p_body_title=> '', + p_header_template=> c1, + p_box=> c3, + p_footer_template=> c2, + p_success_message=> '
'||chr(10)|| +' '||chr(10)|| +' #SUCCESS_MESSAGE#'||chr(10)|| +'
', + p_current_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
'||chr(10)|| +'', + p_current_tab_font_attr=> '', + p_non_current_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
', + p_non_current_tab_font_attr => '', + p_top_current_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
'||chr(10)|| +''||chr(10)|| +'', + p_top_current_tab_font_attr => '', + p_top_non_curr_tab=> '
'||chr(10)|| +'#TAB_LABEL##TAB_INLINE_EDIT#'||chr(10)|| +'
'||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'', + p_top_non_curr_tab_font_attr=> '', + p_current_image_tab=> '', + p_non_current_image_tab=> '', + p_notification_message=> '
'||chr(10)|| +' #MESSAGE#'||chr(10)|| +'
', + p_navigation_bar=> '#BAR_BODY#', + p_navbar_entry=> '
#TEXT#
', + p_app_tab_before_tabs=>'', + p_app_tab_current_tab=>'', + p_app_tab_non_current_tab=>'', + p_app_tab_after_tabs=>'', + p_region_table_cattributes=> ' summary="" cellpadding="0" border="0" cellspacing="0" width="100%"', + p_breadcrumb_def_reg_pos => 'REGION_POSITION_01', + p_theme_id => 7, + p_theme_class_id => 2, + p_translate_this_template => 'N', + p_template_comment => ''); +end; + +null; + +end; +/ + +prompt ...button templates +-- +--application/shared_components/user_interface/templates/button/button +prompt ......Button Template 4838226535414911 +declare + t varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +t:=t||''; + +wwv_flow_api.create_button_templates ( + p_id=>4838226535414911 + wwv_flow_api.g_id_offset, + p_flow_id=>wwv_flow.g_flow_id, + p_template=>t, + p_template_name=> 'Button', + p_translate_this_template => 'N', + p_theme_id => 7, + p_theme_class_id => 1, + p_template_comment => ''); +end; +/ +--application/shared_components/user_interface/templates/button/button_alternative_1_hot_button +prompt ......Button Template 4838306817414911 +declare + t varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +t:=t||''; + +wwv_flow_api.create_button_templates ( + p_id=>4838306817414911 + wwv_flow_api.g_id_offset, + p_flow_id=>wwv_flow.g_flow_id, + p_template=>t, + p_template_name=> 'Button, Alternative 1 - Hot Button', + p_translate_this_template => 'N', + p_theme_id => 7, + p_theme_class_id => 4, + p_template_comment => ''); +end; +/ +--application/shared_components/user_interface/templates/button/button_alternative_2 +prompt ......Button Template 4838412442414911 +declare + t varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +t:=t||''; + +wwv_flow_api.create_button_templates ( + p_id=>4838412442414911 + wwv_flow_api.g_id_offset, + p_flow_id=>wwv_flow.g_flow_id, + p_template=>t, + p_template_name=> 'Button, Alternative 2', + p_translate_this_template => 'N', + p_theme_id => 7, + p_theme_class_id => 5, + p_template_comment => 'XP Square FFFFFF'); +end; +/ +--application/shared_components/user_interface/templates/button/button_alternative_3 +prompt ......Button Template 4838512495414911 +declare + t varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +t:=t||''; + +wwv_flow_api.create_button_templates ( + p_id=>4838512495414911 + wwv_flow_api.g_id_offset, + p_flow_id=>wwv_flow.g_flow_id, + p_template=>t, + p_template_name=> 'Button, Alternative 3', + p_translate_this_template => 'N', + p_theme_id => 7, + p_theme_class_id => 2, + p_template_comment => 'Standard Button'); +end; +/ +--------------------------------------- +prompt ...region templates +-- +--application/shared_components/user_interface/templates/region/borderless_region +prompt ......region template 4838619911414911 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4838619911414911 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'
'||chr(10)|| +'
'||chr(10)|| +'
#TITLE#
'||chr(10)|| +'
#CLOSE##PREVIOUS##NEXT##DELETE##EDIT##CHANGE##CREATE##CREATE2##EXPAND##COPY##HELP#
'||chr(10)|| +'
'||chr(10)|| +'
#BODY#
'||chr(10)|| +'
'||chr(10)|| +'
' + ,p_page_plug_template_name => 'Borderless Region' + ,p_theme_id => 7 + ,p_theme_class_id => 7 + ,p_translate_this_template => 'N' + ,p_template_comment => 'Use this region template when you want to contain content without a border.'||chr(10)|| +''||chr(10)|| +'TITLE=YES'||chr(10)|| +'BUTTONS=YES'||chr(10)|| +'100% WIDTH=NO' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4838619911414911 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/bracketed_region +prompt ......region template 4838728225414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4838728225414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
#TITLE#
'||chr(10)|| +'
#CLOSE##PREVIOUS##NEXT##DELETE##EDIT##CHANGE##CREATE##CREATE2##EXPAND##COPY##HELP#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
#BODY#
'||chr(10)|| +'
'||chr(10)|| +'
 
'||chr(10)|| +'
'||chr(10)|| +'
' + ,p_page_plug_template_name => 'Bracketed Region' + ,p_theme_id => 7 + ,p_theme_class_id => 18 + ,p_translate_this_template => 'N' + ,p_template_comment => 'Use this region template when you want to contain content with a bracket UI.'||chr(10)|| +''||chr(10)|| +'TITLE=YES'||chr(10)|| +'BUTTONS=YES'||chr(10)|| +'100% WIDTH=NO' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4838728225414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/breadcrumb_region +prompt ......region template 4838801336414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4838801336414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'' + ,p_page_plug_template_name => 'Breadcrumb Region' + ,p_theme_id => 7 + ,p_theme_class_id => 6 + ,p_translate_this_template => 'N' + ,p_template_comment => 'Use this region template to contain breadcrumb menus. Breadcrumb menus are implemented using breadcrumbs. Breadcrumb menus are designed to displayed in #REGION_POSITION_01#' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4838801336414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/button_region_with_title +prompt ......region template 4838905909414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4838905909414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' #TITLE#'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' #CLOSE##COPY##DELETE##CHANGE##EDIT##PREVIOUS##N'|| +'EXT##CREATE##EXPAND#'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
' + ,p_page_plug_template_name => 'Button Region with Title' + ,p_theme_id => 7 + ,p_theme_class_id => 4 + ,p_translate_this_template => 'N' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4838905909414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/button_region_without_title +prompt ......region template 4839013563414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4839013563414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' #BODY#'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' #CLOSE##COPY##DELETE##CHANGE##EDIT##PREVIOUS##NE'|| +'XT##CREATE##EXPAND#'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
' + ,p_page_plug_template_name => 'Button Region without Title' + ,p_theme_id => 7 + ,p_theme_class_id => 17 + ,p_translate_this_template => 'N' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4839013563414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/chart_list +prompt ......region template 4839116402414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4839116402414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'
'||chr(10)|| +'
'||chr(10)|| +'
#TITLE#
'||chr(10)|| +'
#CLOSE##PREVIOUS##NEXT##DELETE##EDIT##CHANGE##CREATE##CREATE2##EXPAND##COPY##HELP#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
#BODY#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
' + ,p_page_plug_template_name => 'Chart List' + ,p_plug_table_bgcolor => '#ffffff' + ,p_theme_id => 7 + ,p_theme_class_id => 29 + ,p_plug_heading_bgcolor => '#ffffff' + ,p_plug_font_size => '-1' + ,p_translate_this_template => 'N' + ,p_template_comment => 'Red Theme' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4839116402414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/chart_region +prompt ......region template 4839217975414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4839217975414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'
'||chr(10)|| +'
'||chr(10)|| +'
#TITLE#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
#CLOSE##PREVIOUS##NEXT##DELETE##EDIT##CHANGE##CREATE##CREATE2##EXPAND##COPY##HELP#
'||chr(10)|| +'
#BODY#
'||chr(10)|| +'
'||chr(10)|| +'
' + ,p_page_plug_template_name => 'Chart Region' + ,p_plug_table_bgcolor => '#ffffff' + ,p_theme_id => 7 + ,p_theme_class_id => 30 + ,p_plug_heading_bgcolor => '#ffffff' + ,p_plug_font_size => '-1' + ,p_translate_this_template => 'N' + ,p_template_comment => 'Red Theme' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4839217975414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/form_region +prompt ......region template 4839304121414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4839304121414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'
'||chr(10)|| +'
'||chr(10)|| +'
#TITLE#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
#CLOSE##PREVIOUS##NEXT##DELETE##EDIT##CHANGE##CREATE##CREATE2##EXPAND##COPY##HELP#
'||chr(10)|| +'
'||chr(10)|| +'#BODY#
'||chr(10)|| +'
'||chr(10)|| +'
' + ,p_page_plug_template_name => 'Form Region' + ,p_plug_table_bgcolor => '#f7f7e7' + ,p_theme_id => 7 + ,p_theme_class_id => 8 + ,p_plug_heading_bgcolor => '#f7f7e7' + ,p_plug_font_size => '-1' + ,p_translate_this_template => 'N' + ,p_template_comment => 'Red Theme' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4839304121414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/hide_and_show_region +prompt ......region template 4839416734414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4839416734414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'
'||chr(10)|| +'
'||chr(10)|| +'
#TITLE#
'||chr(10)|| +'
#CLOSE##PREVIOUS##NEXT##DELETE##EDIT##CHANGE##CREATE##CREATE2##EXPAND##COPY##HELP#
'||chr(10)|| +'
'||chr(10)|| +'
#BODY#
'||chr(10)|| +'
' + ,p_page_plug_template_name => 'Hide and Show Region' + ,p_theme_id => 7 + ,p_theme_class_id => 1 + ,p_translate_this_template => 'N' + ,p_template_comment => 'Gray Head, white body' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4839416734414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/navigation_region +prompt ......region template 4839509274414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4839509274414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'' + ,p_page_plug_template_name => 'Navigation Region' + ,p_theme_id => 7 + ,p_theme_class_id => 5 + ,p_translate_this_template => 'N' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4839509274414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/navigation_region_alternative_1 +prompt ......region template 4839603421414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4839603421414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'' + ,p_page_plug_template_name => 'Navigation Region, Alternative 1' + ,p_theme_id => 7 + ,p_theme_class_id => 16 + ,p_translate_this_template => 'N' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4839603421414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/nested_region +prompt ......region template 4839728718414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4839728718414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
#TITLE#
'||chr(10)|| +'
#CLOSE##PREVIOUS##NEXT##DELETE##EDIT##CHANGE##CREATE##CREATE2##EXPAND##COPY##HELP#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' #BODY#'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
' + ,p_page_plug_template_name => 'Nested Region' + ,p_theme_id => 7 + ,p_theme_class_id => 22 + ,p_translate_this_template => 'N' + ,p_template_comment => 'Use this region template when you want to contain content without a border.'||chr(10)|| +''||chr(10)|| +'TITLE=YES'||chr(10)|| +'BUTTONS=YES'||chr(10)|| +'100% WIDTH=NO' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4839728718414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/region_without_buttons_and_titles +prompt ......region template 4839831975414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4839831975414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'
'||chr(10)|| +'
#BODY#
'||chr(10)|| +'
' + ,p_page_plug_template_name => 'Region without Buttons and Titles' + ,p_theme_id => 7 + ,p_theme_class_id => 19 + ,p_translate_this_template => 'N' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4839831975414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/region_without_title +prompt ......region template 4839912075414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4839912075414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'
'||chr(10)|| +'
'||chr(10)|| +'
 
'||chr(10)|| +'
#CLOSE##PREVIOUS##NEXT##DELETE##EDIT##CHANGE##CREATE##CREATE2##EXPAND##COPY##HELP#
'||chr(10)|| +'
'||chr(10)|| +'
#BODY#
'||chr(10)|| +'
' + ,p_page_plug_template_name => 'Region without Title' + ,p_theme_id => 7 + ,p_theme_class_id => 11 + ,p_translate_this_template => 'N' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4839912075414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/report_filter_single_row +prompt ......region template 4840023588414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4840023588414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'
#BODY#
#CLOSE##EDIT##CHANGE##DELETE##CREATE##CREATE2##COPY##PREVIOUS##NEXT##EXPAND##HELP#

' + ,p_page_plug_template_name => 'Report Filter - Single Row' + ,p_theme_id => 7 + ,p_theme_class_id => 31 + ,p_translate_this_template => 'N' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4840023588414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/report_list +prompt ......region template 4840108515414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4840108515414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'
'||chr(10)|| +'
'||chr(10)|| +'
#TITLE#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
#CLOSE##PREVIOUS##NEXT##DELETE##EDIT##CHANGE##CREATE##CREATE2##EXPAND##COPY##HELP#
'||chr(10)|| +'
'||chr(10)|| +' '|| +'#BODY#'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
' + ,p_page_plug_template_name => 'Report List' + ,p_plug_table_bgcolor => '#ffffff' + ,p_theme_id => 7 + ,p_theme_class_id => 29 + ,p_plug_heading_bgcolor => '#ffffff' + ,p_plug_font_size => '-1' + ,p_translate_this_template => 'N' + ,p_template_comment => 'Red Theme' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4840108515414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/reports_region +prompt ......region template 4840201642414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4840201642414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'
'||chr(10)|| +'
'||chr(10)|| +'
#TITLE#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
#CLOSE##PREVIOUS##NEXT##DELETE##EDIT##CHANGE##CREATE##CREATE2##EXPAND##COPY##HELP#
'||chr(10)|| +'
#BODY#
'||chr(10)|| +'
'||chr(10)|| +'
' + ,p_page_plug_template_name => 'Reports Region' + ,p_plug_table_bgcolor => '#ffffff' + ,p_theme_id => 7 + ,p_theme_class_id => 9 + ,p_plug_heading_bgcolor => '#ffffff' + ,p_plug_font_size => '-1' + ,p_translate_this_template => 'N' + ,p_template_comment => 'Red Theme' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4840201642414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/reports_region_100_width +prompt ......region template 4840330674414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4840330674414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'
'||chr(10)|| +'
'||chr(10)|| +'
#TITLE#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
#CLOSE##PREVIOUS##NEXT##DELETE##EDIT##CHANGE##CREATE##CREATE2##EXPAND##COPY##HELP#
'||chr(10)|| +'
#BODY#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'' + ,p_page_plug_template_name => 'Reports Region 100% Width' + ,p_plug_table_bgcolor => '#ffffff' + ,p_theme_id => 7 + ,p_theme_class_id => 13 + ,p_plug_heading_bgcolor => '#ffffff' + ,p_plug_font_size => '-1' + ,p_translate_this_template => 'N' + ,p_template_comment => 'Red Theme' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4840330674414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/reports_region_alternative_1 +prompt ......region template 4840430420414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4840430420414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'
'||chr(10)|| +'
'||chr(10)|| +'
#TITLE#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
#CLOSE##PREVIOUS##NEXT##DELETE##EDIT##CHANGE##CREATE##CREATE2##EXPAND##COPY##HELP#
'||chr(10)|| +'
#BODY#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
' + ,p_page_plug_template_name => 'Reports Region, Alternative 1' + ,p_plug_table_bgcolor => '#ffffff' + ,p_theme_id => 7 + ,p_theme_class_id => 10 + ,p_plug_heading_bgcolor => '#ffffff' + ,p_plug_font_size => '-1' + ,p_translate_this_template => 'N' + ,p_template_comment => 'Red Theme' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4840430420414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/sidebar_region +prompt ......region template 4840501966414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4840501966414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'' + ,p_page_plug_template_name => 'Sidebar Region' + ,p_plug_table_bgcolor => '#f7f7e7' + ,p_theme_id => 7 + ,p_theme_class_id => 2 + ,p_plug_heading_bgcolor => '#f7f7e7' + ,p_plug_font_size => '-1' + ,p_translate_this_template => 'N' + ,p_template_comment => ''||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +' #TITLE#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +''||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +'

'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +'
 '||chr(10)|| +'

'||chr(10)|| +' #BODY#'||chr(10)|| +' '||chr(10)|| +'

'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +'
'||chr(10)|| +'' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4840501966414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/sidebar_region_alternative_1 +prompt ......region template 4840606092414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4840606092414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'' + ,p_page_plug_template_name => 'Sidebar Region, Alternative 1' + ,p_plug_table_bgcolor => '#f7f7e7' + ,p_theme_id => 7 + ,p_theme_class_id => 3 + ,p_plug_heading_bgcolor => '#f7f7e7' + ,p_plug_font_size => '-1' + ,p_translate_this_template => 'N' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4840606092414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/sidebar_region_alternative_2 +prompt ......region template 4840710757414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4840710757414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'' + ,p_page_plug_template_name => 'Sidebar Region, Alternative 2' + ,p_plug_table_bgcolor => '#f7f7e7' + ,p_theme_id => 7 + ,p_theme_class_id => 3 + ,p_plug_heading_bgcolor => '#f7f7e7' + ,p_plug_font_size => '-1' + ,p_translate_this_template => 'N' + ,p_template_comment => ''||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +' #TITLE#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +''||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +'

'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +'
 '||chr(10)|| +'

'||chr(10)|| +' #BODY#'||chr(10)|| +' '||chr(10)|| +'

'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +'
'||chr(10)|| +'' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4840710757414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/top_bar +prompt ......region template 4840807393414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4840807393414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' #BODY#'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +' #CLOSE##COPY##DELETE##CHANGE##EDIT##PREVIOUS##NE'|| +'XT##CREATE##EXPAND#'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
' + ,p_page_plug_template_name => 'Top Bar' + ,p_theme_id => 7 + ,p_theme_class_id => 21 + ,p_translate_this_template => 'N' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4840807393414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/wizard_region +prompt ......region template 4840913627414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4840913627414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'
'||chr(10)|| +'
'||chr(10)|| +'
#TITLE#
'||chr(10)|| +'
#CLOSE##PREVIOUS##NEXT##DELETE##EDIT##CHANGE##CREATE##CREATE2##EXPAND##COPY##HELP#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
#BODY#
'||chr(10)|| +'
'||chr(10)|| +'
' + ,p_page_plug_template_name => 'Wizard Region' + ,p_theme_id => 7 + ,p_theme_class_id => 12 + ,p_translate_this_template => 'N' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4840913627414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/region/wizard_region_with_icon +prompt ......region template 4841016262414912 + +begin + +wwv_flow_api.create_plug_template ( + p_id => 4841016262414912 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_template => +'
'||chr(10)|| +'
'||chr(10)|| +'
#TITLE#
'||chr(10)|| +'
#CLOSE##PREVIOUS##NEXT##DELETE##EDIT##CHANGE##CREATE##CREATE2##EXPAND##COPY##HELP#
'||chr(10)|| +'
'||chr(10)|| +'
'||chr(10)|| +'
#BODY#
'||chr(10)|| +'
'||chr(10)|| +'
' + ,p_page_plug_template_name => 'Wizard Region with Icon' + ,p_theme_id => 7 + ,p_theme_class_id => 20 + ,p_translate_this_template => 'N' + ); +null; + +end; +/ + + +begin + +declare + t2 varchar2(32767) := null; +begin +t2 := null; +wwv_flow_api.set_plug_template_tab_attr ( + p_id=> 4841016262414912 + wwv_flow_api.g_id_offset, + p_form_table_attr=> t2 ); +exception when others then null; +end; +null; + +end; +/ + +prompt ...List Templates +-- +--application/shared_components/user_interface/templates/list/button_list +prompt ......list template 4841113607414912 + +begin + +declare + t varchar2(32767) := null; + t2 varchar2(32767) := null; + t3 varchar2(32767) := null; + t4 varchar2(32767) := null; + t5 varchar2(32767) := null; + t6 varchar2(32767) := null; + t7 varchar2(32767) := null; + t8 varchar2(32767) := null; + l_clob clob; + l_clob2 clob; + l_clob3 clob; + l_clob4 clob; + l_clob5 clob; + l_clob6 clob; + l_clob7 clob; + l_clob8 clob; + l_length number := 1; +begin +t:=t||''; + +t2:=t2||''; + +t3 := null; +t4 := null; +t5 := null; +t6 := null; +t7 := null; +t8 := null; +wwv_flow_api.create_list_template ( + p_id=>4841113607414912 + wwv_flow_api.g_id_offset, + p_flow_id=>wwv_flow.g_flow_id, + p_list_template_current=>t, + p_list_template_noncurrent=> t2, + p_list_template_name=>'Button List', + p_theme_id => 7, + p_theme_class_id => 6, + p_list_template_before_rows=>'
', + p_list_template_after_rows=>'
', + p_translate_this_template => 'N', + p_list_template_comment=>''); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/list/dhtml_tree +prompt ......list template 4841206791414913 + +begin + +declare + t varchar2(32767) := null; + t2 varchar2(32767) := null; + t3 varchar2(32767) := null; + t4 varchar2(32767) := null; + t5 varchar2(32767) := null; + t6 varchar2(32767) := null; + t7 varchar2(32767) := null; + t8 varchar2(32767) := null; + l_clob clob; + l_clob2 clob; + l_clob3 clob; + l_clob4 clob; + l_clob5 clob; + l_clob6 clob; + l_clob7 clob; + l_clob8 clob; + l_length number := 1; +begin +t:=t||'
  • #TEXT#
  • '; + +t2:=t2||'
  • #TEXT#
  • '; + +t3:=t3||'
  • #TEXT#
  • '; + +t4:=t4||'
  • #TEXT#
  • '; + +t5:=t5||'
  • #TEXT#
  • '; + +t6:=t6||'
  • #TEXT#
  • '; + +t7:=t7||'
  • #TEXT#
  • '; + +t8:=t8||'
  • #TEXT#
  • '; + +wwv_flow_api.create_list_template ( + p_id=>4841206791414913 + wwv_flow_api.g_id_offset, + p_flow_id=>wwv_flow.g_flow_id, + p_list_template_current=>t, + p_list_template_noncurrent=> t2, + p_list_template_name=>'DHTML Tree', + p_theme_id => 7, + p_theme_class_id => 23, + p_list_template_before_rows=>'
      ', + p_list_template_after_rows=>'


    ', + p_before_sub_list=>'
      ', + p_after_sub_list=>'
    ', + p_sub_list_item_current=> t3, + p_sub_list_item_noncurrent=> t4, + p_item_templ_curr_w_child=> t5, + p_item_templ_noncurr_w_child=> t6, + p_sub_templ_curr_w_child=> t7, + p_sub_templ_noncurr_w_child=> t8, + p_translate_this_template => 'N', + p_list_template_comment=>''); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/list/hierarchical_expanding +prompt ......list template 4841305748414913 + +begin + +declare + t varchar2(32767) := null; + t2 varchar2(32767) := null; + t3 varchar2(32767) := null; + t4 varchar2(32767) := null; + t5 varchar2(32767) := null; + t6 varchar2(32767) := null; + t7 varchar2(32767) := null; + t8 varchar2(32767) := null; + l_clob clob; + l_clob2 clob; + l_clob3 clob; + l_clob4 clob; + l_clob5 clob; + l_clob6 clob; + l_clob7 clob; + l_clob8 clob; + l_length number := 1; +begin +t:=t||'
  • #TEXT#
  • '; + +t2:=t2||'
  • #TEXT#
  • '; + +t3:=t3||'
  • #TEXT#
  • '; + +t4:=t4||'
  • #TEXT#
  • '; + +t5:=t5||'
  • #TEXT#
  • '; + +t6:=t6||'
  • #TEXT#
  • '; + +t7:=t7||'
  • #TEXT#
  • '; + +t8:=t8||'
  • #TEXT#
  • '; + +wwv_flow_api.create_list_template ( + p_id=>4841305748414913 + wwv_flow_api.g_id_offset, + p_flow_id=>wwv_flow.g_flow_id, + p_list_template_current=>t, + p_list_template_noncurrent=> t2, + p_list_template_name=>'Hierarchical Expanding', + p_theme_id => 7, + p_theme_class_id => 22, + p_list_template_before_rows=>'
      ', + p_list_template_after_rows=>'


    ', + p_before_sub_list=>'', + p_sub_list_item_current=> t3, + p_sub_list_item_noncurrent=> t4, + p_item_templ_curr_w_child=> t5, + p_item_templ_noncurr_w_child=> t6, + p_sub_templ_curr_w_child=> t7, + p_sub_templ_noncurr_w_child=> t8, + p_translate_this_template => 'N', + p_list_template_comment=>''); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/list/horizontal_images_with_label_list +prompt ......list template 4841426973414913 + +begin + +declare + t varchar2(32767) := null; + t2 varchar2(32767) := null; + t3 varchar2(32767) := null; + t4 varchar2(32767) := null; + t5 varchar2(32767) := null; + t6 varchar2(32767) := null; + t7 varchar2(32767) := null; + t8 varchar2(32767) := null; + l_clob clob; + l_clob2 clob; + l_clob3 clob; + l_clob4 clob; + l_clob5 clob; + l_clob6 clob; + l_clob7 clob; + l_clob8 clob; + l_length number := 1; +begin +t:=t||'
    '||chr(10)|| +'
    '||chr(10)|| +' '||chr(10)|| +'
    '; + +t2:=t2||'
    '||chr(10)|| +'
    '||chr(10)|| +' '||chr(10)|| +'
    '; + +t3 := null; +t4 := null; +t5 := null; +t6 := null; +t7 := null; +t8 := null; +wwv_flow_api.create_list_template ( + p_id=>4841426973414913 + wwv_flow_api.g_id_offset, + p_flow_id=>wwv_flow.g_flow_id, + p_list_template_current=>t, + p_list_template_noncurrent=> t2, + p_list_template_name=>'Horizontal Images with Label List', + p_theme_id => 7, + p_theme_class_id => 4, + p_list_template_before_rows=>'
    ', + p_list_template_after_rows=>'
    ', + p_translate_this_template => 'N', + p_list_template_comment=>''); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/list/horizontal_links_list +prompt ......list template 4841525373414913 + +begin + +declare + t varchar2(32767) := null; + t2 varchar2(32767) := null; + t3 varchar2(32767) := null; + t4 varchar2(32767) := null; + t5 varchar2(32767) := null; + t6 varchar2(32767) := null; + t7 varchar2(32767) := null; + t8 varchar2(32767) := null; + l_clob clob; + l_clob2 clob; + l_clob3 clob; + l_clob4 clob; + l_clob5 clob; + l_clob6 clob; + l_clob7 clob; + l_clob8 clob; + l_length number := 1; +begin +t:=t||'#TEXT#'; + +t2:=t2||'#TEXT#'; + +t3 := null; +t4 := null; +t5 := null; +t6 := null; +t7 := null; +t8 := null; +wwv_flow_api.create_list_template ( + p_id=>4841525373414913 + wwv_flow_api.g_id_offset, + p_flow_id=>wwv_flow.g_flow_id, + p_list_template_current=>t, + p_list_template_noncurrent=> t2, + p_list_template_name=>'Horizontal Links List', + p_theme_id => 7, + p_theme_class_id => 3, + p_list_template_before_rows=>'', + p_translate_this_template => 'N', + p_list_template_comment=>''); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/list/pull_down_menu +prompt ......list template 4841628580414913 + +begin + +declare + t varchar2(32767) := null; + t2 varchar2(32767) := null; + t3 varchar2(32767) := null; + t4 varchar2(32767) := null; + t5 varchar2(32767) := null; + t6 varchar2(32767) := null; + t7 varchar2(32767) := null; + t8 varchar2(32767) := null; + l_clob clob; + l_clob2 clob; + l_clob3 clob; + l_clob4 clob; + l_clob5 clob; + l_clob6 clob; + l_clob7 clob; + l_clob8 clob; + l_length number := 1; +begin +t:=t||'
  • #TEXT#
  • '; + +t2:=t2||'
  • #TEXT#
  • '; + +t3:=t3||'
  • '; + +t4:=t4||'
  • #TEXT#
  • '; + +t5:=t5||'
  • #TEXT#Expand'||chr(10)|| +'
  • '; + +t6:=t6||'
  • #TEXT#Expand
  • '; + +t7:=t7||'
  • #TEXT#
  • '; + +t8:=t8||'
  • #TEXT#
  • '; + +wwv_flow_api.create_list_template ( + p_id=>4841628580414913 + wwv_flow_api.g_id_offset, + p_flow_id=>wwv_flow.g_flow_id, + p_list_template_current=>t, + p_list_template_noncurrent=> t2, + p_list_template_name=>'Pull Down Menu', + p_theme_id => 7, + p_theme_class_id => 20, + p_list_template_before_rows=>'
      ', + p_list_template_after_rows=>'


    ', + p_before_sub_list=>'', + p_sub_list_item_current=> t3, + p_sub_list_item_noncurrent=> t4, + p_item_templ_curr_w_child=> t5, + p_item_templ_noncurr_w_child=> t6, + p_sub_templ_curr_w_child=> t7, + p_sub_templ_noncurr_w_child=> t8, + p_translate_this_template => 'N', + p_list_template_comment=>''); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/list/pull_down_menu_with_image +prompt ......list template 4841701587414913 + +begin + +declare + t varchar2(32767) := null; + t2 varchar2(32767) := null; + t3 varchar2(32767) := null; + t4 varchar2(32767) := null; + t5 varchar2(32767) := null; + t6 varchar2(32767) := null; + t7 varchar2(32767) := null; + t8 varchar2(32767) := null; + l_clob clob; + l_clob2 clob; + l_clob3 clob; + l_clob4 clob; + l_clob5 clob; + l_clob6 clob; + l_clob7 clob; + l_clob8 clob; + l_length number := 1; +begin +t:=t||''; + +t2:=t2||''; + +t3:=t3||'
  • '; + +t4:=t4||'
  • #TEXT#
  • '; + +t5:=t5||'
    '||chr(10)|| +'#TEXT#'||chr(10)|| +'
    '; + +t6:=t6||'
    '||chr(10)|| +'#TEXT#'||chr(10)|| +'
    '; + +t7:=t7||'
  • #TEXT#
  • '; + +t8:=t8||'
  • #TEXT#
  • '; + +wwv_flow_api.create_list_template ( + p_id=>4841701587414913 + wwv_flow_api.g_id_offset, + p_flow_id=>wwv_flow.g_flow_id, + p_list_template_current=>t, + p_list_template_noncurrent=> t2, + p_list_template_name=>'Pull Down Menu with Image', + p_theme_id => 7, + p_theme_class_id => 21, + p_list_template_before_rows=>'
    ', + p_list_template_after_rows=>'


    ', + p_before_sub_list=>'', + p_sub_list_item_current=> t3, + p_sub_list_item_noncurrent=> t4, + p_item_templ_curr_w_child=> t5, + p_item_templ_noncurr_w_child=> t6, + p_sub_templ_curr_w_child=> t7, + p_sub_templ_noncurr_w_child=> t8, + p_translate_this_template => 'N', + p_list_template_comment=>''); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/list/tabbed_navigation_list +prompt ......list template 4841804704414913 + +begin + +declare + t varchar2(32767) := null; + t2 varchar2(32767) := null; + t3 varchar2(32767) := null; + t4 varchar2(32767) := null; + t5 varchar2(32767) := null; + t6 varchar2(32767) := null; + t7 varchar2(32767) := null; + t8 varchar2(32767) := null; + l_clob clob; + l_clob2 clob; + l_clob3 clob; + l_clob4 clob; + l_clob5 clob; + l_clob6 clob; + l_clob7 clob; + l_clob8 clob; + l_length number := 1; +begin +t:=t||'
  • #TEXT#
  • '; + +t2:=t2||'
  • #TEXT#
  • '; + +t3 := null; +t4 := null; +t5 := null; +t6 := null; +t7 := null; +t8 := null; +wwv_flow_api.create_list_template ( + p_id=>4841804704414913 + wwv_flow_api.g_id_offset, + p_flow_id=>wwv_flow.g_flow_id, + p_list_template_current=>t, + p_list_template_noncurrent=> t2, + p_list_template_name=>'Tabbed Navigation List', + p_theme_id => 7, + p_theme_class_id => 7, + p_list_template_before_rows=>'
    '||chr(10)|| +'
    '||chr(10)|| +'
      ', + p_list_template_after_rows=>'
    '||chr(10)|| +'
    '||chr(10)|| +'
    ', + p_translate_this_template => 'N', + p_list_template_comment=>''); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/list/vertical_images_list +prompt ......list template 4841925462414913 + +begin + +declare + t varchar2(32767) := null; + t2 varchar2(32767) := null; + t3 varchar2(32767) := null; + t4 varchar2(32767) := null; + t5 varchar2(32767) := null; + t6 varchar2(32767) := null; + t7 varchar2(32767) := null; + t8 varchar2(32767) := null; + l_clob clob; + l_clob2 clob; + l_clob3 clob; + l_clob4 clob; + l_clob5 clob; + l_clob6 clob; + l_clob7 clob; + l_clob8 clob; + l_length number := 1; +begin +t:=t||'
    '||chr(10)|| +'
    '||chr(10)|| +' '||chr(10)|| +'
    '; + +t2:=t2||'
    '||chr(10)|| +'
    '||chr(10)|| +' '||chr(10)|| +'
    '; + +t3 := null; +t4 := null; +t5 := null; +t6 := null; +t7 := null; +t8 := null; +wwv_flow_api.create_list_template ( + p_id=>4841925462414913 + wwv_flow_api.g_id_offset, + p_flow_id=>wwv_flow.g_flow_id, + p_list_template_current=>t, + p_list_template_noncurrent=> t2, + p_list_template_name=>'Vertical Images List', + p_theme_id => 7, + p_theme_class_id => 5, + p_list_template_before_rows=>'
    ', + p_list_template_after_rows=>'
    ', + p_translate_this_template => 'N', + p_list_template_comment=>''); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/list/vertical_ordered_list +prompt ......list template 4842002006414913 + +begin + +declare + t varchar2(32767) := null; + t2 varchar2(32767) := null; + t3 varchar2(32767) := null; + t4 varchar2(32767) := null; + t5 varchar2(32767) := null; + t6 varchar2(32767) := null; + t7 varchar2(32767) := null; + t8 varchar2(32767) := null; + l_clob clob; + l_clob2 clob; + l_clob3 clob; + l_clob4 clob; + l_clob5 clob; + l_clob6 clob; + l_clob7 clob; + l_clob8 clob; + l_length number := 1; +begin +t:=t||'
  • #TEXT#
  • '; + +t2:=t2||'
  • #TEXT#
  • '; + +t3 := null; +t4 := null; +t5 := null; +t6 := null; +t7 := null; +t8 := null; +wwv_flow_api.create_list_template ( + p_id=>4842002006414913 + wwv_flow_api.g_id_offset, + p_flow_id=>wwv_flow.g_flow_id, + p_list_template_current=>t, + p_list_template_noncurrent=> t2, + p_list_template_name=>'Vertical Ordered List', + p_theme_id => 7, + p_theme_class_id => 2, + p_list_template_before_rows=>'
      ', + p_list_template_after_rows=>'
    ', + p_translate_this_template => 'N', + p_list_template_comment=>''); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/list/vertical_sidebar_list +prompt ......list template 4842129542414913 + +begin + +declare + t varchar2(32767) := null; + t2 varchar2(32767) := null; + t3 varchar2(32767) := null; + t4 varchar2(32767) := null; + t5 varchar2(32767) := null; + t6 varchar2(32767) := null; + t7 varchar2(32767) := null; + t8 varchar2(32767) := null; + l_clob clob; + l_clob2 clob; + l_clob3 clob; + l_clob4 clob; + l_clob5 clob; + l_clob6 clob; + l_clob7 clob; + l_clob8 clob; + l_length number := 1; +begin +t:=t||'
  • #TEXT#
  • '; + +t2:=t2||'
  • #TEXT#
  • '; + +t3 := null; +t4 := null; +t5 := null; +t6 := null; +t7 := null; +t8 := null; +wwv_flow_api.create_list_template ( + p_id=>4842129542414913 + wwv_flow_api.g_id_offset, + p_flow_id=>wwv_flow.g_flow_id, + p_list_template_current=>t, + p_list_template_noncurrent=> t2, + p_list_template_name=>'Vertical Sidebar List', + p_theme_id => 7, + p_theme_class_id => 19, + p_list_template_before_rows=>'
      ', + p_list_template_after_rows=>'
    ', + p_translate_this_template => 'N', + p_list_template_comment=>''); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/list/vertical_unordered_list_with_bullets +prompt ......list template 4842217442414913 + +begin + +declare + t varchar2(32767) := null; + t2 varchar2(32767) := null; + t3 varchar2(32767) := null; + t4 varchar2(32767) := null; + t5 varchar2(32767) := null; + t6 varchar2(32767) := null; + t7 varchar2(32767) := null; + t8 varchar2(32767) := null; + l_clob clob; + l_clob2 clob; + l_clob3 clob; + l_clob4 clob; + l_clob5 clob; + l_clob6 clob; + l_clob7 clob; + l_clob8 clob; + l_length number := 1; +begin +t:=t||'
  • #TEXT#
  • '; + +t2:=t2||'
  • #TEXT#
  • '; + +t3 := null; +t4 := null; +t5 := null; +t6 := null; +t7 := null; +t8 := null; +wwv_flow_api.create_list_template ( + p_id=>4842217442414913 + wwv_flow_api.g_id_offset, + p_flow_id=>wwv_flow.g_flow_id, + p_list_template_current=>t, + p_list_template_noncurrent=> t2, + p_list_template_name=>'Vertical Unordered List with Bullets', + p_theme_id => 7, + p_theme_class_id => 1, + p_list_template_before_rows=>'
      ', + p_list_template_after_rows=>'
    ', + p_translate_this_template => 'N', + p_list_template_comment=>''); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/list/vertical_unordered_list_without_bullets +prompt ......list template 4842305846414913 + +begin + +declare + t varchar2(32767) := null; + t2 varchar2(32767) := null; + t3 varchar2(32767) := null; + t4 varchar2(32767) := null; + t5 varchar2(32767) := null; + t6 varchar2(32767) := null; + t7 varchar2(32767) := null; + t8 varchar2(32767) := null; + l_clob clob; + l_clob2 clob; + l_clob3 clob; + l_clob4 clob; + l_clob5 clob; + l_clob6 clob; + l_clob7 clob; + l_clob8 clob; + l_length number := 1; +begin +t:=t||'
  • #TEXT#
  • '; + +t2:=t2||'
  • #TEXT#
  • '; + +t3 := null; +t4 := null; +t5 := null; +t6 := null; +t7 := null; +t8 := null; +wwv_flow_api.create_list_template ( + p_id=>4842305846414913 + wwv_flow_api.g_id_offset, + p_flow_id=>wwv_flow.g_flow_id, + p_list_template_current=>t, + p_list_template_noncurrent=> t2, + p_list_template_name=>'Vertical Unordered List without Bullets', + p_theme_id => 7, + p_theme_class_id => 18, + p_list_template_before_rows=>'
      ', + p_list_template_after_rows=>'
    ', + p_translate_this_template => 'N', + p_list_template_comment=>''); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/list/wizard_progress_bar_horizontal_train +prompt ......list template 4842416341414913 + +begin + +declare + t varchar2(32767) := null; + t2 varchar2(32767) := null; + t3 varchar2(32767) := null; + t4 varchar2(32767) := null; + t5 varchar2(32767) := null; + t6 varchar2(32767) := null; + t7 varchar2(32767) := null; + t8 varchar2(32767) := null; + l_clob clob; + l_clob2 clob; + l_clob3 clob; + l_clob4 clob; + l_clob5 clob; + l_clob6 clob; + l_clob7 clob; + l_clob8 clob; + l_length number := 1; +begin +t:=t||'
  • '||chr(10)|| +' #TEXT#'||chr(10)|| +'
  • '; + +t2:=t2||'
  • '||chr(10)|| +' #TEXT#'||chr(10)|| +'
  • '; + +t3 := null; +t4 := null; +t5 := null; +t6 := null; +t7 := null; +t8 := null; +wwv_flow_api.create_list_template ( + p_id=>4842416341414913 + wwv_flow_api.g_id_offset, + p_flow_id=>wwv_flow.g_flow_id, + p_list_template_current=>t, + p_list_template_noncurrent=> t2, + p_list_template_name=>'Wizard Progress Bar, Horizontal Train', + p_theme_id => 7, + p_theme_class_id => 17, + p_list_template_before_rows=>'
    '||chr(10)|| +'
      ', + p_list_template_after_rows=>'
    '||chr(10)|| +'
    ', + p_translate_this_template => 'N', + p_list_template_comment=>''); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/list/wizard_progress_list +prompt ......list template 4842501315414914 + +begin + +declare + t varchar2(32767) := null; + t2 varchar2(32767) := null; + t3 varchar2(32767) := null; + t4 varchar2(32767) := null; + t5 varchar2(32767) := null; + t6 varchar2(32767) := null; + t7 varchar2(32767) := null; + t8 varchar2(32767) := null; + l_clob clob; + l_clob2 clob; + l_clob3 clob; + l_clob4 clob; + l_clob5 clob; + l_clob6 clob; + l_clob7 clob; + l_clob8 clob; + l_length number := 1; +begin +t:=t||'
  • #TEXT#
  • '; + +t2:=t2||'
  • #TEXT#
  • '; + +t3 := null; +t4 := null; +t5 := null; +t6 := null; +t7 := null; +t8 := null; +wwv_flow_api.create_list_template ( + p_id=>4842501315414914 + wwv_flow_api.g_id_offset, + p_flow_id=>wwv_flow.g_flow_id, + p_list_template_current=>t, + p_list_template_noncurrent=> t2, + p_list_template_name=>'Wizard Progress List', + p_theme_id => 7, + p_theme_class_id => 17, + p_list_template_before_rows=>'
      ', + p_list_template_after_rows=>'
    ', + p_between_items=>'
  •  
  • ', + p_translate_this_template => 'N', + p_list_template_comment=>''); +end; +null; + +end; +/ + +prompt ...report templates +-- +--application/shared_components/user_interface/templates/report/borderless_report +prompt ......report template 4842613113414914 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + c4 varchar2(32767) := null; +begin +c1:=c1||'#COLUMN_VALUE#'; + +c2 := null; +c3 := null; +c4 := null; +wwv_flow_api.create_row_template ( + p_id=> 4842613113414914 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_row_template_name=> 'Borderless Report', + p_row_template1=> c1, + p_row_template_condition1=> '', + p_row_template2=> c2, + p_row_template_condition2=> '', + p_row_template3=> c3, + p_row_template_condition3=> '', + p_row_template4=> c4, + p_row_template_condition4=> '', + p_row_template_before_rows=>'#TOP_PAGINATION#'||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#PAGINATION#'||chr(10)|| +'
    ', + p_row_template_after_rows =>'
    #EXTERNAL_LINK##CSV_LINK#
    ', + p_row_template_table_attr =>'', + p_row_template_type =>'GENERIC_COLUMNS', + p_column_heading_template=>'#COLUMN_HEADER#', + p_row_template_display_cond1=>'0', + p_row_template_display_cond2=>'0', + p_row_template_display_cond3=>'0', + p_row_template_display_cond4=>'0', + p_next_page_template=>'#PAGINATION_NEXT#', + p_previous_page_template=>'#PAGINATION_PREVIOUS#', + p_next_set_template=>'#PAGINATION_NEXT_SET#', + p_previous_set_template=>'#PAGINATION_PREVIOUS_SET#', + p_row_style_checked=>'#ccc', + p_theme_id => 7, + p_theme_class_id => 1, + p_translate_this_template => 'N', + p_row_template_comment=> ''); +end; +null; + +end; +/ + + +begin + +begin +wwv_flow_api.create_row_template_patch ( + p_id => 4842613113414914 + wwv_flow_api.g_id_offset, + p_row_template_before_first =>'', + p_row_template_after_last =>''); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/report/fixed_headers +prompt ......report template 4842709891414914 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + c4 varchar2(32767) := null; +begin +c1:=c1||'

    #COLUMN_VALUE#

    '; + +c2:=c2||'

    #COLUMN_VALUE#

    '; + +c3 := null; +c4 := null; +wwv_flow_api.create_row_template ( + p_id=> 4842709891414914 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_row_template_name=> 'Fixed Headers', + p_row_template1=> c1, + p_row_template_condition1=> '', + p_row_template2=> c2, + p_row_template_condition2=> '', + p_row_template3=> c3, + p_row_template_condition3=> '', + p_row_template4=> c4, + p_row_template_condition4=> '', + p_row_template_before_rows=>'#TOP_PAGINATION#'||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#PAGINATION#'||chr(10)|| +'
    ', + p_row_template_after_rows =>'
    #EXTERNAL_LINK##CSV_LINK#
    ', + p_row_template_table_attr =>'OMIT', + p_row_template_type =>'GENERIC_COLUMNS', + p_before_column_heading=>''||chr(10)|| +'', + p_column_heading_template=>'#COLUMN_HEADER#', + p_after_column_heading=>''||chr(10)|| +''||chr(10)|| +'', + p_row_template_display_cond1=>'ODD_ROW_NUMBERS', + p_row_template_display_cond2=>'0', + p_row_template_display_cond3=>'0', + p_row_template_display_cond4=>'ODD_ROW_NUMBERS', + p_next_page_template=>'#PAGINATION_NEXT#'||chr(10)|| +'', + p_previous_page_template=>'#PAGINATION_PREVIOUS#', + p_next_set_template=>'#PAGINATION_NEXT_SET#', + p_previous_set_template=>'#PAGINATION_PREVIOUS_SET#', + p_row_style_mouse_over=>'#d6dae4', + p_row_style_checked=>'#d6dae4', + p_theme_id => 7, + p_theme_class_id => 7, + p_translate_this_template => 'N', + p_row_template_comment=> ''); +end; +null; + +end; +/ + + +begin + +begin +wwv_flow_api.create_row_template_patch ( + p_id => 4842709891414914 + wwv_flow_api.g_id_offset, + p_row_template_before_first =>'', + p_row_template_after_last =>''||chr(10)|| +''); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/report/horizontal_border +prompt ......report template 4842813330414914 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + c4 varchar2(32767) := null; +begin +c1:=c1||'#COLUMN_VALUE#'; + +c2 := null; +c3 := null; +c4 := null; +wwv_flow_api.create_row_template ( + p_id=> 4842813330414914 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_row_template_name=> 'Horizontal Border', + p_row_template1=> c1, + p_row_template_condition1=> '', + p_row_template2=> c2, + p_row_template_condition2=> '', + p_row_template3=> c3, + p_row_template_condition3=> '', + p_row_template4=> c4, + p_row_template_condition4=> '', + p_row_template_before_rows=>'#TOP_PAGINATION#'||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#PAGINATION#'||chr(10)|| +'
    ', + p_row_template_after_rows =>'
    #EXTERNAL_LINK##CSV_LINK#
    ', + p_row_template_table_attr =>'', + p_row_template_type =>'GENERIC_COLUMNS', + p_column_heading_template=>'#COLUMN_HEADER#', + p_row_template_display_cond1=>'0', + p_row_template_display_cond2=>'0', + p_row_template_display_cond3=>'0', + p_row_template_display_cond4=>'0', + p_next_page_template=>'#PAGINATION_NEXT#', + p_previous_page_template=>'#PAGINATION_PREVIOUS#', + p_next_set_template=>'#PAGINATION_NEXT_SET#', + p_previous_set_template=>'#PAGINATION_PREVIOUS_SET#', + p_row_style_checked=>'#ccc', + p_theme_id => 7, + p_theme_class_id => 2, + p_translate_this_template => 'N', + p_row_template_comment=> ''); +end; +null; + +end; +/ + + +begin + +begin +wwv_flow_api.create_row_template_patch ( + p_id => 4842813330414914 + wwv_flow_api.g_id_offset, + p_row_template_before_first =>'', + p_row_template_after_last =>''); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/report/one_column_unordered_list +prompt ......report template 4842926860414914 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + c4 varchar2(32767) := null; +begin +c1:=c1||'
  • #COLUMN_VALUE#
  • '; + +c2 := null; +c3 := null; +c4 := null; +wwv_flow_api.create_row_template ( + p_id=> 4842926860414914 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_row_template_name=> 'One Column Unordered List', + p_row_template1=> c1, + p_row_template_condition1=> '', + p_row_template2=> c2, + p_row_template_condition2=> '', + p_row_template3=> c3, + p_row_template_condition3=> '', + p_row_template4=> c4, + p_row_template_condition4=> '', + p_row_template_before_rows=>''||chr(10)|| +'#TOP_PAGINATION#'||chr(10)|| +''||chr(10)|| +'#PAGINATION#'||chr(10)|| +'
      ', + p_row_template_after_rows =>'
    #EXTERNAL_LINK##CSV_LINK#
    ', + p_row_template_table_attr =>'OMIT', + p_row_template_type =>'GENERIC_COLUMNS', + p_column_heading_template=>'', + p_row_template_display_cond1=>'NOT_CONDITIONAL', + p_row_template_display_cond2=>'NOT_CONDITIONAL', + p_row_template_display_cond3=>'NOT_CONDITIONAL', + p_row_template_display_cond4=>'NOT_CONDITIONAL', + p_next_page_template=>'#PAGINATION_NEXT#', + p_previous_page_template=>'#PAGINATION_PREVIOUS#', + p_next_set_template=>'#PAGINATION_NEXT_SET#', + p_previous_set_template=>'#PAGINATION_PREVIOUS_SET#', + p_theme_id => 7, + p_theme_class_id => 3, + p_translate_this_template => 'N', + p_row_template_comment=> ''); +end; +null; + +end; +/ + + +begin + +begin +wwv_flow_api.create_row_template_patch ( + p_id => 4842926860414914 + wwv_flow_api.g_id_offset, + p_row_template_before_first =>'OMIT', + p_row_template_after_last =>'OMIT'); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/report/search_results_report_link_text_link_target_detail1_detail2_last_modified +prompt ......report template 4843007415414914 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + c4 varchar2(32767) := null; +begin +c1:=c1||'
  • '||chr(10)|| +'#1#'||chr(10)|| +'#5##3#'||chr(10)|| +'#4#'||chr(10)|| +'
  • '; + +c2 := null; +c3 := null; +c4 := null; +wwv_flow_api.create_row_template ( + p_id=> 4843007415414914 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_row_template_name=> 'Search Results Report (link_text, link_target, detail1, detail2, last_modified)', + p_row_template1=> c1, + p_row_template_condition1=> '', + p_row_template2=> c2, + p_row_template_condition2=> '', + p_row_template3=> c3, + p_row_template_condition3=> '', + p_row_template4=> c4, + p_row_template_condition4=> '', + p_row_template_before_rows=>'
      ', + p_row_template_after_rows =>'
    '||chr(10)|| +'#PAGINATION#', + p_row_template_table_attr =>'', + p_row_template_type =>'NAMED_COLUMNS', + p_column_heading_template=>'', + p_row_template_display_cond1=>'0', + p_row_template_display_cond2=>'0', + p_row_template_display_cond3=>'0', + p_row_template_display_cond4=>'0', + p_next_page_template=>'', + p_previous_page_template=>''||chr(10)|| +'', + p_next_set_template=>''||chr(10)|| +'', + p_previous_set_template=>'', + p_theme_id => 7, + p_theme_class_id => 1, + p_translate_this_template => 'N', + p_row_template_comment=> ''); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/report/standard +prompt ......report template 4843113555414914 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + c4 varchar2(32767) := null; +begin +c1:=c1||'#COLUMN_VALUE#'; + +c2 := null; +c3 := null; +c4 := null; +wwv_flow_api.create_row_template ( + p_id=> 4843113555414914 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_row_template_name=> 'Standard', + p_row_template1=> c1, + p_row_template_condition1=> '', + p_row_template2=> c2, + p_row_template_condition2=> '', + p_row_template3=> c3, + p_row_template_condition3=> '', + p_row_template4=> c4, + p_row_template_condition4=> '', + p_row_template_before_rows=>'#TOP_PAGINATION#'||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#PAGINATION#'||chr(10)|| +'
    ', + p_row_template_after_rows =>'
    #EXTERNAL_LINK##CSV_LINK#
    ', + p_row_template_table_attr =>'', + p_row_template_type =>'GENERIC_COLUMNS', + p_column_heading_template=>'#COLUMN_HEADER#', + p_row_template_display_cond1=>'0', + p_row_template_display_cond2=>'0', + p_row_template_display_cond3=>'0', + p_row_template_display_cond4=>'0', + p_next_page_template=>'#PAGINATION_NEXT#', + p_previous_page_template=>'#PAGINATION_PREVIOUS#', + p_next_set_template=>'#PAGINATION_NEXT_SET#', + p_previous_set_template=>'#PAGINATION_PREVIOUS_SET#', + p_row_style_mouse_over=>'#DDD', + p_row_style_checked=>'#ccc', + p_theme_id => 7, + p_theme_class_id => 4, + p_translate_this_template => 'N', + p_row_template_comment=> ''); +end; +null; + +end; +/ + + +begin + +begin +wwv_flow_api.create_row_template_patch ( + p_id => 4843113555414914 + wwv_flow_api.g_id_offset, + p_row_template_before_first =>'', + p_row_template_after_last =>''); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/report/standard_alternating_row_colors +prompt ......report template 4843205265414914 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + c4 varchar2(32767) := null; +begin +c1:=c1||'#COLUMN_VALUE#'; + +c2:=c2||'#COLUMN_VALUE#'; + +c3 := null; +c4 := null; +wwv_flow_api.create_row_template ( + p_id=> 4843205265414914 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_row_template_name=> 'Standard, Alternating Row Colors', + p_row_template1=> c1, + p_row_template_condition1=> '', + p_row_template2=> c2, + p_row_template_condition2=> '', + p_row_template3=> c3, + p_row_template_condition3=> '', + p_row_template4=> c4, + p_row_template_condition4=> '', + p_row_template_before_rows=>'#TOP_PAGINATION#'||chr(10)|| +''||chr(10)|| +'#PAGINATION#'||chr(10)|| +'
    '||chr(10)|| +'', + p_row_template_after_rows =>'
    #EXTERNAL_LINK##CSV_LINK#
    ', + p_row_template_table_attr =>'OMIT', + p_row_template_type =>'GENERIC_COLUMNS', + p_column_heading_template=>'#COLUMN_HEADER#', + p_row_template_display_cond1=>'ODD_ROW_NUMBERS', + p_row_template_display_cond2=>'0', + p_row_template_display_cond3=>'0', + p_row_template_display_cond4=>'ODD_ROW_NUMBERS', + p_next_page_template=>'#PAGINATION_NEXT#', + p_previous_page_template=>'#PAGINATION_PREVIOUS#', + p_next_set_template=>'#PAGINATION_NEXT_SET#', + p_previous_set_template=>'#PAGINATION_PREVIOUS_SET#', + p_theme_id => 7, + p_theme_class_id => 5, + p_translate_this_template => 'N', + p_row_template_comment=> ''); +end; +null; + +end; +/ + + +begin + +begin +wwv_flow_api.create_row_template_patch ( + p_id => 4843205265414914 + wwv_flow_api.g_id_offset, + p_row_template_before_first =>'', + p_row_template_after_last =>''||chr(10)|| +''); +exception when others then null; +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/report/two_column_portlet +prompt ......report template 4843314147414914 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + c4 varchar2(32767) := null; +begin +c1:=c1||'
    '||chr(10)|| +'
    #1#
    '||chr(10)|| +'
    #2#
    '||chr(10)|| +'
    '; + +c2 := null; +c3 := null; +c4 := null; +wwv_flow_api.create_row_template ( + p_id=> 4843314147414914 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_row_template_name=> 'Two Column Portlet', + p_row_template1=> c1, + p_row_template_condition1=> '', + p_row_template2=> c2, + p_row_template_condition2=> '', + p_row_template3=> c3, + p_row_template_condition3=> '', + p_row_template4=> c4, + p_row_template_condition4=> '', + p_row_template_before_rows=>'
    ', + p_row_template_after_rows =>'
    ', + p_row_template_table_attr =>'', + p_row_template_type =>'NAMED_COLUMNS', + p_column_heading_template=>'', + p_row_template_display_cond1=>'0', + p_row_template_display_cond2=>'0', + p_row_template_display_cond3=>'0', + p_row_template_display_cond4=>'0', + p_theme_id => 7, + p_theme_class_id => 7, + p_translate_this_template => 'N', + p_row_template_comment=> ''); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/report/value_attribute_pairs_div +prompt ......report template 4843416487414914 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + c4 varchar2(32767) := null; +begin +c1:=c1||'
    '||chr(10)|| +'
    #COLUMN_HEADER#
    '||chr(10)|| +'
    #COLUMN_VALUE#
    '||chr(10)|| +'
    '; + +c2 := null; +c3 := null; +c4 := null; +wwv_flow_api.create_row_template ( + p_id=> 4843416487414914 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_row_template_name=> 'Value Attribute Pairs - Div', + p_row_template1=> c1, + p_row_template_condition1=> '', + p_row_template2=> c2, + p_row_template_condition2=> '', + p_row_template3=> c3, + p_row_template_condition3=> '', + p_row_template4=> c4, + p_row_template_condition4=> '', + p_row_template_before_rows=>'
    ', + p_row_template_after_rows =>'
    ', + p_row_template_table_attr =>'', + p_row_template_type =>'GENERIC_COLUMNS', + p_column_heading_template=>'', + p_row_template_display_cond1=>'0', + p_row_template_display_cond2=>'0', + p_row_template_display_cond3=>'0', + p_row_template_display_cond4=>'0', + p_theme_id => 7, + p_theme_class_id => 6, + p_translate_this_template => 'N', + p_row_template_comment=> ''); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/report/value_attribute_pairs_table +prompt ......report template 4843512470414914 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + c4 varchar2(32767) := null; +begin +c1:=c1||'#COLUMN_HEADER##COLUMN_VALUE#'; + +c2 := null; +c3 := null; +c4 := null; +wwv_flow_api.create_row_template ( + p_id=> 4843512470414914 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_row_template_name=> 'Value Attribute Pairs - Table', + p_row_template1=> c1, + p_row_template_condition1=> '', + p_row_template2=> c2, + p_row_template_condition2=> '', + p_row_template3=> c3, + p_row_template_condition3=> '', + p_row_template4=> c4, + p_row_template_condition4=> '', + p_row_template_before_rows=>'#TOP_PAGINATION##PAGINATION#
    ', + p_row_template_after_rows =>'
    #EXTERNAL_LINK##CSV_LINK#
    ', + p_row_template_table_attr =>'', + p_row_template_type =>'GENERIC_COLUMNS', + p_column_heading_template=>'', + p_row_template_display_cond1=>'0', + p_row_template_display_cond2=>'0', + p_row_template_display_cond3=>'0', + p_row_template_display_cond4=>'0', + p_next_page_template=>'#PAGINATION_NEXT#', + p_previous_page_template=>'#PAGINATION_PREVIOUS#', + p_next_set_template=>'#PAGINATION_NEXT_SET#', + p_previous_set_template=>'#PAGINATION_PREVIOUS_SET#', + p_theme_id => 7, + p_theme_class_id => 6, + p_translate_this_template => 'N', + p_row_template_comment=> ''); +end; +null; + +end; +/ + +prompt ...label templates +-- +--application/shared_components/user_interface/templates/label/no_label +prompt ......label template 4843631236414915 + +begin + +begin +wwv_flow_api.create_field_template ( + p_id=> 4843631236414915 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_template_name=>'No Label', + p_template_body1=>'', + p_template_body2=>'', + p_on_error_before_label=>'
    ', + p_on_error_after_label=>'
    #ERROR_MESSAGE#
    ', + p_theme_id => 7, + p_theme_class_id => 13, + p_translate_this_template=> 'N', + p_template_comment=> ''); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/label/optional +prompt ......label template 4843706770414915 + +begin + +begin +wwv_flow_api.create_field_template ( + p_id=> 4843706770414915 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_template_name=>'Optional', + p_template_body1=>'', + p_on_error_before_label=>'
    ', + p_on_error_after_label=>'
    #ERROR_MESSAGE#
    ', + p_theme_id => 7, + p_theme_class_id => 3, + p_translate_this_template=> 'N', + p_template_comment=> ''); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/label/optional_with_help +prompt ......label template 4843803724414915 + +begin + +begin +wwv_flow_api.create_field_template ( + p_id=> 4843803724414915 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_template_name=>'Optional with help', + p_template_body1=>'', + p_on_error_before_label=>'
    ', + p_on_error_after_label=>'
    #ERROR_MESSAGE#
    ', + p_theme_id => 7, + p_theme_class_id => 1, + p_translate_this_template=> 'N', + p_template_comment=> ''); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/label/required +prompt ......label template 4843906688414915 + +begin + +begin +wwv_flow_api.create_field_template ( + p_id=> 4843906688414915 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_template_name=>'Required', + p_template_body1=>'', + p_on_error_before_label=>'
    ', + p_on_error_after_label=>'
    #ERROR_MESSAGE#
    ', + p_theme_id => 7, + p_theme_class_id => 4, + p_translate_this_template=> 'N', + p_template_comment=> ''); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/label/required_with_help +prompt ......label template 4844030761414915 + +begin + +begin +wwv_flow_api.create_field_template ( + p_id=> 4844030761414915 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_template_name=>'Required with help', + p_template_body1=>'', + p_on_error_before_label=>'
    ', + p_on_error_after_label=>'
    #ERROR_MESSAGE#
    ', + p_theme_id => 7, + p_theme_class_id => 2, + p_translate_this_template=> 'N', + p_template_comment=> ''); +end; +null; + +end; +/ + +prompt ...breadcrumb templates +-- +--application/shared_components/user_interface/templates/breadcrumb/breadcrumb_menu +prompt ......template 4844109108414915 + +begin + +begin +wwv_flow_api.create_menu_template ( + p_id=> 4844109108414915 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_name=>'Breadcrumb Menu', + p_before_first=>'
    ', + p_max_levels=>12, + p_start_with_node=>'PARENT_TO_LEAF', + p_theme_id => 7, + p_theme_class_id => 1, + p_translate_this_template => 'N', + p_template_comments=>''); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/breadcrumb/hierarchical_menu +prompt ......template 4844228117414915 + +begin + +begin +wwv_flow_api.create_menu_template ( + p_id=> 4844228117414915 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_name=>'Hierarchical Menu', + p_before_first=>'
      ', + p_current_page_option=>'
    • #NAME#
    • ', + p_non_current_page_option=>'
    • #NAME#
    • ', + p_menu_link_attributes=>'', + p_between_levels=>'', + p_after_last=>'
    ', + p_max_levels=>11, + p_start_with_node=>'CHILD_MENU', + p_theme_id => 7, + p_theme_class_id => 2, + p_translate_this_template => 'N', + p_template_comments=>''); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/popuplov +prompt ...popup list of values templates +-- +prompt ......template 4844920567414917 + +begin + +begin +wwv_flow_api.create_popup_lov_template ( + p_id=> 4844920567414917 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_popup_icon=>'#IMAGE_PREFIX#list_gray.gif', + p_popup_icon_attr=>'width="13" height="13" alt="Popup Lov"', + p_popup_icon2=>'', + p_popup_icon_attr2=>'', + p_page_name=>'winlov', + p_page_title=>'Search Dialog', + p_page_html_head=>''||chr(10)|| +'', + p_page_body_attr=>'onload="first_field()" class="pop-up-lov"', + p_before_field_text=>'
    ', + p_page_heading_text=>'', + p_page_footer_text =>'', + p_filter_width =>'20', + p_filter_max_width =>'100', + p_filter_text_attr =>'', + p_find_button_text =>'Search', + p_find_button_image=>'', + p_find_button_attr =>'', + p_close_button_text=>'Close', + p_close_button_image=>'', + p_close_button_attr=>'', + p_next_button_text =>'Next >', + p_next_button_image=>'', + p_next_button_attr =>'', + p_prev_button_text =>'< Previous', + p_prev_button_image=>'', + p_prev_button_attr =>'', + p_after_field_text=>'
    ', + p_scrollbars=>'1', + p_resizable=>'1', + p_width =>'400', + p_height=>'450', + p_result_row_x_of_y=>'
    Row(s) #FIRST_ROW# - #LAST_ROW#
    ', + p_result_rows_per_pg=>500, + p_before_result_set=>'
    ', + p_theme_id => 7, + p_theme_class_id => 1, + p_translate_this_template => 'N', + p_after_result_set =>'
    '); +end; +null; + +end; +/ + +prompt ...calendar templates +-- +--application/shared_components/user_interface/templates/calendar/calendar +prompt ......template 4844317242414915 + +begin + +begin +wwv_flow_api.create_calendar_template( + p_id=> 4844317242414915 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_cal_template_name=>'Calendar', + p_translate_this_template=> 'N', + p_day_of_week_format=> '#IDAY#', + p_month_title_format=> ' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +''||chr(10)|| +'
    #IMONTH# #YYYY#
    ', + p_month_open_format=> '', + p_month_close_format=> '
    '||chr(10)|| +'', + p_day_title_format=> '
    #DD#
    ', + p_day_open_format=> '', + p_day_close_format=> '', + p_today_open_format=> '', + p_weekend_title_format=> '
    #DD#
    ', + p_weekend_open_format => '', + p_weekend_close_format => '', + p_nonday_title_format => '
    #DD#
    ', + p_nonday_open_format => '', + p_nonday_close_format => '', + p_week_title_format => '', + p_week_open_format => '', + p_week_close_format => ' ', + p_daily_title_format => '', + p_daily_close_format => '', + p_weekly_title_format => '
    #IMONTH# #DD#, #YYYY#
    ', + p_daily_open_format => '
    '||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'', + p_weekly_month_open_format => '
    #WTITLE#
    ', + p_weekly_day_of_week_format => '#IDAY#
    #MM#/#DD#
    ', + p_weekly_month_close_format => '
    ', + p_weekly_day_title_format => '', + p_weekly_day_open_format => '', + p_weekly_day_close_format => '
    ', + p_weekly_today_open_format => '', + p_weekly_weekend_title_format => '', + p_weekly_weekend_open_format => '', + p_weekly_weekend_close_format => '
    ', + p_weekly_time_open_format => '', + p_weekly_time_close_format => '
    ', + p_weekly_time_title_format => '#TIME#', + p_weekly_hour_open_format => '', + p_weekly_hour_close_format => '', + p_daily_day_of_week_format => '#IDAY# #DD#/#MM#', + p_daily_month_title_format => '
    #IMONTH# #DD#, #YYYY#
    '||chr(10)|| +'', + p_daily_month_open_format => '', + p_daily_month_close_format => '
    ', + p_daily_day_title_format => '', + p_daily_day_open_format => '', + p_daily_day_close_format => '
    ', + p_daily_today_open_format => '', + p_daily_time_open_format => '', + p_daily_time_close_format => '
    ', + p_daily_time_title_format => '#TIME#', + p_daily_hour_open_format => '', + p_daily_hour_close_format => '', + p_cust_month_title_format => ' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' ', + p_cust_month_open_format => '
    #WTITLE#
    ', + p_cust_day_of_week_format => '#IDAY#
    ', + p_cust_month_close_format => '
    '||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'', + p_cust_week_title_format => '', + p_cust_week_open_format => '', + p_cust_week_close_format => ' ', + p_cust_day_title_format => '
    #DD#
    ', + p_cust_day_open_format => '', + p_cust_day_close_format => '', + p_cust_today_open_format => '', + p_cust_daily_title_format => '', + p_cust_daily_open_format => '', + p_cust_daily_close_format => '', + p_cust_nonday_title_format => '
    #DD#
    ', + p_cust_nonday_open_format => '', + p_cust_nonday_close_format => '', + p_cust_weekend_title_format => '
    #DD#
    ', + p_cust_weekend_open_format => '', + p_cust_weekend_close_format => '', + p_cust_hour_open_format => '', + p_cust_hour_close_format => '', + p_cust_time_title_format => '#TIME#', + p_cust_time_open_format => '', + p_cust_time_close_format => '
    ', + p_cust_wk_month_title_format => ''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'', + p_cust_wk_month_open_format => '
    #WTITLE#
    ', + p_cust_wk_day_of_week_format => '#IDAY#
    #MM#/#DD#
    ', + p_cust_wk_month_close_format => '
    ', + p_cust_wk_week_title_format => '', + p_cust_wk_week_open_format => '', + p_cust_wk_week_close_format => '', + p_cust_wk_day_title_format => '', + p_cust_wk_day_open_format => '', + p_cust_wk_day_close_format => '
    ', + p_cust_wk_today_open_format => '', + p_cust_wk_weekend_title_format => '', + p_cust_wk_weekend_open_format => '', + p_cust_wk_weekend_close_format => '
    ', + p_cust_month_day_height_pix => '75', + p_cust_month_day_height_per => '', + p_cust_week_day_width_pix => '', + p_cust_week_day_width_per => '14', + p_theme_id => 7, + p_theme_class_id => 1, + p_reference_id=> null); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/calendar/calendar_alternative_1 +prompt ......template 4844531208414916 + +begin + +begin +wwv_flow_api.create_calendar_template( + p_id=> 4844531208414916 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_cal_template_name=>'Calendar, Alternative 1', + p_translate_this_template=> 'N', + p_day_of_week_format=> '#IDAY#', + p_month_title_format=> ' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +''||chr(10)|| +'
    #IMONTH# #YYYY#
    ', + p_month_open_format=> '', + p_month_close_format=> '
    '||chr(10)|| +'', + p_day_title_format=> '
    #DD#
    ', + p_day_open_format=> '', + p_day_close_format=> '', + p_today_open_format=> '', + p_weekend_title_format=> '
    #DD#
    ', + p_weekend_open_format => '', + p_weekend_close_format => '', + p_nonday_title_format => '
    #DD#
    ', + p_nonday_open_format => '', + p_nonday_close_format => '', + p_week_title_format => '', + p_week_open_format => '', + p_week_close_format => ' ', + p_daily_title_format => '', + p_daily_close_format => '', + p_weekly_title_format => '
    #IMONTH# #DD#, #YYYY#
    ', + p_daily_open_format => '
    '||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'', + p_weekly_month_open_format => '
    #WTITLE#
    ', + p_weekly_day_of_week_format => '#IDAY#
    #MM#/#DD#
    ', + p_weekly_month_close_format => '
    ', + p_weekly_day_title_format => '', + p_weekly_day_open_format => '', + p_weekly_day_close_format => '
    ', + p_weekly_today_open_format => '', + p_weekly_weekend_title_format => '', + p_weekly_weekend_open_format => '', + p_weekly_weekend_close_format => '
    ', + p_weekly_time_open_format => '', + p_weekly_time_close_format => '
    ', + p_weekly_time_title_format => '#TIME#', + p_weekly_hour_open_format => '', + p_weekly_hour_close_format => '', + p_daily_day_of_week_format => '#IDAY# #DD#/#MM#', + p_daily_month_title_format => '
    #IMONTH# #DD#, #YYYY#
    '||chr(10)|| +'', + p_daily_month_open_format => '', + p_daily_month_close_format => '
    ', + p_daily_day_title_format => '', + p_daily_day_open_format => '', + p_daily_day_close_format => '
    ', + p_daily_today_open_format => '', + p_daily_time_open_format => '', + p_daily_time_close_format => '
    ', + p_daily_time_title_format => '#TIME#', + p_daily_hour_open_format => '', + p_daily_hour_close_format => '', + p_cust_month_title_format => ' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' ', + p_cust_month_open_format => '
    #WTITLE#
    ', + p_cust_day_of_week_format => '#IDAY#
    '||chr(10)|| +'', + p_cust_month_close_format => '
    '||chr(10)|| +''||chr(10)|| +'', + p_cust_week_title_format => '', + p_cust_week_open_format => '', + p_cust_week_close_format => '', + p_cust_day_title_format => '
    #DD#
    ', + p_cust_day_open_format => '', + p_cust_day_close_format => '', + p_cust_today_open_format => '', + p_cust_daily_title_format => '', + p_cust_daily_open_format => '', + p_cust_daily_close_format => '', + p_cust_nonday_title_format => '
    #DD#
    ', + p_cust_nonday_open_format => '', + p_cust_nonday_close_format => '', + p_cust_weekend_title_format => '
    #DD#
    ', + p_cust_weekend_open_format => '', + p_cust_weekend_close_format => '', + p_cust_hour_open_format => '', + p_cust_hour_close_format => '', + p_cust_time_title_format => '#TIME#', + p_cust_time_open_format => '', + p_cust_time_close_format => '
    ', + p_cust_wk_month_title_format => ''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'', + p_cust_wk_month_open_format => '
    #WTITLE#
    ', + p_cust_wk_day_of_week_format => '#IDAY#
    #MM#/#DD#
    '||chr(10)|| +'', + p_cust_wk_month_close_format => '
    ', + p_cust_wk_week_title_format => '', + p_cust_wk_week_open_format => '', + p_cust_wk_week_close_format => '', + p_cust_wk_day_title_format => '', + p_cust_wk_day_open_format => '', + p_cust_wk_day_close_format => '
    ', + p_cust_wk_today_open_format => '', + p_cust_wk_weekend_title_format => '', + p_cust_wk_weekend_open_format => '', + p_cust_wk_weekend_close_format => '
    ', + p_cust_month_day_height_pix => '100', + p_cust_month_day_height_per => '', + p_cust_week_day_width_pix => '100', + p_cust_week_day_width_per => '', + p_theme_id => 7, + p_theme_class_id => 2, + p_reference_id=> null); +end; +null; + +end; +/ + +--application/shared_components/user_interface/templates/calendar/small_calendar +prompt ......template 4844722889414916 + +begin + +begin +wwv_flow_api.create_calendar_template( + p_id=> 4844722889414916 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_cal_template_name=>'Small Calendar', + p_translate_this_template=> 'N', + p_day_of_week_format=> '#DY#', + p_month_title_format=> ' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +''||chr(10)|| +'
    #IMONTH# #YYYY#
    ', + p_month_open_format=> '', + p_month_close_format=> '
    ', + p_day_title_format=> '
    #DD#
    ', + p_day_open_format=> '', + p_day_close_format=> '', + p_today_open_format=> '', + p_weekend_title_format=> '
    #DD#
    ', + p_weekend_open_format => '', + p_weekend_close_format => '', + p_nonday_title_format => '
    #DD#
    ', + p_nonday_open_format => '', + p_nonday_close_format => '', + p_week_title_format => '', + p_week_open_format => '', + p_week_close_format => ' ', + p_daily_title_format => '', + p_daily_close_format => '', + p_weekly_title_format => '
    #IMONTH# #DD#, #YYYY#
    ', + p_daily_open_format => '
    '||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'', + p_weekly_month_open_format => '
    #WTITLE#
    ', + p_weekly_day_of_week_format => '#DY#
    #MM#/#DD#
    ', + p_weekly_month_close_format => '
    ', + p_weekly_day_title_format => '', + p_weekly_day_open_format => '
    ', + p_weekly_day_close_format => '
    ', + p_weekly_today_open_format => '
    ', + p_weekly_weekend_title_format => '', + p_weekly_weekend_open_format => '
    ', + p_weekly_weekend_close_format => '
    ', + p_weekly_time_open_format => '', + p_weekly_time_close_format => '
    ', + p_weekly_time_title_format => '#TIME#', + p_weekly_hour_open_format => '', + p_weekly_hour_close_format => '', + p_daily_day_of_week_format => '#DY# #DD#/#MM#', + p_daily_month_title_format => '
    #IMONTH# #DD#, #YYYY#
    '||chr(10)|| +'', + p_daily_month_open_format => '', + p_daily_month_close_format => '
    ', + p_daily_day_title_format => '', + p_daily_day_open_format => '', + p_daily_day_close_format => '
    ', + p_daily_today_open_format => '', + p_daily_time_open_format => '', + p_daily_time_close_format => '
    ', + p_daily_time_title_format => '#TIME#', + p_daily_hour_open_format => '', + p_daily_hour_close_format => '', + p_cust_month_title_format => ' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' '||chr(10)|| +' ', + p_cust_month_open_format => '
    #WTITLE#
    ', + p_cust_day_of_week_format => '#DY#
    ', + p_cust_month_close_format => '
    '||chr(10)|| +''||chr(10)|| +'', + p_cust_week_title_format => '', + p_cust_week_open_format => '', + p_cust_week_close_format => '', + p_cust_day_title_format => '
    #DD#
    ', + p_cust_day_open_format => '', + p_cust_day_close_format => '', + p_cust_today_open_format => '', + p_cust_daily_title_format => '', + p_cust_daily_open_format => '', + p_cust_daily_close_format => '', + p_cust_nonday_title_format => '
    #DD#
    ', + p_cust_nonday_open_format => '', + p_cust_nonday_close_format => '', + p_cust_weekend_title_format => '
    #DD#
    ', + p_cust_weekend_open_format => '', + p_cust_weekend_close_format => '', + p_cust_hour_open_format => '', + p_cust_hour_close_format => '', + p_cust_time_title_format => '#TIME#', + p_cust_time_open_format => '', + p_cust_time_close_format => '
    ', + p_cust_wk_month_title_format => ''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'', + p_cust_wk_month_open_format => '
    #WTITLE#
    ', + p_cust_wk_day_of_week_format => '#DY#
    #MM#/#DD#
    ', + p_cust_wk_month_close_format => '
    '||chr(10)|| +''||chr(10)|| +'', + p_cust_wk_week_title_format => '', + p_cust_wk_week_open_format => '', + p_cust_wk_week_close_format => '', + p_cust_wk_day_title_format => '', + p_cust_wk_day_open_format => '', + p_cust_wk_day_close_format => '
    ', + p_cust_wk_today_open_format => '', + p_cust_wk_weekend_title_format => '', + p_cust_wk_weekend_open_format => '', + p_cust_wk_weekend_close_format => '
    ', + p_cust_month_day_height_pix => '14', + p_cust_month_day_height_per => '14', + p_cust_week_day_width_pix => '40', + p_cust_week_day_width_per => '14', + p_theme_id => 7, + p_theme_class_id => 3, + p_reference_id=> null); +end; +null; + +end; +/ + +prompt ...application themes +-- +--application/shared_components/user_interface/themes/modern_blue +prompt ......theme 4845000128414917 +begin +wwv_flow_api.create_theme ( + p_id =>4845000128414917 + wwv_flow_api.g_id_offset, + p_flow_id =>wwv_flow.g_flow_id, + p_theme_id => 7, + p_theme_name=>'Modern Blue', + p_default_page_template=>4837525507414910 + wwv_flow_api.g_id_offset, + p_error_template=>4837131094414910 + wwv_flow_api.g_id_offset, + p_printer_friendly_template=>4837724123414910 + wwv_flow_api.g_id_offset, + p_breadcrumb_display_point=>'REGION_POSITION_01', + p_sidebar_display_point=>'REGION_POSITION_02', + p_login_template=>4836711590414909 + wwv_flow_api.g_id_offset, + p_default_button_template=>4838226535414911 + wwv_flow_api.g_id_offset, + p_default_region_template=>4840201642414912 + wwv_flow_api.g_id_offset, + p_default_chart_template =>4839217975414912 + wwv_flow_api.g_id_offset, + p_default_form_template =>4839304121414912 + wwv_flow_api.g_id_offset, + p_default_reportr_template =>4840201642414912 + wwv_flow_api.g_id_offset, + p_default_tabform_template=>4840201642414912 + wwv_flow_api.g_id_offset, + p_default_wizard_template=>4840913627414912 + wwv_flow_api.g_id_offset, + p_default_menur_template=>4838801336414912 + wwv_flow_api.g_id_offset, + p_default_listr_template=>4839116402414912 + wwv_flow_api.g_id_offset, + p_default_irr_template=>4839831975414912 + wwv_flow_api.g_id_offset, + p_default_report_template =>4843113555414914 + wwv_flow_api.g_id_offset, + p_default_label_template=>4843803724414915 + wwv_flow_api.g_id_offset, + p_default_menu_template=>4844109108414915 + wwv_flow_api.g_id_offset, + p_default_calendar_template=>4844317242414915 + wwv_flow_api.g_id_offset, + p_default_list_template=>4842217442414913 + wwv_flow_api.g_id_offset, + p_default_option_label=>4843803724414915 + wwv_flow_api.g_id_offset, + p_default_required_label=>4844030761414915 + wwv_flow_api.g_id_offset); +end; +/ + +prompt ...build options used by application 700 +-- + +begin + +null; + +end; +/ + +--application/shared_components/globalization/messages +prompt ...messages used by application: 700 +-- +--application/shared_components/globalization/dyntranslations +prompt ...dynamic translations used by application: 700 +-- +--application/shared_components/globalization/language +prompt ...Language Maps for Application 700 +-- + +begin + +null; + +end; +/ + +prompt ...Shortcuts +-- +prompt ...web services (9iR2 or better) +-- +prompt ...shared queries +-- +prompt ...report layouts +-- +prompt ...authentication schemes +-- +--application/shared_components/security/authentication/application_express +prompt ......scheme 4845116734414920 + +begin + +declare + s1 varchar2(32767) := null; + s2 varchar2(32767) := null; + s3 varchar2(32767) := null; + s4 varchar2(32767) := null; + s5 varchar2(32767) := null; +begin +s1 := null; +s2 := null; +s3 := null; +s4:=s4||'-BUILTIN-'; + +s5 := null; +wwv_flow_api.create_auth_setup ( + p_id=> 4845116734414920 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_name=> 'Application Express', + p_description=>'Use internal Application Express account credentials and login page in this application.', + p_page_sentry_function=> s1, + p_sess_verify_function=> s2, + p_pre_auth_process=> s3, + p_auth_function=> s4, + p_post_auth_process=> s5, + p_invalid_session_page=>'101', + p_invalid_session_url=>'', + p_cookie_name=>'', + p_cookie_path=>'', + p_cookie_domain=>'', + p_use_secure_cookie_yn=>'', + p_ldap_host=>'', + p_ldap_port=>'', + p_ldap_string=>'', + p_attribute_01=>'', + p_attribute_02=>'wwv_flow_custom_auth_std.logout?p_this_flow=&APP_ID.&p_next_flow_page_sess=&APP_ID.:1', + p_attribute_03=>'', + p_attribute_04=>'', + p_attribute_05=>'', + p_attribute_06=>'', + p_attribute_07=>'', + p_attribute_08=>'', + p_required_patch => null + wwv_flow_api.g_id_offset); +end; +null; + +end; +/ + +--application/shared_components/security/authentication/database +prompt ......scheme 4845226213414920 + +begin + +declare + s1 varchar2(32767) := null; + s2 varchar2(32767) := null; + s3 varchar2(32767) := null; + s4 varchar2(32767) := null; + s5 varchar2(32767) := null; +begin +s1:=s1||'-DATABASE-'; + +s2 := null; +s3 := null; +s4 := null; +s5 := null; +wwv_flow_api.create_auth_setup ( + p_id=> 4845226213414920 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_name=> 'DATABASE', + p_description=>'Use database authentication (user identified by DAD).', + p_page_sentry_function=> s1, + p_sess_verify_function=> s2, + p_pre_auth_process=> s3, + p_auth_function=> s4, + p_post_auth_process=> s5, + p_invalid_session_page=>'', + p_invalid_session_url=>'', + p_cookie_name=>'', + p_cookie_path=>'', + p_cookie_domain=>'', + p_use_secure_cookie_yn=>'', + p_ldap_host=>'', + p_ldap_port=>'', + p_ldap_string=>'', + p_attribute_01=>'', + p_attribute_02=>'', + p_attribute_03=>'', + p_attribute_04=>'', + p_attribute_05=>'', + p_attribute_06=>'', + p_attribute_07=>'', + p_attribute_08=>'', + p_required_patch => null + wwv_flow_api.g_id_offset); +end; +null; + +end; +/ + +--application/shared_components/security/authentication/database_account +prompt ......scheme 4845319779414920 + +begin + +declare + s1 varchar2(32767) := null; + s2 varchar2(32767) := null; + s3 varchar2(32767) := null; + s4 varchar2(32767) := null; + s5 varchar2(32767) := null; +begin +s1 := null; +s2 := null; +s3 := null; +s4:=s4||'return false; end;--'; + +s5 := null; +wwv_flow_api.create_auth_setup ( + p_id=> 4845319779414920 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_name=> 'DATABASE ACCOUNT', + p_description=>'Use database account credentials.', + p_page_sentry_function=> s1, + p_sess_verify_function=> s2, + p_pre_auth_process=> s3, + p_auth_function=> s4, + p_post_auth_process=> s5, + p_invalid_session_page=>'101', + p_invalid_session_url=>'', + p_cookie_name=>'', + p_cookie_path=>'', + p_cookie_domain=>'', + p_use_secure_cookie_yn=>'', + p_ldap_host=>'', + p_ldap_port=>'', + p_ldap_string=>'', + p_attribute_01=>'', + p_attribute_02=>'wwv_flow_custom_auth_std.logout?p_this_flow=&APP_ID.&p_next_flow_page_sess=&APP_ID.:1', + p_attribute_03=>'', + p_attribute_04=>'', + p_attribute_05=>'', + p_attribute_06=>'', + p_attribute_07=>'', + p_attribute_08=>'', + p_required_patch => null + wwv_flow_api.g_id_offset); +end; +null; + +end; +/ + +prompt ...plugins +-- +--application/end_environment +commit; +commit; +begin +execute immediate 'begin dbms_session.set_nls( param => ''NLS_NUMERIC_CHARACTERS'', value => '''''''' || replace(wwv_flow_api.g_nls_numeric_chars,'''''''','''''''''''') || ''''''''); end;'; +end; +/ +set verify on +set feedback on +prompt ...done diff --git a/src/gui/wt_test_runs_gui_tree.vw b/src/gui/wt_test_runs_gui_tree.vw new file mode 100644 index 0000000..9aa6aa2 --- /dev/null +++ b/src/gui/wt_test_runs_gui_tree.vw @@ -0,0 +1,52 @@ + +create or replace view wt_test_runs_gui_tree as +with q_root as ( +select 0 ID + ,NULL PARENT_ID + ,'Text Runner IDs' TEXT + from dual +), q_owners as ( +select 0 - min(id) ID + ,0 PARENT_ID + ,runner_owner TEXT + ,runner_owner + from wt_test_runs + group by runner_owner +), q_runners as ( +select (select min(id) from q_owners) - + min(r.id) ID + ,o.id PARENT_ID + ,r.runner_name TEXT + ,r.runner_owner + ,r.runner_name + from wt_test_runs r + join q_owners o + on o.text = r.runner_owner + group by o.id + ,r.runner_name + ,r.runner_owner +), q_run_ids as ( +select i.id ID + ,r.id PARENT_ID + ,to_char(i.start_dtm,'YYYY/MM/DD HH24:MI:SS') + TEXT + ,i.runner_owner + ,i.runner_name + from wt_test_runs i + join q_runners r + on r.runner_owner = i.runner_owner + and r.runner_name = i.runner_name +), q_main as ( +select id, parent_id, text from q_root +union all +select id, parent_id, text from q_owners +union all +select id, parent_id, text from q_runners +union all +select id, parent_id, text from q_run_ids +) +--select * from q_root; +--select * from q_owners; +--select * from q_runners; +--select * from q_run_ids; +select * from q_main; From d958bb617a87a43f35664b33ae1ae42ca898d183 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Sun, 8 Jul 2018 01:20:26 -0500 Subject: [PATCH 003/141] Most of GUI Complete --- src/core/wtplsql.pkb | 2 +- src/gui/Notes.txt | 7 + src/gui/f700.sql | 2760 +++++++++++++++++++++++++++++++++++++----- 3 files changed, 2449 insertions(+), 320 deletions(-) diff --git a/src/core/wtplsql.pkb b/src/core/wtplsql.pkb index 60b7a50..80cc423 100644 --- a/src/core/wtplsql.pkb +++ b/src/core/wtplsql.pkb @@ -286,7 +286,7 @@ begin g_test_runs_rec := l_test_runs_rec_NULL; g_test_runs_rec.id := wt_test_runs_seq.nextval; g_test_runs_rec.start_dtm := systimestamp; - g_test_runs_rec.runner_owner := USER; + g_test_runs_rec.runner_owner := SYS_CONTEXT('USERENV', 'CURRENT_USER'); g_test_runs_rec.runner_name := in_package_name; g_test_runs_rec.error_message := ''; check_runner; diff --git a/src/gui/Notes.txt b/src/gui/Notes.txt index ffe46d0..c73e3e8 100644 --- a/src/gui/Notes.txt +++ b/src/gui/Notes.txt @@ -163,6 +163,13 @@ DBOUTs are not global either. * HTML Region Sequence 20 Column 1 * Code Coverage Details (Optional, HTML Text) + + + +Need a TEST_ALL + +Fix PLSQL Jobs Anonymous + * Test Case Page (Single Test Run ID, Single Test Case) * Page Template Body 1 diff --git a/src/gui/f700.sql b/src/gui/f700.sql index 192a11e..4183978 100644 --- a/src/gui/f700.sql +++ b/src/gui/f700.sql @@ -13,7 +13,7 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Application Export: -- Application: 700 -- Name: wtPLSQL Core GUI --- Date and Time: 03:27 Saturday July 7, 2018 +-- Date and Time: 00:54 Sunday July 8, 2018 -- Exported By: WTP -- Flashback: 0 -- Export Type: Application Export @@ -26,12 +26,12 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Application Statistics: -- Pages: 6 --- Items: 31 +-- Items: 36 -- Computations: 0 -- Validations: 0 --- Processes: 9 --- Regions: 27 --- Buttons: 0 +-- Processes: 12 +-- Regions: 35 +-- Buttons: 3 -- Dynamic Actions: 2 -- Shared Components -- Breadcrumbs: 1 @@ -49,7 +49,7 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Templates: -- Page: 15 -- List: 15 --- Report: 10 +-- Report: 11 -- Label: 5 -- Region: 25 -- Messages: 0 @@ -146,7 +146,7 @@ wwv_flow_api.create_flow( p_default_region_template=> 4840201642414912 + wwv_flow_api.g_id_offset, p_error_template=> 4837131094414910 + wwv_flow_api.g_id_offset, p_page_protection_enabled_y_n=> 'Y', - p_checksum_salt_last_reset => '20180707032706', + p_checksum_salt_last_reset => '20180708005437', p_max_session_length_sec=> 28800, p_home_link=> 'f?p=&APP_ID.:1:&SESSION.', p_flow_language=> 'en', @@ -192,7 +192,7 @@ wwv_flow_api.create_flow( p_default_listr_template => 4839116402414912 + wwv_flow_api.g_id_offset, p_default_irr_template => 4839831975414912 + wwv_flow_api.g_id_offset, p_last_updated_by => 'WTP', - p_last_upd_yyyymmddhh24miss=> '20180707032706', + p_last_upd_yyyymmddhh24miss=> '20180708005437', p_required_roles=> wwv_flow_utilities.string_to_table2('')); @@ -389,6 +389,181 @@ end; prompt ...Shared Lists of values -- +--application/shared_components/user_interface/lov/p3_report_row_per_page + +begin + +wwv_flow_api.create_list_of_values ( + p_id => 4952509356578433 + wwv_flow_api.g_id_offset, + p_flow_id => wwv_flow.g_flow_id, + p_lov_name => 'P3_Report Row Per Page', + p_lov_query=> '.'||to_char(4952509356578433 + wwv_flow_api.g_id_offset)||'.'); + +null; + +end; +/ + + +begin + +wwv_flow_api.create_static_lov_data ( + p_id=>4952816929578434 + wwv_flow_api.g_id_offset, + p_lov_id=>4952509356578433 + wwv_flow_api.g_id_offset, + p_lov_disp_sequence=>10, + p_lov_disp_value=>'10', + p_lov_return_value=>'10', + p_lov_data_comment=> ''); + +null; + +end; +/ + + +begin + +wwv_flow_api.create_static_lov_data ( + p_id=>4953007560578434 + wwv_flow_api.g_id_offset, + p_lov_id=>4952509356578433 + wwv_flow_api.g_id_offset, + p_lov_disp_sequence=>20, + p_lov_disp_value=>'15', + p_lov_return_value=>'15', + p_lov_data_comment=> ''); + +null; + +end; +/ + + +begin + +wwv_flow_api.create_static_lov_data ( + p_id=>4953224813578435 + wwv_flow_api.g_id_offset, + p_lov_id=>4952509356578433 + wwv_flow_api.g_id_offset, + p_lov_disp_sequence=>30, + p_lov_disp_value=>'20', + p_lov_return_value=>'20', + p_lov_data_comment=> ''); + +null; + +end; +/ + + +begin + +wwv_flow_api.create_static_lov_data ( + p_id=>4953425086578435 + wwv_flow_api.g_id_offset, + p_lov_id=>4952509356578433 + wwv_flow_api.g_id_offset, + p_lov_disp_sequence=>40, + p_lov_disp_value=>'30', + p_lov_return_value=>'30', + p_lov_data_comment=> ''); + +null; + +end; +/ + + +begin + +wwv_flow_api.create_static_lov_data ( + p_id=>4953605022578435 + wwv_flow_api.g_id_offset, + p_lov_id=>4952509356578433 + wwv_flow_api.g_id_offset, + p_lov_disp_sequence=>50, + p_lov_disp_value=>'50', + p_lov_return_value=>'50', + p_lov_data_comment=> ''); + +null; + +end; +/ + + +begin + +wwv_flow_api.create_static_lov_data ( + p_id=>4953800039578435 + wwv_flow_api.g_id_offset, + p_lov_id=>4952509356578433 + wwv_flow_api.g_id_offset, + p_lov_disp_sequence=>60, + p_lov_disp_value=>'100', + p_lov_return_value=>'100', + p_lov_data_comment=> ''); + +null; + +end; +/ + + +begin + +wwv_flow_api.create_static_lov_data ( + p_id=>4954011164578435 + wwv_flow_api.g_id_offset, + p_lov_id=>4952509356578433 + wwv_flow_api.g_id_offset, + p_lov_disp_sequence=>70, + p_lov_disp_value=>'200', + p_lov_return_value=>'200', + p_lov_data_comment=> ''); + +null; + +end; +/ + + +begin + +wwv_flow_api.create_static_lov_data ( + p_id=>4954208134578435 + wwv_flow_api.g_id_offset, + p_lov_id=>4952509356578433 + wwv_flow_api.g_id_offset, + p_lov_disp_sequence=>80, + p_lov_disp_value=>'500', + p_lov_return_value=>'500', + p_lov_data_comment=> ''); + +null; + +end; +/ + + +begin + +wwv_flow_api.create_static_lov_data ( + p_id=>4954416221578435 + wwv_flow_api.g_id_offset, + p_lov_id=>4952509356578433 + wwv_flow_api.g_id_offset, + p_lov_disp_sequence=>90, + p_lov_disp_value=>'1000', + p_lov_return_value=>'1000', + p_lov_data_comment=> ''); + +null; + +end; +/ + + +begin + +wwv_flow_api.create_static_lov_data ( + p_id=>4954628322578435 + wwv_flow_api.g_id_offset, + p_lov_id=>4952509356578433 + wwv_flow_api.g_id_offset, + p_lov_disp_sequence=>100, + p_lov_disp_value=>'5000', + p_lov_return_value=>'5000', + p_lov_data_comment=> ''); + +null; + +end; +/ + --application/shared_components/user_interface/lov/y_or_n begin @@ -479,7 +654,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180707015518' + ,p_last_upd_yyyymmddhh24miss => '20180707153059' ); null; @@ -3071,7 +3246,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180706095952' + ,p_last_upd_yyyymmddhh24miss => '20180707124750' ); null; @@ -3088,7 +3263,7 @@ wwv_flow_api.create_page_plug ( p_id=> 4847515458414925 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 2, - p_plug_name=> 'Run Test', + p_plug_name=> 'Run Test:', p_region_name=>'', p_plug_template=> 4838619911414911+ wwv_flow_api.g_id_offset, p_plug_display_sequence=> 1, @@ -3111,12 +3286,13 @@ declare l_clob clob; l_length number := 1; begin -s:=s||'select system_status STATUS'||chr(10)|| +s:=s||'select job JOB_ID'||chr(10)|| ' ,owner'||chr(10)|| -' ,job JOB_ID'||chr(10)|| -' ,status TEST_RUNNER'||chr(10)|| +' ,status DESCRIPTION'||chr(10)|| +' ,system_status STATUS'||chr(10)|| ' ,created CREATED_DATE'||chr(10)|| ' ,system_modified MODIFIED_DATE'||chr(10)|| +' ,enduser'||chr(10)|| ' from apex_plsql_jobs'; wwv_flow_api.create_page_plug ( @@ -3146,12 +3322,13 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select system_status STATUS'||chr(10)|| +a1:=a1||'select job JOB_ID'||chr(10)|| ' ,owner'||chr(10)|| -' ,job JOB_ID'||chr(10)|| -' ,status TEST_RUNNER'||chr(10)|| +' ,status DESCRIPTION'||chr(10)|| +' ,system_status STATUS'||chr(10)|| ' ,created CREATED_DATE'||chr(10)|| ' ,system_modified MODIFIED_DATE'||chr(10)|| +' ,enduser'||chr(10)|| ' from apex_plsql_jobs'; wwv_flow_api.create_worksheet( @@ -3291,16 +3468,16 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 4902120303603523+wwv_flow_api.g_id_offset, + p_id => 4942325417968988+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 2, p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, - p_db_column_name =>'TEST_RUNNER', + p_db_column_name =>'DESCRIPTION', p_display_order =>3, p_group_id =>null+wwv_flow_api.g_id_offset, p_column_identifier =>'F', - p_column_label =>'Test Runner', - p_report_label =>'Test Runner', + p_column_label =>'Description', + p_report_label =>'Description', p_sync_form_label =>'Y', p_display_in_default_rpt =>'Y', p_is_sortable =>'Y', @@ -3441,10 +3618,48 @@ wwv_flow_api.create_worksheet_column( p_help_text =>''); end; / +begin +wwv_flow_api.create_worksheet_column( + p_id => 4944400464160472+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 2, + p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, + p_db_column_name =>'ENDUSER', + p_display_order =>7, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'G', + p_column_label =>'End User', + p_report_label =>'End User', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ declare rc1 varchar2(32767) := null; begin -rc1:=rc1||'JOB_ID:OWNER:TEST_RUNNER:STATUS:CREATED_DATE:MODIFIED_DATE'; +rc1:=rc1||'JOB_ID:OWNER:DESCRIPTION:STATUS:CREATED_DATE:MODIFIED_DATE'; wwv_flow_api.create_worksheet_rpt( p_id => 4886308472128052+wwv_flow_api.g_id_offset, @@ -3469,7 +3684,7 @@ end; / begin wwv_flow_api.create_worksheet_condition( - p_id => 4902300049635451+wwv_flow_api.g_id_offset, + p_id => 4942606979982528+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 2, p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, @@ -3491,10 +3706,28 @@ declare l_length number := 1; begin s:=s||'
    '||chr(10)|| +'

    '||chr(10)|| +'APEX PLSQL Jobs Statuses:'||chr(10)|| +'

    '||chr(10)|| +'
    • '||chr(10)|| +'SUBMITTED indicates the job has been submitted, but has not yet started. The DBMS_JOB does not guarantee immediate starting of jobs.'||chr(10)|| +'
    • '||chr(10)|| +'IN PROGRESS indicates that the DBMS_JOB has started the process.'||chr(10)|| +'
    • '||chr(10)|| +'COMPLETED indicates the job has finished.'||chr(10)|| +'
    • '||chr(10)|| +'BROKEN (sqlcode) sqlerrm indicates there was a'; + +s:=s||' problem in your job that resulted in an error. The SQL code and SQL error message for the error should be included in the system status.'||chr(10)|| +'

    '||chr(10)|| +'Oracle Docs: Application Express Application Builder User''s Guide,'||chr(10)|| +'Running Background PL/SQL
    '||chr(10)|| '
    '||chr(10)|| ''||chr(10)|| 'APEX PLSQL Job Logs:'||chr(10)|| -''; +''; + +s:=s||''; wwv_flow_api.create_page_plug ( p_id=> 4888312946252430 + wwv_flow_api.g_id_offset, @@ -3563,7 +3796,36 @@ end; begin -null; +wwv_flow_api.create_page_button( + p_id => 4936632007346341 + wwv_flow_api.g_id_offset, + p_flow_id => wwv_flow.g_flow_id, + p_flow_step_id => 2, + p_button_sequence=> 10, + p_button_plug_id => 4891414311501831+wwv_flow_api.g_id_offset, + p_button_name => 'PURGE_LOGS', + p_button_image => 'template:'||to_char(4838306817414911+wwv_flow_api.g_id_offset), + p_button_image_alt=> 'Purge Job Logs', + p_button_position=> 'BOTTOM', + p_button_alignment=> 'LEFT', + p_button_redirect_url=> 'javascript:confirmDelete(''Confirm purge of APEX_PLSQL_JOBS older than '' + document.getElementById(''P2_PURGE_DAYS'').value + '' days'', ''PURGE_LOGS'')', + p_button_execute_validations=>'Y', + p_required_patch => null + wwv_flow_api.g_id_offset); + +wwv_flow_api.create_page_button( + p_id => 4943012566012609 + wwv_flow_api.g_id_offset, + p_flow_id => wwv_flow.g_flow_id, + p_flow_step_id => 2, + p_button_sequence=> 20, + p_button_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, + p_button_name => 'P3_RUN_ALL_TESTS', + p_button_image => 'template:'||to_char(4838226535414911+wwv_flow_api.g_id_offset), + p_button_image_alt=> 'Run All Tests', + p_button_position=> 'BOTTOM', + p_button_alignment=> 'LEFT', + p_button_redirect_url=> 'javascript:confirmDelete(''Run all Tests for Owner &APP_USER.'', ''TEST_ALL'')', + p_button_execute_validations=>'Y', + p_required_patch => null + wwv_flow_api.g_id_offset); + end; / @@ -3571,11 +3833,24 @@ end; begin +wwv_flow_api.create_page_branch( + p_id=>4941327317931667 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 2, + p_branch_action=> 'f?p=&APP_ID.:1:&SESSION.::&DEBUG.::P1_OWNER:&APP_USER.&success_msg=#SUCCESS_MSG#', + p_branch_point=> 'AFTER_PROCESSING', + p_branch_type=> 'REDIRECT_URL', + p_branch_sequence=> 10, + p_branch_condition_type=> 'REQUEST_EQUALS_CONDITION', + p_branch_condition=> 'TEST_ALL', + p_save_state_before_branch_yn=>'Y', + p_branch_comment=> 'Created 07-JUL-2018 11:52 by WTP'); + wwv_flow_api.create_page_branch( p_id=>4877001457701994 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_flow_step_id=> 2, - p_branch_action=> 'f?p=&APP_ID.:2:&SESSION.::&DEBUG.:::', + p_branch_action=> 'f?p=&APP_ID.:2:&SESSION.::&DEBUG.:::&success_msg=#SUCCESS_MSG#', p_branch_point=> 'AFTER_PROCESSING', p_branch_type=> 'REDIRECT_URL', p_branch_sequence=> 99, @@ -3651,16 +3926,16 @@ wwv_flow_api.create_page_item( p_id=>4876813883701993 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_flow_step_id=> 2, - p_name=>'P2_CREATE_JOB', + p_name=>'P2_RUN_TEST', p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', p_item_sequence=> 2, p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'NO', - p_item_default=> 'CREATE_JOB', + p_item_default=> 'RUN_TEST', p_prompt=>'Run Test', - p_source=>'CREATE_JOB', + p_source=>'RUN_TEST', p_source_type=> 'STATIC', p_display_as=> 'BUTTON', p_lov_display_null=> 'NO', @@ -3668,7 +3943,6 @@ wwv_flow_api.create_page_item( p_cSize=> null, p_cMaxlength=> 2000, p_cHeight=> null, - p_tag_attributes => 'template:'||to_char(4838226535414911 + wwv_flow_api.g_id_offset), p_begin_on_new_line=> 'NO', p_begin_on_new_field=> 'YES', p_colspan=> 1, @@ -3817,51 +4091,13 @@ wwv_flow_api.create_page_item( p_lov_display_extra=>'YES', p_protection_level => 'N', p_escape_on_http_output => 'Y', - p_attribute_01 => '1', + p_attribute_01 => '0', p_attribute_02 => '999', p_attribute_03 => 'right', p_show_quick_picks=>'N', p_item_comment => ''); -end; -/ - -declare - h varchar2(32767) := null; -begin -wwv_flow_api.create_page_item( - p_id=>4889829698317005 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 2, - p_name=>'P2_PURGE_LOGS', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 4, - p_item_plug_id => 4891414311501831+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'NO', - p_item_default=> 'PURGE_LOGS', - p_prompt=>'Purge Job Logs', - p_source=>'PURGE_LOGS', - p_source_type=> 'STATIC', - p_display_as=> 'BUTTON', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> null, - p_cMaxlength=> 2000, - p_cHeight=> null, - p_begin_on_new_line=> 'NO', - p_begin_on_new_field=> 'NO', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'LEFT', - p_field_alignment=> 'LEFT', - p_is_persistent=> 'N', - p_button_execute_validations=>'Y', - p_item_comment => ''); - - end; / @@ -3954,6 +4190,43 @@ wwv_flow_api.create_page_item( p_item_comment => ''); +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4938219727456401 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 2, + p_name=>'P2_NUM_JOBS_PURGED', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 99, + p_item_plug_id => 4891414311501831+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_HIDDEN', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> null, + p_cMaxlength=> 4000, + p_cHeight=> null, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'NO', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'LEFT', + p_field_alignment=> 'LEFT', + p_is_persistent=> 'Y', + p_attribute_01 => 'N', + p_item_comment => ''); + + end; / @@ -3968,8 +4241,8 @@ begin p:=p||'begin'||chr(10)|| ' :P2_LAST_JOB_ID := apex_plsql_job.submit_process'||chr(10)|| ' (p_sql => ''begin wtplsql.test_run('''''' ||'||chr(10)|| -' :P2_TEST_RUNNER ||''''''); end;'''||chr(10)|| -' ,p_status => substr(:P2_TEST_RUNNER,1,100) );'||chr(10)|| +' :P2_TEST_RUNNER || ''''''); end;'''||chr(10)|| +' ,p_status => substr(''Running '' || :P2_TEST_RUNNER,1,100) );'||chr(10)|| 'end;'; wwv_flow_api.create_page_process( @@ -3979,11 +4252,12 @@ wwv_flow_api.create_page_process( p_process_sequence=> 10, p_process_point=> 'AFTER_SUBMIT', p_process_type=> 'PLSQL', - p_process_name=> 'SUBMIT_PROCESS', + p_process_name=> 'RUN_TEST', p_process_sql_clob => p, - p_process_error_message=> 'Create Job Failed', - p_process_when_button_id=>4876813883701993 + wwv_flow_api.g_id_offset, - p_process_success_message=> 'Create Job was Successful', + p_process_error_message=> 'Failed to submit job (&P2_LAST_JOB_ID.)', + p_process_when=>'RUN_TEST', + p_process_when_type=>'REQUEST_EQUALS_CONDITION', + p_process_success_message=> 'Successful submitted job &P2_LAST_JOB_ID.', p_process_is_stateful_y_n=>'N', p_process_comment=>''); end; @@ -4001,26 +4275,25 @@ declare l_length number := 1; begin p:=p||'begin'||chr(10)|| -' for buff in ('||chr(10)|| -' select id from apex_plsql_jobs'||chr(10)|| -' where created < sysdate - :P2_PURGE_DAYS )'||chr(10)|| -' loop'||chr(10)|| -' apex_plsql_job.purge_process(buff.id);'||chr(10)|| -' end loop;'||chr(10)|| +' :P2_LAST_JOB_ID := apex_plsql_job.submit_process'||chr(10)|| +' (p_sql => ''begin wtplsql.test_all; end;'''||chr(10)|| +' ,p_status => substr(''All Test Runners for '' ||'||chr(10)|| +' :APP_USER,1,100) );'||chr(10)|| 'end;'; wwv_flow_api.create_page_process( - p_id => 4890226759353997 + wwv_flow_api.g_id_offset, + p_id => 4941719483938905 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_flow_step_id => 2, p_process_sequence=> 20, p_process_point=> 'AFTER_SUBMIT', p_process_type=> 'PLSQL', - p_process_name=> 'PURGE_LOGS', + p_process_name=> 'TEST_ALL', p_process_sql_clob => p, - p_process_error_message=> 'Log Purge Failure', - p_process_when_button_id=>4889829698317005 + wwv_flow_api.g_id_offset, - p_process_success_message=> 'Logs Successfully Purged', + p_process_error_message=> 'Failed to submit job (&P2_LAST_JOB_ID.)', + p_process_when=>'TEST_ALL', + p_process_when_type=>'REQUEST_EQUALS_CONDITION', + p_process_success_message=> 'Successful submitted job &P2_LAST_JOB_ID.', p_process_is_stateful_y_n=>'N', p_process_comment=>''); end; @@ -4032,10 +4305,53 @@ end; begin ---------------------------------------- --- ...updatable report columns for page 2 --- - +declare + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +p:=p||'declare'||chr(10)|| +' num_jobs number := 0;'||chr(10)|| +'begin'||chr(10)|| +' :P2_NUM_JOBS_PURGED := num_jobs;'||chr(10)|| +' for buff in ('||chr(10)|| +' select job from apex_plsql_jobs'||chr(10)|| +' where created < sysdate - :P2_PURGE_DAYS )'||chr(10)|| +' loop'||chr(10)|| +' apex_plsql_job.purge_process(buff.job);'||chr(10)|| +' num_jobs := num_jobs + 1;'||chr(10)|| +' end loop;'||chr(10)|| +' :P2_NUM_JOBS_PURGED := num_jobs;'||chr(10)|| +'end;'; + +wwv_flow_api.create_page_process( + p_id => 4890226759353997 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id => 2, + p_process_sequence=> 30, + p_process_point=> 'AFTER_SUBMIT', + p_process_type=> 'PLSQL', + p_process_name=> 'PURGE_LOGS', + p_process_sql_clob => p, + p_process_error_message=> 'Log Purge Failure after &P2_NUM_JOBS_PURGED. jobs.', + p_process_when=>'PURGE_LOGS', + p_process_when_type=>'REQUEST_EQUALS_CONDITION', + p_process_success_message=> 'Successfully Purged &P2_NUM_JOBS_PURGED. jobs.', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; +null; + +end; +/ + + +begin + +--------------------------------------- +-- ...updatable report columns for page 2 +-- + begin null; @@ -4073,7 +4389,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180707032321' + ,p_last_upd_yyyymmddhh24miss => '20180708005014' ); null; @@ -4692,7 +5008,7 @@ wwv_flow_api.create_flash_chart5( p_chart_width =>300, p_chart_height =>200, p_chart_animation =>'N', - p_display_attr =>'::::Y:N:Left::V:Y:Circle:::N:::Default', + p_display_attr =>':H:::Y:N:Left::V:Y:Circle:::N:::Default', p_dial_tick_attr =>':::::::::::', p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', @@ -4757,9 +5073,9 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select NULL LINK'||chr(10)|| -' ,run.id LABEL'||chr(10)|| -' ,res.passes PASS'||chr(10)|| +a1:=a1||'select NULL LINK'||chr(10)|| +' ,''ID: '' || run.id LABEL'||chr(10)|| +' ,res.passes PASS'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| @@ -4787,9 +5103,9 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select NULL LINK'||chr(10)|| -' ,run.id LABEL'||chr(10)|| -' ,res.failures FAIL'||chr(10)|| +a1:=a1||'select NULL LINK'||chr(10)|| +' ,''ID: '' || run.id LABEL'||chr(10)|| +' ,res.failures FAIL'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| @@ -4817,9 +5133,9 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select NULL LINK'||chr(10)|| -' ,run.id LABEL'||chr(10)|| -' ,res.errors ERR'||chr(10)|| +a1:=a1||'select NULL LINK'||chr(10)|| +' ,''ID: '' || run.id LABEL'||chr(10)|| +' ,res.errors ERR'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| @@ -4928,7 +5244,7 @@ wwv_flow_api.create_flash_chart5( p_chart_width =>300, p_chart_height =>200, p_chart_animation =>'N', - p_display_attr =>'::::Y:N:Left::V:Y:Circle:::N:::Default', + p_display_attr =>':H:::Y:N:Left::V:Y:Circle:::N:::Default', p_dial_tick_attr =>':::::::::::', p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', @@ -4994,7 +5310,7 @@ declare a1 varchar2(32767) := null; begin a1:=a1||'select NULL LINK'||chr(10)|| -' ,run.id LABEL'||chr(10)|| +' ,''ID: '' || run.id LABEL'||chr(10)|| ' ,res.executed_lines EXEC'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| @@ -5024,7 +5340,7 @@ declare a1 varchar2(32767) := null; begin a1:=a1||'select NULL LINK'||chr(10)|| -' ,run.id LABEL'||chr(10)|| +' ,''ID: '' || run.id LABEL'||chr(10)|| ' ,res.excluded_lines EXCL'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| @@ -5054,7 +5370,7 @@ declare a1 varchar2(32767) := null; begin a1:=a1||'select NULL LINK'||chr(10)|| -' ,run.id LABEL'||chr(10)|| +' ,''ID: '' || run.id LABEL'||chr(10)|| ' ,res.unknown_lines UNKN'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| @@ -5084,7 +5400,7 @@ declare a1 varchar2(32767) := null; begin a1:=a1||'select NULL LINK'||chr(10)|| -' ,run.id LABEL'||chr(10)|| +' ,''ID: '' || run.id LABEL'||chr(10)|| ' ,res.notexec_lines NOTX'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| @@ -5193,7 +5509,7 @@ wwv_flow_api.create_flash_chart5( p_chart_width =>300, p_chart_height =>200, p_chart_animation =>'N', - p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', + p_display_attr =>':H:::Y:N:N::V:Y:None:::N:::Default', p_dial_tick_attr =>':::::::::::', p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', @@ -5267,13 +5583,14 @@ a1:=a1||'with q_top_failures as ('||chr(10)|| ' join wt_testcase_stats tc'||chr(10)|| ' on tc.test_run_id = run.id'||chr(10)|| ' where run.id = :P3_TEST_RUN_ID'||chr(10)|| +' and tc.failures > 0'||chr(10)|| ' order by failures desc, TESTCASE'||chr(10)|| ')'||chr(10)|| 'select NULL LINK'||chr(10)|| -' ,testcase LABEL'||chr(10)|| -' ,failures '; +' ,testcase LABE'; -a1:=a1||' VALUE'||chr(10)|| +a1:=a1||'L'||chr(10)|| +' ,failures VALUE'||chr(10)|| ' from q_top_failures'; wwv_flow_api.create_flash_chart5_series( @@ -5293,93 +5610,1501 @@ wwv_flow_api.create_flash_chart5_series( p_action_link_checksum_type =>''); end; / - +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; begin - -null; - +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4946418865544258 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_plug_name=> 'Test Runner Duration Trend', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 31, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => 'PLSQL_EXPRESSION', + p_plug_display_when_condition => ':P3_SHOW_TREND=''Y''', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); end; / - - +declare + a1 varchar2(32767) := null; begin - -wwv_flow_api.create_page_branch( - p_id=>4923132166541430 + wwv_flow_api.g_id_offset, +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4946607806544261+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_branch_action=> 'f?p=&FLOW_ID.:3:&SESSION.', - p_branch_point=> 'AFTER_PROCESSING', - p_branch_type=> 'REDIRECT_URL', - p_branch_sequence=> 99, - p_save_state_before_branch_yn=>'Y', - p_branch_comment=> ''); - - + p_page_id => 3, + p_region_id => 4946418865544258+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DColumn', + p_chart_title =>'', + p_chart_name =>'chart_4946607806544261', + p_chart_width =>300, + p_chart_height =>200, + p_chart_animation =>'N', + p_display_attr =>':H:::Y:N:N::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'6', + p_custom_colors =>'', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>2, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'Seconds', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>2, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); end; / - declare - h varchar2(32767) := null; + a1 varchar2(32767) := null; begin -wwv_flow_api.create_page_item( - p_id=>4902724562737162 + wwv_flow_api.g_id_offset, +a1:=a1||'select NULL LINK'||chr(10)|| +' ,''ID: '' || run.id LABEL'||chr(10)|| +' ,extract(day from (run.end_dtm - run.start_dtm)*86400*100)/100'||chr(10)|| +' SECONDS'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| +' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| +' order by id'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4946720535544262+wwv_flow_api.g_id_offset, + p_chart_id => 4946607806544261+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_name=>'P3_TEST_RUN_ID', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 1, - p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Test Run ID:', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'Y', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'Y', - p_show_quick_picks=>'N', - p_item_comment => ''); - - + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); end; / - declare - h varchar2(32767) := null; + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; begin -wwv_flow_api.create_page_item( - p_id=>4903101050383315 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_name=>'P3_RUNNER_OWNER', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 2, - p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Runner Owner:', +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4948217713035992 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_plug_name=> 'Maximum Profiled LineExec Trend', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 32, + p_plug_display_column=> 2, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => 'PLSQL_EXPRESSION', + p_plug_display_when_condition => ':P3_SHOW_TREND=''Y''', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4948428749035997+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 3, + p_region_id => 4948217713035992+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DColumn', + p_chart_title =>'', + p_chart_name =>'chart_4948428749035997', + p_chart_width =>300, + p_chart_height =>200, + p_chart_animation =>'N', + p_display_attr =>':H:::Y:N:N::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'6', + p_custom_colors =>'', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'MicroSeconds', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'select NULL LINK'||chr(10)|| +' ,''ID: '' || run.id LABEL'||chr(10)|| +' ,res.max_executed_usecs VALUE'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| +' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| +' order by id'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4948500124035997+wwv_flow_api.g_id_offset, + p_chart_id => 4948428749035997+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4948625219180073 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_plug_name=> 'Top Test Case Long Duration', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 33, + p_plug_display_column=> 3, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => 'PLSQL_EXPRESSION', + p_plug_display_when_condition => ':P3_SHOW_TREND=''Y''', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4948812894180073+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 3, + p_region_id => 4948625219180073+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DColumn', + p_chart_title =>'', + p_chart_name =>'chart_4948812894180073', + p_chart_width =>300, + p_chart_height =>200, + p_chart_animation =>'N', + p_display_attr =>':H:::Y:N:N::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'6', + p_custom_colors =>'', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'MilliSeconds', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'with q_top_duration as ('||chr(10)|| +'select testcase'||chr(10)|| +' ,tot_interval_msecs'||chr(10)|| +' from wt_testcase_stats'||chr(10)|| +' where test_run_id = :P3_TEST_RUN_ID'||chr(10)|| +' order by tot_interval_msecs desc'||chr(10)|| +')'||chr(10)|| +'--select * from q_max_start;'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,testcase LABEL'||chr(10)|| +' ,tot_interval_msecs VALUE'||chr(10)|| +' from q_top_duration'||chr(10)|| +' where rownum <= 10'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4948907337180074+wwv_flow_api.g_id_offset, + p_chart_id => 4948812894180073+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||'select result_seq SEQ'||chr(10)|| +' ,executed_dtm EXECUTED_DATE_TIME'||chr(10)|| +' ,interval_msecs MSECS'||chr(10)|| +' ,assertion'||chr(10)|| +' ,status'||chr(10)|| +' ,details'||chr(10)|| +' ,testcase'||chr(10)|| +' ,message'||chr(10)|| +' from wt_results'||chr(10)|| +' where test_run_id = :P3_TEST_RUN_ID'; + +wwv_flow_api.create_page_plug ( + p_id=> 4949525229387041 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_plug_name=> 'Test Runner Results Details', + p_region_name=>'', + p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 20, + p_plug_display_column=> 1, + p_plug_display_point=> 'AFTER_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'DYNAMIC_QUERY', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_show_nulls_as => ' - ', + p_plug_display_condition_type => '', + p_pagination_display_position=>'BOTTOM_RIGHT', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'select result_seq SEQ'||chr(10)|| +' ,executed_dtm EXECUTED_DATE_TIME'||chr(10)|| +' ,interval_msecs MSECS'||chr(10)|| +' ,assertion'||chr(10)|| +' ,status'||chr(10)|| +' ,details'||chr(10)|| +' ,testcase'||chr(10)|| +' ,message'||chr(10)|| +' from wt_results'||chr(10)|| +' where test_run_id = :P3_TEST_RUN_ID'; + +wwv_flow_api.create_worksheet( + p_id=> 4949624635387041+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_region_id=> 4949525229387041+wwv_flow_api.g_id_offset, + p_name=> 'Test Runner Results Details', + p_folder_id=> null, + p_alias=> '', + p_report_id_item=> '', + p_max_row_count=> '10000', + p_max_row_count_message=> 'This query returns more than #MAX_ROW_COUNT# rows, please filter your data to ensure complete results.', + p_no_data_found_message=> 'No data found.', + p_max_rows_per_page=>'', + p_search_button_label=>'', + p_page_items_to_submit=>'', + p_sort_asc_image=>'', + p_sort_asc_image_attr=>'', + p_sort_desc_image=>'', + p_sort_desc_image_attr=>'', + p_sql_query => a1, + p_status=>'AVAILABLE_FOR_OWNER', + p_allow_report_saving=>'Y', + p_allow_save_rpt_public=>'N', + p_allow_report_categories=>'N', + p_show_nulls_as=>'-', + p_pagination_display_pos=>'BOTTOM_RIGHT', + p_show_finder_drop_down=>'Y', + p_show_display_row_count=>'N', + p_show_search_bar=>'Y', + p_show_search_textbox=>'Y', + p_show_actions_menu=>'Y', + p_report_list_mode=>'TABS', + p_show_detail_link=>'N', + p_show_select_columns=>'Y', + p_show_rows_per_page=>'Y', + p_show_filter=>'Y', + p_show_sort=>'Y', + p_show_control_break=>'Y', + p_show_highlight=>'Y', + p_show_computation=>'Y', + p_show_aggregate=>'Y', + p_show_chart=>'Y', + p_show_group_by=>'Y', + p_show_notify=>'N', + p_show_calendar=>'N', + p_show_flashback=>'Y', + p_show_reset=>'Y', + p_show_download=>'Y', + p_show_help=>'Y', + p_download_formats=>'CSV:HTML:EMAIL', + p_allow_exclude_null_values=>'N', + p_allow_hide_extra_columns=>'N', + p_icon_view_enabled_yn=>'N', + p_icon_view_columns_per_row=>1, + p_detail_view_enabled_yn=>'N', + p_owner=>'WTP'); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4951219968424536+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_db_column_name =>'SEQ', + p_display_order =>1, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'J', + p_column_label =>'Seq', + p_report_label =>'Seq', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4951309893424536+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_db_column_name =>'EXECUTED_DATE_TIME', + p_display_order =>2, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'K', + p_column_label =>'Executed Date/Time', + p_report_label =>'Executed Date/Time', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'DATE', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4951430855424536+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_db_column_name =>'MSECS', + p_display_order =>3, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'L', + p_column_label =>'Msecs', + p_report_label =>'Msecs', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4950228064387045+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_db_column_name =>'ASSERTION', + p_display_order =>4, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'E', + p_column_label =>'Assertion', + p_report_label =>'Assertion', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4950325498387045+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_db_column_name =>'STATUS', + p_display_order =>5, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'F', + p_column_label =>'Status', + p_report_label =>'Status', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4950430581387045+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_db_column_name =>'DETAILS', + p_display_order =>6, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'G', + p_column_label =>'Details', + p_report_label =>'Details', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4950523632387045+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_db_column_name =>'TESTCASE', + p_display_order =>7, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'H', + p_column_label =>'Testcase', + p_report_label =>'Testcase', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4950607731387045+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_db_column_name =>'MESSAGE', + p_display_order =>8, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'I', + p_column_label =>'Message', + p_report_label =>'Message', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +declare + rc1 varchar2(32767) := null; +begin +rc1:=rc1||'SEQ:MSECS:STATUS:TESTCASE:ASSERTION:MESSAGE:DETAILS'; + +wwv_flow_api.create_worksheet_rpt( + p_id => 4950724292387987+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_session_id => null, + p_base_report_id => null+wwv_flow_api.g_id_offset, + p_application_user => 'APXWS_DEFAULT', + p_report_seq =>10, + p_report_alias =>'49508', + p_status =>'PUBLIC', + p_category_id =>null+wwv_flow_api.g_id_offset, + p_is_default =>'Y', + p_display_rows =>100000, + p_report_columns =>rc1, + p_sort_column_1 =>'SEQ', + p_sort_direction_1 =>'ASC', + p_flashback_enabled =>'N', + p_calendar_display_column =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_condition( + p_id => 4969104827207211+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_report_id => 4950724292387987+wwv_flow_api.g_id_offset, + p_name =>'Highlight Errors', + p_condition_type =>'HIGHLIGHT', + p_allow_delete =>'Y', + p_column_name =>'STATUS', + p_operator =>'=', + p_expr =>'ERR', + p_condition_sql =>' (case when ("STATUS" = #APXWS_EXPR#) then #APXWS_HL_ID# end) ', + p_condition_display =>'#APXWS_COL_NAME# = ''ERR'' ', + p_enabled =>'Y', + p_highlight_sequence =>10, + p_row_bg_color =>'#FF5588', + p_column_format =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_condition( + p_id => 4969204980207211+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_report_id => 4950724292387987+wwv_flow_api.g_id_offset, + p_name =>'Highlight Failures', + p_condition_type =>'HIGHLIGHT', + p_allow_delete =>'Y', + p_column_name =>'STATUS', + p_operator =>'=', + p_expr =>'FAIL', + p_condition_sql =>' (case when ("STATUS" = #APXWS_EXPR#) then #APXWS_HL_ID# end) ', + p_condition_display =>'#APXWS_COL_NAME# = ''FAIL'' ', + p_enabled =>'Y', + p_highlight_sequence =>10, + p_row_bg_color =>'#FFFF99', + p_column_format =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_condition( + p_id => 4969023512207211+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_report_id => 4950724292387987+wwv_flow_api.g_id_offset, + p_condition_type =>'FILTER', + p_allow_delete =>'Y', + p_column_name =>'STATUS', + p_operator =>'!=', + p_expr =>'PASS', + p_condition_sql =>'"STATUS" != #APXWS_EXPR#', + p_condition_display =>'#APXWS_COL_NAME# != ''PASS'' ', + p_enabled =>'Y', + p_column_format =>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||'begin'||chr(10)|| +' if :P3_TEST_RUN_ERROR is NOT NULL'||chr(10)|| +' then'||chr(10)|| +' htp.p(''Test Runner Error Message: '' ||'||chr(10)|| +' :P3_TEST_RUN_ERROR || ''
    '');'||chr(10)|| +' end if;'||chr(10)|| +' htp.p(''
    '');'||chr(10)|| +' htp.p(''
    '');'||chr(10)|| +' htp.p(''
    '');'||chr(10)|| +' htp.p(''Test Results Details Search:
    '');'||chr(10)|| +'end;'||chr(10)|| +''; + +wwv_flow_api.create_page_plug ( + p_id=> 4957623889633835 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_plug_name=> 'Test Run Error Message', + p_region_name=>'', + p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 10, + p_plug_display_column=> 1, + p_plug_display_point=> 'AFTER_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'PLSQL_PROCEDURE', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'QUERY_COLUMNS', + p_plug_query_num_rows => 15, + p_plug_query_num_rows_type => 'NEXT_PREVIOUS_LINKS', + p_plug_query_row_count_max => 500, + p_plug_query_show_nulls_as => ' - ', + p_plug_display_condition_type => '', + p_pagination_display_position=>'BOTTOM_RIGHT', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s := null; +wwv_flow_api.create_page_plug ( + p_id=> 4971511333490098 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_plug_name=> 'Code Coverage Details', + p_region_name=>'', + p_plug_template=> 4839416734414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 30, + p_plug_display_column=> 1, + p_plug_display_point=> 'AFTER_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'STATIC_TEXT', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'QUERY_COLUMNS', + p_plug_query_num_rows_type => 'NEXT_PREVIOUS_LINKS', + p_plug_query_row_count_max => 500, + p_plug_query_show_nulls_as => ' - ', + p_plug_display_condition_type => 'PLSQL_EXPRESSION', + p_plug_display_when_condition => ':P3_DBOUT_NAME is NOT NULL', + p_pagination_display_position=>'BOTTOM_RIGHT', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s := null; +wwv_flow_api.create_page_plug ( + p_id=> 4952328298578419 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_plug_name=> 'Code Coverage Search', + p_region_name=>'', + p_parent_plug_id=>4971511333490098 + wwv_flow_api.g_id_offset, + p_plug_template=> 4840023588414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 50, + p_plug_display_column=> 1, + p_plug_display_point=> 'AFTER_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'STATIC_TEXT', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||'select line'||chr(10)|| +' ,status'||chr(10)|| +' ,total_occur'||chr(10)|| +' ,round(min_usecs) MIN_USECS'||chr(10)|| +' ,case when total_occur = 0 then 0'||chr(10)|| +' else round(total_usecs/total_occur)'||chr(10)|| +' end AVG_USECS'||chr(10)|| +' ,round(max_usecs) MAX_USECS'||chr(10)|| +' ,replace(htf.escape_sc(rtrim(text,CHR(10))),'' '',''  '')'||chr(10)|| +' TEXT'||chr(10)|| +' from wt_dbout_profil'; + +s:=s||'es'||chr(10)|| +' where test_run_id = :P3_TEST_RUN_ID'||chr(10)|| +' and status != ''IGNR'''||chr(10)|| +' and ( instr(upper("STATUS"),upper(nvl(:P3_SEARCH,"STATUS"))) > 0'||chr(10)|| +' OR instr(upper("TEXT"),upper(nvl(:P3_SEARCH,"TEXT"))) > 0 )'||chr(10)|| +''; + +wwv_flow_api.create_report_region ( + p_id=> 4952405887578432 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_name=> 'Code Coverage Report', + p_region_name=>'', + p_parent_plug_id=>4971511333490098 + wwv_flow_api.g_id_offset, + p_template=> 4839912075414912+ wwv_flow_api.g_id_offset, + p_display_sequence=> 60, + p_report_attributes=>'style="font-family: monospace"', + p_display_column=> 1, + p_display_point=> 'AFTER_SHOW_ITEMS', + p_source=> s, + p_source_type=> 'SQL_QUERY', + p_display_error_message=> '#SQLERRM#', + p_display_when_condition=> 'P3_DBOUT_NAME', + p_plug_caching=> 'NOT_CACHED', + p_customized=> '0', + p_translate_title=> 'Y', + p_ajax_enabled=> 'Y', + p_query_row_template=> 4963602874586482+ wwv_flow_api.g_id_offset, + p_query_headings_type=> 'COLON_DELMITED_LIST', + p_query_options=> 'DERIVED_REPORT_COLUMNS', + p_query_show_nulls_as=> ' - ', + p_query_break_cols=> '0', + p_query_no_data_found=> 'no data found', + p_query_num_rows_item=> 'P3_ROWS', + p_query_num_rows_type=> '0', + p_pagination_display_position=> 'BOTTOM_RIGHT', + p_csv_output=> 'N', + p_query_asc_image=> 'apex/builder/dup.gif', + p_query_asc_image_attr=> 'width="16" height="16" alt="" ', + p_query_desc_image=> 'apex/builder/ddown.gif', + p_query_desc_image_attr=> 'width="16" height="16" alt="" ', + p_plug_query_strip_html=> 'Y', + p_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4956416987578441 + wwv_flow_api.g_id_offset, + p_region_id=> 4952405887578432 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 1, + p_form_element_id=> null, + p_column_alias=> 'LINE', + p_column_display_sequence=> 1, + p_column_heading=> 'Line', + p_column_alignment=>'RIGHT', + p_heading_alignment=>'RIGHT', + p_default_sort_column_sequence=>1, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4956504864578441 + wwv_flow_api.g_id_offset, + p_region_id=> 4952405887578432 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 2, + p_form_element_id=> null, + p_column_alias=> 'STATUS', + p_column_display_sequence=> 2, + p_column_heading=> 'Status', + p_column_alignment=>'LEFT', + p_heading_alignment=>'LEFT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4956610572578441 + wwv_flow_api.g_id_offset, + p_region_id=> 4952405887578432 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 3, + p_form_element_id=> null, + p_column_alias=> 'TOTAL_OCCUR', + p_column_display_sequence=> 3, + p_column_heading=> 'Total
    Occur', + p_column_alignment=>'RIGHT', + p_heading_alignment=>'RIGHT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4956712638578441 + wwv_flow_api.g_id_offset, + p_region_id=> 4952405887578432 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 4, + p_form_element_id=> null, + p_column_alias=> 'MIN_USECS', + p_column_display_sequence=> 4, + p_column_heading=> 'Min
    Usecs', + p_column_alignment=>'RIGHT', + p_heading_alignment=>'RIGHT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4956829235578441 + wwv_flow_api.g_id_offset, + p_region_id=> 4952405887578432 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 5, + p_form_element_id=> null, + p_column_alias=> 'AVG_USECS', + p_column_display_sequence=> 5, + p_column_heading=> 'Avg
    Usecs', + p_column_alignment=>'RIGHT', + p_heading_alignment=>'RIGHT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4956928135578441 + wwv_flow_api.g_id_offset, + p_region_id=> 4952405887578432 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 6, + p_form_element_id=> null, + p_column_alias=> 'MAX_USECS', + p_column_display_sequence=> 6, + p_column_heading=> 'Max
    Usecs', + p_column_alignment=>'RIGHT', + p_heading_alignment=>'RIGHT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4957019564578442 + wwv_flow_api.g_id_offset, + p_region_id=> 4952405887578432 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 7, + p_form_element_id=> null, + p_column_alias=> 'TEXT', + p_column_display_sequence=> 7, + p_column_heading=> 'Text', + p_column_alignment=>'LEFT', + p_heading_alignment=>'LEFT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'WITHOUT_MODIFICATION', + p_lov_show_nulls=> 'NO', + p_is_required=> false, + p_pk_col_source=> s, + p_lov_display_extra=> 'YES', + p_include_in_export=> 'Y', + p_column_comment=>''); +end; +/ + +begin + +wwv_flow_api.create_page_button( + p_id => 4939204461575007 + wwv_flow_api.g_id_offset, + p_flow_id => wwv_flow.g_flow_id, + p_flow_step_id => 3, + p_button_sequence=> 10, + p_button_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_button_name => 'P3_DELETE', + p_button_image => 'template:'||to_char(4838306817414911+wwv_flow_api.g_id_offset), + p_button_image_alt=> 'DELETE Test Runner', + p_button_position=> 'BOTTOM', + p_button_alignment=> 'LEFT', + p_button_redirect_url=> 'javascript:confirmDelete(''Confirm DELETE of Test Results for '' + document.getElementById(''P3_RUNNER_OWNER'').value + ''.'' + document.getElementById(''P3_RUNNER_NAME'').value, ''DELETE'')', + p_button_execute_validations=>'Y', + p_required_patch => null + wwv_flow_api.g_id_offset); + + +end; +/ + + +begin + +wwv_flow_api.create_page_branch( + p_id=>4956122682578439 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_branch_action=> 'f?p=&APP_ID.:3:&SESSION.', + p_branch_point=> 'AFTER_PROCESSING', + p_branch_type=> 'REDIRECT_URL', + p_branch_sequence=> 10, + p_save_state_before_branch_yn=>'Y', + p_branch_comment=> ''); + +wwv_flow_api.create_page_branch( + p_id=>4923132166541430 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_branch_action=> 'f?p=&APP_ID.:3:&SESSION.::&DEBUG.:::&success_msg=#SUCCESS_MSG#', + p_branch_point=> 'AFTER_PROCESSING', + p_branch_type=> 'REDIRECT_URL', + p_branch_sequence=> 99, + p_save_state_before_branch_yn=>'Y', + p_branch_comment=> ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4902724562737162 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_name=>'P3_TEST_RUN_ID', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 1, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Test Run ID:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'Y', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +h := null; +h:=h||'This item is initialized by the "Initialize Items" process.'; + +wwv_flow_api.create_page_item( + p_id=>4903101050383315 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_name=>'P3_RUNNER_OWNER', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 2, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Runner Owner:', p_source_type=> 'STATIC', p_display_as=> 'NATIVE_DISPLAY_ONLY', p_lov_display_null=> 'NO', @@ -5399,9 +7124,10 @@ wwv_flow_api.create_page_item( p_lov_display_extra=>'YES', p_protection_level => 'N', p_escape_on_http_output => 'Y', + p_help_text=> h, p_attribute_01 => 'N', p_attribute_02 => 'VALUE', - p_attribute_04 => 'Y', + p_attribute_04 => 'N', p_show_quick_picks=>'N', p_item_comment => ''); @@ -5446,9 +7172,9 @@ wwv_flow_api.create_page_item( p_escape_on_http_output => 'Y', p_attribute_01 => 'N', p_attribute_02 => 'VALUE', - p_attribute_04 => 'Y', + p_attribute_04 => 'N', p_show_quick_picks=>'N', - p_item_comment => ''); + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); end; @@ -5491,9 +7217,9 @@ wwv_flow_api.create_page_item( p_escape_on_http_output => 'N', p_attribute_01 => 'N', p_attribute_02 => 'VALUE', - p_attribute_04 => 'Y', + p_attribute_04 => 'N', p_show_quick_picks=>'N', - p_item_comment => ''); + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); end; @@ -5510,7 +7236,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 7, + p_item_sequence=> 8, p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -5536,9 +7262,9 @@ wwv_flow_api.create_page_item( p_escape_on_http_output => 'Y', p_attribute_01 => 'N', p_attribute_02 => 'VALUE', - p_attribute_04 => 'Y', + p_attribute_04 => 'N', p_show_quick_picks=>'N', - p_item_comment => ''); + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); end; @@ -5555,7 +7281,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 6, + p_item_sequence=> 7, p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -5581,9 +7307,9 @@ wwv_flow_api.create_page_item( p_escape_on_http_output => 'Y', p_attribute_01 => 'N', p_attribute_02 => 'VALUE', - p_attribute_04 => 'Y', + p_attribute_04 => 'N', p_show_quick_picks=>'N', - p_item_comment => ''); + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); end; @@ -5600,7 +7326,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 9, + p_item_sequence=> 10, p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -5625,8 +7351,234 @@ wwv_flow_api.create_page_item( p_protection_level => 'N', p_escape_on_http_output => 'Y', p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'Y', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'N', + p_show_quick_picks=>'N', + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4919509411391193 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_name=>'P3_DBOUT_NAME', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 9, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'DBOUT Name:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'N', + p_show_quick_picks=>'N', + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4922532107511287 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_name=>'P3_GOTO_RUN_ID', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 11, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Go To Run ID:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_POPUP_LOV', + p_lov=> 'select id || '': '' ||'||chr(10)|| +' runner_owner || ''.'' ||'||chr(10)|| +' runner_name || '', '' ||'||chr(10)|| +' to_char(start_dtm,''YYYY/MM/DD HH24:MI:SS'') DISPLAY'||chr(10)|| +' ,id RETURN'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' order by id desc', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 10, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'NO', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'NOT_ENTERABLE', + p_attribute_02 => 'NO_FETCH', + p_show_quick_picks=>'N', + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4924510262627933 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_name=>'P3_SHOW_TREND', + p_data_type=> 'VARCHAR', + p_is_required=> true, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 12, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Show Trend:', + p_source=>'N', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_RADIOGROUP', + p_named_lov=> 'Y_OR_N', + p_lov=> '.'||to_char(4923728354614299 + wwv_flow_api.g_id_offset)||'.', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => '2', + p_attribute_02 => 'SUBMIT', + p_attribute_03 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4933725384514861 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_name=>'P3_RUNNER_NAME', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 4, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_HIDDEN', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'NO', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'LEFT', + p_field_alignment=> 'LEFT', + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_show_quick_picks=>'N', + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4939603900584303 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_name=>'P3_ROWS_DELETED_MSG', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 13, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_HIDDEN', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'NO', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'LEFT', + p_field_alignment=> 'LEFT', + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', p_show_quick_picks=>'N', p_item_comment => ''); @@ -5638,18 +7590,18 @@ declare h varchar2(32767) := null; begin wwv_flow_api.create_page_item( - p_id=>4919509411391193 + wwv_flow_api.g_id_offset, + p_id=>4947226661584377 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_flow_step_id=> 3, - p_name=>'P3_DBOUT_NAME', + p_name=>'P3_TEST_DURATION', p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 8, + p_item_sequence=> 6, p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'DBOUT Name:', + p_prompt=>'Duration (secs):', p_source_type=> 'STATIC', p_display_as=> 'NATIVE_DISPLAY_ONLY', p_lov_display_null=> 'NO', @@ -5671,9 +7623,9 @@ wwv_flow_api.create_page_item( p_escape_on_http_output => 'Y', p_attribute_01 => 'N', p_attribute_02 => 'VALUE', - p_attribute_04 => 'Y', + p_attribute_04 => 'N', p_show_quick_picks=>'N', - p_item_comment => ''); + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); end; @@ -5683,47 +7635,34 @@ declare h varchar2(32767) := null; begin wwv_flow_api.create_page_item( - p_id=>4922532107511287 + wwv_flow_api.g_id_offset, + p_id=>4954902281578436 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_flow_step_id=> 3, - p_name=>'P3_GOTO_RUN_ID', + p_name=>'P3_SEARCH', p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', p_item_sequence=> 10, - p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_item_plug_id => 4952328298578419+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Go To Run ID:', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_POPUP_LOV', - p_lov=> 'select id || '': '' ||'||chr(10)|| -' runner_owner || ''.'' ||'||chr(10)|| -' runner_name || '', '' ||'||chr(10)|| -' to_char(start_dtm,''YYYY/MM/DD HH24:MI:SS'') DISPLAY'||chr(10)|| -' ,id RETURN'||chr(10)|| -' from wt_test_runs'||chr(10)|| -' order by id desc', + p_prompt=>'Search', + p_display_as=> 'NATIVE_TEXT_FIELD', p_lov_display_null=> 'NO', p_lov_translated=> 'N', - p_cSize=> 10, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', + p_cSize=> 30, + p_cMaxlength=> 2000, + p_cHeight=> null, p_begin_on_new_line=> 'YES', p_begin_on_new_field=> 'YES', p_colspan=> 1, p_rowspan=> 1, p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', + p_field_alignment=> 'LEFT', p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, p_is_persistent=> 'Y', - p_lov_display_extra=>'NO', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'NOT_ENTERABLE', - p_attribute_02 => 'NO_FETCH', - p_show_quick_picks=>'N', + p_attribute_01 => 'Y', + p_attribute_02 => 'N', + p_attribute_03 => 'N', p_item_comment => ''); @@ -5734,43 +7673,42 @@ declare h varchar2(32767) := null; begin wwv_flow_api.create_page_item( - p_id=>4924510262627933 + wwv_flow_api.g_id_offset, + p_id=>4955118227578437 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_flow_step_id=> 3, - p_name=>'P3_SHOW_TREND', + p_name=>'P3_ROWS', p_data_type=> 'VARCHAR', - p_is_required=> true, + p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 12, - p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_item_sequence=> 20, + p_item_plug_id => 4952328298578419+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', + p_item_default=> '10000', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Show Trend:', - p_source=>'Y', + p_prompt=>'Display', + p_source=>'10000', p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_RADIOGROUP', - p_named_lov=> 'Y_OR_N', - p_lov=> '.'||to_char(4923728354614299 + wwv_flow_api.g_id_offset)||'.', + p_display_as=> 'NATIVE_SELECT_LIST', + p_named_lov=> 'P3_Report Row Per Page', + p_lov=> '.'||to_char(4952509356578433 + wwv_flow_api.g_id_offset)||'.', p_lov_display_null=> 'NO', p_lov_translated=> 'N', p_cSize=> 30, - p_cMaxlength=> 4000, + p_cMaxlength=> 2000, p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', + p_begin_on_new_line=> 'NO', p_begin_on_new_field=> 'YES', p_colspan=> 1, p_rowspan=> 1, p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', + p_field_alignment=> 'LEFT', p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, p_is_persistent=> 'Y', p_lov_display_extra=>'YES', p_protection_level => 'N', p_escape_on_http_output => 'Y', - p_attribute_01 => '2', - p_attribute_02 => 'SUBMIT', - p_attribute_03 => 'Y', + p_attribute_01 => 'NONE', + p_attribute_02 => 'N', p_show_quick_picks=>'N', p_item_comment => ''); @@ -5782,35 +7720,34 @@ declare h varchar2(32767) := null; begin wwv_flow_api.create_page_item( - p_id=>4924831864643727 + wwv_flow_api.g_id_offset, + p_id=>4955319672578437 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_flow_step_id=> 3, - p_name=>'P3_DELETE', + p_name=>'P3_GO', p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 22, - p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'NO', - p_item_default=> 'DELETE', - p_prompt=>'DELETE Test Runner', - p_source=>'DELETE', + p_item_sequence=> 30, + p_item_plug_id => 4952328298578419+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default=> 'GO', + p_prompt=>'Go', + p_source=>'GO', p_source_type=> 'STATIC', p_display_as=> 'BUTTON', p_lov_display_null=> 'NO', p_lov_translated=> 'N', p_cSize=> null, - p_cMaxlength=> 2000, + p_cMaxlength=> null, p_cHeight=> null, - p_tag_attributes => 'template:'||to_char(4838306817414911 + wwv_flow_api.g_id_offset), - p_begin_on_new_line=> 'YES', + p_tag_attributes => 'template:'||to_char(4838226535414911 + wwv_flow_api.g_id_offset), + p_begin_on_new_line=> 'NO', p_begin_on_new_field=> 'YES', p_colspan=> 1, p_rowspan=> 1, - p_label_alignment=> 'RIGHT', + p_label_alignment=> 'LEFT', p_field_alignment=> 'LEFT', - p_is_persistent=> 'N', - p_button_execute_validations=>'Y', + p_is_persistent=> 'Y', p_item_comment => ''); @@ -5821,41 +7758,34 @@ declare h varchar2(32767) := null; begin wwv_flow_api.create_page_item( - p_id=>4926105066666886 + wwv_flow_api.g_id_offset, + p_id=>4955512070578437 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_flow_step_id=> 3, - p_name=>'P3_SPACER', + p_name=>'P3_RESET', p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 20, - p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_item_sequence=> 40, + p_item_plug_id => 4952328298578419+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>' ', + p_item_default=> 'RESET', + p_prompt=>'Reset', + p_source=>'RESET', p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_display_as=> 'BUTTON', p_lov_display_null=> 'NO', p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', + p_cSize=> null, + p_cMaxlength=> null, + p_cHeight=> null, + p_tag_attributes => 'template:'||to_char(4838226535414911 + wwv_flow_api.g_id_offset), + p_begin_on_new_line=> 'NO', p_begin_on_new_field=> 'YES', p_colspan=> 1, p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_label_alignment=> 'LEFT', + p_field_alignment=> 'LEFT', p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'Y', - p_show_quick_picks=>'N', p_item_comment => ''); @@ -5866,24 +7796,24 @@ declare h varchar2(32767) := null; begin wwv_flow_api.create_page_item( - p_id=>4933725384514861 + wwv_flow_api.g_id_offset, + p_id=>4959114220858173 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_flow_step_id=> 3, - p_name=>'P3_RUNNER_NAME', + p_name=>'P3_TEST_RUN_ERROR', p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 4, - p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_item_sequence=> 99, + p_item_plug_id => 4957623889633835+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', p_source_type=> 'STATIC', p_display_as=> 'NATIVE_HIDDEN', p_lov_display_null=> 'NO', p_lov_translated=> 'N', - p_cSize=> null, + p_cSize=> 30, p_cMaxlength=> 4000, - p_cHeight=> null, + p_cHeight=> 1, p_cAttributes=> 'nowrap="nowrap"', p_begin_on_new_line=> 'NO', p_begin_on_new_field=> 'YES', @@ -5892,8 +7822,12 @@ wwv_flow_api.create_page_item( p_label_alignment=> 'LEFT', p_field_alignment=> 'LEFT', p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', p_attribute_01 => 'N', - p_item_comment => ''); + p_show_quick_picks=>'N', + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); end; @@ -5931,6 +7865,67 @@ end; / +begin + +declare + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +p:=p||'reset_pagination'; + +wwv_flow_api.create_page_process( + p_id => 4955700238578438 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id => 3, + p_process_sequence=> 10, + p_process_point=> 'AFTER_SUBMIT', + p_process_type=> 'RESET_PAGINATION', + p_process_name=> 'Reset Pagination', + p_process_sql_clob => p, + p_process_error_message=> 'Unable to reset pagination.', + p_process_when=>'GO,P3_SEARCH,RESET', + p_process_when_type=>'REQUEST_IN_CONDITION', + p_process_success_message=> '', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; +null; + +end; +/ + + +begin + +declare + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +p:=p||'P3_SEARCH,P3_ROWS'; + +wwv_flow_api.create_page_process( + p_id => 4955926050578438 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id => 3, + p_process_sequence=> 20, + p_process_point=> 'AFTER_SUBMIT', + p_process_type=> 'CLEAR_CACHE_FOR_ITEMS', + p_process_name=> 'Reset report search', + p_process_sql_clob => p, + p_process_error_message=> 'Unable to clear cache.', + p_process_when_button_id=>4955512070578437 + wwv_flow_api.g_id_offset, + p_process_success_message=> '', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; +null; + +end; +/ + + begin declare @@ -5973,49 +7968,56 @@ p:=p||':P3_TEST_RUN_ID is NULL'||chr(10)|| ' select runner_ow'; p:=p||'ner'||chr(10)|| -' ,to_char(start_dtm,''YYYY/MM/DD HH24:MI:SS'') START_DTM'||chr(10)|| +' ,runner_name'||chr(10)|| +' ,to_char(start_dtm,''YYYY/MM/DD HH24:MI:SS'') START_DTM'||chr(10)|| +' ,round(extract(day from (end_dtm - start_dtm)*86400*100)/100,2)'||chr(10)|| +' DURATION'||chr(10)|| ' ,dbout_owner'||chr(10)|| ' ,dbout_name'||chr(10)|| ' ,dbout_type'||chr(10)|| -' ,runner_name'||chr(10)|| +' ,error_message'||chr(10)|| ' from wt_test_runs'||chr(10)|| -' where id = :P3_TEST_RUN_ID )'||chr(10)|| +' '; + +p:=p||' where id = :P3_TEST_RUN_ID )'||chr(10)|| ' loop'||chr(10)|| ' --'||chr(10)|| -' :P3_RUNNER_OWNER := buff.runner_owner;'||chr(10)|| -' :P3_RUNNER_NAME := buff.runner_name;'||chr(10)|| -' :P3_START_DTM :'; - -p:=p||'= buff.start_dtm;'||chr(10)|| -' :P3_DBOUT_OWNER := buff.dbout_owner;'||chr(10)|| -' :P3_DBOUT_NAME := buff.dbout_name;'||chr(10)|| -' :P3_DBOUT_TYPE := buff.dbout_type;'||chr(10)|| +' :P3_RUNNER_OWNER := buff.runner_owner;'||chr(10)|| +' :P3_RUNNER_NAME := buff.runner_name;'||chr(10)|| +' :P3_START_DTM := buff.start_dtm;'||chr(10)|| +' :P3_TEST_DURATION := buff.duration;'||chr(10)|| +' :P3_DBOUT_OWNER := buff.dbout_owner;'||chr(10)|| +' :P3_DBOUT_NAME := buff.dbout_name;'||chr(10)|| +' :P3_DBOUT_TYPE := buff.dbout_type;'||chr(10)|| +' '; + +p:=p||' :P3_TEST_RUN_ERROR := buff.error_message;'||chr(10)|| ' --'||chr(10)|| ' if buff.runner_owner = :APP_USER'||chr(10)|| ' then'||chr(10)|| ' page := ''2'';'||chr(10)|| ' item_names := ''P'' || page || ''_TEST_RUNNER'';'||chr(10)|| ' item_values := buff.runner_name;'||chr(10)|| -' '; +' :P3_RUNNER_NAME_DISP := '''' || buff.runner_name ||'||chr(10)|| -' '; - -p:=p||' '' (Click to Run)'' ;'||chr(10)|| +' '' (Click to Run)'' ;'||chr(10)|| ' else'||chr(10)|| ' :P3_RUNNER_NAME_DISP := buff.runner_name;'||chr(10)|| -' end if;'||chr(10)|| +' '; + +p:=p||' end if;'||chr(10)|| ' --'||chr(10)|| ' end loop;'||chr(10)|| ' --'||chr(10)|| @@ -6053,11 +8055,57 @@ declare l_clob clob; l_length number := 1; begin -p:=p||'begin'||chr(10)|| -' delete from wt_test_runs'||chr(10)|| -' where runner_owner = :P3_RUNNER_OWNER'||chr(10)|| -' and runner_name = :P3_RUNNER_NAME;'||chr(10)|| -' :P3_TEST_RUN_ID := NULL;'||chr(10)|| +p:=p||'declare'||chr(10)|| +' num_runs number := 0;'||chr(10)|| +' num_stats number := 0;'||chr(10)|| +' num_tcase number := 0;'||chr(10)|| +' num_res number := 0;'||chr(10)|| +' num_profs number := 0;'||chr(10)|| +' procedure load_msg is begin'||chr(10)|| +' :P3_ROWS_DELETED_MSG := num_runs || '' WT_TEST_RUNS, '' ||'||chr(10)|| +' num_stats || '' WT_TEST_RUN_STATS, '' ||'||chr(10)|| +' num_tcase || '' WT_TESTCASE_STATS, '' ||'||chr(10)|| +' '; + +p:=p||' num_res || '' WT_RESULTS, '' ||'||chr(10)|| +' num_profs || '' WT_DBOUT_PROFILES'' ;'||chr(10)|| +' end load_msg;'||chr(10)|| +'begin'||chr(10)|| +' load_msg;'||chr(10)|| +' for buff in ('||chr(10)|| +' select id from wt_test_runs'||chr(10)|| +' where runner_owner = :P3_RUNNER_OWNER'||chr(10)|| +' and runner_name = :P3_RUNNER_NAME )'||chr(10)|| +' loop'||chr(10)|| +' --'||chr(10)|| +' delete from wt_test_run_stats'||chr(10)|| +' where test_run_id = buff.id;'||chr(10)|| +' num_stats'; + +p:=p||' := num_stats + SQL%ROWCOUNT;'||chr(10)|| +' --'||chr(10)|| +' delete from wt_testcase_stats'||chr(10)|| +' where test_run_id = buff.id;'||chr(10)|| +' num_tcase := num_tcase + SQL%ROWCOUNT;'||chr(10)|| +' --'||chr(10)|| +' delete from wt_results'||chr(10)|| +' where test_run_id = buff.id;'||chr(10)|| +' num_res := num_res + SQL%ROWCOUNT;'||chr(10)|| +' --'||chr(10)|| +' delete from wt_dbout_profiles'||chr(10)|| +' where test_run_id = buff.id;'||chr(10)|| +' num_profs := num_profs + SQL%ROWCOUNT;'||chr(10)|| +' '; + +p:=p||' --'||chr(10)|| +' delete from wt_test_runs'||chr(10)|| +' where id = buff.id;'||chr(10)|| +' num_runs := num_runs + SQL%ROWCOUNT;'||chr(10)|| +' --'||chr(10)|| +' load_msg;'||chr(10)|| +' --'||chr(10)|| +' end loop;'||chr(10)|| +' :P3_TEST_RUN_ID := NULL;'||chr(10)|| 'end;'; wwv_flow_api.create_page_process( @@ -6069,9 +8117,10 @@ wwv_flow_api.create_page_process( p_process_type=> 'PLSQL', p_process_name=> 'Delete Test Runs', p_process_sql_clob => p, - p_process_error_message=> '', - p_process_when_button_id=>4924831864643727 + wwv_flow_api.g_id_offset, - p_process_success_message=> '', + p_process_error_message=> 'Failed to delete rows (&P3_ROWS_DELETED_MSG.)', + p_process_when=>'DELETE', + p_process_when_type=>'REQUEST_EQUALS_CONDITION', + p_process_success_message=> 'Successfully deleted &P3_ROWS_DELETED_MSG.', p_process_is_stateful_y_n=>'N', p_process_comment=>''); end; @@ -6213,7 +8262,7 @@ wwv_flow_api.create_page ( ,p_cache_timeout_seconds => 21600 ,p_cache_by_user_yn => 'N' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180706204723' + ,p_last_upd_yyyymmddhh24miss => '20180707202710' ); null; @@ -6343,7 +8392,7 @@ declare l_clob clob; l_length number := 1; begin -s:=s||'#APP_VERSION#
    '||chr(10)|| +s:=s||'&APP_VERSION.
    '||chr(10)|| '
    '||chr(10)|| '
    '||chr(10)|| ''||chr(10)|| @@ -11694,6 +13743,79 @@ null; end; / +--application/shared_components/user_interface/templates/report/borderless_report_with_colors +prompt ......report template 4963602874586482 + +begin + +declare + c1 varchar2(32767) := null; + c2 varchar2(32767) := null; + c3 varchar2(32767) := null; + c4 varchar2(32767) := null; +begin +c1:=c1||'#COLUMN_VALUE#'; + +c2:=c2||'#COLUMN_VALUE#'; + +c3:=c3||'#COLUMN_VALUE#'; + +c4:=c4||'#COLUMN_VALUE#'; + +wwv_flow_api.create_row_template ( + p_id=> 4963602874586482 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_row_template_name=> 'Borderless Report with Colors', + p_row_template1=> c1, + p_row_template_condition1=> '''#STATUS#''=''NOTX''', + p_row_template2=> c2, + p_row_template_condition2=> '''#STATUS#''=''UNKN''', + p_row_template3=> c3, + p_row_template_condition3=> '''#STATUS#''=''EXCL''', + p_row_template4=> c4, + p_row_template_condition4=> '', + p_row_template_before_rows=>'#TOP_PAGINATION#'||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#PAGINATION#'||chr(10)|| +'
    ', + p_row_template_after_rows =>'
    #EXTERNAL_LINK##CSV_LINK#
    ', + p_row_template_table_attr =>'', + p_row_template_type =>'GENERIC_COLUMNS', + p_column_heading_template=>'#COLUMN_HEADER#', + p_row_template_display_cond1=>'NOT_CONDITIONAL', + p_row_template_display_cond2=>'NOT_CONDITIONAL', + p_row_template_display_cond3=>'NOT_CONDITIONAL', + p_row_template_display_cond4=>'0', + p_next_page_template=>'#PAGINATION_NEXT#', + p_previous_page_template=>'#PAGINATION_PREVIOUS#', + p_next_set_template=>'#PAGINATION_NEXT_SET#', + p_previous_set_template=>'#PAGINATION_PREVIOUS_SET#', + p_row_style_checked=>'#ccc', + p_theme_id => 7, + p_theme_class_id => 1, + p_row_template_comment=> ''); +end; +null; + +end; +/ + + +begin + +begin +wwv_flow_api.create_row_template_patch ( + p_id => 4963602874586482 + wwv_flow_api.g_id_offset, + p_row_template_before_first =>'', + p_row_template_after_last =>''); +exception when others then null; +end; +null; + +end; +/ + prompt ...label templates -- --application/shared_components/user_interface/templates/label/no_label From f9e8c693b3362ab4121e087d08c02ecdfd4a5b3a Mon Sep 17 00:00:00 2001 From: DDieterich Date: Mon, 9 Jul 2018 03:33:31 -0500 Subject: [PATCH 004/141] Start on Jobs Problem --- src/core/wtplsql.pkb | 2 +- src/gui/Notes.txt | 11 ++++++++--- src/gui/install.sql | 3 +++ 3 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 src/gui/install.sql diff --git a/src/core/wtplsql.pkb b/src/core/wtplsql.pkb index 80cc423..60b7a50 100644 --- a/src/core/wtplsql.pkb +++ b/src/core/wtplsql.pkb @@ -286,7 +286,7 @@ begin g_test_runs_rec := l_test_runs_rec_NULL; g_test_runs_rec.id := wt_test_runs_seq.nextval; g_test_runs_rec.start_dtm := systimestamp; - g_test_runs_rec.runner_owner := SYS_CONTEXT('USERENV', 'CURRENT_USER'); + g_test_runs_rec.runner_owner := USER; g_test_runs_rec.runner_name := in_package_name; g_test_runs_rec.error_message := ''; check_runner; diff --git a/src/gui/Notes.txt b/src/gui/Notes.txt index c73e3e8..2103a9c 100644 --- a/src/gui/Notes.txt +++ b/src/gui/Notes.txt @@ -166,10 +166,15 @@ DBOUTs are not global either. -Need a TEST_ALL +Fix PLSQL Jobs + -) Convert to DBMS_SCHEDULER. + -) Create Credentials for All User. + -) Schedule Jobs with APP_USER credentials. + +Fix all the Links + +Remove Test Cage Page and Implement as an Interactive Report Filter -Fix PLSQL Jobs Anonymous - * Test Case Page (Single Test Run ID, Single Test Case) * Page Template Body 1 diff --git a/src/gui/install.sql b/src/gui/install.sql new file mode 100644 index 0000000..09a9970 --- /dev/null +++ b/src/gui/install.sql @@ -0,0 +1,3 @@ + +-- Must be run as sys +grant select on dba_arguments to wtp; From f85ce88dc591b3d7dd783910be21ebabf2fda76d Mon Sep 17 00:00:00 2001 From: DDieterich Date: Wed, 11 Jul 2018 01:17:09 -0500 Subject: [PATCH 005/141] Completed Test Case Page. --- src/core/wt_test_runs.tab | 2 +- src/gui/Notes.txt | 7 +- src/gui/f700.sql | 2477 ++++++++++++++++++++++++++++++++++--- 3 files changed, 2310 insertions(+), 176 deletions(-) diff --git a/src/core/wt_test_runs.tab b/src/core/wt_test_runs.tab index 9712d75..f9e5e25 100644 --- a/src/core/wt_test_runs.tab +++ b/src/core/wt_test_runs.tab @@ -3,7 +3,7 @@ -- Test Runs Table Installation -- -create sequence wt_test_runs_seq; +create sequence wt_test_runs_seq order; grant select on wt_test_runs_seq to public; diff --git a/src/gui/Notes.txt b/src/gui/Notes.txt index 2103a9c..f3f2346 100644 --- a/src/gui/Notes.txt +++ b/src/gui/Notes.txt @@ -173,11 +173,12 @@ Fix PLSQL Jobs Fix all the Links -Remove Test Cage Page and Implement as an Interactive Report Filter +Need a DBOUT Search Page * Test Case Page (Single Test Run ID, Single Test Case) * Page Template Body 1 + * HTML Region Sequence 11 Column 1 * Test Run ID (Read Only) * Test Runner OWNER (Read Only) @@ -190,6 +191,7 @@ Remove Test Cage Page and Implement as an Interactive Report Filter * Go To Run Test Page (Button, Displayed only if Owner is USER) * Chart Region Sequence 12 Column 2 * PASS/FAIL/ERR Pie Chart + * Chart Region Sequence 21 Column 1 * PASS/FAIL/ERR Trend * Bar Vertical Chart @@ -198,8 +200,7 @@ Remove Test Cage Page and Implement as an Interactive Report Filter * Duration Trend * Bar Horizontal Chart * Links to Other Test Run Date/Time + * Page Template Body 2 - * HTML Region Sequence 10 Column 1 - * Test Case Results Summary * HTML Region Sequence 20 Column 1 * Test Case Results Details diff --git a/src/gui/f700.sql b/src/gui/f700.sql index 4183978..4e8ab5c 100644 --- a/src/gui/f700.sql +++ b/src/gui/f700.sql @@ -13,7 +13,7 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Application Export: -- Application: 700 -- Name: wtPLSQL Core GUI --- Date and Time: 00:54 Sunday July 8, 2018 +-- Date and Time: 01:15 Wednesday July 11, 2018 -- Exported By: WTP -- Flashback: 0 -- Export Type: Application Export @@ -26,13 +26,13 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Application Statistics: -- Pages: 6 --- Items: 36 +-- Items: 48 -- Computations: 0 -- Validations: 0 --- Processes: 12 --- Regions: 35 +-- Processes: 15 +-- Regions: 41 -- Buttons: 3 --- Dynamic Actions: 2 +-- Dynamic Actions: 4 -- Shared Components -- Breadcrumbs: 1 -- Entries 2 @@ -146,7 +146,7 @@ wwv_flow_api.create_flow( p_default_region_template=> 4840201642414912 + wwv_flow_api.g_id_offset, p_error_template=> 4837131094414910 + wwv_flow_api.g_id_offset, p_page_protection_enabled_y_n=> 'Y', - p_checksum_salt_last_reset => '20180708005437', + p_checksum_salt_last_reset => '20180711011532', p_max_session_length_sec=> 28800, p_home_link=> 'f?p=&APP_ID.:1:&SESSION.', p_flow_language=> 'en', @@ -192,7 +192,7 @@ wwv_flow_api.create_flow( p_default_listr_template => 4839116402414912 + wwv_flow_api.g_id_offset, p_default_irr_template => 4839831975414912 + wwv_flow_api.g_id_offset, p_last_updated_by => 'WTP', - p_last_upd_yyyymmddhh24miss=> '20180708005437', + p_last_upd_yyyymmddhh24miss=> '20180711011532', p_required_roles=> wwv_flow_utilities.string_to_table2('')); @@ -347,15 +347,15 @@ wwv_flow_api.create_tab ( p_tab_parent_tabset=>'', p_tab_comment => ''); ---application/shared_components/navigation/tabs/standard/t_test_case +--application/shared_components/navigation/tabs/standard/t_test_cases wwv_flow_api.create_tab ( - p_id=> 4848601687414926 + wwv_flow_api.g_id_offset, + p_id=> 4977229177323155 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_tab_set=> 'TS1', p_tab_sequence=> 40, - p_tab_name=> 'T_TEST_CASE', + p_tab_name=> 'T_TEST CASES', p_tab_text => 'Test Case', - p_tab_step => 4, + p_tab_step => 6, p_tab_also_current_for_pages => '', p_tab_parent_tabset=>'', p_tab_comment => ''); @@ -654,7 +654,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180707153059' + ,p_last_upd_yyyymmddhh24miss => '20180709201830' ); null; @@ -859,35 +859,32 @@ a1:=a1||'er = ms.runner_owner'||chr(10)|| ' and run.start_dtm = ms.max_start_dtm'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| -' having sum(res.passes) > 0'||chr(10)|| 'union all'||chr(10)|| 'select NULL LINK'||chr(10)|| ' ,''FAIL'' LABEL'||chr(10)|| ' ,sum(res.failures) VALUE'||chr(10)|| ' from q_max_start ms'||chr(10)|| ' join wt_test_runs run'||chr(10)|| -' on '; +' on run.runner_owner = ms.runne'; -a1:=a1||' run.runner_owner = ms.runner_owner'||chr(10)|| +a1:=a1||'r_owner'||chr(10)|| ' and run.runner_name = ms.runner_name'||chr(10)|| ' and run.start_dtm = ms.max_start_dtm'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| -' having sum(res.failures) > 0'||chr(10)|| 'union all'||chr(10)|| 'select NULL LINK'||chr(10)|| ' ,''ERR'' LABEL'||chr(10)|| ' ,sum(res.errors) VALUE'||chr(10)|| ' from q_max_start ms'||chr(10)|| ' join wt_test_runs run'||chr(10)|| -' '; +' on run.runner_owner = ms.runner_owner'||chr(10)|| +' '; -a1:=a1||' on run.runner_owner = ms.runner_owner'||chr(10)|| -' and run.runner_name = ms.runner_name'||chr(10)|| +a1:=a1||' and run.runner_name = ms.runner_name'||chr(10)|| ' and run.start_dtm = ms.max_start_dtm'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| -' having sum(res.errors) > 0'||chr(10)|| ')'||chr(10)|| 'select link, label, value'||chr(10)|| ' from q1'||chr(10)|| @@ -1080,49 +1077,45 @@ a1:=a1||'n.runner_owner = ms.runner_owner'||chr(10)|| ' and run.start_dtm = ms.max_start_dtm'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| -' having sum(excluded_lines) > 0'||chr(10)|| 'union all'||chr(10)|| 'select NULL LINK'||chr(10)|| ' ,''EXEC'' LABEL'||chr(10)|| ' ,sum(executed_lines) VALUE'||chr(10)|| ' from q_max_start ms'||chr(10)|| -' join wt_test_run'; +' join wt_test_runs run'||chr(10)|| +' on run.runne'; -a1:=a1||'s run'||chr(10)|| -' on run.runner_owner = ms.runner_owner'||chr(10)|| +a1:=a1||'r_owner = ms.runner_owner'||chr(10)|| ' and run.runner_name = ms.runner_name'||chr(10)|| ' and run.start_dtm = ms.max_start_dtm'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| -' having sum(executed_lines) > 0'||chr(10)|| 'union all'||chr(10)|| 'select NULL LINK'||chr(10)|| ' ,''NOTX'' LABEL'||chr(10)|| ' ,sum(notexec_lines) VALUE'||chr(10)|| ' from q_max_start ms'||chr(10)|| -' '; +' join wt_test_runs run'||chr(10)|| +' on run.runner_owner = '; -a1:=a1||' join wt_test_runs run'||chr(10)|| -' on run.runner_owner = ms.runner_owner'||chr(10)|| +a1:=a1||'ms.runner_owner'||chr(10)|| ' and run.runner_name = ms.runner_name'||chr(10)|| ' and run.start_dtm = ms.max_start_dtm'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| -' having sum(notexec_lines) > 0'||chr(10)|| 'union all'||chr(10)|| 'select NULL LINK'||chr(10)|| ' ,''UNKN'' LABEL'||chr(10)|| ' ,sum(unknown_lines) VALUE'||chr(10)|| -' fr'; - -a1:=a1||'om q_max_start ms'||chr(10)|| +' from q_max_start ms'||chr(10)|| ' join wt_test_runs run'||chr(10)|| -' on run.runner_owner = ms.runner_owner'||chr(10)|| +' on run.runner_owner = ms.runner_'; + +a1:=a1||'owner'||chr(10)|| ' and run.runner_name = ms.runner_name'||chr(10)|| ' and run.start_dtm = ms.max_start_dtm'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| -' having sum(unknown_lines) > 0'||chr(10)|| ')'||chr(10)|| 'select link, label, value'||chr(10)|| ' from q1'||chr(10)|| @@ -3246,7 +3239,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180707124750' + ,p_last_upd_yyyymmddhh24miss => '20180709015509' ); null; @@ -3878,8 +3871,9 @@ wwv_flow_api.create_page_item( p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', p_prompt=>'Test Runner:', p_source=>'select min(package_name)'||chr(10)|| -' from user_arguments'||chr(10)|| -' where object_name = ''WTPLSQL_RUN'''||chr(10)|| +' from dba_arguments'||chr(10)|| +' where owner = :APP_USER'||chr(10)|| +' and object_name = ''WTPLSQL_RUN'''||chr(10)|| ' and argument_name is null'||chr(10)|| ' and position = 1'||chr(10)|| ' and sequence = 0', @@ -3887,8 +3881,9 @@ wwv_flow_api.create_page_item( p_display_as=> 'NATIVE_POPUP_LOV', p_lov=> 'select package_name DISPLAY'||chr(10)|| ' ,package_name RETURN'||chr(10)|| -' from user_arguments'||chr(10)|| -' where object_name = ''WTPLSQL_RUN'''||chr(10)|| +' from dba_arguments'||chr(10)|| +' where owner = :APP_USER'||chr(10)|| +' and object_name = ''WTPLSQL_RUN'''||chr(10)|| ' and argument_name is null'||chr(10)|| ' and position = 1'||chr(10)|| ' and sequence = 0'||chr(10)|| @@ -4389,7 +4384,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180708005014' + ,p_last_upd_yyyymmddhh24miss => '20180710223827' ); null; @@ -4670,18 +4665,16 @@ a1:=a1||'with q1 as ('||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| ' where id = :P3_TEST_RUN_ID'||chr(10)|| -' having sum(res.passes) > 0'||chr(10)|| 'union all'||chr(10)|| 'select NULL LINK'||chr(10)|| ' ,''FAIL'' LABEL'||chr(10)|| ' ,sum(res.failures) VALUE'||chr(10)|| ' from wt_test_runs run'||chr(10)|| -' join'; +' join wt_test_run_stats res'||chr(10)|| +' '; -a1:=a1||' wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| +a1:=a1||' on res.test_run_id = run.id'||chr(10)|| ' where id = :P3_TEST_RUN_ID'||chr(10)|| -' having sum(res.failures) > 0'||chr(10)|| 'union all'||chr(10)|| 'select NULL LINK'||chr(10)|| ' ,''ERR'' LABEL'||chr(10)|| @@ -4690,11 +4683,8 @@ a1:=a1||' wt_test_run_stats res'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| ' where id = :P3_TEST_RUN_ID'||chr(10)|| -' having sum(res.errors) > 0'||chr(10)|| ')'||chr(10)|| -'select link, label,'; - -a1:=a1||' value'||chr(10)|| +'select link, label, value'||chr(10)|| ' from q1'||chr(10)|| ' order by label desc'; @@ -4707,11 +4697,11 @@ wwv_flow_api.create_flash_chart5_series( p_series_query => a1, p_series_type =>'', p_series_query_type =>'SQL_QUERY', - p_series_query_parse_opt =>'', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'No data found.', p_series_query_row_count_max=>15, p_action_link =>'', - p_show_action_link =>'', + p_show_action_link =>'N', p_action_link_checksum_type =>''); end; / @@ -4870,18 +4860,16 @@ a1:=a1||'with q1 as ('||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| ' where id = :P3_TEST_RUN_ID'||chr(10)|| -' having sum(excluded_lines) > 0'||chr(10)|| 'union all'||chr(10)|| 'select NULL LINK'||chr(10)|| ' ,''EXEC'' LABEL'||chr(10)|| ' ,sum(executed_lines) VALUE'||chr(10)|| -' from wt_test'; +' from wt_test_runs run'||chr(10)|| +' join wt_test_r'; -a1:=a1||'_runs run'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| +a1:=a1||'un_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| ' where id = :P3_TEST_RUN_ID'||chr(10)|| -' having sum(executed_lines) > 0'||chr(10)|| 'union all'||chr(10)|| 'select NULL LINK'||chr(10)|| ' ,''NOTX'' LABEL'||chr(10)|| @@ -4890,18 +4878,16 @@ a1:=a1||'_runs run'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| ' where id = :P3_TEST_RUN_ID'||chr(10)|| -' having sum(note'; - -a1:=a1||'xec_lines) > 0'||chr(10)|| 'union all'||chr(10)|| 'select NULL LINK'||chr(10)|| ' ,''UNKN'' LABEL'||chr(10)|| -' ,sum(unknown_lines) VALUE'||chr(10)|| +' '; + +a1:=a1||' ,sum(unknown_lines) VALUE'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| ' where id = :P3_TEST_RUN_ID'||chr(10)|| -' having sum(unknown_lines) > 0'||chr(10)|| ')'||chr(10)|| 'select link, label, value'||chr(10)|| ' from q1'||chr(10)|| @@ -7416,7 +7402,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 11, + p_item_sequence=> 12, p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -7429,6 +7415,7 @@ wwv_flow_api.create_page_item( ' to_char(start_dtm,''YYYY/MM/DD HH24:MI:SS'') DISPLAY'||chr(10)|| ' ,id RETURN'||chr(10)|| ' from wt_test_runs'||chr(10)|| +' where id != :P3_TEST_RUN_ID'||chr(10)|| ' order by id desc', p_lov_display_null=> 'NO', p_lov_translated=> 'N', @@ -7467,7 +7454,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> true, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 12, + p_item_sequence=> 13, p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -7556,7 +7543,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 13, + p_item_sequence=> 14, p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -7830,6 +7817,47 @@ wwv_flow_api.create_page_item( p_item_comment => 'This item is initialized by the "Initialize Items" process.'); +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4993326896795754 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_name=>'P3_TRIGGER_OFFSET', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 11, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Trigger Offset:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_item_comment => ''); + + end; / @@ -7975,11 +8003,12 @@ p:=p||'ner'||chr(10)|| ' ,dbout_owner'||chr(10)|| ' ,dbout_name'||chr(10)|| ' ,dbout_type'||chr(10)|| +' ,trigger_offset'||chr(10)|| ' ,error_message'||chr(10)|| -' from wt_test_runs'||chr(10)|| -' '; +' '; -p:=p||' where id = :P3_TEST_RUN_ID )'||chr(10)|| +p:=p||' from wt_test_runs'||chr(10)|| +' where id = :P3_TEST_RUN_ID )'||chr(10)|| ' loop'||chr(10)|| ' --'||chr(10)|| ' :P3_RUNNER_OWNER := buff.runner_owner;'||chr(10)|| @@ -7988,36 +8017,37 @@ p:=p||' where id = :P3_TEST_RUN_ID )'||chr(10)|| ' :P3_TEST_DURATION := buff.duration;'||chr(10)|| ' :P3_DBOUT_OWNER := buff.dbout_owner;'||chr(10)|| ' :P3_DBOUT_NAME := buff.dbout_name;'||chr(10)|| -' :P3_DBOUT_TYPE := buff.dbout_type;'||chr(10)|| -' '; +' :P3_DBOUT_TY'; -p:=p||' :P3_TEST_RUN_ERROR := buff.error_message;'||chr(10)|| +p:=p||'PE := buff.dbout_type;'||chr(10)|| +' :P3_TRIGGER_OFFSET := buff.trigger_offset;'||chr(10)|| +' :P3_TEST_RUN_ERROR := buff.error_message;'||chr(10)|| ' --'||chr(10)|| ' if buff.runner_owner = :APP_USER'||chr(10)|| ' then'||chr(10)|| ' page := ''2'';'||chr(10)|| ' item_names := ''P'' || page || ''_TEST_RUNNER'';'||chr(10)|| ' item_values := buff.runner_name;'||chr(10)|| -' :P3_RUNNER_NAME_DISP := '''' || buff.runner_name ||'||chr(10)|| -' '' (Click to Run)'' ;'||chr(10)|| +' '' (Cli'; + +p:=p||'ck to Run)'' ;'||chr(10)|| ' else'||chr(10)|| ' :P3_RUNNER_NAME_DISP := buff.runner_name;'||chr(10)|| -' '; - -p:=p||' end if;'||chr(10)|| +' end if;'||chr(10)|| ' --'||chr(10)|| ' end loop;'||chr(10)|| ' --'||chr(10)|| @@ -8146,98 +8176,6 @@ end; / ---application/pages/page_00004 -prompt ...PAGE 4: Test Case --- - -begin - -wwv_flow_api.create_page ( - p_flow_id => wwv_flow.g_flow_id - ,p_id => 4 - ,p_tab_set => 'TS1' - ,p_name => 'Test Case' - ,p_step_title => 'Test Case' - ,p_allow_duplicate_submissions => 'Y' - ,p_step_sub_title => 'Test Case' - ,p_step_sub_title_type => 'TEXT_WITH_SUBSTITUTIONS' - ,p_first_item => 'AUTO_FIRST_ITEM' - ,p_include_apex_css_js_yn => 'Y' - ,p_autocomplete_on_off => 'ON' - ,p_page_is_public_y_n => 'N' - ,p_protection_level => 'N' - ,p_cache_page_yn => 'N' - ,p_cache_timeout_seconds => 21600 - ,p_cache_by_user_yn => 'N' - ,p_help_text => -'No help is available for this page.' - ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180706095947' - ); -null; - -end; -/ - -declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; -begin -s := null; -wwv_flow_api.create_page_plug ( - p_id=> 4848709383414926 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_plug_name=> 'Test Case', - p_region_name=>'', - p_plug_template=> 4840201642414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 10, - p_plug_display_column=> 1, - p_plug_display_point=> 'AFTER_SHOW_ITEMS', - p_plug_source=> s, - p_plug_source_type=> 'STATIC_TEXT', - p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'COLON_DELMITED_LIST', - p_plug_query_row_count_max => 500, - p_plug_display_condition_type => '', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); -end; -/ - -begin - -null; - -end; -/ - - -begin - -null; - -end; -/ - - -begin - ---------------------------------------- --- ...updatable report columns for page 4 --- - -begin - -null; -end; -null; - -end; -/ - - --application/pages/page_00005 prompt ...PAGE 5: About -- @@ -8554,6 +8492,2201 @@ end; / +--application/pages/page_00006 +prompt ...PAGE 6: Test Cases +-- + +begin + +wwv_flow_api.create_page ( + p_flow_id => wwv_flow.g_flow_id + ,p_id => 6 + ,p_tab_set => 'TS1' + ,p_name => 'Test Cases' + ,p_step_title => 'Test Cases' + ,p_allow_duplicate_submissions => 'Y' + ,p_step_sub_title => 'Test Cases' + ,p_step_sub_title_type => 'TEXT_WITH_SUBSTITUTIONS' + ,p_first_item => 'AUTO_FIRST_ITEM' + ,p_include_apex_css_js_yn => 'Y' + ,p_autocomplete_on_off => 'ON' + ,p_step_template => 4837222651414910 + wwv_flow_api.g_id_offset + ,p_page_is_public_y_n => 'N' + ,p_protection_level => 'N' + ,p_cache_page_yn => 'N' + ,p_help_text => +'No help is available for this page.' + ,p_last_updated_by => 'WTP' + ,p_last_upd_yyyymmddhh24miss => '20180711005907' + ); +null; + +end; +/ + +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s := null; +wwv_flow_api.create_page_plug ( + p_id=> 4978906587323161 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_plug_name=> 'Test Case', + p_region_name=>'', + p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 11, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_source=> s, + p_plug_source_type=> 'STATIC_TEXT', + p_translate_title=> 'Y', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||'select result_seq SEQ'||chr(10)|| +' ,executed_dtm EXECUTED_DATE_TIME'||chr(10)|| +' ,interval_msecs MSECS'||chr(10)|| +' ,assertion'||chr(10)|| +' ,status'||chr(10)|| +' ,details'||chr(10)|| +' ,testcase'||chr(10)|| +' ,message'||chr(10)|| +' from wt_results'||chr(10)|| +' where test_run_id = :P6_TEST_RUN_ID'||chr(10)|| +' and testcase = :P6_TESTCASE_NAME'; + +wwv_flow_api.create_page_plug ( + p_id=> 4982202570323168 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_plug_name=> 'Test Case Results Details', + p_region_name=>'', + p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 20, + p_plug_display_column=> 1, + p_plug_display_point=> 'AFTER_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'DYNAMIC_QUERY', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_show_nulls_as => ' - ', + p_plug_display_condition_type => '', + p_pagination_display_position=>'BOTTOM_RIGHT', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'select result_seq SEQ'||chr(10)|| +' ,executed_dtm EXECUTED_DATE_TIME'||chr(10)|| +' ,interval_msecs MSECS'||chr(10)|| +' ,assertion'||chr(10)|| +' ,status'||chr(10)|| +' ,details'||chr(10)|| +' ,testcase'||chr(10)|| +' ,message'||chr(10)|| +' from wt_results'||chr(10)|| +' where test_run_id = :P6_TEST_RUN_ID'||chr(10)|| +' and testcase = :P6_TESTCASE_NAME'; + +wwv_flow_api.create_worksheet( + p_id=> 4982411530323169+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_region_id=> 4982202570323168+wwv_flow_api.g_id_offset, + p_name=> 'Test Runner Results Details', + p_folder_id=> null, + p_alias=> '', + p_report_id_item=> '', + p_max_row_count=> '10000', + p_max_row_count_message=> 'This query returns more than #MAX_ROW_COUNT# rows, please filter your data to ensure complete results.', + p_no_data_found_message=> 'No data found.', + p_max_rows_per_page=>'', + p_search_button_label=>'', + p_page_items_to_submit=>'', + p_sort_asc_image=>'', + p_sort_asc_image_attr=>'', + p_sort_desc_image=>'', + p_sort_desc_image_attr=>'', + p_sql_query => a1, + p_status=>'AVAILABLE_FOR_OWNER', + p_allow_report_saving=>'Y', + p_allow_save_rpt_public=>'N', + p_allow_report_categories=>'N', + p_show_nulls_as=>'-', + p_pagination_display_pos=>'BOTTOM_RIGHT', + p_show_finder_drop_down=>'Y', + p_show_display_row_count=>'N', + p_show_search_bar=>'Y', + p_show_search_textbox=>'Y', + p_show_actions_menu=>'Y', + p_report_list_mode=>'TABS', + p_show_detail_link=>'N', + p_show_select_columns=>'Y', + p_show_rows_per_page=>'Y', + p_show_filter=>'Y', + p_show_sort=>'Y', + p_show_control_break=>'Y', + p_show_highlight=>'Y', + p_show_computation=>'Y', + p_show_aggregate=>'Y', + p_show_chart=>'Y', + p_show_group_by=>'Y', + p_show_notify=>'N', + p_show_calendar=>'N', + p_show_flashback=>'Y', + p_show_reset=>'Y', + p_show_download=>'Y', + p_show_help=>'Y', + p_download_formats=>'CSV:HTML:EMAIL', + p_allow_exclude_null_values=>'N', + p_allow_hide_extra_columns=>'N', + p_icon_view_enabled_yn=>'N', + p_icon_view_columns_per_row=>1, + p_detail_view_enabled_yn=>'N', + p_owner=>'WTP'); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4983029951323173+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_db_column_name =>'SEQ', + p_display_order =>1, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'J', + p_column_label =>'Seq', + p_report_label =>'Seq', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4983107465323173+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_db_column_name =>'EXECUTED_DATE_TIME', + p_display_order =>2, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'K', + p_column_label =>'Executed Date/Time', + p_report_label =>'Executed Date/Time', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'DATE', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4983222398323174+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_db_column_name =>'MSECS', + p_display_order =>3, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'L', + p_column_label =>'Msecs', + p_report_label =>'Msecs', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4982519401323172+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_db_column_name =>'ASSERTION', + p_display_order =>4, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'E', + p_column_label =>'Assertion', + p_report_label =>'Assertion', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4982626816323173+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_db_column_name =>'STATUS', + p_display_order =>5, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'F', + p_column_label =>'Status', + p_report_label =>'Status', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4982730180323173+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_db_column_name =>'DETAILS', + p_display_order =>6, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'G', + p_column_label =>'Details', + p_report_label =>'Details', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4982829265323173+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_db_column_name =>'TESTCASE', + p_display_order =>7, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'H', + p_column_label =>'Testcase', + p_report_label =>'Testcase', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4982913874323173+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_db_column_name =>'MESSAGE', + p_display_order =>8, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'I', + p_column_label =>'Message', + p_report_label =>'Message', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +declare + rc1 varchar2(32767) := null; +begin +rc1:=rc1||'SEQ:MSECS:STATUS:TESTCASE:ASSERTION:MESSAGE:DETAILS'; + +wwv_flow_api.create_worksheet_rpt( + p_id => 4983313754323174+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_session_id => null, + p_base_report_id => null+wwv_flow_api.g_id_offset, + p_application_user => 'APXWS_DEFAULT', + p_report_seq =>10, + p_report_alias =>'49834', + p_status =>'PUBLIC', + p_category_id =>null+wwv_flow_api.g_id_offset, + p_is_default =>'Y', + p_display_rows =>100000, + p_report_columns =>rc1, + p_sort_column_1 =>'SEQ', + p_sort_direction_1 =>'ASC', + p_flashback_enabled =>'N', + p_calendar_display_column =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_condition( + p_id => 4983615236323175+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_report_id => 4983313754323174+wwv_flow_api.g_id_offset, + p_name =>'Highlight Errors', + p_condition_type =>'HIGHLIGHT', + p_allow_delete =>'Y', + p_column_name =>'STATUS', + p_operator =>'=', + p_expr =>'ERR', + p_condition_sql =>' (case when ("STATUS" = #APXWS_EXPR#) then #APXWS_HL_ID# end) ', + p_condition_display =>'#APXWS_COL_NAME# = ''ERR'' ', + p_enabled =>'Y', + p_highlight_sequence =>10, + p_row_bg_color =>'#FF5588', + p_column_format =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_condition( + p_id => 4983707104323175+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_report_id => 4983313754323174+wwv_flow_api.g_id_offset, + p_name =>'Highlight Failures', + p_condition_type =>'HIGHLIGHT', + p_allow_delete =>'Y', + p_column_name =>'STATUS', + p_operator =>'=', + p_expr =>'FAIL', + p_condition_sql =>' (case when ("STATUS" = #APXWS_EXPR#) then #APXWS_HL_ID# end) ', + p_condition_display =>'#APXWS_COL_NAME# = ''FAIL'' ', + p_enabled =>'Y', + p_highlight_sequence =>10, + p_row_bg_color =>'#FFFF99', + p_column_format =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_condition( + p_id => 4983512775323175+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_report_id => 4983313754323174+wwv_flow_api.g_id_offset, + p_condition_type =>'FILTER', + p_allow_delete =>'Y', + p_column_name =>'STATUS', + p_operator =>'!=', + p_expr =>'PASS', + p_condition_sql =>'"STATUS" != #APXWS_EXPR#', + p_condition_display =>'#APXWS_COL_NAME# != ''PASS'' ', + p_enabled =>'Y', + p_column_format =>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||'begin'||chr(10)|| +' if :P6_TEST_RUN_ERROR is NOT NULL'||chr(10)|| +' then'||chr(10)|| +' htp.p(''Test Runner Error Message: '' ||'||chr(10)|| +' :P6_TEST_RUN_ERROR || ''
    '');'||chr(10)|| +' end if;'||chr(10)|| +' htp.p(''
    '');'||chr(10)|| +' htp.p(''
    '');'||chr(10)|| +' htp.p(''
    '');'||chr(10)|| +' htp.p(''Test Results Details Search:
    '');'||chr(10)|| +'end;'||chr(10)|| +''; + +wwv_flow_api.create_page_plug ( + p_id=> 4983829548323176 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_plug_name=> 'Test Run Error Message', + p_region_name=>'', + p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 10, + p_plug_display_column=> 1, + p_plug_display_point=> 'AFTER_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'PLSQL_PROCEDURE', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'QUERY_COLUMNS', + p_plug_query_num_rows => 15, + p_plug_query_num_rows_type => 'NEXT_PREVIOUS_LINKS', + p_plug_query_row_count_max => 500, + p_plug_query_show_nulls_as => ' - ', + p_plug_display_condition_type => '', + p_pagination_display_position=>'BOTTOM_RIGHT', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||'select case when connect_by_isleaf = 1 then 0'||chr(10)|| +' when level = 1 then 1'||chr(10)|| +' else -1'||chr(10)|| +' end as status, '||chr(10)|| +' level, '||chr(10)|| +' "TEXT" as title, '||chr(10)|| +' null as icon, '||chr(10)|| +' "ID" as value, '||chr(10)|| +' null as tooltip, '||chr(10)|| +' ''f?p=&APP_ID.:3:''||:APP_SESSION||''::::P6_TEST_RUN_ID:''||"ID" as link '||chr(10)|| +'from "#OWNER#"."WT_TEST_RUNS_TREE"'||chr(10)|| +'start with "PAREN'; + +s:=s||'T_ID" is null'||chr(10)|| +'connect by prior "ID" = "PARENT_ID"'; + +wwv_flow_api.create_page_plug ( + p_id=> 4986317798323180 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_plug_name=> 'Test Case Tree', + p_region_name=>'', + p_plug_template=> 4840201642414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 10, + p_plug_display_column=> 1, + p_plug_display_point=> 'REGION_POSITION_02', + p_plug_source=> s, + p_plug_source_type=> 'JSTREE', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'with q_main as ('||chr(10)|| +'select to_char(id) ID'||chr(10)|| +' ,to_char(parent_id) PARENT_ID'||chr(10)|| +' ,text'||chr(10)|| +' ,''GUI_TREE'' SOURCE'||chr(10)|| +'-- from #OWNER#.wt_test_runs_gui_tree'||chr(10)|| +' from wt_test_runs_gui_tree'||chr(10)|| +'union all'||chr(10)|| +'select tc.testcase ID'||chr(10)|| +' ,to_char(tc.test_run_id) PARENT_ID'||chr(10)|| +' ,tc.testcase TEXT'||chr(10)|| +' ,''TESTCASES'' SOURCE'||chr(10)|| +' from wt_testcase_stats tc'||chr(10)|| +' jo'; + +a1:=a1||'in wt_test_runs tr'||chr(10)|| +' on tr.id = tc.test_run_id'||chr(10)|| +')'||chr(10)|| +'--select * from q_main;'||chr(10)|| +'select case when connect_by_isleaf = 1 then 0'||chr(10)|| +' when level = 1 then 1'||chr(10)|| +' else -1'||chr(10)|| +' end STATUS'||chr(10)|| +' ,level'||chr(10)|| +' ,text'||chr(10)|| +' ,null ICON'||chr(10)|| +' ,id '; + +a1:=a1||' VALUE'||chr(10)|| +' ,text TOOLTIP'||chr(10)|| +' ,case when SOURCE = ''TESTCASES'' then'||chr(10)|| +' ''f?p=&APP_ID.:6:''||:APP_SESSION||''::::P6_TEST_RUN_ID,P6_TESTCASE_NAME:''||"PARENT_ID"||'',''||"ID"'||chr(10)|| +' else NULL end LINK'||chr(10)|| +' from q_main'||chr(10)|| +' start with parent_id is null'||chr(10)|| +' connect by prior "ID" = parent_id;'; + +wwv_flow_api.create_jstree( + p_id => 4986504998323181+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 6, + p_region_id => 4986317798323180+wwv_flow_api.g_id_offset, + p_tree_template =>'classic', + p_tree_source =>'', + p_tree_query =>a1, + p_tree_node_title =>'TEXT', + p_tree_node_value =>'ID', + p_tree_node_icon =>'', + p_tree_node_link =>'', + p_tree_node_hints =>'ID', + p_tree_start_item =>'PARENT_ID', + p_tree_start_value =>'', + p_tree_button_option =>'', + p_show_node_link =>'', + p_node_link_checksum_type =>null, + p_tree_comment =>'', + p_show_hints =>'DB', + p_tree_has_focus =>'N', + p_tree_hint_text =>'', + p_tree_click_action =>'S', + p_selected_node =>'P3_TEST_RUN_ID'); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4987121729323182 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_plug_name=> 'Test Case Status', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 12, + p_plug_display_column=> 2, + p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4987320221323183+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 6, + p_region_id => 4987121729323182+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DPie', + p_chart_title =>'', + p_chart_name =>'chart_4927915384997301', + p_chart_width =>300, + p_chart_height =>200, + p_chart_animation =>'N', + p_display_attr =>':H:::::Left::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#99FF99,#FFFF99,#FF6699', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'::', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'::', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'with q1 as ('||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''PASS'' LABEL'||chr(10)|| +' ,sum(res.passes) VALUE'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_testcase_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' and res.testcase = :P6_TESTCASE_NAME'||chr(10)|| +' where id = :P6_TEST_RUN_ID'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''FAIL'' LABEL'||chr(10)|| +' ,sum(res.failures) VALUE'||chr(10)|| +' from wt_test_'; + +a1:=a1||'runs run'||chr(10)|| +' join wt_testcase_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' and res.testcase = :P6_TESTCASE_NAME'||chr(10)|| +' where id = :P6_TEST_RUN_ID'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''ERR'' LABEL'||chr(10)|| +' ,sum(res.errors) VALUE'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_testcase_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' and res.testcase = :P6_TE'; + +a1:=a1||'STCASE_NAME'||chr(10)|| +' where id = :P6_TEST_RUN_ID'||chr(10)|| +')'||chr(10)|| +'select link, label, value'||chr(10)|| +' from q1'||chr(10)|| +' order by label desc'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4987425886323183+wwv_flow_api.g_id_offset, + p_chart_id => 4987320221323183+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4987511974323183 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_plug_name=> 'Test Case Status Trend', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 21, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => 'PLSQL_EXPRESSION', + p_plug_display_when_condition => ':P6_SHOW_TREND=''Y''', + p_plug_display_when_cond2=>'Y', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4987702388323183+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 6, + p_region_id => 4987511974323183+wwv_flow_api.g_id_offset, + p_default_chart_type =>'Stacked2DColumn', + p_chart_title =>'', + p_chart_name =>'chart_4932831378476124', + p_chart_width =>300, + p_chart_height =>200, + p_chart_animation =>'N', + p_display_attr =>':H::V:Y:N:Left::V:Y:Circle:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#99FF99,#FFFF99,#FF6699', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'select NULL LINK'||chr(10)|| +' ,''ID: '' || run.id ||'||chr(10)|| +' '' - '' || testcase LABEL'||chr(10)|| +' ,res.passes PASS'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_testcase_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' and res.testcase = :P6_TESTCASE_NAME'||chr(10)|| +' where run.runner_owner = :P6_RUNNER_OWNER'||chr(10)|| +' and run.runner_name = :P6_RUNNER_NAME'||chr(10)|| +' order by run.id'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4988016280323183+wwv_flow_api.g_id_offset, + p_chart_id => 4987702388323183+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>10, + p_series_name =>'Pass', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'select NULL LINK'||chr(10)|| +' ,''ID: '' || run.id ||'||chr(10)|| +' '' - '' || testcase LABEL'||chr(10)|| +' ,res.failures FAIL'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_testcase_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' and res.testcase = :P6_TESTCASE_NAME'||chr(10)|| +' where run.runner_owner = :P6_RUNNER_OWNER'||chr(10)|| +' and run.runner_name = :P6_RUNNER_NAME'||chr(10)|| +' order by run.id'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4987805822323183+wwv_flow_api.g_id_offset, + p_chart_id => 4987702388323183+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>20, + p_series_name =>'Fail', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'select NULL LINK'||chr(10)|| +' ,''ID: '' || run.id ||'||chr(10)|| +' '' - '' || testcase LABEL'||chr(10)|| +' ,res.errors ERR'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_testcase_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' and res.testcase = :P6_TESTCASE_NAME'||chr(10)|| +' where run.runner_owner = :P6_RUNNER_OWNER'||chr(10)|| +' and run.runner_name = :P6_RUNNER_NAME'||chr(10)|| +' order by run.id'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4987900146323183+wwv_flow_api.g_id_offset, + p_chart_id => 4987702388323183+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>30, + p_series_name =>'Error', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4988130280323184 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_plug_name=> 'Test Case Duration Trend', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 22, + p_plug_display_column=> 2, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => 'PLSQL_EXPRESSION', + p_plug_display_when_condition => ':P6_SHOW_TREND=''Y''', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4988311601323184+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 6, + p_region_id => 4988130280323184+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DColumn', + p_chart_title =>'', + p_chart_name =>'chart_4946607806544261', + p_chart_width =>300, + p_chart_height =>200, + p_chart_animation =>'N', + p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'6', + p_custom_colors =>'', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'Milliseconds', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'select NULL LINK'||chr(10)|| +' ,''ID: '' || run.id ||'||chr(10)|| +' '' - '' || testcase LABEL'||chr(10)|| +' ,res.tot_interval_msecs'||chr(10)|| +' MILLISECONDS'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_testcase_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' and res.testcase = :P6_TESTCASE_NAME'||chr(10)|| +' where run.runner_owner = :P6_RUNNER_OWNER'||chr(10)|| +' and run.runner_name = :P6_RUNNER_NAME'||chr(10)|| +' order'; + +a1:=a1||' by id'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4988419037323184+wwv_flow_api.g_id_offset, + p_chart_id => 4988311601323184+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ + +begin + +null; + +end; +/ + + +begin + +wwv_flow_api.create_page_branch( + p_id=>4990208512323191 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 6, + p_branch_action=> 'f?p=&APP_ID.:6:&SESSION.::&DEBUG.:::&success_msg=#SUCCESS_MSG#', + p_branch_point=> 'AFTER_PROCESSING', + p_branch_type=> 'REDIRECT_URL', + p_branch_sequence=> 99, + p_save_state_before_branch_yn=>'Y', + p_branch_comment=> ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4979526173323164 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 6, + p_name=>'P6_GOTO_RUN_ID', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 8, + p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Go To Run ID:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_POPUP_LOV', + p_lov=> 'select id || '': '' ||'||chr(10)|| +' runner_owner || ''.'' ||'||chr(10)|| +' runner_name || '', '' ||'||chr(10)|| +' to_char(start_dtm,''YYYY/MM/DD HH24:MI:SS'') DISPLAY'||chr(10)|| +' ,id RETURN'||chr(10)|| +' from wt_test_runs tr'||chr(10)|| +' where id != :P6_TEST_RUN_ID'||chr(10)|| +' and exists (select ''x'' from wt_testcase_stats tc'||chr(10)|| +' where tc.test_run_id = tr.id )'||chr(10)|| +' order by id desc', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 10, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'NO', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'NOT_ENTERABLE', + p_attribute_02 => 'NO_FETCH', + p_show_quick_picks=>'N', + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4979721568323165 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 6, + p_name=>'P6_SHOW_TREND', + p_data_type=> 'VARCHAR', + p_is_required=> true, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 10, + p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Show Trend:', + p_source=>'N', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_RADIOGROUP', + p_named_lov=> 'Y_OR_N', + p_lov=> '.'||to_char(4923728354614299 + wwv_flow_api.g_id_offset)||'.', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => '2', + p_attribute_02 => 'SUBMIT', + p_attribute_03 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4979902815323165 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 6, + p_name=>'P6_RUNNER_NAME', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 4, + p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_HIDDEN', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'NO', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'LEFT', + p_field_alignment=> 'LEFT', + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_show_quick_picks=>'N', + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4980303495323165 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 6, + p_name=>'P6_TOTAL_ELAPSED', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 7, + p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Elapsed (msecs):', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'N', + p_show_quick_picks=>'N', + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4980909283323166 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 6, + p_name=>'P6_TEST_RUN_ID', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 1, + p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Test Run ID:', + p_source_type=> 'STATIC', + p_source_post_computation => 'to_number(:P6_TEST_RUN_ID)', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'Y', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +h := null; +h:=h||'This item is initialized by the "Initialize Items" process.'; + +wwv_flow_api.create_page_item( + p_id=>4981107070323166 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 6, + p_name=>'P6_RUNNER_OWNER', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 2, + p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Runner Owner:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_help_text=> h, + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'N', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4981616597323167 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 6, + p_name=>'P6_START_DTM', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 6, + p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Start Date/Time:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'N', + p_show_quick_picks=>'N', + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4981808770323167 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 6, + p_name=>'P6_RUNNER_NAME_DISP', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 3, + p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Runner Name:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'N', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'N', + p_show_quick_picks=>'N', + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4984013419323176 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 6, + p_name=>'P6_TEST_RUN_ERROR', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 99, + p_item_plug_id => 4983829548323176+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_HIDDEN', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'NO', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'LEFT', + p_field_alignment=> 'LEFT', + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_show_quick_picks=>'N', + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4995211406848083 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 6, + p_name=>'P6_TESTCASE_NAME', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 5, + p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Test Case Name:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4995404957855714 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 6, + p_name=>'P6_GO_TO_TCASE', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 9, + p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Go To Test Case:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_POPUP_LOV', + p_lov=> 'select testcase DISPLAY'||chr(10)|| +' ,testcase RETURN'||chr(10)|| +' from wt_testcase_stats'||chr(10)|| +' where test_run_id = :P6_TEST_RUN_ID'||chr(10)|| +' and testcase != :P6_TESTCASE_NAME'||chr(10)|| +' order by testcase', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 10, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'NO', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'NOT_ENTERABLE', + p_attribute_02 => 'NO_FETCH', + p_show_quick_picks=>'N', + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); + + +end; +/ + + +begin + +wwv_flow_api.create_page_da_event ( + p_id => 4989710358323189 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_page_id => 6 + ,p_name => 'Submit After Test Run LOV Change' + ,p_event_sequence => 10 + ,p_triggering_element_type => 'ITEM' + ,p_triggering_element => 'P6_GOTO_RUN_ID' + ,p_bind_type => 'bind' + ,p_bind_event_type => 'change' + ); +wwv_flow_api.create_page_da_action ( + p_id => 4998326694508289 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_page_id => 6 + ,p_event_id => 4989710358323189 + wwv_flow_api.g_id_offset + ,p_event_result => 'TRUE' + ,p_action_sequence => 10 + ,p_execute_on_page_init => 'N' + ,p_action => 'NATIVE_CLEAR' + ,p_affected_elements_type => 'ITEM' + ,p_affected_elements => 'P6_TESTCASE_NAME' + ,p_stop_execution_on_error => 'Y' + ); +wwv_flow_api.create_page_da_action ( + p_id => 4990017349323191 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_page_id => 6 + ,p_event_id => 4989710358323189 + wwv_flow_api.g_id_offset + ,p_event_result => 'TRUE' + ,p_action_sequence => 20 + ,p_execute_on_page_init => 'N' + ,p_action => 'NATIVE_SUBMIT_PAGE' + ,p_attribute_01 => 'REFRESH' + ,p_stop_execution_on_error => 'Y' + ); +null; + +end; +/ + + +begin + +wwv_flow_api.create_page_da_event ( + p_id => 4997805569502165 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_page_id => 6 + ,p_name => 'Submit After Test Case LOV Change' + ,p_event_sequence => 20 + ,p_triggering_element_type => 'ITEM' + ,p_triggering_element => 'P6_GO_TO_TCASE' + ,p_bind_type => 'bind' + ,p_bind_event_type => 'change' + ); +wwv_flow_api.create_page_da_action ( + p_id => 4998111776502171 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_page_id => 6 + ,p_event_id => 4997805569502165 + wwv_flow_api.g_id_offset + ,p_event_result => 'TRUE' + ,p_action_sequence => 10 + ,p_execute_on_page_init => 'N' + ,p_action => 'NATIVE_SUBMIT_PAGE' + ,p_attribute_01 => 'REFRESH' + ,p_stop_execution_on_error => 'Y' + ); +null; + +end; +/ + + +begin + +declare + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +p:=p||'reset_pagination'; + +wwv_flow_api.create_page_process( + p_id => 4989314029323189 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id => 6, + p_process_sequence=> 10, + p_process_point=> 'AFTER_SUBMIT', + p_process_type=> 'RESET_PAGINATION', + p_process_name=> 'Reset Pagination', + p_process_sql_clob => p, + p_process_error_message=> 'Unable to reset pagination.', + p_process_when=>'GO,P6_SEARCH,RESET', + p_process_when_type=>'REQUEST_IN_CONDITION', + p_process_success_message=> '', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; +null; + +end; +/ + + +begin + +declare + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +p:=p||'P6_SEARCH,P6_ROWS'; + +wwv_flow_api.create_page_process( + p_id => 4989512951323189 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id => 6, + p_process_sequence=> 20, + p_process_point=> 'AFTER_SUBMIT', + p_process_type=> 'CLEAR_CACHE_FOR_ITEMS', + p_process_name=> 'Reset report search', + p_process_sql_clob => p, + p_process_error_message=> 'Unable to clear cache.', + p_process_when_button_id=>4985222849323178 + wwv_flow_api.g_id_offset, + p_process_success_message=> '', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; +null; + +end; +/ + + +begin + +declare + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +p:=p||'declare'||chr(10)|| +' --'||chr(10)|| +' page varchar2(5); -- Destination Page'||chr(10)|| +' clear_cache varchar2(4000); -- Comma Delimited Names'||chr(10)|| +' item_names varchar2(4000); -- Comma Delimited Names'||chr(10)|| +' item_values varchar2(4000); -- Comma Delimited Values'||chr(10)|| +' --'||chr(10)|| +' procedure find_test_run_id is begin'||chr(10)|| +' select max(id) into :P6_TEST_RUN_ID'||chr(10)|| +' from wt_test_runs tr'||chr(10)|| +' where runner_owner = :APP_US'; + +p:=p||'ER'||chr(10)|| +' and exists (select ''x'' from wt_testcase_stats tc'||chr(10)|| +' where tc.test_run_id = tr.id'||chr(10)|| +' );'||chr(10)|| +' if :P6_TEST_RUN_ID is NULL'||chr(10)|| +' then'||chr(10)|| +' select max(id) into :P6_TEST_RUN_ID'||chr(10)|| +' from wt_test_runs tr'||chr(10)|| +' where exists (select ''x'' from wt_testcase_stats tc'||chr(10)|| +' where tc.test_run_id = tr.id'||chr(10)|| +' );'||chr(10)|| +' '; + +p:=p||' end if;'||chr(10)|| +' end find_test_run_id;'||chr(10)|| +' --'||chr(10)|| +' procedure process_test_run_id is begin'||chr(10)|| +' for buff in ('||chr(10)|| +' select tr.runner_owner'||chr(10)|| +' ,tr.runner_name'||chr(10)|| +' ,to_char(start_dtm,''YYYY/MM/DD HH24:MI:SS'') START_DTM'||chr(10)|| +' ,error_message'||chr(10)|| +' from wt_test_runs tr'||chr(10)|| +' where id = :P6_TEST_RUN_ID ) -- Primary Key, Only 1 row in loop'||chr(10)|| +' loop'||chr(10)|| +' :P'; + +p:=p||'6_RUNNER_OWNER := buff.runner_owner;'||chr(10)|| +' :P6_RUNNER_NAME := buff.runner_name;'||chr(10)|| +' :P6_START_DTM := buff.start_dtm;'||chr(10)|| +' :P6_TEST_RUN_ERROR := buff.error_message;'||chr(10)|| +' if buff.runner_owner = :APP_USER'||chr(10)|| +' then'||chr(10)|| +' page := ''2'';'||chr(10)|| +' item_names := ''P'' || page || ''_TEST_RUNNER'';'||chr(10)|| +' item_values := buff.runner_na'; + +p:=p||'me;'||chr(10)|| +' :P6_RUNNER_NAME_DISP := '''' || buff.runner_name '; + +p:=p||' ||'||chr(10)|| +' '' (Click to Run)'' ;'||chr(10)|| +' else'||chr(10)|| +' :P6_RUNNER_NAME_DISP := buff.runner_name;'||chr(10)|| +' end if;'||chr(10)|| +' end loop;'||chr(10)|| +' end process_test_run_id;'||chr(10)|| +' --'||chr(10)|| +' function check_testcase_name return boolean is begin'||chr(10)|| +' for buff in (select ''x'' from wt_testcase_stats'||chr(10)|| +' where test_run_id = :P6_TEST_RUN_ID'||chr(10)|| +' and testcase = :P'; + +p:=p||'6_TESTCASE_NAME )'||chr(10)|| +' -- Primary Key, Only returns 1 row'||chr(10)|| +' loop'||chr(10)|| +' return TRUE;'||chr(10)|| +' end loop;'||chr(10)|| +' return FALSE;'||chr(10)|| +' end check_testcase_name;'||chr(10)|| +' --'||chr(10)|| +' procedure find_testcase_name is begin'||chr(10)|| +' select min(testcase)'||chr(10)|| +' into :P6_TESTCASE_NAME'||chr(10)|| +' from wt_testcase_stats'||chr(10)|| +' where test_run_id = :P6_TEST_RUN_ID;'||chr(10)|| +' end find_testcase_name;'||chr(10)|| +' --'||chr(10)|| +' procedure proce'; + +p:=p||'ss_testcase_name is begin'||chr(10)|| +' select max(tot_interval_msecs) -- Need Group Function for NULL'||chr(10)|| +' into :P6_TOTAL_ELAPSED'||chr(10)|| +' from wt_testcase_stats'||chr(10)|| +' where test_run_id = :P6_TEST_RUN_ID'||chr(10)|| +' and testcase = :P6_TESTCASE_NAME;'||chr(10)|| +' end process_testcase_name;'||chr(10)|| +' --'||chr(10)|| +'begin'||chr(10)|| +' -- :P6_TEST_RUN_ID := 1;'||chr(10)|| +' --'||chr(10)|| +' if :P6_GOTO_TCASE is NOT NULL'||chr(10)|| +' then'||chr(10)|| +' -- The LOV was triggered, so'; + +p:=p||' set Test Case and go.'||chr(10)|| +' :P6_TESTCASE_NAME := :P6_GOTO_TCASE;'||chr(10)|| +' :P6_GOTO_TCASE := NULL;'||chr(10)|| +' :P6_GOTO_RUN_ID := NULL;'||chr(10)|| +' process_testcase_name;'||chr(10)|| +' return; -- Done!'||chr(10)|| +' end if;'||chr(10)|| +' --'||chr(10)|| +' if :P6_GOTO_RUN_ID is NOT NULL'||chr(10)|| +' then'||chr(10)|| +' -- The LOV was triggered, Set Test Run.'||chr(10)|| +' :P6_TEST_RUN_ID := :P6_GOTO_RUN_ID;'||chr(10)|| +' :P6_GOTO_RUN_ID := NULL;'||chr(10)|| +' else'||chr(10)|| +' '; + +p:=p||' if :P6_TEST_RUN_ID is NULL'||chr(10)|| +' then'||chr(10)|| +' -- Must have a Test Run ID'||chr(10)|| +' find_test_run_id;'||chr(10)|| +' end if;'||chr(10)|| +' end if;'||chr(10)|| +' -- Set (or Reset) the Test Run ID dependents'||chr(10)|| +' process_test_run_id;'||chr(10)|| +' --'||chr(10)|| +' if not check_testcase_name'||chr(10)|| +' then'||chr(10)|| +' -- Must set a Test Case'||chr(10)|| +' find_testcase_name;'||chr(10)|| +' end if;'||chr(10)|| +' -- Set (or Reset) the Test Case dependents.'||chr(10)|| +' process_testcase_name;'||chr(10)|| +' --'||chr(10)|| +'end;'; + +wwv_flow_api.create_page_process( + p_id => 4989127437323187 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id => 6, + p_process_sequence=> 10, + p_process_point=> 'BEFORE_HEADER', + p_process_type=> 'PLSQL', + p_process_name=> 'Initialize Items', + p_process_sql_clob => p, + p_process_error_message=> '', + p_process_success_message=> '', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; +null; + +end; +/ + + +begin + +--------------------------------------- +-- ...updatable report columns for page 6 +-- + +begin + +null; +end; +null; + +end; +/ + + --application/pages/page_00101 prompt ...PAGE 101: Login -- From 645cf4eea40a2d692d32f0507dfd7fb2b0ed7f84 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Thu, 12 Jul 2018 00:23:00 -0500 Subject: [PATCH 006/141] More GUI Work --- src/core/wtplsql.pkb | 4 +- src/gui/Notes.txt | 8 +-- src/gui/f700.sql | 140 +++++++++++++++++++++++++++++++++++++------ 3 files changed, 127 insertions(+), 25 deletions(-) diff --git a/src/core/wtplsql.pkb b/src/core/wtplsql.pkb index 60b7a50..d0a9746 100644 --- a/src/core/wtplsql.pkb +++ b/src/core/wtplsql.pkb @@ -286,7 +286,9 @@ begin g_test_runs_rec := l_test_runs_rec_NULL; g_test_runs_rec.id := wt_test_runs_seq.nextval; g_test_runs_rec.start_dtm := systimestamp; - g_test_runs_rec.runner_owner := USER; + --g_test_runs_rec.runner_owner := USER; + --g_test_runs_rec.runner_owner := sys_context('userenv', 'current_schema'); + select username into g_test_runs_rec.runner_owner from user_users; g_test_runs_rec.runner_name := in_package_name; g_test_runs_rec.error_message := ''; check_runner; diff --git a/src/gui/Notes.txt b/src/gui/Notes.txt index f3f2346..da1d62c 100644 --- a/src/gui/Notes.txt +++ b/src/gui/Notes.txt @@ -166,15 +166,11 @@ DBOUTs are not global either. -Fix PLSQL Jobs - -) Convert to DBMS_SCHEDULER. - -) Create Credentials for All User. - -) Schedule Jobs with APP_USER credentials. - -Fix all the Links Need a DBOUT Search Page +Fix all the Links + * Test Case Page (Single Test Run ID, Single Test Case) * Page Template Body 1 diff --git a/src/gui/f700.sql b/src/gui/f700.sql index 4e8ab5c..ee83c46 100644 --- a/src/gui/f700.sql +++ b/src/gui/f700.sql @@ -13,7 +13,7 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Application Export: -- Application: 700 -- Name: wtPLSQL Core GUI --- Date and Time: 01:15 Wednesday July 11, 2018 +-- Date and Time: 00:18 Thursday July 12, 2018 -- Exported By: WTP -- Flashback: 0 -- Export Type: Application Export @@ -26,7 +26,7 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Application Statistics: -- Pages: 6 --- Items: 48 +-- Items: 50 -- Computations: 0 -- Validations: 0 -- Processes: 15 @@ -146,7 +146,7 @@ wwv_flow_api.create_flow( p_default_region_template=> 4840201642414912 + wwv_flow_api.g_id_offset, p_error_template=> 4837131094414910 + wwv_flow_api.g_id_offset, p_page_protection_enabled_y_n=> 'Y', - p_checksum_salt_last_reset => '20180711011532', + p_checksum_salt_last_reset => '20180712001818', p_max_session_length_sec=> 28800, p_home_link=> 'f?p=&APP_ID.:1:&SESSION.', p_flow_language=> 'en', @@ -192,7 +192,7 @@ wwv_flow_api.create_flow( p_default_listr_template => 4839116402414912 + wwv_flow_api.g_id_offset, p_default_irr_template => 4839831975414912 + wwv_flow_api.g_id_offset, p_last_updated_by => 'WTP', - p_last_upd_yyyymmddhh24miss=> '20180711011532', + p_last_upd_yyyymmddhh24miss=> '20180712001818', p_required_roles=> wwv_flow_utilities.string_to_table2('')); @@ -639,6 +639,7 @@ wwv_flow_api.create_page ( ,p_id => 1 ,p_tab_set => 'TS1' ,p_name => 'Dashboard' + ,p_alias => 'DASHBOARD' ,p_step_title => 'Home' ,p_allow_duplicate_submissions => 'Y' ,p_step_sub_title => 'Home' @@ -654,7 +655,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180709201830' + ,p_last_upd_yyyymmddhh24miss => '20180711231229' ); null; @@ -3224,6 +3225,7 @@ wwv_flow_api.create_page ( ,p_id => 2 ,p_tab_set => 'TS1' ,p_name => 'Run Test' + ,p_alias => 'RUNTEST' ,p_step_title => 'Run Test' ,p_allow_duplicate_submissions => 'Y' ,p_step_sub_title => 'Run Test' @@ -3239,7 +3241,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180709015509' + ,p_last_upd_yyyymmddhh24miss => '20180711231222' ); null; @@ -4368,6 +4370,7 @@ wwv_flow_api.create_page ( ,p_id => 3 ,p_tab_set => 'TS1' ,p_name => 'Test Runner' + ,p_alias => 'TESTRUNNER' ,p_step_title => 'Test Runner' ,p_allow_duplicate_submissions => 'Y' ,p_step_sub_title => 'Test Runner' @@ -4375,7 +4378,7 @@ wwv_flow_api.create_page ( ,p_first_item => 'AUTO_FIRST_ITEM' ,p_include_apex_css_js_yn => 'Y' ,p_autocomplete_on_off => 'ON' - ,p_step_template => 4837222651414910 + wwv_flow_api.g_id_offset + ,p_step_template => 4837525507414910 + wwv_flow_api.g_id_offset ,p_page_is_public_y_n => 'N' ,p_protection_level => 'N' ,p_cache_page_yn => 'N' @@ -4384,7 +4387,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180710223827' + ,p_last_upd_yyyymmddhh24miss => '20180711231213' ); null; @@ -4447,9 +4450,9 @@ wwv_flow_api.create_page_plug ( p_plug_name=> 'Test Runs Tree', p_region_name=>'', p_plug_template=> 4840201642414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 10, - p_plug_display_column=> 1, - p_plug_display_point=> 'REGION_POSITION_02', + p_plug_display_sequence=> 14, + p_plug_display_column=> 4, + p_plug_display_point=> 'REGION_POSITION_03', p_plug_source=> s, p_plug_source_type=> 'JSTREE', p_translate_title=> 'Y', @@ -4457,7 +4460,8 @@ wwv_flow_api.create_page_plug ( p_plug_query_row_template=> 1, p_plug_query_headings_type=> 'COLON_DELMITED_LIST', p_plug_query_row_count_max => 500, - p_plug_display_condition_type => '', + p_plug_display_condition_type => 'PLSQL_EXPRESSION', + p_plug_display_when_condition => ':P3_SHOW_TREE = ''Y''', p_plug_customized=>'0', p_plug_caching=> 'NOT_CACHED', p_plug_comment=> ''); @@ -7543,7 +7547,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 14, + p_item_sequence=> 15, p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -7858,6 +7862,54 @@ wwv_flow_api.create_page_item( p_item_comment => ''); +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>5006118725435545 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 3, + p_name=>'P3_SHOW_TREE', + p_data_type=> 'VARCHAR', + p_is_required=> true, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 14, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Show Tree:', + p_source=>'N', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_RADIOGROUP', + p_named_lov=> 'Y_OR_N', + p_lov=> '.'||to_char(4923728354614299 + wwv_flow_api.g_id_offset)||'.', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => '2', + p_attribute_02 => 'SUBMIT', + p_attribute_03 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + end; / @@ -8200,7 +8252,7 @@ wwv_flow_api.create_page ( ,p_cache_timeout_seconds => 21600 ,p_cache_by_user_yn => 'N' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180707202710' + ,p_last_upd_yyyymmddhh24miss => '20180711231159' ); null; @@ -8503,6 +8555,7 @@ wwv_flow_api.create_page ( ,p_id => 6 ,p_tab_set => 'TS1' ,p_name => 'Test Cases' + ,p_alias => 'TESTCASES' ,p_step_title => 'Test Cases' ,p_allow_duplicate_submissions => 'Y' ,p_step_sub_title => 'Test Cases' @@ -8510,14 +8563,16 @@ wwv_flow_api.create_page ( ,p_first_item => 'AUTO_FIRST_ITEM' ,p_include_apex_css_js_yn => 'Y' ,p_autocomplete_on_off => 'ON' - ,p_step_template => 4837222651414910 + wwv_flow_api.g_id_offset + ,p_step_template => 4837525507414910 + wwv_flow_api.g_id_offset ,p_page_is_public_y_n => 'N' ,p_protection_level => 'N' ,p_cache_page_yn => 'N' + ,p_cache_timeout_seconds => 21600 + ,p_cache_by_user_yn => 'N' ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180711005907' + ,p_last_upd_yyyymmddhh24miss => '20180711231147' ); null; @@ -9131,7 +9186,7 @@ wwv_flow_api.create_page_plug ( p_plug_template=> 4840201642414912+ wwv_flow_api.g_id_offset, p_plug_display_sequence=> 10, p_plug_display_column=> 1, - p_plug_display_point=> 'REGION_POSITION_02', + p_plug_display_point=> 'REGION_POSITION_03', p_plug_source=> s, p_plug_source_type=> 'JSTREE', p_translate_title=> 'Y', @@ -9139,7 +9194,8 @@ wwv_flow_api.create_page_plug ( p_plug_query_row_template=> 1, p_plug_query_headings_type=> 'COLON_DELMITED_LIST', p_plug_query_row_count_max => 500, - p_plug_display_condition_type => '', + p_plug_display_condition_type => 'PLSQL_EXPRESSION', + p_plug_display_when_condition => ':P6_SHOW_TREE = ''Y''', p_plug_customized=>'0', p_plug_caching=> 'NOT_CACHED', p_plug_comment=> ''); @@ -10361,6 +10417,54 @@ wwv_flow_api.create_page_item( p_item_comment => 'This item is initialized by the "Initialize Items" process.'); +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>5007723478780547 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 6, + p_name=>'P6_SHOW_TREE', + p_data_type=> 'VARCHAR', + p_is_required=> true, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 11, + p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Show Tree:', + p_source=>'N', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_RADIOGROUP', + p_named_lov=> 'Y_OR_N', + p_lov=> '.'||to_char(4923728354614299 + wwv_flow_api.g_id_offset)||'.', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => '2', + p_attribute_02 => 'SUBMIT', + p_attribute_03 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + end; / From 42fd45a8d88b99bcf6260988608f34c22184e59a Mon Sep 17 00:00:00 2001 From: DDieterich Date: Thu, 12 Jul 2018 22:33:31 -0500 Subject: [PATCH 007/141] Change USER to runner_owner --- src/core/wt_profiler.pkb | 37 +++++++++++++++++++------------------ src/core/wtplsql.pkb | 14 +++++++------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/core/wt_profiler.pkb b/src/core/wt_profiler.pkb index ac5a429..0f9c304 100644 --- a/src/core/wt_profiler.pkb +++ b/src/core/wt_profiler.pkb @@ -65,7 +65,7 @@ $THEN -------------------------------------- WTPLSQL Testing -- wt_assert.objexists ( msg_in => in_pname || ' ' || in_ptype, - obj_owner_in => USER, + obj_owner_in => g_test_runs_rec.runner_owner, obj_name_in => upper(in_pname), obj_type_in => upper(in_ptype)); end tl_compile_db_object; @@ -85,7 +85,7 @@ $THEN ,against_exc_in => ''); wt_assert.objnotexists ( msg_in => in_pname || ' ' || in_ptype, - obj_owner_in => USER, + obj_owner_in => g_test_runs_rec.runner_owner, obj_name_in => upper(in_pname), obj_type_in => upper(in_ptype)); end tl_drop_db_object; @@ -185,7 +185,8 @@ $THEN -------------------------------------- WTPLSQL Testing -- l_sql_txt := 'insert into wt_test_runs' || ' (id, start_dtm, runner_owner, runner_name)' || - ' values (' || in_test_run_id || ', sysdate, USER, ''' || + ' values (' || in_test_run_id || ', sysdate, ''' || + g_test_runs_rec.runner_owner, ''', ''' || in_runner_name || ''')'; wt_assert.raises ( msg_in => 'Insert wt_test_runs (' || in_test_run_id || ')', @@ -449,7 +450,7 @@ is cursor c_annotation is select regexp_substr(src.text, C_HEAD_RE||C_MAIN_RE||C_TAIL_RE) TEXT from dba_source src - where src.owner = USER + where src.owner = g_test_runs_rec.runner_owner and src.name = in_pkg_name and src.type = 'PACKAGE BODY' and regexp_like(src.text, C_HEAD_RE||C_MAIN_RE||C_TAIL_RE) @@ -504,7 +505,7 @@ begin -- No object type was given. This could throw TOO_MANY_ROWS. l_dot_pos = 0 and l_cln_pos = 0 - and obj.owner = USER + and obj.owner = g_test_runs_rec.runner_owner and obj.object_name = l_target ) OR ( -- No object type was given. This could throw TOO_MANY_ROWS. l_dot_pos != 0 @@ -514,7 +515,7 @@ begin OR ( -- No object owner was given, assume USER is the owner. l_dot_pos = 0 and l_cln_pos != 0 - and obj.owner = USER + and obj.owner = g_test_runs_rec.runner_owner and obj.object_name = substr(l_target, 1, l_cln_pos-1) and obj.object_type = substr(l_target, l_cln_pos+1, 512) ) OR ( -- All separators were given @@ -617,7 +618,7 @@ $THEN wt_assert.eq (msg_in => 'l_recTEST.dbout_owner' ,check_this_in => l_recTEST.dbout_owner - ,against_this_in => USER); + ,against_this_in => g_test_runs_rec.runner_owner); wt_assert.eq (msg_in => 'l_recTEST.dbout_name' ,check_this_in => l_recTEST.dbout_name @@ -636,7 +637,7 @@ $THEN (in_ptype => 'package body' ,in_pname => l_pname ,in_source => - ' --% WTPLSQL SET DBOUT "' || USER || + ' --% WTPLSQL SET DBOUT "' || g_test_runs_rec.runner_owner || '.' || l_pname || ':PACKAGE BODY" %--' || CHR(10) || 'begin' || CHR(10) || @@ -646,7 +647,7 @@ $THEN wt_assert.eq (msg_in => 'l_recTEST.dbout_owner' ,check_this_in => l_recTEST.dbout_owner - ,against_this_in => USER); + ,against_this_in => g_test_runs_rec.runner_owner; wt_assert.eq (msg_in => 'l_recTEST.dbout_name' ,check_this_in => l_recTEST.dbout_name @@ -691,7 +692,7 @@ $THEN (in_ptype => 'package body' ,in_pname => l_pname ,in_source => - ' --% WTPLSQL SET DBOUT "' || USER || + ' --% WTPLSQL SET DBOUT "' || g_test_runs_rec.runner_owner || '.' || l_pname || '" %--' || CHR(10) || 'begin' || CHR(10) || ' l_junk := 1;' ); @@ -700,7 +701,7 @@ $THEN wt_assert.eq (msg_in => 'l_recTEST.dbout_owner' ,check_this_in => l_recTEST.dbout_owner - ,against_this_in => USER); + ,against_this_in => g_test_runs_rec.runner_owner); wt_assert.eq (msg_in => 'l_recTEST.dbout_name' ,check_this_in => l_recTEST.dbout_name @@ -817,7 +818,7 @@ $THEN l_recSAVE := g_rec; l_ignrSAVE := g_ignr_aa; g_ignr_aa.delete; - g_rec.dbout_owner := USER; + g_rec.dbout_owner := g_test_runs_rec.runner_owner; g_rec.dbout_name := l_pname; g_rec.dbout_type := 'PACKAGE BODY'; g_rec.trigger_offset := 0; @@ -1189,7 +1190,7 @@ $THEN -------------------------------------- WTPLSQL Testing -- units_rec.runid := c_test_run_id; units_rec.unit_number := 1; - units_rec.unit_owner := USER; + units_rec.unit_owner := g_test_runs_rec.runner_owner; units_rec.unit_name := l_pname; units_rec.unit_type := 'PACKAGE BODY'; units_rec.total_time := 0; @@ -1237,7 +1238,7 @@ $THEN wt_assert.g_testcase := 'Insert DBOUT Profile Happy Path'; l_recSAVE := g_rec; g_rec.test_run_id := c_test_run_id; - g_rec.dbout_owner := USER; + g_rec.dbout_owner := g_test_runs_rec.runner_owner; g_rec.dbout_name := l_pname; g_rec.dbout_type := 'PACKAGE BODY'; g_rec.prof_runid := c_test_run_id; @@ -1475,7 +1476,7 @@ $THEN wt_assert.eq ( msg_in => 'OUT dbout_owner', check_this_in => l_recOUT.dbout_owner, - against_this_in => USER); + against_this_in => g_test_runs_rec.runner_owner); wt_assert.eq ( msg_in => 'OUT dbout_name', check_this_in => l_recOUT.dbout_name, @@ -1500,7 +1501,7 @@ $THEN wt_assert.eq ( msg_in => 'l_recTEST.dbout_owner', check_this_in => l_recTEST.dbout_owner, - against_this_in => USER); + against_this_in => g_test_runs_rec.runner_owner); wt_assert.eq ( msg_in => 'l_recTEST.dbout_name', check_this_in => l_recTEST.dbout_name, @@ -1738,14 +1739,14 @@ $THEN wt_assert.g_testcase := 'Trigger Offset Happy Path'; wt_assert.eq ( msg_in => 'Trigger Test', - check_this_in => trigger_offset (dbout_owner_in => USER + check_this_in => trigger_offset (dbout_owner_in => g_test_runs_rec.runner_owner ,dbout_name_in => 'WT_SELF_TEST$TEST' ,dbout_type_in => 'TRIGGER'), against_this_in => 3); -------------------------------------- WTPLSQL Testing -- wt_assert.eq ( msg_in => 'Package Test', - check_this_in => trigger_offset (dbout_owner_in => USER + check_this_in => trigger_offset (dbout_owner_in => g_test_runs_rec.runner_owner ,dbout_name_in => 'WT_PROFILER' ,dbout_type_in => 'PACKAGE BODY'), against_this_in => 0); diff --git a/src/core/wtplsql.pkb b/src/core/wtplsql.pkb index d0a9746..ac54675 100644 --- a/src/core/wtplsql.pkb +++ b/src/core/wtplsql.pkb @@ -454,7 +454,7 @@ $THEN select count(*) into l_num_recs from wt_test_runs - where runner_owner = USER + where runner_owner = g_test_runs_rec.runner_owner and runner_name = g_test_runs_rec.runner_name; -------------------------------------- WTPLSQL Testing -- wt_assert.isnotnull ( @@ -483,7 +483,7 @@ $THEN wt_assert.eqqueryvalue ( msg_in => 'Confirm number of records', check_query_in => 'select count(*) from wt_test_runs' || - ' where runner_owner = ''' || USER || + ' where runner_owner = ''' || g_test_runs_rec.runner_owner || ''' and runner_name = ''' || g_test_runs_rec.runner_name || '''', against_value_in => l_num_recs); @@ -493,23 +493,23 @@ $THEN insert into wt_test_runs (id, start_dtm, runner_owner, runner_name) values - (0-i, sysdate-7000-i, USER, g_test_runs_rec.runner_name); + (0-i, sysdate-7000-i, g_test_runs_rec.runner_owner, g_test_runs_rec.runner_name); end loop; commit; -------------------------------------- WTPLSQL Testing -- wt_assert.eqqueryvalue ( msg_in => 'Check Added ' || C_KEEP_NUM_RECS || ' records', check_query_in => 'select count(*) from wt_test_runs' || - ' where runner_owner = ''' || USER || + ' where runner_owner = ''' || g_test_runs_rec.runner_owner || ''' and runner_name = ''' || g_test_runs_rec.runner_name || '''', against_value_in => l_num_recs + C_KEEP_NUM_RECS); - delete_runs(USER, g_test_runs_rec.runner_name); + delete_runs(g_test_runs_rec.runner_owner, g_test_runs_rec.runner_name); -------------------------------------- WTPLSQL Testing -- wt_assert.eqqueryvalue ( msg_in => 'Check number of records reduced', check_query_in => 'select count(*) from wt_test_runs' || - ' where runner_owner = ''' || USER || + ' where runner_owner = ''' || g_test_runs_rec.runner_owner || ''' and runner_name = ''' || g_test_runs_rec.runner_name || '''', against_value_in => C_KEEP_NUM_RECS); @@ -520,7 +520,7 @@ $THEN wt_assert.eqqueryvalue ( msg_in => 'Confirm original number of records', check_query_in => 'select count(*) from wt_test_runs' || - ' where runner_owner = ''' || USER || + ' where runner_owner = ''' || g_test_runs_rec.runner_owner || ''' and runner_name = ''' || g_test_runs_rec.runner_name || '''', against_value_in => l_num_recs); From 36dd743c355899bd8632384d99d18d6b9152fbb3 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Sat, 14 Jul 2018 02:18:39 -0500 Subject: [PATCH 008/141] Run Test and DBOUT Working --- src/core/wt_profiler.pkb | 100 ++++++++++++++------------ src/gui/f700.sql | 150 +++++++++++++++++++++++++++++++++++++-- src/gui/install.sql | 3 + 3 files changed, 203 insertions(+), 50 deletions(-) diff --git a/src/core/wt_profiler.pkb b/src/core/wt_profiler.pkb index 0f9c304..977dc92 100644 --- a/src/core/wt_profiler.pkb +++ b/src/core/wt_profiler.pkb @@ -17,8 +17,9 @@ as g_ignr_aa ignr_aa_type; $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ - g_skip_insert boolean := FALSE; - g_skip_add boolean := FALSE; + g_current_user varchar2(30); + g_skip_insert boolean := FALSE; + g_skip_add boolean := FALSE; $END ----------------%WTPLSQL_end_ignore_lines%---------------- ---------------------- @@ -65,7 +66,7 @@ $THEN -------------------------------------- WTPLSQL Testing -- wt_assert.objexists ( msg_in => in_pname || ' ' || in_ptype, - obj_owner_in => g_test_runs_rec.runner_owner, + obj_owner_in => g_current_user, obj_name_in => upper(in_pname), obj_type_in => upper(in_ptype)); end tl_compile_db_object; @@ -85,7 +86,7 @@ $THEN ,against_exc_in => ''); wt_assert.objnotexists ( msg_in => in_pname || ' ' || in_ptype, - obj_owner_in => g_test_runs_rec.runner_owner, + obj_owner_in => g_current_user, obj_name_in => upper(in_pname), obj_type_in => upper(in_ptype)); end tl_drop_db_object; @@ -186,7 +187,7 @@ $THEN l_sql_txt := 'insert into wt_test_runs' || ' (id, start_dtm, runner_owner, runner_name)' || ' values (' || in_test_run_id || ', sysdate, ''' || - g_test_runs_rec.runner_owner, ''', ''' || + g_current_user || ''', ''' || in_runner_name || ''')'; wt_assert.raises ( msg_in => 'Insert wt_test_runs (' || in_test_run_id || ')', @@ -449,9 +450,8 @@ is -- This cursor is used to catch the first occurance of a DBOUT annotation cursor c_annotation is select regexp_substr(src.text, C_HEAD_RE||C_MAIN_RE||C_TAIL_RE) TEXT - from dba_source src - where src.owner = g_test_runs_rec.runner_owner - and src.name = in_pkg_name + from user_source src + where src.name = in_pkg_name and src.type = 'PACKAGE BODY' and regexp_like(src.text, C_HEAD_RE||C_MAIN_RE||C_TAIL_RE) order by src.line; @@ -494,37 +494,46 @@ begin l_dot_pos := instr(l_target,'.'); l_cln_pos := instr(l_target,':'); begin + with q_main as ( + select u.username OWNER + ,obj.object_name + ,obj.object_type + from user_objects obj + cross join user_users u + where ( -- No separators were given, assume USER is the owner. + -- No object type was given. This could throw TOO_MANY_ROWS. + l_dot_pos = 0 + and l_cln_pos = 0 + and obj.object_name = l_target ) + OR ( -- No object owner was given, assume USER is the owner. + l_dot_pos = 0 + and l_cln_pos != 0 + and obj.object_name = substr(l_target, 1, l_cln_pos-1) + and obj.object_type = substr(l_target, l_cln_pos+1, 512) ) + UNION ALL select obj.owner ,obj.object_name ,obj.object_type + from dba_objects obj + where ( -- No object type was given. This could throw TOO_MANY_ROWS. + l_dot_pos != 0 + and l_cln_pos = 0 + and obj.owner = substr(l_target, 1, l_dot_pos-1) + and obj.object_name = substr(l_target, l_dot_pos+1, 512) ) + OR ( -- All separators were given + l_dot_pos != 0 + and l_cln_pos != 0 + and obj.owner = substr(l_target, 1, l_dot_pos-1) + and obj.object_name = substr(l_target, l_dot_pos+1, l_cln_pos-l_dot_pos-1) + and obj.object_type = substr(l_target, l_cln_pos+1, 512) ) + ) + select owner + ,object_name + ,object_type into g_rec.dbout_owner ,g_rec.dbout_name ,g_rec.dbout_type - from dba_objects obj - where ( ( -- No separators were given, assume USER is the owner. - -- No object type was given. This could throw TOO_MANY_ROWS. - l_dot_pos = 0 - and l_cln_pos = 0 - and obj.owner = g_test_runs_rec.runner_owner - and obj.object_name = l_target ) - OR ( -- No object type was given. This could throw TOO_MANY_ROWS. - l_dot_pos != 0 - and l_cln_pos = 0 - and obj.owner = substr(l_target, 1, l_dot_pos-1) - and obj.object_name = substr(l_target, l_dot_pos+1, 512) ) - OR ( -- No object owner was given, assume USER is the owner. - l_dot_pos = 0 - and l_cln_pos != 0 - and obj.owner = g_test_runs_rec.runner_owner - and obj.object_name = substr(l_target, 1, l_cln_pos-1) - and obj.object_type = substr(l_target, l_cln_pos+1, 512) ) - OR ( -- All separators were given - l_dot_pos != 0 - and l_cln_pos != 0 - and obj.owner = substr(l_target, 1, l_dot_pos-1) - and obj.object_name = substr(l_target, l_dot_pos+1, l_cln_pos-l_dot_pos-1) - and obj.object_type = substr(l_target, l_cln_pos+1, 512) ) - ); + from q_main; exception when NO_DATA_FOUND then @@ -618,7 +627,7 @@ $THEN wt_assert.eq (msg_in => 'l_recTEST.dbout_owner' ,check_this_in => l_recTEST.dbout_owner - ,against_this_in => g_test_runs_rec.runner_owner); + ,against_this_in => g_current_user); wt_assert.eq (msg_in => 'l_recTEST.dbout_name' ,check_this_in => l_recTEST.dbout_name @@ -637,7 +646,7 @@ $THEN (in_ptype => 'package body' ,in_pname => l_pname ,in_source => - ' --% WTPLSQL SET DBOUT "' || g_test_runs_rec.runner_owner || + ' --% WTPLSQL SET DBOUT "' || g_current_user || '.' || l_pname || ':PACKAGE BODY" %--' || CHR(10) || 'begin' || CHR(10) || @@ -647,7 +656,7 @@ $THEN wt_assert.eq (msg_in => 'l_recTEST.dbout_owner' ,check_this_in => l_recTEST.dbout_owner - ,against_this_in => g_test_runs_rec.runner_owner; + ,against_this_in => g_current_user); wt_assert.eq (msg_in => 'l_recTEST.dbout_name' ,check_this_in => l_recTEST.dbout_name @@ -692,7 +701,7 @@ $THEN (in_ptype => 'package body' ,in_pname => l_pname ,in_source => - ' --% WTPLSQL SET DBOUT "' || g_test_runs_rec.runner_owner || + ' --% WTPLSQL SET DBOUT "' || g_current_user || '.' || l_pname || '" %--' || CHR(10) || 'begin' || CHR(10) || ' l_junk := 1;' ); @@ -701,7 +710,7 @@ $THEN wt_assert.eq (msg_in => 'l_recTEST.dbout_owner' ,check_this_in => l_recTEST.dbout_owner - ,against_this_in => g_test_runs_rec.runner_owner); + ,against_this_in => g_current_user); wt_assert.eq (msg_in => 'l_recTEST.dbout_name' ,check_this_in => l_recTEST.dbout_name @@ -818,7 +827,7 @@ $THEN l_recSAVE := g_rec; l_ignrSAVE := g_ignr_aa; g_ignr_aa.delete; - g_rec.dbout_owner := g_test_runs_rec.runner_owner; + g_rec.dbout_owner := g_current_user; g_rec.dbout_name := l_pname; g_rec.dbout_type := 'PACKAGE BODY'; g_rec.trigger_offset := 0; @@ -1190,7 +1199,7 @@ $THEN -------------------------------------- WTPLSQL Testing -- units_rec.runid := c_test_run_id; units_rec.unit_number := 1; - units_rec.unit_owner := g_test_runs_rec.runner_owner; + units_rec.unit_owner := g_current_user; units_rec.unit_name := l_pname; units_rec.unit_type := 'PACKAGE BODY'; units_rec.total_time := 0; @@ -1238,7 +1247,7 @@ $THEN wt_assert.g_testcase := 'Insert DBOUT Profile Happy Path'; l_recSAVE := g_rec; g_rec.test_run_id := c_test_run_id; - g_rec.dbout_owner := g_test_runs_rec.runner_owner; + g_rec.dbout_owner := g_current_user; g_rec.dbout_name := l_pname; g_rec.dbout_type := 'PACKAGE BODY'; g_rec.prof_runid := c_test_run_id; @@ -1476,7 +1485,7 @@ $THEN wt_assert.eq ( msg_in => 'OUT dbout_owner', check_this_in => l_recOUT.dbout_owner, - against_this_in => g_test_runs_rec.runner_owner); + against_this_in => g_current_user); wt_assert.eq ( msg_in => 'OUT dbout_name', check_this_in => l_recOUT.dbout_name, @@ -1501,7 +1510,7 @@ $THEN wt_assert.eq ( msg_in => 'l_recTEST.dbout_owner', check_this_in => l_recTEST.dbout_owner, - against_this_in => g_test_runs_rec.runner_owner); + against_this_in => g_current_user); wt_assert.eq ( msg_in => 'l_recTEST.dbout_name', check_this_in => l_recTEST.dbout_name, @@ -1739,14 +1748,14 @@ $THEN wt_assert.g_testcase := 'Trigger Offset Happy Path'; wt_assert.eq ( msg_in => 'Trigger Test', - check_this_in => trigger_offset (dbout_owner_in => g_test_runs_rec.runner_owner + check_this_in => trigger_offset (dbout_owner_in => g_current_user ,dbout_name_in => 'WT_SELF_TEST$TEST' ,dbout_type_in => 'TRIGGER'), against_this_in => 3); -------------------------------------- WTPLSQL Testing -- wt_assert.eq ( msg_in => 'Package Test', - check_this_in => trigger_offset (dbout_owner_in => g_test_runs_rec.runner_owner + check_this_in => trigger_offset (dbout_owner_in => g_current_user ,dbout_name_in => 'WT_PROFILER' ,dbout_type_in => 'PACKAGE BODY'), against_this_in => 0); @@ -1974,6 +1983,7 @@ $THEN procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_PROFILER:PACKAGE BODY" %-- is begin + select username into g_current_user from user_users; t_get_error_msg; t_delete_profiler_recs; t_find_dbout; diff --git a/src/gui/f700.sql b/src/gui/f700.sql index ee83c46..cc76de4 100644 --- a/src/gui/f700.sql +++ b/src/gui/f700.sql @@ -13,7 +13,7 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Application Export: -- Application: 700 -- Name: wtPLSQL Core GUI --- Date and Time: 00:18 Thursday July 12, 2018 +-- Date and Time: 02:14 Saturday July 14, 2018 -- Exported By: WTP -- Flashback: 0 -- Export Type: Application Export @@ -26,7 +26,7 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Application Statistics: -- Pages: 6 --- Items: 50 +-- Items: 53 -- Computations: 0 -- Validations: 0 -- Processes: 15 @@ -146,7 +146,7 @@ wwv_flow_api.create_flow( p_default_region_template=> 4840201642414912 + wwv_flow_api.g_id_offset, p_error_template=> 4837131094414910 + wwv_flow_api.g_id_offset, p_page_protection_enabled_y_n=> 'Y', - p_checksum_salt_last_reset => '20180712001818', + p_checksum_salt_last_reset => '20180714021456', p_max_session_length_sec=> 28800, p_home_link=> 'f?p=&APP_ID.:1:&SESSION.', p_flow_language=> 'en', @@ -192,7 +192,7 @@ wwv_flow_api.create_flow( p_default_listr_template => 4839116402414912 + wwv_flow_api.g_id_offset, p_default_irr_template => 4839831975414912 + wwv_flow_api.g_id_offset, p_last_updated_by => 'WTP', - p_last_upd_yyyymmddhh24miss=> '20180712001818', + p_last_upd_yyyymmddhh24miss=> '20180714021456', p_required_roles=> wwv_flow_utilities.string_to_table2('')); @@ -3241,7 +3241,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180711231222' + ,p_last_upd_yyyymmddhh24miss => '20180712214133' ); null; @@ -4224,6 +4224,146 @@ wwv_flow_api.create_page_item( p_item_comment => ''); +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>5012425937902708 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 2, + p_name=>'P2_USER', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 109, + p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'User: ', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'PLSQL', + p_attribute_03 => 'htp.p(USER);', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>5012705898925298 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 2, + p_name=>'P2_SYS_CONTEXT', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 119, + p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Sys Context:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'PLSQL', + p_attribute_03 => 'htp.p(sys_context(''userenv'', ''current_schema''));', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>5012915856947106 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 2, + p_name=>'P2_USERNAME', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 129, + p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'User Users: ', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'PLSQL', + p_attribute_03 => 'begin'||chr(10)|| +' for buff in (select username from user_users)'||chr(10)|| +' loop'||chr(10)|| +' htp.p(buff.username);'||chr(10)|| +' end loop;'||chr(10)|| +'end;', + p_show_quick_picks=>'N', + p_item_comment => ''); + + end; / diff --git a/src/gui/install.sql b/src/gui/install.sql index 09a9970..5eea7af 100644 --- a/src/gui/install.sql +++ b/src/gui/install.sql @@ -1,3 +1,6 @@ -- Must be run as sys grant select on dba_arguments to wtp; + +--revoke select on dba_objects from anonymous; +--revoke select on dba_source from anonymous; From 2463e2945fa26899408395ebe5bdf59ff72149aa Mon Sep 17 00:00:00 2001 From: DDieterich Date: Mon, 16 Jul 2018 23:22:46 -0500 Subject: [PATCH 009/141] Converted to DBMS_SCHDULER --- src/gui/Notes.txt | 2 +- src/gui/f700.sql | 891 ++++++++++++++++++----------------- src/gui/install.sql | 18 +- src/gui/wt_scheduler_jobs.vw | 25 + 4 files changed, 490 insertions(+), 446 deletions(-) create mode 100644 src/gui/wt_scheduler_jobs.vw diff --git a/src/gui/Notes.txt b/src/gui/Notes.txt index da1d62c..d416a52 100644 --- a/src/gui/Notes.txt +++ b/src/gui/Notes.txt @@ -165,7 +165,7 @@ DBOUTs are not global either. - +Convert to DBMS_Scheduler Need a DBOUT Search Page diff --git a/src/gui/f700.sql b/src/gui/f700.sql index cc76de4..52c9ca6 100644 --- a/src/gui/f700.sql +++ b/src/gui/f700.sql @@ -13,7 +13,7 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Application Export: -- Application: 700 -- Name: wtPLSQL Core GUI --- Date and Time: 02:14 Saturday July 14, 2018 +-- Date and Time: 23:21 Monday July 16, 2018 -- Exported By: WTP -- Flashback: 0 -- Export Type: Application Export @@ -26,12 +26,12 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Application Statistics: -- Pages: 6 --- Items: 53 +-- Items: 50 -- Computations: 0 -- Validations: 0 -- Processes: 15 --- Regions: 41 --- Buttons: 3 +-- Regions: 40 +-- Buttons: 2 -- Dynamic Actions: 4 -- Shared Components -- Breadcrumbs: 1 @@ -146,7 +146,7 @@ wwv_flow_api.create_flow( p_default_region_template=> 4840201642414912 + wwv_flow_api.g_id_offset, p_error_template=> 4837131094414910 + wwv_flow_api.g_id_offset, p_page_protection_enabled_y_n=> 'Y', - p_checksum_salt_last_reset => '20180714021456', + p_checksum_salt_last_reset => '20180716232117', p_max_session_length_sec=> 28800, p_home_link=> 'f?p=&APP_ID.:1:&SESSION.', p_flow_language=> 'en', @@ -192,7 +192,7 @@ wwv_flow_api.create_flow( p_default_listr_template => 4839116402414912 + wwv_flow_api.g_id_offset, p_default_irr_template => 4839831975414912 + wwv_flow_api.g_id_offset, p_last_updated_by => 'WTP', - p_last_upd_yyyymmddhh24miss=> '20180714021456', + p_last_upd_yyyymmddhh24miss=> '20180716232117', p_required_roles=> wwv_flow_utilities.string_to_table2('')); @@ -655,7 +655,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180711231229' + ,p_last_upd_yyyymmddhh24miss => '20180716223609' ); null; @@ -2343,20 +2343,25 @@ declare l_clob clob; l_length number := 1; begin -s:=s||'select system_status STATUS'||chr(10)|| -' ,owner'||chr(10)|| -' ,job JOB_ID'||chr(10)|| -' ,status TEST_RUNNER'||chr(10)|| -' ,created CREATED_DATE'||chr(10)|| -' ,system_modified MODIFIED_DATE'||chr(10)|| -' from apex_plsql_jobs'||chr(10)|| -' where system_status != ''COMPLETE'''; +s:=s||'select log_id'||chr(10)|| +' ,start_date'||chr(10)|| +' ,job_name'||chr(10)|| +' ,status'||chr(10)|| +' ,inst'||chr(10)|| +' ,session_id'||chr(10)|| +' ,os_pid'||chr(10)|| +' ,error_num'||chr(10)|| +' ,additional_info'||chr(10)|| +' from wt_scheduler_jobs'||chr(10)|| +' where status != ''SUCCEEDED'''||chr(10)|| +' and ( :P1_OWNER is null'||chr(10)|| +' or job_name like :P1_OWNER || ''$%'' )'; wwv_flow_api.create_report_region ( p_id=> 4868303731390297 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 1, - p_name=> 'List of Non-Complete APEX PLSQL Jobs', + p_name=> 'Selected Test Runner Jobs', p_region_name=>'', p_template=> 4840201642414912+ wwv_flow_api.g_id_offset, p_display_sequence=> 50, @@ -2393,17 +2398,18 @@ declare begin s := null; wwv_flow_api.create_report_columns ( - p_id=> 4881232628476372 + wwv_flow_api.g_id_offset, + p_id=> 5037626427564981 + wwv_flow_api.g_id_offset, p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_query_column_id=> 1, p_form_element_id=> null, - p_column_alias=> 'STATUS', - p_column_display_sequence=> 4, - p_column_heading=> 'Status', + p_column_alias=> 'LOG_ID', + p_column_display_sequence=> 1, + p_column_heading=> 'Log ID', p_column_alignment=>'LEFT', p_heading_alignment=>'CENTER', - p_default_sort_column_sequence=>0, + p_default_sort_column_sequence=>1, + p_default_sort_dir=>'desc', p_disable_sort_column=>'N', p_sum_column=> 'N', p_hidden_column=> 'N', @@ -2418,15 +2424,16 @@ declare begin s := null; wwv_flow_api.create_report_columns ( - p_id=> 4868904911390304 + wwv_flow_api.g_id_offset, + p_id=> 5039813342816631 + wwv_flow_api.g_id_offset, p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_query_column_id=> 2, p_form_element_id=> null, - p_column_alias=> 'OWNER', + p_column_alias=> 'START_DATE', p_column_display_sequence=> 2, - p_column_heading=> 'Owner', + p_column_heading=> 'Start Date', p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', p_default_sort_column_sequence=>0, p_disable_sort_column=>'N', p_sum_column=> 'N', @@ -2442,17 +2449,17 @@ declare begin s := null; wwv_flow_api.create_report_columns ( - p_id=> 4883106339673259 + wwv_flow_api.g_id_offset, + p_id=> 5037901990564982 + wwv_flow_api.g_id_offset, p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_query_column_id=> 3, p_form_element_id=> null, - p_column_alias=> 'JOB_ID', - p_column_display_sequence=> 1, - p_column_heading=> 'Job ID', + p_column_alias=> 'JOB_NAME', + p_column_display_sequence=> 3, + p_column_heading=> 'Job Name', p_column_alignment=>'LEFT', p_heading_alignment=>'CENTER', - p_default_sort_column_sequence=>1, + p_default_sort_column_sequence=>0, p_disable_sort_column=>'N', p_sum_column=> 'N', p_hidden_column=> 'N', @@ -2467,18 +2474,18 @@ declare begin s := null; wwv_flow_api.create_report_columns ( - p_id=> 4895626533688122 + wwv_flow_api.g_id_offset, + p_id=> 4881232628476372 + wwv_flow_api.g_id_offset, p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_query_column_id=> 4, p_form_element_id=> null, - p_column_alias=> 'TEST_RUNNER', - p_column_display_sequence=> 3, - p_column_heading=> 'Test Runner', + p_column_alias=> 'STATUS', + p_column_display_sequence=> 4, + p_column_heading=> 'Status', p_column_alignment=>'LEFT', p_heading_alignment=>'CENTER', p_default_sort_column_sequence=>0, - p_disable_sort_column=>'Y', + p_disable_sort_column=>'N', p_sum_column=> 'N', p_hidden_column=> 'N', p_display_as=>'ESCAPE_SC', @@ -2492,14 +2499,14 @@ declare begin s := null; wwv_flow_api.create_report_columns ( - p_id=> 4883218347673259 + wwv_flow_api.g_id_offset, + p_id=> 5038027139564982 + wwv_flow_api.g_id_offset, p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_query_column_id=> 5, p_form_element_id=> null, - p_column_alias=> 'CREATED_DATE', + p_column_alias=> 'INST', p_column_display_sequence=> 5, - p_column_heading=> 'Created Date', + p_column_heading=> 'Inst', p_column_alignment=>'LEFT', p_heading_alignment=>'CENTER', p_default_sort_column_sequence=>0, @@ -2517,14 +2524,89 @@ declare begin s := null; wwv_flow_api.create_report_columns ( - p_id=> 4883328315673259 + wwv_flow_api.g_id_offset, + p_id=> 5038112499564982 + wwv_flow_api.g_id_offset, p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_query_column_id=> 6, p_form_element_id=> null, - p_column_alias=> 'MODIFIED_DATE', + p_column_alias=> 'SESSION_ID', p_column_display_sequence=> 6, - p_column_heading=> 'Modified Date', + p_column_heading=> 'Session ID', + p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 5039922124816631 + wwv_flow_api.g_id_offset, + p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 7, + p_form_element_id=> null, + p_column_alias=> 'OS_PID', + p_column_display_sequence=> 7, + p_column_heading=> 'OS PID', + p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 5040017675816631 + wwv_flow_api.g_id_offset, + p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 8, + p_form_element_id=> null, + p_column_alias=> 'ERROR_NUM', + p_column_display_sequence=> 8, + p_column_heading=> 'Error Num', + p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 5038421217564982 + wwv_flow_api.g_id_offset, + p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 9, + p_form_element_id=> null, + p_column_alias=> 'ADDITIONAL_INFO', + p_column_display_sequence=> 9, + p_column_heading=> 'Additional Info', p_column_alignment=>'LEFT', p_heading_alignment=>'CENTER', p_default_sort_column_sequence=>0, @@ -3019,53 +3101,6 @@ wwv_flow_api.create_page_item( p_item_comment => ''); -end; -/ - -declare - h varchar2(32767) := null; -begin -wwv_flow_api.create_page_item( - p_id=>4885303924098377 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 1, - p_name=>'P1_JOBS_ENABLED', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 60, - p_item_plug_id => 4868303731390297+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'NO', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'PLSQL', - p_attribute_03 => 'begin'||chr(10)|| -' if apex_plsql_job.jobs_are_enabled'||chr(10)|| -' then'||chr(10)|| -' htp.p(''APEX PLSQL Jobs are Enabled'');'||chr(10)|| -' else'||chr(10)|| -' htp.p(''*** APEX PLSQL Jobs are NOT Enabled ***'');'||chr(10)|| -' end if;'||chr(10)|| -'end;', - p_item_comment => ''); - - end; / @@ -3241,7 +3276,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180712214133' + ,p_last_upd_yyyymmddhh24miss => '20180716231658' ); null; @@ -3258,9 +3293,9 @@ wwv_flow_api.create_page_plug ( p_id=> 4847515458414925 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 2, - p_plug_name=> 'Run Test:', + p_plug_name=> 'Run Test', p_region_name=>'', - p_plug_template=> 4838619911414911+ wwv_flow_api.g_id_offset, + p_plug_template=> 4839912075414912+ wwv_flow_api.g_id_offset, p_plug_display_sequence=> 1, p_plug_display_column=> 1, p_plug_display_point=> 'BEFORE_SHOW_ITEMS', @@ -3281,25 +3316,28 @@ declare l_clob clob; l_length number := 1; begin -s:=s||'select job JOB_ID'||chr(10)|| -' ,owner'||chr(10)|| -' ,status DESCRIPTION'||chr(10)|| -' ,system_status STATUS'||chr(10)|| -' ,created CREATED_DATE'||chr(10)|| -' ,system_modified MODIFIED_DATE'||chr(10)|| -' ,enduser'||chr(10)|| -' from apex_plsql_jobs'; +s:=s||'select log_id'||chr(10)|| +' ,start_date'||chr(10)|| +' ,job_name'||chr(10)|| +' ,status'||chr(10)|| +' ,inst'||chr(10)|| +' ,session_id'||chr(10)|| +' ,os_pid'||chr(10)|| +' ,error_num'||chr(10)|| +' ,additional_info'||chr(10)|| +' from wt_scheduler_jobs'||chr(10)|| +' where job_name like :APP_USER || ''$%'''; wwv_flow_api.create_page_plug ( p_id=> 4885513244116318 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 2, - p_plug_name=> 'APEX PLSQL Jobs', + p_plug_name=> 'DBMS_SCHEDULER Jobs', p_region_name=>'', p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, p_plug_display_sequence=> 4, p_plug_display_column=> 1, - p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_display_point=> 'AFTER_SHOW_ITEMS', p_plug_source=> s, p_plug_source_type=> 'DYNAMIC_QUERY', p_translate_title=> 'Y', @@ -3317,14 +3355,17 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select job JOB_ID'||chr(10)|| -' ,owner'||chr(10)|| -' ,status DESCRIPTION'||chr(10)|| -' ,system_status STATUS'||chr(10)|| -' ,created CREATED_DATE'||chr(10)|| -' ,system_modified MODIFIED_DATE'||chr(10)|| -' ,enduser'||chr(10)|| -' from apex_plsql_jobs'; +a1:=a1||'select log_id'||chr(10)|| +' ,start_date'||chr(10)|| +' ,job_name'||chr(10)|| +' ,status'||chr(10)|| +' ,inst'||chr(10)|| +' ,session_id'||chr(10)|| +' ,os_pid'||chr(10)|| +' ,error_num'||chr(10)|| +' ,additional_info'||chr(10)|| +' from wt_scheduler_jobs'||chr(10)|| +' where job_name like :APP_USER || ''$%'''; wwv_flow_api.create_worksheet( p_id=> 4885631457116318+wwv_flow_api.g_id_offset, @@ -3387,16 +3428,16 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 4886006079116325+wwv_flow_api.g_id_offset, + p_id => 5032410666172454+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 2, p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, - p_db_column_name =>'JOB_ID', + p_db_column_name =>'LOG_ID', p_display_order =>1, p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'C', - p_column_label =>'Job ID', - p_report_label =>'Job ID', + p_column_identifier =>'B', + p_column_label =>'Log ID', + p_report_label =>'Log ID', p_sync_form_label =>'Y', p_display_in_default_rpt =>'Y', p_is_sortable =>'Y', @@ -3425,16 +3466,16 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 4885924971116325+wwv_flow_api.g_id_offset, + p_id => 5039132211784254+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 2, p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, - p_db_column_name =>'OWNER', + p_db_column_name =>'START_DATE', p_display_order =>2, p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'B', - p_column_label =>'Owner', - p_report_label =>'Owner', + p_column_identifier =>'K', + p_column_label =>'Start Date', + p_report_label =>'Start Date', p_sync_form_label =>'Y', p_display_in_default_rpt =>'Y', p_is_sortable =>'Y', @@ -3449,7 +3490,7 @@ wwv_flow_api.create_worksheet_column( p_allow_hide =>'Y', p_others_may_edit =>'Y', p_others_may_view =>'Y', - p_column_type =>'STRING', + p_column_type =>'DATE', p_display_as =>'TEXT', p_display_text_as =>'ESCAPE_SC', p_heading_alignment =>'CENTER', @@ -3463,16 +3504,16 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 4942325417968988+wwv_flow_api.g_id_offset, + p_id => 5032729825172455+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 2, p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, - p_db_column_name =>'DESCRIPTION', + p_db_column_name =>'JOB_NAME', p_display_order =>3, p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'F', - p_column_label =>'Description', - p_report_label =>'Description', + p_column_identifier =>'E', + p_column_label =>'Job Name', + p_report_label =>'Job Name', p_sync_form_label =>'Y', p_display_in_default_rpt =>'Y', p_is_sortable =>'Y', @@ -3539,16 +3580,16 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 4886115192116325+wwv_flow_api.g_id_offset, + p_id => 5039226462784262+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 2, p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, - p_db_column_name =>'CREATED_DATE', + p_db_column_name =>'INST', p_display_order =>5, p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'D', - p_column_label =>'Created Date', - p_report_label =>'Created Date', + p_column_identifier =>'L', + p_column_label =>'Inst', + p_report_label =>'Inst', p_sync_form_label =>'Y', p_display_in_default_rpt =>'Y', p_is_sortable =>'Y', @@ -3563,11 +3604,11 @@ wwv_flow_api.create_worksheet_column( p_allow_hide =>'Y', p_others_may_edit =>'Y', p_others_may_view =>'Y', - p_column_type =>'DATE', + p_column_type =>'NUMBER', p_display_as =>'TEXT', p_display_text_as =>'ESCAPE_SC', p_heading_alignment =>'CENTER', - p_column_alignment =>'LEFT', + p_column_alignment =>'RIGHT', p_tz_dependent =>'N', p_rpt_distinct_lov =>'Y', p_rpt_show_filter_lov =>'D', @@ -3577,16 +3618,16 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 4886225579116325+wwv_flow_api.g_id_offset, + p_id => 5040419669875210+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 2, p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, - p_db_column_name =>'MODIFIED_DATE', + p_db_column_name =>'SESSION_ID', p_display_order =>6, p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'E', - p_column_label =>'Modified Date', - p_report_label =>'Modified Date', + p_column_identifier =>'O', + p_column_label =>'Session ID', + p_report_label =>'Session ID', p_sync_form_label =>'Y', p_display_in_default_rpt =>'Y', p_is_sortable =>'Y', @@ -3601,11 +3642,11 @@ wwv_flow_api.create_worksheet_column( p_allow_hide =>'Y', p_others_may_edit =>'Y', p_others_may_view =>'Y', - p_column_type =>'DATE', + p_column_type =>'NUMBER', p_display_as =>'TEXT', p_display_text_as =>'ESCAPE_SC', p_heading_alignment =>'CENTER', - p_column_alignment =>'LEFT', + p_column_alignment =>'RIGHT', p_tz_dependent =>'N', p_rpt_distinct_lov =>'Y', p_rpt_show_filter_lov =>'D', @@ -3615,16 +3656,92 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 4944400464160472+wwv_flow_api.g_id_offset, + p_id => 5040526819875210+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 2, p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, - p_db_column_name =>'ENDUSER', + p_db_column_name =>'OS_PID', p_display_order =>7, p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'G', - p_column_label =>'End User', - p_report_label =>'End User', + p_column_identifier =>'P', + p_column_label =>'OS PID', + p_report_label =>'OS PID', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5039401783784262+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 2, + p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, + p_db_column_name =>'ERROR_NUM', + p_display_order =>8, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'N', + p_column_label =>'Error Num', + p_report_label =>'Error Num', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5033208190172456+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 2, + p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, + p_db_column_name =>'ADDITIONAL_INFO', + p_display_order =>9, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'J', + p_column_label =>'Additional Info', + p_report_label =>'Additional Info', p_sync_form_label =>'Y', p_display_in_default_rpt =>'Y', p_is_sortable =>'Y', @@ -3654,7 +3771,7 @@ end; declare rc1 varchar2(32767) := null; begin -rc1:=rc1||'JOB_ID:OWNER:DESCRIPTION:STATUS:CREATED_DATE:MODIFIED_DATE'; +rc1:=rc1||'LOG_ID:START_DATE:JOB_NAME:STATUS:INST:SESSION_ID:OS_PID:ERROR_NUM:ADDITIONAL_INFO'; wwv_flow_api.create_worksheet_rpt( p_id => 4886308472128052+wwv_flow_api.g_id_offset, @@ -3671,15 +3788,25 @@ wwv_flow_api.create_worksheet_rpt( p_is_default =>'Y', p_display_rows =>10, p_report_columns =>rc1, - p_sort_column_1 =>'JOB_ID', + p_sort_column_1 =>'LOG_ID', p_sort_direction_1 =>'DESC', + p_sort_column_2 =>'0', + p_sort_direction_2 =>'DESC', + p_sort_column_3 =>'0', + p_sort_direction_3 =>'ASC', + p_sort_column_4 =>'0', + p_sort_direction_4 =>'ASC', + p_sort_column_5 =>'0', + p_sort_direction_5 =>'ASC', + p_sort_column_6 =>'0', + p_sort_direction_6 =>'ASC', p_flashback_enabled =>'N', p_calendar_display_column =>''); end; / begin wwv_flow_api.create_worksheet_condition( - p_id => 4942606979982528+wwv_flow_api.g_id_offset, + p_id => 5039623254809995+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 2, p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, @@ -3687,10 +3814,10 @@ wwv_flow_api.create_worksheet_condition( p_condition_type =>'FILTER', p_allow_delete =>'Y', p_column_name =>'STATUS', - p_operator =>'!=', - p_expr =>'COMPLETE', - p_condition_sql =>'"STATUS" != #APXWS_EXPR#', - p_condition_display =>'#APXWS_COL_NAME# != ''COMPLETE'' ', + p_operator =>'=', + p_expr =>'RUNNING', + p_condition_sql =>'"STATUS" = #APXWS_EXPR#', + p_condition_display =>'#APXWS_COL_NAME# = ''RUNNING'' ', p_enabled =>'Y', p_column_format =>''); end; @@ -3700,76 +3827,16 @@ declare l_clob clob; l_length number := 1; begin -s:=s||'
    '||chr(10)|| -'

    '||chr(10)|| -'APEX PLSQL Jobs Statuses:'||chr(10)|| -'

    '||chr(10)|| -'
    • '||chr(10)|| -'SUBMITTED indicates the job has been submitted, but has not yet started. The DBMS_JOB does not guarantee immediate starting of jobs.'||chr(10)|| -'
    • '||chr(10)|| -'IN PROGRESS indicates that the DBMS_JOB has started the process.'||chr(10)|| -'
    • '||chr(10)|| -'COMPLETED indicates the job has finished.'||chr(10)|| -'
    • '||chr(10)|| -'BROKEN (sqlcode) sqlerrm indicates there was a'; - -s:=s||' problem in your job that resulted in an error. The SQL code and SQL error message for the error should be included in the system status.'||chr(10)|| -'

    '||chr(10)|| -'Oracle Docs: Application Express Application Builder User''s Guide,'||chr(10)|| -'Running Background PL/SQL
    '||chr(10)|| -'
    '||chr(10)|| -''||chr(10)|| -'APEX PLSQL Job Logs:'||chr(10)|| -''; - -s:=s||''; - -wwv_flow_api.create_page_plug ( - p_id=> 4888312946252430 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 2, - p_plug_name=> 'Space and Title', - p_region_name=>'', - p_plug_template=> 4839912075414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 3, - p_plug_display_column=> 1, - p_plug_display_point=> 'BEFORE_SHOW_ITEMS', - p_plug_source=> s, - p_plug_source_type=> 'STATIC_TEXT', - p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', - p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'QUERY_COLUMNS', - p_plug_query_num_rows_type => 'NEXT_PREVIOUS_LINKS', - p_plug_query_row_count_max => 500, - p_plug_query_show_nulls_as => ' - ', - p_plug_display_condition_type => '', - p_pagination_display_position=>'BOTTOM_RIGHT', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); -end; -/ -declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; -begin -s:=s||'
    '||chr(10)|| -'
    '||chr(10)|| -''||chr(10)|| -'APEX PLSQL Job Logs Cleanup:'||chr(10)|| -''; - +s := null; wwv_flow_api.create_page_plug ( - p_id=> 4891414311501831 + wwv_flow_api.g_id_offset, + p_id=> 5024330300632423 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 2, - p_plug_name=> 'Purge Jobs', + p_plug_name=> 'Test Runner Jobs Setup', p_region_name=>'', p_plug_template=> 4839912075414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 2, - p_plug_display_column=> 1, + p_plug_display_sequence=> 14, + p_plug_display_column=> 3, p_plug_display_point=> 'BEFORE_SHOW_ITEMS', p_plug_source=> s, p_plug_source_type=> 'STATIC_TEXT', @@ -3791,21 +3858,6 @@ end; begin -wwv_flow_api.create_page_button( - p_id => 4936632007346341 + wwv_flow_api.g_id_offset, - p_flow_id => wwv_flow.g_flow_id, - p_flow_step_id => 2, - p_button_sequence=> 10, - p_button_plug_id => 4891414311501831+wwv_flow_api.g_id_offset, - p_button_name => 'PURGE_LOGS', - p_button_image => 'template:'||to_char(4838306817414911+wwv_flow_api.g_id_offset), - p_button_image_alt=> 'Purge Job Logs', - p_button_position=> 'BOTTOM', - p_button_alignment=> 'LEFT', - p_button_redirect_url=> 'javascript:confirmDelete(''Confirm purge of APEX_PLSQL_JOBS older than '' + document.getElementById(''P2_PURGE_DAYS'').value + '' days'', ''PURGE_LOGS'')', - p_button_execute_validations=>'Y', - p_required_patch => null + wwv_flow_api.g_id_offset); - wwv_flow_api.create_page_button( p_id => 4943012566012609 + wwv_flow_api.g_id_offset, p_flow_id => wwv_flow.g_flow_id, @@ -3867,7 +3919,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> true, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 1, + p_item_sequence=> 2, p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -3927,7 +3979,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 2, + p_item_sequence=> 3, p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'NO', p_item_default=> 'RUN_TEST', @@ -3940,7 +3992,7 @@ wwv_flow_api.create_page_item( p_cSize=> null, p_cMaxlength=> 2000, p_cHeight=> null, - p_begin_on_new_line=> 'NO', + p_begin_on_new_line=> 'YES', p_begin_on_new_field=> 'YES', p_colspan=> 1, p_rowspan=> 1, @@ -3951,52 +4003,6 @@ wwv_flow_api.create_page_item( p_item_comment => ''); -end; -/ - -declare - h varchar2(32767) := null; -begin -wwv_flow_api.create_page_item( - p_id=>4878816026232509 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 2, - p_name=>'P2_LAST_JOB_ID', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 3, - p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Last Job ID: ', - p_source=>'select max(job) from apex_plsql_jobs;', - p_source_type=> 'QUERY', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'Y', - p_show_quick_picks=>'N', - p_item_comment => ''); - - end; / @@ -4007,12 +4013,12 @@ wwv_flow_api.create_page_item( p_id=>4884208416023999 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_flow_step_id=> 2, - p_name=>'P2_JOBS_ENABLED', + p_name=>'P2_JOBS_PARAMETER', p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 4, - p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, + p_item_sequence=> 1, + p_item_plug_id => 5024330300632423+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', p_source_type=> 'STATIC', @@ -4023,7 +4029,7 @@ wwv_flow_api.create_page_item( p_cMaxlength=> 4000, p_cHeight=> 1, p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'NO', + p_begin_on_new_line=> 'YES', p_begin_on_new_field=> 'YES', p_colspan=> 1, p_rowspan=> 1, @@ -4037,12 +4043,30 @@ wwv_flow_api.create_page_item( p_attribute_01 => 'N', p_attribute_02 => 'PLSQL', p_attribute_03 => 'begin'||chr(10)|| -' if apex_plsql_job.jobs_are_enabled'||chr(10)|| -' then'||chr(10)|| -' htp.p(''APEX PLSQL Jobs are Enabled'');'||chr(10)|| -' else'||chr(10)|| -' htp.p(''*** APEX PLSQL Jobs are NOT Enabled ***'');'||chr(10)|| -' end if;'||chr(10)|| +' htp.p(''Job Queue Process Parameter:
    '');'||chr(10)|| +' htp.p(''
      '');'||chr(10)|| +' for buff in ('||chr(10)|| +' select inst_id, value'||chr(10)|| +' from sys.gv_$parameter'||chr(10)|| +' where name = ''job_queue_processes'''||chr(10)|| +' order by inst_id )'||chr(10)|| +' loop'||chr(10)|| +' htp.p(''
    • '');'||chr(10)|| +' if buff.value > 0'||chr(10)|| +' then'||chr(10)|| +' htp.p(''Instance '' || buff.inst_id ||'||chr(10)|| +' '': '' || buff.value ||'||chr(10)|| +' '''');'||chr(10)|| +' else'||chr(10)|| +' htp.p(''Instance '' || buff.inst_id ||'||chr(10)|| +' '': '' || buff.value ||'||chr(10)|| +' '''');'||chr(10)|| +' end if;'||chr(10)|| +' htp.p(''
    • '');'||chr(10)|| +' end loop;'||chr(10)|| +' htp.p(''
    '');'||chr(10)|| +' htp.p(''
    '');'||chr(10)|| +' htp.p(''
    '');'||chr(10)|| 'end;', p_show_quick_picks=>'N', p_item_comment => ''); @@ -4055,43 +4079,35 @@ declare h varchar2(32767) := null; begin wwv_flow_api.create_page_item( - p_id=>4889602986280871 + wwv_flow_api.g_id_offset, + p_id=>5026010934853871 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_flow_step_id=> 2, - p_name=>'P2_PURGE_DAYS', + p_name=>'P2_RESET_DB_LINK', p_data_type=> 'VARCHAR', - p_is_required=> true, + p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 3, - p_item_plug_id => 4891414311501831+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Older Than (Days):', - p_format_mask=>'999', - p_source=>'5', + p_item_sequence=> 5, + p_item_plug_id => 5024330300632423+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'NO', + p_item_default=> 'RESET_DB_LINK', + p_prompt=>'Reset DB Link', + p_source=>'RESET_DB_LINK', p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_NUMBER_FIELD', + p_display_as=> 'BUTTON', p_lov_display_null=> 'NO', p_lov_translated=> 'N', - p_cSize=> 3, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', + p_cSize=> null, + p_cMaxlength=> 2000, + p_cHeight=> null, p_begin_on_new_line=> 'YES', p_begin_on_new_field=> 'YES', p_colspan=> 1, p_rowspan=> 1, p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => '0', - p_attribute_02 => '999', - p_attribute_03 => 'right', - p_show_quick_picks=>'N', + p_field_alignment=> 'LEFT', + p_display_when=>'apex_plsql_job.jobs_are_enabled = FALSE', + p_is_persistent=> 'N', + p_button_execute_validations=>'Y', p_item_comment => ''); @@ -4102,25 +4118,24 @@ declare h varchar2(32767) := null; begin wwv_flow_api.create_page_item( - p_id=>4890910455472266 + wwv_flow_api.g_id_offset, + p_id=>5027508136976108 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_flow_step_id=> 2, - p_name=>'P2_NUM_LOGS', + p_name=>'P2_PASSWORD', p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 2, - p_item_plug_id => 4891414311501831+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'NO', + p_item_sequence=> 4, + p_item_plug_id => 5024330300632423+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Number of Logs:', - p_source=>'select count(*) from apex_plsql_jobs', - p_source_type=> 'QUERY', - p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_prompt=>'Password:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_PASSWORD', p_lov_display_null=> 'NO', p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, + p_cSize=> 15, + p_cMaxlength=> 128, p_cHeight=> 1, p_cAttributes=> 'nowrap="nowrap"', p_begin_on_new_line=> 'YES', @@ -4128,15 +4143,13 @@ wwv_flow_api.create_page_item( p_colspan=> 1, p_rowspan=> 1, p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_field_alignment=> 'LEFT', p_is_persistent=> 'Y', p_lov_display_extra=>'YES', p_protection_level => 'N', p_escape_on_http_output => 'Y', p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'Y', + p_attribute_02 => 'Y', p_show_quick_picks=>'N', p_item_comment => ''); @@ -4148,25 +4161,25 @@ declare h varchar2(32767) := null; begin wwv_flow_api.create_page_item( - p_id=>4893230521026887 + wwv_flow_api.g_id_offset, + p_id=>5028532733058845 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_flow_step_id=> 2, - p_name=>'P2_LOGS_AGE', + p_name=>'P2_TNS_PORT', p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 1, - p_item_plug_id => 4891414311501831+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'NO', + p_item_sequence=> 3, + p_item_plug_id => 5024330300632423+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Oldest Logs (Days):', - p_source=>'select round(sysdate - min(created)) from apex_plsql_jobs', - p_source_type=> 'QUERY', - p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_prompt=>'TNS Port:', + p_source=>'1521', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_NUMBER_FIELD', p_lov_display_null=> 'NO', p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, + p_cSize=> 6, + p_cMaxlength=> 6, p_cHeight=> 1, p_cAttributes=> 'nowrap="nowrap"', p_begin_on_new_line=> 'YES', @@ -4180,9 +4193,9 @@ wwv_flow_api.create_page_item( p_lov_display_extra=>'YES', p_protection_level => 'N', p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'Y', + p_attribute_01 => '0', + p_attribute_02 => '65535', + p_attribute_03 => 'right', p_show_quick_picks=>'N', p_item_comment => ''); @@ -4194,55 +4207,18 @@ declare h varchar2(32767) := null; begin wwv_flow_api.create_page_item( - p_id=>4938219727456401 + wwv_flow_api.g_id_offset, + p_id=>5029510053130586 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_flow_step_id=> 2, - p_name=>'P2_NUM_JOBS_PURGED', + p_name=>'P2_DB_LINK_MISSING', p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 99, - p_item_plug_id => 4891414311501831+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_HIDDEN', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> null, - p_cMaxlength=> 4000, - p_cHeight=> null, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'NO', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'LEFT', - p_field_alignment=> 'LEFT', - p_is_persistent=> 'Y', - p_attribute_01 => 'N', - p_item_comment => ''); - - -end; -/ - -declare - h varchar2(32767) := null; -begin -wwv_flow_api.create_page_item( - p_id=>5012425937902708 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 2, - p_name=>'P2_USER', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 109, - p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, + p_item_sequence=> 2, + p_item_plug_id => 5024330300632423+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'User: ', + p_prompt=>'Loopback DB Link:', p_source_type=> 'STATIC', p_display_as=> 'NATIVE_DISPLAY_ONLY', p_lov_display_null=> 'NO', @@ -4264,7 +4240,16 @@ wwv_flow_api.create_page_item( p_escape_on_http_output => 'Y', p_attribute_01 => 'N', p_attribute_02 => 'PLSQL', - p_attribute_03 => 'htp.p(USER);', + p_attribute_03 => 'declare'||chr(10)|| +' junk varchar2(1);'||chr(10)|| +'begin'||chr(10)|| +' select ''x'' into junk'||chr(10)|| +' from user_db_links'||chr(10)|| +' where db_link = :APP_USER;'||chr(10)|| +' htp.p(''DB Link Found for '' || :APP_USER || '''');'||chr(10)|| +'exception when NO_DATA_FOUND then'||chr(10)|| +' htp.p(''*** DB Link Missing for '' || :APP_USER || '' ***'');'||chr(10)|| +'end;', p_show_quick_picks=>'N', p_item_comment => ''); @@ -4276,18 +4261,17 @@ declare h varchar2(32767) := null; begin wwv_flow_api.create_page_item( - p_id=>5012705898925298 + wwv_flow_api.g_id_offset, + p_id=>5035808710455768 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_flow_step_id=> 2, - p_name=>'P2_SYS_CONTEXT', + p_name=>'P2_SPACER', p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 119, + p_item_sequence=> 6, p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Sys Context:', p_source_type=> 'STATIC', p_display_as=> 'NATIVE_DISPLAY_ONLY', p_lov_display_null=> 'NO', @@ -4309,7 +4293,11 @@ wwv_flow_api.create_page_item( p_escape_on_http_output => 'Y', p_attribute_01 => 'N', p_attribute_02 => 'PLSQL', - p_attribute_03 => 'htp.p(sys_context(''userenv'', ''current_schema''));', + p_attribute_03 => 'begin'||chr(10)|| +' htp.p(''
    '');'||chr(10)|| +' htp.p(''
    '');'||chr(10)|| +'end;'||chr(10)|| +'', p_show_quick_picks=>'N', p_item_comment => ''); @@ -4321,20 +4309,21 @@ declare h varchar2(32767) := null; begin wwv_flow_api.create_page_item( - p_id=>5012915856947106 + wwv_flow_api.g_id_offset, + p_id=>5040913192005864 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_flow_step_id=> 2, - p_name=>'P2_USERNAME', + p_name=>'P2_APP_OWNER', p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 129, - p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, + p_item_sequence=> 16, + p_item_plug_id => 5024330300632423+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'User Users: ', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_prompt=>'APP_OWNER', + p_source=>'select owner from apex_applications where application_id = :APP_ID', + p_source_type=> 'QUERY', + p_display_as=> 'NATIVE_HIDDEN', p_lov_display_null=> 'NO', p_lov_translated=> 'N', p_cSize=> 30, @@ -4345,21 +4334,13 @@ wwv_flow_api.create_page_item( p_begin_on_new_field=> 'YES', p_colspan=> 1, p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_label_alignment=> 'LEFT', + p_field_alignment=> 'LEFT', p_is_persistent=> 'Y', p_lov_display_extra=>'YES', p_protection_level => 'N', p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'PLSQL', - p_attribute_03 => 'begin'||chr(10)|| -' for buff in (select username from user_users)'||chr(10)|| -' loop'||chr(10)|| -' htp.p(buff.username);'||chr(10)|| -' end loop;'||chr(10)|| -'end;', + p_attribute_01 => 'Y', p_show_quick_picks=>'N', p_item_comment => ''); @@ -4375,12 +4356,23 @@ declare l_clob clob; l_length number := 1; begin -p:=p||'begin'||chr(10)|| -' :P2_LAST_JOB_ID := apex_plsql_job.submit_process'||chr(10)|| -' (p_sql => ''begin wtplsql.test_run('''''' ||'||chr(10)|| -' :P2_TEST_RUNNER || ''''''); end;'''||chr(10)|| -' ,p_status => substr(''Running '' || :P2_TEST_RUNNER,1,100) );'||chr(10)|| -'end;'; +p:=p||'DECLARE'||chr(10)|| +' run_str varchar2(2000) := ''wtplsql.test_run@'' ||'||chr(10)|| +' :APP_USER || ''('''''' ||'||chr(10)|| +' :P2_TEST_RUNNER || '''''')'' ;'||chr(10)|| +'BEGIN'||chr(10)|| +' -- run_str := :P2_APP_OWNER || ''.'' || run_str;'||chr(10)|| +' DBMS_SCHEDULER.CREATE_JOB ('||chr(10)|| +' job_name => substr(:APP_USER || ''$'' || :P2_TEST_RUNNER'||chr(10)|| +' ,1,30),'||chr(10)|| +' job_type => ''PLSQL_BLOCK'','||chr(10)|| +' job_'; + +p:=p||'action => ''begin '' || run_str || ''; commit; end;'','||chr(10)|| +' comments => run_str,'||chr(10)|| +' enabled => TRUE);'||chr(10)|| +' COMMIT;'||chr(10)|| +'END;'; wwv_flow_api.create_page_process( p_id => 4876513059692293 + wwv_flow_api.g_id_offset, @@ -4391,10 +4383,10 @@ wwv_flow_api.create_page_process( p_process_type=> 'PLSQL', p_process_name=> 'RUN_TEST', p_process_sql_clob => p, - p_process_error_message=> 'Failed to submit job (&P2_LAST_JOB_ID.)', + p_process_error_message=> '', p_process_when=>'RUN_TEST', p_process_when_type=>'REQUEST_EQUALS_CONDITION', - p_process_success_message=> 'Successful submitted job &P2_LAST_JOB_ID.', + p_process_success_message=> '', p_process_is_stateful_y_n=>'N', p_process_comment=>''); end; @@ -4411,12 +4403,21 @@ declare l_clob clob; l_length number := 1; begin -p:=p||'begin'||chr(10)|| -' :P2_LAST_JOB_ID := apex_plsql_job.submit_process'||chr(10)|| -' (p_sql => ''begin wtplsql.test_all; end;'''||chr(10)|| -' ,p_status => substr(''All Test Runners for '' ||'||chr(10)|| -' :APP_USER,1,100) );'||chr(10)|| -'end;'; +p:=p||'DECLARE'||chr(10)|| +' run_str varchar2(2000) := ''wtplsql.test_all@'' || :APP_USER;'||chr(10)|| +'BEGIN'||chr(10)|| +' -- run_str := :P2_APP_OWNER || ''.'' || run_str;'||chr(10)|| +' DBMS_SCHEDULER.CREATE_JOB ('||chr(10)|| +' job_name => substr(:APP_USER || ''$TEST$ALL'''||chr(10)|| +' ,1,30),'||chr(10)|| +' job_type => ''PLSQL_BLOCK'','||chr(10)|| +' job_action => ''begin '' || run_str || ''; commit; end;'','||chr(10)|| +' comments => run_str,'||chr(10)|| +' enabled => '; + +p:=p||' TRUE);'||chr(10)|| +' COMMIT;'||chr(10)|| +'END;'; wwv_flow_api.create_page_process( p_id => 4941719483938905 + wwv_flow_api.g_id_offset, @@ -4447,33 +4448,41 @@ declare l_clob clob; l_length number := 1; begin -p:=p||'declare'||chr(10)|| -' num_jobs number := 0;'||chr(10)|| -'begin'||chr(10)|| -' :P2_NUM_JOBS_PURGED := num_jobs;'||chr(10)|| -' for buff in ('||chr(10)|| -' select job from apex_plsql_jobs'||chr(10)|| -' where created < sysdate - :P2_PURGE_DAYS )'||chr(10)|| -' loop'||chr(10)|| -' apex_plsql_job.purge_process(buff.job);'||chr(10)|| -' num_jobs := num_jobs + 1;'||chr(10)|| -' end loop;'||chr(10)|| -' :P2_NUM_JOBS_PURGED := num_jobs;'||chr(10)|| +p:=p||'begin'||chr(10)|| +' --'||chr(10)|| +' begin'||chr(10)|| +' execute immediate ''drop database link loopback'';'||chr(10)|| +' exception when OTHERS then'||chr(10)|| +' if SQLERRM = ''ORA-02024: database link not found'''||chr(10)|| +' then'||chr(10)|| +' null; -- Ignore Exception'||chr(10)|| +' else'||chr(10)|| +' raise;'||chr(10)|| +' end if;'||chr(10)|| +' end;'||chr(10)|| +' --'||chr(10)|| +' execute immediate ''create database link '' || :APP_USER ||'||chr(10)|| +' '' connect to '' || :APP_USER ||'||chr(10)|| +' '; + +p:=p||' '' identified by '' || :P2_PASSWORD ||'||chr(10)|| +' '' using ''''//localost:'' || :P2_TNS_PORT ||'||chr(10)|| +' ''/'' || SYS_CONTEXT(''USERENV'',''DB_NAME'') || '''''''';'||chr(10)|| 'end;'; wwv_flow_api.create_page_process( - p_id => 4890226759353997 + wwv_flow_api.g_id_offset, + p_id => 5027926237038111 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_flow_step_id => 2, - p_process_sequence=> 30, + p_process_sequence=> 40, p_process_point=> 'AFTER_SUBMIT', p_process_type=> 'PLSQL', - p_process_name=> 'PURGE_LOGS', + p_process_name=> 'RESET_DB_LINK', p_process_sql_clob => p, - p_process_error_message=> 'Log Purge Failure after &P2_NUM_JOBS_PURGED. jobs.', - p_process_when=>'PURGE_LOGS', + p_process_error_message=> '#SQLERRM#', + p_process_when=>'RESET_DB_LINK', p_process_when_type=>'REQUEST_EQUALS_CONDITION', - p_process_success_message=> 'Successfully Purged &P2_NUM_JOBS_PURGED. jobs.', + p_process_success_message=> '', p_process_is_stateful_y_n=>'N', p_process_comment=>''); end; diff --git a/src/gui/install.sql b/src/gui/install.sql index 5eea7af..ae88de7 100644 --- a/src/gui/install.sql +++ b/src/gui/install.sql @@ -1,6 +1,16 @@ --- Must be run as sys -grant select on dba_arguments to wtp; +-- Can be run as SYSTEM +grant create job to &schema_owner.; +grant create database link to &schema_owner.; +grant create job to &schema_owner.; ---revoke select on dba_objects from anonymous; ---revoke select on dba_source from anonymous; +-- Must be run as SYS +grant select on dba_arguments to &schema_owner.; +grant select on gv_$parameter to &schema_owner.; + +-- Install Views +@wt_test_runs_gui_tree.vw +@wt_scheduler_jobs.vw + +-- Install APEX Application +@f700.sql diff --git a/src/gui/wt_scheduler_jobs.vw b/src/gui/wt_scheduler_jobs.vw new file mode 100644 index 0000000..263d61e --- /dev/null +++ b/src/gui/wt_scheduler_jobs.vw @@ -0,0 +1,25 @@ + +create or replace view wt_scheduler_jobs as +select round(log_id) LOG_ID + ,systimestamp - elapsed_time START_DATE + ,job_name + ,'RUNNING' STATUS + ,running_instance INST + ,session_id + ,slave_process_id OS_PID + ,NULL ERROR_NUM + ,NULL ADDITIONAL_INFO + from user_scheduler_running_jobs +union all +select log_id + ,actual_start_date START_DATE + ,job_name + ,status + ,instance_id INST + ,NULL SESSION_ID + ,NULL OS_PID + ,error# ERROR_NUM + ,additional_info + from user_scheduler_job_run_details; + +select owner from apex_applications where application_id = 700; From 47b9f5167a33f71b3f000ec340be874de2e4b7fa Mon Sep 17 00:00:00 2001 From: DDieterich Date: Tue, 17 Jul 2018 22:41:37 -0500 Subject: [PATCH 010/141] Jobs Working, DBOUT Search Done --- src/gui/Notes.txt | 5 - src/gui/f700.sql | 1297 +++++++++++++++++++++++++++++++++++++++--- src/gui/job_test.sql | 100 ++++ 3 files changed, 1312 insertions(+), 90 deletions(-) create mode 100644 src/gui/job_test.sql diff --git a/src/gui/Notes.txt b/src/gui/Notes.txt index d416a52..f3b435e 100644 --- a/src/gui/Notes.txt +++ b/src/gui/Notes.txt @@ -164,11 +164,6 @@ DBOUTs are not global either. * Code Coverage Details (Optional, HTML Text) - -Convert to DBMS_Scheduler - -Need a DBOUT Search Page - Fix all the Links * Test Case Page diff --git a/src/gui/f700.sql b/src/gui/f700.sql index 52c9ca6..68f2aa0 100644 --- a/src/gui/f700.sql +++ b/src/gui/f700.sql @@ -13,7 +13,7 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Application Export: -- Application: 700 -- Name: wtPLSQL Core GUI --- Date and Time: 23:21 Monday July 16, 2018 +-- Date and Time: 22:38 Tuesday July 17, 2018 -- Exported By: WTP -- Flashback: 0 -- Export Type: Application Export @@ -25,12 +25,12 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Using SQL*Plus as the Oracle user APEX_040000 or as the owner (parsing schema) of the application. -- Application Statistics: --- Pages: 6 +-- Pages: 7 -- Items: 50 -- Computations: 0 -- Validations: 0 -- Processes: 15 --- Regions: 40 +-- Regions: 41 -- Buttons: 2 -- Dynamic Actions: 4 -- Shared Components @@ -41,7 +41,7 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Processes: 1 -- Parent Tabs: 0 -- Tab Sets: 1 --- Tabs: 5 +-- Tabs: 6 -- NavBars: 1 -- Lists: 0 -- Shortcuts: 0 @@ -146,7 +146,7 @@ wwv_flow_api.create_flow( p_default_region_template=> 4840201642414912 + wwv_flow_api.g_id_offset, p_error_template=> 4837131094414910 + wwv_flow_api.g_id_offset, p_page_protection_enabled_y_n=> 'Y', - p_checksum_salt_last_reset => '20180716232117', + p_checksum_salt_last_reset => '20180717223847', p_max_session_length_sec=> 28800, p_home_link=> 'f?p=&APP_ID.:1:&SESSION.', p_flow_language=> 'en', @@ -192,7 +192,7 @@ wwv_flow_api.create_flow( p_default_listr_template => 4839116402414912 + wwv_flow_api.g_id_offset, p_default_irr_template => 4839831975414912 + wwv_flow_api.g_id_offset, p_last_updated_by => 'WTP', - p_last_upd_yyyymmddhh24miss=> '20180716232117', + p_last_upd_yyyymmddhh24miss=> '20180717223847', p_required_roles=> wwv_flow_utilities.string_to_table2('')); @@ -347,12 +347,25 @@ wwv_flow_api.create_tab ( p_tab_parent_tabset=>'', p_tab_comment => ''); +--application/shared_components/navigation/tabs/standard/t_dbout_profile +wwv_flow_api.create_tab ( + p_id=> 5047612005953773 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_tab_set=> 'TS1', + p_tab_sequence=> 40, + p_tab_name=> 'T_DBOUT PROFILE', + p_tab_text => 'DBOUT Profile', + p_tab_step => 4, + p_tab_also_current_for_pages => '4', + p_tab_parent_tabset=>'', + p_tab_comment => ''); + --application/shared_components/navigation/tabs/standard/t_test_cases wwv_flow_api.create_tab ( p_id=> 4977229177323155 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_tab_set=> 'TS1', - p_tab_sequence=> 40, + p_tab_sequence=> 50, p_tab_name=> 'T_TEST CASES', p_tab_text => 'Test Case', p_tab_step => 6, @@ -365,7 +378,7 @@ wwv_flow_api.create_tab ( p_id=> 4905926268694339 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_tab_set=> 'TS1', - p_tab_sequence=> 50, + p_tab_sequence=> 60, p_tab_name=> 'T_ABOUT', p_tab_text => 'About', p_tab_step => 5, @@ -655,7 +668,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180716223609' + ,p_last_upd_yyyymmddhh24miss => '20180717215814' ); null; @@ -3276,7 +3289,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180716231658' + ,p_last_upd_yyyymmddhh24miss => '20180717215617' ); null; @@ -4066,7 +4079,6 @@ wwv_flow_api.create_page_item( ' end loop;'||chr(10)|| ' htp.p('''');'||chr(10)|| ' htp.p(''
    '');'||chr(10)|| -' htp.p(''
    '');'||chr(10)|| 'end;', p_show_quick_picks=>'N', p_item_comment => ''); @@ -4086,7 +4098,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 5, + p_item_sequence=> 6, p_item_plug_id => 5024330300632423+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'NO', p_item_default=> 'RESET_DB_LINK', @@ -4125,7 +4137,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 4, + p_item_sequence=> 5, p_item_plug_id => 5024330300632423+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -4164,22 +4176,22 @@ wwv_flow_api.create_page_item( p_id=>5028532733058845 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_flow_step_id=> 2, - p_name=>'P2_TNS_PORT', + p_name=>'P2_NEW_DB_LINK_HOST', p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 3, + p_item_sequence=> 4, p_item_plug_id => 5024330300632423+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'TNS Port:', - p_source=>'1521', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_NUMBER_FIELD', + p_prompt=>'New DB Link Host:', + p_source=>'''//localhost:1521/'' || SYS_CONTEXT(''USERENV'',''DB_NAME'')', + p_source_type=> 'FUNCTION', + p_display_as=> 'NATIVE_TEXT_FIELD', p_lov_display_null=> 'NO', p_lov_translated=> 'N', - p_cSize=> 6, - p_cMaxlength=> 6, + p_cSize=> 20, + p_cMaxlength=> 50, p_cHeight=> 1, p_cAttributes=> 'nowrap="nowrap"', p_begin_on_new_line=> 'YES', @@ -4193,9 +4205,8 @@ wwv_flow_api.create_page_item( p_lov_display_extra=>'YES', p_protection_level => 'N', p_escape_on_http_output => 'Y', - p_attribute_01 => '0', - p_attribute_02 => '65535', - p_attribute_03 => 'right', + p_attribute_01 => 'N', + p_attribute_02 => 'N', p_show_quick_picks=>'N', p_item_comment => ''); @@ -4210,15 +4221,15 @@ wwv_flow_api.create_page_item( p_id=>5029510053130586 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_flow_step_id=> 2, - p_name=>'P2_DB_LINK_MISSING', + p_name=>'P2_DB_LINK_HOST', p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 2, + p_item_sequence=> 3, p_item_plug_id => 5024330300632423+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Loopback DB Link:', + p_prompt=>'DB Link Host:', p_source_type=> 'STATIC', p_display_as=> 'NATIVE_DISPLAY_ONLY', p_lov_display_null=> 'NO', @@ -4241,14 +4252,14 @@ wwv_flow_api.create_page_item( p_attribute_01 => 'N', p_attribute_02 => 'PLSQL', p_attribute_03 => 'declare'||chr(10)|| -' junk varchar2(1);'||chr(10)|| +' host_string varchar2(2000);'||chr(10)|| 'begin'||chr(10)|| -' select ''x'' into junk'||chr(10)|| +' select host into host_string'||chr(10)|| ' from user_db_links'||chr(10)|| ' where db_link = :APP_USER;'||chr(10)|| -' htp.p(''DB Link Found for '' || :APP_USER || '''');'||chr(10)|| +' htp.p('''' || host_string || '''');'||chr(10)|| 'exception when NO_DATA_FOUND then'||chr(10)|| -' htp.p(''*** DB Link Missing for '' || :APP_USER || '' ***'');'||chr(10)|| +' htp.p(''*** DB Link Missing ***'');'||chr(10)|| 'end;', p_show_quick_picks=>'N', p_item_comment => ''); @@ -4309,21 +4320,20 @@ declare h varchar2(32767) := null; begin wwv_flow_api.create_page_item( - p_id=>5040913192005864 + wwv_flow_api.g_id_offset, + p_id=>5044818450655759 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_flow_step_id=> 2, - p_name=>'P2_APP_OWNER', + p_name=>'P2_DB_LINK_NAME', p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 16, + p_item_sequence=> 2, p_item_plug_id => 5024330300632423+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'APP_OWNER', - p_source=>'select owner from apex_applications where application_id = :APP_ID', - p_source_type=> 'QUERY', - p_display_as=> 'NATIVE_HIDDEN', + p_prompt=>'DB Link Name:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', p_lov_display_null=> 'NO', p_lov_translated=> 'N', p_cSize=> 30, @@ -4334,13 +4344,18 @@ wwv_flow_api.create_page_item( p_begin_on_new_field=> 'YES', p_colspan=> 1, p_rowspan=> 1, - p_label_alignment=> 'LEFT', - p_field_alignment=> 'LEFT', + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, p_is_persistent=> 'Y', p_lov_display_extra=>'YES', p_protection_level => 'N', p_escape_on_http_output => 'Y', - p_attribute_01 => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'PLSQL', + p_attribute_03 => 'begin'||chr(10)|| +' htp.p(:APP_USER);'||chr(10)|| +'end;', p_show_quick_picks=>'N', p_item_comment => ''); @@ -4358,19 +4373,17 @@ declare begin p:=p||'DECLARE'||chr(10)|| ' run_str varchar2(2000) := ''wtplsql.test_run@'' ||'||chr(10)|| -' :APP_USER || ''('''''' ||'||chr(10)|| -' :P2_TEST_RUNNER || '''''')'' ;'||chr(10)|| +' :APP_USER || ''('''''' ||'||chr(10)|| +' :P2_TEST_RUNNER || '''''')'' ;'||chr(10)|| 'BEGIN'||chr(10)|| -' -- run_str := :P2_APP_OWNER || ''.'' || run_str;'||chr(10)|| -' DBMS_SCHEDULER.CREATE_JOB ('||chr(10)|| -' job_name => substr(:APP_USER || ''$'' || :P2_TEST_RUNNER'||chr(10)|| -' ,1,30),'||chr(10)|| -' job_type => ''PLSQL_BLOCK'','||chr(10)|| -' job_'; - -p:=p||'action => ''begin '' || run_str || ''; commit; end;'','||chr(10)|| -' comments => run_str,'||chr(10)|| -' enabled => TRUE);'||chr(10)|| +' DBMS_SCHEDULER.CREATE_JOB'||chr(10)|| +' (job_name => substr(:APP_USER || ''$'' || :P2_TEST_RUNNER, 1, 30)'||chr(10)|| +' ,job_type => ''PLSQL_BLOCK'''||chr(10)|| +' ,job_action => ''begin '' || run_str || ''; commit; end;'''||chr(10)|| +' ,'; + +p:=p||'comments => run_str'||chr(10)|| +' ,enabled => TRUE);'||chr(10)|| ' COMMIT;'||chr(10)|| 'END;'; @@ -4406,16 +4419,12 @@ begin p:=p||'DECLARE'||chr(10)|| ' run_str varchar2(2000) := ''wtplsql.test_all@'' || :APP_USER;'||chr(10)|| 'BEGIN'||chr(10)|| -' -- run_str := :P2_APP_OWNER || ''.'' || run_str;'||chr(10)|| -' DBMS_SCHEDULER.CREATE_JOB ('||chr(10)|| -' job_name => substr(:APP_USER || ''$TEST$ALL'''||chr(10)|| -' ,1,30),'||chr(10)|| -' job_type => ''PLSQL_BLOCK'','||chr(10)|| -' job_action => ''begin '' || run_str || ''; commit; end;'','||chr(10)|| -' comments => run_str,'||chr(10)|| -' enabled => '; - -p:=p||' TRUE);'||chr(10)|| +' DBMS_SCHEDULER.CREATE_JOB'||chr(10)|| +' (job_name => substr(:APP_USER || ''$TEST$ALL'', 1, 30)'||chr(10)|| +' ,job_type => ''PLSQL_BLOCK'''||chr(10)|| +' ,job_action => ''begin '' || run_str || ''; commit; end;'''||chr(10)|| +' ,comments => run_str'||chr(10)|| +' ,enabled => TRUE);'||chr(10)|| ' COMMIT;'||chr(10)|| 'END;'; @@ -4451,7 +4460,7 @@ begin p:=p||'begin'||chr(10)|| ' --'||chr(10)|| ' begin'||chr(10)|| -' execute immediate ''drop database link loopback'';'||chr(10)|| +' execute immediate ''drop database link '' || :APP_USER;'||chr(10)|| ' exception when OTHERS then'||chr(10)|| ' if SQLERRM = ''ORA-02024: database link not found'''||chr(10)|| ' then'||chr(10)|| @@ -4461,13 +4470,12 @@ p:=p||'begin'||chr(10)|| ' end if;'||chr(10)|| ' end;'||chr(10)|| ' --'||chr(10)|| -' execute immediate ''create database link '' || :APP_USER ||'||chr(10)|| -' '' connect to '' || :APP_USER ||'||chr(10)|| -' '; +' execute immediate ''create database link '' || :APP_USER ||'||chr(10)|| +' '' connect to '' || :APP_USER '; -p:=p||' '' identified by '' || :P2_PASSWORD ||'||chr(10)|| -' '' using ''''//localost:'' || :P2_TNS_PORT ||'||chr(10)|| -' ''/'' || SYS_CONTEXT(''USERENV'',''DB_NAME'') || '''''''';'||chr(10)|| +p:=p||' ||'||chr(10)|| +' '' identified by '' || :P2_PASSWORD ||'||chr(10)|| +' '' using '''''' || :P2_NEW_DB_LINK_HOST || '''''''';'||chr(10)|| 'end;'; wwv_flow_api.create_page_process( @@ -4536,7 +4544,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180711231213' + ,p_last_upd_yyyymmddhh24miss => '20180717205418' ); null; @@ -6284,7 +6292,8 @@ declare l_clob clob; l_length number := 1; begin -s:=s||'select result_seq SEQ'||chr(10)|| +s:=s||'select test_run_id'||chr(10)|| +' ,result_seq SEQ'||chr(10)|| ' ,executed_dtm EXECUTED_DATE_TIME'||chr(10)|| ' ,interval_msecs MSECS'||chr(10)|| ' ,assertion'||chr(10)|| @@ -6322,7 +6331,8 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select result_seq SEQ'||chr(10)|| +a1:=a1||'select test_run_id'||chr(10)|| +' ,result_seq SEQ'||chr(10)|| ' ,executed_dtm EXECUTED_DATE_TIME'||chr(10)|| ' ,interval_msecs MSECS'||chr(10)|| ' ,assertion'||chr(10)|| @@ -6392,13 +6402,51 @@ wwv_flow_api.create_worksheet( end; / begin +wwv_flow_api.create_worksheet_column( + p_id => 5046210513880502+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_db_column_name =>'TEST_RUN_ID', + p_display_order =>1, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'M', + p_column_label =>'Test Run ID', + p_report_label =>'Test Run ID', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin wwv_flow_api.create_worksheet_column( p_id => 4951219968424536+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 3, p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, p_db_column_name =>'SEQ', - p_display_order =>1, + p_display_order =>2, p_group_id =>null+wwv_flow_api.g_id_offset, p_column_identifier =>'J', p_column_label =>'Seq', @@ -6436,7 +6484,7 @@ wwv_flow_api.create_worksheet_column( p_page_id=> 3, p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, p_db_column_name =>'EXECUTED_DATE_TIME', - p_display_order =>2, + p_display_order =>3, p_group_id =>null+wwv_flow_api.g_id_offset, p_column_identifier =>'K', p_column_label =>'Executed Date/Time', @@ -6474,7 +6522,7 @@ wwv_flow_api.create_worksheet_column( p_page_id=> 3, p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, p_db_column_name =>'MSECS', - p_display_order =>3, + p_display_order =>4, p_group_id =>null+wwv_flow_api.g_id_offset, p_column_identifier =>'L', p_column_label =>'Msecs', @@ -6512,7 +6560,7 @@ wwv_flow_api.create_worksheet_column( p_page_id=> 3, p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, p_db_column_name =>'ASSERTION', - p_display_order =>4, + p_display_order =>5, p_group_id =>null+wwv_flow_api.g_id_offset, p_column_identifier =>'E', p_column_label =>'Assertion', @@ -6550,7 +6598,7 @@ wwv_flow_api.create_worksheet_column( p_page_id=> 3, p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, p_db_column_name =>'STATUS', - p_display_order =>5, + p_display_order =>6, p_group_id =>null+wwv_flow_api.g_id_offset, p_column_identifier =>'F', p_column_label =>'Status', @@ -6588,7 +6636,7 @@ wwv_flow_api.create_worksheet_column( p_page_id=> 3, p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, p_db_column_name =>'DETAILS', - p_display_order =>6, + p_display_order =>7, p_group_id =>null+wwv_flow_api.g_id_offset, p_column_identifier =>'G', p_column_label =>'Details', @@ -6626,7 +6674,7 @@ wwv_flow_api.create_worksheet_column( p_page_id=> 3, p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, p_db_column_name =>'TESTCASE', - p_display_order =>7, + p_display_order =>8, p_group_id =>null+wwv_flow_api.g_id_offset, p_column_identifier =>'H', p_column_label =>'Testcase', @@ -6664,7 +6712,7 @@ wwv_flow_api.create_worksheet_column( p_page_id=> 3, p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, p_db_column_name =>'MESSAGE', - p_display_order =>8, + p_display_order =>9, p_group_id =>null+wwv_flow_api.g_id_offset, p_column_identifier =>'I', p_column_label =>'Message', @@ -6698,7 +6746,7 @@ end; declare rc1 varchar2(32767) := null; begin -rc1:=rc1||'SEQ:MSECS:STATUS:TESTCASE:ASSERTION:MESSAGE:DETAILS'; +rc1:=rc1||'TEST_RUN_ID:SEQ:EXECUTED_DATE_TIME:MSECS:STATUS:TESTCASE:ASSERTION:MESSAGE:DETAILS'; wwv_flow_api.create_worksheet_rpt( p_id => 4950724292387987+wwv_flow_api.g_id_offset, @@ -6723,7 +6771,7 @@ end; / begin wwv_flow_api.create_worksheet_condition( - p_id => 4969104827207211+wwv_flow_api.g_id_offset, + p_id => 5046424584891526+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 3, p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, @@ -6744,7 +6792,7 @@ end; / begin wwv_flow_api.create_worksheet_condition( - p_id => 4969204980207211+wwv_flow_api.g_id_offset, + p_id => 5046501496891526+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 3, p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, @@ -6765,7 +6813,7 @@ end; / begin wwv_flow_api.create_worksheet_condition( - p_id => 4969023512207211+wwv_flow_api.g_id_offset, + p_id => 5046315838891526+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 3, p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, @@ -8377,6 +8425,1085 @@ end; / +--application/pages/page_00004 +prompt ...PAGE 4: DBOUT Profile +-- + +begin + +wwv_flow_api.create_page ( + p_flow_id => wwv_flow.g_flow_id + ,p_id => 4 + ,p_tab_set => 'TS1' + ,p_name => 'DBOUT Profile' + ,p_step_title => 'DBOUT Profile' + ,p_step_sub_title => 'DBOUT Profile' + ,p_step_sub_title_type => 'TEXT_WITH_SUBSTITUTIONS' + ,p_include_apex_css_js_yn => 'Y' + ,p_cache_page_yn => 'N' + ,p_help_text => +'No help is available for this page.' + ,p_last_updated_by => 'WTP' + ,p_last_upd_yyyymmddhh24miss => '20180717222052' + ); +null; + +end; +/ + +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||'select r.dbout_owner'||chr(10)|| +' ,r.dbout_name'||chr(10)|| +' ,r.dbout_type'||chr(10)|| +' ,s.code_coverage*100 CODE_COVERAGE'||chr(10)|| +' ,r.id TEST_RUN_ID'||chr(10)|| +' ,r.runner_owner'||chr(10)|| +' ,r.runner_name'||chr(10)|| +' ,r.start_dtm'||chr(10)|| +' ,r.end_dtm'||chr(10)|| +' ,s.profiled_lines'||chr(10)|| +' ,s.executed_lines'||chr(10)|| +' ,s.ignored_lines'||chr(10)|| +' ,s.excluded_lines'||chr(10)|| +' ,s.notexec_lines'||chr(10)|| +' ,s.unknown_lines'||chr(10)|| +' ,s.min_exec'; + +s:=s||'uted_usecs'||chr(10)|| +' ,s.avg_executed_usecs'||chr(10)|| +' ,s.max_executed_usecs'||chr(10)|| +' ,round(s.tot_executed_usecs,3) TOT_EXECUTED_USECS'||chr(10)|| +' ,r.trigger_offset'||chr(10)|| +' ,r.error_message'||chr(10)|| +' from wt_test_runs r'||chr(10)|| +' join wt_test_run_stats s'||chr(10)|| +' on s.test_run_id = r.id'||chr(10)|| +' where r.dbout_name is not null'; + +wwv_flow_api.create_page_plug ( + p_id=> 5058029495145138 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_plug_name=> 'DBOUT Profile', + p_region_name=>'', + p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 10, + p_plug_display_column=> 1, + p_plug_display_point=> 'AFTER_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'DYNAMIC_QUERY', + p_translate_title=> 'Y', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_display_condition_type => '', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'select r.dbout_owner'||chr(10)|| +' ,r.dbout_name'||chr(10)|| +' ,r.dbout_type'||chr(10)|| +' ,s.code_coverage*100 CODE_COVERAGE'||chr(10)|| +' ,r.id TEST_RUN_ID'||chr(10)|| +' ,r.runner_owner'||chr(10)|| +' ,r.runner_name'||chr(10)|| +' ,r.start_dtm'||chr(10)|| +' ,r.end_dtm'||chr(10)|| +' ,s.profiled_lines'||chr(10)|| +' ,s.executed_lines'||chr(10)|| +' ,s.ignored_lines'||chr(10)|| +' ,s.excluded_lines'||chr(10)|| +' ,s.notexec_lines'||chr(10)|| +' ,s.unknown_lines'||chr(10)|| +' ,s.min_exec'; + +a1:=a1||'uted_usecs'||chr(10)|| +' ,s.avg_executed_usecs'||chr(10)|| +' ,s.max_executed_usecs'||chr(10)|| +' ,round(s.tot_executed_usecs,3) TOT_EXECUTED_USECS'||chr(10)|| +' ,r.trigger_offset'||chr(10)|| +' ,r.error_message'||chr(10)|| +' from wt_test_runs r'||chr(10)|| +' join wt_test_run_stats s'||chr(10)|| +' on s.test_run_id = r.id'||chr(10)|| +' where r.dbout_name is not null'; + +wwv_flow_api.create_worksheet( + p_id=> 5058117729145138+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_region_id=> 5058029495145138+wwv_flow_api.g_id_offset, + p_name=> 'DBOUT Profile', + p_folder_id=> null, + p_alias=> '', + p_report_id_item=> '', + p_max_row_count=> '10000', + p_max_row_count_message=> 'This query returns more than #MAX_ROW_COUNT# rows, please filter your data to ensure complete results.', + p_no_data_found_message=> 'No data found.', + p_max_rows_per_page=>'', + p_search_button_label=>'', + p_page_items_to_submit=>'', + p_sort_asc_image=>'', + p_sort_asc_image_attr=>'', + p_sort_desc_image=>'', + p_sort_desc_image_attr=>'', + p_sql_query => a1, + p_base_pk1=>'TEST_RUN_ID', + p_status=>'AVAILABLE_FOR_OWNER', + p_allow_report_saving=>'Y', + p_allow_save_rpt_public=>'N', + p_allow_report_categories=>'N', + p_show_nulls_as=>'-', + p_pagination_type=>'ROWS_X_TO_Y', + p_pagination_display_pos=>'BOTTOM_RIGHT', + p_show_finder_drop_down=>'Y', + p_show_display_row_count=>'N', + p_show_search_bar=>'Y', + p_show_search_textbox=>'Y', + p_show_actions_menu=>'Y', + p_report_list_mode=>'TABS', + p_show_detail_link=>'Y', + p_show_select_columns=>'Y', + p_show_rows_per_page=>'Y', + p_show_filter=>'Y', + p_show_sort=>'Y', + p_show_control_break=>'Y', + p_show_highlight=>'Y', + p_show_computation=>'Y', + p_show_aggregate=>'Y', + p_show_chart=>'Y', + p_show_group_by=>'Y', + p_show_notify=>'N', + p_show_calendar=>'N', + p_show_flashback=>'Y', + p_show_reset=>'Y', + p_show_download=>'Y', + p_show_help=>'Y', + p_download_formats=>'CSV:HTML:EMAIL', + p_detail_link_text=>'', + p_allow_exclude_null_values=>'Y', + p_allow_hide_extra_columns=>'Y', + p_icon_view_enabled_yn=>'N', + p_icon_view_columns_per_row=>1, + p_detail_view_enabled_yn=>'N', + p_owner=>'WTP'); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5058332650145140+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'DBOUT_OWNER', + p_display_order =>1, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'A', + p_column_label =>'DB Object Under Test Owner', + p_report_label =>'DBOUT
    Owner', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5058422778145140+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'DBOUT_NAME', + p_display_order =>2, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'B', + p_column_label =>'DB Object Under Test Name', + p_report_label =>'DBOUT
    Name', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'LEFT', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5058500986145140+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'DBOUT_TYPE', + p_display_order =>3, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'C', + p_column_label =>'DB Object Under Test Type', + p_report_label =>'DBOUT
    Type', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'CENTER', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5058603676145141+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'CODE_COVERAGE', + p_display_order =>4, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'D', + p_column_label =>'Code Coverage Percent', + p_report_label =>'Code
    Cvrg
    Pct', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_format_mask =>'999.9', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5058729192145141+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'TEST_RUN_ID', + p_display_order =>5, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'E', + p_column_label =>'Test Run ID', + p_report_label =>'Test
    Run
    ID', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5058806330145141+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'RUNNER_OWNER', + p_display_order =>6, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'F', + p_column_label =>'Test Runner Owner', + p_report_label =>'Test
    Runner
    Owner', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5058915547145141+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'RUNNER_NAME', + p_display_order =>7, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'G', + p_column_label =>'Test Runner Name', + p_report_label =>'Test
    Runner
    Name', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'LEFT', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5059009515145141+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'START_DTM', + p_display_order =>8, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'H', + p_column_label =>'Start Date/Time', + p_report_label =>'Start
    Date
    Time', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'DATE', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'CENTER', + p_format_mask =>'DD-MON-YYYY HH24:MI:SS', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5059121065145141+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'END_DTM', + p_display_order =>9, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'I', + p_column_label =>'End Date/Time', + p_report_label =>'End
    Date
    Time', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'DATE', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'CENTER', + p_format_mask =>'DD-MON-YYYY HH24:MI:SS', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5059220275145141+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'PROFILED_LINES', + p_display_order =>10, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'J', + p_column_label =>'Profiled Source Lines', + p_report_label =>'Profiled
    Source
    Lines', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5059315222145141+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'EXECUTED_LINES', + p_display_order =>11, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'K', + p_column_label =>'Executed Source Lines', + p_report_label =>'Executed
    Source
    Lines', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5059411706145141+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'IGNORED_LINES', + p_display_order =>12, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'L', + p_column_label =>'Ignored Source Lines', + p_report_label =>'Ignored
    Source
    Lines', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5059518034145141+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'EXCLUDED_LINES', + p_display_order =>13, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'M', + p_column_label =>'Excluded Source Lines', + p_report_label =>'Excluded
    Source
    Lines', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5059610513145141+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'NOTEXEC_LINES', + p_display_order =>14, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'N', + p_column_label =>'Not Executed Source Lines', + p_report_label =>'Not
    Executed
    Lines', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5059710978145141+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'UNKNOWN_LINES', + p_display_order =>15, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'O', + p_column_label =>'Unknown Source Lines', + p_report_label =>'Unknown
    Source
    Lines', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5059811323145141+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'MIN_EXECUTED_USECS', + p_display_order =>16, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'P', + p_column_label =>'Minimum Executed Microsecs', + p_report_label =>'Minimum
    Executed
    Microsecs', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5059913789145141+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'AVG_EXECUTED_USECS', + p_display_order =>17, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'Q', + p_column_label =>'Average Executed Microsecs', + p_report_label =>'Avgerage
    Executed
    Microsecs', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5060023226145142+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'MAX_EXECUTED_USECS', + p_display_order =>18, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'R', + p_column_label =>'Maximum Executed Microsecs', + p_report_label =>'Maximum
    Executed
    Microsecs', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5060123834145142+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'TOT_EXECUTED_USECS', + p_display_order =>19, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'S', + p_column_label =>'Total Executed Microsecs', + p_report_label =>'Total
    Executed
    Microsecs', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5060204482145142+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'TRIGGER_OFFSET', + p_display_order =>20, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'T', + p_column_label =>'Trigger Offset', + p_report_label =>'Trigger
    Offset', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5060309927145142+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'ERROR_MESSAGE', + p_display_order =>21, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'U', + p_column_label =>'Error Message', + p_report_label =>'Error
    Message', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'LEFT', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +declare + rc1 varchar2(32767) := null; +begin +rc1:=rc1||'DBOUT_OWNER:DBOUT_NAME:DBOUT_TYPE:CODE_COVERAGE:TEST_RUN_ID:RUNNER_OWNER:RUNNER_NAME:START_DTM:MAX_EXECUTED_USECS:ERROR_MESSAGE'; + +wwv_flow_api.create_worksheet_rpt( + p_id => 5060410372145412+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_session_id => null, + p_base_report_id => null+wwv_flow_api.g_id_offset, + p_application_user => 'APXWS_DEFAULT', + p_report_seq =>10, + p_report_alias =>'50605', + p_status =>'PUBLIC', + p_category_id =>null+wwv_flow_api.g_id_offset, + p_is_default =>'Y', + p_display_rows =>15, + p_report_columns =>rc1, + p_sort_column_1 =>'TEST_RUN_ID', + p_sort_direction_1 =>'DESC', + p_sort_column_2 =>'0', + p_sort_direction_2 =>'ASC', + p_sort_column_3 =>'0', + p_sort_direction_3 =>'ASC', + p_sort_column_4 =>'0', + p_sort_direction_4 =>'ASC', + p_sort_column_5 =>'0', + p_sort_direction_5 =>'ASC', + p_sort_column_6 =>'0', + p_sort_direction_6 =>'ASC', + p_flashback_enabled =>'N', + p_calendar_display_column =>''); +end; +/ +declare + rc1 varchar2(32767) := null; +begin +rc1:=rc1||'DBOUT_OWNER:DBOUT_NAME:DBOUT_TYPE:CODE_COVERAGE:TEST_RUN_ID:RUNNER_OWNER:RUNNER_NAME:START_DTM:END_DTM:PROFILED_LINES:EXECUTED_LINES:IGNORED_LINES:EXCLUDED_LINES:NOTEXEC_LINES:UNKNOWN_LINES:MIN_EXECUTED_USECS:AVG_EXECUTED_USECS:MAX_EXECUTED_USECS:TOT_EXECUTED_USECS:TRIGGER_OFFSET:ERROR_MESSAGE'; + +wwv_flow_api.create_worksheet_rpt( + p_id => 5062402397417566+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_session_id => null, + p_base_report_id => null+wwv_flow_api.g_id_offset, + p_application_user => 'APXWS_ALTERNATIVE', + p_name =>'All Columns', + p_report_seq =>10, + p_report_alias =>'50625', + p_status =>'PUBLIC', + p_category_id =>null+wwv_flow_api.g_id_offset, + p_is_default =>'Y', + p_display_rows =>15, + p_report_columns =>rc1, + p_sort_column_1 =>'TEST_RUN_ID', + p_sort_direction_1 =>'DESC', + p_sort_column_2 =>'0', + p_sort_direction_2 =>'ASC', + p_sort_column_3 =>'0', + p_sort_direction_3 =>'ASC', + p_sort_column_4 =>'0', + p_sort_direction_4 =>'ASC', + p_sort_column_5 =>'0', + p_sort_direction_5 =>'ASC', + p_sort_column_6 =>'0', + p_sort_direction_6 =>'ASC', + p_flashback_enabled =>'N', + p_calendar_display_column =>''); +end; +/ + +begin + +null; + +end; +/ + + +begin + +null; + +end; +/ + + +begin + +--------------------------------------- +-- ...updatable report columns for page 4 +-- + +begin + +null; +end; +null; + +end; +/ + + --application/pages/page_00005 prompt ...PAGE 5: About -- diff --git a/src/gui/job_test.sql b/src/gui/job_test.sql new file mode 100644 index 0000000..4be06b1 --- /dev/null +++ b/src/gui/job_test.sql @@ -0,0 +1,100 @@ + +BEGIN + DBMS_SCHEDULER.DROP_CREDENTIAL('WTP_DEMO'); + --DBMS_SCHEDULER.CREATE_CREDENTIAL('WTP_DEMO', 'WTP_DEMO', 'wtp_demo'); +END; +/ + +BEGIN + DBMS_SCHEDULER.CREATE_DATABASE_DESTINATION ( + destination_name => 'LOOPBACK', + agent => 'DBHOST1', + tns_name => 'ORCLDW', + comments => 'Instance named orcldw on host dbhost1.example.com'); +END; +/ + +BEGIN + DBMS_SCHEDULER.CREATE_JOB ( + job_name => 'DEMO_TEST', + job_type => 'PLSQL_BLOCK', + -- job_action => 'begin wtplsql.test_all@wtp_demo; end;', + job_action => 'begin wtplsql.test_run@wtp_demo(''UT_TRUNCIT''); end;', + enabled => TRUE); + COMMIT; +END; +/ + +BEGIN + DBMS_SCHEDULER.ENABLE('DEMO_TEST'); +END; +/ + +select * from wt_test_runs + order by id desc; + +select * from wt_scheduler_jobs; + +select inst_id, value from sys.gv_$parameter where name = 'job_queue_processes'; + +select * from trigger_test_tab@wtp_demo; + +drop database link wtp_demo; + + CREATE DATABASE LINK "WTP_DEMO" + CONNECT TO "WTP_DEMO" IDENTIFIED BY wtp_demo + USING '//localhost:1521/XE'; + +select host from user_db_links; + +begin + execute immediate 'drop database link test'; +exception when others then + raise_application_error (-20000, SQLERRM); +end; +/ + +declare + -- + -- Using DBMS_SYS_SQL To Execute Statements As Another User + -- by Alex Fatkulin - November 5, 2007 + -- https://blog.pythian.com/using-dbms_sys_sql-to-execute-statements-as-another-user/ + -- + uid number; + sys_cursor INTEGER; + rows_processed INTEGER; +begin + select user_id into uid + from dba_users + where username = :APP_USER; + sys_cursor := sys.dbms_sys_sql.open_cursor; + sys.dbms_sys_sql.parse_as_user + (c => sys_cursor + ,statement => 'begin wtplsql.test_all; end;' + ,language_flag => dbms_sql.native + ,userid => uid); + rows_processed := sys.dbms_sys_sql.execute(sys_cursor); + sys.dbms_sql.close_cursor(sys_cursor); +exception +when others then + sys.dbms_sql.close_cursor(sys_cursor); +end; +/ + +select * from wt_test_runs + order by id desc; + +select SYS_CONTEXT('USERENV','DB_NAME') from dual; + +drop database link loopback; +create database link loopback + connect to wtp_demo identified by wtp_demo + using '//localhost:1521/XE'; + +begin + --wtplsql.test_all@loopback; + wtplsql.test_run@loopback('UT_TRUNCIT'); +end; +/ + +select db_link from user_db_links; From 1007fd2d7f8313a0e5773c0358d2bbfffea59c1a Mon Sep 17 00:00:00 2001 From: DDieterich Date: Wed, 18 Jul 2018 07:43:12 -0500 Subject: [PATCH 011/141] Adding Links --- src/gui/Notes.txt | 20 ++++++ src/gui/f700.sql | 178 ++++++++++++++++++++++++++++++++++------------ 2 files changed, 154 insertions(+), 44 deletions(-) diff --git a/src/gui/Notes.txt b/src/gui/Notes.txt index f3b435e..20c4799 100644 --- a/src/gui/Notes.txt +++ b/src/gui/Notes.txt @@ -166,6 +166,26 @@ DBOUTs are not global either. Fix all the Links +1 - DASHBOARD +2 - RUNTEST +3 - TESTRUNNER +4 - DBOUTPROFILE +5 - ABOUT +6 - TESTCASES + +select 'f?p=' || :APP_ID || + ':' || '6' || -- Page + ':' || :APP_SESSION || + ':' || :REQUEST || + ':' || :DEBUG || + ':' || 'N' || -- CLear Cache + ':' || 'P6_TEST_RUN_ID' || ',' || + 'P6_TESTCASE_NAME' || -- Item Names + ':' || test_run_id || ',' || + testcase || -- Item Values + ':' || V('PRINTER_FRIENDLY') + LINK + * Test Case Page (Single Test Run ID, Single Test Case) * Page Template Body 1 diff --git a/src/gui/f700.sql b/src/gui/f700.sql index 68f2aa0..d09e5ba 100644 --- a/src/gui/f700.sql +++ b/src/gui/f700.sql @@ -13,7 +13,7 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Application Export: -- Application: 700 -- Name: wtPLSQL Core GUI --- Date and Time: 22:38 Tuesday July 17, 2018 +-- Date and Time: 07:42 Wednesday July 18, 2018 -- Exported By: WTP -- Flashback: 0 -- Export Type: Application Export @@ -26,7 +26,7 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Application Statistics: -- Pages: 7 --- Items: 50 +-- Items: 51 -- Computations: 0 -- Validations: 0 -- Processes: 15 @@ -146,7 +146,7 @@ wwv_flow_api.create_flow( p_default_region_template=> 4840201642414912 + wwv_flow_api.g_id_offset, p_error_template=> 4837131094414910 + wwv_flow_api.g_id_offset, p_page_protection_enabled_y_n=> 'Y', - p_checksum_salt_last_reset => '20180717223847', + p_checksum_salt_last_reset => '20180718074206', p_max_session_length_sec=> 28800, p_home_link=> 'f?p=&APP_ID.:1:&SESSION.', p_flow_language=> 'en', @@ -192,7 +192,7 @@ wwv_flow_api.create_flow( p_default_listr_template => 4839116402414912 + wwv_flow_api.g_id_offset, p_default_irr_template => 4839831975414912 + wwv_flow_api.g_id_offset, p_last_updated_by => 'WTP', - p_last_upd_yyyymmddhh24miss=> '20180717223847', + p_last_upd_yyyymmddhh24miss=> '20180718074206', p_required_roles=> wwv_flow_utilities.string_to_table2('')); @@ -668,7 +668,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180717215814' + ,p_last_upd_yyyymmddhh24miss => '20180718073923' ); null; @@ -2109,14 +2109,16 @@ a1:=a1||'with q_max_start as ('||chr(10)|| ' group by runner_owner'||chr(10)|| ' ,runner_name'||chr(10)|| '), q_top_failures as ('||chr(10)|| -'select ms.runner_owner || ''.'' ||'||chr(10)|| +'select run.id TEST_RUN_ID'||chr(10)|| +' ,tc.testcase'||chr(10)|| +' ,ms.runner_owner || ''.'' ||'||chr(10)|| ' ms.runner_name || '':'' ||'||chr(10)|| -' tc.testcase TESTCASE'||chr(10)|| +' tc.testcase '; + +a1:=a1||' TESTCASE_LABEL'||chr(10)|| ' ,tc.failures'||chr(10)|| ' from q_max_start ms'||chr(10)|| -' jo'; - -a1:=a1||'in wt_test_runs run'||chr(10)|| +' join wt_test_runs run'||chr(10)|| ' on run.runner_owner = ms.runner_owner'||chr(10)|| ' and run.runner_name = ms.runner_name'||chr(10)|| ' and run.start_dtm = ms.max_start_dtm'||chr(10)|| @@ -2125,12 +2127,25 @@ a1:=a1||'in wt_test_runs run'||chr(10)|| ' where tc.failures > 0'||chr(10)|| ' order by failures desc, TESTCASE'||chr(10)|| ')'||chr(10)|| -'--select * from q_max_start;'||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,testcase LABEL'||chr(10)|| -' ,'; +'--select * from q_max_'; + +a1:=a1||'start;'||chr(10)|| +'select ''f?p='' || :APP_ID ||'||chr(10)|| +' '':'' || ''6'' || -- Page'||chr(10)|| +' '':'' || :APP_SESSION ||'||chr(10)|| +' '':'' || :REQUEST ||'||chr(10)|| +' '':'' || :DEBUG ||'||chr(10)|| +' '':'' || ''N'' || -- CLear Cache'||chr(10)|| +' '':'' || ''P6_TEST_RUN_ID'' || '','' ||'||chr(10)|| +' ''P6_TESTCASE_NAME'' || -- Item Names'||chr(10)|| +' '; -a1:=a1||'failures VALUE'||chr(10)|| +a1:=a1||' '':'' || test_run_id || '','' ||'||chr(10)|| +' testcase || -- Item Values'||chr(10)|| +' '':'' || V(''PRINTER_FRIENDLY'')'||chr(10)|| +' LINK'||chr(10)|| +' ,testcase_label LABEL'||chr(10)|| +' ,failures VALUE'||chr(10)|| ' from q_top_failures'||chr(10)|| ' where rownum <= 10'; @@ -4544,7 +4559,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180717205418' + ,p_last_upd_yyyymmddhh24miss => '20180718065549' ); null; @@ -6681,6 +6696,9 @@ wwv_flow_api.create_worksheet_column( p_report_label =>'Testcase', p_sync_form_label =>'Y', p_display_in_default_rpt =>'Y', + p_column_link =>'f?p=&APP_ID.:6:&SESSION.::&DEBUG.::P6_TEST_RUN_ID,P6_TESTCASE_NAME:#TEST_RUN_ID#,#TESTCASE#', + p_column_linktext =>'#TESTCASE#', + p_column_link_attr =>'title="Go To Test Case #TESTCASE#" style="color:blue"', p_is_sortable =>'Y', p_allow_sorting =>'Y', p_allow_filtering =>'Y', @@ -8436,15 +8454,23 @@ wwv_flow_api.create_page ( ,p_id => 4 ,p_tab_set => 'TS1' ,p_name => 'DBOUT Profile' + ,p_alias => 'DBOUTPROFILE' ,p_step_title => 'DBOUT Profile' + ,p_allow_duplicate_submissions => 'Y' ,p_step_sub_title => 'DBOUT Profile' ,p_step_sub_title_type => 'TEXT_WITH_SUBSTITUTIONS' + ,p_first_item => 'AUTO_FIRST_ITEM' ,p_include_apex_css_js_yn => 'Y' + ,p_autocomplete_on_off => 'ON' + ,p_page_is_public_y_n => 'N' + ,p_protection_level => 'N' ,p_cache_page_yn => 'N' + ,p_cache_timeout_seconds => 21600 + ,p_cache_by_user_yn => 'N' ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180717222052' + ,p_last_upd_yyyymmddhh24miss => '20180718065107' ); null; @@ -8764,6 +8790,9 @@ wwv_flow_api.create_worksheet_column( p_report_label =>'Test
    Run
    ID', p_sync_form_label =>'N', p_display_in_default_rpt =>'Y', + p_column_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#TEST_RUN_ID#', + p_column_linktext =>'#TEST_RUN_ID#', + p_column_link_attr =>'title="Go To Test Run ID #TEST_RUN_ID#" style="color:blue"', p_is_sortable =>'Y', p_allow_sorting =>'Y', p_allow_filtering =>'Y', @@ -9848,7 +9877,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180711231147' + ,p_last_upd_yyyymmddhh24miss => '20180718072746' ); null; @@ -11202,7 +11231,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 8, + p_item_sequence=> 9, p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -11256,7 +11285,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> true, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 10, + p_item_sequence=> 11, p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -11304,7 +11333,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 4, + p_item_sequence=> 5, p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -11322,6 +11351,7 @@ wwv_flow_api.create_page_item( p_rowspan=> 1, p_label_alignment=> 'LEFT', p_field_alignment=> 'LEFT', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, p_is_persistent=> 'Y', p_lov_display_extra=>'YES', p_protection_level => 'N', @@ -11345,7 +11375,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 7, + p_item_sequence=> 8, p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -11390,21 +11420,20 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 1, + p_item_sequence=> 2, p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Test Run ID:', p_source_type=> 'STATIC', p_source_post_computation => 'to_number(:P6_TEST_RUN_ID)', - p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_display_as=> 'NATIVE_HIDDEN', p_lov_display_null=> 'NO', p_lov_translated=> 'N', p_cSize=> 30, p_cMaxlength=> 4000, p_cHeight=> 1, p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', + p_begin_on_new_line=> 'NO', p_begin_on_new_field=> 'YES', p_colspan=> 1, p_rowspan=> 1, @@ -11416,8 +11445,6 @@ wwv_flow_api.create_page_item( p_protection_level => 'N', p_escape_on_http_output => 'Y', p_attribute_01 => 'Y', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'Y', p_show_quick_picks=>'N', p_item_comment => ''); @@ -11439,7 +11466,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 2, + p_item_sequence=> 3, p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -11485,7 +11512,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 6, + p_item_sequence=> 7, p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -11530,7 +11557,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 3, + p_item_sequence=> 4, p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -11616,7 +11643,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 5, + p_item_sequence=> 6, p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -11657,7 +11684,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 9, + p_item_sequence=> 10, p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -11707,7 +11734,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> true, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 11, + p_item_sequence=> 12, p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -11741,6 +11768,51 @@ wwv_flow_api.create_page_item( p_item_comment => ''); +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>5064723722530218 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 6, + p_name=>'P6_TEST_RUN_ID_DISP', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 1, + p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Test Run ID:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'N', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); + + end; / @@ -11982,6 +12054,23 @@ p:=p||'6_TESTCASE_NAME )'||chr(10)|| ' procedure proce'; p:=p||'ss_testcase_name is begin'||chr(10)|| +' page := ''3'';'||chr(10)|| +' item_names := ''P'' || page || ''_TEST_RUN_ID'';'||chr(10)|| +' item_values := :P6_TEST_RUN_ID;'||chr(10)|| +' :P6_TEST_RUN_ID_DISP := '''' || :P6_TEST_RUN_ID || '''';'||chr(10)|| ' select max(tot_interval_msecs) -- Need Group Function for NULL'||chr(10)|| ' into :P6_TOTAL_ELAPSED'||chr(10)|| ' from wt_testcase_stats'||chr(10)|| @@ -11990,13 +12079,12 @@ p:=p||'ss_testcase_name is begin'||chr(10)|| ' end process_testcase_name;'||chr(10)|| ' --'||chr(10)|| 'begin'||chr(10)|| -' -- :P6_TEST_RUN_ID := 1;'||chr(10)|| ' --'||chr(10)|| -' if :P6_GOTO_TCASE is NOT NULL'||chr(10)|| -' then'||chr(10)|| -' -- The LOV was triggered, so'; +' if :P6_GO'; -p:=p||' set Test Case and go.'||chr(10)|| +p:=p||'TO_TCASE is NOT NULL'||chr(10)|| +' then'||chr(10)|| +' -- The LOV was triggered, so set Test Case and go.'||chr(10)|| ' :P6_TESTCASE_NAME := :P6_GOTO_TCASE;'||chr(10)|| ' :P6_GOTO_TCASE := NULL;'||chr(10)|| ' :P6_GOTO_RUN_ID := NULL;'||chr(10)|| @@ -12007,12 +12095,12 @@ p:=p||' set Test Case and go.'||chr(10)|| ' if :P6_GOTO_RUN_ID is NOT NULL'||chr(10)|| ' then'||chr(10)|| ' -- The LOV was triggered, Set Test Run.'||chr(10)|| -' :P6_TEST_RUN_ID := :P6_GOTO_RUN_ID;'||chr(10)|| +' :P6_TEST_RUN_'; + +p:=p||'ID := :P6_GOTO_RUN_ID;'||chr(10)|| ' :P6_GOTO_RUN_ID := NULL;'||chr(10)|| ' else'||chr(10)|| -' '; - -p:=p||' if :P6_TEST_RUN_ID is NULL'||chr(10)|| +' if :P6_TEST_RUN_ID is NULL'||chr(10)|| ' then'||chr(10)|| ' -- Must have a Test Run ID'||chr(10)|| ' find_test_run_id;'||chr(10)|| @@ -12026,7 +12114,9 @@ p:=p||' if :P6_TEST_RUN_ID is NULL'||chr(10)|| ' -- Must set a Test Case'||chr(10)|| ' find_testcase_name;'||chr(10)|| ' end if;'||chr(10)|| -' -- Set (or Reset) the Test Case dependents.'||chr(10)|| +' -- Set (or Reset) th'; + +p:=p||'e Test Case dependents.'||chr(10)|| ' process_testcase_name;'||chr(10)|| ' --'||chr(10)|| 'end;'; From 5be1d35717268448286f5ae80729d3b6f7e2c800 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Wed, 18 Jul 2018 23:38:07 -0500 Subject: [PATCH 012/141] Additional Links and Some Reports Update (Unfinished) --- src/gui/Notes.txt | 37 +++---- src/gui/f700.sql | 265 ++++++++++++++++++++++++++++++++++------------ 2 files changed, 209 insertions(+), 93 deletions(-) diff --git a/src/gui/Notes.txt b/src/gui/Notes.txt index 20c4799..5bab612 100644 --- a/src/gui/Notes.txt +++ b/src/gui/Notes.txt @@ -1,4 +1,18 @@ +Fix Code Coverage Report + Pagination + All Lines Not Printed + IGNR color #ccccb3 + CSV File Link + +Setup Links on Test Runner Page Trend Graphs + +Setup Links on Test Case Page Trend Graphs + +Demo Video + + + Test Case Names include the Test Runner Name. (No Global Test Cases) DBOUTs are not global either. @@ -163,29 +177,6 @@ DBOUTs are not global either. * HTML Region Sequence 20 Column 1 * Code Coverage Details (Optional, HTML Text) - -Fix all the Links - -1 - DASHBOARD -2 - RUNTEST -3 - TESTRUNNER -4 - DBOUTPROFILE -5 - ABOUT -6 - TESTCASES - -select 'f?p=' || :APP_ID || - ':' || '6' || -- Page - ':' || :APP_SESSION || - ':' || :REQUEST || - ':' || :DEBUG || - ':' || 'N' || -- CLear Cache - ':' || 'P6_TEST_RUN_ID' || ',' || - 'P6_TESTCASE_NAME' || -- Item Names - ':' || test_run_id || ',' || - testcase || -- Item Values - ':' || V('PRINTER_FRIENDLY') - LINK - * Test Case Page (Single Test Run ID, Single Test Case) * Page Template Body 1 diff --git a/src/gui/f700.sql b/src/gui/f700.sql index d09e5ba..eee1c87 100644 --- a/src/gui/f700.sql +++ b/src/gui/f700.sql @@ -13,7 +13,7 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Application Export: -- Application: 700 -- Name: wtPLSQL Core GUI --- Date and Time: 07:42 Wednesday July 18, 2018 +-- Date and Time: 23:35 Wednesday July 18, 2018 -- Exported By: WTP -- Flashback: 0 -- Export Type: Application Export @@ -26,7 +26,7 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Application Statistics: -- Pages: 7 --- Items: 51 +-- Items: 52 -- Computations: 0 -- Validations: 0 -- Processes: 15 @@ -146,9 +146,9 @@ wwv_flow_api.create_flow( p_default_region_template=> 4840201642414912 + wwv_flow_api.g_id_offset, p_error_template=> 4837131094414910 + wwv_flow_api.g_id_offset, p_page_protection_enabled_y_n=> 'Y', - p_checksum_salt_last_reset => '20180718074206', + p_checksum_salt_last_reset => '20180718233538', p_max_session_length_sec=> 28800, - p_home_link=> 'f?p=&APP_ID.:1:&SESSION.', + p_home_link=> 'f?p=&APP_ID.:3:&SESSION.', p_flow_language=> 'en', p_flow_language_derived_from=> 'FLOW_PRIMARY_LANGUAGE', p_allow_feedback_yn=> 'N', @@ -192,7 +192,7 @@ wwv_flow_api.create_flow( p_default_listr_template => 4839116402414912 + wwv_flow_api.g_id_offset, p_default_irr_template => 4839831975414912 + wwv_flow_api.g_id_offset, p_last_updated_by => 'WTP', - p_last_upd_yyyymmddhh24miss=> '20180718074206', + p_last_upd_yyyymmddhh24miss=> '20180718233538', p_required_roles=> wwv_flow_utilities.string_to_table2('')); @@ -668,7 +668,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180718073923' + ,p_last_upd_yyyymmddhh24miss => '20180718220708' ); null; @@ -1310,14 +1310,15 @@ a1:=a1||'with q_max_start as ('||chr(10)|| ' group by runner_owner'||chr(10)|| ' ,runner_name'||chr(10)|| '), q_top_failures as ('||chr(10)|| -'select ms.runner_owner || ''.'' ||'||chr(10)|| +'select res.test_run_id'||chr(10)|| +' ,ms.runner_owner || ''.'' ||'||chr(10)|| ' ms.runner_name RUNNER'||chr(10)|| ' ,res.failures'||chr(10)|| ' from q_max_start ms'||chr(10)|| -' join wt_test_runs run'||chr(10)|| -' '; +' join wt_tes'; -a1:=a1||' on run.runner_owner = ms.runner_owner'||chr(10)|| +a1:=a1||'t_runs run'||chr(10)|| +' on run.runner_owner = ms.runner_owner'||chr(10)|| ' and run.runner_name = ms.runner_name'||chr(10)|| ' and run.start_dtm = ms.max_start_dtm'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| @@ -1326,13 +1327,13 @@ a1:=a1||' on run.runner_owner = ms.runner_owner'||chr(10)|| ' order by failures desc, RUNNER'||chr(10)|| ')'||chr(10)|| '--select * from q_max_start;'||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,runner LABEL'||chr(10)|| -' ,failures VALUE'||chr(10)|| -' from q_top_failures'||chr(10)|| -' w'; +'select test_run_id LINK'||chr(10)|| +' ,runner LABEL'||chr(10)|| +' ,failur'; -a1:=a1||'here rownum <= 10'; +a1:=a1||'es VALUE'||chr(10)|| +' from q_top_failures'||chr(10)|| +' where rownum <= 10'; wwv_flow_api.create_flash_chart5_series( p_id => 4858000738336332+wwv_flow_api.g_id_offset, @@ -1346,8 +1347,8 @@ wwv_flow_api.create_flash_chart5_series( p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'No data found.', p_series_query_row_count_max=>15, - p_action_link =>'', - p_show_action_link =>'N', + p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', p_action_link_checksum_type =>''); end; / @@ -1509,12 +1510,13 @@ a1:=a1||'with q_max_start as ('||chr(10)|| ' group by runner_owner'||chr(10)|| ' ,runner_name'||chr(10)|| '), q_top_duration as ('||chr(10)|| -'select ms.runner_owner || ''.'' ||'||chr(10)|| +'select run.id TEST_RUN_ID'||chr(10)|| +' ,ms.runner_owner || ''.'' ||'||chr(10)|| ' ms.runner_name RUNNER'||chr(10)|| -' ,extract(day from (run.end_dtm -'||chr(10)|| -' run.start_dtm)*8'; +' ,extract(day from (run'; -a1:=a1||'6400*100)/100'||chr(10)|| +a1:=a1||'.end_dtm -'||chr(10)|| +' run.start_dtm)*86400*100)/100'||chr(10)|| ' DURATION_SECS'||chr(10)|| ' from q_max_start ms'||chr(10)|| ' join wt_test_runs run'||chr(10)|| @@ -1522,13 +1524,13 @@ a1:=a1||'6400*100)/100'||chr(10)|| ' and run.runner_name = ms.runner_name'||chr(10)|| ' and run.start_dtm = ms.max_start_dtm'||chr(10)|| ' where extract(day from (run.end_dtm -'||chr(10)|| -' run.start_dtm)*86400*100)/100 > 0'||chr(10)|| -' order by duration_secs desc'; +' run.start_'; -a1:=a1||', RUNNER'||chr(10)|| +a1:=a1||'dtm)*86400*100)/100 > 0'||chr(10)|| +' order by duration_secs desc, RUNNER'||chr(10)|| ')'||chr(10)|| '--select * from q_max_start;'||chr(10)|| -'select NULL LINK'||chr(10)|| +'select test_run_id LINK'||chr(10)|| ' ,runner LABEL'||chr(10)|| ' ,duration_secs VALUE'||chr(10)|| ' from q_top_duration'||chr(10)|| @@ -1546,8 +1548,8 @@ wwv_flow_api.create_flash_chart5_series( p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'No data found.', p_series_query_row_count_max=>15, - p_action_link =>'', - p_show_action_link =>'N', + p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', p_action_link_checksum_type =>''); end; / @@ -1709,12 +1711,13 @@ a1:=a1||'with q_max_start as ('||chr(10)|| ' group by runner_owner'||chr(10)|| ' ,runner_name'||chr(10)|| '), q_top_duration as ('||chr(10)|| -'select ms.runner_owner || ''.'' ||'||chr(10)|| +'select run.id TEST_RUN_ID'||chr(10)|| +' ,ms.runner_owner || ''.'' ||'||chr(10)|| ' ms.runner_name RUNNER'||chr(10)|| -' ,extract(day from (sysdate - run.start_dtm)*10)/10'||chr(10)|| -' '; +' ,extract(day from '; -a1:=a1||' AGE_DAYS'||chr(10)|| +a1:=a1||'(sysdate - run.start_dtm)*10)/10'||chr(10)|| +' AGE_DAYS'||chr(10)|| ' from q_max_start ms'||chr(10)|| ' join wt_test_runs run'||chr(10)|| ' on run.runner_owner = ms.runner_owner'||chr(10)|| @@ -1722,12 +1725,12 @@ a1:=a1||' AGE_DAYS'||chr(10)|| ' and run.start_dtm = ms.max_start_dtm'||chr(10)|| ' where run.start_dtm is not null'||chr(10)|| ' and extract(day from (sysdate - run.start_dtm)*10)/10 > 0'||chr(10)|| -' order by AGE_DAYS desc, RUNNER'||chr(10)|| +' order by AGE_DA'; + +a1:=a1||'YS desc, RUNNER'||chr(10)|| ')'||chr(10)|| '--select * from q_max_start;'||chr(10)|| -'select '; - -a1:=a1||'NULL LINK'||chr(10)|| +'select test_run_id LINK'||chr(10)|| ' ,runner LABEL'||chr(10)|| ' ,age_days VALUE'||chr(10)|| ' from q_top_duration'||chr(10)|| @@ -1745,8 +1748,8 @@ wwv_flow_api.create_flash_chart5_series( p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'No data found.', p_series_query_row_count_max=>15, - p_action_link =>'', - p_show_action_link =>'N', + p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', p_action_link_checksum_type =>''); end; / @@ -1908,14 +1911,15 @@ a1:=a1||'with q_max_start as ('||chr(10)|| ' group by runner_owner'||chr(10)|| ' ,runner_name'||chr(10)|| '), q_top_notexec as ('||chr(10)|| -'select run.dbout_owner || ''.'' ||'||chr(10)|| +'select res.test_run_id'||chr(10)|| +' ,run.dbout_owner || ''.'' ||'||chr(10)|| ' run.dbout_name || ''('' ||'||chr(10)|| ' run.dbout_type || '')'' DBOUT'||chr(10)|| ' ,res.notexec_lines'||chr(10)|| -' from q_max_start ms'||chr(10)|| -' '; +' from'; -a1:=a1||' join wt_test_runs run'||chr(10)|| +a1:=a1||' q_max_start ms'||chr(10)|| +' join wt_test_runs run'||chr(10)|| ' on run.runner_owner = ms.runner_owner'||chr(10)|| ' and run.runner_name = ms.runner_name'||chr(10)|| ' and run.start_dtm = ms.max_start_dtm'||chr(10)|| @@ -1925,10 +1929,10 @@ a1:=a1||' join wt_test_runs run'||chr(10)|| ' and res.notexec_lines > 0'||chr(10)|| ' order by notexec_lines desc, DBOUT'||chr(10)|| ')'||chr(10)|| -'--select * from q_max_start;'||chr(10)|| -'select NULL '; +'--select * from q_max_'; -a1:=a1||' LINK'||chr(10)|| +a1:=a1||'start;'||chr(10)|| +'select test_run_id LINK'||chr(10)|| ' ,dbout LABEL'||chr(10)|| ' ,notexec_lines VALUE'||chr(10)|| ' from q_top_notexec'||chr(10)|| @@ -1946,8 +1950,8 @@ wwv_flow_api.create_flash_chart5_series( p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'No data found.', p_series_query_row_count_max=>15, - p_action_link =>'', - p_show_action_link =>'N', + p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', p_action_link_checksum_type =>''); end; / @@ -2324,12 +2328,13 @@ a1:=a1||'with q_max_start as ('||chr(10)|| ' group by runner_owner'||chr(10)|| ' ,runner_name'||chr(10)|| '), q_top_duration as ('||chr(10)|| -'select run.dbout_owner || ''.'' ||'||chr(10)|| +'select res.test_run_id'||chr(10)|| +' ,run.dbout_owner || ''.'' ||'||chr(10)|| ' run.dbout_name || ''('' ||'||chr(10)|| ' run.dbout_type || '')'' DBOUT'||chr(10)|| -' ,res.max_executed_usecs/1000 MAX_MSEC'; +' ,res.max_executed_u'; -a1:=a1||'S'||chr(10)|| +a1:=a1||'secs/1000 MAX_MSECS'||chr(10)|| ' from q_max_start ms'||chr(10)|| ' join wt_test_runs run'||chr(10)|| ' on run.runner_owner = ms.runner_owner'||chr(10)|| @@ -2340,10 +2345,10 @@ a1:=a1||'S'||chr(10)|| ' where res.max_executed_usecs > 0'||chr(10)|| ' order by MAX_MSECS desc, DBOUT'||chr(10)|| ')'||chr(10)|| -'--select * from q_max_start;'||chr(10)|| -'select NULL '; +'--select * from q_max_st'; -a1:=a1||' LINK'||chr(10)|| +a1:=a1||'art;'||chr(10)|| +'select test_run_id LINK'||chr(10)|| ' ,dbout LABEL'||chr(10)|| ' ,max_msecs VALUE'||chr(10)|| ' from q_top_duration'||chr(10)|| @@ -2361,8 +2366,8 @@ wwv_flow_api.create_flash_chart5_series( p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'No data found.', p_series_query_row_count_max=>15, - p_action_link =>'', - p_show_action_link =>'N', + p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', p_action_link_checksum_type =>''); end; / @@ -2773,6 +2778,8 @@ wwv_flow_api.create_report_columns ( p_column_alias=> 'ID', p_column_display_sequence=> 1, p_column_heading=> 'Test Run ID', + p_column_link=>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#ID#', + p_column_linktext=>'#ID#', p_column_alignment=>'LEFT', p_heading_alignment=>'RIGHT', p_default_sort_column_sequence=>1, @@ -2781,8 +2788,11 @@ wwv_flow_api.create_report_columns ( p_sum_column=> 'N', p_hidden_column=> 'N', p_display_as=>'ESCAPE_SC', + p_lov_show_nulls=> 'NO', p_is_required=> false, p_pk_col_source=> s, + p_lov_display_extra=> 'YES', + p_include_in_export=> 'Y', p_print_col_width=> '20', p_column_comment=>''); end; @@ -3304,7 +3314,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180717215617' + ,p_last_upd_yyyymmddhh24miss => '20180718225301' ); null; @@ -3947,7 +3957,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> true, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 2, + p_item_sequence=> 1, p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -4007,7 +4017,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 3, + p_item_sequence=> 2, p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'NO', p_item_default=> 'RUN_TEST', @@ -4294,7 +4304,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 6, + p_item_sequence=> 4, p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -4375,6 +4385,72 @@ wwv_flow_api.create_page_item( p_item_comment => ''); +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>5073001504097405 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 2, + p_name=>'P2_LAST_RUN_ID', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 3, + p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Last Run ID:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'PLSQL', + p_attribute_03 => 'declare'||chr(10)|| +' max_id number;'||chr(10)|| +'begin'||chr(10)|| +' -- Group Function never returns NO_DATA_FOUND'||chr(10)|| +' select max(id) into max_id'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where runner_owner = :APP_USER'||chr(10)|| +' and runner_name = :P2_TEST_RUNNER;'||chr(10)|| +' if max_id is not null'||chr(10)|| +' then'||chr(10)|| +' htp.p('''' || max_id || '' (Click to View)'' || '''');'||chr(10)|| +' end if;'||chr(10)|| +'end;', + p_show_quick_picks=>'N', + p_item_comment => ''); + + end; / @@ -4559,7 +4635,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180718065549' + ,p_last_upd_yyyymmddhh24miss => '20180718231703' ); null; @@ -6974,7 +7050,7 @@ s:=s||'select line'||chr(10)|| s:=s||'es'||chr(10)|| ' where test_run_id = :P3_TEST_RUN_ID'||chr(10)|| -' and status != ''IGNR'''||chr(10)|| +' -- and status != ''IGNR'''||chr(10)|| ' and ( instr(upper("STATUS"),upper(nvl(:P3_SEARCH,"STATUS"))) > 0'||chr(10)|| ' OR instr(upper("TEXT"),upper(nvl(:P3_SEARCH,"TEXT"))) > 0 )'||chr(10)|| ''; @@ -7006,13 +7082,49 @@ wwv_flow_api.create_report_region ( p_query_break_cols=> '0', p_query_no_data_found=> 'no data found', p_query_num_rows_item=> 'P3_ROWS', - p_query_num_rows_type=> '0', - p_pagination_display_position=> 'BOTTOM_RIGHT', - p_csv_output=> 'N', + p_query_num_rows_type=> 'COMPUTED_BUT_NOT_DISPLAYED', + p_pagination_display_position=> 'BOTTOM_LEFT', + p_csv_output=> 'Y', + p_csv_output_link_text=> 'CVS Link Label', + p_prn_output=> 'N', + p_prn_format=> 'PDF', + p_prn_output_show_link=> 'Y', + p_prn_output_link_text=> 'Print', + p_prn_content_disposition=> 'ATTACHMENT', + p_prn_document_header=> 'APEX', + p_prn_units=> 'INCHES', + p_prn_paper_size=> 'LETTER', + p_prn_width_units=> 'PERCENTAGE', + p_prn_width=> 11, + p_prn_height=> 8.5, + p_prn_orientation=> 'HORIZONTAL', + p_prn_page_header_font_color=> '#000000', + p_prn_page_header_font_family=> 'Helvetica', + p_prn_page_header_font_weight=> 'normal', + p_prn_page_header_font_size=> '12', + p_prn_page_footer_font_color=> '#000000', + p_prn_page_footer_font_family=> 'Helvetica', + p_prn_page_footer_font_weight=> 'normal', + p_prn_page_footer_font_size=> '12', + p_prn_header_bg_color=> '#9bafde', + p_prn_header_font_color=> '#ffffff', + p_prn_header_font_family=> 'Helvetica', + p_prn_header_font_weight=> 'normal', + p_prn_header_font_size=> '10', + p_prn_body_bg_color=> '#efefef', + p_prn_body_font_color=> '#000000', + p_prn_body_font_family=> 'Helvetica', + p_prn_body_font_weight=> 'normal', + p_prn_body_font_size=> '10', + p_prn_border_width=> .5, + p_prn_page_header_alignment=> 'CENTER', + p_prn_page_footer_alignment=> 'CENTER', p_query_asc_image=> 'apex/builder/dup.gif', p_query_asc_image_attr=> 'width="16" height="16" alt="" ', p_query_desc_image=> 'apex/builder/ddown.gif', p_query_desc_image_attr=> 'width="16" height="16" alt="" ', + p_plug_query_exp_separator=> ',', + p_plug_query_exp_enclosed_by=> '"', p_plug_query_strip_html=> 'Y', p_comment=>''); end; @@ -7039,6 +7151,8 @@ wwv_flow_api.create_report_columns ( p_display_as=>'ESCAPE_SC', p_is_required=> false, p_pk_col_source=> s, + p_include_in_export=> 'Y', + p_print_col_width=> '14', p_column_comment=>''); end; / @@ -7064,6 +7178,8 @@ wwv_flow_api.create_report_columns ( p_display_as=>'ESCAPE_SC', p_is_required=> false, p_pk_col_source=> s, + p_include_in_export=> 'Y', + p_print_col_width=> '14', p_column_comment=>''); end; / @@ -7089,6 +7205,8 @@ wwv_flow_api.create_report_columns ( p_display_as=>'ESCAPE_SC', p_is_required=> false, p_pk_col_source=> s, + p_include_in_export=> 'Y', + p_print_col_width=> '14', p_column_comment=>''); end; / @@ -7114,6 +7232,8 @@ wwv_flow_api.create_report_columns ( p_display_as=>'ESCAPE_SC', p_is_required=> false, p_pk_col_source=> s, + p_include_in_export=> 'Y', + p_print_col_width=> '14', p_column_comment=>''); end; / @@ -7139,6 +7259,8 @@ wwv_flow_api.create_report_columns ( p_display_as=>'ESCAPE_SC', p_is_required=> false, p_pk_col_source=> s, + p_include_in_export=> 'Y', + p_print_col_width=> '14', p_column_comment=>''); end; / @@ -7164,6 +7286,8 @@ wwv_flow_api.create_report_columns ( p_display_as=>'ESCAPE_SC', p_is_required=> false, p_pk_col_source=> s, + p_include_in_export=> 'Y', + p_print_col_width=> '14', p_column_comment=>''); end; / @@ -7192,6 +7316,7 @@ wwv_flow_api.create_report_columns ( p_pk_col_source=> s, p_lov_display_extra=> 'YES', p_include_in_export=> 'Y', + p_print_col_width=> '14', p_column_comment=>''); end; / @@ -7330,7 +7455,7 @@ wwv_flow_api.create_page_item( p_protection_level => 'N', p_escape_on_http_output => 'Y', p_help_text=> h, - p_attribute_01 => 'N', + p_attribute_01 => 'Y', p_attribute_02 => 'VALUE', p_attribute_04 => 'N', p_show_quick_picks=>'N', @@ -8309,9 +8434,9 @@ p:=p||' '':'' || clear_cache ||'||chr(10)|| ' '':'' || item_values ||'||chr(10)|| ' '':'' || V(''PRINTER_FRIENDLY'') ||'||chr(10)|| ' ''">'' || buff.runner_name ||'||chr(10)|| -' '' (Cli'; +' '' (Click t'; -p:=p||'ck to Run)'' ;'||chr(10)|| +p:=p||'o Run)'' ;'||chr(10)|| ' else'||chr(10)|| ' :P3_RUNNER_NAME_DISP := buff.runner_name;'||chr(10)|| ' end if;'||chr(10)|| @@ -12177,7 +12302,7 @@ wwv_flow_api.create_page ( ,p_page_is_public_y_n => 'N' ,p_cache_page_yn => 'N' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180706000357' + ,p_last_upd_yyyymmddhh24miss => '20180718215436' ); null; @@ -17372,9 +17497,9 @@ wwv_flow_api.create_row_template ( p_row_template1=> c1, p_row_template_condition1=> '''#STATUS#''=''NOTX''', p_row_template2=> c2, - p_row_template_condition2=> '''#STATUS#''=''UNKN''', + p_row_template_condition2=> '''#STATUS#''=''UNKN'' or ''#STATUS#''=''EXCL''', p_row_template3=> c3, - p_row_template_condition3=> '''#STATUS#''=''EXCL''', + p_row_template_condition3=> '''#STATUS#''=''IGNR''', p_row_template4=> c4, p_row_template_condition4=> '', p_row_template_before_rows=>'#TOP_PAGINATION#'||chr(10)|| From 9c0e134aae95243f4d371e4919f631ad80718aac Mon Sep 17 00:00:00 2001 From: DDieterich Date: Thu, 19 Jul 2018 22:52:14 -0500 Subject: [PATCH 013/141] GUI Development Complete --- src/gui/Notes.txt | 221 +++---------------------------------------- src/gui/f700.sql | 196 ++++++++++++++++++++++++++------------ src/gui/job_test.sql | 100 -------------------- 3 files changed, 148 insertions(+), 369 deletions(-) delete mode 100644 src/gui/job_test.sql diff --git a/src/gui/Notes.txt b/src/gui/Notes.txt index 5bab612..eb3dd15 100644 --- a/src/gui/Notes.txt +++ b/src/gui/Notes.txt @@ -1,208 +1,15 @@ -Fix Code Coverage Report - Pagination - All Lines Not Printed - IGNR color #ccccb3 - CSV File Link - -Setup Links on Test Runner Page Trend Graphs - -Setup Links on Test Case Page Trend Graphs - -Demo Video - - - -Test Case Names include the Test Runner Name. - (No Global Test Cases) -DBOUTs are not global either. - (DBOUTs must be connected to a Test Runner) - (Cannot aggregate source lines across multiple Test Runs) - -3 - Tabs: Home, Run Test, Test Runner, Test Case - -* Home Page - * Page Template Body 1 - * Control HTML: Region Sequence 11 Column 1 - * P1_OWNER: Test Runner Owner (LOV from Search TEST RUNS, Can be NULL, default USER) - * P1_UPDATE_BUTTON: (Button, displayed only if owner = USER) - * P1_NUM_RUNNERS: Test Runners (Read Only) - * P1_NUM_DBOUTS: DBOUT Profiles (Read Only) - * P1_NUM_CASES: Test Cases (Read Only) - * Test Runners Status Summary: Chart Region Sequence 12 Column 2 - * PASS/FAIL/ERR - * Pie Chart - * DBOUT Profiles Status Summary: Chart Region Sequence 13 Column 3 - * EXCL/EXEC/UNKN/NOTX - * Pie Chart - * Top Test Case Failures: Chart Region Sequence 21 Column 1 - * Top (Latest) Test Runner Failure % - * Column Chart - * Links to Test Cases Page - * Top Test Runner Failures: Chart Region Sequence 22 Column 2 - * Top (Latest) Test Runner Failure % - * Column Chart - * Links to Test Cases Page - * Top DBOUT NotExec Lines: Chart Region Sequence 23 Column 3 - * Top (Latest) DBOUT Lines Not-Executed % - * Column Chart - * Links to Test Runner Page - * Top Test Runner Age: Chart Region Sequence 31 Column 1 - * Oldest Test Runner Test Run Days - * Column Chart - * Links to Test Runner Page - * Top Test Runner Durations: Chart Region Sequence 32 Column 2 - * Top (Latest) Test Runner Long Duration Minutes - * Column Chart - * Links to Test Runner Page - * Top DBOUT LineExec Times: Chart Region Sequence 33 Column 3 - * Top (Latest) DBOUT Long LineExec Seconds - * Column Chart - * Links to Test Runner Page - * Page Template Body 2 - * P1_RUNNER_JOBS: Report Region Sequence 50 Column 1 - * List of Jobs from ALL_SCHEDULED_JOBS - (For OWNER or OWNERS from WT_TEST_RUNS) - * Status - * Job Start Date/Time - * Job Duration - * Job Name - * List Latest Test Runs - * Link to Stop Job - * P1_RUNNER_ERRORS: Report Region Sequence 51 Column 1 - * Test Runners with Errors - * Test Run ID - * Test Runner - * DBOUT Profiled - * Test Run Date/Time - * Test Runner Error - * Links to Run Test Page, if owner = USER - * Links to Test Runner Page -* Run Test Page - (Current Schema) - * Page Template Body 2 - * HTML Region Sequence 10 Column 1 - * Test Runner (Search-able LOV from Search for WTPLSQL_RUN) - * Execute (Button, then Go to Home Page) - (DBMS_SCHEDULER.CREATE_JOB) - * Job Name - wtPLSQL USER.TEST_RUNNER - * Job Type - PLSQL_BLOCK - * Job Action - begin wtplsql.test_run('TEST_RUNNER'); end; - * Enabled - TRUE - * Auto Drop - TRUE - * Report Region Sequence 20 Column 1 - * List of Jobs from USER_SCHEDULER_JOBS - * Status - * Job Start Date/Time - * Job Duration - * Job Name - * Order by Job Name - * Link to Stop Job (If OWNER = USER) - - -* Test Runner Page - (Single Test Run ID) - - * Page Template Body 1 - - * Control - * HTML Region Sequence 11 Column 1 (Column Span) - - * Test Run ID Tree - * Test Run ID (Read Only) - * Test Runner "OWNER.NAME" (Read Only) (Run Link) - - * Total Number of Test Cases (Read Only) - * Run Date/Time (Read Only) - * DBOUT Name "OWNER.NAME(TYPE)" (Read Only, Can be NULL) - - * Go To Run ID (Pop-Up LOV) - * Show Trend Charts (LOV, Boolean, Default: Y) - * Delete Test Runner (Button with Confirmation, displayed only if OWNER = USER) - - * Test Runner Status - * Chart Region Sequence 12 Column 2 - * Pie Chart - * PASS/FAIL/ERR - - * DBOUT Profile Status - * Chart Region Sequence 22 Column 2 - * Pie Chart - * EXCL/EXEC/UNKN/NOTX - - * Page Template Body 2 - - * Test Runner Status Trend - * Chart Region Sequence 21 Column 1 - * Line Chart (Stacked using SQL) - * PASS/FAIL/ERR - * Display if Show Trend Charts - * Links to Other Test Run IDs, Same Page - - * DBOUT Profile Status Trend - * Chart Region Sequence 22 Column 2 - * Line Chart (Stacked using SQL) - * EXCL/EXEC/UNKN/NOTX - * Display if Show Trend Charts - * Links to Other Test Run IDs, Same Page - - * Top Test Case Failures - * Chart Region Sequence 23 Column 3 - * Column Chart - * Display if Show Trend Charts - * Links to Test Cases - - * Test Runner Duration Trend (Minutes) - * Chart Region Sequence 31 Column 1 - * Line Chart - * Display if Show Trend Charts - * Links to Other Test Run IDs, Same Page - - * Maximum LineExec Trend - * Chart Region Sequence 32 Column 1 - * Column Chart - * Display if Show Trend Charts - * Links to Other Test Run IDs, Same Page - - * Top Test Case Long Duration Minutes - * Chart Region Sequence 33 Column 3 - * Column Chart - * Display if Show Trend Charts - * Links to Test Cases - - * Page Template Body 3 - * HTML Region Sequence 10 Column 1 - * Test Results Details - * Links to Test Cases - * HTML Region Sequence 20 Column 1 - * Code Coverage Details (Optional, HTML Text) - -* Test Case Page - (Single Test Run ID, Single Test Case) - * Page Template Body 1 - - * HTML Region Sequence 11 Column 1 - * Test Run ID (Read Only) - * Test Runner OWNER (Read Only) - * Test Runner (Read Only) - * Run Date/Time (Read Only) - * Test Case (Read Only) - * Set Test Case (LOV, existing for Test Run ID) - * Update (back to same page) (Button or after update trigger) - * Go To Test Runner Page (Button) - * Go To Run Test Page (Button, Displayed only if Owner is USER) - * Chart Region Sequence 12 Column 2 - * PASS/FAIL/ERR Pie Chart - - * Chart Region Sequence 21 Column 1 - * PASS/FAIL/ERR Trend - * Bar Vertical Chart - * Links to Other Test Run Date/Time - * Chart Region Sequence 22 Column 2 - * Duration Trend - * Bar Horizontal Chart - * Links to Other Test Run Date/Time - - * Page Template Body 2 - * HTML Region Sequence 20 Column 1 - * Test Case Results Details +Gui Demo + + 1) GUI Installation + 2) Demo Installation + 3) Demo Review + 4) Setup DB Link and Job Queue Process Parameter + 5) Run Demo Test (w/ Test Case, No DBOUT) + 6) Review Test Run + 7) Review Test Case + 8) Run Demo Test (w/ DBOUT) + 9) Review Test Run +10) Search DBOUT +11) Run Test All +10) Dashboard diff --git a/src/gui/f700.sql b/src/gui/f700.sql index eee1c87..5c9d3f9 100644 --- a/src/gui/f700.sql +++ b/src/gui/f700.sql @@ -13,7 +13,7 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Application Export: -- Application: 700 -- Name: wtPLSQL Core GUI --- Date and Time: 23:35 Wednesday July 18, 2018 +-- Date and Time: 22:51 Thursday July 19, 2018 -- Exported By: WTP -- Flashback: 0 -- Export Type: Application Export @@ -146,7 +146,7 @@ wwv_flow_api.create_flow( p_default_region_template=> 4840201642414912 + wwv_flow_api.g_id_offset, p_error_template=> 4837131094414910 + wwv_flow_api.g_id_offset, p_page_protection_enabled_y_n=> 'Y', - p_checksum_salt_last_reset => '20180718233538', + p_checksum_salt_last_reset => '20180719225106', p_max_session_length_sec=> 28800, p_home_link=> 'f?p=&APP_ID.:3:&SESSION.', p_flow_language=> 'en', @@ -192,7 +192,7 @@ wwv_flow_api.create_flow( p_default_listr_template => 4839116402414912 + wwv_flow_api.g_id_offset, p_default_irr_template => 4839831975414912 + wwv_flow_api.g_id_offset, p_last_updated_by => 'WTP', - p_last_upd_yyyymmddhh24miss=> '20180718233538', + p_last_upd_yyyymmddhh24miss=> '20180719225106', p_required_roles=> wwv_flow_utilities.string_to_table2('')); @@ -668,7 +668,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180718220708' + ,p_last_upd_yyyymmddhh24miss => '20180719204221' ); null; @@ -4635,7 +4635,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180718231703' + ,p_last_upd_yyyymmddhh24miss => '20180719224742' ); null; @@ -5311,7 +5311,7 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select NULL LINK'||chr(10)|| +a1:=a1||'select res.test_run_id LINK'||chr(10)|| ' ,''ID: '' || run.id LABEL'||chr(10)|| ' ,res.passes PASS'||chr(10)|| ' from wt_test_runs run'||chr(10)|| @@ -5333,15 +5333,15 @@ wwv_flow_api.create_flash_chart5_series( p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'No data found.', p_series_query_row_count_max=>15, - p_action_link =>'', - p_show_action_link =>'N', + p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', p_action_link_checksum_type =>''); end; / declare a1 varchar2(32767) := null; begin -a1:=a1||'select NULL LINK'||chr(10)|| +a1:=a1||'select res.test_run_id LINK'||chr(10)|| ' ,''ID: '' || run.id LABEL'||chr(10)|| ' ,res.failures FAIL'||chr(10)|| ' from wt_test_runs run'||chr(10)|| @@ -5363,15 +5363,15 @@ wwv_flow_api.create_flash_chart5_series( p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'', p_series_query_row_count_max=>15, - p_action_link =>'', - p_show_action_link =>'N', + p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', p_action_link_checksum_type =>''); end; / declare a1 varchar2(32767) := null; begin -a1:=a1||'select NULL LINK'||chr(10)|| +a1:=a1||'select res.test_run_id LINK'||chr(10)|| ' ,''ID: '' || run.id LABEL'||chr(10)|| ' ,res.errors ERR'||chr(10)|| ' from wt_test_runs run'||chr(10)|| @@ -5393,8 +5393,8 @@ wwv_flow_api.create_flash_chart5_series( p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'', p_series_query_row_count_max=>15, - p_action_link =>'', - p_show_action_link =>'N', + p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', p_action_link_checksum_type =>''); end; / @@ -5547,7 +5547,7 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select NULL LINK'||chr(10)|| +a1:=a1||'select res.test_run_id LINK'||chr(10)|| ' ,''ID: '' || run.id LABEL'||chr(10)|| ' ,res.executed_lines EXEC'||chr(10)|| ' from wt_test_runs run'||chr(10)|| @@ -5569,15 +5569,15 @@ wwv_flow_api.create_flash_chart5_series( p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'No data found.', p_series_query_row_count_max=>15, - p_action_link =>'', - p_show_action_link =>'N', + p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', p_action_link_checksum_type =>''); end; / declare a1 varchar2(32767) := null; begin -a1:=a1||'select NULL LINK'||chr(10)|| +a1:=a1||'select res.test_run_id LINK'||chr(10)|| ' ,''ID: '' || run.id LABEL'||chr(10)|| ' ,res.excluded_lines EXCL'||chr(10)|| ' from wt_test_runs run'||chr(10)|| @@ -5599,15 +5599,15 @@ wwv_flow_api.create_flash_chart5_series( p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'', p_series_query_row_count_max=>15, - p_action_link =>'', - p_show_action_link =>'N', + p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', p_action_link_checksum_type =>''); end; / declare a1 varchar2(32767) := null; begin -a1:=a1||'select NULL LINK'||chr(10)|| +a1:=a1||'select res.test_run_id LINK'||chr(10)|| ' ,''ID: '' || run.id LABEL'||chr(10)|| ' ,res.unknown_lines UNKN'||chr(10)|| ' from wt_test_runs run'||chr(10)|| @@ -5629,15 +5629,15 @@ wwv_flow_api.create_flash_chart5_series( p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'', p_series_query_row_count_max=>15, - p_action_link =>'', - p_show_action_link =>'N', + p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', p_action_link_checksum_type =>''); end; / declare a1 varchar2(32767) := null; begin -a1:=a1||'select NULL LINK'||chr(10)|| +a1:=a1||'select res.test_run_id LINK'||chr(10)|| ' ,''ID: '' || run.id LABEL'||chr(10)|| ' ,res.notexec_lines NOTX'||chr(10)|| ' from wt_test_runs run'||chr(10)|| @@ -5659,8 +5659,8 @@ wwv_flow_api.create_flash_chart5_series( p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'', p_series_query_row_count_max=>15, - p_action_link =>'', - p_show_action_link =>'N', + p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', p_action_link_checksum_type =>''); end; / @@ -5813,7 +5813,8 @@ declare a1 varchar2(32767) := null; begin a1:=a1||'with q_top_failures as ('||chr(10)|| -'select run.runner_owner || ''.'' ||'||chr(10)|| +'select tc.test_run_id'||chr(10)|| +' ,run.runner_owner || ''.'' ||'||chr(10)|| ' run.runner_name || '':'' ||'||chr(10)|| ' tc.testcase TESTCASE'||chr(10)|| ' ,tc.failures'||chr(10)|| @@ -5824,10 +5825,23 @@ a1:=a1||'with q_top_failures as ('||chr(10)|| ' and tc.failures > 0'||chr(10)|| ' order by failures desc, TESTCASE'||chr(10)|| ')'||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,testcase LABE'; +'select ''f?p='' || :APP_ID '; -a1:=a1||'L'||chr(10)|| +a1:=a1||' ||'||chr(10)|| +' '':'' || ''6'' || -- Page'||chr(10)|| +' '':'' || :APP_SESSION ||'||chr(10)|| +' '':'' || :REQUEST ||'||chr(10)|| +' '':'' || :DEBUG ||'||chr(10)|| +' '':'' || ''N'' || -- CLear Cache'||chr(10)|| +' '':'' || ''P6_TEST_RUN_ID'' || '','' ||'||chr(10)|| +' ''P6_TESTCASE_NAME'' || -- Item Names'||chr(10)|| +' '':'' || test_run_id ||'; + +a1:=a1||' '','' ||'||chr(10)|| +' testcase || -- Item Values'||chr(10)|| +' '':'' || V(''PRINTER_FRIENDLY'')'||chr(10)|| +' LINK'||chr(10)|| +' ,testcase LABEL'||chr(10)|| ' ,failures VALUE'||chr(10)|| ' from q_top_failures'; @@ -5996,7 +6010,7 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select NULL LINK'||chr(10)|| +a1:=a1||'select res.test_run_id LINK'||chr(10)|| ' ,''ID: '' || run.id LABEL'||chr(10)|| ' ,extract(day from (run.end_dtm - run.start_dtm)*86400*100)/100'||chr(10)|| ' SECONDS'||chr(10)|| @@ -6019,8 +6033,8 @@ wwv_flow_api.create_flash_chart5_series( p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'No data found.', p_series_query_row_count_max=>15, - p_action_link =>'', - p_show_action_link =>'N', + p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', p_action_link_checksum_type =>''); end; / @@ -6172,7 +6186,7 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select NULL LINK'||chr(10)|| +a1:=a1||'select res.test_run_id LINK'||chr(10)|| ' ,''ID: '' || run.id LABEL'||chr(10)|| ' ,res.max_executed_usecs VALUE'||chr(10)|| ' from wt_test_runs run'||chr(10)|| @@ -6194,8 +6208,8 @@ wwv_flow_api.create_flash_chart5_series( p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'No data found.', p_series_query_row_count_max=>15, - p_action_link =>'', - p_show_action_link =>'N', + p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', p_action_link_checksum_type =>''); end; / @@ -7082,10 +7096,11 @@ wwv_flow_api.create_report_region ( p_query_break_cols=> '0', p_query_no_data_found=> 'no data found', p_query_num_rows_item=> 'P3_ROWS', - p_query_num_rows_type=> 'COMPUTED_BUT_NOT_DISPLAYED', + p_query_num_rows_type=> 'ROW_RANGES_IN_SELECT_LIST', + p_query_row_count_max=> '5000', p_pagination_display_position=> 'BOTTOM_LEFT', p_csv_output=> 'Y', - p_csv_output_link_text=> 'CVS Link Label', + p_csv_output_link_text=> 'Create CVS File', p_prn_output=> 'N', p_prn_format=> 'PDF', p_prn_output_show_link=> 'Y', @@ -7123,9 +7138,10 @@ wwv_flow_api.create_report_region ( p_query_asc_image_attr=> 'width="16" height="16" alt="" ', p_query_desc_image=> 'apex/builder/ddown.gif', p_query_desc_image_attr=> 'width="16" height="16" alt="" ', + p_plug_query_exp_filename=> '&P3_DBOUT_OWNER..&P3_DBOUT_NAME.(&P3_DBOUT_TYPE.)#&P3_TEST_RUN_ID..csv', p_plug_query_exp_separator=> ',', p_plug_query_exp_enclosed_by=> '"', - p_plug_query_strip_html=> 'Y', + p_plug_query_strip_html=> 'N', p_comment=>''); end; / @@ -8014,10 +8030,9 @@ wwv_flow_api.create_page_item( p_item_sequence=> 20, p_item_plug_id => 4952328298578419+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', - p_item_default=> '10000', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', p_prompt=>'Display', - p_source=>'10000', + p_source=>'500', p_source_type=> 'STATIC', p_display_as=> 'NATIVE_SELECT_LIST', p_named_lov=> 'P3_Report Row Per Page', @@ -8595,7 +8610,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180718065107' + ,p_last_upd_yyyymmddhh24miss => '20180719224813' ); null; @@ -8714,7 +8729,7 @@ wwv_flow_api.create_worksheet( p_allow_report_categories=>'N', p_show_nulls_as=>'-', p_pagination_type=>'ROWS_X_TO_Y', - p_pagination_display_pos=>'BOTTOM_RIGHT', + p_pagination_display_pos=>'BOTTOM_LEFT', p_show_finder_drop_down=>'Y', p_show_display_row_count=>'N', p_show_search_bar=>'Y', @@ -10002,7 +10017,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180718072746' + ,p_last_upd_yyyymmddhh24miss => '20180719205232' ); null; @@ -11046,14 +11061,29 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select NULL LINK'||chr(10)|| +a1:=a1||'select ''f?p='' || :APP_ID ||'||chr(10)|| +' '':'' || ''6'' || -- Page'||chr(10)|| +' '':'' || :APP_SESSION ||'||chr(10)|| +' '':'' || :REQUEST ||'||chr(10)|| +' '':'' || :DEBUG ||'||chr(10)|| +' '':'' || ''N'' || -- CLear Cache'||chr(10)|| +' '':'' || ''P6_TEST_RUN_ID'' || '','' ||'||chr(10)|| +' ''P6_TESTCASE_NAME'' || -- Item Names'||chr(10)|| +' '; + +a1:=a1||' '':'' || res.test_run_id || '','' ||'||chr(10)|| +' res.testcase || -- Item Values'||chr(10)|| +' '':'' || V(''PRINTER_FRIENDLY'')'||chr(10)|| +' LINK'||chr(10)|| ' ,''ID: '' || run.id ||'||chr(10)|| ' '' - '' || testcase LABEL'||chr(10)|| ' ,res.passes PASS'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_testcase_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| -' and res.testcase = :P6_TESTCASE_NAME'||chr(10)|| +' and res.testcase = '; + +a1:=a1||':P6_TESTCASE_NAME'||chr(10)|| ' where run.runner_owner = :P6_RUNNER_OWNER'||chr(10)|| ' and run.runner_name = :P6_RUNNER_NAME'||chr(10)|| ' order by run.id'; @@ -11078,14 +11108,29 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select NULL LINK'||chr(10)|| +a1:=a1||'select ''f?p='' || :APP_ID ||'||chr(10)|| +' '':'' || ''6'' || -- Page'||chr(10)|| +' '':'' || :APP_SESSION ||'||chr(10)|| +' '':'' || :REQUEST ||'||chr(10)|| +' '':'' || :DEBUG ||'||chr(10)|| +' '':'' || ''N'' || -- CLear Cache'||chr(10)|| +' '':'' || ''P6_TEST_RUN_ID'' || '','' ||'||chr(10)|| +' ''P6_TESTCASE_NAME'' || -- Item Names'||chr(10)|| +' '; + +a1:=a1||' '':'' || res.test_run_id || '','' ||'||chr(10)|| +' res.testcase || -- Item Values'||chr(10)|| +' '':'' || V(''PRINTER_FRIENDLY'')'||chr(10)|| +' LINK'||chr(10)|| ' ,''ID: '' || run.id ||'||chr(10)|| ' '' - '' || testcase LABEL'||chr(10)|| ' ,res.failures FAIL'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_testcase_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| -' and res.testcase = :P6_TESTCASE_NAME'||chr(10)|| +' and res.testcase = '; + +a1:=a1||':P6_TESTCASE_NAME'||chr(10)|| ' where run.runner_owner = :P6_RUNNER_OWNER'||chr(10)|| ' and run.runner_name = :P6_RUNNER_NAME'||chr(10)|| ' order by run.id'; @@ -11110,14 +11155,29 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select NULL LINK'||chr(10)|| +a1:=a1||'select ''f?p='' || :APP_ID ||'||chr(10)|| +' '':'' || ''6'' || -- Page'||chr(10)|| +' '':'' || :APP_SESSION ||'||chr(10)|| +' '':'' || :REQUEST ||'||chr(10)|| +' '':'' || :DEBUG ||'||chr(10)|| +' '':'' || ''N'' || -- CLear Cache'||chr(10)|| +' '':'' || ''P6_TEST_RUN_ID'' || '','' ||'||chr(10)|| +' ''P6_TESTCASE_NAME'' || -- Item Names'||chr(10)|| +' '; + +a1:=a1||' '':'' || res.test_run_id || '','' ||'||chr(10)|| +' res.testcase || -- Item Values'||chr(10)|| +' '':'' || V(''PRINTER_FRIENDLY'')'||chr(10)|| +' LINK'||chr(10)|| ' ,''ID: '' || run.id ||'||chr(10)|| ' '' - '' || testcase LABEL'||chr(10)|| ' ,res.errors ERR'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_testcase_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| -' and res.testcase = :P6_TESTCASE_NAME'||chr(10)|| +' and res.testcase = :'; + +a1:=a1||'P6_TESTCASE_NAME'||chr(10)|| ' where run.runner_owner = :P6_RUNNER_OWNER'||chr(10)|| ' and run.runner_name = :P6_RUNNER_NAME'||chr(10)|| ' order by run.id'; @@ -11287,20 +11347,32 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select NULL LINK'||chr(10)|| +a1:=a1||'select ''f?p='' || :APP_ID ||'||chr(10)|| +' '':'' || ''6'' || -- Page'||chr(10)|| +' '':'' || :APP_SESSION ||'||chr(10)|| +' '':'' || :REQUEST ||'||chr(10)|| +' '':'' || :DEBUG ||'||chr(10)|| +' '':'' || ''N'' || -- CLear Cache'||chr(10)|| +' '':'' || ''P6_TEST_RUN_ID'' || '','' ||'||chr(10)|| +' ''P6_TESTCASE_NAME'' || -- Item Names'||chr(10)|| +' '; + +a1:=a1||' '':'' || run.id || '','' ||'||chr(10)|| +' res.testcase || -- Item Values'||chr(10)|| +' '':'' || V(''PRINTER_FRIENDLY'')'||chr(10)|| +' LINK'||chr(10)|| ' ,''ID: '' || run.id ||'||chr(10)|| -' '' - '' || testcase LABEL'||chr(10)|| -' ,res.tot_interval_msecs'||chr(10)|| -' MILLISECONDS'||chr(10)|| +' '' - '' || res.testcase LABEL'||chr(10)|| +' ,res.tot_interval_msecs MILLISECONDS'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_testcase_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| -' and res.testcase = :P6_TESTCASE_NAME'||chr(10)|| +' an'; + +a1:=a1||'d res.testcase = :P6_TESTCASE_NAME'||chr(10)|| ' where run.runner_owner = :P6_RUNNER_OWNER'||chr(10)|| ' and run.runner_name = :P6_RUNNER_NAME'||chr(10)|| -' order'; - -a1:=a1||' by id'; +' order by id'; wwv_flow_api.create_flash_chart5_series( p_id => 4988419037323184+wwv_flow_api.g_id_offset, @@ -12302,7 +12374,7 @@ wwv_flow_api.create_page ( ,p_page_is_public_y_n => 'N' ,p_cache_page_yn => 'N' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180718215436' + ,p_last_upd_yyyymmddhh24miss => '20180719205429' ); null; @@ -12511,7 +12583,7 @@ p:=p||'wwv_flow_custom_auth_std.login('||chr(10)|| ' P_UNAME => :P101_USERNAME,'||chr(10)|| ' P_PASSWORD => :P101_PASSWORD,'||chr(10)|| ' P_SESSION_ID => v(''APP_SESSION''),'||chr(10)|| -' P_FLOW_PAGE => :APP_ID||'':1'''||chr(10)|| +' P_FLOW_PAGE => :APP_ID||'':3'''||chr(10)|| ' );'; wwv_flow_api.create_page_process( @@ -17497,9 +17569,9 @@ wwv_flow_api.create_row_template ( p_row_template1=> c1, p_row_template_condition1=> '''#STATUS#''=''NOTX''', p_row_template2=> c2, - p_row_template_condition2=> '''#STATUS#''=''UNKN'' or ''#STATUS#''=''EXCL''', + p_row_template_condition2=> '''#STATUS#''=''UNKN''', p_row_template3=> c3, - p_row_template_condition3=> '''#STATUS#''=''IGNR''', + p_row_template_condition3=> '''#STATUS#''=''IGNR'' or ''#STATUS#''=''EXCL''', p_row_template4=> c4, p_row_template_condition4=> '', p_row_template_before_rows=>'
    #TOP_PAGINATION#'||chr(10)|| diff --git a/src/gui/job_test.sql b/src/gui/job_test.sql deleted file mode 100644 index 4be06b1..0000000 --- a/src/gui/job_test.sql +++ /dev/null @@ -1,100 +0,0 @@ - -BEGIN - DBMS_SCHEDULER.DROP_CREDENTIAL('WTP_DEMO'); - --DBMS_SCHEDULER.CREATE_CREDENTIAL('WTP_DEMO', 'WTP_DEMO', 'wtp_demo'); -END; -/ - -BEGIN - DBMS_SCHEDULER.CREATE_DATABASE_DESTINATION ( - destination_name => 'LOOPBACK', - agent => 'DBHOST1', - tns_name => 'ORCLDW', - comments => 'Instance named orcldw on host dbhost1.example.com'); -END; -/ - -BEGIN - DBMS_SCHEDULER.CREATE_JOB ( - job_name => 'DEMO_TEST', - job_type => 'PLSQL_BLOCK', - -- job_action => 'begin wtplsql.test_all@wtp_demo; end;', - job_action => 'begin wtplsql.test_run@wtp_demo(''UT_TRUNCIT''); end;', - enabled => TRUE); - COMMIT; -END; -/ - -BEGIN - DBMS_SCHEDULER.ENABLE('DEMO_TEST'); -END; -/ - -select * from wt_test_runs - order by id desc; - -select * from wt_scheduler_jobs; - -select inst_id, value from sys.gv_$parameter where name = 'job_queue_processes'; - -select * from trigger_test_tab@wtp_demo; - -drop database link wtp_demo; - - CREATE DATABASE LINK "WTP_DEMO" - CONNECT TO "WTP_DEMO" IDENTIFIED BY wtp_demo - USING '//localhost:1521/XE'; - -select host from user_db_links; - -begin - execute immediate 'drop database link test'; -exception when others then - raise_application_error (-20000, SQLERRM); -end; -/ - -declare - -- - -- Using DBMS_SYS_SQL To Execute Statements As Another User - -- by Alex Fatkulin - November 5, 2007 - -- https://blog.pythian.com/using-dbms_sys_sql-to-execute-statements-as-another-user/ - -- - uid number; - sys_cursor INTEGER; - rows_processed INTEGER; -begin - select user_id into uid - from dba_users - where username = :APP_USER; - sys_cursor := sys.dbms_sys_sql.open_cursor; - sys.dbms_sys_sql.parse_as_user - (c => sys_cursor - ,statement => 'begin wtplsql.test_all; end;' - ,language_flag => dbms_sql.native - ,userid => uid); - rows_processed := sys.dbms_sys_sql.execute(sys_cursor); - sys.dbms_sql.close_cursor(sys_cursor); -exception -when others then - sys.dbms_sql.close_cursor(sys_cursor); -end; -/ - -select * from wt_test_runs - order by id desc; - -select SYS_CONTEXT('USERENV','DB_NAME') from dual; - -drop database link loopback; -create database link loopback - connect to wtp_demo identified by wtp_demo - using '//localhost:1521/XE'; - -begin - --wtplsql.test_all@loopback; - wtplsql.test_run@loopback('UT_TRUNCIT'); -end; -/ - -select db_link from user_db_links; From b1c9ea0544f8a3efc0af88c3b9fb620088603e37 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Fri, 20 Jul 2018 07:04:21 -0500 Subject: [PATCH 014/141] Publish am image in README.md --- docs/README.htm | 17 +-------------- docs/README.md | 21 +++---------------- docs/images/Example wtPLSQL Test Results.PNG | Bin 0 -> 33001 bytes 3 files changed, 4 insertions(+), 34 deletions(-) create mode 100644 docs/images/Example wtPLSQL Test Results.PNG diff --git a/docs/README.htm b/docs/README.htm index 4ee7d2b..fe2e9d9 100644 --- a/docs/README.htm +++ b/docs/README.htm @@ -5,23 +5,8 @@

    wtPLSQL Home Page

    Use GitHub "issues" for support. A (free) GitHub account will be required to create a new issue. Issues can be searched without an account.

    Example wtPLSQL Test Results

    This is the summary from the WT_ASSERT package self-test. It was created with the default DBMS_OUTPUT reporting package. Because test results and code coverage is stored in Oracle tables, other report formats are simple to create.

    -
        wtPLSQL 1.1.0 - Run ID 7: 09-Jun-2018 11:48:42 AM
    +Sample DBMS_OUTPUT from wtPLSQL
     
    -  Test Results for WTP.WT_ASSERT
    -        Total Testcases:      150       Total Assertions:      404
    -  Minimum Interval msec:        0      Failed Assertions:        0
    -  Average Interval msec:        7       Error Assertions:        0
    -  Maximum Interval msec:      761             Test Yield:   100.00%
    -   Total Run Time (sec):      2.8
    -
    -  Code Coverage for PACKAGE BODY WTP.WT_ASSERT
    -          Ignored Lines:     1103   Total Profiled Lines:     1464
    -         Excluded Lines:        6   Total Executed Lines:      309
    -  Minimum LineExec usec:        0     Not Executed Lines:        0
    -  Average LineExec usec:      394          Unknown Lines:       46
    -  Maximum LineExec usec:    65814          Code Coverage:   100.00%
    -  Trigger Source Offset:        0
    -

    To view the complete test results from the wtPLSQL self-test, go to the test_allO.LST file in GitHub. The Demonstrations and Examples Page has more examples.

    What is wtPLSQL?

    wtPLSQL helps with white-box testing of Oracle database objects. It is particularly well suited for unit testing and simple integration testing. It is written in PL/SQL. It contains a self-test which makes it easier to support and customize.

    diff --git a/docs/README.md b/docs/README.md index 8868366..28a7821 100644 --- a/docs/README.md +++ b/docs/README.md @@ -11,24 +11,9 @@ Use [GitHub "issues"](https://github.com/DDieterich/wtPLSQL/issues) for support. This is the summary from the WT_ASSERT package self-test. It was created with the default DBMS_OUTPUT reporting package. Because test results and code coverage is stored in Oracle tables, other report formats are simple to create. -``` - wtPLSQL 1.1.0 - Run ID 7: 09-Jun-2018 11:48:42 AM - - Test Results for WTP.WT_ASSERT - Total Testcases: 150 Total Assertions: 404 - Minimum Interval msec: 0 Failed Assertions: 0 - Average Interval msec: 7 Error Assertions: 0 - Maximum Interval msec: 761 Test Yield: 100.00% - Total Run Time (sec): 2.8 - - Code Coverage for PACKAGE BODY WTP.WT_ASSERT - Ignored Lines: 1103 Total Profiled Lines: 1464 - Excluded Lines: 6 Total Executed Lines: 309 - Minimum LineExec usec: 0 Not Executed Lines: 0 - Average LineExec usec: 394 Unknown Lines: 46 - Maximum LineExec usec: 65814 Code Coverage: 100.00% - Trigger Source Offset: 0 -``` + +Sample DBMS_OUTPUT from wtPLSQL + To view the complete test results from the wtPLSQL self-test, go to the [test_allO.LST](https://github.com/DDieterich/wtPLSQL/blob/master/src/core/test_allO.LST) file in GitHub. The [Demonstrations and Examples Page](demo/README.md) has more examples. diff --git a/docs/images/Example wtPLSQL Test Results.PNG b/docs/images/Example wtPLSQL Test Results.PNG new file mode 100644 index 0000000000000000000000000000000000000000..73348e14bfec9560bc92175046134146a6966679 GIT binary patch literal 33001 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 literal 0 HcmV?d00001 From c748616401906c8d9427e66d44a35e19972298f5 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Fri, 20 Jul 2018 07:35:36 -0500 Subject: [PATCH 015/141] Finished Image Conversions --- docs/README.htm | 12 +++- docs/README.md | 10 +++- docs/demo/Package-Test.htm | 46 +--------------- docs/demo/Package-Test.md | 52 +----------------- docs/demo/images/Leaving Something Behind.PNG | Bin 0 -> 29161 bytes docs/demo/images/Setup and Teardown.PNG | Bin 0 -> 32113 bytes .../images/Testing Put Line and Get Line.PNG | Bin 0 -> 22501 bytes 7 files changed, 25 insertions(+), 95 deletions(-) create mode 100644 docs/demo/images/Leaving Something Behind.PNG create mode 100644 docs/demo/images/Setup and Teardown.PNG create mode 100644 docs/demo/images/Testing Put Line and Get Line.PNG diff --git a/docs/README.htm b/docs/README.htm index fe2e9d9..aa323de 100644 --- a/docs/README.htm +++ b/docs/README.htm @@ -25,7 +25,17 @@

    How does wtPLSQL c

    User Help

      -
    • Demonstrations and Examples Page
    • +
    • Demonstrations and Examples Page +
    • Reference
    • Best Practices
    • DB Docs from SQL*Developer
    • diff --git a/docs/README.md b/docs/README.md index 28a7821..3260cac 100644 --- a/docs/README.md +++ b/docs/README.md @@ -11,10 +11,8 @@ Use [GitHub "issues"](https://github.com/DDieterich/wtPLSQL/issues) for support. This is the summary from the WT_ASSERT package self-test. It was created with the default DBMS_OUTPUT reporting package. Because test results and code coverage is stored in Oracle tables, other report formats are simple to create. - Sample DBMS_OUTPUT from wtPLSQL - To view the complete test results from the wtPLSQL self-test, go to the [test_allO.LST](https://github.com/DDieterich/wtPLSQL/blob/master/src/core/test_allO.LST) file in GitHub. The [Demonstrations and Examples Page](demo/README.md) has more examples. ## What is wtPLSQL? @@ -49,6 +47,14 @@ More information is available [in this link](utPLSQL-V2-Comparison.md). User Help * [Demonstrations and Examples Page](demo/README.md) + * [Package Test](demo/Package-Test.md) + * [Table Constraints Test](demo/Table-Test.md) + * [Trigger Test](demo/Trigger-Test.md) + * [Type Test](demo/Type-Test.md) + * [ut_betwnstr](demo/ut_betwnstr.md) - Choose a program to test + * [ut_calc_secs_between](demo/ut_calc_secs_between.md) - Test a Simple Procedure + * [ut_truncit](demo/ut_truncit.md) - Test a Table Modification Procedure + * [ut_str](demo/ut_str.md) - Test a Simple Function * [Reference](Reference.md) * [Best Practices](Best-Practices.md) * [DB Docs from SQL*Developer](core/DBDocs/index.html) diff --git a/docs/demo/Package-Test.htm b/docs/demo/Package-Test.htm index 966deb2..aa83c5b 100644 --- a/docs/demo/Package-Test.htm +++ b/docs/demo/Package-Test.htm @@ -56,19 +56,8 @@

      Testing Put Line and Get Line

      /

      And get this:

      -
          wtPLSQL 1.1.0 - Run ID 44: 16-Jun-2018 03:45:33 PM
      +Testing Put Line and Get Line Result
       
      -  Test Results for WTP_DEMO.TEST_DBMS_OUTPUT
      -       Total Test Cases:        0       Total Assertions:        1
      -  Minimum Interval msec:        4      Failed Assertions:        0
      -  Average Interval msec:        4       Error Assertions:        0
      -  Maximum Interval msec:        4             Test Yield:   100.00%
      -   Total Run Time (sec):      0.0
      -
      - - WTP_DEMO.TEST_DBMS_OUTPUT Test Result Details (Test Run ID 44)
      ------------------------------------------------------------
      - PASS    4ms Test 1. EQ - Expected "Test 1" and got "Test 1"
      -

      A successful test. Notice that the value of the C_TEST1 constant is displayed in the test result details.

      Leaving Something Behind

      In the previous example, everything worked correctly. If a problem occurs during testing, things can be left behind. Here is an example of GET_LINE not working, leaving the value of C_TEST1 in the DBMS_OUTPUT buffer. For testing purposes, an exception will be thrown between the PUT_LINE and GET_LINE call.

      @@ -112,22 +101,8 @@

      Leaving Something Behind

      /

      And get this:

      -
          wtPLSQL 1.1.0 - Run ID 49: 16-Jun-2018 04:18:39 PM
      -
      -  Test Results for WTP_DEMO.TEST_DBMS_OUTPUT
      -       Total Test Cases:        0       Total Assertions:        0
      -  Minimum Interval msec:        0      Failed Assertions:        0
      -  Average Interval msec:        0       Error Assertions:        0
      -  Maximum Interval msec:        0             Test Yield: %
      -   Total Run Time (sec):      0.0
      +Leaving Something Behind Result
       
      -  *** Test Runner Error ***
      -ORA-20000: Fault insertion exception
      -ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 10
      -ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 18
      -ORA-06512: at line 1
      -ORA-06512: at "WTP.WTPLSQL", line 309
      -

      No assertions were run because of the exception. The exception that was captured appears below the test results summary.

      Setup and Teardown

      Setup and Teardown procedures are used to prepare for and cleanup from tests. For DBMS_OUTPUT testing, the buffer needs to be preserved before testing starts. After testing is complete, the original buffer contents need to be returned to the buffer.

      @@ -217,23 +192,8 @@

      Setup and Teardown

      /

      And get this:

      -
          wtPLSQL 1.1.0 - Run ID 51: 16-Jun-2018 04:56:39 PM
      -
      -  Test Results for WTP_DEMO.TEST_DBMS_OUTPUT
      -       Total Test Cases:        0       Total Assertions:        0
      -  Minimum Interval msec:        0      Failed Assertions:        0
      -  Average Interval msec:        0       Error Assertions:        0
      -  Maximum Interval msec:        0             Test Yield: %
      -   Total Run Time (sec):      0.1
      +Setup and Teardown Result
       
      -  *** Test Runner Error ***
      -ORA-20000: ORA-20000: Fault insertion exception
      -ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 21
      -ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 47
      -ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 53
      -ORA-06512: at line 1
      -ORA-06512: at "WTP.WTPLSQL", line 309
      -

      The exception handler preserved the error stack before calling teardown. Also, there is an extra "ORA-20000:" at the front of the error stack displayed, but all the error information is preserved.

      These are all the basic tools needed to successfully create and run test runner packages in wtPLSQL.


      diff --git a/docs/demo/Package-Test.md b/docs/demo/Package-Test.md index b2c2623..6f40c47 100644 --- a/docs/demo/Package-Test.md +++ b/docs/demo/Package-Test.md @@ -79,20 +79,7 @@ end; And get this: -``` - wtPLSQL 1.1.0 - Run ID 44: 16-Jun-2018 03:45:33 PM - - Test Results for WTP_DEMO.TEST_DBMS_OUTPUT - Total Test Cases: 0 Total Assertions: 1 - Minimum Interval msec: 4 Failed Assertions: 0 - Average Interval msec: 4 Error Assertions: 0 - Maximum Interval msec: 4 Test Yield: 100.00% - Total Run Time (sec): 0.0 - - - WTP_DEMO.TEST_DBMS_OUTPUT Test Result Details (Test Run ID 44) ------------------------------------------------------------ - PASS 4ms Test 1. EQ - Expected "Test 1" and got "Test 1" -``` +Testing Put Line and Get Line Result A successful test. Notice that the value of the C_TEST1 constant is displayed in the test result details. @@ -154,23 +141,7 @@ end; And get this: -``` - wtPLSQL 1.1.0 - Run ID 49: 16-Jun-2018 04:18:39 PM - - Test Results for WTP_DEMO.TEST_DBMS_OUTPUT - Total Test Cases: 0 Total Assertions: 0 - Minimum Interval msec: 0 Failed Assertions: 0 - Average Interval msec: 0 Error Assertions: 0 - Maximum Interval msec: 0 Test Yield: % - Total Run Time (sec): 0.0 - - *** Test Runner Error *** -ORA-20000: Fault insertion exception -ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 10 -ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 18 -ORA-06512: at line 1 -ORA-06512: at "WTP.WTPLSQL", line 309 -``` +Leaving Something Behind Result No assertions were run because of the exception. The exception that was captured appears below the test results summary. @@ -278,24 +249,7 @@ end; And get this: -``` - wtPLSQL 1.1.0 - Run ID 51: 16-Jun-2018 04:56:39 PM - - Test Results for WTP_DEMO.TEST_DBMS_OUTPUT - Total Test Cases: 0 Total Assertions: 0 - Minimum Interval msec: 0 Failed Assertions: 0 - Average Interval msec: 0 Error Assertions: 0 - Maximum Interval msec: 0 Test Yield: % - Total Run Time (sec): 0.1 - - *** Test Runner Error *** -ORA-20000: ORA-20000: Fault insertion exception -ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 21 -ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 47 -ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 53 -ORA-06512: at line 1 -ORA-06512: at "WTP.WTPLSQL", line 309 -``` +Setup and Teardown Result The exception handler preserved the error stack before calling teardown. Also, there is an extra "ORA-20000:" at the front of the error stack displayed, but all the error information is preserved. diff --git a/docs/demo/images/Leaving Something Behind.PNG b/docs/demo/images/Leaving Something Behind.PNG new file mode 100644 index 0000000000000000000000000000000000000000..81113792b0a7fee1a40b91570202d7c14ce919a5 GIT binary patch literal 29161 zcmd432T+q;)bEQ*m!=3vM-h1Oh0%_uhL85Co)1Q|TS0_Y!*ORch!EF!bI+ z4-f)3zVG*)d+s@N=FZ%EzPXo~%ud40lRWF$+3UCd>%X7Kk1F!SgfxU$SXjggAKt5B zVciE{VcoOG$HlzE%rY~E8Sc5O$-l#@7^U06yuh}8tNa!Vt2*xCjVTW1HG#_qU3V-j zlJ38cd;QKu7FbxWfeP>6YWNr(v_kEeTN@CW`oC)h6_;`1%;un$`|i&etRIVPl5H<5 z@c~0bQ(kS_LM8d=<6~iTm!?%~Y%U_!F04FT_x%a>ruBZ5yhtq3@cJ>@j#!rI&%e&q z`!REEr{KhhZofm`ZMWa2aYQGalpU)cq z^WTn@c67s?T=&YiSf-?Z-YGFH_jtnj&r>WMGR%2n{s@>-{uv*?;k)+|7S7p>Q|8t34(>H3|??jJ(=LhKb# z)&j#}H0?v$>LHFwV-R&iOu4)e$aF-miX-NIpPjbnG6{EF#L&N{9Q_#BxhmBj4 zCqy_`p`QVnd1Sm~y{qerm((X#Y~Fm6zi4XQ=@F>d?}jEICPzHY_f}ni2jf~hqIKa2 zvtOYL%|-@oPbPSxx(-)E8)gXXt5?L7N${KC?mu^-(doDm7qIF;C(zFd{ggK@fWob2 ziL!-HAa>+Zf8-vP&`;Sp>5~1dc8DbJV}RPL9rB67X>pK!;!xU{*ucTWiXQ|moebBzaN*Ad;TnO4D$a zC%dTX>e5N?Rm6;oL`0m%!4K3&`E5mNL1pQLbWtF$a~8;S2@8uU!A5MHdmZ) z^~E33o&`!B1>N1%7JYnfvqs$fyfM*g3Nz%I!km^T6zzbX4Y1 zKDO{dXf|64p(3J+t=Kzy9M!7%?lh?)!~B3z@#%ZVNnQ~yz7BxDdFTMHe1Q&F8d5*DZYrvvFBh_Hfa%od_p`rBQ1v90c`K!56~X58;C}0 zh+fI{dxVOlJ%8T!0lj@rY(qtK{VRqF+k)U+M|pJCZtB8BcqC{R2mD6P#*~;fIs~DpN?C94Z^=a%(*fRvrs=-p8ddA9mEp~ zCW)nnzaG)zQ^tvZ_pq7OtOh^Y(Kjv!l;Le#a(_n%8kSo2PKPv|Ta1rfW17w9c~?My zq{o*{23>}5HAaq@@CcJtha>(4IYxUYZN`D5h?lRQv&#HhYN{^}3O+s|Po6FnD=m+(WIbjLSUSl&N zgsxpyIrd3Yq{-TLy`kX1rKZHrvP_v_0uFWkZ4jrag^FLxB^Utd;L#;mRDuP3hJs6caxWX0Q6`J*;0MsB!SX@9AaNFEu_K-NM1ZU&*A}C5(2) zIf6nXNxr2x@fMjU(Yc39M#hWb+QpD(#&!o|+?YV*n`q9Y7I_Icp1h*{kZoIQ!0svJ zX#2ZgEZKFTAsNMmQ`Dju(Q`~gAC%x*@3m-7eB?4x8UYPPCUs8@Tm z(ld*Iyrr4gNlBb|urvqT@A`EhN%wF%Hk>K_3@M`

      <9U)8DkHJ8iYJx@t|LB=$A_ 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 Date: Sat, 28 Jul 2018 21:39:07 -0500 Subject: [PATCH 016/141] Test Case Trend Graph Links Broken --- src/gui/f700.sql | 375 +++++++++++++++++++++++++++++------------------ 1 file changed, 232 insertions(+), 143 deletions(-) diff --git a/src/gui/f700.sql b/src/gui/f700.sql index 5c9d3f9..3a24cba 100644 --- a/src/gui/f700.sql +++ b/src/gui/f700.sql @@ -13,7 +13,7 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Application Export: -- Application: 700 -- Name: wtPLSQL Core GUI --- Date and Time: 22:51 Thursday July 19, 2018 +-- Date and Time: 21:38 Saturday July 28, 2018 -- Exported By: WTP -- Flashback: 0 -- Export Type: Application Export @@ -146,7 +146,7 @@ wwv_flow_api.create_flow( p_default_region_template=> 4840201642414912 + wwv_flow_api.g_id_offset, p_error_template=> 4837131094414910 + wwv_flow_api.g_id_offset, p_page_protection_enabled_y_n=> 'Y', - p_checksum_salt_last_reset => '20180719225106', + p_checksum_salt_last_reset => '20180728213827', p_max_session_length_sec=> 28800, p_home_link=> 'f?p=&APP_ID.:3:&SESSION.', p_flow_language=> 'en', @@ -192,7 +192,7 @@ wwv_flow_api.create_flow( p_default_listr_template => 4839116402414912 + wwv_flow_api.g_id_offset, p_default_irr_template => 4839831975414912 + wwv_flow_api.g_id_offset, p_last_updated_by => 'WTP', - p_last_upd_yyyymmddhh24miss=> '20180719225106', + p_last_upd_yyyymmddhh24miss=> '20180728213827', p_required_roles=> wwv_flow_utilities.string_to_table2('')); @@ -668,7 +668,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180719204221' + ,p_last_upd_yyyymmddhh24miss => '20180728144548' ); null; @@ -1203,9 +1203,9 @@ wwv_flow_api.create_page_plug ( p_plug_name=> 'Top Test Runner Failures', p_region_name=>'', p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 22, + p_plug_display_sequence=> 32, p_plug_display_column=> 2, - p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', p_plug_source=> s, p_plug_source_type=> 'FLASH_CHART5', p_translate_title=> 'Y', @@ -1403,9 +1403,9 @@ wwv_flow_api.create_page_plug ( p_plug_name=> 'Top Test Runner Durations', p_region_name=>'', p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 32, + p_plug_display_sequence=> 42, p_plug_display_column=> 2, - p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', p_plug_source=> s, p_plug_source_type=> 'FLASH_CHART5', p_translate_title=> 'Y', @@ -1604,9 +1604,9 @@ wwv_flow_api.create_page_plug ( p_plug_name=> 'Top Test Runner Age', p_region_name=>'', p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 31, + p_plug_display_sequence=> 41, p_plug_display_column=> 1, - p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', p_plug_source=> s, p_plug_source_type=> 'FLASH_CHART5', p_translate_title=> 'Y', @@ -1804,9 +1804,9 @@ wwv_flow_api.create_page_plug ( p_plug_name=> 'Top DBOUT NotExec Lines', p_region_name=>'', p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 23, + p_plug_display_sequence=> 33, p_plug_display_column=> 3, - p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', p_plug_source=> s, p_plug_source_type=> 'FLASH_CHART5', p_translate_title=> 'Y', @@ -2006,9 +2006,9 @@ wwv_flow_api.create_page_plug ( p_plug_name=> 'Top Test Case Failures', p_region_name=>'', p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 21, + p_plug_display_sequence=> 31, p_plug_display_column=> 1, - p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', p_plug_source=> s, p_plug_source_type=> 'FLASH_CHART5', p_translate_title=> 'Y', @@ -2221,9 +2221,9 @@ wwv_flow_api.create_page_plug ( p_plug_name=> 'Top DBOUT LineExec Times', p_region_name=>'', p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 33, + p_plug_display_sequence=> 43, p_plug_display_column=> 3, - p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', p_plug_source=> s, p_plug_source_type=> 'FLASH_CHART5', p_translate_title=> 'Y', @@ -2397,10 +2397,10 @@ wwv_flow_api.create_report_region ( p_name=> 'Selected Test Runner Jobs', p_region_name=>'', p_template=> 4840201642414912+ wwv_flow_api.g_id_offset, - p_display_sequence=> 50, + p_display_sequence=> 51, p_report_attributes=>'style="color:#0088FF"', p_display_column=> 1, - p_display_point=> 'BEFORE_SHOW_ITEMS', + p_display_point=> 'AFTER_SHOW_ITEMS', p_source=> s, p_source_type=> 'SQL_QUERY', p_display_error_message=> '#SQLERRM#', @@ -2691,10 +2691,10 @@ wwv_flow_api.create_report_region ( p_name=> 'Test Runner Errors', p_region_name=>'', p_template=> 4840201642414912+ wwv_flow_api.g_id_offset, - p_display_sequence=> 51, + p_display_sequence=> 52, p_report_attributes=>'style="color:#FF0000"', p_display_column=> 1, - p_display_point=> 'BEFORE_SHOW_ITEMS', + p_display_point=> 'AFTER_SHOW_ITEMS', p_source=> s, p_source_type=> 'SQL_QUERY', p_display_error_message=> '#SQLERRM#', @@ -4635,7 +4635,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180719224742' + ,p_last_upd_yyyymmddhh24miss => '20180728193857' ); null; @@ -5246,7 +5246,7 @@ wwv_flow_api.create_flash_chart5( p_chart_width =>300, p_chart_height =>200, p_chart_animation =>'N', - p_display_attr =>':H:::Y:N:Left::V:Y:Circle:::N:::Default', + p_display_attr =>':H:N::Y:N:Left::V:Y:Circle:::N:::Default', p_dial_tick_attr =>':::::::::::', p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', @@ -5311,15 +5311,23 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select res.test_run_id LINK'||chr(10)|| -' ,''ID: '' || run.id LABEL'||chr(10)|| +a1:=a1||'with q1 as ('||chr(10)|| +'select res.test_run_id LINK'||chr(10)|| +' ,''ID'' || run.id LABEL'||chr(10)|| ' ,res.passes PASS'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| ' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| ' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| -' order by run.id'; +' order by run.id'||chr(10)|| +'), q2 as ('||chr(10)|| +'select count(*) num_rows from q1'||chr(10)|| +')'||chr(10)|| +'select * from q1'||chr(10)|| +' where rownum > (select num_ro'; + +a1:=a1||'ws from q2) - 10'; wwv_flow_api.create_flash_chart5_series( p_id => 4932905763476124+wwv_flow_api.g_id_offset, @@ -5341,15 +5349,23 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select res.test_run_id LINK'||chr(10)|| -' ,''ID: '' || run.id LABEL'||chr(10)|| +a1:=a1||'with q1 as ('||chr(10)|| +'select res.test_run_id LINK'||chr(10)|| +' ,''ID'' || run.id LABEL'||chr(10)|| ' ,res.failures FAIL'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| ' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| ' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| -' order by run.id'; +' order by run.id'||chr(10)|| +'), q2 as ('||chr(10)|| +'select count(*) num_rows from q1'||chr(10)|| +')'||chr(10)|| +'select * from q1'||chr(10)|| +' where rownum > (select num_ro'; + +a1:=a1||'ws from q2) - 10'; wwv_flow_api.create_flash_chart5_series( p_id => 4933904400593950+wwv_flow_api.g_id_offset, @@ -5371,15 +5387,23 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select res.test_run_id LINK'||chr(10)|| -' ,''ID: '' || run.id LABEL'||chr(10)|| +a1:=a1||'with q1 as ('||chr(10)|| +'select res.test_run_id LINK'||chr(10)|| +' ,''ID'' || run.id LABEL'||chr(10)|| ' ,res.errors ERR'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| ' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| ' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| -' order by run.id'; +' order by run.id'||chr(10)|| +'), q2 as ('||chr(10)|| +'select count(*) num_rows from q1'||chr(10)|| +')'||chr(10)|| +'select * from q1'||chr(10)|| +' where rownum > (select num_row'; + +a1:=a1||'s from q2) - 10'; wwv_flow_api.create_flash_chart5_series( p_id => 4934008387632959+wwv_flow_api.g_id_offset, @@ -5482,7 +5506,7 @@ wwv_flow_api.create_flash_chart5( p_chart_width =>300, p_chart_height =>200, p_chart_animation =>'N', - p_display_attr =>':H:::Y:N:Left::V:Y:Circle:::N:::Default', + p_display_attr =>':H:N::Y:N:Left::V:Y:Circle:::N:::Default', p_dial_tick_attr =>':::::::::::', p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', @@ -5547,15 +5571,23 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select res.test_run_id LINK'||chr(10)|| -' ,''ID: '' || run.id LABEL'||chr(10)|| +a1:=a1||'with q1 as ('||chr(10)|| +'select res.test_run_id LINK'||chr(10)|| +' ,''ID'' || run.id LABEL'||chr(10)|| ' ,res.executed_lines EXEC'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| ' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| ' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| -' order by run.id'; +' order by run.id'||chr(10)|| +'), q2 as ('||chr(10)|| +'select count(*) num_rows from q1'||chr(10)|| +')'||chr(10)|| +'select * from q1'||chr(10)|| +' where rownum > (select '; + +a1:=a1||'num_rows from q2) - 10'; wwv_flow_api.create_flash_chart5_series( p_id => 4934601765722219+wwv_flow_api.g_id_offset, @@ -5577,15 +5609,23 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select res.test_run_id LINK'||chr(10)|| -' ,''ID: '' || run.id LABEL'||chr(10)|| +a1:=a1||'with q1 as ('||chr(10)|| +'select res.test_run_id LINK'||chr(10)|| +' ,''ID'' || run.id LABEL'||chr(10)|| ' ,res.excluded_lines EXCL'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| ' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| ' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| -' order by run.id'; +' order by run.id'||chr(10)|| +'), q2 as ('||chr(10)|| +'select count(*) num_rows from q1'||chr(10)|| +')'||chr(10)|| +'select * from q1'||chr(10)|| +' where rownum > (select '; + +a1:=a1||'num_rows from q2) - 10'; wwv_flow_api.create_flash_chart5_series( p_id => 4934721303769138+wwv_flow_api.g_id_offset, @@ -5607,15 +5647,23 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select res.test_run_id LINK'||chr(10)|| -' ,''ID: '' || run.id LABEL'||chr(10)|| +a1:=a1||'with q1 as ('||chr(10)|| +'select res.test_run_id LINK'||chr(10)|| +' ,''ID'' || run.id LABEL'||chr(10)|| ' ,res.unknown_lines UNKN'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| ' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| ' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| -' order by run.id'; +' order by run.id'||chr(10)|| +'), q2 as ('||chr(10)|| +'select count(*) num_rows from q1'||chr(10)|| +')'||chr(10)|| +'select * from q1'||chr(10)|| +' where rownum > (select num'; + +a1:=a1||'_rows from q2) - 10'; wwv_flow_api.create_flash_chart5_series( p_id => 4934527525722219+wwv_flow_api.g_id_offset, @@ -5637,15 +5685,23 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select res.test_run_id LINK'||chr(10)|| -' ,''ID: '' || run.id LABEL'||chr(10)|| +a1:=a1||'with q1 as ('||chr(10)|| +'select res.test_run_id LINK'||chr(10)|| +' ,''ID'' || run.id LABEL'||chr(10)|| ' ,res.notexec_lines NOTX'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| ' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| ' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| -' order by run.id'; +' order by run.id'||chr(10)|| +'), q2 as ('||chr(10)|| +'select count(*) num_rows from q1'||chr(10)|| +')'||chr(10)|| +'select * from q1'||chr(10)|| +' where rownum > (select num'; + +a1:=a1||'_rows from q2) - 10'; wwv_flow_api.create_flash_chart5_series( p_id => 4934406303722219+wwv_flow_api.g_id_offset, @@ -5812,22 +5868,7 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'with q_top_failures as ('||chr(10)|| -'select tc.test_run_id'||chr(10)|| -' ,run.runner_owner || ''.'' ||'||chr(10)|| -' run.runner_name || '':'' ||'||chr(10)|| -' tc.testcase TESTCASE'||chr(10)|| -' ,tc.failures'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_testcase_stats tc'||chr(10)|| -' on tc.test_run_id = run.id'||chr(10)|| -' where run.id = :P3_TEST_RUN_ID'||chr(10)|| -' and tc.failures > 0'||chr(10)|| -' order by failures desc, TESTCASE'||chr(10)|| -')'||chr(10)|| -'select ''f?p='' || :APP_ID '; - -a1:=a1||' ||'||chr(10)|| +a1:=a1||'select ''f?p='' || :APP_ID ||'||chr(10)|| ' '':'' || ''6'' || -- Page'||chr(10)|| ' '':'' || :APP_SESSION ||'||chr(10)|| ' '':'' || :REQUEST ||'||chr(10)|| @@ -5835,15 +5876,24 @@ a1:=a1||' ||'||chr(10)|| ' '':'' || ''N'' || -- CLear Cache'||chr(10)|| ' '':'' || ''P6_TEST_RUN_ID'' || '','' ||'||chr(10)|| ' ''P6_TESTCASE_NAME'' || -- Item Names'||chr(10)|| -' '':'' || test_run_id ||'; +' '; -a1:=a1||' '','' ||'||chr(10)|| -' testcase || -- Item Values'||chr(10)|| -' '':'' || V(''PRINTER_FRIENDLY'')'||chr(10)|| -' LINK'||chr(10)|| -' ,testcase LABEL'||chr(10)|| -' ,failures VALUE'||chr(10)|| -' from q_top_failures'; +a1:=a1||' '':'' || tc.test_run_id || '','' ||'||chr(10)|| +' tc.testcase || -- Item Values'||chr(10)|| +' '':'' || V(''PRINTER_FRIENDLY'') LINK'||chr(10)|| +' ,run.runner_owner || ''.'' ||'||chr(10)|| +' run.runner_name || '':'' ||'||chr(10)|| +' tc.testcase LABEL'||chr(10)|| +' ,tc.failures VALUE'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_testcase_stats tc'||chr(10)|| +' on tc.test_run_'; + +a1:=a1||'id = run.id'||chr(10)|| +' where run.id = :P3_TEST_RUN_ID'||chr(10)|| +' and tc.failures > 0'||chr(10)|| +' order by failures desc, tc.testcase'||chr(10)|| +''; wwv_flow_api.create_flash_chart5_series( p_id => 4936205597831214+wwv_flow_api.g_id_offset, @@ -5856,7 +5906,7 @@ wwv_flow_api.create_flash_chart5_series( p_series_query_type =>'SQL_QUERY', p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>15, + p_series_query_row_count_max=>10, p_action_link =>'', p_show_action_link =>'N', p_action_link_checksum_type =>''); @@ -5945,7 +5995,7 @@ wwv_flow_api.create_flash_chart5( p_chart_width =>300, p_chart_height =>200, p_chart_animation =>'N', - p_display_attr =>':H:::Y:N:N::V:Y:None:::N:::Default', + p_display_attr =>':H:N::Y:N:N::V:Y:None:::N:::Default', p_dial_tick_attr =>':::::::::::', p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', @@ -6010,8 +6060,9 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select res.test_run_id LINK'||chr(10)|| -' ,''ID: '' || run.id LABEL'||chr(10)|| +a1:=a1||'with q1 as ('||chr(10)|| +'select res.test_run_id LINK'||chr(10)|| +' ,''ID'' || run.id LABEL'||chr(10)|| ' ,extract(day from (run.end_dtm - run.start_dtm)*86400*100)/100'||chr(10)|| ' SECONDS'||chr(10)|| ' from wt_test_runs run'||chr(10)|| @@ -6019,7 +6070,14 @@ a1:=a1||'select res.test_run_id LINK'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| ' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| ' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| -' order by id'; +' order by id'||chr(10)|| +'), q2 as ('||chr(10)|| +'select count(*'; + +a1:=a1||') num_rows from q1'||chr(10)|| +')'||chr(10)|| +'select * from q1'||chr(10)|| +' where rownum > (select num_rows from q2) - 10'; wwv_flow_api.create_flash_chart5_series( p_id => 4946720535544262+wwv_flow_api.g_id_offset, @@ -6121,7 +6179,7 @@ wwv_flow_api.create_flash_chart5( p_chart_width =>300, p_chart_height =>200, p_chart_animation =>'N', - p_display_attr =>':H:::Y:N:N::V:Y:None:::N:::Default', + p_display_attr =>':H:N::Y:N:N::V:Y:None:::N:::Default', p_dial_tick_attr =>':::::::::::', p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', @@ -6151,7 +6209,7 @@ wwv_flow_api.create_flash_chart5( p_x_axis_major_interval =>null, p_x_axis_minor_interval =>null, p_y_axis_title =>'MicroSeconds', - p_y_axis_min =>null, + p_y_axis_min =>0, p_y_axis_max =>null, p_y_axis_decimal_place =>null, p_y_axis_prefix =>'', @@ -6186,15 +6244,23 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select res.test_run_id LINK'||chr(10)|| -' ,''ID: '' || run.id LABEL'||chr(10)|| +a1:=a1||'with q1 as ('||chr(10)|| +'select res.test_run_id LINK'||chr(10)|| +' ,''ID'' || run.id LABEL'||chr(10)|| ' ,res.max_executed_usecs VALUE'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| ' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| ' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| -' order by id'; +' order by id'||chr(10)|| +'), q2 as ('||chr(10)|| +'select count(*) num_rows from q1'||chr(10)|| +')'||chr(10)|| +'select * from q1'||chr(10)|| +' where rownum >'; + +a1:=a1||' (select num_rows from q2) - 10'; wwv_flow_api.create_flash_chart5_series( p_id => 4948500124035997+wwv_flow_api.g_id_offset, @@ -6296,7 +6362,7 @@ wwv_flow_api.create_flash_chart5( p_chart_width =>300, p_chart_height =>200, p_chart_animation =>'N', - p_display_attr =>':H:::Y:N:N::V:Y:None:::N:::Default', + p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', p_dial_tick_attr =>':::::::::::', p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', @@ -6326,7 +6392,7 @@ wwv_flow_api.create_flash_chart5( p_x_axis_major_interval =>null, p_x_axis_minor_interval =>null, p_y_axis_title =>'MilliSeconds', - p_y_axis_min =>null, + p_y_axis_min =>0, p_y_axis_max =>null, p_y_axis_decimal_place =>null, p_y_axis_prefix =>'', @@ -6361,19 +6427,25 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'with q_top_duration as ('||chr(10)|| -'select testcase'||chr(10)|| -' ,tot_interval_msecs'||chr(10)|| +a1:=a1||'select ''f?p='' || :APP_ID ||'||chr(10)|| +' '':'' || ''6'' || -- Page'||chr(10)|| +' '':'' || :APP_SESSION ||'||chr(10)|| +' '':'' || :REQUEST ||'||chr(10)|| +' '':'' || :DEBUG ||'||chr(10)|| +' '':'' || ''N'' || -- CLear Cache'||chr(10)|| +' '':'' || ''P6_TEST_RUN_ID'' || '','' ||'||chr(10)|| +' ''P6_TESTCASE_NAME'' || -- Item Names'||chr(10)|| +' '; + +a1:=a1||' '':'' || test_run_id || '','' ||'||chr(10)|| +' testcase || -- Item Values'||chr(10)|| +' '':'' || V(''PRINTER_FRIENDLY'') LINK'||chr(10)|| +' ,testcase LABEL'||chr(10)|| +' ,tot_interval_msecs VALUE'||chr(10)|| ' from wt_testcase_stats'||chr(10)|| ' where test_run_id = :P3_TEST_RUN_ID'||chr(10)|| ' order by tot_interval_msecs desc'||chr(10)|| -')'||chr(10)|| -'--select * from q_max_start;'||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,testcase LABEL'||chr(10)|| -' ,tot_interval_msecs VALUE'||chr(10)|| -' from q_top_duration'||chr(10)|| -' where rownum <= 10'; +''; wwv_flow_api.create_flash_chart5_series( p_id => 4948907337180074+wwv_flow_api.g_id_offset, @@ -6386,7 +6458,7 @@ wwv_flow_api.create_flash_chart5_series( p_series_query_type =>'SQL_QUERY', p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>15, + p_series_query_row_count_max=>10, p_action_link =>'', p_show_action_link =>'N', p_action_link_checksum_type =>''); @@ -10017,7 +10089,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180719205232' + ,p_last_upd_yyyymmddhh24miss => '20180728211729' ); null; @@ -10996,7 +11068,7 @@ wwv_flow_api.create_flash_chart5( p_chart_width =>300, p_chart_height =>200, p_chart_animation =>'N', - p_display_attr =>':H::V:Y:N:Left::V:Y:Circle:::N:::Default', + p_display_attr =>':H:N::Y:N:Left::V:Y:Circle:::N:::Default', p_dial_tick_attr =>':::::::::::', p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', @@ -11026,7 +11098,7 @@ wwv_flow_api.create_flash_chart5( p_x_axis_major_interval =>null, p_x_axis_minor_interval =>null, p_y_axis_title =>'', - p_y_axis_min =>null, + p_y_axis_min =>0, p_y_axis_max =>null, p_y_axis_decimal_place =>null, p_y_axis_prefix =>'', @@ -11061,32 +11133,36 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select ''f?p='' || :APP_ID ||'||chr(10)|| +a1:=a1||'with q1 as ('||chr(10)|| +'select ''f?p='' || :APP_ID ||'||chr(10)|| ' '':'' || ''6'' || -- Page'||chr(10)|| ' '':'' || :APP_SESSION ||'||chr(10)|| ' '':'' || :REQUEST ||'||chr(10)|| ' '':'' || :DEBUG ||'||chr(10)|| ' '':'' || ''N'' || -- CLear Cache'||chr(10)|| ' '':'' || ''P6_TEST_RUN_ID'' || '','' ||'||chr(10)|| -' ''P6_TESTCASE_NAME'' || -- Item Names'||chr(10)|| -' '; +' ''P6_TESTCASE_NAME'' || -- Item N'; -a1:=a1||' '':'' || res.test_run_id || '','' ||'||chr(10)|| +a1:=a1||'ames'||chr(10)|| +' '':'' || res.test_run_id || '','' ||'||chr(10)|| ' res.testcase || -- Item Values'||chr(10)|| -' '':'' || V(''PRINTER_FRIENDLY'')'||chr(10)|| -' LINK'||chr(10)|| -' ,''ID: '' || run.id ||'||chr(10)|| -' '' - '' || testcase LABEL'||chr(10)|| -' ,res.passes PASS'||chr(10)|| +' '':'' || V(''PRINTER_FRIENDLY'') LINK'||chr(10)|| +' ,''ID'' || run.id LABEL'||chr(10)|| +' ,res.passes PASS'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_testcase_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| -' and res.testcase = '; +' and res.testcase = :P6_TESTCAS'; -a1:=a1||':P6_TESTCASE_NAME'||chr(10)|| +a1:=a1||'E_NAME'||chr(10)|| ' where run.runner_owner = :P6_RUNNER_OWNER'||chr(10)|| ' and run.runner_name = :P6_RUNNER_NAME'||chr(10)|| -' order by run.id'; +' order by run.id'||chr(10)|| +'), q2 as ('||chr(10)|| +'select count(*) num_rows from q1'||chr(10)|| +')'||chr(10)|| +'select * from q1'||chr(10)|| +' where rownum > (select num_rows from q2) - 10'; wwv_flow_api.create_flash_chart5_series( p_id => 4988016280323183+wwv_flow_api.g_id_offset, @@ -11108,32 +11184,36 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select ''f?p='' || :APP_ID ||'||chr(10)|| +a1:=a1||'with q1 as ('||chr(10)|| +'select ''f?p='' || :APP_ID ||'||chr(10)|| ' '':'' || ''6'' || -- Page'||chr(10)|| ' '':'' || :APP_SESSION ||'||chr(10)|| ' '':'' || :REQUEST ||'||chr(10)|| ' '':'' || :DEBUG ||'||chr(10)|| ' '':'' || ''N'' || -- CLear Cache'||chr(10)|| ' '':'' || ''P6_TEST_RUN_ID'' || '','' ||'||chr(10)|| -' ''P6_TESTCASE_NAME'' || -- Item Names'||chr(10)|| -' '; +' ''P6_TESTCASE_NAME'' || -- Item N'; -a1:=a1||' '':'' || res.test_run_id || '','' ||'||chr(10)|| +a1:=a1||'ames'||chr(10)|| +' '':'' || res.test_run_id || '','' ||'||chr(10)|| ' res.testcase || -- Item Values'||chr(10)|| -' '':'' || V(''PRINTER_FRIENDLY'')'||chr(10)|| -' LINK'||chr(10)|| -' ,''ID: '' || run.id ||'||chr(10)|| -' '' - '' || testcase LABEL'||chr(10)|| -' ,res.failures FAIL'||chr(10)|| +' '':'' || V(''PRINTER_FRIENDLY'') LINK'||chr(10)|| +' ,''ID'' || run.id LABEL'||chr(10)|| +' ,res.failures FAIL'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_testcase_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| -' and res.testcase = '; +' and res.testcase = :P6_TESTCAS'; -a1:=a1||':P6_TESTCASE_NAME'||chr(10)|| +a1:=a1||'E_NAME'||chr(10)|| ' where run.runner_owner = :P6_RUNNER_OWNER'||chr(10)|| ' and run.runner_name = :P6_RUNNER_NAME'||chr(10)|| -' order by run.id'; +' order by run.id'||chr(10)|| +'), q2 as ('||chr(10)|| +'select count(*) num_rows from q1'||chr(10)|| +')'||chr(10)|| +'select * from q1'||chr(10)|| +' where rownum > (select num_rows from q2) - 10'; wwv_flow_api.create_flash_chart5_series( p_id => 4987805822323183+wwv_flow_api.g_id_offset, @@ -11155,32 +11235,36 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select ''f?p='' || :APP_ID ||'||chr(10)|| +a1:=a1||'with q1 as ('||chr(10)|| +'select ''f?p='' || :APP_ID ||'||chr(10)|| ' '':'' || ''6'' || -- Page'||chr(10)|| ' '':'' || :APP_SESSION ||'||chr(10)|| ' '':'' || :REQUEST ||'||chr(10)|| ' '':'' || :DEBUG ||'||chr(10)|| ' '':'' || ''N'' || -- CLear Cache'||chr(10)|| ' '':'' || ''P6_TEST_RUN_ID'' || '','' ||'||chr(10)|| -' ''P6_TESTCASE_NAME'' || -- Item Names'||chr(10)|| -' '; +' ''P6_TESTCASE_NAME'' || -- Item N'; -a1:=a1||' '':'' || res.test_run_id || '','' ||'||chr(10)|| +a1:=a1||'ames'||chr(10)|| +' '':'' || res.test_run_id || '','' ||'||chr(10)|| ' res.testcase || -- Item Values'||chr(10)|| -' '':'' || V(''PRINTER_FRIENDLY'')'||chr(10)|| -' LINK'||chr(10)|| -' ,''ID: '' || run.id ||'||chr(10)|| -' '' - '' || testcase LABEL'||chr(10)|| -' ,res.errors ERR'||chr(10)|| +' '':'' || V(''PRINTER_FRIENDLY'') LINK'||chr(10)|| +' ,''ID'' || run.id LABEL'||chr(10)|| +' ,res.errors ERR'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_testcase_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| -' and res.testcase = :'; +' and res.testcase = :P6_TESTCASE'; -a1:=a1||'P6_TESTCASE_NAME'||chr(10)|| +a1:=a1||'_NAME'||chr(10)|| ' where run.runner_owner = :P6_RUNNER_OWNER'||chr(10)|| ' and run.runner_name = :P6_RUNNER_NAME'||chr(10)|| -' order by run.id'; +' order by run.id'||chr(10)|| +'), q2 as ('||chr(10)|| +'select count(*) num_rows from q1'||chr(10)|| +')'||chr(10)|| +'select * from q1'||chr(10)|| +' where rownum > (select num_rows from q2) - 10'; wwv_flow_api.create_flash_chart5_series( p_id => 4987900146323183+wwv_flow_api.g_id_offset, @@ -11312,7 +11396,7 @@ wwv_flow_api.create_flash_chart5( p_x_axis_major_interval =>null, p_x_axis_minor_interval =>null, p_y_axis_title =>'Milliseconds', - p_y_axis_min =>null, + p_y_axis_min =>0, p_y_axis_max =>null, p_y_axis_decimal_place =>null, p_y_axis_prefix =>'', @@ -11347,32 +11431,37 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select ''f?p='' || :APP_ID ||'||chr(10)|| +a1:=a1||'with q1 as ('||chr(10)|| +'select ''f?p='' || :APP_ID ||'||chr(10)|| ' '':'' || ''6'' || -- Page'||chr(10)|| ' '':'' || :APP_SESSION ||'||chr(10)|| ' '':'' || :REQUEST ||'||chr(10)|| ' '':'' || :DEBUG ||'||chr(10)|| ' '':'' || ''N'' || -- CLear Cache'||chr(10)|| ' '':'' || ''P6_TEST_RUN_ID'' || '','' ||'||chr(10)|| -' ''P6_TESTCASE_NAME'' || -- Item Names'||chr(10)|| -' '; +' ''P6_TESTCASE_NAME'' || -- Item N'; -a1:=a1||' '':'' || run.id || '','' ||'||chr(10)|| +a1:=a1||'ames'||chr(10)|| +' '':'' || run.id || '','' ||'||chr(10)|| ' res.testcase || -- Item Values'||chr(10)|| -' '':'' || V(''PRINTER_FRIENDLY'')'||chr(10)|| -' LINK'||chr(10)|| -' ,''ID: '' || run.id ||'||chr(10)|| -' '' - '' || res.testcase LABEL'||chr(10)|| -' ,res.tot_interval_msecs MILLISECONDS'||chr(10)|| +' '':'' || V(''PRINTER_FRIENDLY'') LINK'||chr(10)|| +' ,''ID'' || run.id ||'||chr(10)|| +' '': '' || res.testcase LABEL'||chr(10)|| +' ,res.tot_interval_msecs MILLISECONDS'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_testcase_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| -' an'; +' '; -a1:=a1||'d res.testcase = :P6_TESTCASE_NAME'||chr(10)|| +a1:=a1||' and res.testcase = :P6_TESTCASE_NAME'||chr(10)|| ' where run.runner_owner = :P6_RUNNER_OWNER'||chr(10)|| ' and run.runner_name = :P6_RUNNER_NAME'||chr(10)|| -' order by id'; +' order by id'||chr(10)|| +'), q2 as ('||chr(10)|| +'select count(*) num_rows from q1'||chr(10)|| +')'||chr(10)|| +'select * from q1'||chr(10)|| +' where rownum > (select num_rows from q2) - 10'; wwv_flow_api.create_flash_chart5_series( p_id => 4988419037323184+wwv_flow_api.g_id_offset, From 298162a820d9dec93b2f67286e0c0e7861eaff1b Mon Sep 17 00:00:00 2001 From: DDieterich Date: Mon, 6 Aug 2018 08:35:32 -0500 Subject: [PATCH 017/141] Final updates. 1 test not working --- src/core/wt_profiler.pkb | 4 - src/core/wt_test_runs.tab | 18 +- src/core/wt_version.tab | 1 + src/core/wtplsql.pkb | 115 +++---- src/core/wtplsql.pks | 5 + src/gui/f700.sql | 621 +++++++++++++------------------------- 6 files changed, 280 insertions(+), 484 deletions(-) diff --git a/src/core/wt_profiler.pkb b/src/core/wt_profiler.pkb index 977dc92..82caf87 100644 --- a/src/core/wt_profiler.pkb +++ b/src/core/wt_profiler.pkb @@ -1365,7 +1365,6 @@ begin ----------------%WTPLSQL_end_ignore_lines%---------------- end if; -- This starts the PROFILER Running!!! - --dbms_output.put_line('DEBUG1. g_rec.prof_runid = ' || g_rec.prof_runid); l_retnum := dbms_profiler.START_PROFILER(run_number => g_rec.prof_runid); if l_retnum <> 0 then ------%WTPLSQL_begin_ignore_lines%------ Can't test this @@ -1375,7 +1374,6 @@ begin end if; -- Everything is OK, set the Profiler Run ID out_profiler_runid := g_rec.prof_runid; - --dbms_output.put_line('DEBUG2. g_rec.prof_runid = ' || g_rec.prof_runid); end initialize; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ @@ -1586,11 +1584,9 @@ begin $END begin -- DBMS_PROFILER.FLUSH_DATA is included with DBMS_PROFILER.STOP_PROFILER - --dbms_output.put_line('DEBUG3. g_rec.prof_runid = ' || g_rec.prof_runid); dbms_profiler.STOP_PROFILER; exception when others then g_rec := l_rec_NULL; - --dbms_output.put_line('DEBUG4. SQLERRM = ' || sqlerrm); raise; end; insert_dbout_profile; diff --git a/src/core/wt_test_runs.tab b/src/core/wt_test_runs.tab index f9e5e25..863c2b8 100644 --- a/src/core/wt_test_runs.tab +++ b/src/core/wt_test_runs.tab @@ -11,8 +11,9 @@ grant select on wt_test_runs_seq to public; create table wt_test_runs (id number(38) constraint wt_test_runs_nn1 not null ,start_dtm timestamp constraint wt_test_runs_nn2 not null + ,runner_owner varchar2(128) constraint wt_test_runs_nn3 not null ,runner_name varchar2(128) constraint wt_test_runs_nn3 not null - ,runner_owner varchar2(128) constraint wt_test_runs_nn4 not null + ,is_last_run varchar2(1) ,dbout_owner varchar2(128) ,dbout_name varchar2(128) ,dbout_type varchar2(20) @@ -21,25 +22,30 @@ create table wt_test_runs ,end_dtm timestamp ,error_message varchar2(4000) ,constraint wt_test_runs_pk primary key (id) - ,constraint wt_test_runs_nk1 unique (runner_name, runner_owner, start_dtm) + ,constraint wt_test_runs_nk1 unique (runner_owner, runner_name, start_dtm) ,constraint wt_test_runs_fk1 foreign key (profiler_runid) references plsql_profiler_runs (runid) disable + ,constraint wt_test_runs_ck1 check (is_last_run = 'Y') ) pctfree 0; create index wt_test_runs_ix1 - on wt_test_runs(start_dtm, dbout_name); + on wt_test_runs(is_last_run, runner_owner, runner_name); + +create index wt_test_runs_ix2 + on wt_test_runs(dbout_owner, dbout_name, runner_name); comment on table wt_test_runs is 'Test Run data for each execution of the WTPLSQL_RUN procedure.'; comment on column wt_test_runs.id is 'Primary (Surrogate) Key for each Test Run'; -comment on column wt_test_runs.start_dtm is 'Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 1'; -comment on column wt_test_runs.runner_name is 'Name of the package with the WTPLSQL_RUN procedure. Natural Key 1 part 2'; +comment on column wt_test_runs.start_dtm is 'Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 3'; comment on column wt_test_runs.runner_owner is 'Owner of the package with the WTPLSQL_RUN procedure. Natural Key 2 part 3'; -comment on column wt_test_runs.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; +comment on column wt_test_runs.runner_name is 'Name of the package with the WTPLSQL_RUN procedure. Natural Key 1 part 1'; +comment on column wt_test_runs.is_last_run is 'Flag "Y" to indicate this is the most recent run for this package owner/name'; comment on column wt_test_runs.dbout_owner is 'Optional Owner of the Database Object Under Test (DBOUT).'; comment on column wt_test_runs.dbout_name is 'Optional Name of the Database Object Under Test (DBOUT).'; comment on column wt_test_runs.dbout_type is 'Optional Type of the Database Object Under Test (DBOUT).'; comment on column wt_test_runs.trigger_offset is 'Optional calculated offset from start of Trigger Source to start of Trigger PL/SQL Block.'; comment on column wt_test_runs.profiler_runid is 'Optional DBMS_PROFILER unique run identifier from plsql_profiler_runnumber sequence'; +comment on column wt_test_runs.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; comment on column wt_test_runs.error_message is 'Optional Last error messages from this Test Run.'; grant select on wt_test_runs to public; diff --git a/src/core/wt_version.tab b/src/core/wt_version.tab index e4820bb..52abe53 100644 --- a/src/core/wt_version.tab +++ b/src/core/wt_version.tab @@ -7,6 +7,7 @@ create table wt_version (install_dtm date ,action varchar2(15) ,text varchar2(15) + ,constraint wt_version_pk primary key (install_dtm) ) pctfree 0; comment on table wt_version is 'Records the installed and upgraded versions.'; diff --git a/src/core/wtplsql.pkb b/src/core/wtplsql.pkb index ac54675..9994490 100644 --- a/src/core/wtplsql.pkb +++ b/src/core/wtplsql.pkb @@ -64,7 +64,7 @@ $THEN end l_test_sqlerrm; begin -------------------------------------- WTPLSQL Testing -- - -- This Test Case runs in the EXECUTE IMMEDAITE in the TEST_RUN + -- This Test Case runs in the EXECUTE IMMEDIATE in the TEST_RUN -- procedure in this package. wt_assert.g_testcase := 'CHECK_RUNNER Sad Path 1'; begin @@ -102,14 +102,14 @@ begin return; end if; g_test_runs_rec.end_dtm := systimestamp; + update wt_test_runs + set is_last_run = NULL + where runner_owner = g_test_runs_rec.runner_owner + and runner_name = g_test_runs_rec.runner_name + and is_last_run = IS_LAST_RUN_FLAG; insert into wt_test_runs values g_test_runs_rec; g_test_runs_rec := l_wt_test_runs_recNULL; COMMIT; -exception - when OTHERS - then - DBMS_OUTPUT.PUT_LINE(dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace); end insert_test_run; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ @@ -143,64 +143,6 @@ $THEN check_query_in => 'select count(*) from wt_test_runs' || ' where id = ' || l_test_runs_rec.id, against_value_in => 0); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'INSERT_TEST_RUN Sad Path 1'; - -- Save/Clear the DBMS_OUPTUT Buffer - loop - DBMS_OUTPUT.GET_LINE ( - line => l_dbmsout_line, - status => l_dbmsout_stat); - exit when l_dbmsout_stat != 0; - l_dbmsout_buff(l_dbmsout_buff.COUNT) := l_dbmsout_line; - l_dbmsout_buff.extend; - end loop; - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnotnull ( - msg_in => 'l_dbmsout_buff.COUNT - 1', - check_this_in => l_dbmsout_buff.COUNT - 1); - -------------------------------------- WTPLSQL Testing -- - select count(*) into l_num_recs from wt_test_runs; - l_test_runs_rec := g_test_runs_rec; - g_test_runs_rec.start_dtm := null; - insert_test_run; - g_test_runs_rec := l_test_runs_rec; - wt_assert.eqqueryvalue ( - msg_in => 'Number of Records should stay the same', - check_query_in => 'select count(*) from wt_test_runs', - against_value_in => l_num_recs); - -------------------------------------- WTPLSQL Testing -- - DBMS_OUTPUT.GET_LINE ( - line => l_dbmsout_line, - status => l_dbmsout_stat); - wt_assert.eq ( - msg_in => 'DBMS_OUTPUT Status', - check_this_in => l_dbmsout_stat, - against_this_in => 0); - -------------------------------------- WTPLSQL Testing -- - if wt_assert.last_pass - then - wt_assert.isnotnull ( - msg_in => 'DBMS_OUTPUT Line', - check_this_in => l_dbmsout_line); - wt_assert.this ( - msg_in => 'Confirm DBMS_OUTPUT Line text', - check_this_in => (l_dbmsout_line like 'ORA-01400: cannot insert NULL into ("WTP"."WT_TEST_RUNS"."START_DTM")%')); - -------------------------------------- WTPLSQL Testing -- - if not wt_assert.last_pass - then - -- No match, put the line back into DBMS_OUTPUT buffer and end this. - DBMS_OUTPUT.PUT_LINE(l_dbmsout_line); - end if; - end if; - -------------------------------------- WTPLSQL Testing -- - -- Restore the DBMS_OUPTUT Buffer - for i in 1 .. l_dbmsout_buff.COUNT - 1 - loop - DBMS_OUTPUT.PUT_LINE(l_dbmsout_buff(i)); - end loop; - wt_assert.isnotnull ( - msg_in => 'l_dbmsout_buff.COUNT - 1', - check_this_in => l_dbmsout_buff.COUNT - 1); end t_insert_test_run; $END ----------------%WTPLSQL_end_ignore_lines%---------------- @@ -210,6 +152,14 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- --------------------- +------------------------------------------------------------ +function get_last_run_flag + return varchar2 +is +begin + return IS_LAST_RUN_FLAG; +end get_last_run_flag; + ------------------------------------------------------------ function show_version return varchar2 @@ -241,6 +191,7 @@ $THEN -------------------------------------- WTPLSQL Testing -- insert into wt_version (install_dtm, action, text) values (to_date('31-DEC-4000','DD-MON-YYYY'), 'TESTING', 'TESTING'); + rollback; wt_assert.eq ( msg_in => 'Test New Version', check_this_in => show_version, @@ -280,7 +231,6 @@ begin test_all_aa(in_package_name) := 'X'; return; end if; - --DBMS_OUTPUT.PUT_LINE('DEBUG WTPLSQL selftest Enabled for Test Runner "' || in_package_name || '"'); $END ----------------%WTPLSQL_end_ignore_lines%---------------- -- Reset the Test Runs Record before checking anything g_test_runs_rec := l_test_runs_rec_NULL; @@ -290,6 +240,7 @@ begin --g_test_runs_rec.runner_owner := sys_context('userenv', 'current_schema'); select username into g_test_runs_rec.runner_owner from user_users; g_test_runs_rec.runner_name := in_package_name; + g_test_runs_rec.is_last_run := IS_LAST_RUN_FLAG; g_test_runs_rec.error_message := ''; check_runner; -- Initialize @@ -336,11 +287,9 @@ exception DBMS_OUTPUT.PUT_LINE(g_test_runs_rec.error_message); else concat_err_message; - insert_test_run; -- Autonomous Transaction COMMIT + raise_application_error(-20000, + substr(g_test_runs_rec.error_message,1,2048)); end if; - wt_profiler.finalize; -- Autonomous Transaction COMMIT - wt_result.finalize; -- Autonomous Transaction COMMIT - wt_test_run_stat.finalize; -- Autonomous Transaction COMMIT end test_run; @@ -404,13 +353,39 @@ procedure delete_runs (in_test_run_id in number) is PRAGMA AUTONOMOUS_TRANSACTION; + r_owner varchar2(200); + r_name varchar2(200); begin -- Profiler delete must be first because it contains a -- PRAGMA AUTONOMOUS_TRANSACTION wt_test_run_stat.delete_records(in_test_run_id); wt_profiler.delete_records(in_test_run_id); wt_result.delete_records(in_test_run_id); - delete from wt_test_runs where id = in_test_run_id; + begin + -- + select runner_owner, runner_name + into r_owner, r_name + from wt_test_runs + where id = in_test_run_id; + -- + delete from wt_test_runs + where id = in_test_run_id; + -- + update wt_test_runs + set is_last_run = IS_LAST_RUN_FLAG + where runner_owner = r_owner + and runner_name = r_name + and start_dtm = ( + select max(trn.start_dtm) + from wt_test_runs trn + where trn.runner_owner = r_owner + and trn.runner_name = r_name ) + and is_last_run != IS_LAST_RUN_FLAG; + -- + exception when NO_DATA_FOUND + then + null; -- Ignore Error + end; COMMIT; end delete_runs; diff --git a/src/core/wtplsql.pks b/src/core/wtplsql.pks index 83e31cc..2e72683 100644 --- a/src/core/wtplsql.pks +++ b/src/core/wtplsql.pks @@ -2,6 +2,11 @@ create or replace package wtplsql authid current_user as -- AUTHID CURRENT_USER is required for dynamic PL/SQL execution. + IS_LAST_RUN_FLAG constant varchar2(1) := 'Y'; + + function get_last_run_flag + return varchar2; + function show_version return varchar2; diff --git a/src/gui/f700.sql b/src/gui/f700.sql index 3a24cba..147f0ef 100644 --- a/src/gui/f700.sql +++ b/src/gui/f700.sql @@ -13,7 +13,7 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Application Export: -- Application: 700 -- Name: wtPLSQL Core GUI --- Date and Time: 21:38 Saturday July 28, 2018 +-- Date and Time: 23:46 Wednesday August 1, 2018 -- Exported By: WTP -- Flashback: 0 -- Export Type: Application Export @@ -146,7 +146,7 @@ wwv_flow_api.create_flow( p_default_region_template=> 4840201642414912 + wwv_flow_api.g_id_offset, p_error_template=> 4837131094414910 + wwv_flow_api.g_id_offset, p_page_protection_enabled_y_n=> 'Y', - p_checksum_salt_last_reset => '20180728213827', + p_checksum_salt_last_reset => '20180801234656', p_max_session_length_sec=> 28800, p_home_link=> 'f?p=&APP_ID.:3:&SESSION.', p_flow_language=> 'en', @@ -192,7 +192,7 @@ wwv_flow_api.create_flow( p_default_listr_template => 4839116402414912 + wwv_flow_api.g_id_offset, p_default_irr_template => 4839831975414912 + wwv_flow_api.g_id_offset, p_last_updated_by => 'WTP', - p_last_upd_yyyymmddhh24miss=> '20180728213827', + p_last_upd_yyyymmddhh24miss=> '20180801234656', p_required_roles=> wwv_flow_utilities.string_to_table2('')); @@ -668,7 +668,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180728144548' + ,p_last_upd_yyyymmddhh24miss => '20180801213559' ); null; @@ -851,54 +851,33 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'with q_max_start as ('||chr(10)|| -'select runner_owner'||chr(10)|| -' ,runner_name'||chr(10)|| -' ,max(start_dtm) MAX_START_DTM'||chr(10)|| -' from wt_test_runs'||chr(10)|| -' where :P1_OWNER is NULL'||chr(10)|| -' or :P1_OWNER = runner_owner'||chr(10)|| -' group by runner_owner'||chr(10)|| -' ,runner_name'||chr(10)|| +a1:=a1||'with q_main as ('||chr(10)|| +'select sum(res.passes) PASS'||chr(10)|| +' ,sum(res.failures) FAIL'||chr(10)|| +' ,sum(res.errors) ERR'||chr(10)|| +' from wt_test_runs tr'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = tr.id'||chr(10)|| +' where ( :P1_OWNER is NULL'||chr(10)|| +' or :P1_OWNER = tr.runner_owner )'||chr(10)|| +' and tr.is_last_run = wtplsql.get_last_run_flag'||chr(10)|| '), q1 as ('||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,''PASS'' LABEL'||chr(10)|| -' ,sum(res.passes) VALUE'||chr(10)|| -' from q_max_start ms'||chr(10)|| -' join wt_test_runs run'||chr(10)|| -' on run.runner_own'; +'select NULL LINK'||chr(10)|| +' ,''PASS'' LABEL'||chr(10)|| +' ,pass '; -a1:=a1||'er = ms.runner_owner'||chr(10)|| -' and run.runner_name = ms.runner_name'||chr(10)|| -' and run.start_dtm = ms.max_start_dtm'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| +a1:=a1||' VALUE'||chr(10)|| +' from q_main'||chr(10)|| 'union all'||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,''FAIL'' LABEL'||chr(10)|| -' ,sum(res.failures) VALUE'||chr(10)|| -' from q_max_start ms'||chr(10)|| -' join wt_test_runs run'||chr(10)|| -' on run.runner_owner = ms.runne'; - -a1:=a1||'r_owner'||chr(10)|| -' and run.runner_name = ms.runner_name'||chr(10)|| -' and run.start_dtm = ms.max_start_dtm'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''FAIL'' LABEL'||chr(10)|| +' ,fail VALUE'||chr(10)|| +' from q_main'||chr(10)|| 'union all'||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,''ERR'' LABEL'||chr(10)|| -' ,sum(res.errors) VALUE'||chr(10)|| -' from q_max_start ms'||chr(10)|| -' join wt_test_runs run'||chr(10)|| -' on run.runner_owner = ms.runner_owner'||chr(10)|| -' '; - -a1:=a1||' and run.runner_name = ms.runner_name'||chr(10)|| -' and run.start_dtm = ms.max_start_dtm'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''ERR'' LABEL'||chr(10)|| +' ,err VALUE'||chr(10)|| +' from q_main'||chr(10)|| ')'||chr(10)|| 'select link, label, value'||chr(10)|| ' from q1'||chr(10)|| @@ -1069,67 +1048,39 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'with q_max_start as ('||chr(10)|| -'select runner_owner'||chr(10)|| -' ,runner_name'||chr(10)|| -' ,max(start_dtm) MAX_START_DTM'||chr(10)|| -' from wt_test_runs'||chr(10)|| -' where :P1_OWNER is NULL'||chr(10)|| -' or :P1_OWNER = runner_owner'||chr(10)|| -' group by runner_owner'||chr(10)|| -' ,runner_name'||chr(10)|| +a1:=a1||'with q_main as ('||chr(10)|| +'select sum(res.excluded_lines) EXCL'||chr(10)|| +' ,sum(res.executed_lines) EXEC'||chr(10)|| +' ,sum(res.notexec_lines) NOTX'||chr(10)|| +' ,sum(res.unknown_lines) UNKN'||chr(10)|| +' from wt_test_runs tr'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = tr.id'||chr(10)|| +' where ( :P1_OWNER is NULL'||chr(10)|| +' or :P1_OWNER = runner_owner )'||chr(10)|| +' and is_last_run = wtplsql.get_last_run_flag'||chr(10)|| '), q1 as ('||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,''EXCL'' LABEL'||chr(10)|| -' ,sum(excluded_lines) VALUE'||chr(10)|| -' from q_max_start ms'||chr(10)|| -' join wt_test_runs run'||chr(10)|| -' on ru'; +'select '; -a1:=a1||'n.runner_owner = ms.runner_owner'||chr(10)|| -' and run.runner_name = ms.runner_name'||chr(10)|| -' and run.start_dtm = ms.max_start_dtm'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| +a1:=a1||'NULL LINK'||chr(10)|| +' ,''EXCL'' LABEL'||chr(10)|| +' ,excl VALUE'||chr(10)|| +' from q_main'||chr(10)|| 'union all'||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,''EXEC'' LABEL'||chr(10)|| -' ,sum(executed_lines) VALUE'||chr(10)|| -' from q_max_start ms'||chr(10)|| -' join wt_test_runs run'||chr(10)|| -' on run.runne'; - -a1:=a1||'r_owner = ms.runner_owner'||chr(10)|| -' and run.runner_name = ms.runner_name'||chr(10)|| -' and run.start_dtm = ms.max_start_dtm'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''EXEC'' LABEL'||chr(10)|| +' ,exec VALUE'||chr(10)|| +' from q_main'||chr(10)|| 'union all'||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,''NOTX'' LABEL'||chr(10)|| -' ,sum(notexec_lines) VALUE'||chr(10)|| -' from q_max_start ms'||chr(10)|| -' join wt_test_runs run'||chr(10)|| -' on run.runner_owner = '; - -a1:=a1||'ms.runner_owner'||chr(10)|| -' and run.runner_name = ms.runner_name'||chr(10)|| -' and run.start_dtm = ms.max_start_dtm'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''NOTX'' LABEL'||chr(10)|| +' ,notx VALUE'||chr(10)|| +' from q_main'||chr(10)|| 'union all'||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,''UNKN'' LABEL'||chr(10)|| -' ,sum(unknown_lines) VALUE'||chr(10)|| -' from q_max_start ms'||chr(10)|| -' join wt_test_runs run'||chr(10)|| -' on run.runner_owner = ms.runner_'; - -a1:=a1||'owner'||chr(10)|| -' and run.runner_name = ms.runner_name'||chr(10)|| -' and run.start_dtm = ms.max_start_dtm'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''UNKN'' LABEL'||chr(10)|| +' ,unkn VALUE'||chr(10)|| +' from q_main'||chr(10)|| ')'||chr(10)|| 'select link, label, value'||chr(10)|| ' from q1'||chr(10)|| @@ -1300,40 +1251,21 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'with q_max_start as ('||chr(10)|| -'select runner_owner'||chr(10)|| -' ,runner_name'||chr(10)|| -' ,max(start_dtm) MAX_START_DTM'||chr(10)|| -' from wt_test_runs'||chr(10)|| -' where :P1_OWNER is NULL'||chr(10)|| -' or :P1_OWNER = runner_owner'||chr(10)|| -' group by runner_owner'||chr(10)|| -' ,runner_name'||chr(10)|| -'), q_top_failures as ('||chr(10)|| -'select res.test_run_id'||chr(10)|| -' ,ms.runner_owner || ''.'' ||'||chr(10)|| -' ms.runner_name RUNNER'||chr(10)|| -' ,res.failures'||chr(10)|| -' from q_max_start ms'||chr(10)|| -' join wt_tes'; - -a1:=a1||'t_runs run'||chr(10)|| -' on run.runner_owner = ms.runner_owner'||chr(10)|| -' and run.runner_name = ms.runner_name'||chr(10)|| -' and run.start_dtm = ms.max_start_dtm'||chr(10)|| +a1:=a1||'select tr.id LINK'||chr(10)|| +' ,tr.runner_owner || ''.'' ||'||chr(10)|| +' tr.runner_name LABEL'||chr(10)|| +' ,res.failures VALUE'||chr(10)|| +' from wt_test_runs tr'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' where res.failures > 0'||chr(10)|| -' order by failures desc, RUNNER'||chr(10)|| -')'||chr(10)|| -'--select * from q_max_start;'||chr(10)|| -'select test_run_id LINK'||chr(10)|| -' ,runner LABEL'||chr(10)|| -' ,failur'; - -a1:=a1||'es VALUE'||chr(10)|| -' from q_top_failures'||chr(10)|| -' where rownum <= 10'; +' on res.test_run_id = tr.id'||chr(10)|| +' and res.failures > 0'||chr(10)|| +' where ( :P1_OWNER is NULL'||chr(10)|| +' or :P1_OWNER = tr.runner_owner )'||chr(10)|| +' and tr.is_last_run = wtplsql.get_l'; + +a1:=a1||'ast_run_flag'||chr(10)|| +' order by res.failures desc, LABEL'||chr(10)|| +''; wwv_flow_api.create_flash_chart5_series( p_id => 4858000738336332+wwv_flow_api.g_id_offset, @@ -1346,7 +1278,7 @@ wwv_flow_api.create_flash_chart5_series( p_series_query_type =>'SQL_QUERY', p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>15, + p_series_query_row_count_max=>10, p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', p_show_action_link =>'C', p_action_link_checksum_type =>''); @@ -1500,41 +1432,15 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'with q_max_start as ('||chr(10)|| -'select runner_owner'||chr(10)|| -' ,runner_name'||chr(10)|| -' ,max(start_dtm) MAX_START_DTM'||chr(10)|| +a1:=a1||'select id LINK'||chr(10)|| +' ,runner_owner || ''.'' || runner_name LABEL'||chr(10)|| +' ,extract(day from (end_dtm - start_dtm)*86400*100)/100'||chr(10)|| +' VALUE'||chr(10)|| ' from wt_test_runs'||chr(10)|| -' where :P1_OWNER is NULL'||chr(10)|| -' or :P1_OWNER = runner_owner'||chr(10)|| -' group by runner_owner'||chr(10)|| -' ,runner_name'||chr(10)|| -'), q_top_duration as ('||chr(10)|| -'select run.id TEST_RUN_ID'||chr(10)|| -' ,ms.runner_owner || ''.'' ||'||chr(10)|| -' ms.runner_name RUNNER'||chr(10)|| -' ,extract(day from (run'; - -a1:=a1||'.end_dtm -'||chr(10)|| -' run.start_dtm)*86400*100)/100'||chr(10)|| -' DURATION_SECS'||chr(10)|| -' from q_max_start ms'||chr(10)|| -' join wt_test_runs run'||chr(10)|| -' on run.runner_owner = ms.runner_owner'||chr(10)|| -' and run.runner_name = ms.runner_name'||chr(10)|| -' and run.start_dtm = ms.max_start_dtm'||chr(10)|| -' where extract(day from (run.end_dtm -'||chr(10)|| -' run.start_'; - -a1:=a1||'dtm)*86400*100)/100 > 0'||chr(10)|| -' order by duration_secs desc, RUNNER'||chr(10)|| -')'||chr(10)|| -'--select * from q_max_start;'||chr(10)|| -'select test_run_id LINK'||chr(10)|| -' ,runner LABEL'||chr(10)|| -' ,duration_secs VALUE'||chr(10)|| -' from q_top_duration'||chr(10)|| -' where rownum <= 10'; +' where is_last_run = wtplsql.get_last_run_flag'||chr(10)|| +' and extract(day from (end_dtm - start_dtm)*86400*100)/100 > 0'||chr(10)|| +' order by VALUE desc, LABEL'||chr(10)|| +''; wwv_flow_api.create_flash_chart5_series( p_id => 4858612747526709+wwv_flow_api.g_id_offset, @@ -1547,7 +1453,7 @@ wwv_flow_api.create_flash_chart5_series( p_series_query_type =>'SQL_QUERY', p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>15, + p_series_query_row_count_max=>10, p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', p_show_action_link =>'C', p_action_link_checksum_type =>''); @@ -1701,40 +1607,21 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'with q_max_start as ('||chr(10)|| -'select runner_owner'||chr(10)|| -' ,runner_name'||chr(10)|| -' ,max(start_dtm) MAX_START_DTM'||chr(10)|| +a1:=a1||'select id LINK'||chr(10)|| +' ,runner_owner || ''.'' ||'||chr(10)|| +' runner_name LABEL'||chr(10)|| +' ,extract(day from (sysdate - start_dtm)*10)/10'||chr(10)|| +' VALUE'||chr(10)|| ' from wt_test_runs'||chr(10)|| -' where :P1_OWNER is NULL'||chr(10)|| -' or :P1_OWNER = runner_owner'||chr(10)|| -' group by runner_owner'||chr(10)|| -' ,runner_name'||chr(10)|| -'), q_top_duration as ('||chr(10)|| -'select run.id TEST_RUN_ID'||chr(10)|| -' ,ms.runner_owner || ''.'' ||'||chr(10)|| -' ms.runner_name RUNNER'||chr(10)|| -' ,extract(day from '; - -a1:=a1||'(sysdate - run.start_dtm)*10)/10'||chr(10)|| -' AGE_DAYS'||chr(10)|| -' from q_max_start ms'||chr(10)|| -' join wt_test_runs run'||chr(10)|| -' on run.runner_owner = ms.runner_owner'||chr(10)|| -' and run.runner_name = ms.runner_name'||chr(10)|| -' and run.start_dtm = ms.max_start_dtm'||chr(10)|| -' where run.start_dtm is not null'||chr(10)|| -' and extract(day from (sysdate - run.start_dtm)*10)/10 > 0'||chr(10)|| -' order by AGE_DA'; - -a1:=a1||'YS desc, RUNNER'||chr(10)|| -')'||chr(10)|| -'--select * from q_max_start;'||chr(10)|| -'select test_run_id LINK'||chr(10)|| -' ,runner LABEL'||chr(10)|| -' ,age_days VALUE'||chr(10)|| -' from q_top_duration'||chr(10)|| -' where rownum <= 10'; +' where ( :P1_OWNER is NULL'||chr(10)|| +' or :P1_OWNER = runner_owner )'||chr(10)|| +' and is_last_run = wtplsql.get_last_run_flag'||chr(10)|| +' and start_dtm is not null'||chr(10)|| +' and extract(day from (sysd'; + +a1:=a1||'ate - start_dtm)*10)/10 > 0'||chr(10)|| +' order by VALUE desc, LABEL'||chr(10)|| +''; wwv_flow_api.create_flash_chart5_series( p_id => 4860108666458221+wwv_flow_api.g_id_offset, @@ -1747,7 +1634,7 @@ wwv_flow_api.create_flash_chart5_series( p_series_query_type =>'SQL_QUERY', p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>15, + p_series_query_row_count_max=>10, p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', p_show_action_link =>'C', p_action_link_checksum_type =>''); @@ -1901,42 +1788,23 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'with q_max_start as ('||chr(10)|| -'select runner_owner'||chr(10)|| -' ,runner_name'||chr(10)|| -' ,max(start_dtm) MAX_START_DTM'||chr(10)|| -' from wt_test_runs'||chr(10)|| -' where :P1_OWNER is NULL'||chr(10)|| -' or :P1_OWNER = runner_owner'||chr(10)|| -' group by runner_owner'||chr(10)|| -' ,runner_name'||chr(10)|| -'), q_top_notexec as ('||chr(10)|| -'select res.test_run_id'||chr(10)|| +a1:=a1||'select run.id LINK'||chr(10)|| ' ,run.dbout_owner || ''.'' ||'||chr(10)|| ' run.dbout_name || ''('' ||'||chr(10)|| -' run.dbout_type || '')'' DBOUT'||chr(10)|| -' ,res.notexec_lines'||chr(10)|| -' from'; - -a1:=a1||' q_max_start ms'||chr(10)|| -' join wt_test_runs run'||chr(10)|| -' on run.runner_owner = ms.runner_owner'||chr(10)|| -' and run.runner_name = ms.runner_name'||chr(10)|| -' and run.start_dtm = ms.max_start_dtm'||chr(10)|| +' run.dbout_type || '')'' LABEL'||chr(10)|| +' ,res.notexec_lines VALUE'||chr(10)|| +' from wt_test_runs run'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' where run.dbout_name is not null'||chr(10)|| -' and res.notexec_lines > 0'||chr(10)|| -' order by notexec_lines desc, DBOUT'||chr(10)|| -')'||chr(10)|| -'--select * from q_max_'; - -a1:=a1||'start;'||chr(10)|| -'select test_run_id LINK'||chr(10)|| -' ,dbout LABEL'||chr(10)|| -' ,notexec_lines VALUE'||chr(10)|| -' from q_top_notexec'||chr(10)|| -' where rownum <= 10'; +' on res.test_run_id = run.id'||chr(10)|| +' and res.notexec_lines > 0'||chr(10)|| +' where ( :P1_OWNER is NULL'||chr(10)|| +' or :P1_OWNER = run.runner_owner'; + +a1:=a1||' )'||chr(10)|| +' and run.is_last_run = wtplsql.get_last_run_flag'||chr(10)|| +' and run.dbout_name is not null'||chr(10)|| +' order by res.notexec_lines desc, LABEL'||chr(10)|| +''; wwv_flow_api.create_flash_chart5_series( p_id => 4860628410584610+wwv_flow_api.g_id_offset, @@ -1949,7 +1817,7 @@ wwv_flow_api.create_flash_chart5_series( p_series_query_type =>'SQL_QUERY', p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>15, + p_series_query_row_count_max=>10, p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', p_show_action_link =>'C', p_action_link_checksum_type =>''); @@ -2103,38 +1971,7 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'with q_max_start as ('||chr(10)|| -'select runner_owner'||chr(10)|| -' ,runner_name'||chr(10)|| -' ,max(start_dtm) MAX_START_DTM'||chr(10)|| -' from wt_test_runs'||chr(10)|| -' where :P1_OWNER is NULL'||chr(10)|| -' or :P1_OWNER = runner_owner'||chr(10)|| -' group by runner_owner'||chr(10)|| -' ,runner_name'||chr(10)|| -'), q_top_failures as ('||chr(10)|| -'select run.id TEST_RUN_ID'||chr(10)|| -' ,tc.testcase'||chr(10)|| -' ,ms.runner_owner || ''.'' ||'||chr(10)|| -' ms.runner_name || '':'' ||'||chr(10)|| -' tc.testcase '; - -a1:=a1||' TESTCASE_LABEL'||chr(10)|| -' ,tc.failures'||chr(10)|| -' from q_max_start ms'||chr(10)|| -' join wt_test_runs run'||chr(10)|| -' on run.runner_owner = ms.runner_owner'||chr(10)|| -' and run.runner_name = ms.runner_name'||chr(10)|| -' and run.start_dtm = ms.max_start_dtm'||chr(10)|| -' join wt_testcase_stats tc'||chr(10)|| -' on tc.test_run_id = run.id'||chr(10)|| -' where tc.failures > 0'||chr(10)|| -' order by failures desc, TESTCASE'||chr(10)|| -')'||chr(10)|| -'--select * from q_max_'; - -a1:=a1||'start;'||chr(10)|| -'select ''f?p='' || :APP_ID ||'||chr(10)|| +a1:=a1||'select ''f?p='' || :APP_ID ||'||chr(10)|| ' '':'' || ''6'' || -- Page'||chr(10)|| ' '':'' || :APP_SESSION ||'||chr(10)|| ' '':'' || :REQUEST ||'||chr(10)|| @@ -2142,16 +1979,26 @@ a1:=a1||'start;'||chr(10)|| ' '':'' || ''N'' || -- CLear Cache'||chr(10)|| ' '':'' || ''P6_TEST_RUN_ID'' || '','' ||'||chr(10)|| ' ''P6_TESTCASE_NAME'' || -- Item Names'||chr(10)|| -' '; +' '; -a1:=a1||' '':'' || test_run_id || '','' ||'||chr(10)|| -' testcase || -- Item Values'||chr(10)|| -' '':'' || V(''PRINTER_FRIENDLY'')'||chr(10)|| -' LINK'||chr(10)|| -' ,testcase_label LABEL'||chr(10)|| -' ,failures VALUE'||chr(10)|| -' from q_top_failures'||chr(10)|| -' where rownum <= 10'; +a1:=a1||' '':'' || run.id || '','' ||'||chr(10)|| +' tc.testcase || -- Item Values'||chr(10)|| +' '':'' || V(''PRINTER_FRIENDLY'') LINK'||chr(10)|| +' ,run.runner_owner || ''.'' ||'||chr(10)|| +' run.runner_name || '':'' ||'||chr(10)|| +' tc.testcase LABEL'||chr(10)|| +' ,tc.failures VALUE'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_testcase_stats tc'||chr(10)|| +' on tc.test_run_'; + +a1:=a1||'id = run.id'||chr(10)|| +' and tc.failures > 0'||chr(10)|| +' where ( :P1_OWNER is NULL'||chr(10)|| +' or :P1_OWNER = runner_owner )'||chr(10)|| +' and is_last_run = wtplsql.get_last_run_flag'||chr(10)|| +' order by failures desc, TESTCASE'||chr(10)|| +''; wwv_flow_api.create_flash_chart5_series( p_id => 4861511054133729+wwv_flow_api.g_id_offset, @@ -2164,7 +2011,7 @@ wwv_flow_api.create_flash_chart5_series( p_series_query_type =>'SQL_QUERY', p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>15, + p_series_query_row_count_max=>10, p_action_link =>'', p_show_action_link =>'N', p_action_link_checksum_type =>''); @@ -2318,41 +2165,22 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'with q_max_start as ('||chr(10)|| -'select runner_owner'||chr(10)|| -' ,runner_name'||chr(10)|| -' ,max(start_dtm) MAX_START_DTM'||chr(10)|| -' from wt_test_runs'||chr(10)|| -' where :P1_OWNER is NULL'||chr(10)|| -' or :P1_OWNER = runner_owner'||chr(10)|| -' group by runner_owner'||chr(10)|| -' ,runner_name'||chr(10)|| -'), q_top_duration as ('||chr(10)|| -'select res.test_run_id'||chr(10)|| +a1:=a1||'select res.test_run_id LINK'||chr(10)|| ' ,run.dbout_owner || ''.'' ||'||chr(10)|| ' run.dbout_name || ''('' ||'||chr(10)|| -' run.dbout_type || '')'' DBOUT'||chr(10)|| -' ,res.max_executed_u'; - -a1:=a1||'secs/1000 MAX_MSECS'||chr(10)|| -' from q_max_start ms'||chr(10)|| -' join wt_test_runs run'||chr(10)|| -' on run.runner_owner = ms.runner_owner'||chr(10)|| -' and run.runner_name = ms.runner_name'||chr(10)|| -' and run.start_dtm = ms.max_start_dtm'||chr(10)|| +' run.dbout_type || '')'' LABEL'||chr(10)|| +' ,res.max_executed_usecs/1000 VALUE'||chr(10)|| +' from wt_test_runs run'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' where res.max_executed_usecs > 0'||chr(10)|| -' order by MAX_MSECS desc, DBOUT'||chr(10)|| -')'||chr(10)|| -'--select * from q_max_st'; - -a1:=a1||'art;'||chr(10)|| -'select test_run_id LINK'||chr(10)|| -' ,dbout LABEL'||chr(10)|| -' ,max_msecs VALUE'||chr(10)|| -' from q_top_duration'||chr(10)|| -' where rownum <= 10'; +' on res.test_run_id = run.id'||chr(10)|| +' and res.max_executed_usecs > 0'||chr(10)|| +' where ( :P1_OWNER is NULL'||chr(10)|| +' or :P1_OW'; + +a1:=a1||'NER = run.runner_owner )'||chr(10)|| +' and run.is_last_run = wtplsql.get_last_run_flag'||chr(10)|| +' order by VALUE desc, LABEL'||chr(10)|| +''; wwv_flow_api.create_flash_chart5_series( p_id => 4861925325144344+wwv_flow_api.g_id_offset, @@ -2365,7 +2193,7 @@ wwv_flow_api.create_flash_chart5_series( p_series_query_type =>'SQL_QUERY', p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>15, + p_series_query_row_count_max=>10, p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', p_show_action_link =>'C', p_action_link_checksum_type =>''); @@ -2657,32 +2485,19 @@ declare l_clob clob; l_length number := 1; begin -s:=s||'with q_max_start as ('||chr(10)|| -'select runner_owner'||chr(10)|| -' ,runner_name'||chr(10)|| -' ,max(start_dtm) MAX_START_DTM'||chr(10)|| +s:=s||'select id'||chr(10)|| +' ,runner_owner || ''.'' ||'||chr(10)|| +' runner_name TEST_RUNNER'||chr(10)|| +' ,dbout_owner || ''.'' ||'||chr(10)|| +' dbout_name || ''('' ||'||chr(10)|| +' dbout_type || '')'' DBOUT_PROFILED'||chr(10)|| +' ,start_dtm'||chr(10)|| +' ,error_message'||chr(10)|| ' from wt_test_runs'||chr(10)|| -' where :P1_OWNER is NULL'||chr(10)|| -' or :P1_OWNER = runner_owner'||chr(10)|| -' group by runner_owner'||chr(10)|| -' ,runner_name'||chr(10)|| -')'||chr(10)|| -'select run.id'||chr(10)|| -' ,q1.runner_owner || ''.'' ||'||chr(10)|| -' q1.runner_name TEST_RUNNER'||chr(10)|| -' ,run.dbout_owner || ''.'' ||'||chr(10)|| -' run.dbout_name || ''('' ||'||chr(10)|| -' run.dbout_type || '; - -s:=s||''')'' DBOUT_PROFILED'||chr(10)|| -' ,run.start_dtm'||chr(10)|| -' ,run.error_message'||chr(10)|| -' from q_max_start q1'||chr(10)|| -' join wt_test_runs run'||chr(10)|| -' on run.runner_owner = q1.runner_owner'||chr(10)|| -' and run.runner_name = q1.runner_name'||chr(10)|| -' and run.start_dtm = q1.max_start_dtm'||chr(10)|| -' where run.error_message is not null'; +' where ( :P1_OWNER is NULL'||chr(10)|| +' or :P1_OWNER = runner_owner )'||chr(10)|| +' and is_last_run = wtplsql.get_last_run_flag'||chr(10)|| +' and error_message is not null'; wwv_flow_api.create_report_region ( p_id=> 4869425043509942 + wwv_flow_api.g_id_offset, @@ -3314,7 +3129,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180718225301' + ,p_last_upd_yyyymmddhh24miss => '20180731230050' ); null; @@ -4426,14 +4241,15 @@ wwv_flow_api.create_page_item( p_attribute_01 => 'N', p_attribute_02 => 'PLSQL', p_attribute_03 => 'declare'||chr(10)|| -' max_id number;'||chr(10)|| +' last_run_id number;'||chr(10)|| 'begin'||chr(10)|| ' -- Group Function never returns NO_DATA_FOUND'||chr(10)|| -' select max(id) into max_id'||chr(10)|| +' select id into last_run_id'||chr(10)|| ' from wt_test_runs'||chr(10)|| ' where runner_owner = :APP_USER'||chr(10)|| -' and runner_name = :P2_TEST_RUNNER;'||chr(10)|| -' if max_id is not null'||chr(10)|| +' and runner_name = :P2_TEST_RUNNER'||chr(10)|| +' and is_last_run = ''Y'';'||chr(10)|| +' if last_run_id is not null'||chr(10)|| ' then'||chr(10)|| ' htp.p('''' || max_id || '' (Click to View)'' || '''');'||chr(10)|| +' ''">'' || last_run_id ||'||chr(10)|| +' '' (Click to View)'' || '''');'||chr(10)|| ' end if;'||chr(10)|| 'end;', p_show_quick_picks=>'N', @@ -4635,7 +4452,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180728193857' + ,p_last_upd_yyyymmddhh24miss => '20180731225449' ); null; @@ -10089,7 +9906,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180728211729' + ,p_last_upd_yyyymmddhh24miss => '20180730195029' ); null; @@ -12254,27 +12071,25 @@ p:=p||'declare'||chr(10)|| ' item_values varchar2(4000); -- Comma Delimited Values'||chr(10)|| ' --'||chr(10)|| ' procedure find_test_run_id is begin'||chr(10)|| -' select max(id) into :P6_TEST_RUN_ID'||chr(10)|| -' from wt_test_runs tr'||chr(10)|| -' where runner_owner = :APP_US'; - -p:=p||'ER'||chr(10)|| -' and exists (select ''x'' from wt_testcase_stats tc'||chr(10)|| -' where tc.test_run_id = tr.id'||chr(10)|| -' );'||chr(10)|| +' select max(tc.test_run_id) into :P6_TEST_RUN_ID'||chr(10)|| +' from wt_test_runs tr'||chr(10)|| +' join wt_te'; + +p:=p||'stcase_stats tc'||chr(10)|| +' on tc.test_run_id = tr.id'||chr(10)|| +' where tr.runner_owner = :APP_USER;'||chr(10)|| ' if :P6_TEST_RUN_ID is NULL'||chr(10)|| ' then'||chr(10)|| -' select max(id) into :P6_TEST_RUN_ID'||chr(10)|| -' from wt_test_runs tr'||chr(10)|| -' where exists (select ''x'' from wt_testcase_stats tc'||chr(10)|| -' where tc.test_run_id = tr.id'||chr(10)|| -' );'||chr(10)|| -' '; - -p:=p||' end if;'||chr(10)|| +' select max(tc.test_run_id) into :P6_TEST_RUN_ID'||chr(10)|| +' from wt_test_runs tr'||chr(10)|| +' join wt_testcase_stats tc'||chr(10)|| +' on tc.test_run_id = tr.id;'||chr(10)|| +' end if;'||chr(10)|| ' end find_test_run_id;'||chr(10)|| ' --'||chr(10)|| -' procedure process_test_run_id is begin'||chr(10)|| +' procedure process_test_run'; + +p:=p||'_id is begin'||chr(10)|| ' for buff in ('||chr(10)|| ' select tr.runner_owner'||chr(10)|| ' ,tr.runner_name'||chr(10)|| @@ -12283,35 +12098,35 @@ p:=p||' end if;'||chr(10)|| ' from wt_test_runs tr'||chr(10)|| ' where id = :P6_TEST_RUN_ID ) -- Primary Key, Only 1 row in loop'||chr(10)|| ' loop'||chr(10)|| -' :P'; +' :P6_RUNNER_OWNER := buff.runner_owner;'||chr(10)|| +' :P6_RUNNER_NAME := b'; -p:=p||'6_RUNNER_OWNER := buff.runner_owner;'||chr(10)|| -' :P6_RUNNER_NAME := buff.runner_name;'||chr(10)|| +p:=p||'uff.runner_name;'||chr(10)|| ' :P6_START_DTM := buff.start_dtm;'||chr(10)|| ' :P6_TEST_RUN_ERROR := buff.error_message;'||chr(10)|| ' if buff.runner_owner = :APP_USER'||chr(10)|| ' then'||chr(10)|| ' page := ''2'';'||chr(10)|| ' item_names := ''P'' || page || ''_TEST_RUNNER'';'||chr(10)|| -' item_values := buff.runner_na'; +' item_values := buff.runner_name;'||chr(10)|| +' :P6_RUNNER_NAME_DISP := '''' || buff.runner_name '; - -p:=p||' ||'||chr(10)|| +' ''">'' || buff.runner_name ||'||chr(10)|| ' '' (Click to Run)'' ;'||chr(10)|| -' else'||chr(10)|| +' else'; + +p:=p||''||chr(10)|| ' :P6_RUNNER_NAME_DISP := buff.runner_name;'||chr(10)|| ' end if;'||chr(10)|| ' end loop;'||chr(10)|| @@ -12320,10 +12135,10 @@ p:=p||' ||'||chr(10)|| ' function check_testcase_name return boolean is begin'||chr(10)|| ' for buff in (select ''x'' from wt_testcase_stats'||chr(10)|| ' where test_run_id = :P6_TEST_RUN_ID'||chr(10)|| -' and testcase = :P'; +' and testcase = :P6_TESTCASE_NAME )'||chr(10)|| +' -- Primary Key, Only returns 1 row'; -p:=p||'6_TESTCASE_NAME )'||chr(10)|| -' -- Primary Key, Only returns 1 row'||chr(10)|| +p:=p||''||chr(10)|| ' loop'||chr(10)|| ' return TRUE;'||chr(10)|| ' end loop;'||chr(10)|| @@ -12337,26 +12152,26 @@ p:=p||'6_TESTCASE_NAME )'||chr(10)|| ' where test_run_id = :P6_TEST_RUN_ID;'||chr(10)|| ' end find_testcase_name;'||chr(10)|| ' --'||chr(10)|| -' procedure proce'; - -p:=p||'ss_testcase_name is begin'||chr(10)|| +' procedure process_testcase_name is begin'||chr(10)|| ' page := ''3'';'||chr(10)|| -' item_names := ''P'' || page || ''_TEST_RUN_ID'';'||chr(10)|| +' item'; + +p:=p||'_names := ''P'' || page || ''_TEST_RUN_ID'';'||chr(10)|| ' item_values := :P6_TEST_RUN_ID;'||chr(10)|| ' :P6_TEST_RUN_ID_DISP := '''' || :P6_TEST_RUN_ID || '''';'||chr(10)|| +p:=p||' ''">'' || :P6_TEST_RUN_ID || '''';'||chr(10)|| ' select max(tot_interval_msecs) -- Need Group Function for NULL'||chr(10)|| ' into :P6_TOTAL_ELAPSED'||chr(10)|| ' from wt_testcase_stats'||chr(10)|| @@ -12366,11 +12181,11 @@ p:=p||' '':'' || V(''PRINTER_FRIENDLY'') ||'||chr(10)|| ' --'||chr(10)|| 'begin'||chr(10)|| ' --'||chr(10)|| -' if :P6_GO'; - -p:=p||'TO_TCASE is NOT NULL'||chr(10)|| +' if :P6_GOTO_TCASE is NOT NULL'||chr(10)|| ' then'||chr(10)|| -' -- The LOV was triggered, so set Test Case and go.'||chr(10)|| +' -- The LOV was triggered, so set Tes'; + +p:=p||'t Case and go.'||chr(10)|| ' :P6_TESTCASE_NAME := :P6_GOTO_TCASE;'||chr(10)|| ' :P6_GOTO_TCASE := NULL;'||chr(10)|| ' :P6_GOTO_RUN_ID := NULL;'||chr(10)|| @@ -12381,12 +12196,12 @@ p:=p||'TO_TCASE is NOT NULL'||chr(10)|| ' if :P6_GOTO_RUN_ID is NOT NULL'||chr(10)|| ' then'||chr(10)|| ' -- The LOV was triggered, Set Test Run.'||chr(10)|| -' :P6_TEST_RUN_'; - -p:=p||'ID := :P6_GOTO_RUN_ID;'||chr(10)|| +' :P6_TEST_RUN_ID := :P6_GOTO_RUN_ID;'||chr(10)|| ' :P6_GOTO_RUN_ID := NULL;'||chr(10)|| ' else'||chr(10)|| -' if :P6_TEST_RUN_ID is NULL'||chr(10)|| +' if '; + +p:=p||':P6_TEST_RUN_ID is NULL'||chr(10)|| ' then'||chr(10)|| ' -- Must have a Test Run ID'||chr(10)|| ' find_test_run_id;'||chr(10)|| @@ -12400,9 +12215,7 @@ p:=p||'ID := :P6_GOTO_RUN_ID;'||chr(10)|| ' -- Must set a Test Case'||chr(10)|| ' find_testcase_name;'||chr(10)|| ' end if;'||chr(10)|| -' -- Set (or Reset) th'; - -p:=p||'e Test Case dependents.'||chr(10)|| +' -- Set (or Reset) the Test Case dependents.'||chr(10)|| ' process_testcase_name;'||chr(10)|| ' --'||chr(10)|| 'end;'; From 6497fb48fea4d8233bf5c943d0bbd625938eb240 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Sun, 19 Aug 2018 08:52:58 -0500 Subject: [PATCH 018/141] Fixed Problem with RPC Rollback --- src/core/wtplsql.pkb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core/wtplsql.pkb b/src/core/wtplsql.pkb index 9994490..b280e6a 100644 --- a/src/core/wtplsql.pkb +++ b/src/core/wtplsql.pkb @@ -191,7 +191,6 @@ $THEN -------------------------------------- WTPLSQL Testing -- insert into wt_version (install_dtm, action, text) values (to_date('31-DEC-4000','DD-MON-YYYY'), 'TESTING', 'TESTING'); - rollback; wt_assert.eq ( msg_in => 'Test New Version', check_this_in => show_version, @@ -210,6 +209,7 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- procedure test_run (in_package_name in varchar2) is + pragma AUTONOMOUS_TRANSACTION; -- Required if called as Remote Procedure Call (RPC) l_test_runs_rec_NULL wt_test_runs%ROWTYPE; l_error_stack varchar2(32000); procedure concat_err_message is begin @@ -274,6 +274,7 @@ begin wt_profiler.finalize; -- Autonomous Transaction COMMIT wt_result.finalize; -- Autonomous Transaction COMMIT wt_test_run_stat.finalize; -- Autonomous Transaction COMMIT + commit; -- Required if called as Remote Procedure Call (RPC) exception when OTHERS @@ -290,6 +291,7 @@ exception raise_application_error(-20000, substr(g_test_runs_rec.error_message,1,2048)); end if; + commit; -- Required if called as Remote Procedure Call (RPC) end test_run; From ef467575429473f4013cf09a87d96127f1c5379c Mon Sep 17 00:00:00 2001 From: DDieterich Date: Sun, 19 Aug 2018 09:53:27 -0500 Subject: [PATCH 019/141] Return Contents to Docs README.txt --- docs/README.txt | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/docs/README.txt b/docs/README.txt index c4811a6..f3f41aa 100644 --- a/docs/README.txt +++ b/docs/README.txt @@ -1,2 +1,25 @@ -All documentation is in web pages that start at README.htm +Files and Directories + + +File Name Description +----------- ------------ +core Core Documentation Directory +demo Demonstration Documentation Directory +images Image Files referenced by MD and HTML +_config.yml YAML Configuration File for this Website +*.md Markdown files for "github.io" +*.htm HTML files for local documentation +md-to-htm.bat MS-Dos Batch File to convert MD to HTML +md-to-htm.lua Lua script used by Pandoc for MD to HTML + + +Local Documentation URL +----------------------- +file://README.htm +(or Double-click on the README.htm file) + + +NOTE: All HTML files are sourced from Markdown files. + Modify the Markdown files, then build HTML from the + Markdown files using "md-to-htm.bat". From a15f2a56afc42716ce54901fd2cd8804d4cc86ad Mon Sep 17 00:00:00 2001 From: DDieterich Date: Sat, 1 Sep 2018 23:03:52 -0500 Subject: [PATCH 020/141] Completed GUI Testing. --- docs/demo/Table-Test.htm | 30 +- docs/demo/Table-Test.md | 30 +- src/core/clear_last_run.prc | 18 + src/core/install.sql | 4 + src/core/wt_profiler.pkb | 7 +- src/core/wt_result.pkb | 6 +- src/core/wt_test_run_stat.pkb | 8 +- src/core/wtplsql.pkb | 88 +- src/demo/Table-Test.sql | 10 + src/gui/f700.sql | 17380 ++++++++++++++--------------- src/gui/install.sql | 1 - src/gui/wt_test_runs_gui_tree.vw | 52 - 12 files changed, 8428 insertions(+), 9206 deletions(-) create mode 100644 src/core/clear_last_run.prc delete mode 100644 src/gui/wt_test_runs_gui_tree.vw diff --git a/docs/demo/Table-Test.htm b/docs/demo/Table-Test.htm index f3698b3..4ea0fe0 100644 --- a/docs/demo/Table-Test.htm +++ b/docs/demo/Table-Test.htm @@ -52,9 +52,19 @@

      Test Runner

      against_this_in => 'TEST1'); rollback; end t_happy_path_1; + procedure t_sad_path_1 + is + begin + wt_assert.g_testcase := 'Sad Path 1'; + wt_assert.raises ( + msg_in => 'Raise Error', + check_call_in => 'insert into table_test_tab (id, name) values (1, ''Test1'')', + against_exc_in => 'ORA-02290: check constraint (WTP_DEMO.TABLE_TEST_TAB_CK1) violated'); + end t_sad_path_1; procedure wtplsql_run is begin t_happy_path_1; + t_sad_path_1; end wtplsql_run; end table_test_pkg; / @@ -64,26 +74,28 @@

      Check the results

      set serveroutput on size unlimited format word_wrapped
       
       begin
      -   wtplsql.test_run('TRIGGER_TEST_PKG');
      -   wt_text_report.dbms_out(USER,'TRIGGER_TEST_PKG',30);
      +   wtplsql.test_run('TABLE_TEST_PKG');
      +   wt_text_report.dbms_out(USER,'TABLE_TEST_PKG',30);
       end;
       /
       

      And Get This:

      -
          wtPLSQL 1.1.0 - Run ID 70: 23-Jun-2018 07:30:47 PM
      +
          wtPLSQL 1.1.0 - Run ID 344: 01-Sep-2018 10:51:48 PM
       
         Test Results for WTP_DEMO.TABLE_TEST_PKG
      -       Total Test Cases:        1       Total Assertions:        2
      +       Total Test Cases:        2       Total Assertions:        3
         Minimum Interval msec:        0      Failed Assertions:        0
      -  Average Interval msec:      443       Error Assertions:        0
      -  Maximum Interval msec:      886             Test Yield:   100.00%
      -   Total Run Time (sec):      0.9
      +  Average Interval msec:        5       Error Assertions:        0
      +  Maximum Interval msec:       16             Test Yield:   100.00%
      +   Total Run Time (sec):      0.0
       
      - - WTP_DEMO.TABLE_TEST_PKG Test Result Details (Test Run ID 70)
      + - WTP_DEMO.TABLE_TEST_PKG Test Result Details (Test Run ID 344)
       -----------------------------------------------------------
        ---- Test Case: Happy Path 1
      - PASS  886ms Successful Insert. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into table_test_tab (id, name) values (1, 'TEST1')".
      + PASS   16ms Successful Insert. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into table_test_tab (id, name) values (1, 'TEST1')".
        PASS    0ms Confirm l_rec.name. EQ - Expected "TEST1" and got "TEST1"
      + ---- Test Case: Sad Path 1
      + PASS    0ms Raise Error. RAISES/THROWS - Expected exception "%ORA-02290: check constraint (WTP_DEMO.TABLE_TEST_TAB_CK1) violated%". Actual exception raised was "ORA-02290: check constraint (WTP_DEMO.TABLE_TEST_TAB_CK1) violated". Exception raised by: "insert into table_test_tab (id, name) values (1, 'Test1')".
       

      This is report level 30, the most detailed level of reporting. Starting from the top, we find the test runner executed 1 test case and 2 assertions. All tests passed for a 100% yield. There is no code coverage for the constraints.

      This is not a complete test. More test cases are needed to confirm other constraints and sad path .

      diff --git a/docs/demo/Table-Test.md b/docs/demo/Table-Test.md index af861bf..ff5e933 100644 --- a/docs/demo/Table-Test.md +++ b/docs/demo/Table-Test.md @@ -71,9 +71,19 @@ as against_this_in => 'TEST1'); rollback; end t_happy_path_1; + procedure t_sad_path_1 + is + begin + wt_assert.g_testcase := 'Sad Path 1'; + wt_assert.raises ( + msg_in => 'Raise Error', + check_call_in => 'insert into table_test_tab (id, name) values (1, ''Test1'')', + against_exc_in => 'ORA-02290: check constraint (WTP_DEMO.TABLE_TEST_TAB_CK1) violated'); + end t_sad_path_1; procedure wtplsql_run is begin t_happy_path_1; + t_sad_path_1; end wtplsql_run; end table_test_pkg; / @@ -87,8 +97,8 @@ Run this: set serveroutput on size unlimited format word_wrapped begin - wtplsql.test_run('TRIGGER_TEST_PKG'); - wt_text_report.dbms_out(USER,'TRIGGER_TEST_PKG',30); + wtplsql.test_run('TABLE_TEST_PKG'); + wt_text_report.dbms_out(USER,'TABLE_TEST_PKG',30); end; / ``` @@ -96,20 +106,22 @@ end; And Get This: ``` - wtPLSQL 1.1.0 - Run ID 70: 23-Jun-2018 07:30:47 PM + wtPLSQL 1.1.0 - Run ID 344: 01-Sep-2018 10:51:48 PM Test Results for WTP_DEMO.TABLE_TEST_PKG - Total Test Cases: 1 Total Assertions: 2 + Total Test Cases: 2 Total Assertions: 3 Minimum Interval msec: 0 Failed Assertions: 0 - Average Interval msec: 443 Error Assertions: 0 - Maximum Interval msec: 886 Test Yield: 100.00% - Total Run Time (sec): 0.9 + Average Interval msec: 5 Error Assertions: 0 + Maximum Interval msec: 16 Test Yield: 100.00% + Total Run Time (sec): 0.0 - - WTP_DEMO.TABLE_TEST_PKG Test Result Details (Test Run ID 70) + - WTP_DEMO.TABLE_TEST_PKG Test Result Details (Test Run ID 344) ----------------------------------------------------------- ---- Test Case: Happy Path 1 - PASS 886ms Successful Insert. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into table_test_tab (id, name) values (1, 'TEST1')". + PASS 16ms Successful Insert. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into table_test_tab (id, name) values (1, 'TEST1')". PASS 0ms Confirm l_rec.name. EQ - Expected "TEST1" and got "TEST1" + ---- Test Case: Sad Path 1 + PASS 0ms Raise Error. RAISES/THROWS - Expected exception "%ORA-02290: check constraint (WTP_DEMO.TABLE_TEST_TAB_CK1) violated%". Actual exception raised was "ORA-02290: check constraint (WTP_DEMO.TABLE_TEST_TAB_CK1) violated". Exception raised by: "insert into table_test_tab (id, name) values (1, 'Test1')". ``` This is report level 30, the most detailed level of reporting. Starting from the top, we find the test runner executed 1 test case and 2 assertions. All tests passed for a 100% yield. There is no code coverage for the constraints. diff --git a/src/core/clear_last_run.prc b/src/core/clear_last_run.prc new file mode 100644 index 0000000..bc623bb --- /dev/null +++ b/src/core/clear_last_run.prc @@ -0,0 +1,18 @@ +create or replace procedure clear_last_run + (in_runner_owner in varchar2 + ,in_runner_name in varchar2 + ,in_last_run_flag in varchar2) + authid definer +as + -- This procedure is required to prevent granting UPDATE on + -- WT_TEST_RUNS to PUBLIC. The WTPLSQL package must run + -- with calling user permissions. If this procedure is + -- run by mistake, it is a simple matter to correct the + -- IS_LAST_RUN flag. +begin + update wt_test_runs + set is_last_run = NULL + where runner_owner = in_runner_owner + and runner_name = in_runner_name + and is_last_run = in_last_run_flag; +end clear_last_run; \ No newline at end of file diff --git a/src/core/install.sql b/src/core/install.sql index b2e32eb..b03e8be 100644 --- a/src/core/install.sql +++ b/src/core/install.sql @@ -165,6 +165,10 @@ grant execute on wtplsql to public; grant execute on wt_assert to public; grant execute on wt_text_report to public; +-- Procedures +@clear_last_run.prc +/ + -- Package Bodies @wtplsql.pkb / diff --git a/src/core/wt_profiler.pkb b/src/core/wt_profiler.pkb index 82caf87..49a252c 100644 --- a/src/core/wt_profiler.pkb +++ b/src/core/wt_profiler.pkb @@ -345,7 +345,6 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- procedure delete_plsql_profiler_recs (in_profiler_runid in number) is - PRAGMA AUTONOMOUS_TRANSACTION; begin delete from plsql_profiler_data where runid = in_profiler_runid; @@ -353,7 +352,6 @@ begin where runid = in_profiler_runid; delete from plsql_profiler_runs where runid = in_profiler_runid; - COMMIT; end delete_plsql_profiler_recs; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ @@ -1023,7 +1021,6 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- ------------------------------------------------------------ procedure insert_dbout_profile is - PRAGMA AUTONOMOUS_TRANSACTION; prof_rec wt_dbout_profiles%ROWTYPE; l_max_line number; procedure l_set_status is begin @@ -1115,11 +1112,9 @@ begin $END ----------------%WTPLSQL_end_ignore_lines%---------------- end loop; - COMMIT; - -- Delete PLSQL Profiler has it's own - -- PRAGMA AUTONOMOUS_TRANSACTION and COMMIT; g_ignr_aa.delete; delete_plsql_profiler_recs(g_rec.prof_runid); + commit; end insert_dbout_profile; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ diff --git a/src/core/wt_result.pkb b/src/core/wt_result.pkb index 6b00d3f..6ede2af 100644 --- a/src/core/wt_result.pkb +++ b/src/core/wt_result.pkb @@ -113,7 +113,6 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- -- it must be able to run multiple times without causing damage. procedure finalize is - PRAGMA AUTONOMOUS_TRANSACTION; l_results_recNULL wt_results%ROWTYPE; begin if g_results_rec.test_run_id IS NULL @@ -123,7 +122,6 @@ begin -- There is always an extra NULL element in the g_results_nt array. forall i in 1 .. g_results_nt.COUNT - 1 insert into wt_results values g_results_nt(i); - COMMIT; g_results_nt := results_nt_type(null); g_results_rec := l_results_recNULL; g_results_nt := results_nt_type(null); @@ -184,7 +182,6 @@ $THEN l_test_runs_rec.runner_name := 'Finalize Test'; l_test_runs_rec.runner_owner := 'BOGUS'; insert into wt_test_runs values l_test_runs_rec; - commit; -- Must commit because finalize is AUTONOMOUS TRANSACTION -------------------------------------- WTPLSQL Testing -- finalize; -- g_results_nt is still loaded with one element l_results_ntTEST := g_results_nt; @@ -287,6 +284,7 @@ $THEN begin -------------------------------------- WTPLSQL Testing -- wt_assert.g_testcase := 'Ad Hoc Save Happy Path Setup'; + dbms_output.enable; -- Save/Clear the DBMS_OUPTUT Buffer loop DBMS_OUTPUT.GET_LINE ( @@ -303,7 +301,7 @@ $THEN wt_assert.g_testcase := 'Ad Hoc Save Testing Happy Path'; l_test_run_id := g_results_rec.test_run_id; g_results_rec.test_run_id := NULL; - g_skip_add := TRUE; + g_skip_add := TRUE; -- Doesn't effect the DBMS_OUTPUT function wt_result.save ( in_assertion => 'SELFTEST1', in_status => wt_assert.C_PASS, diff --git a/src/core/wt_test_run_stat.pkb b/src/core/wt_test_run_stat.pkb index 9f3cbe8..e9bdb57 100644 --- a/src/core/wt_test_run_stat.pkb +++ b/src/core/wt_test_run_stat.pkb @@ -416,7 +416,6 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- ------------------------------------------------------------ procedure finalize is - PRAGMA AUTONOMOUS_TRANSACTION; l_executable_lines number; tc varchar2(50); begin @@ -470,7 +469,6 @@ begin tc := g_tc_aa.NEXT(tc); end loop; end if; - COMMIT; initialize; end finalize; @@ -526,7 +524,7 @@ $THEN l_tc_aaTEST.delete; l_recTEST := l_recNULL; l_recTEST.test_run_id := l_test_run_id; - run_finalize('Run Finalize for Happy Path 1'); -- AUTONOMOUS COMMIT + run_finalize('Run Finalize for Happy Path 1'); -------------------------------------- WTPLSQL Testing -- begin select * into l_recTEST @@ -663,7 +661,7 @@ $THEN l_recTEST.notexec_lines := 2; --l_recTEST.unknown_lines := null; l_recTEST.tot_executed_usecs := 2000; - run_finalize('Run Finalize for Happy Path 2'); -- AUTONOMOUS COMMIT + run_finalize('Run Finalize for Happy Path 2'); -------------------------------------- WTPLSQL Testing -- begin select * into l_tstat_rec @@ -878,7 +876,7 @@ $THEN l_tc_aaTEST.delete; l_recTEST := l_recNULL; l_recTEST.asserts := 2; - run_finalize('Run Finalize for Sad Path 1'); -- AUTONOMOUS COMMIT + run_finalize('Run Finalize for Sad Path 1'); wt_assert.isnull ( msg_in => 'l_recTEST.test_run_id', check_this_in => l_recTEST.test_run_id); diff --git a/src/core/wtplsql.pkb b/src/core/wtplsql.pkb index b280e6a..2927868 100644 --- a/src/core/wtplsql.pkb +++ b/src/core/wtplsql.pkb @@ -94,7 +94,6 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- ------------------------------------------------------------ procedure insert_test_run is - PRAGMA AUTONOMOUS_TRANSACTION; l_wt_test_runs_recNULL wt_test_runs%ROWTYPE; begin if g_test_runs_rec.id is null @@ -102,14 +101,12 @@ begin return; end if; g_test_runs_rec.end_dtm := systimestamp; - update wt_test_runs - set is_last_run = NULL - where runner_owner = g_test_runs_rec.runner_owner - and runner_name = g_test_runs_rec.runner_name - and is_last_run = IS_LAST_RUN_FLAG; + clear_last_run + (in_runner_owner => g_test_runs_rec.runner_owner + ,in_runner_name => g_test_runs_rec.runner_name + ,in_last_run_flag => IS_LAST_RUN_FLAG); insert into wt_test_runs values g_test_runs_rec; g_test_runs_rec := l_wt_test_runs_recNULL; - COMMIT; end insert_test_run; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ @@ -118,7 +115,7 @@ $THEN is -------------------------------------- WTPLSQL Testing -- TYPE l_dbmsout_buff_type is table of varchar2(32767); - l_dbmsout_buff l_dbmsout_buff_type := l_dbmsout_buff_type(1); + l_dbmsout_buff l_dbmsout_buff_type; l_test_runs_rec wt_test_runs%ROWTYPE; l_dbmsout_line varchar2(32767); l_dbmsout_stat number; @@ -126,13 +123,19 @@ $THEN begin -------------------------------------- WTPLSQL Testing -- wt_assert.g_testcase := 'INSERT_TEST_RUN Happy Path 1'; + wt_assert.eqqueryvalue ( + msg_in => 'Records Before Insert', + check_query_in => 'select count(*) from wt_test_runs' || + ' where id = ' || g_test_runs_rec.id, + against_value_in => 0); + -------------------------------------- WTPLSQL Testing -- l_test_runs_rec := g_test_runs_rec; insert_test_run; g_test_runs_rec := l_test_runs_rec; wt_assert.eqqueryvalue ( msg_in => 'Number of Records', check_query_in => 'select count(*) from wt_test_runs' || - ' where id = ' || l_test_runs_rec.id, + ' where id = ' || g_test_runs_rec.id, against_value_in => 1); -------------------------------------- WTPLSQL Testing -- delete from wt_test_runs @@ -141,7 +144,18 @@ $THEN wt_assert.eqqueryvalue ( msg_in => 'Records After Delete', check_query_in => 'select count(*) from wt_test_runs' || - ' where id = ' || l_test_runs_rec.id, + ' where id = ' || g_test_runs_rec.id, + against_value_in => 0); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'INSERT_TEST_RUN Happy Path 2'; + l_test_runs_rec := g_test_runs_rec; + g_test_runs_rec.id := null; + insert_test_run; + g_test_runs_rec := l_test_runs_rec; + wt_assert.eqqueryvalue ( + msg_in => 'Records After Delete', + check_query_in => 'select count(*) from wt_test_runs' || + ' where id = ' || g_test_runs_rec.id, against_value_in => 0); end t_insert_test_run; $END ----------------%WTPLSQL_end_ignore_lines%---------------- @@ -212,14 +226,17 @@ is pragma AUTONOMOUS_TRANSACTION; -- Required if called as Remote Procedure Call (RPC) l_test_runs_rec_NULL wt_test_runs%ROWTYPE; l_error_stack varchar2(32000); - procedure concat_err_message is begin + procedure concat_err_message + (in_err_msg in varchar2) + is + begin if g_test_runs_rec.error_message is not null then - g_test_runs_rec.error_message := substr(l_error_stack || CHR(10)|| + g_test_runs_rec.error_message := substr(in_err_msg || CHR(10)|| g_test_runs_rec.error_message ,1,4000); else - g_test_runs_rec.error_message := l_error_stack; + g_test_runs_rec.error_message := in_err_msg; end if; end concat_err_message; begin @@ -244,8 +261,9 @@ begin g_test_runs_rec.error_message := ''; check_runner; -- Initialize - delete_runs(in_runner_owner => g_test_runs_rec.runner_owner -- Autonomous Transaction COMMIT + delete_runs(in_runner_owner => g_test_runs_rec.runner_owner ,in_runner_name => g_test_runs_rec.runner_name); + COMMIT; -- Start a new Transaction wt_assert.reset_globals; wt_test_run_stat.initialize; wt_result.initialize(g_test_runs_rec.id); @@ -257,7 +275,7 @@ begin out_trigger_offset => g_test_runs_rec.trigger_offset, out_profiler_runid => g_test_runs_rec.profiler_runid, out_error_message => l_error_stack); - concat_err_message; + concat_err_message(l_error_stack); -- Call the Test Runner begin execute immediate 'BEGIN ' || in_package_name || '.WTPLSQL_RUN; END;'; @@ -266,14 +284,14 @@ begin then l_error_stack := dbms_utility.format_error_stack || dbms_utility.format_error_backtrace ; - concat_err_message; + concat_err_message(l_error_stack); end; -- Finalize - insert_test_run; -- Autonomous Transaction COMMIT - wt_profiler.finalize; -- Autonomous Transaction COMMIT - wt_result.finalize; -- Autonomous Transaction COMMIT - wt_test_run_stat.finalize; -- Autonomous Transaction COMMIT + insert_test_run; + wt_profiler.finalize; + wt_result.finalize; + wt_test_run_stat.finalize; commit; -- Required if called as Remote Procedure Call (RPC) exception @@ -281,16 +299,20 @@ exception then l_error_stack := dbms_utility.format_error_stack || dbms_utility.format_error_backtrace ; - if g_test_runs_rec.id is null - then - DBMS_OUTPUT.PUT_LINE(l_error_stack); - DBMS_OUTPUT.PUT_LINE('---------------------------'); - DBMS_OUTPUT.PUT_LINE(g_test_runs_rec.error_message); - else - concat_err_message; - raise_application_error(-20000, - substr(g_test_runs_rec.error_message,1,2048)); - end if; + concat_err_message(l_error_stack); + begin + -- This is the only exception we can catch + -- with a full call stack + insert_test_run; + exception + when OTHERS + then + l_error_stack := dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace ; + concat_err_message(l_error_stack); + raise_application_error(-20000, substr(g_test_runs_rec.error_message + ,1,2000 )); + end; commit; -- Required if called as Remote Procedure Call (RPC) end test_run; @@ -354,12 +376,9 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- procedure delete_runs (in_test_run_id in number) is - PRAGMA AUTONOMOUS_TRANSACTION; r_owner varchar2(200); r_name varchar2(200); begin - -- Profiler delete must be first because it contains a - -- PRAGMA AUTONOMOUS_TRANSACTION wt_test_run_stat.delete_records(in_test_run_id); wt_profiler.delete_records(in_test_run_id); wt_result.delete_records(in_test_run_id); @@ -388,7 +407,6 @@ begin then null; -- Ignore Error end; - COMMIT; end delete_runs; procedure delete_runs @@ -448,7 +466,7 @@ $THEN check_query_in => 'select count(*) from wt_test_runs' || ' where id = ' || g_test_runs_rec.id, against_value_in => 1); - delete_runs(g_test_runs_rec.id); -- Autonomous Transaction + delete_runs(g_test_runs_rec.id); -------------------------------------- WTPLSQL Testing -- wt_assert.eqqueryvalue ( msg_in => 'Number of Records After Delete', diff --git a/src/demo/Table-Test.sql b/src/demo/Table-Test.sql index ea01eee..223bdaa 100644 --- a/src/demo/Table-Test.sql +++ b/src/demo/Table-Test.sql @@ -33,9 +33,19 @@ as against_this_in => 'TEST1'); rollback; end t_happy_path_1; + procedure t_sad_path_1 + is + begin + wt_assert.g_testcase := 'Sad Path 1'; + wt_assert.raises ( + msg_in => 'Raise Error', + check_call_in => 'insert into table_test_tab (id, name) values (1, ''Test1'')', + against_exc_in => 'ORA-02290: check constraint (WTP_DEMO.TABLE_TEST_TAB_CK1) violated'); + end t_sad_path_1; procedure wtplsql_run is begin t_happy_path_1; + t_sad_path_1; end wtplsql_run; end table_test_pkg; / diff --git a/src/gui/f700.sql b/src/gui/f700.sql index 147f0ef..23fba65 100644 --- a/src/gui/f700.sql +++ b/src/gui/f700.sql @@ -13,7 +13,7 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Application Export: -- Application: 700 -- Name: wtPLSQL Core GUI --- Date and Time: 23:46 Wednesday August 1, 2018 +-- Date and Time: 22:49 Saturday September 1, 2018 -- Exported By: WTP -- Flashback: 0 -- Export Type: Application Export @@ -25,19 +25,19 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Using SQL*Plus as the Oracle user APEX_040000 or as the owner (parsing schema) of the application. -- Application Statistics: --- Pages: 7 --- Items: 52 --- Computations: 0 +-- Pages: 8 +-- Items: 27 +-- Computations: 8 -- Validations: 0 --- Processes: 15 +-- Processes: 16 -- Regions: 41 --- Buttons: 2 --- Dynamic Actions: 4 +-- Buttons: 6 +-- Dynamic Actions: 5 -- Shared Components -- Breadcrumbs: 1 -- Entries 2 -- Items: 1 --- Computations: 0 +-- Computations: 1 -- Processes: 1 -- Parent Tabs: 0 -- Tab Sets: 1 @@ -146,7 +146,7 @@ wwv_flow_api.create_flow( p_default_region_template=> 4840201642414912 + wwv_flow_api.g_id_offset, p_error_template=> 4837131094414910 + wwv_flow_api.g_id_offset, p_page_protection_enabled_y_n=> 'Y', - p_checksum_salt_last_reset => '20180801234656', + p_checksum_salt_last_reset => '20180901224934', p_max_session_length_sec=> 28800, p_home_link=> 'f?p=&APP_ID.:3:&SESSION.', p_flow_language=> 'en', @@ -192,7 +192,7 @@ wwv_flow_api.create_flow( p_default_listr_template => 4839116402414912 + wwv_flow_api.g_id_offset, p_default_irr_template => 4839831975414912 + wwv_flow_api.g_id_offset, p_last_updated_by => 'WTP', - p_last_upd_yyyymmddhh24miss=> '20180801234656', + p_last_upd_yyyymmddhh24miss=> '20180901224934', p_required_roles=> wwv_flow_utilities.string_to_table2('')); @@ -241,7 +241,7 @@ end; prompt ...application processes -- ---application/shared_components/logic/application_processes/initialize_p1_owner +--application/shared_components/logic/application_processes/initialize_items begin @@ -250,19 +250,160 @@ declare l_clob clob; l_length number := 1; begin -p:=p||'begin'||chr(10)|| -' :P1_OWNER := ''1st Time'';'||chr(10)|| -'end;'; +p:=p||'DECLARE'||chr(10)|| +' -- Set Test Run ID based on Test Owner and (optionally) Test Runner'||chr(10)|| +' procedure set_run_id (in_runner_name varchar2 default NULL) is'||chr(10)|| +' begin'||chr(10)|| +' -- Group function will not raise NO_DATA_FOUND'||chr(10)|| +' select max(id)'||chr(10)|| +' into :P0_TEST_RUN_ID'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where runner_owner = :P0_TEST_OWNER'||chr(10)|| +' and ( in_runner_name is NULL'||chr(10)|| +' or in_runner_name = '; + +p:=p||'runner_name);'||chr(10)|| +' end set_run_id;'||chr(10)|| +' -- Set Owner based on Test Run ID'||chr(10)|| +' procedure set_owner is'||chr(10)|| +' begin'||chr(10)|| +' -- Group function will not raise NO_DATA_FOUND'||chr(10)|| +' select min(runner_owner)'||chr(10)|| +' into :P0_TEST_OWNER'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where id = :P0_TEST_RUN_ID;'||chr(10)|| +' end set_owner;'||chr(10)|| +' -- Set Runner based on Test Run ID'||chr(10)|| +' procedure set_runner is'||chr(10)|| +' num_recs pls_integer;'||chr(10)|| +' begin'||chr(10)|| +' '; + +p:=p||' -- Group function will not raise NO_DATA_FOUND'||chr(10)|| +' select count(*)'||chr(10)|| +' into num_recs'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where id = :P0_TEST_RUN_ID'||chr(10)|| +' and runner_name = :P0_TEST_RUNNER;'||chr(10)|| +' if num_recs = 0'||chr(10)|| +' then'||chr(10)|| +' -- Group function will not raise NO_DATA_FOUND'||chr(10)|| +' select min(runner_name)'||chr(10)|| +' into :P0_TEST_RUNNER'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' '; + +p:=p||' where id = :P0_TEST_RUN_ID;'||chr(10)|| +' end if;'||chr(10)|| +' end set_runner;'||chr(10)|| +' -- Set Test Case based on Test Run ID if Test Case not valid'||chr(10)|| +' procedure set_test_case is'||chr(10)|| +' num_recs pls_integer;'||chr(10)|| +' begin'||chr(10)|| +' -- Group function will not raise NO_DATA_FOUND'||chr(10)|| +' select count(*)'||chr(10)|| +' into num_recs'||chr(10)|| +' from wt_testcase_stats'||chr(10)|| +' where test_run_id = :P0_TEST_RUN_ID'||chr(10)|| +' and testcase = :P0_TES'; + +p:=p||'T_CASE;'||chr(10)|| +' if num_recs = 0'||chr(10)|| +' then'||chr(10)|| +' -- Group function will not raise NO_DATA_FOUND'||chr(10)|| +' select min(testcase)'||chr(10)|| +' into :P0_TEST_CASE'||chr(10)|| +' from wt_testcase_stats'||chr(10)|| +' where test_run_id = :P0_TEST_RUN_ID;'||chr(10)|| +' end if;'||chr(10)|| +' end set_test_case;'||chr(10)|| +'BEGIN'||chr(10)|| +' -- Main Decision Logic'||chr(10)|| +' case'||chr(10)|| +' --'||chr(10)|| +' when :P0_TEST_RUN_ID is not null'||chr(10)|| +' and ( :P0_OLD_TEST_RUN'; + +p:=p||'_ID is null'||chr(10)|| +' or :P0_OLD_TEST_RUN_ID != :P0_TEST_RUN_ID )'||chr(10)|| +' then'||chr(10)|| +' -- This is the most common case of getting called from a link'||chr(10)|| +' :P0_DBG := ''P0_TEST_RUN_ID changed from '' || :P0_OLD_TEST_RUN_ID ||'||chr(10)|| +' '' to '' || :P0_TEST_RUN_ID ;'||chr(10)|| +' set_owner; -- Based on Test Run ID'||chr(10)|| +' set_runner; '; + +p:=p||' -- Based on Test Run ID'||chr(10)|| +' set_test_case; -- Based on Test Run ID'||chr(10)|| +' -- if Test Case not valid'||chr(10)|| +' --'||chr(10)|| +' when :P0_TEST_OWNER is NULL'||chr(10)|| +' then'||chr(10)|| +' -- Set everything to NULL'||chr(10)|| +' -- :P0_TEST_RUN_ID has not changed'||chr(10)|| +' :P0_DBG := ''P0_TEST_ONWER is null'';'||chr(10)|| +' :P0_TEST_RUNNER := NULL;'||chr(10)|| +' :P'; + +p:=p||'0_TEST_RUN_ID := NULL;'||chr(10)|| +' :P0_TEST_CASE := NULL;'||chr(10)|| +' --'||chr(10)|| +' when :P0_OLD_TEST_OWNER is null'||chr(10)|| +' or :P0_OLD_TEST_OWNER != :P0_TEST_OWNER'||chr(10)|| +' then'||chr(10)|| +' -- :P0_TEST_RUN_ID has not changed'||chr(10)|| +' -- :P0_TEST_OWNER is not null'||chr(10)|| +' :P0_DBG := ''P0_TEST_OWNER changed from '' || :P0_OLD_TEST_OWNER ||'||chr(10)|| +' '' to '' || :P0_TEST_OWNER ;'; + +p:=p||''||chr(10)|| +' set_run_id; -- Based on Test Owner'||chr(10)|| +' set_runner; -- Based on Test Run ID'||chr(10)|| +' set_test_case; -- Based on Test Run ID'||chr(10)|| +' -- if Test Case not valid'||chr(10)|| +' --'||chr(10)|| +' when NOT ( ( :P0_TEST_RUNNER is null'||chr(10)|| +' and :P0_OLD_TEST_RUNNER is null )'||chr(10)|| +' or :P'; + +p:=p||'0_TEST_RUNNER = :P0_OLD_TEST_RUNNER )'||chr(10)|| +' then'||chr(10)|| +' -- :P0_TEST_RUN_ID has not changed'||chr(10)|| +' -- :P0_TEST_OWNER is not null'||chr(10)|| +' -- :P0_TEST_OWNER has not changed'||chr(10)|| +' :P0_DBG := ''P0_TEST_RUNNER changed from '' || :P0_OLD_TEST_RUNNER ||'||chr(10)|| +' '' to '' || :P0_TEST_RUNNER ;'||chr(10)|| +' set_run_id(:P0_TEST_RUNNER); -- Based on Test Owner and Tes'; + +p:=p||'t Runner'||chr(10)|| +' set_test_case; -- Based on Test Run ID'||chr(10)|| +' -- if Test Case not valid'||chr(10)|| +' --'||chr(10)|| +' else'||chr(10)|| +' -- :P0_TEST_RUN_ID has not changed'||chr(10)|| +' -- :P0_TEST_OWNER is not null'||chr(10)|| +' -- :P0_TEST_OWNER has not changed'||chr(10)|| +' -- :P0_TEST_RUNNER has not changed'||chr(10)|| +' :P0_DBG := ''Do nothing'';'||chr(10)|| +' null;'||chr(10)|| +' --'||chr(10)|| +' e'; + +p:=p||'nd case;'||chr(10)|| +' :P0_OLD_TEST_RUN_ID := :P0_TEST_RUN_ID;'||chr(10)|| +' :P0_OLD_TEST_OWNER := :P0_TEST_OWNER;'||chr(10)|| +' :P0_OLD_TEST_RUNNER := :P0_TEST_RUNNER;'||chr(10)|| +'END;'; wwv_flow_api.create_flow_process( - p_id => 4876315026134588 + wwv_flow_api.g_id_offset, + p_id => 5124821433507746 + wwv_flow_api.g_id_offset, p_flow_id => wwv_flow.g_flow_id, - p_process_sequence=> 1, - p_process_point => 'AFTER_AUTHENTICATION', + p_process_sequence=> 10, + p_process_point => 'BEFORE_HEADER', p_process_type=> 'PLSQL', - p_process_name=> 'Initialize P1_OWNER', + p_process_name=> 'Initialize Items', p_process_sql_clob=> p, - p_process_error_message=> '#SQLERRM#', + p_process_error_message=> 'Global Page Initialization Failed', p_process_when=> '', p_process_when_type=> '', p_process_comment=> ''); @@ -280,12 +421,12 @@ prompt ...application items begin wwv_flow_api.create_flow_item( - p_id=> 4849121938416019 + wwv_flow_api.g_id_offset, + p_id=> 5108203250645963 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_name=> 'FSP_AFTER_LOGIN_URL', p_data_type=> 'VARCHAR', p_is_persistent=> 'Y', - p_protection_level=> '', + p_protection_level=> 'N', p_item_comment=> ''); null; @@ -298,7 +439,32 @@ prompt ...application level computations begin -null; +--application/shared_components/logic/application_computations/p0_test_owner +wwv_flow_api.create_flow_computation ( + p_id => 5148803335141101 + wwv_flow_api.g_id_offset, + p_flow_id => wwv_flow.g_flow_id, + p_computation_sequence => 10, + p_computation_item => 'P0_TEST_OWNER', + p_computation_point => 'ON_NEW_INSTANCE', + p_computation_type => 'QUERY', + p_computation_processed=> 'REPLACE_EXISTING', + p_computation => 'with q1 as ('||chr(10)|| +'select max(runner_owner) max_owner'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where runner_owner <= :APP_USER'||chr(10)|| +'), q2 as ('||chr(10)|| +'select min(runner_owner) min_owner'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where runner_owner >= :APP_USER'||chr(10)|| +')'||chr(10)|| +'select nvl(q1.max_owner, q2.min_owner)'||chr(10)|| +' from q1 cross join q2', + p_compute_when=> '', + p_compute_when_type=> '', + p_computation_error_message=>'', + p_computation_comment=> '', + p_required_patch => null + wwv_flow_api.g_id_offset); + end; / @@ -347,29 +513,29 @@ wwv_flow_api.create_tab ( p_tab_parent_tabset=>'', p_tab_comment => ''); ---application/shared_components/navigation/tabs/standard/t_dbout_profile +--application/shared_components/navigation/tabs/standard/t_test_cases wwv_flow_api.create_tab ( - p_id=> 5047612005953773 + wwv_flow_api.g_id_offset, + p_id=> 4977229177323155 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_tab_set=> 'TS1', p_tab_sequence=> 40, - p_tab_name=> 'T_DBOUT PROFILE', - p_tab_text => 'DBOUT Profile', - p_tab_step => 4, - p_tab_also_current_for_pages => '4', + p_tab_name=> 'T_TEST CASES', + p_tab_text => 'Test Case', + p_tab_step => 6, + p_tab_also_current_for_pages => '', p_tab_parent_tabset=>'', p_tab_comment => ''); ---application/shared_components/navigation/tabs/standard/t_test_cases +--application/shared_components/navigation/tabs/standard/t_dbout_profile wwv_flow_api.create_tab ( - p_id=> 4977229177323155 + wwv_flow_api.g_id_offset, + p_id=> 5047612005953773 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_tab_set=> 'TS1', p_tab_sequence=> 50, - p_tab_name=> 'T_TEST CASES', - p_tab_text => 'Test Case', - p_tab_step => 6, - p_tab_also_current_for_pages => '', + p_tab_name=> 'T_DBOUT PROFILE', + p_tab_text => 'DBOUT Profile', + p_tab_step => 4, + p_tab_also_current_for_pages => '4', p_tab_parent_tabset=>'', p_tab_comment => ''); @@ -641,34 +807,26 @@ end; prompt ...comments: requires application express 2.2 or higher -- ---application/pages/page_00001 -prompt ...PAGE 1: Dashboard +--application/pages/page_00000 +prompt ...PAGE 0: Global -- begin wwv_flow_api.create_page ( p_flow_id => wwv_flow.g_flow_id - ,p_id => 1 - ,p_tab_set => 'TS1' - ,p_name => 'Dashboard' - ,p_alias => 'DASHBOARD' - ,p_step_title => 'Home' - ,p_allow_duplicate_submissions => 'Y' - ,p_step_sub_title => 'Home' + ,p_id => 0 + ,p_name => 'Global' + ,p_step_title => '0' ,p_step_sub_title_type => 'TEXT_WITH_SUBSTITUTIONS' - ,p_first_item => 'AUTO_FIRST_ITEM' + ,p_first_item => 'NO_FIRST_ITEM' ,p_include_apex_css_js_yn => 'Y' ,p_autocomplete_on_off => 'ON' ,p_page_is_public_y_n => 'N' ,p_protection_level => 'N' ,p_cache_page_yn => 'N' - ,p_cache_timeout_seconds => 21600 - ,p_cache_by_user_yn => 'N' - ,p_help_text => -'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180801213559' + ,p_last_upd_yyyymmddhh24miss => '20180830054130' ); null; @@ -680,3287 +838,209 @@ declare l_clob clob; l_length number := 1; begin -s:=s||' '; +s:=s||'begin'||chr(10)|| +' -- htp.p(''P0_TEST_OWNER = '' || v(''P0_TEST_OWNER'' ) || ''
      '');'||chr(10)|| +' -- htp.p(''P0_TEST_RUNNER = '' || v(''P0_TEST_RUNNER'' ) || ''
      '');'||chr(10)|| +' -- htp.p(''P0_TEST_RUN_ID = '' || v(''P0_TEST_RUN_ID'' ) || ''
      '');'||chr(10)|| +' -- htp.p(''P0_TEST_CASE = '' || v(''P0_TEST_CASE'' ) || ''
      '');'||chr(10)|| +' -- htp.p(''P0_DISPLAY = '' || v(''P0_DISPLAY'' ) || ''
      '');'||chr(10)|| +' -- htp.p(''P0_OLD_'; + +s:=s||'TEST_OWNER = '' || v(''P0_OLD_TEST_OWNER'' ) || ''
      '');'||chr(10)|| +' -- htp.p(''P0_OLD_TEST_RUNNER = '' || v(''P0_OLD_TEST_RUNNER'' ) || ''
      '');'||chr(10)|| +' -- htp.p(''P0_OLD_TEST_RUN_ID = '' || v(''P0_OLD_TEST_RUN_ID'' ) || ''
      '');'||chr(10)|| +' null;'||chr(10)|| +'end;'; wwv_flow_api.create_page_plug ( - p_id=> 4846907308414925 + wwv_flow_api.g_id_offset, + p_id=> 5109401519013442 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 1, - p_plug_name=> 'Control', + p_page_id=> 0, + p_plug_name=> 'Common Control', p_region_name=>'', p_plug_template=> 4840201642414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 11, + p_plug_display_sequence=> 10, p_plug_display_column=> 1, - p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_display_point=> 'REGION_POSITION_02', p_plug_source=> s, - p_plug_source_type=> 'STATIC_TEXT', + p_plug_source_type=> 'PLSQL_PROCEDURE', p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_headings_type=> 'QUERY_COLUMNS', + p_plug_query_num_rows_type => 'NEXT_PREVIOUS_LINKS', p_plug_query_row_count_max => 500, - p_plug_display_condition_type => '', + p_plug_query_show_nulls_as => ' - ', + p_plug_display_condition_type => 'PLSQL_EXPRESSION', + p_plug_display_when_condition => ':P0_DISPLAY = ''Y''', + p_pagination_display_position=>'BOTTOM_RIGHT', p_plug_customized=>'0', p_plug_caching=> 'NOT_CACHED', p_plug_comment=> ''); end; / -declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; + begin -s:=s||''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -'#CHART_REFRESH#'; +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>5111411983271940 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 0, + p_name=>'P0_DISPLAY', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 210, + p_item_plug_id => 5109401519013442+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_HIDDEN', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 10, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'NO', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'LEFT', + p_field_alignment=> 'LEFT', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_show_quick_picks=>'N', + p_item_comment => 'This item is set by each page.'); + + +end; +/ -wwv_flow_api.create_page_plug ( - p_id=> 4854109180566690 + wwv_flow_api.g_id_offset, +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>5115915435597711 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 1, - p_plug_name=> 'Test Runners Status Summary', - p_region_name=>'', - p_plug_template=> 4840201642414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 12, - p_plug_display_column=> 2, - p_plug_display_point=> 'BEFORE_BOX_BODY', - p_plug_source=> s, - p_plug_source_type=> 'FLASH_CHART5', - p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', - p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'COLON_DELMITED_LIST', - p_plug_query_row_count_max => 500, - p_plug_display_condition_type => '', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); + p_flow_step_id=> 0, + p_name=>'P0_TEST_OWNER', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 10, + p_item_plug_id => 5109401519013442+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Test Runner Owner', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_POPUP_LOV', + p_lov=> 'select owner DISPLAY'||chr(10)|| +' ,owner RETURN'||chr(10)|| +' from dba_arguments'||chr(10)|| +' where object_name = ''WTPLSQL_RUN'''||chr(10)|| +' and argument_name is null'||chr(10)|| +' and position = 1'||chr(10)|| +' and sequence = 0'||chr(10)|| +' group by owner', + p_lov_display_null=> 'YES', + p_lov_translated=> 'N', + p_lov_null_text=>'All Owners', + p_lov_null_value=> '', + p_cSize=> 30, + p_cMaxlength=> 128, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'NO', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'ABOVE', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'NO', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'NOT_ENTERABLE', + p_attribute_02 => 'FIRST_ROWSET', + p_show_quick_picks=>'N', + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); + + end; / + declare - a1 varchar2(32767) := null; + h varchar2(32767) := null; begin -a1 := null; -wwv_flow_api.create_flash_chart5( - p_id => 4854324865566692+wwv_flow_api.g_id_offset, +wwv_flow_api.create_page_item( + p_id=>5116105869604358 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id => 1, - p_region_id => 4854109180566690+wwv_flow_api.g_id_offset, - p_default_chart_type =>'2DPie', - p_chart_title =>'', - p_chart_name =>'chart_4854324865566692', - p_chart_width =>300, - p_chart_height =>150, - p_chart_animation =>'N', - p_display_attr =>':H:::::Left::V:Y:None:::N:::Default', - p_dial_tick_attr =>':::::::::::', - p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', - p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', - p_map_source =>'%', - p_margins =>':::', - p_omit_label_interval => null, - p_bgtype =>'Trans', - p_bgcolor1 =>'', - p_bgcolor2 =>'', - p_gradient_rotation =>null, - p_grid_bgtype =>'', - p_grid_bgcolor1 =>'', - p_grid_bgcolor2 =>'', - p_grid_gradient_rotation =>null, - p_color_scheme =>'0', - p_custom_colors =>'#99FF99,#FFFF99,#FF6699', - p_map_undef_color_scheme =>'', - p_map_undef_custom_colors =>'', - p_x_axis_title =>'', - p_x_axis_min =>null, - p_x_axis_max =>null, - p_x_axis_decimal_place =>null, - p_x_axis_prefix =>'', - p_x_axis_postfix =>'', - p_x_axis_label_rotation =>'', - p_x_axis_label_font =>'::', - p_x_axis_major_interval =>null, - p_x_axis_minor_interval =>null, - p_y_axis_title =>'', - p_y_axis_min =>null, - p_y_axis_max =>null, - p_y_axis_decimal_place =>null, - p_y_axis_prefix =>'', - p_y_axis_postfix =>'', - p_y_axis_label_rotation =>'', - p_y_axis_label_font =>'::', - p_y_axis_major_interval =>null, - p_y_axis_minor_interval =>null, - p_async_update =>'N', - p_async_time =>null, - p_legend_title =>'', - p_legend_title_font =>'', - p_names_font => null, - p_names_rotation => null, - p_values_font =>'Arial:10:#000000', - p_values_rotation =>null, - p_values_prefix =>'', - p_values_postfix =>'', - p_hints_font =>'Tahoma:10:#000000', - p_legend_font =>'Arial:10:#000000', - p_grid_labels_font =>'', - p_chart_title_font =>'Tahoma:14:#000000', - p_x_axis_title_font =>'Tahoma:14:', - p_x_axis_title_rotation =>'', - p_y_axis_title_font =>'Tahoma:14:', - p_y_axis_title_rotation =>'', - p_gauge_labels_font =>'Tahoma:10:', - p_use_chart_xml =>'N', - p_chart_xml => a1); -end; -/ -declare - a1 varchar2(32767) := null; -begin -a1:=a1||'with q_main as ('||chr(10)|| -'select sum(res.passes) PASS'||chr(10)|| -' ,sum(res.failures) FAIL'||chr(10)|| -' ,sum(res.errors) ERR'||chr(10)|| -' from wt_test_runs tr'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = tr.id'||chr(10)|| -' where ( :P1_OWNER is NULL'||chr(10)|| -' or :P1_OWNER = tr.runner_owner )'||chr(10)|| -' and tr.is_last_run = wtplsql.get_last_run_flag'||chr(10)|| -'), q1 as ('||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,''PASS'' LABEL'||chr(10)|| -' ,pass '; - -a1:=a1||' VALUE'||chr(10)|| -' from q_main'||chr(10)|| -'union all'||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,''FAIL'' LABEL'||chr(10)|| -' ,fail VALUE'||chr(10)|| -' from q_main'||chr(10)|| -'union all'||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,''ERR'' LABEL'||chr(10)|| -' ,err VALUE'||chr(10)|| -' from q_main'||chr(10)|| -')'||chr(10)|| -'select link, label, value'||chr(10)|| -' from q1'||chr(10)|| -' order by label desc'; - -wwv_flow_api.create_flash_chart5_series( - p_id => 4854410354566693+wwv_flow_api.g_id_offset, - p_chart_id => 4854324865566692+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_series_seq =>10, - p_series_name =>'Series 1', - p_series_query => a1, - p_series_type =>'', - p_series_query_type =>'SQL_QUERY', - p_series_query_parse_opt =>'PARSE_CHART_QUERY', - p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>15, - p_action_link =>'', - p_show_action_link =>'N', - p_action_link_checksum_type =>''); -end; -/ -declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; -begin -s:=s||''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -'#CHART_REFRESH#'; - -wwv_flow_api.create_page_plug ( - p_id=> 4855306596029607 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 1, - p_plug_name=> 'DBOUT Profiles Status Summary', - p_region_name=>'', - p_plug_template=> 4840201642414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 13, - p_plug_display_column=> 3, - p_plug_display_point=> 'BEFORE_BOX_BODY', - p_plug_source=> s, - p_plug_source_type=> 'FLASH_CHART5', - p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', - p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'COLON_DELMITED_LIST', - p_plug_query_row_count_max => 500, - p_plug_display_condition_type => '', - p_plug_display_when_condition => ':P1_NUM_RUNNERS > 0', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); -end; -/ -declare - a1 varchar2(32767) := null; -begin -a1 := null; -wwv_flow_api.create_flash_chart5( - p_id => 4855509614029610+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id => 1, - p_region_id => 4855306596029607+wwv_flow_api.g_id_offset, - p_default_chart_type =>'2DPie', - p_chart_title =>'', - p_chart_name =>'chart_4854324865566692', - p_chart_width =>300, - p_chart_height =>150, - p_chart_animation =>'N', - p_display_attr =>':H:::::Left::V:Y:None:::N:::Default', - p_dial_tick_attr =>':::::::::::', - p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', - p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', - p_map_source =>'%', - p_margins =>':::', - p_omit_label_interval => null, - p_bgtype =>'Trans', - p_bgcolor1 =>'', - p_bgcolor2 =>'', - p_gradient_rotation =>null, - p_grid_bgtype =>'', - p_grid_bgcolor1 =>'', - p_grid_bgcolor2 =>'', - p_grid_gradient_rotation =>null, - p_color_scheme =>'0', - p_custom_colors =>'#0099FF,#99FF99,#FF6699,#FFFF99', - p_map_undef_color_scheme =>'', - p_map_undef_custom_colors =>'', - p_x_axis_title =>'', - p_x_axis_min =>null, - p_x_axis_max =>null, - p_x_axis_decimal_place =>null, - p_x_axis_prefix =>'', - p_x_axis_postfix =>'', - p_x_axis_label_rotation =>'', - p_x_axis_label_font =>'::', - p_x_axis_major_interval =>null, - p_x_axis_minor_interval =>null, - p_y_axis_title =>'', - p_y_axis_min =>null, - p_y_axis_max =>null, - p_y_axis_decimal_place =>null, - p_y_axis_prefix =>'', - p_y_axis_postfix =>'', - p_y_axis_label_rotation =>'', - p_y_axis_label_font =>'::', - p_y_axis_major_interval =>null, - p_y_axis_minor_interval =>null, - p_async_update =>'N', - p_async_time =>null, - p_legend_title =>'', - p_legend_title_font =>'', - p_names_font => null, - p_names_rotation => null, - p_values_font =>'Arial:10:#000000', - p_values_rotation =>null, - p_values_prefix =>'', - p_values_postfix =>'', - p_hints_font =>'Tahoma:10:#000000', - p_legend_font =>'Arial:10:#000000', - p_grid_labels_font =>'', - p_chart_title_font =>'Tahoma:14:#000000', - p_x_axis_title_font =>'Tahoma:14:', - p_x_axis_title_rotation =>'', - p_y_axis_title_font =>'Tahoma:14:', - p_y_axis_title_rotation =>'', - p_gauge_labels_font =>'Tahoma:10:', - p_use_chart_xml =>'N', - p_chart_xml => a1); -end; -/ -declare - a1 varchar2(32767) := null; -begin -a1:=a1||'with q_main as ('||chr(10)|| -'select sum(res.excluded_lines) EXCL'||chr(10)|| -' ,sum(res.executed_lines) EXEC'||chr(10)|| -' ,sum(res.notexec_lines) NOTX'||chr(10)|| -' ,sum(res.unknown_lines) UNKN'||chr(10)|| -' from wt_test_runs tr'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = tr.id'||chr(10)|| -' where ( :P1_OWNER is NULL'||chr(10)|| -' or :P1_OWNER = runner_owner )'||chr(10)|| -' and is_last_run = wtplsql.get_last_run_flag'||chr(10)|| -'), q1 as ('||chr(10)|| -'select '; - -a1:=a1||'NULL LINK'||chr(10)|| -' ,''EXCL'' LABEL'||chr(10)|| -' ,excl VALUE'||chr(10)|| -' from q_main'||chr(10)|| -'union all'||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,''EXEC'' LABEL'||chr(10)|| -' ,exec VALUE'||chr(10)|| -' from q_main'||chr(10)|| -'union all'||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,''NOTX'' LABEL'||chr(10)|| -' ,notx VALUE'||chr(10)|| -' from q_main'||chr(10)|| -'union all'||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,''UNKN'' LABEL'||chr(10)|| -' ,unkn VALUE'||chr(10)|| -' from q_main'||chr(10)|| -')'||chr(10)|| -'select link, label, value'||chr(10)|| -' from q1'||chr(10)|| -' order by label'; - -wwv_flow_api.create_flash_chart5_series( - p_id => 4855610331029611+wwv_flow_api.g_id_offset, - p_chart_id => 4855509614029610+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_series_seq =>10, - p_series_name =>'Series 1', - p_series_query => a1, - p_series_type =>'', - p_series_query_type =>'SQL_QUERY', - p_series_query_parse_opt =>'PARSE_CHART_QUERY', - p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>15, - p_action_link =>'', - p_show_action_link =>'N', - p_action_link_checksum_type =>''); -end; -/ -declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; -begin -s:=s||''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -'#CHART_REFRESH#'; - -wwv_flow_api.create_page_plug ( - p_id=> 4857720139336331 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 1, - p_plug_name=> 'Top Test Runner Failures', - p_region_name=>'', - p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 32, - p_plug_display_column=> 2, - p_plug_display_point=> 'BEFORE_SHOW_ITEMS', - p_plug_source=> s, - p_plug_source_type=> 'FLASH_CHART5', - p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', - p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'COLON_DELMITED_LIST', - p_plug_query_row_count_max => 500, - p_plug_display_condition_type => '', - p_plug_display_when_condition => ':P1_NUM_RUNNERS > 0', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); -end; -/ -declare - a1 varchar2(32767) := null; -begin -a1 := null; -wwv_flow_api.create_flash_chart5( - p_id => 4857903544336332+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id => 1, - p_region_id => 4857720139336331+wwv_flow_api.g_id_offset, - p_default_chart_type =>'2DColumn', - p_chart_title =>'', - p_chart_name =>'chart_4857903544336332', - p_chart_width =>300, - p_chart_height =>150, - p_chart_animation =>'N', - p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', - p_dial_tick_attr =>':::::::::::', - p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', - p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', - p_map_source =>'%', - p_margins =>':::', - p_omit_label_interval => null, - p_bgtype =>'Trans', - p_bgcolor1 =>'', - p_bgcolor2 =>'', - p_gradient_rotation =>null, - p_grid_bgtype =>'', - p_grid_bgcolor1 =>'', - p_grid_bgcolor2 =>'', - p_grid_gradient_rotation =>null, - p_color_scheme =>'0', - p_custom_colors =>'#FFFF00', - p_map_undef_color_scheme =>'', - p_map_undef_custom_colors =>'', - p_x_axis_title =>'', - p_x_axis_min =>null, - p_x_axis_max =>null, - p_x_axis_decimal_place =>null, - p_x_axis_prefix =>'', - p_x_axis_postfix =>'', - p_x_axis_label_rotation =>'', - p_x_axis_label_font =>'Tahoma:10:#000000', - p_x_axis_major_interval =>null, - p_x_axis_minor_interval =>null, - p_y_axis_title =>'Failures', - p_y_axis_min =>null, - p_y_axis_max =>null, - p_y_axis_decimal_place =>null, - p_y_axis_prefix =>'', - p_y_axis_postfix =>'', - p_y_axis_label_rotation =>'', - p_y_axis_label_font =>'Tahoma:10:#000000', - p_y_axis_major_interval =>null, - p_y_axis_minor_interval =>null, - p_async_update =>'N', - p_async_time =>null, - p_legend_title =>'', - p_legend_title_font =>'', - p_names_font => null, - p_names_rotation => null, - p_values_font =>'Arial:10:#000000', - p_values_rotation =>90, - p_values_prefix =>'', - p_values_postfix =>'', - p_hints_font =>'Tahoma:10:#000000', - p_legend_font =>'Arial:10:#000000', - p_grid_labels_font =>'', - p_chart_title_font =>'Tahoma:14:#000000', - p_x_axis_title_font =>'Tahoma:14:#000000', - p_x_axis_title_rotation =>'', - p_y_axis_title_font =>'Tahoma:14:#000000', - p_y_axis_title_rotation =>'', - p_gauge_labels_font =>'Tahoma:10:', - p_use_chart_xml =>'N', - p_chart_xml => a1); -end; -/ -declare - a1 varchar2(32767) := null; -begin -a1:=a1||'select tr.id LINK'||chr(10)|| -' ,tr.runner_owner || ''.'' ||'||chr(10)|| -' tr.runner_name LABEL'||chr(10)|| -' ,res.failures VALUE'||chr(10)|| -' from wt_test_runs tr'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = tr.id'||chr(10)|| -' and res.failures > 0'||chr(10)|| -' where ( :P1_OWNER is NULL'||chr(10)|| -' or :P1_OWNER = tr.runner_owner )'||chr(10)|| -' and tr.is_last_run = wtplsql.get_l'; - -a1:=a1||'ast_run_flag'||chr(10)|| -' order by res.failures desc, LABEL'||chr(10)|| -''; - -wwv_flow_api.create_flash_chart5_series( - p_id => 4858000738336332+wwv_flow_api.g_id_offset, - p_chart_id => 4857903544336332+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_series_seq =>10, - p_series_name =>'Series 1', - p_series_query => a1, - p_series_type =>'Bar', - p_series_query_type =>'SQL_QUERY', - p_series_query_parse_opt =>'PARSE_CHART_QUERY', - p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>10, - p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', - p_show_action_link =>'C', - p_action_link_checksum_type =>''); -end; -/ -declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; -begin -s:=s||''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -'#CHART_REFRESH#'; - -wwv_flow_api.create_page_plug ( - p_id=> 4858315631526698 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 1, - p_plug_name=> 'Top Test Runner Durations', - p_region_name=>'', - p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 42, - p_plug_display_column=> 2, - p_plug_display_point=> 'BEFORE_SHOW_ITEMS', - p_plug_source=> s, - p_plug_source_type=> 'FLASH_CHART5', - p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', - p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'COLON_DELMITED_LIST', - p_plug_query_row_count_max => 500, - p_plug_display_condition_type => '', - p_plug_display_when_condition => ':P1_NUM_RUNNERS > 0', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); -end; -/ -declare - a1 varchar2(32767) := null; -begin -a1 := null; -wwv_flow_api.create_flash_chart5( - p_id => 4858521402526708+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id => 1, - p_region_id => 4858315631526698+wwv_flow_api.g_id_offset, - p_default_chart_type =>'2DColumn', - p_chart_title =>'', - p_chart_name =>'chart_4857903544336332', - p_chart_width =>300, - p_chart_height =>150, - p_chart_animation =>'N', - p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', - p_dial_tick_attr =>':::::::::::', - p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', - p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', - p_map_source =>'%', - p_margins =>':::', - p_omit_label_interval => null, - p_bgtype =>'Trans', - p_bgcolor1 =>'', - p_bgcolor2 =>'', - p_gradient_rotation =>null, - p_grid_bgtype =>'', - p_grid_bgcolor1 =>'', - p_grid_bgcolor2 =>'', - p_grid_gradient_rotation =>null, - p_color_scheme =>'0', - p_custom_colors =>'#3366FF', - p_map_undef_color_scheme =>'', - p_map_undef_custom_colors =>'', - p_x_axis_title =>'', - p_x_axis_min =>null, - p_x_axis_max =>null, - p_x_axis_decimal_place =>1, - p_x_axis_prefix =>'', - p_x_axis_postfix =>'', - p_x_axis_label_rotation =>'', - p_x_axis_label_font =>'Tahoma:10:#000000', - p_x_axis_major_interval =>null, - p_x_axis_minor_interval =>null, - p_y_axis_title =>'Seconds', - p_y_axis_min =>null, - p_y_axis_max =>null, - p_y_axis_decimal_place =>1, - p_y_axis_prefix =>'', - p_y_axis_postfix =>'', - p_y_axis_label_rotation =>'', - p_y_axis_label_font =>'Tahoma:10:#000000', - p_y_axis_major_interval =>null, - p_y_axis_minor_interval =>null, - p_async_update =>'N', - p_async_time =>null, - p_legend_title =>'', - p_legend_title_font =>'', - p_names_font => null, - p_names_rotation => null, - p_values_font =>'Arial:10:#000000', - p_values_rotation =>90, - p_values_prefix =>'', - p_values_postfix =>'', - p_hints_font =>'Tahoma:10:#000000', - p_legend_font =>'Arial:10:#000000', - p_grid_labels_font =>'', - p_chart_title_font =>'Tahoma:14:#000000', - p_x_axis_title_font =>'Tahoma:14:#000000', - p_x_axis_title_rotation =>'', - p_y_axis_title_font =>'Tahoma:14:#000000', - p_y_axis_title_rotation =>'', - p_gauge_labels_font =>'Tahoma:10:', - p_use_chart_xml =>'N', - p_chart_xml => a1); -end; -/ -declare - a1 varchar2(32767) := null; -begin -a1:=a1||'select id LINK'||chr(10)|| -' ,runner_owner || ''.'' || runner_name LABEL'||chr(10)|| -' ,extract(day from (end_dtm - start_dtm)*86400*100)/100'||chr(10)|| -' VALUE'||chr(10)|| -' from wt_test_runs'||chr(10)|| -' where is_last_run = wtplsql.get_last_run_flag'||chr(10)|| -' and extract(day from (end_dtm - start_dtm)*86400*100)/100 > 0'||chr(10)|| -' order by VALUE desc, LABEL'||chr(10)|| -''; - -wwv_flow_api.create_flash_chart5_series( - p_id => 4858612747526709+wwv_flow_api.g_id_offset, - p_chart_id => 4858521402526708+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_series_seq =>10, - p_series_name =>'Series 1', - p_series_query => a1, - p_series_type =>'Bar', - p_series_query_type =>'SQL_QUERY', - p_series_query_parse_opt =>'PARSE_CHART_QUERY', - p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>10, - p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', - p_show_action_link =>'C', - p_action_link_checksum_type =>''); -end; -/ -declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; -begin -s:=s||''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -'#CHART_REFRESH#'; - -wwv_flow_api.create_page_plug ( - p_id=> 4859830202458220 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 1, - p_plug_name=> 'Top Test Runner Age', - p_region_name=>'', - p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 41, - p_plug_display_column=> 1, - p_plug_display_point=> 'BEFORE_SHOW_ITEMS', - p_plug_source=> s, - p_plug_source_type=> 'FLASH_CHART5', - p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', - p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'COLON_DELMITED_LIST', - p_plug_query_row_count_max => 500, - p_plug_display_condition_type => '', - p_plug_display_when_condition => ':P1_NUM_RUNNERS > 0', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); -end; -/ -declare - a1 varchar2(32767) := null; -begin -a1 := null; -wwv_flow_api.create_flash_chart5( - p_id => 4860011375458221+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id => 1, - p_region_id => 4859830202458220+wwv_flow_api.g_id_offset, - p_default_chart_type =>'2DColumn', - p_chart_title =>'', - p_chart_name =>'chart_4857903544336332', - p_chart_width =>300, - p_chart_height =>150, - p_chart_animation =>'N', - p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', - p_dial_tick_attr =>':::::::::::', - p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', - p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', - p_map_source =>'%', - p_margins =>':::', - p_omit_label_interval => null, - p_bgtype =>'Trans', - p_bgcolor1 =>'', - p_bgcolor2 =>'', - p_gradient_rotation =>null, - p_grid_bgtype =>'', - p_grid_bgcolor1 =>'', - p_grid_bgcolor2 =>'', - p_grid_gradient_rotation =>null, - p_color_scheme =>'0', - p_custom_colors =>'#CCCCCC', - p_map_undef_color_scheme =>'', - p_map_undef_custom_colors =>'', - p_x_axis_title =>'', - p_x_axis_min =>null, - p_x_axis_max =>null, - p_x_axis_decimal_place =>1, - p_x_axis_prefix =>'', - p_x_axis_postfix =>'', - p_x_axis_label_rotation =>'', - p_x_axis_label_font =>'Tahoma:10:#000000', - p_x_axis_major_interval =>null, - p_x_axis_minor_interval =>null, - p_y_axis_title =>'Days', - p_y_axis_min =>null, - p_y_axis_max =>null, - p_y_axis_decimal_place =>1, - p_y_axis_prefix =>'', - p_y_axis_postfix =>'', - p_y_axis_label_rotation =>'', - p_y_axis_label_font =>'Tahoma:10:#000000', - p_y_axis_major_interval =>null, - p_y_axis_minor_interval =>null, - p_async_update =>'N', - p_async_time =>null, - p_legend_title =>'', - p_legend_title_font =>'', - p_names_font => null, - p_names_rotation => null, - p_values_font =>'Arial:10:#000000', - p_values_rotation =>90, - p_values_prefix =>'', - p_values_postfix =>'', - p_hints_font =>'Tahoma:10:#000000', - p_legend_font =>'Arial:10:#000000', - p_grid_labels_font =>'', - p_chart_title_font =>'Tahoma:14:#000000', - p_x_axis_title_font =>'Tahoma:14:#000000', - p_x_axis_title_rotation =>'', - p_y_axis_title_font =>'Tahoma:14:#000000', - p_y_axis_title_rotation =>'', - p_gauge_labels_font =>'Tahoma:10:', - p_use_chart_xml =>'N', - p_chart_xml => a1); -end; -/ -declare - a1 varchar2(32767) := null; -begin -a1:=a1||'select id LINK'||chr(10)|| -' ,runner_owner || ''.'' ||'||chr(10)|| -' runner_name LABEL'||chr(10)|| -' ,extract(day from (sysdate - start_dtm)*10)/10'||chr(10)|| -' VALUE'||chr(10)|| -' from wt_test_runs'||chr(10)|| -' where ( :P1_OWNER is NULL'||chr(10)|| -' or :P1_OWNER = runner_owner )'||chr(10)|| -' and is_last_run = wtplsql.get_last_run_flag'||chr(10)|| -' and start_dtm is not null'||chr(10)|| -' and extract(day from (sysd'; - -a1:=a1||'ate - start_dtm)*10)/10 > 0'||chr(10)|| -' order by VALUE desc, LABEL'||chr(10)|| -''; - -wwv_flow_api.create_flash_chart5_series( - p_id => 4860108666458221+wwv_flow_api.g_id_offset, - p_chart_id => 4860011375458221+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_series_seq =>10, - p_series_name =>'Series 1', - p_series_query => a1, - p_series_type =>'Bar', - p_series_query_type =>'SQL_QUERY', - p_series_query_parse_opt =>'PARSE_CHART_QUERY', - p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>10, - p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', - p_show_action_link =>'C', - p_action_link_checksum_type =>''); -end; -/ -declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; -begin -s:=s||''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -'#CHART_REFRESH#'; - -wwv_flow_api.create_page_plug ( - p_id=> 4860309181584610 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 1, - p_plug_name=> 'Top DBOUT NotExec Lines', - p_region_name=>'', - p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 33, - p_plug_display_column=> 3, - p_plug_display_point=> 'BEFORE_SHOW_ITEMS', - p_plug_source=> s, - p_plug_source_type=> 'FLASH_CHART5', - p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', - p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'COLON_DELMITED_LIST', - p_plug_query_row_count_max => 500, - p_plug_display_condition_type => '', - p_plug_display_when_condition => ':P1_NUM_DBOUTS > 0', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); -end; -/ -declare - a1 varchar2(32767) := null; -begin -a1 := null; -wwv_flow_api.create_flash_chart5( - p_id => 4860500924584610+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id => 1, - p_region_id => 4860309181584610+wwv_flow_api.g_id_offset, - p_default_chart_type =>'2DColumn', - p_chart_title =>'', - p_chart_name =>'chart_4857903544336332', - p_chart_width =>300, - p_chart_height =>150, - p_chart_animation =>'N', - p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', - p_dial_tick_attr =>':::::::::::', - p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', - p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', - p_map_source =>'%', - p_margins =>':::', - p_omit_label_interval => null, - p_bgtype =>'Trans', - p_bgcolor1 =>'', - p_bgcolor2 =>'', - p_gradient_rotation =>null, - p_grid_bgtype =>'', - p_grid_bgcolor1 =>'', - p_grid_bgcolor2 =>'', - p_grid_gradient_rotation =>null, - p_color_scheme =>'0', - p_custom_colors =>'#FF0066', - p_map_undef_color_scheme =>'', - p_map_undef_custom_colors =>'', - p_x_axis_title =>'', - p_x_axis_min =>null, - p_x_axis_max =>null, - p_x_axis_decimal_place =>null, - p_x_axis_prefix =>'', - p_x_axis_postfix =>'', - p_x_axis_label_rotation =>'', - p_x_axis_label_font =>'Tahoma:10:#000000', - p_x_axis_major_interval =>null, - p_x_axis_minor_interval =>null, - p_y_axis_title =>'Source Lines', - p_y_axis_min =>null, - p_y_axis_max =>null, - p_y_axis_decimal_place =>null, - p_y_axis_prefix =>'', - p_y_axis_postfix =>'', - p_y_axis_label_rotation =>'', - p_y_axis_label_font =>'Tahoma:10:#000000', - p_y_axis_major_interval =>null, - p_y_axis_minor_interval =>null, - p_async_update =>'N', - p_async_time =>null, - p_legend_title =>'', - p_legend_title_font =>'', - p_names_font => null, - p_names_rotation => null, - p_values_font =>'Arial:10:#000000', - p_values_rotation =>90, - p_values_prefix =>'', - p_values_postfix =>'', - p_hints_font =>'Tahoma:10:#000000', - p_legend_font =>'Arial:10:#000000', - p_grid_labels_font =>'', - p_chart_title_font =>'Tahoma:14:#000000', - p_x_axis_title_font =>'Tahoma:14:#000000', - p_x_axis_title_rotation =>'', - p_y_axis_title_font =>'Tahoma:14:#000000', - p_y_axis_title_rotation =>'', - p_gauge_labels_font =>'Tahoma:10:', - p_use_chart_xml =>'N', - p_chart_xml => a1); -end; -/ -declare - a1 varchar2(32767) := null; -begin -a1:=a1||'select run.id LINK'||chr(10)|| -' ,run.dbout_owner || ''.'' ||'||chr(10)|| -' run.dbout_name || ''('' ||'||chr(10)|| -' run.dbout_type || '')'' LABEL'||chr(10)|| -' ,res.notexec_lines VALUE'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' and res.notexec_lines > 0'||chr(10)|| -' where ( :P1_OWNER is NULL'||chr(10)|| -' or :P1_OWNER = run.runner_owner'; - -a1:=a1||' )'||chr(10)|| -' and run.is_last_run = wtplsql.get_last_run_flag'||chr(10)|| -' and run.dbout_name is not null'||chr(10)|| -' order by res.notexec_lines desc, LABEL'||chr(10)|| -''; - -wwv_flow_api.create_flash_chart5_series( - p_id => 4860628410584610+wwv_flow_api.g_id_offset, - p_chart_id => 4860500924584610+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_series_seq =>10, - p_series_name =>'Series 1', - p_series_query => a1, - p_series_type =>'Bar', - p_series_query_type =>'SQL_QUERY', - p_series_query_parse_opt =>'PARSE_CHART_QUERY', - p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>10, - p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', - p_show_action_link =>'C', - p_action_link_checksum_type =>''); -end; -/ -declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; -begin -s:=s||''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -'#CHART_REFRESH#'; - -wwv_flow_api.create_page_plug ( - p_id=> 4861210200133728 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 1, - p_plug_name=> 'Top Test Case Failures', - p_region_name=>'', - p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 31, - p_plug_display_column=> 1, - p_plug_display_point=> 'BEFORE_SHOW_ITEMS', - p_plug_source=> s, - p_plug_source_type=> 'FLASH_CHART5', - p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', - p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'COLON_DELMITED_LIST', - p_plug_query_row_count_max => 500, - p_plug_display_condition_type => '', - p_plug_display_when_condition => ':P1_NUM_RUNNERS > 0', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); -end; -/ -declare - a1 varchar2(32767) := null; -begin -a1 := null; -wwv_flow_api.create_flash_chart5( - p_id => 4861429150133729+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id => 1, - p_region_id => 4861210200133728+wwv_flow_api.g_id_offset, - p_default_chart_type =>'2DColumn', - p_chart_title =>'', - p_chart_name =>'chart_4857903544336332', - p_chart_width =>300, - p_chart_height =>150, - p_chart_animation =>'N', - p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', - p_dial_tick_attr =>':::::::::::', - p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', - p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', - p_map_source =>'%', - p_margins =>':::', - p_omit_label_interval => null, - p_bgtype =>'Trans', - p_bgcolor1 =>'', - p_bgcolor2 =>'', - p_gradient_rotation =>null, - p_grid_bgtype =>'', - p_grid_bgcolor1 =>'', - p_grid_bgcolor2 =>'', - p_grid_gradient_rotation =>null, - p_color_scheme =>'0', - p_custom_colors =>'#FFFF00', - p_map_undef_color_scheme =>'', - p_map_undef_custom_colors =>'', - p_x_axis_title =>'', - p_x_axis_min =>null, - p_x_axis_max =>null, - p_x_axis_decimal_place =>null, - p_x_axis_prefix =>'', - p_x_axis_postfix =>'', - p_x_axis_label_rotation =>'', - p_x_axis_label_font =>'Tahoma:10:#000000', - p_x_axis_major_interval =>null, - p_x_axis_minor_interval =>null, - p_y_axis_title =>'Failures', - p_y_axis_min =>null, - p_y_axis_max =>null, - p_y_axis_decimal_place =>null, - p_y_axis_prefix =>'', - p_y_axis_postfix =>'', - p_y_axis_label_rotation =>'', - p_y_axis_label_font =>'Tahoma:10:#000000', - p_y_axis_major_interval =>null, - p_y_axis_minor_interval =>null, - p_async_update =>'N', - p_async_time =>null, - p_legend_title =>'', - p_legend_title_font =>'', - p_names_font => null, - p_names_rotation => null, - p_values_font =>'Arial:10:#000000', - p_values_rotation =>90, - p_values_prefix =>'', - p_values_postfix =>'', - p_hints_font =>'Tahoma:10:#000000', - p_legend_font =>'Arial:10:#000000', - p_grid_labels_font =>'', - p_chart_title_font =>'Tahoma:14:#000000', - p_x_axis_title_font =>'Tahoma:14:#000000', - p_x_axis_title_rotation =>'', - p_y_axis_title_font =>'Tahoma:14:#000000', - p_y_axis_title_rotation =>'', - p_gauge_labels_font =>'Tahoma:10:', - p_use_chart_xml =>'N', - p_chart_xml => a1); -end; -/ -declare - a1 varchar2(32767) := null; -begin -a1:=a1||'select ''f?p='' || :APP_ID ||'||chr(10)|| -' '':'' || ''6'' || -- Page'||chr(10)|| -' '':'' || :APP_SESSION ||'||chr(10)|| -' '':'' || :REQUEST ||'||chr(10)|| -' '':'' || :DEBUG ||'||chr(10)|| -' '':'' || ''N'' || -- CLear Cache'||chr(10)|| -' '':'' || ''P6_TEST_RUN_ID'' || '','' ||'||chr(10)|| -' ''P6_TESTCASE_NAME'' || -- Item Names'||chr(10)|| -' '; - -a1:=a1||' '':'' || run.id || '','' ||'||chr(10)|| -' tc.testcase || -- Item Values'||chr(10)|| -' '':'' || V(''PRINTER_FRIENDLY'') LINK'||chr(10)|| -' ,run.runner_owner || ''.'' ||'||chr(10)|| -' run.runner_name || '':'' ||'||chr(10)|| -' tc.testcase LABEL'||chr(10)|| -' ,tc.failures VALUE'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_testcase_stats tc'||chr(10)|| -' on tc.test_run_'; - -a1:=a1||'id = run.id'||chr(10)|| -' and tc.failures > 0'||chr(10)|| -' where ( :P1_OWNER is NULL'||chr(10)|| -' or :P1_OWNER = runner_owner )'||chr(10)|| -' and is_last_run = wtplsql.get_last_run_flag'||chr(10)|| -' order by failures desc, TESTCASE'||chr(10)|| -''; - -wwv_flow_api.create_flash_chart5_series( - p_id => 4861511054133729+wwv_flow_api.g_id_offset, - p_chart_id => 4861429150133729+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_series_seq =>10, - p_series_name =>'Series 1', - p_series_query => a1, - p_series_type =>'Bar', - p_series_query_type =>'SQL_QUERY', - p_series_query_parse_opt =>'PARSE_CHART_QUERY', - p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>10, - p_action_link =>'', - p_show_action_link =>'N', - p_action_link_checksum_type =>''); -end; -/ -declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; -begin -s:=s||''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -'#CHART_REFRESH#'; - -wwv_flow_api.create_page_plug ( - p_id=> 4861614487144344 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 1, - p_plug_name=> 'Top DBOUT LineExec Times', - p_region_name=>'', - p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 43, - p_plug_display_column=> 3, - p_plug_display_point=> 'BEFORE_SHOW_ITEMS', - p_plug_source=> s, - p_plug_source_type=> 'FLASH_CHART5', - p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', - p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'COLON_DELMITED_LIST', - p_plug_query_row_count_max => 500, - p_plug_display_condition_type => '', - p_plug_display_when_condition => ':P1_NUM_RUNNERS > 0', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); -end; -/ -declare - a1 varchar2(32767) := null; -begin -a1 := null; -wwv_flow_api.create_flash_chart5( - p_id => 4861806074144344+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id => 1, - p_region_id => 4861614487144344+wwv_flow_api.g_id_offset, - p_default_chart_type =>'2DColumn', - p_chart_title =>'', - p_chart_name =>'chart_4857903544336332', - p_chart_width =>300, - p_chart_height =>150, - p_chart_animation =>'N', - p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', - p_dial_tick_attr =>':::::::::::', - p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', - p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', - p_map_source =>'%', - p_margins =>':::', - p_omit_label_interval => null, - p_bgtype =>'Trans', - p_bgcolor1 =>'', - p_bgcolor2 =>'', - p_gradient_rotation =>null, - p_grid_bgtype =>'', - p_grid_bgcolor1 =>'', - p_grid_bgcolor2 =>'', - p_grid_gradient_rotation =>null, - p_color_scheme =>'0', - p_custom_colors =>'#3366FF', - p_map_undef_color_scheme =>'', - p_map_undef_custom_colors =>'', - p_x_axis_title =>'', - p_x_axis_min =>null, - p_x_axis_max =>null, - p_x_axis_decimal_place =>null, - p_x_axis_prefix =>'', - p_x_axis_postfix =>'', - p_x_axis_label_rotation =>'', - p_x_axis_label_font =>'Tahoma:10:#000000', - p_x_axis_major_interval =>null, - p_x_axis_minor_interval =>null, - p_y_axis_title =>'Milliseconds', - p_y_axis_min =>null, - p_y_axis_max =>null, - p_y_axis_decimal_place =>null, - p_y_axis_prefix =>'', - p_y_axis_postfix =>'', - p_y_axis_label_rotation =>'', - p_y_axis_label_font =>'Tahoma:10:#000000', - p_y_axis_major_interval =>null, - p_y_axis_minor_interval =>null, - p_async_update =>'N', - p_async_time =>null, - p_legend_title =>'', - p_legend_title_font =>'', - p_names_font => null, - p_names_rotation => null, - p_values_font =>'Arial:10:#000000', - p_values_rotation =>90, - p_values_prefix =>'', - p_values_postfix =>'', - p_hints_font =>'Tahoma:10:#000000', - p_legend_font =>'Arial:10:#000000', - p_grid_labels_font =>'', - p_chart_title_font =>'Tahoma:14:#000000', - p_x_axis_title_font =>'Tahoma:14:#000000', - p_x_axis_title_rotation =>'', - p_y_axis_title_font =>'Tahoma:14:#000000', - p_y_axis_title_rotation =>'', - p_gauge_labels_font =>'Tahoma:10:', - p_use_chart_xml =>'N', - p_chart_xml => a1); -end; -/ -declare - a1 varchar2(32767) := null; -begin -a1:=a1||'select res.test_run_id LINK'||chr(10)|| -' ,run.dbout_owner || ''.'' ||'||chr(10)|| -' run.dbout_name || ''('' ||'||chr(10)|| -' run.dbout_type || '')'' LABEL'||chr(10)|| -' ,res.max_executed_usecs/1000 VALUE'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' and res.max_executed_usecs > 0'||chr(10)|| -' where ( :P1_OWNER is NULL'||chr(10)|| -' or :P1_OW'; - -a1:=a1||'NER = run.runner_owner )'||chr(10)|| -' and run.is_last_run = wtplsql.get_last_run_flag'||chr(10)|| -' order by VALUE desc, LABEL'||chr(10)|| -''; - -wwv_flow_api.create_flash_chart5_series( - p_id => 4861925325144344+wwv_flow_api.g_id_offset, - p_chart_id => 4861806074144344+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_series_seq =>10, - p_series_name =>'Series 1', - p_series_query => a1, - p_series_type =>'Bar', - p_series_query_type =>'SQL_QUERY', - p_series_query_parse_opt =>'PARSE_CHART_QUERY', - p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>10, - p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', - p_show_action_link =>'C', - p_action_link_checksum_type =>''); -end; -/ -declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; -begin -s:=s||'select log_id'||chr(10)|| -' ,start_date'||chr(10)|| -' ,job_name'||chr(10)|| -' ,status'||chr(10)|| -' ,inst'||chr(10)|| -' ,session_id'||chr(10)|| -' ,os_pid'||chr(10)|| -' ,error_num'||chr(10)|| -' ,additional_info'||chr(10)|| -' from wt_scheduler_jobs'||chr(10)|| -' where status != ''SUCCEEDED'''||chr(10)|| -' and ( :P1_OWNER is null'||chr(10)|| -' or job_name like :P1_OWNER || ''$%'' )'; - -wwv_flow_api.create_report_region ( - p_id=> 4868303731390297 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 1, - p_name=> 'Selected Test Runner Jobs', - p_region_name=>'', - p_template=> 4840201642414912+ wwv_flow_api.g_id_offset, - p_display_sequence=> 51, - p_report_attributes=>'style="color:#0088FF"', - p_display_column=> 1, - p_display_point=> 'AFTER_SHOW_ITEMS', - p_source=> s, - p_source_type=> 'SQL_QUERY', - p_display_error_message=> '#SQLERRM#', - p_plug_caching=> 'NOT_CACHED', - p_customized=> '0', - p_translate_title=> 'Y', - p_ajax_enabled=> 'Y', - p_query_row_template=> 4843113555414914+ wwv_flow_api.g_id_offset, - p_query_headings_type=> 'COLON_DELMITED_LIST', - p_query_num_rows=> '15', - p_query_options=> 'DERIVED_REPORT_COLUMNS', - p_query_show_nulls_as=> ' - ', - p_query_break_cols=> '0', - p_query_no_data_found=> 'no data found', - p_query_num_rows_type=> 'NEXT_PREVIOUS_LINKS', - p_pagination_display_position=> 'BOTTOM_LEFT', - p_csv_output=> 'N', - p_query_asc_image=> 'apex/builder/dup.gif', - p_query_asc_image_attr=> 'width="16" height="16" alt="" ', - p_query_desc_image=> 'apex/builder/ddown.gif', - p_query_desc_image_attr=> 'width="16" height="16" alt="" ', - p_plug_query_strip_html=> 'Y', - p_comment=>''); -end; -/ -declare - s varchar2(32767) := null; -begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 5037626427564981 + wwv_flow_api.g_id_offset, - p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 1, - p_form_element_id=> null, - p_column_alias=> 'LOG_ID', - p_column_display_sequence=> 1, - p_column_heading=> 'Log ID', - p_column_alignment=>'LEFT', - p_heading_alignment=>'CENTER', - p_default_sort_column_sequence=>1, - p_default_sort_dir=>'desc', - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'ESCAPE_SC', - p_is_required=> false, - p_pk_col_source=> s, - p_column_comment=>''); -end; -/ -declare - s varchar2(32767) := null; -begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 5039813342816631 + wwv_flow_api.g_id_offset, - p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 2, - p_form_element_id=> null, - p_column_alias=> 'START_DATE', - p_column_display_sequence=> 2, - p_column_heading=> 'Start Date', - p_column_alignment=>'LEFT', - p_heading_alignment=>'CENTER', - p_default_sort_column_sequence=>0, - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'ESCAPE_SC', - p_is_required=> false, - p_pk_col_source=> s, - p_column_comment=>''); -end; -/ -declare - s varchar2(32767) := null; -begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 5037901990564982 + wwv_flow_api.g_id_offset, - p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 3, - p_form_element_id=> null, - p_column_alias=> 'JOB_NAME', - p_column_display_sequence=> 3, - p_column_heading=> 'Job Name', - p_column_alignment=>'LEFT', - p_heading_alignment=>'CENTER', - p_default_sort_column_sequence=>0, - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'ESCAPE_SC', - p_is_required=> false, - p_pk_col_source=> s, - p_column_comment=>''); -end; -/ -declare - s varchar2(32767) := null; -begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 4881232628476372 + wwv_flow_api.g_id_offset, - p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 4, - p_form_element_id=> null, - p_column_alias=> 'STATUS', - p_column_display_sequence=> 4, - p_column_heading=> 'Status', - p_column_alignment=>'LEFT', - p_heading_alignment=>'CENTER', - p_default_sort_column_sequence=>0, - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'ESCAPE_SC', - p_is_required=> false, - p_pk_col_source=> s, - p_column_comment=>''); -end; -/ -declare - s varchar2(32767) := null; -begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 5038027139564982 + wwv_flow_api.g_id_offset, - p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 5, - p_form_element_id=> null, - p_column_alias=> 'INST', - p_column_display_sequence=> 5, - p_column_heading=> 'Inst', - p_column_alignment=>'LEFT', - p_heading_alignment=>'CENTER', - p_default_sort_column_sequence=>0, - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'ESCAPE_SC', - p_is_required=> false, - p_pk_col_source=> s, - p_column_comment=>''); -end; -/ -declare - s varchar2(32767) := null; -begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 5038112499564982 + wwv_flow_api.g_id_offset, - p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 6, - p_form_element_id=> null, - p_column_alias=> 'SESSION_ID', - p_column_display_sequence=> 6, - p_column_heading=> 'Session ID', - p_column_alignment=>'LEFT', - p_heading_alignment=>'CENTER', - p_default_sort_column_sequence=>0, - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'ESCAPE_SC', - p_is_required=> false, - p_pk_col_source=> s, - p_column_comment=>''); -end; -/ -declare - s varchar2(32767) := null; -begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 5039922124816631 + wwv_flow_api.g_id_offset, - p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 7, - p_form_element_id=> null, - p_column_alias=> 'OS_PID', - p_column_display_sequence=> 7, - p_column_heading=> 'OS PID', - p_column_alignment=>'LEFT', - p_heading_alignment=>'CENTER', - p_default_sort_column_sequence=>0, - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'ESCAPE_SC', - p_is_required=> false, - p_pk_col_source=> s, - p_column_comment=>''); -end; -/ -declare - s varchar2(32767) := null; -begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 5040017675816631 + wwv_flow_api.g_id_offset, - p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 8, - p_form_element_id=> null, - p_column_alias=> 'ERROR_NUM', - p_column_display_sequence=> 8, - p_column_heading=> 'Error Num', - p_column_alignment=>'LEFT', - p_heading_alignment=>'CENTER', - p_default_sort_column_sequence=>0, - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'ESCAPE_SC', - p_is_required=> false, - p_pk_col_source=> s, - p_column_comment=>''); -end; -/ -declare - s varchar2(32767) := null; -begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 5038421217564982 + wwv_flow_api.g_id_offset, - p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 9, - p_form_element_id=> null, - p_column_alias=> 'ADDITIONAL_INFO', - p_column_display_sequence=> 9, - p_column_heading=> 'Additional Info', - p_column_alignment=>'LEFT', - p_heading_alignment=>'CENTER', - p_default_sort_column_sequence=>0, - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'ESCAPE_SC', - p_is_required=> false, - p_pk_col_source=> s, - p_column_comment=>''); -end; -/ -declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; -begin -s:=s||'select id'||chr(10)|| -' ,runner_owner || ''.'' ||'||chr(10)|| -' runner_name TEST_RUNNER'||chr(10)|| -' ,dbout_owner || ''.'' ||'||chr(10)|| -' dbout_name || ''('' ||'||chr(10)|| -' dbout_type || '')'' DBOUT_PROFILED'||chr(10)|| -' ,start_dtm'||chr(10)|| -' ,error_message'||chr(10)|| -' from wt_test_runs'||chr(10)|| -' where ( :P1_OWNER is NULL'||chr(10)|| -' or :P1_OWNER = runner_owner )'||chr(10)|| -' and is_last_run = wtplsql.get_last_run_flag'||chr(10)|| -' and error_message is not null'; - -wwv_flow_api.create_report_region ( - p_id=> 4869425043509942 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 1, - p_name=> 'Test Runner Errors', - p_region_name=>'', - p_template=> 4840201642414912+ wwv_flow_api.g_id_offset, - p_display_sequence=> 52, - p_report_attributes=>'style="color:#FF0000"', - p_display_column=> 1, - p_display_point=> 'AFTER_SHOW_ITEMS', - p_source=> s, - p_source_type=> 'SQL_QUERY', - p_display_error_message=> '#SQLERRM#', - p_plug_caching=> 'NOT_CACHED', - p_customized=> '0', - p_translate_title=> 'Y', - p_ajax_enabled=> 'Y', - p_query_row_template=> 4843113555414914+ wwv_flow_api.g_id_offset, - p_query_headings_type=> 'COLON_DELMITED_LIST', - p_query_num_rows=> '15', - p_query_options=> 'DERIVED_REPORT_COLUMNS', - p_query_show_nulls_as=> ' - ', - p_query_break_cols=> '0', - p_query_no_data_found=> 'no data found', - p_query_num_rows_type=> 'NEXT_PREVIOUS_LINKS', - p_pagination_display_position=> 'BOTTOM_LEFT', - p_csv_output=> 'N', - p_prn_output=> 'N', - p_prn_format=> 'PDF', - p_prn_output_show_link=> 'Y', - p_prn_output_link_text=> 'Print', - p_prn_content_disposition=> 'ATTACHMENT', - p_prn_document_header=> 'APEX', - p_prn_units=> 'INCHES', - p_prn_paper_size=> 'LETTER', - p_prn_width_units=> 'PERCENTAGE', - p_prn_width=> 11, - p_prn_height=> 8.5, - p_prn_orientation=> 'HORIZONTAL', - p_prn_page_header_font_color=> '#000000', - p_prn_page_header_font_family=> 'Helvetica', - p_prn_page_header_font_weight=> 'normal', - p_prn_page_header_font_size=> '12', - p_prn_page_footer_font_color=> '#000000', - p_prn_page_footer_font_family=> 'Helvetica', - p_prn_page_footer_font_weight=> 'normal', - p_prn_page_footer_font_size=> '12', - p_prn_header_bg_color=> '#9bafde', - p_prn_header_font_color=> '#ffffff', - p_prn_header_font_family=> 'Helvetica', - p_prn_header_font_weight=> 'normal', - p_prn_header_font_size=> '10', - p_prn_body_bg_color=> '#efefef', - p_prn_body_font_color=> '#000000', - p_prn_body_font_family=> 'Helvetica', - p_prn_body_font_weight=> 'normal', - p_prn_body_font_size=> '10', - p_prn_border_width=> .5, - p_prn_page_header_alignment=> 'CENTER', - p_prn_page_footer_alignment=> 'CENTER', - p_query_asc_image=> 'apex/builder/dup.gif', - p_query_asc_image_attr=> 'width="16" height="16" alt="" ', - p_query_desc_image=> 'apex/builder/ddown.gif', - p_query_desc_image_attr=> 'width="16" height="16" alt="" ', - p_plug_query_strip_html=> 'Y', - p_comment=>''); -end; -/ - --- maintain plug_column_width attribute for 2.2 and greater -begin -execute immediate 'begin wwv_flow_api.set_region_column_width ( - p_id=>4869425043509942 + wwv_flow_api.g_id_offset, - p_flow_id=>wwv_flow.g_flow_id, - p_page_id=>1, - p_plug_column_width=>''style="color:red"''); end;'; -exception when others then null; -end; -/ - -declare - s varchar2(32767) := null; -begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 4871606819864244 + wwv_flow_api.g_id_offset, - p_region_id=> 4869425043509942 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 1, - p_form_element_id=> null, - p_column_alias=> 'ID', - p_column_display_sequence=> 1, - p_column_heading=> 'Test Run ID', - p_column_link=>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#ID#', - p_column_linktext=>'#ID#', - p_column_alignment=>'LEFT', - p_heading_alignment=>'RIGHT', - p_default_sort_column_sequence=>1, - p_default_sort_dir=>'desc', - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'ESCAPE_SC', - p_lov_show_nulls=> 'NO', - p_is_required=> false, - p_pk_col_source=> s, - p_lov_display_extra=> 'YES', - p_include_in_export=> 'Y', - p_print_col_width=> '20', - p_column_comment=>''); -end; -/ -declare - s varchar2(32767) := null; -begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 4869808842509943 + wwv_flow_api.g_id_offset, - p_region_id=> 4869425043509942 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 2, - p_form_element_id=> null, - p_column_alias=> 'TEST_RUNNER', - p_column_display_sequence=> 2, - p_column_heading=> 'Test Runner Package', - p_column_alignment=>'LEFT', - p_heading_alignment=>'LEFT', - p_default_sort_column_sequence=>0, - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'ESCAPE_SC', - p_lov_show_nulls=> 'NO', - p_is_required=> false, - p_pk_col_source=> s, - p_lov_display_extra=> 'YES', - p_include_in_export=> 'Y', - p_print_col_width=> '20', - p_column_comment=>''); -end; -/ -declare - s varchar2(32767) := null; -begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 4869907123509943 + wwv_flow_api.g_id_offset, - p_region_id=> 4869425043509942 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 3, - p_form_element_id=> null, - p_column_alias=> 'DBOUT_PROFILED', - p_column_display_sequence=> 3, - p_column_heading=> 'DB Object Under Test', - p_column_alignment=>'LEFT', - p_default_sort_column_sequence=>0, - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'ESCAPE_SC', - p_is_required=> false, - p_pk_col_source=> s, - p_include_in_export=> 'Y', - p_print_col_width=> '20', - p_column_comment=>''); -end; -/ -declare - s varchar2(32767) := null; -begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 4870003732509943 + wwv_flow_api.g_id_offset, - p_region_id=> 4869425043509942 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 4, - p_form_element_id=> null, - p_column_alias=> 'START_DTM', - p_column_display_sequence=> 4, - p_column_heading=> 'Start Date/Time', - p_column_alignment=>'LEFT', - p_default_sort_column_sequence=>0, - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'ESCAPE_SC', - p_is_required=> false, - p_pk_col_source=> s, - p_include_in_export=> 'Y', - p_print_col_width=> '20', - p_column_comment=>''); -end; -/ -declare - s varchar2(32767) := null; -begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 4870105383509943 + wwv_flow_api.g_id_offset, - p_region_id=> 4869425043509942 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 5, - p_form_element_id=> null, - p_column_alias=> 'ERROR_MESSAGE', - p_column_display_sequence=> 5, - p_column_heading=> 'Error Message', - p_column_alignment=>'LEFT', - p_default_sort_column_sequence=>0, - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'ESCAPE_SC', - p_is_required=> false, - p_pk_col_source=> s, - p_include_in_export=> 'Y', - p_print_col_width=> '20', - p_column_comment=>''); -end; -/ - -begin - -null; - -end; -/ - - -begin - -wwv_flow_api.create_page_branch( - p_id=>4852128982276097 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 1, - p_branch_action=> 'f?p=&FLOW_ID.:1:&SESSION.', - p_branch_point=> 'AFTER_PROCESSING', - p_branch_type=> 'REDIRECT_URL', - p_branch_sequence=> 99, - p_save_state_before_branch_yn=>'Y', - p_branch_comment=> ''); - - -end; -/ - -declare - h varchar2(32767) := null; -begin -wwv_flow_api.create_page_item( - p_id=>4851514010066641 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 1, - p_name=>'P1_OWNER', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 10, - p_item_plug_id => 4846907308414925+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Test Runner Owner:', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_POPUP_LOV', - p_lov=> 'select runner_owner DISPLAY'||chr(10)|| -' ,runner_owner VALUE'||chr(10)|| -' from wt_test_runs'||chr(10)|| -' group by runner_owner'||chr(10)|| -' order by runner_owner', - p_lov_display_null=> 'YES', - p_lov_translated=> 'N', - p_lov_null_text=>'All Owners', - p_lov_null_value=> '', - p_cSize=> 20, - p_cMaxlength=> 128, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843706770414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'NO', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'ENTERABLE', - p_attribute_02 => 'FIRST_ROWSET', - p_show_quick_picks=>'N', - p_item_comment => ''); - - -end; -/ - -declare - h varchar2(32767) := null; -begin -wwv_flow_api.create_page_item( - p_id=>4852421357324186 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 1, - p_name=>'P1_NUM_RUNNERS', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 30, - p_item_plug_id => 4846907308414925+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'NO', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Test Runners:', - p_source=>'with q1 as ('||chr(10)|| -'select runner_owner, runner_name'||chr(10)|| -' from wt_test_runs'||chr(10)|| -' where :P1_OWNER is NULL'||chr(10)|| -' or :P1_OWNER = runner_owner'||chr(10)|| -' group by runner_owner, runner_name'||chr(10)|| -')'||chr(10)|| -'select count(*) from q1', - p_source_type=> 'QUERY', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'Y', - p_show_quick_picks=>'N', - p_item_comment => ''); - - -end; -/ - -declare - h varchar2(32767) := null; -begin -wwv_flow_api.create_page_item( - p_id=>4852904959385757 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 1, - p_name=>'P1_NUM_DBOUTS', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 40, - p_item_plug_id => 4846907308414925+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Named DBOUTs:', - p_source=>'with q1 as ('||chr(10)|| -'select dbout_owner, dbout_name, dbout_type'||chr(10)|| -' from wt_test_runs'||chr(10)|| -' where :P1_OWNER is NULL'||chr(10)|| -' or :P1_OWNER = runner_owner'||chr(10)|| -' group by dbout_owner, dbout_name, dbout_type'||chr(10)|| -')'||chr(10)|| -'select count(*) from q1', - p_source_type=> 'QUERY', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'Y', - p_show_quick_picks=>'N', - p_item_comment => ''); - - -end; -/ - -declare - h varchar2(32767) := null; -begin -wwv_flow_api.create_page_item( - p_id=>4853512324444641 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 1, - p_name=>'P1_NUM_CASES', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 50, - p_item_plug_id => 4846907308414925+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Test Cases:', - p_source=>'with q1 as ('||chr(10)|| -'select runner_owner, runner_name, testcase'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_testcase_stats case'||chr(10)|| -' on case.test_run_id = run.id'||chr(10)|| -' where :P1_OWNER is NULL'||chr(10)|| -' or :P1_OWNER = runner_owner'||chr(10)|| -' group by runner_owner, runner_name, testcase'||chr(10)|| -')'||chr(10)|| -'select count(*) from q1', - p_source_type=> 'QUERY', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'Y', - p_show_quick_picks=>'N', - p_item_comment => ''); - - -end; -/ - -declare - h varchar2(32767) := null; -begin -wwv_flow_api.create_page_item( - p_id=>4929328361080445 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 1, - p_name=>'P1_SPACER_01', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 70, - p_item_plug_id => 4846907308414925+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>' ', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843706770414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'Y', - p_show_quick_picks=>'N', - p_item_comment => ''); - - -end; -/ - - -begin - -wwv_flow_api.create_page_da_event ( - p_id => 4928723466050705 + wwv_flow_api.g_id_offset - ,p_flow_id => wwv_flow.g_flow_id - ,p_page_id => 1 - ,p_name => 'Submit After LOV Change' - ,p_event_sequence => 10 - ,p_triggering_element_type => 'ITEM' - ,p_triggering_element => 'P1_OWNER' - ,p_bind_type => 'bind' - ,p_bind_event_type => 'change' - ); -wwv_flow_api.create_page_da_action ( - p_id => 4929031293050707 + wwv_flow_api.g_id_offset - ,p_flow_id => wwv_flow.g_flow_id - ,p_page_id => 1 - ,p_event_id => 4928723466050705 + wwv_flow_api.g_id_offset - ,p_event_result => 'TRUE' - ,p_action_sequence => 10 - ,p_execute_on_page_init => 'N' - ,p_action => 'NATIVE_SUBMIT_PAGE' - ,p_attribute_01 => 'REFRESH' - ,p_stop_execution_on_error => 'Y' - ); -null; - -end; -/ - - -begin - -declare - p varchar2(32767) := null; - l_clob clob; - l_length number := 1; -begin -p:=p||'begin'||chr(10)|| -' if :P1_OWNER = ''1st Time'''||chr(10)|| -' then'||chr(10)|| -' begin'||chr(10)|| -' select max(runner_owner)'||chr(10)|| -' into :P1_OWNER'||chr(10)|| -' from wt_test_runs'||chr(10)|| -' where runner_owner <= :APP_USER;'||chr(10)|| -' exception when NO_DATA_FOUND'||chr(10)|| -' then'||chr(10)|| -' begin'||chr(10)|| -' select min(runner_owner)'||chr(10)|| -' into :P1_OWNER'||chr(10)|| -' from wt_test_runs'||chr(10)|| -' where runner_owner >= :APP_USER;'||chr(10)|| -' '; - -p:=p||' exception when NO_DATA_FOUND'||chr(10)|| -' then'||chr(10)|| -' :P1_OWNER := NULL;'||chr(10)|| -' end;'||chr(10)|| -' end;'||chr(10)|| -' end if;'||chr(10)|| -'end;'; - -wwv_flow_api.create_page_process( - p_id => 4900928128520593 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id => 1, - p_process_sequence=> 10, - p_process_point=> 'BEFORE_HEADER', - p_process_type=> 'PLSQL', - p_process_name=> 'P1_INIT_OWNER', - p_process_sql_clob => p, - p_process_error_message=> '', - p_process_success_message=> '', - p_process_is_stateful_y_n=>'N', - p_process_comment=>''); -end; -null; - -end; -/ - - -begin - ---------------------------------------- --- ...updatable report columns for page 1 --- - -begin - -null; -end; -null; - -end; -/ - - ---application/pages/page_00002 -prompt ...PAGE 2: Run Test --- - -begin - -wwv_flow_api.create_page ( - p_flow_id => wwv_flow.g_flow_id - ,p_id => 2 - ,p_tab_set => 'TS1' - ,p_name => 'Run Test' - ,p_alias => 'RUNTEST' - ,p_step_title => 'Run Test' - ,p_allow_duplicate_submissions => 'Y' - ,p_step_sub_title => 'Run Test' - ,p_step_sub_title_type => 'TEXT_WITH_SUBSTITUTIONS' - ,p_first_item => 'AUTO_FIRST_ITEM' - ,p_include_apex_css_js_yn => 'Y' - ,p_autocomplete_on_off => 'ON' - ,p_page_is_public_y_n => 'N' - ,p_protection_level => 'N' - ,p_cache_page_yn => 'N' - ,p_cache_timeout_seconds => 21600 - ,p_cache_by_user_yn => 'N' - ,p_help_text => -'No help is available for this page.' - ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180731230050' - ); -null; - -end; -/ - -declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; -begin -s := null; -wwv_flow_api.create_page_plug ( - p_id=> 4847515458414925 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 2, - p_plug_name=> 'Run Test', - p_region_name=>'', - p_plug_template=> 4839912075414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 1, - p_plug_display_column=> 1, - p_plug_display_point=> 'BEFORE_SHOW_ITEMS', - p_plug_source=> s, - p_plug_source_type=> 'STATIC_TEXT', - p_translate_title=> 'Y', - p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'COLON_DELMITED_LIST', - p_plug_query_row_count_max => 500, - p_plug_display_condition_type => '', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); -end; -/ -declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; -begin -s:=s||'select log_id'||chr(10)|| -' ,start_date'||chr(10)|| -' ,job_name'||chr(10)|| -' ,status'||chr(10)|| -' ,inst'||chr(10)|| -' ,session_id'||chr(10)|| -' ,os_pid'||chr(10)|| -' ,error_num'||chr(10)|| -' ,additional_info'||chr(10)|| -' from wt_scheduler_jobs'||chr(10)|| -' where job_name like :APP_USER || ''$%'''; - -wwv_flow_api.create_page_plug ( - p_id=> 4885513244116318 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 2, - p_plug_name=> 'DBMS_SCHEDULER Jobs', - p_region_name=>'', - p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 4, - p_plug_display_column=> 1, - p_plug_display_point=> 'AFTER_SHOW_ITEMS', - p_plug_source=> s, - p_plug_source_type=> 'DYNAMIC_QUERY', - p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', - p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'COLON_DELMITED_LIST', - p_plug_query_show_nulls_as => ' - ', - p_plug_display_condition_type => '', - p_pagination_display_position=>'BOTTOM_RIGHT', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); -end; -/ -declare - a1 varchar2(32767) := null; -begin -a1:=a1||'select log_id'||chr(10)|| -' ,start_date'||chr(10)|| -' ,job_name'||chr(10)|| -' ,status'||chr(10)|| -' ,inst'||chr(10)|| -' ,session_id'||chr(10)|| -' ,os_pid'||chr(10)|| -' ,error_num'||chr(10)|| -' ,additional_info'||chr(10)|| -' from wt_scheduler_jobs'||chr(10)|| -' where job_name like :APP_USER || ''$%'''; - -wwv_flow_api.create_worksheet( - p_id=> 4885631457116318+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 2, - p_region_id=> 4885513244116318+wwv_flow_api.g_id_offset, - p_name=> 'List of APEX PLSQL Jobs', - p_folder_id=> null, - p_alias=> '', - p_report_id_item=> '', - p_max_row_count=> '10000', - p_max_row_count_message=> 'This query returns more than #MAX_ROW_COUNT# rows, please filter your data to ensure complete results.', - p_no_data_found_message=> 'No data found.', - p_max_rows_per_page=>'10', - p_search_button_label=>'', - p_page_items_to_submit=>'', - p_sort_asc_image=>'', - p_sort_asc_image_attr=>'', - p_sort_desc_image=>'', - p_sort_desc_image_attr=>'', - p_sql_query => a1, - p_status=>'AVAILABLE_FOR_OWNER', - p_allow_report_saving=>'Y', - p_allow_save_rpt_public=>'N', - p_allow_report_categories=>'N', - p_show_nulls_as=>'-', - p_pagination_type=>'ROWS_X_TO_Y', - p_pagination_display_pos=>'BOTTOM_LEFT', - p_show_finder_drop_down=>'Y', - p_show_display_row_count=>'N', - p_show_search_bar=>'Y', - p_show_search_textbox=>'Y', - p_show_actions_menu=>'Y', - p_report_list_mode=>'TABS', - p_show_detail_link=>'N', - p_show_select_columns=>'Y', - p_show_rows_per_page=>'Y', - p_show_filter=>'Y', - p_show_sort=>'Y', - p_show_control_break=>'Y', - p_show_highlight=>'Y', - p_show_computation=>'Y', - p_show_aggregate=>'Y', - p_show_chart=>'Y', - p_show_group_by=>'Y', - p_show_notify=>'N', - p_show_calendar=>'N', - p_show_flashback=>'Y', - p_show_reset=>'Y', - p_show_download=>'Y', - p_show_help=>'Y', - p_download_formats=>'CSV:HTML:EMAIL', - p_allow_exclude_null_values=>'N', - p_allow_hide_extra_columns=>'N', - p_icon_view_enabled_yn=>'N', - p_icon_view_columns_per_row=>1, - p_detail_view_enabled_yn=>'N', - p_owner=>'WTP'); -end; -/ -begin -wwv_flow_api.create_worksheet_column( - p_id => 5032410666172454+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 2, - p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, - p_db_column_name =>'LOG_ID', - p_display_order =>1, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'B', - p_column_label =>'Log ID', - p_report_label =>'Log ID', - p_sync_form_label =>'Y', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'NUMBER', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'CENTER', - p_column_alignment =>'RIGHT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); -end; -/ -begin -wwv_flow_api.create_worksheet_column( - p_id => 5039132211784254+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 2, - p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, - p_db_column_name =>'START_DATE', - p_display_order =>2, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'K', - p_column_label =>'Start Date', - p_report_label =>'Start Date', - p_sync_form_label =>'Y', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'DATE', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'CENTER', - p_column_alignment =>'LEFT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); -end; -/ -begin -wwv_flow_api.create_worksheet_column( - p_id => 5032729825172455+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 2, - p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, - p_db_column_name =>'JOB_NAME', - p_display_order =>3, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'E', - p_column_label =>'Job Name', - p_report_label =>'Job Name', - p_sync_form_label =>'Y', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'STRING', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'CENTER', - p_column_alignment =>'LEFT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); -end; -/ -begin -wwv_flow_api.create_worksheet_column( - p_id => 4885819894116324+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 2, - p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, - p_db_column_name =>'STATUS', - p_display_order =>4, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'A', - p_column_label =>'Status', - p_report_label =>'Status', - p_sync_form_label =>'Y', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'STRING', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'CENTER', - p_column_alignment =>'LEFT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); -end; -/ -begin -wwv_flow_api.create_worksheet_column( - p_id => 5039226462784262+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 2, - p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, - p_db_column_name =>'INST', - p_display_order =>5, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'L', - p_column_label =>'Inst', - p_report_label =>'Inst', - p_sync_form_label =>'Y', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'NUMBER', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'CENTER', - p_column_alignment =>'RIGHT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); -end; -/ -begin -wwv_flow_api.create_worksheet_column( - p_id => 5040419669875210+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 2, - p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, - p_db_column_name =>'SESSION_ID', - p_display_order =>6, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'O', - p_column_label =>'Session ID', - p_report_label =>'Session ID', - p_sync_form_label =>'Y', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'NUMBER', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'CENTER', - p_column_alignment =>'RIGHT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); -end; -/ -begin -wwv_flow_api.create_worksheet_column( - p_id => 5040526819875210+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 2, - p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, - p_db_column_name =>'OS_PID', - p_display_order =>7, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'P', - p_column_label =>'OS PID', - p_report_label =>'OS PID', - p_sync_form_label =>'Y', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'NUMBER', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'CENTER', - p_column_alignment =>'RIGHT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); -end; -/ -begin -wwv_flow_api.create_worksheet_column( - p_id => 5039401783784262+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 2, - p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, - p_db_column_name =>'ERROR_NUM', - p_display_order =>8, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'N', - p_column_label =>'Error Num', - p_report_label =>'Error Num', - p_sync_form_label =>'Y', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'NUMBER', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'CENTER', - p_column_alignment =>'RIGHT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); -end; -/ -begin -wwv_flow_api.create_worksheet_column( - p_id => 5033208190172456+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 2, - p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, - p_db_column_name =>'ADDITIONAL_INFO', - p_display_order =>9, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'J', - p_column_label =>'Additional Info', - p_report_label =>'Additional Info', - p_sync_form_label =>'Y', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'STRING', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'CENTER', - p_column_alignment =>'LEFT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); -end; -/ -declare - rc1 varchar2(32767) := null; -begin -rc1:=rc1||'LOG_ID:START_DATE:JOB_NAME:STATUS:INST:SESSION_ID:OS_PID:ERROR_NUM:ADDITIONAL_INFO'; - -wwv_flow_api.create_worksheet_rpt( - p_id => 4886308472128052+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 2, - p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, - p_session_id => null, - p_base_report_id => null+wwv_flow_api.g_id_offset, - p_application_user => 'APXWS_DEFAULT', - p_report_seq =>10, - p_report_alias =>'48864', - p_status =>'PUBLIC', - p_category_id =>null+wwv_flow_api.g_id_offset, - p_is_default =>'Y', - p_display_rows =>10, - p_report_columns =>rc1, - p_sort_column_1 =>'LOG_ID', - p_sort_direction_1 =>'DESC', - p_sort_column_2 =>'0', - p_sort_direction_2 =>'DESC', - p_sort_column_3 =>'0', - p_sort_direction_3 =>'ASC', - p_sort_column_4 =>'0', - p_sort_direction_4 =>'ASC', - p_sort_column_5 =>'0', - p_sort_direction_5 =>'ASC', - p_sort_column_6 =>'0', - p_sort_direction_6 =>'ASC', - p_flashback_enabled =>'N', - p_calendar_display_column =>''); -end; -/ -begin -wwv_flow_api.create_worksheet_condition( - p_id => 5039623254809995+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 2, - p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, - p_report_id => 4886308472128052+wwv_flow_api.g_id_offset, - p_condition_type =>'FILTER', - p_allow_delete =>'Y', - p_column_name =>'STATUS', - p_operator =>'=', - p_expr =>'RUNNING', - p_condition_sql =>'"STATUS" = #APXWS_EXPR#', - p_condition_display =>'#APXWS_COL_NAME# = ''RUNNING'' ', - p_enabled =>'Y', - p_column_format =>''); -end; -/ -declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; -begin -s := null; -wwv_flow_api.create_page_plug ( - p_id=> 5024330300632423 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 2, - p_plug_name=> 'Test Runner Jobs Setup', - p_region_name=>'', - p_plug_template=> 4839912075414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 14, - p_plug_display_column=> 3, - p_plug_display_point=> 'BEFORE_SHOW_ITEMS', - p_plug_source=> s, - p_plug_source_type=> 'STATIC_TEXT', - p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', - p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'QUERY_COLUMNS', - p_plug_query_num_rows => 15, - p_plug_query_num_rows_type => 'NEXT_PREVIOUS_LINKS', - p_plug_query_row_count_max => 500, - p_plug_query_show_nulls_as => ' - ', - p_plug_display_condition_type => '', - p_pagination_display_position=>'BOTTOM_RIGHT', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); -end; -/ - -begin - -wwv_flow_api.create_page_button( - p_id => 4943012566012609 + wwv_flow_api.g_id_offset, - p_flow_id => wwv_flow.g_flow_id, - p_flow_step_id => 2, - p_button_sequence=> 20, - p_button_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, - p_button_name => 'P3_RUN_ALL_TESTS', - p_button_image => 'template:'||to_char(4838226535414911+wwv_flow_api.g_id_offset), - p_button_image_alt=> 'Run All Tests', - p_button_position=> 'BOTTOM', - p_button_alignment=> 'LEFT', - p_button_redirect_url=> 'javascript:confirmDelete(''Run all Tests for Owner &APP_USER.'', ''TEST_ALL'')', - p_button_execute_validations=>'Y', - p_required_patch => null + wwv_flow_api.g_id_offset); - - -end; -/ - - -begin - -wwv_flow_api.create_page_branch( - p_id=>4941327317931667 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 2, - p_branch_action=> 'f?p=&APP_ID.:1:&SESSION.::&DEBUG.::P1_OWNER:&APP_USER.&success_msg=#SUCCESS_MSG#', - p_branch_point=> 'AFTER_PROCESSING', - p_branch_type=> 'REDIRECT_URL', - p_branch_sequence=> 10, - p_branch_condition_type=> 'REQUEST_EQUALS_CONDITION', - p_branch_condition=> 'TEST_ALL', - p_save_state_before_branch_yn=>'Y', - p_branch_comment=> 'Created 07-JUL-2018 11:52 by WTP'); - -wwv_flow_api.create_page_branch( - p_id=>4877001457701994 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 2, - p_branch_action=> 'f?p=&APP_ID.:2:&SESSION.::&DEBUG.:::&success_msg=#SUCCESS_MSG#', - p_branch_point=> 'AFTER_PROCESSING', - p_branch_type=> 'REDIRECT_URL', - p_branch_sequence=> 99, - p_save_state_before_branch_yn=>'Y', - p_branch_comment=> ''); - - -end; -/ - -declare - h varchar2(32767) := null; -begin -wwv_flow_api.create_page_item( - p_id=>4875003523525673 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 2, - p_name=>'P2_TEST_RUNNER', + p_flow_step_id=> 0, + p_name=>'P0_TEST_RUNNER', p_data_type=> 'VARCHAR', - p_is_required=> true, + p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 1, - p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, + p_item_sequence=> 20, + p_item_plug_id => 5109401519013442+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Test Runner:', - p_source=>'select min(package_name)'||chr(10)|| -' from dba_arguments'||chr(10)|| -' where owner = :APP_USER'||chr(10)|| -' and object_name = ''WTPLSQL_RUN'''||chr(10)|| -' and argument_name is null'||chr(10)|| -' and position = 1'||chr(10)|| -' and sequence = 0', - p_source_type=> 'QUERY', + p_prompt=>'Test Runner Name', + p_source_type=> 'STATIC', p_display_as=> 'NATIVE_POPUP_LOV', p_lov=> 'select package_name DISPLAY'||chr(10)|| ' ,package_name RETURN'||chr(10)|| ' from dba_arguments'||chr(10)|| -' where owner = :APP_USER'||chr(10)|| +' where owner = :P0_TEST_OWNER'||chr(10)|| ' and object_name = ''WTPLSQL_RUN'''||chr(10)|| ' and argument_name is null'||chr(10)|| ' and position = 1'||chr(10)|| ' and sequence = 0'||chr(10)|| ' order by package_name', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'NO', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'NOT_ENTERABLE', - p_attribute_02 => 'FIRST_ROWSET', - p_show_quick_picks=>'N', - p_item_comment => ''); - - -end; -/ - -declare - h varchar2(32767) := null; -begin -wwv_flow_api.create_page_item( - p_id=>4876813883701993 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 2, - p_name=>'P2_RUN_TEST', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 2, - p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'NO', - p_item_default=> 'RUN_TEST', - p_prompt=>'Run Test', - p_source=>'RUN_TEST', - p_source_type=> 'STATIC', - p_display_as=> 'BUTTON', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> null, - p_cMaxlength=> 2000, - p_cHeight=> null, - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'LEFT', - p_field_alignment=> 'LEFT', - p_is_persistent=> 'N', - p_button_execute_validations=>'Y', - p_item_comment => ''); - - -end; -/ - -declare - h varchar2(32767) := null; -begin -wwv_flow_api.create_page_item( - p_id=>4884208416023999 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 2, - p_name=>'P2_JOBS_PARAMETER', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 1, - p_item_plug_id => 5024330300632423+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', + p_lov_display_null=> 'YES', p_lov_translated=> 'N', + p_lov_null_text=>'', + p_lov_null_value=> '', p_cSize=> 30, - p_cMaxlength=> 4000, + p_cMaxlength=> 128, p_cHeight=> 1, p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'PLSQL', - p_attribute_03 => 'begin'||chr(10)|| -' htp.p(''Job Queue Process Parameter:
      '');'||chr(10)|| -' htp.p(''
        '');'||chr(10)|| -' for buff in ('||chr(10)|| -' select inst_id, value'||chr(10)|| -' from sys.gv_$parameter'||chr(10)|| -' where name = ''job_queue_processes'''||chr(10)|| -' order by inst_id )'||chr(10)|| -' loop'||chr(10)|| -' htp.p(''
      • '');'||chr(10)|| -' if buff.value > 0'||chr(10)|| -' then'||chr(10)|| -' htp.p(''Instance '' || buff.inst_id ||'||chr(10)|| -' '': '' || buff.value ||'||chr(10)|| -' '''');'||chr(10)|| -' else'||chr(10)|| -' htp.p(''Instance '' || buff.inst_id ||'||chr(10)|| -' '': '' || buff.value ||'||chr(10)|| -' '''');'||chr(10)|| -' end if;'||chr(10)|| -' htp.p(''
      • '');'||chr(10)|| -' end loop;'||chr(10)|| -' htp.p(''
      '');'||chr(10)|| -' htp.p(''
      '');'||chr(10)|| -'end;', - p_show_quick_picks=>'N', - p_item_comment => ''); - - -end; -/ - -declare - h varchar2(32767) := null; -begin -wwv_flow_api.create_page_item( - p_id=>5026010934853871 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 2, - p_name=>'P2_RESET_DB_LINK', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 6, - p_item_plug_id => 5024330300632423+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'NO', - p_item_default=> 'RESET_DB_LINK', - p_prompt=>'Reset DB Link', - p_source=>'RESET_DB_LINK', - p_source_type=> 'STATIC', - p_display_as=> 'BUTTON', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> null, - p_cMaxlength=> 2000, - p_cHeight=> null, - p_begin_on_new_line=> 'YES', + p_begin_on_new_line=> 'NO', p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT', - p_display_when=>'apex_plsql_job.jobs_are_enabled = FALSE', - p_is_persistent=> 'N', - p_button_execute_validations=>'Y', - p_item_comment => ''); + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'ABOVE', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'NO', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'NOT_ENTERABLE', + p_attribute_02 => 'FIRST_ROWSET', + p_show_quick_picks=>'N', + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); end; @@ -3970,40 +1050,50 @@ declare h varchar2(32767) := null; begin wwv_flow_api.create_page_item( - p_id=>5027508136976108 + wwv_flow_api.g_id_offset, + p_id=>5116329072611020 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 2, - p_name=>'P2_PASSWORD', + p_flow_step_id=> 0, + p_name=>'P0_TEST_RUN_ID', p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 5, - p_item_plug_id => 5024330300632423+wwv_flow_api.g_id_offset, + p_item_sequence=> 30, + p_item_plug_id => 5109401519013442+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Password:', + p_prompt=>'Test Run ID', p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_PASSWORD', - p_lov_display_null=> 'NO', + p_display_as=> 'NATIVE_POPUP_LOV', + p_lov=> 'select id || '': '' ||'||chr(10)|| +' to_char(start_dtm,''YYYY-MM-DD HH24:MI:SS'') DISPLAY'||chr(10)|| +' ,id RETURN'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where runner_owner = :P0_TEST_OWNER'||chr(10)|| +' and runner_name = :P0_TEST_RUNNER'||chr(10)|| +' order by id desc', + p_lov_display_null=> 'YES', p_lov_translated=> 'N', - p_cSize=> 15, - p_cMaxlength=> 128, + p_lov_null_text=>'', + p_lov_null_value=> '', + p_cSize=> 30, + p_cMaxlength=> 30, p_cHeight=> 1, p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', + p_begin_on_new_line=> 'NO', p_begin_on_new_field=> 'YES', p_colspan=> 1, p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT', + p_label_alignment=> 'ABOVE', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', + p_lov_display_extra=>'NO', p_protection_level => 'N', p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'Y', + p_attribute_01 => 'NOT_ENTERABLE', + p_attribute_02 => 'FIRST_ROWSET', p_show_quick_picks=>'N', - p_item_comment => ''); + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); end; @@ -4013,42 +1103,48 @@ declare h varchar2(32767) := null; begin wwv_flow_api.create_page_item( - p_id=>5028532733058845 + wwv_flow_api.g_id_offset, + p_id=>5116511887615523 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 2, - p_name=>'P2_NEW_DB_LINK_HOST', + p_flow_step_id=> 0, + p_name=>'P0_TEST_CASE', p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 4, - p_item_plug_id => 5024330300632423+wwv_flow_api.g_id_offset, + p_item_sequence=> 40, + p_item_plug_id => 5109401519013442+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'New DB Link Host:', - p_source=>'''//localhost:1521/'' || SYS_CONTEXT(''USERENV'',''DB_NAME'')', - p_source_type=> 'FUNCTION', - p_display_as=> 'NATIVE_TEXT_FIELD', - p_lov_display_null=> 'NO', + p_prompt=>'Test Case Name', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_POPUP_LOV', + p_lov=> 'select testcase DISPLAY'||chr(10)|| +' ,testcase RETURN'||chr(10)|| +' from wt_testcase_stats'||chr(10)|| +' where test_run_id = :P0_TEST_RUN_ID'||chr(10)|| +' order by testcase', + p_lov_display_null=> 'YES', p_lov_translated=> 'N', - p_cSize=> 20, + p_lov_null_text=>'', + p_lov_null_value=> '', + p_cSize=> 30, p_cMaxlength=> 50, p_cHeight=> 1, p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', + p_begin_on_new_line=> 'NO', p_begin_on_new_field=> 'YES', p_colspan=> 1, p_rowspan=> 1, - p_label_alignment=> 'RIGHT', + p_label_alignment=> 'ABOVE', p_field_alignment=> 'LEFT-CENTER', p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', + p_lov_display_extra=>'NO', p_protection_level => 'N', p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'N', + p_attribute_01 => 'NOT_ENTERABLE', + p_attribute_02 => 'FIRST_ROWSET', p_show_quick_picks=>'N', - p_item_comment => ''); + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); end; @@ -4058,51 +1154,39 @@ declare h varchar2(32767) := null; begin wwv_flow_api.create_page_item( - p_id=>5029510053130586 + wwv_flow_api.g_id_offset, + p_id=>5123905176304413 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 2, - p_name=>'P2_DB_LINK_HOST', + p_flow_step_id=> 0, + p_name=>'P0_OLD_TEST_OWNER', p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 3, - p_item_plug_id => 5024330300632423+wwv_flow_api.g_id_offset, + p_item_sequence=> 110, + p_item_plug_id => 5109401519013442+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'DB Link Host:', p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_display_as=> 'NATIVE_HIDDEN', p_lov_display_null=> 'NO', p_lov_translated=> 'N', p_cSize=> 30, p_cMaxlength=> 4000, p_cHeight=> 1, p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', + p_begin_on_new_line=> 'NO', p_begin_on_new_field=> 'YES', p_colspan=> 1, p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', + p_label_alignment=> 'ABOVE', + p_field_alignment=> 'LEFT', p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, p_is_persistent=> 'Y', p_lov_display_extra=>'YES', p_protection_level => 'N', p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'PLSQL', - p_attribute_03 => 'declare'||chr(10)|| -' host_string varchar2(2000);'||chr(10)|| -'begin'||chr(10)|| -' select host into host_string'||chr(10)|| -' from user_db_links'||chr(10)|| -' where db_link = :APP_USER;'||chr(10)|| -' htp.p('''' || host_string || '''');'||chr(10)|| -'exception when NO_DATA_FOUND then'||chr(10)|| -' htp.p(''*** DB Link Missing ***'');'||chr(10)|| -'end;', + p_attribute_01 => 'Y', p_show_quick_picks=>'N', - p_item_comment => ''); + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); end; @@ -4112,45 +1196,39 @@ declare h varchar2(32767) := null; begin wwv_flow_api.create_page_item( - p_id=>5035808710455768 + wwv_flow_api.g_id_offset, + p_id=>5124122837309434 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 2, - p_name=>'P2_SPACER', + p_flow_step_id=> 0, + p_name=>'P0_OLD_TEST_RUNNER', p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 4, - p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, + p_item_sequence=> 120, + p_item_plug_id => 5109401519013442+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_display_as=> 'NATIVE_HIDDEN', p_lov_display_null=> 'NO', p_lov_translated=> 'N', p_cSize=> 30, p_cMaxlength=> 4000, p_cHeight=> 1, p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', + p_begin_on_new_line=> 'NO', p_begin_on_new_field=> 'YES', p_colspan=> 1, p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', + p_label_alignment=> 'ABOVE', + p_field_alignment=> 'LEFT', p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, p_is_persistent=> 'Y', p_lov_display_extra=>'YES', p_protection_level => 'N', p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'PLSQL', - p_attribute_03 => 'begin'||chr(10)|| -' htp.p(''
      '');'||chr(10)|| -' htp.p(''
      '');'||chr(10)|| -'end;'||chr(10)|| -'', + p_attribute_01 => 'Y', p_show_quick_picks=>'N', - p_item_comment => ''); + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); end; @@ -4160,44 +1238,39 @@ declare h varchar2(32767) := null; begin wwv_flow_api.create_page_item( - p_id=>5044818450655759 + wwv_flow_api.g_id_offset, + p_id=>5124303922313440 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 2, - p_name=>'P2_DB_LINK_NAME', + p_flow_step_id=> 0, + p_name=>'P0_OLD_TEST_RUN_ID', p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 2, - p_item_plug_id => 5024330300632423+wwv_flow_api.g_id_offset, + p_item_sequence=> 130, + p_item_plug_id => 5109401519013442+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'DB Link Name:', p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_display_as=> 'NATIVE_HIDDEN', p_lov_display_null=> 'NO', p_lov_translated=> 'N', - p_cSize=> 30, + p_cSize=> 10, p_cMaxlength=> 4000, p_cHeight=> 1, p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', + p_begin_on_new_line=> 'NO', p_begin_on_new_field=> 'YES', p_colspan=> 1, p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', + p_label_alignment=> 'ABOVE', + p_field_alignment=> 'LEFT', p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, p_is_persistent=> 'Y', p_lov_display_extra=>'YES', p_protection_level => 'N', p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'PLSQL', - p_attribute_03 => 'begin'||chr(10)|| -' htp.p(:APP_USER);'||chr(10)|| -'end;', + p_attribute_01 => 'Y', p_show_quick_picks=>'N', - p_item_comment => ''); + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); end; @@ -4207,18 +1280,18 @@ declare h varchar2(32767) := null; begin wwv_flow_api.create_page_item( - p_id=>5073001504097405 + wwv_flow_api.g_id_offset, + p_id=>5156507341612883 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 2, - p_name=>'P2_LAST_RUN_ID', + p_flow_step_id=> 0, + p_name=>'P0_DBG', p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 3, - p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, + p_item_sequence=> 220, + p_item_plug_id => 5109401519013442+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Last Run ID:', + p_prompt=>'Page 0 Init Debug:', p_source_type=> 'STATIC', p_display_as=> 'NATIVE_DISPLAY_ONLY', p_lov_display_null=> 'NO', @@ -4239,34 +1312,135 @@ wwv_flow_api.create_page_item( p_protection_level => 'N', p_escape_on_http_output => 'Y', p_attribute_01 => 'N', - p_attribute_02 => 'PLSQL', - p_attribute_03 => 'declare'||chr(10)|| -' last_run_id number;'||chr(10)|| -'begin'||chr(10)|| -' -- Group Function never returns NO_DATA_FOUND'||chr(10)|| -' select id into last_run_id'||chr(10)|| -' from wt_test_runs'||chr(10)|| -' where runner_owner = :APP_USER'||chr(10)|| -' and runner_name = :P2_TEST_RUNNER'||chr(10)|| -' and is_last_run = ''Y'';'||chr(10)|| -' if last_run_id is not null'||chr(10)|| -' then'||chr(10)|| -' htp.p('''' || last_run_id ||'||chr(10)|| -' '' (Click to View)'' || '''');'||chr(10)|| -' end if;'||chr(10)|| -'end;', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', p_show_quick_picks=>'N', - p_item_comment => ''); + p_item_comment => 'This item is initialized by the "Initialize Items" process.'); + + +end; +/ + + +begin + +wwv_flow_api.create_page_da_event ( + p_id => 5132717988076486 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_page_id => 0 + ,p_name => 'Submit After Test Owner Change' + ,p_event_sequence => 10 + ,p_triggering_element_type => 'ITEM' + ,p_triggering_element => 'P0_TEST_OWNER' + ,p_bind_type => 'bind' + ,p_bind_event_type => 'change' + ); +wwv_flow_api.create_page_da_action ( + p_id => 5133011351076491 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_page_id => 0 + ,p_event_id => 5132717988076486 + wwv_flow_api.g_id_offset + ,p_event_result => 'TRUE' + ,p_action_sequence => 10 + ,p_execute_on_page_init => 'N' + ,p_action => 'NATIVE_SUBMIT_PAGE' + ,p_attribute_01 => 'REFRESH' + ,p_stop_execution_on_error => 'Y' + ); +null; + +end; +/ + + +begin + +wwv_flow_api.create_page_da_event ( + p_id => 5133128377079428 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_page_id => 0 + ,p_name => 'Submit After Test Runner Change' + ,p_event_sequence => 20 + ,p_triggering_element_type => 'ITEM' + ,p_triggering_element => 'P0_TEST_RUNNER' + ,p_bind_type => 'bind' + ,p_bind_event_type => 'change' + ); +wwv_flow_api.create_page_da_action ( + p_id => 5133404881079428 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_page_id => 0 + ,p_event_id => 5133128377079428 + wwv_flow_api.g_id_offset + ,p_event_result => 'TRUE' + ,p_action_sequence => 10 + ,p_execute_on_page_init => 'N' + ,p_action => 'NATIVE_SUBMIT_PAGE' + ,p_attribute_01 => 'REFRESH' + ,p_stop_execution_on_error => 'Y' + ); +null; + +end; +/ + + +begin + +wwv_flow_api.create_page_da_event ( + p_id => 5133521236086857 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_page_id => 0 + ,p_name => 'Submit After Test Run ID Change' + ,p_event_sequence => 30 + ,p_triggering_element_type => 'ITEM' + ,p_triggering_element => 'P0_TEST_RUN_ID' + ,p_bind_type => 'bind' + ,p_bind_event_type => 'change' + ); +wwv_flow_api.create_page_da_action ( + p_id => 5133821690086857 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_page_id => 0 + ,p_event_id => 5133521236086857 + wwv_flow_api.g_id_offset + ,p_event_result => 'TRUE' + ,p_action_sequence => 10 + ,p_execute_on_page_init => 'N' + ,p_action => 'NATIVE_SUBMIT_PAGE' + ,p_attribute_01 => 'REFRESH' + ,p_stop_execution_on_error => 'Y' + ); +null; + +end; +/ + + +begin +wwv_flow_api.create_page_da_event ( + p_id => 5133928854089093 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_page_id => 0 + ,p_name => 'Submit After Test Case Change' + ,p_event_sequence => 40 + ,p_triggering_element_type => 'ITEM' + ,p_triggering_element => 'P0_TEST_CASE' + ,p_bind_type => 'bind' + ,p_bind_event_type => 'change' + ); +wwv_flow_api.create_page_da_action ( + p_id => 5134216946089093 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_page_id => 0 + ,p_event_id => 5133928854089093 + wwv_flow_api.g_id_offset + ,p_event_result => 'TRUE' + ,p_action_sequence => 10 + ,p_execute_on_page_init => 'N' + ,p_action => 'NATIVE_SUBMIT_PAGE' + ,p_attribute_01 => 'REFRESH' + ,p_stop_execution_on_error => 'Y' + ); +null; end; / @@ -4274,42 +1448,13 @@ end; begin -declare - p varchar2(32767) := null; - l_clob clob; - l_length number := 1; +--------------------------------------- +-- ...updatable report columns for page 0 +-- + begin -p:=p||'DECLARE'||chr(10)|| -' run_str varchar2(2000) := ''wtplsql.test_run@'' ||'||chr(10)|| -' :APP_USER || ''('''''' ||'||chr(10)|| -' :P2_TEST_RUNNER || '''''')'' ;'||chr(10)|| -'BEGIN'||chr(10)|| -' DBMS_SCHEDULER.CREATE_JOB'||chr(10)|| -' (job_name => substr(:APP_USER || ''$'' || :P2_TEST_RUNNER, 1, 30)'||chr(10)|| -' ,job_type => ''PLSQL_BLOCK'''||chr(10)|| -' ,job_action => ''begin '' || run_str || ''; commit; end;'''||chr(10)|| -' ,'; - -p:=p||'comments => run_str'||chr(10)|| -' ,enabled => TRUE);'||chr(10)|| -' COMMIT;'||chr(10)|| -'END;'; - -wwv_flow_api.create_page_process( - p_id => 4876513059692293 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id => 2, - p_process_sequence=> 10, - p_process_point=> 'AFTER_SUBMIT', - p_process_type=> 'PLSQL', - p_process_name=> 'RUN_TEST', - p_process_sql_clob => p, - p_process_error_message=> '', - p_process_when=>'RUN_TEST', - p_process_when_type=>'REQUEST_EQUALS_CONDITION', - p_process_success_message=> '', - p_process_is_stateful_y_n=>'N', - p_process_comment=>''); + +null; end; null; @@ -4317,266 +1462,718 @@ end; / +--application/pages/page_00001 +prompt ...PAGE 1: Dashboard +-- + begin +wwv_flow_api.create_page ( + p_flow_id => wwv_flow.g_flow_id + ,p_id => 1 + ,p_tab_set => 'TS1' + ,p_name => 'Dashboard' + ,p_alias => 'DASHBOARD' + ,p_step_title => 'Home' + ,p_allow_duplicate_submissions => 'Y' + ,p_step_sub_title => 'Home' + ,p_step_sub_title_type => 'TEXT_WITH_SUBSTITUTIONS' + ,p_first_item => 'AUTO_FIRST_ITEM' + ,p_include_apex_css_js_yn => 'Y' + ,p_autocomplete_on_off => 'ON' + ,p_page_is_public_y_n => 'N' + ,p_protection_level => 'N' + ,p_cache_page_yn => 'N' + ,p_cache_timeout_seconds => 21600 + ,p_cache_by_user_yn => 'N' + ,p_help_text => +'No help is available for this page.' + ,p_last_updated_by => 'WTP' + ,p_last_upd_yyyymmddhh24miss => '20180901112031' + ); +null; + +end; +/ + declare - p varchar2(32767) := null; + s varchar2(32767) := null; l_clob clob; l_length number := 1; begin -p:=p||'DECLARE'||chr(10)|| -' run_str varchar2(2000) := ''wtplsql.test_all@'' || :APP_USER;'||chr(10)|| -'BEGIN'||chr(10)|| -' DBMS_SCHEDULER.CREATE_JOB'||chr(10)|| -' (job_name => substr(:APP_USER || ''$TEST$ALL'', 1, 30)'||chr(10)|| -' ,job_type => ''PLSQL_BLOCK'''||chr(10)|| -' ,job_action => ''begin '' || run_str || ''; commit; end;'''||chr(10)|| -' ,comments => run_str'||chr(10)|| -' ,enabled => TRUE);'||chr(10)|| -' COMMIT;'||chr(10)|| -'END;'; +s:=s||'declare'||chr(10)|| +' num_owners number;'||chr(10)|| +' num_runners number;'||chr(10)|| +' num_dbouts number;'||chr(10)|| +' num_cases number;'||chr(10)|| +'begin'||chr(10)|| +' --'||chr(10)|| +' with q1 as ('||chr(10)|| +' select runner_owner'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where :P0_TEST_OWNER is NULL'||chr(10)|| +' or :P0_TEST_OWNER = runner_owner'||chr(10)|| +' group by runner_owner'||chr(10)|| +' )'||chr(10)|| +' --'||chr(10)|| +' select count(*)'||chr(10)|| +' into num_owners'||chr(10)|| +' from q1;'||chr(10)|| +' with q1 as ('||chr(10)|| +' select runner_owner, runner_name'||chr(10)|| +' fr'; + +s:=s||'om wt_test_runs'||chr(10)|| +' where :P0_TEST_OWNER is NULL'||chr(10)|| +' or :P0_TEST_OWNER = runner_owner'||chr(10)|| +' group by runner_owner, runner_name'||chr(10)|| +' )'||chr(10)|| +' select count(*)'||chr(10)|| +' into num_runners'||chr(10)|| +' from q1;'||chr(10)|| +' --'||chr(10)|| +' with q1 as ('||chr(10)|| +' select dbout_owner, dbout_name, dbout_type'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where :P0_TEST_OWNER is NULL'||chr(10)|| +' or :P0_TEST_OWNER = runner_owner'||chr(10)|| +' group by dbout_owner, dbout_name, dbout_typ'; + +s:=s||'e'||chr(10)|| +' )'||chr(10)|| +' select count(*)'||chr(10)|| +' into num_dbouts'||chr(10)|| +' from q1;'||chr(10)|| +' --'||chr(10)|| +' with q1 as ('||chr(10)|| +' select runner_owner, runner_name, testcase'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_testcase_stats case'||chr(10)|| +' on case.test_run_id = run.id'||chr(10)|| +' where :P0_TEST_OWNER is NULL'||chr(10)|| +' or :P0_TEST_OWNER = runner_owner'||chr(10)|| +' group by runner_owner, runner_name, testcase'||chr(10)|| +' )'||chr(10)|| +' select count(*)'||chr(10)|| +' into num'; + +s:=s||'_cases'||chr(10)|| +' from q1;'||chr(10)|| +' --'||chr(10)|| +' htp.p(''
       '');'||chr(10)|| +' htp.p(''Number of Test Owners: '' || num_owners || ''
      '');'||chr(10)|| +' htp.p(''
       '');'||chr(10)|| +' htp.p(''Number of Test Runners: '' || num_runners || ''
      '');'||chr(10)|| +' htp.p(''
       '');'||chr(10)|| +' htp.p(''Number of Test Cases: '' || num_cases || ''
      '');'||chr(10)|| +' htp.p(''
       '');'||chr(10)|| +' htp.p(''Number of Tested DBOUTs: '' || num_dbouts || ''
      '');'||chr(10)|| +' htp.p(''
       
      '');'||chr(10)|| +''; + +s:=s||'end;'; + +wwv_flow_api.create_page_plug ( + p_id=> 4846907308414925 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 1, + p_plug_name=> 'Summary', + p_region_name=>'', + p_plug_template=> 4839912075414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 2, + p_plug_display_column=> 2, + p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_source=> s, + p_plug_source_type=> 'PLSQL_PROCEDURE', + p_translate_title=> 'Y', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_column_width => 'td width="320"', + p_plug_display_condition_type => '', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4854109180566690 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 1, + p_plug_name=> 'Test Runners Status Summary', + p_region_name=>'', + p_plug_template=> 4840201642414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 1, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4854324865566692+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 1, + p_region_id => 4854109180566690+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DPie', + p_chart_title =>'', + p_chart_name =>'chart_4854324865566692', + p_chart_width =>300, + p_chart_height =>150, + p_chart_animation =>'N', + p_display_attr =>':H:::::Left::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#99FF99,#FFFF99,#FF6699', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'::', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'::', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'with q_main as ('||chr(10)|| +'select sum(res.passes) PASS'||chr(10)|| +' ,sum(res.failures) FAIL'||chr(10)|| +' ,sum(res.errors) ERR'||chr(10)|| +' from wt_test_runs tr'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = tr.id'||chr(10)|| +' where ( :P0_TEST_OWNER is NULL'||chr(10)|| +' or :P0_TEST_OWNER = tr.runner_owner )'||chr(10)|| +' and tr.is_last_run = wtplsql.get_last_run_flag'||chr(10)|| +'), q1 as ('||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''PASS'' LABEL'||chr(10)|| +' '; -wwv_flow_api.create_page_process( - p_id => 4941719483938905 + wwv_flow_api.g_id_offset, +a1:=a1||' ,pass VALUE'||chr(10)|| +' from q_main'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''FAIL'' LABEL'||chr(10)|| +' ,fail VALUE'||chr(10)|| +' from q_main'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''ERR'' LABEL'||chr(10)|| +' ,err VALUE'||chr(10)|| +' from q_main'||chr(10)|| +')'||chr(10)|| +'select link, label, value'||chr(10)|| +' from q1'||chr(10)|| +' order by label desc'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4854410354566693+wwv_flow_api.g_id_offset, + p_chart_id => 4854324865566692+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id => 2, - p_process_sequence=> 20, - p_process_point=> 'AFTER_SUBMIT', - p_process_type=> 'PLSQL', - p_process_name=> 'TEST_ALL', - p_process_sql_clob => p, - p_process_error_message=> 'Failed to submit job (&P2_LAST_JOB_ID.)', - p_process_when=>'TEST_ALL', - p_process_when_type=>'REQUEST_EQUALS_CONDITION', - p_process_success_message=> 'Successful submitted job &P2_LAST_JOB_ID.', - p_process_is_stateful_y_n=>'N', - p_process_comment=>''); -end; -null; - + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); end; / - - -begin - declare - p varchar2(32767) := null; + s varchar2(32767) := null; l_clob clob; l_length number := 1; begin -p:=p||'begin'||chr(10)|| -' --'||chr(10)|| -' begin'||chr(10)|| -' execute immediate ''drop database link '' || :APP_USER;'||chr(10)|| -' exception when OTHERS then'||chr(10)|| -' if SQLERRM = ''ORA-02024: database link not found'''||chr(10)|| -' then'||chr(10)|| -' null; -- Ignore Exception'||chr(10)|| -' else'||chr(10)|| -' raise;'||chr(10)|| -' end if;'||chr(10)|| -' end;'||chr(10)|| -' --'||chr(10)|| -' execute immediate ''create database link '' || :APP_USER ||'||chr(10)|| -' '' connect to '' || :APP_USER '; +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4855306596029607 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 1, + p_plug_name=> 'DBOUT Profiles Status Summary', + p_region_name=>'', + p_plug_template=> 4840201642414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 3, + p_plug_display_column=> 3, + p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_display_when_condition => ':P1_NUM_RUNNERS > 0', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); end; / - - ---application/pages/page_00003 -prompt ...PAGE 3: Test Runner --- - +declare + a1 varchar2(32767) := null; begin - -wwv_flow_api.create_page ( - p_flow_id => wwv_flow.g_flow_id - ,p_id => 3 - ,p_tab_set => 'TS1' - ,p_name => 'Test Runner' - ,p_alias => 'TESTRUNNER' - ,p_step_title => 'Test Runner' - ,p_allow_duplicate_submissions => 'Y' - ,p_step_sub_title => 'Test Runner' - ,p_step_sub_title_type => 'TEXT_WITH_SUBSTITUTIONS' - ,p_first_item => 'AUTO_FIRST_ITEM' - ,p_include_apex_css_js_yn => 'Y' - ,p_autocomplete_on_off => 'ON' - ,p_step_template => 4837525507414910 + wwv_flow_api.g_id_offset - ,p_page_is_public_y_n => 'N' - ,p_protection_level => 'N' - ,p_cache_page_yn => 'N' - ,p_cache_timeout_seconds => 21600 - ,p_cache_by_user_yn => 'N' - ,p_help_text => -'No help is available for this page.' - ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180731225449' - ); -null; - +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4855509614029610+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 1, + p_region_id => 4855306596029607+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DPie', + p_chart_title =>'', + p_chart_name =>'chart_4854324865566692', + p_chart_width =>300, + p_chart_height =>150, + p_chart_animation =>'N', + p_display_attr =>':H:::::Left::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#0099FF,#99FF99,#FF6699,#FFFF99', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'::', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'::', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); end; / +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'with q_main as ('||chr(10)|| +'select sum(res.excluded_lines) EXCL'||chr(10)|| +' ,sum(res.executed_lines) EXEC'||chr(10)|| +' ,sum(res.notexec_lines) NOTX'||chr(10)|| +' ,sum(res.unknown_lines) UNKN'||chr(10)|| +' from wt_test_runs tr'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = tr.id'||chr(10)|| +' where ( :P0_TEST_OWNER is NULL'||chr(10)|| +' or :P0_TEST_OWNER = runner_owner )'||chr(10)|| +' and is_last_run = wtplsql.get_last_run_flag'||chr(10)|| +'), q1 as'; + +a1:=a1||' ('||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''EXCL'' LABEL'||chr(10)|| +' ,excl VALUE'||chr(10)|| +' from q_main'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''EXEC'' LABEL'||chr(10)|| +' ,exec VALUE'||chr(10)|| +' from q_main'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''NOTX'' LABEL'||chr(10)|| +' ,notx VALUE'||chr(10)|| +' from q_main'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''UNKN'' LABEL'||chr(10)|| +' ,unkn VALUE'||chr(10)|| +' from q_main'||chr(10)|| +')'||chr(10)|| +'select link, label, value'||chr(10)|| +' from q1'||chr(10)|| +' order by label'; +wwv_flow_api.create_flash_chart5_series( + p_id => 4855610331029611+wwv_flow_api.g_id_offset, + p_chart_id => 4855509614029610+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); +end; +/ declare s varchar2(32767) := null; l_clob clob; l_length number := 1; begin -s := null; +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + wwv_flow_api.create_page_plug ( - p_id=> 4848108018414926 + wwv_flow_api.g_id_offset, + p_id=> 4857720139336331 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_plug_name=> 'Test Runner', + p_page_id=> 1, + p_plug_name=> 'Top Test Runner Failures', p_region_name=>'', - p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 11, + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 1, p_plug_display_column=> 1, - p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', p_plug_source=> s, - p_plug_source_type=> 'STATIC_TEXT', + p_plug_source_type=> 'FLASH_CHART5', p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', p_plug_query_row_template=> 1, p_plug_query_headings_type=> 'COLON_DELMITED_LIST', p_plug_query_row_count_max => 500, p_plug_display_condition_type => '', + p_plug_display_when_condition => ':P1_NUM_RUNNERS > 0', p_plug_customized=>'0', p_plug_caching=> 'NOT_CACHED', p_plug_comment=> ''); end; / declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; + a1 varchar2(32767) := null; begin -s:=s||'select case when connect_by_isleaf = 1 then 0'||chr(10)|| -' when level = 1 then 1'||chr(10)|| -' else -1'||chr(10)|| -' end as status, '||chr(10)|| -' level, '||chr(10)|| -' "TEXT" as title, '||chr(10)|| -' null as icon, '||chr(10)|| -' "ID" as value, '||chr(10)|| -' null as tooltip, '||chr(10)|| -' ''f?p=&APP_ID.:3:''||:APP_SESSION||''::::P3_TEST_RUN_ID:''||"ID" as link '||chr(10)|| -'from "#OWNER#"."WT_TEST_RUNS_TREE"'||chr(10)|| -'start with "PAREN'; - -s:=s||'T_ID" is null'||chr(10)|| -'connect by prior "ID" = "PARENT_ID"'; - -wwv_flow_api.create_page_plug ( - p_id=> 4914618551787988 + wwv_flow_api.g_id_offset, +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4857903544336332+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_plug_name=> 'Test Runs Tree', - p_region_name=>'', - p_plug_template=> 4840201642414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 14, - p_plug_display_column=> 4, - p_plug_display_point=> 'REGION_POSITION_03', - p_plug_source=> s, - p_plug_source_type=> 'JSTREE', - p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', - p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'COLON_DELMITED_LIST', - p_plug_query_row_count_max => 500, - p_plug_display_condition_type => 'PLSQL_EXPRESSION', - p_plug_display_when_condition => ':P3_SHOW_TREE = ''Y''', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); + p_page_id => 1, + p_region_id => 4857720139336331+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DColumn', + p_chart_title =>'', + p_chart_name =>'chart_4857903544336332', + p_chart_width =>300, + p_chart_height =>150, + p_chart_animation =>'N', + p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#FFFF00', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'Failures', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>90, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); end; / declare a1 varchar2(32767) := null; begin -a1:=a1||'select case when connect_by_isleaf = 1 then 0'||chr(10)|| -' when level = 1 then 1'||chr(10)|| -' else -1'||chr(10)|| -' end STATUS'||chr(10)|| -' ,level'||chr(10)|| -' ,"TEXT" TITLE'||chr(10)|| -' ,null ICON'||chr(10)|| -' ,"ID" VALUE'||chr(10)|| -' ,"TEXT"'; - -a1:=a1||' TOOLTIP'||chr(10)|| -' ,case when id > 0 then'||chr(10)|| -' ''f?p=&APP_ID.:3:''||:APP_SESSION||''::::P3_TEST_RUN_ID:''||"ID"'||chr(10)|| -' else NULL end LINK'||chr(10)|| -' from "#OWNER#"."WT_TEST_RUNS_GUI_TREE"'||chr(10)|| -' start with "PARENT_ID" is null'||chr(10)|| -' connect by prior "ID" = "PARENT_ID"'; - -wwv_flow_api.create_jstree( - p_id => 4914517648787988+wwv_flow_api.g_id_offset, +a1:=a1||'select tr.id LINK'||chr(10)|| +' ,tr.runner_owner || ''.'' ||'||chr(10)|| +' tr.runner_name LABEL'||chr(10)|| +' ,res.failures VALUE'||chr(10)|| +' from wt_test_runs tr'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = tr.id'||chr(10)|| +' and res.failures > 0'||chr(10)|| +' where ( :P0_TEST_OWNER is NULL'||chr(10)|| +' or :P0_TEST_OWNER = tr.runner_owner )'||chr(10)|| +' and tr.is_last_run = wtp'; + +a1:=a1||'lsql.get_last_run_flag'||chr(10)|| +' order by res.failures desc, LABEL'||chr(10)|| +''; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4858000738336332+wwv_flow_api.g_id_offset, + p_chart_id => 4857903544336332+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id => 3, - p_region_id => 4914618551787988+wwv_flow_api.g_id_offset, - p_tree_template =>'classic', - p_tree_source =>'', - p_tree_query =>a1, - p_tree_node_title =>'TEXT', - p_tree_node_value =>'ID', - p_tree_node_icon =>'', - p_tree_node_link =>'', - p_tree_node_hints =>'ID', - p_tree_start_item =>'PARENT_ID', - p_tree_start_value =>'', - p_tree_button_option =>'', - p_show_node_link =>'', - p_node_link_checksum_type =>null, - p_tree_comment =>'', - p_show_hints =>'DB', - p_tree_has_focus =>'N', - p_tree_hint_text =>'', - p_tree_click_action =>'S', - p_selected_node =>'P3_TEST_RUN_ID'); + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>10, + p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P0_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', + p_action_link_checksum_type =>''); end; / declare @@ -4590,49 +2187,49 @@ s:=s||''||chr(10)|| -''||chr(10)|| +s:=s||'SION.:FLOW_FLASH_CHART5_R#REGION_ID#">'||chr(10)|| ''||chr(10)|| ''||chr(10)|| ''||chr(10)|| ''||chr(10)|| ''||chr(10)|| -''||chr(10)|| +s:=s||'itingForDataText=#FLASH_WAITING#&templatesLoadingText=#FLASH_TEMPLATES#">'||chr(10)|| ''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| +''||chr(10)|| +''||chr(10)|| '#CHART_REFRESH#'; wwv_flow_api.create_page_plug ( - p_id=> 4927702379997301 + wwv_flow_api.g_id_offset, + p_id=> 4858315631526698 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_plug_name=> 'Test Runner Status', + p_page_id=> 1, + p_plug_name=> 'Top Test Runner Durations', p_region_name=>'', p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 12, - p_plug_display_column=> 2, - p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_display_sequence=> 4, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', p_plug_source=> s, p_plug_source_type=> 'FLASH_CHART5', p_translate_title=> 'Y', @@ -4641,6 +2238,7 @@ wwv_flow_api.create_page_plug ( p_plug_query_headings_type=> 'COLON_DELMITED_LIST', p_plug_query_row_count_max => 500, p_plug_display_condition_type => '', + p_plug_display_when_condition => ':P1_NUM_RUNNERS > 0', p_plug_customized=>'0', p_plug_caching=> 'NOT_CACHED', p_plug_comment=> ''); @@ -4651,17 +2249,17 @@ declare begin a1 := null; wwv_flow_api.create_flash_chart5( - p_id => 4927915384997301+wwv_flow_api.g_id_offset, + p_id => 4858521402526708+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id => 3, - p_region_id => 4927702379997301+wwv_flow_api.g_id_offset, - p_default_chart_type =>'2DPie', + p_page_id => 1, + p_region_id => 4858315631526698+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DColumn', p_chart_title =>'', - p_chart_name =>'chart_4927915384997301', + p_chart_name =>'chart_4857903544336332', p_chart_width =>300, - p_chart_height =>200, + p_chart_height =>150, p_chart_animation =>'N', - p_display_attr =>':H:::::Left::V:Y:None:::N:::Default', + p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', p_dial_tick_attr =>':::::::::::', p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', @@ -4677,27 +2275,27 @@ wwv_flow_api.create_flash_chart5( p_grid_bgcolor2 =>'', p_grid_gradient_rotation =>null, p_color_scheme =>'0', - p_custom_colors =>'#99FF99,#FFFF99,#FF6699', + p_custom_colors =>'#3366FF', p_map_undef_color_scheme =>'', p_map_undef_custom_colors =>'', p_x_axis_title =>'', p_x_axis_min =>null, p_x_axis_max =>null, - p_x_axis_decimal_place =>null, + p_x_axis_decimal_place =>1, p_x_axis_prefix =>'', p_x_axis_postfix =>'', p_x_axis_label_rotation =>'', - p_x_axis_label_font =>'::', + p_x_axis_label_font =>'Tahoma:10:#000000', p_x_axis_major_interval =>null, p_x_axis_minor_interval =>null, - p_y_axis_title =>'', + p_y_axis_title =>'Seconds', p_y_axis_min =>null, p_y_axis_max =>null, - p_y_axis_decimal_place =>null, + p_y_axis_decimal_place =>1, p_y_axis_prefix =>'', p_y_axis_postfix =>'', p_y_axis_label_rotation =>'', - p_y_axis_label_font =>'::', + p_y_axis_label_font =>'Tahoma:10:#000000', p_y_axis_major_interval =>null, p_y_axis_minor_interval =>null, p_async_update =>'N', @@ -4707,16 +2305,16 @@ wwv_flow_api.create_flash_chart5( p_names_font => null, p_names_rotation => null, p_values_font =>'Arial:10:#000000', - p_values_rotation =>null, + p_values_rotation =>90, p_values_prefix =>'', p_values_postfix =>'', p_hints_font =>'Tahoma:10:#000000', p_legend_font =>'Arial:10:#000000', p_grid_labels_font =>'', p_chart_title_font =>'Tahoma:14:#000000', - p_x_axis_title_font =>'Tahoma:14:', + p_x_axis_title_font =>'Tahoma:14:#000000', p_x_axis_title_rotation =>'', - p_y_axis_title_font =>'Tahoma:14:', + p_y_axis_title_font =>'Tahoma:14:#000000', p_y_axis_title_rotation =>'', p_gauge_labels_font =>'Tahoma:10:', p_use_chart_xml =>'N', @@ -4726,51 +2324,34 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'with q1 as ('||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,''PASS'' LABEL'||chr(10)|| -' ,sum(res.passes) VALUE'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' where id = :P3_TEST_RUN_ID'||chr(10)|| -'union all'||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,''FAIL'' LABEL'||chr(10)|| -' ,sum(res.failures) VALUE'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' '; +a1:=a1||'select id LINK'||chr(10)|| +' ,runner_owner || ''.'' || runner_name LABEL'||chr(10)|| +' ,extract(day from (end_dtm - start_dtm)*86400*100)/100'||chr(10)|| +' VALUE'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where ( :P0_TEST_OWNER is NULL'||chr(10)|| +' or :P0_TEST_OWNER = runner_owner )'||chr(10)|| +' and is_last_run = wtplsql.get_last_run_flag'||chr(10)|| +' and extract(day from (end_dtm - start'; -a1:=a1||' on res.test_run_id = run.id'||chr(10)|| -' where id = :P3_TEST_RUN_ID'||chr(10)|| -'union all'||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,''ERR'' LABEL'||chr(10)|| -' ,sum(res.errors) VALUE'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' where id = :P3_TEST_RUN_ID'||chr(10)|| -')'||chr(10)|| -'select link, label, value'||chr(10)|| -' from q1'||chr(10)|| -' order by label desc'; +a1:=a1||'_dtm)*86400*100)/100 > 0'||chr(10)|| +' order by VALUE desc, LABEL'||chr(10)|| +''; wwv_flow_api.create_flash_chart5_series( - p_id => 4928017042997302+wwv_flow_api.g_id_offset, - p_chart_id => 4927915384997301+wwv_flow_api.g_id_offset, + p_id => 4858612747526709+wwv_flow_api.g_id_offset, + p_chart_id => 4858521402526708+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_series_seq =>10, p_series_name =>'Series 1', p_series_query => a1, - p_series_type =>'', + p_series_type =>'Bar', p_series_query_type =>'SQL_QUERY', p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>15, - p_action_link =>'', - p_show_action_link =>'N', + p_series_query_row_count_max=>10, + p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P0_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', p_action_link_checksum_type =>''); end; / @@ -4819,15 +2400,15 @@ s:=s||'PLATES#">'||chr(10)|| '#CHART_REFRESH#'; wwv_flow_api.create_page_plug ( - p_id=> 4930902107252669 + wwv_flow_api.g_id_offset, + p_id=> 4859830202458220 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_plug_name=> 'DBOUT Profile Status', + p_page_id=> 1, + p_plug_name=> 'Top Test Runner Age', p_region_name=>'', p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 13, - p_plug_display_column=> 3, - p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_display_sequence=> 5, + p_plug_display_column=> 2, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', p_plug_source=> s, p_plug_source_type=> 'FLASH_CHART5', p_translate_title=> 'Y', @@ -4836,6 +2417,7 @@ wwv_flow_api.create_page_plug ( p_plug_query_headings_type=> 'COLON_DELMITED_LIST', p_plug_query_row_count_max => 500, p_plug_display_condition_type => '', + p_plug_display_when_condition => ':P1_NUM_RUNNERS > 0', p_plug_customized=>'0', p_plug_caching=> 'NOT_CACHED', p_plug_comment=> ''); @@ -4846,17 +2428,17 @@ declare begin a1 := null; wwv_flow_api.create_flash_chart5( - p_id => 4931121643252671+wwv_flow_api.g_id_offset, + p_id => 4860011375458221+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id => 3, - p_region_id => 4930902107252669+wwv_flow_api.g_id_offset, - p_default_chart_type =>'2DPie', + p_page_id => 1, + p_region_id => 4859830202458220+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DColumn', p_chart_title =>'', - p_chart_name =>'chart_4927915384997301', + p_chart_name =>'chart_4857903544336332', p_chart_width =>300, - p_chart_height =>200, + p_chart_height =>150, p_chart_animation =>'N', - p_display_attr =>':H:::::Left::V:Y:None:::N:::Default', + p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', p_dial_tick_attr =>':::::::::::', p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', @@ -4872,27 +2454,27 @@ wwv_flow_api.create_flash_chart5( p_grid_bgcolor2 =>'', p_grid_gradient_rotation =>null, p_color_scheme =>'0', - p_custom_colors =>'#0099FF,#99FF99,#FF6699,#FFFF99', + p_custom_colors =>'#CCCCCC', p_map_undef_color_scheme =>'', p_map_undef_custom_colors =>'', p_x_axis_title =>'', p_x_axis_min =>null, p_x_axis_max =>null, - p_x_axis_decimal_place =>null, + p_x_axis_decimal_place =>1, p_x_axis_prefix =>'', p_x_axis_postfix =>'', p_x_axis_label_rotation =>'', - p_x_axis_label_font =>'::', + p_x_axis_label_font =>'Tahoma:10:#000000', p_x_axis_major_interval =>null, p_x_axis_minor_interval =>null, - p_y_axis_title =>'', + p_y_axis_title =>'Days', p_y_axis_min =>null, p_y_axis_max =>null, - p_y_axis_decimal_place =>null, + p_y_axis_decimal_place =>1, p_y_axis_prefix =>'', p_y_axis_postfix =>'', p_y_axis_label_rotation =>'', - p_y_axis_label_font =>'::', + p_y_axis_label_font =>'Tahoma:10:#000000', p_y_axis_major_interval =>null, p_y_axis_minor_interval =>null, p_async_update =>'N', @@ -4902,16 +2484,16 @@ wwv_flow_api.create_flash_chart5( p_names_font => null, p_names_rotation => null, p_values_font =>'Arial:10:#000000', - p_values_rotation =>null, + p_values_rotation =>90, p_values_prefix =>'', p_values_postfix =>'', p_hints_font =>'Tahoma:10:#000000', p_legend_font =>'Arial:10:#000000', p_grid_labels_font =>'', p_chart_title_font =>'Tahoma:14:#000000', - p_x_axis_title_font =>'Tahoma:14:', + p_x_axis_title_font =>'Tahoma:14:#000000', p_x_axis_title_rotation =>'', - p_y_axis_title_font =>'Tahoma:14:', + p_y_axis_title_font =>'Tahoma:14:#000000', p_y_axis_title_rotation =>'', p_gauge_labels_font =>'Tahoma:10:', p_use_chart_xml =>'N', @@ -4921,61 +2503,36 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'with q1 as ('||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,''EXCL'' LABEL'||chr(10)|| -' ,sum(excluded_lines) VALUE'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' where id = :P3_TEST_RUN_ID'||chr(10)|| -'union all'||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,''EXEC'' LABEL'||chr(10)|| -' ,sum(executed_lines) VALUE'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_test_r'; - -a1:=a1||'un_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' where id = :P3_TEST_RUN_ID'||chr(10)|| -'union all'||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,''NOTX'' LABEL'||chr(10)|| -' ,sum(notexec_lines) VALUE'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' where id = :P3_TEST_RUN_ID'||chr(10)|| -'union all'||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,''UNKN'' LABEL'||chr(10)|| -' '; +a1:=a1||'select id LINK'||chr(10)|| +' ,runner_owner || ''.'' ||'||chr(10)|| +' runner_name LABEL'||chr(10)|| +' ,extract(day from (sysdate - start_dtm)*10)/10'||chr(10)|| +' VALUE'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where ( :P0_TEST_OWNER is NULL'||chr(10)|| +' or :P0_TEST_OWNER = runner_owner )'||chr(10)|| +' and is_last_run = wtplsql.get_last_run_flag'||chr(10)|| +' and start_dtm is not null'||chr(10)|| +' and extract(day '; -a1:=a1||' ,sum(unknown_lines) VALUE'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' where id = :P3_TEST_RUN_ID'||chr(10)|| -')'||chr(10)|| -'select link, label, value'||chr(10)|| -' from q1'||chr(10)|| -' order by label'; +a1:=a1||'from (sysdate - start_dtm)*10)/10 > 0'||chr(10)|| +' order by VALUE desc, LABEL'||chr(10)|| +''; wwv_flow_api.create_flash_chart5_series( - p_id => 4931210998252672+wwv_flow_api.g_id_offset, - p_chart_id => 4931121643252671+wwv_flow_api.g_id_offset, + p_id => 4860108666458221+wwv_flow_api.g_id_offset, + p_chart_id => 4860011375458221+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_series_seq =>10, p_series_name =>'Series 1', p_series_query => a1, - p_series_type =>'', + p_series_type =>'Bar', p_series_query_type =>'SQL_QUERY', p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>15, - p_action_link =>'', - p_show_action_link =>'N', + p_series_query_row_count_max=>10, + p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P0_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', p_action_link_checksum_type =>''); end; / @@ -4990,48 +2547,48 @@ s:=s||''||chr(10)|| -''||chr(10)|| +s:=s||'SION.:FLOW_FLASH_CHART5_R#REGION_ID#">'||chr(10)|| ''||chr(10)|| ''||chr(10)|| ''||chr(10)|| ''||chr(10)|| ''||chr(10)|| -''||chr(10)|| +s:=s||'itingForDataText=#FLASH_WAITING#&templatesLoadingText=#FLASH_TEMPLATES#">'||chr(10)|| ''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| +''||chr(10)|| +''||chr(10)|| '#CHART_REFRESH#'; wwv_flow_api.create_page_plug ( - p_id=> 4932622090476124 + wwv_flow_api.g_id_offset, + p_id=> 4860309181584610 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_plug_name=> 'Test Runner Status Trend', + p_page_id=> 1, + p_plug_name=> 'Top DBOUT NotExec Lines', p_region_name=>'', p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 21, - p_plug_display_column=> 1, + p_plug_display_sequence=> 3, + p_plug_display_column=> 3, p_plug_display_point=> 'BEFORE_SHOW_ITEMS', p_plug_source=> s, p_plug_source_type=> 'FLASH_CHART5', @@ -5040,9 +2597,8 @@ wwv_flow_api.create_page_plug ( p_plug_query_row_template=> 1, p_plug_query_headings_type=> 'COLON_DELMITED_LIST', p_plug_query_row_count_max => 500, - p_plug_display_condition_type => 'PLSQL_EXPRESSION', - p_plug_display_when_condition => ':P3_SHOW_TREND=''Y''', - p_plug_display_when_cond2=>'Y', + p_plug_display_condition_type => '', + p_plug_display_when_condition => ':P1_NUM_DBOUTS > 0', p_plug_customized=>'0', p_plug_caching=> 'NOT_CACHED', p_plug_comment=> ''); @@ -5053,17 +2609,17 @@ declare begin a1 := null; wwv_flow_api.create_flash_chart5( - p_id => 4932831378476124+wwv_flow_api.g_id_offset, + p_id => 4860500924584610+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id => 3, - p_region_id => 4932622090476124+wwv_flow_api.g_id_offset, - p_default_chart_type =>'Stacked2DColumn', + p_page_id => 1, + p_region_id => 4860309181584610+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DColumn', p_chart_title =>'', - p_chart_name =>'chart_4932831378476124', + p_chart_name =>'chart_4857903544336332', p_chart_width =>300, - p_chart_height =>200, + p_chart_height =>150, p_chart_animation =>'N', - p_display_attr =>':H:N::Y:N:Left::V:Y:Circle:::N:::Default', + p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', p_dial_tick_attr =>':::::::::::', p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', @@ -5079,7 +2635,7 @@ wwv_flow_api.create_flash_chart5( p_grid_bgcolor2 =>'', p_grid_gradient_rotation =>null, p_color_scheme =>'0', - p_custom_colors =>'#99FF99,#FFFF99,#FF6699', + p_custom_colors =>'#FF0066', p_map_undef_color_scheme =>'', p_map_undef_custom_colors =>'', p_x_axis_title =>'', @@ -5092,7 +2648,7 @@ wwv_flow_api.create_flash_chart5( p_x_axis_label_font =>'Tahoma:10:#000000', p_x_axis_major_interval =>null, p_x_axis_minor_interval =>null, - p_y_axis_title =>'', + p_y_axis_title =>'Source Lines', p_y_axis_min =>null, p_y_axis_max =>null, p_y_axis_decimal_place =>null, @@ -5109,7 +2665,7 @@ wwv_flow_api.create_flash_chart5( p_names_font => null, p_names_rotation => null, p_values_font =>'Arial:10:#000000', - p_values_rotation =>null, + p_values_rotation =>90, p_values_prefix =>'', p_values_postfix =>'', p_hints_font =>'Tahoma:10:#000000', @@ -5128,113 +2684,37 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'with q1 as ('||chr(10)|| -'select res.test_run_id LINK'||chr(10)|| -' ,''ID'' || run.id LABEL'||chr(10)|| -' ,res.passes PASS'||chr(10)|| +a1:=a1||'select run.id LINK'||chr(10)|| +' ,run.dbout_owner || ''.'' ||'||chr(10)|| +' run.dbout_name || ''('' ||'||chr(10)|| +' run.dbout_type || '')'' LABEL'||chr(10)|| +' ,res.notexec_lines VALUE'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| -' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| -' order by run.id'||chr(10)|| -'), q2 as ('||chr(10)|| -'select count(*) num_rows from q1'||chr(10)|| -')'||chr(10)|| -'select * from q1'||chr(10)|| -' where rownum > (select num_ro'; +' on res.test_run_id = run.id'||chr(10)|| +' and res.notexec_lines > 0'||chr(10)|| +' where ( :P0_TEST_OWNER is NULL'||chr(10)|| +' or :P0_TEST_OWNER = run.ru'; -a1:=a1||'ws from q2) - 10'; +a1:=a1||'nner_owner )'||chr(10)|| +' and run.is_last_run = wtplsql.get_last_run_flag'||chr(10)|| +' and run.dbout_name is not null'||chr(10)|| +' order by res.notexec_lines desc, LABEL'||chr(10)|| +''; wwv_flow_api.create_flash_chart5_series( - p_id => 4932905763476124+wwv_flow_api.g_id_offset, - p_chart_id => 4932831378476124+wwv_flow_api.g_id_offset, + p_id => 4860628410584610+wwv_flow_api.g_id_offset, + p_chart_id => 4860500924584610+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_series_seq =>10, - p_series_name =>'Pass', + p_series_name =>'Series 1', p_series_query => a1, p_series_type =>'Bar', p_series_query_type =>'SQL_QUERY', p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>15, - p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', - p_show_action_link =>'C', - p_action_link_checksum_type =>''); -end; -/ -declare - a1 varchar2(32767) := null; -begin -a1:=a1||'with q1 as ('||chr(10)|| -'select res.test_run_id LINK'||chr(10)|| -' ,''ID'' || run.id LABEL'||chr(10)|| -' ,res.failures FAIL'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| -' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| -' order by run.id'||chr(10)|| -'), q2 as ('||chr(10)|| -'select count(*) num_rows from q1'||chr(10)|| -')'||chr(10)|| -'select * from q1'||chr(10)|| -' where rownum > (select num_ro'; - -a1:=a1||'ws from q2) - 10'; - -wwv_flow_api.create_flash_chart5_series( - p_id => 4933904400593950+wwv_flow_api.g_id_offset, - p_chart_id => 4932831378476124+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_series_seq =>20, - p_series_name =>'Fail', - p_series_query => a1, - p_series_type =>'Bar', - p_series_query_type =>'SQL_QUERY', - p_series_query_parse_opt =>'PARSE_CHART_QUERY', - p_series_query_no_data_found=>'', - p_series_query_row_count_max=>15, - p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', - p_show_action_link =>'C', - p_action_link_checksum_type =>''); -end; -/ -declare - a1 varchar2(32767) := null; -begin -a1:=a1||'with q1 as ('||chr(10)|| -'select res.test_run_id LINK'||chr(10)|| -' ,''ID'' || run.id LABEL'||chr(10)|| -' ,res.errors ERR'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| -' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| -' order by run.id'||chr(10)|| -'), q2 as ('||chr(10)|| -'select count(*) num_rows from q1'||chr(10)|| -')'||chr(10)|| -'select * from q1'||chr(10)|| -' where rownum > (select num_row'; - -a1:=a1||'s from q2) - 10'; - -wwv_flow_api.create_flash_chart5_series( - p_id => 4934008387632959+wwv_flow_api.g_id_offset, - p_chart_id => 4932831378476124+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_series_seq =>30, - p_series_name =>'Error', - p_series_query => a1, - p_series_type =>'Bar', - p_series_query_type =>'SQL_QUERY', - p_series_query_parse_opt =>'PARSE_CHART_QUERY', - p_series_query_no_data_found=>'', - p_series_query_row_count_max=>15, - p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', + p_series_query_row_count_max=>10, + p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P0_TEST_RUN_ID:#LINK#', p_show_action_link =>'C', p_action_link_checksum_type =>''); end; @@ -5284,13 +2764,13 @@ s:=s||'PLATES#">'||chr(10)|| '#CHART_REFRESH#'; wwv_flow_api.create_page_plug ( - p_id=> 4934122379722218 + wwv_flow_api.g_id_offset, + p_id=> 4861210200133728 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_plug_name=> 'DBOUT Profile Status Trend', + p_page_id=> 1, + p_plug_name=> 'Top Test Case Failures', p_region_name=>'', p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 22, + p_plug_display_sequence=> 2, p_plug_display_column=> 2, p_plug_display_point=> 'BEFORE_SHOW_ITEMS', p_plug_source=> s, @@ -5300,9 +2780,8 @@ wwv_flow_api.create_page_plug ( p_plug_query_row_template=> 1, p_plug_query_headings_type=> 'COLON_DELMITED_LIST', p_plug_query_row_count_max => 500, - p_plug_display_condition_type => 'PLSQL_EXPRESSION', - p_plug_display_when_condition => ':P3_SHOW_TREND=''Y''', - p_plug_display_when_cond2=>'Y', + p_plug_display_condition_type => '', + p_plug_display_when_condition => ':P1_NUM_RUNNERS > 0', p_plug_customized=>'0', p_plug_caching=> 'NOT_CACHED', p_plug_comment=> ''); @@ -5313,17 +2792,17 @@ declare begin a1 := null; wwv_flow_api.create_flash_chart5( - p_id => 4934324926722219+wwv_flow_api.g_id_offset, + p_id => 4861429150133729+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id => 3, - p_region_id => 4934122379722218+wwv_flow_api.g_id_offset, - p_default_chart_type =>'Stacked2DColumn', + p_page_id => 1, + p_region_id => 4861210200133728+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DColumn', p_chart_title =>'', - p_chart_name =>'chart_4932831378476124', + p_chart_name =>'chart_4857903544336332', p_chart_width =>300, - p_chart_height =>200, + p_chart_height =>150, p_chart_animation =>'N', - p_display_attr =>':H:N::Y:N:Left::V:Y:Circle:::N:::Default', + p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', p_dial_tick_attr =>':::::::::::', p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', @@ -5339,7 +2818,7 @@ wwv_flow_api.create_flash_chart5( p_grid_bgcolor2 =>'', p_grid_gradient_rotation =>null, p_color_scheme =>'0', - p_custom_colors =>'#99FF99,#0099FF,#FFFF99,#FF6699', + p_custom_colors =>'#FFFF00', p_map_undef_color_scheme =>'', p_map_undef_custom_colors =>'', p_x_axis_title =>'', @@ -5352,7 +2831,7 @@ wwv_flow_api.create_flash_chart5( p_x_axis_label_font =>'Tahoma:10:#000000', p_x_axis_major_interval =>null, p_x_axis_minor_interval =>null, - p_y_axis_title =>'', + p_y_axis_title =>'Failures', p_y_axis_min =>null, p_y_axis_max =>null, p_y_axis_decimal_place =>null, @@ -5369,7 +2848,7 @@ wwv_flow_api.create_flash_chart5( p_names_font => null, p_names_rotation => null, p_values_font =>'Arial:10:#000000', - p_values_rotation =>null, + p_values_rotation =>90, p_values_prefix =>'', p_values_postfix =>'', p_hints_font =>'Tahoma:10:#000000', @@ -5388,152 +2867,49 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'with q1 as ('||chr(10)|| -'select res.test_run_id LINK'||chr(10)|| -' ,''ID'' || run.id LABEL'||chr(10)|| -' ,res.executed_lines EXEC'||chr(10)|| +a1:=a1||'select ''f?p='' || :APP_ID ||'||chr(10)|| +' '':'' || ''6'' || -- Page'||chr(10)|| +' '':'' || :APP_SESSION ||'||chr(10)|| +' '':'' || :REQUEST ||'||chr(10)|| +' '':'' || :DEBUG ||'||chr(10)|| +' '':'' || ''N'' || -- CLear Cache'||chr(10)|| +' '':'' || ''P0_TEST_RUN_ID'' || '','' ||'||chr(10)|| +' ''P0_TEST_CASE'' || -- Item Names'||chr(10)|| +' '; + +a1:=a1||' '':'' || run.id || '','' ||'||chr(10)|| +' tc.testcase || -- Item Values'||chr(10)|| +' '':'' || V(''PRINTER_FRIENDLY'') LINK'||chr(10)|| +' ,run.runner_owner || ''.'' ||'||chr(10)|| +' run.runner_name || '':'' ||'||chr(10)|| +' tc.testcase LABEL'||chr(10)|| +' ,tc.failures VALUE'||chr(10)|| ' from wt_test_runs run'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| -' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| -' order by run.id'||chr(10)|| -'), q2 as ('||chr(10)|| -'select count(*) num_rows from q1'||chr(10)|| -')'||chr(10)|| -'select * from q1'||chr(10)|| -' where rownum > (select '; +' join wt_testcase_stats tc'||chr(10)|| +' on tc.test_run_'; -a1:=a1||'num_rows from q2) - 10'; +a1:=a1||'id = run.id'||chr(10)|| +' and tc.failures > 0'||chr(10)|| +' where ( :P0_TEST_OWNER is NULL'||chr(10)|| +' or :P0_TEST_OWNER = runner_owner )'||chr(10)|| +' and is_last_run = wtplsql.get_last_run_flag'||chr(10)|| +' order by failures desc, TESTCASE'||chr(10)|| +''; wwv_flow_api.create_flash_chart5_series( - p_id => 4934601765722219+wwv_flow_api.g_id_offset, - p_chart_id => 4934324926722219+wwv_flow_api.g_id_offset, + p_id => 4861511054133729+wwv_flow_api.g_id_offset, + p_chart_id => 4861429150133729+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_series_seq =>10, - p_series_name =>'Executed', + p_series_name =>'Series 1', p_series_query => a1, p_series_type =>'Bar', p_series_query_type =>'SQL_QUERY', p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>15, - p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', - p_show_action_link =>'C', - p_action_link_checksum_type =>''); -end; -/ -declare - a1 varchar2(32767) := null; -begin -a1:=a1||'with q1 as ('||chr(10)|| -'select res.test_run_id LINK'||chr(10)|| -' ,''ID'' || run.id LABEL'||chr(10)|| -' ,res.excluded_lines EXCL'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| -' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| -' order by run.id'||chr(10)|| -'), q2 as ('||chr(10)|| -'select count(*) num_rows from q1'||chr(10)|| -')'||chr(10)|| -'select * from q1'||chr(10)|| -' where rownum > (select '; - -a1:=a1||'num_rows from q2) - 10'; - -wwv_flow_api.create_flash_chart5_series( - p_id => 4934721303769138+wwv_flow_api.g_id_offset, - p_chart_id => 4934324926722219+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_series_seq =>20, - p_series_name =>'Excluded', - p_series_query => a1, - p_series_type =>'Bar', - p_series_query_type =>'SQL_QUERY', - p_series_query_parse_opt =>'PARSE_CHART_QUERY', - p_series_query_no_data_found=>'', - p_series_query_row_count_max=>15, - p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', - p_show_action_link =>'C', - p_action_link_checksum_type =>''); -end; -/ -declare - a1 varchar2(32767) := null; -begin -a1:=a1||'with q1 as ('||chr(10)|| -'select res.test_run_id LINK'||chr(10)|| -' ,''ID'' || run.id LABEL'||chr(10)|| -' ,res.unknown_lines UNKN'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| -' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| -' order by run.id'||chr(10)|| -'), q2 as ('||chr(10)|| -'select count(*) num_rows from q1'||chr(10)|| -')'||chr(10)|| -'select * from q1'||chr(10)|| -' where rownum > (select num'; - -a1:=a1||'_rows from q2) - 10'; - -wwv_flow_api.create_flash_chart5_series( - p_id => 4934527525722219+wwv_flow_api.g_id_offset, - p_chart_id => 4934324926722219+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_series_seq =>30, - p_series_name =>'Unknown', - p_series_query => a1, - p_series_type =>'Bar', - p_series_query_type =>'SQL_QUERY', - p_series_query_parse_opt =>'PARSE_CHART_QUERY', - p_series_query_no_data_found=>'', - p_series_query_row_count_max=>15, - p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', - p_show_action_link =>'C', - p_action_link_checksum_type =>''); -end; -/ -declare - a1 varchar2(32767) := null; -begin -a1:=a1||'with q1 as ('||chr(10)|| -'select res.test_run_id LINK'||chr(10)|| -' ,''ID'' || run.id LABEL'||chr(10)|| -' ,res.notexec_lines NOTX'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| -' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| -' order by run.id'||chr(10)|| -'), q2 as ('||chr(10)|| -'select count(*) num_rows from q1'||chr(10)|| -')'||chr(10)|| -'select * from q1'||chr(10)|| -' where rownum > (select num'; - -a1:=a1||'_rows from q2) - 10'; - -wwv_flow_api.create_flash_chart5_series( - p_id => 4934406303722219+wwv_flow_api.g_id_offset, - p_chart_id => 4934324926722219+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_series_seq =>40, - p_series_name =>'Not Executed', - p_series_query => a1, - p_series_type =>'Bar', - p_series_query_type =>'SQL_QUERY', - p_series_query_parse_opt =>'PARSE_CHART_QUERY', - p_series_query_no_data_found=>'', - p_series_query_row_count_max=>15, - p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', - p_show_action_link =>'C', + p_series_query_row_count_max=>10, + p_action_link =>'', + p_show_action_link =>'N', p_action_link_checksum_type =>''); end; / @@ -5582,13 +2958,13 @@ s:=s||'PLATES#">'||chr(10)|| '#CHART_REFRESH#'; wwv_flow_api.create_page_plug ( - p_id=> 4935906636831213 + wwv_flow_api.g_id_offset, + p_id=> 4861614487144344 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_plug_name=> 'Top Test Case Failures', + p_page_id=> 1, + p_plug_name=> 'Top DBOUT LineExec Times', p_region_name=>'', p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 23, + p_plug_display_sequence=> 6, p_plug_display_column=> 3, p_plug_display_point=> 'BEFORE_SHOW_ITEMS', p_plug_source=> s, @@ -5598,8 +2974,8 @@ wwv_flow_api.create_page_plug ( p_plug_query_row_template=> 1, p_plug_query_headings_type=> 'COLON_DELMITED_LIST', p_plug_query_row_count_max => 500, - p_plug_display_condition_type => 'PLSQL_EXPRESSION', - p_plug_display_when_condition => ':P3_SHOW_TREND=''Y''', + p_plug_display_condition_type => '', + p_plug_display_when_condition => ':P1_NUM_RUNNERS > 0', p_plug_customized=>'0', p_plug_caching=> 'NOT_CACHED', p_plug_comment=> ''); @@ -5610,17 +2986,17 @@ declare begin a1 := null; wwv_flow_api.create_flash_chart5( - p_id => 4936119233831213+wwv_flow_api.g_id_offset, + p_id => 4861806074144344+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id => 3, - p_region_id => 4935906636831213+wwv_flow_api.g_id_offset, + p_page_id => 1, + p_region_id => 4861614487144344+wwv_flow_api.g_id_offset, p_default_chart_type =>'2DColumn', p_chart_title =>'', p_chart_name =>'chart_4857903544336332', p_chart_width =>300, - p_chart_height =>200, + p_chart_height =>150, p_chart_animation =>'N', - p_display_attr =>':H:::Y:N:N::V:Y:None:::N:::Default', + p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', p_dial_tick_attr =>':::::::::::', p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', @@ -5636,7 +3012,7 @@ wwv_flow_api.create_flash_chart5( p_grid_bgcolor2 =>'', p_grid_gradient_rotation =>null, p_color_scheme =>'0', - p_custom_colors =>'#FFFF00', + p_custom_colors =>'#3366FF', p_map_undef_color_scheme =>'', p_map_undef_custom_colors =>'', p_x_axis_title =>'', @@ -5649,7 +3025,7 @@ wwv_flow_api.create_flash_chart5( p_x_axis_label_font =>'Tahoma:10:#000000', p_x_axis_major_interval =>null, p_x_axis_minor_interval =>null, - p_y_axis_title =>'Failures', + p_y_axis_title =>'Milliseconds', p_y_axis_min =>null, p_y_axis_max =>null, p_y_axis_decimal_place =>null, @@ -5666,7 +3042,7 @@ wwv_flow_api.create_flash_chart5( p_names_font => null, p_names_rotation => null, p_values_font =>'Arial:10:#000000', - p_values_rotation =>null, + p_values_rotation =>90, p_values_prefix =>'', p_values_postfix =>'', p_hints_font =>'Tahoma:10:#000000', @@ -5683,50 +3059,321 @@ wwv_flow_api.create_flash_chart5( end; / declare - a1 varchar2(32767) := null; + a1 varchar2(32767) := null; +begin +a1:=a1||'select res.test_run_id LINK'||chr(10)|| +' ,run.dbout_owner || ''.'' ||'||chr(10)|| +' run.dbout_name || ''('' ||'||chr(10)|| +' run.dbout_type || '')'' LABEL'||chr(10)|| +' ,res.max_executed_usecs/1000 VALUE'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' and res.max_executed_usecs > 0'||chr(10)|| +' where ( :P0_TEST_OWNER is NULL'||chr(10)|| +' or :'; + +a1:=a1||'P0_TEST_OWNER = run.runner_owner )'||chr(10)|| +' and run.is_last_run = wtplsql.get_last_run_flag'||chr(10)|| +' order by VALUE desc, LABEL'||chr(10)|| +''; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4861925325144344+wwv_flow_api.g_id_offset, + p_chart_id => 4861806074144344+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>10, + p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P0_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', + p_action_link_checksum_type =>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||'select log_id'||chr(10)|| +' ,start_date'||chr(10)|| +' ,job_name'||chr(10)|| +' ,status'||chr(10)|| +' ,inst'||chr(10)|| +' ,session_id'||chr(10)|| +' ,os_pid'||chr(10)|| +' ,error_num'||chr(10)|| +' ,additional_info'||chr(10)|| +' from wt_scheduler_jobs'||chr(10)|| +' where status != ''SUCCEEDED'''||chr(10)|| +' and ( :P0_TEST_OWNER is null'||chr(10)|| +' or job_name like :P0_TEST_OWNER || ''$%'' )'; + +wwv_flow_api.create_report_region ( + p_id=> 4868303731390297 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 1, + p_name=> 'Selected Test Runner Jobs', + p_region_name=>'', + p_template=> 4840201642414912+ wwv_flow_api.g_id_offset, + p_display_sequence=> 51, + p_report_attributes=>'style="color:#0088FF"', + p_display_column=> 1, + p_display_point=> 'AFTER_SHOW_ITEMS', + p_source=> s, + p_source_type=> 'SQL_QUERY', + p_display_error_message=> '#SQLERRM#', + p_plug_caching=> 'NOT_CACHED', + p_customized=> '0', + p_translate_title=> 'Y', + p_ajax_enabled=> 'Y', + p_query_row_template=> 4843113555414914+ wwv_flow_api.g_id_offset, + p_query_headings_type=> 'COLON_DELMITED_LIST', + p_query_num_rows=> '15', + p_query_options=> 'DERIVED_REPORT_COLUMNS', + p_query_show_nulls_as=> ' - ', + p_query_break_cols=> '0', + p_query_no_data_found=> 'no data found', + p_query_num_rows_type=> 'NEXT_PREVIOUS_LINKS', + p_pagination_display_position=> 'BOTTOM_LEFT', + p_csv_output=> 'N', + p_query_asc_image=> 'apex/builder/dup.gif', + p_query_asc_image_attr=> 'width="16" height="16" alt="" ', + p_query_desc_image=> 'apex/builder/ddown.gif', + p_query_desc_image_attr=> 'width="16" height="16" alt="" ', + p_plug_query_strip_html=> 'Y', + p_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 5037626427564981 + wwv_flow_api.g_id_offset, + p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 1, + p_form_element_id=> null, + p_column_alias=> 'LOG_ID', + p_column_display_sequence=> 1, + p_column_heading=> 'Log ID', + p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', + p_default_sort_column_sequence=>1, + p_default_sort_dir=>'desc', + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 5039813342816631 + wwv_flow_api.g_id_offset, + p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 2, + p_form_element_id=> null, + p_column_alias=> 'START_DATE', + p_column_display_sequence=> 2, + p_column_heading=> 'Start Date', + p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 5037901990564982 + wwv_flow_api.g_id_offset, + p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 3, + p_form_element_id=> null, + p_column_alias=> 'JOB_NAME', + p_column_display_sequence=> 3, + p_column_heading=> 'Job Name', + p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4881232628476372 + wwv_flow_api.g_id_offset, + p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 4, + p_form_element_id=> null, + p_column_alias=> 'STATUS', + p_column_display_sequence=> 4, + p_column_heading=> 'Status', + p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 5038027139564982 + wwv_flow_api.g_id_offset, + p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 5, + p_form_element_id=> null, + p_column_alias=> 'INST', + p_column_display_sequence=> 5, + p_column_heading=> 'Inst', + p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 5038112499564982 + wwv_flow_api.g_id_offset, + p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 6, + p_form_element_id=> null, + p_column_alias=> 'SESSION_ID', + p_column_display_sequence=> 6, + p_column_heading=> 'Session ID', + p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 5039922124816631 + wwv_flow_api.g_id_offset, + p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 7, + p_form_element_id=> null, + p_column_alias=> 'OS_PID', + p_column_display_sequence=> 7, + p_column_heading=> 'OS PID', + p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; begin -a1:=a1||'select ''f?p='' || :APP_ID ||'||chr(10)|| -' '':'' || ''6'' || -- Page'||chr(10)|| -' '':'' || :APP_SESSION ||'||chr(10)|| -' '':'' || :REQUEST ||'||chr(10)|| -' '':'' || :DEBUG ||'||chr(10)|| -' '':'' || ''N'' || -- CLear Cache'||chr(10)|| -' '':'' || ''P6_TEST_RUN_ID'' || '','' ||'||chr(10)|| -' ''P6_TESTCASE_NAME'' || -- Item Names'||chr(10)|| -' '; - -a1:=a1||' '':'' || tc.test_run_id || '','' ||'||chr(10)|| -' tc.testcase || -- Item Values'||chr(10)|| -' '':'' || V(''PRINTER_FRIENDLY'') LINK'||chr(10)|| -' ,run.runner_owner || ''.'' ||'||chr(10)|| -' run.runner_name || '':'' ||'||chr(10)|| -' tc.testcase LABEL'||chr(10)|| -' ,tc.failures VALUE'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_testcase_stats tc'||chr(10)|| -' on tc.test_run_'; - -a1:=a1||'id = run.id'||chr(10)|| -' where run.id = :P3_TEST_RUN_ID'||chr(10)|| -' and tc.failures > 0'||chr(10)|| -' order by failures desc, tc.testcase'||chr(10)|| -''; - -wwv_flow_api.create_flash_chart5_series( - p_id => 4936205597831214+wwv_flow_api.g_id_offset, - p_chart_id => 4936119233831213+wwv_flow_api.g_id_offset, +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 5040017675816631 + wwv_flow_api.g_id_offset, + p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_series_seq =>10, - p_series_name =>'Series 1', - p_series_query => a1, - p_series_type =>'Bar', - p_series_query_type =>'SQL_QUERY', - p_series_query_parse_opt =>'PARSE_CHART_QUERY', - p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>10, - p_action_link =>'', - p_show_action_link =>'N', - p_action_link_checksum_type =>''); + p_query_column_id=> 8, + p_form_element_id=> null, + p_column_alias=> 'ERROR_NUM', + p_column_display_sequence=> 8, + p_column_heading=> 'Error Num', + p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 5038421217564982 + wwv_flow_api.g_id_offset, + p_region_id=> 4868303731390297 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 9, + p_form_element_id=> null, + p_column_alias=> 'ADDITIONAL_INFO', + p_column_display_sequence=> 9, + p_column_heading=> 'Additional Info', + p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); end; / declare @@ -5734,578 +3381,445 @@ declare l_clob clob; l_length number := 1; begin -s:=s||''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -'#CHART_REFRESH#'; +s:=s||'l'; -wwv_flow_api.create_page_plug ( - p_id=> 4946418865544258 + wwv_flow_api.g_id_offset, +wwv_flow_api.create_report_region ( + p_id=> 4869425043509942 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 1, + p_name=> 'Test Runner Errors', + p_region_name=>'', + p_template=> 4840201642414912+ wwv_flow_api.g_id_offset, + p_display_sequence=> 52, + p_report_attributes=>'style="color:#FF0000"', + p_display_column=> 1, + p_display_point=> 'AFTER_SHOW_ITEMS', + p_source=> s, + p_source_type=> 'SQL_QUERY', + p_display_error_message=> '#SQLERRM#', + p_plug_caching=> 'NOT_CACHED', + p_customized=> '0', + p_translate_title=> 'Y', + p_ajax_enabled=> 'Y', + p_query_row_template=> 4843113555414914+ wwv_flow_api.g_id_offset, + p_query_headings_type=> 'COLON_DELMITED_LIST', + p_query_num_rows=> '15', + p_query_options=> 'DERIVED_REPORT_COLUMNS', + p_query_show_nulls_as=> ' - ', + p_query_break_cols=> '0', + p_query_no_data_found=> 'no data found', + p_query_num_rows_type=> 'NEXT_PREVIOUS_LINKS', + p_pagination_display_position=> 'BOTTOM_LEFT', + p_csv_output=> 'N', + p_prn_output=> 'N', + p_prn_format=> 'PDF', + p_prn_output_show_link=> 'Y', + p_prn_output_link_text=> 'Print', + p_prn_content_disposition=> 'ATTACHMENT', + p_prn_document_header=> 'APEX', + p_prn_units=> 'INCHES', + p_prn_paper_size=> 'LETTER', + p_prn_width_units=> 'PERCENTAGE', + p_prn_width=> 11, + p_prn_height=> 8.5, + p_prn_orientation=> 'HORIZONTAL', + p_prn_page_header_font_color=> '#000000', + p_prn_page_header_font_family=> 'Helvetica', + p_prn_page_header_font_weight=> 'normal', + p_prn_page_header_font_size=> '12', + p_prn_page_footer_font_color=> '#000000', + p_prn_page_footer_font_family=> 'Helvetica', + p_prn_page_footer_font_weight=> 'normal', + p_prn_page_footer_font_size=> '12', + p_prn_header_bg_color=> '#9bafde', + p_prn_header_font_color=> '#ffffff', + p_prn_header_font_family=> 'Helvetica', + p_prn_header_font_weight=> 'normal', + p_prn_header_font_size=> '10', + p_prn_body_bg_color=> '#efefef', + p_prn_body_font_color=> '#000000', + p_prn_body_font_family=> 'Helvetica', + p_prn_body_font_weight=> 'normal', + p_prn_body_font_size=> '10', + p_prn_border_width=> .5, + p_prn_page_header_alignment=> 'CENTER', + p_prn_page_footer_alignment=> 'CENTER', + p_query_asc_image=> 'apex/builder/dup.gif', + p_query_asc_image_attr=> 'width="16" height="16" alt="" ', + p_query_desc_image=> 'apex/builder/ddown.gif', + p_query_desc_image_attr=> 'width="16" height="16" alt="" ', + p_plug_query_strip_html=> 'Y', + p_comment=>''); +end; +/ + +-- maintain plug_column_width attribute for 2.2 and greater +begin +execute immediate 'begin wwv_flow_api.set_region_column_width ( + p_id=>4869425043509942 + wwv_flow_api.g_id_offset, + p_flow_id=>wwv_flow.g_flow_id, + p_page_id=>1, + p_plug_column_width=>''style="color:red"''); end;'; +exception when others then null; +end; +/ + +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4871606819864244 + wwv_flow_api.g_id_offset, + p_region_id=> 4869425043509942 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 1, + p_form_element_id=> null, + p_column_alias=> 'ID', + p_column_display_sequence=> 1, + p_column_heading=> 'Test Run ID', + p_column_link=>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P0_TEST_RUN_ID:#ID#', + p_column_linktext=>'#ID#', + p_column_alignment=>'LEFT', + p_heading_alignment=>'RIGHT', + p_default_sort_column_sequence=>2, + p_default_sort_dir=>'desc', + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_lov_show_nulls=> 'NO', + p_is_required=> false, + p_pk_col_source=> s, + p_lov_display_extra=> 'YES', + p_include_in_export=> 'Y', + p_print_col_width=> '20', + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4869808842509943 + wwv_flow_api.g_id_offset, + p_region_id=> 4869425043509942 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_plug_name=> 'Test Runner Duration Trend', - p_region_name=>'', - p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 31, - p_plug_display_column=> 1, - p_plug_display_point=> 'BEFORE_SHOW_ITEMS', - p_plug_source=> s, - p_plug_source_type=> 'FLASH_CHART5', - p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', - p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'COLON_DELMITED_LIST', - p_plug_query_row_count_max => 500, - p_plug_display_condition_type => 'PLSQL_EXPRESSION', - p_plug_display_when_condition => ':P3_SHOW_TREND=''Y''', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); + p_query_column_id=> 2, + p_form_element_id=> null, + p_column_alias=> 'TEST_RUNNER', + p_column_display_sequence=> 2, + p_column_heading=> 'Test Runner Package', + p_column_alignment=>'LEFT', + p_heading_alignment=>'LEFT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_lov_show_nulls=> 'NO', + p_is_required=> false, + p_pk_col_source=> s, + p_lov_display_extra=> 'YES', + p_include_in_export=> 'Y', + p_print_col_width=> '20', + p_column_comment=>''); end; / declare - a1 varchar2(32767) := null; + s varchar2(32767) := null; begin -a1 := null; -wwv_flow_api.create_flash_chart5( - p_id => 4946607806544261+wwv_flow_api.g_id_offset, +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4869907123509943 + wwv_flow_api.g_id_offset, + p_region_id=> 4869425043509942 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id => 3, - p_region_id => 4946418865544258+wwv_flow_api.g_id_offset, - p_default_chart_type =>'2DColumn', - p_chart_title =>'', - p_chart_name =>'chart_4946607806544261', - p_chart_width =>300, - p_chart_height =>200, - p_chart_animation =>'N', - p_display_attr =>':H:N::Y:N:N::V:Y:None:::N:::Default', - p_dial_tick_attr =>':::::::::::', - p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', - p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', - p_map_source =>'', - p_margins =>':::', - p_omit_label_interval => null, - p_bgtype =>'Trans', - p_bgcolor1 =>'', - p_bgcolor2 =>'', - p_gradient_rotation =>null, - p_grid_bgtype =>'', - p_grid_bgcolor1 =>'', - p_grid_bgcolor2 =>'', - p_grid_gradient_rotation =>null, - p_color_scheme =>'6', - p_custom_colors =>'', - p_map_undef_color_scheme =>'', - p_map_undef_custom_colors =>'', - p_x_axis_title =>'', - p_x_axis_min =>null, - p_x_axis_max =>null, - p_x_axis_decimal_place =>2, - p_x_axis_prefix =>'', - p_x_axis_postfix =>'', - p_x_axis_label_rotation =>'', - p_x_axis_label_font =>'Tahoma:10:#000000', - p_x_axis_major_interval =>null, - p_x_axis_minor_interval =>null, - p_y_axis_title =>'Seconds', - p_y_axis_min =>null, - p_y_axis_max =>null, - p_y_axis_decimal_place =>2, - p_y_axis_prefix =>'', - p_y_axis_postfix =>'', - p_y_axis_label_rotation =>'', - p_y_axis_label_font =>'Tahoma:10:#000000', - p_y_axis_major_interval =>null, - p_y_axis_minor_interval =>null, - p_async_update =>'N', - p_async_time =>null, - p_legend_title =>'', - p_legend_title_font =>'', - p_names_font => null, - p_names_rotation => null, - p_values_font =>'Arial:10:#000000', - p_values_rotation =>null, - p_values_prefix =>'', - p_values_postfix =>'', - p_hints_font =>'Tahoma:10:#000000', - p_legend_font =>'Arial:10:#000000', - p_grid_labels_font =>'', - p_chart_title_font =>'Tahoma:14:#000000', - p_x_axis_title_font =>'Tahoma:14:#000000', - p_x_axis_title_rotation =>'', - p_y_axis_title_font =>'Tahoma:14:#000000', - p_y_axis_title_rotation =>'', - p_gauge_labels_font =>'Tahoma:10:', - p_use_chart_xml =>'N', - p_chart_xml => a1); + p_query_column_id=> 3, + p_form_element_id=> null, + p_column_alias=> 'DBOUT_PROFILED', + p_column_display_sequence=> 3, + p_column_heading=> 'DB Object Under Test', + p_column_alignment=>'LEFT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_include_in_export=> 'Y', + p_print_col_width=> '20', + p_column_comment=>''); end; / declare - a1 varchar2(32767) := null; + s varchar2(32767) := null; begin -a1:=a1||'with q1 as ('||chr(10)|| -'select res.test_run_id LINK'||chr(10)|| -' ,''ID'' || run.id LABEL'||chr(10)|| -' ,extract(day from (run.end_dtm - run.start_dtm)*86400*100)/100'||chr(10)|| -' SECONDS'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| -' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| -' order by id'||chr(10)|| -'), q2 as ('||chr(10)|| -'select count(*'; - -a1:=a1||') num_rows from q1'||chr(10)|| -')'||chr(10)|| -'select * from q1'||chr(10)|| -' where rownum > (select num_rows from q2) - 10'; - -wwv_flow_api.create_flash_chart5_series( - p_id => 4946720535544262+wwv_flow_api.g_id_offset, - p_chart_id => 4946607806544261+wwv_flow_api.g_id_offset, +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4870003732509943 + wwv_flow_api.g_id_offset, + p_region_id=> 4869425043509942 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_series_seq =>10, - p_series_name =>'Series 1', - p_series_query => a1, - p_series_type =>'Bar', - p_series_query_type =>'SQL_QUERY', - p_series_query_parse_opt =>'PARSE_CHART_QUERY', - p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>15, - p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', - p_show_action_link =>'C', - p_action_link_checksum_type =>''); + p_query_column_id=> 4, + p_form_element_id=> null, + p_column_alias=> 'START_DTM', + p_column_display_sequence=> 4, + p_column_heading=> 'Start Date/Time', + p_column_alignment=>'LEFT', + p_default_sort_column_sequence=>1, + p_default_sort_dir=>'desc', + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_include_in_export=> 'Y', + p_print_col_width=> '20', + p_column_comment=>''); end; / declare s varchar2(32767) := null; - l_clob clob; - l_length number := 1; begin -s:=s||''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -'#CHART_REFRESH#'; +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4870105383509943 + wwv_flow_api.g_id_offset, + p_region_id=> 4869425043509942 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 5, + p_form_element_id=> null, + p_column_alias=> 'ERROR_MESSAGE', + p_column_display_sequence=> 5, + p_column_heading=> 'Error Message', + p_column_alignment=>'LEFT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_include_in_export=> 'Y', + p_print_col_width=> '20', + p_column_comment=>''); +end; +/ + +begin + +null; + +end; +/ -wwv_flow_api.create_page_plug ( - p_id=> 4948217713035992 + wwv_flow_api.g_id_offset, + +begin + +wwv_flow_api.create_page_branch( + p_id=>4852128982276097 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_plug_name=> 'Maximum Profiled LineExec Trend', - p_region_name=>'', - p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 32, - p_plug_display_column=> 2, - p_plug_display_point=> 'BEFORE_SHOW_ITEMS', - p_plug_source=> s, - p_plug_source_type=> 'FLASH_CHART5', - p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', - p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'COLON_DELMITED_LIST', - p_plug_query_row_count_max => 500, - p_plug_display_condition_type => 'PLSQL_EXPRESSION', - p_plug_display_when_condition => ':P3_SHOW_TREND=''Y''', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); + p_flow_step_id=> 1, + p_branch_action=> 'f?p=&FLOW_ID.:1:&SESSION.', + p_branch_point=> 'AFTER_PROCESSING', + p_branch_type=> 'REDIRECT_URL', + p_branch_sequence=> 99, + p_save_state_before_branch_yn=>'Y', + p_branch_comment=> ''); + + end; / -declare - a1 varchar2(32767) := null; + + begin -a1 := null; -wwv_flow_api.create_flash_chart5( - p_id => 4948428749035997+wwv_flow_api.g_id_offset, + +wwv_flow_api.create_page_computation( + p_id=> 5111815015291792 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id => 3, - p_region_id => 4948217713035992+wwv_flow_api.g_id_offset, - p_default_chart_type =>'2DColumn', - p_chart_title =>'', - p_chart_name =>'chart_4948428749035997', - p_chart_width =>300, - p_chart_height =>200, - p_chart_animation =>'N', - p_display_attr =>':H:N::Y:N:N::V:Y:None:::N:::Default', - p_dial_tick_attr =>':::::::::::', - p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', - p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', - p_map_source =>'%', - p_margins =>':::', - p_omit_label_interval => null, - p_bgtype =>'Trans', - p_bgcolor1 =>'', - p_bgcolor2 =>'', - p_gradient_rotation =>null, - p_grid_bgtype =>'', - p_grid_bgcolor1 =>'', - p_grid_bgcolor2 =>'', - p_grid_gradient_rotation =>null, - p_color_scheme =>'6', - p_custom_colors =>'', - p_map_undef_color_scheme =>'', - p_map_undef_custom_colors =>'', - p_x_axis_title =>'', - p_x_axis_min =>null, - p_x_axis_max =>null, - p_x_axis_decimal_place =>null, - p_x_axis_prefix =>'', - p_x_axis_postfix =>'', - p_x_axis_label_rotation =>'', - p_x_axis_label_font =>'Tahoma:10:#000000', - p_x_axis_major_interval =>null, - p_x_axis_minor_interval =>null, - p_y_axis_title =>'MicroSeconds', - p_y_axis_min =>0, - p_y_axis_max =>null, - p_y_axis_decimal_place =>null, - p_y_axis_prefix =>'', - p_y_axis_postfix =>'', - p_y_axis_label_rotation =>'', - p_y_axis_label_font =>'Tahoma:10:#000000', - p_y_axis_major_interval =>null, - p_y_axis_minor_interval =>null, - p_async_update =>'N', - p_async_time =>null, - p_legend_title =>'', - p_legend_title_font =>'', - p_names_font => null, - p_names_rotation => null, - p_values_font =>'Arial:10:#000000', - p_values_rotation =>null, - p_values_prefix =>'', - p_values_postfix =>'', - p_hints_font =>'Tahoma:10:#000000', - p_legend_font =>'Arial:10:#000000', - p_grid_labels_font =>'', - p_chart_title_font =>'Tahoma:14:#000000', - p_x_axis_title_font =>'Tahoma:14:#000000', - p_x_axis_title_rotation =>'', - p_y_axis_title_font =>'Tahoma:14:#000000', - p_y_axis_title_rotation =>'', - p_gauge_labels_font =>'Tahoma:10:', - p_use_chart_xml =>'N', - p_chart_xml => a1); + p_flow_step_id=> 1, + p_computation_sequence => 10, + p_computation_item=> 'P0_DISPLAY', + p_computation_point=> 'BEFORE_HEADER', + p_computation_type=> 'STATIC_ASSIGNMENT', + p_computation_processed=> 'REPLACE_EXISTING', + p_computation=> 'Y', + p_compute_when => '', + p_compute_when_type=>''); + +null; + end; / -declare - a1 varchar2(32767) := null; -begin -a1:=a1||'with q1 as ('||chr(10)|| -'select res.test_run_id LINK'||chr(10)|| -' ,''ID'' || run.id LABEL'||chr(10)|| -' ,res.max_executed_usecs VALUE'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_test_run_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' where run.runner_owner = :P3_RUNNER_OWNER'||chr(10)|| -' and run.runner_name = :P3_RUNNER_NAME'||chr(10)|| -' order by id'||chr(10)|| -'), q2 as ('||chr(10)|| -'select count(*) num_rows from q1'||chr(10)|| -')'||chr(10)|| -'select * from q1'||chr(10)|| -' where rownum >'; -a1:=a1||' (select num_rows from q2) - 10'; + +begin + +--------------------------------------- +-- ...updatable report columns for page 1 +-- + +begin + +null; +end; +null; + +end; +/ -wwv_flow_api.create_flash_chart5_series( - p_id => 4948500124035997+wwv_flow_api.g_id_offset, - p_chart_id => 4948428749035997+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_series_seq =>10, - p_series_name =>'Series 1', - p_series_query => a1, - p_series_type =>'Bar', - p_series_query_type =>'SQL_QUERY', - p_series_query_parse_opt =>'PARSE_CHART_QUERY', - p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>15, - p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#LINK#', - p_show_action_link =>'C', - p_action_link_checksum_type =>''); + +--application/pages/page_00002 +prompt ...PAGE 2: Run Test +-- + +begin + +wwv_flow_api.create_page ( + p_flow_id => wwv_flow.g_flow_id + ,p_id => 2 + ,p_tab_set => 'TS1' + ,p_name => 'Run Test' + ,p_alias => 'RUNTEST' + ,p_step_title => 'Run Test' + ,p_allow_duplicate_submissions => 'Y' + ,p_step_sub_title => 'Run Test' + ,p_step_sub_title_type => 'TEXT_WITH_SUBSTITUTIONS' + ,p_first_item => 'AUTO_FIRST_ITEM' + ,p_include_apex_css_js_yn => 'Y' + ,p_autocomplete_on_off => 'ON' + ,p_page_is_public_y_n => 'N' + ,p_protection_level => 'N' + ,p_cache_page_yn => 'N' + ,p_cache_timeout_seconds => 21600 + ,p_cache_by_user_yn => 'N' + ,p_help_text => +'No help is available for this page.' + ,p_last_updated_by => 'WTP' + ,p_last_upd_yyyymmddhh24miss => '20180901224458' + ); +null; + end; / + declare s varchar2(32767) := null; l_clob clob; l_length number := 1; begin -s:=s||''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -'#CHART_REFRESH#'; +s:=s||'NTER_FRIENDLY'') ||'||chr(10)|| +' ''">'' || last_run_id ||'||chr(10)|| +' '' (Click to View)'' || ''
      '');'||chr(10)|| +' else'||chr(10)|| +' htp.p(''Same ID
      '');'||chr(10)|| +' end if;'||chr(10)|| +' htp.p(''
      '');'||chr(10)|| +' htp.p(''
      '');'||chr(10)|| +'exception when NO_DATA_FOUND'||chr(10)|| +'then'||chr(10)|| +' htp.p(''Last Test Run Not found
      '');'||chr(10)|| +' htp.p(''
      '');'||chr(10)|| +' htp.p(''
      '');'||chr(10)|| +'end;'; wwv_flow_api.create_page_plug ( - p_id=> 4948625219180073 + wwv_flow_api.g_id_offset, + p_id=> 4847515458414925 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_plug_name=> 'Top Test Case Long Duration', - p_region_name=>'', - p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 33, - p_plug_display_column=> 3, - p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_page_id=> 2, + p_plug_name=> 'Run Test', + p_region_name=>'', + p_plug_template=> 4839912075414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 10, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_BOX_BODY', p_plug_source=> s, - p_plug_source_type=> 'FLASH_CHART5', + p_plug_source_type=> 'PLSQL_PROCEDURE', p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', p_plug_query_row_template=> 1, p_plug_query_headings_type=> 'COLON_DELMITED_LIST', p_plug_query_row_count_max => 500, - p_plug_display_condition_type => 'PLSQL_EXPRESSION', - p_plug_display_when_condition => ':P3_SHOW_TREND=''Y''', + p_plug_column_width => 'td width="320"', + p_plug_display_condition_type => '', p_plug_customized=>'0', p_plug_caching=> 'NOT_CACHED', p_plug_comment=> ''); end; / -declare - a1 varchar2(32767) := null; -begin -a1 := null; -wwv_flow_api.create_flash_chart5( - p_id => 4948812894180073+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id => 3, - p_region_id => 4948625219180073+wwv_flow_api.g_id_offset, - p_default_chart_type =>'2DColumn', - p_chart_title =>'', - p_chart_name =>'chart_4948812894180073', - p_chart_width =>300, - p_chart_height =>200, - p_chart_animation =>'N', - p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', - p_dial_tick_attr =>':::::::::::', - p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', - p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', - p_map_source =>'', - p_margins =>':::', - p_omit_label_interval => null, - p_bgtype =>'Trans', - p_bgcolor1 =>'', - p_bgcolor2 =>'', - p_gradient_rotation =>null, - p_grid_bgtype =>'', - p_grid_bgcolor1 =>'', - p_grid_bgcolor2 =>'', - p_grid_gradient_rotation =>null, - p_color_scheme =>'6', - p_custom_colors =>'', - p_map_undef_color_scheme =>'', - p_map_undef_custom_colors =>'', - p_x_axis_title =>'', - p_x_axis_min =>null, - p_x_axis_max =>null, - p_x_axis_decimal_place =>null, - p_x_axis_prefix =>'', - p_x_axis_postfix =>'', - p_x_axis_label_rotation =>'', - p_x_axis_label_font =>'Tahoma:10:#000000', - p_x_axis_major_interval =>null, - p_x_axis_minor_interval =>null, - p_y_axis_title =>'MilliSeconds', - p_y_axis_min =>0, - p_y_axis_max =>null, - p_y_axis_decimal_place =>null, - p_y_axis_prefix =>'', - p_y_axis_postfix =>'', - p_y_axis_label_rotation =>'', - p_y_axis_label_font =>'Tahoma:10:#000000', - p_y_axis_major_interval =>null, - p_y_axis_minor_interval =>null, - p_async_update =>'N', - p_async_time =>null, - p_legend_title =>'', - p_legend_title_font =>'', - p_names_font => null, - p_names_rotation => null, - p_values_font =>'Arial:10:#000000', - p_values_rotation =>null, - p_values_prefix =>'', - p_values_postfix =>'', - p_hints_font =>'Tahoma:10:#000000', - p_legend_font =>'Arial:10:#000000', - p_grid_labels_font =>'', - p_chart_title_font =>'Tahoma:14:#000000', - p_x_axis_title_font =>'Tahoma:14:#000000', - p_x_axis_title_rotation =>'', - p_y_axis_title_font =>'Tahoma:14:#000000', - p_y_axis_title_rotation =>'', - p_gauge_labels_font =>'Tahoma:10:', - p_use_chart_xml =>'N', - p_chart_xml => a1); -end; -/ -declare - a1 varchar2(32767) := null; -begin -a1:=a1||'select ''f?p='' || :APP_ID ||'||chr(10)|| -' '':'' || ''6'' || -- Page'||chr(10)|| -' '':'' || :APP_SESSION ||'||chr(10)|| -' '':'' || :REQUEST ||'||chr(10)|| -' '':'' || :DEBUG ||'||chr(10)|| -' '':'' || ''N'' || -- CLear Cache'||chr(10)|| -' '':'' || ''P6_TEST_RUN_ID'' || '','' ||'||chr(10)|| -' ''P6_TESTCASE_NAME'' || -- Item Names'||chr(10)|| -' '; - -a1:=a1||' '':'' || test_run_id || '','' ||'||chr(10)|| -' testcase || -- Item Values'||chr(10)|| -' '':'' || V(''PRINTER_FRIENDLY'') LINK'||chr(10)|| -' ,testcase LABEL'||chr(10)|| -' ,tot_interval_msecs VALUE'||chr(10)|| -' from wt_testcase_stats'||chr(10)|| -' where test_run_id = :P3_TEST_RUN_ID'||chr(10)|| -' order by tot_interval_msecs desc'||chr(10)|| -''; - -wwv_flow_api.create_flash_chart5_series( - p_id => 4948907337180074+wwv_flow_api.g_id_offset, - p_chart_id => 4948812894180073+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_series_seq =>10, - p_series_name =>'Series 1', - p_series_query => a1, - p_series_type =>'Bar', - p_series_query_type =>'SQL_QUERY', - p_series_query_parse_opt =>'PARSE_CHART_QUERY', - p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>10, - p_action_link =>'', - p_show_action_link =>'N', - p_action_link_checksum_type =>''); -end; -/ declare s varchar2(32767) := null; l_clob clob; l_length number := 1; begin -s:=s||'select test_run_id'||chr(10)|| -' ,result_seq SEQ'||chr(10)|| -' ,executed_dtm EXECUTED_DATE_TIME'||chr(10)|| -' ,interval_msecs MSECS'||chr(10)|| -' ,assertion'||chr(10)|| +s:=s||'select log_id'||chr(10)|| +' ,start_date'||chr(10)|| +' ,job_name'||chr(10)|| ' ,status'||chr(10)|| -' ,details'||chr(10)|| -' ,testcase'||chr(10)|| -' ,message'||chr(10)|| -' from wt_results'||chr(10)|| -' where test_run_id = :P3_TEST_RUN_ID'; +' ,inst'||chr(10)|| +' ,session_id'||chr(10)|| +' ,os_pid'||chr(10)|| +' ,error_num'||chr(10)|| +' ,additional_info'||chr(10)|| +' from wt_scheduler_jobs'||chr(10)|| +'-- where job_name like :APP_USER || ''$%'''; wwv_flow_api.create_page_plug ( - p_id=> 4949525229387041 + wwv_flow_api.g_id_offset, + p_id=> 4885513244116318 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_plug_name=> 'Test Runner Results Details', + p_page_id=> 2, + p_plug_name=> 'DBMS_SCHEDULER Jobs', p_region_name=>'', p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 20, + p_plug_display_sequence=> 40, p_plug_display_column=> 1, p_plug_display_point=> 'AFTER_SHOW_ITEMS', p_plug_source=> s, @@ -6325,31 +3839,31 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'select test_run_id'||chr(10)|| -' ,result_seq SEQ'||chr(10)|| -' ,executed_dtm EXECUTED_DATE_TIME'||chr(10)|| -' ,interval_msecs MSECS'||chr(10)|| -' ,assertion'||chr(10)|| +a1:=a1||'select log_id'||chr(10)|| +' ,start_date'||chr(10)|| +' ,job_name'||chr(10)|| ' ,status'||chr(10)|| -' ,details'||chr(10)|| -' ,testcase'||chr(10)|| -' ,message'||chr(10)|| -' from wt_results'||chr(10)|| -' where test_run_id = :P3_TEST_RUN_ID'; +' ,inst'||chr(10)|| +' ,session_id'||chr(10)|| +' ,os_pid'||chr(10)|| +' ,error_num'||chr(10)|| +' ,additional_info'||chr(10)|| +' from wt_scheduler_jobs'||chr(10)|| +'-- where job_name like :APP_USER || ''$%'''; wwv_flow_api.create_worksheet( - p_id=> 4949624635387041+wwv_flow_api.g_id_offset, + p_id=> 4885631457116318+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_region_id=> 4949525229387041+wwv_flow_api.g_id_offset, - p_name=> 'Test Runner Results Details', + p_page_id=> 2, + p_region_id=> 4885513244116318+wwv_flow_api.g_id_offset, + p_name=> 'List of APEX PLSQL Jobs', p_folder_id=> null, p_alias=> '', p_report_id_item=> '', p_max_row_count=> '10000', p_max_row_count_message=> 'This query returns more than #MAX_ROW_COUNT# rows, please filter your data to ensure complete results.', p_no_data_found_message=> 'No data found.', - p_max_rows_per_page=>'', + p_max_rows_per_page=>'10', p_search_button_label=>'', p_page_items_to_submit=>'', p_sort_asc_image=>'', @@ -6362,7 +3876,8 @@ wwv_flow_api.create_worksheet( p_allow_save_rpt_public=>'N', p_allow_report_categories=>'N', p_show_nulls_as=>'-', - p_pagination_display_pos=>'BOTTOM_RIGHT', + p_pagination_type=>'ROWS_X_TO_Y', + p_pagination_display_pos=>'BOTTOM_LEFT', p_show_finder_drop_down=>'Y', p_show_display_row_count=>'N', p_show_search_bar=>'Y', @@ -6397,16 +3912,16 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 5046210513880502+wwv_flow_api.g_id_offset, + p_id => 5032410666172454+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, - p_db_column_name =>'TEST_RUN_ID', + p_page_id=> 2, + p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, + p_db_column_name =>'LOG_ID', p_display_order =>1, p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'M', - p_column_label =>'Test Run ID', - p_report_label =>'Test Run ID', + p_column_identifier =>'B', + p_column_label =>'Log ID', + p_report_label =>'Log ID', p_sync_form_label =>'Y', p_display_in_default_rpt =>'Y', p_is_sortable =>'Y', @@ -6435,16 +3950,16 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 4951219968424536+wwv_flow_api.g_id_offset, + p_id => 5039132211784254+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, - p_db_column_name =>'SEQ', + p_page_id=> 2, + p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, + p_db_column_name =>'START_DATE', p_display_order =>2, p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'J', - p_column_label =>'Seq', - p_report_label =>'Seq', + p_column_identifier =>'K', + p_column_label =>'Start Date', + p_report_label =>'Start Date', p_sync_form_label =>'Y', p_display_in_default_rpt =>'Y', p_is_sortable =>'Y', @@ -6459,11 +3974,11 @@ wwv_flow_api.create_worksheet_column( p_allow_hide =>'Y', p_others_may_edit =>'Y', p_others_may_view =>'Y', - p_column_type =>'NUMBER', + p_column_type =>'DATE', p_display_as =>'TEXT', p_display_text_as =>'ESCAPE_SC', p_heading_alignment =>'CENTER', - p_column_alignment =>'RIGHT', + p_column_alignment =>'LEFT', p_tz_dependent =>'N', p_rpt_distinct_lov =>'Y', p_rpt_show_filter_lov =>'D', @@ -6473,16 +3988,54 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 4951309893424536+wwv_flow_api.g_id_offset, + p_id => 5032729825172455+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, - p_db_column_name =>'EXECUTED_DATE_TIME', + p_page_id=> 2, + p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, + p_db_column_name =>'JOB_NAME', p_display_order =>3, p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'K', - p_column_label =>'Executed Date/Time', - p_report_label =>'Executed Date/Time', + p_column_identifier =>'E', + p_column_label =>'Job Name', + p_report_label =>'Job Name', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4885819894116324+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 2, + p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, + p_db_column_name =>'STATUS', + p_display_order =>4, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'A', + p_column_label =>'Status', + p_report_label =>'Status', p_sync_form_label =>'Y', p_display_in_default_rpt =>'Y', p_is_sortable =>'Y', @@ -6497,7 +4050,7 @@ wwv_flow_api.create_worksheet_column( p_allow_hide =>'Y', p_others_may_edit =>'Y', p_others_may_view =>'Y', - p_column_type =>'DATE', + p_column_type =>'STRING', p_display_as =>'TEXT', p_display_text_as =>'ESCAPE_SC', p_heading_alignment =>'CENTER', @@ -6511,16 +4064,16 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 4951430855424536+wwv_flow_api.g_id_offset, + p_id => 5039226462784262+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, - p_db_column_name =>'MSECS', - p_display_order =>4, + p_page_id=> 2, + p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, + p_db_column_name =>'INST', + p_display_order =>5, p_group_id =>null+wwv_flow_api.g_id_offset, p_column_identifier =>'L', - p_column_label =>'Msecs', - p_report_label =>'Msecs', + p_column_label =>'Inst', + p_report_label =>'Inst', p_sync_form_label =>'Y', p_display_in_default_rpt =>'Y', p_is_sortable =>'Y', @@ -6549,16 +4102,16 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 4950228064387045+wwv_flow_api.g_id_offset, + p_id => 5040419669875210+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, - p_db_column_name =>'ASSERTION', - p_display_order =>5, + p_page_id=> 2, + p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, + p_db_column_name =>'SESSION_ID', + p_display_order =>6, p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'E', - p_column_label =>'Assertion', - p_report_label =>'Assertion', + p_column_identifier =>'O', + p_column_label =>'Session ID', + p_report_label =>'Session ID', p_sync_form_label =>'Y', p_display_in_default_rpt =>'Y', p_is_sortable =>'Y', @@ -6573,11 +4126,11 @@ wwv_flow_api.create_worksheet_column( p_allow_hide =>'Y', p_others_may_edit =>'Y', p_others_may_view =>'Y', - p_column_type =>'STRING', + p_column_type =>'NUMBER', p_display_as =>'TEXT', p_display_text_as =>'ESCAPE_SC', p_heading_alignment =>'CENTER', - p_column_alignment =>'LEFT', + p_column_alignment =>'RIGHT', p_tz_dependent =>'N', p_rpt_distinct_lov =>'Y', p_rpt_show_filter_lov =>'D', @@ -6587,16 +4140,16 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 4950325498387045+wwv_flow_api.g_id_offset, + p_id => 5040526819875210+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, - p_db_column_name =>'STATUS', - p_display_order =>6, + p_page_id=> 2, + p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, + p_db_column_name =>'OS_PID', + p_display_order =>7, p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'F', - p_column_label =>'Status', - p_report_label =>'Status', + p_column_identifier =>'P', + p_column_label =>'OS PID', + p_report_label =>'OS PID', p_sync_form_label =>'Y', p_display_in_default_rpt =>'Y', p_is_sortable =>'Y', @@ -6611,11 +4164,11 @@ wwv_flow_api.create_worksheet_column( p_allow_hide =>'Y', p_others_may_edit =>'Y', p_others_may_view =>'Y', - p_column_type =>'STRING', + p_column_type =>'NUMBER', p_display_as =>'TEXT', p_display_text_as =>'ESCAPE_SC', p_heading_alignment =>'CENTER', - p_column_alignment =>'LEFT', + p_column_alignment =>'RIGHT', p_tz_dependent =>'N', p_rpt_distinct_lov =>'Y', p_rpt_show_filter_lov =>'D', @@ -6625,16 +4178,16 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 4950430581387045+wwv_flow_api.g_id_offset, + p_id => 5039401783784262+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, - p_db_column_name =>'DETAILS', - p_display_order =>7, + p_page_id=> 2, + p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, + p_db_column_name =>'ERROR_NUM', + p_display_order =>8, p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'G', - p_column_label =>'Details', - p_report_label =>'Details', + p_column_identifier =>'N', + p_column_label =>'Error Num', + p_report_label =>'Error Num', p_sync_form_label =>'Y', p_display_in_default_rpt =>'Y', p_is_sortable =>'Y', @@ -6649,11 +4202,11 @@ wwv_flow_api.create_worksheet_column( p_allow_hide =>'Y', p_others_may_edit =>'Y', p_others_may_view =>'Y', - p_column_type =>'STRING', + p_column_type =>'NUMBER', p_display_as =>'TEXT', p_display_text_as =>'ESCAPE_SC', p_heading_alignment =>'CENTER', - p_column_alignment =>'LEFT', + p_column_alignment =>'RIGHT', p_tz_dependent =>'N', p_rpt_distinct_lov =>'Y', p_rpt_show_filter_lov =>'D', @@ -6663,21 +4216,18 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 4950523632387045+wwv_flow_api.g_id_offset, + p_id => 5033208190172456+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, - p_db_column_name =>'TESTCASE', - p_display_order =>8, + p_page_id=> 2, + p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, + p_db_column_name =>'ADDITIONAL_INFO', + p_display_order =>9, p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'H', - p_column_label =>'Testcase', - p_report_label =>'Testcase', + p_column_identifier =>'J', + p_column_label =>'Additional Info', + p_report_label =>'Additional Info', p_sync_form_label =>'Y', p_display_in_default_rpt =>'Y', - p_column_link =>'f?p=&APP_ID.:6:&SESSION.::&DEBUG.::P6_TEST_RUN_ID,P6_TESTCASE_NAME:#TEST_RUN_ID#,#TESTCASE#', - p_column_linktext =>'#TESTCASE#', - p_column_link_attr =>'title="Go To Test Case #TESTCASE#" style="color:blue"', p_is_sortable =>'Y', p_allow_sorting =>'Y', p_allow_filtering =>'Y', @@ -6702,547 +4252,1082 @@ wwv_flow_api.create_worksheet_column( p_help_text =>''); end; / +declare + rc1 varchar2(32767) := null; +begin +rc1:=rc1||'LOG_ID:START_DATE:JOB_NAME:STATUS:INST:SESSION_ID:OS_PID:ERROR_NUM:ADDITIONAL_INFO'; + +wwv_flow_api.create_worksheet_rpt( + p_id => 4886308472128052+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 2, + p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, + p_session_id => null, + p_base_report_id => null+wwv_flow_api.g_id_offset, + p_application_user => 'APXWS_DEFAULT', + p_report_seq =>10, + p_report_alias =>'48864', + p_status =>'PUBLIC', + p_category_id =>null+wwv_flow_api.g_id_offset, + p_is_default =>'Y', + p_display_rows =>10, + p_report_columns =>rc1, + p_sort_column_1 =>'LOG_ID', + p_sort_direction_1 =>'DESC', + p_sort_column_2 =>'0', + p_sort_direction_2 =>'DESC', + p_sort_column_3 =>'0', + p_sort_direction_3 =>'ASC', + p_sort_column_4 =>'0', + p_sort_direction_4 =>'ASC', + p_sort_column_5 =>'0', + p_sort_direction_5 =>'ASC', + p_sort_column_6 =>'0', + p_sort_direction_6 =>'ASC', + p_flashback_enabled =>'N', + p_calendar_display_column =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_condition( + p_id => 5039623254809995+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 2, + p_worksheet_id => 4885631457116318+wwv_flow_api.g_id_offset, + p_report_id => 4886308472128052+wwv_flow_api.g_id_offset, + p_condition_type =>'FILTER', + p_allow_delete =>'Y', + p_column_name =>'STATUS', + p_operator =>'=', + p_expr =>'RUNNING', + p_condition_sql =>'"STATUS" = #APXWS_EXPR#', + p_condition_display =>'#APXWS_COL_NAME# = ''RUNNING'' ', + p_enabled =>'Y', + p_column_format =>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s := null; +wwv_flow_api.create_page_plug ( + p_id=> 5024330300632423 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 2, + p_plug_name=> 'Test Runner Jobs Setup', + p_region_name=>'', + p_plug_template=> 4839912075414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 20, + p_plug_display_column=> 3, + p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_source=> s, + p_plug_source_type=> 'STATIC_TEXT', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'QUERY_COLUMNS', + p_plug_query_num_rows => 15, + p_plug_query_num_rows_type => 'NEXT_PREVIOUS_LINKS', + p_plug_query_row_count_max => 500, + p_plug_query_show_nulls_as => ' - ', + p_plug_display_condition_type => '', + p_pagination_display_position=>'BOTTOM_RIGHT', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||'select arg.owner TEST_RUNNER_OWNER'||chr(10)|| +' ,dbl.db_link'||chr(10)|| +' ,dbl.username'||chr(10)|| +' ,dbl.host'||chr(10)|| +' ,dbl.created'||chr(10)|| +' ,case when dbl.username is null'||chr(10)|| +' then'||chr(10)|| +' ''Username missing'''||chr(10)|| +' when dbl.host is null'||chr(10)|| +' then'||chr(10)|| +' ''Host value missing'''||chr(10)|| +' when dbl.db_link != dbl'; + +s:=s||'.username'||chr(10)|| +' then'||chr(10)|| +' ''DB Link != Username'''||chr(10)|| +' else'||chr(10)|| +' ''Good Link'''||chr(10)|| +' end LINK_STATUS'||chr(10)|| +' from dba_arguments arg'||chr(10)|| +' left join user_db_links dbl'||chr(10)|| +' on dbl.db_link = arg.owner'||chr(10)|| +' or dbl.username = arg.owner'||chr(10)|| +' where object_name = ''WTPLSQL_RUN'''||chr(10)|| +' and argume'; + +s:=s||'nt_name is null'||chr(10)|| +' and position = 1'||chr(10)|| +' and sequence = 0'||chr(10)|| +' group by arg.owner'||chr(10)|| +' ,dbl.db_link'||chr(10)|| +' ,dbl.username'||chr(10)|| +' ,dbl.host'||chr(10)|| +' ,dbl.created'||chr(10)|| +''; + +wwv_flow_api.create_report_region ( + p_id=> 5180621438298420 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 2, + p_name=> 'All Test Runner Owners', + p_region_name=>'', + p_template=> 4840201642414912+ wwv_flow_api.g_id_offset, + p_display_sequence=> 30, + p_display_column=> 1, + p_display_point=> 'BEFORE_SHOW_ITEMS', + p_source=> s, + p_source_type=> 'SQL_QUERY', + p_display_error_message=> '#SQLERRM#', + p_display_when_condition=> 'P2_SHOW_OWNERS', + p_display_when_cond2=> 'Y', + p_display_condition_type=> 'VAL_OF_ITEM_IN_COND_EQ_COND2', + p_plug_caching=> 'NOT_CACHED', + p_customized=> '0', + p_translate_title=> 'Y', + p_ajax_enabled=> 'Y', + p_query_row_template=> 4843113555414914+ wwv_flow_api.g_id_offset, + p_query_headings_type=> 'COLON_DELMITED_LIST', + p_query_num_rows=> '15', + p_query_options=> 'DERIVED_REPORT_COLUMNS', + p_query_show_nulls_as=> ' - ', + p_query_break_cols=> '0', + p_query_no_data_found=> 'no data found', + p_query_num_rows_type=> 'NEXT_PREVIOUS_LINKS', + p_pagination_display_position=> 'BOTTOM_RIGHT', + p_csv_output=> 'N', + p_query_asc_image=> 'apex/builder/dup.gif', + p_query_asc_image_attr=> 'width="16" height="16" alt="" ', + p_query_desc_image=> 'apex/builder/ddown.gif', + p_query_desc_image_attr=> 'width="16" height="16" alt="" ', + p_plug_query_strip_html=> 'Y', + p_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 5182216515391627 + wwv_flow_api.g_id_offset, + p_region_id=> 5180621438298420 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 1, + p_form_element_id=> null, + p_column_alias=> 'TEST_RUNNER_OWNER', + p_column_display_sequence=> 1, + p_column_heading=> 'Test Runner Owner', + p_column_link=>'f?p=&APP_ID.:2:&SESSION.::&DEBUG.::P0_TEST_OWNER:#TEST_RUNNER_OWNER#', + p_column_linktext=>'#TEST_RUNNER_OWNER#', + p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', + p_default_sort_column_sequence=>1, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_lov_show_nulls=> 'NO', + p_is_required=> false, + p_pk_col_source=> s, + p_lov_display_extra=> 'YES', + p_include_in_export=> 'Y', + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 5181215424303709 + wwv_flow_api.g_id_offset, + p_region_id=> 5180621438298420 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 2, + p_form_element_id=> null, + p_column_alias=> 'DB_LINK', + p_column_display_sequence=> 2, + p_column_heading=> 'Db Link', + p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; begin -wwv_flow_api.create_worksheet_column( - p_id => 4950607731387045+wwv_flow_api.g_id_offset, +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 5181332039303709 + wwv_flow_api.g_id_offset, + p_region_id=> 5180621438298420 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, - p_db_column_name =>'MESSAGE', - p_display_order =>9, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'I', - p_column_label =>'Message', - p_report_label =>'Message', - p_sync_form_label =>'Y', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'STRING', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'CENTER', - p_column_alignment =>'LEFT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); + p_query_column_id=> 3, + p_form_element_id=> null, + p_column_alias=> 'USERNAME', + p_column_display_sequence=> 3, + p_column_heading=> 'Username', + p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); end; / declare - rc1 varchar2(32767) := null; + s varchar2(32767) := null; begin -rc1:=rc1||'TEST_RUN_ID:SEQ:EXECUTED_DATE_TIME:MSECS:STATUS:TESTCASE:ASSERTION:MESSAGE:DETAILS'; - -wwv_flow_api.create_worksheet_rpt( - p_id => 4950724292387987+wwv_flow_api.g_id_offset, +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 5181428671303709 + wwv_flow_api.g_id_offset, + p_region_id=> 5180621438298420 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, - p_session_id => null, - p_base_report_id => null+wwv_flow_api.g_id_offset, - p_application_user => 'APXWS_DEFAULT', - p_report_seq =>10, - p_report_alias =>'49508', - p_status =>'PUBLIC', - p_category_id =>null+wwv_flow_api.g_id_offset, - p_is_default =>'Y', - p_display_rows =>100000, - p_report_columns =>rc1, - p_sort_column_1 =>'SEQ', - p_sort_direction_1 =>'ASC', - p_flashback_enabled =>'N', - p_calendar_display_column =>''); + p_query_column_id=> 4, + p_form_element_id=> null, + p_column_alias=> 'HOST', + p_column_display_sequence=> 4, + p_column_heading=> 'Host', + p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); end; / +declare + s varchar2(32767) := null; begin -wwv_flow_api.create_worksheet_condition( - p_id => 5046424584891526+wwv_flow_api.g_id_offset, +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 5181522703303709 + wwv_flow_api.g_id_offset, + p_region_id=> 5180621438298420 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, - p_report_id => 4950724292387987+wwv_flow_api.g_id_offset, - p_name =>'Highlight Errors', - p_condition_type =>'HIGHLIGHT', - p_allow_delete =>'Y', - p_column_name =>'STATUS', - p_operator =>'=', - p_expr =>'ERR', - p_condition_sql =>' (case when ("STATUS" = #APXWS_EXPR#) then #APXWS_HL_ID# end) ', - p_condition_display =>'#APXWS_COL_NAME# = ''ERR'' ', - p_enabled =>'Y', - p_highlight_sequence =>10, - p_row_bg_color =>'#FF5588', - p_column_format =>''); + p_query_column_id=> 5, + p_form_element_id=> null, + p_column_alias=> 'CREATED', + p_column_display_sequence=> 5, + p_column_heading=> 'Created', + p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); end; / +declare + s varchar2(32767) := null; begin -wwv_flow_api.create_worksheet_condition( - p_id => 5046501496891526+wwv_flow_api.g_id_offset, +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 5181806987351019 + wwv_flow_api.g_id_offset, + p_region_id=> 5180621438298420 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, - p_report_id => 4950724292387987+wwv_flow_api.g_id_offset, - p_name =>'Highlight Failures', - p_condition_type =>'HIGHLIGHT', - p_allow_delete =>'Y', - p_column_name =>'STATUS', - p_operator =>'=', - p_expr =>'FAIL', - p_condition_sql =>' (case when ("STATUS" = #APXWS_EXPR#) then #APXWS_HL_ID# end) ', - p_condition_display =>'#APXWS_COL_NAME# = ''FAIL'' ', - p_enabled =>'Y', - p_highlight_sequence =>10, - p_row_bg_color =>'#FFFF99', - p_column_format =>''); + p_query_column_id=> 6, + p_form_element_id=> null, + p_column_alias=> 'LINK_STATUS', + p_column_display_sequence=> 6, + p_column_heading=> 'Link Status', + p_column_alignment=>'LEFT', + p_heading_alignment=>'CENTER', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'WITHOUT_MODIFICATION', + p_lov_show_nulls=> 'NO', + p_is_required=> false, + p_pk_col_source=> s, + p_lov_display_extra=> 'YES', + p_include_in_export=> 'Y', + p_column_comment=>''); end; / + begin -wwv_flow_api.create_worksheet_condition( - p_id => 5046315838891526+wwv_flow_api.g_id_offset, + +wwv_flow_api.create_page_button( + p_id => 5173925590382378 + wwv_flow_api.g_id_offset, + p_flow_id => wwv_flow.g_flow_id, + p_flow_step_id => 2, + p_button_sequence=> 10, + p_button_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, + p_button_name => 'RUN_TEST', + p_button_image => 'template:'||to_char(4838226535414911+wwv_flow_api.g_id_offset), + p_button_image_alt=> 'Run Test', + p_button_position=> 'ABOVE_BOX', + p_button_alignment=> 'LEFT', + p_button_redirect_url=> '', + p_button_execute_validations=>'Y', + p_button_condition=> 'P2_DB_LINK_HOST', + p_button_condition_type=> 'ITEM_IS_NOT_NULL', + p_required_patch => null + wwv_flow_api.g_id_offset); + +wwv_flow_api.create_page_button( + p_id => 4943012566012609 + wwv_flow_api.g_id_offset, + p_flow_id => wwv_flow.g_flow_id, + p_flow_step_id => 2, + p_button_sequence=> 20, + p_button_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, + p_button_name => 'P3_TEST_ALL', + p_button_image => 'template:'||to_char(4838306817414911+wwv_flow_api.g_id_offset), + p_button_image_alt=> 'Run All Tests for This Owner', + p_button_position=> 'BOTTOM', + p_button_alignment=> 'LEFT', + p_button_redirect_url=> 'javascript:confirmDelete(''Run all Tests for Owner &P0_TEST_OWNER.'', ''TEST_ALL'')', + p_button_execute_validations=>'Y', + p_button_condition=> 'P2_DB_LINK_HOST', + p_button_condition_type=> 'ITEM_IS_NOT_NULL', + p_required_patch => null + wwv_flow_api.g_id_offset); + +wwv_flow_api.create_page_button( + p_id => 5182629852433290 + wwv_flow_api.g_id_offset, + p_flow_id => wwv_flow.g_flow_id, + p_flow_step_id => 2, + p_button_sequence=> 30, + p_button_plug_id => 5180621438298420+wwv_flow_api.g_id_offset, + p_button_name => 'P2_TEST_ALL_SEQ', + p_button_image => 'template:'||to_char(4838306817414911+wwv_flow_api.g_id_offset), + p_button_image_alt=> 'Run All Tests for All Owners Sequentially', + p_button_position=> 'BOTTOM', + p_button_alignment=> 'LEFT', + p_button_redirect_url=> 'javascript:confirmDelete(''Run all Tests for all Owners, one after another'', ''TEST_ALL_SEQ'')', + p_button_execute_validations=>'Y', + p_button_condition=> 'P2_DB_LINK_HOST', + p_required_patch => null + wwv_flow_api.g_id_offset); + +wwv_flow_api.create_page_button( + p_id => 5183117778458242 + wwv_flow_api.g_id_offset, + p_flow_id => wwv_flow.g_flow_id, + p_flow_step_id => 2, + p_button_sequence=> 40, + p_button_plug_id => 5180621438298420+wwv_flow_api.g_id_offset, + p_button_name => 'P2_TEST_ALL_PAR', + p_button_image => 'template:'||to_char(4838306817414911+wwv_flow_api.g_id_offset), + p_button_image_alt=> 'Run All Tests for All Owners in Parallel', + p_button_position=> 'BOTTOM', + p_button_alignment=> 'LEFT', + p_button_redirect_url=> 'javascript:confirmDelete(''Run all Tests for all Owners with all Owners running at the same time'', ''TEST_ALL_PAR'')', + p_button_execute_validations=>'Y', + p_button_condition=> 'P2_DB_LINK_HOST', + p_required_patch => null + wwv_flow_api.g_id_offset); + + +end; +/ + + +begin + +wwv_flow_api.create_page_branch( + p_id=>4941327317931667 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, - p_report_id => 4950724292387987+wwv_flow_api.g_id_offset, - p_condition_type =>'FILTER', - p_allow_delete =>'Y', - p_column_name =>'STATUS', - p_operator =>'!=', - p_expr =>'PASS', - p_condition_sql =>'"STATUS" != #APXWS_EXPR#', - p_condition_display =>'#APXWS_COL_NAME# != ''PASS'' ', - p_enabled =>'Y', - p_column_format =>''); + p_flow_step_id=> 2, + p_branch_action=> 'f?p=&APP_ID.:1:&SESSION.::&DEBUG.:::&success_msg=#SUCCESS_MSG#', + p_branch_point=> 'AFTER_PROCESSING', + p_branch_type=> 'REDIRECT_URL', + p_branch_sequence=> 10, + p_branch_condition_type=> 'REQUEST_EQUALS_CONDITION', + p_branch_condition=> 'TEST_ALL', + p_save_state_before_branch_yn=>'Y', + p_branch_comment=> 'Created 07-JUL-2018 11:52 by WTP'); + +wwv_flow_api.create_page_branch( + p_id=>4877001457701994 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 2, + p_branch_action=> 'f?p=&APP_ID.:2:&SESSION.::&DEBUG.:::&success_msg=#SUCCESS_MSG#', + p_branch_point=> 'AFTER_PROCESSING', + p_branch_type=> 'REDIRECT_URL', + p_branch_sequence=> 99, + p_save_state_before_branch_yn=>'Y', + p_branch_comment=> ''); + + end; / + declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; + h varchar2(32767) := null; begin -s:=s||'begin'||chr(10)|| -' if :P3_TEST_RUN_ERROR is NOT NULL'||chr(10)|| -' then'||chr(10)|| -' htp.p(''Test Runner Error Message: '' ||'||chr(10)|| -' :P3_TEST_RUN_ERROR || ''
      '');'||chr(10)|| -' end if;'||chr(10)|| -' htp.p(''
      '');'||chr(10)|| -' htp.p(''
      '');'||chr(10)|| +wwv_flow_api.create_page_item( + p_id=>4884208416023999 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 2, + p_name=>'P2_JOBS_PARAMETER', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 1, + p_item_plug_id => 5024330300632423+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'PLSQL', + p_attribute_03 => 'begin'||chr(10)|| +' htp.p(''Job Queue Process Parameter:
      '');'||chr(10)|| +' htp.p(''
        '');'||chr(10)|| +' for buff in ('||chr(10)|| +' select inst_id, value'||chr(10)|| +' from sys.gv_$parameter'||chr(10)|| +' where name = ''job_queue_processes'''||chr(10)|| +' order by inst_id )'||chr(10)|| +' loop'||chr(10)|| +' -- Set these as list items'||chr(10)|| +' htp.p(''
      • '');'||chr(10)|| +' if buff.value > 0'||chr(10)|| +' then'||chr(10)|| +' htp.p(''Instance '' || buff.inst_id ||'||chr(10)|| +' '': '' || buff.value ||'||chr(10)|| +' '''');'||chr(10)|| +' else'||chr(10)|| +' htp.p(''Instance '' || buff.inst_id ||'||chr(10)|| +' '': '' || buff.value ||'||chr(10)|| +' '''');'||chr(10)|| +' end if;'||chr(10)|| +' htp.p(''
      • '');'||chr(10)|| +' end loop;'||chr(10)|| +' htp.p(''
      '');'||chr(10)|| ' htp.p(''
      '');'||chr(10)|| -' htp.p(''Test Results Details Search:
      '');'||chr(10)|| -'end;'||chr(10)|| -''; +'end;', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ -wwv_flow_api.create_page_plug ( - p_id=> 4957623889633835 + wwv_flow_api.g_id_offset, +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>5026010934853871 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_plug_name=> 'Test Run Error Message', - p_region_name=>'', - p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 10, - p_plug_display_column=> 1, - p_plug_display_point=> 'AFTER_SHOW_ITEMS', - p_plug_source=> s, - p_plug_source_type=> 'PLSQL_PROCEDURE', - p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', - p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'QUERY_COLUMNS', - p_plug_query_num_rows => 15, - p_plug_query_num_rows_type => 'NEXT_PREVIOUS_LINKS', - p_plug_query_row_count_max => 500, - p_plug_query_show_nulls_as => ' - ', - p_plug_display_condition_type => '', - p_pagination_display_position=>'BOTTOM_RIGHT', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); + p_flow_step_id=> 2, + p_name=>'P2_RESET_DB_LINK', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 6, + p_item_plug_id => 5024330300632423+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'NO', + p_item_default=> 'RESET_DB_LINK', + p_prompt=>'Reset DB Link', + p_source=>'RESET_DB_LINK', + p_source_type=> 'STATIC', + p_display_as=> 'BUTTON', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> null, + p_cMaxlength=> 2000, + p_cHeight=> null, + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT', + p_display_when=>'P0_TEST_OWNER', + p_display_when_type=>'ITEM_IS_NOT_NULL', + p_is_persistent=> 'N', + p_button_execute_validations=>'Y', + p_item_comment => ''); + + end; / + declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; + h varchar2(32767) := null; begin -s := null; -wwv_flow_api.create_page_plug ( - p_id=> 4971511333490098 + wwv_flow_api.g_id_offset, +wwv_flow_api.create_page_item( + p_id=>5027508136976108 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_plug_name=> 'Code Coverage Details', - p_region_name=>'', - p_plug_template=> 4839416734414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 30, - p_plug_display_column=> 1, - p_plug_display_point=> 'AFTER_SHOW_ITEMS', - p_plug_source=> s, - p_plug_source_type=> 'STATIC_TEXT', - p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', - p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'QUERY_COLUMNS', - p_plug_query_num_rows_type => 'NEXT_PREVIOUS_LINKS', - p_plug_query_row_count_max => 500, - p_plug_query_show_nulls_as => ' - ', - p_plug_display_condition_type => 'PLSQL_EXPRESSION', - p_plug_display_when_condition => ':P3_DBOUT_NAME is NOT NULL', - p_pagination_display_position=>'BOTTOM_RIGHT', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); + p_flow_step_id=> 2, + p_name=>'P2_PASSWORD', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 5, + p_item_plug_id => 5024330300632423+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Password:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_PASSWORD', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 15, + p_cMaxlength=> 128, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT', + p_display_when=>'P0_TEST_OWNER', + p_display_when_type=>'ITEM_IS_NOT_NULL', + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + end; / + declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; + h varchar2(32767) := null; begin -s := null; -wwv_flow_api.create_page_plug ( - p_id=> 4952328298578419 + wwv_flow_api.g_id_offset, +wwv_flow_api.create_page_item( + p_id=>5028532733058845 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_plug_name=> 'Code Coverage Search', - p_region_name=>'', - p_parent_plug_id=>4971511333490098 + wwv_flow_api.g_id_offset, - p_plug_template=> 4840023588414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 50, - p_plug_display_column=> 1, - p_plug_display_point=> 'AFTER_SHOW_ITEMS', - p_plug_source=> s, - p_plug_source_type=> 'STATIC_TEXT', - p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', - p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'COLON_DELMITED_LIST', - p_plug_query_row_count_max => 500, - p_plug_display_condition_type => '', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); + p_flow_step_id=> 2, + p_name=>'P2_NEW_DB_LINK_HOST', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 4, + p_item_plug_id => 5024330300632423+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'New DB Link Host:', + p_source=>'''//localhost:1521/'' || SYS_CONTEXT(''USERENV'',''DB_NAME'')', + p_source_type=> 'FUNCTION', + p_display_as=> 'NATIVE_TEXT_FIELD', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 20, + p_cMaxlength=> 50, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_display_when=>'P0_TEST_OWNER', + p_display_when_type=>'ITEM_IS_NOT_NULL', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'N', + p_show_quick_picks=>'N', + p_item_comment => ''); + + end; / + declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; + h varchar2(32767) := null; begin -s:=s||'select line'||chr(10)|| -' ,status'||chr(10)|| -' ,total_occur'||chr(10)|| -' ,round(min_usecs) MIN_USECS'||chr(10)|| -' ,case when total_occur = 0 then 0'||chr(10)|| -' else round(total_usecs/total_occur)'||chr(10)|| -' end AVG_USECS'||chr(10)|| -' ,round(max_usecs) MAX_USECS'||chr(10)|| -' ,replace(htf.escape_sc(rtrim(text,CHR(10))),'' '',''  '')'||chr(10)|| -' TEXT'||chr(10)|| -' from wt_dbout_profil'; - -s:=s||'es'||chr(10)|| -' where test_run_id = :P3_TEST_RUN_ID'||chr(10)|| -' -- and status != ''IGNR'''||chr(10)|| -' and ( instr(upper("STATUS"),upper(nvl(:P3_SEARCH,"STATUS"))) > 0'||chr(10)|| -' OR instr(upper("TEXT"),upper(nvl(:P3_SEARCH,"TEXT"))) > 0 )'||chr(10)|| -''; - -wwv_flow_api.create_report_region ( - p_id=> 4952405887578432 + wwv_flow_api.g_id_offset, +wwv_flow_api.create_page_item( + p_id=>5029510053130586 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 3, - p_name=> 'Code Coverage Report', - p_region_name=>'', - p_parent_plug_id=>4971511333490098 + wwv_flow_api.g_id_offset, - p_template=> 4839912075414912+ wwv_flow_api.g_id_offset, - p_display_sequence=> 60, - p_report_attributes=>'style="font-family: monospace"', - p_display_column=> 1, - p_display_point=> 'AFTER_SHOW_ITEMS', - p_source=> s, - p_source_type=> 'SQL_QUERY', - p_display_error_message=> '#SQLERRM#', - p_display_when_condition=> 'P3_DBOUT_NAME', - p_plug_caching=> 'NOT_CACHED', - p_customized=> '0', - p_translate_title=> 'Y', - p_ajax_enabled=> 'Y', - p_query_row_template=> 4963602874586482+ wwv_flow_api.g_id_offset, - p_query_headings_type=> 'COLON_DELMITED_LIST', - p_query_options=> 'DERIVED_REPORT_COLUMNS', - p_query_show_nulls_as=> ' - ', - p_query_break_cols=> '0', - p_query_no_data_found=> 'no data found', - p_query_num_rows_item=> 'P3_ROWS', - p_query_num_rows_type=> 'ROW_RANGES_IN_SELECT_LIST', - p_query_row_count_max=> '5000', - p_pagination_display_position=> 'BOTTOM_LEFT', - p_csv_output=> 'Y', - p_csv_output_link_text=> 'Create CVS File', - p_prn_output=> 'N', - p_prn_format=> 'PDF', - p_prn_output_show_link=> 'Y', - p_prn_output_link_text=> 'Print', - p_prn_content_disposition=> 'ATTACHMENT', - p_prn_document_header=> 'APEX', - p_prn_units=> 'INCHES', - p_prn_paper_size=> 'LETTER', - p_prn_width_units=> 'PERCENTAGE', - p_prn_width=> 11, - p_prn_height=> 8.5, - p_prn_orientation=> 'HORIZONTAL', - p_prn_page_header_font_color=> '#000000', - p_prn_page_header_font_family=> 'Helvetica', - p_prn_page_header_font_weight=> 'normal', - p_prn_page_header_font_size=> '12', - p_prn_page_footer_font_color=> '#000000', - p_prn_page_footer_font_family=> 'Helvetica', - p_prn_page_footer_font_weight=> 'normal', - p_prn_page_footer_font_size=> '12', - p_prn_header_bg_color=> '#9bafde', - p_prn_header_font_color=> '#ffffff', - p_prn_header_font_family=> 'Helvetica', - p_prn_header_font_weight=> 'normal', - p_prn_header_font_size=> '10', - p_prn_body_bg_color=> '#efefef', - p_prn_body_font_color=> '#000000', - p_prn_body_font_family=> 'Helvetica', - p_prn_body_font_weight=> 'normal', - p_prn_body_font_size=> '10', - p_prn_border_width=> .5, - p_prn_page_header_alignment=> 'CENTER', - p_prn_page_footer_alignment=> 'CENTER', - p_query_asc_image=> 'apex/builder/dup.gif', - p_query_asc_image_attr=> 'width="16" height="16" alt="" ', - p_query_desc_image=> 'apex/builder/ddown.gif', - p_query_desc_image_attr=> 'width="16" height="16" alt="" ', - p_plug_query_exp_filename=> '&P3_DBOUT_OWNER..&P3_DBOUT_NAME.(&P3_DBOUT_TYPE.)#&P3_TEST_RUN_ID..csv', - p_plug_query_exp_separator=> ',', - p_plug_query_exp_enclosed_by=> '"', - p_plug_query_strip_html=> 'N', - p_comment=>''); + p_flow_step_id=> 2, + p_name=>'P2_DB_LINK_HOST', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 3, + p_item_plug_id => 5024330300632423+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'DB Link Host:', + p_pre_element_text=>'', + p_post_element_text=>'', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_display_when=>'P0_TEST_OWNER', + p_display_when_type=>'ITEM_IS_NOT_NULL', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => 'Set by a page computation before header.'); + + end; / + declare - s varchar2(32767) := null; + h varchar2(32767) := null; begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 4956416987578441 + wwv_flow_api.g_id_offset, - p_region_id=> 4952405887578432 + wwv_flow_api.g_id_offset, +wwv_flow_api.create_page_item( + p_id=>5044818450655759 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 1, - p_form_element_id=> null, - p_column_alias=> 'LINE', - p_column_display_sequence=> 1, - p_column_heading=> 'Line', - p_column_alignment=>'RIGHT', - p_heading_alignment=>'RIGHT', - p_default_sort_column_sequence=>1, - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'ESCAPE_SC', + p_flow_step_id=> 2, + p_name=>'P2_DB_LINK_NAME', + p_data_type=> 'VARCHAR', p_is_required=> false, - p_pk_col_source=> s, - p_include_in_export=> 'Y', - p_print_col_width=> '14', - p_column_comment=>''); + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 2, + p_item_plug_id => 5024330300632423+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'DB Link Name:', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_display_when=>'P0_TEST_OWNER', + p_display_when_type=>'ITEM_IS_NOT_NULL', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'PLSQL', + p_attribute_03 => 'begin'||chr(10)|| +' htp.p(:P0_TEST_OWNER);'||chr(10)|| +'end;', + p_show_quick_picks=>'N', + p_item_comment => ''); + + end; / + declare - s varchar2(32767) := null; + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>5179801820226564 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 2, + p_name=>'P2_SHOW_OWNERS', + p_data_type=> 'VARCHAR', + p_is_required=> true, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 10, + p_item_plug_id => 4847515458414925+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Show All Test Runner Owners:', + p_source=>'N', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_RADIOGROUP', + p_named_lov=> 'Y_OR_N', + p_lov=> '.'||to_char(4923728354614299 + wwv_flow_api.g_id_offset)||'.', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => '2', + p_attribute_02 => 'SUBMIT', + p_attribute_03 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + +end; +/ + + begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 4956504864578441 + wwv_flow_api.g_id_offset, - p_region_id=> 4952405887578432 + wwv_flow_api.g_id_offset, + +wwv_flow_api.create_page_computation( + p_id=> 5112015839301513 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 2, - p_form_element_id=> null, - p_column_alias=> 'STATUS', - p_column_display_sequence=> 2, - p_column_heading=> 'Status', - p_column_alignment=>'LEFT', - p_heading_alignment=>'LEFT', - p_default_sort_column_sequence=>0, - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'ESCAPE_SC', - p_is_required=> false, - p_pk_col_source=> s, - p_include_in_export=> 'Y', - p_print_col_width=> '14', - p_column_comment=>''); + p_flow_step_id=> 2, + p_computation_sequence => 10, + p_computation_item=> 'P0_DISPLAY', + p_computation_point=> 'BEFORE_HEADER', + p_computation_type=> 'STATIC_ASSIGNMENT', + p_computation_processed=> 'REPLACE_EXISTING', + p_computation=> 'Y', + p_compute_when => '', + p_compute_when_type=>''); + +null; + end; / -declare - s varchar2(32767) := null; + + begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 4956610572578441 + wwv_flow_api.g_id_offset, - p_region_id=> 4952405887578432 + wwv_flow_api.g_id_offset, + +wwv_flow_api.create_page_computation( + p_id=> 5174632347422111 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 3, - p_form_element_id=> null, - p_column_alias=> 'TOTAL_OCCUR', - p_column_display_sequence=> 3, - p_column_heading=> 'Total
      Occur', - p_column_alignment=>'RIGHT', - p_heading_alignment=>'RIGHT', - p_default_sort_column_sequence=>0, - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'ESCAPE_SC', - p_is_required=> false, - p_pk_col_source=> s, - p_include_in_export=> 'Y', - p_print_col_width=> '14', - p_column_comment=>''); + p_flow_step_id=> 2, + p_computation_sequence => 10, + p_computation_item=> 'P2_DB_LINK_HOST', + p_computation_point=> 'BEFORE_HEADER', + p_computation_type=> 'QUERY', + p_computation_processed=> 'REPLACE_EXISTING', + p_computation=> 'select host'||chr(10)|| +' from user_db_links'||chr(10)|| +' where db_link = :P0_TEST_OWNER', + p_compute_when => '', + p_compute_when_type=>''); + +null; + end; / + + +begin + declare - s varchar2(32767) := null; + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 4956712638578441 + wwv_flow_api.g_id_offset, - p_region_id=> 4952405887578432 + wwv_flow_api.g_id_offset, +p:=p||'DECLARE'||chr(10)|| +' run_str varchar2(2000) := ''wtplsql.test_run@'' ||'||chr(10)|| +' :P0_TEST_OWNER || ''('''''' ||'||chr(10)|| +' :P0_TEST_RUNNER || '''''')'' ;'||chr(10)|| +'BEGIN'||chr(10)|| +' DBMS_SCHEDULER.CREATE_JOB'||chr(10)|| +' (job_name => substr(:P0_TEST_OWNER || ''$'' || :P0_TEST_RUNNER, 1, 30)'||chr(10)|| +' ,job_type => ''PLSQL_BLOCK'''||chr(10)|| +' ,job_action => ''begin '' || run_str || ''; commit; end;'''||chr(10)|| +' '; + +p:=p||' ,comments => run_str'||chr(10)|| +' ,enabled => TRUE);'||chr(10)|| +' COMMIT;'||chr(10)|| +'END;'; + +wwv_flow_api.create_page_process( + p_id => 4876513059692293 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 4, - p_form_element_id=> null, - p_column_alias=> 'MIN_USECS', - p_column_display_sequence=> 4, - p_column_heading=> 'Min
      Usecs', - p_column_alignment=>'RIGHT', - p_heading_alignment=>'RIGHT', - p_default_sort_column_sequence=>0, - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'ESCAPE_SC', - p_is_required=> false, - p_pk_col_source=> s, - p_include_in_export=> 'Y', - p_print_col_width=> '14', - p_column_comment=>''); + p_flow_step_id => 2, + p_process_sequence=> 10, + p_process_point=> 'AFTER_SUBMIT', + p_process_type=> 'PLSQL', + p_process_name=> 'RUN_TEST', + p_process_sql_clob => p, + p_process_error_message=> '', + p_process_when=>'RUN_TEST', + p_process_when_type=>'REQUEST_EQUALS_CONDITION', + p_process_success_message=> '', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; +null; + end; / + + +begin + declare - s varchar2(32767) := null; + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 4956829235578441 + wwv_flow_api.g_id_offset, - p_region_id=> 4952405887578432 + wwv_flow_api.g_id_offset, +p:=p||'DECLARE'||chr(10)|| +' run_str varchar2(2000) := ''wtplsql.test_all@'' || :P0_TEST_OWNER;'||chr(10)|| +'BEGIN'||chr(10)|| +' DBMS_SCHEDULER.CREATE_JOB'||chr(10)|| +' (job_name => substr(:P0_TEST_OWNER || ''$TEST$ALL'', 1, 30)'||chr(10)|| +' ,job_type => ''PLSQL_BLOCK'''||chr(10)|| +' ,job_action => ''begin '' || run_str || ''; commit; end;'''||chr(10)|| +' ,comments => run_str'||chr(10)|| +' ,enabled => TRUE);'||chr(10)|| +' COMMIT;'||chr(10)|| +'END;'; + +wwv_flow_api.create_page_process( + p_id => 4941719483938905 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 5, - p_form_element_id=> null, - p_column_alias=> 'AVG_USECS', - p_column_display_sequence=> 5, - p_column_heading=> 'Avg
      Usecs', - p_column_alignment=>'RIGHT', - p_heading_alignment=>'RIGHT', - p_default_sort_column_sequence=>0, - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'ESCAPE_SC', - p_is_required=> false, - p_pk_col_source=> s, - p_include_in_export=> 'Y', - p_print_col_width=> '14', - p_column_comment=>''); + p_flow_step_id => 2, + p_process_sequence=> 20, + p_process_point=> 'AFTER_SUBMIT', + p_process_type=> 'PLSQL', + p_process_name=> 'TEST_ALL', + p_process_sql_clob => p, + p_process_error_message=> 'Failed to submit job (&P2_LAST_JOB_ID.)', + p_process_when=>'TEST_ALL', + p_process_when_type=>'REQUEST_EQUALS_CONDITION', + p_process_success_message=> 'Successful submitted job &P2_LAST_JOB_ID.', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; +null; + end; / + + +begin + declare - s varchar2(32767) := null; + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 4956928135578441 + wwv_flow_api.g_id_offset, - p_region_id=> 4952405887578432 + wwv_flow_api.g_id_offset, +p:=p||'DECLARE'||chr(10)|| +' run_str varchar2(32000);'||chr(10)|| +'BEGIN'||chr(10)|| +' -- String all the "Test Alls" into one PL/SQL Block'||chr(10)|| +' for buff in ('||chr(10)|| +' select arg.owner TEST_OWNER'||chr(10)|| +' from dba_arguments arg'||chr(10)|| +' join user_db_links dbl'||chr(10)|| +' on dbl.db_link = arg.owner'||chr(10)|| +' and dbl.db_link = dbl.username'||chr(10)|| +' and dbl.username is not null'||chr(10)|| +' and dbl.'; + +p:=p||'host is not null'||chr(10)|| +' where object_name = ''WTPLSQL_RUN'''||chr(10)|| +' and argument_name is null'||chr(10)|| +' and position = 1'||chr(10)|| +' and sequence = 0'||chr(10)|| +' group by arg.owner )'||chr(10)|| +' loop'||chr(10)|| +' run_str := run_str || ''wtplsql.test_all@'' || buff.TEST_OWNER || '';'' || CHR(10);'||chr(10)|| +' end loop;'||chr(10)|| +' -- Create 1 Scheduler Job'||chr(10)|| +' DBMS_SCHEDULER.CREATE_JOB'||chr(10)|| +' (job_name => ''TEST_ALL_SEQ'''||chr(10)|| +' ,j'; + +p:=p||'ob_type => ''PLSQL_BLOCK'''||chr(10)|| +' ,job_action => ''begin'' || CHR(10) || run_str || ''commit;'' || CHR(10) || ''end;'''||chr(10)|| +' ,comments => ''Sequential Tests for All Owners'''||chr(10)|| +' ,enabled => TRUE);'||chr(10)|| +' COMMIT;'||chr(10)|| +'END;'; + +wwv_flow_api.create_page_process( + p_id => 5183316524467299 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 6, - p_form_element_id=> null, - p_column_alias=> 'MAX_USECS', - p_column_display_sequence=> 6, - p_column_heading=> 'Max
      Usecs', - p_column_alignment=>'RIGHT', - p_heading_alignment=>'RIGHT', - p_default_sort_column_sequence=>0, - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'ESCAPE_SC', - p_is_required=> false, - p_pk_col_source=> s, - p_include_in_export=> 'Y', - p_print_col_width=> '14', - p_column_comment=>''); + p_flow_step_id => 2, + p_process_sequence=> 40, + p_process_point=> 'AFTER_SUBMIT', + p_process_type=> 'PLSQL', + p_process_name=> 'TEST_ALL_SEQ', + p_process_sql_clob => p, + p_process_error_message=> 'Failed to submit job (&P2_LAST_JOB_ID.)', + p_process_when=>'TEST_ALL_SEQ', + p_process_when_type=>'REQUEST_EQUALS_CONDITION', + p_process_success_message=> 'Successfully submitted job &P2_LAST_JOB_ID.', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; +null; + end; / -declare - s varchar2(32767) := null; + + begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 4957019564578442 + wwv_flow_api.g_id_offset, - p_region_id=> 4952405887578432 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 7, - p_form_element_id=> null, - p_column_alias=> 'TEXT', - p_column_display_sequence=> 7, - p_column_heading=> 'Text', - p_column_alignment=>'LEFT', - p_heading_alignment=>'LEFT', - p_default_sort_column_sequence=>0, - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'WITHOUT_MODIFICATION', - p_lov_show_nulls=> 'NO', - p_is_required=> false, - p_pk_col_source=> s, - p_lov_display_extra=> 'YES', - p_include_in_export=> 'Y', - p_print_col_width=> '14', - p_column_comment=>''); + +declare + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +p:=p||'DECLARE'||chr(10)|| +' run_str varchar2(32000);'||chr(10)|| +'BEGIN'||chr(10)|| +' for buff in ('||chr(10)|| +' select arg.owner TEST_OWNER'||chr(10)|| +' from dba_arguments arg'||chr(10)|| +' join user_db_links dbl'||chr(10)|| +' on dbl.db_link = arg.owner'||chr(10)|| +' and dbl.db_link = dbl.username'||chr(10)|| +' and dbl.username is not null'||chr(10)|| +' and dbl.host is not null'||chr(10)|| +' where object_name = ''WTPL'; + +p:=p||'SQL_RUN'''||chr(10)|| +' and argument_name is null'||chr(10)|| +' and position = 1'||chr(10)|| +' and sequence = 0'||chr(10)|| +' group by arg.owner )'||chr(10)|| +' loop'||chr(10)|| +' -- Create a Scheduler Job for each Test Owner'||chr(10)|| +' run_str := ''wtplsql.test_all@'' || buff.TEST_OWNER;'||chr(10)|| +' DBMS_SCHEDULER.CREATE_JOB'||chr(10)|| +' (job_name => substr(buff.TEST_OWNER || ''$PAR$TEST$ALL'', 1, 30)'||chr(10)|| +' ,job_type => ''PLSQL_BLOCK'''||chr(10)|| +' '; + +p:=p||' ,job_action => ''begin '' || run_str || ''; commit; end;'''||chr(10)|| +' ,comments => buff.TEST_OWNER || '': Parallel Tests for All Owners'''||chr(10)|| +' ,enabled => TRUE);'||chr(10)|| +' end loop;'||chr(10)|| +' COMMIT;'||chr(10)|| +'END;'; + +wwv_flow_api.create_page_process( + p_id => 5184104609728862 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id => 2, + p_process_sequence=> 50, + p_process_point=> 'AFTER_SUBMIT', + p_process_type=> 'PLSQL', + p_process_name=> 'TEST_ALL_PAR', + p_process_sql_clob => p, + p_process_error_message=> 'Failed to submit job (&P2_LAST_JOB_ID.)', + p_process_when=>'TEST_ALL_PAR', + p_process_when_type=>'REQUEST_EQUALS_CONDITION', + p_process_success_message=> 'Successful submitted job &P2_LAST_JOB_ID.', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; +null; + end; / + begin -wwv_flow_api.create_page_button( - p_id => 4939204461575007 + wwv_flow_api.g_id_offset, - p_flow_id => wwv_flow.g_flow_id, - p_flow_step_id => 3, - p_button_sequence=> 10, - p_button_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, - p_button_name => 'P3_DELETE', - p_button_image => 'template:'||to_char(4838306817414911+wwv_flow_api.g_id_offset), - p_button_image_alt=> 'DELETE Test Runner', - p_button_position=> 'BOTTOM', - p_button_alignment=> 'LEFT', - p_button_redirect_url=> 'javascript:confirmDelete(''Confirm DELETE of Test Results for '' + document.getElementById(''P3_RUNNER_OWNER'').value + ''.'' + document.getElementById(''P3_RUNNER_NAME'').value, ''DELETE'')', - p_button_execute_validations=>'Y', - p_required_patch => null + wwv_flow_api.g_id_offset); - +declare + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +p:=p||'begin'||chr(10)|| +' --'||chr(10)|| +' begin'||chr(10)|| +' execute immediate ''drop database link '' || :APP_USER;'||chr(10)|| +' exception when OTHERS then'||chr(10)|| +' if SQLERRM = ''ORA-02024: database link not found'''||chr(10)|| +' then'||chr(10)|| +' null; -- Ignore Exception'||chr(10)|| +' else'||chr(10)|| +' raise;'||chr(10)|| +' end if;'||chr(10)|| +' end;'||chr(10)|| +' --'||chr(10)|| +' execute immediate ''create database link '' || :APP_USER ||'||chr(10)|| +' '' connect to '' || :APP_USER '; + +p:=p||' ||'||chr(10)|| +' '' identified by '' || :P2_PASSWORD ||'||chr(10)|| +' '' using '''''' || :P2_NEW_DB_LINK_HOST || '''''''';'||chr(10)|| +'end;'; + +wwv_flow_api.create_page_process( + p_id => 5027926237038111 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id => 2, + p_process_sequence=> 90, + p_process_point=> 'AFTER_SUBMIT', + p_process_type=> 'PLSQL', + p_process_name=> 'RESET_DB_LINK', + p_process_sql_clob => p, + p_process_error_message=> '#SQLERRM#', + p_process_when=>'RESET_DB_LINK', + p_process_when_type=>'REQUEST_EQUALS_CONDITION', + p_process_success_message=> '', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; +null; end; / @@ -7250,1353 +5335,1763 @@ end; begin -wwv_flow_api.create_page_branch( - p_id=>4956122682578439 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_branch_action=> 'f?p=&APP_ID.:3:&SESSION.', - p_branch_point=> 'AFTER_PROCESSING', - p_branch_type=> 'REDIRECT_URL', - p_branch_sequence=> 10, - p_save_state_before_branch_yn=>'Y', - p_branch_comment=> ''); +--------------------------------------- +-- ...updatable report columns for page 2 +-- -wwv_flow_api.create_page_branch( - p_id=>4923132166541430 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_branch_action=> 'f?p=&APP_ID.:3:&SESSION.::&DEBUG.:::&success_msg=#SUCCESS_MSG#', - p_branch_point=> 'AFTER_PROCESSING', - p_branch_type=> 'REDIRECT_URL', - p_branch_sequence=> 99, - p_save_state_before_branch_yn=>'Y', - p_branch_comment=> ''); +begin +null; +end; +null; end; / -declare - h varchar2(32767) := null; + +--application/pages/page_00003 +prompt ...PAGE 3: Test Runner +-- + begin -wwv_flow_api.create_page_item( - p_id=>4902724562737162 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_name=>'P3_TEST_RUN_ID', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 1, - p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Test Run ID:', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'Y', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'Y', - p_show_quick_picks=>'N', - p_item_comment => ''); +wwv_flow_api.create_page ( + p_flow_id => wwv_flow.g_flow_id + ,p_id => 3 + ,p_tab_set => 'TS1' + ,p_name => 'Test Runner' + ,p_alias => 'TESTRUNNER' + ,p_step_title => 'Test Runner' + ,p_allow_duplicate_submissions => 'Y' + ,p_step_sub_title => 'Test Runner' + ,p_step_sub_title_type => 'TEXT_WITH_SUBSTITUTIONS' + ,p_first_item => 'AUTO_FIRST_ITEM' + ,p_include_apex_css_js_yn => 'Y' + ,p_autocomplete_on_off => 'ON' + ,p_step_template => 4837525507414910 + wwv_flow_api.g_id_offset + ,p_page_is_public_y_n => 'N' + ,p_protection_level => 'N' + ,p_cache_page_yn => 'N' + ,p_cache_timeout_seconds => 21600 + ,p_cache_by_user_yn => 'N' + ,p_help_text => +'No help is available for this page.' + ,p_last_updated_by => 'WTP' + ,p_last_upd_yyyymmddhh24miss => '20180901163029' + ); +null; end; / declare - h varchar2(32767) := null; + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; begin -h := null; -h:=h||'This item is initialized by the "Initialize Items" process.'; +s:=s||'declare'||chr(10)|| +' cursor main is'||chr(10)|| +' select round(extract(day from (tr.end_dtm -'||chr(10)|| +' tr.start_dtm'||chr(10)|| +' )*86400*100'||chr(10)|| +' )/100,2'||chr(10)|| +' ) DURATION'||chr(10)|| +' ,tr.dbout_owner'||chr(10)|| +' ,tr.dbout_name'||chr(10)|| +' ,tr.dbout_type'||chr(10)|| +' ,tr.trigger_offset'||chr(10)|| +' ,tr.error_messag'; + +s:=s||'e'||chr(10)|| +' ,count(tc.testcase) NUM_TESTCASES'||chr(10)|| +' from wt_test_runs tr'||chr(10)|| +' left join wt_testcase_stats tc'||chr(10)|| +' on tc.test_run_id = tr.id'||chr(10)|| +' where tr.id = :P0_TEST_RUN_ID'||chr(10)|| +' group by round(extract(day from (tr.end_dtm -'||chr(10)|| +' tr.start_dtm'||chr(10)|| +' )*86400*100'||chr(10)|| +' )/100,2'||chr(10)|| +' '; -wwv_flow_api.create_page_item( - p_id=>4903101050383315 + wwv_flow_api.g_id_offset, +s:=s||' )'||chr(10)|| +' ,tr.dbout_owner'||chr(10)|| +' ,tr.dbout_name'||chr(10)|| +' ,tr.dbout_type'||chr(10)|| +' ,tr.trigger_offset'||chr(10)|| +' ,tr.error_message;'||chr(10)|| +' buff main%ROWTYPE;'||chr(10)|| +' num_runs number;'||chr(10)|| +'begin'||chr(10)|| +' --'||chr(10)|| +' open main;'||chr(10)|| +' fetch main into buff;'||chr(10)|| +' close main;'||chr(10)|| +' --'||chr(10)|| +' select count(runner_name)'||chr(10)|| +' into num_runs'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where runner_owner = :P0_TEST_OWNER'||chr(10)|| +' and r'; + +s:=s||'unner_name = :P0_TEST_RUNNER;'||chr(10)|| +' --'||chr(10)|| +' htp.p('''');'||chr(10)|| +' htp.p('' Duration (secs): '' || buff.duration || ''
      '');'||chr(10)|| +' htp.p(''
      '');'||chr(10)|| +' htp.p('' Num Testcases: '' || buff.num_testcases || ''
      '');'||chr(10)|| +' htp.p(''
      '');'||chr(10)|| +' htp.p('' Num Test Runs: '' || num_runs || ''
      '');'||chr(10)|| +' htp.p(''
      '');'||chr(10)|| +' htp.p('' DBOUT Owner: '' || buff.dbout_owner || ''
      '');'||chr(10)|| +' htp.p(''
      '');'||chr(10)|| +' htp.p('' DBOUT N'; + +s:=s||'ame: '' || buff.dbout_name || ''
      '');'||chr(10)|| +' htp.p(''
      '');'||chr(10)|| +' htp.p('' DBOUT Type: '' || buff.dbout_type || ''
      '');'||chr(10)|| +' htp.p(''
      '');'||chr(10)|| +' htp.p('' Trigger Offset: '' || buff.trigger_offset || ''
      '');'||chr(10)|| +' htp.p(''
      '');'||chr(10)|| +' --'||chr(10)|| +'end;'; + +wwv_flow_api.create_page_plug ( + p_id=> 4848108018414926 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_name=>'P3_RUNNER_OWNER', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 2, - p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Runner Owner:', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_help_text=> h, - p_attribute_01 => 'Y', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'N', - p_show_quick_picks=>'N', - p_item_comment => ''); - - + p_page_id=> 3, + p_plug_name=> 'Summary', + p_region_name=>'', + p_plug_template=> 4839912075414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 2, + p_plug_display_column=> 2, + p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_source=> s, + p_plug_source_type=> 'PLSQL_PROCEDURE', + p_translate_title=> 'Y', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_column_width => 'td width="320"', + p_plug_display_condition_type => '', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); end; / +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4927702379997301 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_name=>'P3_START_DTM', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 5, - p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Start Date/Time:', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'N', - p_show_quick_picks=>'N', - p_item_comment => 'This item is initialized by the "Initialize Items" process.'); - - + p_page_id=> 3, + p_plug_name=> 'Test Runner Status', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 1, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); end; / - declare - h varchar2(32767) := null; + a1 varchar2(32767) := null; begin -wwv_flow_api.create_page_item( - p_id=>4903901489440175 + wwv_flow_api.g_id_offset, +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4927915384997301+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_name=>'P3_RUNNER_NAME_DISP', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 3, - p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Runner Name:', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'N', - p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'N', - p_show_quick_picks=>'N', - p_item_comment => 'This item is initialized by the "Initialize Items" process.'); - - + p_page_id => 3, + p_region_id => 4927702379997301+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DPie', + p_chart_title =>'', + p_chart_name =>'chart_4927915384997301', + p_chart_width =>300, + p_chart_height =>200, + p_chart_animation =>'N', + p_display_attr =>':H:::::Left::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#99FF99,#FFFF99,#FF6699', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'::', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'::', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); end; / - declare - h varchar2(32767) := null; + a1 varchar2(32767) := null; begin -wwv_flow_api.create_page_item( - p_id=>4904730944600100 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_name=>'P3_DBOUT_OWNER', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 8, - p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'DBOUT Owner:', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'N', - p_show_quick_picks=>'N', - p_item_comment => 'This item is initialized by the "Initialize Items" process.'); - - +a1:=a1||'with q1 as ('||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''PASS'' LABEL'||chr(10)|| +' ,sum(res.passes) VALUE'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where id = :P0_TEST_RUN_ID'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''FAIL'' LABEL'||chr(10)|| +' ,sum(res.failures) VALUE'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' '; + +a1:=a1||' on res.test_run_id = run.id'||chr(10)|| +' where id = :P0_TEST_RUN_ID'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''ERR'' LABEL'||chr(10)|| +' ,sum(res.errors) VALUE'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where id = :P0_TEST_RUN_ID'||chr(10)|| +')'||chr(10)|| +'select link, label, value'||chr(10)|| +' from q1'||chr(10)|| +' order by label desc'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4928017042997302+wwv_flow_api.g_id_offset, + p_chart_id => 4927915384997301+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); end; / - declare - h varchar2(32767) := null; + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; begin -wwv_flow_api.create_page_item( - p_id=>4911112682701919 + wwv_flow_api.g_id_offset, +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4930902107252669 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_name=>'P3_NUM_TESTCASES', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 7, - p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Num Testcases:', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'N', - p_show_quick_picks=>'N', - p_item_comment => 'This item is initialized by the "Initialize Items" process.'); - - + p_page_id=> 3, + p_plug_name=> 'DBOUT Profile Status', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 3, + p_plug_display_column=> 3, + p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); end; / - declare - h varchar2(32767) := null; + a1 varchar2(32767) := null; begin -wwv_flow_api.create_page_item( - p_id=>4918501858218652 + wwv_flow_api.g_id_offset, +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4931121643252671+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_name=>'P3_DBOUT_TYPE', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 10, - p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'DBOUT Type:', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'N', - p_show_quick_picks=>'N', - p_item_comment => 'This item is initialized by the "Initialize Items" process.'); - - + p_page_id => 3, + p_region_id => 4930902107252669+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DPie', + p_chart_title =>'', + p_chart_name =>'chart_4927915384997301', + p_chart_width =>300, + p_chart_height =>200, + p_chart_animation =>'N', + p_display_attr =>':H:::::Left::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#0099FF,#99FF99,#FF6699,#FFFF99', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'::', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'::', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); end; / +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'with q1 as ('||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''EXCL'' LABEL'||chr(10)|| +' ,sum(excluded_lines) VALUE'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where id = :P0_TEST_RUN_ID'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''EXEC'' LABEL'||chr(10)|| +' ,sum(executed_lines) VALUE'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_r'; + +a1:=a1||'un_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where id = :P0_TEST_RUN_ID'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''NOTX'' LABEL'||chr(10)|| +' ,sum(notexec_lines) VALUE'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where id = :P0_TEST_RUN_ID'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''UNKN'' LABEL'||chr(10)|| +' '; + +a1:=a1||' ,sum(unknown_lines) VALUE'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where id = :P0_TEST_RUN_ID'||chr(10)|| +')'||chr(10)|| +'select link, label, value'||chr(10)|| +' from q1'||chr(10)|| +' order by label'; -declare - h varchar2(32767) := null; -begin -wwv_flow_api.create_page_item( - p_id=>4919509411391193 + wwv_flow_api.g_id_offset, +wwv_flow_api.create_flash_chart5_series( + p_id => 4931210998252672+wwv_flow_api.g_id_offset, + p_chart_id => 4931121643252671+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_name=>'P3_DBOUT_NAME', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 9, - p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'DBOUT Name:', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'N', - p_show_quick_picks=>'N', - p_item_comment => 'This item is initialized by the "Initialize Items" process.'); - - + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); end; / - declare - h varchar2(32767) := null; + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; begin -wwv_flow_api.create_page_item( - p_id=>4922532107511287 + wwv_flow_api.g_id_offset, +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4932622090476124 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_name=>'P3_GOTO_RUN_ID', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 12, - p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Go To Run ID:', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_POPUP_LOV', - p_lov=> 'select id || '': '' ||'||chr(10)|| -' runner_owner || ''.'' ||'||chr(10)|| -' runner_name || '', '' ||'||chr(10)|| -' to_char(start_dtm,''YYYY/MM/DD HH24:MI:SS'') DISPLAY'||chr(10)|| -' ,id RETURN'||chr(10)|| -' from wt_test_runs'||chr(10)|| -' where id != :P3_TEST_RUN_ID'||chr(10)|| -' order by id desc', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 10, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'NO', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'NOT_ENTERABLE', - p_attribute_02 => 'NO_FETCH', - p_show_quick_picks=>'N', - p_item_comment => 'This item is initialized by the "Initialize Items" process.'); - - + p_page_id=> 3, + p_plug_name=> 'Test Runner Status Trend', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 1, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => 'PLSQL_EXPRESSION', + p_plug_display_when_condition => ':P3_SHOW_TREND=''Y''', + p_plug_display_when_cond2=>'Y', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); end; / - declare - h varchar2(32767) := null; + a1 varchar2(32767) := null; begin -wwv_flow_api.create_page_item( - p_id=>4924510262627933 + wwv_flow_api.g_id_offset, +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4932831378476124+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_name=>'P3_SHOW_TREND', - p_data_type=> 'VARCHAR', - p_is_required=> true, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 13, - p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Show Trend:', - p_source=>'N', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_RADIOGROUP', - p_named_lov=> 'Y_OR_N', - p_lov=> '.'||to_char(4923728354614299 + wwv_flow_api.g_id_offset)||'.', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => '2', - p_attribute_02 => 'SUBMIT', - p_attribute_03 => 'Y', - p_show_quick_picks=>'N', - p_item_comment => ''); - - + p_page_id => 3, + p_region_id => 4932622090476124+wwv_flow_api.g_id_offset, + p_default_chart_type =>'Stacked2DColumn', + p_chart_title =>'', + p_chart_name =>'chart_4932831378476124', + p_chart_width =>300, + p_chart_height =>200, + p_chart_animation =>'N', + p_display_attr =>':H:N::Y:N:Left::V:Y:Circle:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#99FF99,#FFFF99,#FF6699', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); end; / - declare - h varchar2(32767) := null; + a1 varchar2(32767) := null; begin -wwv_flow_api.create_page_item( - p_id=>4933725384514861 + wwv_flow_api.g_id_offset, +a1:=a1||'with q1 as ('||chr(10)|| +'select res.test_run_id LINK'||chr(10)|| +' ,''ID'' || run.id LABEL'||chr(10)|| +' ,res.passes PASS'||chr(10)|| +' ,res.failures FAIL'||chr(10)|| +' ,res.errors ERROR'||chr(10)|| +' ,rownum RNUM'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where run.runner_owner = :P0_TEST_OWNER'||chr(10)|| +' and run.runner_name = :P0_TEST_RUNNER'||chr(10)|| +' order by run.id'||chr(10)|| +'), q'; + +a1:=a1||'2 as ('||chr(10)|| +'select count(*) num_rows from q1'||chr(10)|| +')'||chr(10)|| +'select link, label, pass, fail, error'||chr(10)|| +' from q1'||chr(10)|| +' where rnum > (select num_rows from q2) - 10'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4932905763476124+wwv_flow_api.g_id_offset, + p_chart_id => 4932831378476124+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_name=>'P3_RUNNER_NAME', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 4, - p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_HIDDEN', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'NO', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'LEFT', - p_field_alignment=> 'LEFT', - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_show_quick_picks=>'N', - p_item_comment => 'This item is initialized by the "Initialize Items" process.'); - - + p_series_seq =>10, + p_series_name =>'Main', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P0_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', + p_action_link_checksum_type =>''); end; / +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; +wwv_flow_api.create_page_plug ( + p_id=> 4934122379722218 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_plug_name=> 'DBOUT Profile Status Trend', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 3, + p_plug_display_column=> 3, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => 'PLSQL_EXPRESSION', + p_plug_display_when_condition => ':P3_SHOW_TREND=''Y''', + p_plug_display_when_cond2=>'Y', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ declare - h varchar2(32767) := null; + a1 varchar2(32767) := null; begin -wwv_flow_api.create_page_item( - p_id=>4939603900584303 + wwv_flow_api.g_id_offset, +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4934324926722219+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_name=>'P3_ROWS_DELETED_MSG', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 15, - p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_HIDDEN', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'NO', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'LEFT', - p_field_alignment=> 'LEFT', - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_show_quick_picks=>'N', - p_item_comment => ''); - - + p_page_id => 3, + p_region_id => 4934122379722218+wwv_flow_api.g_id_offset, + p_default_chart_type =>'Stacked2DColumn', + p_chart_title =>'', + p_chart_name =>'chart_4932831378476124', + p_chart_width =>300, + p_chart_height =>200, + p_chart_animation =>'N', + p_display_attr =>':H:N::Y:N:Left::V:Y:Circle:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#99FF99,#0099FF,#FFFF99,#FF6699', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); end; / - declare - h varchar2(32767) := null; + a1 varchar2(32767) := null; begin -wwv_flow_api.create_page_item( - p_id=>4947226661584377 + wwv_flow_api.g_id_offset, +a1:=a1||'with q1 as ('||chr(10)|| +'select res.test_run_id LINK'||chr(10)|| +' ,''ID'' || run.id LABEL'||chr(10)|| +' ,res.executed_lines EXEC'||chr(10)|| +' ,res.excluded_lines EXCL'||chr(10)|| +' ,res.unknown_lines UNKN'||chr(10)|| +' ,res.notexec_lines NOTX'||chr(10)|| +' ,rownum RNUM'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where run.runner_owner = :P0_TEST_OWNER'||chr(10)|| +' and run.runner_na'; + +a1:=a1||'me = :P0_TEST_RUNNER'||chr(10)|| +' order by run.id'||chr(10)|| +'), q2 as ('||chr(10)|| +'select count(*) num_rows from q1'||chr(10)|| +')'||chr(10)|| +'select link'||chr(10)|| +' ,label'||chr(10)|| +' ,exec'||chr(10)|| +' ,excl'||chr(10)|| +' ,unkn'||chr(10)|| +' ,notx'||chr(10)|| +' from q1'||chr(10)|| +' where rnum > (select num_rows from q2) - 10'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4934601765722219+wwv_flow_api.g_id_offset, + p_chart_id => 4934324926722219+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_name=>'P3_TEST_DURATION', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 6, - p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Duration (secs):', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'N', - p_show_quick_picks=>'N', - p_item_comment => 'This item is initialized by the "Initialize Items" process.'); - - + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P0_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', + p_action_link_checksum_type =>''); end; / - declare - h varchar2(32767) := null; + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; begin -wwv_flow_api.create_page_item( - p_id=>4954902281578436 + wwv_flow_api.g_id_offset, +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4935906636831213 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_name=>'P3_SEARCH', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 10, - p_item_plug_id => 4952328298578419+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_prompt=>'Search', - p_display_as=> 'NATIVE_TEXT_FIELD', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 2000, - p_cHeight=> null, - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_attribute_01 => 'Y', - p_attribute_02 => 'N', - p_attribute_03 => 'N', - p_item_comment => ''); - - + p_page_id=> 3, + p_plug_name=> 'Top Test Case Failures', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 2, + p_plug_display_column=> 2, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => 'PLSQL_EXPRESSION', + p_plug_display_when_condition => ':P3_SHOW_TREND=''Y''', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); end; / - declare - h varchar2(32767) := null; + a1 varchar2(32767) := null; begin -wwv_flow_api.create_page_item( - p_id=>4955118227578437 + wwv_flow_api.g_id_offset, +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4936119233831213+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_name=>'P3_ROWS', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 20, - p_item_plug_id => 4952328298578419+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Display', - p_source=>'500', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_SELECT_LIST', - p_named_lov=> 'P3_Report Row Per Page', - p_lov=> '.'||to_char(4952509356578433 + wwv_flow_api.g_id_offset)||'.', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 2000, - p_cHeight=> 1, - p_begin_on_new_line=> 'NO', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'NONE', - p_attribute_02 => 'N', - p_show_quick_picks=>'N', - p_item_comment => ''); - - + p_page_id => 3, + p_region_id => 4935906636831213+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DColumn', + p_chart_title =>'', + p_chart_name =>'chart_4857903544336332', + p_chart_width =>300, + p_chart_height =>200, + p_chart_animation =>'N', + p_display_attr =>':H:::Y:N:N::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#FFFF00', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'Failures', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); end; / - declare - h varchar2(32767) := null; + a1 varchar2(32767) := null; begin -wwv_flow_api.create_page_item( - p_id=>4955319672578437 + wwv_flow_api.g_id_offset, +a1:=a1||'select ''f?p='' || :APP_ID ||'||chr(10)|| +' '':'' || ''6'' || -- Page'||chr(10)|| +' '':'' || :APP_SESSION ||'||chr(10)|| +' '':'' || :REQUEST ||'||chr(10)|| +' '':'' || :DEBUG ||'||chr(10)|| +' '':'' || ''N'' || -- CLear Cache'||chr(10)|| +' '':'' || ''P0_TEST_RUN_ID'' || '','' ||'||chr(10)|| +' ''P0_TEST_CASE'' || -- Item Names'||chr(10)|| +' '; + +a1:=a1||' '':'' || tc.test_run_id || '','' ||'||chr(10)|| +' tc.testcase || -- Item Values'||chr(10)|| +' '':'' || V(''PRINTER_FRIENDLY'') LINK'||chr(10)|| +' ,run.runner_owner || ''.'' ||'||chr(10)|| +' run.runner_name || '':'' ||'||chr(10)|| +' tc.testcase LABEL'||chr(10)|| +' ,tc.failures VALUE'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_testcase_stats tc'||chr(10)|| +' on tc.test_run_'; + +a1:=a1||'id = run.id'||chr(10)|| +' where run.id = :P0_TEST_RUN_ID'||chr(10)|| +' and tc.failures > 0'||chr(10)|| +' order by failures desc, tc.testcase'||chr(10)|| +''; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4936205597831214+wwv_flow_api.g_id_offset, + p_chart_id => 4936119233831213+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_name=>'P3_GO', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 30, - p_item_plug_id => 4952328298578419+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default=> 'GO', - p_prompt=>'Go', - p_source=>'GO', - p_source_type=> 'STATIC', - p_display_as=> 'BUTTON', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> null, - p_cMaxlength=> null, - p_cHeight=> null, - p_tag_attributes => 'template:'||to_char(4838226535414911 + wwv_flow_api.g_id_offset), - p_begin_on_new_line=> 'NO', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'LEFT', - p_field_alignment=> 'LEFT', - p_is_persistent=> 'Y', - p_item_comment => ''); - - + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>10, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); end; / - declare - h varchar2(32767) := null; + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; begin -wwv_flow_api.create_page_item( - p_id=>4955512070578437 + wwv_flow_api.g_id_offset, +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4946418865544258 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_name=>'P3_RESET', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 40, - p_item_plug_id => 4952328298578419+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default=> 'RESET', - p_prompt=>'Reset', - p_source=>'RESET', - p_source_type=> 'STATIC', - p_display_as=> 'BUTTON', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> null, - p_cMaxlength=> null, - p_cHeight=> null, - p_tag_attributes => 'template:'||to_char(4838226535414911 + wwv_flow_api.g_id_offset), - p_begin_on_new_line=> 'NO', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'LEFT', - p_field_alignment=> 'LEFT', - p_is_persistent=> 'Y', - p_item_comment => ''); - - + p_page_id=> 3, + p_plug_name=> 'Test Runner Duration Trend', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 4, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => 'PLSQL_EXPRESSION', + p_plug_display_when_condition => ':P3_SHOW_TREND=''Y''', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); end; / - declare - h varchar2(32767) := null; + a1 varchar2(32767) := null; begin -wwv_flow_api.create_page_item( - p_id=>4959114220858173 + wwv_flow_api.g_id_offset, +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4946607806544261+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_name=>'P3_TEST_RUN_ERROR', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 99, - p_item_plug_id => 4957623889633835+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_HIDDEN', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'NO', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'LEFT', - p_field_alignment=> 'LEFT', - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_show_quick_picks=>'N', - p_item_comment => 'This item is initialized by the "Initialize Items" process.'); - - + p_page_id => 3, + p_region_id => 4946418865544258+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DColumn', + p_chart_title =>'', + p_chart_name =>'chart_4946607806544261', + p_chart_width =>300, + p_chart_height =>200, + p_chart_animation =>'N', + p_display_attr =>':H:N::Y:N:N::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'6', + p_custom_colors =>'', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>2, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'Seconds', + p_y_axis_min =>null, + p_y_axis_max =>null, + p_y_axis_decimal_place =>2, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); end; / - declare - h varchar2(32767) := null; + a1 varchar2(32767) := null; begin -wwv_flow_api.create_page_item( - p_id=>4993326896795754 + wwv_flow_api.g_id_offset, +a1:=a1||'with q1 as ('||chr(10)|| +'select res.test_run_id LINK'||chr(10)|| +' ,''ID'' || run.id LABEL'||chr(10)|| +' ,extract(day from (run.end_dtm - run.start_dtm)*86400*100)/100'||chr(10)|| +' SECONDS'||chr(10)|| +' ,rownum RNUM'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' where run.runner_owner = :P0_TEST_OWNER'||chr(10)|| +' and run.runner_name = :P0_TEST_RUNNER'||chr(10)|| +' order by '; + +a1:=a1||'id'||chr(10)|| +'), q2 as ('||chr(10)|| +'select count(*) num_rows from q1'||chr(10)|| +')'||chr(10)|| +'select link'||chr(10)|| +' ,label'||chr(10)|| +' ,seconds'||chr(10)|| +' from q1'||chr(10)|| +' where rnum > (select num_rows from q2) - 10'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4946720535544262+wwv_flow_api.g_id_offset, + p_chart_id => 4946607806544261+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_name=>'P3_TRIGGER_OFFSET', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 11, - p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Trigger Offset:', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'Y', - p_item_comment => ''); - - + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P0_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', + p_action_link_checksum_type =>''); end; / - declare - h varchar2(32767) := null; + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; begin -wwv_flow_api.create_page_item( - p_id=>5006118725435545 + wwv_flow_api.g_id_offset, +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4948217713035992 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 3, - p_name=>'P3_SHOW_TREE', - p_data_type=> 'VARCHAR', - p_is_required=> true, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 14, - p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Show Tree:', - p_source=>'N', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_RADIOGROUP', - p_named_lov=> 'Y_OR_N', - p_lov=> '.'||to_char(4923728354614299 + wwv_flow_api.g_id_offset)||'.', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => '2', - p_attribute_02 => 'SUBMIT', - p_attribute_03 => 'Y', - p_show_quick_picks=>'N', - p_item_comment => ''); - - + p_page_id=> 3, + p_plug_name=> 'LineExec Long Duration Trend', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 6, + p_plug_display_column=> 3, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => 'PLSQL_EXPRESSION', + p_plug_display_when_condition => ':P3_SHOW_TREND=''Y''', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); end; / - - +declare + a1 varchar2(32767) := null; begin - -wwv_flow_api.create_page_da_event ( - p_id => 4931927743335808 + wwv_flow_api.g_id_offset - ,p_flow_id => wwv_flow.g_flow_id - ,p_page_id => 3 - ,p_name => 'Submit After LOV Change' - ,p_event_sequence => 10 - ,p_triggering_element_type => 'ITEM' - ,p_triggering_element => 'P3_GOTO_RUN_ID' - ,p_bind_type => 'bind' - ,p_bind_event_type => 'change' - ); -wwv_flow_api.create_page_da_action ( - p_id => 4932206270335808 + wwv_flow_api.g_id_offset - ,p_flow_id => wwv_flow.g_flow_id - ,p_page_id => 3 - ,p_event_id => 4931927743335808 + wwv_flow_api.g_id_offset - ,p_event_result => 'TRUE' - ,p_action_sequence => 10 - ,p_execute_on_page_init => 'N' - ,p_action => 'NATIVE_SUBMIT_PAGE' - ,p_attribute_01 => 'REFRESH' - ,p_stop_execution_on_error => 'Y' - ); -null; - +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4948428749035997+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 3, + p_region_id => 4948217713035992+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DColumn', + p_chart_title =>'', + p_chart_name =>'chart_4948428749035997', + p_chart_width =>300, + p_chart_height =>200, + p_chart_animation =>'N', + p_display_attr =>':H:N::Y:N:N::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'6', + p_custom_colors =>'', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'MicroSeconds', + p_y_axis_min =>0, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); end; / - - -begin - declare - p varchar2(32767) := null; - l_clob clob; - l_length number := 1; + a1 varchar2(32767) := null; begin -p:=p||'reset_pagination'; +a1:=a1||'with q1 as ('||chr(10)|| +'select res.test_run_id'||chr(10)|| +' ,res.max_executed_usecs'||chr(10)|| +' ,rownum RNUM'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_test_run_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' left join wt_dbout_profiles prof'||chr(10)|| +' on prof.test_run_id = run.id'||chr(10)|| +' and prof.max_usecs = res.max_executed_usecs'||chr(10)|| +' where run.runner_owner = :P0_TEST_OWNER'||chr(10)|| +' and run.runner_na'; -wwv_flow_api.create_page_process( - p_id => 4955700238578438 + wwv_flow_api.g_id_offset, +a1:=a1||'me = :P0_TEST_RUNNER'||chr(10)|| +' order by id'||chr(10)|| +'), q2 as ('||chr(10)|| +'select count(*) num_rows from q1'||chr(10)|| +'), q3 as ('||chr(10)|| +'select test_run_id'||chr(10)|| +' ,max_usecs'||chr(10)|| +' ,min(line) line'||chr(10)|| +' from wt_dbout_profiles'||chr(10)|| +' group by test_run_id'||chr(10)|| +' ,max_usecs'||chr(10)|| +')'||chr(10)|| +'select q1.test_run_id LINK'||chr(10)|| +' ,''ID'' || q1.test_run_id ||'||chr(10)|| +' '',Line'' || q3.line LABEL'||chr(10)|| +' ,q1.max_executed_usecs VALUE'||chr(10)|| +' from q1 '||chr(10)|| +' left join'; + +a1:=a1||' q3'||chr(10)|| +' on q3.test_run_id = q1.test_run_id'||chr(10)|| +' and q3.max_usecs = q1.max_executed_usecs'||chr(10)|| +' where q1.rnum > (select num_rows from q2) - 10'||chr(10)|| +' order by q1.test_run_id'||chr(10)|| +''; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4948500124035997+wwv_flow_api.g_id_offset, + p_chart_id => 4948428749035997+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id => 3, - p_process_sequence=> 10, - p_process_point=> 'AFTER_SUBMIT', - p_process_type=> 'RESET_PAGINATION', - p_process_name=> 'Reset Pagination', - p_process_sql_clob => p, - p_process_error_message=> 'Unable to reset pagination.', - p_process_when=>'GO,P3_SEARCH,RESET', - p_process_when_type=>'REQUEST_IN_CONDITION', - p_process_success_message=> '', - p_process_is_stateful_y_n=>'N', - p_process_comment=>''); -end; -null; - + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P0_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', + p_action_link_checksum_type =>''); end; / - - -begin - declare - p varchar2(32767) := null; + s varchar2(32767) := null; l_clob clob; l_length number := 1; begin -p:=p||'P3_SEARCH,P3_ROWS'; +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''' || buff.runner_name ||'||chr(10)|| -' '' (Click t'; - -p:=p||'o Run)'' ;'||chr(10)|| -' else'||chr(10)|| -' :P3_RUNNER_NAME_DISP := buff.runner_name;'||chr(10)|| -' end if;'||chr(10)|| -' --'||chr(10)|| -' end loop;'||chr(10)|| -' --'||chr(10)|| -' select count(*) into :P3_NUM_TESTCASES'||chr(10)|| -' from wt_testcase_stats'||chr(10)|| -' where test_run_id = :P3_TEST_RUN_ID;'||chr(10)|| -' --'||chr(10)|| -' end if;'||chr(10)|| -'end;'; +s:=s||'t>'||chr(10)|| +'#CHART_REFRESH#'; -wwv_flow_api.create_page_process( - p_id => 4919220015384831 + wwv_flow_api.g_id_offset, +wwv_flow_api.create_page_plug ( + p_id=> 4948625219180073 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id => 3, - p_process_sequence=> 10, - p_process_point=> 'BEFORE_HEADER', - p_process_type=> 'PLSQL', - p_process_name=> 'Initialize Items', - p_process_sql_clob => p, - p_process_error_message=> '', - p_process_success_message=> '', - p_process_is_stateful_y_n=>'N', - p_process_comment=>''); + p_page_id=> 3, + p_plug_name=> 'Top Test Case Long Duration', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 5, + p_plug_display_column=> 2, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => 'PLSQL_EXPRESSION', + p_plug_display_when_condition => ':P3_SHOW_TREND=''Y''', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); end; -null; - +/ +declare + a1 varchar2(32767) := null; +begin +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4948812894180073+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id => 3, + p_region_id => 4948625219180073+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DColumn', + p_chart_title =>'', + p_chart_name =>'chart_4948812894180073', + p_chart_width =>300, + p_chart_height =>200, + p_chart_animation =>'N', + p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'6', + p_custom_colors =>'', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'MilliSeconds', + p_y_axis_min =>0, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); end; / - - -begin - declare - p varchar2(32767) := null; - l_clob clob; - l_length number := 1; + a1 varchar2(32767) := null; begin -p:=p||'declare'||chr(10)|| -' num_runs number := 0;'||chr(10)|| -' num_stats number := 0;'||chr(10)|| -' num_tcase number := 0;'||chr(10)|| -' num_res number := 0;'||chr(10)|| -' num_profs number := 0;'||chr(10)|| -' procedure load_msg is begin'||chr(10)|| -' :P3_ROWS_DELETED_MSG := num_runs || '' WT_TEST_RUNS, '' ||'||chr(10)|| -' num_stats || '' WT_TEST_RUN_STATS, '' ||'||chr(10)|| -' num_tcase || '' WT_TESTCASE_STATS, '' ||'||chr(10)|| -' '; - -p:=p||' num_res || '' WT_RESULTS, '' ||'||chr(10)|| -' num_profs || '' WT_DBOUT_PROFILES'' ;'||chr(10)|| -' end load_msg;'||chr(10)|| -'begin'||chr(10)|| -' load_msg;'||chr(10)|| -' for buff in ('||chr(10)|| -' select id from wt_test_runs'||chr(10)|| -' where runner_owner = :P3_RUNNER_OWNER'||chr(10)|| -' and runner_name = :P3_RUNNER_NAME )'||chr(10)|| -' loop'||chr(10)|| -' --'||chr(10)|| -' delete from wt_test_run_stats'||chr(10)|| -' where test_run_id = buff.id;'||chr(10)|| -' num_stats'; - -p:=p||' := num_stats + SQL%ROWCOUNT;'||chr(10)|| -' --'||chr(10)|| -' delete from wt_testcase_stats'||chr(10)|| -' where test_run_id = buff.id;'||chr(10)|| -' num_tcase := num_tcase + SQL%ROWCOUNT;'||chr(10)|| -' --'||chr(10)|| -' delete from wt_results'||chr(10)|| -' where test_run_id = buff.id;'||chr(10)|| -' num_res := num_res + SQL%ROWCOUNT;'||chr(10)|| -' --'||chr(10)|| -' delete from wt_dbout_profiles'||chr(10)|| -' where test_run_id = buff.id;'||chr(10)|| -' num_profs := num_profs + SQL%ROWCOUNT;'||chr(10)|| -' '; +a1:=a1||'select ''f?p='' || :APP_ID ||'||chr(10)|| +' '':'' || ''6'' || -- Page'||chr(10)|| +' '':'' || :APP_SESSION ||'||chr(10)|| +' '':'' || :REQUEST ||'||chr(10)|| +' '':'' || :DEBUG ||'||chr(10)|| +' '':'' || ''N'' || -- CLear Cache'||chr(10)|| +' '':'' || ''P0_TEST_RUN_ID'' || '','' ||'||chr(10)|| +' ''P0_TEST_CASE'' || -- Item Names'||chr(10)|| +' '; -p:=p||' --'||chr(10)|| -' delete from wt_test_runs'||chr(10)|| -' where id = buff.id;'||chr(10)|| -' num_runs := num_runs + SQL%ROWCOUNT;'||chr(10)|| -' --'||chr(10)|| -' load_msg;'||chr(10)|| -' --'||chr(10)|| -' end loop;'||chr(10)|| -' :P3_TEST_RUN_ID := NULL;'||chr(10)|| -'end;'; +a1:=a1||' '':'' || test_run_id || '','' ||'||chr(10)|| +' testcase || -- Item Values'||chr(10)|| +' '':'' || V(''PRINTER_FRIENDLY'') LINK'||chr(10)|| +' ,testcase LABEL'||chr(10)|| +' ,tot_interval_msecs VALUE'||chr(10)|| +' from wt_testcase_stats'||chr(10)|| +' where test_run_id = :P0_TEST_RUN_ID'||chr(10)|| +' order by tot_interval_msecs desc'||chr(10)|| +''; -wwv_flow_api.create_page_process( - p_id => 4927320293945637 + wwv_flow_api.g_id_offset, +wwv_flow_api.create_flash_chart5_series( + p_id => 4948907337180074+wwv_flow_api.g_id_offset, + p_chart_id => 4948812894180073+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id => 3, - p_process_sequence=> 10, - p_process_point=> 'ON_SUBMIT_BEFORE_COMPUTATION', - p_process_type=> 'PLSQL', - p_process_name=> 'Delete Test Runs', - p_process_sql_clob => p, - p_process_error_message=> 'Failed to delete rows (&P3_ROWS_DELETED_MSG.)', - p_process_when=>'DELETE', - p_process_when_type=>'REQUEST_EQUALS_CONDITION', - p_process_success_message=> 'Successfully deleted &P3_ROWS_DELETED_MSG.', - p_process_is_stateful_y_n=>'N', - p_process_comment=>''); -end; -null; - -end; -/ - - -begin - ---------------------------------------- --- ...updatable report columns for page 3 --- - -begin - -null; -end; -null; - -end; -/ - - ---application/pages/page_00004 -prompt ...PAGE 4: DBOUT Profile --- - -begin - -wwv_flow_api.create_page ( - p_flow_id => wwv_flow.g_flow_id - ,p_id => 4 - ,p_tab_set => 'TS1' - ,p_name => 'DBOUT Profile' - ,p_alias => 'DBOUTPROFILE' - ,p_step_title => 'DBOUT Profile' - ,p_allow_duplicate_submissions => 'Y' - ,p_step_sub_title => 'DBOUT Profile' - ,p_step_sub_title_type => 'TEXT_WITH_SUBSTITUTIONS' - ,p_first_item => 'AUTO_FIRST_ITEM' - ,p_include_apex_css_js_yn => 'Y' - ,p_autocomplete_on_off => 'ON' - ,p_page_is_public_y_n => 'N' - ,p_protection_level => 'N' - ,p_cache_page_yn => 'N' - ,p_cache_timeout_seconds => 21600 - ,p_cache_by_user_yn => 'N' - ,p_help_text => -'No help is available for this page.' - ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180719224813' - ); -null; - + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>10, + p_action_link =>'', + p_show_action_link =>'N', + p_action_link_checksum_type =>''); end; / - declare s varchar2(32767) := null; l_clob clob; l_length number := 1; begin -s:=s||'select r.dbout_owner'||chr(10)|| -' ,r.dbout_name'||chr(10)|| -' ,r.dbout_type'||chr(10)|| -' ,s.code_coverage*100 CODE_COVERAGE'||chr(10)|| -' ,r.id TEST_RUN_ID'||chr(10)|| -' ,r.runner_owner'||chr(10)|| -' ,r.runner_name'||chr(10)|| -' ,r.start_dtm'||chr(10)|| -' ,r.end_dtm'||chr(10)|| -' ,s.profiled_lines'||chr(10)|| -' ,s.executed_lines'||chr(10)|| -' ,s.ignored_lines'||chr(10)|| -' ,s.excluded_lines'||chr(10)|| -' ,s.notexec_lines'||chr(10)|| -' ,s.unknown_lines'||chr(10)|| -' ,s.min_exec'; - -s:=s||'uted_usecs'||chr(10)|| -' ,s.avg_executed_usecs'||chr(10)|| -' ,s.max_executed_usecs'||chr(10)|| -' ,round(s.tot_executed_usecs,3) TOT_EXECUTED_USECS'||chr(10)|| -' ,r.trigger_offset'||chr(10)|| -' ,r.error_message'||chr(10)|| -' from wt_test_runs r'||chr(10)|| -' join wt_test_run_stats s'||chr(10)|| -' on s.test_run_id = r.id'||chr(10)|| -' where r.dbout_name is not null'; +s:=s||'select test_run_id'||chr(10)|| +' ,result_seq SEQ'||chr(10)|| +' ,executed_dtm EXECUTED_DATE_TIME'||chr(10)|| +' ,interval_msecs MSECS'||chr(10)|| +' ,assertion'||chr(10)|| +' ,status'||chr(10)|| +' ,details'||chr(10)|| +' ,testcase'||chr(10)|| +' ,message'||chr(10)|| +' from wt_results'||chr(10)|| +' where test_run_id = :P0_TEST_RUN_ID'; wwv_flow_api.create_page_plug ( - p_id=> 5058029495145138 + wwv_flow_api.g_id_offset, + p_id=> 4949525229387041 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_plug_name=> 'DBOUT Profile', + p_page_id=> 3, + p_plug_name=> 'Test Runner Results Details', p_region_name=>'', p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 10, + p_plug_display_sequence=> 20, p_plug_display_column=> 1, p_plug_display_point=> 'AFTER_SHOW_ITEMS', p_plug_source=> s, p_plug_source_type=> 'DYNAMIC_QUERY', p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', p_plug_query_row_template=> 1, p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_show_nulls_as => ' - ', p_plug_display_condition_type => '', + p_pagination_display_position=>'BOTTOM_RIGHT', p_plug_customized=>'0', p_plug_caching=> 'NOT_CACHED', p_plug_comment=> ''); end; / -declare - a1 varchar2(32767) := null; -begin -a1:=a1||'select r.dbout_owner'||chr(10)|| -' ,r.dbout_name'||chr(10)|| -' ,r.dbout_type'||chr(10)|| -' ,s.code_coverage*100 CODE_COVERAGE'||chr(10)|| -' ,r.id TEST_RUN_ID'||chr(10)|| -' ,r.runner_owner'||chr(10)|| -' ,r.runner_name'||chr(10)|| -' ,r.start_dtm'||chr(10)|| -' ,r.end_dtm'||chr(10)|| -' ,s.profiled_lines'||chr(10)|| -' ,s.executed_lines'||chr(10)|| -' ,s.ignored_lines'||chr(10)|| -' ,s.excluded_lines'||chr(10)|| -' ,s.notexec_lines'||chr(10)|| -' ,s.unknown_lines'||chr(10)|| -' ,s.min_exec'; - -a1:=a1||'uted_usecs'||chr(10)|| -' ,s.avg_executed_usecs'||chr(10)|| -' ,s.max_executed_usecs'||chr(10)|| -' ,round(s.tot_executed_usecs,3) TOT_EXECUTED_USECS'||chr(10)|| -' ,r.trigger_offset'||chr(10)|| -' ,r.error_message'||chr(10)|| -' from wt_test_runs r'||chr(10)|| -' join wt_test_run_stats s'||chr(10)|| -' on s.test_run_id = r.id'||chr(10)|| -' where r.dbout_name is not null'; +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'select test_run_id'||chr(10)|| +' ,result_seq SEQ'||chr(10)|| +' ,executed_dtm EXECUTED_DATE_TIME'||chr(10)|| +' ,interval_msecs MSECS'||chr(10)|| +' ,assertion'||chr(10)|| +' ,status'||chr(10)|| +' ,details'||chr(10)|| +' ,testcase'||chr(10)|| +' ,message'||chr(10)|| +' from wt_results'||chr(10)|| +' where test_run_id = :P0_TEST_RUN_ID'; wwv_flow_api.create_worksheet( - p_id=> 5058117729145138+wwv_flow_api.g_id_offset, + p_id=> 4949624635387041+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_region_id=> 5058029495145138+wwv_flow_api.g_id_offset, - p_name=> 'DBOUT Profile', + p_page_id=> 3, + p_region_id=> 4949525229387041+wwv_flow_api.g_id_offset, + p_name=> 'Test Runner Results Details', p_folder_id=> null, p_alias=> '', p_report_id_item=> '', @@ -8611,21 +7106,19 @@ wwv_flow_api.create_worksheet( p_sort_desc_image=>'', p_sort_desc_image_attr=>'', p_sql_query => a1, - p_base_pk1=>'TEST_RUN_ID', p_status=>'AVAILABLE_FOR_OWNER', p_allow_report_saving=>'Y', p_allow_save_rpt_public=>'N', p_allow_report_categories=>'N', p_show_nulls_as=>'-', - p_pagination_type=>'ROWS_X_TO_Y', - p_pagination_display_pos=>'BOTTOM_LEFT', + p_pagination_display_pos=>'BOTTOM_RIGHT', p_show_finder_drop_down=>'Y', p_show_display_row_count=>'N', p_show_search_bar=>'Y', p_show_search_textbox=>'Y', p_show_actions_menu=>'Y', p_report_list_mode=>'TABS', - p_show_detail_link=>'Y', + p_show_detail_link=>'N', p_show_select_columns=>'Y', p_show_rows_per_page=>'Y', p_show_filter=>'Y', @@ -8643,9 +7136,8 @@ wwv_flow_api.create_worksheet( p_show_download=>'Y', p_show_help=>'Y', p_download_formats=>'CSV:HTML:EMAIL', - p_detail_link_text=>'', - p_allow_exclude_null_values=>'Y', - p_allow_hide_extra_columns=>'Y', + p_allow_exclude_null_values=>'N', + p_allow_hide_extra_columns=>'N', p_icon_view_enabled_yn=>'N', p_icon_view_columns_per_row=>1, p_detail_view_enabled_yn=>'N', @@ -8654,17 +7146,17 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 5058332650145140+wwv_flow_api.g_id_offset, + p_id => 5046210513880502+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, - p_db_column_name =>'DBOUT_OWNER', + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_db_column_name =>'TEST_RUN_ID', p_display_order =>1, p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'A', - p_column_label =>'DB Object Under Test Owner', - p_report_label =>'DBOUT
      Owner', - p_sync_form_label =>'N', + p_column_identifier =>'M', + p_column_label =>'Test Run ID', + p_report_label =>'Test Run ID', + p_sync_form_label =>'Y', p_display_in_default_rpt =>'Y', p_is_sortable =>'Y', p_allow_sorting =>'Y', @@ -8678,10 +7170,10 @@ wwv_flow_api.create_worksheet_column( p_allow_hide =>'Y', p_others_may_edit =>'Y', p_others_may_view =>'Y', - p_column_type =>'STRING', + p_column_type =>'NUMBER', p_display_as =>'TEXT', p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'RIGHT', + p_heading_alignment =>'CENTER', p_column_alignment =>'RIGHT', p_tz_dependent =>'N', p_rpt_distinct_lov =>'Y', @@ -8692,17 +7184,207 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 5058422778145140+wwv_flow_api.g_id_offset, + p_id => 4951219968424536+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, - p_db_column_name =>'DBOUT_NAME', + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_db_column_name =>'SEQ', p_display_order =>2, p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'B', - p_column_label =>'DB Object Under Test Name', - p_report_label =>'DBOUT
      Name', - p_sync_form_label =>'N', + p_column_identifier =>'J', + p_column_label =>'Seq', + p_report_label =>'Seq', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4951309893424536+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_db_column_name =>'EXECUTED_DATE_TIME', + p_display_order =>3, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'K', + p_column_label =>'Executed Date/Time', + p_report_label =>'Executed Date/Time', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'DATE', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4951430855424536+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_db_column_name =>'MSECS', + p_display_order =>4, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'L', + p_column_label =>'Msecs', + p_report_label =>'Msecs', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4950228064387045+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_db_column_name =>'ASSERTION', + p_display_order =>5, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'E', + p_column_label =>'Assertion', + p_report_label =>'Assertion', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4950325498387045+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_db_column_name =>'STATUS', + p_display_order =>6, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'F', + p_column_label =>'Status', + p_report_label =>'Status', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4950430581387045+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_db_column_name =>'DETAILS', + p_display_order =>7, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'G', + p_column_label =>'Details', + p_report_label =>'Details', + p_sync_form_label =>'Y', p_display_in_default_rpt =>'Y', p_is_sortable =>'Y', p_allow_sorting =>'Y', @@ -8719,7 +7401,7 @@ wwv_flow_api.create_worksheet_column( p_column_type =>'STRING', p_display_as =>'TEXT', p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'LEFT', + p_heading_alignment =>'CENTER', p_column_alignment =>'LEFT', p_tz_dependent =>'N', p_rpt_distinct_lov =>'Y', @@ -8730,18 +7412,21 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 5058500986145140+wwv_flow_api.g_id_offset, + p_id => 4950523632387045+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, - p_db_column_name =>'DBOUT_TYPE', - p_display_order =>3, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_db_column_name =>'TESTCASE', + p_display_order =>8, p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'C', - p_column_label =>'DB Object Under Test Type', - p_report_label =>'DBOUT
      Type', - p_sync_form_label =>'N', + p_column_identifier =>'H', + p_column_label =>'Testcase', + p_report_label =>'Testcase', + p_sync_form_label =>'Y', p_display_in_default_rpt =>'Y', + p_column_link =>'f?p=&APP_ID.:6:&SESSION.::&DEBUG.::P0_TEST_RUN_ID,P0_TEST_CASE:#TEST_RUN_ID#,#TESTCASE#', + p_column_linktext =>'#TESTCASE#', + p_column_link_attr =>'title="Go To Test Case #TESTCASE#" style="color:blue"', p_is_sortable =>'Y', p_allow_sorting =>'Y', p_allow_filtering =>'Y', @@ -8758,7 +7443,7 @@ wwv_flow_api.create_worksheet_column( p_display_as =>'TEXT', p_display_text_as =>'ESCAPE_SC', p_heading_alignment =>'CENTER', - p_column_alignment =>'CENTER', + p_column_alignment =>'LEFT', p_tz_dependent =>'N', p_rpt_distinct_lov =>'Y', p_rpt_show_filter_lov =>'D', @@ -8768,17 +7453,17 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 5058603676145141+wwv_flow_api.g_id_offset, + p_id => 4950607731387045+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, - p_db_column_name =>'CODE_COVERAGE', - p_display_order =>4, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_db_column_name =>'MESSAGE', + p_display_order =>9, p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'D', - p_column_label =>'Code Coverage Percent', - p_report_label =>'Code
      Cvrg
      Pct', - p_sync_form_label =>'N', + p_column_identifier =>'I', + p_column_label =>'Message', + p_report_label =>'Message', + p_sync_form_label =>'Y', p_display_in_default_rpt =>'Y', p_is_sortable =>'Y', p_allow_sorting =>'Y', @@ -8792,12 +7477,11 @@ wwv_flow_api.create_worksheet_column( p_allow_hide =>'Y', p_others_may_edit =>'Y', p_others_may_view =>'Y', - p_column_type =>'NUMBER', + p_column_type =>'STRING', p_display_as =>'TEXT', p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'RIGHT', - p_column_alignment =>'RIGHT', - p_format_mask =>'999.9', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', p_tz_dependent =>'N', p_rpt_distinct_lov =>'Y', p_rpt_show_filter_lov =>'D', @@ -8805,733 +7489,975 @@ wwv_flow_api.create_worksheet_column( p_help_text =>''); end; / +declare + rc1 varchar2(32767) := null; +begin +rc1:=rc1||'TEST_RUN_ID:SEQ:EXECUTED_DATE_TIME:MSECS:STATUS:TESTCASE:ASSERTION:MESSAGE:DETAILS'; + +wwv_flow_api.create_worksheet_rpt( + p_id => 4950724292387987+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_session_id => null, + p_base_report_id => null+wwv_flow_api.g_id_offset, + p_application_user => 'APXWS_DEFAULT', + p_report_seq =>10, + p_report_alias =>'49508', + p_status =>'PUBLIC', + p_category_id =>null+wwv_flow_api.g_id_offset, + p_is_default =>'Y', + p_display_rows =>100000, + p_report_columns =>rc1, + p_sort_column_1 =>'SEQ', + p_sort_direction_1 =>'ASC', + p_flashback_enabled =>'N', + p_calendar_display_column =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_condition( + p_id => 5046424584891526+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_report_id => 4950724292387987+wwv_flow_api.g_id_offset, + p_name =>'Highlight Errors', + p_condition_type =>'HIGHLIGHT', + p_allow_delete =>'Y', + p_column_name =>'STATUS', + p_operator =>'=', + p_expr =>'ERR', + p_condition_sql =>' (case when ("STATUS" = #APXWS_EXPR#) then #APXWS_HL_ID# end) ', + p_condition_display =>'#APXWS_COL_NAME# = ''ERR'' ', + p_enabled =>'Y', + p_highlight_sequence =>10, + p_row_bg_color =>'#FF5588', + p_column_format =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_condition( + p_id => 5046501496891526+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_report_id => 4950724292387987+wwv_flow_api.g_id_offset, + p_name =>'Highlight Failures', + p_condition_type =>'HIGHLIGHT', + p_allow_delete =>'Y', + p_column_name =>'STATUS', + p_operator =>'=', + p_expr =>'FAIL', + p_condition_sql =>' (case when ("STATUS" = #APXWS_EXPR#) then #APXWS_HL_ID# end) ', + p_condition_display =>'#APXWS_COL_NAME# = ''FAIL'' ', + p_enabled =>'Y', + p_highlight_sequence =>10, + p_row_bg_color =>'#FFFF99', + p_column_format =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_condition( + p_id => 5046315838891526+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_worksheet_id => 4949624635387041+wwv_flow_api.g_id_offset, + p_report_id => 4950724292387987+wwv_flow_api.g_id_offset, + p_condition_type =>'FILTER', + p_allow_delete =>'Y', + p_column_name =>'STATUS', + p_operator =>'!=', + p_expr =>'PASS', + p_condition_sql =>'"STATUS" != #APXWS_EXPR#', + p_condition_display =>'#APXWS_COL_NAME# != ''PASS'' ', + p_enabled =>'Y', + p_column_format =>''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||'begin'||chr(10)|| +' for buff in (select error_message from wt_test_runs'||chr(10)|| +' where id = :P0_TEST_RUN_ID'||chr(10)|| +' and error_message is not null)'||chr(10)|| +' loop'||chr(10)|| +' htp.p(''Test Runner Error Message: '' ||'||chr(10)|| +' buff.error_message || ''
      '');'||chr(10)|| +' end loop;'||chr(10)|| +' htp.p(''
      '');'||chr(10)|| +' htp.p(''
      '');'||chr(10)|| +' htp.p(''
      '');'||chr(10)|| +' htp.p(''Test Results Details Search:'');'||chr(10)|| +'end;'||chr(10)|| +''; + +wwv_flow_api.create_page_plug ( + p_id=> 4957623889633835 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_plug_name=> 'Test Run Error Message', + p_region_name=>'', + p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 10, + p_plug_display_column=> 1, + p_plug_display_point=> 'AFTER_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'PLSQL_PROCEDURE', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'QUERY_COLUMNS', + p_plug_query_num_rows => 15, + p_plug_query_num_rows_type => 'NEXT_PREVIOUS_LINKS', + p_plug_query_row_count_max => 500, + p_plug_query_show_nulls_as => ' - ', + p_plug_display_condition_type => '', + p_pagination_display_position=>'BOTTOM_RIGHT', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s := null; +wwv_flow_api.create_page_plug ( + p_id=> 4971511333490098 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_plug_name=> 'Code Coverage Details', + p_region_name=>'', + p_plug_template=> 4839416734414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 30, + p_plug_display_column=> 1, + p_plug_display_point=> 'AFTER_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'STATIC_TEXT', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'QUERY_COLUMNS', + p_plug_query_num_rows_type => 'NEXT_PREVIOUS_LINKS', + p_plug_query_row_count_max => 500, + p_plug_query_show_nulls_as => ' - ', + p_plug_display_condition_type => 'EXISTS', + p_plug_display_when_condition => 'select dbout_name'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where id = :P0_TEST_RUN_ID'||chr(10)|| +' and dbout_name is not null', + p_pagination_display_position=>'BOTTOM_RIGHT', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s := null; +wwv_flow_api.create_page_plug ( + p_id=> 4952328298578419 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_plug_name=> 'Code Coverage Search', + p_region_name=>'', + p_parent_plug_id=>4971511333490098 + wwv_flow_api.g_id_offset, + p_plug_template=> 4840023588414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 50, + p_plug_display_column=> 1, + p_plug_display_point=> 'AFTER_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'STATIC_TEXT', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => '', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||'select line'||chr(10)|| +' ,status'||chr(10)|| +' ,total_occur'||chr(10)|| +' ,round(min_usecs) MIN_USECS'||chr(10)|| +' ,case when total_occur = 0 then 0'||chr(10)|| +' else round(total_usecs/total_occur)'||chr(10)|| +' end AVG_USECS'||chr(10)|| +' ,round(max_usecs) MAX_USECS'||chr(10)|| +' ,replace(htf.escape_sc(rtrim(text,CHR(10))),'' '',''  '')'||chr(10)|| +' TEXT'||chr(10)|| +' from wt_dbout_profil'; + +s:=s||'es'||chr(10)|| +' where test_run_id = :P0_TEST_RUN_ID'||chr(10)|| +' -- and status != ''IGNR'''||chr(10)|| +' and ( instr(upper("STATUS"),upper(nvl(:P3_SEARCH,"STATUS"))) > 0'||chr(10)|| +' OR instr(upper("TEXT"),upper(nvl(:P3_SEARCH,"TEXT"))) > 0 )'||chr(10)|| +''; + +wwv_flow_api.create_report_region ( + p_id=> 4952405887578432 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 3, + p_name=> 'Code Coverage Report', + p_region_name=>'', + p_parent_plug_id=>4971511333490098 + wwv_flow_api.g_id_offset, + p_template=> 4839912075414912+ wwv_flow_api.g_id_offset, + p_display_sequence=> 60, + p_report_attributes=>'style="font-family: monospace"', + p_display_column=> 1, + p_display_point=> 'AFTER_SHOW_ITEMS', + p_source=> s, + p_source_type=> 'SQL_QUERY', + p_display_error_message=> '#SQLERRM#', + p_display_when_condition=> 'P3_DBOUT_NAME', + p_plug_caching=> 'NOT_CACHED', + p_customized=> '0', + p_translate_title=> 'Y', + p_ajax_enabled=> 'Y', + p_query_row_template=> 4963602874586482+ wwv_flow_api.g_id_offset, + p_query_headings_type=> 'COLON_DELMITED_LIST', + p_query_options=> 'DERIVED_REPORT_COLUMNS', + p_query_show_nulls_as=> ' - ', + p_query_break_cols=> '0', + p_query_no_data_found=> 'no data found', + p_query_num_rows_item=> 'P3_ROWS', + p_query_num_rows_type=> 'ROW_RANGES_IN_SELECT_LIST', + p_query_row_count_max=> '5000', + p_pagination_display_position=> 'BOTTOM_LEFT', + p_csv_output=> 'Y', + p_csv_output_link_text=> 'Create CVS File', + p_prn_output=> 'N', + p_prn_format=> 'PDF', + p_prn_output_show_link=> 'Y', + p_prn_output_link_text=> 'Print', + p_prn_content_disposition=> 'ATTACHMENT', + p_prn_document_header=> 'APEX', + p_prn_units=> 'INCHES', + p_prn_paper_size=> 'LETTER', + p_prn_width_units=> 'PERCENTAGE', + p_prn_width=> 11, + p_prn_height=> 8.5, + p_prn_orientation=> 'HORIZONTAL', + p_prn_page_header_font_color=> '#000000', + p_prn_page_header_font_family=> 'Helvetica', + p_prn_page_header_font_weight=> 'normal', + p_prn_page_header_font_size=> '12', + p_prn_page_footer_font_color=> '#000000', + p_prn_page_footer_font_family=> 'Helvetica', + p_prn_page_footer_font_weight=> 'normal', + p_prn_page_footer_font_size=> '12', + p_prn_header_bg_color=> '#9bafde', + p_prn_header_font_color=> '#ffffff', + p_prn_header_font_family=> 'Helvetica', + p_prn_header_font_weight=> 'normal', + p_prn_header_font_size=> '10', + p_prn_body_bg_color=> '#efefef', + p_prn_body_font_color=> '#000000', + p_prn_body_font_family=> 'Helvetica', + p_prn_body_font_weight=> 'normal', + p_prn_body_font_size=> '10', + p_prn_border_width=> .5, + p_prn_page_header_alignment=> 'CENTER', + p_prn_page_footer_alignment=> 'CENTER', + p_query_asc_image=> 'apex/builder/dup.gif', + p_query_asc_image_attr=> 'width="16" height="16" alt="" ', + p_query_desc_image=> 'apex/builder/ddown.gif', + p_query_desc_image_attr=> 'width="16" height="16" alt="" ', + p_plug_query_exp_filename=> '&P3_DBOUT_OWNER..&P3_DBOUT_NAME.(&P3_DBOUT_TYPE.)#&P3_TEST_RUN_ID..csv', + p_plug_query_exp_separator=> ',', + p_plug_query_exp_enclosed_by=> '"', + p_plug_query_strip_html=> 'N', + p_comment=>''); +end; +/ +declare + s varchar2(32767) := null; begin -wwv_flow_api.create_worksheet_column( - p_id => 5058729192145141+wwv_flow_api.g_id_offset, +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4956416987578441 + wwv_flow_api.g_id_offset, + p_region_id=> 4952405887578432 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, - p_db_column_name =>'TEST_RUN_ID', - p_display_order =>5, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'E', - p_column_label =>'Test Run ID', - p_report_label =>'Test
      Run
      ID', - p_sync_form_label =>'N', - p_display_in_default_rpt =>'Y', - p_column_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P3_TEST_RUN_ID:#TEST_RUN_ID#', - p_column_linktext =>'#TEST_RUN_ID#', - p_column_link_attr =>'title="Go To Test Run ID #TEST_RUN_ID#" style="color:blue"', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'NUMBER', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'RIGHT', - p_column_alignment =>'RIGHT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); + p_query_column_id=> 1, + p_form_element_id=> null, + p_column_alias=> 'LINE', + p_column_display_sequence=> 1, + p_column_heading=> 'Line', + p_column_alignment=>'RIGHT', + p_heading_alignment=>'RIGHT', + p_default_sort_column_sequence=>1, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_include_in_export=> 'Y', + p_print_col_width=> '14', + p_column_comment=>''); end; / +declare + s varchar2(32767) := null; begin -wwv_flow_api.create_worksheet_column( - p_id => 5058806330145141+wwv_flow_api.g_id_offset, +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4956504864578441 + wwv_flow_api.g_id_offset, + p_region_id=> 4952405887578432 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, - p_db_column_name =>'RUNNER_OWNER', - p_display_order =>6, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'F', - p_column_label =>'Test Runner Owner', - p_report_label =>'Test
      Runner
      Owner', - p_sync_form_label =>'N', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'STRING', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'RIGHT', - p_column_alignment =>'RIGHT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); + p_query_column_id=> 2, + p_form_element_id=> null, + p_column_alias=> 'STATUS', + p_column_display_sequence=> 2, + p_column_heading=> 'Status', + p_column_alignment=>'LEFT', + p_heading_alignment=>'LEFT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_include_in_export=> 'Y', + p_print_col_width=> '14', + p_column_comment=>''); end; / +declare + s varchar2(32767) := null; begin -wwv_flow_api.create_worksheet_column( - p_id => 5058915547145141+wwv_flow_api.g_id_offset, +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4956610572578441 + wwv_flow_api.g_id_offset, + p_region_id=> 4952405887578432 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, - p_db_column_name =>'RUNNER_NAME', - p_display_order =>7, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'G', - p_column_label =>'Test Runner Name', - p_report_label =>'Test
      Runner
      Name', - p_sync_form_label =>'N', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'STRING', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'LEFT', - p_column_alignment =>'LEFT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); + p_query_column_id=> 3, + p_form_element_id=> null, + p_column_alias=> 'TOTAL_OCCUR', + p_column_display_sequence=> 3, + p_column_heading=> 'Total
      Occur', + p_column_alignment=>'RIGHT', + p_heading_alignment=>'RIGHT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_include_in_export=> 'Y', + p_print_col_width=> '14', + p_column_comment=>''); end; / +declare + s varchar2(32767) := null; begin -wwv_flow_api.create_worksheet_column( - p_id => 5059009515145141+wwv_flow_api.g_id_offset, +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4956712638578441 + wwv_flow_api.g_id_offset, + p_region_id=> 4952405887578432 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, - p_db_column_name =>'START_DTM', - p_display_order =>8, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'H', - p_column_label =>'Start Date/Time', - p_report_label =>'Start
      Date
      Time', - p_sync_form_label =>'N', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'DATE', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'CENTER', - p_column_alignment =>'CENTER', - p_format_mask =>'DD-MON-YYYY HH24:MI:SS', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); + p_query_column_id=> 4, + p_form_element_id=> null, + p_column_alias=> 'MIN_USECS', + p_column_display_sequence=> 4, + p_column_heading=> 'Min
      Usecs', + p_column_alignment=>'RIGHT', + p_heading_alignment=>'RIGHT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_include_in_export=> 'Y', + p_print_col_width=> '14', + p_column_comment=>''); end; / +declare + s varchar2(32767) := null; begin -wwv_flow_api.create_worksheet_column( - p_id => 5059121065145141+wwv_flow_api.g_id_offset, +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4956829235578441 + wwv_flow_api.g_id_offset, + p_region_id=> 4952405887578432 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, - p_db_column_name =>'END_DTM', - p_display_order =>9, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'I', - p_column_label =>'End Date/Time', - p_report_label =>'End
      Date
      Time', - p_sync_form_label =>'N', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'DATE', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'CENTER', - p_column_alignment =>'CENTER', - p_format_mask =>'DD-MON-YYYY HH24:MI:SS', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); + p_query_column_id=> 5, + p_form_element_id=> null, + p_column_alias=> 'AVG_USECS', + p_column_display_sequence=> 5, + p_column_heading=> 'Avg
      Usecs', + p_column_alignment=>'RIGHT', + p_heading_alignment=>'RIGHT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_include_in_export=> 'Y', + p_print_col_width=> '14', + p_column_comment=>''); end; / +declare + s varchar2(32767) := null; begin -wwv_flow_api.create_worksheet_column( - p_id => 5059220275145141+wwv_flow_api.g_id_offset, +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4956928135578441 + wwv_flow_api.g_id_offset, + p_region_id=> 4952405887578432 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, - p_db_column_name =>'PROFILED_LINES', - p_display_order =>10, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'J', - p_column_label =>'Profiled Source Lines', - p_report_label =>'Profiled
      Source
      Lines', - p_sync_form_label =>'N', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'NUMBER', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'RIGHT', - p_column_alignment =>'RIGHT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); + p_query_column_id=> 6, + p_form_element_id=> null, + p_column_alias=> 'MAX_USECS', + p_column_display_sequence=> 6, + p_column_heading=> 'Max
      Usecs', + p_column_alignment=>'RIGHT', + p_heading_alignment=>'RIGHT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_include_in_export=> 'Y', + p_print_col_width=> '14', + p_column_comment=>''); end; / +declare + s varchar2(32767) := null; begin -wwv_flow_api.create_worksheet_column( - p_id => 5059315222145141+wwv_flow_api.g_id_offset, +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4957019564578442 + wwv_flow_api.g_id_offset, + p_region_id=> 4952405887578432 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, - p_db_column_name =>'EXECUTED_LINES', - p_display_order =>11, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'K', - p_column_label =>'Executed Source Lines', - p_report_label =>'Executed
      Source
      Lines', - p_sync_form_label =>'N', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'NUMBER', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'RIGHT', - p_column_alignment =>'RIGHT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); + p_query_column_id=> 7, + p_form_element_id=> null, + p_column_alias=> 'TEXT', + p_column_display_sequence=> 7, + p_column_heading=> 'Text', + p_column_alignment=>'LEFT', + p_heading_alignment=>'LEFT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'WITHOUT_MODIFICATION', + p_lov_show_nulls=> 'NO', + p_is_required=> false, + p_pk_col_source=> s, + p_lov_display_extra=> 'YES', + p_include_in_export=> 'Y', + p_print_col_width=> '14', + p_column_comment=>''); +end; +/ + +begin + +wwv_flow_api.create_page_button( + p_id => 4939204461575007 + wwv_flow_api.g_id_offset, + p_flow_id => wwv_flow.g_flow_id, + p_flow_step_id => 3, + p_button_sequence=> 10, + p_button_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_button_name => 'P3_DELETE', + p_button_image => 'template:'||to_char(4838306817414911+wwv_flow_api.g_id_offset), + p_button_image_alt=> 'DELETE Runner Results All Runs', + p_button_position=> 'BOTTOM', + p_button_alignment=> 'LEFT', + p_button_redirect_url=> 'javascript:confirmDelete(''Confirm DELETE of all Test Results for '' + document.getElementById(''P0_TEST_OWNER'').value + ''.'' + document.getElementById(''P0_TEST_RUNNER'').value, ''DELETE'')', + p_button_execute_validations=>'Y', + p_required_patch => null + wwv_flow_api.g_id_offset); + +wwv_flow_api.create_page_button( + p_id => 5168718571973414 + wwv_flow_api.g_id_offset, + p_flow_id => wwv_flow.g_flow_id, + p_flow_step_id => 3, + p_button_sequence=> 20, + p_button_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_button_name => 'RUN_NOW', + p_button_image => 'template:'||to_char(4838226535414911+wwv_flow_api.g_id_offset), + p_button_image_alt=> 'Run Now & Wait', + p_button_position=> 'TOP', + p_button_alignment=> 'LEFT', + p_button_redirect_url=> '', + p_button_execute_validations=>'Y', + p_button_condition=> 'select host'||chr(10)|| +' from user_db_links'||chr(10)|| +' where :P0_TEST_OWNER = db_link'||chr(10)|| +' and :P0_TEST_RUNNER is not null', + p_button_condition_type=> 'EXISTS', + p_button_comment=>'Warning: The web page will not return until the test runner has completed.', + p_required_patch => null + wwv_flow_api.g_id_offset); + + end; / + + begin -wwv_flow_api.create_worksheet_column( - p_id => 5059411706145141+wwv_flow_api.g_id_offset, + +wwv_flow_api.create_page_branch( + p_id=>4956122682578439 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, - p_db_column_name =>'IGNORED_LINES', - p_display_order =>12, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'L', - p_column_label =>'Ignored Source Lines', - p_report_label =>'Ignored
      Source
      Lines', - p_sync_form_label =>'N', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'NUMBER', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'RIGHT', - p_column_alignment =>'RIGHT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); -end; -/ -begin -wwv_flow_api.create_worksheet_column( - p_id => 5059518034145141+wwv_flow_api.g_id_offset, + p_flow_step_id=> 3, + p_branch_action=> 'f?p=&APP_ID.:3:&SESSION.', + p_branch_point=> 'AFTER_PROCESSING', + p_branch_type=> 'REDIRECT_URL', + p_branch_sequence=> 10, + p_save_state_before_branch_yn=>'Y', + p_branch_comment=> ''); + +wwv_flow_api.create_page_branch( + p_id=>4923132166541430 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, - p_db_column_name =>'EXCLUDED_LINES', - p_display_order =>13, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'M', - p_column_label =>'Excluded Source Lines', - p_report_label =>'Excluded
      Source
      Lines', - p_sync_form_label =>'N', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'NUMBER', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'RIGHT', - p_column_alignment =>'RIGHT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); + p_flow_step_id=> 3, + p_branch_action=> 'f?p=&APP_ID.:3:&SESSION.::&DEBUG.:::&success_msg=#SUCCESS_MSG#', + p_branch_point=> 'AFTER_PROCESSING', + p_branch_type=> 'REDIRECT_URL', + p_branch_sequence=> 99, + p_save_state_before_branch_yn=>'Y', + p_branch_comment=> ''); + + end; / + +declare + h varchar2(32767) := null; begin -wwv_flow_api.create_worksheet_column( - p_id => 5059610513145141+wwv_flow_api.g_id_offset, +wwv_flow_api.create_page_item( + p_id=>4924510262627933 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, - p_db_column_name =>'NOTEXEC_LINES', - p_display_order =>14, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'N', - p_column_label =>'Not Executed Source Lines', - p_report_label =>'Not
      Executed
      Lines', - p_sync_form_label =>'N', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'NUMBER', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'RIGHT', - p_column_alignment =>'RIGHT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); + p_flow_step_id=> 3, + p_name=>'P3_SHOW_TREND', + p_data_type=> 'VARCHAR', + p_is_required=> true, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 13, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Show Trend:', + p_source=>'N', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_RADIOGROUP', + p_named_lov=> 'Y_OR_N', + p_lov=> '.'||to_char(4923728354614299 + wwv_flow_api.g_id_offset)||'.', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => '2', + p_attribute_02 => 'SUBMIT', + p_attribute_03 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + end; / + +declare + h varchar2(32767) := null; begin -wwv_flow_api.create_worksheet_column( - p_id => 5059710978145141+wwv_flow_api.g_id_offset, +wwv_flow_api.create_page_item( + p_id=>4939603900584303 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, - p_db_column_name =>'UNKNOWN_LINES', - p_display_order =>15, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'O', - p_column_label =>'Unknown Source Lines', - p_report_label =>'Unknown
      Source
      Lines', - p_sync_form_label =>'N', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'NUMBER', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'RIGHT', - p_column_alignment =>'RIGHT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); + p_flow_step_id=> 3, + p_name=>'P3_ROWS_DELETED_MSG', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 15, + p_item_plug_id => 4848108018414926+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_HIDDEN', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'NO', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'LEFT', + p_field_alignment=> 'LEFT', + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_show_quick_picks=>'N', + p_item_comment => ''); + + end; / + +declare + h varchar2(32767) := null; begin -wwv_flow_api.create_worksheet_column( - p_id => 5059811323145141+wwv_flow_api.g_id_offset, +wwv_flow_api.create_page_item( + p_id=>4954902281578436 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, - p_db_column_name =>'MIN_EXECUTED_USECS', - p_display_order =>16, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'P', - p_column_label =>'Minimum Executed Microsecs', - p_report_label =>'Minimum
      Executed
      Microsecs', - p_sync_form_label =>'N', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'NUMBER', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'RIGHT', - p_column_alignment =>'RIGHT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); + p_flow_step_id=> 3, + p_name=>'P3_SEARCH', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 10, + p_item_plug_id => 4952328298578419+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_prompt=>'Search', + p_display_as=> 'NATIVE_TEXT_FIELD', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 2000, + p_cHeight=> null, + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_attribute_01 => 'Y', + p_attribute_02 => 'N', + p_attribute_03 => 'N', + p_item_comment => ''); + + end; / + +declare + h varchar2(32767) := null; begin -wwv_flow_api.create_worksheet_column( - p_id => 5059913789145141+wwv_flow_api.g_id_offset, +wwv_flow_api.create_page_item( + p_id=>4955118227578437 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, - p_db_column_name =>'AVG_EXECUTED_USECS', - p_display_order =>17, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'Q', - p_column_label =>'Average Executed Microsecs', - p_report_label =>'Avgerage
      Executed
      Microsecs', - p_sync_form_label =>'N', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'NUMBER', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'RIGHT', - p_column_alignment =>'RIGHT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); + p_flow_step_id=> 3, + p_name=>'P3_ROWS', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 20, + p_item_plug_id => 4952328298578419+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'Display', + p_source=>'500', + p_source_type=> 'STATIC', + p_display_as=> 'NATIVE_SELECT_LIST', + p_named_lov=> 'P3_Report Row Per Page', + p_lov=> '.'||to_char(4952509356578433 + wwv_flow_api.g_id_offset)||'.', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 2000, + p_cHeight=> 1, + p_begin_on_new_line=> 'NO', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'NONE', + p_attribute_02 => 'N', + p_show_quick_picks=>'N', + p_item_comment => ''); + + end; / + +declare + h varchar2(32767) := null; begin -wwv_flow_api.create_worksheet_column( - p_id => 5060023226145142+wwv_flow_api.g_id_offset, +wwv_flow_api.create_page_item( + p_id=>4955319672578437 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, - p_db_column_name =>'MAX_EXECUTED_USECS', - p_display_order =>18, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'R', - p_column_label =>'Maximum Executed Microsecs', - p_report_label =>'Maximum
      Executed
      Microsecs', - p_sync_form_label =>'N', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'NUMBER', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'RIGHT', - p_column_alignment =>'RIGHT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); + p_flow_step_id=> 3, + p_name=>'P3_GO', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 30, + p_item_plug_id => 4952328298578419+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default=> 'GO', + p_prompt=>'Go', + p_source=>'GO', + p_source_type=> 'STATIC', + p_display_as=> 'BUTTON', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> null, + p_cMaxlength=> null, + p_cHeight=> null, + p_tag_attributes => 'template:'||to_char(4838226535414911 + wwv_flow_api.g_id_offset), + p_begin_on_new_line=> 'NO', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'LEFT', + p_field_alignment=> 'LEFT', + p_is_persistent=> 'Y', + p_item_comment => ''); + + end; / + +declare + h varchar2(32767) := null; begin -wwv_flow_api.create_worksheet_column( - p_id => 5060123834145142+wwv_flow_api.g_id_offset, +wwv_flow_api.create_page_item( + p_id=>4955512070578437 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, - p_db_column_name =>'TOT_EXECUTED_USECS', - p_display_order =>19, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'S', - p_column_label =>'Total Executed Microsecs', - p_report_label =>'Total
      Executed
      Microsecs', - p_sync_form_label =>'N', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'NUMBER', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'RIGHT', - p_column_alignment =>'RIGHT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); + p_flow_step_id=> 3, + p_name=>'P3_RESET', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 40, + p_item_plug_id => 4952328298578419+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'YES', + p_item_default=> 'RESET', + p_prompt=>'Reset', + p_source=>'RESET', + p_source_type=> 'STATIC', + p_display_as=> 'BUTTON', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> null, + p_cMaxlength=> null, + p_cHeight=> null, + p_tag_attributes => 'template:'||to_char(4838226535414911 + wwv_flow_api.g_id_offset), + p_begin_on_new_line=> 'NO', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'LEFT', + p_field_alignment=> 'LEFT', + p_is_persistent=> 'Y', + p_item_comment => ''); + + end; / + + begin -wwv_flow_api.create_worksheet_column( - p_id => 5060204482145142+wwv_flow_api.g_id_offset, + +wwv_flow_api.create_page_computation( + p_id=> 5113008183346610 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, - p_db_column_name =>'TRIGGER_OFFSET', - p_display_order =>20, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'T', - p_column_label =>'Trigger Offset', - p_report_label =>'Trigger
      Offset', - p_sync_form_label =>'N', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'NUMBER', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'RIGHT', - p_column_alignment =>'RIGHT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); + p_flow_step_id=> 3, + p_computation_sequence => 20, + p_computation_item=> 'P0_DISPLAY', + p_computation_point=> 'BEFORE_HEADER', + p_computation_type=> 'STATIC_ASSIGNMENT', + p_computation_processed=> 'REPLACE_EXISTING', + p_computation=> 'Y', + p_compute_when => '', + p_compute_when_type=>''); + +null; + end; / + + begin -wwv_flow_api.create_worksheet_column( - p_id => 5060309927145142+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, - p_db_column_name =>'ERROR_MESSAGE', - p_display_order =>21, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'U', - p_column_label =>'Error Message', - p_report_label =>'Error
      Message', - p_sync_form_label =>'N', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'STRING', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'LEFT', - p_column_alignment =>'LEFT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); + +wwv_flow_api.create_page_da_event ( + p_id => 4931927743335808 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_page_id => 3 + ,p_name => 'Submit After LOV Change' + ,p_event_sequence => 10 + ,p_triggering_element_type => 'ITEM' + ,p_triggering_element => 'P3_GOTO_RUN_ID' + ,p_bind_type => 'bind' + ,p_bind_event_type => 'change' + ); +wwv_flow_api.create_page_da_action ( + p_id => 4932206270335808 + wwv_flow_api.g_id_offset + ,p_flow_id => wwv_flow.g_flow_id + ,p_page_id => 3 + ,p_event_id => 4931927743335808 + wwv_flow_api.g_id_offset + ,p_event_result => 'TRUE' + ,p_action_sequence => 10 + ,p_execute_on_page_init => 'N' + ,p_action => 'NATIVE_SUBMIT_PAGE' + ,p_attribute_01 => 'REFRESH' + ,p_stop_execution_on_error => 'Y' + ); +null; + end; / + + +begin + declare - rc1 varchar2(32767) := null; + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; begin -rc1:=rc1||'DBOUT_OWNER:DBOUT_NAME:DBOUT_TYPE:CODE_COVERAGE:TEST_RUN_ID:RUNNER_OWNER:RUNNER_NAME:START_DTM:MAX_EXECUTED_USECS:ERROR_MESSAGE'; +p:=p||'reset_pagination'; -wwv_flow_api.create_worksheet_rpt( - p_id => 5060410372145412+wwv_flow_api.g_id_offset, +wwv_flow_api.create_page_process( + p_id => 4955700238578438 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, - p_session_id => null, - p_base_report_id => null+wwv_flow_api.g_id_offset, - p_application_user => 'APXWS_DEFAULT', - p_report_seq =>10, - p_report_alias =>'50605', - p_status =>'PUBLIC', - p_category_id =>null+wwv_flow_api.g_id_offset, - p_is_default =>'Y', - p_display_rows =>15, - p_report_columns =>rc1, - p_sort_column_1 =>'TEST_RUN_ID', - p_sort_direction_1 =>'DESC', - p_sort_column_2 =>'0', - p_sort_direction_2 =>'ASC', - p_sort_column_3 =>'0', - p_sort_direction_3 =>'ASC', - p_sort_column_4 =>'0', - p_sort_direction_4 =>'ASC', - p_sort_column_5 =>'0', - p_sort_direction_5 =>'ASC', - p_sort_column_6 =>'0', - p_sort_direction_6 =>'ASC', - p_flashback_enabled =>'N', - p_calendar_display_column =>''); + p_flow_step_id => 3, + p_process_sequence=> 10, + p_process_point=> 'AFTER_SUBMIT', + p_process_type=> 'RESET_PAGINATION', + p_process_name=> 'Reset Pagination', + p_process_sql_clob => p, + p_process_error_message=> 'Unable to reset pagination.', + p_process_when=>'GO,P3_SEARCH,RESET', + p_process_when_type=>'REQUEST_IN_CONDITION', + p_process_success_message=> '', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; +null; + end; / + + +begin + declare - rc1 varchar2(32767) := null; + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; begin -rc1:=rc1||'DBOUT_OWNER:DBOUT_NAME:DBOUT_TYPE:CODE_COVERAGE:TEST_RUN_ID:RUNNER_OWNER:RUNNER_NAME:START_DTM:END_DTM:PROFILED_LINES:EXECUTED_LINES:IGNORED_LINES:EXCLUDED_LINES:NOTEXEC_LINES:UNKNOWN_LINES:MIN_EXECUTED_USECS:AVG_EXECUTED_USECS:MAX_EXECUTED_USECS:TOT_EXECUTED_USECS:TRIGGER_OFFSET:ERROR_MESSAGE'; +p:=p||'P3_SEARCH,P3_ROWS'; -wwv_flow_api.create_worksheet_rpt( - p_id => 5062402397417566+wwv_flow_api.g_id_offset, +wwv_flow_api.create_page_process( + p_id => 4955926050578438 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 4, - p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, - p_session_id => null, - p_base_report_id => null+wwv_flow_api.g_id_offset, - p_application_user => 'APXWS_ALTERNATIVE', - p_name =>'All Columns', - p_report_seq =>10, - p_report_alias =>'50625', - p_status =>'PUBLIC', - p_category_id =>null+wwv_flow_api.g_id_offset, - p_is_default =>'Y', - p_display_rows =>15, - p_report_columns =>rc1, - p_sort_column_1 =>'TEST_RUN_ID', - p_sort_direction_1 =>'DESC', - p_sort_column_2 =>'0', - p_sort_direction_2 =>'ASC', - p_sort_column_3 =>'0', - p_sort_direction_3 =>'ASC', - p_sort_column_4 =>'0', - p_sort_direction_4 =>'ASC', - p_sort_column_5 =>'0', - p_sort_direction_5 =>'ASC', - p_sort_column_6 =>'0', - p_sort_direction_6 =>'ASC', - p_flashback_enabled =>'N', - p_calendar_display_column =>''); + p_flow_step_id => 3, + p_process_sequence=> 20, + p_process_point=> 'AFTER_SUBMIT', + p_process_type=> 'CLEAR_CACHE_FOR_ITEMS', + p_process_name=> 'Reset report search', + p_process_sql_clob => p, + p_process_error_message=> 'Unable to clear cache.', + p_process_when_button_id=>4955512070578437 + wwv_flow_api.g_id_offset, + p_process_success_message=> '', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; +null; + end; / + begin +declare + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +p:=p||'declare'||chr(10)|| +' run_str varchar2(2000) := ''wtplsql.test_run@'' ||'||chr(10)|| +' :P0_TEST_OWNER || ''('''''' ||'||chr(10)|| +' :P0_TEST_RUNNER || '''''')'' ;'||chr(10)|| +'begin'||chr(10)|| +' execute immediate ''begin '' || run_str || ''; end;'';'||chr(10)|| +' begin'||chr(10)|| +' select max(id)'||chr(10)|| +' into :P0_TEST_RUN_ID'||chr(10)|| +' from wt_test_runs'||chr(10)|| +' where runner_owner = :P0_TEST_OWNER'||chr(10)|| +' and runner_name = '; + +p:=p||':P0_TEST_RUNNER;'||chr(10)|| +' exception when NO_DATA_FOUND'||chr(10)|| +' then'||chr(10)|| +' null; -- Do Nothing'||chr(10)|| +' end;'||chr(10)|| +'end;'; + +wwv_flow_api.create_page_process( + p_id => 5168825843975543 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id => 3, + p_process_sequence=> 50, + p_process_point=> 'AFTER_SUBMIT', + p_process_type=> 'PLSQL', + p_process_name=> 'RUN_NOW', + p_process_sql_clob => p, + p_process_error_message=> '', + p_process_when_button_id=>5168718571973414 + wwv_flow_api.g_id_offset, + p_process_success_message=> '', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; null; end; @@ -9540,6 +8466,81 @@ end; begin +declare + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +p:=p||'declare'||chr(10)|| +' num_runs number := 0;'||chr(10)|| +' num_stats number := 0;'||chr(10)|| +' num_tcase number := 0;'||chr(10)|| +' num_res number := 0;'||chr(10)|| +' num_profs number := 0;'||chr(10)|| +' procedure load_msg is begin'||chr(10)|| +' :P3_ROWS_DELETED_MSG := num_runs || '' WT_TEST_RUNS, '' ||'||chr(10)|| +' num_stats || '' WT_TEST_RUN_STATS, '' ||'||chr(10)|| +' num_tcase || '' WT_TESTCASE_STATS, '' ||'||chr(10)|| +' '; + +p:=p||' num_res || '' WT_RESULTS, '' ||'||chr(10)|| +' num_profs || '' WT_DBOUT_PROFILES'' ;'||chr(10)|| +' end load_msg;'||chr(10)|| +'begin'||chr(10)|| +' load_msg;'||chr(10)|| +' for buff in ('||chr(10)|| +' select id from wt_test_runs'||chr(10)|| +' where runner_owner = :P0_TEST_OWNER'||chr(10)|| +' and runner_name = :P0_TEST_RUNNER )'||chr(10)|| +' loop'||chr(10)|| +' --'||chr(10)|| +' delete from wt_test_run_stats'||chr(10)|| +' where test_run_id = buff.id;'||chr(10)|| +' num_stats :'; + +p:=p||'= num_stats + SQL%ROWCOUNT;'||chr(10)|| +' --'||chr(10)|| +' delete from wt_testcase_stats'||chr(10)|| +' where test_run_id = buff.id;'||chr(10)|| +' num_tcase := num_tcase + SQL%ROWCOUNT;'||chr(10)|| +' --'||chr(10)|| +' delete from wt_results'||chr(10)|| +' where test_run_id = buff.id;'||chr(10)|| +' num_res := num_res + SQL%ROWCOUNT;'||chr(10)|| +' --'||chr(10)|| +' delete from wt_dbout_profiles'||chr(10)|| +' where test_run_id = buff.id;'||chr(10)|| +' num_profs := num_profs + SQL%ROWCOUNT;'||chr(10)|| +' '; + +p:=p||' --'||chr(10)|| +' delete from wt_test_runs'||chr(10)|| +' where id = buff.id;'||chr(10)|| +' num_runs := num_runs + SQL%ROWCOUNT;'||chr(10)|| +' --'||chr(10)|| +' load_msg;'||chr(10)|| +' --'||chr(10)|| +' end loop;'||chr(10)|| +' :P0_TEST_RUN_ID := NULL;'||chr(10)|| +' :P0_TEST_RUNNER := NULL;'||chr(10)|| +'end;'; + +wwv_flow_api.create_page_process( + p_id => 4927320293945637 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id => 3, + p_process_sequence=> 10, + p_process_point=> 'ON_SUBMIT_BEFORE_COMPUTATION', + p_process_type=> 'PLSQL', + p_process_name=> 'Delete Test Runs', + p_process_sql_clob => p, + p_process_error_message=> 'Failed to delete rows (&P3_ROWS_DELETED_MSG.)', + p_process_when=>'DELETE', + p_process_when_type=>'REQUEST_EQUALS_CONDITION', + p_process_success_message=> 'Successfully deleted &P3_ROWS_DELETED_MSG.', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; null; end; @@ -9549,7 +8550,7 @@ end; begin --------------------------------------- --- ...updatable report columns for page 4 +-- ...updatable report columns for page 3 -- begin @@ -9562,22 +8563,23 @@ end; / ---application/pages/page_00005 -prompt ...PAGE 5: About +--application/pages/page_00004 +prompt ...PAGE 4: DBOUT Profile -- begin wwv_flow_api.create_page ( p_flow_id => wwv_flow.g_flow_id - ,p_id => 5 + ,p_id => 4 ,p_tab_set => 'TS1' - ,p_name => 'About' - ,p_alias => 'ABOUT' - ,p_step_title => 'About' + ,p_name => 'DBOUT Profile' + ,p_alias => 'DBOUTPROFILE' + ,p_step_title => 'DBOUT Profile' ,p_allow_duplicate_submissions => 'Y' + ,p_step_sub_title => 'DBOUT Profile' ,p_step_sub_title_type => 'TEXT_WITH_SUBSTITUTIONS' - ,p_first_item => 'NO_FIRST_ITEM' + ,p_first_item => 'AUTO_FIRST_ITEM' ,p_include_apex_css_js_yn => 'Y' ,p_autocomplete_on_off => 'ON' ,p_page_is_public_y_n => 'N' @@ -9585,489 +8587,713 @@ wwv_flow_api.create_page ( ,p_cache_page_yn => 'N' ,p_cache_timeout_seconds => 21600 ,p_cache_by_user_yn => 'N' + ,p_help_text => +'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180711231159' + ,p_last_upd_yyyymmddhh24miss => '20180829211824' ); null; end; / - -declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; + +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||'select r.dbout_owner'||chr(10)|| +' ,r.dbout_name'||chr(10)|| +' ,r.dbout_type'||chr(10)|| +' ,s.code_coverage*100 CODE_COVERAGE'||chr(10)|| +' ,r.id TEST_RUN_ID'||chr(10)|| +' ,r.runner_owner'||chr(10)|| +' ,r.runner_name'||chr(10)|| +' ,r.start_dtm'||chr(10)|| +' ,r.end_dtm'||chr(10)|| +' ,s.profiled_lines'||chr(10)|| +' ,s.executed_lines'||chr(10)|| +' ,s.ignored_lines'||chr(10)|| +' ,s.excluded_lines'||chr(10)|| +' ,s.notexec_lines'||chr(10)|| +' ,s.unknown_lines'||chr(10)|| +' ,s.min_exec'; + +s:=s||'uted_usecs'||chr(10)|| +' ,s.avg_executed_usecs'||chr(10)|| +' ,s.max_executed_usecs'||chr(10)|| +' ,round(s.tot_executed_usecs,3) TOT_EXECUTED_USECS'||chr(10)|| +' ,r.trigger_offset'||chr(10)|| +' ,r.error_message'||chr(10)|| +' from wt_test_runs r'||chr(10)|| +' join wt_test_run_stats s'||chr(10)|| +' on s.test_run_id = r.id'||chr(10)|| +' where r.dbout_name is not null'; + +wwv_flow_api.create_page_plug ( + p_id=> 5058029495145138 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_plug_name=> 'DBOUT Profile', + p_region_name=>'', + p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 10, + p_plug_display_column=> 1, + p_plug_display_point=> 'AFTER_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'DYNAMIC_QUERY', + p_translate_title=> 'Y', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_display_condition_type => '', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); +end; +/ +declare + a1 varchar2(32767) := null; +begin +a1:=a1||'select r.dbout_owner'||chr(10)|| +' ,r.dbout_name'||chr(10)|| +' ,r.dbout_type'||chr(10)|| +' ,s.code_coverage*100 CODE_COVERAGE'||chr(10)|| +' ,r.id TEST_RUN_ID'||chr(10)|| +' ,r.runner_owner'||chr(10)|| +' ,r.runner_name'||chr(10)|| +' ,r.start_dtm'||chr(10)|| +' ,r.end_dtm'||chr(10)|| +' ,s.profiled_lines'||chr(10)|| +' ,s.executed_lines'||chr(10)|| +' ,s.ignored_lines'||chr(10)|| +' ,s.excluded_lines'||chr(10)|| +' ,s.notexec_lines'||chr(10)|| +' ,s.unknown_lines'||chr(10)|| +' ,s.min_exec'; + +a1:=a1||'uted_usecs'||chr(10)|| +' ,s.avg_executed_usecs'||chr(10)|| +' ,s.max_executed_usecs'||chr(10)|| +' ,round(s.tot_executed_usecs,3) TOT_EXECUTED_USECS'||chr(10)|| +' ,r.trigger_offset'||chr(10)|| +' ,r.error_message'||chr(10)|| +' from wt_test_runs r'||chr(10)|| +' join wt_test_run_stats s'||chr(10)|| +' on s.test_run_id = r.id'||chr(10)|| +' where r.dbout_name is not null'; + +wwv_flow_api.create_worksheet( + p_id=> 5058117729145138+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_region_id=> 5058029495145138+wwv_flow_api.g_id_offset, + p_name=> 'DBOUT Profile', + p_folder_id=> null, + p_alias=> '', + p_report_id_item=> '', + p_max_row_count=> '10000', + p_max_row_count_message=> 'This query returns more than #MAX_ROW_COUNT# rows, please filter your data to ensure complete results.', + p_no_data_found_message=> 'No data found.', + p_max_rows_per_page=>'', + p_search_button_label=>'', + p_page_items_to_submit=>'', + p_sort_asc_image=>'', + p_sort_asc_image_attr=>'', + p_sort_desc_image=>'', + p_sort_desc_image_attr=>'', + p_sql_query => a1, + p_base_pk1=>'TEST_RUN_ID', + p_status=>'AVAILABLE_FOR_OWNER', + p_allow_report_saving=>'Y', + p_allow_save_rpt_public=>'N', + p_allow_report_categories=>'N', + p_show_nulls_as=>'-', + p_pagination_type=>'ROWS_X_TO_Y', + p_pagination_display_pos=>'BOTTOM_LEFT', + p_show_finder_drop_down=>'Y', + p_show_display_row_count=>'N', + p_show_search_bar=>'Y', + p_show_search_textbox=>'Y', + p_show_actions_menu=>'Y', + p_report_list_mode=>'TABS', + p_show_detail_link=>'Y', + p_show_select_columns=>'Y', + p_show_rows_per_page=>'Y', + p_show_filter=>'Y', + p_show_sort=>'Y', + p_show_control_break=>'Y', + p_show_highlight=>'Y', + p_show_computation=>'Y', + p_show_aggregate=>'Y', + p_show_chart=>'Y', + p_show_group_by=>'Y', + p_show_notify=>'N', + p_show_calendar=>'N', + p_show_flashback=>'Y', + p_show_reset=>'Y', + p_show_download=>'Y', + p_show_help=>'Y', + p_download_formats=>'CSV:HTML:EMAIL', + p_detail_link_text=>'', + p_allow_exclude_null_values=>'Y', + p_allow_hide_extra_columns=>'Y', + p_icon_view_enabled_yn=>'N', + p_icon_view_columns_per_row=>1, + p_detail_view_enabled_yn=>'N', + p_owner=>'WTP'); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5058332650145140+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'DBOUT_OWNER', + p_display_order =>1, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'A', + p_column_label =>'DB Object Under Test Owner', + p_report_label =>'DBOUT
      Owner', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ begin -s:=s||'select install_dtm'||chr(10)|| -' ,action'||chr(10)|| -' ,text'||chr(10)|| -' from wt_version'; - -wwv_flow_api.create_report_region ( - p_id=> 4906213947718211 + wwv_flow_api.g_id_offset, +wwv_flow_api.create_worksheet_column( + p_id => 5058422778145140+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 5, - p_name=> 'wtPLSQL Core Installation History:', - p_region_name=>'', - p_template=> 4838619911414911+ wwv_flow_api.g_id_offset, - p_display_sequence=> 30, - p_display_column=> 1, - p_display_point=> 'AFTER_SHOW_ITEMS', - p_source=> s, - p_source_type=> 'SQL_QUERY', - p_display_error_message=> '#SQLERRM#', - p_plug_caching=> 'NOT_CACHED', - p_customized=> '0', - p_translate_title=> 'Y', - p_ajax_enabled=> 'Y', - p_query_row_template=> 4843113555414914+ wwv_flow_api.g_id_offset, - p_query_headings_type=> 'COLON_DELMITED_LIST', - p_query_num_rows=> '15', - p_query_options=> 'DERIVED_REPORT_COLUMNS', - p_query_show_nulls_as=> ' - ', - p_query_break_cols=> '0', - p_query_no_data_found=> 'no data found', - p_query_num_rows_type=> 'NEXT_PREVIOUS_LINKS', - p_pagination_display_position=> 'BOTTOM_RIGHT', - p_csv_output=> 'N', - p_query_asc_image=> 'apex/builder/dup.gif', - p_query_asc_image_attr=> 'width="16" height="16" alt="" ', - p_query_desc_image=> 'apex/builder/ddown.gif', - p_query_desc_image_attr=> 'width="16" height="16" alt="" ', - p_plug_query_strip_html=> 'Y', - p_comment=>''); + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'DBOUT_NAME', + p_display_order =>2, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'B', + p_column_label =>'DB Object Under Test Name', + p_report_label =>'DBOUT
      Name', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'LEFT', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); end; / -declare - s varchar2(32767) := null; begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 4906513668718218 + wwv_flow_api.g_id_offset, - p_region_id=> 4906213947718211 + wwv_flow_api.g_id_offset, +wwv_flow_api.create_worksheet_column( + p_id => 5058500986145140+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 1, - p_form_element_id=> null, - p_column_alias=> 'INSTALL_DTM', - p_column_display_sequence=> 1, - p_column_heading=> 'INSTALL_DTM', - p_column_alignment=>'LEFT', - p_default_sort_column_sequence=>1, - p_default_sort_dir=>'desc', - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'ESCAPE_SC', - p_is_required=> false, - p_pk_col_source=> s, - p_column_comment=>''); + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'DBOUT_TYPE', + p_display_order =>3, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'C', + p_column_label =>'DB Object Under Test Type', + p_report_label =>'DBOUT
      Type', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'CENTER', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); end; / -declare - s varchar2(32767) := null; begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 4906620342718218 + wwv_flow_api.g_id_offset, - p_region_id=> 4906213947718211 + wwv_flow_api.g_id_offset, +wwv_flow_api.create_worksheet_column( + p_id => 5058603676145141+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 2, - p_form_element_id=> null, - p_column_alias=> 'ACTION', - p_column_display_sequence=> 2, - p_column_heading=> 'ACTION', - p_column_alignment=>'LEFT', - p_default_sort_column_sequence=>0, - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'ESCAPE_SC', - p_is_required=> false, - p_pk_col_source=> s, - p_column_comment=>''); + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'CODE_COVERAGE', + p_display_order =>4, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'D', + p_column_label =>'Code Coverage Percent', + p_report_label =>'Code
      Cvrg
      Pct', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_format_mask =>'999.9', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); end; / -declare - s varchar2(32767) := null; begin -s := null; -wwv_flow_api.create_report_columns ( - p_id=> 4906723875718218 + wwv_flow_api.g_id_offset, - p_region_id=> 4906213947718211 + wwv_flow_api.g_id_offset, +wwv_flow_api.create_worksheet_column( + p_id => 5058729192145141+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_query_column_id=> 3, - p_form_element_id=> null, - p_column_alias=> 'TEXT', - p_column_display_sequence=> 3, - p_column_heading=> 'TEXT', - p_column_alignment=>'LEFT', - p_default_sort_column_sequence=>0, - p_disable_sort_column=>'N', - p_sum_column=> 'N', - p_hidden_column=> 'N', - p_display_as=>'ESCAPE_SC', - p_is_required=> false, - p_pk_col_source=> s, - p_column_comment=>''); + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'TEST_RUN_ID', + p_display_order =>5, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'E', + p_column_label =>'Test Run ID', + p_report_label =>'Test
      Run
      ID', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_column_link =>'f?p=&APP_ID.:3:&SESSION.::&DEBUG.::P0_TEST_RUN_ID:#TEST_RUN_ID#', + p_column_linktext =>'#TEST_RUN_ID#', + p_column_link_attr =>'title="Go To Test Run ID #TEST_RUN_ID#" style="color:blue"', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); end; / -declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; begin -s:=s||'&APP_VERSION.
      '||chr(10)|| -'
      '||chr(10)|| -'
      '||chr(10)|| -''||chr(10)|| -'Use GitHub “issues” for support. (A free GitHub account will be required to create a new issue. Issues can be searched without an account.)
      '||chr(10)|| -'
      '||chr(10)|| -'
      '||chr(10)|| -''||chr(10)|| -'Find more information at wtPLSQL Website.
      '||chr(10)|| -'
      '||chr(10)|| -'
      '; - -wwv_flow_api.create_page_plug ( - p_id=> 4907318411766797 + wwv_flow_api.g_id_offset, +wwv_flow_api.create_worksheet_column( + p_id => 5058806330145141+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 5, - p_plug_name=> 'About', - p_region_name=>'', - p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 20, - p_plug_display_column=> 1, - p_plug_display_point=> 'BEFORE_SHOW_ITEMS', - p_plug_source=> s, - p_plug_source_type=> 'STATIC_TEXT_WITH_SHORTCUTS', - p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', - p_plug_query_row_template=> 4843113555414914+ wwv_flow_api.g_id_offset, - p_plug_query_headings_type=> 'QUERY_COLUMNS', - p_plug_query_num_rows => 15, - p_plug_query_num_rows_type => 'NEXT_PREVIOUS_LINKS', - p_plug_query_row_count_max => 500, - p_plug_query_show_nulls_as => ' - ', - p_plug_display_condition_type => '', - p_pagination_display_position=>'BOTTOM_RIGHT', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'RUNNER_OWNER', + p_display_order =>6, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'F', + p_column_label =>'Test Runner Owner', + p_report_label =>'Test
      Runner
      Owner', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); end; / -declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; begin -s:=s||'
      '||chr(10)|| -'
      '; - -wwv_flow_api.create_page_plug ( - p_id=> 4907909454792629 + wwv_flow_api.g_id_offset, +wwv_flow_api.create_worksheet_column( + p_id => 5058915547145141+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 5, - p_plug_name=> 'Version', - p_region_name=>'', - p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 10, - p_plug_display_column=> 1, - p_plug_display_point=> 'BEFORE_BOX_BODY', - p_plug_source=> s, - p_plug_source_type=> 'STATIC_TEXT', - p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', - p_plug_query_row_template=> 4843113555414914+ wwv_flow_api.g_id_offset, - p_plug_query_headings_type=> 'QUERY_COLUMNS', - p_plug_query_num_rows => 15, - p_plug_query_num_rows_type => 'NEXT_PREVIOUS_LINKS', - p_plug_query_row_count_max => 500, - p_plug_query_show_nulls_as => ' - ', - p_plug_display_condition_type => '', - p_pagination_display_position=>'BOTTOM_RIGHT', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); -end; -/ - -begin - -null; - + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'RUNNER_NAME', + p_display_order =>7, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'G', + p_column_label =>'Test Runner Name', + p_report_label =>'Test
      Runner
      Name', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'LEFT', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); end; / - - begin - -null; - +wwv_flow_api.create_worksheet_column( + p_id => 5059009515145141+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'START_DTM', + p_display_order =>8, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'H', + p_column_label =>'Start Date/Time', + p_report_label =>'Start
      Date
      Time', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'DATE', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'CENTER', + p_format_mask =>'DD-MON-YYYY HH24:MI:SS', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); end; / - -declare - h varchar2(32767) := null; begin -wwv_flow_api.create_page_item( - p_id=>4907225553759367 + wwv_flow_api.g_id_offset, +wwv_flow_api.create_worksheet_column( + p_id => 5059121065145141+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 5, - p_name=>'P5_WT_VERSION', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 10, - p_item_plug_id => 4907909454792629+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'NO', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'wtPLSQL Core Version', - p_source=>'begin'||chr(10)|| -' for buff in (select text from wt_version'||chr(10)|| -' where install_dtm ='||chr(10)|| -' (select max(install_dtm)'||chr(10)|| -' from wt_version) )'||chr(10)|| -' loop'||chr(10)|| -' return buff.text;'||chr(10)|| -' end loop;'||chr(10)|| -' return '''';'||chr(10)|| -'end;', - p_source_type=> 'FUNCTION_BODY', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'Y', - p_show_quick_picks=>'N', - p_item_comment => ''); - - + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'END_DTM', + p_display_order =>9, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'I', + p_column_label =>'End Date/Time', + p_report_label =>'End
      Date
      Time', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'DATE', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'CENTER', + p_format_mask =>'DD-MON-YYYY HH24:MI:SS', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); end; / - - -begin - ---------------------------------------- --- ...updatable report columns for page 5 --- - begin - -null; -end; -null; - +wwv_flow_api.create_worksheet_column( + p_id => 5059220275145141+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'PROFILED_LINES', + p_display_order =>10, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'J', + p_column_label =>'Profiled Source Lines', + p_report_label =>'Profiled
      Source
      Lines', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); end; / - - ---application/pages/page_00006 -prompt ...PAGE 6: Test Cases --- - begin - -wwv_flow_api.create_page ( - p_flow_id => wwv_flow.g_flow_id - ,p_id => 6 - ,p_tab_set => 'TS1' - ,p_name => 'Test Cases' - ,p_alias => 'TESTCASES' - ,p_step_title => 'Test Cases' - ,p_allow_duplicate_submissions => 'Y' - ,p_step_sub_title => 'Test Cases' - ,p_step_sub_title_type => 'TEXT_WITH_SUBSTITUTIONS' - ,p_first_item => 'AUTO_FIRST_ITEM' - ,p_include_apex_css_js_yn => 'Y' - ,p_autocomplete_on_off => 'ON' - ,p_step_template => 4837525507414910 + wwv_flow_api.g_id_offset - ,p_page_is_public_y_n => 'N' - ,p_protection_level => 'N' - ,p_cache_page_yn => 'N' - ,p_cache_timeout_seconds => 21600 - ,p_cache_by_user_yn => 'N' - ,p_help_text => -'No help is available for this page.' - ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180730195029' - ); -null; - +wwv_flow_api.create_worksheet_column( + p_id => 5059315222145141+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'EXECUTED_LINES', + p_display_order =>11, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'K', + p_column_label =>'Executed Source Lines', + p_report_label =>'Executed
      Source
      Lines', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); end; / - -declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; begin -s := null; -wwv_flow_api.create_page_plug ( - p_id=> 4978906587323161 + wwv_flow_api.g_id_offset, +wwv_flow_api.create_worksheet_column( + p_id => 5059411706145141+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 6, - p_plug_name=> 'Test Case', - p_region_name=>'', - p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 11, - p_plug_display_column=> 1, - p_plug_display_point=> 'BEFORE_BOX_BODY', - p_plug_source=> s, - p_plug_source_type=> 'STATIC_TEXT', - p_translate_title=> 'Y', - p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'COLON_DELMITED_LIST', - p_plug_query_row_count_max => 500, - p_plug_display_condition_type => '', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'IGNORED_LINES', + p_display_order =>12, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'L', + p_column_label =>'Ignored Source Lines', + p_report_label =>'Ignored
      Source
      Lines', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); end; / -declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; begin -s:=s||'select result_seq SEQ'||chr(10)|| -' ,executed_dtm EXECUTED_DATE_TIME'||chr(10)|| -' ,interval_msecs MSECS'||chr(10)|| -' ,assertion'||chr(10)|| -' ,status'||chr(10)|| -' ,details'||chr(10)|| -' ,testcase'||chr(10)|| -' ,message'||chr(10)|| -' from wt_results'||chr(10)|| -' where test_run_id = :P6_TEST_RUN_ID'||chr(10)|| -' and testcase = :P6_TESTCASE_NAME'; - -wwv_flow_api.create_page_plug ( - p_id=> 4982202570323168 + wwv_flow_api.g_id_offset, +wwv_flow_api.create_worksheet_column( + p_id => 5059518034145141+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 6, - p_plug_name=> 'Test Case Results Details', - p_region_name=>'', - p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 20, - p_plug_display_column=> 1, - p_plug_display_point=> 'AFTER_SHOW_ITEMS', - p_plug_source=> s, - p_plug_source_type=> 'DYNAMIC_QUERY', - p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', - p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'COLON_DELMITED_LIST', - p_plug_query_show_nulls_as => ' - ', - p_plug_display_condition_type => '', - p_pagination_display_position=>'BOTTOM_RIGHT', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'EXCLUDED_LINES', + p_display_order =>13, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'M', + p_column_label =>'Excluded Source Lines', + p_report_label =>'Excluded
      Source
      Lines', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); end; / -declare - a1 varchar2(32767) := null; begin -a1:=a1||'select result_seq SEQ'||chr(10)|| -' ,executed_dtm EXECUTED_DATE_TIME'||chr(10)|| -' ,interval_msecs MSECS'||chr(10)|| -' ,assertion'||chr(10)|| -' ,status'||chr(10)|| -' ,details'||chr(10)|| -' ,testcase'||chr(10)|| -' ,message'||chr(10)|| -' from wt_results'||chr(10)|| -' where test_run_id = :P6_TEST_RUN_ID'||chr(10)|| -' and testcase = :P6_TESTCASE_NAME'; - -wwv_flow_api.create_worksheet( - p_id=> 4982411530323169+wwv_flow_api.g_id_offset, +wwv_flow_api.create_worksheet_column( + p_id => 5059610513145141+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 6, - p_region_id=> 4982202570323168+wwv_flow_api.g_id_offset, - p_name=> 'Test Runner Results Details', - p_folder_id=> null, - p_alias=> '', - p_report_id_item=> '', - p_max_row_count=> '10000', - p_max_row_count_message=> 'This query returns more than #MAX_ROW_COUNT# rows, please filter your data to ensure complete results.', - p_no_data_found_message=> 'No data found.', - p_max_rows_per_page=>'', - p_search_button_label=>'', - p_page_items_to_submit=>'', - p_sort_asc_image=>'', - p_sort_asc_image_attr=>'', - p_sort_desc_image=>'', - p_sort_desc_image_attr=>'', - p_sql_query => a1, - p_status=>'AVAILABLE_FOR_OWNER', - p_allow_report_saving=>'Y', - p_allow_save_rpt_public=>'N', - p_allow_report_categories=>'N', - p_show_nulls_as=>'-', - p_pagination_display_pos=>'BOTTOM_RIGHT', - p_show_finder_drop_down=>'Y', - p_show_display_row_count=>'N', - p_show_search_bar=>'Y', - p_show_search_textbox=>'Y', - p_show_actions_menu=>'Y', - p_report_list_mode=>'TABS', - p_show_detail_link=>'N', - p_show_select_columns=>'Y', - p_show_rows_per_page=>'Y', - p_show_filter=>'Y', - p_show_sort=>'Y', - p_show_control_break=>'Y', - p_show_highlight=>'Y', - p_show_computation=>'Y', - p_show_aggregate=>'Y', - p_show_chart=>'Y', - p_show_group_by=>'Y', - p_show_notify=>'N', - p_show_calendar=>'N', - p_show_flashback=>'Y', - p_show_reset=>'Y', - p_show_download=>'Y', - p_show_help=>'Y', - p_download_formats=>'CSV:HTML:EMAIL', - p_allow_exclude_null_values=>'N', - p_allow_hide_extra_columns=>'N', - p_icon_view_enabled_yn=>'N', - p_icon_view_columns_per_row=>1, - p_detail_view_enabled_yn=>'N', - p_owner=>'WTP'); + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'NOTEXEC_LINES', + p_display_order =>14, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'N', + p_column_label =>'Not Executed Source Lines', + p_report_label =>'Not
      Executed
      Lines', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); end; / begin wwv_flow_api.create_worksheet_column( - p_id => 4983029951323173+wwv_flow_api.g_id_offset, + p_id => 5059710978145141+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 6, - p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, - p_db_column_name =>'SEQ', - p_display_order =>1, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'UNKNOWN_LINES', + p_display_order =>15, p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'J', - p_column_label =>'Seq', - p_report_label =>'Seq', - p_sync_form_label =>'Y', + p_column_identifier =>'O', + p_column_label =>'Unknown Source Lines', + p_report_label =>'Unknown
      Source
      Lines', + p_sync_form_label =>'N', p_display_in_default_rpt =>'Y', p_is_sortable =>'Y', p_allow_sorting =>'Y', @@ -10084,7 +9310,7 @@ wwv_flow_api.create_worksheet_column( p_column_type =>'NUMBER', p_display_as =>'TEXT', p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'CENTER', + p_heading_alignment =>'RIGHT', p_column_alignment =>'RIGHT', p_tz_dependent =>'N', p_rpt_distinct_lov =>'Y', @@ -10095,17 +9321,17 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 4983107465323173+wwv_flow_api.g_id_offset, + p_id => 5059811323145141+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 6, - p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, - p_db_column_name =>'EXECUTED_DATE_TIME', - p_display_order =>2, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'MIN_EXECUTED_USECS', + p_display_order =>16, p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'K', - p_column_label =>'Executed Date/Time', - p_report_label =>'Executed Date/Time', - p_sync_form_label =>'Y', + p_column_identifier =>'P', + p_column_label =>'Minimum Executed Microsecs', + p_report_label =>'Minimum
      Executed
      Microsecs', + p_sync_form_label =>'N', p_display_in_default_rpt =>'Y', p_is_sortable =>'Y', p_allow_sorting =>'Y', @@ -10119,11 +9345,11 @@ wwv_flow_api.create_worksheet_column( p_allow_hide =>'Y', p_others_may_edit =>'Y', p_others_may_view =>'Y', - p_column_type =>'DATE', + p_column_type =>'NUMBER', p_display_as =>'TEXT', p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'CENTER', - p_column_alignment =>'LEFT', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', p_tz_dependent =>'N', p_rpt_distinct_lov =>'Y', p_rpt_show_filter_lov =>'D', @@ -10133,17 +9359,17 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 4983222398323174+wwv_flow_api.g_id_offset, + p_id => 5059913789145141+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 6, - p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, - p_db_column_name =>'MSECS', - p_display_order =>3, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'AVG_EXECUTED_USECS', + p_display_order =>17, p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'L', - p_column_label =>'Msecs', - p_report_label =>'Msecs', - p_sync_form_label =>'Y', + p_column_identifier =>'Q', + p_column_label =>'Average Executed Microsecs', + p_report_label =>'Avgerage
      Executed
      Microsecs', + p_sync_form_label =>'N', p_display_in_default_rpt =>'Y', p_is_sortable =>'Y', p_allow_sorting =>'Y', @@ -10160,7 +9386,7 @@ wwv_flow_api.create_worksheet_column( p_column_type =>'NUMBER', p_display_as =>'TEXT', p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'CENTER', + p_heading_alignment =>'RIGHT', p_column_alignment =>'RIGHT', p_tz_dependent =>'N', p_rpt_distinct_lov =>'Y', @@ -10171,17 +9397,17 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 4982519401323172+wwv_flow_api.g_id_offset, + p_id => 5060023226145142+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 6, - p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, - p_db_column_name =>'ASSERTION', - p_display_order =>4, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'MAX_EXECUTED_USECS', + p_display_order =>18, p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'E', - p_column_label =>'Assertion', - p_report_label =>'Assertion', - p_sync_form_label =>'Y', + p_column_identifier =>'R', + p_column_label =>'Maximum Executed Microsecs', + p_report_label =>'Maximum
      Executed
      Microsecs', + p_sync_form_label =>'N', p_display_in_default_rpt =>'Y', p_is_sortable =>'Y', p_allow_sorting =>'Y', @@ -10195,11 +9421,11 @@ wwv_flow_api.create_worksheet_column( p_allow_hide =>'Y', p_others_may_edit =>'Y', p_others_may_view =>'Y', - p_column_type =>'STRING', + p_column_type =>'NUMBER', p_display_as =>'TEXT', p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'CENTER', - p_column_alignment =>'LEFT', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', p_tz_dependent =>'N', p_rpt_distinct_lov =>'Y', p_rpt_show_filter_lov =>'D', @@ -10209,17 +9435,17 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 4982626816323173+wwv_flow_api.g_id_offset, + p_id => 5060123834145142+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 6, - p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, - p_db_column_name =>'STATUS', - p_display_order =>5, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'TOT_EXECUTED_USECS', + p_display_order =>19, p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'F', - p_column_label =>'Status', - p_report_label =>'Status', - p_sync_form_label =>'Y', + p_column_identifier =>'S', + p_column_label =>'Total Executed Microsecs', + p_report_label =>'Total
      Executed
      Microsecs', + p_sync_form_label =>'N', p_display_in_default_rpt =>'Y', p_is_sortable =>'Y', p_allow_sorting =>'Y', @@ -10233,11 +9459,49 @@ wwv_flow_api.create_worksheet_column( p_allow_hide =>'Y', p_others_may_edit =>'Y', p_others_may_view =>'Y', - p_column_type =>'STRING', + p_column_type =>'NUMBER', p_display_as =>'TEXT', p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'CENTER', - p_column_alignment =>'LEFT', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 5060204482145142+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'TRIGGER_OFFSET', + p_display_order =>20, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'T', + p_column_label =>'Trigger Offset', + p_report_label =>'Trigger
      Offset', + p_sync_form_label =>'N', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'RIGHT', + p_column_alignment =>'RIGHT', p_tz_dependent =>'N', p_rpt_distinct_lov =>'Y', p_rpt_show_filter_lov =>'D', @@ -10247,17 +9511,17 @@ end; / begin wwv_flow_api.create_worksheet_column( - p_id => 4982730180323173+wwv_flow_api.g_id_offset, + p_id => 5060309927145142+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 6, - p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, - p_db_column_name =>'DETAILS', - p_display_order =>6, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_db_column_name =>'ERROR_MESSAGE', + p_display_order =>21, p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'G', - p_column_label =>'Details', - p_report_label =>'Details', - p_sync_form_label =>'Y', + p_column_identifier =>'U', + p_column_label =>'Error Message', + p_report_label =>'Error
      Message', + p_sync_form_label =>'N', p_display_in_default_rpt =>'Y', p_is_sortable =>'Y', p_allow_sorting =>'Y', @@ -10274,7 +9538,7 @@ wwv_flow_api.create_worksheet_column( p_column_type =>'STRING', p_display_as =>'TEXT', p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'CENTER', + p_heading_alignment =>'LEFT', p_column_alignment =>'LEFT', p_tz_dependent =>'N', p_rpt_distinct_lov =>'Y', @@ -10283,208 +9547,559 @@ wwv_flow_api.create_worksheet_column( p_help_text =>''); end; / +declare + rc1 varchar2(32767) := null; +begin +rc1:=rc1||'DBOUT_OWNER:DBOUT_NAME:DBOUT_TYPE:CODE_COVERAGE:TEST_RUN_ID:RUNNER_OWNER:RUNNER_NAME:START_DTM:MAX_EXECUTED_USECS:ERROR_MESSAGE'; + +wwv_flow_api.create_worksheet_rpt( + p_id => 5060410372145412+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_session_id => null, + p_base_report_id => null+wwv_flow_api.g_id_offset, + p_application_user => 'APXWS_DEFAULT', + p_report_seq =>10, + p_report_alias =>'50605', + p_status =>'PUBLIC', + p_category_id =>null+wwv_flow_api.g_id_offset, + p_is_default =>'Y', + p_display_rows =>15, + p_report_columns =>rc1, + p_sort_column_1 =>'TEST_RUN_ID', + p_sort_direction_1 =>'DESC', + p_sort_column_2 =>'0', + p_sort_direction_2 =>'ASC', + p_sort_column_3 =>'0', + p_sort_direction_3 =>'ASC', + p_sort_column_4 =>'0', + p_sort_direction_4 =>'ASC', + p_sort_column_5 =>'0', + p_sort_direction_5 =>'ASC', + p_sort_column_6 =>'0', + p_sort_direction_6 =>'ASC', + p_flashback_enabled =>'N', + p_calendar_display_column =>''); +end; +/ +declare + rc1 varchar2(32767) := null; +begin +rc1:=rc1||'DBOUT_OWNER:DBOUT_NAME:DBOUT_TYPE:CODE_COVERAGE:TEST_RUN_ID:RUNNER_OWNER:RUNNER_NAME:START_DTM:END_DTM:PROFILED_LINES:EXECUTED_LINES:IGNORED_LINES:EXCLUDED_LINES:NOTEXEC_LINES:UNKNOWN_LINES:MIN_EXECUTED_USECS:AVG_EXECUTED_USECS:MAX_EXECUTED_USECS:TOT_EXECUTED_USECS:TRIGGER_OFFSET:ERROR_MESSAGE'; + +wwv_flow_api.create_worksheet_rpt( + p_id => 5062402397417566+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 4, + p_worksheet_id => 5058117729145138+wwv_flow_api.g_id_offset, + p_session_id => null, + p_base_report_id => null+wwv_flow_api.g_id_offset, + p_application_user => 'APXWS_ALTERNATIVE', + p_name =>'All Columns', + p_report_seq =>10, + p_report_alias =>'50625', + p_status =>'PUBLIC', + p_category_id =>null+wwv_flow_api.g_id_offset, + p_is_default =>'Y', + p_display_rows =>15, + p_report_columns =>rc1, + p_sort_column_1 =>'TEST_RUN_ID', + p_sort_direction_1 =>'DESC', + p_sort_column_2 =>'0', + p_sort_direction_2 =>'ASC', + p_sort_column_3 =>'0', + p_sort_direction_3 =>'ASC', + p_sort_column_4 =>'0', + p_sort_direction_4 =>'ASC', + p_sort_column_5 =>'0', + p_sort_direction_5 =>'ASC', + p_sort_column_6 =>'0', + p_sort_direction_6 =>'ASC', + p_flashback_enabled =>'N', + p_calendar_display_column =>''); +end; +/ + +begin + +null; + +end; +/ + + +begin + +null; + +end; +/ + + +begin + +wwv_flow_api.create_page_computation( + p_id=> 5113829569371666 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 4, + p_computation_sequence => 30, + p_computation_item=> 'P0_DISPLAY', + p_computation_point=> 'BEFORE_HEADER', + p_computation_type=> 'STATIC_ASSIGNMENT', + p_computation_processed=> 'REPLACE_EXISTING', + p_computation=> 'N', + p_compute_when => '', + p_compute_when_type=>''); + +null; + +end; +/ + + +begin + +--------------------------------------- +-- ...updatable report columns for page 4 +-- + +begin + +null; +end; +null; + +end; +/ + + +--application/pages/page_00005 +prompt ...PAGE 5: About +-- + +begin + +wwv_flow_api.create_page ( + p_flow_id => wwv_flow.g_flow_id + ,p_id => 5 + ,p_tab_set => 'TS1' + ,p_name => 'About' + ,p_alias => 'ABOUT' + ,p_step_title => 'About' + ,p_allow_duplicate_submissions => 'Y' + ,p_step_sub_title_type => 'TEXT_WITH_SUBSTITUTIONS' + ,p_first_item => 'NO_FIRST_ITEM' + ,p_include_apex_css_js_yn => 'Y' + ,p_autocomplete_on_off => 'ON' + ,p_page_is_public_y_n => 'N' + ,p_protection_level => 'N' + ,p_cache_page_yn => 'N' + ,p_cache_timeout_seconds => 21600 + ,p_cache_by_user_yn => 'N' + ,p_last_updated_by => 'WTP' + ,p_last_upd_yyyymmddhh24miss => '20180825100311' + ); +null; + +end; +/ + +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +s:=s||'select install_dtm'||chr(10)|| +' ,action'||chr(10)|| +' ,text'||chr(10)|| +' from wt_version'; + +wwv_flow_api.create_report_region ( + p_id=> 4906213947718211 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 5, + p_name=> 'wtPLSQL Core Installation History:', + p_region_name=>'', + p_template=> 4838619911414911+ wwv_flow_api.g_id_offset, + p_display_sequence=> 30, + p_display_column=> 1, + p_display_point=> 'AFTER_SHOW_ITEMS', + p_source=> s, + p_source_type=> 'SQL_QUERY', + p_display_error_message=> '#SQLERRM#', + p_plug_caching=> 'NOT_CACHED', + p_customized=> '0', + p_translate_title=> 'Y', + p_ajax_enabled=> 'Y', + p_query_row_template=> 4843113555414914+ wwv_flow_api.g_id_offset, + p_query_headings_type=> 'COLON_DELMITED_LIST', + p_query_num_rows=> '15', + p_query_options=> 'DERIVED_REPORT_COLUMNS', + p_query_show_nulls_as=> ' - ', + p_query_break_cols=> '0', + p_query_no_data_found=> 'no data found', + p_query_num_rows_type=> 'NEXT_PREVIOUS_LINKS', + p_pagination_display_position=> 'BOTTOM_RIGHT', + p_csv_output=> 'N', + p_query_asc_image=> 'apex/builder/dup.gif', + p_query_asc_image_attr=> 'width="16" height="16" alt="" ', + p_query_desc_image=> 'apex/builder/ddown.gif', + p_query_desc_image_attr=> 'width="16" height="16" alt="" ', + p_plug_query_strip_html=> 'Y', + p_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4906513668718218 + wwv_flow_api.g_id_offset, + p_region_id=> 4906213947718211 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 1, + p_form_element_id=> null, + p_column_alias=> 'INSTALL_DTM', + p_column_display_sequence=> 1, + p_column_heading=> 'INSTALL_DTM', + p_column_alignment=>'LEFT', + p_default_sort_column_sequence=>1, + p_default_sort_dir=>'desc', + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; +begin +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4906620342718218 + wwv_flow_api.g_id_offset, + p_region_id=> 4906213947718211 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_query_column_id=> 2, + p_form_element_id=> null, + p_column_alias=> 'ACTION', + p_column_display_sequence=> 2, + p_column_heading=> 'ACTION', + p_column_alignment=>'LEFT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); +end; +/ +declare + s varchar2(32767) := null; begin -wwv_flow_api.create_worksheet_column( - p_id => 4982829265323173+wwv_flow_api.g_id_offset, +s := null; +wwv_flow_api.create_report_columns ( + p_id=> 4906723875718218 + wwv_flow_api.g_id_offset, + p_region_id=> 4906213947718211 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 6, - p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, - p_db_column_name =>'TESTCASE', - p_display_order =>7, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'H', - p_column_label =>'Testcase', - p_report_label =>'Testcase', - p_sync_form_label =>'Y', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'STRING', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'CENTER', - p_column_alignment =>'LEFT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); + p_query_column_id=> 3, + p_form_element_id=> null, + p_column_alias=> 'TEXT', + p_column_display_sequence=> 3, + p_column_heading=> 'TEXT', + p_column_alignment=>'LEFT', + p_default_sort_column_sequence=>0, + p_disable_sort_column=>'N', + p_sum_column=> 'N', + p_hidden_column=> 'N', + p_display_as=>'ESCAPE_SC', + p_is_required=> false, + p_pk_col_source=> s, + p_column_comment=>''); end; / +declare + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; begin -wwv_flow_api.create_worksheet_column( - p_id => 4982913874323173+wwv_flow_api.g_id_offset, +s:=s||'&APP_VERSION.
      '||chr(10)|| +'
      '||chr(10)|| +'
      '||chr(10)|| +''||chr(10)|| +'Use GitHub “issues” for support. (A free GitHub account will be required to create a new issue. Issues can be searched without an account.)
      '||chr(10)|| +'
      '||chr(10)|| +'
      '||chr(10)|| +''||chr(10)|| +'Find more information at wtPLSQL Website.
      '||chr(10)|| +'
      '||chr(10)|| +'
      '; + +wwv_flow_api.create_page_plug ( + p_id=> 4907318411766797 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 6, - p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, - p_db_column_name =>'MESSAGE', - p_display_order =>8, - p_group_id =>null+wwv_flow_api.g_id_offset, - p_column_identifier =>'I', - p_column_label =>'Message', - p_report_label =>'Message', - p_sync_form_label =>'Y', - p_display_in_default_rpt =>'Y', - p_is_sortable =>'Y', - p_allow_sorting =>'Y', - p_allow_filtering =>'Y', - p_allow_highlighting =>'Y', - p_allow_ctrl_breaks =>'Y', - p_allow_aggregations =>'Y', - p_allow_computations =>'Y', - p_allow_charting =>'Y', - p_allow_group_by =>'Y', - p_allow_hide =>'Y', - p_others_may_edit =>'Y', - p_others_may_view =>'Y', - p_column_type =>'STRING', - p_display_as =>'TEXT', - p_display_text_as =>'ESCAPE_SC', - p_heading_alignment =>'CENTER', - p_column_alignment =>'LEFT', - p_tz_dependent =>'N', - p_rpt_distinct_lov =>'Y', - p_rpt_show_filter_lov =>'D', - p_rpt_filter_date_ranges =>'ALL', - p_help_text =>''); + p_page_id=> 5, + p_plug_name=> 'About', + p_region_name=>'', + p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 20, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'STATIC_TEXT_WITH_SHORTCUTS', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 4843113555414914+ wwv_flow_api.g_id_offset, + p_plug_query_headings_type=> 'QUERY_COLUMNS', + p_plug_query_num_rows => 15, + p_plug_query_num_rows_type => 'NEXT_PREVIOUS_LINKS', + p_plug_query_row_count_max => 500, + p_plug_query_show_nulls_as => ' - ', + p_plug_display_condition_type => '', + p_pagination_display_position=>'BOTTOM_RIGHT', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); end; / declare - rc1 varchar2(32767) := null; + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; begin -rc1:=rc1||'SEQ:MSECS:STATUS:TESTCASE:ASSERTION:MESSAGE:DETAILS'; +s:=s||'
      '||chr(10)|| +'
      '; -wwv_flow_api.create_worksheet_rpt( - p_id => 4983313754323174+wwv_flow_api.g_id_offset, +wwv_flow_api.create_page_plug ( + p_id=> 4907909454792629 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 6, - p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, - p_session_id => null, - p_base_report_id => null+wwv_flow_api.g_id_offset, - p_application_user => 'APXWS_DEFAULT', - p_report_seq =>10, - p_report_alias =>'49834', - p_status =>'PUBLIC', - p_category_id =>null+wwv_flow_api.g_id_offset, - p_is_default =>'Y', - p_display_rows =>100000, - p_report_columns =>rc1, - p_sort_column_1 =>'SEQ', - p_sort_direction_1 =>'ASC', - p_flashback_enabled =>'N', - p_calendar_display_column =>''); + p_page_id=> 5, + p_plug_name=> 'Version', + p_region_name=>'', + p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 10, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_BOX_BODY', + p_plug_source=> s, + p_plug_source_type=> 'STATIC_TEXT', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 4843113555414914+ wwv_flow_api.g_id_offset, + p_plug_query_headings_type=> 'QUERY_COLUMNS', + p_plug_query_num_rows => 15, + p_plug_query_num_rows_type => 'NEXT_PREVIOUS_LINKS', + p_plug_query_row_count_max => 500, + p_plug_query_show_nulls_as => ' - ', + p_plug_display_condition_type => '', + p_pagination_display_position=>'BOTTOM_RIGHT', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); end; / + begin -wwv_flow_api.create_worksheet_condition( - p_id => 4983615236323175+wwv_flow_api.g_id_offset, + +null; + +end; +/ + + +begin + +null; + +end; +/ + +declare + h varchar2(32767) := null; +begin +wwv_flow_api.create_page_item( + p_id=>4907225553759367 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 6, - p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, - p_report_id => 4983313754323174+wwv_flow_api.g_id_offset, - p_name =>'Highlight Errors', - p_condition_type =>'HIGHLIGHT', - p_allow_delete =>'Y', - p_column_name =>'STATUS', - p_operator =>'=', - p_expr =>'ERR', - p_condition_sql =>' (case when ("STATUS" = #APXWS_EXPR#) then #APXWS_HL_ID# end) ', - p_condition_display =>'#APXWS_COL_NAME# = ''ERR'' ', - p_enabled =>'Y', - p_highlight_sequence =>10, - p_row_bg_color =>'#FF5588', - p_column_format =>''); + p_flow_step_id=> 5, + p_name=>'P5_WT_VERSION', + p_data_type=> 'VARCHAR', + p_is_required=> false, + p_accept_processing=> 'REPLACE_EXISTING', + p_item_sequence=> 10, + p_item_plug_id => 4907909454792629+wwv_flow_api.g_id_offset, + p_use_cache_before_default=> 'NO', + p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', + p_prompt=>'wtPLSQL Core Version', + p_source=>'begin'||chr(10)|| +' for buff in (select text from wt_version'||chr(10)|| +' where install_dtm ='||chr(10)|| +' (select max(install_dtm)'||chr(10)|| +' from wt_version) )'||chr(10)|| +' loop'||chr(10)|| +' return buff.text;'||chr(10)|| +' end loop;'||chr(10)|| +' return '''';'||chr(10)|| +'end;', + p_source_type=> 'FUNCTION_BODY', + p_display_as=> 'NATIVE_DISPLAY_ONLY', + p_lov_display_null=> 'NO', + p_lov_translated=> 'N', + p_cSize=> 30, + p_cMaxlength=> 4000, + p_cHeight=> 1, + p_cAttributes=> 'nowrap="nowrap"', + p_begin_on_new_line=> 'YES', + p_begin_on_new_field=> 'YES', + p_colspan=> 1, + p_rowspan=> 1, + p_label_alignment=> 'RIGHT', + p_field_alignment=> 'LEFT-CENTER', + p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, + p_is_persistent=> 'Y', + p_lov_display_extra=>'YES', + p_protection_level => 'N', + p_escape_on_http_output => 'Y', + p_attribute_01 => 'N', + p_attribute_02 => 'VALUE', + p_attribute_04 => 'Y', + p_show_quick_picks=>'N', + p_item_comment => ''); + + end; / + + begin -wwv_flow_api.create_worksheet_condition( - p_id => 4983707104323175+wwv_flow_api.g_id_offset, + +wwv_flow_api.create_page_computation( + p_id=> 5112710130337711 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 6, - p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, - p_report_id => 4983313754323174+wwv_flow_api.g_id_offset, - p_name =>'Highlight Failures', - p_condition_type =>'HIGHLIGHT', - p_allow_delete =>'Y', - p_column_name =>'STATUS', - p_operator =>'=', - p_expr =>'FAIL', - p_condition_sql =>' (case when ("STATUS" = #APXWS_EXPR#) then #APXWS_HL_ID# end) ', - p_condition_display =>'#APXWS_COL_NAME# = ''FAIL'' ', - p_enabled =>'Y', - p_highlight_sequence =>10, - p_row_bg_color =>'#FFFF99', - p_column_format =>''); + p_flow_step_id=> 5, + p_computation_sequence => 20, + p_computation_item=> 'P0_DISPLAY', + p_computation_point=> 'BEFORE_HEADER', + p_computation_type=> 'STATIC_ASSIGNMENT', + p_computation_processed=> 'REPLACE_EXISTING', + p_computation=> 'N', + p_compute_when => '', + p_compute_when_type=>''); + +null; + end; / + + begin -wwv_flow_api.create_worksheet_condition( - p_id => 4983512775323175+wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_page_id=> 6, - p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, - p_report_id => 4983313754323174+wwv_flow_api.g_id_offset, - p_condition_type =>'FILTER', - p_allow_delete =>'Y', - p_column_name =>'STATUS', - p_operator =>'!=', - p_expr =>'PASS', - p_condition_sql =>'"STATUS" != #APXWS_EXPR#', - p_condition_display =>'#APXWS_COL_NAME# != ''PASS'' ', - p_enabled =>'Y', - p_column_format =>''); + +--------------------------------------- +-- ...updatable report columns for page 5 +-- + +begin + +null; +end; +null; + +end; +/ + + +--application/pages/page_00006 +prompt ...PAGE 6: Test Cases +-- + +begin + +wwv_flow_api.create_page ( + p_flow_id => wwv_flow.g_flow_id + ,p_id => 6 + ,p_tab_set => 'TS1' + ,p_name => 'Test Cases' + ,p_alias => 'TESTCASES' + ,p_step_title => 'Test Cases' + ,p_allow_duplicate_submissions => 'Y' + ,p_step_sub_title => 'Test Cases' + ,p_step_sub_title_type => 'TEXT_WITH_SUBSTITUTIONS' + ,p_first_item => 'AUTO_FIRST_ITEM' + ,p_include_apex_css_js_yn => 'Y' + ,p_autocomplete_on_off => 'ON' + ,p_step_template => 4837525507414910 + wwv_flow_api.g_id_offset + ,p_page_is_public_y_n => 'N' + ,p_protection_level => 'N' + ,p_cache_page_yn => 'N' + ,p_cache_timeout_seconds => 21600 + ,p_cache_by_user_yn => 'N' + ,p_help_text => +'No help is available for this page.' + ,p_last_updated_by => 'WTP' + ,p_last_upd_yyyymmddhh24miss => '20180901170818' + ); +null; + end; / + declare s varchar2(32767) := null; l_clob clob; l_length number := 1; begin -s:=s||'begin'||chr(10)|| -' if :P6_TEST_RUN_ERROR is NOT NULL'||chr(10)|| -' then'||chr(10)|| -' htp.p(''Test Runner Error Message: '' ||'||chr(10)|| -' :P6_TEST_RUN_ERROR || ''
      '');'||chr(10)|| -' end if;'||chr(10)|| +s:=s||'declare'||chr(10)|| +' total_elapsed number;'||chr(10)|| +' num_runs number;'||chr(10)|| +'begin'||chr(10)|| +' --'||chr(10)|| +' select max(tot_interval_msecs) -- Need Group Function for NULL'||chr(10)|| +' into total_elapsed'||chr(10)|| +' from wt_testcase_stats'||chr(10)|| +' where test_run_id = :P0_TEST_RUN_ID'||chr(10)|| +' and testcase = :P0_TEST_CASE;'||chr(10)|| +' --'||chr(10)|| +' select count(tr.id) -- Need Group Function for NULL'||chr(10)|| +' into num_runs'||chr(10)|| +' from wt_test_runs tr'||chr(10)|| +' join wt_te'; + +s:=s||'stcase_stats tc'||chr(10)|| +' on tc.test_run_id = tr.id'||chr(10)|| +' and tc.testcase = :P0_TEST_CASE'||chr(10)|| +' where tr.runner_owner = :P0_TEST_OWNER'||chr(10)|| +' and tr.runner_name = :P0_TEST_RUNNER;'||chr(10)|| +' --'||chr(10)|| ' htp.p(''
      '');'||chr(10)|| +' htp.p(''Test Case Duration (msec): '' || total_elapsed || ''
      '');'||chr(10)|| ' htp.p(''
      '');'||chr(10)|| +' htp.p(''Number of Test Runs: '' || num_runs || ''
      '');'||chr(10)|| ' htp.p(''
      '');'||chr(10)|| -' htp.p(''Test Results Details Search:
      '');'||chr(10)|| +' --'||chr(10)|| 'end;'||chr(10)|| ''; wwv_flow_api.create_page_plug ( - p_id=> 4983829548323176 + wwv_flow_api.g_id_offset, + p_id=> 4978906587323161 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 6, - p_plug_name=> 'Test Run Error Message', + p_plug_name=> 'Summary', p_region_name=>'', p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 10, - p_plug_display_column=> 1, - p_plug_display_point=> 'AFTER_SHOW_ITEMS', + p_plug_display_sequence=> 2, + p_plug_display_column=> 2, + p_plug_display_point=> 'BEFORE_BOX_BODY', p_plug_source=> s, p_plug_source_type=> 'PLSQL_PROCEDURE', p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'QUERY_COLUMNS', - p_plug_query_num_rows => 15, - p_plug_query_num_rows_type => 'NEXT_PREVIOUS_LINKS', + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', p_plug_query_row_count_max => 500, - p_plug_query_show_nulls_as => ' - ', + p_plug_column_width => 'td width="320"', p_plug_display_condition_type => '', - p_pagination_display_position=>'BOTTOM_RIGHT', p_plug_customized=>'0', p_plug_caching=> 'NOT_CACHED', p_plug_comment=> ''); @@ -10495,41 +10110,37 @@ declare l_clob clob; l_length number := 1; begin -s:=s||'select case when connect_by_isleaf = 1 then 0'||chr(10)|| -' when level = 1 then 1'||chr(10)|| -' else -1'||chr(10)|| -' end as status, '||chr(10)|| -' level, '||chr(10)|| -' "TEXT" as title, '||chr(10)|| -' null as icon, '||chr(10)|| -' "ID" as value, '||chr(10)|| -' null as tooltip, '||chr(10)|| -' ''f?p=&APP_ID.:3:''||:APP_SESSION||''::::P6_TEST_RUN_ID:''||"ID" as link '||chr(10)|| -'from "#OWNER#"."WT_TEST_RUNS_TREE"'||chr(10)|| -'start with "PAREN'; - -s:=s||'T_ID" is null'||chr(10)|| -'connect by prior "ID" = "PARENT_ID"'; +s:=s||'select result_seq SEQ'||chr(10)|| +' ,executed_dtm EXECUTED_DATE_TIME'||chr(10)|| +' ,interval_msecs MSECS'||chr(10)|| +' ,assertion'||chr(10)|| +' ,status'||chr(10)|| +' ,details'||chr(10)|| +' ,testcase'||chr(10)|| +' ,message'||chr(10)|| +' from wt_results'||chr(10)|| +' where test_run_id = :P0_TEST_RUN_ID'||chr(10)|| +' and testcase = :P0_TEST_CASE'; wwv_flow_api.create_page_plug ( - p_id=> 4986317798323180 + wwv_flow_api.g_id_offset, + p_id=> 4982202570323168 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 6, - p_plug_name=> 'Test Case Tree', + p_plug_name=> 'Test Case Results Details', p_region_name=>'', - p_plug_template=> 4840201642414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 10, + p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 20, p_plug_display_column=> 1, - p_plug_display_point=> 'REGION_POSITION_03', + p_plug_display_point=> 'AFTER_SHOW_ITEMS', p_plug_source=> s, - p_plug_source_type=> 'JSTREE', + p_plug_source_type=> 'DYNAMIC_QUERY', p_translate_title=> 'Y', p_plug_display_error_message=> '#SQLERRM#', p_plug_query_row_template=> 1, p_plug_query_headings_type=> 'COLON_DELMITED_LIST', - p_plug_query_row_count_max => 500, - p_plug_display_condition_type => 'PLSQL_EXPRESSION', - p_plug_display_when_condition => ':P6_SHOW_TREE = ''Y''', + p_plug_query_show_nulls_as => ' - ', + p_plug_display_condition_type => '', + p_pagination_display_position=>'BOTTOM_RIGHT', p_plug_customized=>'0', p_plug_caching=> 'NOT_CACHED', p_plug_comment=> ''); @@ -10538,566 +10149,513 @@ end; declare a1 varchar2(32767) := null; begin -a1:=a1||'with q_main as ('||chr(10)|| -'select to_char(id) ID'||chr(10)|| -' ,to_char(parent_id) PARENT_ID'||chr(10)|| -' ,text'||chr(10)|| -' ,''GUI_TREE'' SOURCE'||chr(10)|| -'-- from #OWNER#.wt_test_runs_gui_tree'||chr(10)|| -' from wt_test_runs_gui_tree'||chr(10)|| -'union all'||chr(10)|| -'select tc.testcase ID'||chr(10)|| -' ,to_char(tc.test_run_id) PARENT_ID'||chr(10)|| -' ,tc.testcase TEXT'||chr(10)|| -' ,''TESTCASES'' SOURCE'||chr(10)|| -' from wt_testcase_stats tc'||chr(10)|| -' jo'; - -a1:=a1||'in wt_test_runs tr'||chr(10)|| -' on tr.id = tc.test_run_id'||chr(10)|| -')'||chr(10)|| -'--select * from q_main;'||chr(10)|| -'select case when connect_by_isleaf = 1 then 0'||chr(10)|| -' when level = 1 then 1'||chr(10)|| -' else -1'||chr(10)|| -' end STATUS'||chr(10)|| -' ,level'||chr(10)|| -' ,text'||chr(10)|| -' ,null ICON'||chr(10)|| -' ,id '; - -a1:=a1||' VALUE'||chr(10)|| -' ,text TOOLTIP'||chr(10)|| -' ,case when SOURCE = ''TESTCASES'' then'||chr(10)|| -' ''f?p=&APP_ID.:6:''||:APP_SESSION||''::::P6_TEST_RUN_ID,P6_TESTCASE_NAME:''||"PARENT_ID"||'',''||"ID"'||chr(10)|| -' else NULL end LINK'||chr(10)|| -' from q_main'||chr(10)|| -' start with parent_id is null'||chr(10)|| -' connect by prior "ID" = parent_id;'; +a1:=a1||'select result_seq SEQ'||chr(10)|| +' ,executed_dtm EXECUTED_DATE_TIME'||chr(10)|| +' ,interval_msecs MSECS'||chr(10)|| +' ,assertion'||chr(10)|| +' ,status'||chr(10)|| +' ,details'||chr(10)|| +' ,testcase'||chr(10)|| +' ,message'||chr(10)|| +' from wt_results'||chr(10)|| +' where test_run_id = :P0_TEST_RUN_ID'||chr(10)|| +' and testcase = :P0_TEST_CASE'; -wwv_flow_api.create_jstree( - p_id => 4986504998323181+wwv_flow_api.g_id_offset, +wwv_flow_api.create_worksheet( + p_id=> 4982411530323169+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id => 6, - p_region_id => 4986317798323180+wwv_flow_api.g_id_offset, - p_tree_template =>'classic', - p_tree_source =>'', - p_tree_query =>a1, - p_tree_node_title =>'TEXT', - p_tree_node_value =>'ID', - p_tree_node_icon =>'', - p_tree_node_link =>'', - p_tree_node_hints =>'ID', - p_tree_start_item =>'PARENT_ID', - p_tree_start_value =>'', - p_tree_button_option =>'', - p_show_node_link =>'', - p_node_link_checksum_type =>null, - p_tree_comment =>'', - p_show_hints =>'DB', - p_tree_has_focus =>'N', - p_tree_hint_text =>'', - p_tree_click_action =>'S', - p_selected_node =>'P3_TEST_RUN_ID'); + p_page_id=> 6, + p_region_id=> 4982202570323168+wwv_flow_api.g_id_offset, + p_name=> 'Test Runner Results Details', + p_folder_id=> null, + p_alias=> '', + p_report_id_item=> '', + p_max_row_count=> '10000', + p_max_row_count_message=> 'This query returns more than #MAX_ROW_COUNT# rows, please filter your data to ensure complete results.', + p_no_data_found_message=> 'No data found.', + p_max_rows_per_page=>'', + p_search_button_label=>'', + p_page_items_to_submit=>'', + p_sort_asc_image=>'', + p_sort_asc_image_attr=>'', + p_sort_desc_image=>'', + p_sort_desc_image_attr=>'', + p_sql_query => a1, + p_status=>'AVAILABLE_FOR_OWNER', + p_allow_report_saving=>'Y', + p_allow_save_rpt_public=>'N', + p_allow_report_categories=>'N', + p_show_nulls_as=>'-', + p_pagination_display_pos=>'BOTTOM_RIGHT', + p_show_finder_drop_down=>'Y', + p_show_display_row_count=>'N', + p_show_search_bar=>'Y', + p_show_search_textbox=>'Y', + p_show_actions_menu=>'Y', + p_report_list_mode=>'TABS', + p_show_detail_link=>'N', + p_show_select_columns=>'Y', + p_show_rows_per_page=>'Y', + p_show_filter=>'Y', + p_show_sort=>'Y', + p_show_control_break=>'Y', + p_show_highlight=>'Y', + p_show_computation=>'Y', + p_show_aggregate=>'Y', + p_show_chart=>'Y', + p_show_group_by=>'Y', + p_show_notify=>'N', + p_show_calendar=>'N', + p_show_flashback=>'Y', + p_show_reset=>'Y', + p_show_download=>'Y', + p_show_help=>'Y', + p_download_formats=>'CSV:HTML:EMAIL', + p_allow_exclude_null_values=>'N', + p_allow_hide_extra_columns=>'N', + p_icon_view_enabled_yn=>'N', + p_icon_view_columns_per_row=>1, + p_detail_view_enabled_yn=>'N', + p_owner=>'WTP'); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4983029951323173+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_db_column_name =>'SEQ', + p_display_order =>1, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'J', + p_column_label =>'Seq', + p_report_label =>'Seq', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); end; / -declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; begin -s:=s||''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -'#CHART_REFRESH#'; - -wwv_flow_api.create_page_plug ( - p_id=> 4987121729323182 + wwv_flow_api.g_id_offset, +wwv_flow_api.create_worksheet_column( + p_id => 4983107465323173+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 6, - p_plug_name=> 'Test Case Status', - p_region_name=>'', - p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 12, - p_plug_display_column=> 2, - p_plug_display_point=> 'BEFORE_BOX_BODY', - p_plug_source=> s, - p_plug_source_type=> 'FLASH_CHART5', - p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', - p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'COLON_DELMITED_LIST', - p_plug_query_row_count_max => 500, - p_plug_display_condition_type => '', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_db_column_name =>'EXECUTED_DATE_TIME', + p_display_order =>2, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'K', + p_column_label =>'Executed Date/Time', + p_report_label =>'Executed Date/Time', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'DATE', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); end; / -declare - a1 varchar2(32767) := null; begin -a1 := null; -wwv_flow_api.create_flash_chart5( - p_id => 4987320221323183+wwv_flow_api.g_id_offset, +wwv_flow_api.create_worksheet_column( + p_id => 4983222398323174+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id => 6, - p_region_id => 4987121729323182+wwv_flow_api.g_id_offset, - p_default_chart_type =>'2DPie', - p_chart_title =>'', - p_chart_name =>'chart_4927915384997301', - p_chart_width =>300, - p_chart_height =>200, - p_chart_animation =>'N', - p_display_attr =>':H:::::Left::V:Y:None:::N:::Default', - p_dial_tick_attr =>':::::::::::', - p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', - p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', - p_map_source =>'%', - p_margins =>':::', - p_omit_label_interval => null, - p_bgtype =>'Trans', - p_bgcolor1 =>'', - p_bgcolor2 =>'', - p_gradient_rotation =>null, - p_grid_bgtype =>'', - p_grid_bgcolor1 =>'', - p_grid_bgcolor2 =>'', - p_grid_gradient_rotation =>null, - p_color_scheme =>'0', - p_custom_colors =>'#99FF99,#FFFF99,#FF6699', - p_map_undef_color_scheme =>'', - p_map_undef_custom_colors =>'', - p_x_axis_title =>'', - p_x_axis_min =>null, - p_x_axis_max =>null, - p_x_axis_decimal_place =>null, - p_x_axis_prefix =>'', - p_x_axis_postfix =>'', - p_x_axis_label_rotation =>'', - p_x_axis_label_font =>'::', - p_x_axis_major_interval =>null, - p_x_axis_minor_interval =>null, - p_y_axis_title =>'', - p_y_axis_min =>null, - p_y_axis_max =>null, - p_y_axis_decimal_place =>null, - p_y_axis_prefix =>'', - p_y_axis_postfix =>'', - p_y_axis_label_rotation =>'', - p_y_axis_label_font =>'::', - p_y_axis_major_interval =>null, - p_y_axis_minor_interval =>null, - p_async_update =>'N', - p_async_time =>null, - p_legend_title =>'', - p_legend_title_font =>'', - p_names_font => null, - p_names_rotation => null, - p_values_font =>'Arial:10:#000000', - p_values_rotation =>null, - p_values_prefix =>'', - p_values_postfix =>'', - p_hints_font =>'Tahoma:10:#000000', - p_legend_font =>'Arial:10:#000000', - p_grid_labels_font =>'', - p_chart_title_font =>'Tahoma:14:#000000', - p_x_axis_title_font =>'Tahoma:14:', - p_x_axis_title_rotation =>'', - p_y_axis_title_font =>'Tahoma:14:', - p_y_axis_title_rotation =>'', - p_gauge_labels_font =>'Tahoma:10:', - p_use_chart_xml =>'N', - p_chart_xml => a1); + p_page_id=> 6, + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_db_column_name =>'MSECS', + p_display_order =>3, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'L', + p_column_label =>'Msecs', + p_report_label =>'Msecs', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'NUMBER', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'RIGHT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); end; / -declare - a1 varchar2(32767) := null; begin -a1:=a1||'with q1 as ('||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,''PASS'' LABEL'||chr(10)|| -' ,sum(res.passes) VALUE'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_testcase_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' and res.testcase = :P6_TESTCASE_NAME'||chr(10)|| -' where id = :P6_TEST_RUN_ID'||chr(10)|| -'union all'||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,''FAIL'' LABEL'||chr(10)|| -' ,sum(res.failures) VALUE'||chr(10)|| -' from wt_test_'; - -a1:=a1||'runs run'||chr(10)|| -' join wt_testcase_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' and res.testcase = :P6_TESTCASE_NAME'||chr(10)|| -' where id = :P6_TEST_RUN_ID'||chr(10)|| -'union all'||chr(10)|| -'select NULL LINK'||chr(10)|| -' ,''ERR'' LABEL'||chr(10)|| -' ,sum(res.errors) VALUE'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_testcase_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' and res.testcase = :P6_TE'; - -a1:=a1||'STCASE_NAME'||chr(10)|| -' where id = :P6_TEST_RUN_ID'||chr(10)|| -')'||chr(10)|| -'select link, label, value'||chr(10)|| -' from q1'||chr(10)|| -' order by label desc'; - -wwv_flow_api.create_flash_chart5_series( - p_id => 4987425886323183+wwv_flow_api.g_id_offset, - p_chart_id => 4987320221323183+wwv_flow_api.g_id_offset, +wwv_flow_api.create_worksheet_column( + p_id => 4982519401323172+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_db_column_name =>'ASSERTION', + p_display_order =>4, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'E', + p_column_label =>'Assertion', + p_report_label =>'Assertion', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_column( + p_id => 4982626816323173+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_series_seq =>10, - p_series_name =>'Series 1', - p_series_query => a1, - p_series_type =>'', - p_series_query_type =>'SQL_QUERY', - p_series_query_parse_opt =>'PARSE_CHART_QUERY', - p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>15, - p_action_link =>'', - p_show_action_link =>'N', - p_action_link_checksum_type =>''); + p_page_id=> 6, + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_db_column_name =>'STATUS', + p_display_order =>5, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'F', + p_column_label =>'Status', + p_report_label =>'Status', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); end; / -declare - s varchar2(32767) := null; - l_clob clob; - l_length number := 1; begin -s:=s||''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -''||chr(10)|| -'#CHART_REFRESH#'; - -wwv_flow_api.create_page_plug ( - p_id=> 4987511974323183 + wwv_flow_api.g_id_offset, +wwv_flow_api.create_worksheet_column( + p_id => 4982730180323173+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 6, - p_plug_name=> 'Test Case Status Trend', - p_region_name=>'', - p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 21, - p_plug_display_column=> 1, - p_plug_display_point=> 'BEFORE_SHOW_ITEMS', - p_plug_source=> s, - p_plug_source_type=> 'FLASH_CHART5', - p_translate_title=> 'Y', - p_plug_display_error_message=> '#SQLERRM#', - p_plug_query_row_template=> 1, - p_plug_query_headings_type=> 'COLON_DELMITED_LIST', - p_plug_query_row_count_max => 500, - p_plug_display_condition_type => 'PLSQL_EXPRESSION', - p_plug_display_when_condition => ':P6_SHOW_TREND=''Y''', - p_plug_display_when_cond2=>'Y', - p_plug_customized=>'0', - p_plug_caching=> 'NOT_CACHED', - p_plug_comment=> ''); + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_db_column_name =>'DETAILS', + p_display_order =>6, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'G', + p_column_label =>'Details', + p_report_label =>'Details', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); end; / -declare - a1 varchar2(32767) := null; begin -a1 := null; -wwv_flow_api.create_flash_chart5( - p_id => 4987702388323183+wwv_flow_api.g_id_offset, +wwv_flow_api.create_worksheet_column( + p_id => 4982829265323173+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_page_id => 6, - p_region_id => 4987511974323183+wwv_flow_api.g_id_offset, - p_default_chart_type =>'Stacked2DColumn', - p_chart_title =>'', - p_chart_name =>'chart_4932831378476124', - p_chart_width =>300, - p_chart_height =>200, - p_chart_animation =>'N', - p_display_attr =>':H:N::Y:N:Left::V:Y:Circle:::N:::Default', - p_dial_tick_attr =>':::::::::::', - p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', - p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', - p_map_source =>'%', - p_margins =>':::', - p_omit_label_interval => null, - p_bgtype =>'Trans', - p_bgcolor1 =>'', - p_bgcolor2 =>'', - p_gradient_rotation =>null, - p_grid_bgtype =>'', - p_grid_bgcolor1 =>'', - p_grid_bgcolor2 =>'', - p_grid_gradient_rotation =>null, - p_color_scheme =>'0', - p_custom_colors =>'#99FF99,#FFFF99,#FF6699', - p_map_undef_color_scheme =>'', - p_map_undef_custom_colors =>'', - p_x_axis_title =>'', - p_x_axis_min =>null, - p_x_axis_max =>null, - p_x_axis_decimal_place =>null, - p_x_axis_prefix =>'', - p_x_axis_postfix =>'', - p_x_axis_label_rotation =>'', - p_x_axis_label_font =>'Tahoma:10:#000000', - p_x_axis_major_interval =>null, - p_x_axis_minor_interval =>null, - p_y_axis_title =>'', - p_y_axis_min =>0, - p_y_axis_max =>null, - p_y_axis_decimal_place =>null, - p_y_axis_prefix =>'', - p_y_axis_postfix =>'', - p_y_axis_label_rotation =>'', - p_y_axis_label_font =>'Tahoma:10:#000000', - p_y_axis_major_interval =>null, - p_y_axis_minor_interval =>null, - p_async_update =>'N', - p_async_time =>null, - p_legend_title =>'', - p_legend_title_font =>'', - p_names_font => null, - p_names_rotation => null, - p_values_font =>'Arial:10:#000000', - p_values_rotation =>null, - p_values_prefix =>'', - p_values_postfix =>'', - p_hints_font =>'Tahoma:10:#000000', - p_legend_font =>'Arial:10:#000000', - p_grid_labels_font =>'', - p_chart_title_font =>'Tahoma:14:#000000', - p_x_axis_title_font =>'Tahoma:14:#000000', - p_x_axis_title_rotation =>'', - p_y_axis_title_font =>'Tahoma:14:#000000', - p_y_axis_title_rotation =>'', - p_gauge_labels_font =>'Tahoma:10:', - p_use_chart_xml =>'N', - p_chart_xml => a1); + p_page_id=> 6, + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_db_column_name =>'TESTCASE', + p_display_order =>7, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'H', + p_column_label =>'Testcase', + p_report_label =>'Testcase', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); end; / -declare - a1 varchar2(32767) := null; begin -a1:=a1||'with q1 as ('||chr(10)|| -'select ''f?p='' || :APP_ID ||'||chr(10)|| -' '':'' || ''6'' || -- Page'||chr(10)|| -' '':'' || :APP_SESSION ||'||chr(10)|| -' '':'' || :REQUEST ||'||chr(10)|| -' '':'' || :DEBUG ||'||chr(10)|| -' '':'' || ''N'' || -- CLear Cache'||chr(10)|| -' '':'' || ''P6_TEST_RUN_ID'' || '','' ||'||chr(10)|| -' ''P6_TESTCASE_NAME'' || -- Item N'; - -a1:=a1||'ames'||chr(10)|| -' '':'' || res.test_run_id || '','' ||'||chr(10)|| -' res.testcase || -- Item Values'||chr(10)|| -' '':'' || V(''PRINTER_FRIENDLY'') LINK'||chr(10)|| -' ,''ID'' || run.id LABEL'||chr(10)|| -' ,res.passes PASS'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_testcase_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' and res.testcase = :P6_TESTCAS'; - -a1:=a1||'E_NAME'||chr(10)|| -' where run.runner_owner = :P6_RUNNER_OWNER'||chr(10)|| -' and run.runner_name = :P6_RUNNER_NAME'||chr(10)|| -' order by run.id'||chr(10)|| -'), q2 as ('||chr(10)|| -'select count(*) num_rows from q1'||chr(10)|| -')'||chr(10)|| -'select * from q1'||chr(10)|| -' where rownum > (select num_rows from q2) - 10'; - -wwv_flow_api.create_flash_chart5_series( - p_id => 4988016280323183+wwv_flow_api.g_id_offset, - p_chart_id => 4987702388323183+wwv_flow_api.g_id_offset, +wwv_flow_api.create_worksheet_column( + p_id => 4982913874323173+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_series_seq =>10, - p_series_name =>'Pass', - p_series_query => a1, - p_series_type =>'Bar', - p_series_query_type =>'SQL_QUERY', - p_series_query_parse_opt =>'PARSE_CHART_QUERY', - p_series_query_no_data_found=>'No data found.', - p_series_query_row_count_max=>15, - p_action_link =>'', - p_show_action_link =>'N', - p_action_link_checksum_type =>''); + p_page_id=> 6, + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_db_column_name =>'MESSAGE', + p_display_order =>8, + p_group_id =>null+wwv_flow_api.g_id_offset, + p_column_identifier =>'I', + p_column_label =>'Message', + p_report_label =>'Message', + p_sync_form_label =>'Y', + p_display_in_default_rpt =>'Y', + p_is_sortable =>'Y', + p_allow_sorting =>'Y', + p_allow_filtering =>'Y', + p_allow_highlighting =>'Y', + p_allow_ctrl_breaks =>'Y', + p_allow_aggregations =>'Y', + p_allow_computations =>'Y', + p_allow_charting =>'Y', + p_allow_group_by =>'Y', + p_allow_hide =>'Y', + p_others_may_edit =>'Y', + p_others_may_view =>'Y', + p_column_type =>'STRING', + p_display_as =>'TEXT', + p_display_text_as =>'ESCAPE_SC', + p_heading_alignment =>'CENTER', + p_column_alignment =>'LEFT', + p_tz_dependent =>'N', + p_rpt_distinct_lov =>'Y', + p_rpt_show_filter_lov =>'D', + p_rpt_filter_date_ranges =>'ALL', + p_help_text =>''); end; / declare - a1 varchar2(32767) := null; + rc1 varchar2(32767) := null; begin -a1:=a1||'with q1 as ('||chr(10)|| -'select ''f?p='' || :APP_ID ||'||chr(10)|| -' '':'' || ''6'' || -- Page'||chr(10)|| -' '':'' || :APP_SESSION ||'||chr(10)|| -' '':'' || :REQUEST ||'||chr(10)|| -' '':'' || :DEBUG ||'||chr(10)|| -' '':'' || ''N'' || -- CLear Cache'||chr(10)|| -' '':'' || ''P6_TEST_RUN_ID'' || '','' ||'||chr(10)|| -' ''P6_TESTCASE_NAME'' || -- Item N'; - -a1:=a1||'ames'||chr(10)|| -' '':'' || res.test_run_id || '','' ||'||chr(10)|| -' res.testcase || -- Item Values'||chr(10)|| -' '':'' || V(''PRINTER_FRIENDLY'') LINK'||chr(10)|| -' ,''ID'' || run.id LABEL'||chr(10)|| -' ,res.failures FAIL'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_testcase_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' and res.testcase = :P6_TESTCAS'; - -a1:=a1||'E_NAME'||chr(10)|| -' where run.runner_owner = :P6_RUNNER_OWNER'||chr(10)|| -' and run.runner_name = :P6_RUNNER_NAME'||chr(10)|| -' order by run.id'||chr(10)|| -'), q2 as ('||chr(10)|| -'select count(*) num_rows from q1'||chr(10)|| -')'||chr(10)|| -'select * from q1'||chr(10)|| -' where rownum > (select num_rows from q2) - 10'; +rc1:=rc1||'SEQ:MSECS:STATUS:TESTCASE:ASSERTION:MESSAGE:DETAILS'; -wwv_flow_api.create_flash_chart5_series( - p_id => 4987805822323183+wwv_flow_api.g_id_offset, - p_chart_id => 4987702388323183+wwv_flow_api.g_id_offset, +wwv_flow_api.create_worksheet_rpt( + p_id => 4983313754323174+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_series_seq =>20, - p_series_name =>'Fail', - p_series_query => a1, - p_series_type =>'Bar', - p_series_query_type =>'SQL_QUERY', - p_series_query_parse_opt =>'PARSE_CHART_QUERY', - p_series_query_no_data_found=>'', - p_series_query_row_count_max=>15, - p_action_link =>'', - p_show_action_link =>'N', - p_action_link_checksum_type =>''); + p_page_id=> 6, + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_session_id => null, + p_base_report_id => null+wwv_flow_api.g_id_offset, + p_application_user => 'APXWS_DEFAULT', + p_report_seq =>10, + p_report_alias =>'49834', + p_status =>'PUBLIC', + p_category_id =>null+wwv_flow_api.g_id_offset, + p_is_default =>'Y', + p_display_rows =>100000, + p_report_columns =>rc1, + p_sort_column_1 =>'SEQ', + p_sort_direction_1 =>'ASC', + p_flashback_enabled =>'N', + p_calendar_display_column =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_condition( + p_id => 4983615236323175+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_report_id => 4983313754323174+wwv_flow_api.g_id_offset, + p_name =>'Highlight Errors', + p_condition_type =>'HIGHLIGHT', + p_allow_delete =>'Y', + p_column_name =>'STATUS', + p_operator =>'=', + p_expr =>'ERR', + p_condition_sql =>' (case when ("STATUS" = #APXWS_EXPR#) then #APXWS_HL_ID# end) ', + p_condition_display =>'#APXWS_COL_NAME# = ''ERR'' ', + p_enabled =>'Y', + p_highlight_sequence =>10, + p_row_bg_color =>'#FF5588', + p_column_format =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_condition( + p_id => 4983707104323175+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_report_id => 4983313754323174+wwv_flow_api.g_id_offset, + p_name =>'Highlight Failures', + p_condition_type =>'HIGHLIGHT', + p_allow_delete =>'Y', + p_column_name =>'STATUS', + p_operator =>'=', + p_expr =>'FAIL', + p_condition_sql =>' (case when ("STATUS" = #APXWS_EXPR#) then #APXWS_HL_ID# end) ', + p_condition_display =>'#APXWS_COL_NAME# = ''FAIL'' ', + p_enabled =>'Y', + p_highlight_sequence =>10, + p_row_bg_color =>'#FFFF99', + p_column_format =>''); +end; +/ +begin +wwv_flow_api.create_worksheet_condition( + p_id => 4983512775323175+wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_page_id=> 6, + p_worksheet_id => 4982411530323169+wwv_flow_api.g_id_offset, + p_report_id => 4983313754323174+wwv_flow_api.g_id_offset, + p_condition_type =>'FILTER', + p_allow_delete =>'Y', + p_column_name =>'STATUS', + p_operator =>'!=', + p_expr =>'PASS', + p_condition_sql =>'"STATUS" != #APXWS_EXPR#', + p_condition_display =>'#APXWS_COL_NAME# != ''PASS'' ', + p_enabled =>'Y', + p_column_format =>''); end; / declare - a1 varchar2(32767) := null; + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; begin -a1:=a1||'with q1 as ('||chr(10)|| -'select ''f?p='' || :APP_ID ||'||chr(10)|| -' '':'' || ''6'' || -- Page'||chr(10)|| -' '':'' || :APP_SESSION ||'||chr(10)|| -' '':'' || :REQUEST ||'||chr(10)|| -' '':'' || :DEBUG ||'||chr(10)|| -' '':'' || ''N'' || -- CLear Cache'||chr(10)|| -' '':'' || ''P6_TEST_RUN_ID'' || '','' ||'||chr(10)|| -' ''P6_TESTCASE_NAME'' || -- Item N'; - -a1:=a1||'ames'||chr(10)|| -' '':'' || res.test_run_id || '','' ||'||chr(10)|| -' res.testcase || -- Item Values'||chr(10)|| -' '':'' || V(''PRINTER_FRIENDLY'') LINK'||chr(10)|| -' ,''ID'' || run.id LABEL'||chr(10)|| -' ,res.errors ERR'||chr(10)|| -' from wt_test_runs run'||chr(10)|| -' join wt_testcase_stats res'||chr(10)|| -' on res.test_run_id = run.id'||chr(10)|| -' and res.testcase = :P6_TESTCASE'; +s:=s||'begin'||chr(10)|| +' for buff in (select error_message from wt_test_runs'||chr(10)|| +' where id = :P0_TEST_RUN_ID'||chr(10)|| +' and error_message is not null)'||chr(10)|| +' loop'||chr(10)|| +' htp.p(''Test Runner Error Message: '' ||'||chr(10)|| +' buff.error_message || ''
      '');'||chr(10)|| +' end loop;'||chr(10)|| +' htp.p(''
      '');'||chr(10)|| +' htp.p(''
      '');'||chr(10)|| +' htp.p(''
      '');'||chr(10)|| +' htp.p(''Test Results Details Search: (select num_rows from q2) - 10'; +s:=s||'r>'');'||chr(10)|| +'end;'||chr(10)|| +''; -wwv_flow_api.create_flash_chart5_series( - p_id => 4987900146323183+wwv_flow_api.g_id_offset, - p_chart_id => 4987702388323183+wwv_flow_api.g_id_offset, +wwv_flow_api.create_page_plug ( + p_id=> 4983829548323176 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_series_seq =>30, - p_series_name =>'Error', - p_series_query => a1, - p_series_type =>'Bar', - p_series_query_type =>'SQL_QUERY', - p_series_query_parse_opt =>'PARSE_CHART_QUERY', - p_series_query_no_data_found=>'', - p_series_query_row_count_max=>15, - p_action_link =>'', - p_show_action_link =>'N', - p_action_link_checksum_type =>''); + p_page_id=> 6, + p_plug_name=> 'Test Run Error Message', + p_region_name=>'', + p_plug_template=> 4839831975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 10, + p_plug_display_column=> 1, + p_plug_display_point=> 'AFTER_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'PLSQL_PROCEDURE', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'QUERY_COLUMNS', + p_plug_query_num_rows => 15, + p_plug_query_num_rows_type => 'NEXT_PREVIOUS_LINKS', + p_plug_query_row_count_max => 500, + p_plug_query_show_nulls_as => ' - ', + p_plug_display_condition_type => '', + p_pagination_display_position=>'BOTTOM_RIGHT', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); end; / declare @@ -11145,15 +10703,15 @@ s:=s||'PLATES#">'||chr(10)|| '#CHART_REFRESH#'; wwv_flow_api.create_page_plug ( - p_id=> 4988130280323184 + wwv_flow_api.g_id_offset, + p_id=> 4987121729323182 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 6, - p_plug_name=> 'Test Case Duration Trend', + p_plug_name=> 'Test Case Status', p_region_name=>'', p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, - p_plug_display_sequence=> 22, - p_plug_display_column=> 2, - p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_display_sequence=> 1, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_BOX_BODY', p_plug_source=> s, p_plug_source_type=> 'FLASH_CHART5', p_translate_title=> 'Y', @@ -11161,8 +10719,7 @@ wwv_flow_api.create_page_plug ( p_plug_query_row_template=> 1, p_plug_query_headings_type=> 'COLON_DELMITED_LIST', p_plug_query_row_count_max => 500, - p_plug_display_condition_type => 'PLSQL_EXPRESSION', - p_plug_display_when_condition => ':P6_SHOW_TREND=''Y''', + p_plug_display_condition_type => '', p_plug_customized=>'0', p_plug_caching=> 'NOT_CACHED', p_plug_comment=> ''); @@ -11173,21 +10730,21 @@ declare begin a1 := null; wwv_flow_api.create_flash_chart5( - p_id => 4988311601323184+wwv_flow_api.g_id_offset, + p_id => 4987320221323183+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id => 6, - p_region_id => 4988130280323184+wwv_flow_api.g_id_offset, - p_default_chart_type =>'2DColumn', + p_region_id => 4987121729323182+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DPie', p_chart_title =>'', - p_chart_name =>'chart_4946607806544261', + p_chart_name =>'chart_4927915384997301', p_chart_width =>300, p_chart_height =>200, p_chart_animation =>'N', - p_display_attr =>':H::V:Y:N:N::V:Y:None:::N:::Default', + p_display_attr =>':H:::::Left::V:Y:None:::N:::Default', p_dial_tick_attr =>':::::::::::', p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', - p_map_source =>'', + p_map_source =>'%', p_margins =>':::', p_omit_label_interval => null, p_bgtype =>'Trans', @@ -11198,8 +10755,8 @@ wwv_flow_api.create_flash_chart5( p_grid_bgcolor1 =>'', p_grid_bgcolor2 =>'', p_grid_gradient_rotation =>null, - p_color_scheme =>'6', - p_custom_colors =>'', + p_color_scheme =>'0', + p_custom_colors =>'#99FF99,#FFFF99,#FF6699', p_map_undef_color_scheme =>'', p_map_undef_custom_colors =>'', p_x_axis_title =>'', @@ -11209,17 +10766,17 @@ wwv_flow_api.create_flash_chart5( p_x_axis_prefix =>'', p_x_axis_postfix =>'', p_x_axis_label_rotation =>'', - p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_label_font =>'::', p_x_axis_major_interval =>null, p_x_axis_minor_interval =>null, - p_y_axis_title =>'Milliseconds', - p_y_axis_min =>0, + p_y_axis_title =>'', + p_y_axis_min =>null, p_y_axis_max =>null, p_y_axis_decimal_place =>null, p_y_axis_prefix =>'', p_y_axis_postfix =>'', p_y_axis_label_rotation =>'', - p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_label_font =>'::', p_y_axis_major_interval =>null, p_y_axis_minor_interval =>null, p_async_update =>'N', @@ -11236,9 +10793,9 @@ wwv_flow_api.create_flash_chart5( p_legend_font =>'Arial:10:#000000', p_grid_labels_font =>'', p_chart_title_font =>'Tahoma:14:#000000', - p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:', p_x_axis_title_rotation =>'', - p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_font =>'Tahoma:14:', p_y_axis_title_rotation =>'', p_gauge_labels_font =>'Tahoma:10:', p_use_chart_xml =>'N', @@ -11249,45 +10806,49 @@ declare a1 varchar2(32767) := null; begin a1:=a1||'with q1 as ('||chr(10)|| -'select ''f?p='' || :APP_ID ||'||chr(10)|| -' '':'' || ''6'' || -- Page'||chr(10)|| -' '':'' || :APP_SESSION ||'||chr(10)|| -' '':'' || :REQUEST ||'||chr(10)|| -' '':'' || :DEBUG ||'||chr(10)|| -' '':'' || ''N'' || -- CLear Cache'||chr(10)|| -' '':'' || ''P6_TEST_RUN_ID'' || '','' ||'||chr(10)|| -' ''P6_TESTCASE_NAME'' || -- Item N'; +'select NULL LINK'||chr(10)|| +' ,''PASS'' LABEL'||chr(10)|| +' ,sum(res.passes) VALUE'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_testcase_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' and res.testcase = :P0_TEST_CASE'||chr(10)|| +' where id = :P0_TEST_RUN_ID'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''FAIL'' LABEL'||chr(10)|| +' ,sum(res.failures) VALUE'||chr(10)|| +' from wt_test_runs'; -a1:=a1||'ames'||chr(10)|| -' '':'' || run.id || '','' ||'||chr(10)|| -' res.testcase || -- Item Values'||chr(10)|| -' '':'' || V(''PRINTER_FRIENDLY'') LINK'||chr(10)|| -' ,''ID'' || run.id ||'||chr(10)|| -' '': '' || res.testcase LABEL'||chr(10)|| -' ,res.tot_interval_msecs MILLISECONDS'||chr(10)|| +a1:=a1||' run'||chr(10)|| +' join wt_testcase_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' and res.testcase = :P0_TEST_CASE'||chr(10)|| +' where id = :P0_TEST_RUN_ID'||chr(10)|| +'union all'||chr(10)|| +'select NULL LINK'||chr(10)|| +' ,''ERR'' LABEL'||chr(10)|| +' ,sum(res.errors) VALUE'||chr(10)|| ' from wt_test_runs run'||chr(10)|| ' join wt_testcase_stats res'||chr(10)|| ' on res.test_run_id = run.id'||chr(10)|| -' '; +' and res.testcase = :P0_TEST_CASE'||chr(10)|| +''; -a1:=a1||' and res.testcase = :P6_TESTCASE_NAME'||chr(10)|| -' where run.runner_owner = :P6_RUNNER_OWNER'||chr(10)|| -' and run.runner_name = :P6_RUNNER_NAME'||chr(10)|| -' order by id'||chr(10)|| -'), q2 as ('||chr(10)|| -'select count(*) num_rows from q1'||chr(10)|| +a1:=a1||' where id = :P0_TEST_RUN_ID'||chr(10)|| ')'||chr(10)|| -'select * from q1'||chr(10)|| -' where rownum > (select num_rows from q2) - 10'; +'select link, label, value'||chr(10)|| +' from q1'||chr(10)|| +' order by label desc'; wwv_flow_api.create_flash_chart5_series( - p_id => 4988419037323184+wwv_flow_api.g_id_offset, - p_chart_id => 4988311601323184+wwv_flow_api.g_id_offset, + p_id => 4987425886323183+wwv_flow_api.g_id_offset, + p_chart_id => 4987320221323183+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_series_seq =>10, p_series_name =>'Series 1', p_series_query => a1, - p_series_type =>'Bar', + p_series_type =>'', p_series_query_type =>'SQL_QUERY', p_series_query_parse_opt =>'PARSE_CHART_QUERY', p_series_query_no_data_found=>'No data found.', @@ -11297,530 +10858,408 @@ wwv_flow_api.create_flash_chart5_series( p_action_link_checksum_type =>''); end; / - -begin - -null; - -end; -/ - - -begin - -wwv_flow_api.create_page_branch( - p_id=>4990208512323191 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 6, - p_branch_action=> 'f?p=&APP_ID.:6:&SESSION.::&DEBUG.:::&success_msg=#SUCCESS_MSG#', - p_branch_point=> 'AFTER_PROCESSING', - p_branch_type=> 'REDIRECT_URL', - p_branch_sequence=> 99, - p_save_state_before_branch_yn=>'Y', - p_branch_comment=> ''); - - -end; -/ - declare - h varchar2(32767) := null; + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; begin -wwv_flow_api.create_page_item( - p_id=>4979526173323164 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 6, - p_name=>'P6_GOTO_RUN_ID', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 9, - p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Go To Run ID:', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_POPUP_LOV', - p_lov=> 'select id || '': '' ||'||chr(10)|| -' runner_owner || ''.'' ||'||chr(10)|| -' runner_name || '', '' ||'||chr(10)|| -' to_char(start_dtm,''YYYY/MM/DD HH24:MI:SS'') DISPLAY'||chr(10)|| -' ,id RETURN'||chr(10)|| -' from wt_test_runs tr'||chr(10)|| -' where id != :P6_TEST_RUN_ID'||chr(10)|| -' and exists (select ''x'' from wt_testcase_stats tc'||chr(10)|| -' where tc.test_run_id = tr.id )'||chr(10)|| -' order by id desc', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 10, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'NO', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'NOT_ENTERABLE', - p_attribute_02 => 'NO_FETCH', - p_show_quick_picks=>'N', - p_item_comment => 'This item is initialized by the "Initialize Items" process.'); - - -end; -/ +s:=s||''||chr(10)|| +' 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => '2', - p_attribute_02 => 'SUBMIT', - p_attribute_03 => 'Y', - p_show_quick_picks=>'N', - p_item_comment => ''); - - -end; -/ +s:=s||'SION.:FLOW_FLASH_CHART5_R#REGION_ID#">'||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +' 'NO', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'LEFT', - p_field_alignment=> 'LEFT', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_show_quick_picks=>'N', - p_item_comment => 'This item is initialized by the "Initialize Items" process.'); - - -end; -/ +s:=s||'itingForDataText=#FLASH_WAITING#&templatesLoadingText=#FLASH_TEMPLATES#">'||chr(10)|| +''||chr(10)|| +'4980303495323165 + wwv_flow_api.g_id_offset, +s:=s||'Access="sameDomain" '||chr(10)|| +' allowNetworking="all"'||chr(10)|| +' type="application/x-shockwave-flash"'||chr(10)|| +' pluginspage="#HOST_PROTOCOL#://www.macromedia.com/go/getflashplayer"'||chr(10)|| +' wmode="transparent"'||chr(10)|| +' FlashVars="initText=#FLASH_INIT#&xmlLoadingText=#FLASH_LOADING#&resourcesLoadingText=#FLASH_RESOURCES#&noDataText=#FLASH_NO_DATA#&waitingForDataText=#FLASH_WAITING#&templatesLoadingText=#FLASH_TEM'; + +s:=s||'PLATES#">'||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4987511974323183 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 6, - p_name=>'P6_TOTAL_ELAPSED', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 8, - p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Elapsed (msecs):', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'N', - p_show_quick_picks=>'N', - p_item_comment => 'This item is initialized by the "Initialize Items" process.'); - - + p_page_id=> 6, + p_plug_name=> 'Test Case Status Trend', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 21, + p_plug_display_column=> 1, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => 'PLSQL_EXPRESSION', + p_plug_display_when_condition => ':P6_SHOW_TREND=''Y''', + p_plug_display_when_cond2=>'Y', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); end; / - declare - h varchar2(32767) := null; + a1 varchar2(32767) := null; begin -wwv_flow_api.create_page_item( - p_id=>4980909283323166 + wwv_flow_api.g_id_offset, +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4987702388323183+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 6, - p_name=>'P6_TEST_RUN_ID', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 2, - p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_source_type=> 'STATIC', - p_source_post_computation => 'to_number(:P6_TEST_RUN_ID)', - p_display_as=> 'NATIVE_HIDDEN', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'NO', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'Y', - p_show_quick_picks=>'N', - p_item_comment => ''); - - + p_page_id => 6, + p_region_id => 4987511974323183+wwv_flow_api.g_id_offset, + p_default_chart_type =>'Stacked2DColumn', + p_chart_title =>'', + p_chart_name =>'chart_4932831378476124', + p_chart_width =>300, + p_chart_height =>200, + p_chart_animation =>'N', + p_display_attr =>':H:N::Y:N:Left::V:Y:Circle:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'%', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'0', + p_custom_colors =>'#99FF99,#FFFF99,#FF6699', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'Test Run ID', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'', + p_y_axis_min =>0, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); end; / - declare - h varchar2(32767) := null; + a1 varchar2(32767) := null; begin -h := null; -h:=h||'This item is initialized by the "Initialize Items" process.'; +a1:=a1||'with q1 as ('||chr(10)|| +'select res.test_run_id LINK'||chr(10)|| +' ,res.test_run_id LABEL'||chr(10)|| +' ,res.passes PASS'||chr(10)|| +' ,res.failures FAIL'||chr(10)|| +' ,res.errors ERR'||chr(10)|| +' ,rownum RNUM'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_testcase_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' '; -wwv_flow_api.create_page_item( - p_id=>4981107070323166 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 6, - p_name=>'P6_RUNNER_OWNER', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 3, - p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Runner Owner:', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_help_text=> h, - p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'N', - p_show_quick_picks=>'N', - p_item_comment => ''); - - -end; -/ +a1:=a1||' and res.testcase = :P0_TEST_CASE'||chr(10)|| +' where run.runner_owner = :P0_TEST_OWNER'||chr(10)|| +' and run.runner_name = :P0_TEST_RUNNER'||chr(10)|| +' order by run.id'||chr(10)|| +'), q2 as ('||chr(10)|| +'select count(*) num_rows from q1'||chr(10)|| +')'||chr(10)|| +'select link'||chr(10)|| +' ,label'||chr(10)|| +' ,pass'||chr(10)|| +' ,fail'||chr(10)|| +' ,err'||chr(10)|| +' from q1'||chr(10)|| +' where rnum > (select num_rows from q2) - 10'; -declare - h varchar2(32767) := null; -begin -wwv_flow_api.create_page_item( - p_id=>4981616597323167 + wwv_flow_api.g_id_offset, +wwv_flow_api.create_flash_chart5_series( + p_id => 4988016280323183+wwv_flow_api.g_id_offset, + p_chart_id => 4987702388323183+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 6, - p_name=>'P6_START_DTM', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 7, - p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Start Date/Time:', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'N', - p_show_quick_picks=>'N', - p_item_comment => 'This item is initialized by the "Initialize Items" process.'); - - + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'f?p=&APP_ID.:6:&SESSION.::&DEBUG.::P0_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', + p_action_link_checksum_type =>''); end; / - declare - h varchar2(32767) := null; + s varchar2(32767) := null; + l_clob clob; + l_length number := 1; begin -wwv_flow_api.create_page_item( - p_id=>4981808770323167 + wwv_flow_api.g_id_offset, +s:=s||''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +''||chr(10)|| +'#CHART_REFRESH#'; + +wwv_flow_api.create_page_plug ( + p_id=> 4988130280323184 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 6, - p_name=>'P6_RUNNER_NAME_DISP', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 4, - p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Runner Name:', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'N', - p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'N', - p_show_quick_picks=>'N', - p_item_comment => 'This item is initialized by the "Initialize Items" process.'); - - + p_page_id=> 6, + p_plug_name=> 'Test Case Duration Trend', + p_region_name=>'', + p_plug_template=> 4839217975414912+ wwv_flow_api.g_id_offset, + p_plug_display_sequence=> 22, + p_plug_display_column=> 2, + p_plug_display_point=> 'BEFORE_SHOW_ITEMS', + p_plug_source=> s, + p_plug_source_type=> 'FLASH_CHART5', + p_translate_title=> 'Y', + p_plug_display_error_message=> '#SQLERRM#', + p_plug_query_row_template=> 1, + p_plug_query_headings_type=> 'COLON_DELMITED_LIST', + p_plug_query_row_count_max => 500, + p_plug_display_condition_type => 'PLSQL_EXPRESSION', + p_plug_display_when_condition => ':P6_SHOW_TREND=''Y''', + p_plug_customized=>'0', + p_plug_caching=> 'NOT_CACHED', + p_plug_comment=> ''); end; / - declare - h varchar2(32767) := null; + a1 varchar2(32767) := null; begin -wwv_flow_api.create_page_item( - p_id=>4984013419323176 + wwv_flow_api.g_id_offset, +a1 := null; +wwv_flow_api.create_flash_chart5( + p_id => 4988311601323184+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 6, - p_name=>'P6_TEST_RUN_ERROR', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 99, - p_item_plug_id => 4983829548323176+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_HIDDEN', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'NO', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'LEFT', - p_field_alignment=> 'LEFT', - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', - p_show_quick_picks=>'N', - p_item_comment => 'This item is initialized by the "Initialize Items" process.'); - - + p_page_id => 6, + p_region_id => 4988130280323184+wwv_flow_api.g_id_offset, + p_default_chart_type =>'2DColumn', + p_chart_title =>'', + p_chart_name =>'chart_4946607806544261', + p_chart_width =>300, + p_chart_height =>200, + p_chart_animation =>'N', + p_display_attr =>':H:N::Y:N:N::V:Y:None:::N:::Default', + p_dial_tick_attr =>':::::::::::', + p_gantt_attr =>'Y:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:Rhomb:Rhomb:Full:30:15:5:Y:I:N:S:E', + p_map_attr =>'Orthographic:RegionBounds:REGION_NAME', + p_map_source =>'', + p_margins =>':::', + p_omit_label_interval => null, + p_bgtype =>'Trans', + p_bgcolor1 =>'', + p_bgcolor2 =>'', + p_gradient_rotation =>null, + p_grid_bgtype =>'', + p_grid_bgcolor1 =>'', + p_grid_bgcolor2 =>'', + p_grid_gradient_rotation =>null, + p_color_scheme =>'6', + p_custom_colors =>'', + p_map_undef_color_scheme =>'', + p_map_undef_custom_colors =>'', + p_x_axis_title =>'Test Run ID', + p_x_axis_min =>null, + p_x_axis_max =>null, + p_x_axis_decimal_place =>null, + p_x_axis_prefix =>'', + p_x_axis_postfix =>'', + p_x_axis_label_rotation =>'', + p_x_axis_label_font =>'Tahoma:10:#000000', + p_x_axis_major_interval =>null, + p_x_axis_minor_interval =>null, + p_y_axis_title =>'Milliseconds', + p_y_axis_min =>0, + p_y_axis_max =>null, + p_y_axis_decimal_place =>null, + p_y_axis_prefix =>'', + p_y_axis_postfix =>'', + p_y_axis_label_rotation =>'', + p_y_axis_label_font =>'Tahoma:10:#000000', + p_y_axis_major_interval =>null, + p_y_axis_minor_interval =>null, + p_async_update =>'N', + p_async_time =>null, + p_legend_title =>'', + p_legend_title_font =>'', + p_names_font => null, + p_names_rotation => null, + p_values_font =>'Arial:10:#000000', + p_values_rotation =>null, + p_values_prefix =>'', + p_values_postfix =>'', + p_hints_font =>'Tahoma:10:#000000', + p_legend_font =>'Arial:10:#000000', + p_grid_labels_font =>'', + p_chart_title_font =>'Tahoma:14:#000000', + p_x_axis_title_font =>'Tahoma:14:#000000', + p_x_axis_title_rotation =>'', + p_y_axis_title_font =>'Tahoma:14:#000000', + p_y_axis_title_rotation =>'', + p_gauge_labels_font =>'Tahoma:10:', + p_use_chart_xml =>'N', + p_chart_xml => a1); end; / - declare - h varchar2(32767) := null; + a1 varchar2(32767) := null; begin -wwv_flow_api.create_page_item( - p_id=>4995211406848083 + wwv_flow_api.g_id_offset, +a1:=a1||'with q1 as ('||chr(10)|| +'select res.test_run_id LINK'||chr(10)|| +' ,res.test_run_id LABEL'||chr(10)|| +' ,res.tot_interval_msecs MILLISECONDS'||chr(10)|| +' ,rownum RNUM'||chr(10)|| +' from wt_test_runs run'||chr(10)|| +' join wt_testcase_stats res'||chr(10)|| +' on res.test_run_id = run.id'||chr(10)|| +' and res.testcase = :P0_TEST_CASE'||chr(10)|| +' where run.runner_owner = :P0_TEST_OWNER'||chr(10)|| +' a'; + +a1:=a1||'nd run.runner_name = :P0_TEST_RUNNER'||chr(10)|| +' order by id'||chr(10)|| +'), q2 as ('||chr(10)|| +'select count(*) num_rows from q1'||chr(10)|| +')'||chr(10)|| +'select link'||chr(10)|| +' ,label'||chr(10)|| +' ,milliseconds'||chr(10)|| +' from q1'||chr(10)|| +' where rnum > (select num_rows from q2) - 10'; + +wwv_flow_api.create_flash_chart5_series( + p_id => 4988419037323184+wwv_flow_api.g_id_offset, + p_chart_id => 4988311601323184+wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 6, - p_name=>'P6_TESTCASE_NAME', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 6, - p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Test Case Name:', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'Y', - p_item_comment => ''); + p_series_seq =>10, + p_series_name =>'Series 1', + p_series_query => a1, + p_series_type =>'Bar', + p_series_query_type =>'SQL_QUERY', + p_series_query_parse_opt =>'PARSE_CHART_QUERY', + p_series_query_no_data_found=>'No data found.', + p_series_query_row_count_max=>15, + p_action_link =>'f?p=&APP_ID.:6:&SESSION.::&DEBUG.::P0_TEST_RUN_ID:#LINK#', + p_show_action_link =>'C', + p_action_link_checksum_type =>''); +end; +/ + +begin +null; end; / -declare - h varchar2(32767) := null; + begin -wwv_flow_api.create_page_item( - p_id=>4995404957855714 + wwv_flow_api.g_id_offset, + +wwv_flow_api.create_page_branch( + p_id=>4990208512323191 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_flow_step_id=> 6, - p_name=>'P6_GO_TO_TCASE', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 10, - p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Go To Test Case:', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_POPUP_LOV', - p_lov=> 'select testcase DISPLAY'||chr(10)|| -' ,testcase RETURN'||chr(10)|| -' from wt_testcase_stats'||chr(10)|| -' where test_run_id = :P6_TEST_RUN_ID'||chr(10)|| -' and testcase != :P6_TESTCASE_NAME'||chr(10)|| -' order by testcase', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 10, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'NO', - p_protection_level => 'N', - p_escape_on_http_output => 'Y', - p_attribute_01 => 'NOT_ENTERABLE', - p_attribute_02 => 'NO_FETCH', - p_show_quick_picks=>'N', - p_item_comment => 'This item is initialized by the "Initialize Items" process.'); + p_branch_action=> 'f?p=&APP_ID.:6:&SESSION.::&DEBUG.:::&success_msg=#SUCCESS_MSG#', + p_branch_point=> 'AFTER_PROCESSING', + p_branch_type=> 'REDIRECT_URL', + p_branch_sequence=> 99, + p_save_state_before_branch_yn=>'Y', + p_branch_comment=> ''); end; @@ -11830,18 +11269,18 @@ declare h varchar2(32767) := null; begin wwv_flow_api.create_page_item( - p_id=>5007723478780547 + wwv_flow_api.g_id_offset, + p_id=>4979721568323165 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_flow_step_id=> 6, - p_name=>'P6_SHOW_TREE', + p_name=>'P6_SHOW_TREND', p_data_type=> 'VARCHAR', p_is_required=> true, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 12, + p_item_sequence=> 11, p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Show Tree:', + p_prompt=>'Show Trend:', p_source=>'N', p_source_type=> 'STATIC', p_display_as=> 'NATIVE_RADIOGROUP', @@ -11871,124 +11310,25 @@ wwv_flow_api.create_page_item( p_item_comment => ''); -end; -/ - -declare - h varchar2(32767) := null; -begin -wwv_flow_api.create_page_item( - p_id=>5064723722530218 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id=> 6, - p_name=>'P6_TEST_RUN_ID_DISP', - p_data_type=> 'VARCHAR', - p_is_required=> false, - p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 1, - p_item_plug_id => 4978906587323161+wwv_flow_api.g_id_offset, - p_use_cache_before_default=> 'YES', - p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Test Run ID:', - p_source_type=> 'STATIC', - p_display_as=> 'NATIVE_DISPLAY_ONLY', - p_lov_display_null=> 'NO', - p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, - p_cHeight=> 1, - p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'YES', - p_begin_on_new_field=> 'YES', - p_colspan=> 1, - p_rowspan=> 1, - p_label_alignment=> 'RIGHT', - p_field_alignment=> 'LEFT-CENTER', - p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, - p_is_persistent=> 'Y', - p_lov_display_extra=>'YES', - p_protection_level => 'N', - p_escape_on_http_output => 'N', - p_attribute_01 => 'N', - p_attribute_02 => 'VALUE', - p_attribute_04 => 'Y', - p_show_quick_picks=>'N', - p_item_comment => 'This item is initialized by the "Initialize Items" process.'); - - end; / begin -wwv_flow_api.create_page_da_event ( - p_id => 4989710358323189 + wwv_flow_api.g_id_offset - ,p_flow_id => wwv_flow.g_flow_id - ,p_page_id => 6 - ,p_name => 'Submit After Test Run LOV Change' - ,p_event_sequence => 10 - ,p_triggering_element_type => 'ITEM' - ,p_triggering_element => 'P6_GOTO_RUN_ID' - ,p_bind_type => 'bind' - ,p_bind_event_type => 'change' - ); -wwv_flow_api.create_page_da_action ( - p_id => 4998326694508289 + wwv_flow_api.g_id_offset - ,p_flow_id => wwv_flow.g_flow_id - ,p_page_id => 6 - ,p_event_id => 4989710358323189 + wwv_flow_api.g_id_offset - ,p_event_result => 'TRUE' - ,p_action_sequence => 10 - ,p_execute_on_page_init => 'N' - ,p_action => 'NATIVE_CLEAR' - ,p_affected_elements_type => 'ITEM' - ,p_affected_elements => 'P6_TESTCASE_NAME' - ,p_stop_execution_on_error => 'Y' - ); -wwv_flow_api.create_page_da_action ( - p_id => 4990017349323191 + wwv_flow_api.g_id_offset - ,p_flow_id => wwv_flow.g_flow_id - ,p_page_id => 6 - ,p_event_id => 4989710358323189 + wwv_flow_api.g_id_offset - ,p_event_result => 'TRUE' - ,p_action_sequence => 20 - ,p_execute_on_page_init => 'N' - ,p_action => 'NATIVE_SUBMIT_PAGE' - ,p_attribute_01 => 'REFRESH' - ,p_stop_execution_on_error => 'Y' - ); -null; - -end; -/ - - -begin +wwv_flow_api.create_page_computation( + p_id=> 5113216840349039 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 6, + p_computation_sequence => 20, + p_computation_item=> 'P0_DISPLAY', + p_computation_point=> 'BEFORE_HEADER', + p_computation_type=> 'STATIC_ASSIGNMENT', + p_computation_processed=> 'REPLACE_EXISTING', + p_computation=> 'Y', + p_compute_when => '', + p_compute_when_type=>''); -wwv_flow_api.create_page_da_event ( - p_id => 4997805569502165 + wwv_flow_api.g_id_offset - ,p_flow_id => wwv_flow.g_flow_id - ,p_page_id => 6 - ,p_name => 'Submit After Test Case LOV Change' - ,p_event_sequence => 20 - ,p_triggering_element_type => 'ITEM' - ,p_triggering_element => 'P6_GO_TO_TCASE' - ,p_bind_type => 'bind' - ,p_bind_event_type => 'change' - ); -wwv_flow_api.create_page_da_action ( - p_id => 4998111776502171 + wwv_flow_api.g_id_offset - ,p_flow_id => wwv_flow.g_flow_id - ,p_page_id => 6 - ,p_event_id => 4997805569502165 + wwv_flow_api.g_id_offset - ,p_event_result => 'TRUE' - ,p_action_sequence => 10 - ,p_execute_on_page_init => 'N' - ,p_action => 'NATIVE_SUBMIT_PAGE' - ,p_attribute_01 => 'REFRESH' - ,p_stop_execution_on_error => 'Y' - ); null; end; @@ -12056,190 +11396,6 @@ end; / -begin - -declare - p varchar2(32767) := null; - l_clob clob; - l_length number := 1; -begin -p:=p||'declare'||chr(10)|| -' --'||chr(10)|| -' page varchar2(5); -- Destination Page'||chr(10)|| -' clear_cache varchar2(4000); -- Comma Delimited Names'||chr(10)|| -' item_names varchar2(4000); -- Comma Delimited Names'||chr(10)|| -' item_values varchar2(4000); -- Comma Delimited Values'||chr(10)|| -' --'||chr(10)|| -' procedure find_test_run_id is begin'||chr(10)|| -' select max(tc.test_run_id) into :P6_TEST_RUN_ID'||chr(10)|| -' from wt_test_runs tr'||chr(10)|| -' join wt_te'; - -p:=p||'stcase_stats tc'||chr(10)|| -' on tc.test_run_id = tr.id'||chr(10)|| -' where tr.runner_owner = :APP_USER;'||chr(10)|| -' if :P6_TEST_RUN_ID is NULL'||chr(10)|| -' then'||chr(10)|| -' select max(tc.test_run_id) into :P6_TEST_RUN_ID'||chr(10)|| -' from wt_test_runs tr'||chr(10)|| -' join wt_testcase_stats tc'||chr(10)|| -' on tc.test_run_id = tr.id;'||chr(10)|| -' end if;'||chr(10)|| -' end find_test_run_id;'||chr(10)|| -' --'||chr(10)|| -' procedure process_test_run'; - -p:=p||'_id is begin'||chr(10)|| -' for buff in ('||chr(10)|| -' select tr.runner_owner'||chr(10)|| -' ,tr.runner_name'||chr(10)|| -' ,to_char(start_dtm,''YYYY/MM/DD HH24:MI:SS'') START_DTM'||chr(10)|| -' ,error_message'||chr(10)|| -' from wt_test_runs tr'||chr(10)|| -' where id = :P6_TEST_RUN_ID ) -- Primary Key, Only 1 row in loop'||chr(10)|| -' loop'||chr(10)|| -' :P6_RUNNER_OWNER := buff.runner_owner;'||chr(10)|| -' :P6_RUNNER_NAME := b'; - -p:=p||'uff.runner_name;'||chr(10)|| -' :P6_START_DTM := buff.start_dtm;'||chr(10)|| -' :P6_TEST_RUN_ERROR := buff.error_message;'||chr(10)|| -' if buff.runner_owner = :APP_USER'||chr(10)|| -' then'||chr(10)|| -' page := ''2'';'||chr(10)|| -' item_names := ''P'' || page || ''_TEST_RUNNER'';'||chr(10)|| -' item_values := buff.runner_name;'||chr(10)|| -' :P6_RUNNER_NAME_DISP := '''' || buff.runner_name ||'||chr(10)|| -' '' (Click to Run)'' ;'||chr(10)|| -' else'; - -p:=p||''||chr(10)|| -' :P6_RUNNER_NAME_DISP := buff.runner_name;'||chr(10)|| -' end if;'||chr(10)|| -' end loop;'||chr(10)|| -' end process_test_run_id;'||chr(10)|| -' --'||chr(10)|| -' function check_testcase_name return boolean is begin'||chr(10)|| -' for buff in (select ''x'' from wt_testcase_stats'||chr(10)|| -' where test_run_id = :P6_TEST_RUN_ID'||chr(10)|| -' and testcase = :P6_TESTCASE_NAME )'||chr(10)|| -' -- Primary Key, Only returns 1 row'; - -p:=p||''||chr(10)|| -' loop'||chr(10)|| -' return TRUE;'||chr(10)|| -' end loop;'||chr(10)|| -' return FALSE;'||chr(10)|| -' end check_testcase_name;'||chr(10)|| -' --'||chr(10)|| -' procedure find_testcase_name is begin'||chr(10)|| -' select min(testcase)'||chr(10)|| -' into :P6_TESTCASE_NAME'||chr(10)|| -' from wt_testcase_stats'||chr(10)|| -' where test_run_id = :P6_TEST_RUN_ID;'||chr(10)|| -' end find_testcase_name;'||chr(10)|| -' --'||chr(10)|| -' procedure process_testcase_name is begin'||chr(10)|| -' page := ''3'';'||chr(10)|| -' item'; - -p:=p||'_names := ''P'' || page || ''_TEST_RUN_ID'';'||chr(10)|| -' item_values := :P6_TEST_RUN_ID;'||chr(10)|| -' :P6_TEST_RUN_ID_DISP := '''' || :P6_TEST_RUN_ID || '''';'||chr(10)|| -' select max(tot_interval_msecs) -- Need Group Function for NULL'||chr(10)|| -' into :P6_TOTAL_ELAPSED'||chr(10)|| -' from wt_testcase_stats'||chr(10)|| -' where test_run_id = :P6_TEST_RUN_ID'||chr(10)|| -' and testcase = :P6_TESTCASE_NAME;'||chr(10)|| -' end process_testcase_name;'||chr(10)|| -' --'||chr(10)|| -'begin'||chr(10)|| -' --'||chr(10)|| -' if :P6_GOTO_TCASE is NOT NULL'||chr(10)|| -' then'||chr(10)|| -' -- The LOV was triggered, so set Tes'; - -p:=p||'t Case and go.'||chr(10)|| -' :P6_TESTCASE_NAME := :P6_GOTO_TCASE;'||chr(10)|| -' :P6_GOTO_TCASE := NULL;'||chr(10)|| -' :P6_GOTO_RUN_ID := NULL;'||chr(10)|| -' process_testcase_name;'||chr(10)|| -' return; -- Done!'||chr(10)|| -' end if;'||chr(10)|| -' --'||chr(10)|| -' if :P6_GOTO_RUN_ID is NOT NULL'||chr(10)|| -' then'||chr(10)|| -' -- The LOV was triggered, Set Test Run.'||chr(10)|| -' :P6_TEST_RUN_ID := :P6_GOTO_RUN_ID;'||chr(10)|| -' :P6_GOTO_RUN_ID := NULL;'||chr(10)|| -' else'||chr(10)|| -' if '; - -p:=p||':P6_TEST_RUN_ID is NULL'||chr(10)|| -' then'||chr(10)|| -' -- Must have a Test Run ID'||chr(10)|| -' find_test_run_id;'||chr(10)|| -' end if;'||chr(10)|| -' end if;'||chr(10)|| -' -- Set (or Reset) the Test Run ID dependents'||chr(10)|| -' process_test_run_id;'||chr(10)|| -' --'||chr(10)|| -' if not check_testcase_name'||chr(10)|| -' then'||chr(10)|| -' -- Must set a Test Case'||chr(10)|| -' find_testcase_name;'||chr(10)|| -' end if;'||chr(10)|| -' -- Set (or Reset) the Test Case dependents.'||chr(10)|| -' process_testcase_name;'||chr(10)|| -' --'||chr(10)|| -'end;'; - -wwv_flow_api.create_page_process( - p_id => 4989127437323187 + wwv_flow_api.g_id_offset, - p_flow_id=> wwv_flow.g_flow_id, - p_flow_step_id => 6, - p_process_sequence=> 10, - p_process_point=> 'BEFORE_HEADER', - p_process_type=> 'PLSQL', - p_process_name=> 'Initialize Items', - p_process_sql_clob => p, - p_process_error_message=> '', - p_process_success_message=> '', - p_process_is_stateful_y_n=>'N', - p_process_comment=>''); -end; -null; - -end; -/ - - begin --------------------------------------- @@ -12276,7 +11432,7 @@ wwv_flow_api.create_page ( ,p_page_is_public_y_n => 'N' ,p_cache_page_yn => 'N' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180719205429' + ,p_last_upd_yyyymmddhh24miss => '20180828203310' ); null; @@ -12293,7 +11449,7 @@ wwv_flow_api.create_page_plug ( p_id=> 4845720626414921 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 101, - p_plug_name=> 'Login', + p_plug_name=> 'wtPLSQL - White Box Testing for Oracle''s PL/SQL', p_region_name=>'', p_plug_template=> 4839304121414912+ wwv_flow_api.g_id_offset, p_plug_display_sequence=> 10, @@ -12301,10 +11457,12 @@ wwv_flow_api.create_page_plug ( p_plug_display_point=> 'AFTER_SHOW_ITEMS', p_plug_source=> s, p_plug_source_type=> 'STATIC_TEXT', + p_translate_title=> 'Y', p_plug_query_row_template=> 1, p_plug_query_headings_type=> 'COLON_DELMITED_LIST', p_plug_query_row_count_max => 500, p_plug_display_condition_type => '', + p_plug_customized=>'0', p_plug_caching=> 'NOT_CACHED', p_plug_comment=> ''); end; @@ -12439,6 +11597,27 @@ end; / +begin + +wwv_flow_api.create_page_computation( + p_id=> 5113529438362167 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id=> 101, + p_computation_sequence => 30, + p_computation_item=> 'P0_DISPLAY', + p_computation_point=> 'BEFORE_HEADER', + p_computation_type=> 'STATIC_ASSIGNMENT', + p_computation_processed=> 'REPLACE_EXISTING', + p_computation=> 'N', + p_compute_when => '', + p_compute_when_type=>''); + +null; + +end; +/ + + begin declare @@ -12485,7 +11664,7 @@ p:=p||'wwv_flow_custom_auth_std.login('||chr(10)|| ' P_UNAME => :P101_USERNAME,'||chr(10)|| ' P_PASSWORD => :P101_PASSWORD,'||chr(10)|| ' P_SESSION_ID => v(''APP_SESSION''),'||chr(10)|| -' P_FLOW_PAGE => :APP_ID||'':3'''||chr(10)|| +' P_FLOW_PAGE => :APP_ID||'':1'''||chr(10)|| ' );'; wwv_flow_api.create_page_process( @@ -12537,6 +11716,37 @@ end; / +begin + +declare + p varchar2(32767) := null; + l_clob clob; + l_length number := 1; +begin +p:=p||'begin'||chr(10)|| +' :P0_TEST_OWNER := :APP_USER;'||chr(10)|| +'end;'; + +wwv_flow_api.create_page_process( + p_id => 5166510581225261 + wwv_flow_api.g_id_offset, + p_flow_id=> wwv_flow.g_flow_id, + p_flow_step_id => 101, + p_process_sequence=> 40, + p_process_point=> 'AFTER_SUBMIT', + p_process_type=> 'PLSQL', + p_process_name=> 'Set Test Owner', + p_process_sql_clob => p, + p_process_error_message=> '', + p_process_success_message=> '', + p_process_is_stateful_y_n=>'N', + p_process_comment=>''); +end; +null; + +end; +/ + + begin declare diff --git a/src/gui/install.sql b/src/gui/install.sql index ae88de7..7294425 100644 --- a/src/gui/install.sql +++ b/src/gui/install.sql @@ -9,7 +9,6 @@ grant select on dba_arguments to &schema_owner.; grant select on gv_$parameter to &schema_owner.; -- Install Views -@wt_test_runs_gui_tree.vw @wt_scheduler_jobs.vw -- Install APEX Application diff --git a/src/gui/wt_test_runs_gui_tree.vw b/src/gui/wt_test_runs_gui_tree.vw deleted file mode 100644 index 9aa6aa2..0000000 --- a/src/gui/wt_test_runs_gui_tree.vw +++ /dev/null @@ -1,52 +0,0 @@ - -create or replace view wt_test_runs_gui_tree as -with q_root as ( -select 0 ID - ,NULL PARENT_ID - ,'Text Runner IDs' TEXT - from dual -), q_owners as ( -select 0 - min(id) ID - ,0 PARENT_ID - ,runner_owner TEXT - ,runner_owner - from wt_test_runs - group by runner_owner -), q_runners as ( -select (select min(id) from q_owners) - - min(r.id) ID - ,o.id PARENT_ID - ,r.runner_name TEXT - ,r.runner_owner - ,r.runner_name - from wt_test_runs r - join q_owners o - on o.text = r.runner_owner - group by o.id - ,r.runner_name - ,r.runner_owner -), q_run_ids as ( -select i.id ID - ,r.id PARENT_ID - ,to_char(i.start_dtm,'YYYY/MM/DD HH24:MI:SS') - TEXT - ,i.runner_owner - ,i.runner_name - from wt_test_runs i - join q_runners r - on r.runner_owner = i.runner_owner - and r.runner_name = i.runner_name -), q_main as ( -select id, parent_id, text from q_root -union all -select id, parent_id, text from q_owners -union all -select id, parent_id, text from q_runners -union all -select id, parent_id, text from q_run_ids -) ---select * from q_root; ---select * from q_owners; ---select * from q_runners; ---select * from q_run_ids; -select * from q_main; From 2b78c286f67dd2127524dba407178da3ef94c2e1 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Mon, 3 Sep 2018 10:48:30 -0500 Subject: [PATCH 021/141] Small GUI Adjustments --- src/gui/f700.sql | 81 ++++++++++++++++++++++++------------------------ 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/src/gui/f700.sql b/src/gui/f700.sql index 23fba65..fc47bbd 100644 --- a/src/gui/f700.sql +++ b/src/gui/f700.sql @@ -13,7 +13,7 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Application Export: -- Application: 700 -- Name: wtPLSQL Core GUI --- Date and Time: 22:49 Saturday September 1, 2018 +-- Date and Time: 10:47 Monday September 3, 2018 -- Exported By: WTP -- Flashback: 0 -- Export Type: Application Export @@ -146,7 +146,7 @@ wwv_flow_api.create_flow( p_default_region_template=> 4840201642414912 + wwv_flow_api.g_id_offset, p_error_template=> 4837131094414910 + wwv_flow_api.g_id_offset, p_page_protection_enabled_y_n=> 'Y', - p_checksum_salt_last_reset => '20180901224934', + p_checksum_salt_last_reset => '20180903104721', p_max_session_length_sec=> 28800, p_home_link=> 'f?p=&APP_ID.:3:&SESSION.', p_flow_language=> 'en', @@ -192,7 +192,7 @@ wwv_flow_api.create_flow( p_default_listr_template => 4839116402414912 + wwv_flow_api.g_id_offset, p_default_irr_template => 4839831975414912 + wwv_flow_api.g_id_offset, p_last_updated_by => 'WTP', - p_last_upd_yyyymmddhh24miss=> '20180901224934', + p_last_upd_yyyymmddhh24miss=> '20180903104721', p_required_roles=> wwv_flow_utilities.string_to_table2('')); @@ -826,7 +826,7 @@ wwv_flow_api.create_page ( ,p_protection_level => 'N' ,p_cache_page_yn => 'N' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180830054130' + ,p_last_upd_yyyymmddhh24miss => '20180903100035' ); null; @@ -906,7 +906,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 210, + p_item_sequence=> 9, p_item_plug_id => 5109401519013442+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -914,22 +914,22 @@ wwv_flow_api.create_page_item( p_display_as=> 'NATIVE_HIDDEN', p_lov_display_null=> 'NO', p_lov_translated=> 'N', - p_cSize=> 10, - p_cMaxlength=> 4000, + p_cSize=> 1, + p_cMaxlength=> 1, p_cHeight=> 1, p_cAttributes=> 'nowrap="nowrap"', p_begin_on_new_line=> 'NO', p_begin_on_new_field=> 'YES', p_colspan=> 1, p_rowspan=> 1, - p_label_alignment=> 'LEFT', + p_label_alignment=> 'ABOVE', p_field_alignment=> 'LEFT', p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, p_is_persistent=> 'Y', p_lov_display_extra=>'YES', p_protection_level => 'N', p_escape_on_http_output => 'Y', - p_attribute_01 => 'N', + p_attribute_01 => 'Y', p_show_quick_picks=>'N', p_item_comment => 'This item is set by each page.'); @@ -948,11 +948,11 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 10, + p_item_sequence=> 1, p_item_plug_id => 5109401519013442+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Test Runner Owner', + p_prompt=>'Test Runner Owner:', p_source_type=> 'STATIC', p_display_as=> 'NATIVE_POPUP_LOV', p_lov=> 'select owner DISPLAY'||chr(10)|| @@ -967,13 +967,13 @@ wwv_flow_api.create_page_item( p_lov_translated=> 'N', p_lov_null_text=>'All Owners', p_lov_null_value=> '', - p_cSize=> 30, + p_cSize=> 128, p_cMaxlength=> 128, p_cHeight=> 1, p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'NO', + p_begin_on_new_line=> 'YES', p_begin_on_new_field=> 'YES', - p_colspan=> 1, + p_colspan=> 2, p_rowspan=> 1, p_label_alignment=> 'ABOVE', p_field_alignment=> 'LEFT-CENTER', @@ -1002,11 +1002,11 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 20, + p_item_sequence=> 2, p_item_plug_id => 5109401519013442+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Test Runner Name', + p_prompt=>'Test Runner Name:', p_source_type=> 'STATIC', p_display_as=> 'NATIVE_POPUP_LOV', p_lov=> 'select package_name DISPLAY'||chr(10)|| @@ -1022,13 +1022,13 @@ wwv_flow_api.create_page_item( p_lov_translated=> 'N', p_lov_null_text=>'', p_lov_null_value=> '', - p_cSize=> 30, + p_cSize=> 128, p_cMaxlength=> 128, p_cHeight=> 1, p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'NO', + p_begin_on_new_line=> 'YES', p_begin_on_new_field=> 'YES', - p_colspan=> 1, + p_colspan=> 2, p_rowspan=> 1, p_label_alignment=> 'ABOVE', p_field_alignment=> 'LEFT-CENTER', @@ -1057,11 +1057,11 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 30, + p_item_sequence=> 3, p_item_plug_id => 5109401519013442+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', - p_prompt=>'Test Run ID', + p_prompt=>'Test Run ID:', p_source_type=> 'STATIC', p_display_as=> 'NATIVE_POPUP_LOV', p_lov=> 'select id || '': '' ||'||chr(10)|| @@ -1079,7 +1079,7 @@ wwv_flow_api.create_page_item( p_cMaxlength=> 30, p_cHeight=> 1, p_cAttributes=> 'nowrap="nowrap"', - p_begin_on_new_line=> 'NO', + p_begin_on_new_line=> 'YES', p_begin_on_new_field=> 'YES', p_colspan=> 1, p_rowspan=> 1, @@ -1093,7 +1093,8 @@ wwv_flow_api.create_page_item( p_attribute_01 => 'NOT_ENTERABLE', p_attribute_02 => 'FIRST_ROWSET', p_show_quick_picks=>'N', - p_item_comment => 'This item is initialized by the "Initialize Items" process.'); + p_item_comment => 'This item is initialized by the "Initialize Items" process.'||chr(10)|| +'30 Width = 9 ID + 2 Separator + 19 Date/Time'); end; @@ -1110,7 +1111,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 40, + p_item_sequence=> 4, p_item_plug_id => 5109401519013442+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -1126,7 +1127,7 @@ wwv_flow_api.create_page_item( p_lov_translated=> 'N', p_lov_null_text=>'', p_lov_null_value=> '', - p_cSize=> 30, + p_cSize=> 50, p_cMaxlength=> 50, p_cHeight=> 1, p_cAttributes=> 'nowrap="nowrap"', @@ -1161,7 +1162,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 110, + p_item_sequence=> 6, p_item_plug_id => 5109401519013442+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -1169,8 +1170,8 @@ wwv_flow_api.create_page_item( p_display_as=> 'NATIVE_HIDDEN', p_lov_display_null=> 'NO', p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, + p_cSize=> 1, + p_cMaxlength=> 1, p_cHeight=> 1, p_cAttributes=> 'nowrap="nowrap"', p_begin_on_new_line=> 'NO', @@ -1203,7 +1204,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 120, + p_item_sequence=> 7, p_item_plug_id => 5109401519013442+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -1211,8 +1212,8 @@ wwv_flow_api.create_page_item( p_display_as=> 'NATIVE_HIDDEN', p_lov_display_null=> 'NO', p_lov_translated=> 'N', - p_cSize=> 30, - p_cMaxlength=> 4000, + p_cSize=> 1, + p_cMaxlength=> 1, p_cHeight=> 1, p_cAttributes=> 'nowrap="nowrap"', p_begin_on_new_line=> 'NO', @@ -1245,7 +1246,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 130, + p_item_sequence=> 8, p_item_plug_id => 5109401519013442+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -1253,8 +1254,8 @@ wwv_flow_api.create_page_item( p_display_as=> 'NATIVE_HIDDEN', p_lov_display_null=> 'NO', p_lov_translated=> 'N', - p_cSize=> 10, - p_cMaxlength=> 4000, + p_cSize=> 1, + p_cMaxlength=> 1, p_cHeight=> 1, p_cAttributes=> 'nowrap="nowrap"', p_begin_on_new_line=> 'NO', @@ -1287,7 +1288,7 @@ wwv_flow_api.create_page_item( p_data_type=> 'VARCHAR', p_is_required=> false, p_accept_processing=> 'REPLACE_EXISTING', - p_item_sequence=> 220, + p_item_sequence=> 5, p_item_plug_id => 5109401519013442+wwv_flow_api.g_id_offset, p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', @@ -1302,9 +1303,9 @@ wwv_flow_api.create_page_item( p_cAttributes=> 'nowrap="nowrap"', p_begin_on_new_line=> 'YES', p_begin_on_new_field=> 'YES', - p_colspan=> 1, + p_colspan=> 2, p_rowspan=> 1, - p_label_alignment=> 'RIGHT', + p_label_alignment=> 'ABOVE', p_field_alignment=> 'LEFT-CENTER', p_field_template=> 4843803724414915+wwv_flow_api.g_id_offset, p_is_persistent=> 'Y', @@ -1489,7 +1490,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180901112031' + ,p_last_upd_yyyymmddhh24miss => '20180903101502' ); null; @@ -3110,7 +3111,7 @@ s:=s||'select log_id'||chr(10)|| ' ,error_num'||chr(10)|| ' ,additional_info'||chr(10)|| ' from wt_scheduler_jobs'||chr(10)|| -' where status != ''SUCCEEDED'''||chr(10)|| +' where status not in (''SUCCEEDED'',''FAILED'')'||chr(10)|| ' and ( :P0_TEST_OWNER is null'||chr(10)|| ' or job_name like :P0_TEST_OWNER || ''$%'' )'; @@ -3118,7 +3119,7 @@ wwv_flow_api.create_report_region ( p_id=> 4868303731390297 + wwv_flow_api.g_id_offset, p_flow_id=> wwv_flow.g_flow_id, p_page_id=> 1, - p_name=> 'Selected Test Runner Jobs', + p_name=> 'Incomplete Test Runner Jobs', p_region_name=>'', p_template=> 4840201642414912+ wwv_flow_api.g_id_offset, p_display_sequence=> 51, From c7f76ad0359d0a9f609fe31fa4f367ad28b60aba Mon Sep 17 00:00:00 2001 From: DDieterich Date: Tue, 11 Sep 2018 04:40:09 -0500 Subject: [PATCH 022/141] Updates after Testing GUI and Oracle 12c --- docs/demo/README.md | 26 ++++ docs/gui/README.md | 12 ++ docs/gui/README.txt | 25 ++++ docs/gui/_config.yml | 1 + docs/gui/md-to-htm.bat | 9 ++ docs/gui/md-to-htm.lua | 7 + src/core/clear_last_run.prc | 6 +- src/core/common_setup.sql | 6 +- src/core/install.sql | 31 +++-- src/core/set_last_run.prc | 30 ++++ src/core/wt_assert.pkb | 2 +- src/core/wt_profiler.pkb | 47 ++++--- src/core/wt_profiler.pks | 1 + src/{gui => core}/wt_scheduler_jobs.vw | 2 - src/core/wt_test_runs.tab | 2 +- src/core/wt_text_report.pkb | 1 + src/core/wtplsql.pkb | 47 +++---- src/core/wtplsql_conversion.sql | 186 +++++++++++++++++++++++++ src/demo/common_setup.sql | 4 + src/demo/install.sql | 2 +- src/gui/Notes.txt | 9 +- src/gui/WTP_workspace.sql | 160 +++++++++++++++++++++ src/gui/f700.sql | 136 +++++++++--------- src/gui/install.sql | 13 +- 24 files changed, 610 insertions(+), 155 deletions(-) create mode 100644 docs/gui/README.md create mode 100644 docs/gui/README.txt create mode 100644 docs/gui/_config.yml create mode 100644 docs/gui/md-to-htm.bat create mode 100644 docs/gui/md-to-htm.lua create mode 100644 src/core/set_last_run.prc rename src/{gui => core}/wt_scheduler_jobs.vw (91%) create mode 100644 src/core/wtplsql_conversion.sql create mode 100644 src/gui/WTP_workspace.sql diff --git a/docs/demo/README.md b/docs/demo/README.md index 558ad0d..775a089 100644 --- a/docs/demo/README.md +++ b/docs/demo/README.md @@ -93,5 +93,31 @@ wtPLSQL was built with the utPLSQL "ut_assert" API. These examples were created * [ut_truncit](ut_truncit.md) - Test a Table Modification Procedure * [ut_str](ut_str.md) - Test a Simple Function +## Demo Installer +To save some typing, there is an installer for the demonstrations and examples. This installer will: +* Prompt for a schema name (WT_DEMO is the default). +* Confirm the database user is SYS or SYSTEM. +* Create the schema. +* Load database objects in the schema. + +To run this installer: +1. cd to "src/demo" +1. login as SYS or SYSTEM using SQL*Plus +1. Run the "install.sql" script + +To confirm a successful installation, review the newly created "install.LST" log file against the "installO.LST" example log file. + +## Demo Un-Install + +The "uninstall.sql" script provided in the "src/demo" directory drops the demo schema from the database, with cascade. + +To un-install: +1. cd to "src/demo" +1. login as SYS or SYSTEM using SQL*Plus +1. Run the "uninstall.sql" script + + +To confirm a successful un-install, review the "uninstall.LST" log file against the "uninstallO.LST" example log file. + --- [Website Home Page](../README.md) \ No newline at end of file diff --git a/docs/gui/README.md b/docs/gui/README.md new file mode 100644 index 0000000..b6aa088 --- /dev/null +++ b/docs/gui/README.md @@ -0,0 +1,12 @@ +[Website Home Page](../README.md) + +# wtPLSQL GUI + +--- + +PL/SQL development in the database is different from other + +All examples shown here use the WTP_DEMO demonstration as described in [Demonstrations and Examples Page](../demo/README.md). Use the "Demo Installer" at the bottom of the page to create a fresh install in a different schema. + +--- +[Website Home Page](../README.md) \ No newline at end of file diff --git a/docs/gui/README.txt b/docs/gui/README.txt new file mode 100644 index 0000000..f3f41aa --- /dev/null +++ b/docs/gui/README.txt @@ -0,0 +1,25 @@ + +Files and Directories + + +File Name Description +----------- ------------ +core Core Documentation Directory +demo Demonstration Documentation Directory +images Image Files referenced by MD and HTML +_config.yml YAML Configuration File for this Website +*.md Markdown files for "github.io" +*.htm HTML files for local documentation +md-to-htm.bat MS-Dos Batch File to convert MD to HTML +md-to-htm.lua Lua script used by Pandoc for MD to HTML + + +Local Documentation URL +----------------------- +file://README.htm +(or Double-click on the README.htm file) + + +NOTE: All HTML files are sourced from Markdown files. + Modify the Markdown files, then build HTML from the + Markdown files using "md-to-htm.bat". diff --git a/docs/gui/_config.yml b/docs/gui/_config.yml new file mode 100644 index 0000000..b849713 --- /dev/null +++ b/docs/gui/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-leap-day \ No newline at end of file diff --git a/docs/gui/md-to-htm.bat b/docs/gui/md-to-htm.bat new file mode 100644 index 0000000..5fc1093 --- /dev/null +++ b/docs/gui/md-to-htm.bat @@ -0,0 +1,9 @@ + +REM pandoc -f gfm -t html --lua-filter=md-to-htm.lua -o %1.htm %1.md + +for %%f in (*.md) do ( + REM echo %%~nf.htm + pandoc -f gfm -t html --lua-filter=md-to-htm.lua -o %%~nf.htm %%~nf.md + ) + +pause diff --git a/docs/gui/md-to-htm.lua b/docs/gui/md-to-htm.lua new file mode 100644 index 0000000..dbaa04e --- /dev/null +++ b/docs/gui/md-to-htm.lua @@ -0,0 +1,7 @@ +# md-to-htm.lua +-- Adapted from answer by JW https://stackoverflow.com/users/4321/jw +-- at https://stackoverflow.com/questions/40993488 +function Link(el) + el.target = string.gsub(el.target, "%.md", ".htm") + return el +end \ No newline at end of file diff --git a/src/core/clear_last_run.prc b/src/core/clear_last_run.prc index bc623bb..e154a79 100644 --- a/src/core/clear_last_run.prc +++ b/src/core/clear_last_run.prc @@ -6,9 +6,9 @@ create or replace procedure clear_last_run as -- This procedure is required to prevent granting UPDATE on -- WT_TEST_RUNS to PUBLIC. The WTPLSQL package must run - -- with calling user permissions. If this procedure is - -- run by mistake, it is a simple matter to correct the - -- IS_LAST_RUN flag. + -- with calling user permissions. Use the SET_LAST_RUN + -- procedure to set the IS_LAST_RUN flag after running + -- this procedure. begin update wt_test_runs set is_last_run = NULL diff --git a/src/core/common_setup.sql b/src/core/common_setup.sql index ff9afb4..95c1455 100644 --- a/src/core/common_setup.sql +++ b/src/core/common_setup.sql @@ -8,4 +8,8 @@ set define "&" set concat "." accept schema_owner CHAR default 'wtp' - -prompt 'Enter Schema Name (WTP): ' +prompt 'Enter Schema Name (wtp): ' + +prompt 'Connect String must be empty or start with @' +accept connect_string CHAR default 'wtp' - +prompt 'Enter Connect String (): ' diff --git a/src/core/install.sql b/src/core/install.sql index b03e8be..eaf5c66 100644 --- a/src/core/install.sql +++ b/src/core/install.sql @@ -2,7 +2,7 @@ -- -- Core Installation -- --- Run as System +-- Run as SYS -- -- Capture output @@ -16,7 +16,7 @@ set serveroutput on size unlimited format truncated WHENEVER SQLERROR exit SQL.SQLCODE begin - if USER not in ('SYS','SYSTEM') + if USER not in ('SYS') then raise_application_error (-20000, 'Not logged in as SYS'); @@ -33,17 +33,21 @@ create user &schema_owner. identified by &schema_owner. quota unlimited on users temporary tablespace temp; -grant create session to &schema_owner.; -grant create type to &schema_owner.; -grant create sequence to &schema_owner.; -grant create table to &schema_owner.; -grant create trigger to &schema_owner.; -grant create view to &schema_owner.; -grant create procedure to &schema_owner.; -grant select on dba_source to &schema_owner.; +grant create session to &schema_owner.; +grant create type to &schema_owner.; +grant create sequence to &schema_owner.; +grant create table to &schema_owner.; +grant create trigger to &schema_owner.; +grant create view to &schema_owner.; +grant create procedure to &schema_owner.; +grant create database link to &schema_owner.; +grant create job to &schema_owner.; -- This MUST be run by SYS. -grant select on dba_objects to &schema_owner.; +grant select on dba_objects to &schema_owner.; +grant select on dba_source to &schema_owner.; +grant select on dba_procedures to &schema_owner.; +grant select on sys.gv_$parameter to &schema_owner.; begin for buff in (select p.value PLSQL_CCFLAGS @@ -113,7 +117,7 @@ create or replace public synonym wtplsql for &schema_owner..wtplsql; WHENEVER SQLERROR exit SQL.SQLCODE -- Connect as SCHEMA_OWNER -connect &schema_owner./&schema_owner. +connect &schema_owner./&schema_owner.&connect_string. set serveroutput on size unlimited format truncated begin @@ -147,6 +151,9 @@ create index plsql_profiler_runs_idx1 @wt_testcase_stats.tab @wt_self_test.tab +-- Install Views +@wt_scheduler_jobs.vw + -- Package Specifications @wtplsql.pks / diff --git a/src/core/set_last_run.prc b/src/core/set_last_run.prc new file mode 100644 index 0000000..71b7c3c --- /dev/null +++ b/src/core/set_last_run.prc @@ -0,0 +1,30 @@ +create or replace procedure set_last_run + (in_runner_owner in varchar2 + ,in_runner_name in varchar2 + ,in_last_run_flag in varchar2) + authid definer +as + -- This procedure is required to prevent granting UPDATE on + -- WT_TEST_RUNS to PUBLIC. The WTPLSQL package must run + -- with calling user permissions. Use the CLEAR_LAST_RUN + -- procedure to clear the IS_LAST_RUN flag before running + -- this procedure. +begin + for buff in (select * from wt_test_runs + where runner_owner = in_runner_owner + and runner_name = in_runner_name + and is_last_run = in_last_run_flag ) + loop + -- Abort if a IS_LAST_RUN flag is already set + return; + end loop; + update wt_test_runs + set is_last_run = in_last_run_flag + where runner_owner = in_runner_owner + and runner_name = in_runner_name + and start_dtm = ( + select max(trn.start_dtm) + from wt_test_runs trn + where trn.runner_owner = in_runner_owner + and trn.runner_name = in_runner_name ); +end set_last_run; \ No newline at end of file diff --git a/src/core/wt_assert.pkb b/src/core/wt_assert.pkb index 30db4ac..aa3abfb 100644 --- a/src/core/wt_assert.pkb +++ b/src/core/wt_assert.pkb @@ -469,7 +469,7 @@ procedure this ( is begin g_rec.last_assert := 'THIS'; - g_rec.last_msg := msg_in; + g_rec.last_msg := substr(msg_in,1,200); g_rec.last_pass := nvl(check_this_in, FALSE); g_rec.last_details := 'Expected "TRUE" and got "' || boolean_to_status(check_this_in) || '"'; diff --git a/src/core/wt_profiler.pkb b/src/core/wt_profiler.pkb index 49a252c..b20b175 100644 --- a/src/core/wt_profiler.pkb +++ b/src/core/wt_profiler.pkb @@ -399,7 +399,8 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- ------------------------------------------------------------ procedure find_dbout - (in_pkg_name in varchar2) + (in_owner in varchar2 + ,in_pkg_name in varchar2) is -- -- https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements008.htm#SQLRF51129 @@ -448,8 +449,9 @@ is -- This cursor is used to catch the first occurance of a DBOUT annotation cursor c_annotation is select regexp_substr(src.text, C_HEAD_RE||C_MAIN_RE||C_TAIL_RE) TEXT - from user_source src - where src.name = in_pkg_name + from dba_source src + where src.owner = in_owner + and src.name = in_pkg_name and src.type = 'PACKAGE BODY' and regexp_like(src.text, C_HEAD_RE||C_MAIN_RE||C_TAIL_RE) order by src.line; @@ -493,21 +495,21 @@ begin l_cln_pos := instr(l_target,':'); begin with q_main as ( - select u.username OWNER + select obj.owner ,obj.object_name ,obj.object_type - from user_objects obj - cross join user_users u - where ( -- No separators were given, assume USER is the owner. - -- No object type was given. This could throw TOO_MANY_ROWS. - l_dot_pos = 0 - and l_cln_pos = 0 - and obj.object_name = l_target ) - OR ( -- No object owner was given, assume USER is the owner. - l_dot_pos = 0 - and l_cln_pos != 0 - and obj.object_name = substr(l_target, 1, l_cln_pos-1) - and obj.object_type = substr(l_target, l_cln_pos+1, 512) ) + from dba_objects obj + where obj.owner = in_owner + and ( ( -- No separators were given, assume USER is the owner. + -- No object type was given. This could throw TOO_MANY_ROWS. + l_dot_pos = 0 + and l_cln_pos = 0 + and obj.object_name = l_target ) + OR ( -- No object owner was given, assume USER is the owner. + l_dot_pos = 0 + and l_cln_pos != 0 + and obj.object_name = substr(l_target, 1, l_cln_pos-1) + and obj.object_type = substr(l_target, l_cln_pos+1, 512) ) ) UNION ALL select obj.owner ,obj.object_name @@ -572,16 +574,18 @@ $THEN l_recSAVE rec_type; l_recNULL rec_type; l_recTEST rec_type; + l_owner varchar2(128); l_pname varchar2(128) := 'WT_PROFILE_FIND_DBOUT'; -------------------------------------- WTPLSQL Testing -- procedure run_find_dbout is begin l_recSAVE := g_rec; g_rec := l_recNULL; - find_dbout(l_pname); + find_dbout(l_owner, l_pname); l_recTEST := g_rec; g_rec := l_recSAVE; end run_find_dbout; begin + select username into l_owner from user_users; -------------------------------------- WTPLSQL Testing -- wt_assert.g_testcase := 'Find DBOUT Setup'; tl_compile_db_object @@ -1299,6 +1303,7 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- ------------------------------------------------------------ procedure initialize (in_test_run_id in number, + in_runner_owner in varchar2, in_runner_name in varchar2, out_dbout_owner out varchar2, out_dbout_name out varchar2, @@ -1331,7 +1336,8 @@ begin end if; g_rec.test_run_id := in_test_run_id; -- Find the Database Object Under Test - find_dbout(in_pkg_name => in_runner_name); + find_dbout(in_owner => in_runner_owner + ,in_pkg_name => in_runner_name); out_dbout_owner := g_rec.dbout_owner; out_dbout_name := g_rec.dbout_name; out_dbout_type := g_rec.dbout_type; @@ -1376,12 +1382,14 @@ $THEN procedure t_initialize is c_test_run_id constant number := -96; + l_owner varchar2(128); l_pname varchar2(128) := 'WT_PROFILE_INITIALIZE'; l_recSAVE rec_type; l_recTEST rec_type; l_recOUT rec_type; l_sqlerrm varchar2(4000); begin + select username into l_owner from user_users; -------------------------------------- WTPLSQL Testing -- wt_assert.g_testcase := 'Insert DBOUT Profile Setup'; tl_compile_db_object @@ -1400,6 +1408,7 @@ $THEN l_recSAVE := g_rec; initialize (in_test_run_id => c_test_run_id, + in_runner_owner => l_owner, in_runner_name => l_pname, out_dbout_owner => l_recOUT.dbout_owner, out_dbout_name => l_recOUT.dbout_name, @@ -1465,6 +1474,7 @@ $THEN l_recSAVE := g_rec; initialize (in_test_run_id => c_test_run_id, + in_runner_owner => l_owner, in_runner_name => l_pname, out_dbout_owner => l_recOUT.dbout_owner, out_dbout_name => l_recOUT.dbout_name, @@ -1530,6 +1540,7 @@ $THEN begin initialize (in_test_run_id => null, + in_runner_owner => l_owner, in_runner_name => 'Sad Path 1', out_dbout_owner => l_recOUT.dbout_owner, out_dbout_name => l_recOUT.dbout_name, diff --git a/src/core/wt_profiler.pks b/src/core/wt_profiler.pks index 4c6f83e..dd8078b 100644 --- a/src/core/wt_profiler.pks +++ b/src/core/wt_profiler.pks @@ -3,6 +3,7 @@ as procedure initialize (in_test_run_id in number, + in_runner_owner in varchar2, in_runner_name in varchar2, out_dbout_owner out varchar2, out_dbout_name out varchar2, diff --git a/src/gui/wt_scheduler_jobs.vw b/src/core/wt_scheduler_jobs.vw similarity index 91% rename from src/gui/wt_scheduler_jobs.vw rename to src/core/wt_scheduler_jobs.vw index 263d61e..4de3ac7 100644 --- a/src/gui/wt_scheduler_jobs.vw +++ b/src/core/wt_scheduler_jobs.vw @@ -21,5 +21,3 @@ select log_id ,error# ERROR_NUM ,additional_info from user_scheduler_job_run_details; - -select owner from apex_applications where application_id = 700; diff --git a/src/core/wt_test_runs.tab b/src/core/wt_test_runs.tab index 863c2b8..4b21888 100644 --- a/src/core/wt_test_runs.tab +++ b/src/core/wt_test_runs.tab @@ -12,7 +12,7 @@ create table wt_test_runs (id number(38) constraint wt_test_runs_nn1 not null ,start_dtm timestamp constraint wt_test_runs_nn2 not null ,runner_owner varchar2(128) constraint wt_test_runs_nn3 not null - ,runner_name varchar2(128) constraint wt_test_runs_nn3 not null + ,runner_name varchar2(128) constraint wt_test_runs_nn4 not null ,is_last_run varchar2(1) ,dbout_owner varchar2(128) ,dbout_name varchar2(128) diff --git a/src/core/wt_text_report.pkb b/src/core/wt_text_report.pkb index 24fc5b8..5651327 100644 --- a/src/core/wt_text_report.pkb +++ b/src/core/wt_text_report.pkb @@ -302,6 +302,7 @@ is begin for buff in ( + -- MAX(t2.start_dtm) is a fail-safe if IS_LAST_RUN is not set. select * from wt_test_runs where ( runner_name, start_dtm) in (select t2.runner_name, max(t2.start_dtm) diff --git a/src/core/wtplsql.pkb b/src/core/wtplsql.pkb index 2927868..47b1672 100644 --- a/src/core/wtplsql.pkb +++ b/src/core/wtplsql.pkb @@ -32,20 +32,19 @@ begin end if; -- Check for Valid Runner Name select count(*) into l_package_check - from user_arguments - where object_name = 'WTPLSQL_RUN' - and package_name = g_test_runs_rec.runner_name - and argument_name is null - and position = 1 - and sequence = 0; + from user_procedures + where procedure_name = 'WTPLSQL_RUN' + and object_name = g_test_runs_rec.runner_name + and object_type = 'PACKAGE'; if l_package_check != 1 then - raise_application_error (-20002, 'RUNNER_NAME "' || + raise_application_error (-20002, 'RUNNER_NAME Procedure "' || g_test_runs_rec.runner_name || '.WTPLSQL_RUN" is not valid'); end if; end check_runner; + $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN procedure t_check_runner @@ -268,6 +267,7 @@ begin wt_test_run_stat.initialize; wt_result.initialize(g_test_runs_rec.id); wt_profiler.initialize(in_test_run_id => g_test_runs_rec.id, + in_runner_owner => g_test_runs_rec.runner_owner, in_runner_name => g_test_runs_rec.runner_name, out_dbout_owner => g_test_runs_rec.dbout_owner, out_dbout_name => g_test_runs_rec.dbout_name, @@ -330,21 +330,13 @@ is TYPE runners_nt_type is table of varchar2(128); l_runners_nt runners_nt_type; begin - select package_name + select object_name bulk collect into l_runners_nt - from user_arguments t1 - where object_name = 'WTPLSQL_RUN' - and position = 1 - and sequence = 0 - and data_type is null - and not exists ( - select 'x' from user_arguments t2 - where t2.object_name = t1.object_name - and t2.position > t1.position - and t2.sequence > t1.sequence - and ( t2.overload is null - OR t2.overload = t1.overload) - ); + from user_procedures t1 + where procedure_name = 'WTPLSQL_RUN' + and object_type = 'PACKAGE' + group by object_name + order by object_name; for i in 1 .. l_runners_nt.COUNT loop test_run(l_runners_nt(i)); @@ -392,16 +384,9 @@ begin delete from wt_test_runs where id = in_test_run_id; -- - update wt_test_runs - set is_last_run = IS_LAST_RUN_FLAG - where runner_owner = r_owner - and runner_name = r_name - and start_dtm = ( - select max(trn.start_dtm) - from wt_test_runs trn - where trn.runner_owner = r_owner - and trn.runner_name = r_name ) - and is_last_run != IS_LAST_RUN_FLAG; + set_last_run(in_runner_owner => r_owner + ,in_runner_name => r_name + ,in_last_run_flag => IS_LAST_RUN_FLAG); -- exception when NO_DATA_FOUND then diff --git a/src/core/wtplsql_conversion.sql b/src/core/wtplsql_conversion.sql new file mode 100644 index 0000000..9403482 --- /dev/null +++ b/src/core/wtplsql_conversion.sql @@ -0,0 +1,186 @@ +declare + invalid_sql_statment EXCEPTION; + PRAGMA EXCEPTION_INIT(invalid_sql_statment, -900); + src_clob CLOB; + tmp_clob CLOB; + end_ptr number; + end_str varchar2(32767); + -- Big Put Line, because DBMS_OUTPUT.PUT_LINE can't + procedure big_put_line + is + max_len number := 32767; -- Max Line Length + ptr number := 1; -- Current Position in IN_TXT + oset number; -- Offset from PTR to a LF + safety number := 1; -- Number of iterations + begin + while length(substr(src_clob, ptr)) > max_len + loop + -- Try to find a Line Feed at the sweet spot + oset := instr(substr(src_clob, ptr, max_len),CHR(10),-1); + --dbms_output.put_line('safety: ' || safety || + -- ', ptr: ' || ptr || + -- ', oset: ' || oset ); + if oset <= 0 + then + raise_application_error(-20000, 'Unknown OSET returned from INSTR: ' || OSET); + end if; + -- Output the next segment and move ptr + dbms_output.put_line(substr(src_clob, ptr, oset-1)); + ptr := ptr + oset; + safety := safety + 1; + if safety >= 100000 + then + raise_application_error(-20000, 'Safety exceeded '); + end if; + end loop; + dbms_output.put_line(substr(src_clob, ptr)); + dbms_output.put_line('/' || CHR(10) || '----------'); + end big_put_line; + function find_end_ptr (in_type in varchar2) + return number + is + orig_end_ptr number; + new_end_ptr number; + old1_end_ptr number; + old2_end_ptr number; + begin_ptr number; + begin + orig_end_ptr := 17; -- "CREATE PROCEDURE " is 17 characters + new_end_ptr := orig_end_ptr; + old1_end_ptr := orig_end_ptr + 1; + -- Adjust for smaller source + while new_end_ptr > 0 + loop + old2_end_ptr := old1_end_ptr; + old1_end_ptr := new_end_ptr + 1; + new_end_ptr := regexp_instr(tmp_clob -- Source Char + ,'[[:space:]]' || -- Find a space character (includes LF), + 'end' || -- followed by the string "end", + '[^;]*' || -- followed by zero or more non-semi-colon characters, + '[;]' -- followed by a semi-colon. + ,old1_end_ptr -- Position + ,1 -- Occurrence + ,0 -- Return Option + ,'i' -- Match Parameter + ,0 -- Sub Expr + ); + end loop; + if old2_end_ptr > orig_end_ptr + 1 + and in_type = 'PACKAGE BODY' + then + -- A package body with a possible "initialization part" + begin_ptr := regexp_instr(tmp_clob -- Source Char + ,'[[:space:]]' || -- Find a space character (includes LF), + 'begin' || -- followed by the string "begin", + '[[:space:]]' -- followed by a space character (includes LF), + ,old2_end_ptr -- Position + ,1 -- Occurrence + ,0 -- Return Option + ,'i' -- Match Parameter + ,0 -- Sub Expr + ); + else + begin_ptr := 0; + end if; + if begin_ptr > 0 + then + -- Found an initialization part, start before it + return begin_ptr; + else + -- No initialization part, start before the last END + return old1_end_ptr; + end if; + end find_end_ptr; + function get_procedures + (in_owner in varchar2 + ,in_name in varchar2) + return varchar2 + is + ret_str varchar2(32767); + add_teardown boolean; + begin + for proc_buff in ( + select procedure_name + from dba_procedures + where owner = in_owner + and object_name = in_name + and object_type = 'PACKAGE' + and procedure_name is not null + and procedure_name like 'ZTST\_%' escape '\' + order by procedure_name ) + loop + case proc_buff.procedure_name + when 'ZTST_SETUP' + then + ret_str := ' ' || proc_buff.procedure_name || + ';' || CHR(10) || ret_str; + when 'ZTST_TEARDOWN' + then + add_teardown := TRUE; + else + ret_str := ret_str || + ' ' || proc_buff.procedure_name || + ';' || CHR(10); + end case; + end loop; + if add_teardown + then + ret_str := ret_str || ' ZTST_TEARDOWN;' || CHR(10); + end if; + return ret_str; + end get_procedures; +begin + for obj_rec in ( + select object_type, owner, object_name + from dba_objects obj + where object_name like 'ZTST\_%' escape '\' + and object_name not like '%\_DATA' escape '\' + and object_type in ('PACKAGE', 'PACKAGE BODY') + and owner = :SCHEMA_NAME + and owner not in ('SYS','UTP') + and not exists (select 'x' from dba_source src + where src.owner = obj.owner + and src.name = obj.object_name + and src.type = obj.object_type + and regexp_like(src.text, 'wtplsql_run', 'i') ) + order by object_type desc, owner, object_name ) + -- Package Bodies before Package Specifications + loop + src_clob := dbms_metadata.get_ddl(object_type => case obj_rec.object_type + when 'PACKAGE' then 'PACKAGE_SPEC' + when 'PACKAGE BODY' then 'PACKAGE_BODY' + else obj_rec.object_type + end + ,name => obj_rec.object_name + ,schema => obj_rec.owner); + tmp_clob := regexp_replace(src_clob, '\r$', ''); + end_ptr := find_end_ptr(obj_rec.object_type); + end_str := substr(tmp_clob, end_ptr); + case obj_rec.object_type + when 'PACKAGE' + then + src_clob := substr(tmp_clob, 1, end_ptr-1) || CHR(10) || + ' procedure wtplsql_run;' || CHR(10) || CHR(10) || + end_str; + when 'PACKAGE BODY' + then + src_clob := substr(tmp_clob, 1, end_ptr-1) || CHR(10) || + 'procedure wtplsql_run is begin' || CHR(10) || + get_procedures(obj_rec.owner, obj_rec.object_name) || + 'end wtplsql_run;' || CHR(10) || CHR(10) || + end_str; + else + raise_application_error(-20000, 'Unknown Object Type: ' || obj_rec.object_type); + end case; + dbms_output.put_line('Compiling ' || obj_rec.object_type || + ' ' || obj_rec.owner || + '.' || obj_rec.object_name ); + begin + execute immediate src_clob; + exception when invalid_sql_statment + then + big_put_line; + end; + end loop; +end; +/ diff --git a/src/demo/common_setup.sql b/src/demo/common_setup.sql index d567441..876d52a 100644 --- a/src/demo/common_setup.sql +++ b/src/demo/common_setup.sql @@ -9,3 +9,7 @@ set concat "." accept schema_owner CHAR default 'wtp_demo' - prompt 'Enter Schema Name (WTP_DEMO): ' + +prompt 'Connect String must be empty or start with @' +accept connect_string CHAR default 'wtp' - +prompt 'Enter Connect String (): ' diff --git a/src/demo/install.sql b/src/demo/install.sql index bd97e5d..e1ddf6b 100644 --- a/src/demo/install.sql +++ b/src/demo/install.sql @@ -59,7 +59,7 @@ WHENEVER SQLERROR exit SQL.SQLCODE -- Connect as SCHEMA_OWNER ---------------------------------------- -connect &schema_owner./&schema_owner. +connect &schema_owner./&schema_owner.&connect_string. set serveroutput on size unlimited format truncated begin diff --git a/src/gui/Notes.txt b/src/gui/Notes.txt index eb3dd15..40e0dcf 100644 --- a/src/gui/Notes.txt +++ b/src/gui/Notes.txt @@ -1,9 +1,9 @@ Gui Demo - 1) GUI Installation - 2) Demo Installation - 3) Demo Review + 1) Demo Installation + 2) Demo Review ??? + 3) GUI Installation 4) Setup DB Link and Job Queue Process Parameter 5) Run Demo Test (w/ Test Case, No DBOUT) 6) Review Test Run @@ -13,3 +13,6 @@ Gui Demo 10) Search DBOUT 11) Run Test All 10) Dashboard + +A Relational Alternative to JUnit Testing +White Box Testing for PLSQL diff --git a/src/gui/WTP_workspace.sql b/src/gui/WTP_workspace.sql new file mode 100644 index 0000000..7d0ed16 --- /dev/null +++ b/src/gui/WTP_workspace.sql @@ -0,0 +1,160 @@ +set define off +set verify off +set serveroutput on size 1000000 +set feedback off +WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK +begin wwv_flow.g_import_in_progress := true; end; +/ + +-- AAAA PPPPP EEEEEE XX XX +-- AA AA PP PP EE XX XX +-- AA AA PP PP EE XX XX +-- AAAAAAAAAA PPPPP EEEE XXXX +-- AA AA PP EE XX XX +-- AA AA PP EE XX XX +-- AA AA PP EEEEEE XX XX +begin +select value into wwv_flow_api.g_nls_numeric_chars from nls_session_parameters where parameter='NLS_NUMERIC_CHARACTERS'; +execute immediate 'alter session set nls_numeric_characters=''.,'''; +end; +/ +-- Workspace, user group, user and team development export +-- Generated 2018.09.11 04:08:29 by ADMIN +-- This script can be run in sqlplus as the owner of the Oracle Apex owner. +begin + wwv_flow_api.set_security_group_id(p_security_group_id=>4779017982861389); +end; +/ +---------------- +-- W O R K S P A C E +-- Creating a workspace will not create database schemas or objects. +-- This API creates only the meta data for this APEX workspace +prompt Creating workspace WTP... +begin +wwv_flow_fnd_user_api.create_company ( + p_id => 4779103101861408, + p_provisioning_company_id => 4779017982861389, + p_short_name => 'WTP', + p_first_schema_provisioned => 'WTP', + p_company_schemas => 'WTP', + p_expire_fnd_user_accounts => '', + p_account_lifetime_days => '', + p_fnd_user_max_login_failures => '', + p_allow_plsql_editing => 'Y', + p_allow_app_building_yn => 'Y', + p_allow_sql_workshop_yn => 'Y', + p_allow_websheet_dev_yn => 'Y', + p_allow_team_development_yn => 'Y', + p_allow_to_be_purged_yn => 'Y', + p_source_identifier => 'WTP', + p_builder_notification_message => ''); +end; +/ +---------------- +-- G R O U P S +-- +prompt Creating Groups... +---------------- +-- U S E R S +-- User repository for use with apex cookie based authenticaion. +-- +prompt Creating Users... +begin +wwv_flow_fnd_user_api.create_fnd_user ( + p_user_id => '4778909006861389', + p_user_name => 'WTP', + p_first_name => '', + p_last_name => '', + p_description => '', + p_email_address=> '', + p_web_password => '3EA63A6A974BFB0A243AA4FD397AF841', + p_web_password_format => 'HEX_ENCODED_DIGEST_V2', + p_group_ids => '', + p_developer_privs=> 'ADMIN:CREATE:DATA_LOADER:EDIT:HELP:MONITOR:SQL', + p_default_schema=> 'WTP', + p_account_locked=> 'N', + p_account_expiry=> to_date('201808180910','YYYYMMDDHH24MI'), + p_failed_access_attempts=> 0, + p_change_password_on_first_use=> 'N', + p_first_password_use_occurred=> 'Y', + p_allow_app_building_yn=> 'Y', + p_allow_sql_workshop_yn=> 'Y', + p_allow_websheet_dev_yn=> 'Y', + p_allow_team_development_yn=> 'Y', + p_allow_access_to_schemas => ''); +end; +/ +prompt Check Compatibility... +begin +-- This date identifies the minimum version required to import this file. +wwv_flow_team_api.check_version(p_version_yyyy_mm_dd=>'2010.05.13'); +end; +/ + +begin wwv_flow.g_import_in_progress := true; wwv_flow.g_user := USER; end; +/ + +-- +prompt ...news +-- +begin +null; +end; +/ +-- +prompt ...links +-- +begin +null; +end; +/ +-- +prompt ...bugs +-- +begin +null; +end; +/ +-- +prompt ...events +-- +begin +null; +end; +/ +-- +prompt ...features +-- +begin +null; +end; +/ +-- +prompt ...tasks +-- +begin +null; +end; +/ +-- +prompt ...feedback +-- +begin +null; +end; +/ +-- +prompt ...task defaults +-- +begin +null; +end; +/ +commit; +begin +execute immediate 'begin dbms_session.set_nls( param => ''NLS_NUMERIC_CHARACTERS'', value => '''''''' || replace(wwv_flow_api.g_nls_numeric_chars,'''''''','''''''''''') || ''''''''); end;'; +end; +/ +set verify on +set feedback on +prompt ...done diff --git a/src/gui/f700.sql b/src/gui/f700.sql index fc47bbd..70ca8f1 100644 --- a/src/gui/f700.sql +++ b/src/gui/f700.sql @@ -13,7 +13,7 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Application Export: -- Application: 700 -- Name: wtPLSQL Core GUI --- Date and Time: 10:47 Monday September 3, 2018 +-- Date and Time: 04:31 Tuesday September 11, 2018 -- Exported By: WTP -- Flashback: 0 -- Export Type: Application Export @@ -146,7 +146,7 @@ wwv_flow_api.create_flow( p_default_region_template=> 4840201642414912 + wwv_flow_api.g_id_offset, p_error_template=> 4837131094414910 + wwv_flow_api.g_id_offset, p_page_protection_enabled_y_n=> 'Y', - p_checksum_salt_last_reset => '20180903104721', + p_checksum_salt_last_reset => '20180911043155', p_max_session_length_sec=> 28800, p_home_link=> 'f?p=&APP_ID.:3:&SESSION.', p_flow_language=> 'en', @@ -192,7 +192,7 @@ wwv_flow_api.create_flow( p_default_listr_template => 4839116402414912 + wwv_flow_api.g_id_offset, p_default_irr_template => 4839831975414912 + wwv_flow_api.g_id_offset, p_last_updated_by => 'WTP', - p_last_upd_yyyymmddhh24miss=> '20180903104721', + p_last_upd_yyyymmddhh24miss=> '20180911043155', p_required_roles=> wwv_flow_utilities.string_to_table2('')); @@ -826,7 +826,7 @@ wwv_flow_api.create_page ( ,p_protection_level => 'N' ,p_cache_page_yn => 'N' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180903100035' + ,p_last_upd_yyyymmddhh24miss => '20180911033245' ); null; @@ -957,12 +957,11 @@ wwv_flow_api.create_page_item( p_display_as=> 'NATIVE_POPUP_LOV', p_lov=> 'select owner DISPLAY'||chr(10)|| ' ,owner RETURN'||chr(10)|| -' from dba_arguments'||chr(10)|| -' where object_name = ''WTPLSQL_RUN'''||chr(10)|| -' and argument_name is null'||chr(10)|| -' and position = 1'||chr(10)|| -' and sequence = 0'||chr(10)|| -' group by owner', +' from dba_procedures'||chr(10)|| +' where procedure_name = ''WTPLSQL_RUN'''||chr(10)|| +' and object_type = ''PACKAGE'''||chr(10)|| +' group by owner'||chr(10)|| +' order by owner', p_lov_display_null=> 'YES', p_lov_translated=> 'N', p_lov_null_text=>'All Owners', @@ -1009,15 +1008,14 @@ wwv_flow_api.create_page_item( p_prompt=>'Test Runner Name:', p_source_type=> 'STATIC', p_display_as=> 'NATIVE_POPUP_LOV', - p_lov=> 'select package_name DISPLAY'||chr(10)|| -' ,package_name RETURN'||chr(10)|| -' from dba_arguments'||chr(10)|| -' where owner = :P0_TEST_OWNER'||chr(10)|| -' and object_name = ''WTPLSQL_RUN'''||chr(10)|| -' and argument_name is null'||chr(10)|| -' and position = 1'||chr(10)|| -' and sequence = 0'||chr(10)|| -' order by package_name', + p_lov=> 'select object_name DISPLAY'||chr(10)|| +' ,object_name RETURN'||chr(10)|| +' from dba_procedures'||chr(10)|| +' where owner = :P0_TEST_OWNER'||chr(10)|| +' and procedure_name = ''WTPLSQL_RUN'''||chr(10)|| +' and object_type = ''PACKAGE'''||chr(10)|| +' group by object_name'||chr(10)|| +' order by object_name', p_lov_display_null=> 'YES', p_lov_translated=> 'N', p_lov_null_text=>'', @@ -3710,7 +3708,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180901224458' + ,p_last_upd_yyyymmddhh24miss => '20180911042355' ); null; @@ -4345,7 +4343,7 @@ declare l_clob clob; l_length number := 1; begin -s:=s||'select arg.owner TEST_RUNNER_OWNER'||chr(10)|| +s:=s||'select proc.owner TEST_RUNNER_OWNER'||chr(10)|| ' ,dbl.db_link'||chr(10)|| ' ,dbl.username'||chr(10)|| ' ,dbl.host'||chr(10)|| @@ -4356,30 +4354,27 @@ s:=s||'select arg.owner TEST_RUNNER_OWNER'||chr(10)|| ' when dbl.host is null'||chr(10)|| ' then'||chr(10)|| ' ''Host value missing'''||chr(10)|| -' when dbl.db_link != dbl'; +' when dbl.db_link || ''.'; -s:=s||'.username'||chr(10)|| +s:=s||''' not like dbl.username || ''.%'''||chr(10)|| ' then'||chr(10)|| ' ''DB Link != Username'''||chr(10)|| ' else'||chr(10)|| ' ''Good Link'''||chr(10)|| ' end LINK_STATUS'||chr(10)|| -' from dba_arguments arg'||chr(10)|| +' from dba_procedures proc'||chr(10)|| ' left join user_db_links dbl'||chr(10)|| -' on dbl.db_link = arg.owner'||chr(10)|| -' or dbl.username = arg.owner'||chr(10)|| -' where object_name = ''WTPLSQL_RUN'''||chr(10)|| -' and argume'; - -s:=s||'nt_name is null'||chr(10)|| -' and position = 1'||chr(10)|| -' and sequence = 0'||chr(10)|| -' group by arg.owner'||chr(10)|| +' on dbl.db_link = proc.owner'||chr(10)|| +' or dbl.username = proc.owner'||chr(10)|| +' where procedure_name = '; + +s:=s||'''WTPLSQL_RUN'''||chr(10)|| +' and object_type = ''PACKAGE'''||chr(10)|| +' group by proc.owner'||chr(10)|| ' ,dbl.db_link'||chr(10)|| ' ,dbl.username'||chr(10)|| ' ,dbl.host'||chr(10)|| -' ,dbl.created'||chr(10)|| -''; +' ,dbl.created'; wwv_flow_api.create_report_region ( p_id=> 5180621438298420 + wwv_flow_api.g_id_offset, @@ -4851,7 +4846,7 @@ wwv_flow_api.create_page_item( p_use_cache_before_default=> 'YES', p_item_default_type=> 'STATIC_TEXT_WITH_SUBSTITUTIONS', p_prompt=>'New DB Link Host:', - p_source=>'''//localhost:1521/'' || SYS_CONTEXT(''USERENV'',''DB_NAME'')', + p_source=>'''//localhost:1521/'' || SYS_CONTEXT(''USERENV'',''SERVICE_NAME'')', p_source_type=> 'FUNCTION', p_display_as=> 'NATIVE_TEXT_FIELD', p_lov_display_null=> 'NO', @@ -5063,7 +5058,8 @@ wwv_flow_api.create_page_computation( p_computation_processed=> 'REPLACE_EXISTING', p_computation=> 'select host'||chr(10)|| ' from user_db_links'||chr(10)|| -' where db_link = :P0_TEST_OWNER', +' where db_link || ''.'' like :P0_TEST_OWNER || ''.%'''||chr(10)|| +'', p_compute_when => '', p_compute_when_type=>''); @@ -5171,29 +5167,28 @@ p:=p||'DECLARE'||chr(10)|| 'BEGIN'||chr(10)|| ' -- String all the "Test Alls" into one PL/SQL Block'||chr(10)|| ' for buff in ('||chr(10)|| -' select arg.owner TEST_OWNER'||chr(10)|| -' from dba_arguments arg'||chr(10)|| +' select proc.owner TEST_OWNER'||chr(10)|| +' from dba_procedures proc'||chr(10)|| ' join user_db_links dbl'||chr(10)|| -' on dbl.db_link = arg.owner'||chr(10)|| -' and dbl.db_link = dbl.username'||chr(10)|| +' on dbl.db_link = proc.owner'||chr(10)|| +' and dbl.db_link || ''.'' like dbl.username || ''.%'''||chr(10)|| ' and dbl.username is not null'||chr(10)|| -' and dbl.'; - -p:=p||'host is not null'||chr(10)|| -' where object_name = ''WTPLSQL_RUN'''||chr(10)|| -' and argument_name is null'||chr(10)|| -' and position = 1'||chr(10)|| -' and sequence = 0'||chr(10)|| -' group by arg.owner )'||chr(10)|| +' '; + +p:=p||' and dbl.host is not null'||chr(10)|| +' where proc.procedure_name = ''WTPLSQL_RUN'''||chr(10)|| +' and proc.object_type = ''PACKAGE'''||chr(10)|| +' group by proc.owner'||chr(10)|| +' order by proc.owner )'||chr(10)|| ' loop'||chr(10)|| ' run_str := run_str || ''wtplsql.test_all@'' || buff.TEST_OWNER || '';'' || CHR(10);'||chr(10)|| ' end loop;'||chr(10)|| ' -- Create 1 Scheduler Job'||chr(10)|| ' DBMS_SCHEDULER.CREATE_JOB'||chr(10)|| ' (job_name => ''TEST_ALL_SEQ'''||chr(10)|| -' ,j'; +' '; -p:=p||'ob_type => ''PLSQL_BLOCK'''||chr(10)|| +p:=p||' ,job_type => ''PLSQL_BLOCK'''||chr(10)|| ' ,job_action => ''begin'' || CHR(10) || run_str || ''commit;'' || CHR(10) || ''end;'''||chr(10)|| ' ,comments => ''Sequential Tests for All Owners'''||chr(10)|| ' ,enabled => TRUE);'||chr(10)|| @@ -5233,29 +5228,27 @@ p:=p||'DECLARE'||chr(10)|| ' run_str varchar2(32000);'||chr(10)|| 'BEGIN'||chr(10)|| ' for buff in ('||chr(10)|| -' select arg.owner TEST_OWNER'||chr(10)|| -' from dba_arguments arg'||chr(10)|| +' select proc.owner TEST_OWNER'||chr(10)|| +' from dba_procedures proc'||chr(10)|| ' join user_db_links dbl'||chr(10)|| -' on dbl.db_link = arg.owner'||chr(10)|| -' and dbl.db_link = dbl.username'||chr(10)|| +' on dbl.db_link || ''.'' like proc.owner || ''.%'''||chr(10)|| +' and dbl.db_link || ''.'' like dbl.username || ''.%'''||chr(10)|| ' and dbl.username is not null'||chr(10)|| -' and dbl.host is not null'||chr(10)|| -' where object_name = ''WTPL'; - -p:=p||'SQL_RUN'''||chr(10)|| -' and argument_name is null'||chr(10)|| -' and position = 1'||chr(10)|| -' and sequence = 0'||chr(10)|| -' group by arg.owner )'||chr(10)|| +' and dbl.host is not'; + +p:=p||' null'||chr(10)|| +' where proc.procedure_name = ''WTPLSQL_RUN'''||chr(10)|| +' and proc.object_type = ''PACKAGE'''||chr(10)|| +' group by proc.owner )'||chr(10)|| ' loop'||chr(10)|| ' -- Create a Scheduler Job for each Test Owner'||chr(10)|| ' run_str := ''wtplsql.test_all@'' || buff.TEST_OWNER;'||chr(10)|| ' DBMS_SCHEDULER.CREATE_JOB'||chr(10)|| ' (job_name => substr(buff.TEST_OWNER || ''$PAR$TEST$ALL'', 1, 30)'||chr(10)|| ' ,job_type => ''PLSQL_BLOCK'''||chr(10)|| -' '; +' '; -p:=p||' ,job_action => ''begin '' || run_str || ''; commit; end;'''||chr(10)|| +p:=p||' ,job_action => ''begin '' || run_str || ''; commit; end;'''||chr(10)|| ' ,comments => buff.TEST_OWNER || '': Parallel Tests for All Owners'''||chr(10)|| ' ,enabled => TRUE);'||chr(10)|| ' end loop;'||chr(10)|| @@ -5294,7 +5287,7 @@ begin p:=p||'begin'||chr(10)|| ' --'||chr(10)|| ' begin'||chr(10)|| -' execute immediate ''drop database link '' || :APP_USER;'||chr(10)|| +' execute immediate ''drop database link '' || :P0_TEST_OWNER;'||chr(10)|| ' exception when OTHERS then'||chr(10)|| ' if SQLERRM = ''ORA-02024: database link not found'''||chr(10)|| ' then'||chr(10)|| @@ -5304,10 +5297,10 @@ p:=p||'begin'||chr(10)|| ' end if;'||chr(10)|| ' end;'||chr(10)|| ' --'||chr(10)|| -' execute immediate ''create database link '' || :APP_USER ||'||chr(10)|| -' '' connect to '' || :APP_USER '; +' execute immediate ''create database link '' || :P0_TEST_OWNER ||'||chr(10)|| +' '' connect to '' || :P0_TE'; -p:=p||' ||'||chr(10)|| +p:=p||'ST_OWNER ||'||chr(10)|| ' '' identified by '' || :P2_PASSWORD ||'||chr(10)|| ' '' using '''''' || :P2_NEW_DB_LINK_HOST || '''''''';'||chr(10)|| 'end;'; @@ -5378,7 +5371,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180901163029' + ,p_last_upd_yyyymmddhh24miss => '20180911035321' ); null; @@ -8015,7 +8008,8 @@ wwv_flow_api.create_page_button( p_button_execute_validations=>'Y', p_button_condition=> 'select host'||chr(10)|| ' from user_db_links'||chr(10)|| -' where :P0_TEST_OWNER = db_link'||chr(10)|| +' where :P0_TEST_OWNER = :APP_USER'||chr(10)|| +' and db_link || ''.'' like :P0_TEST_OWNER || ''.%'''||chr(10)|| ' and :P0_TEST_RUNNER is not null', p_button_condition_type=> 'EXISTS', p_button_comment=>'Warning: The web page will not return until the test runner has completed.', diff --git a/src/gui/install.sql b/src/gui/install.sql index 7294425..87a2387 100644 --- a/src/gui/install.sql +++ b/src/gui/install.sql @@ -1,15 +1,6 @@ --- Can be run as SYSTEM -grant create job to &schema_owner.; -grant create database link to &schema_owner.; -grant create job to &schema_owner.; - --- Must be run as SYS -grant select on dba_arguments to &schema_owner.; -grant select on gv_$parameter to &schema_owner.; - --- Install Views -@wt_scheduler_jobs.vw +-- Install APEX Workspace +@WTP_workspace.sql -- Install APEX Application @f700.sql From 50886edfe191f55c8e13fdf9e2475a6af20bd04e Mon Sep 17 00:00:00 2001 From: DDieterich Date: Wed, 12 Sep 2018 00:08:10 -0500 Subject: [PATCH 023/141] Created EXTRAS Directory and Added Code --- src/extras/README.txt | 20 ++++ src/extras/junit_report_all.prc | 111 ++++++++++++++++++++ src/{core => extras}/wtplsql_conversion.sql | 3 + 3 files changed, 134 insertions(+) create mode 100644 src/extras/README.txt create mode 100644 src/extras/junit_report_all.prc rename src/{core => extras}/wtplsql_conversion.sql (97%) diff --git a/src/extras/README.txt b/src/extras/README.txt new file mode 100644 index 0000000..1f8157a --- /dev/null +++ b/src/extras/README.txt @@ -0,0 +1,20 @@ + + White Box PL/SQL Testing + src/core/README.txt + +FILE DESCRIPTION +---------------------- ----------------------- +junit_report_all.prc Procedure that create JUnit XML from WT_TEST_RUNS +wtplsql_conversion.sql PL/SQL block that adds WTPLSQL_RUN to packages + +NOTE: "install.sql" creates PUBLIC SYNONYMS. + + +Install Procedure: +------------------ +All extras a individually installed. + + +UnInstall Procedure: +-------------------- +No automated un-install. diff --git a/src/extras/junit_report_all.prc b/src/extras/junit_report_all.prc new file mode 100644 index 0000000..7c883ca --- /dev/null +++ b/src/extras/junit_report_all.prc @@ -0,0 +1,111 @@ +create or replace procedure junit_report_all +is + procedure p (in_line in varchar2) is + begin + DBMS_OUTPUT.PUT_LINE(in_line); + end p; +begin + p(''); + p(''); + p(''); + p(''); + p(''); + for suites in ( + select tr.start_dtm + ,tr.end_dtm + ,tr.id + ,tr.runner_owner || '.' || tr.runner_name + SUITE_NAME + ,nvl(tr.dbout_owner, tr.runner_owner) + PACKAGE_NAME + ,case when tr.dbout_name || tr.dbout_type is null + then 'TEST_RUNNER' + else tr.dbout_name || ':' || tr.dbout_type + end CLASS_NAME + ,asserts + ,failures + ,ts.errors + case when tr.error_message is null + then 0 else 1 end ERRORS + ,extract(day from (tr.end_dtm - + tr.start_dtm) * 86400000) + TOT_INTERVAL_MSECS + ,tr.error_message + from wt_test_runs tr + left join wt_test_run_stats ts + on ts.test_run_id = tr.id + where is_last_run = wtplsql.get_last_run_flag + order by start_dtm, id ) + loop + p(' ' ); + for cases in ( + select tr.id + ,tc.testcase + ,nvl(tc.asserts, ts.asserts) ASSERTS + ,nvl(tc.failures, ts.failures) FAILURES + ,nvl(tc.errors, ts.errors) + + case when tr.error_message is null + then 0 else 1 end ERRORS + ,nvl(tc.tot_interval_msecs + ,suites.tot_interval_msecs) TOT_INTERVAL_MSECS + from wt_test_runs tr + left join wt_test_run_stats ts + on ts.test_run_id = tr.id + left join wt_testcase_stats tc + on tc.test_run_id = tr.id + where tr.id = suites.id + order by testcase ) + loop + if nvl(cases.failures,1) + nvl(cases.errors,1) = 0 + then + p(' '); + else + p(' '); + p(' ' ); + -- Put the big error on top + p(suites.error_message); + -- Print each of the non-passing results + for asrts in ( + select result_seq + ,status + ,interval_msecs + ,message + ,assertion + ,details + from wt_results + where test_run_id = suites.id + and ( (cases.testcase is null + and testcase is null) + or testcase = cases.testcase) + and status != wt_assert.C_PASS + order by result_seq ) + loop + p(lpad(asrts.result_seq,4) || ': ' || + rpad(asrts.status,4) || ' ' || + lpad(asrts.interval_msecs,4) || 'ms ' || + asrts.message || '. ' || + asrts.assertion || ' - ' || + replace(replace(asrts.details + ,CHR(13),'\r') + ,CHR(10),'\n') || '.' ); + end loop; + p(' '); + p(' '); + end if; + end loop; + end loop; + p(' '); + p(''); +end junit_report_all; +/ diff --git a/src/core/wtplsql_conversion.sql b/src/extras/wtplsql_conversion.sql similarity index 97% rename from src/core/wtplsql_conversion.sql rename to src/extras/wtplsql_conversion.sql index 9403482..a1b4ffa 100644 --- a/src/core/wtplsql_conversion.sql +++ b/src/extras/wtplsql_conversion.sql @@ -119,6 +119,9 @@ declare add_teardown := TRUE; else ret_str := ret_str || + ' ' || 'wt_assert.g_testcase := ' || + substr(proc_buff.procedure_name,1,50) || + ';' || CHR(10) || ' ' || proc_buff.procedure_name || ';' || CHR(10); end case; From 8790bb801c0cc0eafc383f0c329f2c0919dc8cc4 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Wed, 12 Sep 2018 23:44:49 -0500 Subject: [PATCH 024/141] Add Notes for GUI Corrections --- src/gui/Notes.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/gui/Notes.txt b/src/gui/Notes.txt index 40e0dcf..43b4b22 100644 --- a/src/gui/Notes.txt +++ b/src/gui/Notes.txt @@ -1,4 +1,16 @@ +P2_NEW_DB_LINK_HOST: +select '//localhost:1521/' || global_name from global_name; + +Page 2, p_process_name=> 'TEST_ALL_SEQ': +on dbl.db_link || ''.'' like proc.owner || ''.%'''|| +and dbl.db_link || ''.'' like dbl.username || ''.%'''|| + +Page 2, p_process_name=> 'TEST_ALL_PAR': +group by proc.owner'|| +order by proc.owner )'|| + + Gui Demo 1) Demo Installation From cd615dad4c475b4b0c7c0b701db7eb7441c5d910 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Sun, 28 Oct 2018 01:00:27 -0500 Subject: [PATCH 025/141] Massive Incomplete Changes --- src/{extras => conversion}/README.txt | 2 +- .../utplsql_to_wtplsql.sql} | 15 +- .../V1.1.0/downgrade_to_V1.0.0}/README.txt | 0 .../V1.1.0/upgrade_from_V1.0.0}/README.txt | 0 .../upgrade_from_V1.0.0}/RELEASE_NOTES.txt | 0 .../upgrade_from_V1.0.0}/update_all_stats.sql | 0 .../V1.1.0/upgrade_from_V1.0.0}/upgrade.sql | 2 +- .../V1.1.0/upgrade_from_V1.0.0}/upgradeO.LST | 0 .../V1.2.0/upgrade_from_V1.1.0}/README.txt | 0 .../upgrade_from_V1.1.0}/RELEASE_NOTES.txt | 0 src/core/wt_assert.pkb | 11 +- src/core/wt_assert.pks | 7 + src/core/wt_dbout.pkb | 37 ++++ src/core/wt_dbout.pks | 11 + src/core/wt_dbout_profiles.tab | 32 --- src/core/wt_dbouts.tab | 27 +++ src/core/wt_hook.pkb | 147 +++++++++++++ src/core/wt_hook.pks | 33 +++ src/core/wt_hooks.tab | 30 +++ src/core/{wt_profiler.pkb => wt_profile.pkb} | 15 +- src/core/{wt_profiler.pks => wt_profile.pks} | 14 +- src/core/wt_profiles.tab | 32 +++ src/core/wt_qual_test_runners_vw.vw | 17 ++ src/core/wt_result.pkb | 4 - src/core/wt_result.pks | 4 + src/core/wt_results.tab | 26 +-- src/core/wt_scheduler_jobs.vw | 17 +- src/core/wt_test_run_stats.tab | 59 ------ src/core/wt_test_runner.pkb | 37 ++++ src/core/wt_test_runner.pks | 11 + src/core/wt_test_runners.tab | 22 ++ src/core/wt_test_runs.tab | 58 +++--- src/core/wt_testcase.pkb | 37 ++++ src/core/wt_testcase.pks | 11 + src/core/wt_testcase_stats.tab | 37 ---- src/core/wt_testcases.tab | 20 ++ src/core/wtplsql.pkb | 53 +++-- src/core/wtplsql.pks | 11 +- src/{demo => core_demo}/Package-Test.sql | 0 src/{demo => core_demo}/README.txt | 0 src/{demo => core_demo}/Table-Test.sql | 0 src/{demo => core_demo}/Test-Runner.sql | 0 src/{demo => core_demo}/Trigger-Test.sql | 0 src/{demo => core_demo}/Type-Test.sql | 0 src/{demo => core_demo}/common_setup.sql | 0 src/{demo => core_demo}/install.sql | 0 src/{demo => core_demo}/installO.LST | 0 src/{demo => core_demo}/uninstall.sql | 0 src/{demo => core_demo}/uninstallO.LST | 0 src/{demo => core_demo}/ut_betwnstr.sql | 0 .../ut_calc_secs_between.sql | 0 src/{demo => core_demo}/ut_str.sql | 0 src/{demo => core_demo}/ut_truncit.sql | 0 src/core_stats_1/install.sql | 194 ++++++++++++++++++ src/core_stats_1/wt_profiler_stats.tab | 50 +++++ src/core_stats_1/wt_profiler_stats_vw.vw | 61 ++++++ .../wt_test_run_stat.pkb | 89 ++++---- .../wt_test_run_stat.pks | 0 src/core_stats_1/wt_test_run_stats.tab | 41 ++++ src/core_stats_1/wt_test_run_stats_vw.vw | 47 +++++ src/core_stats_1/wt_testcase_stats.tab | 46 +++++ src/core_stats_1/wt_testcase_stats_vw.vw | 53 +++++ src/{gui => core_stats_gui}/Notes.txt | 0 src/{gui => core_stats_gui}/WTP_workspace.sql | 0 src/{gui => core_stats_gui}/f700.sql | 0 src/{gui => core_stats_gui}/install.sql | 0 src/junit_xml/README.txt | 20 ++ .../junit_report_all.prc | 37 ++-- 68 files changed, 1183 insertions(+), 294 deletions(-) rename src/{extras => conversion}/README.txt (83%) rename src/{extras/wtplsql_conversion.sql => conversion/utplsql_to_wtplsql.sql} (92%) rename src/core/{downgrades/V1.1.0_to_V1.0.0 => releases/V1.1.0/downgrade_to_V1.0.0}/README.txt (100%) rename src/core/{upgrades/V1.0.0_to_V1.1.0 => releases/V1.1.0/upgrade_from_V1.0.0}/README.txt (100%) rename src/core/{upgrades/V1.0.0_to_V1.1.0 => releases/V1.1.0/upgrade_from_V1.0.0}/RELEASE_NOTES.txt (100%) rename src/core/{upgrades/V1.0.0_to_V1.1.0 => releases/V1.1.0/upgrade_from_V1.0.0}/update_all_stats.sql (100%) rename src/core/{upgrades/V1.0.0_to_V1.1.0 => releases/V1.1.0/upgrade_from_V1.0.0}/upgrade.sql (99%) rename src/core/{upgrades/V1.0.0_to_V1.1.0 => releases/V1.1.0/upgrade_from_V1.0.0}/upgradeO.LST (100%) rename src/core/{upgrades/V1.1.0_to_Current => releases/V1.2.0/upgrade_from_V1.1.0}/README.txt (100%) rename src/core/{upgrades/V1.1.0_to_Current => releases/V1.2.0/upgrade_from_V1.1.0}/RELEASE_NOTES.txt (100%) create mode 100644 src/core/wt_dbout.pkb create mode 100644 src/core/wt_dbout.pks delete mode 100644 src/core/wt_dbout_profiles.tab create mode 100644 src/core/wt_dbouts.tab create mode 100644 src/core/wt_hook.pkb create mode 100644 src/core/wt_hook.pks create mode 100644 src/core/wt_hooks.tab rename src/core/{wt_profiler.pkb => wt_profile.pkb} (99%) rename src/core/{wt_profiler.pks => wt_profile.pks} (67%) create mode 100644 src/core/wt_profiles.tab create mode 100644 src/core/wt_qual_test_runners_vw.vw delete mode 100644 src/core/wt_test_run_stats.tab create mode 100644 src/core/wt_test_runner.pkb create mode 100644 src/core/wt_test_runner.pks create mode 100644 src/core/wt_test_runners.tab create mode 100644 src/core/wt_testcase.pkb create mode 100644 src/core/wt_testcase.pks delete mode 100644 src/core/wt_testcase_stats.tab create mode 100644 src/core/wt_testcases.tab rename src/{demo => core_demo}/Package-Test.sql (100%) rename src/{demo => core_demo}/README.txt (100%) rename src/{demo => core_demo}/Table-Test.sql (100%) rename src/{demo => core_demo}/Test-Runner.sql (100%) rename src/{demo => core_demo}/Trigger-Test.sql (100%) rename src/{demo => core_demo}/Type-Test.sql (100%) rename src/{demo => core_demo}/common_setup.sql (100%) rename src/{demo => core_demo}/install.sql (100%) rename src/{demo => core_demo}/installO.LST (100%) rename src/{demo => core_demo}/uninstall.sql (100%) rename src/{demo => core_demo}/uninstallO.LST (100%) rename src/{demo => core_demo}/ut_betwnstr.sql (100%) rename src/{demo => core_demo}/ut_calc_secs_between.sql (100%) rename src/{demo => core_demo}/ut_str.sql (100%) rename src/{demo => core_demo}/ut_truncit.sql (100%) create mode 100644 src/core_stats_1/install.sql create mode 100644 src/core_stats_1/wt_profiler_stats.tab create mode 100644 src/core_stats_1/wt_profiler_stats_vw.vw rename src/{core => core_stats_1}/wt_test_run_stat.pkb (95%) rename src/{core => core_stats_1}/wt_test_run_stat.pks (100%) create mode 100644 src/core_stats_1/wt_test_run_stats.tab create mode 100644 src/core_stats_1/wt_test_run_stats_vw.vw create mode 100644 src/core_stats_1/wt_testcase_stats.tab create mode 100644 src/core_stats_1/wt_testcase_stats_vw.vw rename src/{gui => core_stats_gui}/Notes.txt (100%) rename src/{gui => core_stats_gui}/WTP_workspace.sql (100%) rename src/{gui => core_stats_gui}/f700.sql (100%) rename src/{gui => core_stats_gui}/install.sql (100%) create mode 100644 src/junit_xml/README.txt rename src/{extras => junit_xml}/junit_report_all.prc (74%) diff --git a/src/extras/README.txt b/src/conversion/README.txt similarity index 83% rename from src/extras/README.txt rename to src/conversion/README.txt index 1f8157a..d92959c 100644 --- a/src/extras/README.txt +++ b/src/conversion/README.txt @@ -5,7 +5,7 @@ FILE DESCRIPTION ---------------------- ----------------------- junit_report_all.prc Procedure that create JUnit XML from WT_TEST_RUNS -wtplsql_conversion.sql PL/SQL block that adds WTPLSQL_RUN to packages +wtplsql_conversion.sql PL/SQL block that adds Runner Entry Point to packages NOTE: "install.sql" creates PUBLIC SYNONYMS. diff --git a/src/extras/wtplsql_conversion.sql b/src/conversion/utplsql_to_wtplsql.sql similarity index 92% rename from src/extras/wtplsql_conversion.sql rename to src/conversion/utplsql_to_wtplsql.sql index a1b4ffa..422b998 100644 --- a/src/extras/wtplsql_conversion.sql +++ b/src/conversion/utplsql_to_wtplsql.sql @@ -145,7 +145,7 @@ begin where src.owner = obj.owner and src.name = obj.object_name and src.type = obj.object_type - and regexp_like(src.text, 'wtplsql_run', 'i') ) + and regexp_like(src.text, wtplsql.C_RUNNER_ENTRY_POINT, 'i') ) order by object_type desc, owner, object_name ) -- Package Bodies before Package Specifications loop @@ -163,15 +163,16 @@ begin when 'PACKAGE' then src_clob := substr(tmp_clob, 1, end_ptr-1) || CHR(10) || - ' procedure wtplsql_run;' || CHR(10) || CHR(10) || - end_str; + ' procedure ' || wtplsql.C_RUNNER_ENTRY_POINT || ';' || + CHR(10) || CHR(10) || end_str; when 'PACKAGE BODY' then src_clob := substr(tmp_clob, 1, end_ptr-1) || CHR(10) || - 'procedure wtplsql_run is begin' || CHR(10) || - get_procedures(obj_rec.owner, obj_rec.object_name) || - 'end wtplsql_run;' || CHR(10) || CHR(10) || - end_str; + 'procedure ' || wtplsql.C_RUNNER_ENTRY_POINT || + ' is begin' || CHR(10) || + get_procedures(obj_rec.owner, obj_rec.object_name) || + 'end ' || wtplsql.C_RUNNER_ENTRY_POINT || ';' + || CHR(10) || CHR(10) || end_str; else raise_application_error(-20000, 'Unknown Object Type: ' || obj_rec.object_type); end case; diff --git a/src/core/downgrades/V1.1.0_to_V1.0.0/README.txt b/src/core/releases/V1.1.0/downgrade_to_V1.0.0/README.txt similarity index 100% rename from src/core/downgrades/V1.1.0_to_V1.0.0/README.txt rename to src/core/releases/V1.1.0/downgrade_to_V1.0.0/README.txt diff --git a/src/core/upgrades/V1.0.0_to_V1.1.0/README.txt b/src/core/releases/V1.1.0/upgrade_from_V1.0.0/README.txt similarity index 100% rename from src/core/upgrades/V1.0.0_to_V1.1.0/README.txt rename to src/core/releases/V1.1.0/upgrade_from_V1.0.0/README.txt diff --git a/src/core/upgrades/V1.0.0_to_V1.1.0/RELEASE_NOTES.txt b/src/core/releases/V1.1.0/upgrade_from_V1.0.0/RELEASE_NOTES.txt similarity index 100% rename from src/core/upgrades/V1.0.0_to_V1.1.0/RELEASE_NOTES.txt rename to src/core/releases/V1.1.0/upgrade_from_V1.0.0/RELEASE_NOTES.txt diff --git a/src/core/upgrades/V1.0.0_to_V1.1.0/update_all_stats.sql b/src/core/releases/V1.1.0/upgrade_from_V1.0.0/update_all_stats.sql similarity index 100% rename from src/core/upgrades/V1.0.0_to_V1.1.0/update_all_stats.sql rename to src/core/releases/V1.1.0/upgrade_from_V1.0.0/update_all_stats.sql diff --git a/src/core/upgrades/V1.0.0_to_V1.1.0/upgrade.sql b/src/core/releases/V1.1.0/upgrade_from_V1.0.0/upgrade.sql similarity index 99% rename from src/core/upgrades/V1.0.0_to_V1.1.0/upgrade.sql rename to src/core/releases/V1.1.0/upgrade_from_V1.0.0/upgrade.sql index a6dcf1a..22ea202 100644 --- a/src/core/upgrades/V1.0.0_to_V1.1.0/upgrade.sql +++ b/src/core/releases/V1.1.0/upgrade_from_V1.0.0/upgrade.sql @@ -11,7 +11,7 @@ set serveroutput on size unlimited format truncated set showmode off -- Shared Setup Script -@../../common_setup.sql +@../../../common_setup.sql WHENEVER SQLERROR exit SQL.SQLCODE diff --git a/src/core/upgrades/V1.0.0_to_V1.1.0/upgradeO.LST b/src/core/releases/V1.1.0/upgrade_from_V1.0.0/upgradeO.LST similarity index 100% rename from src/core/upgrades/V1.0.0_to_V1.1.0/upgradeO.LST rename to src/core/releases/V1.1.0/upgrade_from_V1.0.0/upgradeO.LST diff --git a/src/core/upgrades/V1.1.0_to_Current/README.txt b/src/core/releases/V1.2.0/upgrade_from_V1.1.0/README.txt similarity index 100% rename from src/core/upgrades/V1.1.0_to_Current/README.txt rename to src/core/releases/V1.2.0/upgrade_from_V1.1.0/README.txt diff --git a/src/core/upgrades/V1.1.0_to_Current/RELEASE_NOTES.txt b/src/core/releases/V1.2.0/upgrade_from_V1.1.0/RELEASE_NOTES.txt similarity index 100% rename from src/core/upgrades/V1.1.0_to_Current/RELEASE_NOTES.txt rename to src/core/releases/V1.2.0/upgrade_from_V1.1.0/RELEASE_NOTES.txt diff --git a/src/core/wt_assert.pkb b/src/core/wt_assert.pkb index aa3abfb..2f70947 100644 --- a/src/core/wt_assert.pkb +++ b/src/core/wt_assert.pkb @@ -1,14 +1,5 @@ create or replace package body wt_assert is - -- See (public) RESET_GLOBALS procedure for default global values - TYPE g_rec_type is record - (last_pass boolean - ,raise_exception boolean - ,last_assert wt_results.assertion%TYPE - ,last_msg wt_results.message%TYPE - ,last_details wt_results.details%TYPE); - g_rec g_rec_type; - $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ temp_rowid1 CONSTANT rowid := chartorowid('AAAFd1AAFAAAABSAA/'); temp_rowid2 CONSTANT rowid := chartorowid('AAAFd1AAFAAAABSAB/'); @@ -111,6 +102,8 @@ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ end if; $END ----------------%WTPLSQL_end_ignore_lines%---------------- + wt_hook.after_assertion; + if g_rec.raise_exception and not g_rec.last_pass then raise_application_error(-20003, wt_text_report.format_test_result diff --git a/src/core/wt_assert.pks b/src/core/wt_assert.pks index 53bcf13..9d38887 100644 --- a/src/core/wt_assert.pks +++ b/src/core/wt_assert.pks @@ -9,6 +9,13 @@ is C_FAIL CONSTANT varchar2(10) := 'FAIL'; -- See RESET_GLOBALS procedure for default global values + TYPE g_rec_type is record + (last_pass boolean + ,raise_exception boolean + ,last_assert wt_results.assertion%TYPE + ,last_msg wt_results.message%TYPE + ,last_details wt_results.details%TYPE); + g_rec g_rec_type; -- Testcase name for a series of assertions. -- Modify as required diff --git a/src/core/wt_dbout.pkb b/src/core/wt_dbout.pkb new file mode 100644 index 0000000..d4ede0b --- /dev/null +++ b/src/core/wt_dbout.pkb @@ -0,0 +1,37 @@ +create or replace package body wt_testcase +as + +--------------------- +-- Public Procedures +--------------------- + +------------------------------------------------------------ +function get_testcase_id + (in_testcase in varchar2) + return number +is + rec wt_testcases%ROWTYPE; +begin + select id into rec.id from wt_testcases + where testcase = in_testcase; + return rec.id; +exception + when NO_DATA_FOUND + then + rec.id := wt_testcases_seq.nextval; + rec.testcase := in_testcase; + insert into wt_testcases values rec; + return rec.id; +end get_testcase_id; + +------------------------------------------------------------ +procedure clear_testcases +is +begin + delete from wt_testcases + where id not in ( + select testcase_id + from wt_results ); +end clear_testcases; + +end wt_testcase; diff --git a/src/core/wt_dbout.pks b/src/core/wt_dbout.pks new file mode 100644 index 0000000..ecae9ce --- /dev/null +++ b/src/core/wt_dbout.pks @@ -0,0 +1,11 @@ +create or replace package wt_testcase + authid definer +as + + function get_testcase_id + (in_testcase in varchar2) + return number; + + procedure clear_testcases; + +end wt_testcase; diff --git a/src/core/wt_dbout_profiles.tab b/src/core/wt_dbout_profiles.tab deleted file mode 100644 index 494857d..0000000 --- a/src/core/wt_dbout_profiles.tab +++ /dev/null @@ -1,32 +0,0 @@ - --- --- DBOUT Profiles Table Installation --- - -create table wt_dbout_profiles - (test_run_id number(38) constraint wt_dbout_profiles_nn1 not null - ,line number(6) constraint wt_dbout_profiles_nn2 not null - ,status varchar2(4) constraint wt_dbout_profiles_nn3 not null - ,total_occur number(9) constraint wt_dbout_profiles_nn4 not null - ,total_usecs number constraint wt_dbout_profiles_nn5 not null - ,min_usecs number constraint wt_dbout_profiles_nn6 not null - ,max_usecs number constraint wt_dbout_profiles_nn7 not null - ,text varchar2(4000) constraint wt_dbout_profiles_nn8 not null - ,constraint wt_dbout_profiles_pk primary key (test_run_id, line) - ,constraint wt_dbout_profiles_fk1 foreign key (test_run_id) - references wt_test_runs (id) - ,constraint wt_dbout_profiles_ck1 check (status in ('EXEC','NOTX','EXCL','IGNR','UNKN')) - ) pctfree 0; - -comment on table wt_dbout_profiles is 'PL/SQL Profiler data for Database Object Under Test (DBOUT).'; -comment on column wt_dbout_profiles.test_run_id is 'Foreign Key for the Test Run, Primary Key part 1.'; -comment on column wt_dbout_profiles.line is 'Source code line number, Primary Key part 2.'; -comment on column wt_dbout_profiles.status is 'Executed/NotExecuted/Excluded/Ignored/Unknown Status from the Profiler'; -comment on column wt_dbout_profiles.total_occur is 'Number of times this line was executed.'; -comment on column wt_dbout_profiles.total_usecs is 'Total time in microseconds spent executing this line.'; -comment on column wt_dbout_profiles.min_usecs is 'Minimum execution time in microseconds for this line.'; -comment on column wt_dbout_profiles.max_usecs is 'Maximum execution time in microseconds for this line.'; -comment on column wt_dbout_profiles.text is 'Source code text for this line number.'; - -grant select on wt_dbout_profiles to public; -grant delete on wt_dbout_profiles to public; diff --git a/src/core/wt_dbouts.tab b/src/core/wt_dbouts.tab new file mode 100644 index 0000000..a9a4697 --- /dev/null +++ b/src/core/wt_dbouts.tab @@ -0,0 +1,27 @@ + +-- +-- Test Runs Statistics Table Installation +-- + +create sequence wt_dbouts_seq; + +create table wt_dbouts + (id number(38) constraint wt_dbouts_nn1 not null + ,dbout_owner varchar2(128) constraint wt_dbouts_nn2 not null + ,dbout_name varchar2(128) constraint wt_dbouts_nn3 not null + ,dbout_type varchar2(20) constraint wt_dbouts_nn4 not null + ,constraint wt_dbouts_pk primary key (id) + ,constraint wt_dbouts_nk1 unique (dbout_owner, runner_name, dbout_type) + ) pctfree 0; + +create index wt_dbouts_ix1 + on wt_dbouts (dbout_type, dbout_owner); + +comment on table wt_dbouts is 'List of Database Objects Under Test (DBOUT).'; +comment on column wt_dbouts.id is 'Primary (Surrogate) Key for each Database Objects Under Test (DBOUT)'; +comment on column wt_dbouts.dbout_owner is 'Owner of the Database Object Under Test (DBOUT).'; +comment on column wt_dbouts.dbout_name is 'Name of the Database Object Under Test (DBOUT).'; +comment on column wt_dbouts.dbout_type is 'Type of the Database Object Under Test (DBOUT).'; + +grant select on wt_dbouts to public; +grant delete on wt_dbouts to public; diff --git a/src/core/wt_hook.pkb b/src/core/wt_hook.pkb new file mode 100644 index 0000000..20831fe --- /dev/null +++ b/src/core/wt_hook.pkb @@ -0,0 +1,147 @@ +create or replace package body wt_hook +as + + +---------------------- +-- Private Procedures +---------------------- + + +------------------------------------------------------------ +procedure run_hooks + (in_hook_name in varchar2) +is +begin + for i in 1 .. run_aa(in_hook_name).COUNT + loop + execute immediate run_aa(in_hook_name)(i); + end loop; +end run_hooks; + + +--------------------- +-- Public Procedures +--------------------- + + +------------------------------------------------------------ +procedure before_test_all +is +begin + if before_test_all_active + then + run_hooks('before_test_all'); + end if; +end before_test_all; + +------------------------------------------------------------ +procedure before_run_init +is +begin + if before_run_init_active + then + run_hooks('before_run_init'); + end if; +end before_run_init; + +------------------------------------------------------------ +procedure after_run_init +is +begin + if after_run_init_active + then + run_hooks('after_run_init'); + end if; +end after_run_init; + +------------------------------------------------------------ +procedure after_assertion +is +begin + if after_assertion_active + then + run_hooks('after_assertion'); + end if; +end after_assertion; + +------------------------------------------------------------ +procedure before_run_final +is +begin + if before_run_final_active + then + run_hooks('before_run_final'); + end if; +end before_run_final; + +------------------------------------------------------------ +procedure after_run_final +is +begin + if after_run_final_active + then + run_hooks('after_run_final'); + end if; +end after_run_final; + +------------------------------------------------------------ +procedure after_test_all +is +begin + if after_test_all_active + then + run_hooks('after_test_all'); + end if; +end after_test_all; + +------------------------------------------------------------ +procedure before_delete_runs +is +begin + if before_delete_runs_active + then + run_hooks('before_delete_runs'); + end if; +end before_delete_runs; + +------------------------------------------------------------ +procedure after_delete_runs +is +begin + if after_delete_runs_active + then + run_hooks('after_delete_runs'); + end if; +end after_delete_runs; + +------------------------------------------------------------ + +begin + + for buff in ( + select hook_name + from wt_hooks + group by hook_name ) + loop + select run_string bulk collect into run_nt + from wt_hooks + where hook_name = buff.hook_name + order by wt_hooks.seq; + if SQL%FOUND + then + run_aa(buff.hook_name) := run_nt; + case buff.hook_name + when 'before_test_all' then before_test_all_active := TRUE; + when 'before_run_init' then before_run_init_active := TRUE; + when 'after_run_init' then after_run_init_active := TRUE; + when 'after_assertion' then after_assertion_active := TRUE; + when 'before_run_final' then before_run_final_active := TRUE; + when 'after_run_final' then after_run_final_active := TRUE; + when 'after_test_all' then after_test_all_active := TRUE; + when 'before_delete_runs' then before_delete_runs_active := TRUE; + when 'after_delete_runs' then after_delete_runs_active := TRUE; + end case; + end if; + end loop; + +end wt_hook; diff --git a/src/core/wt_hook.pks b/src/core/wt_hook.pks new file mode 100644 index 0000000..e478417 --- /dev/null +++ b/src/core/wt_hook.pks @@ -0,0 +1,33 @@ +create or replace package wt_hook + authid definer +as + + TYPE run_nt_type is table + of varchar2(4000); + run_nt run_nt_type; + TYPE run_aa_type is table + of run_nt_type + index by varchar2(20); + run_aa run_aa_type; + + before_test_all_active boolean := FALSE; + before_run_init_active boolean := FALSE; + after_run_init_active boolean := FALSE; + after_assertion_active boolean := FALSE; + before_run_final_active boolean := FALSE; + after_run_final_active boolean := FALSE; + after_test_all_active boolean := FALSE; + before_delete_runs_active boolean := FALSE; + after_delete_runs_active boolean := FALSE; + + procedure before_test_all; + procedure before_run_init; + procedure after_run_init; + procedure after_assertion; + procedure before_run_final; + procedure after_run_final; + procedure after_test_all; + procedure before_delete_runs; + procedure after_delete_runs; + +end wt_hook; diff --git a/src/core/wt_hooks.tab b/src/core/wt_hooks.tab new file mode 100644 index 0000000..77a004a --- /dev/null +++ b/src/core/wt_hooks.tab @@ -0,0 +1,30 @@ + +-- +-- wtPLSQL Hooks Table Installation +-- + +create table wt_hooks + (hook_name varchar2(20) constraint wt_hooks_nn1 not null + ,seq number(2) constraint wt_hooks_nn2 not null + ,run_string varchar2(4000) constraint wt_hooks_nn3 not null + ,description varchar2(1000) + ,constraint wt_hooks_pk primary key (hook_name, seq) + ,constraint wt_hooks_ck1 check (hook_name in ('before_test_all' + ,'before_run_init' + ,'after_run_init' + ,'after_assertion' + ,'before_run_final' + ,'after_run_final' + ,'after_test_all' + ,'before_delete_runs' + ,'after_delete_runs')) + ,constraint wt_hooks_ck2 check (seq > 0) + ); + +comment on table wt_hooks is 'wtPLSQL Hooks.'; +comment on column wt_hooks.hook_name is 'Primary Key for each Hook Name'; +comment on column wt_hooks.seq is 'Primary Key for the sequence of the Hook'; +comment on column wt_hooks.run_string is 'Procedure Name or Un-named PL/SQL Block for EXECUTE IMMEDIATE'; +comment on column wt_hooks.description is 'Description of this Hook.'; + +grant select on wt_hooks to public; diff --git a/src/core/wt_profiler.pkb b/src/core/wt_profile.pkb similarity index 99% rename from src/core/wt_profiler.pkb rename to src/core/wt_profile.pkb index b20b175..986e1a2 100644 --- a/src/core/wt_profiler.pkb +++ b/src/core/wt_profile.pkb @@ -1,16 +1,6 @@ -create or replace package body wt_profiler +create or replace package body wt_profile as - TYPE rec_type is record - (test_run_id wt_test_runs.id%TYPE - ,dbout_owner wt_test_runs.dbout_owner%TYPE - ,dbout_name wt_test_runs.dbout_name%TYPE - ,dbout_type wt_test_runs.dbout_type%TYPE - ,prof_runid binary_integer - ,trigger_offset binary_integer - ,error_message varchar2(4000)); - g_rec rec_type; - TYPE ignr_aa_type is table of varchar2(1) index by PLS_INTEGER; @@ -1118,7 +1108,6 @@ begin end loop; g_ignr_aa.delete; delete_plsql_profiler_recs(g_rec.prof_runid); - commit; end insert_dbout_profile; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ @@ -2001,4 +1990,4 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- --==============================================================-- -end wt_profiler; +end wt_profile; diff --git a/src/core/wt_profiler.pks b/src/core/wt_profile.pks similarity index 67% rename from src/core/wt_profiler.pks rename to src/core/wt_profile.pks index dd8078b..12c76a1 100644 --- a/src/core/wt_profiler.pks +++ b/src/core/wt_profile.pks @@ -1,6 +1,16 @@ -create or replace package wt_profiler authid definer --current_user +create or replace package wt_profile authid definer --current_user as + TYPE rec_type is record + (test_run_id wt_test_runs.id%TYPE + ,dbout_owner wt_test_runs.dbout_owner%TYPE + ,dbout_name wt_test_runs.dbout_name%TYPE + ,dbout_type wt_test_runs.dbout_type%TYPE + ,prof_runid binary_integer + ,trigger_offset binary_integer + ,error_message varchar2(4000)); + g_rec rec_type; + procedure initialize (in_test_run_id in number, in_runner_owner in varchar2, @@ -38,4 +48,4 @@ as procedure WTPLSQL_RUN; $END -end wt_profiler; +end wt_profile; diff --git a/src/core/wt_profiles.tab b/src/core/wt_profiles.tab new file mode 100644 index 0000000..614f027 --- /dev/null +++ b/src/core/wt_profiles.tab @@ -0,0 +1,32 @@ + +-- +-- DBOUT Profiles Table Installation +-- + +create table wt_profiles + (test_run_id number(38) constraint wt_profiles_nn1 not null + ,line number(6) constraint wt_profiles_nn2 not null + ,status varchar2(4) constraint wt_profiles_nn3 not null + ,total_occur number(9) constraint wt_profiles_nn4 not null + ,total_usecs number constraint wt_profiles_nn5 not null + ,min_usecs number constraint wt_profiles_nn6 not null + ,max_usecs number constraint wt_profiles_nn7 not null + ,text varchar2(4000) constraint wt_profiles_nn8 not null + ,constraint wt_profiles_pk primary key (test_run_id, line) + ,constraint wt_profiles_fk1 foreign key (test_run_id) + references wt_test_runs (id) + ,constraint wt_profiles_ck1 check (status in ('EXEC','NOTX','EXCL','IGNR','UNKN')) + ) pctfree 0; + +comment on table wt_profiles is 'PL/SQL Profiler data for Database Object Under Test (DBOUT).'; +comment on column wt_profiles.test_run_id is 'Foreign Key for the Test Run, Primary Key part 1.'; +comment on column wt_profiles.line is 'Source code line number, Primary Key part 2.'; +comment on column wt_profiles.status is 'Executed/NotExecuted/Excluded/Ignored/Unknown Status from the Profiler'; +comment on column wt_profiles.total_occur is 'Number of times this line was executed.'; +comment on column wt_profiles.total_usecs is 'Total time in microseconds spent executing this line.'; +comment on column wt_profiles.min_usecs is 'Minimum execution time in microseconds for this line.'; +comment on column wt_profiles.max_usecs is 'Maximum execution time in microseconds for this line.'; +comment on column wt_profiles.text is 'Source code text for this line number.'; + +grant select on wt_profiles to public; +grant delete on wt_profiles to public; diff --git a/src/core/wt_qual_test_runners_vw.vw b/src/core/wt_qual_test_runners_vw.vw new file mode 100644 index 0000000..9fac46c --- /dev/null +++ b/src/core/wt_qual_test_runners_vw.vw @@ -0,0 +1,17 @@ + +-- +-- Current Test Runners View Installation +-- + +create view wt_qual_test_runners_vw as +select owner + ,object_name PACKAGE_NAME + from dba_procedures + where procedure_name = wtplsql.get_runner_entry_point + and object_type = 'PACKAGE'; + +comment on table wt_qual_test_runners_vw is 'All PL/SQL Packages with the required Test Runner Entry Point.'; +comment on column wt_qual_test_runners_vw.owner is 'Owner of the Qualified Test Runner Package'; +comment on column wt_qual_test_runners_vw.package_name is 'Name of the Qualified Test Runner Package'; + +grant select on wt_qual_test_runners_vw to public; diff --git a/src/core/wt_result.pkb b/src/core/wt_result.pkb index 6ede2af..3facb23 100644 --- a/src/core/wt_result.pkb +++ b/src/core/wt_result.pkb @@ -1,10 +1,6 @@ create or replace package body wt_result as - TYPE results_nt_type is table of wt_results%ROWTYPE; - g_results_nt results_nt_type; - g_results_rec wt_results%ROWTYPE; - $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ g_skip_add BOOLEAN := FALSE; $END ----------------%WTPLSQL_end_ignore_lines%---------------- diff --git a/src/core/wt_result.pks b/src/core/wt_result.pks index 68c54d9..efc9fe2 100644 --- a/src/core/wt_result.pks +++ b/src/core/wt_result.pks @@ -1,6 +1,10 @@ create or replace package wt_result authid definer as + TYPE results_nt_type is table of wt_results%ROWTYPE; + g_results_nt results_nt_type; + g_results_rec wt_results%ROWTYPE; + procedure initialize (in_test_run_id in wt_test_runs.id%TYPE); diff --git a/src/core/wt_results.tab b/src/core/wt_results.tab index 443a0d8..de3fd5b 100644 --- a/src/core/wt_results.tab +++ b/src/core/wt_results.tab @@ -4,33 +4,35 @@ -- create table wt_results - (test_run_id number(38) constraint wt_results_nn2 not null - ,result_seq number(8) constraint wt_results_nn3 not null - ,executed_dtm timestamp(6) constraint wt_results_nn4 not null - ,interval_msecs number(10,3) constraint wt_results_nn5 not null - ,assertion varchar2(15) constraint wt_results_nn6 not null - ,status varchar2(4) constraint wt_results_nn7 not null - ,details varchar2(4000) constraint wt_results_nn8 not null - ,testcase varchar2(50) - ,message varchar2(200) + (test_run_id number(38) constraint wt_results_nn1 not null + ,result_seq number(8) constraint wt_results_nn2 not null + ,testcase_id number(38) constraint wt_results_nn3 not null + ,executed_dtm timestamp(6) constraint wt_results_nn4 not null + ,interval_msecs number(10,3) constraint wt_results_nn5 not null + ,assertion varchar2(15) constraint wt_results_nn6 not null + ,status varchar2(4) constraint wt_results_nn7 not null + ,message varchar2(200) + ,details varchar2(4000) ,constraint wt_results_pk primary key (test_run_id, result_seq) ,constraint wt_results_fk1 foreign key (test_run_id) references wt_test_runs (id) + ,constraint wt_results_fk2 foreign key (testcase_id) + references wt_testcases (id) ,constraint wt_results_ck1 check (status in ('PASS','FAIL')) ) pctfree 0; create index wt_results_ix1 - on wt_results(testcase, test_run_id); + on wt_results(testcase_id, test_run_id); comment on table wt_results is 'Results data from Test Runs.'; comment on column wt_results.test_run_id is 'Foreign Key for the Test Run, Primary Key part 1.'; comment on column wt_results.result_seq is 'Sequence number for this Result, Primary Key part 2.'; +comment on column wt_results.testcase is 'Foreign Key for the Test Case.'; comment on column wt_results.executed_dtm is 'Date/Time (with Fractional Seconds) this Result was captured'; comment on column wt_results.interval_msecs is 'Interval time in milliseonds since the previous Result or start ot the Test Run.'; comment on column wt_results.assertion is 'Name of the Assertion Test performed'; -comment on column wt_results.status is 'Passed/Failed Status from the Assertion'; +comment on column wt_results.status is 'PASS/FAIL Status from the Assertion'; comment on column wt_results.details is 'Assertion Details, i.e. Expected Value and Actual Value'; -comment on column wt_results.testcase is 'Optional Test Case name.'; comment on column wt_results.message is 'Optional test identifier that helps connect an Assertion to the Test Runner.'; grant select on wt_results to public; diff --git a/src/core/wt_scheduler_jobs.vw b/src/core/wt_scheduler_jobs.vw index 4de3ac7..bc91e10 100644 --- a/src/core/wt_scheduler_jobs.vw +++ b/src/core/wt_scheduler_jobs.vw @@ -1,5 +1,9 @@ -create or replace view wt_scheduler_jobs as +-- +-- User Scheduler Jobs View Installation +-- + +create view wt_scheduler_jobs_vw as select round(log_id) LOG_ID ,systimestamp - elapsed_time START_DATE ,job_name @@ -21,3 +25,14 @@ select log_id ,error# ERROR_NUM ,additional_info from user_scheduler_job_run_details; + +comment on table wt_scheduler_jobs_vw is 'User Scheduler Jobs, including running and not running jobs.'; +comment on column wt_scheduler_jobs_vw.log_id is 'Unique identifier of the log entry (foreign key of the *_SCHEDULER_JOB_LOG views)'; +comment on column wt_scheduler_jobs_vw.start_date is 'Actual date on which the job was run'; +comment on column wt_scheduler_jobs_vw.job_name is 'Name of the Scheduler job'; +comment on column wt_scheduler_jobs_vw.status is 'Status of the job run'; +comment on column wt_scheduler_jobs_vw.inst is 'Identifier of the instance on which the job was run'; +comment on column wt_scheduler_jobs_vw.session_id is 'Identifier of the session running the Scheduler job'; +comment on column wt_scheduler_jobs_vw.os_pid is 'Process number of the slave process running the Scheduler job'; +comment on column wt_scheduler_jobs_vw.error_num is 'Error number in the case of an error'; +comment on column wt_scheduler_jobs_vw.additional_info is 'Additional information on the job run, if applicable'; diff --git a/src/core/wt_test_run_stats.tab b/src/core/wt_test_run_stats.tab deleted file mode 100644 index 988bc6b..0000000 --- a/src/core/wt_test_run_stats.tab +++ /dev/null @@ -1,59 +0,0 @@ - --- --- Test Runs Statistics Table Installation --- - -create table wt_test_run_stats - (test_run_id number(38) constraint wt_test_run_stats_nn1 not null - ,test_yield number - ,asserts number - ,passes number - ,failures number - ,errors number - ,testcases number - ,min_interval_msecs number - ,avg_interval_msecs number - ,max_interval_msecs number - ,tot_interval_msecs number - ,code_coverage number - ,profiled_lines number - ,executed_lines number - ,ignored_lines number - ,excluded_lines number - ,notexec_lines number - ,unknown_lines number - ,min_executed_usecs number - ,avg_executed_usecs number - ,max_executed_usecs number - ,tot_executed_usecs number - ,constraint wt_test_run_stats_pk primary key (test_run_id) - ,constraint wt_test_run_stats_fk1 foreign key (test_run_id) - references wt_test_runs (id) - ) pctfree 0; - -comment on table wt_test_run_stats is 'Test Run data statistics for each execution of the WTPLSQL_RUN procedure.'; -comment on column wt_test_run_stats.test_run_id is 'Primary (Surrogate) Key for each Test Run. Also the Test Runs foreign key.'; -comment on column wt_test_run_stats.test_yield is 'Ratio of successful assertions to total assertions.'; -comment on column wt_test_run_stats.asserts is 'Total number of assetions.'; -comment on column wt_test_run_stats.passes is 'Number of passed assertions.'; -comment on column wt_test_run_stats.failures is 'Number of failed assertions.'; -comment on column wt_test_run_stats.errors is 'Number of errored assertions.'; -comment on column wt_test_run_stats.testcases is 'Total number of test cases.'; -comment on column wt_test_run_stats.min_interval_msecs is 'Minimum interval time between assertions in milliseconds'; -comment on column wt_test_run_stats.avg_interval_msecs is 'Average interval time between assertions in milliseconds'; -comment on column wt_test_run_stats.max_interval_msecs is 'Maximum interval time between assertions in milliseconds'; -comment on column wt_test_run_stats.tot_interval_msecs is 'Total (Sum) of interval times between assertions in milliseconds'; -comment on column wt_test_run_stats.code_coverage is 'Ratio of execute source lines to valid executable source lines.'; -comment on column wt_test_run_stats.profiled_lines is 'Total number of source lines as counted by DBMS_PROFILER'; -comment on column wt_test_run_stats.executed_lines is 'Number of source lines executed'; -comment on column wt_test_run_stats.ignored_lines is 'Number of source lines ignored as uncountable'; -comment on column wt_test_run_stats.excluded_lines is 'Number of source lines excluded due to unexplained DBMS_PROFILER metrics'; -comment on column wt_test_run_stats.notexec_lines is 'Number of source lines not execute'; -comment on column wt_test_run_stats.unknown_lines is 'Number of source lines that have unexplained DBMS_PROFILER metrics'; -comment on column wt_test_run_stats.min_executed_usecs is 'Minumum execution time for a line of source in microseconds'; -comment on column wt_test_run_stats.avg_executed_usecs is 'Average execution time for a line of source in microseconds'; -comment on column wt_test_run_stats.max_executed_usecs is 'Maximum execution time for a line of source in microseconds'; -comment on column wt_test_run_stats.tot_executed_usecs is 'Total (Sum) of execution times for a line of source in microseconds'; - -grant select on wt_test_run_stats to public; -grant delete on wt_test_run_stats to public; diff --git a/src/core/wt_test_runner.pkb b/src/core/wt_test_runner.pkb new file mode 100644 index 0000000..d4ede0b --- /dev/null +++ b/src/core/wt_test_runner.pkb @@ -0,0 +1,37 @@ +create or replace package body wt_testcase +as + +--------------------- +-- Public Procedures +--------------------- + +------------------------------------------------------------ +function get_testcase_id + (in_testcase in varchar2) + return number +is + rec wt_testcases%ROWTYPE; +begin + select id into rec.id from wt_testcases + where testcase = in_testcase; + return rec.id; +exception + when NO_DATA_FOUND + then + rec.id := wt_testcases_seq.nextval; + rec.testcase := in_testcase; + insert into wt_testcases values rec; + return rec.id; +end get_testcase_id; + +------------------------------------------------------------ +procedure clear_testcases +is +begin + delete from wt_testcases + where id not in ( + select testcase_id + from wt_results ); +end clear_testcases; + +end wt_testcase; diff --git a/src/core/wt_test_runner.pks b/src/core/wt_test_runner.pks new file mode 100644 index 0000000..ecae9ce --- /dev/null +++ b/src/core/wt_test_runner.pks @@ -0,0 +1,11 @@ +create or replace package wt_testcase + authid definer +as + + function get_testcase_id + (in_testcase in varchar2) + return number; + + procedure clear_testcases; + +end wt_testcase; diff --git a/src/core/wt_test_runners.tab b/src/core/wt_test_runners.tab new file mode 100644 index 0000000..f167be5 --- /dev/null +++ b/src/core/wt_test_runners.tab @@ -0,0 +1,22 @@ + +-- +-- Test Runs Statistics Table Installation +-- + +create sequence wt_test_runners_seq order; + +create table wt_test_runners + (id number(38) constraint wt_test_runs_nn1 not null + ,runner_owner varchar2(128) constraint wt_test_runs_nn2 not null + ,runner_name varchar2(128) constraint wt_test_runs_nn3 not null + ,constraint wt_test_runners_pk primary key (id) + ,constraint wt_test_runners_nk1 unique (runner_owner, runner_name) + ) pctfree 0; + +comment on table wt_test_runners is 'List of Test Runners.'; +comment on column wt_test_runners.id is 'Primary (Surrogate) Key for each Test Runner'; +comment on column wt_test_runners.runner_owner is 'Owner of the Test Runner package. Natural Key 1 part 1'; +comment on column wt_test_runners.runner_name is 'Name of the Test Runner package. Natural Key 1 part 2'; + +grant select on wt_test_runners to public; +grant delete on wt_test_runners to public; diff --git a/src/core/wt_test_runs.tab b/src/core/wt_test_runs.tab index 4b21888..e00ee90 100644 --- a/src/core/wt_test_runs.tab +++ b/src/core/wt_test_runs.tab @@ -7,46 +7,44 @@ create sequence wt_test_runs_seq order; grant select on wt_test_runs_seq to public; - create table wt_test_runs - (id number(38) constraint wt_test_runs_nn1 not null - ,start_dtm timestamp constraint wt_test_runs_nn2 not null - ,runner_owner varchar2(128) constraint wt_test_runs_nn3 not null - ,runner_name varchar2(128) constraint wt_test_runs_nn4 not null - ,is_last_run varchar2(1) - ,dbout_owner varchar2(128) - ,dbout_name varchar2(128) - ,dbout_type varchar2(20) - ,trigger_offset number - ,profiler_runid number - ,end_dtm timestamp - ,error_message varchar2(4000) + (id number(38) constraint wt_test_runs_nn1 not null + ,test_runner_id number(38) constraint wt_test_runs_nn2 not null + ,start_dtm timestamp constraint wt_test_runs_nn3 not null + ,end_dtm timestamp + ,dbout_id number(38) + ,trigger_offset number(6) + ,profiler_runid number + ,is_last_run varchar2(1) + ,error_message varchar2(4000) ,constraint wt_test_runs_pk primary key (id) - ,constraint wt_test_runs_nk1 unique (runner_owner, runner_name, start_dtm) - ,constraint wt_test_runs_fk1 foreign key (profiler_runid) + ,constraint wt_test_runs_nk1 unique (test_runner_id, start_dtm) + ,constraint wt_test_runs_fk1 foreign key (test_runner_id) + references wt_test_runners (id) + ,constraint wt_test_runs_fk2 foreign key (dbout_id) + references wt_dbouts (id) + ,constraint wt_test_runs_fk3 foreign key (profiler_runid) references plsql_profiler_runs (runid) disable - ,constraint wt_test_runs_ck1 check (is_last_run = 'Y') + ,constraint wt_test_runs_ck1 check (trigger_offset >= 0) + ,constraint wt_test_runs_ck2 check (is_last_run = 'Y') ) pctfree 0; create index wt_test_runs_ix1 - on wt_test_runs(is_last_run, runner_owner, runner_name); + on wt_test_runs(is_last_run, test_runner_id); create index wt_test_runs_ix2 - on wt_test_runs(dbout_owner, dbout_name, runner_name); - -comment on table wt_test_runs is 'Test Run data for each execution of the WTPLSQL_RUN procedure.'; -comment on column wt_test_runs.id is 'Primary (Surrogate) Key for each Test Run'; -comment on column wt_test_runs.start_dtm is 'Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 3'; -comment on column wt_test_runs.runner_owner is 'Owner of the package with the WTPLSQL_RUN procedure. Natural Key 2 part 3'; -comment on column wt_test_runs.runner_name is 'Name of the package with the WTPLSQL_RUN procedure. Natural Key 1 part 1'; -comment on column wt_test_runs.is_last_run is 'Flag "Y" to indicate this is the most recent run for this package owner/name'; -comment on column wt_test_runs.dbout_owner is 'Optional Owner of the Database Object Under Test (DBOUT).'; -comment on column wt_test_runs.dbout_name is 'Optional Name of the Database Object Under Test (DBOUT).'; -comment on column wt_test_runs.dbout_type is 'Optional Type of the Database Object Under Test (DBOUT).'; + on wt_test_runs(dbout_id, test_runner_id); + +comment on table wt_test_runs is 'Test Run data for each execution of a Test Runner.'; +comment on column wt_test_runs.id is 'Primary (Surrogate) Key for each Test Run'; +comment on column wt_test_runs.test_runner_id is 'Surrogate Key the Test Runner package. Natural Key 1 part 1'; +comment on column wt_test_runs.start_dtm is 'Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 2'; +comment on column wt_test_runs.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; +comment on column wt_test_runs.dbout_id is 'Optional Surrogate Key to the Database Object Under Test (DBOUT).'; comment on column wt_test_runs.trigger_offset is 'Optional calculated offset from start of Trigger Source to start of Trigger PL/SQL Block.'; comment on column wt_test_runs.profiler_runid is 'Optional DBMS_PROFILER unique run identifier from plsql_profiler_runnumber sequence'; -comment on column wt_test_runs.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; -comment on column wt_test_runs.error_message is 'Optional Last error messages from this Test Run.'; +comment on column wt_test_runs.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; +comment on column wt_test_runs.error_message is 'Optional Error messages from this Test Run.'; grant select on wt_test_runs to public; grant insert on wt_test_runs to public; diff --git a/src/core/wt_testcase.pkb b/src/core/wt_testcase.pkb new file mode 100644 index 0000000..d4ede0b --- /dev/null +++ b/src/core/wt_testcase.pkb @@ -0,0 +1,37 @@ +create or replace package body wt_testcase +as + +--------------------- +-- Public Procedures +--------------------- + +------------------------------------------------------------ +function get_testcase_id + (in_testcase in varchar2) + return number +is + rec wt_testcases%ROWTYPE; +begin + select id into rec.id from wt_testcases + where testcase = in_testcase; + return rec.id; +exception + when NO_DATA_FOUND + then + rec.id := wt_testcases_seq.nextval; + rec.testcase := in_testcase; + insert into wt_testcases values rec; + return rec.id; +end get_testcase_id; + +------------------------------------------------------------ +procedure clear_testcases +is +begin + delete from wt_testcases + where id not in ( + select testcase_id + from wt_results ); +end clear_testcases; + +end wt_testcase; diff --git a/src/core/wt_testcase.pks b/src/core/wt_testcase.pks new file mode 100644 index 0000000..ecae9ce --- /dev/null +++ b/src/core/wt_testcase.pks @@ -0,0 +1,11 @@ +create or replace package wt_testcase + authid definer +as + + function get_testcase_id + (in_testcase in varchar2) + return number; + + procedure clear_testcases; + +end wt_testcase; diff --git a/src/core/wt_testcase_stats.tab b/src/core/wt_testcase_stats.tab deleted file mode 100644 index 8794541..0000000 --- a/src/core/wt_testcase_stats.tab +++ /dev/null @@ -1,37 +0,0 @@ - --- --- Test Runs Statistics Table Installation --- - -create table wt_testcase_stats - (test_run_id number(38) constraint wt_testcase_stats_nn1 not null - ,testcase varchar2(50) constraint wt_testcase_stats_nn2 not null - ,test_yield number - ,asserts number - ,passes number - ,failures number - ,errors number - ,min_interval_msecs number - ,avg_interval_msecs number - ,max_interval_msecs number - ,tot_interval_msecs number - ,constraint wt_testcase_stats_pk primary key (test_run_id, testcase) - ,constraint wt_testcase_stats_fk1 foreign key (test_run_id) - references wt_test_runs (id) - ) pctfree 0; - -comment on table wt_testcase_stats is 'Test Run data statistics for each testcase in the execution of the WTPLSQL_RUN procedure.'; -comment on column wt_testcase_stats.test_run_id is 'Primary (Surrogate) Key for each Test Run. Also the Test Runs Foreign Key.'; -comment on column wt_testcase_stats.testcase is 'Primary Key (part 2). The testcase name'; -comment on column wt_testcase_stats.test_yield is 'Ratio of successful assertions to total assertions.'; -comment on column wt_testcase_stats.asserts is 'Total number of assetions for the testcase.'; -comment on column wt_testcase_stats.passes is 'Number of passed assertions for the testcase.'; -comment on column wt_testcase_stats.failures is 'Number of failed assertions for the testcase.'; -comment on column wt_testcase_stats.errors is 'Number of errored assertions for the testcase.'; -comment on column wt_testcase_stats.min_interval_msecs is 'Minimum interval time between assertions in milliseconds for the testcase'; -comment on column wt_testcase_stats.avg_interval_msecs is 'Average interval time between assertions in milliseconds for the testcase'; -comment on column wt_testcase_stats.max_interval_msecs is 'Maximum interval time between assertions in milliseconds for the testcase'; -comment on column wt_testcase_stats.tot_interval_msecs is 'Total (sum) of interval times between assertions in milliseconds for the testcase'; - -grant select on wt_testcase_stats to public; -grant delete on wt_testcase_stats to public; diff --git a/src/core/wt_testcases.tab b/src/core/wt_testcases.tab new file mode 100644 index 0000000..672a44f --- /dev/null +++ b/src/core/wt_testcases.tab @@ -0,0 +1,20 @@ + +-- +-- Test Cases Table Installation +-- + +create sequence wt_testcases_seq; + +create table wt_testcases + (id number(38) constraint wt_testcases_nn1 not null + ,testcase varchar2(128) constraint wt_testcases_nn2 not null + ,constraint wt_testcases_pk primary key (id) + ,constraint wt_testcases_nk1 unique (testcase) + ); + +comment on table wt_testcases is 'Test Cases Used by Test Runners.'; +comment on column wt_testcases.id is 'Primary (Surrogate) Key for each Test Case'; +comment on column wt_testcases.testcase is 'Natural Key. The Test Case name'; + +grant select on wt_testcases to public; +grant delete on wt_testcases to public; diff --git a/src/core/wtplsql.pkb b/src/core/wtplsql.pkb index 47b1672..3d7ce97 100644 --- a/src/core/wtplsql.pkb +++ b/src/core/wtplsql.pkb @@ -1,10 +1,6 @@ create or replace package body wtplsql as - C_KEEP_NUM_RECS number := 20; - - g_test_runs_rec wt_test_runs%ROWTYPE; - $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN TYPE test_all_aa_type is table of varchar2(400) index by varchar2(400); @@ -33,14 +29,15 @@ begin -- Check for Valid Runner Name select count(*) into l_package_check from user_procedures - where procedure_name = 'WTPLSQL_RUN' + where procedure_name = C_RUNNER_ENTRY_POINT and object_name = g_test_runs_rec.runner_name and object_type = 'PACKAGE'; if l_package_check != 1 then raise_application_error (-20002, 'RUNNER_NAME Procedure "' || - g_test_runs_rec.runner_name || - '.WTPLSQL_RUN" is not valid'); + g_test_runs_rec.runner_name || + '.' || C_RUNNER_ENTRY_POINT || + '" is not valid' ); end if; end check_runner; @@ -80,7 +77,8 @@ $THEN begin g_test_runs_rec.runner_name := 'BOGUS'; l_msg_in := 'Invalid RUNNER_NAME'; - l_err_in := 'ORA-20002: RUNNER_NAME "BOGUS.WTPLSQL_RUN" is not valid'; + l_err_in := 'ORA-20002: RUNNER_NAME "BOGUS.' || + C_RUNNER_ENTRY_POINT || '" is not valid'; check_runner; l_test_sqlerrm; exception when others then @@ -173,6 +171,14 @@ begin return IS_LAST_RUN_FLAG; end get_last_run_flag; +------------------------------------------------------------ +function get_runner_entry_point + return varchar2 +is +begin + return C_RUNNER_ENTRY_POINT; +end get_runner_entry_point; + ------------------------------------------------------------ function show_version return varchar2 @@ -263,6 +269,7 @@ begin delete_runs(in_runner_owner => g_test_runs_rec.runner_owner ,in_runner_name => g_test_runs_rec.runner_name); COMMIT; -- Start a new Transaction + wt_hook.before_run_init; wt_assert.reset_globals; wt_test_run_stat.initialize; wt_result.initialize(g_test_runs_rec.id); @@ -276,9 +283,11 @@ begin out_profiler_runid => g_test_runs_rec.profiler_runid, out_error_message => l_error_stack); concat_err_message(l_error_stack); + wt_hook.after_run_init -- Call the Test Runner begin - execute immediate 'BEGIN ' || in_package_name || '.WTPLSQL_RUN; END;'; + execute immediate 'BEGIN ' || in_package_name || '.' || + C_RUNNER_ENTRY_POINT || '; END;'; exception when OTHERS then @@ -289,9 +298,11 @@ begin -- Finalize insert_test_run; + wt_hook.before_run_final; wt_profiler.finalize; wt_result.finalize; wt_test_run_stat.finalize; + wt_hook.after_run_final; commit; -- Required if called as Remote Procedure Call (RPC) exception @@ -330,10 +341,11 @@ is TYPE runners_nt_type is table of varchar2(128); l_runners_nt runners_nt_type; begin + wt_hook.before_test_all; select object_name bulk collect into l_runners_nt from user_procedures t1 - where procedure_name = 'WTPLSQL_RUN' + where procedure_name = C_RUNNER_ENTRY_POINT and object_type = 'PACKAGE' group by object_name order by object_name; @@ -341,6 +353,7 @@ begin loop test_run(l_runners_nt(i)); end loop; + wt_hook.after_test_all; end test_all; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ @@ -371,6 +384,7 @@ is r_owner varchar2(200); r_name varchar2(200); begin + wt_hook.before_delete_runs; wt_test_run_stat.delete_records(in_test_run_id); wt_profiler.delete_records(in_test_run_id); wt_result.delete_records(in_test_run_id); @@ -392,6 +406,7 @@ begin then null; -- Ignore Error end; + wt_hook.after_delete_runs; end delete_runs; procedure delete_runs @@ -407,7 +422,7 @@ begin order by start_dtm desc, id desc) loop -- Keep the last 20 rest runs for this USER - if num_recs > C_KEEP_NUM_RECS + if num_recs > g_keep_num_recs then -- Autonomous Transaction COMMIT delete_runs(buf2.id); @@ -427,7 +442,7 @@ $THEN -- DELETE_RECORDS has already run when we arrive here. -- Cleanup from previous test delete from wt_test_runs - where id between 0-C_KEEP_NUM_RECS and 0-1; + where id between 0-g_keep_num_recs and 0-1; commit; -------------------------------------- WTPLSQL Testing -- wt_assert.g_testcase := 'DELETE_RUNS Happy Path 1'; @@ -441,8 +456,8 @@ $THEN msg_in => 'Number of Records Before Insert', check_this_in => l_num_recs); wt_assert.this ( - msg_in => 'Number of Records Before Insert <= ' || C_KEEP_NUM_RECS, - check_this_in => l_num_recs <= C_KEEP_NUM_RECS); + msg_in => 'Number of Records Before Insert <= ' || g_keep_num_recs, + check_this_in => l_num_recs <= g_keep_num_recs); -------------------------------------- WTPLSQL Testing -- insert into wt_test_runs values g_test_runs_rec; COMMIT; @@ -468,7 +483,7 @@ $THEN '''', against_value_in => l_num_recs); -------------------------------------- WTPLSQL Testing -- - for i in 1 .. C_KEEP_NUM_RECS + for i in 1 .. g_keep_num_recs loop insert into wt_test_runs (id, start_dtm, runner_owner, runner_name) @@ -478,12 +493,12 @@ $THEN commit; -------------------------------------- WTPLSQL Testing -- wt_assert.eqqueryvalue ( - msg_in => 'Check Added ' || C_KEEP_NUM_RECS || ' records', + msg_in => 'Check Added ' || g_keep_num_recs || ' records', check_query_in => 'select count(*) from wt_test_runs' || ' where runner_owner = ''' || g_test_runs_rec.runner_owner || ''' and runner_name = ''' || g_test_runs_rec.runner_name || '''', - against_value_in => l_num_recs + C_KEEP_NUM_RECS); + against_value_in => l_num_recs + g_keep_num_recs); delete_runs(g_test_runs_rec.runner_owner, g_test_runs_rec.runner_name); -------------------------------------- WTPLSQL Testing -- wt_assert.eqqueryvalue ( @@ -492,9 +507,9 @@ $THEN ' where runner_owner = ''' || g_test_runs_rec.runner_owner || ''' and runner_name = ''' || g_test_runs_rec.runner_name || '''', - against_value_in => C_KEEP_NUM_RECS); + against_value_in => g_keep_num_recs); delete from wt_test_runs - where id between 0-C_KEEP_NUM_RECS and 0-1; + where id between 0-g_keep_num_recs and 0-1; commit; -------------------------------------- WTPLSQL Testing -- wt_assert.eqqueryvalue ( diff --git a/src/core/wtplsql.pks b/src/core/wtplsql.pks index 2e72683..9177c5b 100644 --- a/src/core/wtplsql.pks +++ b/src/core/wtplsql.pks @@ -5,11 +5,20 @@ as IS_LAST_RUN_FLAG constant varchar2(1) := 'Y'; function get_last_run_flag - return varchar2; + return varchar2 deterministic; + + C_RUNNER_ENTRY_POINT constant varchar2(30) := 'WTPLSQL_RUN'; + + function get_runner_entry_point + return varchar2 deterministic; function show_version return varchar2; + g_keep_num_recs number := 20; + + g_test_runs_rec wt_test_runs%ROWTYPE; + procedure test_run (in_package_name in varchar2); diff --git a/src/demo/Package-Test.sql b/src/core_demo/Package-Test.sql similarity index 100% rename from src/demo/Package-Test.sql rename to src/core_demo/Package-Test.sql diff --git a/src/demo/README.txt b/src/core_demo/README.txt similarity index 100% rename from src/demo/README.txt rename to src/core_demo/README.txt diff --git a/src/demo/Table-Test.sql b/src/core_demo/Table-Test.sql similarity index 100% rename from src/demo/Table-Test.sql rename to src/core_demo/Table-Test.sql diff --git a/src/demo/Test-Runner.sql b/src/core_demo/Test-Runner.sql similarity index 100% rename from src/demo/Test-Runner.sql rename to src/core_demo/Test-Runner.sql diff --git a/src/demo/Trigger-Test.sql b/src/core_demo/Trigger-Test.sql similarity index 100% rename from src/demo/Trigger-Test.sql rename to src/core_demo/Trigger-Test.sql diff --git a/src/demo/Type-Test.sql b/src/core_demo/Type-Test.sql similarity index 100% rename from src/demo/Type-Test.sql rename to src/core_demo/Type-Test.sql diff --git a/src/demo/common_setup.sql b/src/core_demo/common_setup.sql similarity index 100% rename from src/demo/common_setup.sql rename to src/core_demo/common_setup.sql diff --git a/src/demo/install.sql b/src/core_demo/install.sql similarity index 100% rename from src/demo/install.sql rename to src/core_demo/install.sql diff --git a/src/demo/installO.LST b/src/core_demo/installO.LST similarity index 100% rename from src/demo/installO.LST rename to src/core_demo/installO.LST diff --git a/src/demo/uninstall.sql b/src/core_demo/uninstall.sql similarity index 100% rename from src/demo/uninstall.sql rename to src/core_demo/uninstall.sql diff --git a/src/demo/uninstallO.LST b/src/core_demo/uninstallO.LST similarity index 100% rename from src/demo/uninstallO.LST rename to src/core_demo/uninstallO.LST diff --git a/src/demo/ut_betwnstr.sql b/src/core_demo/ut_betwnstr.sql similarity index 100% rename from src/demo/ut_betwnstr.sql rename to src/core_demo/ut_betwnstr.sql diff --git a/src/demo/ut_calc_secs_between.sql b/src/core_demo/ut_calc_secs_between.sql similarity index 100% rename from src/demo/ut_calc_secs_between.sql rename to src/core_demo/ut_calc_secs_between.sql diff --git a/src/demo/ut_str.sql b/src/core_demo/ut_str.sql similarity index 100% rename from src/demo/ut_str.sql rename to src/core_demo/ut_str.sql diff --git a/src/demo/ut_truncit.sql b/src/core_demo/ut_truncit.sql similarity index 100% rename from src/demo/ut_truncit.sql rename to src/core_demo/ut_truncit.sql diff --git a/src/core_stats_1/install.sql b/src/core_stats_1/install.sql new file mode 100644 index 0000000..eaf5c66 --- /dev/null +++ b/src/core_stats_1/install.sql @@ -0,0 +1,194 @@ + +-- +-- Core Installation +-- +-- Run as SYS +-- + +-- Capture output +spool install +set showmode off +set serveroutput on size unlimited format truncated + +-- Shared Setup Script +@common_setup.sql + +WHENEVER SQLERROR exit SQL.SQLCODE + +begin + if USER not in ('SYS') + then + raise_application_error (-20000, + 'Not logged in as SYS'); + end if; +end; +/ + +WHENEVER SQLERROR continue + +-- Create the schema owner. + +create user &schema_owner. identified by &schema_owner. + default tablespace users + quota unlimited on users + temporary tablespace temp; + +grant create session to &schema_owner.; +grant create type to &schema_owner.; +grant create sequence to &schema_owner.; +grant create table to &schema_owner.; +grant create trigger to &schema_owner.; +grant create view to &schema_owner.; +grant create procedure to &schema_owner.; +grant create database link to &schema_owner.; +grant create job to &schema_owner.; + +-- This MUST be run by SYS. +grant select on dba_objects to &schema_owner.; +grant select on dba_source to &schema_owner.; +grant select on dba_procedures to &schema_owner.; +grant select on sys.gv_$parameter to &schema_owner.; + +begin + for buff in (select p.value PLSQL_CCFLAGS + from dual d + left join v$parameter p + on p.name in 'plsql_ccflags') + loop + dbms_output.put_line('PLSQL_CCFLAGS Before: ' || buff.PLSQL_CCFLAGS); + end loop; +end; +/ + +-- This block is IDEMPOTENT. It can run more than once and give +-- the same result. +declare + C_FLAG CONSTANT varchar2(100) := 'WTPLSQL_ENABLE:'; + parm_value v$parameter.value%TYPE; + procedure set_plsql_ccflags (in_value in varchar2) is begin + execute immediate 'alter system set PLSQL_CCFLAGS = ''' || + in_value || ''' scope=BOTH'; + end set_plsql_ccflags; +begin + select value into parm_value + from v$parameter + where name in 'plsql_ccflags'; + if nvl(length(parm_value),0) = 0 + then + -- No Flags have been set + set_plsql_ccflags(C_FLAG || 'TRUE'); + elsif instr(parm_value, C_FLAG) = 0 + then + -- C_FLAG is not already present + set_plsql_ccflags(C_FLAG || 'TRUE, ' || parm_value); + end if; +end; +/ + +begin + for buff in (select p.value PLSQL_CCFLAGS + from dual d + left join v$parameter p + on p.name in 'plsql_ccflags') + loop + dbms_output.put_line('PLSQL_CCFLAGS After: ' || buff.PLSQL_CCFLAGS); + end loop; +end; +/ + +-- Public Synonyms + +create or replace public synonym wt_version for &schema_owner..wt_version; +create or replace public synonym wt_test_runs_seq for &schema_owner..wt_test_runs_seq; +create or replace public synonym wt_test_runs for &schema_owner..wt_test_runs; +create or replace public synonym wt_results for &schema_owner..wt_results; +create or replace public synonym wt_dbout_profiles for &schema_owner..wt_dbout_profiles; +create or replace public synonym wt_test_run_stats for &schema_owner..wt_test_run_stats; +create or replace public synonym wt_testcase_stats for &schema_owner..wt_testcase_stats; +create or replace public synonym wt_self_test for &schema_owner..wt_self_test; + +create or replace public synonym utassert for &schema_owner..wt_assert; +create or replace public synonym wt_assert for &schema_owner..wt_assert; +create or replace public synonym wt_text_report for &schema_owner..wt_text_report; +create or replace public synonym wt_wtplsql for &schema_owner..wtplsql; +create or replace public synonym wtplsql for &schema_owner..wtplsql; + + +WHENEVER SQLERROR exit SQL.SQLCODE + +-- Connect as SCHEMA_OWNER +connect &schema_owner./&schema_owner.&connect_string. +set serveroutput on size unlimited format truncated + +begin + if USER != upper('&schema_owner') + then + raise_application_error (-20000, + 'Not logged in as &schema_owner'); + end if; +end; +/ + +WHENEVER SQLERROR continue + +-- +-- Run Oracle's Profiler Table Installation +-- Note1: Tables converted to Global Temporary +-- Note2: Includes "Drop Table" and "Drop Sequence" statements +-- +@proftab.sql +@proftab_comments.sql +-- +create index plsql_profiler_runs_idx1 + on plsql_profiler_runs (run_date); + +-- Core Tables +@wt_version.tab +@wt_test_runs.tab +@wt_results.tab +@wt_dbout_profiles.tab +@wt_test_run_stats.tab +@wt_testcase_stats.tab +@wt_self_test.tab + +-- Install Views +@wt_scheduler_jobs.vw + +-- Package Specifications +@wtplsql.pks +/ +@wt_result.pks +/ +@wt_assert.pks +/ +@wt_profiler.pks +/ +@wt_test_run_stat.pks +/ +@wt_text_report.pks +/ + +grant execute on wtplsql to public; +grant execute on wt_assert to public; +grant execute on wt_text_report to public; + +-- Procedures +@clear_last_run.prc +/ + +-- Package Bodies +@wtplsql.pkb +/ +@wt_result.pkb +/ +@wt_assert.pkb +/ +@wt_profiler.pkb +/ +@wt_test_run_stat.pkb +/ +@wt_text_report.pkb +/ + +set showmode on +spool off diff --git a/src/core_stats_1/wt_profiler_stats.tab b/src/core_stats_1/wt_profiler_stats.tab new file mode 100644 index 0000000..79763a4 --- /dev/null +++ b/src/core_stats_1/wt_profiler_stats.tab @@ -0,0 +1,50 @@ + +-- +-- DBOUT Profiler Statistics Table Installation +-- + +create table wt_profiler_stats + (test_run_id number(38) constraint wt_profiler_stats_nn1 not null + ,coverage_pct number(3) constraint wt_profiler_stats_nn2 not null + ,profiled_lines number(6) constraint wt_profiler_stats_nn3 not null + ,executed_lines number(6) constraint wt_profiler_stats_nn4 not null + ,ignored_lines number(6) constraint wt_profiler_stats_nn5 not null + ,excluded_lines number(6) constraint wt_profiler_stats_nn6 not null + ,notexec_lines number(6) constraint wt_profiler_stats_nn7 not null + ,unknown_lines number(6) constraint wt_profiler_stats_nn8 not null + ,min_executed_usecs number(11) constraint wt_profiler_stats_nn9 not null + ,avg_executed_usecs number(11) constraint wt_profiler_stats_nn10 not null + ,max_executed_usecs number(11) constraint wt_profiler_stats_nn11 not null + ,tot_executed_usecs number(11) constraint wt_profiler_stats_nn12 not null + ,constraint wt_profiler_stats_pk primary key (test_run_id) + ,constraint wt_profiler_stats_fk1 foreign key (test_run_id) + references wt_test_runs (id) + ,constraint wt_profiler_stats_ck1 check (coverage_pct between 0 and 100) + ,constraint wt_profiler_stats_ck2 check (profiled_lines >= 0) + ,constraint wt_profiler_stats_ck3 check (executed_lines >= 0) + ,constraint wt_profiler_stats_ck4 check (ignored_lines >= 0) + ,constraint wt_profiler_stats_ck5 check (excluded_lines >= 0) + ,constraint wt_profiler_stats_ck6 check (notexec_lines >= 0) + ,constraint wt_profiler_stats_ck7 check (unknown_lines >= 0) + ,constraint wt_profiler_stats_ck8 check (min_executed_usecs >= 0) + ,constraint wt_profiler_stats_ck9 check (avg_executed_usecs >= min_executed_usecs) + ,constraint wt_profiler_stats_ck10 check (max_executed_usecs >= avg_executed_usecs) + ,constraint wt_profiler_stats_ck11 check (tot_executed_usecs >= max_executed_usecs) + ) pctfree 0; + +comment on table wt_profiler_stats is 'Test Run profile statistics for each execution of a Test Runner.'; +comment on column wt_profiler_stats.test_run_id is 'Primary (Surrogate) Key for each Test Run. Also the Test Runs foreign key.'; +comment on column wt_profiler_stats.coverage_pct is 'Percentage of executed source lines to valid executable source lines.'; +comment on column wt_profiler_stats.profiled_lines is 'Total number of source lines as counted by DBMS_PROFILER'; +comment on column wt_profiler_stats.executed_lines is 'Number of source lines executed'; +comment on column wt_profiler_stats.ignored_lines is 'Number of source lines ignored as uncountable'; +comment on column wt_profiler_stats.excluded_lines is 'Number of source lines excluded due to unexplained DBMS_PROFILER metrics'; +comment on column wt_profiler_stats.notexec_lines is 'Number of source lines not executed'; +comment on column wt_profiler_stats.unknown_lines is 'Number of source lines that have unexplained DBMS_PROFILER metrics'; +comment on column wt_profiler_stats.min_executed_usecs is 'Minumum execution time for a line of source in microseconds'; +comment on column wt_profiler_stats.avg_executed_usecs is 'Average execution time for a line of source in microseconds'; +comment on column wt_profiler_stats.max_executed_usecs is 'Maximum execution time for a line of source in microseconds'; +comment on column wt_profiler_stats.tot_executed_usecs is 'Total (Sum) of execution times for a line of source in microseconds'; + +grant select on wt_profiler_stats to public; +grant delete on wt_profiler_stats to public; diff --git a/src/core_stats_1/wt_profiler_stats_vw.vw b/src/core_stats_1/wt_profiler_stats_vw.vw new file mode 100644 index 0000000..d728599 --- /dev/null +++ b/src/core_stats_1/wt_profiler_stats_vw.vw @@ -0,0 +1,61 @@ + +-- +-- Test Run Profile Statistics View Installation +-- + +create view wt_profiler_stats_vw as +select stat.test_run_id + ,run.test_runner_id + ,tr.runner_owner + ,tr.runner_name + ,run.dbout_id + ,dbo.dbout_owner + ,dbo.dbout_name + ,dbo.dbout_type + ,run.start_dtm + ,run.end_dtm + ,run.trigger_offset + ,run.profiler_runid + ,run.is_last_run + ,run.error_message + ,stat.line + ,stat.status + ,stat.total_occur + ,stat.total_usecs + ,stat.min_usecs + ,stat.max_usecs + ,stat.text + from wt_profiler_stats stat + join wt_test_runs run + on run.id = stat.test_run_id + join wt_test_runners tr + on tr.id = run.test_runner_id + join wt_profilers dbo + on dbo.id = run.dbout_id; + +comment on table wt_profiler_stats_vw is 'Test Run profile statistics for each execution of a Test Runner.'; +comment on column wt_profiler_stats_vw.test_run_id is 'Primary (Surrogate) Key for each Test Run'; +comment on column wt_profiler_stats_vw.test_runner_id is 'Primary (Surrogate) Key for each Test Runner'; +comment on column wt_profiler_stats_vw.runner_owner is 'Owner of the Test Runner package. Natural Key 1 part 1'; +comment on column wt_profiler_stats_vw.runner_name is 'Name of the Test Runner package. Natural Key 1 part 2'; +comment on column wt_profiler_stats_vw.id is 'Primary (Surrogate) Key for each Database Objects Under Test (DBOUT)'; +comment on column wt_profiler_stats_vw.dbout_owner is 'Owner of the Database Object Under Test (DBOUT).'; +comment on column wt_profiler_stats_vw.dbout_name is 'Name of the Database Object Under Test (DBOUT).'; +comment on column wt_profiler_stats_vw.dbout_type is 'Type of the Database Object Under Test (DBOUT).'; +comment on column wt_profiler_stats_vw.start_dtm is 'Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 2'; +comment on column wt_profiler_stats_vw.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; +comment on column wt_profiler_stats_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; +comment on column wt_profiler_stats_vw.error_message is 'Optional Error messages from this Test Run.'; +comment on column wt_profiler_stats_vw.coverage_pct is 'Percentage of executed source lines to valid executable source lines.'; +comment on column wt_profiler_stats_vw.profiled_lines is 'Total number of source lines as counted by DBMS_PROFILER'; +comment on column wt_profiler_stats_vw.executed_lines is 'Number of source lines executed'; +comment on column wt_profiler_stats_vw.ignored_lines is 'Number of source lines ignored as uncountable'; +comment on column wt_profiler_stats_vw.excluded_lines is 'Number of source lines excluded due to unexplained DBMS_PROFILER metrics'; +comment on column wt_profiler_stats_vw.notexec_lines is 'Number of source lines not executed'; +comment on column wt_profiler_stats_vw.unknown_lines is 'Number of source lines that have unexplained DBMS_PROFILER metrics'; +comment on column wt_profiler_stats_vw.min_executed_usecs is 'Minumum execution time for a line of source in microseconds'; +comment on column wt_profiler_stats_vw.avg_executed_usecs is 'Average execution time for a line of source in microseconds'; +comment on column wt_profiler_stats_vw.max_executed_usecs is 'Maximum execution time for a line of source in microseconds'; +comment on column wt_profiler_stats_vw.tot_executed_usecs is 'Total (Sum) of execution times for a line of source in microseconds'; + +grant select on wt_profiler_stats_vw to public; diff --git a/src/core/wt_test_run_stat.pkb b/src/core_stats_1/wt_test_run_stat.pkb similarity index 95% rename from src/core/wt_test_run_stat.pkb rename to src/core_stats_1/wt_test_run_stat.pkb index e9bdb57..80ccc4c 100644 --- a/src/core/wt_test_run_stat.pkb +++ b/src/core_stats_1/wt_test_run_stat.pkb @@ -84,12 +84,11 @@ begin g_rec.passes := nvl(g_rec.passes,0) + 1; when 'FAIL' then g_rec.failures := nvl(g_rec.failures,0) + 1; - when 'ERR' then - g_rec.errors := nvl(g_rec.errors,0) + 1; else raise_application_error(-20010, 'Unknown Result status "' || in_results_rec.status || '"'); end case; + -- g_rec.test_run_id := in_results_rec.test_run_id; g_rec.asserts := nvl(g_rec.asserts,0) + 1; g_rec.min_interval_msecs := least(nvl(g_rec.min_interval_msecs,999999999) @@ -98,28 +97,27 @@ begin ,in_results_rec.interval_msecs); g_rec.tot_interval_msecs := nvl(g_rec.tot_interval_msecs,0) + in_results_rec.interval_msecs; - if in_results_rec.testcase is not null - then - tc := in_results_rec.testcase; - g_tc_aa(tc).testcase := tc; - g_tc_aa(tc).test_run_id := in_results_rec.test_run_id; - g_tc_aa(tc).asserts := nvl(g_tc_aa(tc).asserts,0) + 1; - case in_results_rec.status - when 'PASS' then - g_tc_aa(tc).passes := nvl(g_tc_aa(tc).passes,0) + 1; - when 'FAIL' then - g_tc_aa(tc).failures := nvl(g_tc_aa(tc).failures,0) + 1; - when 'ERR' then - g_tc_aa(tc).errors := nvl(g_tc_aa(tc).errors,0) + 1; - -- No need to check "ELSE" because it would have been caught above - end case; - g_tc_aa(tc).min_interval_msecs := least(nvl(g_tc_aa(tc).min_interval_msecs,999999999) + -- + tc := nvl(in_results_rec.testcase,'Unnamed Test Case'); + g_tc_aa(tc).testcase := tc; + g_tc_aa(tc).test_run_id := in_results_rec.test_run_id; + g_tc_aa(tc).asserts := nvl(g_tc_aa(tc).asserts,0) + 1; + -- + case in_results_rec.status + when 'PASS' then + g_tc_aa(tc).passes := nvl(g_tc_aa(tc).passes,0) + 1; + when 'FAIL' then + g_tc_aa(tc).failures := nvl(g_tc_aa(tc).failures,0) + 1; + -- No need to check "ELSE" because it would have been caught above + end case; + -- + g_tc_aa(tc).min_interval_msecs := least(nvl(g_tc_aa(tc).min_interval_msecs,999999999) + ,in_results_rec.interval_msecs); + g_tc_aa(tc).max_interval_msecs := greatest(nvl(g_tc_aa(tc).max_interval_msecs,0) ,in_results_rec.interval_msecs); - g_tc_aa(tc).max_interval_msecs := greatest(nvl(g_tc_aa(tc).max_interval_msecs,0) - ,in_results_rec.interval_msecs); - g_tc_aa(tc).tot_interval_msecs := nvl(g_tc_aa(tc).tot_interval_msecs,0) + - in_results_rec.interval_msecs; - end if; + g_tc_aa(tc).tot_interval_msecs := nvl(g_tc_aa(tc).tot_interval_msecs,0) + + in_results_rec.interval_msecs; + -- end add_result; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ @@ -419,21 +417,25 @@ is l_executable_lines number; tc varchar2(50); begin + -- if g_rec.test_run_id is null then initialize; return; end if; + -- g_rec.testcases := g_tc_aa.COUNT; g_rec.asserts := nvl(g_rec.asserts ,0); g_rec.passes := nvl(g_rec.passes ,0); g_rec.failures := nvl(g_rec.failures,0); g_rec.errors := nvl(g_rec.errors ,0); + -- if g_rec.asserts != 0 then g_rec.test_yield := round(g_rec.passes/g_rec.asserts, 3); g_rec.avg_interval_msecs := round(g_rec.tot_interval_msecs/g_rec.asserts, 3); end if; + -- if g_rec.profiled_lines is not null then g_rec.executed_lines := nvl(g_rec.executed_lines ,0); @@ -448,28 +450,29 @@ begin g_rec.avg_executed_usecs := round(g_rec.tot_executed_usecs/l_executable_lines, 3); end if; end if; + -- insert into wt_test_run_stats values g_rec; - if g_rec.testcases > 0 - then - tc := g_tc_aa.FIRST; - loop - g_tc_aa(tc).asserts := nvl(g_tc_aa(tc).asserts ,0); - g_tc_aa(tc).passes := nvl(g_tc_aa(tc).passes ,0); - g_tc_aa(tc).failures := nvl(g_tc_aa(tc).failures,0); - g_tc_aa(tc).errors := nvl(g_tc_aa(tc).errors ,0); - if g_rec.asserts != 0 - then - g_tc_aa(tc).test_yield := round(g_tc_aa(tc).passes / - g_tc_aa(tc).asserts, 3); - g_tc_aa(tc).avg_interval_msecs := round(g_tc_aa(tc).tot_interval_msecs / - g_tc_aa(tc).asserts, 3); - end if; - insert into wt_testcase_stats values g_tc_aa(tc); - exit when tc = g_tc_aa.LAST; - tc := g_tc_aa.NEXT(tc); - end loop; - end if; + -- + tc := g_tc_aa.FIRST; + loop + g_tc_aa(tc).asserts := nvl(g_tc_aa(tc).asserts ,0); + g_tc_aa(tc).passes := nvl(g_tc_aa(tc).passes ,0); + g_tc_aa(tc).failures := nvl(g_tc_aa(tc).failures,0); + g_tc_aa(tc).errors := nvl(g_tc_aa(tc).errors ,0); + if g_rec.asserts != 0 + then + g_tc_aa(tc).test_yield := round(g_tc_aa(tc).passes / + g_tc_aa(tc).asserts, 3); + g_tc_aa(tc).avg_interval_msecs := round(g_tc_aa(tc).tot_interval_msecs / + g_tc_aa(tc).asserts, 3); + end if; + insert into wt_testcase_stats values g_tc_aa(tc); + exit when tc = g_tc_aa.LAST; + tc := g_tc_aa.NEXT(tc); + end loop; + -- initialize; + -- end finalize; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ diff --git a/src/core/wt_test_run_stat.pks b/src/core_stats_1/wt_test_run_stat.pks similarity index 100% rename from src/core/wt_test_run_stat.pks rename to src/core_stats_1/wt_test_run_stat.pks diff --git a/src/core_stats_1/wt_test_run_stats.tab b/src/core_stats_1/wt_test_run_stats.tab new file mode 100644 index 0000000..16d2723 --- /dev/null +++ b/src/core_stats_1/wt_test_run_stats.tab @@ -0,0 +1,41 @@ + +-- +-- Test Runs Statistics Table Installation +-- + +create table wt_test_run_stats + (test_run_id number(38) constraint wt_test_run_stats_nn1 not null + ,yield_pct number(3) constraint wt_test_run_stats_nn2 not null + ,testcases number(7) constraint wt_test_run_stats_nn3 not null + ,passes number(7) constraint wt_test_run_stats_nn4 not null + ,failures number(7) constraint wt_test_run_stats_nn5 not null + ,min_interval_msecs number(10) constraint wt_test_run_stats_nn6 not null + ,avg_interval_msecs number(10) constraint wt_test_run_stats_nn7 not null + ,max_interval_msecs number(10) constraint wt_test_run_stats_nn10 not null + ,tot_interval_msecs number(10) constraint wt_test_run_stats_nn11 not null + ,constraint wt_test_run_stats_pk primary key (test_run_id) + ,constraint wt_test_run_stats_fk1 foreign key (test_run_id) + references wt_test_runs (id) + ,constraint wt_test_run_stats_ck1 check (yield_pct = trunc(100*passes/testcases)) + ,constraint wt_test_run_stats_ck2 check (testcases = passes + failures) + ,constraint wt_test_run_stats_ck3 check (passes >= 0) + ,constraint wt_test_run_stats_ck4 check (failures >= 0) + ,constraint wt_test_run_stats_ck5 check (min_interval_msecs >= 0) + ,constraint wt_test_run_stats_ck6 check (avg_interval_msecs >= min_interval_msecs) + ,constraint wt_test_run_stats_ck7 check (max_interval_msecs >= avg_interval_msecs) + ,constraint wt_test_run_stats_ck8 check (tot_interval_msecs >= max_interval_msecs) + ) pctfree 0; + +comment on table wt_test_run_stats is 'Test Run data statistics for each execution of a Test Runner.'; +comment on column wt_test_run_stats.test_run_id is 'Primary Key for each Test Run. Also the Test Runs foreign key.'; +comment on column wt_test_run_stats.yield_pct is 'Percentage of successful test cases to total Test Cases.'; +comment on column wt_test_run_stats.testcases is 'Total number of Test Cases.'; +comment on column wt_test_run_stats.passes is 'Number of passed Test Cases.'; +comment on column wt_test_run_stats.failures is 'Number of failed Test Cases.'; +comment on column wt_test_run_stats.min_interval_msecs is 'Minimum tot_interval_msecs between assertions across all Test Cases'; +comment on column wt_test_run_stats.avg_interval_msecs is 'Average tot_interval_msecs between assertions across all Test Cases'; +comment on column wt_test_run_stats.max_interval_msecs is 'Maximum tot_interval_msecs between assertions across all Test Cases'; +comment on column wt_test_run_stats.tot_interval_msecs is 'Total (sum) of tot_interval_msecs between assertions across all Test Cases'; + +grant select on wt_test_run_stats to public; +grant delete on wt_test_run_stats to public; diff --git a/src/core_stats_1/wt_test_run_stats_vw.vw b/src/core_stats_1/wt_test_run_stats_vw.vw new file mode 100644 index 0000000..533377d --- /dev/null +++ b/src/core_stats_1/wt_test_run_stats_vw.vw @@ -0,0 +1,47 @@ + +-- +-- Test Runs Statistics View Installation +-- + +create view wt_test_run_stats_vw as +select stat.test_run_id + ,run.test_runner_id + ,tr.runner_owner + ,tr.runner_name + ,run.start_dtm + ,run.end_dtm + ,run.is_last_run + ,run.error_message + ,stat.yield_pct + ,stat.testcases + ,stat.passes + ,stat.failures + ,stat.min_interval_msecs + ,stat.avg_interval_msecs + ,stat.max_interval_msecs + ,stat.tot_interval_msecs + from wt_test_run_stats stat + join wt_test_runs run + on run.id = stat.test_run_id + join wt_test_runners tr + on tr.id = run.test_runner_id; + +comment on table wt_test_run_stats_vw is 'Test Run data statistics for each execution of a Test Runner.'; +comment on column wt_test_run_stats_vw.test_run_id is 'Primary (Surrogate) Key for each Test Run'; +comment on column wt_test_run_stats_vw.test_runner_id is 'Primary (Surrogate) Key for each Test Runner'; +comment on column wt_test_run_stats_vw.runner_owner is 'Owner of the Test Runner package. Natural Key 1 part 1'; +comment on column wt_test_run_stats_vw.runner_name is 'Name of the Test Runner package. Natural Key 1 part 2'; +comment on column wt_test_run_stats_vw.start_dtm is 'Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 2'; +comment on column wt_test_run_stats_vw.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; +comment on column wt_test_run_stats_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; +comment on column wt_test_run_stats_vw.error_message is 'Optional Error messages from this Test Run.'; +comment on column wt_test_run_stats_vw.yield_pct is 'Percentage of successful test cases to total Test Cases.'; +comment on column wt_test_run_stats_vw.testcases is 'Total number of Test Cases.'; +comment on column wt_test_run_stats_vw.passes is 'Number of passed Test Cases.'; +comment on column wt_test_run_stats_vw.failures is 'Number of failed Test Cases.'; +comment on column wt_test_run_stats_vw.min_interval_msecs is 'Minimum tot_interval_msecs between assertions across all Test Cases'; +comment on column wt_test_run_stats_vw.avg_interval_msecs is 'Average tot_interval_msecs between assertions across all Test Cases'; +comment on column wt_test_run_stats_vw.max_interval_msecs is 'Maximum tot_interval_msecs between assertions across all Test Cases'; +comment on column wt_test_run_stats_vw.tot_interval_msecs is 'Total (sum) of tot_interval_msecs between assertions across all Test Cases'; + +grant select on wt_test_run_stats_vw to public; \ No newline at end of file diff --git a/src/core_stats_1/wt_testcase_stats.tab b/src/core_stats_1/wt_testcase_stats.tab new file mode 100644 index 0000000..1418172 --- /dev/null +++ b/src/core_stats_1/wt_testcase_stats.tab @@ -0,0 +1,46 @@ + +-- +-- Test Runs Statistics Table Installation +-- + +create table wt_testcase_stats + (test_run_id number(38) constraint wt_testcase_stats_nn1 not null + ,testcase_id number(38) constraint wt_testcase_stats_nn2 not null + ,yield_pct number(3) constraint wt_testcase_stats_nn3 not null + ,asserts number(7) constraint wt_testcase_stats_nn4 not null + ,passes number(7) constraint wt_testcase_stats_nn5 not null + ,failures number(7) constraint wt_testcase_stats_nn6 not null + ,min_interval_msecs number(10) constraint wt_testcase_stats_nn7 not null + ,avg_interval_msecs number(10) constraint wt_testcase_stats_nn8 not null + ,max_interval_msecs number(10) constraint wt_testcase_stats_nn9 not null + ,tot_interval_msecs number(10) constraint wt_testcase_stats_nn10 not null + ,constraint wt_testcase_stats_pk primary key (testcase_id) + ,constraint wt_testcase_stats_nk1 unique (test_run_id, testcase) + ,constraint wt_testcase_stats_fk1 foreign key (test_run_id) + references wt_test_runs (id) + ,constraint wt_testcase_stats_fk2 foreign key (testcase_id) + references wt_testcases (id) + ,constraint wt_testcase_stats_ck1 check (yield_pct between 0 and 100) + ,constraint wt_testcase_stats_ck2 check (asserts = passes + failures) + ,constraint wt_testcase_stats_ck3 check (passes >= 0) + ,constraint wt_testcase_stats_ck4 check (failures >= 0) + ,constraint wt_testcase_stats_ck5 check (min_interval_msecs >= 0) + ,constraint wt_testcase_stats_ck6 check (avg_interval_msecs >= min_interval_msecs) + ,constraint wt_testcase_stats_ck7 check (max_interval_msecs >= avg_interval_msecs) + ,constraint wt_testcase_stats_ck8 check (tot_interval_msecs >= max_interval_msecs) + ) pctfree 0; + +comment on table wt_testcase_stats is 'Test Run data statistics for each testcase in the execution of a Test Runner.'; +comment on column wt_testcase_stats.test_run_id is 'Primary Key for each Test Run. Also the Test Runs Foreign Key.'; +comment on column wt_testcase_stats.testcase_id is 'Primary Key (part 2) for each Test Case. Also the Test Cases Foreign Key.'; +comment on column wt_testcase_stats.yield_pct is 'Percentage of successful assertions to total assertions.'; +comment on column wt_testcase_stats.asserts is 'Total number of assetions for the Test Case.'; +comment on column wt_testcase_stats.passes is 'Number of passed assertions for the Test Case.'; +comment on column wt_testcase_stats.failures is 'Number of failed assertions for the Test Case.'; +comment on column wt_testcase_stats.min_interval_msecs is 'Minimum interval time between assertions in milliseconds for the Test Case'; +comment on column wt_testcase_stats.avg_interval_msecs is 'Average interval time between assertions in milliseconds for the Test Case'; +comment on column wt_testcase_stats.max_interval_msecs is 'Maximum interval time between assertions in milliseconds for the Test Case'; +comment on column wt_testcase_stats.tot_interval_msecs is 'Total (sum) of interval times between assertions in milliseconds for the Test Case'; + +grant select on wt_testcase_stats to public; +grant delete on wt_testcase_stats to public; diff --git a/src/core_stats_1/wt_testcase_stats_vw.vw b/src/core_stats_1/wt_testcase_stats_vw.vw new file mode 100644 index 0000000..734db41 --- /dev/null +++ b/src/core_stats_1/wt_testcase_stats_vw.vw @@ -0,0 +1,53 @@ + +-- +-- Test Cases Statistics View Installation +-- + +create view wt_testcase_stats_vw as +select stat.test_run_id + ,run.test_runner_id + ,tr.runner_owner + ,tr.runner_name + ,stat.testcase_id + ,tc.testcase + ,run.start_dtm + ,run.end_dtm + ,run.is_last_run + ,run.error_message + ,stat.yield_pct + ,stat.asserts + ,stat.passes + ,stat.failures + ,stat.min_interval_msecs + ,stat.avg_interval_msecs + ,stat.max_interval_msecs + ,stat.tot_interval_msecs + from wt_testcase_stats stat + join wt_test_runs run + on run.id = stat.test_run_id + join wt_test_runners tr + on tr.id = run.test_runner_id + join wt_testcases tc + on tc.id = stat.testcase_id; + +comment on table wt_testcase_stats_vw is 'Test Run data statistics for each testcase in the execution of a Test Runner.'; +comment on column wt_testcase_stats_vw.test_run_id is 'Primary (Surrogate) Key for each Test Run'; +comment on column wt_testcase_stats_vw.test_runner_id is 'Primary (Surrogate) Key for each Test Runner'; +comment on column wt_testcase_stats_vw.runner_owner is 'Owner of the Test Runner package. Natural Key 1 part 1'; +comment on column wt_testcase_stats_vw.runner_name is 'Name of the Test Runner package. Natural Key 1 part 2'; +comment on column wt_testcases.testcase_id is 'Primary (Surrogate) Key for each Test Case'; +comment on column wt_testcases.testcase is 'The Test Case name'; +comment on column wt_testcase_stats_vw.start_dtm is 'Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 2'; +comment on column wt_testcase_stats_vw.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; +comment on column wt_testcase_stats_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; +comment on column wt_testcase_stats_vw.error_message is 'Optional Error messages from this Test Run.'; +comment on column wt_testcase_stats_vw.yield_pct is 'Percentage of successful assertions to total assertions.'; +comment on column wt_testcase_stats_vw.asserts is 'Total number of assetions for the Test Case.'; +comment on column wt_testcase_stats_vw.passes is 'Number of passed assertions for the Test Case.'; +comment on column wt_testcase_stats_vw.failures is 'Number of failed assertions for the Test Case.'; +comment on column wt_testcase_stats_vw.min_interval_msecs is 'Minimum interval time between assertions in milliseconds for the Test Case'; +comment on column wt_testcase_stats_vw.avg_interval_msecs is 'Average interval time between assertions in milliseconds for the Test Case'; +comment on column wt_testcase_stats_vw.max_interval_msecs is 'Maximum interval time between assertions in milliseconds for the Test Case'; +comment on column wt_testcase_stats_vw.tot_interval_msecs is 'Total (sum) of interval times between assertions in milliseconds for the Test Case'; + +grant select on wt_testcase_stats_vw to public; diff --git a/src/gui/Notes.txt b/src/core_stats_gui/Notes.txt similarity index 100% rename from src/gui/Notes.txt rename to src/core_stats_gui/Notes.txt diff --git a/src/gui/WTP_workspace.sql b/src/core_stats_gui/WTP_workspace.sql similarity index 100% rename from src/gui/WTP_workspace.sql rename to src/core_stats_gui/WTP_workspace.sql diff --git a/src/gui/f700.sql b/src/core_stats_gui/f700.sql similarity index 100% rename from src/gui/f700.sql rename to src/core_stats_gui/f700.sql diff --git a/src/gui/install.sql b/src/core_stats_gui/install.sql similarity index 100% rename from src/gui/install.sql rename to src/core_stats_gui/install.sql diff --git a/src/junit_xml/README.txt b/src/junit_xml/README.txt new file mode 100644 index 0000000..d92959c --- /dev/null +++ b/src/junit_xml/README.txt @@ -0,0 +1,20 @@ + + White Box PL/SQL Testing + src/core/README.txt + +FILE DESCRIPTION +---------------------- ----------------------- +junit_report_all.prc Procedure that create JUnit XML from WT_TEST_RUNS +wtplsql_conversion.sql PL/SQL block that adds Runner Entry Point to packages + +NOTE: "install.sql" creates PUBLIC SYNONYMS. + + +Install Procedure: +------------------ +All extras a individually installed. + + +UnInstall Procedure: +-------------------- +No automated un-install. diff --git a/src/extras/junit_report_all.prc b/src/junit_xml/junit_report_all.prc similarity index 74% rename from src/extras/junit_report_all.prc rename to src/junit_xml/junit_report_all.prc index 7c883ca..af1db9c 100644 --- a/src/extras/junit_report_all.prc +++ b/src/junit_xml/junit_report_all.prc @@ -22,10 +22,8 @@ begin then 'TEST_RUNNER' else tr.dbout_name || ':' || tr.dbout_type end CLASS_NAME - ,asserts - ,failures - ,ts.errors + case when tr.error_message is null - then 0 else 1 end ERRORS + ,ts.testcases + ,ts.failures ,extract(day from (tr.end_dtm - tr.start_dtm) * 86400000) TOT_INTERVAL_MSECS @@ -33,12 +31,12 @@ begin from wt_test_runs tr left join wt_test_run_stats ts on ts.test_run_id = tr.id - where is_last_run = wtplsql.get_last_run_flag - order by start_dtm, id ) + where tr.is_last_run = wtplsql.get_last_run_flag + order by tr.start_dtm, tr.id ) loop p(' '); else - p(' '); - p(' ' ); - -- Put the big error on top - p(suites.error_message); + p(' '); -- Print each of the non-passing results for asrts in ( select result_seq From 325e636f30d242d7dd96aa4310a657380c1af1bc Mon Sep 17 00:00:00 2001 From: DDieterich Date: Mon, 5 Nov 2018 18:15:39 -0600 Subject: [PATCH 026/141] Major Directory Changes --- docs/{demo => core_demo}/Package-Test.htm | 0 docs/{demo => core_demo}/Package-Test.md | 0 docs/{demo => core_demo}/README.htm | 0 docs/{demo => core_demo}/README.md | 0 docs/{demo => core_demo}/Table-Test.htm | 0 docs/{demo => core_demo}/Table-Test.md | 0 docs/{demo => core_demo}/Test-Runner.htm | 0 docs/{demo => core_demo}/Test-Runner.md | 0 docs/{demo => core_demo}/Trigger-Test.htm | 0 docs/{demo => core_demo}/Trigger-Test.md | 0 docs/{demo => core_demo}/Type-Test.htm | 0 docs/{demo => core_demo}/Type-Test.md | 0 .../images/Leaving Something Behind.PNG | Bin .../images/Setup and Teardown.PNG | Bin .../images/Testing Put Line and Get Line.PNG | Bin docs/{demo => core_demo}/md-to-htm.bat | 0 docs/{demo => core_demo}/md-to-htm.lua | 0 docs/{demo => core_demo}/ut_betwnstr.htm | 0 docs/{demo => core_demo}/ut_betwnstr.md | 0 .../ut_calc_secs_between.htm | 0 .../ut_calc_secs_between.md | 0 docs/{demo => core_demo}/ut_str.htm | 0 docs/{demo => core_demo}/ut_str.md | 0 docs/{demo => core_demo}/ut_truncit.htm | 0 docs/{demo => core_demo}/ut_truncit.md | 0 docs/{gui => core_stats_gui}/README.md | 0 docs/{gui => core_stats_gui}/README.txt | 0 docs/{gui => core_stats_gui}/_config.yml | 0 docs/{gui => core_stats_gui}/md-to-htm.bat | 0 docs/{gui => core_stats_gui}/md-to-htm.lua | 0 src/conversion/utplsql_to_wtplsql.sql | 44 +++++--- src/core/wt_assert.pkb | 11 +- src/core/wt_assert.pks | 7 -- src/core/wt_dbout.pkb | 37 ------- src/core/wt_dbout.pks | 11 -- src/core/wt_dbouts.tab | 16 +-- src/core/wt_profile.pkb | 10 ++ src/core/wt_profile.pks | 10 -- src/core/wt_result.pkb | 4 + src/core/wt_result.pks | 4 - src/core/wt_test_runner.pkb | 37 ------- src/core/wt_test_runner.pks | 11 -- src/core/wt_test_runners.tab | 10 +- src/core/wt_testcase.pkb | 8 +- src/core/wt_testcase.pks | 4 +- src/core/wt_testcases.tab | 6 +- src/{core_demo => demo}/Package-Test.sql | 0 src/{core_demo => demo}/README.txt | 0 src/{core_demo => demo}/Table-Test.sql | 0 src/{core_demo => demo}/Test-Runner.sql | 0 src/{core_demo => demo}/Trigger-Test.sql | 0 src/{core_demo => demo}/Type-Test.sql | 0 src/{core_demo => demo}/common_setup.sql | 0 src/{core_demo => demo}/install.sql | 0 src/{core_demo => demo}/installO.LST | 0 src/{core_demo => demo}/uninstall.sql | 0 src/{core_demo => demo}/uninstallO.LST | 0 src/{core_demo => demo}/ut_betwnstr.sql | 0 .../ut_calc_secs_between.sql | 0 src/{core_demo => demo}/ut_str.sql | 0 src/{core_demo => demo}/ut_truncit.sql | 0 src/junit_xml/junit_report_all.prc | 50 ++++++--- src/junit_xml/stats_junit_report_all.prc | 102 ++++++++++++++++++ src/{core_stats_1 => stats}/install.sql | 0 .../wt_profiler_stats.tab | 0 .../wt_profiler_stats_vw.vw | 0 .../wt_test_run_stat.pkb | 2 +- .../wt_test_run_stat.pks | 0 .../wt_test_run_stats.tab | 0 .../wt_test_run_stats_vw.vw | 0 .../wt_testcase_stats.tab | 0 .../wt_testcase_stats_vw.vw | 0 src/stats_gui/APEX Notes.txt | 72 +++++++++++++ src/{core_stats_gui => stats_gui}/Notes.txt | 0 .../WTP_workspace.sql | 0 src/{core_stats_gui => stats_gui}/f700.sql | 71 ++++++------ src/{core_stats_gui => stats_gui}/install.sql | 0 77 files changed, 312 insertions(+), 215 deletions(-) rename docs/{demo => core_demo}/Package-Test.htm (100%) rename docs/{demo => core_demo}/Package-Test.md (100%) rename docs/{demo => core_demo}/README.htm (100%) rename docs/{demo => core_demo}/README.md (100%) rename docs/{demo => core_demo}/Table-Test.htm (100%) rename docs/{demo => core_demo}/Table-Test.md (100%) rename docs/{demo => core_demo}/Test-Runner.htm (100%) rename docs/{demo => core_demo}/Test-Runner.md (100%) rename docs/{demo => core_demo}/Trigger-Test.htm (100%) rename docs/{demo => core_demo}/Trigger-Test.md (100%) rename docs/{demo => core_demo}/Type-Test.htm (100%) rename docs/{demo => core_demo}/Type-Test.md (100%) rename docs/{demo => core_demo}/images/Leaving Something Behind.PNG (100%) rename docs/{demo => core_demo}/images/Setup and Teardown.PNG (100%) rename docs/{demo => core_demo}/images/Testing Put Line and Get Line.PNG (100%) rename docs/{demo => core_demo}/md-to-htm.bat (100%) rename docs/{demo => core_demo}/md-to-htm.lua (100%) rename docs/{demo => core_demo}/ut_betwnstr.htm (100%) rename docs/{demo => core_demo}/ut_betwnstr.md (100%) rename docs/{demo => core_demo}/ut_calc_secs_between.htm (100%) rename docs/{demo => core_demo}/ut_calc_secs_between.md (100%) rename docs/{demo => core_demo}/ut_str.htm (100%) rename docs/{demo => core_demo}/ut_str.md (100%) rename docs/{demo => core_demo}/ut_truncit.htm (100%) rename docs/{demo => core_demo}/ut_truncit.md (100%) rename docs/{gui => core_stats_gui}/README.md (100%) rename docs/{gui => core_stats_gui}/README.txt (100%) rename docs/{gui => core_stats_gui}/_config.yml (100%) rename docs/{gui => core_stats_gui}/md-to-htm.bat (100%) rename docs/{gui => core_stats_gui}/md-to-htm.lua (100%) delete mode 100644 src/core/wt_dbout.pkb delete mode 100644 src/core/wt_dbout.pks delete mode 100644 src/core/wt_test_runner.pkb delete mode 100644 src/core/wt_test_runner.pks rename src/{core_demo => demo}/Package-Test.sql (100%) rename src/{core_demo => demo}/README.txt (100%) rename src/{core_demo => demo}/Table-Test.sql (100%) rename src/{core_demo => demo}/Test-Runner.sql (100%) rename src/{core_demo => demo}/Trigger-Test.sql (100%) rename src/{core_demo => demo}/Type-Test.sql (100%) rename src/{core_demo => demo}/common_setup.sql (100%) rename src/{core_demo => demo}/install.sql (100%) rename src/{core_demo => demo}/installO.LST (100%) rename src/{core_demo => demo}/uninstall.sql (100%) rename src/{core_demo => demo}/uninstallO.LST (100%) rename src/{core_demo => demo}/ut_betwnstr.sql (100%) rename src/{core_demo => demo}/ut_calc_secs_between.sql (100%) rename src/{core_demo => demo}/ut_str.sql (100%) rename src/{core_demo => demo}/ut_truncit.sql (100%) create mode 100644 src/junit_xml/stats_junit_report_all.prc rename src/{core_stats_1 => stats}/install.sql (100%) rename src/{core_stats_1 => stats}/wt_profiler_stats.tab (100%) rename src/{core_stats_1 => stats}/wt_profiler_stats_vw.vw (100%) rename src/{core_stats_1 => stats}/wt_test_run_stat.pkb (99%) rename src/{core_stats_1 => stats}/wt_test_run_stat.pks (100%) rename src/{core_stats_1 => stats}/wt_test_run_stats.tab (100%) rename src/{core_stats_1 => stats}/wt_test_run_stats_vw.vw (100%) rename src/{core_stats_1 => stats}/wt_testcase_stats.tab (100%) rename src/{core_stats_1 => stats}/wt_testcase_stats_vw.vw (100%) create mode 100644 src/stats_gui/APEX Notes.txt rename src/{core_stats_gui => stats_gui}/Notes.txt (100%) rename src/{core_stats_gui => stats_gui}/WTP_workspace.sql (100%) rename src/{core_stats_gui => stats_gui}/f700.sql (99%) rename src/{core_stats_gui => stats_gui}/install.sql (100%) diff --git a/docs/demo/Package-Test.htm b/docs/core_demo/Package-Test.htm similarity index 100% rename from docs/demo/Package-Test.htm rename to docs/core_demo/Package-Test.htm diff --git a/docs/demo/Package-Test.md b/docs/core_demo/Package-Test.md similarity index 100% rename from docs/demo/Package-Test.md rename to docs/core_demo/Package-Test.md diff --git a/docs/demo/README.htm b/docs/core_demo/README.htm similarity index 100% rename from docs/demo/README.htm rename to docs/core_demo/README.htm diff --git a/docs/demo/README.md b/docs/core_demo/README.md similarity index 100% rename from docs/demo/README.md rename to docs/core_demo/README.md diff --git a/docs/demo/Table-Test.htm b/docs/core_demo/Table-Test.htm similarity index 100% rename from docs/demo/Table-Test.htm rename to docs/core_demo/Table-Test.htm diff --git a/docs/demo/Table-Test.md b/docs/core_demo/Table-Test.md similarity index 100% rename from docs/demo/Table-Test.md rename to docs/core_demo/Table-Test.md diff --git a/docs/demo/Test-Runner.htm b/docs/core_demo/Test-Runner.htm similarity index 100% rename from docs/demo/Test-Runner.htm rename to docs/core_demo/Test-Runner.htm diff --git a/docs/demo/Test-Runner.md b/docs/core_demo/Test-Runner.md similarity index 100% rename from docs/demo/Test-Runner.md rename to docs/core_demo/Test-Runner.md diff --git a/docs/demo/Trigger-Test.htm b/docs/core_demo/Trigger-Test.htm similarity index 100% rename from docs/demo/Trigger-Test.htm rename to docs/core_demo/Trigger-Test.htm diff --git a/docs/demo/Trigger-Test.md b/docs/core_demo/Trigger-Test.md similarity index 100% rename from docs/demo/Trigger-Test.md rename to docs/core_demo/Trigger-Test.md diff --git a/docs/demo/Type-Test.htm b/docs/core_demo/Type-Test.htm similarity index 100% rename from docs/demo/Type-Test.htm rename to docs/core_demo/Type-Test.htm diff --git a/docs/demo/Type-Test.md b/docs/core_demo/Type-Test.md similarity index 100% rename from docs/demo/Type-Test.md rename to docs/core_demo/Type-Test.md diff --git a/docs/demo/images/Leaving Something Behind.PNG b/docs/core_demo/images/Leaving Something Behind.PNG similarity index 100% rename from docs/demo/images/Leaving Something Behind.PNG rename to docs/core_demo/images/Leaving Something Behind.PNG diff --git a/docs/demo/images/Setup and Teardown.PNG b/docs/core_demo/images/Setup and Teardown.PNG similarity index 100% rename from docs/demo/images/Setup and Teardown.PNG rename to docs/core_demo/images/Setup and Teardown.PNG diff --git a/docs/demo/images/Testing Put Line and Get Line.PNG b/docs/core_demo/images/Testing Put Line and Get Line.PNG similarity index 100% rename from docs/demo/images/Testing Put Line and Get Line.PNG rename to docs/core_demo/images/Testing Put Line and Get Line.PNG diff --git a/docs/demo/md-to-htm.bat b/docs/core_demo/md-to-htm.bat similarity index 100% rename from docs/demo/md-to-htm.bat rename to docs/core_demo/md-to-htm.bat diff --git a/docs/demo/md-to-htm.lua b/docs/core_demo/md-to-htm.lua similarity index 100% rename from docs/demo/md-to-htm.lua rename to docs/core_demo/md-to-htm.lua diff --git a/docs/demo/ut_betwnstr.htm b/docs/core_demo/ut_betwnstr.htm similarity index 100% rename from docs/demo/ut_betwnstr.htm rename to docs/core_demo/ut_betwnstr.htm diff --git a/docs/demo/ut_betwnstr.md b/docs/core_demo/ut_betwnstr.md similarity index 100% rename from docs/demo/ut_betwnstr.md rename to docs/core_demo/ut_betwnstr.md diff --git a/docs/demo/ut_calc_secs_between.htm b/docs/core_demo/ut_calc_secs_between.htm similarity index 100% rename from docs/demo/ut_calc_secs_between.htm rename to docs/core_demo/ut_calc_secs_between.htm diff --git a/docs/demo/ut_calc_secs_between.md b/docs/core_demo/ut_calc_secs_between.md similarity index 100% rename from docs/demo/ut_calc_secs_between.md rename to docs/core_demo/ut_calc_secs_between.md diff --git a/docs/demo/ut_str.htm b/docs/core_demo/ut_str.htm similarity index 100% rename from docs/demo/ut_str.htm rename to docs/core_demo/ut_str.htm diff --git a/docs/demo/ut_str.md b/docs/core_demo/ut_str.md similarity index 100% rename from docs/demo/ut_str.md rename to docs/core_demo/ut_str.md diff --git a/docs/demo/ut_truncit.htm b/docs/core_demo/ut_truncit.htm similarity index 100% rename from docs/demo/ut_truncit.htm rename to docs/core_demo/ut_truncit.htm diff --git a/docs/demo/ut_truncit.md b/docs/core_demo/ut_truncit.md similarity index 100% rename from docs/demo/ut_truncit.md rename to docs/core_demo/ut_truncit.md diff --git a/docs/gui/README.md b/docs/core_stats_gui/README.md similarity index 100% rename from docs/gui/README.md rename to docs/core_stats_gui/README.md diff --git a/docs/gui/README.txt b/docs/core_stats_gui/README.txt similarity index 100% rename from docs/gui/README.txt rename to docs/core_stats_gui/README.txt diff --git a/docs/gui/_config.yml b/docs/core_stats_gui/_config.yml similarity index 100% rename from docs/gui/_config.yml rename to docs/core_stats_gui/_config.yml diff --git a/docs/gui/md-to-htm.bat b/docs/core_stats_gui/md-to-htm.bat similarity index 100% rename from docs/gui/md-to-htm.bat rename to docs/core_stats_gui/md-to-htm.bat diff --git a/docs/gui/md-to-htm.lua b/docs/core_stats_gui/md-to-htm.lua similarity index 100% rename from docs/gui/md-to-htm.lua rename to docs/core_stats_gui/md-to-htm.lua diff --git a/src/conversion/utplsql_to_wtplsql.sql b/src/conversion/utplsql_to_wtplsql.sql index 422b998..ae073b0 100644 --- a/src/conversion/utplsql_to_wtplsql.sql +++ b/src/conversion/utplsql_to_wtplsql.sql @@ -112,23 +112,31 @@ declare case proc_buff.procedure_name when 'ZTST_SETUP' then - ret_str := ' ' || proc_buff.procedure_name || - ';' || CHR(10) || ret_str; + ret_str := ' wt_assert.g_testcase := ''' || proc_buff.object_name || + '_ZTST_TEARDOWN'';' || CHR(10) || + ' ZTST_TEARDOWN;' || CHR(10) || + CHR(10) || + ret_str ; when 'ZTST_TEARDOWN' then add_teardown := TRUE; else ret_str := ret_str || - ' ' || 'wt_assert.g_testcase := ' || - substr(proc_buff.procedure_name,1,50) || - ';' || CHR(10) || - ' ' || proc_buff.procedure_name || - ';' || CHR(10); + ' ' || 'wt_assert.g_testcase := ' || + substr(proc_buff.procedure_name,1,50) || + ';' || CHR(10) || + ' ' || proc_buff.procedure_name || + ';' || CHR(10) || + CHR(10) ; end case; end loop; if add_teardown then - ret_str := ret_str || ' ZTST_TEARDOWN;' || CHR(10); + ret_str := ret_str || + ' wt_assert.g_testcase := ''' || proc_buff.object_name || + '_ZTST_TEARDOWN'';' || CHR(10) || + ' ZTST_TEARDOWN;' || CHR(10) || + CHR(10) ; end if; return ret_str; end get_procedures; @@ -141,11 +149,10 @@ begin and object_type in ('PACKAGE', 'PACKAGE BODY') and owner = :SCHEMA_NAME and owner not in ('SYS','UTP') - and not exists (select 'x' from dba_source src + and not exists (select 'x' + from wt_qual_test_runners_vw src where src.owner = obj.owner - and src.name = obj.object_name - and src.type = obj.object_type - and regexp_like(src.text, wtplsql.C_RUNNER_ENTRY_POINT, 'i') ) + and src.package_name = obj.object_name ) order by object_type desc, owner, object_name ) -- Package Bodies before Package Specifications loop @@ -164,17 +171,22 @@ begin then src_clob := substr(tmp_clob, 1, end_ptr-1) || CHR(10) || ' procedure ' || wtplsql.C_RUNNER_ENTRY_POINT || ';' || - CHR(10) || CHR(10) || end_str; + CHR(10) || + CHR(10) || + end_str; when 'PACKAGE BODY' then src_clob := substr(tmp_clob, 1, end_ptr-1) || CHR(10) || 'procedure ' || wtplsql.C_RUNNER_ENTRY_POINT || ' is begin' || CHR(10) || get_procedures(obj_rec.owner, obj_rec.object_name) || - 'end ' || wtplsql.C_RUNNER_ENTRY_POINT || ';' - || CHR(10) || CHR(10) || end_str; + 'end ' || wtplsql.C_RUNNER_ENTRY_POINT || ';' || + CHR(10) || + CHR(10) || + end_str; else - raise_application_error(-20000, 'Unknown Object Type: ' || obj_rec.object_type); + raise_application_error(-20000, 'Unknown Object Type: ' || + obj_rec.object_type) ; end case; dbms_output.put_line('Compiling ' || obj_rec.object_type || ' ' || obj_rec.owner || diff --git a/src/core/wt_assert.pkb b/src/core/wt_assert.pkb index 2f70947..2885a26 100644 --- a/src/core/wt_assert.pkb +++ b/src/core/wt_assert.pkb @@ -1,5 +1,14 @@ create or replace package body wt_assert is + -- See RESET_GLOBALS procedure for default global values + TYPE g_rec_type is record + (last_pass boolean + ,raise_exception boolean + ,last_assert wt_results.assertion%TYPE + ,last_msg wt_results.message%TYPE + ,last_details wt_results.details%TYPE); + g_rec g_rec_type; + $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ temp_rowid1 CONSTANT rowid := chartorowid('AAAFd1AAFAAAABSAA/'); temp_rowid2 CONSTANT rowid := chartorowid('AAAFd1AAFAAAABSAB/'); @@ -96,7 +105,7 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- else C_FAIL end ,in_details => g_rec.last_details - ,in_testcase => g_testcase + ,in_testcase => nvl(g_testcase, wt_test_runner.get_runner_name) ,in_message => g_rec.last_msg); $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ end if; diff --git a/src/core/wt_assert.pks b/src/core/wt_assert.pks index 9d38887..53bcf13 100644 --- a/src/core/wt_assert.pks +++ b/src/core/wt_assert.pks @@ -9,13 +9,6 @@ is C_FAIL CONSTANT varchar2(10) := 'FAIL'; -- See RESET_GLOBALS procedure for default global values - TYPE g_rec_type is record - (last_pass boolean - ,raise_exception boolean - ,last_assert wt_results.assertion%TYPE - ,last_msg wt_results.message%TYPE - ,last_details wt_results.details%TYPE); - g_rec g_rec_type; -- Testcase name for a series of assertions. -- Modify as required diff --git a/src/core/wt_dbout.pkb b/src/core/wt_dbout.pkb deleted file mode 100644 index d4ede0b..0000000 --- a/src/core/wt_dbout.pkb +++ /dev/null @@ -1,37 +0,0 @@ -create or replace package body wt_testcase -as - ---------------------- --- Public Procedures ---------------------- - ------------------------------------------------------------- -function get_testcase_id - (in_testcase in varchar2) - return number -is - rec wt_testcases%ROWTYPE; -begin - select id into rec.id from wt_testcases - where testcase = in_testcase; - return rec.id; -exception - when NO_DATA_FOUND - then - rec.id := wt_testcases_seq.nextval; - rec.testcase := in_testcase; - insert into wt_testcases values rec; - return rec.id; -end get_testcase_id; - ------------------------------------------------------------- -procedure clear_testcases -is -begin - delete from wt_testcases - where id not in ( - select testcase_id - from wt_results ); -end clear_testcases; - -end wt_testcase; diff --git a/src/core/wt_dbout.pks b/src/core/wt_dbout.pks deleted file mode 100644 index ecae9ce..0000000 --- a/src/core/wt_dbout.pks +++ /dev/null @@ -1,11 +0,0 @@ -create or replace package wt_testcase - authid definer -as - - function get_testcase_id - (in_testcase in varchar2) - return number; - - procedure clear_testcases; - -end wt_testcase; diff --git a/src/core/wt_dbouts.tab b/src/core/wt_dbouts.tab index a9a4697..66f9ae8 100644 --- a/src/core/wt_dbouts.tab +++ b/src/core/wt_dbouts.tab @@ -6,12 +6,12 @@ create sequence wt_dbouts_seq; create table wt_dbouts - (id number(38) constraint wt_dbouts_nn1 not null - ,dbout_owner varchar2(128) constraint wt_dbouts_nn2 not null - ,dbout_name varchar2(128) constraint wt_dbouts_nn3 not null - ,dbout_type varchar2(20) constraint wt_dbouts_nn4 not null + (id number(38) constraint wt_dbouts_nn1 not null + ,owner varchar2(128) constraint wt_dbouts_nn2 not null + ,name varchar2(128) constraint wt_dbouts_nn3 not null + ,type varchar2(20) constraint wt_dbouts_nn4 not null ,constraint wt_dbouts_pk primary key (id) - ,constraint wt_dbouts_nk1 unique (dbout_owner, runner_name, dbout_type) + ,constraint wt_dbouts_nk1 unique (owner, name, type) ) pctfree 0; create index wt_dbouts_ix1 @@ -19,9 +19,9 @@ create index wt_dbouts_ix1 comment on table wt_dbouts is 'List of Database Objects Under Test (DBOUT).'; comment on column wt_dbouts.id is 'Primary (Surrogate) Key for each Database Objects Under Test (DBOUT)'; -comment on column wt_dbouts.dbout_owner is 'Owner of the Database Object Under Test (DBOUT).'; -comment on column wt_dbouts.dbout_name is 'Name of the Database Object Under Test (DBOUT).'; -comment on column wt_dbouts.dbout_type is 'Type of the Database Object Under Test (DBOUT).'; +comment on column wt_dbouts.owner is 'Owner of the Database Object Under Test (DBOUT).'; +comment on column wt_dbouts.name is 'Name of the Database Object Under Test (DBOUT).'; +comment on column wt_dbouts.type is 'Type of the Database Object Under Test (DBOUT).'; grant select on wt_dbouts to public; grant delete on wt_dbouts to public; diff --git a/src/core/wt_profile.pkb b/src/core/wt_profile.pkb index 986e1a2..3ce0fd7 100644 --- a/src/core/wt_profile.pkb +++ b/src/core/wt_profile.pkb @@ -1,6 +1,16 @@ create or replace package body wt_profile as + TYPE rec_type is record + (test_run_id wt_test_runs.id%TYPE + ,dbout_owner wt_test_runs.dbout_owner%TYPE + ,dbout_name wt_test_runs.dbout_name%TYPE + ,dbout_type wt_test_runs.dbout_type%TYPE + ,prof_runid binary_integer + ,trigger_offset binary_integer + ,error_message varchar2(4000)); + g_rec rec_type; + TYPE ignr_aa_type is table of varchar2(1) index by PLS_INTEGER; diff --git a/src/core/wt_profile.pks b/src/core/wt_profile.pks index 12c76a1..2900dac 100644 --- a/src/core/wt_profile.pks +++ b/src/core/wt_profile.pks @@ -1,16 +1,6 @@ create or replace package wt_profile authid definer --current_user as - TYPE rec_type is record - (test_run_id wt_test_runs.id%TYPE - ,dbout_owner wt_test_runs.dbout_owner%TYPE - ,dbout_name wt_test_runs.dbout_name%TYPE - ,dbout_type wt_test_runs.dbout_type%TYPE - ,prof_runid binary_integer - ,trigger_offset binary_integer - ,error_message varchar2(4000)); - g_rec rec_type; - procedure initialize (in_test_run_id in number, in_runner_owner in varchar2, diff --git a/src/core/wt_result.pkb b/src/core/wt_result.pkb index 3facb23..6ede2af 100644 --- a/src/core/wt_result.pkb +++ b/src/core/wt_result.pkb @@ -1,6 +1,10 @@ create or replace package body wt_result as + TYPE results_nt_type is table of wt_results%ROWTYPE; + g_results_nt results_nt_type; + g_results_rec wt_results%ROWTYPE; + $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ g_skip_add BOOLEAN := FALSE; $END ----------------%WTPLSQL_end_ignore_lines%---------------- diff --git a/src/core/wt_result.pks b/src/core/wt_result.pks index efc9fe2..68c54d9 100644 --- a/src/core/wt_result.pks +++ b/src/core/wt_result.pks @@ -1,10 +1,6 @@ create or replace package wt_result authid definer as - TYPE results_nt_type is table of wt_results%ROWTYPE; - g_results_nt results_nt_type; - g_results_rec wt_results%ROWTYPE; - procedure initialize (in_test_run_id in wt_test_runs.id%TYPE); diff --git a/src/core/wt_test_runner.pkb b/src/core/wt_test_runner.pkb deleted file mode 100644 index d4ede0b..0000000 --- a/src/core/wt_test_runner.pkb +++ /dev/null @@ -1,37 +0,0 @@ -create or replace package body wt_testcase -as - ---------------------- --- Public Procedures ---------------------- - ------------------------------------------------------------- -function get_testcase_id - (in_testcase in varchar2) - return number -is - rec wt_testcases%ROWTYPE; -begin - select id into rec.id from wt_testcases - where testcase = in_testcase; - return rec.id; -exception - when NO_DATA_FOUND - then - rec.id := wt_testcases_seq.nextval; - rec.testcase := in_testcase; - insert into wt_testcases values rec; - return rec.id; -end get_testcase_id; - ------------------------------------------------------------- -procedure clear_testcases -is -begin - delete from wt_testcases - where id not in ( - select testcase_id - from wt_results ); -end clear_testcases; - -end wt_testcase; diff --git a/src/core/wt_test_runner.pks b/src/core/wt_test_runner.pks deleted file mode 100644 index ecae9ce..0000000 --- a/src/core/wt_test_runner.pks +++ /dev/null @@ -1,11 +0,0 @@ -create or replace package wt_testcase - authid definer -as - - function get_testcase_id - (in_testcase in varchar2) - return number; - - procedure clear_testcases; - -end wt_testcase; diff --git a/src/core/wt_test_runners.tab b/src/core/wt_test_runners.tab index f167be5..953de05 100644 --- a/src/core/wt_test_runners.tab +++ b/src/core/wt_test_runners.tab @@ -6,17 +6,17 @@ create sequence wt_test_runners_seq order; create table wt_test_runners - (id number(38) constraint wt_test_runs_nn1 not null - ,runner_owner varchar2(128) constraint wt_test_runs_nn2 not null - ,runner_name varchar2(128) constraint wt_test_runs_nn3 not null + (id number(38) constraint wt_test_runs_nn1 not null + ,owner varchar2(128) constraint wt_test_runs_nn2 not null + ,name varchar2(128) constraint wt_test_runs_nn3 not null ,constraint wt_test_runners_pk primary key (id) ,constraint wt_test_runners_nk1 unique (runner_owner, runner_name) ) pctfree 0; comment on table wt_test_runners is 'List of Test Runners.'; comment on column wt_test_runners.id is 'Primary (Surrogate) Key for each Test Runner'; -comment on column wt_test_runners.runner_owner is 'Owner of the Test Runner package. Natural Key 1 part 1'; -comment on column wt_test_runners.runner_name is 'Name of the Test Runner package. Natural Key 1 part 2'; +comment on column wt_test_runners.owner is 'Owner of the Test Runner package. Natural Key 1 part 1'; +comment on column wt_test_runners.name is 'Name of the Test Runner package. Natural Key 1 part 2'; grant select on wt_test_runners to public; grant delete on wt_test_runners to public; diff --git a/src/core/wt_testcase.pkb b/src/core/wt_testcase.pkb index d4ede0b..070c3e6 100644 --- a/src/core/wt_testcase.pkb +++ b/src/core/wt_testcase.pkb @@ -6,7 +6,7 @@ as --------------------- ------------------------------------------------------------ -function get_testcase_id +function get_id (in_testcase in varchar2) return number is @@ -22,16 +22,16 @@ exception rec.testcase := in_testcase; insert into wt_testcases values rec; return rec.id; -end get_testcase_id; +end get_id; ------------------------------------------------------------ -procedure clear_testcases +procedure clear_unused is begin delete from wt_testcases where id not in ( select testcase_id from wt_results ); -end clear_testcases; +end clear_unused; end wt_testcase; diff --git a/src/core/wt_testcase.pks b/src/core/wt_testcase.pks index ecae9ce..3db395d 100644 --- a/src/core/wt_testcase.pks +++ b/src/core/wt_testcase.pks @@ -2,10 +2,10 @@ create or replace package wt_testcase authid definer as - function get_testcase_id + function get_id (in_testcase in varchar2) return number; - procedure clear_testcases; + procedure clear_unused; end wt_testcase; diff --git a/src/core/wt_testcases.tab b/src/core/wt_testcases.tab index 672a44f..2214778 100644 --- a/src/core/wt_testcases.tab +++ b/src/core/wt_testcases.tab @@ -7,14 +7,14 @@ create sequence wt_testcases_seq; create table wt_testcases (id number(38) constraint wt_testcases_nn1 not null - ,testcase varchar2(128) constraint wt_testcases_nn2 not null + ,name varchar2(128) constraint wt_testcases_nn2 not null ,constraint wt_testcases_pk primary key (id) - ,constraint wt_testcases_nk1 unique (testcase) + ,constraint wt_testcases_nk1 unique (name) ); comment on table wt_testcases is 'Test Cases Used by Test Runners.'; comment on column wt_testcases.id is 'Primary (Surrogate) Key for each Test Case'; -comment on column wt_testcases.testcase is 'Natural Key. The Test Case name'; +comment on column wt_testcases.name is 'Natural Key. The Test Case name'; grant select on wt_testcases to public; grant delete on wt_testcases to public; diff --git a/src/core_demo/Package-Test.sql b/src/demo/Package-Test.sql similarity index 100% rename from src/core_demo/Package-Test.sql rename to src/demo/Package-Test.sql diff --git a/src/core_demo/README.txt b/src/demo/README.txt similarity index 100% rename from src/core_demo/README.txt rename to src/demo/README.txt diff --git a/src/core_demo/Table-Test.sql b/src/demo/Table-Test.sql similarity index 100% rename from src/core_demo/Table-Test.sql rename to src/demo/Table-Test.sql diff --git a/src/core_demo/Test-Runner.sql b/src/demo/Test-Runner.sql similarity index 100% rename from src/core_demo/Test-Runner.sql rename to src/demo/Test-Runner.sql diff --git a/src/core_demo/Trigger-Test.sql b/src/demo/Trigger-Test.sql similarity index 100% rename from src/core_demo/Trigger-Test.sql rename to src/demo/Trigger-Test.sql diff --git a/src/core_demo/Type-Test.sql b/src/demo/Type-Test.sql similarity index 100% rename from src/core_demo/Type-Test.sql rename to src/demo/Type-Test.sql diff --git a/src/core_demo/common_setup.sql b/src/demo/common_setup.sql similarity index 100% rename from src/core_demo/common_setup.sql rename to src/demo/common_setup.sql diff --git a/src/core_demo/install.sql b/src/demo/install.sql similarity index 100% rename from src/core_demo/install.sql rename to src/demo/install.sql diff --git a/src/core_demo/installO.LST b/src/demo/installO.LST similarity index 100% rename from src/core_demo/installO.LST rename to src/demo/installO.LST diff --git a/src/core_demo/uninstall.sql b/src/demo/uninstall.sql similarity index 100% rename from src/core_demo/uninstall.sql rename to src/demo/uninstall.sql diff --git a/src/core_demo/uninstallO.LST b/src/demo/uninstallO.LST similarity index 100% rename from src/core_demo/uninstallO.LST rename to src/demo/uninstallO.LST diff --git a/src/core_demo/ut_betwnstr.sql b/src/demo/ut_betwnstr.sql similarity index 100% rename from src/core_demo/ut_betwnstr.sql rename to src/demo/ut_betwnstr.sql diff --git a/src/core_demo/ut_calc_secs_between.sql b/src/demo/ut_calc_secs_between.sql similarity index 100% rename from src/core_demo/ut_calc_secs_between.sql rename to src/demo/ut_calc_secs_between.sql diff --git a/src/core_demo/ut_str.sql b/src/demo/ut_str.sql similarity index 100% rename from src/core_demo/ut_str.sql rename to src/demo/ut_str.sql diff --git a/src/core_demo/ut_truncit.sql b/src/demo/ut_truncit.sql similarity index 100% rename from src/core_demo/ut_truncit.sql rename to src/demo/ut_truncit.sql diff --git a/src/junit_xml/junit_report_all.prc b/src/junit_xml/junit_report_all.prc index af1db9c..b6ce166 100644 --- a/src/junit_xml/junit_report_all.prc +++ b/src/junit_xml/junit_report_all.prc @@ -12,26 +12,37 @@ begin p(''); for suites in ( select tr.start_dtm + ,tr.end_dtm + ,tr.id + ,tr.runner_owner || '.' || tr.runner_name SUITE_NAME + ,nvl(tr.dbout_owner, tr.runner_owner) PACKAGE_NAME + ,case when tr.dbout_name || tr.dbout_type is null + then 'TEST_RUNNER' + else tr.dbout_name || ':' || tr.dbout_type + end CLASS_NAME + ,count(distinct res.testcase_id) TESTCASES + ,sum(case res.status when 'FAIL' then 1 + else 0 + end) FAILURES + ,extract(day from (tr.end_dtm - + tr.start_dtm) * 86400000) TOT_INTERVAL_MSECS + ,tr.error_message + from wt_test_runs tr + left join wt_results res + on res.test_run_id = tr.id + where tr.is_last_run = wtplsql.get_last_run_flag + group by tr.start_dtm ,tr.end_dtm ,tr.id ,tr.runner_owner || '.' || tr.runner_name - SUITE_NAME ,nvl(tr.dbout_owner, tr.runner_owner) - PACKAGE_NAME ,case when tr.dbout_name || tr.dbout_type is null then 'TEST_RUNNER' else tr.dbout_name || ':' || tr.dbout_type - end CLASS_NAME - ,ts.testcases - ,ts.failures + end ,extract(day from (tr.end_dtm - tr.start_dtm) * 86400000) - TOT_INTERVAL_MSECS ,tr.error_message - from wt_test_runs tr - left join wt_test_run_stats ts - on ts.test_run_id = tr.id - where tr.is_last_run = wtplsql.get_last_run_flag order by tr.start_dtm, tr.id ) loop p(' ' ); for cases in ( select tr.id - ,tc.testcase - ,tc.asserts - ,tc.failures - ,nvl(tc.tot_interval_msecs - ,suites.tot_interval_msecs) TOT_INTERVAL_MSECS + ,res.name TESTCASE + ,count(res.test_run_id) + ,sum(case res.status when 'FAIL' then 1 + else 0 + end) FAILURES + ,sum(nvl(res.interval_msecs,0)) TOT_INTERVAL_MSECS from wt_test_runs tr - left join wt_testcase_stats tc - on tc.test_run_id = tr.id + left join wt_results res + on res.test_run_id = tr.id + left join wt_testcases tc + on tc.id = res.testcase_id where tr.id = suites.id + group by tr.id + ,res.name order by testcase ) loop if nvl(cases.failures,1) = 0 diff --git a/src/junit_xml/stats_junit_report_all.prc b/src/junit_xml/stats_junit_report_all.prc new file mode 100644 index 0000000..af1db9c --- /dev/null +++ b/src/junit_xml/stats_junit_report_all.prc @@ -0,0 +1,102 @@ +create or replace procedure junit_report_all +is + procedure p (in_line in varchar2) is + begin + DBMS_OUTPUT.PUT_LINE(in_line); + end p; +begin + p(''); + p(''); + p(''); + p(''); + p(''); + for suites in ( + select tr.start_dtm + ,tr.end_dtm + ,tr.id + ,tr.runner_owner || '.' || tr.runner_name + SUITE_NAME + ,nvl(tr.dbout_owner, tr.runner_owner) + PACKAGE_NAME + ,case when tr.dbout_name || tr.dbout_type is null + then 'TEST_RUNNER' + else tr.dbout_name || ':' || tr.dbout_type + end CLASS_NAME + ,ts.testcases + ,ts.failures + ,extract(day from (tr.end_dtm - + tr.start_dtm) * 86400000) + TOT_INTERVAL_MSECS + ,tr.error_message + from wt_test_runs tr + left join wt_test_run_stats ts + on ts.test_run_id = tr.id + where tr.is_last_run = wtplsql.get_last_run_flag + order by tr.start_dtm, tr.id ) + loop + p(' ' ); + for cases in ( + select tr.id + ,tc.testcase + ,tc.asserts + ,tc.failures + ,nvl(tc.tot_interval_msecs + ,suites.tot_interval_msecs) TOT_INTERVAL_MSECS + from wt_test_runs tr + left join wt_testcase_stats tc + on tc.test_run_id = tr.id + where tr.id = suites.id + order by testcase ) + loop + if nvl(cases.failures,1) = 0 + and suites.error_message is null + then + p(' '); + else + p(' '); + p(' '); + -- Print each of the non-passing results + for asrts in ( + select result_seq + ,status + ,interval_msecs + ,message + ,assertion + ,details + from wt_results + where test_run_id = suites.id + and ( (cases.testcase is null + and testcase is null) + or testcase = cases.testcase) + and status != wt_assert.C_PASS + order by result_seq ) + loop + p(lpad(asrts.result_seq,4) || ': ' || + rpad(asrts.status,4) || ' ' || + lpad(asrts.interval_msecs,4) || 'ms ' || + asrts.message || '. ' || + asrts.assertion || ' - ' || + replace(replace(asrts.details + ,CHR(13),'\r') + ,CHR(10),'\n') || '.' ); + end loop; + p(' '); + p(' '); + end if; + end loop; + end loop; + p(' '); + p(''); +end junit_report_all; +/ diff --git a/src/core_stats_1/install.sql b/src/stats/install.sql similarity index 100% rename from src/core_stats_1/install.sql rename to src/stats/install.sql diff --git a/src/core_stats_1/wt_profiler_stats.tab b/src/stats/wt_profiler_stats.tab similarity index 100% rename from src/core_stats_1/wt_profiler_stats.tab rename to src/stats/wt_profiler_stats.tab diff --git a/src/core_stats_1/wt_profiler_stats_vw.vw b/src/stats/wt_profiler_stats_vw.vw similarity index 100% rename from src/core_stats_1/wt_profiler_stats_vw.vw rename to src/stats/wt_profiler_stats_vw.vw diff --git a/src/core_stats_1/wt_test_run_stat.pkb b/src/stats/wt_test_run_stat.pkb similarity index 99% rename from src/core_stats_1/wt_test_run_stat.pkb rename to src/stats/wt_test_run_stat.pkb index 80ccc4c..07e73da 100644 --- a/src/core_stats_1/wt_test_run_stat.pkb +++ b/src/stats/wt_test_run_stat.pkb @@ -98,7 +98,7 @@ begin g_rec.tot_interval_msecs := nvl(g_rec.tot_interval_msecs,0) + in_results_rec.interval_msecs; -- - tc := nvl(in_results_rec.testcase,'Unnamed Test Case'); + tc := in_results_rec.testcase; g_tc_aa(tc).testcase := tc; g_tc_aa(tc).test_run_id := in_results_rec.test_run_id; g_tc_aa(tc).asserts := nvl(g_tc_aa(tc).asserts,0) + 1; diff --git a/src/core_stats_1/wt_test_run_stat.pks b/src/stats/wt_test_run_stat.pks similarity index 100% rename from src/core_stats_1/wt_test_run_stat.pks rename to src/stats/wt_test_run_stat.pks diff --git a/src/core_stats_1/wt_test_run_stats.tab b/src/stats/wt_test_run_stats.tab similarity index 100% rename from src/core_stats_1/wt_test_run_stats.tab rename to src/stats/wt_test_run_stats.tab diff --git a/src/core_stats_1/wt_test_run_stats_vw.vw b/src/stats/wt_test_run_stats_vw.vw similarity index 100% rename from src/core_stats_1/wt_test_run_stats_vw.vw rename to src/stats/wt_test_run_stats_vw.vw diff --git a/src/core_stats_1/wt_testcase_stats.tab b/src/stats/wt_testcase_stats.tab similarity index 100% rename from src/core_stats_1/wt_testcase_stats.tab rename to src/stats/wt_testcase_stats.tab diff --git a/src/core_stats_1/wt_testcase_stats_vw.vw b/src/stats/wt_testcase_stats_vw.vw similarity index 100% rename from src/core_stats_1/wt_testcase_stats_vw.vw rename to src/stats/wt_testcase_stats_vw.vw diff --git a/src/stats_gui/APEX Notes.txt b/src/stats_gui/APEX Notes.txt new file mode 100644 index 0000000..3aad9ff --- /dev/null +++ b/src/stats_gui/APEX Notes.txt @@ -0,0 +1,72 @@ + +create or replace view wt_test_runners as +select owner, object_name PACKAGE_NAME + from dba_procedures + where procedure_name = wtplsql.get_runner_entry_point + and object_type = 'PACKAGE'; + +-- Page 0: P0_TEST_OWNER LOV +select owner DISPLAY + ,owner RETURN + from wt_test_runners + group by owner + order by owner; + +-- Page 0: P0_TEST_RUNNER LOV +select package_name DISPLAY + ,package_name RETURN + from wt_test_runners + where owner = 'WTP' + order by package_name; + +-- Page 2: All Test Runner Owners +select proc.owner TEST_RUNNER_OWNER + ,dbl.db_link + ,dbl.username + ,dbl.host + ,dbl.created + ,case when dbl.username is null + then + 'Username missing' + when dbl.host is null + then + 'Host value missing' + when dbl.db_link || '.' not like dbl.username || '.%' + then + 'DB Link != Username' + else + 'Good Link' + end LINK_STATUS + from wt_test_runners proc + left join user_db_links dbl + on dbl.db_link = proc.owner + or dbl.username = proc.owner + group by proc.owner + ,dbl.db_link + ,dbl.username + ,dbl.host + ,dbl.created; + +-- Page2: TEST_ALL_SEQ + select proc.owner TEST_OWNER + from wt_test_runners proc + join user_db_links dbl + on dbl.db_link = proc.owner + and dbl.db_link || '.' like dbl.username || '.%' + and dbl.username is not null + and dbl.host is not null + group by proc.owner + order by proc.owner; + +-- Page2: TEST_ALL_PAR + select proc.owner TEST_OWNER + from wt_test_runners proc + join user_db_links dbl + on dbl.db_link || '.' like proc.owner || '.%' + and dbl.db_link || '.' like dbl.username || '.%' + and dbl.username is not null + and dbl.host is not null + group by proc.owner; + +select * from wt_results + where testcase is null; diff --git a/src/core_stats_gui/Notes.txt b/src/stats_gui/Notes.txt similarity index 100% rename from src/core_stats_gui/Notes.txt rename to src/stats_gui/Notes.txt diff --git a/src/core_stats_gui/WTP_workspace.sql b/src/stats_gui/WTP_workspace.sql similarity index 100% rename from src/core_stats_gui/WTP_workspace.sql rename to src/stats_gui/WTP_workspace.sql diff --git a/src/core_stats_gui/f700.sql b/src/stats_gui/f700.sql similarity index 99% rename from src/core_stats_gui/f700.sql rename to src/stats_gui/f700.sql index 70ca8f1..6f1a322 100644 --- a/src/core_stats_gui/f700.sql +++ b/src/stats_gui/f700.sql @@ -13,7 +13,7 @@ prompt APPLICATION 700 - wtPLSQL Core GUI -- Application Export: -- Application: 700 -- Name: wtPLSQL Core GUI --- Date and Time: 04:31 Tuesday September 11, 2018 +-- Date and Time: 18:08 Monday November 5, 2018 -- Exported By: WTP -- Flashback: 0 -- Export Type: Application Export @@ -146,7 +146,7 @@ wwv_flow_api.create_flow( p_default_region_template=> 4840201642414912 + wwv_flow_api.g_id_offset, p_error_template=> 4837131094414910 + wwv_flow_api.g_id_offset, p_page_protection_enabled_y_n=> 'Y', - p_checksum_salt_last_reset => '20180911043155', + p_checksum_salt_last_reset => '20181105180850', p_max_session_length_sec=> 28800, p_home_link=> 'f?p=&APP_ID.:3:&SESSION.', p_flow_language=> 'en', @@ -192,7 +192,7 @@ wwv_flow_api.create_flow( p_default_listr_template => 4839116402414912 + wwv_flow_api.g_id_offset, p_default_irr_template => 4839831975414912 + wwv_flow_api.g_id_offset, p_last_updated_by => 'WTP', - p_last_upd_yyyymmddhh24miss=> '20180911043155', + p_last_upd_yyyymmddhh24miss=> '20181105180850', p_required_roles=> wwv_flow_utilities.string_to_table2('')); @@ -826,7 +826,7 @@ wwv_flow_api.create_page ( ,p_protection_level => 'N' ,p_cache_page_yn => 'N' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180911033245' + ,p_last_upd_yyyymmddhh24miss => '20181104135107' ); null; @@ -955,11 +955,9 @@ wwv_flow_api.create_page_item( p_prompt=>'Test Runner Owner:', p_source_type=> 'STATIC', p_display_as=> 'NATIVE_POPUP_LOV', - p_lov=> 'select owner DISPLAY'||chr(10)|| -' ,owner RETURN'||chr(10)|| -' from dba_procedures'||chr(10)|| -' where procedure_name = ''WTPLSQL_RUN'''||chr(10)|| -' and object_type = ''PACKAGE'''||chr(10)|| + p_lov=> 'select owner DISPLAY'||chr(10)|| +' ,owner RETURN'||chr(10)|| +' from wt_qual_test_runners_vw'||chr(10)|| ' group by owner'||chr(10)|| ' order by owner', p_lov_display_null=> 'YES', @@ -1008,14 +1006,11 @@ wwv_flow_api.create_page_item( p_prompt=>'Test Runner Name:', p_source_type=> 'STATIC', p_display_as=> 'NATIVE_POPUP_LOV', - p_lov=> 'select object_name DISPLAY'||chr(10)|| -' ,object_name RETURN'||chr(10)|| -' from dba_procedures'||chr(10)|| -' where owner = :P0_TEST_OWNER'||chr(10)|| -' and procedure_name = ''WTPLSQL_RUN'''||chr(10)|| -' and object_type = ''PACKAGE'''||chr(10)|| -' group by object_name'||chr(10)|| -' order by object_name', + p_lov=> 'select package_name DISPLAY'||chr(10)|| +' ,package_name RETURN'||chr(10)|| +' from wt_qual_test_runners_vw'||chr(10)|| +' where owner = :P0_TEST_OWNER'||chr(10)|| +' order by package_name', p_lov_display_null=> 'YES', p_lov_translated=> 'N', p_lov_null_text=>'', @@ -1488,7 +1483,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180903101502' + ,p_last_upd_yyyymmddhh24miss => '20181104171304' ); null; @@ -3708,7 +3703,7 @@ wwv_flow_api.create_page ( ,p_help_text => 'No help is available for this page.' ,p_last_updated_by => 'WTP' - ,p_last_upd_yyyymmddhh24miss => '20180911042355' + ,p_last_upd_yyyymmddhh24miss => '20181104135425' ); null; @@ -4362,15 +4357,13 @@ s:=s||''' not like dbl.username || ''.%'''||chr(10)|| ' else'||chr(10)|| ' ''Good Link'''||chr(10)|| ' end LINK_STATUS'||chr(10)|| -' from dba_procedures proc'||chr(10)|| +' from wt_qual_test_runners_vw proc'||chr(10)|| ' left join user_db_links dbl'||chr(10)|| ' on dbl.db_link = proc.owner'||chr(10)|| ' or dbl.username = proc.owner'||chr(10)|| -' where procedure_name = '; +' group by proc.'; -s:=s||'''WTPLSQL_RUN'''||chr(10)|| -' and object_type = ''PACKAGE'''||chr(10)|| -' group by proc.owner'||chr(10)|| +s:=s||'owner'||chr(10)|| ' ,dbl.db_link'||chr(10)|| ' ,dbl.username'||chr(10)|| ' ,dbl.host'||chr(10)|| @@ -5168,16 +5161,14 @@ p:=p||'DECLARE'||chr(10)|| ' -- String all the "Test Alls" into one PL/SQL Block'||chr(10)|| ' for buff in ('||chr(10)|| ' select proc.owner TEST_OWNER'||chr(10)|| -' from dba_procedures proc'||chr(10)|| +' from wt_qual_test_runners_vw proc'||chr(10)|| ' join user_db_links dbl'||chr(10)|| ' on dbl.db_link = proc.owner'||chr(10)|| ' and dbl.db_link || ''.'' like dbl.username || ''.%'''||chr(10)|| -' and dbl.username is not null'||chr(10)|| -' '; +' and dbl.username is not n'; -p:=p||' and dbl.host is not null'||chr(10)|| -' where proc.procedure_name = ''WTPLSQL_RUN'''||chr(10)|| -' and proc.object_type = ''PACKAGE'''||chr(10)|| +p:=p||'ull'||chr(10)|| +' and dbl.host is not null'||chr(10)|| ' group by proc.owner'||chr(10)|| ' order by proc.owner )'||chr(10)|| ' loop'||chr(10)|| @@ -5186,10 +5177,10 @@ p:=p||' and dbl.host is not null'||chr(10)|| ' -- Create 1 Scheduler Job'||chr(10)|| ' DBMS_SCHEDULER.CREATE_JOB'||chr(10)|| ' (job_name => ''TEST_ALL_SEQ'''||chr(10)|| -' '; +' ,job_type => ''PLSQL_BLOCK'''||chr(10)|| +' ,job_action => ''begin'' || CHR(10) || run_str '; -p:=p||' ,job_type => ''PLSQL_BLOCK'''||chr(10)|| -' ,job_action => ''begin'' || CHR(10) || run_str || ''commit;'' || CHR(10) || ''end;'''||chr(10)|| +p:=p||'|| ''commit;'' || CHR(10) || ''end;'''||chr(10)|| ' ,comments => ''Sequential Tests for All Owners'''||chr(10)|| ' ,enabled => TRUE);'||chr(10)|| ' COMMIT;'||chr(10)|| @@ -5229,16 +5220,14 @@ p:=p||'DECLARE'||chr(10)|| 'BEGIN'||chr(10)|| ' for buff in ('||chr(10)|| ' select proc.owner TEST_OWNER'||chr(10)|| -' from dba_procedures proc'||chr(10)|| +' from wt_qual_test_runners_vw proc'||chr(10)|| ' join user_db_links dbl'||chr(10)|| ' on dbl.db_link || ''.'' like proc.owner || ''.%'''||chr(10)|| ' and dbl.db_link || ''.'' like dbl.username || ''.%'''||chr(10)|| ' and dbl.username is not null'||chr(10)|| -' and dbl.host is not'; +' and dbl.host '; -p:=p||' null'||chr(10)|| -' where proc.procedure_name = ''WTPLSQL_RUN'''||chr(10)|| -' and proc.object_type = ''PACKAGE'''||chr(10)|| +p:=p||' is not null'||chr(10)|| ' group by proc.owner )'||chr(10)|| ' loop'||chr(10)|| ' -- Create a Scheduler Job for each Test Owner'||chr(10)|| @@ -5246,10 +5235,10 @@ p:=p||' null'||chr(10)|| ' DBMS_SCHEDULER.CREATE_JOB'||chr(10)|| ' (job_name => substr(buff.TEST_OWNER || ''$PAR$TEST$ALL'', 1, 30)'||chr(10)|| ' ,job_type => ''PLSQL_BLOCK'''||chr(10)|| -' '; +' ,job_action => ''begin '' || run_str || ''; commit; end;'''||chr(10)|| +' ,comments => '; -p:=p||' ,job_action => ''begin '' || run_str || ''; commit; end;'''||chr(10)|| -' ,comments => buff.TEST_OWNER || '': Parallel Tests for All Owners'''||chr(10)|| +p:=p||' buff.TEST_OWNER || '': Parallel Tests for All Owners'''||chr(10)|| ' ,enabled => TRUE);'||chr(10)|| ' end loop;'||chr(10)|| ' COMMIT;'||chr(10)|| diff --git a/src/core_stats_gui/install.sql b/src/stats_gui/install.sql similarity index 100% rename from src/core_stats_gui/install.sql rename to src/stats_gui/install.sql From 18ea9e20938d01d60f10efca92cb72fc468acf97 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Tue, 6 Nov 2018 07:24:22 -0600 Subject: [PATCH 027/141] Massive Refactoring --- src/core/clear_last_run.prc | 18 --- src/core/set_last_run.prc | 30 ----- src/core/wt_dbout_runs_vw.vw | 39 +++++++ src/core/wt_dbouts.tab | 2 +- src/core/wt_profiles_vw.vw | 51 +++++++++ src/core/wt_results.tab | 2 +- src/core/wt_results_vw.vw | 45 ++++++++ src/core/wt_test_run.pkb | 114 +++++++++++++++++++ src/core/wt_test_run.pks | 22 ++++ src/core/wt_test_runners.tab | 8 +- src/core/wt_test_runs_vw.vw | 29 +++++ src/core/wt_testcases.tab | 6 +- src/core/wtplsql.pkb | 72 +----------- src/core/wtplsql.pks | 2 +- src/junit_xml/junit_report_all.prc | 23 ++-- src/{core => stats_gui}/wt_scheduler_jobs.vw | 0 16 files changed, 325 insertions(+), 138 deletions(-) delete mode 100644 src/core/clear_last_run.prc delete mode 100644 src/core/set_last_run.prc create mode 100644 src/core/wt_dbout_runs_vw.vw create mode 100644 src/core/wt_profiles_vw.vw create mode 100644 src/core/wt_results_vw.vw create mode 100644 src/core/wt_test_run.pkb create mode 100644 src/core/wt_test_run.pks create mode 100644 src/core/wt_test_runs_vw.vw rename src/{core => stats_gui}/wt_scheduler_jobs.vw (100%) diff --git a/src/core/clear_last_run.prc b/src/core/clear_last_run.prc deleted file mode 100644 index e154a79..0000000 --- a/src/core/clear_last_run.prc +++ /dev/null @@ -1,18 +0,0 @@ -create or replace procedure clear_last_run - (in_runner_owner in varchar2 - ,in_runner_name in varchar2 - ,in_last_run_flag in varchar2) - authid definer -as - -- This procedure is required to prevent granting UPDATE on - -- WT_TEST_RUNS to PUBLIC. The WTPLSQL package must run - -- with calling user permissions. Use the SET_LAST_RUN - -- procedure to set the IS_LAST_RUN flag after running - -- this procedure. -begin - update wt_test_runs - set is_last_run = NULL - where runner_owner = in_runner_owner - and runner_name = in_runner_name - and is_last_run = in_last_run_flag; -end clear_last_run; \ No newline at end of file diff --git a/src/core/set_last_run.prc b/src/core/set_last_run.prc deleted file mode 100644 index 71b7c3c..0000000 --- a/src/core/set_last_run.prc +++ /dev/null @@ -1,30 +0,0 @@ -create or replace procedure set_last_run - (in_runner_owner in varchar2 - ,in_runner_name in varchar2 - ,in_last_run_flag in varchar2) - authid definer -as - -- This procedure is required to prevent granting UPDATE on - -- WT_TEST_RUNS to PUBLIC. The WTPLSQL package must run - -- with calling user permissions. Use the CLEAR_LAST_RUN - -- procedure to clear the IS_LAST_RUN flag before running - -- this procedure. -begin - for buff in (select * from wt_test_runs - where runner_owner = in_runner_owner - and runner_name = in_runner_name - and is_last_run = in_last_run_flag ) - loop - -- Abort if a IS_LAST_RUN flag is already set - return; - end loop; - update wt_test_runs - set is_last_run = in_last_run_flag - where runner_owner = in_runner_owner - and runner_name = in_runner_name - and start_dtm = ( - select max(trn.start_dtm) - from wt_test_runs trn - where trn.runner_owner = in_runner_owner - and trn.runner_name = in_runner_name ); -end set_last_run; \ No newline at end of file diff --git a/src/core/wt_dbout_runs_vw.vw b/src/core/wt_dbout_runs_vw.vw new file mode 100644 index 0000000..b544b9b --- /dev/null +++ b/src/core/wt_dbout_runs_vw.vw @@ -0,0 +1,39 @@ + +-- +-- Database Object Under Test Runs Table View Installation +-- + +create view wt_dbout_runs_vw as +select tr.dbout_id + ,db.owner DBOUT_OWNER + ,db.name DBOUT_NAME + ,db.type DBOUT_TYPE + ,tr.test_runner_id + ,tnr.owner TEST_RUNNER_OWNER + ,tnr.name TEST_RUNNER_NAME + ,tr.id TEST_RUN_ID + ,tr.is_last_run + ,tr.trigger_offset + ,tr.profiler_runid + ,tr.error_message + from wt_test_runs tr + join wt_dbouts db + on db.id = tr.dbout_id + join wt_test_runners tnr + on tnr.id = tr.test_runner_id; + +comment on table wt_dbout_runs_vw is 'Test Run data for each execution of a Test Runner.'; +comment on column wt_dbout_runs_vw.dbout_id is 'Surrogate Key to the Database Object Under Test (DBOUT).'; +comment on column wt_dbout_runs_vw.dbout_owner is 'Owner of the Database Object Under Test (DBOUT).'; +comment on column wt_dbout_runs_vw.dbout_name is 'Name of the Database Object Under Test (DBOUT).'; +comment on column wt_dbout_runs_vw.dbout_type is 'Type of the Database Object Under Test (DBOUT).'; +comment on column wt_dbout_runs_vw.test_runner_id is 'Surrogate Key the Test Runner package.'; +comment on column wt_dbout_runs_vw.test_runner_owner is 'Owner of the Test Runner package.'; +comment on column wt_dbout_runs_vw.test_runner_name is 'Name of the Test Runner package.'; +comment on column wt_dbout_runs_vw.test_run_id is 'Primary (Surrogate) Key for each Test Run'; +comment on column wt_dbout_runs_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; +comment on column wt_dbout_runs_vw.trigger_offset is 'Calculated offset from start of Trigger Source to start of Trigger PL/SQL Block.'; +comment on column wt_dbout_runs_vw.profiler_runid is 'DBMS_PROFILER unique run identifier from plsql_profiler_runnumber sequence'; +comment on column wt_dbout_runs_vw.error_message is 'Optional Error messages from this Test Run.'; + +grant select on wt_dbout_runs_vw to public; diff --git a/src/core/wt_dbouts.tab b/src/core/wt_dbouts.tab index 66f9ae8..a3f2b0a 100644 --- a/src/core/wt_dbouts.tab +++ b/src/core/wt_dbouts.tab @@ -15,7 +15,7 @@ create table wt_dbouts ) pctfree 0; create index wt_dbouts_ix1 - on wt_dbouts (dbout_type, dbout_owner); + on wt_dbouts (type, owner); comment on table wt_dbouts is 'List of Database Objects Under Test (DBOUT).'; comment on column wt_dbouts.id is 'Primary (Surrogate) Key for each Database Objects Under Test (DBOUT)'; diff --git a/src/core/wt_profiles_vw.vw b/src/core/wt_profiles_vw.vw new file mode 100644 index 0000000..ef86b9f --- /dev/null +++ b/src/core/wt_profiles_vw.vw @@ -0,0 +1,51 @@ + +-- +-- DBOUT Profiles View Installation +-- + +create view wt_profiles_vw as +select db.dbout_id + ,db.dbout_owner + ,db.dbout_name + ,db.dbout_type + ,db.test_runner_id + ,db.test_runner_owner + ,db.test_runner_name + ,db.test_run_id + ,db.is_last_run + ,db.trigger_offset + ,db.profiler_runid + ,db.error_message + ,prof.line + ,prof.status + ,prof.total_occur + ,prof.total_usecs + ,prof.min_usecs + ,prof.max_usecs + ,prof.text + from wt_profiles prof + join wt_dbout_runs_vw db + on db.test_run_id = prof.test_run_id; + +comment on table wt_profiles_vw is 'PL/SQL Profiler data for Database Object Under Test (DBOUT).'; +comment on column wt_profiles_vw.dbout_id is 'Surrogate Key to the Database Object Under Test (DBOUT).'; +comment on column wt_profiles_vw.dbout_owner is 'Owner of the Database Object Under Test (DBOUT).'; +comment on column wt_profiles_vw.dbout_name is 'Name of the Database Object Under Test (DBOUT).'; +comment on column wt_profiles_vw.dbout_type is 'Type of the Database Object Under Test (DBOUT).'; +comment on column wt_profiles_vw.test_runner_id is 'Surrogate Key the Test Runner package.'; +comment on column wt_profiles_vw.test_runner_owner is 'Owner of the Test Runner package.'; +comment on column wt_profiles_vw.test_runner_name is 'Name of the Test Runner package.'; +comment on column wt_profiles_vw.test_run_id is 'Foreign Key for the Test Run.'; +comment on column wt_profiles_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; +comment on column wt_profiles_vw.trigger_offset is 'Calculated offset from start of Trigger Source to start of Trigger PL/SQL Block.'; +comment on column wt_profiles_vw.profiler_runid is 'DBMS_PROFILER unique run identifier from plsql_profiler_runnumber sequence'; +comment on column wt_profiles_vw.error_message is 'Optional Error messages from this Test Run.'; +comment on column wt_profiles_vw.line is 'Source code line number.'; +comment on column wt_profiles_vw.status is 'Executed/NotExecuted/Excluded/Ignored/Unknown Status from the Profiler'; +comment on column wt_profiles_vw.total_occur is 'Number of times this line was executed.'; +comment on column wt_profiles_vw.total_usecs is 'Total time in microseconds spent executing this line.'; +comment on column wt_profiles_vw.min_usecs is 'Minimum execution time in microseconds for this line.'; +comment on column wt_profiles_vw.max_usecs is 'Maximum execution time in microseconds for this line.'; +comment on column wt_profiles_vw.text is 'Source code text for this line number.'; + +grant select on wt_profiles_vw to public; diff --git a/src/core/wt_results.tab b/src/core/wt_results.tab index de3fd5b..d6757ae 100644 --- a/src/core/wt_results.tab +++ b/src/core/wt_results.tab @@ -27,7 +27,7 @@ create index wt_results_ix1 comment on table wt_results is 'Results data from Test Runs.'; comment on column wt_results.test_run_id is 'Foreign Key for the Test Run, Primary Key part 1.'; comment on column wt_results.result_seq is 'Sequence number for this Result, Primary Key part 2.'; -comment on column wt_results.testcase is 'Foreign Key for the Test Case.'; +comment on column wt_results.testcase_id is 'Foreign Key for the Test Case.'; comment on column wt_results.executed_dtm is 'Date/Time (with Fractional Seconds) this Result was captured'; comment on column wt_results.interval_msecs is 'Interval time in milliseonds since the previous Result or start ot the Test Run.'; comment on column wt_results.assertion is 'Name of the Assertion Test performed'; diff --git a/src/core/wt_results_vw.vw b/src/core/wt_results_vw.vw new file mode 100644 index 0000000..2788aba --- /dev/null +++ b/src/core/wt_results_vw.vw @@ -0,0 +1,45 @@ + +-- +-- Results View Installation +-- + +create view wt_results_vw as +select tr.test_runner_id + ,tr.test_runner_owner + ,tr.test_runner_name + ,res.test_run_id + ,tr.is_last_run + ,tr.start_dtm + ,tr.end_dtm + ,tr.error_message + ,res.result_seq + ,res.testcase_id + ,res.executed_dtm + ,res.interval_msecs + ,res.assertion + ,res.status + ,res.message + ,res.details + from wt_results res + join wt_test_runs_vw tr + on tr.test_run_id = res.test_run_id; + +comment on table wt_results_vw is 'Results data from Test Runs.'; +comment on column wt_results_vw.test_runner_id is 'Surrogate Key the Test Runner package.'; +comment on column wt_results_vw.test_runner_owner is 'Owner of the Test Runner package.'; +comment on column wt_results_vw.test_runner_name is 'Name of the Test Runner package.'; +comment on column wt_results_vw.test_run_id is 'Foreign Key for the Test Run'; +comment on column wt_results_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; +comment on column wt_results_vw.start_dtm is 'Date/time (and fractional seconds) this Test Run started.'; +comment on column wt_results_vw.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; +comment on column wt_results_vw.error_message is 'Optional Error messages from this Test Run.'; +comment on column wt_results_vw.result_seq is 'Sequence number for this Result'; +comment on column wt_results_vw.testcase_id is 'Foreign Key for the Test Case.'; +comment on column wt_results_vw.executed_dtm is 'Date/Time (with Fractional Seconds) this Result was captured'; +comment on column wt_results_vw.interval_msecs is 'Interval time in milliseonds since the previous Result or start ot the Test Run.'; +comment on column wt_results_vw.assertion is 'Name of the Assertion Test performed'; +comment on column wt_results_vw.status is 'PASS/FAIL Status from the Assertion'; +comment on column wt_results_vw.details is 'Assertion Details, i.e. Expected Value and Actual Value'; +comment on column wt_results_vw.message is 'Optional test identifier that helps connect an Assertion to the Test Runner.'; + +grant select on wt_results_vw to public; diff --git a/src/core/wt_test_run.pkb b/src/core/wt_test_run.pkb new file mode 100644 index 0000000..0583deb --- /dev/null +++ b/src/core/wt_test_run.pkb @@ -0,0 +1,114 @@ +create or replace package body wt_testcase +as + +--------------------- +-- Public Procedures +--------------------- + +------------------------------------------------------------ +procedure insert_test_run + (in_test_runs_rec in wt_test_runs_vw%ROWTYPE) +is +begin + if g_test_runs_rec.id is null + then + return; + end if; + g_test_runs_rec.end_dtm := systimestamp; + clear_last_run + (in_runner_owner => g_test_runs_rec.runner_owner + ,in_runner_name => g_test_runs_rec.runner_name + ,in_last_run_flag => IS_LAST_RUN_FLAG); + insert into wt_test_runs values g_test_runs_rec; +end insert_test_run; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_insert_test_run + is + -------------------------------------- WTPLSQL Testing -- + TYPE l_dbmsout_buff_type is table of varchar2(32767); + l_dbmsout_buff l_dbmsout_buff_type; + l_test_runs_rec wt_test_runs%ROWTYPE; + l_dbmsout_line varchar2(32767); + l_dbmsout_stat number; + l_num_recs number; + begin + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'INSERT_TEST_RUN Happy Path 1'; + wt_assert.eqqueryvalue ( + msg_in => 'Records Before Insert', + check_query_in => 'select count(*) from wt_test_runs' || + ' where id = ' || g_test_runs_rec.id, + against_value_in => 0); + -------------------------------------- WTPLSQL Testing -- + l_test_runs_rec := g_test_runs_rec; + insert_test_run; + g_test_runs_rec := l_test_runs_rec; + wt_assert.eqqueryvalue ( + msg_in => 'Number of Records', + check_query_in => 'select count(*) from wt_test_runs' || + ' where id = ' || g_test_runs_rec.id, + against_value_in => 1); + -------------------------------------- WTPLSQL Testing -- + delete from wt_test_runs + where id = l_test_runs_rec.id; + COMMIT; + wt_assert.eqqueryvalue ( + msg_in => 'Records After Delete', + check_query_in => 'select count(*) from wt_test_runs' || + ' where id = ' || g_test_runs_rec.id, + against_value_in => 0); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'INSERT_TEST_RUN Happy Path 2'; + l_test_runs_rec := g_test_runs_rec; + g_test_runs_rec.id := null; + insert_test_run; + g_test_runs_rec := l_test_runs_rec; + wt_assert.eqqueryvalue ( + msg_in => 'Records After Delete', + check_query_in => 'select count(*) from wt_test_runs' || + ' where id = ' || g_test_runs_rec.id, + against_value_in => 0); + end t_insert_test_run; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + +procedure clear_last_run + (in_runner_owner in varchar2 + ,in_runner_name in varchar2 + ,in_last_run_flag in varchar2) +as +begin + update wt_test_runs + set is_last_run = NULL + where runner_owner = in_runner_owner + and runner_name = in_runner_name + and is_last_run = in_last_run_flag; +end clear_last_run; + +procedure set_last_run + (in_runner_owner in varchar2 + ,in_runner_name in varchar2 + ,in_last_run_flag in varchar2) +as +begin + for buff in (select * from wt_test_runs + where runner_owner = in_runner_owner + and runner_name = in_runner_name + and is_last_run = in_last_run_flag ) + loop + -- Abort if a IS_LAST_RUN flag is already set + return; + end loop; + update wt_test_runs + set is_last_run = in_last_run_flag + where runner_owner = in_runner_owner + and runner_name = in_runner_name + and start_dtm = ( + select max(trn.start_dtm) + from wt_test_runs trn + where trn.runner_owner = in_runner_owner + and trn.runner_name = in_runner_name ); +end set_last_run; + +end wt_testcase; diff --git a/src/core/wt_test_run.pks b/src/core/wt_test_run.pks new file mode 100644 index 0000000..1ee5f51 --- /dev/null +++ b/src/core/wt_test_run.pks @@ -0,0 +1,22 @@ +create or replace package wt_test_run + authid definer +as + + procedure insert_test_run + (in_test_runs_rec in wt_test_runs_vw%ROWTYPE); + + -- Use the SET_LAST_RUN procedure to set the IS_LAST_RUN flag + -- after running this procedure. + procedure clear_last_run + (in_runner_owner in varchar2 + ,in_runner_name in varchar2 + ,in_last_run_flag in varchar2); + + -- Use the CLEAR_LAST_RUN procedure to clear the IS_LAST_RUN + -- flag before running this procedure. + procedure set_last_run + (in_runner_owner in varchar2 + ,in_runner_name in varchar2 + ,in_last_run_flag in varchar2); + +end wt_testcase; diff --git a/src/core/wt_test_runners.tab b/src/core/wt_test_runners.tab index 953de05..bbd4b37 100644 --- a/src/core/wt_test_runners.tab +++ b/src/core/wt_test_runners.tab @@ -6,11 +6,11 @@ create sequence wt_test_runners_seq order; create table wt_test_runners - (id number(38) constraint wt_test_runs_nn1 not null - ,owner varchar2(128) constraint wt_test_runs_nn2 not null - ,name varchar2(128) constraint wt_test_runs_nn3 not null + (id number(38) constraint wt_test_runners_nn1 not null + ,owner varchar2(128) constraint wt_test_runners_nn2 not null + ,name varchar2(128) constraint wt_test_runners_nn3 not null ,constraint wt_test_runners_pk primary key (id) - ,constraint wt_test_runners_nk1 unique (runner_owner, runner_name) + ,constraint wt_test_runners_nk1 unique (owner, name) ) pctfree 0; comment on table wt_test_runners is 'List of Test Runners.'; diff --git a/src/core/wt_test_runs_vw.vw b/src/core/wt_test_runs_vw.vw new file mode 100644 index 0000000..2a446bd --- /dev/null +++ b/src/core/wt_test_runs_vw.vw @@ -0,0 +1,29 @@ + +-- +-- Test Runs Table View Installation +-- + +create view wt_test_runs_vw as +select tr.id TEST_RUN_ID + ,tr.test_runner_id + ,tnr.owner TEST_RUNNER_OWNER + ,tnr.name TEST_RUNNER_NAME + ,tr.is_last_run + ,tr.start_dtm + ,tr.end_dtm + ,tr.error_message + from wt_test_runs tr + join wt_test_runners tnr + on tnr.id = tr.test_runner_id; + +comment on table wt_test_runs_vw is 'Test Run data for each execution of a Test Runner.'; +comment on column wt_test_runs_vw.test_run_id is 'Primary (Surrogate) Key for each Test Run'; +comment on column wt_test_runs_vw.test_runner_id is 'Surrogate Key the Test Runner package.'; +comment on column wt_test_runs_vw.test_runner_owner is 'Owner of the Test Runner package.'; +comment on column wt_test_runs_vw.test_runner_name is 'Name of the Test Runner package.'; +comment on column wt_test_runs_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; +comment on column wt_test_runs_vw.start_dtm is 'Date/time (and fractional seconds) this Test Run started.'; +comment on column wt_test_runs_vw.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; +comment on column wt_test_runs_vw.error_message is 'Optional Error messages from this Test Run.'; + +grant select on wt_test_runs_vw to public; diff --git a/src/core/wt_testcases.tab b/src/core/wt_testcases.tab index 2214778..042fbd5 100644 --- a/src/core/wt_testcases.tab +++ b/src/core/wt_testcases.tab @@ -6,9 +6,9 @@ create sequence wt_testcases_seq; create table wt_testcases - (id number(38) constraint wt_testcases_nn1 not null - ,name varchar2(128) constraint wt_testcases_nn2 not null - ,constraint wt_testcases_pk primary key (id) + (id number(38) constraint wt_testcases_nn1 not null + ,name varchar2(128) constraint wt_testcases_nn2 not null + ,constraint wt_testcases_pk primary key (id) ,constraint wt_testcases_nk1 unique (name) ); diff --git a/src/core/wtplsql.pkb b/src/core/wtplsql.pkb index 3d7ce97..5d39ce2 100644 --- a/src/core/wtplsql.pkb +++ b/src/core/wtplsql.pkb @@ -88,76 +88,6 @@ $THEN $END ----------------%WTPLSQL_end_ignore_lines%---------------- ------------------------------------------------------------- -procedure insert_test_run -is - l_wt_test_runs_recNULL wt_test_runs%ROWTYPE; -begin - if g_test_runs_rec.id is null - then - return; - end if; - g_test_runs_rec.end_dtm := systimestamp; - clear_last_run - (in_runner_owner => g_test_runs_rec.runner_owner - ,in_runner_name => g_test_runs_rec.runner_name - ,in_last_run_flag => IS_LAST_RUN_FLAG); - insert into wt_test_runs values g_test_runs_rec; - g_test_runs_rec := l_wt_test_runs_recNULL; -end insert_test_run; - -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure t_insert_test_run - is - -------------------------------------- WTPLSQL Testing -- - TYPE l_dbmsout_buff_type is table of varchar2(32767); - l_dbmsout_buff l_dbmsout_buff_type; - l_test_runs_rec wt_test_runs%ROWTYPE; - l_dbmsout_line varchar2(32767); - l_dbmsout_stat number; - l_num_recs number; - begin - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'INSERT_TEST_RUN Happy Path 1'; - wt_assert.eqqueryvalue ( - msg_in => 'Records Before Insert', - check_query_in => 'select count(*) from wt_test_runs' || - ' where id = ' || g_test_runs_rec.id, - against_value_in => 0); - -------------------------------------- WTPLSQL Testing -- - l_test_runs_rec := g_test_runs_rec; - insert_test_run; - g_test_runs_rec := l_test_runs_rec; - wt_assert.eqqueryvalue ( - msg_in => 'Number of Records', - check_query_in => 'select count(*) from wt_test_runs' || - ' where id = ' || g_test_runs_rec.id, - against_value_in => 1); - -------------------------------------- WTPLSQL Testing -- - delete from wt_test_runs - where id = l_test_runs_rec.id; - COMMIT; - wt_assert.eqqueryvalue ( - msg_in => 'Records After Delete', - check_query_in => 'select count(*) from wt_test_runs' || - ' where id = ' || g_test_runs_rec.id, - against_value_in => 0); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'INSERT_TEST_RUN Happy Path 2'; - l_test_runs_rec := g_test_runs_rec; - g_test_runs_rec.id := null; - insert_test_run; - g_test_runs_rec := l_test_runs_rec; - wt_assert.eqqueryvalue ( - msg_in => 'Records After Delete', - check_query_in => 'select count(*) from wt_test_runs' || - ' where id = ' || g_test_runs_rec.id, - against_value_in => 0); - end t_insert_test_run; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- - - --------------------- -- Public Procedures --------------------- @@ -229,7 +159,7 @@ procedure test_run (in_package_name in varchar2) is pragma AUTONOMOUS_TRANSACTION; -- Required if called as Remote Procedure Call (RPC) - l_test_runs_rec_NULL wt_test_runs%ROWTYPE; + l_test_runs_rec_NULL wt_test_runs_vw%ROWTYPE; l_error_stack varchar2(32000); procedure concat_err_message (in_err_msg in varchar2) diff --git a/src/core/wtplsql.pks b/src/core/wtplsql.pks index 9177c5b..d8f4531 100644 --- a/src/core/wtplsql.pks +++ b/src/core/wtplsql.pks @@ -17,7 +17,7 @@ as g_keep_num_recs number := 20; - g_test_runs_rec wt_test_runs%ROWTYPE; + g_test_runs_rec wt_test_runs_vw%ROWTYPE; procedure test_run (in_package_name in varchar2); diff --git a/src/junit_xml/junit_report_all.prc b/src/junit_xml/junit_report_all.prc index b6ce166..eced83a 100644 --- a/src/junit_xml/junit_report_all.prc +++ b/src/junit_xml/junit_report_all.prc @@ -14,27 +14,32 @@ begin select tr.start_dtm ,tr.end_dtm ,tr.id - ,tr.runner_owner || '.' || tr.runner_name SUITE_NAME - ,nvl(tr.dbout_owner, tr.runner_owner) PACKAGE_NAME + ,tr.owner || '.' || tr.name SUITE_NAME + ,tr.name + ,nvl(db.owner, tr.runner_owner) PACKAGE_NAME ,case when tr.dbout_name || tr.dbout_type is null then 'TEST_RUNNER' else tr.dbout_name || ':' || tr.dbout_type end CLASS_NAME ,count(distinct res.testcase_id) TESTCASES - ,sum(case res.status when 'FAIL' then 1 - else 0 + ,sum(case res.status + when wt_assert.C_FAIL then 1 + else 0 end) FAILURES ,extract(day from (tr.end_dtm - tr.start_dtm) * 86400000) TOT_INTERVAL_MSECS ,tr.error_message from wt_test_runs tr + left join wt_dbouts db + on db.id = tr.dbout_id left join wt_results res on res.test_run_id = tr.id where tr.is_last_run = wtplsql.get_last_run_flag group by tr.start_dtm ,tr.end_dtm ,tr.id - ,tr.runner_owner || '.' || tr.runner_name + ,tr.runner_owner + ,tr.runner_name ,nvl(tr.dbout_owner, tr.runner_owner) ,case when tr.dbout_name || tr.dbout_type is null then 'TEST_RUNNER' @@ -54,7 +59,7 @@ begin '">' ); for cases in ( select tr.id - ,res.name TESTCASE + ,nvl(res.name,suites.runner_name) TESTCASE ,count(res.test_run_id) ,sum(case res.status when 'FAIL' then 1 else 0 @@ -73,11 +78,11 @@ begin if nvl(cases.failures,1) = 0 and suites.error_message is null then - p(' '); else - p(' '); p(' Date: Wed, 7 Nov 2018 11:49:58 -0600 Subject: [PATCH 030/141] Rename 2 Directories --- docs/{core_demo => demo}/Package-Test.htm | 0 docs/{core_demo => demo}/Package-Test.md | 0 docs/{core_demo => demo}/README.htm | 0 docs/{core_demo => demo}/README.md | 0 docs/{core_demo => demo}/Table-Test.htm | 0 docs/{core_demo => demo}/Table-Test.md | 0 docs/{core_demo => demo}/Test-Runner.htm | 0 docs/{core_demo => demo}/Test-Runner.md | 0 docs/{core_demo => demo}/Trigger-Test.htm | 0 docs/{core_demo => demo}/Trigger-Test.md | 0 docs/{core_demo => demo}/Type-Test.htm | 0 docs/{core_demo => demo}/Type-Test.md | 0 .../images/Leaving Something Behind.PNG | Bin .../images/Setup and Teardown.PNG | Bin .../images/Testing Put Line and Get Line.PNG | Bin docs/{core_demo => demo}/md-to-htm.bat | 0 docs/{core_demo => demo}/md-to-htm.lua | 0 docs/{core_demo => demo}/ut_betwnstr.htm | 0 docs/{core_demo => demo}/ut_betwnstr.md | 0 docs/{core_demo => demo}/ut_calc_secs_between.htm | 0 docs/{core_demo => demo}/ut_calc_secs_between.md | 0 docs/{core_demo => demo}/ut_str.htm | 0 docs/{core_demo => demo}/ut_str.md | 0 docs/{core_demo => demo}/ut_truncit.htm | 0 docs/{core_demo => demo}/ut_truncit.md | 0 docs/{core_stats_gui => stats_gui}/README.md | 0 docs/{core_stats_gui => stats_gui}/README.txt | 0 docs/{core_stats_gui => stats_gui}/_config.yml | 0 docs/{core_stats_gui => stats_gui}/md-to-htm.bat | 0 docs/{core_stats_gui => stats_gui}/md-to-htm.lua | 0 30 files changed, 0 insertions(+), 0 deletions(-) rename docs/{core_demo => demo}/Package-Test.htm (100%) rename docs/{core_demo => demo}/Package-Test.md (100%) rename docs/{core_demo => demo}/README.htm (100%) rename docs/{core_demo => demo}/README.md (100%) rename docs/{core_demo => demo}/Table-Test.htm (100%) rename docs/{core_demo => demo}/Table-Test.md (100%) rename docs/{core_demo => demo}/Test-Runner.htm (100%) rename docs/{core_demo => demo}/Test-Runner.md (100%) rename docs/{core_demo => demo}/Trigger-Test.htm (100%) rename docs/{core_demo => demo}/Trigger-Test.md (100%) rename docs/{core_demo => demo}/Type-Test.htm (100%) rename docs/{core_demo => demo}/Type-Test.md (100%) rename docs/{core_demo => demo}/images/Leaving Something Behind.PNG (100%) rename docs/{core_demo => demo}/images/Setup and Teardown.PNG (100%) rename docs/{core_demo => demo}/images/Testing Put Line and Get Line.PNG (100%) rename docs/{core_demo => demo}/md-to-htm.bat (100%) rename docs/{core_demo => demo}/md-to-htm.lua (100%) rename docs/{core_demo => demo}/ut_betwnstr.htm (100%) rename docs/{core_demo => demo}/ut_betwnstr.md (100%) rename docs/{core_demo => demo}/ut_calc_secs_between.htm (100%) rename docs/{core_demo => demo}/ut_calc_secs_between.md (100%) rename docs/{core_demo => demo}/ut_str.htm (100%) rename docs/{core_demo => demo}/ut_str.md (100%) rename docs/{core_demo => demo}/ut_truncit.htm (100%) rename docs/{core_demo => demo}/ut_truncit.md (100%) rename docs/{core_stats_gui => stats_gui}/README.md (100%) rename docs/{core_stats_gui => stats_gui}/README.txt (100%) rename docs/{core_stats_gui => stats_gui}/_config.yml (100%) rename docs/{core_stats_gui => stats_gui}/md-to-htm.bat (100%) rename docs/{core_stats_gui => stats_gui}/md-to-htm.lua (100%) diff --git a/docs/core_demo/Package-Test.htm b/docs/demo/Package-Test.htm similarity index 100% rename from docs/core_demo/Package-Test.htm rename to docs/demo/Package-Test.htm diff --git a/docs/core_demo/Package-Test.md b/docs/demo/Package-Test.md similarity index 100% rename from docs/core_demo/Package-Test.md rename to docs/demo/Package-Test.md diff --git a/docs/core_demo/README.htm b/docs/demo/README.htm similarity index 100% rename from docs/core_demo/README.htm rename to docs/demo/README.htm diff --git a/docs/core_demo/README.md b/docs/demo/README.md similarity index 100% rename from docs/core_demo/README.md rename to docs/demo/README.md diff --git a/docs/core_demo/Table-Test.htm b/docs/demo/Table-Test.htm similarity index 100% rename from docs/core_demo/Table-Test.htm rename to docs/demo/Table-Test.htm diff --git a/docs/core_demo/Table-Test.md b/docs/demo/Table-Test.md similarity index 100% rename from docs/core_demo/Table-Test.md rename to docs/demo/Table-Test.md diff --git a/docs/core_demo/Test-Runner.htm b/docs/demo/Test-Runner.htm similarity index 100% rename from docs/core_demo/Test-Runner.htm rename to docs/demo/Test-Runner.htm diff --git a/docs/core_demo/Test-Runner.md b/docs/demo/Test-Runner.md similarity index 100% rename from docs/core_demo/Test-Runner.md rename to docs/demo/Test-Runner.md diff --git a/docs/core_demo/Trigger-Test.htm b/docs/demo/Trigger-Test.htm similarity index 100% rename from docs/core_demo/Trigger-Test.htm rename to docs/demo/Trigger-Test.htm diff --git a/docs/core_demo/Trigger-Test.md b/docs/demo/Trigger-Test.md similarity index 100% rename from docs/core_demo/Trigger-Test.md rename to docs/demo/Trigger-Test.md diff --git a/docs/core_demo/Type-Test.htm b/docs/demo/Type-Test.htm similarity index 100% rename from docs/core_demo/Type-Test.htm rename to docs/demo/Type-Test.htm diff --git a/docs/core_demo/Type-Test.md b/docs/demo/Type-Test.md similarity index 100% rename from docs/core_demo/Type-Test.md rename to docs/demo/Type-Test.md diff --git a/docs/core_demo/images/Leaving Something Behind.PNG b/docs/demo/images/Leaving Something Behind.PNG similarity index 100% rename from docs/core_demo/images/Leaving Something Behind.PNG rename to docs/demo/images/Leaving Something Behind.PNG diff --git a/docs/core_demo/images/Setup and Teardown.PNG b/docs/demo/images/Setup and Teardown.PNG similarity index 100% rename from docs/core_demo/images/Setup and Teardown.PNG rename to docs/demo/images/Setup and Teardown.PNG diff --git a/docs/core_demo/images/Testing Put Line and Get Line.PNG b/docs/demo/images/Testing Put Line and Get Line.PNG similarity index 100% rename from docs/core_demo/images/Testing Put Line and Get Line.PNG rename to docs/demo/images/Testing Put Line and Get Line.PNG diff --git a/docs/core_demo/md-to-htm.bat b/docs/demo/md-to-htm.bat similarity index 100% rename from docs/core_demo/md-to-htm.bat rename to docs/demo/md-to-htm.bat diff --git a/docs/core_demo/md-to-htm.lua b/docs/demo/md-to-htm.lua similarity index 100% rename from docs/core_demo/md-to-htm.lua rename to docs/demo/md-to-htm.lua diff --git a/docs/core_demo/ut_betwnstr.htm b/docs/demo/ut_betwnstr.htm similarity index 100% rename from docs/core_demo/ut_betwnstr.htm rename to docs/demo/ut_betwnstr.htm diff --git a/docs/core_demo/ut_betwnstr.md b/docs/demo/ut_betwnstr.md similarity index 100% rename from docs/core_demo/ut_betwnstr.md rename to docs/demo/ut_betwnstr.md diff --git a/docs/core_demo/ut_calc_secs_between.htm b/docs/demo/ut_calc_secs_between.htm similarity index 100% rename from docs/core_demo/ut_calc_secs_between.htm rename to docs/demo/ut_calc_secs_between.htm diff --git a/docs/core_demo/ut_calc_secs_between.md b/docs/demo/ut_calc_secs_between.md similarity index 100% rename from docs/core_demo/ut_calc_secs_between.md rename to docs/demo/ut_calc_secs_between.md diff --git a/docs/core_demo/ut_str.htm b/docs/demo/ut_str.htm similarity index 100% rename from docs/core_demo/ut_str.htm rename to docs/demo/ut_str.htm diff --git a/docs/core_demo/ut_str.md b/docs/demo/ut_str.md similarity index 100% rename from docs/core_demo/ut_str.md rename to docs/demo/ut_str.md diff --git a/docs/core_demo/ut_truncit.htm b/docs/demo/ut_truncit.htm similarity index 100% rename from docs/core_demo/ut_truncit.htm rename to docs/demo/ut_truncit.htm diff --git a/docs/core_demo/ut_truncit.md b/docs/demo/ut_truncit.md similarity index 100% rename from docs/core_demo/ut_truncit.md rename to docs/demo/ut_truncit.md diff --git a/docs/core_stats_gui/README.md b/docs/stats_gui/README.md similarity index 100% rename from docs/core_stats_gui/README.md rename to docs/stats_gui/README.md diff --git a/docs/core_stats_gui/README.txt b/docs/stats_gui/README.txt similarity index 100% rename from docs/core_stats_gui/README.txt rename to docs/stats_gui/README.txt diff --git a/docs/core_stats_gui/_config.yml b/docs/stats_gui/_config.yml similarity index 100% rename from docs/core_stats_gui/_config.yml rename to docs/stats_gui/_config.yml diff --git a/docs/core_stats_gui/md-to-htm.bat b/docs/stats_gui/md-to-htm.bat similarity index 100% rename from docs/core_stats_gui/md-to-htm.bat rename to docs/stats_gui/md-to-htm.bat diff --git a/docs/core_stats_gui/md-to-htm.lua b/docs/stats_gui/md-to-htm.lua similarity index 100% rename from docs/core_stats_gui/md-to-htm.lua rename to docs/stats_gui/md-to-htm.lua From 8a81f15f2b58a8186ecb0b1a408344ab310a1af2 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Thu, 8 Nov 2018 07:04:18 -0600 Subject: [PATCH 031/141] More Changes --- src/core/wt_assert.pkb | 316 ++++++++++++------------- src/core/wt_assert.pks | 2 +- src/core/wt_result.pkb | 153 ++++++------ src/core/wt_result.pks | 10 +- src/core/wt_test_runner.pkb | 57 ++--- src/{core => stats}/wt_text_report.pkb | 0 src/{core => stats}/wt_text_report.pks | 8 +- 7 files changed, 268 insertions(+), 278 deletions(-) rename src/{core => stats}/wt_text_report.pkb (100%) rename src/{core => stats}/wt_text_report.pks (88%) diff --git a/src/core/wt_assert.pkb b/src/core/wt_assert.pkb index 2885a26..76b3f19 100644 --- a/src/core/wt_assert.pkb +++ b/src/core/wt_assert.pkb @@ -72,7 +72,7 @@ $THEN procedure t_boolean_to_status is begin - wt_assert.g_testcase := 'BOOLEAN_TO_STATUS'; + wt_assert.g_testcase_name := 'BOOLEAN_TO_STATUS'; -------------------------------------- WTPLSQL Testing -- wt_assert.eq (msg_in => 'Test for "TRUE" conversion' @@ -105,7 +105,7 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- else C_FAIL end ,in_details => g_rec.last_details - ,in_testcase => nvl(g_testcase, wt_test_runner.get_runner_name) + ,in_testcase_name => g_testcase_name ,in_message => g_rec.last_msg); $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ end if; @@ -119,7 +119,7 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- (in_assertion => g_rec.last_assert ,in_status => C_FAIL ,in_details => g_rec.last_details - ,in_testcase => g_testcase + ,in_testcase => g_testcase_name ,in_message => g_rec.last_msg) ); end if; @@ -131,7 +131,7 @@ $THEN is begin -------------------------------------- WTPLSQL Testing -- - g_testcase := 'PROCESS_ASSERTION'; + g_testcase_name := 'PROCESS_ASSERTION'; g_rec.last_assert := 'THIS'; g_rec.last_pass := FALSE; g_rec.last_details := 'Expected "PASS" and got "FAIL"'; @@ -203,7 +203,7 @@ $THEN is begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'COMPARE_QUERIES Bad Query Test 1'; + wt_assert.g_testcase_name := 'COMPARE_QUERIES Bad Query Test 1'; compare_queries ( check_query_in => 'select bogus123 from bogus456', against_query_in => 'select bogus987 from bogus654'); @@ -221,7 +221,7 @@ $THEN check_this_in => (temp_rec.last_details like '%PL/SQL: ORA-00942: table or view does not exist%')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'COMPARE_QUERIES Bad Query Test 2'; + wt_assert.g_testcase_name := 'COMPARE_QUERIES Bad Query Test 2'; compare_queries ( check_query_in => 'select table_name from user_tables', against_query_in => 'select tablespace_name from user_tables'); @@ -282,7 +282,7 @@ $THEN is begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Last Values Tests'; + wt_assert.g_testcase_name := 'Last Values Tests'; wt_assert.eq ( msg_in => 'Last Pass', check_this_in => last_pass, @@ -313,7 +313,7 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- procedure reset_globals is begin - g_testcase := ''; + g_testcase_name := ''; g_rec.last_pass := NULL; g_rec.last_assert := ''; g_rec.last_msg := ''; @@ -326,11 +326,11 @@ $THEN procedure t_reset_globals is begin - reset_globals; -- Resets g_testcase + reset_globals; -- Resets g_testcase_name temp_rec := g_rec; - temp_testcase := g_testcase; + temp_testcase := g_testcase_name; -------------------------------------- WTPLSQL Testing -- - g_testcase := 'RESET_GLOBALS'; + g_testcase_name := 'RESET_GLOBALS'; wt_assert.isnull( msg_in => 'temp_testcase', check_this_in => temp_testcase); @@ -420,7 +420,7 @@ $THEN is begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'NLS Settings'; + wt_assert.g_testcase_name := 'NLS Settings'; set_NLS_DATE_FORMAT('DD-MON-YYYY'); wt_assert.eq (msg_in => 'get_NLS_DATE_FORMAT 1' @@ -486,7 +486,7 @@ $THEN l_found_exception BOOLEAN; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'This Happy Path'; + wt_assert.g_testcase_name := 'This Happy Path'; wt_assert.this ( msg_in => 'Run Test', check_this_in => TRUE); @@ -509,7 +509,7 @@ $THEN check_this_in => temp_rec.last_details, against_this_in => 'Expected "TRUE" and got "TRUE"'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'This Sad Path 1'; + wt_assert.g_testcase_name := 'This Sad Path 1'; wtplsql_skip_save := TRUE; this ( msg_in => 'Not Used', @@ -521,7 +521,7 @@ $THEN check_this_in => temp_rec.last_pass, against_this_in => FALSE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'This Sad Path 2'; + wt_assert.g_testcase_name := 'This Sad Path 2'; wtplsql_skip_save := TRUE; begin this ( @@ -544,7 +544,7 @@ $THEN check_this_in => temp_rec.last_pass, against_this_in => FALSE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'This Sad Path 3'; + wt_assert.g_testcase_name := 'This Sad Path 3'; wtplsql_skip_save := TRUE; this ( msg_in => 'Not Used', @@ -676,7 +676,7 @@ $THEN l_found_exception BOOLEAN; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ VARCHAR2 Happy Path 1'; + wt_assert.g_testcase_name := 'EQ VARCHAR2 Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => 'X', @@ -711,20 +711,20 @@ $THEN msg_in => 'temp_rec.last_details', check_this_in => (temp_rec.last_details = 'Expected "X" and got "X"')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ VARCHAR2 Happy Path 2'; + wt_assert.g_testcase_name := 'EQ VARCHAR2 Happy Path 2'; eq ( msg_in => 'Run Test', check_this_in => 'X', against_this_in => 'X', null_ok_in => TRUE); - wt_assert.g_testcase := 'EQ VARCHAR2 Happy Path 3'; + wt_assert.g_testcase_name := 'EQ VARCHAR2 Happy Path 3'; eq ( msg_in => 'Run Test', check_this_in => '', against_this_in => '', null_ok_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 1'; + wt_assert.g_testcase_name := 'EQ VARCHAR2 Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -743,7 +743,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 2'; + wt_assert.g_testcase_name := 'EQ VARCHAR2 Sad Path 2'; wtplsql_skip_save := TRUE; begin eq ( @@ -766,7 +766,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 3'; + wt_assert.g_testcase_name := 'EQ VARCHAR2 Sad Path 3'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -785,7 +785,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 4'; + wt_assert.g_testcase_name := 'EQ VARCHAR2 Sad Path 4'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -804,7 +804,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 5'; + wt_assert.g_testcase_name := 'EQ VARCHAR2 Sad Path 5'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -824,7 +824,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 6'; + wt_assert.g_testcase_name := 'EQ VARCHAR2 Sad Path 6'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -845,13 +845,13 @@ $THEN check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- -- VARCHAR2 includes Includes ROWID - wt_assert.g_testcase := 'EQ ROWID Happy Path 1'; + wt_assert.g_testcase_name := 'EQ ROWID Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_rowid1, against_this_in => temp_rowid1); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ ROWID Sad Path 1'; + wt_assert.g_testcase_name := 'EQ ROWID Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -871,13 +871,13 @@ $THEN check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- -- VARCHAR2 includes Includes LONG - wt_assert.g_testcase := 'EQ LONG Happy Path 1'; + wt_assert.g_testcase_name := 'EQ LONG Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_long1, against_this_in => temp_long1); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ LONG Sad Path 1'; + wt_assert.g_testcase_name := 'EQ LONG Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -897,13 +897,13 @@ $THEN check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- -- VARCHAR2 includes Includes RAW - wt_assert.g_testcase := 'EQ RAW Happy Path 1'; + wt_assert.g_testcase_name := 'EQ RAW Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_raw1, against_this_in => temp_raw1); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ RAW Sad Path 1'; + wt_assert.g_testcase_name := 'EQ RAW Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -923,21 +923,21 @@ $THEN check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- -- VARCHAR2 includes Includes LONG RAW - wt_assert.g_testcase := 'EQ LANG RAW Happy Path 1'; + wt_assert.g_testcase_name := 'EQ LANG RAW Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_lraw1, against_this_in => temp_lraw1); -------------------------------------- WTPLSQL Testing -- -- VARCHAR2 includes Includes LONG RAW - wt_assert.g_testcase := 'EQ LANG RAW Happy Path 1'; + wt_assert.g_testcase_name := 'EQ LANG RAW Happy Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', check_this_in => temp_lraw1, against_this_in => temp_lraw2); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ LONG RAW Sad Path 1'; + wt_assert.g_testcase_name := 'EQ LONG RAW Sad Path 1'; wtplsql_skip_save := FALSE; temp_rec := g_rec; wt_assert.isnotnull ( @@ -952,13 +952,13 @@ $THEN check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- -- VARCHAR2 includes Includes NVARCHAR2 - wt_assert.g_testcase := 'EQ NVARCHAR2 Happy Path 1'; + wt_assert.g_testcase_name := 'EQ NVARCHAR2 Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_nc1, against_this_in => temp_nc1); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ NVARCHAR2 Sad Path 1'; + wt_assert.g_testcase_name := 'EQ NVARCHAR2 Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -977,26 +977,26 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ BOOLEAN Happy Path 1'; + wt_assert.g_testcase_name := 'EQ BOOLEAN Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => FALSE, against_this_in => FALSE); - wt_assert.g_testcase := 'EQ BOOLEAN Happy Path 2'; + wt_assert.g_testcase_name := 'EQ BOOLEAN Happy Path 2'; eq ( msg_in => 'Run Test', check_this_in => FALSE, against_this_in => FALSE, null_ok_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ BOOLEAN Happy Path 3'; + wt_assert.g_testcase_name := 'EQ BOOLEAN Happy Path 3'; eq ( msg_in => 'Run Test', check_this_in => temp_bool, against_this_in => temp_bool, null_ok_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 1'; + wt_assert.g_testcase_name := 'EQ BOOLEAN Happy Sad 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1015,7 +1015,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 2'; + wt_assert.g_testcase_name := 'EQ BOOLEAN Happy Sad 2'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1034,7 +1034,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 3'; + wt_assert.g_testcase_name := 'EQ BOOLEAN Happy Sad 3'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1054,7 +1054,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 4'; + wt_assert.g_testcase_name := 'EQ BOOLEAN Happy Sad 4'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1074,18 +1074,18 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ NUMBER Happy Path 1'; + wt_assert.g_testcase_name := 'EQ NUMBER Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => 4, against_this_in => 4); - wt_assert.g_testcase := 'EQ NUMBER Happy Path 2'; + wt_assert.g_testcase_name := 'EQ NUMBER Happy Path 2'; eq ( msg_in => 'Run Test', check_this_in => 9876543210987654321098765432109876543210, against_this_in => 9876543210987654321098765432109876543210); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ NUMBER Happy Path 1'; + wt_assert.g_testcase_name := 'EQ NUMBER Happy Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1105,14 +1105,14 @@ $THEN check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- -- EQ: NUMBER implicit conversion includes PLS_INTEGER - wt_assert.g_testcase := 'EQ PLS_INTEGER Happy Path 1'; + wt_assert.g_testcase_name := 'EQ PLS_INTEGER Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_pint1, against_this_in => temp_pint1); wtplsql_skip_save := TRUE; -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ PLS_INTEGER Sad Path 1'; + wt_assert.g_testcase_name := 'EQ PLS_INTEGER Sad Path 1'; eq ( msg_in => 'Not Used', check_this_in => temp_pint1, @@ -1130,13 +1130,13 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ DATE Happy Path 1'; + wt_assert.g_testcase_name := 'EQ DATE Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_date, against_this_in => temp_date); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ DATE Sad Path 1'; + wt_assert.g_testcase_name := 'EQ DATE Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1156,13 +1156,13 @@ $THEN check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- -- EQ: DATE implicit conversion includes TIMESTAMP - wt_assert.g_testcase := 'EQ TIMSETAMP Happy Path 1'; + wt_assert.g_testcase_name := 'EQ TIMSETAMP Happy Path 1'; eq ( msg_in => 'EQ TIMSETAMP Happy Path 1', check_this_in => temp_tstmp, against_this_in => temp_tstmp); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ TIMSETAMP Sad Path 1'; + wt_assert.g_testcase_name := 'EQ TIMSETAMP Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1182,13 +1182,13 @@ $THEN check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- -- EQ: DATE implicit conversion includes TIMESTAMP - wt_assert.g_testcase := 'EQ TIMSETAMP WITH LOCAL TIME ZONE Happy Path 1'; + wt_assert.g_testcase_name := 'EQ TIMSETAMP WITH LOCAL TIME ZONE Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_tstzn, against_this_in => temp_tstzn); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ TIMSETAMP WITH LOCAL TIME ZONE Sad Path 1'; + wt_assert.g_testcase_name := 'EQ TIMSETAMP WITH LOCAL TIME ZONE Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1208,13 +1208,13 @@ $THEN check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- -- EQ: DATE implicit conversion includes TIMESTAMP - wt_assert.g_testcase := 'EQ TIMSETAMP WITH TIME ZONE Happy Path 1'; + wt_assert.g_testcase_name := 'EQ TIMSETAMP WITH TIME ZONE Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_tstzn, against_this_in => temp_tstzn); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ TIMSETAMP WITH TIME ZONE Sad Path 1'; + wt_assert.g_testcase_name := 'EQ TIMSETAMP WITH TIME ZONE Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1234,13 +1234,13 @@ $THEN check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- -- EQ: DATE implicit conversion includes INTERVAL - wt_assert.g_testcase := 'EQ INTERVAL DAY TO SECOND Happy Path 1'; + wt_assert.g_testcase_name := 'EQ INTERVAL DAY TO SECOND Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_intds1, against_this_in => temp_intds1); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ INTERVAL DAY TO SECOND Sad Path 1'; + wt_assert.g_testcase_name := 'EQ INTERVAL DAY TO SECOND Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1260,13 +1260,13 @@ $THEN check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- -- EQ: DATE implicit conversion includes INTERVAL - wt_assert.g_testcase := 'EQ INTERVAL YEAR TO MONTH Happy Path 1'; + wt_assert.g_testcase_name := 'EQ INTERVAL YEAR TO MONTH Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_intym1, against_this_in => temp_intym1); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ INTERVAL YEAR TO MONTH Sad Path 1'; + wt_assert.g_testcase_name := 'EQ INTERVAL YEAR TO MONTH Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1285,7 +1285,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ XMLTYPE Happy Path 1'; + wt_assert.g_testcase_name := 'EQ XMLTYPE Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_xml1, @@ -1321,7 +1321,7 @@ $THEN check_this_in => (temp_rec.last_details like 'Expected "%')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ XMLTYPE Sad Path 1'; + wt_assert.g_testcase_name := 'EQ XMLTYPE Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1340,7 +1340,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ XMLTYPE Sad Path 2'; + wt_assert.g_testcase_name := 'EQ XMLTYPE Sad Path 2'; wtplsql_skip_save := TRUE; begin eq ( @@ -1363,7 +1363,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ CLOB Happy Path 1'; + wt_assert.g_testcase_name := 'EQ CLOB Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_clob1, @@ -1399,21 +1399,21 @@ $THEN check_this_in => (temp_rec.last_details like 'Expected "%')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ CLOB Happy Path 2'; + wt_assert.g_testcase_name := 'EQ CLOB Happy Path 2'; eq ( msg_in => 'Run Test', check_this_in => temp_clob1, against_this_in => temp_clob1, null_ok_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ CLOB Happy Path 3'; + wt_assert.g_testcase_name := 'EQ CLOB Happy Path 3'; eq ( msg_in => 'Run Test', check_this_in => cast (NULL as CLOB), against_this_in => cast (NULL as CLOB), null_ok_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ CLOB Sad Path 1'; + wt_assert.g_testcase_name := 'EQ CLOB Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1432,7 +1432,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ CLOB Sad Path 2'; + wt_assert.g_testcase_name := 'EQ CLOB Sad Path 2'; wtplsql_skip_save := TRUE; begin eq ( @@ -1455,7 +1455,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ CLOB Sad Path 3'; + wt_assert.g_testcase_name := 'EQ CLOB Sad Path 3'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1474,7 +1474,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ CLOB Sad Path 4'; + wt_assert.g_testcase_name := 'EQ CLOB Sad Path 4'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1494,27 +1494,27 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ NCLOB Happy Path 1'; + wt_assert.g_testcase_name := 'EQ NCLOB Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_nclob1, against_this_in => temp_nclob1); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ NCLOB Happy Path 2'; + wt_assert.g_testcase_name := 'EQ NCLOB Happy Path 2'; eq ( msg_in => 'Run Test', check_this_in => temp_nclob1, against_this_in => temp_nclob1, null_ok_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ NCLOB Happy Path 3'; + wt_assert.g_testcase_name := 'EQ NCLOB Happy Path 3'; eq ( msg_in => 'Run Test', check_this_in => cast (NULL as NCLOB), against_this_in => cast (NULL as NCLOB), null_ok_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ NCLOB Sad Path 1'; + wt_assert.g_testcase_name := 'EQ NCLOB Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1533,7 +1533,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ NCLOB Sad Path 2'; + wt_assert.g_testcase_name := 'EQ NCLOB Sad Path 2'; wtplsql_skip_save := TRUE; begin eq ( @@ -1556,7 +1556,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ NCLOB Sad Path 3'; + wt_assert.g_testcase_name := 'EQ NCLOB Sad Path 3'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1575,7 +1575,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ NCLOB Sad Path 4'; + wt_assert.g_testcase_name := 'EQ NCLOB Sad Path 4'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1595,7 +1595,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ BLOB Happy Path 1'; + wt_assert.g_testcase_name := 'EQ BLOB Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_blob1, @@ -1631,21 +1631,21 @@ $THEN check_this_in => (temp_rec.last_details = 'DBMS_LOB.COMPARE on BLOBs, compare_results: 0')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ BLOB Happy Path 2'; + wt_assert.g_testcase_name := 'EQ BLOB Happy Path 2'; eq ( msg_in => 'Run Test', check_this_in => temp_blob1, against_this_in => temp_blob1, null_ok_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ BLOB Happy Path 3'; + wt_assert.g_testcase_name := 'EQ BLOB Happy Path 3'; eq ( msg_in => 'Run Test', check_this_in => cast (NULL as BLOB), against_this_in => cast (NULL as BLOB), null_ok_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ BLOB Sad Path 1'; + wt_assert.g_testcase_name := 'EQ BLOB Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1664,7 +1664,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ BLOB Sad Path 2'; + wt_assert.g_testcase_name := 'EQ BLOB Sad Path 2'; wtplsql_skip_save := TRUE; begin eq ( @@ -1687,7 +1687,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ BLOB Sad Path 3'; + wt_assert.g_testcase_name := 'EQ BLOB Sad Path 3'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1706,7 +1706,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQ BLOB Sad Path 4'; + wt_assert.g_testcase_name := 'EQ BLOB Sad Path 4'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1810,7 +1810,7 @@ $THEN l_found_exception BOOLEAN; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNOTNULL VARCHAR2 Happy Path 1'; + wt_assert.g_testcase_name := 'ISNOTNULL VARCHAR2 Happy Path 1'; isnotnull ( msg_in => 'Run Test', check_this_in => 'X'); @@ -1834,7 +1834,7 @@ $THEN check_this_in => temp_rec.last_details, against_this_in => 'Expected NOT NULL and got "X"'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNOTNULL VARCHAR2 Sad Path 1'; + wt_assert.g_testcase_name := 'ISNOTNULL VARCHAR2 Sad Path 1'; wtplsql_skip_save := TRUE; isnotnull ( msg_in => 'Not Used', @@ -1845,7 +1845,7 @@ $THEN check_this_in => g_rec.last_pass, against_this_in => FALSE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNOTNULL VARCHAR2 Sad Path 2'; + wt_assert.g_testcase_name := 'ISNOTNULL VARCHAR2 Sad Path 2'; wtplsql_skip_save := TRUE; begin isnotnull ( @@ -1867,12 +1867,12 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNOTNULL BOOLEAN Happy Path 1'; + wt_assert.g_testcase_name := 'ISNOTNULL BOOLEAN Happy Path 1'; isnotnull ( msg_in => 'Run Test', check_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNOTNULL BOOLEAN Sad Path 1'; + wt_assert.g_testcase_name := 'ISNOTNULL BOOLEAN Sad Path 1'; wtplsql_skip_save := TRUE; isnotnull ( msg_in => 'Not Used', @@ -1883,7 +1883,7 @@ $THEN check_this_in => g_rec.last_pass, against_this_in => FALSE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNOTNULL BOOLEAN Sad Path 2'; + wt_assert.g_testcase_name := 'ISNOTNULL BOOLEAN Sad Path 2'; wtplsql_skip_save := TRUE; begin isnotnull ( @@ -1905,7 +1905,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNOTNULL CLOB Happy Path 1'; + wt_assert.g_testcase_name := 'ISNOTNULL CLOB Happy Path 1'; isnotnull ( msg_in => 'Run Test', check_this_in => temp_clob1); @@ -1932,7 +1932,7 @@ $THEN check_this_in => (temp_rec.last_details like 'Expected NOT NULL and got "%')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNOTNULL CLOB Sad Path 1'; + wt_assert.g_testcase_name := 'ISNOTNULL CLOB Sad Path 1'; wtplsql_skip_save := TRUE; isnotnull ( msg_in => 'Not Used', @@ -1943,7 +1943,7 @@ $THEN check_this_in => g_rec.last_pass, against_this_in => FALSE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNOTNULL CLOB Sad Path 2'; + wt_assert.g_testcase_name := 'ISNOTNULL CLOB Sad Path 2'; wtplsql_skip_save := TRUE; begin isnotnull ( @@ -1965,7 +1965,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNOTNULL BLOB Happy Path 1'; + wt_assert.g_testcase_name := 'ISNOTNULL BLOB Happy Path 1'; isnotnull ( msg_in => 'Run Test', check_this_in => temp_blob1); @@ -1989,7 +1989,7 @@ $THEN check_this_in => temp_rec.last_details, against_this_in => 'BLOB is NOT NULL'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNOTNULL BLOB Sad Path 1'; + wt_assert.g_testcase_name := 'ISNOTNULL BLOB Sad Path 1'; wtplsql_skip_save := TRUE; isnotnull ( msg_in => 'Not Used', @@ -2000,7 +2000,7 @@ $THEN check_this_in => g_rec.last_pass, against_this_in => FALSE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNOTNULL BLOB Sad Path 2'; + wt_assert.g_testcase_name := 'ISNOTNULL BLOB Sad Path 2'; wtplsql_skip_save := TRUE; begin isnotnull ( @@ -2102,7 +2102,7 @@ $THEN l_found_exception BOOLEAN; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNULL VARCHAR2 Happy Path 1'; + wt_assert.g_testcase_name := 'ISNULL VARCHAR2 Happy Path 1'; isnull ( msg_in => 'Run Test', check_this_in => ''); @@ -2126,7 +2126,7 @@ $THEN check_this_in => temp_rec.last_details, against_this_in => 'Expected NULL and got ""'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNULL VARCHAR2 Sad Path 1'; + wt_assert.g_testcase_name := 'ISNULL VARCHAR2 Sad Path 1'; wtplsql_skip_save := TRUE; isnull ( msg_in => 'Not Used', @@ -2137,7 +2137,7 @@ $THEN check_this_in => g_rec.last_pass, against_this_in => FALSE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNULL VARCHAR2 Sad Path 2'; + wt_assert.g_testcase_name := 'ISNULL VARCHAR2 Sad Path 2'; wtplsql_skip_save := TRUE; begin isnull ( @@ -2159,12 +2159,12 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNULL BOOLEAN Happy Path 1'; + wt_assert.g_testcase_name := 'ISNULL BOOLEAN Happy Path 1'; isnull ( msg_in => 'Run Test', check_this_in => temp_bool); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNULL BOOLEAN Sad Path 1'; + wt_assert.g_testcase_name := 'ISNULL BOOLEAN Sad Path 1'; wtplsql_skip_save := TRUE; isnull ( msg_in => 'Not Used', @@ -2175,7 +2175,7 @@ $THEN check_this_in => g_rec.last_pass, against_this_in => FALSE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNULL BOOLEAN Sad Path 2'; + wt_assert.g_testcase_name := 'ISNULL BOOLEAN Sad Path 2'; wtplsql_skip_save := TRUE; begin isnull ( @@ -2197,7 +2197,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNULL CLOB Happy Path 1'; + wt_assert.g_testcase_name := 'ISNULL CLOB Happy Path 1'; isnull ( msg_in => 'Run Test', check_this_in => cast (null as CLOB)); @@ -2221,7 +2221,7 @@ $THEN check_this_in => temp_rec.last_details, against_this_in => 'Expected NULL and got ""'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNULL CLOB Sad Path 1'; + wt_assert.g_testcase_name := 'ISNULL CLOB Sad Path 1'; wtplsql_skip_save := TRUE; isnull ( msg_in => 'Not Used', @@ -2232,7 +2232,7 @@ $THEN check_this_in => g_rec.last_pass, against_this_in => FALSE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNULL CLOB Sad Path 2'; + wt_assert.g_testcase_name := 'ISNULL CLOB Sad Path 2'; wtplsql_skip_save := TRUE; begin isnull ( @@ -2254,7 +2254,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNULL BLOB Happy Path 1'; + wt_assert.g_testcase_name := 'ISNULL BLOB Happy Path 1'; isnull ( msg_in => 'Run Test', check_this_in => cast (null as BLOB)); @@ -2278,7 +2278,7 @@ $THEN check_this_in => temp_rec.last_details, against_this_in => 'BLOB is NULL'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNULL BLOB Sad Path 1'; + wt_assert.g_testcase_name := 'ISNULL BLOB Sad Path 1'; wtplsql_skip_save := TRUE; isnull ( msg_in => 'Not Used', @@ -2289,7 +2289,7 @@ $THEN check_this_in => g_rec.last_pass, against_this_in => FALSE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'ISNULL BLOB Sad Path 2'; + wt_assert.g_testcase_name := 'ISNULL BLOB Sad Path 2'; wtplsql_skip_save := TRUE; begin isnull ( @@ -2420,7 +2420,7 @@ $THEN is begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Raises Tests Happy Path 1'; + wt_assert.g_testcase_name := 'Raises Tests Happy Path 1'; raises ( msg_in => 'RAISES Varchar2 Test', check_call_in => 'begin wt_assert.bogus; end;', @@ -2450,7 +2450,7 @@ $THEN 'PL/SQL: Statement ignored". ' || 'Exception raised by: "begin wt_assert.bogus; end;".'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Raises Tests Happy Path 2'; + wt_assert.g_testcase_name := 'Raises Tests Happy Path 2'; raises ( msg_in => 'RAISES Number Test', check_call_in => 'begin wt_assert.bogus; end;', @@ -2499,7 +2499,7 @@ $THEN 'PL/SQL: Statement ignored". ' || 'Exception raised by: "begin wt_assert.bogus; end;".'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Raises Tests Happy Path 3'; + wt_assert.g_testcase_name := 'Raises Tests Happy Path 3'; raises ( msg_in => 'RAISES Varchar2 No Error', check_call_in => 'begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;', @@ -2524,7 +2524,7 @@ $THEN 'Exception raised was "". ' || 'Exception raised by: "begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;".'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Raises Tests Sad Path 1'; + wt_assert.g_testcase_name := 'Raises Tests Sad Path 1'; wtplsql_skip_save := TRUE; raises ( msg_in => 'Not Used', @@ -2546,7 +2546,7 @@ $THEN 'Expected exception "%Incorrect Exception%". ' || 'Actual exception raised was "ORA-%')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Raises Tests Sad Path 2'; + wt_assert.g_testcase_name := 'Raises Tests Sad Path 2'; wtplsql_skip_save := TRUE; raises ( msg_in => 'Not Used', @@ -2729,7 +2729,7 @@ $THEN l_found_exception BOOLEAN; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Happy Path 1'; + wt_assert.g_testcase_name := 'EQQUERYVALUE VARCHAR2 Happy Path 1'; eqqueryvalue ( msg_in => 'Run Test', check_query_in => 'select dummy from DUAL', @@ -2755,14 +2755,14 @@ $THEN check_this_in => temp_rec.last_details, against_this_in => 'Expected "X" and got "X" for Query: select dummy from DUAL'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Happy Path 2'; + wt_assert.g_testcase_name := 'EQQUERYVALUE VARCHAR2 Happy Path 2'; eqqueryvalue ( msg_in => 'Run Test', check_query_in => 'select max(dummy) from DUAL where 0 = 1', against_value_in => '', null_ok_in => true); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Sad Path 1'; + wt_assert.g_testcase_name := 'EQQUERYVALUE VARCHAR2 Sad Path 1'; wtplsql_skip_save := TRUE; eqqueryvalue ( msg_in => 'Not Used', @@ -2775,7 +2775,7 @@ $THEN check_this_in => temp_rec.last_pass, against_this_in => FALSE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Sad Path 2'; + wt_assert.g_testcase_name := 'EQQUERYVALUE VARCHAR2 Sad Path 2'; wtplsql_skip_save := TRUE; begin eqqueryvalue ( @@ -2799,7 +2799,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Sad Path 3'; + wt_assert.g_testcase_name := 'EQQUERYVALUE VARCHAR2 Sad Path 3'; wtplsql_skip_save := TRUE; eqqueryvalue ( msg_in => 'Not Used', @@ -2821,7 +2821,7 @@ $THEN 'Exception raised for Query: Garbage query that won''t work' || CHR(10) || 'ORA-00900: invalid SQL statement%'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Happy Path 1'; + wt_assert.g_testcase_name := 'EQQUERYVALUE XMLTYPE Happy Path 1'; eqqueryvalue ( msg_in => 'Run Test', check_query_in => 'select temp_xml from wt_self_test where id = 1', @@ -2849,7 +2849,7 @@ $THEN check_this_in => (temp_rec.last_details like 'Expected "%')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Sad Path 1'; + wt_assert.g_testcase_name := 'EQQUERYVALUE XMLTYPE Sad Path 1'; wtplsql_skip_save := TRUE; eqqueryvalue ( msg_in => 'Not Used', @@ -2871,7 +2871,7 @@ $THEN 'Expected "' || '2" and got "%')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Sad Path 2'; + wt_assert.g_testcase_name := 'EQQUERYVALUE XMLTYPE Sad Path 2'; wtplsql_skip_save := TRUE; begin eqqueryvalue ( @@ -2895,7 +2895,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Sad Path 3'; + wt_assert.g_testcase_name := 'EQQUERYVALUE XMLTYPE Sad Path 3'; wtplsql_skip_save := TRUE; eqqueryvalue ( msg_in => 'Not Used', @@ -2917,7 +2917,7 @@ $THEN 'Exception raised for Query: Garbage query that won''t work' || CHR(10) || 'ORA-00900: invalid SQL statement%'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQQUERYVALUE CLOB Happy Path 1'; + wt_assert.g_testcase_name := 'EQQUERYVALUE CLOB Happy Path 1'; eqqueryvalue ( msg_in => 'Run Test', check_query_in => 'select temp_clob from wt_self_test where id = 1', @@ -2946,7 +2946,7 @@ $THEN check_this_in => (temp_rec.last_details like 'Expected "%')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQQUERYVALUE CLOB Happy Path 2'; + wt_assert.g_testcase_name := 'EQQUERYVALUE CLOB Happy Path 2'; eqqueryvalue ( msg_in => 'Run Test', check_query_in => 'select temp_clob from wt_self_test where 0 = 1', @@ -2954,7 +2954,7 @@ $THEN null_ok_in => true); temp_rec := g_rec; -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQQUERYVALUE CLOB Sad Path 1'; + wt_assert.g_testcase_name := 'EQQUERYVALUE CLOB Sad Path 1'; wtplsql_skip_save := TRUE; eqqueryvalue ( msg_in => 'Not Used', @@ -2976,7 +2976,7 @@ $THEN 'Expected "This is another clob." and got "' || '%')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQQUERYVALUE CLOB Sad Path 2'; + wt_assert.g_testcase_name := 'EQQUERYVALUE CLOB Sad Path 2'; wtplsql_skip_save := TRUE; begin eqqueryvalue ( @@ -3000,7 +3000,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQQUERYVALUE CLOB Sad Path 3'; + wt_assert.g_testcase_name := 'EQQUERYVALUE CLOB Sad Path 3'; wtplsql_skip_save := TRUE; eqqueryvalue ( msg_in => 'Not Used', @@ -3022,7 +3022,7 @@ $THEN 'Exception raised for Query: Garbage query that won''t work' || CHR(10) || 'ORA-00900: invalid SQL statement%'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQQUERYVALUE BLOB Happy Path 1'; + wt_assert.g_testcase_name := 'EQQUERYVALUE BLOB Happy Path 1'; eqqueryvalue ( msg_in => 'Run Test', check_query_in => 'select temp_blob from wt_self_test where id = 1', @@ -3049,14 +3049,14 @@ $THEN against_this_in => 'DBMS_LOB.COMPARE between BLOB and Query:' || ' select temp_blob from wt_self_test where id = 1, compare_results: 0'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQQUERYVALUE BLOB Happy Path 2'; + wt_assert.g_testcase_name := 'EQQUERYVALUE BLOB Happy Path 2'; eqqueryvalue ( msg_in => 'Run Test', check_query_in => 'select temp_blob from wt_self_test where 0 = 1', against_value_in => cast (null as BLOB), null_ok_in => true); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQQUERYVALUE BLOB Sad Path 1'; + wt_assert.g_testcase_name := 'EQQUERYVALUE BLOB Sad Path 1'; wtplsql_skip_save := TRUE; eqqueryvalue ( msg_in => 'Not Used', @@ -3075,7 +3075,7 @@ $THEN against_this_in => 'DBMS_LOB.COMPARE between BLOB and Query: ' || 'select temp_blob from wt_self_test where id = 1, compare_results: -1'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQQUERYVALUE BLOB Sad Path 2'; + wt_assert.g_testcase_name := 'EQQUERYVALUE BLOB Sad Path 2'; wtplsql_skip_save := TRUE; begin eqqueryvalue ( @@ -3099,7 +3099,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQQUERYVALUE BLOB Sad Path 3'; + wt_assert.g_testcase_name := 'EQQUERYVALUE BLOB Sad Path 3'; wtplsql_skip_save := TRUE; eqqueryvalue ( msg_in => 'Not Used', @@ -3146,7 +3146,7 @@ $THEN l_found_exception BOOLEAN; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQQUERY Tests Happy Path 1'; + wt_assert.g_testcase_name := 'EQQUERY Tests Happy Path 1'; wt_assert.eqquery ( msg_in => 'Run Test', check_query_in => 'select * from USER_TABLES', @@ -3174,7 +3174,7 @@ $THEN check_this_in => (temp_rec.last_details like 'Comparison Query: %')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQQUERY Tests Sad Path 1'; + wt_assert.g_testcase_name := 'EQQUERY Tests Sad Path 1'; wtplsql_skip_save := TRUE; eqquery ( msg_in => 'Not Used', @@ -3195,7 +3195,7 @@ $THEN check_this_in => (temp_rec.last_details like 'Comparison Query: %')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQQUERY Tests Sad Path 2'; + wt_assert.g_testcase_name := 'EQQUERY Tests Sad Path 2'; wtplsql_skip_save := TRUE; begin eqquery ( @@ -3219,7 +3219,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQQUERY Tests Sad Path 3'; + wt_assert.g_testcase_name := 'EQQUERY Tests Sad Path 3'; wtplsql_skip_save := TRUE; eqquery ( msg_in => 'Not Used', @@ -3277,7 +3277,7 @@ $THEN l_found_exception BOOLEAN; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQTABLE Tests Happy Path 1'; + wt_assert.g_testcase_name := 'EQTABLE Tests Happy Path 1'; wt_assert.eqtable ( msg_in => 'Run Test', check_this_in => 'USER_TABLES', @@ -3307,7 +3307,7 @@ $THEN check_this_in => (temp_rec.last_details like 'Comparison Query: %')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQTABLE Tests Happy Path 2'; + wt_assert.g_testcase_name := 'EQTABLE Tests Happy Path 2'; eqtable ( msg_in => 'Run Test', check_this_in => 'ALL_TABLES', @@ -3315,7 +3315,7 @@ $THEN check_where_in => 'owner = ''' || USER || '''', against_where_in => 'owner = ''' || USER || ''''); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQTABLE Sad Path 1'; + wt_assert.g_testcase_name := 'EQTABLE Sad Path 1'; wtplsql_skip_save := TRUE; eqtable ( msg_in => 'Not Used', @@ -3338,7 +3338,7 @@ $THEN check_this_in => (temp_rec.last_details like 'Comparison Query: %')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQTABLE Sad Path 2'; + wt_assert.g_testcase_name := 'EQTABLE Sad Path 2'; wtplsql_skip_save := TRUE; begin eqtable ( @@ -3364,7 +3364,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQTABLE Sad Path 3'; + wt_assert.g_testcase_name := 'EQTABLE Sad Path 3'; wtplsql_skip_save := TRUE; eqtable ( msg_in => 'Not Used', @@ -3455,7 +3455,7 @@ $THEN l_found_exception BOOLEAN; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQTABCOUNT Tests Happy Path 1'; + wt_assert.g_testcase_name := 'EQTABCOUNT Tests Happy Path 1'; eqtabcount ( msg_in => 'Run Test', check_this_in => 'ALL_TABLES', @@ -3486,7 +3486,7 @@ $THEN 'Expected % rows from "ALL_TABLES"' || ' and got % rows from "ALL_TABLES"')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQTABCOUNT Tests Happy Path 2'; + wt_assert.g_testcase_name := 'EQTABCOUNT Tests Happy Path 2'; eqtabcount ( msg_in => 'Run Test', check_this_in => 'ALL_TABLES', @@ -3494,7 +3494,7 @@ $THEN check_where_in => 'owner = ''' || USER || '''', against_where_in => ''); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQTABCOUNT Sad Path 1'; + wt_assert.g_testcase_name := 'EQTABCOUNT Sad Path 1'; wtplsql_skip_save := TRUE; eqtabcount ( msg_in => 'Not Used', @@ -3518,7 +3518,7 @@ $THEN 'Expected % rows from "ALL_TABLES" and ' || 'got % rows from "ALL_TABLES"')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQTABCOUNT Sad Path 2'; + wt_assert.g_testcase_name := 'EQTABCOUNT Sad Path 2'; wtplsql_skip_save := TRUE; begin eqtabcount ( @@ -3544,7 +3544,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQTABCOUNT Sad Path 3'; + wt_assert.g_testcase_name := 'EQTABCOUNT Sad Path 3'; wtplsql_skip_save := TRUE; eqtabcount ( msg_in => 'Not Used', @@ -3565,7 +3565,7 @@ $THEN check_this_in => (temp_rec.last_details like 'Expected % rows from "USER_TAB_COLUMNS" and got % rows from "USER_TABLES"')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'EQTABCOUNT Sad Path 4'; + wt_assert.g_testcase_name := 'EQTABCOUNT Sad Path 4'; wtplsql_skip_save := TRUE; eqtabcount ( msg_in => 'Not Used', @@ -3646,7 +3646,7 @@ $THEN l_found_exception BOOLEAN; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'OBJEXISTS Happy Path 1'; + wt_assert.g_testcase_name := 'OBJEXISTS Happy Path 1'; objexists ( msg_in => 'Run Test', obj_owner_in => 'SYS', @@ -3671,24 +3671,24 @@ $THEN check_this_in => temp_rec.last_details, against_this_in => 'Number of objects found for "SYS.DUAL" is 1'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'OBJEXISTS Happy Path 2'; + wt_assert.g_testcase_name := 'OBJEXISTS Happy Path 2'; objexists ( msg_in => 'Run Test', obj_owner_in => 'SYS', obj_name_in => 'DUAL', obj_type_in => 'TABLE'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'OBJEXISTS Happy Path 3'; + wt_assert.g_testcase_name := 'OBJEXISTS Happy Path 3'; objexists ( msg_in => 'Run Test', check_this_in => 'SYS.DUAL'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'OBJEXISTS Happy Path 4'; + wt_assert.g_testcase_name := 'OBJEXISTS Happy Path 4'; objexists ( msg_in => 'Run Test', check_this_in => 'DUAL'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'OBJEXISTS Sad Path 1'; + wt_assert.g_testcase_name := 'OBJEXISTS Sad Path 1'; wtplsql_skip_save := TRUE; objexists ( msg_in => 'Not Used', @@ -3706,7 +3706,7 @@ $THEN check_this_in => temp_rec.last_details, against_this_in => 'Number of objects found for "JOE SMITH.BOGUS" is 0'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'OBJEXISTS Sad Path 2'; + wt_assert.g_testcase_name := 'OBJEXISTS Sad Path 2'; wtplsql_skip_save := TRUE; begin objexists ( @@ -3785,7 +3785,7 @@ $THEN l_found_exception BOOLEAN; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'OBJNOTEXISTS Happy Path 1'; + wt_assert.g_testcase_name := 'OBJNOTEXISTS Happy Path 1'; objnotexists ( msg_in => 'Run Test', obj_owner_in => 'BOGUS', @@ -3810,19 +3810,19 @@ $THEN check_this_in => temp_rec.last_details, against_this_in => 'Number of objects found for "BOGUS.THING123" is 0'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'OBJNOTEXISTS Happy Path 2'; + wt_assert.g_testcase_name := 'OBJNOTEXISTS Happy Path 2'; objnotexists ( msg_in => 'Run Test', obj_owner_in => 'BOGUS', obj_name_in => 'THING123', obj_type_in => 'PACKAGE'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'OBJNOTEXISTS Happy Path 3'; + wt_assert.g_testcase_name := 'OBJNOTEXISTS Happy Path 3'; objnotexists ( msg_in => 'Run Test', check_this_in => 'BOGUS.THING123'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'OBJNOTEXISTS Sad Path 1'; + wt_assert.g_testcase_name := 'OBJNOTEXISTS Sad Path 1'; wtplsql_skip_save := TRUE; objnotexists ( msg_in => 'Not Used', @@ -3840,7 +3840,7 @@ $THEN check_this_in => temp_rec.last_details, against_this_in => 'Number of objects found for "SYS.DUAL" is 1'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'OBJNOTEXISTS Sad Path 2'; + wt_assert.g_testcase_name := 'OBJNOTEXISTS Sad Path 2'; wtplsql_skip_save := TRUE; begin objnotexists ( diff --git a/src/core/wt_assert.pks b/src/core/wt_assert.pks index b263b37..d66dd87 100644 --- a/src/core/wt_assert.pks +++ b/src/core/wt_assert.pks @@ -12,7 +12,7 @@ is -- Testcase name for a series of assertions. -- Modify as required - g_testcase wt_results_vw.testcase%TYPE; + g_testcase_name wt_testcases.name%TYPE; function last_pass return boolean; diff --git a/src/core/wt_result.pkb b/src/core/wt_result.pkb index 6ede2af..5e6d86a 100644 --- a/src/core/wt_result.pkb +++ b/src/core/wt_result.pkb @@ -1,18 +1,33 @@ create or replace package body wt_result as - TYPE results_nt_type is table of wt_results%ROWTYPE; + TYPE results_nt_type is table of wt_results_vw%ROWTYPE; g_results_nt results_nt_type; - g_results_rec wt_results%ROWTYPE; - - $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ - g_skip_add BOOLEAN := FALSE; - $END ----------------%WTPLSQL_end_ignore_lines%---------------- + g_results_rec wt_results_vw%ROWTYPE; ---------------------- -- Private Procedures ---------------------- +------------------------------------------------------------ +procedure adhoc_report + (in_assertion in varchar2 + ,in_status in varchar2 + ,in_details in varchar2 + ,in_testcase_name in varchar2 + ,in_message in varchar2) +is + procedure p (in_text in varchar2) is begin + dbms_output.put_line(in_text); + end p; +begin + p(' Test Case: ' || in_testcase_name); + p(' Message: ' || in_message); + p(' Status: ' || in_status); + p(' Assertion: ' || in_assertion); + p(' Details: ' || in_details); +end adhoc_report; + --------------------- -- Public Procedures @@ -22,7 +37,7 @@ as procedure initialize (in_test_run_id in wt_test_runs.id%TYPE) is - l_results_recNULL wt_results%ROWTYPE; + l_results_recNULL wt_results_vw%ROWTYPE; begin if in_test_run_id is NULL then @@ -33,18 +48,15 @@ begin g_results_rec.result_seq := 0; g_results_rec.executed_dtm := systimestamp; g_results_nt := results_nt_type(null); -$IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ - g_skip_add := FALSE; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- end initialize; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN procedure t_initialize is - l_results_recNULL wt_results%ROWTYPE; - l_results_recSAVE wt_results%ROWTYPE; - l_results_recTEST wt_results%ROWTYPE; + l_results_recNULL wt_results_vw%ROWTYPE; + l_results_recSAVE wt_results_vw%ROWTYPE; + l_results_recTEST wt_results_vw%ROWTYPE; l_results_ntSAVE results_nt_type; l_results_ntTEST results_nt_type; begin @@ -58,7 +70,7 @@ $THEN l_results_ntTEST := g_results_nt; g_results_nt := l_results_ntSAVE; -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Initialize Happy Path'; + wt_assert.g_testcase_name := 'Initialize Happy Path'; wt_assert.eq ( msg_in => 'l_results_recTEST.test_run_id', check_this_in => l_results_recTEST.test_run_id, @@ -87,8 +99,8 @@ $THEN check_this_in => l_results_recTEST.details); -------------------------------------- WTPLSQL Testing -- wt_assert.isnull ( - msg_in => 'l_results_recTEST.testcase', - check_this_in => l_results_recTEST.testcase); + msg_in => 'l_results_recTEST.testcase_id', + check_this_in => l_results_recTEST.testcase_id); wt_assert.isnull ( msg_in => 'l_results_recTEST.message', check_this_in => l_results_recTEST.message); @@ -113,18 +125,26 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- -- it must be able to run multiple times without causing damage. procedure finalize is - l_results_recNULL wt_results%ROWTYPE; + l_results_rec wt_results%ROWTYPE; begin if g_results_rec.test_run_id IS NULL then return; end if; -- There is always an extra NULL element in the g_results_nt array. - forall i in 1 .. g_results_nt.COUNT - 1 - insert into wt_results values g_results_nt(i); - g_results_nt := results_nt_type(null); - g_results_rec := l_results_recNULL; - g_results_nt := results_nt_type(null); + for i in 1 .. g_results_nt.COUNT - 1 + loop + l_results_rec.TEST_RUN_ID := g_results_nt(i).TEST_RUN_ID; + l_results_rec.RESULT_SEQ := g_results_nt(i).RESULT_SEQ; + l_results_rec.TESTCASE_ID := g_results_nt(i).TESTCASE_ID; + l_results_rec.EXECUTED_DTM := g_results_nt(i).EXECUTED_DTM; + l_results_rec.INTERVAL_MSECS := g_results_nt(i).INTERVAL_MSECS; + l_results_rec.ASSERTION := g_results_nt(i).ASSERTION; + l_results_rec.STATUS := g_results_nt(i).STATUS; + l_results_rec.MESSAGE := g_results_nt(i).MESSAGE; + l_results_rec.DETAILS := g_results_nt(i).DETAILS; + insert into wt_results values l_results_rec; + end loop; end finalize; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ @@ -135,15 +155,15 @@ $THEN type num_recs_aa_type is table of number index by varchar2(50); num_recs_aa num_recs_aa_type; l_test_runs_rec wt_test_runs%ROWTYPE; - l_results_recNULL wt_results%ROWTYPE; - l_results_recSAVE wt_results%ROWTYPE; - l_results_recTEST wt_results%ROWTYPE; + l_results_recNULL wt_results_vw%ROWTYPE; + l_results_recSAVE wt_results_vw%ROWTYPE; + l_results_recTEST wt_results_vw%ROWTYPE; l_results_ntSAVE results_nt_type; l_results_ntTEST results_nt_type; l_num_recs number; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := ' '; + wt_assert.g_testcase_name := ' '; l_results_ntSAVE := g_results_nt; -- Capture Original Values l_results_recSAVE := g_results_rec; -- Capture Original Values -------------------------------------- WTPLSQL Testing -- @@ -179,8 +199,8 @@ $THEN -- Can't Test in this block because g_results_rec has test data l_test_runs_rec.id := -99; l_test_runs_rec.start_dtm := systimestamp; - l_test_runs_rec.runner_name := 'Finalize Test'; - l_test_runs_rec.runner_owner := 'BOGUS'; + --l_test_runs_rec.runner_name := 'Finalize Test'; + --l_test_runs_rec.runner_owner := 'BOGUS'; insert into wt_test_runs values l_test_runs_rec; -------------------------------------- WTPLSQL Testing -- finalize; -- g_results_nt is still loaded with one element @@ -194,7 +214,7 @@ $THEN delete from wt_test_runs where id = -99; commit; -- UNDO all database changes -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Finalize Happy Path'; + wt_assert.g_testcase_name := 'Finalize Happy Path'; -- Restore values so we can test g_results_rec := l_results_recSAVE; g_results_nt := l_results_ntSAVE; @@ -225,22 +245,21 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- ------------------------------------------------------------ procedure save - (in_assertion in wt_results.assertion%TYPE - ,in_status in wt_results.status%TYPE - ,in_details in wt_results.details%TYPE - ,in_testcase in wt_results.testcase%TYPE - ,in_message in wt_results.message%TYPE) + (in_assertion in varchar2 + ,in_status in varchar2 + ,in_details in varchar2 + ,in_testcase_name in varchar2 + ,in_message in varchar2) is l_current_tstamp timestamp; begin if g_results_rec.test_run_id IS NULL then - wt_text_report.ad_hoc_result - (in_assertion - ,in_status - ,in_details - ,in_testcase - ,in_message); + adhoc_report(in_assertion + ,in_status + ,in_details + ,in_testcase_name + ,in_message); return; end if; -- Set the time and interval @@ -253,21 +272,13 @@ begin g_results_rec.assertion := in_assertion; g_results_rec.status := in_status; g_results_rec.details := substr(in_details,1,4000); - g_results_rec.testcase := substr(in_testcase,1,50); + g_results_rec.testcase_name := substr(in_testcase_name,1,128); g_results_rec.message := substr(in_message,1,200); - -- Increment, Extend, and Load + -- Increment, Load, and Extend g_results_rec.result_seq := g_results_rec.result_seq + 1; g_results_nt(g_results_nt.COUNT) := g_results_rec; g_results_nt.extend; -$IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ - if not g_skip_add then -$END - wt_test_run_stat.add_result(g_results_rec); -$IF $$WTPLSQL_SELFTEST $THEN - end if; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- - end save; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ @@ -283,7 +294,7 @@ $THEN l_nt_count number; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Ad Hoc Save Happy Path Setup'; + wt_assert.g_testcase_name := 'Ad Hoc Save Happy Path Setup'; dbms_output.enable; -- Save/Clear the DBMS_OUPTUT Buffer loop @@ -298,17 +309,15 @@ $THEN msg_in => 'l_dbmsout_buff.COUNT - 1', check_this_in => l_dbmsout_buff.COUNT - 1); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Ad Hoc Save Testing Happy Path'; + wt_assert.g_testcase_name := 'Ad Hoc Save Testing Happy Path'; l_test_run_id := g_results_rec.test_run_id; g_results_rec.test_run_id := NULL; - g_skip_add := TRUE; -- Doesn't effect the DBMS_OUTPUT function wt_result.save ( - in_assertion => 'SELFTEST1', - in_status => wt_assert.C_PASS, - in_details => 't_save_testing Details', - in_testcase => wt_assert.g_testcase, - in_message => 't_save_testing Message'); - g_skip_add := FALSE; + in_assertion => 'SELFTEST1', + in_status => wt_assert.C_PASS, + in_details => 't_save_testing Details', + in_testcase_name => wt_assert.g_testcase_name, + in_message => 't_save_testing Message'); g_results_rec.test_run_id := l_test_run_id; -------------------------------------- WTPLSQL Testing -- DBMS_OUTPUT.GET_LINE ( @@ -326,7 +335,7 @@ $THEN check_this_in => l_dbmsout_line); wt_assert.this ( msg_in => 'Save Testing NULL Test DBMS_OUTPUT 3 Message', - check_this_in => (l_dbmsout_line like '%' || wt_assert.g_testcase || + check_this_in => (l_dbmsout_line like '%' || wt_assert.g_testcase_name || '%t_save_testing %')); -------------------------------------- WTPLSQL Testing -- if not wt_assert.last_pass @@ -336,7 +345,7 @@ $THEN end if; end if; -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Ad Hoc Save Happy Path Teardown'; + wt_assert.g_testcase_name := 'Ad Hoc Save Happy Path Teardown'; -- Restore the DBMS_OUPTUT Buffer for i in 1 .. l_dbmsout_buff.COUNT - 1 loop @@ -346,16 +355,14 @@ $THEN msg_in => 'l_dbmsout_buff.COUNT - 1', check_this_in => l_dbmsout_buff.COUNT - 1); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Save Testing Happy Path'; + wt_assert.g_testcase_name := 'Save Testing Happy Path'; l_nt_count := g_results_nt.COUNT; - g_skip_add := TRUE; wt_result.save ( - in_assertion => 'SELFTEST2', - in_status => wt_assert.C_PASS, - in_details => 't_save_testing Testing Details', - in_testcase => wt_assert.g_testcase, - in_message => 't_save_testing Testing Message'); - g_skip_add := FALSE; + in_assertion => 'SELFTEST2', + in_status => wt_assert.C_PASS, + in_details => 't_save_testing Testing Details', + in_testcase_name => wt_assert.g_testcase_name, + in_message => 't_save_testing Testing Message'); -------------------------------------- WTPLSQL Testing -- wt_assert.eq ( msg_in => 'g_results_nt.COUNT', @@ -380,9 +387,9 @@ $THEN check_this_in => g_results_nt(l_nt_count).details, against_this_in => 't_save_testing Testing Details'); wt_assert.eq ( - msg_in => 'g_results_nt(' || l_nt_count || ').testcase', - check_this_in => g_results_nt(l_nt_count).testcase, - against_this_in => wt_assert.g_testcase); + msg_in => 'g_results_nt(' || l_nt_count || ').testcase_name', + check_this_in => g_results_nt(l_nt_count).testcase_name, + against_this_in => wt_assert.g_testcase_name); -------------------------------------- WTPLSQL Testing -- wt_assert.eq ( msg_in => 'g_results_nt(' || l_nt_count || ').message', @@ -424,7 +431,7 @@ $THEN l_num_recs number; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Delete Records Happy Path'; + wt_assert.g_testcase_name := 'Delete Records Happy Path'; select count(*) into l_num_recs from wt_results where test_run_id = -99; diff --git a/src/core/wt_result.pks b/src/core/wt_result.pks index 68c54d9..61c5936 100644 --- a/src/core/wt_result.pks +++ b/src/core/wt_result.pks @@ -7,11 +7,11 @@ as procedure finalize; procedure save - (in_assertion in wt_results.assertion%TYPE - ,in_status in wt_results.status%TYPE - ,in_details in wt_results.details%TYPE - ,in_testcase in wt_results.testcase%TYPE - ,in_message in wt_results.message%TYPE); + (in_assertion in varchar2 + ,in_status in varchar2 + ,in_details in varchar2 + ,in_testcase_name in varchar2 + ,in_message in varchar2); procedure delete_records (in_test_run_id in number); diff --git a/src/core/wt_test_runner.pkb b/src/core/wt_test_runner.pkb index ee6ea5c..7b26718 100644 --- a/src/core/wt_test_runner.pkb +++ b/src/core/wt_test_runner.pkb @@ -2,24 +2,41 @@ create or replace package body wt_test_runner as + +--------------------- +-- Public Procedures +--------------------- + + ------------------------------------------------------------ -function insert_test_runner +function get_id (in_owner in varchar2 ,in_name in varchar2) return number is - PRAGMA AUTONOMOUS_TRANSACTION; l_id number; begin + select id into l_id + from wt_test_runners + where owner = in_owner + and name = in_name; + return l_id; +exception when NO_DATA_FOUND then l_id := wt_test_runners_seq.nextval; insert into wt_test_runners (id, owner, name) values (l_id, in_owner, in_name); commit; return l_id; -end insert_test_runner; +end get_id; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN + procedure t_get_id + is + begin + -------------------------------------- WTPLSQL Testing -- + null; + end t_get_id; procedure t_insert_test_runner is C_OWNER CONSTANT varchar2(50) := 'WT_TEST_RUNNER_OWNER_FOR_TESTING'; @@ -42,39 +59,6 @@ $THEN $END ----------------%WTPLSQL_end_ignore_lines%---------------- ---------------------- --- Public Procedures ---------------------- - - ------------------------------------------------------------- -function get_id - (in_owner in varchar2 - ,in_name in varchar2) - return number -is - l_id number; -begin - select id into l_id - from wt_test_runners - where owner = in_owner - and name = in_name; - return l_id; -exception when NO_DATA_FOUND then - return insert_test_runner(in_owner, in_name); -end get_id; - -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure t_get_id - is - begin - -------------------------------------- WTPLSQL Testing -- - null; - end t_get_id; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- - - ------------------------------------------------------------ procedure delete_id (in_id in number) @@ -102,7 +86,6 @@ $THEN is begin -------------------------------------- WTPLSQL Testing -- - t_insert_test_runner; t_get_id; t_delete_id; end; diff --git a/src/core/wt_text_report.pkb b/src/stats/wt_text_report.pkb similarity index 100% rename from src/core/wt_text_report.pkb rename to src/stats/wt_text_report.pkb diff --git a/src/core/wt_text_report.pks b/src/stats/wt_text_report.pks similarity index 88% rename from src/core/wt_text_report.pks rename to src/stats/wt_text_report.pks index 289240f..15493a9 100644 --- a/src/core/wt_text_report.pks +++ b/src/stats/wt_text_report.pks @@ -17,7 +17,7 @@ as (in_assertion in wt_results.assertion%TYPE ,in_status in wt_results.status%TYPE ,in_details in wt_results.details%TYPE - ,in_testcase in wt_results.testcase%TYPE + ,in_testcase_name in wt_testcases.name%TYPE ,in_message in wt_results.message%TYPE ,in_interval_msecs in wt_results.interval_msecs%TYPE DEFAULT NULL) return varchar2; @@ -26,7 +26,7 @@ as (in_assertion in wt_results.assertion%TYPE ,in_status in wt_results.status%TYPE ,in_details in wt_results.details%TYPE - ,in_testcase in wt_results.testcase%TYPE + ,in_testcase_name in wt_testcases.name%TYPE ,in_message in wt_results.message%TYPE); -- "in_detail_level" settings for DBMS_OUT procedure: @@ -50,8 +50,8 @@ as -- * All profiled source lines. procedure dbms_out - (in_runner_owner in wt_test_runs.runner_owner%TYPE default USER - ,in_runner_name in wt_test_runs.runner_name%TYPE default null + (in_runner_owner in wt_test_runners.owner%TYPE default USER + ,in_runner_name in wt_test_runners.name%TYPE default null ,in_detail_level in number default 0 ,in_summary_last in boolean default FALSE); From cb84eb0db38aac56c859f7d13b53ecaf67ead78b Mon Sep 17 00:00:00 2001 From: DDieterich Date: Wed, 14 Nov 2018 22:31:45 -0600 Subject: [PATCH 032/141] More Updates --- src/core/execute_test_runner.prc | 8 + src/core/wt_assert.pkb | 9 - src/core/wt_assert.pks | 12 +- src/core/wt_profile.pkb | 15 -- src/core/wt_profile.pks | 18 +- src/core/wt_result.pkb | 4 - src/core/wt_result.pks | 7 +- src/core/wt_test_runner.pkb | 1 - src/core/wt_testcase.pkb | 2 + src/core/wt_text_report.pkb | 406 +++++++++++++++++++++++++++++++ src/core/wt_text_report.pks | 44 ++++ src/core/wtplsql.pkb | 5 +- src/core/wtplsql.pks | 4 +- 13 files changed, 499 insertions(+), 36 deletions(-) create mode 100644 src/core/execute_test_runner.prc create mode 100644 src/core/wt_text_report.pkb create mode 100644 src/core/wt_text_report.pks diff --git a/src/core/execute_test_runner.prc b/src/core/execute_test_runner.prc new file mode 100644 index 0000000..68cf262 --- /dev/null +++ b/src/core/execute_test_runner.prc @@ -0,0 +1,8 @@ +create or replace procedure execute_test_runner + (in_str in varchar2) + authid current_user + -- AUTHID CURRENT_USER is required for dynamic PL/SQL execution. +is +begin + execute immediate in_str; +end execute_test_runner; diff --git a/src/core/wt_assert.pkb b/src/core/wt_assert.pkb index 76b3f19..961db08 100644 --- a/src/core/wt_assert.pkb +++ b/src/core/wt_assert.pkb @@ -1,14 +1,5 @@ create or replace package body wt_assert is - -- See RESET_GLOBALS procedure for default global values - TYPE g_rec_type is record - (last_pass boolean - ,raise_exception boolean - ,last_assert wt_results.assertion%TYPE - ,last_msg wt_results.message%TYPE - ,last_details wt_results.details%TYPE); - g_rec g_rec_type; - $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ temp_rowid1 CONSTANT rowid := chartorowid('AAAFd1AAFAAAABSAA/'); temp_rowid2 CONSTANT rowid := chartorowid('AAAFd1AAFAAAABSAB/'); diff --git a/src/core/wt_assert.pks b/src/core/wt_assert.pks index d66dd87..7fdfd8c 100644 --- a/src/core/wt_assert.pks +++ b/src/core/wt_assert.pks @@ -1,4 +1,5 @@ -create or replace package wt_assert authid current_user +create or replace package wt_assert + authid current_user is -- AUTHID CURRENT_USER is required for dynamic PL/SQL execution. @@ -14,6 +15,15 @@ is -- Modify as required g_testcase_name wt_testcases.name%TYPE; + -- See RESET_GLOBALS procedure for default global values + TYPE g_rec_type is record + (last_pass boolean + ,raise_exception boolean + ,last_assert wt_results.assertion%TYPE + ,last_msg wt_results.message%TYPE + ,last_details wt_results.details%TYPE); + g_rec g_rec_type; + function last_pass return boolean; diff --git a/src/core/wt_profile.pkb b/src/core/wt_profile.pkb index 3ce0fd7..a03d038 100644 --- a/src/core/wt_profile.pkb +++ b/src/core/wt_profile.pkb @@ -1,21 +1,6 @@ create or replace package body wt_profile as - TYPE rec_type is record - (test_run_id wt_test_runs.id%TYPE - ,dbout_owner wt_test_runs.dbout_owner%TYPE - ,dbout_name wt_test_runs.dbout_name%TYPE - ,dbout_type wt_test_runs.dbout_type%TYPE - ,prof_runid binary_integer - ,trigger_offset binary_integer - ,error_message varchar2(4000)); - g_rec rec_type; - - TYPE ignr_aa_type is table - of varchar2(1) - index by PLS_INTEGER; - g_ignr_aa ignr_aa_type; - $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ g_current_user varchar2(30); g_skip_insert boolean := FALSE; diff --git a/src/core/wt_profile.pks b/src/core/wt_profile.pks index 2900dac..c2aeb37 100644 --- a/src/core/wt_profile.pks +++ b/src/core/wt_profile.pks @@ -1,6 +1,22 @@ -create or replace package wt_profile authid definer --current_user +create or replace package wt_profile + authid definer as + TYPE rec_type is record + (test_run_id wt_test_runs.id%TYPE + ,dbout_owner wt_test_runs.dbout_owner%TYPE + ,dbout_name wt_test_runs.dbout_name%TYPE + ,dbout_type wt_test_runs.dbout_type%TYPE + ,prof_runid binary_integer + ,trigger_offset binary_integer + ,error_message varchar2(4000)); + g_rec rec_type; + + TYPE ignr_aa_type is table + of varchar2(1) + index by PLS_INTEGER; + g_ignr_aa ignr_aa_type; + procedure initialize (in_test_run_id in number, in_runner_owner in varchar2, diff --git a/src/core/wt_result.pkb b/src/core/wt_result.pkb index 5e6d86a..ab60953 100644 --- a/src/core/wt_result.pkb +++ b/src/core/wt_result.pkb @@ -1,10 +1,6 @@ create or replace package body wt_result as - TYPE results_nt_type is table of wt_results_vw%ROWTYPE; - g_results_nt results_nt_type; - g_results_rec wt_results_vw%ROWTYPE; - ---------------------- -- Private Procedures ---------------------- diff --git a/src/core/wt_result.pks b/src/core/wt_result.pks index 61c5936..81fa566 100644 --- a/src/core/wt_result.pks +++ b/src/core/wt_result.pks @@ -1,6 +1,11 @@ -create or replace package wt_result authid definer +create or replace package wt_result + authid definer as + TYPE results_nt_type is table of wt_results_vw%ROWTYPE; + g_results_nt results_nt_type; + g_results_rec wt_results_vw%ROWTYPE; + procedure initialize (in_test_run_id in wt_test_runs.id%TYPE); diff --git a/src/core/wt_test_runner.pkb b/src/core/wt_test_runner.pkb index 7b26718..bf2cfe4 100644 --- a/src/core/wt_test_runner.pkb +++ b/src/core/wt_test_runner.pkb @@ -2,7 +2,6 @@ create or replace package body wt_test_runner as - --------------------- -- Public Procedures --------------------- diff --git a/src/core/wt_testcase.pkb b/src/core/wt_testcase.pkb index 070c3e6..0ef0817 100644 --- a/src/core/wt_testcase.pkb +++ b/src/core/wt_testcase.pkb @@ -1,10 +1,12 @@ create or replace package body wt_testcase as + --------------------- -- Public Procedures --------------------- + ------------------------------------------------------------ function get_id (in_testcase in varchar2) diff --git a/src/core/wt_text_report.pkb b/src/core/wt_text_report.pkb new file mode 100644 index 0000000..6219ffc --- /dev/null +++ b/src/core/wt_text_report.pkb @@ -0,0 +1,406 @@ +create or replace package body wt_text_report +as + + +---------------------- +-- Private Procedures +---------------------- + + +------------------------------------------------------------ +procedure p + (in_text in varchar2) +is +begin + dbms_output.put_line(in_text); +end p; + +------------------------------------------------------------ +procedure result_summary +is + l_yield_txt varchar2(50); +begin + for buff in ( + select count(*) TOT_CNT + ,sum(decode(status,'FAIL',1,0)) FAIL_CNT + ,sum(decode(status,'ERR',1,0)) ERR_CNT + ,count(distinct testcase) TCASE_CNT + ,min(elapsed_msecs) MIN_MSEC + ,round(avg(elapsed_msecs),3) AVG_MSEC + ,max(elapsed_msecs) MAX_MSEC + from wt_results + where test_run_id = g_test_runs_rec.id ) + loop + if buff.tot_cnt = 0 + then + l_yield_txt := '(Divide by Zero)'; + else + l_yield_txt := to_char(round( ( 1 - (buff.fail_cnt+buff.err_cnt) + / buff.tot_cnt + ) * 100 + ,2) + ,'9990.99') || '%'; + end if; + p(' Total Testcases: ' || to_char(nvl(buff.tcase_cnt,0),'9999999') || + ' Total Assertions: ' || to_char(nvl(buff.tot_cnt ,0),'9999999') ); + p(' Minimum Elapsed msec: ' || to_char(nvl(buff.min_msec ,0),'9999999') || + ' Failed Assertions: ' || to_char(nvl(buff.fail_cnt ,0),'9999999') ); + p(' Average Elapsed msec: ' || to_char(nvl(buff.avg_msec ,0),'9999999') || + ' Error Assertions: ' || to_char(nvl(buff.err_cnt ,0),'9999999') ); + p(' Maximum Elapsed msec: ' || to_char(nvl(buff.max_msec ,0),'9999999') || + ' Test Yield: ' || l_yield_txt ); + end loop; +end result_summary; + +------------------------------------------------------------ +procedure profile_summary +is + l_code_coverage varchar2(100); +begin + for buff in ( + select count(*) TOT_LINES + ,sum(decode(status,'EXEC',1,0)) EXEC_LINES + ,sum(decode(status,'ANNO',1,0)) ANNO_LINES + ,sum(decode(status,'EXCL',1,0)) EXCL_LINES + ,sum(decode(status,'NOTX',1,0)) NOTX_LINES + ,sum(decode(status,'UNKN',1,0)) UNKN_LINES + ,min(min_time)/1000 MIN_USEC + ,sum(total_time)/1000/count(*) AVG_USEC + ,max(max_time)/1000 MAX_USEC + from wt_dbout_profiles + where test_run_id = g_test_runs_rec.id ) + loop + p(' Total Source Lines: ' || to_char(nvl(buff.tot_lines ,0),'9999999') || + ' Missed Lines: ' || to_char(nvl(buff.notx_lines,0),'9999999') ); + p(' Minimum Elapsed usec: ' || to_char(nvl(buff.min_usec ,0),'9999999') || + ' Annotated Lines: ' || to_char(nvl(buff.anno_lines,0),'9999999') ); + p(' Average Elapsed usec: ' || to_char(nvl(buff.avg_usec ,0),'9999999') || + ' Excluded Lines: ' || to_char(nvl(buff.excl_lines,0),'9999999') ); + p(' Maximum Elapsed usec: ' || to_char(nvl(buff.max_usec ,0),'9999999') || + ' Unknown Lines: ' || to_char(nvl(buff.unkn_lines,0),'9999999') ); + if (buff.exec_lines + buff.notx_lines) = 0 + then + l_code_coverage := '(Divide by Zero)'; + else + l_code_coverage := to_char( 100 * buff.exec_lines / + (buff.exec_lines + buff.notx_lines) + ,'9990.99') || '%'; + end if; + p(' Trigger Source Offset: ' || to_char(g_test_runs_rec.trigger_offset,'9999999') || + ' Code Coverage: ' || l_code_coverage); + end loop; +end profile_summary; + +------------------------------------------------------------ +procedure summary_out +is +begin + p(''); +-- p( g_test_runs_rec.runner_owner || +-- '.' || g_test_runs_rec.runner_name || +-- -- ' Test Runner' || +-- ' (Test Run ID ' || g_test_runs_rec.id || +-- ')' ); + p(' wtPLSQL V' || wtplsql.show_version || ' - Start Date/Time: ' || + to_char(g_test_runs_rec.start_dtm, g_date_format) || + CHR(10)); + p('Test Results Run ID: ' || g_test_runs_rec.id || + ', ' || g_test_runs_rec.runner_owner || + '.' || g_test_runs_rec.runner_name ); + p('----------------------------------------'); + result_summary; + p(' Total Run Time (sec): ' || + to_char(extract(day from (g_test_runs_rec.end_dtm - + g_test_runs_rec.start_dtm) * 86400 * 100) / 100 + ,'99990.9') ); + if g_test_runs_rec.error_message is not null + then + p(''); + p(' *** Test Runner Error ***'); + p(g_test_runs_rec.error_message); + end if; + ---------------------------------------- + if g_test_runs_rec.dbout_name is null + then + return; + end if; + p(''); +-- p( g_test_runs_rec.dbout_owner || +-- '.' || g_test_runs_rec.dbout_name || +-- ' ' || g_test_runs_rec.dbout_type || +-- ' Code Coverage' || +-- ' (Test Run ID ' || g_test_runs_rec.id || +-- ')' ); + p('Code Coverage Run ID: ' || g_test_runs_rec.id || + ', ' || g_test_runs_rec.dbout_type || + ' ' || g_test_runs_rec.dbout_owner || + '.' || g_test_runs_rec.dbout_name ); + p('----------------------------------------'); + profile_summary; +end summary_out; + +------------------------------------------------------------ +procedure results_out + (in_show_pass in boolean) +is + l_last_testcase wt_results.testcase%TYPE; + l_show_pass_txt varchar2(1); + header_shown boolean; + procedure l_show_header is begin + p(''); + p( g_test_runs_rec.runner_owner || + '.' || g_test_runs_rec.runner_name || + -- ' Test Runner' || + ' Details (Test Run ID ' || g_test_runs_rec.id || + ')' ); + p('----------------------------------------'); + end l_show_header; +begin + if in_show_pass + then + l_show_pass_txt := 'Y'; + else + l_show_pass_txt := 'N'; + end if; + header_shown := FALSE; + for buff in ( + select status + ,elapsed_msecs + ,testcase + ,assertion + ,details + ,message + from wt_results + where test_run_id = g_test_runs_rec.id + and ( l_show_pass_txt = 'Y' + or status != 'PASS') + order by result_seq ) + loop + if not header_shown + then + l_show_header; + header_shown := TRUE; + end if; + if buff.testcase = l_last_testcase + OR ( buff.testcase is null + AND l_last_testcase is null ) + then + p(format_test_result + (in_assertion => buff.assertion + ,in_status => buff.status + ,in_details => buff.details + ,in_testcase => NULL + ,in_message => buff.message + ,in_elapsed_msecs => buff.elapsed_msecs) ); + else + p(format_test_result + (in_assertion => buff.assertion + ,in_status => buff.status + ,in_details => buff.details + ,in_testcase => buff.testcase + ,in_message => buff.message + ,in_elapsed_msecs => buff.elapsed_msecs) ); + l_last_testcase := buff.testcase; + end if; + end loop; +end results_out; + +------------------------------------------------------------ +procedure profile_out + (in_show_aux in boolean) +is + l_header_txt CONSTANT varchar2(2000) := + 'Source TotTime MinTime MaxTime ' || chr(10) || + ' Line Stat Occurs (usec) (usec) (usec) Text' || chr(10) || + '------ ---- ------ --------- ------- --------- ------------'; + l_show_aux_txt varchar2(1); + header_shown boolean; + procedure l_show_header is begin + p(''); + p( g_test_runs_rec.dbout_owner || + '.' || g_test_runs_rec.dbout_name || + ' ' || g_test_runs_rec.dbout_type || + ' Code Coverage Details' || + ' (Test Run ID ' || g_test_runs_rec.id || + ')' ); + --p('----------------------------------------'); + end l_show_header; +begin + if g_test_runs_rec.dbout_name is null + then + return; + end if; + if in_show_aux + then + l_show_aux_txt := 'Y'; + else + l_show_aux_txt := 'N'; + end if; + header_shown := FALSE; + for buff in ( + select line + ,status + ,total_occur + ,total_time + ,min_time + ,max_time + ,text + ,rownum + from wt_dbout_profiles + where test_run_id = g_test_runs_rec.id + and ( l_show_aux_txt = 'Y' + or status not in ('EXEC','ANNO','UNKN','EXCL')) + order by line ) + loop + if not header_shown + then + l_show_header; + p(l_header_txt); + header_shown := TRUE; + end if; + if mod(buff.rownum,25) = 0 + then + p(l_header_txt); + end if; + p(to_char(buff.line,'99999') || + case buff.status when 'NOTX' then '#NOTX#' + else ' ' || rpad(buff.status,4) || ' ' + end || + to_char(buff.total_occur,'99999') || ' ' || + to_char(buff.total_time/1000,'99999999') || ' ' || + to_char(buff.min_time/1000,'999999') || ' ' || + to_char(buff.max_time/1000,'99999999') || ' ' || + replace(buff.text,CHR(10),'') ); + end loop; +end profile_out; + + +--------------------- +-- Public Procedures +--------------------- + +------------------------------------------------------------ +function format_test_result + (in_assertion in wt_results.assertion%TYPE + ,in_status in wt_results.status%TYPE + ,in_details in wt_results.details%TYPE + ,in_testcase in wt_results.testcase%TYPE + ,in_message in wt_results.message%TYPE + ,in_elapsed_msecs in wt_results.elapsed_msecs%TYPE DEFAULT NULL) + return varchar2 +is + l_out_str varchar2(32000) := ''; +begin + if in_testcase is not null + then + l_out_str := rpad('---*** ' || in_testcase || ' ***---' + ,80,'-') || CHR(10); + end if; + if in_status = wt_assert.C_PASS + then + l_out_str := l_out_str || ' ' || rpad(in_status,4) || ' '; + else + l_out_str := l_out_str || '#' || rpad(in_status,4) || '#'; + end if; + if in_elapsed_msecs is not null + then + l_out_str := l_out_str || lpad(in_elapsed_msecs,4) || 'ms '; + end if; + if in_message is not null + then + l_out_str := l_out_str || in_message || '. '; + end if; + l_out_str := l_out_str || in_assertion || ' - '; + if g_single_line_output + then + l_out_str := l_out_str || replace(replace(in_details,CHR(13),'\r'),CHR(10),'\n'); + else + l_out_str := l_out_str || in_details; + end if; + return l_out_str; +end format_test_result; + +------------------------------------------------------------ +procedure ad_hoc_result + (in_assertion in wt_results.assertion%TYPE + ,in_status in wt_results.status%TYPE + ,in_details in wt_results.details%TYPE + ,in_testcase in wt_results.testcase%TYPE + ,in_message in wt_results.message%TYPE) +is +begin + p(format_test_result + (in_assertion => in_assertion + ,in_status => in_status + ,in_details => in_details + ,in_testcase => in_testcase + ,in_message => in_message)); +end ad_hoc_result; + +------------------------------------------------------------ +procedure dbms_out + (in_runner_name in wt_test_runs.runner_name%TYPE + ,in_hide_details in boolean default FALSE + ,in_summary_last in boolean default FALSE + ,in_show_pass in boolean default FALSE + ,in_show_aux in boolean default FALSE) +is +begin + + for buff in ( + select * from wt_test_runs + where (runner_name, start_dtm) in ( + select runner_name + ,max(start_dtm) MAX_START_DTM + from wt_test_runs + where ( ( in_runner_name is not null + and in_runner_name = runner_name) + OR in_runner_name is null ) + and runner_owner = USER + group by runner_name ) ) + loop + + -- Load Test Run Record + g_test_runs_rec := buff; + + -- Setup Display Order + if in_summary_last + then + if NOT in_hide_details + then + profile_out(in_show_aux); + results_out(in_show_pass); + end if; + summary_out; + else + summary_out; + if NOT in_hide_details + then + results_out(in_show_pass); + profile_out(in_show_aux); + end if; + end if; + + p(''); + + end loop; + +end dbms_out; + +------------------------------------------------------------ +procedure dbms_out_all +is +begin + for buff in (select runner_name + from wt_test_runs + where runner_owner = USER + group by runner_name + order by max(start_dtm) + ,runner_name) + loop + dbms_out(in_runner_name => buff.runner_name + ,in_hide_details => TRUE); + end loop; +end dbms_out_all; + +end wt_text_report; \ No newline at end of file diff --git a/src/core/wt_text_report.pks b/src/core/wt_text_report.pks new file mode 100644 index 0000000..be1f754 --- /dev/null +++ b/src/core/wt_text_report.pks @@ -0,0 +1,44 @@ +create or replace package wt_text_report + authid definer +as + + g_test_runs_rec wt_test_runs%ROWTYPE; + + -- To report the latest result details for test runner: + -- begin + -- wt_text_report.dbms_out('TEST_RUNNER', FALSE, FALSE, TRUE, TRUE); + -- end; + -- / + + -- Turn this off to allow output across multiple lines of text + g_single_line_output boolean := TRUE; + + -- DATE data type format for Report Header + g_date_format varchar2(100) := 'DD-Mon-YYYY HH:MI:SS PM'; + + function format_test_result + (in_assertion in wt_results.assertion%TYPE + ,in_status in wt_results.status%TYPE + ,in_details in wt_results.details%TYPE + ,in_testcase in wt_results.testcase%TYPE + ,in_message in wt_results.message%TYPE + ,in_elapsed_msecs in wt_results.elapsed_msecs%TYPE DEFAULT NULL) + return varchar2; + + procedure ad_hoc_result + (in_assertion in wt_results.assertion%TYPE + ,in_status in wt_results.status%TYPE + ,in_details in wt_results.details%TYPE + ,in_testcase in wt_results.testcase%TYPE + ,in_message in wt_results.message%TYPE); + + procedure dbms_out + (in_runner_name in wt_test_runs.runner_name%TYPE + ,in_hide_details in boolean default FALSE + ,in_summary_last in boolean default FALSE + ,in_show_pass in boolean default FALSE + ,in_show_aux in boolean default FALSE); + + procedure dbms_out_all; + +end wt_text_report; \ No newline at end of file diff --git a/src/core/wtplsql.pkb b/src/core/wtplsql.pkb index 5d39ce2..ba53f1f 100644 --- a/src/core/wtplsql.pkb +++ b/src/core/wtplsql.pkb @@ -216,8 +216,9 @@ begin wt_hook.after_run_init -- Call the Test Runner begin - execute immediate 'BEGIN ' || in_package_name || '.' || - C_RUNNER_ENTRY_POINT || '; END;'; + -- AUTHID CURRENT_USER is required for dynamic PL/SQL execution. + execute_test_runner ('BEGIN ' || in_package_name || '.' || + C_RUNNER_ENTRY_POINT || '; END;'); exception when OTHERS then diff --git a/src/core/wtplsql.pks b/src/core/wtplsql.pks index d8f4531..4978510 100644 --- a/src/core/wtplsql.pks +++ b/src/core/wtplsql.pks @@ -1,6 +1,6 @@ -create or replace package wtplsql authid current_user +create or replace package wtplsql + authid definer as - -- AUTHID CURRENT_USER is required for dynamic PL/SQL execution. IS_LAST_RUN_FLAG constant varchar2(1) := 'Y'; From d96f319283a74a3f4643bc73a23ff67e7f8ce752 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Fri, 16 Nov 2018 13:21:57 -0600 Subject: [PATCH 033/141] Removed harmful and false statement. --- docs/About-wtPLSQL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/About-wtPLSQL.md b/docs/About-wtPLSQL.md index cdc753b..653739d 100644 --- a/docs/About-wtPLSQL.md +++ b/docs/About-wtPLSQL.md @@ -109,7 +109,7 @@ Test fixtures and test suites are a part of the xUnit testing framework. At the ## Test Driven Development With **TDD** (Test Driven Development), [you write a test before you write just enough production code to fulfill that test](http://agiledata.org/essays/tdd.html) -The wtPLSQL framework is not intended for Test Driven Development. 100% code coverage is not desirable under the **TDD** approach. Test isolation and test transience are welcomed mechanisms to assist in getting tests to pass quickly in **TDD**. The wtPLSQL framework embraces 100% code coverage and does not require test isolation or test transience. +The wtPLSQL framework is not intended for Test Driven Development. Test isolation and test transience are welcomed mechanisms to assist in getting tests to pass quickly in **TDD**. The wtPLSQL framework embraces 100% code coverage and does not require test isolation or test transience. --- [Website Home Page](README.md) From 998c26a2bd7a2e83087056d73b59b3816723d365 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Sun, 18 Nov 2018 13:18:01 -0600 Subject: [PATCH 034/141] Remove all TDD References --- docs/About-wtPLSQL.htm | 3 --- docs/About-wtPLSQL.md | 5 ----- docs/utPLSQL-V3-Comparison.htm | 5 ----- docs/utPLSQL-V3-Comparison.md | 9 --------- 4 files changed, 22 deletions(-) diff --git a/docs/About-wtPLSQL.htm b/docs/About-wtPLSQL.htm index 072bffa..95f98f0 100644 --- a/docs/About-wtPLSQL.htm +++ b/docs/About-wtPLSQL.htm @@ -74,8 +74,5 @@

      Test Fixtures and Test Suites

      A test fixture ... is the set of preconditions or state needed to run a test

      A test suite is a set of tests that all share the same fixture.

      Test fixtures and test suites are a part of the xUnit testing framework. At the core, wtPLSQL does not include test fixtures or test suites. If needed, these can be easily defined and implemented in a test runner package.

      -

      Test Driven Development

      -

      With TDD (Test Driven Development), you write a test before you write just enough production code to fulfill that test

      -

      The wtPLSQL framework is not intended for Test Driven Development. 100% code coverage is not desirable under the TDD approach. Test isolation and test transience are welcomed mechanisms to assist in getting tests to pass quickly in TDD. The wtPLSQL framework embraces 100% code coverage and does not require test isolation or test transience.


      Website Home Page

      diff --git a/docs/About-wtPLSQL.md b/docs/About-wtPLSQL.md index 653739d..bcd9974 100644 --- a/docs/About-wtPLSQL.md +++ b/docs/About-wtPLSQL.md @@ -106,10 +106,5 @@ In the wtPLSQL framework, integration testing of multiple database objects (no m Test fixtures and test suites are a part of the xUnit testing framework. At the core, wtPLSQL does not include test fixtures or test suites. If needed, these can be easily defined and implemented in a test runner package. -## Test Driven Development -With **TDD** (Test Driven Development), [you write a test before you write just enough production code to fulfill that test](http://agiledata.org/essays/tdd.html) - -The wtPLSQL framework is not intended for Test Driven Development. Test isolation and test transience are welcomed mechanisms to assist in getting tests to pass quickly in **TDD**. The wtPLSQL framework embraces 100% code coverage and does not require test isolation or test transience. - --- [Website Home Page](README.md) diff --git a/docs/utPLSQL-V3-Comparison.htm b/docs/utPLSQL-V3-Comparison.htm index 5380208..f2a1d1f 100644 --- a/docs/utPLSQL-V3-Comparison.htm +++ b/docs/utPLSQL-V3-Comparison.htm @@ -42,11 +42,6 @@

      Non-Sequenced Testing

    • Object Oriented - All unit tests should be able to run in any order.
    • Relational Database - Testing with integrity constraints on complex persisted data and/or complex data operations can be simpler with test sequencing.
    • -

      Test Driven Development (TDD/RSpec)

      -

      In the fast-paced development cycle, defining how the software accomplishes the needs of the business is the typical focus. This is also called "happy path" functionality. Conversely, error handling and error recovery (sad path) requirements typically don't accomplish business needs. That is to say, sad path testing focuses on things going badly, not on things going well. Unfortunately, efforts to develop and define sad path requirements are typically avoided.

      -

      TDD places no value on 100% code coverage. TDD typically avoids testing sad path testing during development.

      -

      White box testing is centered on 100% code coverage. "Happy path" and "sad path" testing are typically required to achieve 100% code coverage.

      -

      Here is more discussion on Test Driven Development

      • utPLSQL V3 Website
      • diff --git a/docs/utPLSQL-V3-Comparison.md b/docs/utPLSQL-V3-Comparison.md index 0ab6014..f121c6a 100644 --- a/docs/utPLSQL-V3-Comparison.md +++ b/docs/utPLSQL-V3-Comparison.md @@ -51,15 +51,6 @@ Here are several differences in testing methodologies between relational databas * Object Oriented - All unit tests should be able to run in any order. * Relational Database - Testing with integrity constraints on complex persisted data and/or complex data operations can be simpler with test sequencing. -### Test Driven Development (TDD/RSpec) -In the fast-paced development cycle, defining how the software accomplishes the needs of the business is the typical focus. This is also called "happy path" functionality. Conversely, error handling and error recovery (sad path) requirements typically don't accomplish business needs. That is to say, sad path testing focuses on things going badly, not on things going well. Unfortunately, efforts to develop and define sad path requirements are typically avoided. - -TDD places no value on 100% code coverage. TDD typically avoids testing sad path testing during development. - -White box testing is centered on 100% code coverage. "Happy path" and "sad path" testing are typically required to achieve 100% code coverage. - -Here is more discussion on [Test Driven Development](About-wtPLSQL.md#test-driven-development) - ### Links * [utPLSQL V3 Website](https://utplsql.org) * [utPLSQL V3 Documentation](http://utplsql.org/documentation/) From c7f88d82a2e8c04a9ac99f7ae9c5594b3be084b8 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Sun, 18 Nov 2018 15:29:19 -0600 Subject: [PATCH 035/141] Cleanup Broken Links --- docs/demo/README.htm | 26 +++++++++++++++++++++++++- docs/demo/README.md | 2 +- docs/utPLSQL-V3-Comparison.htm | 4 ++-- docs/utPLSQL-V3-Comparison.md | 4 ++-- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/docs/demo/README.htm b/docs/demo/README.htm index 94aebe1..14d04a5 100644 --- a/docs/demo/README.htm +++ b/docs/demo/README.htm @@ -1,7 +1,7 @@

        Website Home Page

        Demonstrations and Examples


        -

        Demonstrations and examples assume successful connection to an Oracle database with wtPLSQL installed. wtPLSQL Installation instructions are available on the wtPLSQL Releases page.

        +

        Demonstrations and examples assume successful connection to an Oracle database with wtPLSQL installed. wtPLSQL Installation instructions are available on the wtPLSQL Releases page.

        Test results from assertions can be queried from a set of wtPLSQL tables. The examples here will use the default reporting package called WT_TEXT_REPORT. This package displays test results using DBMS_OUTPUT.

        The Basics

        A login, or database session, is required to interact with the Oracle database. The SQL below will create a user that can run these examples. If you already have a database login, this is not necessary.

        @@ -68,5 +68,29 @@

        utPLSQL 2.3 Examples

      • ut_truncit - Test a Table Modification Procedure
      • ut_str - Test a Simple Function
      +

      Demo Installer

      +

      To save some typing, there is an installer for the demonstrations and examples. This installer will:

      +
        +
      • Prompt for a schema name (WT_DEMO is the default).
      • +
      • Confirm the database user is SYS or SYSTEM.
      • +
      • Create the schema.
      • +
      • Load database objects in the schema.
      • +
      +

      To run this installer:

      +
        +
      1. cd to "src/demo"
      2. +
      3. login as SYS or SYSTEM using SQL*Plus
      4. +
      5. Run the "install.sql" script
      6. +
      +

      To confirm a successful installation, review the newly created "install.LST" log file against the "installO.LST" example log file.

      +

      Demo Un-Install

      +

      The "uninstall.sql" script provided in the "src/demo" directory drops the demo schema from the database, with cascade.

      +

      To un-install:

      +
        +
      1. cd to "src/demo"
      2. +
      3. login as SYS or SYSTEM using SQL*Plus
      4. +
      5. Run the "uninstall.sql" script
      6. +
      +

      To confirm a successful un-install, review the "uninstall.LST" log file against the "uninstallO.LST" example log file.


      Website Home Page

      diff --git a/docs/demo/README.md b/docs/demo/README.md index 775a089..6437538 100644 --- a/docs/demo/README.md +++ b/docs/demo/README.md @@ -4,7 +4,7 @@ --- -Demonstrations and examples assume successful connection to an [Oracle database](http://www.oracle.com/technetwork/database/database-technologies/express-edition/overview/index.html) with wtPLSQL installed. [wtPLSQL Installation instructions](https://github.com/DDieterich/wtPLSQL/releases) are available on the [wtPLSQL Releases page](https://github.com/DDieterich/wtPLSQL/releases). +Demonstrations and examples assume successful connection to an [Oracle database](http://www.oracle.com/technetwork/database/database-technologies/express-edition/overview/index.html) with wtPLSQL installed. wtPLSQL Installation instructions are available on the [wtPLSQL Releases page](https://github.com/DDieterich/wtPLSQL/releases). Test results from assertions can be queried from a set of wtPLSQL tables. The examples here will use the default reporting package called WT_TEXT_REPORT. This package displays test results using DBMS_OUTPUT. diff --git a/docs/utPLSQL-V3-Comparison.htm b/docs/utPLSQL-V3-Comparison.htm index f2a1d1f..fdeb763 100644 --- a/docs/utPLSQL-V3-Comparison.htm +++ b/docs/utPLSQL-V3-Comparison.htm @@ -12,12 +12,12 @@

      The Basics

      "wt" is an Oracle database focused project. It is built entirely with PL/SQL and Application Express. All testing and reporting is done in the database.

      Goals

      The "ut3" project "follows industry standards and best patterns of modern Unit Testing frameworks like JUnit and RSpec".

      -

      The "wt" project avoids "unit testing" by adopting practices for "white box testing".

      +

      The "wt" project avoids "unit testing" by adopting practices for "white box testing".

      Customization

      The "ut3" project incorporates a wide variety of technologies and platforms. It also has a large and diverse set of capabilities that will reduce the need for customization.

      The "wt" project is centered on one platform with a very simple implementation. It is easier to customize smaller, simpler systems.

      Testing Methodologies

      -

      There is a longer discussion about unit testing methodologies in the About wtPSQL Page.

      +

      There is a longer discussion about unit testing methodologies in the About wtPSQL Page

      Fundamentally, the Oracle database is a relational database. The relational database is based on transaction processing. Data is stored and shared in a precise manner between processes.

      JUnit testing is OO (Object Oriented programming) based. Encapsulation is a core part of OO. Data sharing is done through APIs (Application Programmatic Interfaces), i.e. no fundamental data persistence.

      The principle of "store and share" is the opposite of data encapsulation. As a result, OO testing approaches are inappropriate for relational databases.

      diff --git a/docs/utPLSQL-V3-Comparison.md b/docs/utPLSQL-V3-Comparison.md index f121c6a..157718d 100644 --- a/docs/utPLSQL-V3-Comparison.md +++ b/docs/utPLSQL-V3-Comparison.md @@ -17,7 +17,7 @@ Abbreviations: ## Goals The "ut3" project ["follows industry standards and best patterns of modern Unit Testing frameworks like JUnit and RSpec"](https://github.com/utPLSQL/utPLSQL). -The "wt" project avoids "unit testing" by adopting practices for ["white box testing"](https://github.com/DDieterich/wtPLSQL/wiki/About-wtPLSQL#white-box-testing). +The "wt" project avoids "unit testing" by adopting practices for "white box testing". ## Customization The "ut3" project incorporates a wide variety of technologies and platforms. It also has a large and diverse set of capabilities that will reduce the need for customization. @@ -25,7 +25,7 @@ The "ut3" project incorporates a wide variety of technologies and platforms. It The "wt" project is centered on one platform with a very simple implementation. It is easier to customize smaller, simpler systems. ## Testing Methodologies -There is a longer discussion about unit testing methodologies in the [About wtPSQL Page](https://github.com/DDieterich/wtPLSQL/wiki/About-wtPLSQL#unit-testing). +There is a longer discussion about unit testing methodologies in the [About wtPSQL Page](About-wtPLSQL.md) Fundamentally, the Oracle database is a relational database. The relational database is based on transaction processing. Data is stored and shared in a precise manner between processes. From 9367f843f326e90ea8f6d33661cdd741eaa3aceb Mon Sep 17 00:00:00 2001 From: DDieterich Date: Thu, 22 Nov 2018 07:29:50 -0600 Subject: [PATCH 036/141] Separate core, Core almost complete --- docs/Reference.md | 1 + src/common_setup.sql | 11 + src/core/common_setup.sql | 15 - src/core/core_data.pkb | 236 ++++ src/core/core_data.pks | 59 + src/core/execute_test_runner.prc | 8 - src/core/hook.pkb | 264 ++++ src/core/hook.pks | 53 + src/core/hooks.tab | 26 + src/core/install.sql | 132 +- src/core/proftab.sql | 112 -- src/core/proftab_comments.sql | 42 - src/core/uninstall.sql | 2 +- src/core/wt_assert.pkb | 368 ++--- src/core/wt_assert.pks | 17 +- src/core/wt_dbout_runs_vw.vw | 39 - src/core/wt_dbouts.tab | 27 - src/core/wt_execute_test_runner.prc | 14 + src/core/wt_hook.pkb | 147 -- src/core/wt_hook.pks | 33 - src/core/wt_hooks.tab | 30 - src/core/wt_profile.pkb | 1988 --------------------------- src/core/wt_profile.pks | 57 - src/core/wt_profiles.tab | 32 - src/core/wt_profiles_vw.vw | 51 - src/core/wt_result.pkb | 491 ------- src/core/wt_result.pks | 35 - src/core/wt_results.tab | 39 - src/core/wt_results_vw.vw | 49 - src/core/wt_test_run.pkb | 275 ---- src/core/wt_test_run.pks | 22 - src/core/wt_test_runner.pkb | 95 -- src/core/wt_test_runner.pks | 24 - src/core/wt_test_runners.tab | 22 - src/core/wt_test_runs.tab | 51 - src/core/wt_test_runs_vw.vw | 29 - src/core/wt_testcase.pkb | 39 - src/core/wt_testcase.pks | 11 - src/core/wt_testcases.tab | 20 - src/core/wt_text_report.pkb | 442 ++---- src/core/wt_text_report.pks | 31 +- src/core/wt_version.tab | 19 +- src/core/wtplsql.pkb | 602 ++++---- src/core/wtplsql.pks | 18 +- src/demo/gilded_rose.sql | 134 ++ 45 files changed, 1501 insertions(+), 4711 deletions(-) create mode 100644 src/common_setup.sql delete mode 100644 src/core/common_setup.sql create mode 100644 src/core/core_data.pkb create mode 100644 src/core/core_data.pks delete mode 100644 src/core/execute_test_runner.prc create mode 100644 src/core/hook.pkb create mode 100644 src/core/hook.pks create mode 100644 src/core/hooks.tab delete mode 100644 src/core/proftab.sql delete mode 100644 src/core/proftab_comments.sql delete mode 100644 src/core/wt_dbout_runs_vw.vw delete mode 100644 src/core/wt_dbouts.tab create mode 100644 src/core/wt_execute_test_runner.prc delete mode 100644 src/core/wt_hook.pkb delete mode 100644 src/core/wt_hook.pks delete mode 100644 src/core/wt_hooks.tab delete mode 100644 src/core/wt_profile.pkb delete mode 100644 src/core/wt_profile.pks delete mode 100644 src/core/wt_profiles.tab delete mode 100644 src/core/wt_profiles_vw.vw delete mode 100644 src/core/wt_result.pkb delete mode 100644 src/core/wt_result.pks delete mode 100644 src/core/wt_results.tab delete mode 100644 src/core/wt_results_vw.vw delete mode 100644 src/core/wt_test_run.pkb delete mode 100644 src/core/wt_test_run.pks delete mode 100644 src/core/wt_test_runner.pkb delete mode 100644 src/core/wt_test_runner.pks delete mode 100644 src/core/wt_test_runners.tab delete mode 100644 src/core/wt_test_runs.tab delete mode 100644 src/core/wt_test_runs_vw.vw delete mode 100644 src/core/wt_testcase.pkb delete mode 100644 src/core/wt_testcase.pks delete mode 100644 src/core/wt_testcases.tab create mode 100644 src/demo/gilded_rose.sql diff --git a/docs/Reference.md b/docs/Reference.md index 92c2f27..e44e95f 100644 --- a/docs/Reference.md +++ b/docs/Reference.md @@ -35,6 +35,7 @@ An obvious drawback of this approach is running assertions when NLS settings mus * ORA-20009 - WT_RESULT Package: "in_test_run_id" cannot be NULL * ORA-20010 - WT_TEST_RUN_STAT Package: Unknown Result status * ORA-20011 - WT_TEST_RUN_STAT Package: Unknown Profile status +* ORA-20012 - HOOK Package: Unknown HOOK_NAME Case ## WT_TEXT_REPORT Detail Levels * **Less than 10 (including null)** - No Detail diff --git a/src/common_setup.sql b/src/common_setup.sql new file mode 100644 index 0000000..f78e3c7 --- /dev/null +++ b/src/common_setup.sql @@ -0,0 +1,11 @@ + +-- +-- Core Installation +-- + +-- Enable SQL*Plus Variables +set define "&" +set concat "." + +define schema_owner="wtp" +define connect_string="" diff --git a/src/core/common_setup.sql b/src/core/common_setup.sql deleted file mode 100644 index 95c1455..0000000 --- a/src/core/common_setup.sql +++ /dev/null @@ -1,15 +0,0 @@ - --- --- Core Installation --- - --- Enable SQL*Plus Variables -set define "&" -set concat "." - -accept schema_owner CHAR default 'wtp' - -prompt 'Enter Schema Name (wtp): ' - -prompt 'Connect String must be empty or start with @' -accept connect_string CHAR default 'wtp' - -prompt 'Enter Connect String (): ' diff --git a/src/core/core_data.pkb b/src/core/core_data.pkb new file mode 100644 index 0000000..2483195 --- /dev/null +++ b/src/core/core_data.pkb @@ -0,0 +1,236 @@ +create or replace package body core_data +is + +--------------------- +-- Public Procedures +--------------------- + +------------------------------------------------------------ +procedure init1 + (in_package_name in varchar2) +is + l_run_recNULL run_rec_type; + l_results_recNULL results_rec_type; +begin + -- Initialize Test Run Record + g_run_rec := l_run_recNULL; + --g_run_rec.runner_owner := USER; + --g_run_rec.runner_owner := sys_context('userenv', 'current_schema'); + select username into g_run_rec.runner_owner from user_users; + g_run_rec.runner_name := in_package_name; + g_run_rec.start_dtm := systimestamp; + -- Initialize Test Results Array + g_results_nt := results_nt_type(null); + -- Initialize Test Results Record + g_results_rec := l_results_recNULL; +end init1; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_init1 + is + l_run_recSAVE run_rec_type; + l_results_ntSAVE results_nt_type; + l_results_recSAVE results_rec_type; + l_run_recTEST run_rec_type; + l_results_ntTEST results_nt_type; + l_results_recTEST results_rec_type; + num_recs number; + begin + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'INIT "One" Starting Point Confirmation'; + wt_assert.isnotnull + (msg_in => 'g_run_rec.runner_owner' + ,check_this_in => g_run_rec.runner_owner); + wt_assert.isnotnull + (msg_in => 'g_run_rec.runner_name' + ,check_this_in => g_run_rec.runner_name); + wt_assert.isnotnull + (msg_in => 'g_run_rec.start_dtm' + ,check_this_in => g_run_rec.start_dtm); + num_recs := g_results_nt.COUNT; + wt_assert.isnotnull + (msg_in => 'Number of Records in g_results_nt' + ,check_this_in => num_recs); + wt_assert.isnotnull + (msg_in => 'g_results_rec.pass' + ,check_this_in => g_results_rec.pass); + -------------------------------------- WTPLSQL Testing -- + l_run_recSAVE := g_run_rec; + l_results_recSAVE := g_results_rec; + l_results_ntSAVE := g_results_nt; + init1 ('WTPLSQL'); + l_run_recTEST := g_run_rec; + l_results_recTEST := g_results_rec; + l_results_ntTEST := g_results_nt; + g_run_rec := l_run_recSAVE; + g_results_rec := l_results_recSAVE; + g_results_nt := l_results_ntSAVE; + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'INIT "One" Happy Path 1'; + wt_assert.eq + (msg_in => 'l_run_recSAVE.runner_owner' + ,check_this_in => l_run_recSAVE.runner_owner + ,against_this_in => USER); + wt_assert.eq + (msg_in => 'l_run_recTEST.runner_name' + ,check_this_in => l_run_recTEST.runner_name + ,against_this_in => 'WTPLSQL'); + wt_assert.isnotnull + (msg_in => 'l_run_recTEST.start_dtm' + ,check_this_in => l_run_recTEST.start_dtm); + wt_assert.this + (msg_in => 'l_run_recTEST.start_dtm > g_run_rec.start_dtm' + ,check_this_in => l_run_recTEST.start_dtm > g_run_rec.start_dtm); + wt_assert.eq + (msg_in => 'Number of Records in l_results_ntTEST' + ,check_this_in => l_results_ntTEST.COUNT + ,against_this_in => 1); + wt_assert.isnull + (msg_in => 'l_results_recTEST.pass' + ,check_this_in => l_results_recTEST.pass); + end t_init1; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +------------------------------------------------------------ +procedure init2 +is + l_run_recNULL run_rec_type; + l_results_recNULL results_rec_type; +begin + g_results_rec.executed_dtm := systimestamp; +end init2; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_init2 + is + l_run_recSAVE run_rec_type; + l_results_ntSAVE results_nt_type; + l_results_recSAVE results_rec_type; + l_results_recTEST results_rec_type; + begin + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'INIT "Two" Happy Path 1'; + l_run_recSAVE := g_run_rec; + l_results_recSAVE := g_results_rec; + l_results_ntSAVE := g_results_nt; + g_results_rec.executed_dtm := null; + -------------------------------------- WTPLSQL Testing -- + init2; + l_results_recTEST := g_results_rec; + g_run_rec := l_run_recSAVE; + g_results_rec := l_results_recSAVE; + g_results_nt := l_results_ntSAVE; + wt_assert.isnotnull + (msg_in => 'l_results_recTEST.executed_dtm' + ,check_this_in => l_results_recTEST.executed_dtm); + end t_init2; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +------------------------------------------------------------ +procedure add + (in_testcase in varchar2 + ,in_assertion in varchar2 + ,in_pass in boolean + ,in_details in varchar2 + ,in_message in varchar2) +is + l_current_tstamp timestamp(6); +begin + g_results_rec.result_seq := g_results_rec.result_seq + 1; + -- g_results_rec.executed_dtm still has the last execution time + -- core_data.init also sets this during test runner startup + l_current_tstamp := systimestamp; + g_results_rec.interval_msecs := extract(day from ( + l_current_tstamp - g_results_rec.executed_dtm + ) * 86400 * 1000); + g_results_rec.executed_dtm := l_current_tstamp; + g_results_rec.testcase := in_testcase; + g_results_rec.assertion := in_assertion; + g_results_rec.pass := in_pass; + g_results_rec.details := in_details; + g_results_rec.message := in_message; + g_results_nt(g_results_nt.COUNT) := g_results_rec; + g_results_nt.extend; +end add; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_add + is + l_run_recSAVE run_rec_type; + begin + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'TEST_ALL Happy Path'; + end t_add; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +------------------------------------------------------------ +procedure finalize +is +begin + core_data.g_run_rec.end_dtm := systimestamp; + g_results_nt.delete(g_results_nt.COUNT); +end finalize; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_finalize + is + begin + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'TEST_ALL Happy Path'; + end t_finalize; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +------------------------------------------------------------ +procedure run_error + (in_error_message in varchar2) +is + l_run_recSAVE run_rec_type; +begin + if g_run_rec.error_message is null + then + g_run_rec.error_message := substr(in_error_message,1,4000); + else + g_run_rec.error_message := substr(g_run_rec.error_message || CHR(10) || + in_error_message,1,4000); + end if; +end run_error; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_run_error + is + l_run_recSAVE run_rec_type; + begin + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'TEST_ALL Happy Path'; + end t_run_error; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +--==============================================================-- +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure WTPLSQL_RUN + is + begin + wtplsql.g_DBOUT := 'CORE_DATA:PACKAGE BODY'; + -------------------------------------- WTPLSQL Testing -- + t_init1; + t_init2; + t_add; + t_finalize; + t_run_error; + end; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- +--==============================================================-- + + +end core_data; diff --git a/src/core/core_data.pks b/src/core/core_data.pks new file mode 100644 index 0000000..abbefdf --- /dev/null +++ b/src/core/core_data.pks @@ -0,0 +1,59 @@ +create or replace package core_data + authid definer +is + + SUBTYPE long_name is varchar2(128); + + TYPE run_rec_type is record + (runner_owner long_name + ,runner_name long_name + ,dbout_owner long_name + ,dbout_name long_name + ,dbout_type varchar2(20) + ,start_dtm timestamp + ,end_dtm timestamp + ,error_message varchar2(4000)); + g_run_rec run_rec_type; + + TYPE results_rec_type is record + (result_seq number(8) + ,executed_dtm timestamp(6) + ,interval_msecs number(10,3) + ,testcase long_name + ,assertion varchar2(15) + ,pass boolean + ,details varchar2(4000) + ,message varchar2(200)); + TYPE results_nt_type is table of results_rec_type; + g_results_rec results_rec_type; + g_results_nt results_nt_type; + + procedure init1 + (in_package_name in varchar2); + + procedure init2; + + procedure add + (in_testcase in varchar2 + ,in_assertion in varchar2 + ,in_pass in boolean + ,in_details in varchar2 + ,in_message in varchar2); + + procedure finalize; + + procedure run_error + (in_error_message in varchar2); + + -- WtPLSQL Self Test Procedures + -- + -- alter system set PLSQL_CCFLAGS = + -- 'WTPLSQL_SELFTEST:TRUE' + -- scope=BOTH; + -- + $IF $$WTPLSQL_SELFTEST + $THEN + procedure WTPLSQL_RUN; + $END + +end core_data; \ No newline at end of file diff --git a/src/core/execute_test_runner.prc b/src/core/execute_test_runner.prc deleted file mode 100644 index 68cf262..0000000 --- a/src/core/execute_test_runner.prc +++ /dev/null @@ -1,8 +0,0 @@ -create or replace procedure execute_test_runner - (in_str in varchar2) - authid current_user - -- AUTHID CURRENT_USER is required for dynamic PL/SQL execution. -is -begin - execute immediate in_str; -end execute_test_runner; diff --git a/src/core/hook.pkb b/src/core/hook.pkb new file mode 100644 index 0000000..845a34b --- /dev/null +++ b/src/core/hook.pkb @@ -0,0 +1,264 @@ +create or replace package body hook +as + + +---------------------- +-- Private Procedures +---------------------- + + +------------------------------------------------------------ +procedure run_hooks + (in_hook_name in varchar2) +is +begin + for i in 1 .. run_aa(in_hook_name).COUNT + loop + execute immediate run_aa(in_hook_name)(i); + end loop; +end run_hooks; + + +--------------------- +-- Public Procedures +--------------------- + + +------------------------------------------------------------ +procedure before_test_all +is +begin + if before_test_all_active + then + run_hooks('before_test_all'); + end if; +end before_test_all; + +------------------------------------------------------------ +procedure before_test_run +is +begin + if before_test_run_active + then + run_hooks('before_test_run'); + end if; +end before_test_run; + +------------------------------------------------------------ +procedure execute_test_runner +is +begin + if execute_test_runner_active + then + run_hooks('execute_test_runner'); + end if; +end execute_test_runner; + +------------------------------------------------------------ +procedure after_assertion +is +begin + -- +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + if t_run_assert_hook + then +$END ------%WTPLSQL_end_ignore_lines%------ + -- + if after_assertion_active + then + run_hooks('after_assertion'); + end if; + -- +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + end if; +$END ------%WTPLSQL_end_ignore_lines%------ + -- +end after_assertion; + +------------------------------------------------------------ +procedure after_test_run +is +begin + if after_test_run_active + then + run_hooks('after_test_run'); + end if; +end after_test_run; + +------------------------------------------------------------ +procedure after_test_all +is +begin + if after_test_all_active + then + run_hooks('after_test_all'); + end if; +end after_test_all; + +------------------------------------------------------------ +procedure ad_hoc_report +is +begin + if ad_hoc_report_active + then + run_hooks('ad_hoc_report'); + end if; +end ad_hoc_report; + +------------------------------------------------------------ +procedure init +is +begin + before_test_all_active := FALSE; + before_test_run_active := FALSE; + execute_test_runner_active := FALSE; + after_assertion_active := FALSE; + after_test_run_active := FALSE; + after_test_all_active := FALSE; + ad_hoc_report_active := FALSE; + for buff in ( + select hook_name + from hooks + group by hook_name ) + loop + select run_string bulk collect into run_nt + from hooks + where hook_name = buff.hook_name + order by hooks.seq; + if SQL%FOUND + then + run_aa(buff.hook_name) := run_nt; + case buff.hook_name + when 'before_test_all' then before_test_all_active := TRUE; + when 'before_test_run' then before_test_run_active := TRUE; + when 'execute_test_runner' then execute_test_runner_active := TRUE; + when 'after_assertion' then after_assertion_active := TRUE; + when 'after_test_run' then after_test_run_active := TRUE; + when 'after_test_all' then after_test_all_active := TRUE; + when 'ad_hoc_report' then ad_hoc_report_active := TRUE; + else raise_application_error(-20012, 'Unknown HOOK_NAME Case' || buff.hook_name); + end case; + end if; + end loop; +end init; + + +--==============================================================-- +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + + procedure test_hook + (in_msg in varchar2) + is + begin + t_test_hook_msg := in_msg; + end test_hook; + + procedure test_setup + is + begin + -- + t_hooks_nt := hooks_nt_type('before_test_all' + ,'before_test_run' + ,'execute_test_runner' + ,'after_assertion' + ,'after_test_run' + ,'after_test_all' + ,'ad_hoc_report'); + -- + select * bulk collect into t_save_nt from hooks; + delete from hooks; + -- + t_hooks_rec.seq := 1; + t_hooks_rec.description := 'WTPSQL Self Test'; + for i in 1 .. t_hooks_nt.COUNT + loop + t_hooks_rec.hook_name := t_hooks_nt(i); + t_hooks_rec.run_string := 'begin hook.test_hook(''' || + t_hooks_nt(i) || '''); end;'; + insert into hooks values t_hooks_rec; + end loop; + -- + commit; + t_run_assert_hook := FALSE; + init; + -- + end test_setup; + + procedure test_teardown + is + begin + delete from hooks; + forall i in 1 .. t_save_nt.COUNT + insert into hooks values t_save_nt(i); + commit; + init; + t_run_assert_hook := TRUE; + end test_teardown; + + procedure WTPLSQL_RUN + is + num_recs number; + begin + wtplsql.g_DBOUT := 'HOOK:PACKAGE BODY'; + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Setup'; + select count(*) into num_recs from hooks; + wt_assert.isnotnull + (msg_in => 'Number of records before setup' + ,check_this_in => num_recs); + test_setup; + wt_assert.eqqueryvalue + (msg_in => 'Confirm number of test records' + ,check_query_in => 'select count(*) from hooks' + ,against_value_in => t_hooks_nt.COUNT); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'All Hooks On'; + t_test_hook_msg := ''; + for i in 1 .. t_hooks_nt.COUNT + loop + hook.t_run_assert_hook := TRUE; + execute immediate 'begin hook.' || t_hooks_nt(i) || '; end;'; + hook.t_run_assert_hook := FALSE; + wt_assert.eq + (msg_in => t_hooks_nt(i) || ' is active' + ,check_this_in => t_test_hook_msg + ,against_this_in => t_hooks_nt(i)); + end loop; + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'All Hooks Off'; + delete from hooks; + commit; + init; + wt_assert.eqqueryvalue + (msg_in => 'Confirm number of test records 2' + ,check_query_in => 'select count(*) from hooks' + ,against_value_in => 0); + -------------------------------------- WTPLSQL Testing -- + t_test_hook_msg := ''; + for i in 1 .. t_hooks_nt.COUNT + loop + execute immediate 'begin hook.' || t_hooks_nt(i) || '; end;'; + wt_assert.isnull + (msg_in => t_hooks_nt(i) || ' is not active' + ,check_this_in => t_test_hook_msg); + end loop; + -------------------------------------- WTPLSQL Testing -- + test_teardown; + wt_assert.eqqueryvalue + (msg_in => 'Number of records after teardown' + ,check_query_in => 'select count(*) from hooks' + ,against_value_in => num_recs); + hook.t_run_assert_hook := TRUE; + end; + +$END ----------------%WTPLSQL_end_ignore_lines%---------------- +--==============================================================-- + + +------------------------------------------------------------ +begin + init; +end hook; diff --git a/src/core/hook.pks b/src/core/hook.pks new file mode 100644 index 0000000..7c3e862 --- /dev/null +++ b/src/core/hook.pks @@ -0,0 +1,53 @@ +create or replace package hook + authid definer +as + + TYPE run_nt_type is table + of varchar2(4000); + run_nt run_nt_type; + TYPE run_aa_type is table + of run_nt_type + index by varchar2(20); + run_aa run_aa_type; + + before_test_all_active boolean := FALSE; + before_test_run_active boolean := FALSE; + execute_test_runner_active boolean := FALSE; + after_assertion_active boolean := FALSE; + after_test_run_active boolean := FALSE; + after_test_all_active boolean := FALSE; + ad_hoc_report_active boolean := FALSE; + + procedure before_test_all; + procedure before_test_run; + procedure execute_test_runner; + procedure after_assertion; + procedure after_test_run; + procedure after_test_all; + procedure ad_hoc_report; + procedure init; + + -- WtPLSQL Self Test Procedures + -- + -- alter system set PLSQL_CCFLAGS = + -- 'WTPLSQL_SELFTEST:TRUE' + -- scope=BOTH; + -- + $IF $$WTPLSQL_SELFTEST + $THEN + TYPE save_nt_type is table of hooks%ROWTYPE; + t_hooks_rec hooks%ROWTYPE; + t_save_nt save_nt_type; + -- + TYPE hooks_nt_type is table of hooks.hook_name%TYPE; + t_hooks_nt hooks_nt_type; + -- + t_run_assert_hook boolean := TRUE; + t_test_hook_msg varchar2(4000); + -- + procedure test_hook + (in_msg in varchar2); + procedure WTPLSQL_RUN; + $END + +end hook; diff --git a/src/core/hooks.tab b/src/core/hooks.tab new file mode 100644 index 0000000..bc75f3f --- /dev/null +++ b/src/core/hooks.tab @@ -0,0 +1,26 @@ + +-- +-- wtPLSQL Hooks Table Installation +-- + +create table hooks + (hook_name varchar2(20) constraint wt_hooks_nn1 not null + ,seq number(2) constraint wt_hooks_nn2 not null + ,run_string varchar2(4000) constraint wt_hooks_nn3 not null + ,description varchar2(1000) + ,constraint hooks_pk primary key (hook_name, seq) + ,constraint hooks_ck1 check (hook_name in ('before_test_all' + ,'before_test_run' + ,'execute_test_runner' + ,'after_assertion' + ,'after_test_run' + ,'after_test_all' + ,'ad_hoc_report')) + ,constraint hooks_ck2 check (seq > 0) + ); + +comment on table hooks is 'wtPLSQL Hooks.'; +comment on column hooks.hook_name is 'Primary Key for each Hook Name'; +comment on column hooks.seq is 'Primary Key for the sequence of the Hook'; +comment on column hooks.run_string is 'Procedure Name or Un-named PL/SQL Block for EXECUTE IMMEDIATE'; +comment on column hooks.description is 'Description of this Hook.'; diff --git a/src/core/install.sql b/src/core/install.sql index eaf5c66..6a2a3b4 100644 --- a/src/core/install.sql +++ b/src/core/install.sql @@ -10,9 +10,6 @@ spool install set showmode off set serveroutput on size unlimited format truncated --- Shared Setup Script -@common_setup.sql - WHENEVER SQLERROR exit SQL.SQLCODE begin @@ -24,6 +21,9 @@ begin end; / +-- Shared Setup Script +@../common_setup.sql + WHENEVER SQLERROR continue -- Create the schema owner. @@ -33,20 +33,24 @@ create user &schema_owner. identified by &schema_owner. quota unlimited on users temporary tablespace temp; -grant create session to &schema_owner.; -grant create type to &schema_owner.; -grant create sequence to &schema_owner.; -grant create table to &schema_owner.; -grant create trigger to &schema_owner.; -grant create view to &schema_owner.; -grant create procedure to &schema_owner.; -grant create database link to &schema_owner.; -grant create job to &schema_owner.; - --- This MUST be run by SYS. +grant create session to &schema_owner.; +grant create type to &schema_owner.; +grant create sequence to &schema_owner.; +grant create table to &schema_owner.; +grant create trigger to &schema_owner.; +grant create view to &schema_owner.; +grant create procedure to &schema_owner.; +grant create database link to &schema_owner.; +grant create job to &schema_owner.; +grant create public synonym to &schema_owner.; + +-- For DBOUT Check. grant select on dba_objects to &schema_owner.; -grant select on dba_source to &schema_owner.; +-- For Qualified Test Runners View grant select on dba_procedures to &schema_owner.; +-- For Profiler +grant select on dba_source to &schema_owner.; +-- For GUI grant select on sys.gv_$parameter to &schema_owner.; begin @@ -96,23 +100,6 @@ begin end; / --- Public Synonyms - -create or replace public synonym wt_version for &schema_owner..wt_version; -create or replace public synonym wt_test_runs_seq for &schema_owner..wt_test_runs_seq; -create or replace public synonym wt_test_runs for &schema_owner..wt_test_runs; -create or replace public synonym wt_results for &schema_owner..wt_results; -create or replace public synonym wt_dbout_profiles for &schema_owner..wt_dbout_profiles; -create or replace public synonym wt_test_run_stats for &schema_owner..wt_test_run_stats; -create or replace public synonym wt_testcase_stats for &schema_owner..wt_testcase_stats; -create or replace public synonym wt_self_test for &schema_owner..wt_self_test; - -create or replace public synonym utassert for &schema_owner..wt_assert; -create or replace public synonym wt_assert for &schema_owner..wt_assert; -create or replace public synonym wt_text_report for &schema_owner..wt_text_report; -create or replace public synonym wt_wtplsql for &schema_owner..wtplsql; -create or replace public synonym wtplsql for &schema_owner..wtplsql; - WHENEVER SQLERROR exit SQL.SQLCODE @@ -131,64 +118,79 @@ end; WHENEVER SQLERROR continue --- --- Run Oracle's Profiler Table Installation --- Note1: Tables converted to Global Temporary --- Note2: Includes "Drop Table" and "Drop Sequence" statements --- -@proftab.sql -@proftab_comments.sql --- -create index plsql_profiler_runs_idx1 - on plsql_profiler_runs (run_date); -- Core Tables +@hooks.tab + @wt_version.tab -@wt_test_runs.tab -@wt_results.tab -@wt_dbout_profiles.tab -@wt_test_run_stats.tab -@wt_testcase_stats.tab + @wt_self_test.tab --- Install Views -@wt_scheduler_jobs.vw -- Package Specifications -@wtplsql.pks +@core_data.pks / -@wt_result.pks -/ -@wt_assert.pks + +@hook.pks / -@wt_profiler.pks + +@wtplsql.pks / -@wt_test_run_stat.pks +grant execute on wtplsql to public; +create or replace public synonym wtplsql for wtplsql; +create or replace public synonym wt_wtplsql for wtplsql; + +@wt_assert.pks / +grant execute on wt_assert to public; +create or replace public synonym wt_assert for wt_assert; +create or replace public synonym utassert for wt_assert; + @wt_text_report.pks / - -grant execute on wtplsql to public; -grant execute on wt_assert to public; grant execute on wt_text_report to public; +create or replace public synonym wt_text_report for wt_text_report; + -- Procedures -@clear_last_run.prc +@wt_execute_test_runner.prc / +grant execute on wt_execute_test_runner to public; +create or replace public synonym wt_execute_test_runner for wt_execute_test_runner; + -- Package Bodies -@wtplsql.pkb -/ -@wt_result.pkb +@core_data.pkb / -@wt_assert.pkb + +@hook.pkb / -@wt_profiler.pkb + +@wtplsql.pkb / -@wt_test_run_stat.pkb + +@wt_assert.pkb / + @wt_text_report.pkb / +-- Configuration Data + +-- This is the default test runner execution procedure +insert into hooks (hook_name, seq, run_string) + values ('execute_test_runner', 1, 'begin wt_execute_test_runner; end;'); + +-- Run this report after testing because this is no storage +insert into hooks (hook_name, seq, run_string) + values ('after_test_run', 1, 'begin wt_text_report.dbms_out(30, TRUE); end;'); + +-- This is the default ad-hoc result report +insert into hooks (hook_name, seq, run_string) + values ('ad_hoc_report', 1, 'begin wt_text_report.ad_hoc_result; end;'); + +commit; + + set showmode on spool off diff --git a/src/core/proftab.sql b/src/core/proftab.sql deleted file mode 100644 index 1ccf0a0..0000000 --- a/src/core/proftab.sql +++ /dev/null @@ -1,112 +0,0 @@ -Rem -Rem $Header: proftab.sql 07-oct-99.11:04:02 jmuller Exp $ -Rem -Rem proftab.sql -Rem -Rem Copyright (c) Oracle Corporation 1998, 1999. All Rights Reserved. -Rem -Rem NAME -Rem proftab.sql -Rem -Rem DESCRIPTION -Rem Create tables for the PL/SQL profiler -Rem -Rem NOTES -Rem The following tables are required to collect data: -Rem plsql_profiler_runs - information on profiler runs -Rem plsql_profiler_units - information on each lu profiled -Rem plsql_profiler_data - profiler data for each lu profiled -Rem -Rem The plsql_profiler_runnumber sequence is used for generating unique -Rem run numbers. -Rem -Rem The tables and sequence can be created in the schema for each user -Rem who wants to gather profiler data. Alternately these tables can be -Rem created in a central schema. In the latter case the user creating -Rem these objects is responsible for granting appropriate privileges -Rem (insert,update on the tables and select on the sequence) to all -Rem users who want to store data in the tables. Appropriate synonyms -Rem must also be created so the tables are visible from other user -Rem schemas. -Rem -Rem The other tables are used for rolling up to line level; the views are -Rem used to roll up across multiple runs. These are not required to -Rem collect data, but help with analysis of the gathered data. -Rem -Rem THIS SCRIPT DELETES ALL EXISTING DATA! -Rem -Rem MODIFIED (MM/DD/YY) -Rem jmuller 10/07/99 - Fix bug 708690: TAB -> blank -Rem astocks 04/19/99 - Add owner,related_run field to runtab -Rem astocks 10/21/98 - Add another spare field -Rem ciyer 09/15/98 - Create tables for profiler -Rem ciyer 09/15/98 - Created -Rem - -drop table plsql_profiler_data cascade constraints; -drop table plsql_profiler_units cascade constraints; -drop table plsql_profiler_runs cascade constraints; - -drop sequence plsql_profiler_runnumber; - -create table plsql_profiler_runs -( - runid number primary key, -- unique run identifier, - -- from plsql_profiler_runnumber - related_run number, -- runid of related run (for client/ - -- server correlation) - run_owner varchar2(32), -- user who started run - run_date date, -- start time of run - run_comment varchar2(2047), -- user provided comment for this run - run_total_time number, -- elapsed time for this run - run_system_info varchar2(2047), -- currently unused - run_comment1 varchar2(2047), -- additional comment - spare1 varchar2(256) -- unused -); - -comment on table plsql_profiler_runs is - 'Run-specific information for the PL/SQL profiler'; - -create table plsql_profiler_units -( - runid number references plsql_profiler_runs, - unit_number number, -- internally generated library unit # - unit_type varchar2(32), -- library unit type - unit_owner varchar2(32), -- library unit owner name - unit_name varchar2(32), -- library unit name - -- timestamp on library unit, can be used to detect changes to - -- unit between runs - unit_timestamp date, - total_time number DEFAULT 0 NOT NULL, - spare1 number, -- unused - spare2 number, -- unused - -- - primary key (runid, unit_number) -); - -comment on table plsql_profiler_units is - 'Information about each library unit in a run'; - -create table plsql_profiler_data -( - runid number, -- unique (generated) run identifier - unit_number number, -- internally generated library unit # - line# number not null, -- line number in unit - total_occur number, -- number of times line was executed - total_time number, -- total time spent executing line - min_time number, -- minimum execution time for this line - max_time number, -- maximum execution time for this line - spare1 number, -- unused - spare2 number, -- unused - spare3 number, -- unused - spare4 number, -- unused - -- - primary key (runid, unit_number, line#), - foreign key (runid, unit_number) references plsql_profiler_units -); - -comment on table plsql_profiler_data is - 'Accumulated data from all profiler runs'; - -create sequence plsql_profiler_runnumber start with 1 nocache; - diff --git a/src/core/proftab_comments.sql b/src/core/proftab_comments.sql deleted file mode 100644 index 1294d2a..0000000 --- a/src/core/proftab_comments.sql +++ /dev/null @@ -1,42 +0,0 @@ - --- --- Comments taken from --- Oracle Database Online Documentation 11g Release 2 (11.2) --- Database PL/SQL Packages and Types Reference --- https://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_profil.htm#ARPLS67461 --- - -comment on table PLSQL_PROFILER_RUNS is 'Table of profiler runs for DBMS_PROFILER'; -comment on column PLSQL_PROFILER_RUNS.runid is '(PRIMARY KEY) Unique run identifier from plsql_profiler_runnumber'; -comment on column PLSQL_PROFILER_RUNS.related_run is 'Runid of related run (for client/server correlation)'; -comment on column PLSQL_PROFILER_RUNS.run_owner is 'User who started run'; -comment on column PLSQL_PROFILER_RUNS.run_date is 'Start time of run'; -comment on column PLSQL_PROFILER_RUNS.run_comment is 'User provided comment for this run'; -comment on column PLSQL_PROFILER_RUNS.run_total_time is 'Elapsed time for this run in nanoseconds'; -comment on column PLSQL_PROFILER_RUNS.run_system_info is 'Currently unused'; -comment on column PLSQL_PROFILER_RUNS.run_comment1 is 'Additional comment'; -comment on column PLSQL_PROFILER_RUNS.spare1 is 'Unused'; - -comment on table PLSQL_PROFILER_UNITS is 'Table of program units for DBMS_PROFILER'; -comment on column PLSQL_PROFILER_UNITS.runid is '(Primary key) References plsql_profiler_runs'; -comment on column PLSQL_PROFILER_UNITS.unit_number is '(Primary key) Internally generated library unit #'; -comment on column PLSQL_PROFILER_UNITS.unit_type is 'Library unit type'; -comment on column PLSQL_PROFILER_UNITS.unit_owner is 'Library unit owner name'; -comment on column PLSQL_PROFILER_UNITS.unit_name is 'Library unit name timestamp on library unit'; -comment on column PLSQL_PROFILER_UNITS.unit_timestamp is 'In the future will be used to detect changes to unit between runs'; -comment on column PLSQL_PROFILER_UNITS.total_time is 'Total time spent in this unit in nanoseconds. The profiler does not set this field, but it is provided for the convenience of analysis tools'; -comment on column PLSQL_PROFILER_UNITS.spare1 is 'Unused'; -comment on column PLSQL_PROFILER_UNITS.spare2 is 'Unused'; - -comment on table PLSQL_PROFILER_DATA is 'Table of program units for DBMS_PROFILER'; -comment on column PLSQL_PROFILER_DATA.runid is 'Primary key, unique (generated) run identifier'; -comment on column PLSQL_PROFILER_DATA.unit_number is 'Primary key, internally generated library unit number'; -comment on column PLSQL_PROFILER_DATA.line# is 'Primary key, not null, line number in unit'; -comment on column PLSQL_PROFILER_DATA.total_occur is 'Number of times line was executed'; -comment on column PLSQL_PROFILER_DATA.total_time is 'Total time spent executing line in nanoseconds'; -comment on column PLSQL_PROFILER_DATA.min_time is 'Minimum execution time for this line in nanoseconds'; -comment on column PLSQL_PROFILER_DATA.max_time is 'Maximum execution time for this line in nanoseconds'; -comment on column PLSQL_PROFILER_DATA.spare1 is 'Unused'; -comment on column PLSQL_PROFILER_DATA.spare2 is 'Unused'; -comment on column PLSQL_PROFILER_DATA.spare3 is 'Unused'; -comment on column PLSQL_PROFILER_DATA.spare4 is 'Unused'; diff --git a/src/core/uninstall.sql b/src/core/uninstall.sql index 95f0697..9a27a49 100644 --- a/src/core/uninstall.sql +++ b/src/core/uninstall.sql @@ -9,7 +9,7 @@ spool uninstall set showmode off set serveroutput on size unlimited format truncated -@common_setup.sql +@../common_setup.sql drop user &schema_owner. cascade; diff --git a/src/core/wt_assert.pkb b/src/core/wt_assert.pkb index 961db08..aa191bb 100644 --- a/src/core/wt_assert.pkb +++ b/src/core/wt_assert.pkb @@ -63,7 +63,7 @@ $THEN procedure t_boolean_to_status is begin - wt_assert.g_testcase_name := 'BOOLEAN_TO_STATUS'; + wt_assert.g_testcase := 'BOOLEAN_TO_STATUS'; -------------------------------------- WTPLSQL Testing -- wt_assert.eq (msg_in => 'Test for "TRUE" conversion' @@ -85,35 +85,32 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- procedure process_assertion is begin - $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ if not wtplsql_skip_save then $END ----------------%WTPLSQL_end_ignore_lines%---------------- - wt_result.save - (in_assertion => g_rec.last_assert - ,in_status => case g_rec.last_pass - when TRUE then C_PASS - else C_FAIL - end - ,in_details => g_rec.last_details - ,in_testcase_name => g_testcase_name - ,in_message => g_rec.last_msg); + if core_data.g_run_rec.runner_name is null + then + hook.ad_hoc_report; + else + core_data.add + (in_testcase => g_testcase + ,in_assertion => g_rec.last_assert + ,in_pass => g_rec.last_pass + ,in_details => g_rec.last_details + ,in_message => g_rec.last_msg); + end if; $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ end if; $END ----------------%WTPLSQL_end_ignore_lines%---------------- - - wt_hook.after_assertion; - - if g_rec.raise_exception and not g_rec.last_pass + hook.after_assertion; + if g_rec.raise_exception + and not g_rec.last_pass then - raise_application_error(-20003, wt_text_report.format_test_result - (in_assertion => g_rec.last_assert - ,in_status => C_FAIL - ,in_details => g_rec.last_details - ,in_testcase => g_testcase_name - ,in_message => g_rec.last_msg) ); + raise_application_error(-20003, g_rec.last_msg || CHR(10) || + ' Assertion ' || g_rec.last_assert || ' Failed.' || CHR(10) || + ' Testcase: ' || g_testcase || CHR(10) || + ' ' || g_rec.last_details ); end if; - end process_assertion; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ @@ -122,7 +119,7 @@ $THEN is begin -------------------------------------- WTPLSQL Testing -- - g_testcase_name := 'PROCESS_ASSERTION'; + g_testcase := 'PROCESS_ASSERTION'; g_rec.last_assert := 'THIS'; g_rec.last_pass := FALSE; g_rec.last_details := 'Expected "PASS" and got "FAIL"'; @@ -194,7 +191,7 @@ $THEN is begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'COMPARE_QUERIES Bad Query Test 1'; + wt_assert.g_testcase := 'COMPARE_QUERIES Bad Query Test 1'; compare_queries ( check_query_in => 'select bogus123 from bogus456', against_query_in => 'select bogus987 from bogus654'); @@ -212,7 +209,7 @@ $THEN check_this_in => (temp_rec.last_details like '%PL/SQL: ORA-00942: table or view does not exist%')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'COMPARE_QUERIES Bad Query Test 2'; + wt_assert.g_testcase := 'COMPARE_QUERIES Bad Query Test 2'; compare_queries ( check_query_in => 'select table_name from user_tables', against_query_in => 'select tablespace_name from user_tables'); @@ -247,21 +244,21 @@ begin end last_pass; function last_assert - return wt_results.assertion%TYPE + return varchar2 is begin return g_rec.last_assert; end last_assert; function last_msg - return wt_results.message%TYPE + return varchar2 is begin return g_rec.last_msg; end last_msg; function last_details - return wt_results.details%TYPE + return varchar2 is begin return g_rec.last_details; @@ -273,7 +270,7 @@ $THEN is begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'Last Values Tests'; + wt_assert.g_testcase := 'Last Values Tests'; wt_assert.eq ( msg_in => 'Last Pass', check_this_in => last_pass, @@ -304,12 +301,12 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- procedure reset_globals is begin - g_testcase_name := ''; + g_testcase := ''; g_rec.last_pass := NULL; + g_rec.raise_exception := FALSE; g_rec.last_assert := ''; g_rec.last_msg := ''; g_rec.last_details := ''; - g_rec.raise_exception := FALSE; end reset_globals; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ @@ -317,11 +314,11 @@ $THEN procedure t_reset_globals is begin - reset_globals; -- Resets g_testcase_name + reset_globals; -- Resets g_testcase temp_rec := g_rec; - temp_testcase := g_testcase_name; + temp_testcase := g_testcase; -------------------------------------- WTPLSQL Testing -- - g_testcase_name := 'RESET_GLOBALS'; + g_testcase := 'RESET_GLOBALS'; wt_assert.isnull( msg_in => 'temp_testcase', check_this_in => temp_testcase); @@ -411,7 +408,7 @@ $THEN is begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'NLS Settings'; + wt_assert.g_testcase := 'NLS Settings'; set_NLS_DATE_FORMAT('DD-MON-YYYY'); wt_assert.eq (msg_in => 'get_NLS_DATE_FORMAT 1' @@ -477,7 +474,7 @@ $THEN l_found_exception BOOLEAN; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'This Happy Path'; + wt_assert.g_testcase := 'This Happy Path'; wt_assert.this ( msg_in => 'Run Test', check_this_in => TRUE); @@ -500,7 +497,7 @@ $THEN check_this_in => temp_rec.last_details, against_this_in => 'Expected "TRUE" and got "TRUE"'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'This Sad Path 1'; + wt_assert.g_testcase := 'This Sad Path 1'; wtplsql_skip_save := TRUE; this ( msg_in => 'Not Used', @@ -512,7 +509,7 @@ $THEN check_this_in => temp_rec.last_pass, against_this_in => FALSE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'This Sad Path 2'; + wt_assert.g_testcase := 'This Sad Path 2'; wtplsql_skip_save := TRUE; begin this ( @@ -535,7 +532,7 @@ $THEN check_this_in => temp_rec.last_pass, against_this_in => FALSE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'This Sad Path 3'; + wt_assert.g_testcase := 'This Sad Path 3'; wtplsql_skip_save := TRUE; this ( msg_in => 'Not Used', @@ -667,7 +664,7 @@ $THEN l_found_exception BOOLEAN; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ VARCHAR2 Happy Path 1'; + wt_assert.g_testcase := 'EQ VARCHAR2 Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => 'X', @@ -702,20 +699,20 @@ $THEN msg_in => 'temp_rec.last_details', check_this_in => (temp_rec.last_details = 'Expected "X" and got "X"')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ VARCHAR2 Happy Path 2'; + wt_assert.g_testcase := 'EQ VARCHAR2 Happy Path 2'; eq ( msg_in => 'Run Test', check_this_in => 'X', against_this_in => 'X', null_ok_in => TRUE); - wt_assert.g_testcase_name := 'EQ VARCHAR2 Happy Path 3'; + wt_assert.g_testcase := 'EQ VARCHAR2 Happy Path 3'; eq ( msg_in => 'Run Test', check_this_in => '', against_this_in => '', null_ok_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ VARCHAR2 Sad Path 1'; + wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -734,7 +731,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ VARCHAR2 Sad Path 2'; + wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 2'; wtplsql_skip_save := TRUE; begin eq ( @@ -757,7 +754,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ VARCHAR2 Sad Path 3'; + wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 3'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -776,7 +773,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ VARCHAR2 Sad Path 4'; + wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 4'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -795,7 +792,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ VARCHAR2 Sad Path 5'; + wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 5'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -815,7 +812,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ VARCHAR2 Sad Path 6'; + wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 6'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -836,13 +833,13 @@ $THEN check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- -- VARCHAR2 includes Includes ROWID - wt_assert.g_testcase_name := 'EQ ROWID Happy Path 1'; + wt_assert.g_testcase := 'EQ ROWID Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_rowid1, against_this_in => temp_rowid1); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ ROWID Sad Path 1'; + wt_assert.g_testcase := 'EQ ROWID Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -862,13 +859,13 @@ $THEN check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- -- VARCHAR2 includes Includes LONG - wt_assert.g_testcase_name := 'EQ LONG Happy Path 1'; + wt_assert.g_testcase := 'EQ LONG Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_long1, against_this_in => temp_long1); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ LONG Sad Path 1'; + wt_assert.g_testcase := 'EQ LONG Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -888,13 +885,13 @@ $THEN check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- -- VARCHAR2 includes Includes RAW - wt_assert.g_testcase_name := 'EQ RAW Happy Path 1'; + wt_assert.g_testcase := 'EQ RAW Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_raw1, against_this_in => temp_raw1); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ RAW Sad Path 1'; + wt_assert.g_testcase := 'EQ RAW Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -914,21 +911,21 @@ $THEN check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- -- VARCHAR2 includes Includes LONG RAW - wt_assert.g_testcase_name := 'EQ LANG RAW Happy Path 1'; + wt_assert.g_testcase := 'EQ LONG RAW Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_lraw1, against_this_in => temp_lraw1); -------------------------------------- WTPLSQL Testing -- -- VARCHAR2 includes Includes LONG RAW - wt_assert.g_testcase_name := 'EQ LANG RAW Happy Path 1'; + wt_assert.g_testcase := 'EQ LONG RAW Happy Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', check_this_in => temp_lraw1, against_this_in => temp_lraw2); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ LONG RAW Sad Path 1'; + wt_assert.g_testcase := 'EQ LONG RAW Sad Path 1'; wtplsql_skip_save := FALSE; temp_rec := g_rec; wt_assert.isnotnull ( @@ -943,13 +940,13 @@ $THEN check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- -- VARCHAR2 includes Includes NVARCHAR2 - wt_assert.g_testcase_name := 'EQ NVARCHAR2 Happy Path 1'; + wt_assert.g_testcase := 'EQ NVARCHAR2 Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_nc1, against_this_in => temp_nc1); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ NVARCHAR2 Sad Path 1'; + wt_assert.g_testcase := 'EQ NVARCHAR2 Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -968,26 +965,26 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ BOOLEAN Happy Path 1'; + wt_assert.g_testcase := 'EQ BOOLEAN Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => FALSE, against_this_in => FALSE); - wt_assert.g_testcase_name := 'EQ BOOLEAN Happy Path 2'; + wt_assert.g_testcase := 'EQ BOOLEAN Happy Path 2'; eq ( msg_in => 'Run Test', check_this_in => FALSE, against_this_in => FALSE, null_ok_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ BOOLEAN Happy Path 3'; + wt_assert.g_testcase := 'EQ BOOLEAN Happy Path 3'; eq ( msg_in => 'Run Test', check_this_in => temp_bool, against_this_in => temp_bool, null_ok_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ BOOLEAN Happy Sad 1'; + wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1006,7 +1003,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ BOOLEAN Happy Sad 2'; + wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 2'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1025,7 +1022,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ BOOLEAN Happy Sad 3'; + wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 3'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1045,7 +1042,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ BOOLEAN Happy Sad 4'; + wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 4'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1065,18 +1062,18 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ NUMBER Happy Path 1'; + wt_assert.g_testcase := 'EQ NUMBER Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => 4, against_this_in => 4); - wt_assert.g_testcase_name := 'EQ NUMBER Happy Path 2'; + wt_assert.g_testcase := 'EQ NUMBER Happy Path 2'; eq ( msg_in => 'Run Test', check_this_in => 9876543210987654321098765432109876543210, against_this_in => 9876543210987654321098765432109876543210); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ NUMBER Happy Path 1'; + wt_assert.g_testcase := 'EQ NUMBER Happy Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1096,14 +1093,14 @@ $THEN check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- -- EQ: NUMBER implicit conversion includes PLS_INTEGER - wt_assert.g_testcase_name := 'EQ PLS_INTEGER Happy Path 1'; + wt_assert.g_testcase := 'EQ PLS_INTEGER Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_pint1, against_this_in => temp_pint1); wtplsql_skip_save := TRUE; -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ PLS_INTEGER Sad Path 1'; + wt_assert.g_testcase := 'EQ PLS_INTEGER Sad Path 1'; eq ( msg_in => 'Not Used', check_this_in => temp_pint1, @@ -1121,13 +1118,13 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ DATE Happy Path 1'; + wt_assert.g_testcase := 'EQ DATE Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_date, against_this_in => temp_date); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ DATE Sad Path 1'; + wt_assert.g_testcase := 'EQ DATE Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1147,13 +1144,13 @@ $THEN check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- -- EQ: DATE implicit conversion includes TIMESTAMP - wt_assert.g_testcase_name := 'EQ TIMSETAMP Happy Path 1'; + wt_assert.g_testcase := 'EQ TIMSETAMP Happy Path 1'; eq ( msg_in => 'EQ TIMSETAMP Happy Path 1', check_this_in => temp_tstmp, against_this_in => temp_tstmp); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ TIMSETAMP Sad Path 1'; + wt_assert.g_testcase := 'EQ TIMSETAMP Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1173,13 +1170,13 @@ $THEN check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- -- EQ: DATE implicit conversion includes TIMESTAMP - wt_assert.g_testcase_name := 'EQ TIMSETAMP WITH LOCAL TIME ZONE Happy Path 1'; + wt_assert.g_testcase := 'EQ TIMSETAMP WITH LOCAL TIME ZONE Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_tstzn, against_this_in => temp_tstzn); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ TIMSETAMP WITH LOCAL TIME ZONE Sad Path 1'; + wt_assert.g_testcase := 'EQ TIMSETAMP WITH LOCAL TIME ZONE Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1199,13 +1196,13 @@ $THEN check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- -- EQ: DATE implicit conversion includes TIMESTAMP - wt_assert.g_testcase_name := 'EQ TIMSETAMP WITH TIME ZONE Happy Path 1'; + wt_assert.g_testcase := 'EQ TIMSETAMP WITH TIME ZONE Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_tstzn, against_this_in => temp_tstzn); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ TIMSETAMP WITH TIME ZONE Sad Path 1'; + wt_assert.g_testcase := 'EQ TIMSETAMP WITH TIME ZONE Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1225,13 +1222,13 @@ $THEN check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- -- EQ: DATE implicit conversion includes INTERVAL - wt_assert.g_testcase_name := 'EQ INTERVAL DAY TO SECOND Happy Path 1'; + wt_assert.g_testcase := 'EQ INTERVAL DAY TO SECOND Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_intds1, against_this_in => temp_intds1); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ INTERVAL DAY TO SECOND Sad Path 1'; + wt_assert.g_testcase := 'EQ INTERVAL DAY TO SECOND Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1251,13 +1248,13 @@ $THEN check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- -- EQ: DATE implicit conversion includes INTERVAL - wt_assert.g_testcase_name := 'EQ INTERVAL YEAR TO MONTH Happy Path 1'; + wt_assert.g_testcase := 'EQ INTERVAL YEAR TO MONTH Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_intym1, against_this_in => temp_intym1); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ INTERVAL YEAR TO MONTH Sad Path 1'; + wt_assert.g_testcase := 'EQ INTERVAL YEAR TO MONTH Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1276,7 +1273,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ XMLTYPE Happy Path 1'; + wt_assert.g_testcase := 'EQ XMLTYPE Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_xml1, @@ -1312,7 +1309,7 @@ $THEN check_this_in => (temp_rec.last_details like 'Expected "%')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ XMLTYPE Sad Path 1'; + wt_assert.g_testcase := 'EQ XMLTYPE Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1331,7 +1328,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ XMLTYPE Sad Path 2'; + wt_assert.g_testcase := 'EQ XMLTYPE Sad Path 2'; wtplsql_skip_save := TRUE; begin eq ( @@ -1354,7 +1351,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ CLOB Happy Path 1'; + wt_assert.g_testcase := 'EQ CLOB Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_clob1, @@ -1390,21 +1387,21 @@ $THEN check_this_in => (temp_rec.last_details like 'Expected "%')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ CLOB Happy Path 2'; + wt_assert.g_testcase := 'EQ CLOB Happy Path 2'; eq ( msg_in => 'Run Test', check_this_in => temp_clob1, against_this_in => temp_clob1, null_ok_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ CLOB Happy Path 3'; + wt_assert.g_testcase := 'EQ CLOB Happy Path 3'; eq ( msg_in => 'Run Test', check_this_in => cast (NULL as CLOB), against_this_in => cast (NULL as CLOB), null_ok_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ CLOB Sad Path 1'; + wt_assert.g_testcase := 'EQ CLOB Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1423,7 +1420,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ CLOB Sad Path 2'; + wt_assert.g_testcase := 'EQ CLOB Sad Path 2'; wtplsql_skip_save := TRUE; begin eq ( @@ -1446,7 +1443,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ CLOB Sad Path 3'; + wt_assert.g_testcase := 'EQ CLOB Sad Path 3'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1465,7 +1462,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ CLOB Sad Path 4'; + wt_assert.g_testcase := 'EQ CLOB Sad Path 4'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1485,27 +1482,27 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ NCLOB Happy Path 1'; + wt_assert.g_testcase := 'EQ NCLOB Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_nclob1, against_this_in => temp_nclob1); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ NCLOB Happy Path 2'; + wt_assert.g_testcase := 'EQ NCLOB Happy Path 2'; eq ( msg_in => 'Run Test', check_this_in => temp_nclob1, against_this_in => temp_nclob1, null_ok_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ NCLOB Happy Path 3'; + wt_assert.g_testcase := 'EQ NCLOB Happy Path 3'; eq ( msg_in => 'Run Test', check_this_in => cast (NULL as NCLOB), against_this_in => cast (NULL as NCLOB), null_ok_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ NCLOB Sad Path 1'; + wt_assert.g_testcase := 'EQ NCLOB Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1524,7 +1521,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ NCLOB Sad Path 2'; + wt_assert.g_testcase := 'EQ NCLOB Sad Path 2'; wtplsql_skip_save := TRUE; begin eq ( @@ -1547,7 +1544,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ NCLOB Sad Path 3'; + wt_assert.g_testcase := 'EQ NCLOB Sad Path 3'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1566,7 +1563,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ NCLOB Sad Path 4'; + wt_assert.g_testcase := 'EQ NCLOB Sad Path 4'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1586,7 +1583,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ BLOB Happy Path 1'; + wt_assert.g_testcase := 'EQ BLOB Happy Path 1'; eq ( msg_in => 'Run Test', check_this_in => temp_blob1, @@ -1622,21 +1619,21 @@ $THEN check_this_in => (temp_rec.last_details = 'DBMS_LOB.COMPARE on BLOBs, compare_results: 0')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ BLOB Happy Path 2'; + wt_assert.g_testcase := 'EQ BLOB Happy Path 2'; eq ( msg_in => 'Run Test', check_this_in => temp_blob1, against_this_in => temp_blob1, null_ok_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ BLOB Happy Path 3'; + wt_assert.g_testcase := 'EQ BLOB Happy Path 3'; eq ( msg_in => 'Run Test', check_this_in => cast (NULL as BLOB), against_this_in => cast (NULL as BLOB), null_ok_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ BLOB Sad Path 1'; + wt_assert.g_testcase := 'EQ BLOB Sad Path 1'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1655,7 +1652,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ BLOB Sad Path 2'; + wt_assert.g_testcase := 'EQ BLOB Sad Path 2'; wtplsql_skip_save := TRUE; begin eq ( @@ -1678,7 +1675,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ BLOB Sad Path 3'; + wt_assert.g_testcase := 'EQ BLOB Sad Path 3'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1697,7 +1694,7 @@ $THEN msg_in => 'last_pass = FALSE', check_this_in => (temp_rec.last_pass = FALSE)); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQ BLOB Sad Path 4'; + wt_assert.g_testcase := 'EQ BLOB Sad Path 4'; wtplsql_skip_save := TRUE; eq ( msg_in => 'Not Used', @@ -1801,7 +1798,7 @@ $THEN l_found_exception BOOLEAN; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNOTNULL VARCHAR2 Happy Path 1'; + wt_assert.g_testcase := 'ISNOTNULL VARCHAR2 Happy Path 1'; isnotnull ( msg_in => 'Run Test', check_this_in => 'X'); @@ -1825,7 +1822,7 @@ $THEN check_this_in => temp_rec.last_details, against_this_in => 'Expected NOT NULL and got "X"'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNOTNULL VARCHAR2 Sad Path 1'; + wt_assert.g_testcase := 'ISNOTNULL VARCHAR2 Sad Path 1'; wtplsql_skip_save := TRUE; isnotnull ( msg_in => 'Not Used', @@ -1836,7 +1833,7 @@ $THEN check_this_in => g_rec.last_pass, against_this_in => FALSE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNOTNULL VARCHAR2 Sad Path 2'; + wt_assert.g_testcase := 'ISNOTNULL VARCHAR2 Sad Path 2'; wtplsql_skip_save := TRUE; begin isnotnull ( @@ -1858,12 +1855,12 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNOTNULL BOOLEAN Happy Path 1'; + wt_assert.g_testcase := 'ISNOTNULL BOOLEAN Happy Path 1'; isnotnull ( msg_in => 'Run Test', check_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNOTNULL BOOLEAN Sad Path 1'; + wt_assert.g_testcase := 'ISNOTNULL BOOLEAN Sad Path 1'; wtplsql_skip_save := TRUE; isnotnull ( msg_in => 'Not Used', @@ -1874,7 +1871,7 @@ $THEN check_this_in => g_rec.last_pass, against_this_in => FALSE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNOTNULL BOOLEAN Sad Path 2'; + wt_assert.g_testcase := 'ISNOTNULL BOOLEAN Sad Path 2'; wtplsql_skip_save := TRUE; begin isnotnull ( @@ -1896,7 +1893,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNOTNULL CLOB Happy Path 1'; + wt_assert.g_testcase := 'ISNOTNULL CLOB Happy Path 1'; isnotnull ( msg_in => 'Run Test', check_this_in => temp_clob1); @@ -1923,7 +1920,7 @@ $THEN check_this_in => (temp_rec.last_details like 'Expected NOT NULL and got "%')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNOTNULL CLOB Sad Path 1'; + wt_assert.g_testcase := 'ISNOTNULL CLOB Sad Path 1'; wtplsql_skip_save := TRUE; isnotnull ( msg_in => 'Not Used', @@ -1934,7 +1931,7 @@ $THEN check_this_in => g_rec.last_pass, against_this_in => FALSE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNOTNULL CLOB Sad Path 2'; + wt_assert.g_testcase := 'ISNOTNULL CLOB Sad Path 2'; wtplsql_skip_save := TRUE; begin isnotnull ( @@ -1956,7 +1953,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNOTNULL BLOB Happy Path 1'; + wt_assert.g_testcase := 'ISNOTNULL BLOB Happy Path 1'; isnotnull ( msg_in => 'Run Test', check_this_in => temp_blob1); @@ -1980,7 +1977,7 @@ $THEN check_this_in => temp_rec.last_details, against_this_in => 'BLOB is NOT NULL'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNOTNULL BLOB Sad Path 1'; + wt_assert.g_testcase := 'ISNOTNULL BLOB Sad Path 1'; wtplsql_skip_save := TRUE; isnotnull ( msg_in => 'Not Used', @@ -1991,7 +1988,7 @@ $THEN check_this_in => g_rec.last_pass, against_this_in => FALSE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNOTNULL BLOB Sad Path 2'; + wt_assert.g_testcase := 'ISNOTNULL BLOB Sad Path 2'; wtplsql_skip_save := TRUE; begin isnotnull ( @@ -2093,7 +2090,7 @@ $THEN l_found_exception BOOLEAN; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNULL VARCHAR2 Happy Path 1'; + wt_assert.g_testcase := 'ISNULL VARCHAR2 Happy Path 1'; isnull ( msg_in => 'Run Test', check_this_in => ''); @@ -2117,7 +2114,7 @@ $THEN check_this_in => temp_rec.last_details, against_this_in => 'Expected NULL and got ""'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNULL VARCHAR2 Sad Path 1'; + wt_assert.g_testcase := 'ISNULL VARCHAR2 Sad Path 1'; wtplsql_skip_save := TRUE; isnull ( msg_in => 'Not Used', @@ -2128,7 +2125,7 @@ $THEN check_this_in => g_rec.last_pass, against_this_in => FALSE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNULL VARCHAR2 Sad Path 2'; + wt_assert.g_testcase := 'ISNULL VARCHAR2 Sad Path 2'; wtplsql_skip_save := TRUE; begin isnull ( @@ -2150,12 +2147,12 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNULL BOOLEAN Happy Path 1'; + wt_assert.g_testcase := 'ISNULL BOOLEAN Happy Path 1'; isnull ( msg_in => 'Run Test', check_this_in => temp_bool); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNULL BOOLEAN Sad Path 1'; + wt_assert.g_testcase := 'ISNULL BOOLEAN Sad Path 1'; wtplsql_skip_save := TRUE; isnull ( msg_in => 'Not Used', @@ -2166,7 +2163,7 @@ $THEN check_this_in => g_rec.last_pass, against_this_in => FALSE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNULL BOOLEAN Sad Path 2'; + wt_assert.g_testcase := 'ISNULL BOOLEAN Sad Path 2'; wtplsql_skip_save := TRUE; begin isnull ( @@ -2188,7 +2185,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNULL CLOB Happy Path 1'; + wt_assert.g_testcase := 'ISNULL CLOB Happy Path 1'; isnull ( msg_in => 'Run Test', check_this_in => cast (null as CLOB)); @@ -2212,7 +2209,7 @@ $THEN check_this_in => temp_rec.last_details, against_this_in => 'Expected NULL and got ""'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNULL CLOB Sad Path 1'; + wt_assert.g_testcase := 'ISNULL CLOB Sad Path 1'; wtplsql_skip_save := TRUE; isnull ( msg_in => 'Not Used', @@ -2223,7 +2220,7 @@ $THEN check_this_in => g_rec.last_pass, against_this_in => FALSE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNULL CLOB Sad Path 2'; + wt_assert.g_testcase := 'ISNULL CLOB Sad Path 2'; wtplsql_skip_save := TRUE; begin isnull ( @@ -2245,7 +2242,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNULL BLOB Happy Path 1'; + wt_assert.g_testcase := 'ISNULL BLOB Happy Path 1'; isnull ( msg_in => 'Run Test', check_this_in => cast (null as BLOB)); @@ -2269,7 +2266,7 @@ $THEN check_this_in => temp_rec.last_details, against_this_in => 'BLOB is NULL'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNULL BLOB Sad Path 1'; + wt_assert.g_testcase := 'ISNULL BLOB Sad Path 1'; wtplsql_skip_save := TRUE; isnull ( msg_in => 'Not Used', @@ -2280,7 +2277,7 @@ $THEN check_this_in => g_rec.last_pass, against_this_in => FALSE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'ISNULL BLOB Sad Path 2'; + wt_assert.g_testcase := 'ISNULL BLOB Sad Path 2'; wtplsql_skip_save := TRUE; begin isnull ( @@ -2411,7 +2408,7 @@ $THEN is begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'Raises Tests Happy Path 1'; + wt_assert.g_testcase := 'Raises Tests Happy Path 1'; raises ( msg_in => 'RAISES Varchar2 Test', check_call_in => 'begin wt_assert.bogus; end;', @@ -2441,7 +2438,7 @@ $THEN 'PL/SQL: Statement ignored". ' || 'Exception raised by: "begin wt_assert.bogus; end;".'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'Raises Tests Happy Path 2'; + wt_assert.g_testcase := 'Raises Tests Happy Path 2'; raises ( msg_in => 'RAISES Number Test', check_call_in => 'begin wt_assert.bogus; end;', @@ -2490,7 +2487,7 @@ $THEN 'PL/SQL: Statement ignored". ' || 'Exception raised by: "begin wt_assert.bogus; end;".'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'Raises Tests Happy Path 3'; + wt_assert.g_testcase := 'Raises Tests Happy Path 3'; raises ( msg_in => 'RAISES Varchar2 No Error', check_call_in => 'begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;', @@ -2515,7 +2512,7 @@ $THEN 'Exception raised was "". ' || 'Exception raised by: "begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;".'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'Raises Tests Sad Path 1'; + wt_assert.g_testcase := 'Raises Tests Sad Path 1'; wtplsql_skip_save := TRUE; raises ( msg_in => 'Not Used', @@ -2537,7 +2534,7 @@ $THEN 'Expected exception "%Incorrect Exception%". ' || 'Actual exception raised was "ORA-%')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'Raises Tests Sad Path 2'; + wt_assert.g_testcase := 'Raises Tests Sad Path 2'; wtplsql_skip_save := TRUE; raises ( msg_in => 'Not Used', @@ -2720,7 +2717,7 @@ $THEN l_found_exception BOOLEAN; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQQUERYVALUE VARCHAR2 Happy Path 1'; + wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Happy Path 1'; eqqueryvalue ( msg_in => 'Run Test', check_query_in => 'select dummy from DUAL', @@ -2746,14 +2743,14 @@ $THEN check_this_in => temp_rec.last_details, against_this_in => 'Expected "X" and got "X" for Query: select dummy from DUAL'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQQUERYVALUE VARCHAR2 Happy Path 2'; + wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Happy Path 2'; eqqueryvalue ( msg_in => 'Run Test', check_query_in => 'select max(dummy) from DUAL where 0 = 1', against_value_in => '', null_ok_in => true); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQQUERYVALUE VARCHAR2 Sad Path 1'; + wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Sad Path 1'; wtplsql_skip_save := TRUE; eqqueryvalue ( msg_in => 'Not Used', @@ -2766,7 +2763,7 @@ $THEN check_this_in => temp_rec.last_pass, against_this_in => FALSE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQQUERYVALUE VARCHAR2 Sad Path 2'; + wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Sad Path 2'; wtplsql_skip_save := TRUE; begin eqqueryvalue ( @@ -2790,7 +2787,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQQUERYVALUE VARCHAR2 Sad Path 3'; + wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Sad Path 3'; wtplsql_skip_save := TRUE; eqqueryvalue ( msg_in => 'Not Used', @@ -2812,7 +2809,7 @@ $THEN 'Exception raised for Query: Garbage query that won''t work' || CHR(10) || 'ORA-00900: invalid SQL statement%'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQQUERYVALUE XMLTYPE Happy Path 1'; + wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Happy Path 1'; eqqueryvalue ( msg_in => 'Run Test', check_query_in => 'select temp_xml from wt_self_test where id = 1', @@ -2840,7 +2837,7 @@ $THEN check_this_in => (temp_rec.last_details like 'Expected "%')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQQUERYVALUE XMLTYPE Sad Path 1'; + wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Sad Path 1'; wtplsql_skip_save := TRUE; eqqueryvalue ( msg_in => 'Not Used', @@ -2862,7 +2859,7 @@ $THEN 'Expected "' || '2" and got "%')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQQUERYVALUE XMLTYPE Sad Path 2'; + wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Sad Path 2'; wtplsql_skip_save := TRUE; begin eqqueryvalue ( @@ -2886,7 +2883,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQQUERYVALUE XMLTYPE Sad Path 3'; + wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Sad Path 3'; wtplsql_skip_save := TRUE; eqqueryvalue ( msg_in => 'Not Used', @@ -2908,7 +2905,7 @@ $THEN 'Exception raised for Query: Garbage query that won''t work' || CHR(10) || 'ORA-00900: invalid SQL statement%'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQQUERYVALUE CLOB Happy Path 1'; + wt_assert.g_testcase := 'EQQUERYVALUE CLOB Happy Path 1'; eqqueryvalue ( msg_in => 'Run Test', check_query_in => 'select temp_clob from wt_self_test where id = 1', @@ -2937,7 +2934,7 @@ $THEN check_this_in => (temp_rec.last_details like 'Expected "%')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQQUERYVALUE CLOB Happy Path 2'; + wt_assert.g_testcase := 'EQQUERYVALUE CLOB Happy Path 2'; eqqueryvalue ( msg_in => 'Run Test', check_query_in => 'select temp_clob from wt_self_test where 0 = 1', @@ -2945,7 +2942,7 @@ $THEN null_ok_in => true); temp_rec := g_rec; -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQQUERYVALUE CLOB Sad Path 1'; + wt_assert.g_testcase := 'EQQUERYVALUE CLOB Sad Path 1'; wtplsql_skip_save := TRUE; eqqueryvalue ( msg_in => 'Not Used', @@ -2967,7 +2964,7 @@ $THEN 'Expected "This is another clob." and got "' || '%')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQQUERYVALUE CLOB Sad Path 2'; + wt_assert.g_testcase := 'EQQUERYVALUE CLOB Sad Path 2'; wtplsql_skip_save := TRUE; begin eqqueryvalue ( @@ -2991,7 +2988,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQQUERYVALUE CLOB Sad Path 3'; + wt_assert.g_testcase := 'EQQUERYVALUE CLOB Sad Path 3'; wtplsql_skip_save := TRUE; eqqueryvalue ( msg_in => 'Not Used', @@ -3013,7 +3010,7 @@ $THEN 'Exception raised for Query: Garbage query that won''t work' || CHR(10) || 'ORA-00900: invalid SQL statement%'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQQUERYVALUE BLOB Happy Path 1'; + wt_assert.g_testcase := 'EQQUERYVALUE BLOB Happy Path 1'; eqqueryvalue ( msg_in => 'Run Test', check_query_in => 'select temp_blob from wt_self_test where id = 1', @@ -3040,14 +3037,14 @@ $THEN against_this_in => 'DBMS_LOB.COMPARE between BLOB and Query:' || ' select temp_blob from wt_self_test where id = 1, compare_results: 0'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQQUERYVALUE BLOB Happy Path 2'; + wt_assert.g_testcase := 'EQQUERYVALUE BLOB Happy Path 2'; eqqueryvalue ( msg_in => 'Run Test', check_query_in => 'select temp_blob from wt_self_test where 0 = 1', against_value_in => cast (null as BLOB), null_ok_in => true); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQQUERYVALUE BLOB Sad Path 1'; + wt_assert.g_testcase := 'EQQUERYVALUE BLOB Sad Path 1'; wtplsql_skip_save := TRUE; eqqueryvalue ( msg_in => 'Not Used', @@ -3066,7 +3063,7 @@ $THEN against_this_in => 'DBMS_LOB.COMPARE between BLOB and Query: ' || 'select temp_blob from wt_self_test where id = 1, compare_results: -1'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQQUERYVALUE BLOB Sad Path 2'; + wt_assert.g_testcase := 'EQQUERYVALUE BLOB Sad Path 2'; wtplsql_skip_save := TRUE; begin eqqueryvalue ( @@ -3090,7 +3087,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQQUERYVALUE BLOB Sad Path 3'; + wt_assert.g_testcase := 'EQQUERYVALUE BLOB Sad Path 3'; wtplsql_skip_save := TRUE; eqqueryvalue ( msg_in => 'Not Used', @@ -3137,7 +3134,7 @@ $THEN l_found_exception BOOLEAN; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQQUERY Tests Happy Path 1'; + wt_assert.g_testcase := 'EQQUERY Tests Happy Path 1'; wt_assert.eqquery ( msg_in => 'Run Test', check_query_in => 'select * from USER_TABLES', @@ -3165,7 +3162,7 @@ $THEN check_this_in => (temp_rec.last_details like 'Comparison Query: %')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQQUERY Tests Sad Path 1'; + wt_assert.g_testcase := 'EQQUERY Tests Sad Path 1'; wtplsql_skip_save := TRUE; eqquery ( msg_in => 'Not Used', @@ -3186,7 +3183,7 @@ $THEN check_this_in => (temp_rec.last_details like 'Comparison Query: %')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQQUERY Tests Sad Path 2'; + wt_assert.g_testcase := 'EQQUERY Tests Sad Path 2'; wtplsql_skip_save := TRUE; begin eqquery ( @@ -3210,7 +3207,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQQUERY Tests Sad Path 3'; + wt_assert.g_testcase := 'EQQUERY Tests Sad Path 3'; wtplsql_skip_save := TRUE; eqquery ( msg_in => 'Not Used', @@ -3268,7 +3265,7 @@ $THEN l_found_exception BOOLEAN; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQTABLE Tests Happy Path 1'; + wt_assert.g_testcase := 'EQTABLE Tests Happy Path 1'; wt_assert.eqtable ( msg_in => 'Run Test', check_this_in => 'USER_TABLES', @@ -3298,7 +3295,7 @@ $THEN check_this_in => (temp_rec.last_details like 'Comparison Query: %')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQTABLE Tests Happy Path 2'; + wt_assert.g_testcase := 'EQTABLE Tests Happy Path 2'; eqtable ( msg_in => 'Run Test', check_this_in => 'ALL_TABLES', @@ -3306,7 +3303,7 @@ $THEN check_where_in => 'owner = ''' || USER || '''', against_where_in => 'owner = ''' || USER || ''''); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQTABLE Sad Path 1'; + wt_assert.g_testcase := 'EQTABLE Sad Path 1'; wtplsql_skip_save := TRUE; eqtable ( msg_in => 'Not Used', @@ -3329,7 +3326,7 @@ $THEN check_this_in => (temp_rec.last_details like 'Comparison Query: %')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQTABLE Sad Path 2'; + wt_assert.g_testcase := 'EQTABLE Sad Path 2'; wtplsql_skip_save := TRUE; begin eqtable ( @@ -3355,7 +3352,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQTABLE Sad Path 3'; + wt_assert.g_testcase := 'EQTABLE Sad Path 3'; wtplsql_skip_save := TRUE; eqtable ( msg_in => 'Not Used', @@ -3446,7 +3443,7 @@ $THEN l_found_exception BOOLEAN; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQTABCOUNT Tests Happy Path 1'; + wt_assert.g_testcase := 'EQTABCOUNT Tests Happy Path 1'; eqtabcount ( msg_in => 'Run Test', check_this_in => 'ALL_TABLES', @@ -3477,7 +3474,7 @@ $THEN 'Expected % rows from "ALL_TABLES"' || ' and got % rows from "ALL_TABLES"')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQTABCOUNT Tests Happy Path 2'; + wt_assert.g_testcase := 'EQTABCOUNT Tests Happy Path 2'; eqtabcount ( msg_in => 'Run Test', check_this_in => 'ALL_TABLES', @@ -3485,7 +3482,7 @@ $THEN check_where_in => 'owner = ''' || USER || '''', against_where_in => ''); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQTABCOUNT Sad Path 1'; + wt_assert.g_testcase := 'EQTABCOUNT Sad Path 1'; wtplsql_skip_save := TRUE; eqtabcount ( msg_in => 'Not Used', @@ -3509,7 +3506,7 @@ $THEN 'Expected % rows from "ALL_TABLES" and ' || 'got % rows from "ALL_TABLES"')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQTABCOUNT Sad Path 2'; + wt_assert.g_testcase := 'EQTABCOUNT Sad Path 2'; wtplsql_skip_save := TRUE; begin eqtabcount ( @@ -3535,7 +3532,7 @@ $THEN check_this_in => l_found_exception, against_this_in => TRUE); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQTABCOUNT Sad Path 3'; + wt_assert.g_testcase := 'EQTABCOUNT Sad Path 3'; wtplsql_skip_save := TRUE; eqtabcount ( msg_in => 'Not Used', @@ -3556,7 +3553,7 @@ $THEN check_this_in => (temp_rec.last_details like 'Expected % rows from "USER_TAB_COLUMNS" and got % rows from "USER_TABLES"')); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'EQTABCOUNT Sad Path 4'; + wt_assert.g_testcase := 'EQTABCOUNT Sad Path 4'; wtplsql_skip_save := TRUE; eqtabcount ( msg_in => 'Not Used', @@ -3637,7 +3634,7 @@ $THEN l_found_exception BOOLEAN; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'OBJEXISTS Happy Path 1'; + wt_assert.g_testcase := 'OBJEXISTS Happy Path 1'; objexists ( msg_in => 'Run Test', obj_owner_in => 'SYS', @@ -3662,24 +3659,24 @@ $THEN check_this_in => temp_rec.last_details, against_this_in => 'Number of objects found for "SYS.DUAL" is 1'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'OBJEXISTS Happy Path 2'; + wt_assert.g_testcase := 'OBJEXISTS Happy Path 2'; objexists ( msg_in => 'Run Test', obj_owner_in => 'SYS', obj_name_in => 'DUAL', obj_type_in => 'TABLE'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'OBJEXISTS Happy Path 3'; + wt_assert.g_testcase := 'OBJEXISTS Happy Path 3'; objexists ( msg_in => 'Run Test', check_this_in => 'SYS.DUAL'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'OBJEXISTS Happy Path 4'; + wt_assert.g_testcase := 'OBJEXISTS Happy Path 4'; objexists ( msg_in => 'Run Test', check_this_in => 'DUAL'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'OBJEXISTS Sad Path 1'; + wt_assert.g_testcase := 'OBJEXISTS Sad Path 1'; wtplsql_skip_save := TRUE; objexists ( msg_in => 'Not Used', @@ -3697,7 +3694,7 @@ $THEN check_this_in => temp_rec.last_details, against_this_in => 'Number of objects found for "JOE SMITH.BOGUS" is 0'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'OBJEXISTS Sad Path 2'; + wt_assert.g_testcase := 'OBJEXISTS Sad Path 2'; wtplsql_skip_save := TRUE; begin objexists ( @@ -3776,7 +3773,7 @@ $THEN l_found_exception BOOLEAN; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'OBJNOTEXISTS Happy Path 1'; + wt_assert.g_testcase := 'OBJNOTEXISTS Happy Path 1'; objnotexists ( msg_in => 'Run Test', obj_owner_in => 'BOGUS', @@ -3801,19 +3798,19 @@ $THEN check_this_in => temp_rec.last_details, against_this_in => 'Number of objects found for "BOGUS.THING123" is 0'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'OBJNOTEXISTS Happy Path 2'; + wt_assert.g_testcase := 'OBJNOTEXISTS Happy Path 2'; objnotexists ( msg_in => 'Run Test', obj_owner_in => 'BOGUS', obj_name_in => 'THING123', obj_type_in => 'PACKAGE'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'OBJNOTEXISTS Happy Path 3'; + wt_assert.g_testcase := 'OBJNOTEXISTS Happy Path 3'; objnotexists ( msg_in => 'Run Test', check_this_in => 'BOGUS.THING123'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'OBJNOTEXISTS Sad Path 1'; + wt_assert.g_testcase := 'OBJNOTEXISTS Sad Path 1'; wtplsql_skip_save := TRUE; objnotexists ( msg_in => 'Not Used', @@ -3831,7 +3828,7 @@ $THEN check_this_in => temp_rec.last_details, against_this_in => 'Number of objects found for "SYS.DUAL" is 1'); -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'OBJNOTEXISTS Sad Path 2'; + wt_assert.g_testcase := 'OBJNOTEXISTS Sad Path 2'; wtplsql_skip_save := TRUE; begin objnotexists ( @@ -3863,9 +3860,11 @@ $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN -- Can't profile this package because all the "assert" tests -- pause profiling before they execute. - procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_ASSERT:PACKAGE BODY" %-- + procedure WTPLSQL_RUN is begin + wtplsql.g_DBOUT := 'WT_ASSERT:PACKAGE BODY'; + hook.t_run_assert_hook := FALSE; select temp_clob, temp_nclob, temp_xml, temp_blob into temp_clob1, temp_nclob1, temp_xml1, temp_blob1 from wt_self_test where id = 1; @@ -3878,9 +3877,9 @@ $THEN t_reset_globals; t_this; t_eq; + -------------------------------------- WTPLSQL Testing -- t_isnotnull; t_isnull; - -------------------------------------- WTPLSQL Testing -- t_raises; t_eqqueryvalue; t_eqquery; @@ -3888,10 +3887,11 @@ $THEN t_eqtabcount; t_object_exists; t_object_not_exists; + -------------------------------------- WTPLSQL Testing -- + hook.t_run_assert_hook := TRUE; end WTPLSQL_RUN; $END ----------------%WTPLSQL_end_ignore_lines%---------------- --==============================================================-- end wt_assert; -/ diff --git a/src/core/wt_assert.pks b/src/core/wt_assert.pks index 7fdfd8c..4a31ee9 100644 --- a/src/core/wt_assert.pks +++ b/src/core/wt_assert.pks @@ -6,35 +6,32 @@ is ASSERT_FAILURE_EXCEPTION exception; PRAGMA EXCEPTION_INIT(ASSERT_FAILURE_EXCEPTION, -20003); - C_PASS CONSTANT varchar2(10) := 'PASS'; - C_FAIL CONSTANT varchar2(10) := 'FAIL'; - -- See RESET_GLOBALS procedure for default global values -- Testcase name for a series of assertions. -- Modify as required - g_testcase_name wt_testcases.name%TYPE; + g_testcase core_data.long_name; -- See RESET_GLOBALS procedure for default global values TYPE g_rec_type is record (last_pass boolean ,raise_exception boolean - ,last_assert wt_results.assertion%TYPE - ,last_msg wt_results.message%TYPE - ,last_details wt_results.details%TYPE); + ,last_assert varchar2(15) + ,last_msg varchar2(200) + ,last_details varchar2(4000)); g_rec g_rec_type; function last_pass return boolean; function last_assert - return wt_results.assertion%TYPE; + return varchar2; function last_msg - return wt_results.message%TYPE; + return varchar2; function last_details - return wt_results.details%TYPE; + return varchar2; procedure reset_globals; diff --git a/src/core/wt_dbout_runs_vw.vw b/src/core/wt_dbout_runs_vw.vw deleted file mode 100644 index b544b9b..0000000 --- a/src/core/wt_dbout_runs_vw.vw +++ /dev/null @@ -1,39 +0,0 @@ - --- --- Database Object Under Test Runs Table View Installation --- - -create view wt_dbout_runs_vw as -select tr.dbout_id - ,db.owner DBOUT_OWNER - ,db.name DBOUT_NAME - ,db.type DBOUT_TYPE - ,tr.test_runner_id - ,tnr.owner TEST_RUNNER_OWNER - ,tnr.name TEST_RUNNER_NAME - ,tr.id TEST_RUN_ID - ,tr.is_last_run - ,tr.trigger_offset - ,tr.profiler_runid - ,tr.error_message - from wt_test_runs tr - join wt_dbouts db - on db.id = tr.dbout_id - join wt_test_runners tnr - on tnr.id = tr.test_runner_id; - -comment on table wt_dbout_runs_vw is 'Test Run data for each execution of a Test Runner.'; -comment on column wt_dbout_runs_vw.dbout_id is 'Surrogate Key to the Database Object Under Test (DBOUT).'; -comment on column wt_dbout_runs_vw.dbout_owner is 'Owner of the Database Object Under Test (DBOUT).'; -comment on column wt_dbout_runs_vw.dbout_name is 'Name of the Database Object Under Test (DBOUT).'; -comment on column wt_dbout_runs_vw.dbout_type is 'Type of the Database Object Under Test (DBOUT).'; -comment on column wt_dbout_runs_vw.test_runner_id is 'Surrogate Key the Test Runner package.'; -comment on column wt_dbout_runs_vw.test_runner_owner is 'Owner of the Test Runner package.'; -comment on column wt_dbout_runs_vw.test_runner_name is 'Name of the Test Runner package.'; -comment on column wt_dbout_runs_vw.test_run_id is 'Primary (Surrogate) Key for each Test Run'; -comment on column wt_dbout_runs_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; -comment on column wt_dbout_runs_vw.trigger_offset is 'Calculated offset from start of Trigger Source to start of Trigger PL/SQL Block.'; -comment on column wt_dbout_runs_vw.profiler_runid is 'DBMS_PROFILER unique run identifier from plsql_profiler_runnumber sequence'; -comment on column wt_dbout_runs_vw.error_message is 'Optional Error messages from this Test Run.'; - -grant select on wt_dbout_runs_vw to public; diff --git a/src/core/wt_dbouts.tab b/src/core/wt_dbouts.tab deleted file mode 100644 index a3f2b0a..0000000 --- a/src/core/wt_dbouts.tab +++ /dev/null @@ -1,27 +0,0 @@ - --- --- Test Runs Statistics Table Installation --- - -create sequence wt_dbouts_seq; - -create table wt_dbouts - (id number(38) constraint wt_dbouts_nn1 not null - ,owner varchar2(128) constraint wt_dbouts_nn2 not null - ,name varchar2(128) constraint wt_dbouts_nn3 not null - ,type varchar2(20) constraint wt_dbouts_nn4 not null - ,constraint wt_dbouts_pk primary key (id) - ,constraint wt_dbouts_nk1 unique (owner, name, type) - ) pctfree 0; - -create index wt_dbouts_ix1 - on wt_dbouts (type, owner); - -comment on table wt_dbouts is 'List of Database Objects Under Test (DBOUT).'; -comment on column wt_dbouts.id is 'Primary (Surrogate) Key for each Database Objects Under Test (DBOUT)'; -comment on column wt_dbouts.owner is 'Owner of the Database Object Under Test (DBOUT).'; -comment on column wt_dbouts.name is 'Name of the Database Object Under Test (DBOUT).'; -comment on column wt_dbouts.type is 'Type of the Database Object Under Test (DBOUT).'; - -grant select on wt_dbouts to public; -grant delete on wt_dbouts to public; diff --git a/src/core/wt_execute_test_runner.prc b/src/core/wt_execute_test_runner.prc new file mode 100644 index 0000000..0fc6157 --- /dev/null +++ b/src/core/wt_execute_test_runner.prc @@ -0,0 +1,14 @@ +create or replace procedure wt_execute_test_runner + authid current_user + -- AUTHID CURRENT_USER is required for assertions with + -- dynamic PL/SQL execution. +is + sql_txt varchar2(4000); +begin + sql_txt := 'begin "' || core_data.g_run_rec.runner_owner || + '"."' || core_data.g_run_rec.runner_name || + '".' || wtplsql.C_RUNNER_ENTRY_POINT || '; end;'; + --dbms_output.put_line(sql_txt); + execute immediate sql_txt; +end wt_execute_test_runner; +/ diff --git a/src/core/wt_hook.pkb b/src/core/wt_hook.pkb deleted file mode 100644 index 20831fe..0000000 --- a/src/core/wt_hook.pkb +++ /dev/null @@ -1,147 +0,0 @@ -create or replace package body wt_hook -as - - ----------------------- --- Private Procedures ----------------------- - - ------------------------------------------------------------- -procedure run_hooks - (in_hook_name in varchar2) -is -begin - for i in 1 .. run_aa(in_hook_name).COUNT - loop - execute immediate run_aa(in_hook_name)(i); - end loop; -end run_hooks; - - ---------------------- --- Public Procedures ---------------------- - - ------------------------------------------------------------- -procedure before_test_all -is -begin - if before_test_all_active - then - run_hooks('before_test_all'); - end if; -end before_test_all; - ------------------------------------------------------------- -procedure before_run_init -is -begin - if before_run_init_active - then - run_hooks('before_run_init'); - end if; -end before_run_init; - ------------------------------------------------------------- -procedure after_run_init -is -begin - if after_run_init_active - then - run_hooks('after_run_init'); - end if; -end after_run_init; - ------------------------------------------------------------- -procedure after_assertion -is -begin - if after_assertion_active - then - run_hooks('after_assertion'); - end if; -end after_assertion; - ------------------------------------------------------------- -procedure before_run_final -is -begin - if before_run_final_active - then - run_hooks('before_run_final'); - end if; -end before_run_final; - ------------------------------------------------------------- -procedure after_run_final -is -begin - if after_run_final_active - then - run_hooks('after_run_final'); - end if; -end after_run_final; - ------------------------------------------------------------- -procedure after_test_all -is -begin - if after_test_all_active - then - run_hooks('after_test_all'); - end if; -end after_test_all; - ------------------------------------------------------------- -procedure before_delete_runs -is -begin - if before_delete_runs_active - then - run_hooks('before_delete_runs'); - end if; -end before_delete_runs; - ------------------------------------------------------------- -procedure after_delete_runs -is -begin - if after_delete_runs_active - then - run_hooks('after_delete_runs'); - end if; -end after_delete_runs; - ------------------------------------------------------------- - -begin - - for buff in ( - select hook_name - from wt_hooks - group by hook_name ) - loop - select run_string bulk collect into run_nt - from wt_hooks - where hook_name = buff.hook_name - order by wt_hooks.seq; - if SQL%FOUND - then - run_aa(buff.hook_name) := run_nt; - case buff.hook_name - when 'before_test_all' then before_test_all_active := TRUE; - when 'before_run_init' then before_run_init_active := TRUE; - when 'after_run_init' then after_run_init_active := TRUE; - when 'after_assertion' then after_assertion_active := TRUE; - when 'before_run_final' then before_run_final_active := TRUE; - when 'after_run_final' then after_run_final_active := TRUE; - when 'after_test_all' then after_test_all_active := TRUE; - when 'before_delete_runs' then before_delete_runs_active := TRUE; - when 'after_delete_runs' then after_delete_runs_active := TRUE; - end case; - end if; - end loop; - -end wt_hook; diff --git a/src/core/wt_hook.pks b/src/core/wt_hook.pks deleted file mode 100644 index e478417..0000000 --- a/src/core/wt_hook.pks +++ /dev/null @@ -1,33 +0,0 @@ -create or replace package wt_hook - authid definer -as - - TYPE run_nt_type is table - of varchar2(4000); - run_nt run_nt_type; - TYPE run_aa_type is table - of run_nt_type - index by varchar2(20); - run_aa run_aa_type; - - before_test_all_active boolean := FALSE; - before_run_init_active boolean := FALSE; - after_run_init_active boolean := FALSE; - after_assertion_active boolean := FALSE; - before_run_final_active boolean := FALSE; - after_run_final_active boolean := FALSE; - after_test_all_active boolean := FALSE; - before_delete_runs_active boolean := FALSE; - after_delete_runs_active boolean := FALSE; - - procedure before_test_all; - procedure before_run_init; - procedure after_run_init; - procedure after_assertion; - procedure before_run_final; - procedure after_run_final; - procedure after_test_all; - procedure before_delete_runs; - procedure after_delete_runs; - -end wt_hook; diff --git a/src/core/wt_hooks.tab b/src/core/wt_hooks.tab deleted file mode 100644 index 77a004a..0000000 --- a/src/core/wt_hooks.tab +++ /dev/null @@ -1,30 +0,0 @@ - --- --- wtPLSQL Hooks Table Installation --- - -create table wt_hooks - (hook_name varchar2(20) constraint wt_hooks_nn1 not null - ,seq number(2) constraint wt_hooks_nn2 not null - ,run_string varchar2(4000) constraint wt_hooks_nn3 not null - ,description varchar2(1000) - ,constraint wt_hooks_pk primary key (hook_name, seq) - ,constraint wt_hooks_ck1 check (hook_name in ('before_test_all' - ,'before_run_init' - ,'after_run_init' - ,'after_assertion' - ,'before_run_final' - ,'after_run_final' - ,'after_test_all' - ,'before_delete_runs' - ,'after_delete_runs')) - ,constraint wt_hooks_ck2 check (seq > 0) - ); - -comment on table wt_hooks is 'wtPLSQL Hooks.'; -comment on column wt_hooks.hook_name is 'Primary Key for each Hook Name'; -comment on column wt_hooks.seq is 'Primary Key for the sequence of the Hook'; -comment on column wt_hooks.run_string is 'Procedure Name or Un-named PL/SQL Block for EXECUTE IMMEDIATE'; -comment on column wt_hooks.description is 'Description of this Hook.'; - -grant select on wt_hooks to public; diff --git a/src/core/wt_profile.pkb b/src/core/wt_profile.pkb deleted file mode 100644 index a03d038..0000000 --- a/src/core/wt_profile.pkb +++ /dev/null @@ -1,1988 +0,0 @@ -create or replace package body wt_profile -as - - $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ - g_current_user varchar2(30); - g_skip_insert boolean := FALSE; - g_skip_add boolean := FALSE; - $END ----------------%WTPLSQL_end_ignore_lines%---------------- - ----------------------- --- Private Procedures ----------------------- - - ---==============================================================-- -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - - procedure tl_compile_db_object - (in_ptype in varchar2 - ,in_pname in varchar2 - ,in_source in varchar2) - is - l_sql_txt varchar2(4000); - l_errtxt varchar2(32000) := ''; - begin - -------------------------------------- WTPLSQL Testing -- - -- Wrap in_source to complete the DDL statement - l_sql_txt := 'create or replace ' || in_ptype || ' ' || - in_pname || ' is' || CHR(10) || - in_source || CHR(10) || - 'end ' || in_pname || ';'; - wt_assert.raises - (msg_in => 'Compile ' || in_ptype || ' ' || in_pname - ,check_call_in => l_sql_txt - ,against_exc_in => ''); - -------------------------------------- WTPLSQL Testing -- - for buff in (select * from user_errors - where attribute = 'ERROR' - and name = in_pname - and type = in_ptype - order by sequence) - loop - l_errtxt := l_errtxt || buff.line || ', ' || - buff.position || ': ' || buff.text || CHR(10); - end loop; - wt_assert.isnull - (msg_in => 'Compile ' || in_ptype || ' ' || in_pname || - ' Error' - ,check_this_in => l_errtxt); - -------------------------------------- WTPLSQL Testing -- - wt_assert.objexists ( - msg_in => in_pname || ' ' || in_ptype, - obj_owner_in => g_current_user, - obj_name_in => upper(in_pname), - obj_type_in => upper(in_ptype)); - end tl_compile_db_object; ---==============================================================-- - -------------------------------------- WTPLSQL Testing -- - procedure tl_drop_db_object - (in_pname in varchar2, - in_ptype in varchar2) - is - l_sql_txt varchar2(4000); - begin - -------------------------------------- WTPLSQL Testing -- - l_sql_txt := 'drop ' || in_ptype || ' ' || in_pname; - wt_assert.raises - (msg_in => 'drop ' || in_ptype || ' ' || in_pname - ,check_call_in => l_sql_txt - ,against_exc_in => ''); - wt_assert.objnotexists ( - msg_in => in_pname || ' ' || in_ptype, - obj_owner_in => g_current_user, - obj_name_in => upper(in_pname), - obj_type_in => upper(in_ptype)); - end tl_drop_db_object; ---==============================================================-- - -------------------------------------- WTPLSQL Testing -- - procedure tl_count_plsql_profiler_recs - (in_test_run_id in number - ,in_expected_count in number) - is - begin - -------------------------------------- WTPLSQL Testing -- - wt_assert.eqqueryvalue - (msg_in => 'Number of plsql_profiler_runs (' || in_test_run_id || ')' - ,check_query_in => 'select count(*) from plsql_profiler_runs' || - ' where runid = ' || in_test_run_id - ,against_value_in => in_expected_count); - wt_assert.eqqueryvalue - (msg_in => 'Number of plsql_profiler_units (' || in_test_run_id || ')' - ,check_query_in => 'select count(*) from plsql_profiler_units' || - ' where runid = ' || in_test_run_id - ,against_value_in => in_expected_count); - -------------------------------------- WTPLSQL Testing -- - wt_assert.eqqueryvalue - (msg_in => 'Number of plsql_profiler_data (' || in_test_run_id || ')' - ,check_query_in => 'select count(*) from plsql_profiler_data' || - ' where runid = ' || in_test_run_id - ,against_value_in => in_expected_count); - end tl_count_plsql_profiler_recs; ---==============================================================-- - -------------------------------------- WTPLSQL Testing -- - procedure tl_insert_plsql_profiler_recs - (in_test_run_id in number) - is - l_sql_txt varchar2(4000); - begin - -------------------------------------- WTPLSQL Testing -- - l_sql_txt := 'insert into plsql_profiler_runs (runid)' || - ' values (' || in_test_run_id || ')'; - wt_assert.raises ( - msg_in => 'insert plsql_profiler_runs (' || in_test_run_id || ')', - check_call_in => l_sql_txt, - against_exc_in => ''); - -------------------------------------- WTPLSQL Testing -- - l_sql_txt := 'insert into plsql_profiler_units (runid, unit_number, total_time)' || - ' values (' || in_test_run_id || ', ' || in_test_run_id || ', 0)'; - wt_assert.raises ( - msg_in => 'insert plsql_profiler_units (' || in_test_run_id || ')', - check_call_in => l_sql_txt, - against_exc_in => ''); - -------------------------------------- WTPLSQL Testing -- - l_sql_txt := 'insert into plsql_profiler_data (runid, unit_number, line#)' || - ' values (' || in_test_run_id || ', ' || in_test_run_id || ', 0)'; - wt_assert.raises ( - msg_in => 'insert plsql_profiler_data (RUNID: ' || in_test_run_id || ')', - check_call_in => l_sql_txt, - against_exc_in => ''); - commit; - end tl_insert_plsql_profiler_recs; ---==============================================================-- - -------------------------------------- WTPLSQL Testing -- - procedure tl_delete_plsql_profiler_recs - (in_test_run_id in number) - is - l_sql_txt varchar2(4000); - begin - -------------------------------------- WTPLSQL Testing -- - l_sql_txt := 'delete from plsql_profiler_data' || - ' where runid = ' || in_test_run_id; - wt_assert.raises ( - msg_in => 'delete plsql_profiler_data (' || in_test_run_id || ')', - check_call_in => l_sql_txt, - against_exc_in => ''); - -------------------------------------- WTPLSQL Testing -- - l_sql_txt := 'delete from plsql_profiler_units' || - ' where runid = ' || in_test_run_id; - wt_assert.raises ( - msg_in => 'delete plsql_profiler_units (' || in_test_run_id || ')', - check_call_in => l_sql_txt, - against_exc_in => ''); - -------------------------------------- WTPLSQL Testing -- - l_sql_txt := 'delete from plsql_profiler_runs' || - ' where runid = ' || in_test_run_id; - wt_assert.raises ( - msg_in => 'delete plsql_profiler_runs (' || in_test_run_id || ')', - check_call_in => l_sql_txt, - against_exc_in => ''); - commit; - end tl_delete_plsql_profiler_recs; ---==============================================================-- - -------------------------------------- WTPLSQL Testing -- - procedure tl_insert_test_runs - (in_test_run_id in NUMBER - ,in_runner_name in varchar2) - is - l_sql_txt varchar2(4000); - begin - -------------------------------------- WTPLSQL Testing -- - l_sql_txt := 'insert into wt_test_runs' || - ' (id, start_dtm, runner_owner, runner_name)' || - ' values (' || in_test_run_id || ', sysdate, ''' || - g_current_user || ''', ''' || - in_runner_name || ''')'; - wt_assert.raises ( - msg_in => 'Insert wt_test_runs (' || in_test_run_id || ')', - check_call_in => l_sql_txt, - against_exc_in => ''); - wt_assert.eqqueryvalue ( - msg_in => 'wt_test_runs (' || in_test_run_id || ') Count', - check_query_in => 'select count(*) from wt_test_runs' || - ' where id = ' || in_test_run_id, - against_value_in => 1); - commit; - end tl_insert_test_runs; ---==============================================================-- - -------------------------------------- WTPLSQL Testing -- - procedure tl_delete_test_runs - (in_test_run_id in NUMBER) - is - l_sql_txt varchar2(4000); - begin - -------------------------------------- WTPLSQL Testing -- - l_sql_txt := 'delete from wt_test_runs where id = ' || in_test_run_id; - wt_assert.raises ( - msg_in => 'Delete wt_test_runs (' || in_test_run_id || ')', - check_call_in => l_sql_txt, - against_exc_in => ''); - wt_assert.eqqueryvalue ( - msg_in => 'wt_test_runs (' || in_test_run_id || ') Count', - check_query_in => 'select count(*) from wt_test_runs' || - ' where id = ' || in_test_run_id, - against_value_in => 0); - commit; - end tl_delete_test_runs; ---==============================================================-- - -------------------------------------- WTPLSQL Testing -- - procedure tl_insert_dbout_profiles - (in_rec in wt_dbout_profiles%ROWTYPE) - is - l_sqlerrm varchar2(4000); - begin - -------------------------------------- WTPLSQL Testing -- - begin - insert into wt_dbout_profiles values in_rec; - l_sqlerrm := SQLERRM; - commit; - exception when others then - l_sqlerrm := SQLERRM; - end; - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq ( - msg_in => 'Insert wt_dbout_profiles (' || in_rec.test_run_id || - ',' || in_rec.line || ')', - check_this_in => l_sqlerrm, - against_this_in => 'ORA-0000: normal, successful completion'); - wt_assert.eqqueryvalue ( - msg_in => 'wt_dbout_profiles (' || in_rec.test_run_id || - ',' || in_rec.line || ') Count', - check_query_in => 'select count(*) from wt_dbout_profiles' || - ' where test_run_id = ' || in_rec.test_run_id || - ' and line = ' || in_rec.line, - against_value_in => 1); - end tl_insert_dbout_profiles; ---==============================================================-- - -------------------------------------- WTPLSQL Testing -- - procedure tl_delete_dbout_profiles - (in_test_run_id in NUMBER) - is - l_sql_txt varchar2(4000); - begin - -------------------------------------- WTPLSQL Testing -- - l_sql_txt := 'delete from wt_dbout_profiles where test_run_id = ' || - in_test_run_id; - wt_assert.raises ( - msg_in => 'Delete wt_dbout_profiles (' || in_test_run_id || ')', - check_call_in => l_sql_txt, - against_exc_in => ''); - wt_assert.eqqueryvalue ( - msg_in => 'wt_dbout_profiles (' || in_test_run_id || ') Count', - check_query_in => 'select count(*) from wt_dbout_profiles' || - ' where test_run_id = ' || in_test_run_id, - against_value_in => 0); - commit; - end tl_delete_dbout_profiles; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- ---==============================================================-- - - ------------------------------------------------------------- --- Return DBMS_PROFILER specific error messages -function get_error_msg - (retnum_in in binary_integer) - return varchar2 -is - l_msg_prefix varchar2(50) := 'DBMS_PROFILER Error: '; -begin - case retnum_in - when dbms_profiler.error_param then return l_msg_prefix || - 'A subprogram was called with an incorrect parameter.'; - when dbms_profiler.error_io then return l_msg_prefix || - 'Data flush operation failed.' || - ' Check whether the profiler tables have been created,' || - ' are accessible, and that there is adequate space.'; - when dbms_profiler.error_version then return l_msg_prefix || - 'There is a mismatch between package and database implementation.' || - ' Oracle returns this error if an incorrect version of the' || - ' DBMS_PROFILER package is installed, and if the version of the' || - ' profiler package cannot work with this database version.'; - else return l_msg_prefix || - 'Unknown error number ' || retnum_in; - end case; -end get_error_msg; - -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure t_get_error_msg - is - begin - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Get Error Messages'; - wt_assert.isnotnull ( - msg_in => 'ERROR_PARAM Test 1', - check_this_in => get_error_msg(dbms_profiler.error_param)); - wt_assert.this ( - msg_in => 'ERROR_PARAM Test 2', - check_this_in => regexp_like(get_error_msg(dbms_profiler.error_param) - ,'incorrect parameter','i')); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnotnull ( - msg_in => 'ERROR_IO Test 1', - check_this_in => get_error_msg(dbms_profiler.error_io)); - wt_assert.this ( - msg_in => 'ERROR_IO Test 2', - check_this_in => regexp_like(get_error_msg(dbms_profiler.error_io) - ,'Data flush operation','i')); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnotnull ( - msg_in => 'ERROR_VERSION Test 1', - check_this_in => get_error_msg(dbms_profiler.error_version)); - wt_assert.this ( - msg_in => 'ERROR_VERSION Test 2', - check_this_in => regexp_like(get_error_msg(dbms_profiler.error_version) - ,'incorrect version','i')); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnotnull ( - msg_in => 'Unknown Error Test 1', - check_this_in => get_error_msg(-9999)); - wt_assert.this ( - msg_in => 'Unknown Error Test 2', - check_this_in => regexp_like(get_error_msg(-9999) - ,'Unknown error','i')); - end t_get_error_msg; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- - - ------------------------------------------------------------- -procedure delete_plsql_profiler_recs - (in_profiler_runid in number) -is -begin - delete from plsql_profiler_data - where runid = in_profiler_runid; - delete from plsql_profiler_units - where runid = in_profiler_runid; - delete from plsql_profiler_runs - where runid = in_profiler_runid; -end delete_plsql_profiler_recs; - -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure t_delete_profiler_recs - is - c_test_run_id constant number := -99; - l_err_stack varchar2(32000); - begin - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Delete PL/SQL Profiler Records Happy Path 1'; - begin - delete_plsql_profiler_recs(c_test_run_id); -- Should run without error - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - exception when others then - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - end; - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull ( - msg_in => 'delete_plsql_profiler_recs(' || c_test_run_id || ') 1', - check_this_in => l_err_stack); - tl_count_plsql_profiler_recs(c_test_run_id, 0); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Delete PL/SQL Profiler Records Happy Path 2'; - tl_insert_plsql_profiler_recs(c_test_run_id); - tl_count_plsql_profiler_recs(c_test_run_id, 1); - begin - delete_plsql_profiler_recs(c_test_run_id); -- Should run without error - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - exception when others then - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - end; - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull ( - msg_in => 'delete_plsql_profiler_recs(' || c_test_run_id || ') 2', - check_this_in => l_err_stack); - tl_count_plsql_profiler_recs(c_test_run_id, 0); - end t_delete_profiler_recs; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- - - ------------------------------------------------------------- -procedure find_dbout - (in_owner in varchar2 - ,in_pkg_name in varchar2) -is - -- - -- https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements008.htm#SQLRF51129 - -- Within a namespace, no two objects can have the same name. The following - -- schema objects share one namespace: - -- -) Packages - -- -) Private synonyms - -- -) Sequences - -- -) Stand-alone procedures - -- -) Stand-alone stored functions - -- -) User-defined operators - -- -) User-defined types - -- -) Tables - -- -) Views - -- Each of the following schema objects has its own namespace: - -- -) Clusters - -- -) Constraints - -- -) Database triggers - -- -) Dimensions - -- -) Indexes - -- -) Materialized views (When you create a materialized view, the database - -- creates an internal table of the same name. This table has the same - -- namespace as the other tables in the schema. Therefore, a schema - -- cannot contain a table and a materialized view of the same name.) - -- -) Private database links - -- Because tables and sequences are in the same namespace, a table and a - -- sequence in the same schema cannot have the same name. However, tables - -- and indexes are in different namespaces. Therefore, a table and an index - -- in the same schema can have the same name. - -- Each schema in the database has its own namespaces for the objects it - -- contains. This means, for example, that two tables in different schemas - -- are in different namespaces and can have the same name. - -- Results are unknown if a Database Object Under Test has the same name in - -- different namespaces. - -- - -- Head Regular Expression is - -- '--% WTPLSQL SET DBOUT "' - literal string - -- Main Regular Expression is - -- '[[:alnum:] ._$#:]' - Any alpha, numeric, " ", ".", "_", "$", "#", or ":" character - -- + - One or more of the previous characters - -- Tail Regular Expression is - -- '" %--' - literal string - C_HEAD_RE CONSTANT varchar2(30) := '--% WTPLSQL SET DBOUT "'; - C_MAIN_RE CONSTANT varchar2(30) := '[[:alnum:] ._$#:]+'; - C_TAIL_RE CONSTANT varchar2(30) := '" %--'; - -- This cursor is used to catch the first occurance of a DBOUT annotation - cursor c_annotation is - select regexp_substr(src.text, C_HEAD_RE||C_MAIN_RE||C_TAIL_RE) TEXT - from dba_source src - where src.owner = in_owner - and src.name = in_pkg_name - and src.type = 'PACKAGE BODY' - and regexp_like(src.text, C_HEAD_RE||C_MAIN_RE||C_TAIL_RE) - order by src.line; - l_target varchar2(32000); - -- This cursor is used to confirm the PL/SQL source is readable - cursor c_readable is - select * - from dba_source src - where src.owner = g_rec.dbout_owner - and src.name = g_rec.dbout_name - and src.type = g_rec.dbout_type; - b_readable c_readable%ROWTYPE; - -- These hold the positions of the separators dot (.) and colon (:) - l_dot_pos number; - l_cln_pos number; -begin - -- Find the first occurance of the DBOUT annotation - open c_annotation; - fetch c_annotation into l_target; - if c_annotation%NOTFOUND - then - -- No annotation was found, close and end - close c_annotation; - return; - end if; - close c_annotation; - -- Strip the Head Sub-String - l_target := regexp_replace(SRCSTR => l_target - ,PATTERN => '^' || C_HEAD_RE - ,REPLACESTR => '' - ,POSITION => 1 - ,OCCURRENCE => 1); - -- Strip the Tail Sub-String - l_target := regexp_replace(SRCSTR => l_target - ,PATTERN => C_TAIL_RE || '$' - ,REPLACESTR => '' - ,POSITION => 1 - ,OCCURRENCE => 1); - -- Locate the Owner/Name separator - l_dot_pos := instr(l_target,'.'); - l_cln_pos := instr(l_target,':'); - begin - with q_main as ( - select obj.owner - ,obj.object_name - ,obj.object_type - from dba_objects obj - where obj.owner = in_owner - and ( ( -- No separators were given, assume USER is the owner. - -- No object type was given. This could throw TOO_MANY_ROWS. - l_dot_pos = 0 - and l_cln_pos = 0 - and obj.object_name = l_target ) - OR ( -- No object owner was given, assume USER is the owner. - l_dot_pos = 0 - and l_cln_pos != 0 - and obj.object_name = substr(l_target, 1, l_cln_pos-1) - and obj.object_type = substr(l_target, l_cln_pos+1, 512) ) ) - UNION ALL - select obj.owner - ,obj.object_name - ,obj.object_type - from dba_objects obj - where ( -- No object type was given. This could throw TOO_MANY_ROWS. - l_dot_pos != 0 - and l_cln_pos = 0 - and obj.owner = substr(l_target, 1, l_dot_pos-1) - and obj.object_name = substr(l_target, l_dot_pos+1, 512) ) - OR ( -- All separators were given - l_dot_pos != 0 - and l_cln_pos != 0 - and obj.owner = substr(l_target, 1, l_dot_pos-1) - and obj.object_name = substr(l_target, l_dot_pos+1, l_cln_pos-l_dot_pos-1) - and obj.object_type = substr(l_target, l_cln_pos+1, 512) ) - ) - select owner - ,object_name - ,object_type - into g_rec.dbout_owner - ,g_rec.dbout_name - ,g_rec.dbout_type - from q_main; - exception - when NO_DATA_FOUND - then - g_rec.error_message := 'Unable to find database object "' || - l_target || '".'; - return; - when TOO_MANY_ROWS - then - g_rec.error_message := 'Found too many database objects "' || - l_target || '".'; - return; - end; - -- Find the first occurance of any PL/SQL source - open c_readable; - fetch c_readable into b_readable; - if c_readable%NOTFOUND - then - if g_rec.dbout_type in ('FUNCTION', 'PROCEDURE', 'PACKAGE BODY', - 'TYPE BODY', 'TRIGGER') - then - -- These object types should have PL/SQL source code available - --%WTPLSQL_begin_ignore_lines%-- Untestable: - g_rec.error_message := 'Unable to read source for ' || g_rec.dbout_type || - ' ' || g_rec.dbout_owner || '.' || g_rec.dbout_name ; - --%WTPLSQL_end_ignore_lines%-- - else - g_rec.prof_runid := -1; -- Don't run profiler. - end if; - end if; - close c_readable; - -- -end find_dbout; - -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure t_find_dbout - is - l_recSAVE rec_type; - l_recNULL rec_type; - l_recTEST rec_type; - l_owner varchar2(128); - l_pname varchar2(128) := 'WT_PROFILE_FIND_DBOUT'; - -------------------------------------- WTPLSQL Testing -- - procedure run_find_dbout is begin - l_recSAVE := g_rec; - g_rec := l_recNULL; - find_dbout(l_owner, l_pname); - l_recTEST := g_rec; - g_rec := l_recSAVE; - end run_find_dbout; - begin - select username into l_owner from user_users; - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Find DBOUT Setup'; - tl_compile_db_object - (in_ptype => 'package' - ,in_pname => l_pname - ,in_source => ' l_junk number;' ); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Find DBOUT Happy Path 1'; - tl_compile_db_object - (in_ptype => 'package body' - ,in_pname => l_pname - ,in_source => 'begin' || CHR(10) || - ' l_junk := 1;' ); - run_find_dbout; - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull - (msg_in => 'l_recTEST.dbout_owner' - ,check_this_in => l_recTEST.dbout_owner); - wt_assert.isnull - (msg_in => 'l_recTEST.dbout_name' - ,check_this_in => l_recTEST.dbout_name); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull - (msg_in => 'l_recTEST.dbout_type' - ,check_this_in => l_recTEST.dbout_type); - wt_assert.isnull - (msg_in => 'l_recTEST.error_message' - ,check_this_in => l_recTEST.error_message); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Find DBOUT Happy Path 2'; - tl_compile_db_object - (in_ptype => 'package body' - ,in_pname => l_pname - ,in_source => - ' --% WTPLSQL SET DBOUT "' || l_pname || - ':PACKAGE BODY" %--' || CHR(10) || - 'begin' || CHR(10) || - ' l_junk := 1;' ); - run_find_dbout; - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq - (msg_in => 'l_recTEST.dbout_owner' - ,check_this_in => l_recTEST.dbout_owner - ,against_this_in => g_current_user); - wt_assert.eq - (msg_in => 'l_recTEST.dbout_name' - ,check_this_in => l_recTEST.dbout_name - ,against_this_in => l_pname); - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq - (msg_in => 'l_recTEST.dbout_type' - ,check_this_in => l_recTEST.dbout_type - ,against_this_in => 'PACKAGE BODY'); - wt_assert.isnull - (msg_in => 'l_recTEST.error_message' - ,check_this_in => l_recTEST.error_message); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Find DBOUT Happy Path 3'; - tl_compile_db_object - (in_ptype => 'package body' - ,in_pname => l_pname - ,in_source => - ' --% WTPLSQL SET DBOUT "' || g_current_user || - '.' || l_pname || - ':PACKAGE BODY" %--' || CHR(10) || - 'begin' || CHR(10) || - ' l_junk := 1;' ); - run_find_dbout; - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq - (msg_in => 'l_recTEST.dbout_owner' - ,check_this_in => l_recTEST.dbout_owner - ,against_this_in => g_current_user); - wt_assert.eq - (msg_in => 'l_recTEST.dbout_name' - ,check_this_in => l_recTEST.dbout_name - ,against_this_in => l_pname); - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq - (msg_in => 'l_recTEST.dbout_type' - ,check_this_in => l_recTEST.dbout_type - ,against_this_in => 'PACKAGE BODY'); - wt_assert.isnull - (msg_in => 'l_recTEST.error_message' - ,check_this_in => l_recTEST.error_message); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Find DBOUT Sad Path 1'; - tl_compile_db_object - (in_ptype => 'package body' - ,in_pname => l_pname - ,in_source => - -- Don't remove the "||", otherwise this will set the DBOUT - ' --% WTPLSQL SET DBOUT ' || '"BOGUS1" %--' || CHR(10) || - 'begin' || CHR(10) || - ' l_junk := 1;' ); - run_find_dbout; - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull - (msg_in => 'l_recTEST.dbout_owner' - ,check_this_in => l_recTEST.dbout_owner); - wt_assert.isnull - (msg_in => 'l_recTEST.dbout_name' - ,check_this_in => l_recTEST.dbout_name); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull - (msg_in => 'l_recTEST.dbout_type' - ,check_this_in => l_recTEST.dbout_type); - wt_assert.eq - (msg_in => 'l_recTEST.error_message' - ,check_this_in => l_recTEST.error_message - ,against_this_in => 'Unable to find database object "BOGUS1".'); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Find DBOUT Sad Path 2'; - tl_compile_db_object - (in_ptype => 'package body' - ,in_pname => l_pname - ,in_source => - ' --% WTPLSQL SET DBOUT "' || g_current_user || - '.' || l_pname || '" %--' || CHR(10) || - 'begin' || CHR(10) || - ' l_junk := 1;' ); - run_find_dbout; - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq - (msg_in => 'l_recTEST.dbout_owner' - ,check_this_in => l_recTEST.dbout_owner - ,against_this_in => g_current_user); - wt_assert.eq - (msg_in => 'l_recTEST.dbout_name' - ,check_this_in => l_recTEST.dbout_name - ,against_this_in => l_pname); - wt_assert.eq - (msg_in => 'l_recTEST.error_message' - ,check_this_in => l_recTEST.error_message - ,against_this_in => 'Found too many database objects "WTP.WT_PROFILE_FIND_DBOUT".'); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Find DBOUT Sad Path 3'; - tl_compile_db_object - (in_ptype => 'package body' - ,in_pname => l_pname - ,in_source => - -- Don't remove the "||", otherwise this will set the DBOUT - ' --% WTPLSQL SET DBOUT ' || '"SYS.ALL_OBJECTS:VIEW" %--' || CHR(10) || - 'begin' || CHR(10) || - ' l_junk := 1;' ); - run_find_dbout; - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq - (msg_in => 'l_recTEST.dbout_owner' - ,check_this_in => l_recTEST.dbout_owner - ,against_this_in => 'SYS'); - wt_assert.eq - (msg_in => 'l_recTEST.dbout_name' - ,check_this_in => l_recTEST.dbout_name - ,against_this_in => 'ALL_OBJECTS'); - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq - (msg_in => 'l_recTEST.dbout_type' - ,check_this_in => l_recTEST.dbout_type - ,against_this_in => 'VIEW'); - wt_assert.isnull - (msg_in => 'l_recTEST.error_message' - ,check_this_in => l_recTEST.error_message); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Find DBOUT Teardown'; - tl_drop_db_object(l_pname, 'package'); - end t_find_dbout; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- - - ------------------------------------------------------------- -procedure load_ignr_aa -is - cursor c_find_begin is - select line - ,instr(text,'--%WTPLSQL_begin_ignore_lines%--') col - from dba_source - where owner = g_rec.dbout_owner - and name = g_rec.dbout_name - and type = g_rec.dbout_type - and text like '%--\%WTPLSQL_begin_ignore_lines\%--%' escape '\' - order by line; - buff_find_begin c_find_begin%ROWTYPE; - cursor c_find_end (in_line in number, in_col in number) is - with q1 as ( - select line - ,instr(text,'--%WTPLSQL_end_ignore_lines%--') col - from dba_source - where owner = g_rec.dbout_owner - and name = g_rec.dbout_name - and type = g_rec.dbout_type - and line >= in_line - and text like '%--\%WTPLSQL_end_ignore_lines\%--%' escape '\' - ) - select line - ,col - from q1 - where line > in_line - or ( line = in_line - and col > in_col) - order by line - ,col; - buff_find_end c_find_end%ROWTYPE; -begin - g_ignr_aa.delete; - open c_find_begin; - loop - fetch c_find_begin into buff_find_begin; - exit when c_find_begin%NOTFOUND; - open c_find_end (buff_find_begin.line, buff_find_begin.col); - fetch c_find_end into buff_find_end; - if c_find_end%NOTFOUND - then - select max(line) - into buff_find_end.line - from dba_source - where owner = g_rec.dbout_owner - and name = g_rec.dbout_name - and type = g_rec.dbout_type; - end if; - close c_find_end; - for i in buff_find_begin.line + g_rec.trigger_offset .. - buff_find_end.line + g_rec.trigger_offset - loop - g_ignr_aa(i) := 'X'; - end loop; - end loop; - close c_find_begin; -end load_ignr_aa; - -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure t_load_ignr_aa - is - l_recSAVE rec_type; - l_ignrSAVE ignr_aa_type; - l_ignrTEST ignr_aa_type; - l_pname varchar2(128) := 'WT_PROFILE_LOAD_IGNR'; - -------------------------------------- WTPLSQL Testing -- - procedure run_load_ignr is begin - l_recSAVE := g_rec; - l_ignrSAVE := g_ignr_aa; - g_ignr_aa.delete; - g_rec.dbout_owner := g_current_user; - g_rec.dbout_name := l_pname; - g_rec.dbout_type := 'PACKAGE BODY'; - g_rec.trigger_offset := 0; - load_ignr_aa; - l_ignrTEST := g_ignr_aa; - g_ignr_aa := l_ignrSAVE; - g_rec := l_recSAVE; - end run_load_ignr; - begin - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Load Ignr Setup'; - wt_assert.isnotnull - (msg_in => 'Number of IGNR_AA elements' - ,check_this_in => g_ignr_aa.COUNT); - tl_compile_db_object - (in_ptype => 'package' - ,in_pname => l_pname - ,in_source => ' l_junk number;' ); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Load Ignr Happy Path 1'; - tl_compile_db_object - (in_ptype => 'package body' - ,in_pname => l_pname - ,in_source => 'begin' || CHR(10) || - ' l_junk := 1;' ); - run_load_ignr; - wt_assert.eq - (msg_in => 'l_ignrTest.COUNT' - ,check_this_in => l_ignrTest.COUNT - ,against_this_in => 0); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Load Ignr Happy Path 2'; - tl_compile_db_object - (in_ptype => 'package body' - ,in_pname => l_pname - ,in_source => - 'begin' || CHR(10) || -- Line 2 - ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 3 - ' l_junk := 1;' ); -- Line 4 - -- end -- Line 5 - run_load_ignr; - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq - (msg_in => 'l_ignrTest.COUNT' - ,check_this_in => l_ignrTest.COUNT - ,against_this_in => 3); - for i in 3 .. 5 - loop - wt_assert.eq - (msg_in => 'l_ignrTest.exists(' || i || ')' - ,check_this_in => l_ignrTest.exists(i) - ,against_this_in => TRUE); - end loop; - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Load Ignr Happy Path 3'; - tl_compile_db_object - (in_ptype => 'package body' - ,in_pname => l_pname - ,in_source => - 'begin' || CHR(10) || -- Line 2 - ' l_junk := 1;' || CHR(10) || -- Line 3 - ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 4 - ' l_junk := 2;' || CHR(10) || -- Line 5 - ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 6 - ' l_junk := 3;' ); -- Line 7 - run_load_ignr; - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq - (msg_in => 'l_ignrTest.COUNT' - ,check_this_in => l_ignrTest.COUNT - ,against_this_in => 3); - for i in 4 .. 6 - loop - wt_assert.eq - (msg_in => 'l_ignrTest.exists(' || i || ')' - ,check_this_in => l_ignrTest.exists(i) - ,against_this_in => TRUE); - end loop; - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Load Ignr Happy Path 4'; - tl_compile_db_object - (in_ptype => 'package body' - ,in_pname => l_pname - ,in_source => - 'begin' || CHR(10) || -- Line 2 - ' l_junk := 1;' || CHR(10) || -- Line 3 - ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 4 - ' l_junk := 2;' || CHR(10) || -- Line 5 - ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 6 - ' l_junk := 3;' || CHR(10) || -- Line 7 - ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 8 - ' l_junk := 4;' ); -- Line 9 - -- end -- Line 10 - run_load_ignr; - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq - (msg_in => 'l_ignrTest.COUNT' - ,check_this_in => l_ignrTest.COUNT - ,against_this_in => 6); - for i in 4 .. 6 - loop - wt_assert.eq - (msg_in => 'l_ignrTest.exists(' || i || ')' - ,check_this_in => l_ignrTest.exists(i) - ,against_this_in => TRUE); - end loop; - -------------------------------------- WTPLSQL Testing -- - for i in 8 .. 10 - loop - wt_assert.eq - (msg_in => 'l_ignrTest.exists(' || i || ')' - ,check_this_in => l_ignrTest.exists(i) - ,against_this_in => TRUE); - end loop; - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Load Ignr Sad Path 1'; - tl_compile_db_object - (in_ptype => 'package body' - ,in_pname => l_pname - ,in_source => - 'begin' || CHR(10) || -- Line 2 - ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 3 - ' l_junk := 4;' ); -- Line 4 - run_load_ignr; - wt_assert.eq - (msg_in => 'l_ignrTest.COUNT' - ,check_this_in => l_ignrTest.COUNT - ,against_this_in => 0); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Load Ignr Sad Path 2'; - tl_compile_db_object - (in_ptype => 'package body' - ,in_pname => l_pname - ,in_source => - 'begin' || CHR(10) || -- Line 2 - ' l_junk := 1;' || CHR(10) || -- Line 3 - ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 4 - ' l_junk := 2;' || CHR(10) || -- Line 5 - ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 6 - ' l_junk := 3;' || CHR(10) || -- Line 7 - ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 8 - ' l_junk := 4;' ); -- Line 9 - run_load_ignr; - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq - (msg_in => 'l_ignrTest.COUNT' - ,check_this_in => l_ignrTest.COUNT - ,against_this_in => 3); - for i in 4 .. 6 - loop - wt_assert.eq - (msg_in => 'l_ignrTest.exists(' || i || ')' - ,check_this_in => l_ignrTest.exists(i) - ,against_this_in => TRUE); - end loop; - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Load Ignr Sad Path 3'; - tl_compile_db_object - (in_ptype => 'package body' - ,in_pname => l_pname - ,in_source => - 'begin' || CHR(10) || -- Line 2 - ' l_junk := 1;' || CHR(10) || -- Line 3 - ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 4 - ' l_junk := 2;' || CHR(10) || -- Line 5 - ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 6 - ' l_junk := 3;' || CHR(10) || -- Line 7 - ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 8 - ' l_junk := 4;' ); -- Line 9 - run_load_ignr; - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq - (msg_in => 'l_ignrTest.COUNT' - ,check_this_in => l_ignrTest.COUNT - ,against_this_in => 5); - for i in 4 .. 8 - loop - wt_assert.eq - (msg_in => 'l_ignrTest.exists(' || i || ')' - ,check_this_in => l_ignrTest.exists(i) - ,against_this_in => TRUE); - end loop; - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Load Ignr Teardown'; - tl_drop_db_object(l_pname, 'package'); - wt_assert.isnotnull - (msg_in => 'Number of IGNR_AA elements' - ,check_this_in => g_ignr_aa.COUNT); - end t_load_ignr_aa; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- - - ------------------------------------------------------------- -procedure insert_dbout_profile -is - prof_rec wt_dbout_profiles%ROWTYPE; - l_max_line number; - procedure l_set_status is begin - if g_ignr_aa.EXISTS(prof_rec.line) - then - -- Found Statement to Ignore - prof_rec.status := 'IGNR'; - return; - end if; - if prof_rec.total_occur > 0 - then - -- Found Executed Statement - prof_rec.status := 'EXEC'; - return; - end if; - if prof_rec.total_occur = 0 - and prof_rec.total_usecs = 0 - then - -- Check for declaration if Not Executed - if regexp_like(prof_rec.text, '^[[:space:]]*' || - '(FUNCTION|PROCEDURE|PACKAGE|TYPE|TRIGGER)' || - '[[:space:]]', 'i') - then - -- Exclude declarations if Not Executed - prof_rec.status := 'EXCL'; - elsif prof_rec.line = l_max_line - AND regexp_like(prof_rec.text, 'END', 'i') - then - prof_rec.status := 'EXCL'; - else - -- Found Not Executed Statement - prof_rec.status := 'NOTX'; - end if; - return; - end if; - -- Everything else is unknown - prof_rec.status := 'UNKN'; - end l_set_status; -begin - -- This will not RAISE NO_DATA_FOUND because it uses a GROUP FUNCTION. - select max(ppd.line#) into l_max_line - from plsql_profiler_units ppu - join plsql_profiler_data ppd - on ppd.unit_number = ppu.unit_number - and ppd.runid = g_rec.prof_runid - where ppu.unit_owner = g_rec.dbout_owner - and ppu.unit_name = g_rec.dbout_name - and ppu.unit_type = g_rec.dbout_type - and ppu.runid = g_rec.prof_runid; - load_ignr_aa; - prof_rec.test_run_id := g_rec.test_run_id; - for buf1 in ( - select src.line - ,ppd.total_occur - ,ppd.total_time - ,ppd.min_time - ,ppd.max_time - ,src.text - from plsql_profiler_units ppu - join plsql_profiler_data ppd - on ppd.unit_number = ppu.unit_number - and ppd.runid = g_rec.prof_runid - join dba_source src - on src.line = ppd.line# + g_rec.trigger_offset - and src.owner = g_rec.dbout_owner - and src.name = g_rec.dbout_name - and src.type = g_rec.dbout_type - where ppu.unit_owner = g_rec.dbout_owner - and ppu.unit_name = g_rec.dbout_name - and ppu.unit_type = g_rec.dbout_type - and ppu.runid = g_rec.prof_runid ) - loop - prof_rec.line := buf1.line; - prof_rec.total_occur := buf1.total_occur; - prof_rec.total_usecs := buf1.total_time/1000; - prof_rec.min_usecs := buf1.min_time/1000; - prof_rec.max_usecs := buf1.max_time/1000; - prof_rec.text := buf1.text; - prof_rec.status := NULL; - l_set_status; - insert into wt_dbout_profiles values prof_rec; - - $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ - if not g_skip_add then - $END - wt_test_run_stat.add_profile(prof_rec); - $IF $$WTPLSQL_SELFTEST $THEN - end if; - $END ----------------%WTPLSQL_end_ignore_lines%---------------- - - end loop; - g_ignr_aa.delete; - delete_plsql_profiler_recs(g_rec.prof_runid); -end insert_dbout_profile; - -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure t_insert_dbout_profile - is - units_rec plsql_profiler_units%ROWTYPE; - data_rec plsql_profiler_data%ROWTYPE; - l_recSAVE rec_type; - l_recNULL rec_type; - c_test_run_id constant number := -97; - l_pname varchar2(128) := 'WT_PROFILE_INSERT_DBOUT'; - l_sqlerrm varchar2(4000); - l_err_stack varchar2(32000); - -------------------------------------- WTPLSQL Testing -- - procedure insert_plsql_profiler_data - (in_line# in number - ,in_total_occur in number - ,in_total_time in number) - is - begin - data_rec.line# := in_line#; - data_rec.total_occur := in_total_occur; - data_rec.total_time := in_total_time; - -------------------------------------- WTPLSQL Testing -- - begin - insert into plsql_profiler_data values data_rec; - commit; - l_sqlerrm := SQLERRM; - exception when others then - l_sqlerrm := SQLERRM; - end; - wt_assert.eq ( - msg_in => 'insert plsql_profiler_data (LINE#: ' || data_rec.line#|| ')', - check_this_in => SQLERRM, - against_this_in => 'ORA-0000: normal, successful completion'); - end insert_plsql_profiler_data; - -------------------------------------- WTPLSQL Testing -- - procedure test_dbout_profiler - (in_line# in number - ,in_col_name in varchar2 - ,in_value in varchar2) - is - begin - wt_assert.eqqueryvalue - (msg_in => 'wt_dbout_profiles line ' || in_line# || - ', column ' || in_col_name - ,check_query_in => 'select ' || in_col_name || - ' from wt_dbout_profiles' || - ' where test_run_id = ' || c_test_run_id || - ' and line = ' || in_line# - ,against_value_in => in_value); - end test_dbout_profiler; - begin - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Insert DBOUT Profile Setup'; - tl_compile_db_object - (in_ptype => 'package' - ,in_pname => l_pname - ,in_source => ' l_junk number;' ); - -------------------------------------- WTPLSQL Testing -- - tl_compile_db_object - (in_ptype => 'package body' - ,in_pname => l_pname - ,in_source => - 'begin' || CHR(10) || -- Line 2 - ' l_junk := 1;' || CHR(10) || -- Line 3 - ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 4 - ' l_junk := 2;' || CHR(10) || -- Line 5 - ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 6 - ' if 0 = 1 then' || CHR(10) || -- Line 7 - ' l_junk := 3;' || CHR(10) || -- Line 8 - ' end if;' ); -- Line 9 - tl_insert_plsql_profiler_recs(c_test_run_id); - tl_count_plsql_profiler_recs(c_test_run_id, 1); - tl_insert_test_runs(c_test_run_id, 'Insert DBOUT Test'); - -------------------------------------- WTPLSQL Testing -- - units_rec.runid := c_test_run_id; - units_rec.unit_number := 1; - units_rec.unit_owner := g_current_user; - units_rec.unit_name := l_pname; - units_rec.unit_type := 'PACKAGE BODY'; - units_rec.total_time := 0; - -------------------------------------- WTPLSQL Testing -- - begin - insert into plsql_profiler_units values units_rec; - commit; - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - exception when others then - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - end; - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull ( - msg_in => 'insert UNIT 1 into plsql_profiler_units', - check_this_in => l_err_stack); - wt_assert.eqqueryvalue - (msg_in => 'Number of UNIT 1 plsql_profiler_units' - ,check_query_in => 'select count(*) from plsql_profiler_units' || - ' where runid = ' || c_test_run_id || - ' and unit_number = 1' - ,against_value_in => 1); - -------------------------------------- WTPLSQL Testing -- - data_rec.runid := c_test_run_id; - data_rec.unit_number := 1; - data_rec.min_time := 0; - data_rec.max_time := 1; - insert_plsql_profiler_data(1, 0, 0); - insert_plsql_profiler_data(2, 0, 1); - insert_plsql_profiler_data(3, 1, 1); - insert_plsql_profiler_data(5, 1, 1); - insert_plsql_profiler_data(7, 1, 1); - insert_plsql_profiler_data(8, 0, 0); - insert_plsql_profiler_data(9, 1, 1); - insert_plsql_profiler_data(10, 0, 0); - -------------------------------------- WTPLSQL Testing -- - wt_assert.eqqueryvalue - (msg_in => 'Number of UNIT 1 plsql_profiler_data' - ,check_query_in => 'select count(*) from plsql_profiler_data' || - ' where runid = ' || c_test_run_id || - ' and unit_number = 1' - ,against_value_in => 8); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Insert DBOUT Profile Happy Path'; - l_recSAVE := g_rec; - g_rec.test_run_id := c_test_run_id; - g_rec.dbout_owner := g_current_user; - g_rec.dbout_name := l_pname; - g_rec.dbout_type := 'PACKAGE BODY'; - g_rec.prof_runid := c_test_run_id; - g_rec.trigger_offset := 0; - g_rec.error_message := ''; - -------------------------------------- WTPLSQL Testing -- - g_skip_add := TRUE; - begin - insert_dbout_profile; - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - exception when others then - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - end; - g_skip_add := FALSE; - g_rec := l_recSAVE; - wt_assert.isnull ( - msg_in => 'SQLERRM', - check_this_in => l_err_stack); - -------------------------------------- WTPLSQL Testing -- - test_dbout_profiler(1, 'STATUS', 'EXCL'); - test_dbout_profiler(1, 'TEXT', 'package body WT_PROFILE_INSERT_DBOUT is' || CHR(10)); - test_dbout_profiler(2, 'STATUS', 'UNKN'); - test_dbout_profiler(2, 'TEXT', 'begin' || CHR(10)); - test_dbout_profiler(3, 'STATUS', 'EXEC'); - test_dbout_profiler(3, 'TEXT', ' l_junk := 1;' || CHR(10)); - test_dbout_profiler(5, 'STATUS', 'IGNR'); - test_dbout_profiler(5, 'TEXT', ' l_junk := 2;' || CHR(10)); - test_dbout_profiler(7, 'STATUS', 'EXEC'); - test_dbout_profiler(7, 'TEXT', ' if 0 = 1 then' || CHR(10)); - test_dbout_profiler(8, 'STATUS', 'NOTX'); - test_dbout_profiler(8, 'TEXT', ' l_junk := 3;' || CHR(10)); - test_dbout_profiler(9, 'STATUS', 'EXEC'); - test_dbout_profiler(9, 'TEXT', ' end if;' || CHR(10)); - test_dbout_profiler(10, 'STATUS', 'EXCL'); - test_dbout_profiler(10, 'TEXT', 'end WT_PROFILE_INSERT_DBOUT;'); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Insert DBOUT Profile Teardown'; - tl_delete_dbout_profiles(c_test_run_id); - tl_delete_test_runs(c_test_run_id); - tl_delete_plsql_profiler_recs(c_test_run_id); - tl_count_plsql_profiler_recs(c_test_run_id, 0); - tl_drop_db_object(l_pname, 'package'); - end t_insert_dbout_profile; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- - - ---------------------- --- Public Procedures ---------------------- - - ------------------------------------------------------------- -procedure initialize - (in_test_run_id in number, - in_runner_owner in varchar2, - in_runner_name in varchar2, - out_dbout_owner out varchar2, - out_dbout_name out varchar2, - out_dbout_type out varchar2, - out_trigger_offset out number, - out_profiler_runid out number, - out_error_message out varchar2) -is - l_rec_NULL rec_type; - l_retnum binary_integer; -begin - -- Reset variables - out_dbout_owner := ''; - out_dbout_name := ''; - out_dbout_type := ''; - out_trigger_offset := NULL; - out_profiler_runid := NULL; - out_error_message := ''; - g_rec := l_rec_NULL; - $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ - $THEN - -- In case a test failed and left this set to TRUE - g_skip_insert := FALSE; - g_skip_add := FALSE; - $END ----------------%WTPLSQL_end_ignore_lines%---------------- - -- Abort if there is no Test Run ID - if in_test_run_id is null - then - raise_application_error (-20004, 'i_test_run_id is null'); - end if; - g_rec.test_run_id := in_test_run_id; - -- Find the Database Object Under Test - find_dbout(in_owner => in_runner_owner - ,in_pkg_name => in_runner_name); - out_dbout_owner := g_rec.dbout_owner; - out_dbout_name := g_rec.dbout_name; - out_dbout_type := g_rec.dbout_type; - out_error_message := g_rec.error_message; - -- There muxt be a name and no error message - if g_rec.dbout_name is null -- No DBOUT notation - or g_rec.error_message is not null -- Error with DBOUT or Source - or g_rec.prof_runid = -1 -- Skip Profiling - then - g_rec.prof_runid := NULL; - return; - end if; - -- Calculate the trigger offset, if any. - g_rec.trigger_offset := wt_profiler.trigger_offset - (dbout_owner_in => g_rec.dbout_owner - ,dbout_name_in => g_rec.dbout_name - ,dbout_type_in => g_rec.dbout_type ); - out_trigger_offset := g_rec.trigger_offset; - -- Check Versions - l_retnum := dbms_profiler.INTERNAL_VERSION_CHECK; - if l_retnum <> 0 then - ------%WTPLSQL_begin_ignore_lines%------ Can't test this - --dbms_profiler.get_version(major_version, minor_version); - raise_application_error(-20005, - 'dbms_profiler.INTERNAL_VERSION_CHECK returned: ' || get_error_msg(l_retnum)); - ----------------%WTPLSQL_end_ignore_lines%---------------- - end if; - -- This starts the PROFILER Running!!! - l_retnum := dbms_profiler.START_PROFILER(run_number => g_rec.prof_runid); - if l_retnum <> 0 then - ------%WTPLSQL_begin_ignore_lines%------ Can't test this - raise_application_error(-20006, - 'dbms_profiler.START_PROFILER returned: ' || get_error_msg(l_retnum)); - ----------------%WTPLSQL_end_ignore_lines%---------------- - end if; - -- Everything is OK, set the Profiler Run ID - out_profiler_runid := g_rec.prof_runid; -end initialize; - -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure t_initialize - is - c_test_run_id constant number := -96; - l_owner varchar2(128); - l_pname varchar2(128) := 'WT_PROFILE_INITIALIZE'; - l_recSAVE rec_type; - l_recTEST rec_type; - l_recOUT rec_type; - l_sqlerrm varchar2(4000); - begin - select username into l_owner from user_users; - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Insert DBOUT Profile Setup'; - tl_compile_db_object - (in_ptype => 'package' - ,in_pname => l_pname - ,in_source => ' l_junk number;' ); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Initialize Test HAPPY Path 1'; - tl_compile_db_object - (in_ptype => 'package body' - ,in_pname => l_pname - ,in_source => - 'begin' || CHR(10) || -- Line 2 - ' l_junk := 7;' ); -- Line 3 - -------------------------------------- WTPLSQL Testing -- - l_recSAVE := g_rec; - initialize - (in_test_run_id => c_test_run_id, - in_runner_owner => l_owner, - in_runner_name => l_pname, - out_dbout_owner => l_recOUT.dbout_owner, - out_dbout_name => l_recOUT.dbout_name, - out_dbout_type => l_recOUT.dbout_type, - out_trigger_offset => l_recOUT.trigger_offset, - out_profiler_runid => l_recOUT.prof_runid, - out_error_message => l_recOUT.error_message); - l_recTEST := g_rec; - g_rec := l_recSAVE; - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull ( - msg_in => 'OUT dbout_owner', - check_this_in => l_recOUT.dbout_owner); - wt_assert.isnull ( - msg_in => 'OUT dbout_name', - check_this_in => l_recOUT.dbout_name); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull ( - msg_in => 'OUT dbout_type', - check_this_in => l_recOUT.dbout_type); - wt_assert.isnull ( - msg_in => 'OUT prof_runid', - check_this_in => l_recOUT.prof_runid); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull ( - msg_in => 'OUT trigger_offset', - check_this_in => l_recOUT.trigger_offset); - wt_assert.isnull ( - msg_in => 'OUT error_message', - check_this_in => l_recOUT.error_message); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull ( - msg_in => 'l_recTEST.dbout_owner', - check_this_in => l_recTEST.dbout_owner); - wt_assert.isnull ( - msg_in => 'l_recTEST.dbout_name', - check_this_in => l_recTEST.dbout_name); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull ( - msg_in => 'l_recTEST.dbout_type', - check_this_in => l_recTEST.dbout_type); - wt_assert.isnull ( - msg_in => 'l_recTEST.prof_runid', - check_this_in => l_recTEST.prof_runid); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull ( - msg_in => 'l_recTEST.trigger_offset', - check_this_in => l_recTEST.trigger_offset); - wt_assert.isnull ( - msg_in => 'l_recTEST.error_message', - check_this_in => l_recTEST.error_message); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Initialize Test HAPPY Path 2'; - tl_compile_db_object - (in_ptype => 'package body' - ,in_pname => l_pname - ,in_source => - 'begin' || CHR(10) || -- Line 2 - '--% WTPLSQL SET DBOUT "' || l_pname || - ':PACKAGE BODY" %--' || CHR(10) || -- Line 3 - ' l_junk := 7;' ); -- Line 4 - -------------------------------------- WTPLSQL Testing -- - l_recSAVE := g_rec; - initialize - (in_test_run_id => c_test_run_id, - in_runner_owner => l_owner, - in_runner_name => l_pname, - out_dbout_owner => l_recOUT.dbout_owner, - out_dbout_name => l_recOUT.dbout_name, - out_dbout_type => l_recOUT.dbout_type, - out_trigger_offset => l_recOUT.trigger_offset, - out_profiler_runid => l_recOUT.prof_runid, - out_error_message => l_recOUT.error_message); - l_recTEST := g_rec; - g_rec := l_recSAVE; - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq ( - msg_in => 'OUT dbout_owner', - check_this_in => l_recOUT.dbout_owner, - against_this_in => g_current_user); - wt_assert.eq ( - msg_in => 'OUT dbout_name', - check_this_in => l_recOUT.dbout_name, - against_this_in => l_pname); - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq ( - msg_in => 'OUT dbout_type', - check_this_in => l_recOUT.dbout_type, - against_this_in => 'PACKAGE BODY'); - wt_assert.isnotnull ( - msg_in => 'OUT prof_runid', - check_this_in => l_recOUT.prof_runid); - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq ( - msg_in => 'OUT trigger_offset', - check_this_in => l_recOUT.trigger_offset, - against_this_in => 0); - wt_assert.isnull ( - msg_in => 'OUT error_message', - check_this_in => l_recOUT.error_message); - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq ( - msg_in => 'l_recTEST.dbout_owner', - check_this_in => l_recTEST.dbout_owner, - against_this_in => g_current_user); - wt_assert.eq ( - msg_in => 'l_recTEST.dbout_name', - check_this_in => l_recTEST.dbout_name, - against_this_in => l_pname); - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq ( - msg_in => 'l_recTEST.dbout_type', - check_this_in => l_recTEST.dbout_type, - against_this_in => 'PACKAGE BODY'); - wt_assert.isnotnull ( - msg_in => 'l_recTEST.prof_runid', - check_this_in => l_recTEST.prof_runid); - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq ( - msg_in => 'l_recTEST.trigger_offset', - check_this_in => l_recTEST.trigger_offset, - against_this_in => 0); - wt_assert.isnull ( - msg_in => 'l_recTEST.error_message', - check_this_in => l_recTEST.error_message); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Initialize Test Sad Path 1'; - l_recSAVE := g_rec; - begin - initialize - (in_test_run_id => null, - in_runner_owner => l_owner, - in_runner_name => 'Sad Path 1', - out_dbout_owner => l_recOUT.dbout_owner, - out_dbout_name => l_recOUT.dbout_name, - out_dbout_type => l_recOUT.dbout_type, - out_trigger_offset => l_recOUT.trigger_offset, - out_profiler_runid => l_recOUT.prof_runid, - out_error_message => l_recOUT.error_message); - l_sqlerrm := SQLERRM; - -------------------------------------- WTPLSQL Testing -- - exception when others then - l_sqlerrm := SQLERRM; - end; - l_recTEST := g_rec; - g_rec := l_recSAVE; - wt_assert.eq ( - msg_in => 'SQLERRM', - check_this_in => l_sqlerrm, - against_this_in => 'ORA-20004: i_test_run_id is null'); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Insert DBOUT Profile Teardown'; - tl_drop_db_object - (in_ptype => 'package' - ,in_pname => l_pname); - end t_initialize; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- - - ------------------------------------------------------------- --- Because this procedure is called to cleanup after erorrs, --- it must be able to run multiple times without causing damage. -procedure finalize -is - l_rec_NULL rec_type; -begin - if g_rec.prof_runid is null - then - return; - end if; - if g_rec.test_run_id is null - then - raise_application_error (-20000, 'g_rec.test_run_id is null'); - end if; - $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ - $THEN - if not g_skip_insert - then - $END - begin - -- DBMS_PROFILER.FLUSH_DATA is included with DBMS_PROFILER.STOP_PROFILER - dbms_profiler.STOP_PROFILER; - exception when others then - g_rec := l_rec_NULL; - raise; - end; - insert_dbout_profile; - $IF $$WTPLSQL_SELFTEST - $THEN - end if; - $END ----------------%WTPLSQL_end_ignore_lines%---------------- - g_rec := l_rec_NULL; -end finalize; - -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure t_finalize - is - l_recSAVE rec_type; - l_recTEST rec_type; - l_sqlerrm varchar2(4000); - l_err_stack varchar2(32000); - begin - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Finalize Happy Path 1'; - l_recSAVE := g_rec; - g_rec.prof_runid := NULL; - wt_assert.isnull ( - msg_in => 'g_rec.prof_runid', - check_this_in => g_rec.prof_runid); - -------------------------------------- WTPLSQL Testing -- - begin - finalize; - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - exception when others then - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - end; - g_rec := l_recSAVE; - wt_assert.isnull ( - msg_in => 'format_error_stack and format_error_backtrace', - check_this_in => l_err_stack); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Finalize Happy Path 2'; - l_recSAVE := g_rec; - g_rec.test_run_id := -1; - g_rec.dbout_owner := 'TEST OWNER'; - g_rec.dbout_name := 'TEST NAME'; - g_rec.dbout_type := 'TEST TYPE'; - g_rec.prof_runid := -2; - g_rec.trigger_offset := -3; - g_rec.error_message := 'TEST MESSAGE'; - -------------------------------------- WTPLSQL Testing -- - g_skip_insert := TRUE; - begin - finalize; - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - exception when others then - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - end; - g_skip_insert := FALSE; - -------------------------------------- WTPLSQL Testing -- - l_recTEST := g_rec; - g_rec := l_recSAVE; - wt_assert.isnull ( - msg_in => 'SQLERRM', - check_this_in => l_err_stack); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull ( - msg_in => 'l_recTEST.test_run_id', - check_this_in => l_recTEST.test_run_id); - wt_assert.isnull ( - msg_in => 'l_recTEST.dbout_owner', - check_this_in => l_recTEST.dbout_owner); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull ( - msg_in => 'l_recTEST.dbout_name', - check_this_in => l_recTEST.dbout_name); - wt_assert.isnull ( - msg_in => 'l_recTEST.dbout_type', - check_this_in => l_recTEST.dbout_type); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull ( - msg_in => 'l_recTEST.prof_runid', - check_this_in => l_recTEST.prof_runid); - wt_assert.isnull ( - msg_in => 'l_recTEST.trigger_offset', - check_this_in => l_recTEST.trigger_offset); - wt_assert.isnull ( - msg_in => 'l_recTEST.error_message', - check_this_in => l_recTEST.error_message); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Finalize Sad Path 1'; - l_recSAVE := g_rec; - g_rec.prof_runid := -1; - g_rec.test_run_id := NULL; - begin - finalize; - exception when others then - l_sqlerrm := SQLERRM; - end; - -------------------------------------- WTPLSQL Testing -- - g_rec := l_recSAVE; - wt_assert.eq ( - msg_in => 'SQLERRM', - check_this_in => l_sqlerrm, - against_this_in => 'ORA-20000: g_rec.test_run_id is null'); - end t_finalize; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- - - ------------------------------------------------------------- --- Find begining of PL/SQL Block in a Trigger -function trigger_offset - (dbout_owner_in in varchar2 - ,dbout_name_in in varchar2 - ,dbout_type_in in varchar2) - return number -is -begin - if dbout_type_in != 'TRIGGER' - then - return 0; - end if; - for buff in ( - select line, text from dba_source - where owner = dbout_owner_in - and name = dbout_name_in - and type = 'TRIGGER' - order by line ) - loop - if regexp_instr(buff.text, - '(^declare$' || - '|^declare[[:space:]]' || - '|[[:space:]]declare$' || - '|[[:space:]]declare[[:space:]])', 1, 1, 0, 'i') <> 0 - OR - regexp_instr(buff.text, - '(^begin$' || - '|^begin[[:space:]]' || - '|[[:space:]]begin$' || - '|[[:space:]]begin[[:space:]])', 1, 1, 0, 'i') <> 0 - then - return buff.line - 1; - end if; - end loop; - return 0; -end trigger_offset; - -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure t_trigger_offset - is - begin - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Trigger Offset Happy Path'; - wt_assert.eq ( - msg_in => 'Trigger Test', - check_this_in => trigger_offset (dbout_owner_in => g_current_user - ,dbout_name_in => 'WT_SELF_TEST$TEST' - ,dbout_type_in => 'TRIGGER'), - against_this_in => 3); - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq ( - msg_in => 'Package Test', - check_this_in => trigger_offset (dbout_owner_in => g_current_user - ,dbout_name_in => 'WT_PROFILER' - ,dbout_type_in => 'PACKAGE BODY'), - against_this_in => 0); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Trigger Offset Sad Path'; - wt_assert.eq ( - msg_in => 'Non Existent Object', - check_this_in => trigger_offset (dbout_owner_in => 'BOGUS456' - ,dbout_name_in => 'BOGUS123' - ,dbout_type_in => 'TRIGGER'), - against_this_in => 0); - end t_trigger_offset; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- - - ------------------------------------------------------------- -function calc_pct_coverage - (in_test_run_id in number) - return number -IS -BEGIN - for buff in ( - select sum(case status when 'EXEC' then 1 else 0 end) HITS - ,sum(case status when 'NOTX' then 1 else 0 end) MISSES - from wt_dbout_profiles p - where test_run_id = in_test_run_id ) - loop - if buff.hits + buff.misses = 0 - then - return -1; - else - return round(100 * buff.hits / (buff.hits + buff.misses),2); - end if; - end loop; - return null; -END calc_pct_coverage; - -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure t_calc_pct_coverage - is - c_test_run_id constant number := -95; - l_rec wt_dbout_profiles%ROWTYPE; - begin - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Calculate Percent Coverage Setup'; - tl_insert_test_runs(c_test_run_id, 'Calculate Offset Test'); - l_rec.test_run_id := c_test_run_id; - l_rec.total_occur := 1; - l_rec.total_usecs := 1; - l_rec.min_usecs := 1; - l_rec.max_usecs := 1; - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Calculate Percent Coverage Happy Path 1'; - l_rec.line := 1; - l_rec.status := 'EXEC'; - l_rec.text := 'Testing ' || l_rec.line; - tl_insert_dbout_profiles(l_rec); - -------------------------------------- WTPLSQL Testing -- - l_rec.line := 2; - l_rec.status := 'NOTX'; - l_rec.text := 'Testing ' || l_rec.line; - tl_insert_dbout_profiles(l_rec); - -------------------------------------- WTPLSQL Testing -- - l_rec.line := 3; - l_rec.status := 'EXEC'; - l_rec.text := 'Testing ' || l_rec.line; - tl_insert_dbout_profiles(l_rec); - wt_assert.eq ( - msg_in => 'Main Test', - check_this_in => calc_pct_coverage(c_test_run_id), - against_this_in => 66.67); - tl_delete_dbout_profiles(c_test_run_id); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Calculate Percent Coverage Happy Path 2'; - l_rec.line := 1; - l_rec.status := 'EXCL'; - l_rec.text := 'Testing ' || l_rec.line; - tl_insert_dbout_profiles(l_rec); - -------------------------------------- WTPLSQL Testing -- - l_rec.line := 2; - l_rec.status := 'UNKN'; - l_rec.text := 'Testing ' || l_rec.line; - tl_insert_dbout_profiles(l_rec); - -------------------------------------- WTPLSQL Testing -- - l_rec.line := 3; - l_rec.status := 'EXCL'; - l_rec.text := 'Testing ' || l_rec.line; - tl_insert_dbout_profiles(l_rec); - wt_assert.eq ( - msg_in => 'Main Test', - check_this_in => calc_pct_coverage(c_test_run_id), - against_this_in => -1); - tl_delete_dbout_profiles(c_test_run_id); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Calculate Percent Coverage Sad Path'; - wt_assert.isnull ( - msg_in => 'Missing Test Run ID', - check_this_in => calc_pct_coverage(-99990)); - wt_assert.isnull ( - msg_in => 'NULL Test Run ID', - check_this_in => calc_pct_coverage(null)); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Calculate Percent Coverage Teardown'; - tl_delete_test_runs(c_test_run_id); - end t_calc_pct_coverage; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- - - ------------------------------------------------------------- -procedure delete_records - (in_test_run_id in number) -is - l_profiler_runid number; -begin - select profiler_runid into l_profiler_runid - from wt_test_runs where id = in_test_run_id; - delete_plsql_profiler_recs(l_profiler_runid); - delete from wt_dbout_profiles - where test_run_id = in_test_run_id; -exception - when NO_DATA_FOUND - then - return; -end delete_records; - -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure t_delete_records - is - c_test_run_id constant number := -98; - l_rec wt_dbout_profiles%ROWTYPE; - l_err_stack varchar2(32000); - begin - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Delete Records Setup'; - wt_assert.eqqueryvalue ( - msg_in => 'wt_test_runs Count 0', - check_query_in => 'select count(*) from wt_test_runs' || - ' where id = ' || c_test_run_id, - against_value_in => 0); - wt_assert.eqqueryvalue ( - msg_in => 'wt_dbout_profiles Count 0', - check_query_in => 'select count(*) from wt_dbout_profiles' || - ' where test_run_id = ' || c_test_run_id, - against_value_in => 0); - tl_insert_test_runs(c_test_run_id, 'Delete Records Test'); - -------------------------------------- WTPLSQL Testing -- - l_rec.test_run_id := c_test_run_id; - l_rec.line := 1; - l_rec.status := 'EXEC'; - l_rec.total_occur := 1; - l_rec.total_usecs := 1; - l_rec.min_usecs := 1; - l_rec.max_usecs := 1; - l_rec.text := 'Testing'; - tl_insert_dbout_profiles(l_rec); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Delete Records Happy Path 1'; - begin - delete_records(c_test_run_id); - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - exception when others then - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - end; - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull ( - msg_in => 'SQLERRM', - check_this_in => l_err_stack); - wt_assert.eqqueryvalue ( - msg_in => 'wt_dbout_profiles Count 2', - check_query_in => 'select count(*) from wt_dbout_profiles' || - ' where test_run_id = ' || c_test_run_id, - against_value_in => 0); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Delete Records Sad Path 1'; - begin - delete_records(-9876); - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - exception when others then - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - end; - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull ( - msg_in => 'SQLERRM', - check_this_in => l_err_stack); - wt_assert.eqqueryvalue ( - msg_in => 'wt_dbout_profiles Count 2', - check_query_in => 'select count(*) from wt_dbout_profiles' || - ' where test_run_id = ' || c_test_run_id, - against_value_in => 0); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Delete Records Sad Path 2'; - begin - delete_records(NULL); - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - exception when others then - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - end; - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull ( - msg_in => 'SQLERRM', - check_this_in => l_err_stack); - wt_assert.eqqueryvalue ( - msg_in => 'wt_dbout_profiles Count 2', - check_query_in => 'select count(*) from wt_dbout_profiles' || - ' where test_run_id = ' || c_test_run_id, - against_value_in => 0); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Delete Records Teardown'; - tl_delete_test_runs(c_test_run_id); - end t_delete_records; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- - - ---==============================================================-- -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_PROFILER:PACKAGE BODY" %-- - is - begin - select username into g_current_user from user_users; - t_get_error_msg; - t_delete_profiler_recs; - t_find_dbout; - t_load_ignr_aa; - t_insert_dbout_profile; - t_initialize; - t_finalize; - t_trigger_offset; - t_calc_pct_coverage; - t_delete_records; - end WTPLSQL_RUN; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- ---==============================================================-- - - -end wt_profile; diff --git a/src/core/wt_profile.pks b/src/core/wt_profile.pks deleted file mode 100644 index c2aeb37..0000000 --- a/src/core/wt_profile.pks +++ /dev/null @@ -1,57 +0,0 @@ -create or replace package wt_profile - authid definer -as - - TYPE rec_type is record - (test_run_id wt_test_runs.id%TYPE - ,dbout_owner wt_test_runs.dbout_owner%TYPE - ,dbout_name wt_test_runs.dbout_name%TYPE - ,dbout_type wt_test_runs.dbout_type%TYPE - ,prof_runid binary_integer - ,trigger_offset binary_integer - ,error_message varchar2(4000)); - g_rec rec_type; - - TYPE ignr_aa_type is table - of varchar2(1) - index by PLS_INTEGER; - g_ignr_aa ignr_aa_type; - - procedure initialize - (in_test_run_id in number, - in_runner_owner in varchar2, - in_runner_name in varchar2, - out_dbout_owner out varchar2, - out_dbout_name out varchar2, - out_dbout_type out varchar2, - out_trigger_offset out number, - out_profiler_runid out number, - out_error_message out varchar2); - - procedure finalize; - - function trigger_offset - (dbout_owner_in in varchar2 - ,dbout_name_in in varchar2 - ,dbout_type_in in varchar2) - return number; - - function calc_pct_coverage - (in_test_run_id in number) - return number; - - procedure delete_records - (in_test_run_id in number); - - -- WtPLSQL Self Test Procedures - -- - -- alter system set PLSQL_CCFLAGS = - -- 'WTPLSQL_SELFTEST:TRUE' - -- scope=BOTH; - -- - $IF $$WTPLSQL_SELFTEST - $THEN - procedure WTPLSQL_RUN; - $END - -end wt_profile; diff --git a/src/core/wt_profiles.tab b/src/core/wt_profiles.tab deleted file mode 100644 index 614f027..0000000 --- a/src/core/wt_profiles.tab +++ /dev/null @@ -1,32 +0,0 @@ - --- --- DBOUT Profiles Table Installation --- - -create table wt_profiles - (test_run_id number(38) constraint wt_profiles_nn1 not null - ,line number(6) constraint wt_profiles_nn2 not null - ,status varchar2(4) constraint wt_profiles_nn3 not null - ,total_occur number(9) constraint wt_profiles_nn4 not null - ,total_usecs number constraint wt_profiles_nn5 not null - ,min_usecs number constraint wt_profiles_nn6 not null - ,max_usecs number constraint wt_profiles_nn7 not null - ,text varchar2(4000) constraint wt_profiles_nn8 not null - ,constraint wt_profiles_pk primary key (test_run_id, line) - ,constraint wt_profiles_fk1 foreign key (test_run_id) - references wt_test_runs (id) - ,constraint wt_profiles_ck1 check (status in ('EXEC','NOTX','EXCL','IGNR','UNKN')) - ) pctfree 0; - -comment on table wt_profiles is 'PL/SQL Profiler data for Database Object Under Test (DBOUT).'; -comment on column wt_profiles.test_run_id is 'Foreign Key for the Test Run, Primary Key part 1.'; -comment on column wt_profiles.line is 'Source code line number, Primary Key part 2.'; -comment on column wt_profiles.status is 'Executed/NotExecuted/Excluded/Ignored/Unknown Status from the Profiler'; -comment on column wt_profiles.total_occur is 'Number of times this line was executed.'; -comment on column wt_profiles.total_usecs is 'Total time in microseconds spent executing this line.'; -comment on column wt_profiles.min_usecs is 'Minimum execution time in microseconds for this line.'; -comment on column wt_profiles.max_usecs is 'Maximum execution time in microseconds for this line.'; -comment on column wt_profiles.text is 'Source code text for this line number.'; - -grant select on wt_profiles to public; -grant delete on wt_profiles to public; diff --git a/src/core/wt_profiles_vw.vw b/src/core/wt_profiles_vw.vw deleted file mode 100644 index ef86b9f..0000000 --- a/src/core/wt_profiles_vw.vw +++ /dev/null @@ -1,51 +0,0 @@ - --- --- DBOUT Profiles View Installation --- - -create view wt_profiles_vw as -select db.dbout_id - ,db.dbout_owner - ,db.dbout_name - ,db.dbout_type - ,db.test_runner_id - ,db.test_runner_owner - ,db.test_runner_name - ,db.test_run_id - ,db.is_last_run - ,db.trigger_offset - ,db.profiler_runid - ,db.error_message - ,prof.line - ,prof.status - ,prof.total_occur - ,prof.total_usecs - ,prof.min_usecs - ,prof.max_usecs - ,prof.text - from wt_profiles prof - join wt_dbout_runs_vw db - on db.test_run_id = prof.test_run_id; - -comment on table wt_profiles_vw is 'PL/SQL Profiler data for Database Object Under Test (DBOUT).'; -comment on column wt_profiles_vw.dbout_id is 'Surrogate Key to the Database Object Under Test (DBOUT).'; -comment on column wt_profiles_vw.dbout_owner is 'Owner of the Database Object Under Test (DBOUT).'; -comment on column wt_profiles_vw.dbout_name is 'Name of the Database Object Under Test (DBOUT).'; -comment on column wt_profiles_vw.dbout_type is 'Type of the Database Object Under Test (DBOUT).'; -comment on column wt_profiles_vw.test_runner_id is 'Surrogate Key the Test Runner package.'; -comment on column wt_profiles_vw.test_runner_owner is 'Owner of the Test Runner package.'; -comment on column wt_profiles_vw.test_runner_name is 'Name of the Test Runner package.'; -comment on column wt_profiles_vw.test_run_id is 'Foreign Key for the Test Run.'; -comment on column wt_profiles_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; -comment on column wt_profiles_vw.trigger_offset is 'Calculated offset from start of Trigger Source to start of Trigger PL/SQL Block.'; -comment on column wt_profiles_vw.profiler_runid is 'DBMS_PROFILER unique run identifier from plsql_profiler_runnumber sequence'; -comment on column wt_profiles_vw.error_message is 'Optional Error messages from this Test Run.'; -comment on column wt_profiles_vw.line is 'Source code line number.'; -comment on column wt_profiles_vw.status is 'Executed/NotExecuted/Excluded/Ignored/Unknown Status from the Profiler'; -comment on column wt_profiles_vw.total_occur is 'Number of times this line was executed.'; -comment on column wt_profiles_vw.total_usecs is 'Total time in microseconds spent executing this line.'; -comment on column wt_profiles_vw.min_usecs is 'Minimum execution time in microseconds for this line.'; -comment on column wt_profiles_vw.max_usecs is 'Maximum execution time in microseconds for this line.'; -comment on column wt_profiles_vw.text is 'Source code text for this line number.'; - -grant select on wt_profiles_vw to public; diff --git a/src/core/wt_result.pkb b/src/core/wt_result.pkb deleted file mode 100644 index ab60953..0000000 --- a/src/core/wt_result.pkb +++ /dev/null @@ -1,491 +0,0 @@ -create or replace package body wt_result -as - ----------------------- --- Private Procedures ----------------------- - ------------------------------------------------------------- -procedure adhoc_report - (in_assertion in varchar2 - ,in_status in varchar2 - ,in_details in varchar2 - ,in_testcase_name in varchar2 - ,in_message in varchar2) -is - procedure p (in_text in varchar2) is begin - dbms_output.put_line(in_text); - end p; -begin - p(' Test Case: ' || in_testcase_name); - p(' Message: ' || in_message); - p(' Status: ' || in_status); - p(' Assertion: ' || in_assertion); - p(' Details: ' || in_details); -end adhoc_report; - - ---------------------- --- Public Procedures ---------------------- - ------------------------------------------------------------- -procedure initialize - (in_test_run_id in wt_test_runs.id%TYPE) -is - l_results_recNULL wt_results_vw%ROWTYPE; -begin - if in_test_run_id is NULL - then - raise_application_error(-20009, '"in_test_run_id" cannot be NULL'); - end if; - g_results_rec := l_results_recNULL; - g_results_rec.test_run_id := in_test_run_id; - g_results_rec.result_seq := 0; - g_results_rec.executed_dtm := systimestamp; - g_results_nt := results_nt_type(null); -end initialize; - -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure t_initialize - is - l_results_recNULL wt_results_vw%ROWTYPE; - l_results_recSAVE wt_results_vw%ROWTYPE; - l_results_recTEST wt_results_vw%ROWTYPE; - l_results_ntSAVE results_nt_type; - l_results_ntTEST results_nt_type; - begin - -------------------------------------- WTPLSQL Testing -- - l_results_ntSAVE := g_results_nt; - l_results_recSAVE := g_results_rec; - g_results_rec := l_results_recNULL; - initialize(-99); - l_results_recTEST := g_results_rec; - g_results_rec := l_results_recSAVE; - l_results_ntTEST := g_results_nt; - g_results_nt := l_results_ntSAVE; - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'Initialize Happy Path'; - wt_assert.eq ( - msg_in => 'l_results_recTEST.test_run_id', - check_this_in => l_results_recTEST.test_run_id, - against_this_in => -99); - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq ( - msg_in => 'l_results_recTEST.result_seq', - check_this_in => l_results_recTEST.result_seq, - against_this_in => 0); - wt_assert.isnotnull ( - msg_in => 'l_results_recTEST.executed_dtm', - check_this_in => l_results_recTEST.executed_dtm); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull ( - msg_in => 'l_results_recTEST.interval_msecs', - check_this_in => l_results_recTEST.interval_msecs); - wt_assert.isnull ( - msg_in => 'l_results_recTEST.assertion', - check_this_in => l_results_recTEST.assertion); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull ( - msg_in => 'l_results_recTEST.status', - check_this_in => l_results_recTEST.status); - wt_assert.isnull ( - msg_in => 'l_results_recTEST.details', - check_this_in => l_results_recTEST.details); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull ( - msg_in => 'l_results_recTEST.testcase_id', - check_this_in => l_results_recTEST.testcase_id); - wt_assert.isnull ( - msg_in => 'l_results_recTEST.message', - check_this_in => l_results_recTEST.message); - wt_assert.eq ( - msg_in => 'l_results_ntTEST.COUNT', - check_this_in => l_results_ntTEST.COUNT, - against_this_in => 1); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull ( - msg_in => 'l_results_ntTEST(1).test_run_id', - check_this_in => l_results_ntTEST(1).test_run_id); - wt_assert.raises ( - msg_in => 'Raises ORA-20009', - check_call_in => 'begin wt_result.initialize(NULL); end;', - against_exc_in => 'ORA-20009: "in_test_run_id" cannot be NULL'); - end t_initialize; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- - - ------------------------------------------------------------- --- Because this procedure is called to cleanup after errors, --- it must be able to run multiple times without causing damage. -procedure finalize -is - l_results_rec wt_results%ROWTYPE; -begin - if g_results_rec.test_run_id IS NULL - then - return; - end if; - -- There is always an extra NULL element in the g_results_nt array. - for i in 1 .. g_results_nt.COUNT - 1 - loop - l_results_rec.TEST_RUN_ID := g_results_nt(i).TEST_RUN_ID; - l_results_rec.RESULT_SEQ := g_results_nt(i).RESULT_SEQ; - l_results_rec.TESTCASE_ID := g_results_nt(i).TESTCASE_ID; - l_results_rec.EXECUTED_DTM := g_results_nt(i).EXECUTED_DTM; - l_results_rec.INTERVAL_MSECS := g_results_nt(i).INTERVAL_MSECS; - l_results_rec.ASSERTION := g_results_nt(i).ASSERTION; - l_results_rec.STATUS := g_results_nt(i).STATUS; - l_results_rec.MESSAGE := g_results_nt(i).MESSAGE; - l_results_rec.DETAILS := g_results_nt(i).DETAILS; - insert into wt_results values l_results_rec; - end loop; -end finalize; - -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure t_finalize - is - -------------------------------------- WTPLSQL Testing -- - type num_recs_aa_type is table of number index by varchar2(50); - num_recs_aa num_recs_aa_type; - l_test_runs_rec wt_test_runs%ROWTYPE; - l_results_recNULL wt_results_vw%ROWTYPE; - l_results_recSAVE wt_results_vw%ROWTYPE; - l_results_recTEST wt_results_vw%ROWTYPE; - l_results_ntSAVE results_nt_type; - l_results_ntTEST results_nt_type; - l_num_recs number; - begin - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := ' '; - l_results_ntSAVE := g_results_nt; -- Capture Original Values - l_results_recSAVE := g_results_rec; -- Capture Original Values - -------------------------------------- WTPLSQL Testing -- - -- Can't Test in this block because g_results_rec has test data - g_results_rec := l_results_recNULL; - g_results_rec.test_run_id := -99; - g_results_rec.result_seq := 1; - g_results_rec.executed_dtm := systimestamp; - g_results_rec.interval_msecs := 99; - -------------------------------------- WTPLSQL Testing -- - g_results_rec.assertion := 'FINALTEST'; - g_results_rec.status := wt_assert.C_PASS; - g_results_rec.details := 'This is a WT_RESULT.FINALIZE Test'; - g_results_nt := results_nt_type(null); - g_results_nt(1) := g_results_rec; - g_results_nt.extend; -- Finalize expects that last element to be NULL - -------------------------------------- WTPLSQL Testing -- - -- Can't Test in this block because g_results_rec has test data - g_results_rec.test_run_id := NULL; - select count(*) - into num_recs_aa('Finalize Before NULL Test Record Count') - from wt_results - where test_run_id = -99; - finalize; - -------------------------------------- WTPLSQL Testing -- - select count(*) - into num_recs_aa('Finalize After NULL Test Record Count') - from wt_results - where test_run_id = -99; - rollback; -- UNDO all database changes - g_results_rec.test_run_id := -99; - -------------------------------------- WTPLSQL Testing -- - -- Can't Test in this block because g_results_rec has test data - l_test_runs_rec.id := -99; - l_test_runs_rec.start_dtm := systimestamp; - --l_test_runs_rec.runner_name := 'Finalize Test'; - --l_test_runs_rec.runner_owner := 'BOGUS'; - insert into wt_test_runs values l_test_runs_rec; - -------------------------------------- WTPLSQL Testing -- - finalize; -- g_results_nt is still loaded with one element - l_results_ntTEST := g_results_nt; - l_results_recTEST := g_results_rec; - select count(*) - into num_recs_aa('Finalize Record Count Test') - from wt_results - where test_run_id = -99; - delete from wt_results where test_run_id = -99; - delete from wt_test_runs where id = -99; - commit; -- UNDO all database changes - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'Finalize Happy Path'; - -- Restore values so we can test - g_results_rec := l_results_recSAVE; - g_results_nt := l_results_ntSAVE; - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq ( - msg_in => 'Before NULL Test Record Count', - check_this_in => num_recs_aa('Finalize Before NULL Test Record Count'), - against_this_in => 0); - wt_assert.eq ( - msg_in => 'After NULL Test Record Count', - check_this_in => num_recs_aa('Finalize After NULL Test Record Count'), - against_this_in => 0); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull ( - msg_in => 'l_results_recTEST.test_run_id', - check_this_in => l_results_recTEST.test_run_id); - wt_assert.eq ( - msg_in => 'l_results_ntTEST.COUNT', - check_this_in => l_results_ntTEST.COUNT, - against_this_in => 1); - wt_assert.eq ( - msg_in => 'Record Count Test', - check_this_in => num_recs_aa('Finalize Record Count Test'), - against_this_in => 1); - end t_finalize; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- - - ------------------------------------------------------------- -procedure save - (in_assertion in varchar2 - ,in_status in varchar2 - ,in_details in varchar2 - ,in_testcase_name in varchar2 - ,in_message in varchar2) -is - l_current_tstamp timestamp; -begin - if g_results_rec.test_run_id IS NULL - then - adhoc_report(in_assertion - ,in_status - ,in_details - ,in_testcase_name - ,in_message); - return; - end if; - -- Set the time and interval - l_current_tstamp := systimestamp; - g_results_rec.interval_msecs := extract(day from ( - l_current_tstamp - g_results_rec.executed_dtm - ) * 86400 * 1000); - g_results_rec.executed_dtm := l_current_tstamp; - -- Set the IN variables - g_results_rec.assertion := in_assertion; - g_results_rec.status := in_status; - g_results_rec.details := substr(in_details,1,4000); - g_results_rec.testcase_name := substr(in_testcase_name,1,128); - g_results_rec.message := substr(in_message,1,200); - -- Increment, Load, and Extend - g_results_rec.result_seq := g_results_rec.result_seq + 1; - g_results_nt(g_results_nt.COUNT) := g_results_rec; - g_results_nt.extend; - -end save; - -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure t_save_testing - is - -------------------------------------- WTPLSQL Testing -- - TYPE l_dbmsout_buff_type is table of varchar2(32767); - l_dbmsout_buff l_dbmsout_buff_type := l_dbmsout_buff_type(1); - l_test_run_id number; - l_dbmsout_line varchar2(32767); - l_dbmsout_stat number; - l_nt_count number; - begin - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'Ad Hoc Save Happy Path Setup'; - dbms_output.enable; - -- Save/Clear the DBMS_OUPTUT Buffer - loop - DBMS_OUTPUT.GET_LINE ( - line => l_dbmsout_line, - status => l_dbmsout_stat); - exit when l_dbmsout_stat != 0; - l_dbmsout_buff(l_dbmsout_buff.COUNT) := l_dbmsout_line; - l_dbmsout_buff.extend; - end loop; - wt_assert.isnotnull ( - msg_in => 'l_dbmsout_buff.COUNT - 1', - check_this_in => l_dbmsout_buff.COUNT - 1); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'Ad Hoc Save Testing Happy Path'; - l_test_run_id := g_results_rec.test_run_id; - g_results_rec.test_run_id := NULL; - wt_result.save ( - in_assertion => 'SELFTEST1', - in_status => wt_assert.C_PASS, - in_details => 't_save_testing Details', - in_testcase_name => wt_assert.g_testcase_name, - in_message => 't_save_testing Message'); - g_results_rec.test_run_id := l_test_run_id; - -------------------------------------- WTPLSQL Testing -- - DBMS_OUTPUT.GET_LINE ( - line => l_dbmsout_line, - status => l_dbmsout_stat); - wt_assert.eq ( - msg_in => 'DBMS_OUTPUT Status', - check_this_in => l_dbmsout_stat, - against_this_in => 0); - -------------------------------------- WTPLSQL Testing -- - if wt_assert.last_pass - then - wt_assert.isnotnull ( - msg_in => 'DBMS_OUTPUT Line', - check_this_in => l_dbmsout_line); - wt_assert.this ( - msg_in => 'Save Testing NULL Test DBMS_OUTPUT 3 Message', - check_this_in => (l_dbmsout_line like '%' || wt_assert.g_testcase_name || - '%t_save_testing %')); - -------------------------------------- WTPLSQL Testing -- - if not wt_assert.last_pass - then - -- No match, put the line back into DBMS_OUTPUT buffer and end this. - DBMS_OUTPUT.PUT_LINE(l_dbmsout_line); - end if; - end if; - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'Ad Hoc Save Happy Path Teardown'; - -- Restore the DBMS_OUPTUT Buffer - for i in 1 .. l_dbmsout_buff.COUNT - 1 - loop - DBMS_OUTPUT.PUT_LINE(l_dbmsout_buff(i)); - end loop; - wt_assert.isnotnull ( - msg_in => 'l_dbmsout_buff.COUNT - 1', - check_this_in => l_dbmsout_buff.COUNT - 1); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'Save Testing Happy Path'; - l_nt_count := g_results_nt.COUNT; - wt_result.save ( - in_assertion => 'SELFTEST2', - in_status => wt_assert.C_PASS, - in_details => 't_save_testing Testing Details', - in_testcase_name => wt_assert.g_testcase_name, - in_message => 't_save_testing Testing Message'); - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq ( - msg_in => 'g_results_nt.COUNT', - check_this_in => g_results_nt.COUNT, - against_this_in => l_nt_count + 1); - if not wt_assert.last_pass - then - return; -- Something went wrong, end this now. - end if; - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq ( - msg_in => 'g_results_nt(' || l_nt_count || ').assetion', - check_this_in => g_results_nt(l_nt_count).assertion, - against_this_in => 'SELFTEST2'); - wt_assert.eq ( - msg_in => 'g_results_nt(' || l_nt_count || ').status', - check_this_in => g_results_nt(l_nt_count).status, - against_this_in => wt_assert.C_PASS); - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq ( - msg_in => 'g_results_nt(' || l_nt_count || ').details', - check_this_in => g_results_nt(l_nt_count).details, - against_this_in => 't_save_testing Testing Details'); - wt_assert.eq ( - msg_in => 'g_results_nt(' || l_nt_count || ').testcase_name', - check_this_in => g_results_nt(l_nt_count).testcase_name, - against_this_in => wt_assert.g_testcase_name); - -------------------------------------- WTPLSQL Testing -- - wt_assert.eq ( - msg_in => 'g_results_nt(' || l_nt_count || ').message', - check_this_in => g_results_nt(l_nt_count).message, - against_this_in => 't_save_testing Testing Message'); - wt_assert.isnotnull ( - msg_in => 'g_results_nt(' || l_nt_count || ').interval_msecs', - check_this_in => g_results_nt(l_nt_count).interval_msecs); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnotnull ( - msg_in => 'g_results_nt(' || l_nt_count || ').executed_dtm', - check_this_in => g_results_nt(l_nt_count).executed_dtm); - wt_assert.isnotnull ( - msg_in => 'g_results_nt(' || l_nt_count || ').result_seq', - check_this_in => g_results_nt(l_nt_count).result_seq); - -- Can't Delete Test Element. g_results_nt.COUNT is not reduced - -- because nested tables are not dense. - --g_results_nt.delete(l_nt_count + 1); - end t_save_testing; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- - - ------------------------------------------------------------- -procedure delete_records - (in_test_run_id in number) -is -begin - delete from wt_results - where test_run_id = in_test_run_id; -end delete_records; - -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure t_delete_records - is - -------------------------------------- WTPLSQL Testing -- - l_test_runs_rec wt_test_runs%ROWTYPE; - l_results_rec wt_results%ROWTYPE; - l_num_recs number; - begin - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase_name := 'Delete Records Happy Path'; - select count(*) into l_num_recs - from wt_results - where test_run_id = -99; - wt_assert.isnotnull ( - msg_in => 'Before Insert Count', - check_this_in => l_num_recs); - -------------------------------------- WTPLSQL Testing -- - l_test_runs_rec.id := -99; - l_test_runs_rec.start_dtm := sysdate; - l_test_runs_rec.runner_name := 'Delete Records Test'; - l_test_runs_rec.runner_owner := 'BOGUS'; - insert into wt_test_runs values l_test_runs_rec; - l_results_rec.test_run_id := -99; - -------------------------------------- WTPLSQL Testing -- - l_results_rec.result_seq := 1; - l_results_rec.executed_dtm := sysdate; - l_results_rec.interval_msecs := 99; - l_results_rec.assertion := 'DELRECTEST'; - l_results_rec.status := wt_assert.C_PASS; - l_results_rec.details := 'This is a WT_RESULT.DELETE_RECORDS Test'; - insert into wt_results values l_results_rec; - -------------------------------------- WTPLSQL Testing -- - wt_assert.eqqueryvalue ( - msg_in => 'After Insert Count', - check_query_in => 'select count(*) from wt_results' || - ' where test_run_id = -99', - against_value_in => l_num_recs + 1); - delete_records(-99); - -------------------------------------- WTPLSQL Testing -- - wt_assert.eqqueryvalue ( - msg_in => 'After Test Count', - check_query_in => 'select count(*) from wt_results' || - ' where test_run_id = -99', - against_value_in => l_num_recs); - rollback; - wt_assert.eqqueryvalue ( - msg_in => 'After ROLLBACK Count', - check_query_in => 'select count(*) from wt_results' || - ' where test_run_id = -99', - against_value_in => l_num_recs); - end t_delete_records; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- - - ---==============================================================-- -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_RESULT:PACKAGE BODY" %-- - is - begin - -------------------------------------- WTPLSQL Testing -- - t_initialize; - t_finalize; - t_save_testing; - t_delete_records; - end WTPLSQL_RUN; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- ---==============================================================-- - - -end wt_result; diff --git a/src/core/wt_result.pks b/src/core/wt_result.pks deleted file mode 100644 index 81fa566..0000000 --- a/src/core/wt_result.pks +++ /dev/null @@ -1,35 +0,0 @@ -create or replace package wt_result - authid definer -as - - TYPE results_nt_type is table of wt_results_vw%ROWTYPE; - g_results_nt results_nt_type; - g_results_rec wt_results_vw%ROWTYPE; - - procedure initialize - (in_test_run_id in wt_test_runs.id%TYPE); - - procedure finalize; - - procedure save - (in_assertion in varchar2 - ,in_status in varchar2 - ,in_details in varchar2 - ,in_testcase_name in varchar2 - ,in_message in varchar2); - - procedure delete_records - (in_test_run_id in number); - - -- WtPLSQL Self Test Procedures - -- - -- alter system set PLSQL_CCFLAGS = - -- 'WTPLSQL_SELFTEST:TRUE' - -- scope=BOTH; - -- - $IF $$WTPLSQL_SELFTEST - $THEN - procedure WTPLSQL_RUN; - $END - -end wt_result; diff --git a/src/core/wt_results.tab b/src/core/wt_results.tab deleted file mode 100644 index d6757ae..0000000 --- a/src/core/wt_results.tab +++ /dev/null @@ -1,39 +0,0 @@ - --- --- Results Table Installation --- - -create table wt_results - (test_run_id number(38) constraint wt_results_nn1 not null - ,result_seq number(8) constraint wt_results_nn2 not null - ,testcase_id number(38) constraint wt_results_nn3 not null - ,executed_dtm timestamp(6) constraint wt_results_nn4 not null - ,interval_msecs number(10,3) constraint wt_results_nn5 not null - ,assertion varchar2(15) constraint wt_results_nn6 not null - ,status varchar2(4) constraint wt_results_nn7 not null - ,message varchar2(200) - ,details varchar2(4000) - ,constraint wt_results_pk primary key (test_run_id, result_seq) - ,constraint wt_results_fk1 foreign key (test_run_id) - references wt_test_runs (id) - ,constraint wt_results_fk2 foreign key (testcase_id) - references wt_testcases (id) - ,constraint wt_results_ck1 check (status in ('PASS','FAIL')) - ) pctfree 0; - -create index wt_results_ix1 - on wt_results(testcase_id, test_run_id); - -comment on table wt_results is 'Results data from Test Runs.'; -comment on column wt_results.test_run_id is 'Foreign Key for the Test Run, Primary Key part 1.'; -comment on column wt_results.result_seq is 'Sequence number for this Result, Primary Key part 2.'; -comment on column wt_results.testcase_id is 'Foreign Key for the Test Case.'; -comment on column wt_results.executed_dtm is 'Date/Time (with Fractional Seconds) this Result was captured'; -comment on column wt_results.interval_msecs is 'Interval time in milliseonds since the previous Result or start ot the Test Run.'; -comment on column wt_results.assertion is 'Name of the Assertion Test performed'; -comment on column wt_results.status is 'PASS/FAIL Status from the Assertion'; -comment on column wt_results.details is 'Assertion Details, i.e. Expected Value and Actual Value'; -comment on column wt_results.message is 'Optional test identifier that helps connect an Assertion to the Test Runner.'; - -grant select on wt_results to public; -grant delete on wt_results to public; diff --git a/src/core/wt_results_vw.vw b/src/core/wt_results_vw.vw deleted file mode 100644 index 3db8447..0000000 --- a/src/core/wt_results_vw.vw +++ /dev/null @@ -1,49 +0,0 @@ - --- --- Results View Installation --- - -create view wt_results_vw as -select tr.test_runner_id - ,tr.test_runner_owner - ,tr.test_runner_name - ,res.test_run_id - ,tr.is_last_run - ,tr.start_dtm - ,tr.end_dtm - ,tr.error_message - ,res.result_seq - ,res.testcase_id - ,tc.name TESTCASE_NAME - ,res.executed_dtm - ,res.interval_msecs - ,res.assertion - ,res.status - ,res.message - ,res.details - from wt_results res - join wt_test_runs_vw tr - on tr.test_run_id = res.test_run_id - join wt_testcases tc - on tc.id = res.testcase_id; - -comment on table wt_results_vw is 'Results data from Test Runs.'; -comment on column wt_results_vw.test_runner_id is 'Surrogate Key the Test Runner package.'; -comment on column wt_results_vw.test_runner_owner is 'Owner of the Test Runner package.'; -comment on column wt_results_vw.test_runner_name is 'Name of the Test Runner package.'; -comment on column wt_results_vw.test_run_id is 'Foreign Key for the Test Run'; -comment on column wt_results_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; -comment on column wt_results_vw.start_dtm is 'Date/time (and fractional seconds) this Test Run started.'; -comment on column wt_results_vw.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; -comment on column wt_results_vw.error_message is 'Optional Error messages from this Test Run.'; -comment on column wt_results_vw.result_seq is 'Sequence number for this Result'; -comment on column wt_results_vw.testcase_id is 'Foreign Key for the Test Case.'; -comment on column wt_results_vw.testcase_name is 'The Test Case name'; -comment on column wt_results_vw.executed_dtm is 'Date/Time (with Fractional Seconds) this Result was captured'; -comment on column wt_results_vw.interval_msecs is 'Interval time in milliseonds since the previous Result or start ot the Test Run.'; -comment on column wt_results_vw.assertion is 'Name of the Assertion Test performed'; -comment on column wt_results_vw.status is 'PASS/FAIL Status from the Assertion'; -comment on column wt_results_vw.details is 'Assertion Details, i.e. Expected Value and Actual Value'; -comment on column wt_results_vw.message is 'Optional test identifier that helps connect an Assertion to the Test Runner.'; - -grant select on wt_results_vw to public; diff --git a/src/core/wt_test_run.pkb b/src/core/wt_test_run.pkb deleted file mode 100644 index 97a09f6..0000000 --- a/src/core/wt_test_run.pkb +++ /dev/null @@ -1,275 +0,0 @@ -create or replace package body wt_testcase -as - - ------------------------------------------------------------- --- Use the CLEAR_LAST_RUN procedure to clear the IS_LAST_RUN --- flag before running this procedure. -procedure clear_last_run - (in_runner_owner in varchar2 - ,in_runner_name in varchar2 - ,in_last_run_flag in varchar2) -as -begin - update wt_test_runs - set is_last_run = NULL - where runner_owner = in_runner_owner - and runner_name = in_runner_name - and is_last_run = in_last_run_flag; -end clear_last_run; - - ------------------------------------------------------------- --- Use the SET_LAST_RUN procedure to set the IS_LAST_RUN flag --- after running this procedure. -procedure set_last_run - (in_runner_owner in varchar2 - ,in_runner_name in varchar2 - ,in_last_run_flag in varchar2) -as -begin - for buff in (select * from wt_test_runs - where runner_owner = in_runner_owner - and runner_name = in_runner_name - and is_last_run = in_last_run_flag ) - loop - -- Abort if a IS_LAST_RUN flag is already set - return; - end loop; - update wt_test_runs - set is_last_run = in_last_run_flag - where runner_owner = in_runner_owner - and runner_name = in_runner_name - and start_dtm = ( - select max(trn.start_dtm) - from wt_test_runs trn - where trn.runner_owner = in_runner_owner - and trn.runner_name = in_runner_name ); -end set_last_run; - - ---------------------- --- Public Procedures ---------------------- - - ------------------------------------------------------------- -procedure insert_test_run - (in_test_runs_rec in wt_test_runs_vw%ROWTYPE) -is -begin - if g_test_runs_rec.id is null - then - return; - end if; - g_test_runs_rec.end_dtm := systimestamp; - clear_last_run - (in_runner_owner => g_test_runs_rec.runner_owner - ,in_runner_name => g_test_runs_rec.runner_name - ,in_last_run_flag => IS_LAST_RUN_FLAG); - insert into wt_test_runs values g_test_runs_rec; -end insert_test_run; - -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure t_insert_test_run - is - -------------------------------------- WTPLSQL Testing -- - TYPE l_dbmsout_buff_type is table of varchar2(32767); - l_dbmsout_buff l_dbmsout_buff_type; - l_test_runs_rec wt_test_runs%ROWTYPE; - l_dbmsout_line varchar2(32767); - l_dbmsout_stat number; - l_num_recs number; - begin - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'INSERT_TEST_RUN Happy Path 1'; - wt_assert.eqqueryvalue ( - msg_in => 'Records Before Insert', - check_query_in => 'select count(*) from wt_test_runs' || - ' where id = ' || g_test_runs_rec.id, - against_value_in => 0); - -------------------------------------- WTPLSQL Testing -- - l_test_runs_rec := g_test_runs_rec; - insert_test_run; - g_test_runs_rec := l_test_runs_rec; - wt_assert.eqqueryvalue ( - msg_in => 'Number of Records', - check_query_in => 'select count(*) from wt_test_runs' || - ' where id = ' || g_test_runs_rec.id, - against_value_in => 1); - -------------------------------------- WTPLSQL Testing -- - delete from wt_test_runs - where id = l_test_runs_rec.id; - COMMIT; - wt_assert.eqqueryvalue ( - msg_in => 'Records After Delete', - check_query_in => 'select count(*) from wt_test_runs' || - ' where id = ' || g_test_runs_rec.id, - against_value_in => 0); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'INSERT_TEST_RUN Happy Path 2'; - l_test_runs_rec := g_test_runs_rec; - g_test_runs_rec.id := null; - insert_test_run; - g_test_runs_rec := l_test_runs_rec; - wt_assert.eqqueryvalue ( - msg_in => 'Records After Delete', - check_query_in => 'select count(*) from wt_test_runs' || - ' where id = ' || g_test_runs_rec.id, - against_value_in => 0); - end t_insert_test_run; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- - ------------------------------------------------------------- -procedure delete_runs - (in_test_run_id in number) -is - r_owner varchar2(200); - r_name varchar2(200); -begin - wt_hook.before_delete_runs; - wt_test_run_stat.delete_records(in_test_run_id); - wt_profiler.delete_records(in_test_run_id); - wt_result.delete_records(in_test_run_id); - begin - -- - select runner_owner, runner_name - into r_owner, r_name - from wt_test_runs - where id = in_test_run_id; - -- - delete from wt_test_runs - where id = in_test_run_id; - -- - set_last_run(in_runner_owner => r_owner - ,in_runner_name => r_name - ,in_last_run_flag => IS_LAST_RUN_FLAG); - -- - exception when NO_DATA_FOUND - then - null; -- Ignore Error - end; - wt_hook.after_delete_runs; -end delete_runs; - -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure t_delete_run_id - is - l_num_recs number; - l_err_stack varchar2(32000); - begin - -------------------------------------- WTPLSQL Testing -- - -- DELETE_RECORDS has already run when we arrive here. - -- Cleanup from previous test - delete from wt_test_runs - where id between 0-g_keep_num_recs and 0-1; - commit; - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'DELETE_RUNS Happy Path 1'; - select count(*) - into l_num_recs - from wt_test_runs - where runner_owner = g_test_runs_rec.runner_owner - and runner_name = g_test_runs_rec.runner_name; - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnotnull ( - msg_in => 'Number of Records Before Insert', - check_this_in => l_num_recs); - wt_assert.this ( - msg_in => 'Number of Records Before Insert <= ' || g_keep_num_recs, - check_this_in => l_num_recs <= g_keep_num_recs); - -------------------------------------- WTPLSQL Testing -- - insert into wt_test_runs values g_test_runs_rec; - COMMIT; - wt_assert.eqqueryvalue ( - msg_in => 'Number of Records After Insert', - check_query_in => 'select count(*) from wt_test_runs' || - ' where id = ' || g_test_runs_rec.id, - against_value_in => 1); - delete_runs(g_test_runs_rec.id); - -------------------------------------- WTPLSQL Testing -- - wt_assert.eqqueryvalue ( - msg_in => 'Number of Records After Delete', - check_query_in => 'select count(*) from wt_test_runs' || - ' where id = ' || g_test_runs_rec.id, - against_value_in => 0); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'DELETE_RUNS Happy Path 2'; - wt_assert.eqqueryvalue ( - msg_in => 'Confirm number of records', - check_query_in => 'select count(*) from wt_test_runs' || - ' where runner_owner = ''' || g_test_runs_rec.runner_owner || - ''' and runner_name = ''' || g_test_runs_rec.runner_name || - '''', - against_value_in => l_num_recs); - -------------------------------------- WTPLSQL Testing -- - for i in 1 .. g_keep_num_recs - loop - insert into wt_test_runs - (id, start_dtm, runner_owner, runner_name) - values - (0-i, sysdate-7000-i, g_test_runs_rec.runner_owner, g_test_runs_rec.runner_name); - end loop; - commit; - -------------------------------------- WTPLSQL Testing -- - wt_assert.eqqueryvalue ( - msg_in => 'Check Added ' || g_keep_num_recs || ' records', - check_query_in => 'select count(*) from wt_test_runs' || - ' where runner_owner = ''' || g_test_runs_rec.runner_owner || - ''' and runner_name = ''' || g_test_runs_rec.runner_name || - '''', - against_value_in => l_num_recs + g_keep_num_recs); - delete_runs(g_test_runs_rec.runner_owner, g_test_runs_rec.runner_name); - -------------------------------------- WTPLSQL Testing -- - wt_assert.eqqueryvalue ( - msg_in => 'Check number of records reduced', - check_query_in => 'select count(*) from wt_test_runs' || - ' where runner_owner = ''' || g_test_runs_rec.runner_owner || - ''' and runner_name = ''' || g_test_runs_rec.runner_name || - '''', - against_value_in => g_keep_num_recs); - delete from wt_test_runs - where id between 0-g_keep_num_recs and 0-1; - commit; - -------------------------------------- WTPLSQL Testing -- - wt_assert.eqqueryvalue ( - msg_in => 'Confirm original number of records', - check_query_in => 'select count(*) from wt_test_runs' || - ' where runner_owner = ''' || g_test_runs_rec.runner_owner || - ''' and runner_name = ''' || g_test_runs_rec.runner_name || - '''', - against_value_in => l_num_recs); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'DELETE_RUNS Sad Path 1'; - begin - delete_runs(-9995); -- Should run without error - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - exception when others then - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - end; - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull ( - msg_in => 'Delete Runs(-9995)', - check_this_in => l_err_stack); - end t_delete_run_id; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- - - ---==============================================================-- -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure WTPLSQL_RUN - is - begin - -------------------------------------- WTPLSQL Testing -- - t_insert_test_run; - end; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- ---==============================================================-- - - -end wt_testcase; diff --git a/src/core/wt_test_run.pks b/src/core/wt_test_run.pks deleted file mode 100644 index 23d869c..0000000 --- a/src/core/wt_test_run.pks +++ /dev/null @@ -1,22 +0,0 @@ -create or replace package wt_test_run - authid definer -as - - procedure insert_test_run - (in_test_runs_rec in wt_test_runs_vw%ROWTYPE); - - procedure delete_runs - (in_test_run_id in number); - - -- WtPLSQL Self Test Procedures - -- - -- alter system set PLSQL_CCFLAGS = - -- 'WTPLSQL_SELFTEST:TRUE' - -- scope=BOTH; - -- - $IF $$WTPLSQL_SELFTEST - $THEN - procedure WTPLSQL_RUN; - $END - -end wt_testcase; diff --git a/src/core/wt_test_runner.pkb b/src/core/wt_test_runner.pkb deleted file mode 100644 index bf2cfe4..0000000 --- a/src/core/wt_test_runner.pkb +++ /dev/null @@ -1,95 +0,0 @@ -create or replace package body wt_test_runner -as - - ---------------------- --- Public Procedures ---------------------- - - ------------------------------------------------------------- -function get_id - (in_owner in varchar2 - ,in_name in varchar2) - return number -is - l_id number; -begin - select id into l_id - from wt_test_runners - where owner = in_owner - and name = in_name; - return l_id; -exception when NO_DATA_FOUND then - l_id := wt_test_runners_seq.nextval; - insert into wt_test_runners (id, owner, name) - values (l_id, in_owner, in_name); - commit; - return l_id; -end get_id; - -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure t_get_id - is - begin - -------------------------------------- WTPLSQL Testing -- - null; - end t_get_id; - procedure t_insert_test_runner - is - C_OWNER CONSTANT varchar2(50) := 'WT_TEST_RUNNER_OWNER_FOR_TESTING'; - C_NAME CONSTANT varchar2(50) := 'WT_TEST_RUNNER_NAME_FOR_TESTING'; - l_id number; - num_recs number; - begin - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'INSERT_TEST_RUNNER Happy Path 1'; - delete from wt_test_runners - where owner = C_OWNER - and name = C_NAME; - wt_assert.eqqueryvalue - (msg_in => 'Number of Starting Records' - ,check_query_in => 'select count(name) from wt_test_runners' || - ' where owner = ' || C_OWNER || - ' and name = ' || C_NAME - ,against_value_in => 0); - end t_insert_test_runner; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- - - ------------------------------------------------------------- -procedure delete_id - (in_id in number) -is -begin - delete from wt_test_runners - where id = in_id; -end delete_id; - -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure t_delete_id - is - begin - -------------------------------------- WTPLSQL Testing -- - null; - end t_delete_id; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- - - ---==============================================================-- -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_TEST_RUNNER:PACKAGE BODY" %-- - is - begin - -------------------------------------- WTPLSQL Testing -- - t_get_id; - t_delete_id; - end; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- ---==============================================================-- - - -end wt_test_runner; diff --git a/src/core/wt_test_runner.pks b/src/core/wt_test_runner.pks deleted file mode 100644 index edc54f4..0000000 --- a/src/core/wt_test_runner.pks +++ /dev/null @@ -1,24 +0,0 @@ -create or replace package wt_test_runner - authid definer -as - - function get_id - (in_owner in varchar2 - ,in_name in varchar2) - return number; - - procedure delete_id - (in_id in number); - - -- WtPLSQL Self Test Procedures - -- - -- alter system set PLSQL_CCFLAGS = - -- 'WTPLSQL_SELFTEST:TRUE' - -- scope=BOTH; - -- - $IF $$WTPLSQL_SELFTEST - $THEN - procedure WTPLSQL_RUN; - $END - -end wt_test_runner; diff --git a/src/core/wt_test_runners.tab b/src/core/wt_test_runners.tab deleted file mode 100644 index bbd4b37..0000000 --- a/src/core/wt_test_runners.tab +++ /dev/null @@ -1,22 +0,0 @@ - --- --- Test Runs Statistics Table Installation --- - -create sequence wt_test_runners_seq order; - -create table wt_test_runners - (id number(38) constraint wt_test_runners_nn1 not null - ,owner varchar2(128) constraint wt_test_runners_nn2 not null - ,name varchar2(128) constraint wt_test_runners_nn3 not null - ,constraint wt_test_runners_pk primary key (id) - ,constraint wt_test_runners_nk1 unique (owner, name) - ) pctfree 0; - -comment on table wt_test_runners is 'List of Test Runners.'; -comment on column wt_test_runners.id is 'Primary (Surrogate) Key for each Test Runner'; -comment on column wt_test_runners.owner is 'Owner of the Test Runner package. Natural Key 1 part 1'; -comment on column wt_test_runners.name is 'Name of the Test Runner package. Natural Key 1 part 2'; - -grant select on wt_test_runners to public; -grant delete on wt_test_runners to public; diff --git a/src/core/wt_test_runs.tab b/src/core/wt_test_runs.tab deleted file mode 100644 index e00ee90..0000000 --- a/src/core/wt_test_runs.tab +++ /dev/null @@ -1,51 +0,0 @@ - --- --- Test Runs Table Installation --- - -create sequence wt_test_runs_seq order; - -grant select on wt_test_runs_seq to public; - -create table wt_test_runs - (id number(38) constraint wt_test_runs_nn1 not null - ,test_runner_id number(38) constraint wt_test_runs_nn2 not null - ,start_dtm timestamp constraint wt_test_runs_nn3 not null - ,end_dtm timestamp - ,dbout_id number(38) - ,trigger_offset number(6) - ,profiler_runid number - ,is_last_run varchar2(1) - ,error_message varchar2(4000) - ,constraint wt_test_runs_pk primary key (id) - ,constraint wt_test_runs_nk1 unique (test_runner_id, start_dtm) - ,constraint wt_test_runs_fk1 foreign key (test_runner_id) - references wt_test_runners (id) - ,constraint wt_test_runs_fk2 foreign key (dbout_id) - references wt_dbouts (id) - ,constraint wt_test_runs_fk3 foreign key (profiler_runid) - references plsql_profiler_runs (runid) disable - ,constraint wt_test_runs_ck1 check (trigger_offset >= 0) - ,constraint wt_test_runs_ck2 check (is_last_run = 'Y') - ) pctfree 0; - -create index wt_test_runs_ix1 - on wt_test_runs(is_last_run, test_runner_id); - -create index wt_test_runs_ix2 - on wt_test_runs(dbout_id, test_runner_id); - -comment on table wt_test_runs is 'Test Run data for each execution of a Test Runner.'; -comment on column wt_test_runs.id is 'Primary (Surrogate) Key for each Test Run'; -comment on column wt_test_runs.test_runner_id is 'Surrogate Key the Test Runner package. Natural Key 1 part 1'; -comment on column wt_test_runs.start_dtm is 'Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 2'; -comment on column wt_test_runs.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; -comment on column wt_test_runs.dbout_id is 'Optional Surrogate Key to the Database Object Under Test (DBOUT).'; -comment on column wt_test_runs.trigger_offset is 'Optional calculated offset from start of Trigger Source to start of Trigger PL/SQL Block.'; -comment on column wt_test_runs.profiler_runid is 'Optional DBMS_PROFILER unique run identifier from plsql_profiler_runnumber sequence'; -comment on column wt_test_runs.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; -comment on column wt_test_runs.error_message is 'Optional Error messages from this Test Run.'; - -grant select on wt_test_runs to public; -grant insert on wt_test_runs to public; -grant delete on wt_test_runs to public; diff --git a/src/core/wt_test_runs_vw.vw b/src/core/wt_test_runs_vw.vw deleted file mode 100644 index 2a446bd..0000000 --- a/src/core/wt_test_runs_vw.vw +++ /dev/null @@ -1,29 +0,0 @@ - --- --- Test Runs Table View Installation --- - -create view wt_test_runs_vw as -select tr.id TEST_RUN_ID - ,tr.test_runner_id - ,tnr.owner TEST_RUNNER_OWNER - ,tnr.name TEST_RUNNER_NAME - ,tr.is_last_run - ,tr.start_dtm - ,tr.end_dtm - ,tr.error_message - from wt_test_runs tr - join wt_test_runners tnr - on tnr.id = tr.test_runner_id; - -comment on table wt_test_runs_vw is 'Test Run data for each execution of a Test Runner.'; -comment on column wt_test_runs_vw.test_run_id is 'Primary (Surrogate) Key for each Test Run'; -comment on column wt_test_runs_vw.test_runner_id is 'Surrogate Key the Test Runner package.'; -comment on column wt_test_runs_vw.test_runner_owner is 'Owner of the Test Runner package.'; -comment on column wt_test_runs_vw.test_runner_name is 'Name of the Test Runner package.'; -comment on column wt_test_runs_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; -comment on column wt_test_runs_vw.start_dtm is 'Date/time (and fractional seconds) this Test Run started.'; -comment on column wt_test_runs_vw.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; -comment on column wt_test_runs_vw.error_message is 'Optional Error messages from this Test Run.'; - -grant select on wt_test_runs_vw to public; diff --git a/src/core/wt_testcase.pkb b/src/core/wt_testcase.pkb deleted file mode 100644 index 0ef0817..0000000 --- a/src/core/wt_testcase.pkb +++ /dev/null @@ -1,39 +0,0 @@ -create or replace package body wt_testcase -as - - ---------------------- --- Public Procedures ---------------------- - - ------------------------------------------------------------- -function get_id - (in_testcase in varchar2) - return number -is - rec wt_testcases%ROWTYPE; -begin - select id into rec.id from wt_testcases - where testcase = in_testcase; - return rec.id; -exception - when NO_DATA_FOUND - then - rec.id := wt_testcases_seq.nextval; - rec.testcase := in_testcase; - insert into wt_testcases values rec; - return rec.id; -end get_id; - ------------------------------------------------------------- -procedure clear_unused -is -begin - delete from wt_testcases - where id not in ( - select testcase_id - from wt_results ); -end clear_unused; - -end wt_testcase; diff --git a/src/core/wt_testcase.pks b/src/core/wt_testcase.pks deleted file mode 100644 index 3db395d..0000000 --- a/src/core/wt_testcase.pks +++ /dev/null @@ -1,11 +0,0 @@ -create or replace package wt_testcase - authid definer -as - - function get_id - (in_testcase in varchar2) - return number; - - procedure clear_unused; - -end wt_testcase; diff --git a/src/core/wt_testcases.tab b/src/core/wt_testcases.tab deleted file mode 100644 index 042fbd5..0000000 --- a/src/core/wt_testcases.tab +++ /dev/null @@ -1,20 +0,0 @@ - --- --- Test Cases Table Installation --- - -create sequence wt_testcases_seq; - -create table wt_testcases - (id number(38) constraint wt_testcases_nn1 not null - ,name varchar2(128) constraint wt_testcases_nn2 not null - ,constraint wt_testcases_pk primary key (id) - ,constraint wt_testcases_nk1 unique (name) - ); - -comment on table wt_testcases is 'Test Cases Used by Test Runners.'; -comment on column wt_testcases.id is 'Primary (Surrogate) Key for each Test Case'; -comment on column wt_testcases.name is 'Natural Key. The Test Case name'; - -grant select on wt_testcases to public; -grant delete on wt_testcases to public; diff --git a/src/core/wt_text_report.pkb b/src/core/wt_text_report.pkb index 6219ffc..3d76df0 100644 --- a/src/core/wt_text_report.pkb +++ b/src/core/wt_text_report.pkb @@ -18,389 +18,197 @@ end p; ------------------------------------------------------------ procedure result_summary is + TYPE tcase_aa_type is table of varchar2(1) + index by varchar2(200); + tcase_aa tcase_aa_type; + tot_cnt number := 0; + fail_cnt number := 0; + min_msec number := 0; + max_msec number := 0; + tot_msec number := 0; + avg_msec number := 0; l_yield_txt varchar2(50); begin - for buff in ( - select count(*) TOT_CNT - ,sum(decode(status,'FAIL',1,0)) FAIL_CNT - ,sum(decode(status,'ERR',1,0)) ERR_CNT - ,count(distinct testcase) TCASE_CNT - ,min(elapsed_msecs) MIN_MSEC - ,round(avg(elapsed_msecs),3) AVG_MSEC - ,max(elapsed_msecs) MAX_MSEC - from wt_results - where test_run_id = g_test_runs_rec.id ) + tot_cnt := core_data.g_results_nt.COUNT; + for i in 1 .. tot_cnt loop - if buff.tot_cnt = 0 + tcase_aa(core_data.g_results_nt(i).testcase) := 'x'; + if not core_data.g_results_nt(i).pass then - l_yield_txt := '(Divide by Zero)'; - else - l_yield_txt := to_char(round( ( 1 - (buff.fail_cnt+buff.err_cnt) - / buff.tot_cnt - ) * 100 - ,2) - ,'9990.99') || '%'; + fail_cnt := fail_cnt + 1; end if; - p(' Total Testcases: ' || to_char(nvl(buff.tcase_cnt,0),'9999999') || - ' Total Assertions: ' || to_char(nvl(buff.tot_cnt ,0),'9999999') ); - p(' Minimum Elapsed msec: ' || to_char(nvl(buff.min_msec ,0),'9999999') || - ' Failed Assertions: ' || to_char(nvl(buff.fail_cnt ,0),'9999999') ); - p(' Average Elapsed msec: ' || to_char(nvl(buff.avg_msec ,0),'9999999') || - ' Error Assertions: ' || to_char(nvl(buff.err_cnt ,0),'9999999') ); - p(' Maximum Elapsed msec: ' || to_char(nvl(buff.max_msec ,0),'9999999') || - ' Test Yield: ' || l_yield_txt ); + min_msec := LEAST(min_msec, core_data.g_results_nt(i).interval_msecs); + max_msec := GREATEST(max_msec, core_data.g_results_nt(i).interval_msecs); + tot_msec := tot_msec + core_data.g_results_nt(i).interval_msecs; end loop; + if nvl(tot_cnt,0) = 0 + then + avg_msec := 0; + l_yield_txt := '(Divide by Zero)'; + else + avg_msec := tot_msec / tot_cnt; + l_yield_txt := to_char(round(100*(1-(fail_cnt/tot_cnt)), 2) + ,'9990.99') || '%'; + end if; + p(' Minimum Elapsed msec: ' || to_char(min_msec, '9999999') || + ' Total Testcases: ' || to_char(tcase_aa.COUNT,'9999999') ); + p(' Average Elapsed msec: ' || to_char(avg_msec, '9999999') || + ' Total Assertions: ' || to_char(tot_cnt, '9999999') ); + p(' Maximum Elapsed msec: ' || to_char(max_msec, '9999999') || + ' Failed Assertions: ' || to_char(fail_cnt, '9999999') ); + p(' Total Run Time (sec): ' || + to_char(extract(day from (core_data.g_run_rec.end_dtm - + core_data.g_run_rec.start_dtm) * 86400 * 100) / 100 + ,'99990.9') || + ' Test Yield: ' || l_yield_txt ); end result_summary; ------------------------------------------------------------- -procedure profile_summary -is - l_code_coverage varchar2(100); -begin - for buff in ( - select count(*) TOT_LINES - ,sum(decode(status,'EXEC',1,0)) EXEC_LINES - ,sum(decode(status,'ANNO',1,0)) ANNO_LINES - ,sum(decode(status,'EXCL',1,0)) EXCL_LINES - ,sum(decode(status,'NOTX',1,0)) NOTX_LINES - ,sum(decode(status,'UNKN',1,0)) UNKN_LINES - ,min(min_time)/1000 MIN_USEC - ,sum(total_time)/1000/count(*) AVG_USEC - ,max(max_time)/1000 MAX_USEC - from wt_dbout_profiles - where test_run_id = g_test_runs_rec.id ) - loop - p(' Total Source Lines: ' || to_char(nvl(buff.tot_lines ,0),'9999999') || - ' Missed Lines: ' || to_char(nvl(buff.notx_lines,0),'9999999') ); - p(' Minimum Elapsed usec: ' || to_char(nvl(buff.min_usec ,0),'9999999') || - ' Annotated Lines: ' || to_char(nvl(buff.anno_lines,0),'9999999') ); - p(' Average Elapsed usec: ' || to_char(nvl(buff.avg_usec ,0),'9999999') || - ' Excluded Lines: ' || to_char(nvl(buff.excl_lines,0),'9999999') ); - p(' Maximum Elapsed usec: ' || to_char(nvl(buff.max_usec ,0),'9999999') || - ' Unknown Lines: ' || to_char(nvl(buff.unkn_lines,0),'9999999') ); - if (buff.exec_lines + buff.notx_lines) = 0 - then - l_code_coverage := '(Divide by Zero)'; - else - l_code_coverage := to_char( 100 * buff.exec_lines / - (buff.exec_lines + buff.notx_lines) - ,'9990.99') || '%'; - end if; - p(' Trigger Source Offset: ' || to_char(g_test_runs_rec.trigger_offset,'9999999') || - ' Code Coverage: ' || l_code_coverage); - end loop; -end profile_summary; - ------------------------------------------------------------ procedure summary_out is begin p(''); --- p( g_test_runs_rec.runner_owner || --- '.' || g_test_runs_rec.runner_name || --- -- ' Test Runner' || --- ' (Test Run ID ' || g_test_runs_rec.id || --- ')' ); - p(' wtPLSQL V' || wtplsql.show_version || ' - Start Date/Time: ' || - to_char(g_test_runs_rec.start_dtm, g_date_format) || + p(' wtPLSQL ' || wtplsql.show_version || ' - Start Date/Time: ' || + to_char(core_data.g_run_rec.start_dtm, g_date_format) || CHR(10)); - p('Test Results Run ID: ' || g_test_runs_rec.id || - ', ' || g_test_runs_rec.runner_owner || - '.' || g_test_runs_rec.runner_name ); + p('Test Results for ' || core_data.g_run_rec.runner_owner || + '.' || core_data.g_run_rec.runner_name ); + ---------------------------------------- + if core_data.g_run_rec.dbout_name is not null + then + p('Database Object Under Test is ' || core_data.g_run_rec.dbout_type || + ' ' || core_data.g_run_rec.dbout_owner || + '.' || core_data.g_run_rec.dbout_name ); + end if; p('----------------------------------------'); result_summary; - p(' Total Run Time (sec): ' || - to_char(extract(day from (g_test_runs_rec.end_dtm - - g_test_runs_rec.start_dtm) * 86400 * 100) / 100 - ,'99990.9') ); - if g_test_runs_rec.error_message is not null + if core_data.g_run_rec.error_message is not null then p(''); p(' *** Test Runner Error ***'); - p(g_test_runs_rec.error_message); + p(core_data.g_run_rec.error_message); end if; - ---------------------------------------- - if g_test_runs_rec.dbout_name is null - then - return; - end if; - p(''); --- p( g_test_runs_rec.dbout_owner || --- '.' || g_test_runs_rec.dbout_name || --- ' ' || g_test_runs_rec.dbout_type || --- ' Code Coverage' || --- ' (Test Run ID ' || g_test_runs_rec.id || --- ')' ); - p('Code Coverage Run ID: ' || g_test_runs_rec.id || - ', ' || g_test_runs_rec.dbout_type || - ' ' || g_test_runs_rec.dbout_owner || - '.' || g_test_runs_rec.dbout_name ); - p('----------------------------------------'); - profile_summary; end summary_out; ------------------------------------------------------------ procedure results_out (in_show_pass in boolean) is - l_last_testcase wt_results.testcase%TYPE; - l_show_pass_txt varchar2(1); - header_shown boolean; - procedure l_show_header is begin - p(''); - p( g_test_runs_rec.runner_owner || - '.' || g_test_runs_rec.runner_name || - -- ' Test Runner' || - ' Details (Test Run ID ' || g_test_runs_rec.id || - ')' ); - p('----------------------------------------'); - end l_show_header; + l_rec core_data.results_rec_type; + l_last_testcase core_data.long_name; begin - if in_show_pass - then - l_show_pass_txt := 'Y'; - else - l_show_pass_txt := 'N'; - end if; - header_shown := FALSE; - for buff in ( - select status - ,elapsed_msecs - ,testcase - ,assertion - ,details - ,message - from wt_results - where test_run_id = g_test_runs_rec.id - and ( l_show_pass_txt = 'Y' - or status != 'PASS') - order by result_seq ) + show_result_header; + for i in 1 .. core_data.g_results_nt.COUNT loop - if not header_shown - then - l_show_header; - header_shown := TRUE; - end if; - if buff.testcase = l_last_testcase - OR ( buff.testcase is null - AND l_last_testcase is null ) + if in_show_pass + OR NOT core_data.g_results_nt(i).pass then - p(format_test_result - (in_assertion => buff.assertion - ,in_status => buff.status - ,in_details => buff.details - ,in_testcase => NULL - ,in_message => buff.message - ,in_elapsed_msecs => buff.elapsed_msecs) ); - else - p(format_test_result - (in_assertion => buff.assertion - ,in_status => buff.status - ,in_details => buff.details - ,in_testcase => buff.testcase - ,in_message => buff.message - ,in_elapsed_msecs => buff.elapsed_msecs) ); - l_last_testcase := buff.testcase; + if core_data.g_results_nt(i).testcase = l_last_testcase + then + l_rec := core_data.g_results_nt(i); + l_rec.testcase := ''; + p(format_test_result(l_rec)); + else + p(format_test_result(core_data.g_results_nt(i))); + l_last_testcase := core_data.g_results_nt(i).testcase; + end if; end if; end loop; end results_out; + +--------------------- +-- Public Procedures +--------------------- + + ------------------------------------------------------------ -procedure profile_out - (in_show_aux in boolean) +procedure dbms_out + (in_detail_level in number default 0 + ,in_summary_last in boolean default FALSE) is - l_header_txt CONSTANT varchar2(2000) := - 'Source TotTime MinTime MaxTime ' || chr(10) || - ' Line Stat Occurs (usec) (usec) (usec) Text' || chr(10) || - '------ ---- ------ --------- ------- --------- ------------'; - l_show_aux_txt varchar2(1); - header_shown boolean; - procedure l_show_header is begin - p(''); - p( g_test_runs_rec.dbout_owner || - '.' || g_test_runs_rec.dbout_name || - ' ' || g_test_runs_rec.dbout_type || - ' Code Coverage Details' || - ' (Test Run ID ' || g_test_runs_rec.id || - ')' ); - --p('----------------------------------------'); - end l_show_header; begin - if g_test_runs_rec.dbout_name is null - then - return; - end if; - if in_show_aux + -- Setup Display Order + if in_summary_last then - l_show_aux_txt := 'Y'; - else - l_show_aux_txt := 'N'; - end if; - header_shown := FALSE; - for buff in ( - select line - ,status - ,total_occur - ,total_time - ,min_time - ,max_time - ,text - ,rownum - from wt_dbout_profiles - where test_run_id = g_test_runs_rec.id - and ( l_show_aux_txt = 'Y' - or status not in ('EXEC','ANNO','UNKN','EXCL')) - order by line ) - loop - if not header_shown + if in_detail_level >= 10 then - l_show_header; - p(l_header_txt); - header_shown := TRUE; + results_out(in_detail_level >= 20); end if; - if mod(buff.rownum,25) = 0 + summary_out; + else + summary_out; + if in_detail_level >= 10 then - p(l_header_txt); + results_out(in_detail_level >= 20); end if; - p(to_char(buff.line,'99999') || - case buff.status when 'NOTX' then '#NOTX#' - else ' ' || rpad(buff.status,4) || ' ' - end || - to_char(buff.total_occur,'99999') || ' ' || - to_char(buff.total_time/1000,'99999999') || ' ' || - to_char(buff.min_time/1000,'999999') || ' ' || - to_char(buff.max_time/1000,'99999999') || ' ' || - replace(buff.text,CHR(10),'') ); - end loop; -end profile_out; + end if; +end dbms_out; ---------------------- --- Public Procedures ---------------------- +------------------------------------------------------------ +procedure ad_hoc_result +is +begin + p(wt_assert.g_rec.last_msg || CHR(10) || + ' Assertion ' || wt_assert.g_rec.last_assert || + case wt_assert.last_pass + when TRUE then ' PASSED.' + else ' FAILED.' + end || CHR(10) || + ' Testcase: ' || wt_assert.g_testcase || CHR(10) || + ' ' || wt_assert.g_rec.last_details ); +end ad_hoc_result; + + +------------------------------------------------------------ +procedure show_result_header is begin + p(''); + p( core_data.g_run_rec.runner_owner || + '.' || core_data.g_run_rec.runner_name || + ' Test Runner Details:' ); + p('----------------------------------------'); +end show_result_header; + ------------------------------------------------------------ function format_test_result - (in_assertion in wt_results.assertion%TYPE - ,in_status in wt_results.status%TYPE - ,in_details in wt_results.details%TYPE - ,in_testcase in wt_results.testcase%TYPE - ,in_message in wt_results.message%TYPE - ,in_elapsed_msecs in wt_results.elapsed_msecs%TYPE DEFAULT NULL) + (in_rec in core_data.results_rec_type) return varchar2 is l_out_str varchar2(32000) := ''; begin - if in_testcase is not null + if in_rec.testcase is not null then - l_out_str := rpad('---*** ' || in_testcase || ' ***---' + l_out_str := rpad('---*** ' || in_rec.testcase || + ' ***---' ,80,'-') || CHR(10); end if; - if in_status = wt_assert.C_PASS + if in_rec.pass then - l_out_str := l_out_str || ' ' || rpad(in_status,4) || ' '; + l_out_str := l_out_str || ' PASS '; else - l_out_str := l_out_str || '#' || rpad(in_status,4) || '#'; + l_out_str := l_out_str || '#FAIL#'; end if; - if in_elapsed_msecs is not null + if in_rec.interval_msecs is not null then - l_out_str := l_out_str || lpad(in_elapsed_msecs,4) || 'ms '; + l_out_str := l_out_str || lpad(in_rec.interval_msecs,4) || 'ms '; end if; - if in_message is not null + if in_rec.message is not null then - l_out_str := l_out_str || in_message || '. '; + l_out_str := l_out_str || in_rec.message || '. '; end if; - l_out_str := l_out_str || in_assertion || ' - '; + l_out_str := l_out_str || in_rec.assertion || ' - '; if g_single_line_output then - l_out_str := l_out_str || replace(replace(in_details,CHR(13),'\r'),CHR(10),'\n'); + l_out_str := l_out_str || replace(replace(in_rec.details + ,CHR(13),'\r') + ,CHR(10),'\n'); else - l_out_str := l_out_str || in_details; + l_out_str := l_out_str || in_rec.details; end if; return l_out_str; end format_test_result; ------------------------------------------------------------- -procedure ad_hoc_result - (in_assertion in wt_results.assertion%TYPE - ,in_status in wt_results.status%TYPE - ,in_details in wt_results.details%TYPE - ,in_testcase in wt_results.testcase%TYPE - ,in_message in wt_results.message%TYPE) -is -begin - p(format_test_result - (in_assertion => in_assertion - ,in_status => in_status - ,in_details => in_details - ,in_testcase => in_testcase - ,in_message => in_message)); -end ad_hoc_result; - ------------------------------------------------------------- -procedure dbms_out - (in_runner_name in wt_test_runs.runner_name%TYPE - ,in_hide_details in boolean default FALSE - ,in_summary_last in boolean default FALSE - ,in_show_pass in boolean default FALSE - ,in_show_aux in boolean default FALSE) -is -begin - - for buff in ( - select * from wt_test_runs - where (runner_name, start_dtm) in ( - select runner_name - ,max(start_dtm) MAX_START_DTM - from wt_test_runs - where ( ( in_runner_name is not null - and in_runner_name = runner_name) - OR in_runner_name is null ) - and runner_owner = USER - group by runner_name ) ) - loop - - -- Load Test Run Record - g_test_runs_rec := buff; - - -- Setup Display Order - if in_summary_last - then - if NOT in_hide_details - then - profile_out(in_show_aux); - results_out(in_show_pass); - end if; - summary_out; - else - summary_out; - if NOT in_hide_details - then - results_out(in_show_pass); - profile_out(in_show_aux); - end if; - end if; - - p(''); - - end loop; - -end dbms_out; - ------------------------------------------------------------- -procedure dbms_out_all -is -begin - for buff in (select runner_name - from wt_test_runs - where runner_owner = USER - group by runner_name - order by max(start_dtm) - ,runner_name) - loop - dbms_out(in_runner_name => buff.runner_name - ,in_hide_details => TRUE); - end loop; -end dbms_out_all; end wt_text_report; \ No newline at end of file diff --git a/src/core/wt_text_report.pks b/src/core/wt_text_report.pks index be1f754..10b5a7d 100644 --- a/src/core/wt_text_report.pks +++ b/src/core/wt_text_report.pks @@ -2,7 +2,7 @@ create or replace package wt_text_report authid definer as - g_test_runs_rec wt_test_runs%ROWTYPE; + g_run_rec core_data.run_rec_type; -- To report the latest result details for test runner: -- begin @@ -16,29 +16,16 @@ as -- DATE data type format for Report Header g_date_format varchar2(100) := 'DD-Mon-YYYY HH:MI:SS PM'; - function format_test_result - (in_assertion in wt_results.assertion%TYPE - ,in_status in wt_results.status%TYPE - ,in_details in wt_results.details%TYPE - ,in_testcase in wt_results.testcase%TYPE - ,in_message in wt_results.message%TYPE - ,in_elapsed_msecs in wt_results.elapsed_msecs%TYPE DEFAULT NULL) - return varchar2; + procedure dbms_out + (in_detail_level in number default 0 + ,in_summary_last in boolean default FALSE); - procedure ad_hoc_result - (in_assertion in wt_results.assertion%TYPE - ,in_status in wt_results.status%TYPE - ,in_details in wt_results.details%TYPE - ,in_testcase in wt_results.testcase%TYPE - ,in_message in wt_results.message%TYPE); + procedure ad_hoc_result; - procedure dbms_out - (in_runner_name in wt_test_runs.runner_name%TYPE - ,in_hide_details in boolean default FALSE - ,in_summary_last in boolean default FALSE - ,in_show_pass in boolean default FALSE - ,in_show_aux in boolean default FALSE); + procedure show_result_header; - procedure dbms_out_all; + function format_test_result + (in_rec in core_data.results_rec_type) + return varchar2; end wt_text_report; \ No newline at end of file diff --git a/src/core/wt_version.tab b/src/core/wt_version.tab index 52abe53..64265d8 100644 --- a/src/core/wt_version.tab +++ b/src/core/wt_version.tab @@ -3,20 +3,21 @@ -- Version Table Installation -- -create table wt_version +create table wt_versions (install_dtm date ,action varchar2(15) ,text varchar2(15) - ,constraint wt_version_pk primary key (install_dtm) + ,constraint wt_versions_pk primary key (install_dtm) ) pctfree 0; -comment on table wt_version is 'Records the installed and upgraded versions.'; -comment on column wt_version.install_dtm is 'Date/Time the version that was installed/upgraded'; -comment on column wt_version.text is 'Name of the version that was installed/upgraded'; +comment on table wt_versions is 'Records the installed and upgraded versions.'; +comment on column wt_versions.install_dtm is 'Date/Time the version that was installed/upgraded'; +comment on column wt_versions.text is 'Name of the version that was installed/upgraded'; -insert into wt_version (install_dtm, action, text) - values (sysdate, 'INSTALL', '1.2.0'); +grant select on wt_versions to public; -commit; +create or replace public synonym wt_version for &schema_owner..wt_versions; -grant select on wt_version to public; +insert into wt_versions (install_dtm, action, text) + values (sysdate, 'INSTALL', '1.2.0'); +commit; diff --git a/src/core/wtplsql.pkb b/src/core/wtplsql.pkb index ba53f1f..4a9f7b0 100644 --- a/src/core/wtplsql.pkb +++ b/src/core/wtplsql.pkb @@ -22,7 +22,7 @@ is begin -- These RAISEs can be captured because the Test Runs Record is set. -- Check for NULL Runner Name - if g_test_runs_rec.runner_name is null + if core_data.g_run_rec.runner_name is null then raise_application_error (-20001, 'RUNNER_NAME is null'); end if; @@ -30,55 +30,70 @@ begin select count(*) into l_package_check from user_procedures where procedure_name = C_RUNNER_ENTRY_POINT - and object_name = g_test_runs_rec.runner_name + and object_name = core_data.g_run_rec.runner_name and object_type = 'PACKAGE'; if l_package_check != 1 then raise_application_error (-20002, 'RUNNER_NAME Procedure "' || - g_test_runs_rec.runner_name || + core_data.g_run_rec.runner_name || '.' || C_RUNNER_ENTRY_POINT || '" is not valid' ); end if; end check_runner; - $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN procedure t_check_runner is - l_save_test_runs_rec wt_test_runs%ROWTYPE := g_test_runs_rec; + l_save_test_run_rec core_data.run_rec_type; l_msg_in varchar2(4000); l_err_in varchar2(4000); -------------------------------------- WTPLSQL Testing -- procedure l_test_sqlerrm is begin - -- Restore the G_TEST_RUNS_REC - g_test_runs_rec := l_save_test_runs_rec; + -- Restore the core_data.g_run_rec + core_data.g_run_rec := l_save_test_run_rec; wt_assert.eq (msg_in => l_msg_in ,check_this_in => SQLERRM ,against_this_in => l_err_in); end l_test_sqlerrm; begin + -- Save CORE_DATA data + l_save_test_run_rec := core_data.g_run_rec; + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'CHECK_RUNNER Happy Path 1'; + wt_assert.eq + (msg_in => 'Confirm RUNNER_OWNER' + ,check_this_in => core_data.g_run_rec.runner_owner + ,against_this_in => USER); + core_data.g_run_rec.runner_name := 'WTPLSQL'; + l_msg_in := 'Valid RUNNER_NAME'; + l_err_in := 'ORA-0000: normal, successful completion'; + begin + check_runner; + l_test_sqlerrm; + exception when others then + l_test_sqlerrm; + end; -------------------------------------- WTPLSQL Testing -- - -- This Test Case runs in the EXECUTE IMMEDIATE in the TEST_RUN - -- procedure in this package. wt_assert.g_testcase := 'CHECK_RUNNER Sad Path 1'; + core_data.g_run_rec.runner_name := ''; + l_msg_in := 'Null RUNNER_NAME'; + l_err_in := 'ORA-20001: RUNNER_NAME is null'; begin - g_test_runs_rec.runner_name := ''; - l_msg_in := 'Null RUNNER_NAME'; - l_err_in := 'ORA-20001: RUNNER_NAME is null'; check_runner; l_test_sqlerrm; exception when others then + -- This test is expected to throw an error l_test_sqlerrm; end; -------------------------------------- WTPLSQL Testing -- wt_assert.g_testcase := 'CHECK_RUNNER Sad Path 2'; + core_data.g_run_rec.runner_name := 'BOGUS'; + l_msg_in := 'Invalid RUNNER_NAME'; + l_err_in := 'ORA-20002: RUNNER_NAME Procedure "BOGUS.' || + C_RUNNER_ENTRY_POINT || '" is not valid'; begin - g_test_runs_rec.runner_name := 'BOGUS'; - l_msg_in := 'Invalid RUNNER_NAME'; - l_err_in := 'ORA-20002: RUNNER_NAME "BOGUS.' || - C_RUNNER_ENTRY_POINT || '" is not valid'; check_runner; l_test_sqlerrm; exception when others then @@ -88,19 +103,252 @@ $THEN $END ----------------%WTPLSQL_end_ignore_lines%---------------- +------------------------------------------------------------ +procedure find_dbout +is + -- + -- https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements008.htm#SQLRF51129 + -- Within a namespace, no two objects can have the same name. The following + -- schema objects share one namespace: + -- -) Packages + -- -) Private synonyms + -- -) Sequences + -- -) Stand-alone procedures + -- -) Stand-alone stored functions + -- -) User-defined operators + -- -) User-defined types + -- -) Tables + -- -) Views + -- Each of the following schema objects has its own namespace: + -- -) Clusters + -- -) Constraints + -- -) Database triggers + -- -) Dimensions + -- -) Indexes + -- -) Materialized views (When you create a materialized view, the database + -- creates an internal table of the same name. This table has the same + -- namespace as the other tables in the schema. Therefore, a schema + -- cannot contain a table and a materialized view of the same name.) + -- -) Private database links + -- Because tables and sequences are in the same namespace, a table and a + -- sequence in the same schema cannot have the same name. However, tables + -- and indexes are in different namespaces. Therefore, a table and an index + -- in the same schema can have the same name. + -- Each schema in the database has its own namespaces for the objects it + -- contains. This means, for example, that two tables in different schemas + -- are in different namespaces and can have the same name. + -- Results are unknown if a Database Object Under Test has the same name in + -- different namespaces. + -- + l_dot_pos number; + l_cln_pos number; +begin + if g_DBOUT is null + then + return; + end if; + l_dot_pos := instr(g_DBOUT,'.'); + l_cln_pos := instr(g_DBOUT,':'); + begin + with q_main as ( + select obj.owner + ,obj.object_name + ,obj.object_type + from dba_objects obj + where obj.owner = core_data.g_run_rec.runner_owner + and ( ( -- No separators were given, assume USER is the owner. + -- No object type was given. This could throw TOO_MANY_ROWS. + l_dot_pos = 0 + and l_cln_pos = 0 + and obj.object_name = g_DBOUT ) + OR ( -- No object owner was given, assume USER is the owner. + l_dot_pos = 0 + and l_cln_pos != 0 + and obj.object_name = substr(g_DBOUT, 1, l_cln_pos-1) + and obj.object_type = substr(g_DBOUT, l_cln_pos+1, 512) ) ) + UNION ALL + select obj.owner + ,obj.object_name + ,obj.object_type + from dba_objects obj + where ( -- No object type was given. This could throw TOO_MANY_ROWS. + l_dot_pos != 0 + and l_cln_pos = 0 + and obj.owner = substr(g_DBOUT, 1, l_dot_pos-1) + and obj.object_name = substr(g_DBOUT, l_dot_pos+1, 512) ) + OR ( -- All separators were given + l_dot_pos != 0 + and l_cln_pos != 0 + and obj.owner = substr(g_DBOUT, 1, l_dot_pos-1) + and obj.object_name = substr(g_DBOUT, l_dot_pos+1, l_cln_pos-l_dot_pos-1) + and obj.object_type = substr(g_DBOUT, l_cln_pos+1, 512) ) + ) + select owner + ,object_name + ,object_type + into core_data.g_run_rec.dbout_owner + ,core_data.g_run_rec.dbout_name + ,core_data.g_run_rec.dbout_type + from q_main; + exception + when NO_DATA_FOUND + then + core_data.run_error('Unable to find database object "' || + g_DBOUT || '".' ); + return; + when TOO_MANY_ROWS + then + -- The SELECT INTO will load some values into these variables + -- when TOO_MANY_ROWS are selected. + core_data.g_run_rec.dbout_owner := ''; + core_data.g_run_rec.dbout_name := ''; + core_data.g_run_rec.dbout_type := ''; + core_data.run_error('Found too many database objects "' || + g_DBOUT || '".' ); + return; + end; + -- +end find_dbout; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_find_dbout + is + l_save_test_run_rec core_data.run_rec_type; + procedure clear_run_rec is begin + core_data.g_run_rec.dbout_owner := ''; + core_data.g_run_rec.dbout_name := ''; + core_data.g_run_rec.dbout_type := ''; + core_data.g_run_rec.error_message := ''; + end clear_run_rec; + begin + -- Save CORE_DATA data + l_save_test_run_rec := core_data.g_run_rec; + -------------------------------------- WTPLSQL Testing -- + -- These tests assume this package does not set a DBOUT + wt_assert.g_testcase := 'Find DBOUT Happy Path 1'; + clear_run_rec; + g_DBOUT := ''; + find_dbout; + wt_assert.isnull( + msg_in => 'core_data.g_run_rec.dbout_owner', + check_this_in => core_data.g_run_rec.dbout_owner); + wt_assert.isnull( + msg_in => 'core_data.g_run_rec.dbout_name', + check_this_in => core_data.g_run_rec.dbout_name); + wt_assert.isnull( + msg_in => 'core_data.g_run_rec.dbout_type', + check_this_in => core_data.g_run_rec.dbout_type); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Find DBOUT Happy Path 2'; + clear_run_rec; + g_DBOUT := 'SYS.DUAL'; + find_dbout; + wt_assert.eq( + msg_in => 'core_data.g_run_rec.dbout_owner', + check_this_in => core_data.g_run_rec.dbout_owner, + against_this_in => 'SYS'); + wt_assert.eq( + msg_in => 'core_data.g_run_rec.dbout_name', + check_this_in => core_data.g_run_rec.dbout_name, + against_this_in => 'DUAL'); + wt_assert.eq( + msg_in => 'core_data.g_run_rec.dbout_type', + check_this_in => core_data.g_run_rec.dbout_type, + against_this_in => 'TABLE'); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Find DBOUT Happy Path 3'; + clear_run_rec; + g_DBOUT := 'WTPLSQL:PACKAGE BODY'; + find_dbout; + wt_assert.eq( + msg_in => 'core_data.g_run_rec.dbout_owner', + check_this_in => core_data.g_run_rec.dbout_owner, + against_this_in => USER); + wt_assert.eq( + msg_in => 'core_data.g_run_rec.dbout_name', + check_this_in => core_data.g_run_rec.dbout_name, + against_this_in => 'WTPLSQL'); + wt_assert.eq( + msg_in => 'core_data.g_run_rec.dbout_type', + check_this_in => core_data.g_run_rec.dbout_type, + against_this_in => 'PACKAGE BODY'); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Find DBOUT Happy Path 4'; + clear_run_rec; + g_DBOUT := 'WT_EXECUTE_TEST_RUNNER'; + find_dbout; + wt_assert.eq( + msg_in => 'core_data.g_run_rec.dbout_owner', + check_this_in => core_data.g_run_rec.dbout_owner, + against_this_in => USER); + wt_assert.eq( + msg_in => 'core_data.g_run_rec.dbout_name', + check_this_in => core_data.g_run_rec.dbout_name, + against_this_in => 'WT_EXECUTE_TEST_RUNNER'); + wt_assert.eq( + msg_in => 'core_data.g_run_rec.dbout_type', + check_this_in => core_data.g_run_rec.dbout_type, + against_this_in => 'PROCEDURE'); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Find DBOUT Sad Path 1'; + clear_run_rec; + g_DBOUT := 'someone.bogus:thingy'; + find_dbout; + wt_assert.isnull( + msg_in => 'core_data.g_run_rec.dbout_owner', + check_this_in => core_data.g_run_rec.dbout_owner); + wt_assert.isnull( + msg_in => 'core_data.g_run_rec.dbout_name', + check_this_in => core_data.g_run_rec.dbout_name); + wt_assert.isnull( + msg_in => 'core_data.g_run_rec.dbout_type', + check_this_in => core_data.g_run_rec.dbout_type); + wt_assert.isnotnull( + msg_in => 'core_data.g_run_rec.error_message', + check_this_in => core_data.g_run_rec.error_message); + wt_assert.eqqueryvalue ( + msg_in => 'core_data.g_run_rec.error_message', + check_query_in => 'select 1 from dual where ''' || + core_data.g_run_rec.error_message || + ''' like ''%Unable to find database object "' || + g_DBOUT || '".%''', + against_value_in => 1); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Find DBOUT Sad Path 2'; + clear_run_rec; + g_DBOUT := 'WTPLSQL'; + find_dbout; + wt_assert.isnull( + msg_in => 'core_data.g_run_rec.dbout_owner', + check_this_in => core_data.g_run_rec.dbout_owner); + wt_assert.isnull( + msg_in => 'core_data.g_run_rec.dbout_name', + check_this_in => core_data.g_run_rec.dbout_name); + wt_assert.isnull( + msg_in => 'core_data.g_run_rec.dbout_type', + check_this_in => core_data.g_run_rec.dbout_type); + wt_assert.eqqueryvalue ( + msg_in => 'core_data.g_run_rec.error_message', + check_query_in => 'select 1 from dual where ''' || + core_data.g_run_rec.error_message || + ''' like ''%Found too many database objects "' || + g_DBOUT || '".%''', + against_value_in => 1); + -------------------------------------- WTPLSQL Testing -- + -- Restore CORE_DATA data + core_data.g_run_rec := l_save_test_run_rec; + -- Reset package data + g_DBOUT := ''; + end t_find_dbout; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + --------------------- -- Public Procedures --------------------- ------------------------------------------------------------- -function get_last_run_flag - return varchar2 -is -begin - return IS_LAST_RUN_FLAG; -end get_last_run_flag; - ------------------------------------------------------------ function get_runner_entry_point return varchar2 @@ -159,19 +407,18 @@ procedure test_run (in_package_name in varchar2) is pragma AUTONOMOUS_TRANSACTION; -- Required if called as Remote Procedure Call (RPC) - l_test_runs_rec_NULL wt_test_runs_vw%ROWTYPE; l_error_stack varchar2(32000); procedure concat_err_message (in_err_msg in varchar2) is begin - if g_test_runs_rec.error_message is not null + if core_data.g_run_rec.error_message is not null then - g_test_runs_rec.error_message := substr(in_err_msg || CHR(10)|| - g_test_runs_rec.error_message + core_data.g_run_rec.error_message := substr(in_err_msg || CHR(10)|| + core_data.g_run_rec.error_message ,1,4000); else - g_test_runs_rec.error_message := in_err_msg; + core_data.g_run_rec.error_message := in_err_msg; end if; end concat_err_message; begin @@ -184,41 +431,19 @@ begin return; end if; $END ----------------%WTPLSQL_end_ignore_lines%---------------- - -- Reset the Test Runs Record before checking anything - g_test_runs_rec := l_test_runs_rec_NULL; - g_test_runs_rec.id := wt_test_runs_seq.nextval; - g_test_runs_rec.start_dtm := systimestamp; - --g_test_runs_rec.runner_owner := USER; - --g_test_runs_rec.runner_owner := sys_context('userenv', 'current_schema'); - select username into g_test_runs_rec.runner_owner from user_users; - g_test_runs_rec.runner_name := in_package_name; - g_test_runs_rec.is_last_run := IS_LAST_RUN_FLAG; - g_test_runs_rec.error_message := ''; - check_runner; + -- Start a new Transaction + COMMIT; -- Initialize - delete_runs(in_runner_owner => g_test_runs_rec.runner_owner - ,in_runner_name => g_test_runs_rec.runner_name); - COMMIT; -- Start a new Transaction - wt_hook.before_run_init; + core_data.init1(in_package_name); + g_DBOUT := ''; wt_assert.reset_globals; - wt_test_run_stat.initialize; - wt_result.initialize(g_test_runs_rec.id); - wt_profiler.initialize(in_test_run_id => g_test_runs_rec.id, - in_runner_owner => g_test_runs_rec.runner_owner, - in_runner_name => g_test_runs_rec.runner_name, - out_dbout_owner => g_test_runs_rec.dbout_owner, - out_dbout_name => g_test_runs_rec.dbout_name, - out_dbout_type => g_test_runs_rec.dbout_type, - out_trigger_offset => g_test_runs_rec.trigger_offset, - out_profiler_runid => g_test_runs_rec.profiler_runid, - out_error_message => l_error_stack); - concat_err_message(l_error_stack); - wt_hook.after_run_init + -- Reset the Test Runs Record before checking anything + check_runner; + hook.before_test_run; + core_data.init2; -- Call the Test Runner begin - -- AUTHID CURRENT_USER is required for dynamic PL/SQL execution. - execute_test_runner ('BEGIN ' || in_package_name || '.' || - C_RUNNER_ENTRY_POINT || '; END;'); + hook.execute_test_runner; exception when OTHERS then @@ -226,39 +451,16 @@ begin dbms_utility.format_error_backtrace ; concat_err_message(l_error_stack); end; - -- Finalize - insert_test_run; - wt_hook.before_run_final; - wt_profiler.finalize; - wt_result.finalize; - wt_test_run_stat.finalize; - wt_hook.after_run_final; - commit; -- Required if called as Remote Procedure Call (RPC) - -exception - when OTHERS - then - l_error_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - concat_err_message(l_error_stack); - begin - -- This is the only exception we can catch - -- with a full call stack - insert_test_run; - exception - when OTHERS - then - l_error_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - concat_err_message(l_error_stack); - raise_application_error(-20000, substr(g_test_runs_rec.error_message - ,1,2000 )); - end; - commit; -- Required if called as Remote Procedure Call (RPC) - + rollback; -- Discard any pending transactions. + core_data.finalize; + find_dbout; + hook.after_test_run; + -- Required if called as Remote Procedure Call (RPC) + COMMIT; end test_run; + --==============================================================-- -- No Unit Test for TEST_RUN. -- Too complicated because testing occurs while the TEST_RUN @@ -272,7 +474,7 @@ is TYPE runners_nt_type is table of varchar2(128); l_runners_nt runners_nt_type; begin - wt_hook.before_test_all; + hook.before_test_all; select object_name bulk collect into l_runners_nt from user_procedures t1 @@ -284,7 +486,7 @@ begin loop test_run(l_runners_nt(i)); end loop; - wt_hook.after_test_all; + hook.after_test_all; end test_all; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ @@ -308,229 +510,17 @@ $THEN $END ----------------%WTPLSQL_end_ignore_lines%---------------- ------------------------------------------------------------- -procedure delete_runs - (in_test_run_id in number) -is - r_owner varchar2(200); - r_name varchar2(200); -begin - wt_hook.before_delete_runs; - wt_test_run_stat.delete_records(in_test_run_id); - wt_profiler.delete_records(in_test_run_id); - wt_result.delete_records(in_test_run_id); - begin - -- - select runner_owner, runner_name - into r_owner, r_name - from wt_test_runs - where id = in_test_run_id; - -- - delete from wt_test_runs - where id = in_test_run_id; - -- - set_last_run(in_runner_owner => r_owner - ,in_runner_name => r_name - ,in_last_run_flag => IS_LAST_RUN_FLAG); - -- - exception when NO_DATA_FOUND - then - null; -- Ignore Error - end; - wt_hook.after_delete_runs; -end delete_runs; - -procedure delete_runs - (in_runner_owner in varchar2 - ,in_runner_name in varchar2) -is - num_recs number; -begin - num_recs := 1; - for buf2 in (select id from wt_test_runs - where runner_owner = in_runner_owner - and runner_name = in_runner_name - order by start_dtm desc, id desc) - loop - -- Keep the last 20 rest runs for this USER - if num_recs > g_keep_num_recs - then - -- Autonomous Transaction COMMIT - delete_runs(buf2.id); - end if; - num_recs := num_recs + 1; - end loop; -end delete_runs; - -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure t_delete_run_id - is - l_num_recs number; - l_err_stack varchar2(32000); - begin - -------------------------------------- WTPLSQL Testing -- - -- DELETE_RECORDS has already run when we arrive here. - -- Cleanup from previous test - delete from wt_test_runs - where id between 0-g_keep_num_recs and 0-1; - commit; - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'DELETE_RUNS Happy Path 1'; - select count(*) - into l_num_recs - from wt_test_runs - where runner_owner = g_test_runs_rec.runner_owner - and runner_name = g_test_runs_rec.runner_name; - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnotnull ( - msg_in => 'Number of Records Before Insert', - check_this_in => l_num_recs); - wt_assert.this ( - msg_in => 'Number of Records Before Insert <= ' || g_keep_num_recs, - check_this_in => l_num_recs <= g_keep_num_recs); - -------------------------------------- WTPLSQL Testing -- - insert into wt_test_runs values g_test_runs_rec; - COMMIT; - wt_assert.eqqueryvalue ( - msg_in => 'Number of Records After Insert', - check_query_in => 'select count(*) from wt_test_runs' || - ' where id = ' || g_test_runs_rec.id, - against_value_in => 1); - delete_runs(g_test_runs_rec.id); - -------------------------------------- WTPLSQL Testing -- - wt_assert.eqqueryvalue ( - msg_in => 'Number of Records After Delete', - check_query_in => 'select count(*) from wt_test_runs' || - ' where id = ' || g_test_runs_rec.id, - against_value_in => 0); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'DELETE_RUNS Happy Path 2'; - wt_assert.eqqueryvalue ( - msg_in => 'Confirm number of records', - check_query_in => 'select count(*) from wt_test_runs' || - ' where runner_owner = ''' || g_test_runs_rec.runner_owner || - ''' and runner_name = ''' || g_test_runs_rec.runner_name || - '''', - against_value_in => l_num_recs); - -------------------------------------- WTPLSQL Testing -- - for i in 1 .. g_keep_num_recs - loop - insert into wt_test_runs - (id, start_dtm, runner_owner, runner_name) - values - (0-i, sysdate-7000-i, g_test_runs_rec.runner_owner, g_test_runs_rec.runner_name); - end loop; - commit; - -------------------------------------- WTPLSQL Testing -- - wt_assert.eqqueryvalue ( - msg_in => 'Check Added ' || g_keep_num_recs || ' records', - check_query_in => 'select count(*) from wt_test_runs' || - ' where runner_owner = ''' || g_test_runs_rec.runner_owner || - ''' and runner_name = ''' || g_test_runs_rec.runner_name || - '''', - against_value_in => l_num_recs + g_keep_num_recs); - delete_runs(g_test_runs_rec.runner_owner, g_test_runs_rec.runner_name); - -------------------------------------- WTPLSQL Testing -- - wt_assert.eqqueryvalue ( - msg_in => 'Check number of records reduced', - check_query_in => 'select count(*) from wt_test_runs' || - ' where runner_owner = ''' || g_test_runs_rec.runner_owner || - ''' and runner_name = ''' || g_test_runs_rec.runner_name || - '''', - against_value_in => g_keep_num_recs); - delete from wt_test_runs - where id between 0-g_keep_num_recs and 0-1; - commit; - -------------------------------------- WTPLSQL Testing -- - wt_assert.eqqueryvalue ( - msg_in => 'Confirm original number of records', - check_query_in => 'select count(*) from wt_test_runs' || - ' where runner_owner = ''' || g_test_runs_rec.runner_owner || - ''' and runner_name = ''' || g_test_runs_rec.runner_name || - '''', - against_value_in => l_num_recs); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'DELETE_RUNS Sad Path 1'; - begin - delete_runs(-9995); -- Should run without error - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - exception when others then - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - end; - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull ( - msg_in => 'Delete Runs(-9995)', - check_this_in => l_err_stack); - end t_delete_run_id; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- - - --==============================================================-- $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN - procedure t_test_runs_rec_and_table - is - begin - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'TEST_RUNS_REC_AND_TABLE Happy Path'; - -- This Test Case runs in the EXECUTE IMMEDAITE in the TEST_RUN - -- procedure in this package. - wt_assert.isnotnull - (msg_in => 'g_test_runs_rec.id' - ,check_this_in => g_test_runs_rec.id); - wt_assert.isnotnull - (msg_in => 'g_test_runs_rec.start_dtm' - ,check_this_in => g_test_runs_rec.start_dtm); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnotnull - (msg_in => 'g_test_runs_rec.runner_owner' - ,check_this_in => g_test_runs_rec.runner_owner); - wt_assert.eq - (msg_in => 'g_test_runs_rec.runner_name' - ,check_this_in => g_test_runs_rec.runner_name - ,against_this_in => 'WTPLSQL'); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull - (msg_in => 'g_test_runs_rec.dbout_owner' - ,check_this_in => g_test_runs_rec.dbout_owner); - wt_assert.isnull - (msg_in => 'g_test_runs_rec.dbout_name' - ,check_this_in => g_test_runs_rec.dbout_name); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull - (msg_in => 'g_test_runs_rec.dbout_type' - ,check_this_in => g_test_runs_rec.dbout_type); - wt_assert.isnull - (msg_in => 'g_test_runs_rec.profiler_runid' - ,check_this_in => g_test_runs_rec.profiler_runid); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull - (msg_in => 'g_test_runs_rec.end_dtm' - ,check_this_in => g_test_runs_rec.end_dtm); - wt_assert.isnull - (msg_in => 'g_test_runs_rec.error_message' - ,check_this_in => g_test_runs_rec.error_message); - -------------------------------------- WTPLSQL Testing -- - wt_assert.eqqueryvalue - (msg_in => 'TEST_RUNS Record for this TEST_RUN' - ,check_query_in => 'select count(*) from WT_TEST_RUNS' || - ' where id = ''' || g_test_runs_rec.id || '''' - ,against_value_in => 0); - end t_test_runs_rec_and_table; - ---------------------------------------- procedure WTPLSQL_RUN is begin -------------------------------------- WTPLSQL Testing -- - t_show_version; t_check_runner; - t_insert_test_run; + t_find_dbout; + t_show_version; t_test_all; - t_delete_run_id; - t_test_runs_rec_and_table; end; $END ----------------%WTPLSQL_end_ignore_lines%---------------- --==============================================================-- diff --git a/src/core/wtplsql.pks b/src/core/wtplsql.pks index 4978510..9dae630 100644 --- a/src/core/wtplsql.pks +++ b/src/core/wtplsql.pks @@ -2,11 +2,6 @@ create or replace package wtplsql authid definer as - IS_LAST_RUN_FLAG constant varchar2(1) := 'Y'; - - function get_last_run_flag - return varchar2 deterministic; - C_RUNNER_ENTRY_POINT constant varchar2(30) := 'WTPLSQL_RUN'; function get_runner_entry_point @@ -15,22 +10,17 @@ as function show_version return varchar2; - g_keep_num_recs number := 20; + g_keep_num_recs number := 10; - g_test_runs_rec wt_test_runs_vw%ROWTYPE; + -- Database Object Under Test. + -- Modify as required + g_DBOUT varchar2(128); procedure test_run (in_package_name in varchar2); procedure test_all; - procedure delete_runs - (in_test_run_id in number); - - procedure delete_runs - (in_runner_owner in varchar2 - ,in_runner_name in varchar2); - -- WtPLSQL Self Test Procedures -- -- alter system set PLSQL_CCFLAGS = diff --git a/src/demo/gilded_rose.sql b/src/demo/gilded_rose.sql new file mode 100644 index 0000000..278e88b --- /dev/null +++ b/src/demo/gilded_rose.sql @@ -0,0 +1,134 @@ + +-- +-- Here are the requirements for the GildedRose Code Kata: +-- 1) All items have a SellIn value which denotes the number of days we have to sell the item +-- 2) All items have a Quality value which denotes how valuable the item is +-- 3) At the end of each day our system lowers both values for every item +-- 4) Once the sell by date has passed, Quality degrades twice as fast +-- 5) The Quality of an item is never negative +-- 6) “Aged Brie” actually increases in Quality the older it gets +-- 7) The Quality of an item is never more than 50 +-- 8) “Sulfuras”, being a legendary item, never has to be sold or decreases in Quality +-- 9) “Backstage passes”, like aged brie, increases in Quality as it’s SellIn value approaches; Quality increases by 2 when there are 10 days or less and by 3 when there are 5 days or less but Quality drops to 0 after the concert +-- 10) “Conjured” items degrade in Quality twice as fast as normal items +-- +-- There are several kinds of requirements here. +-- -) Everything has/is: 1, 2 (these are attributes) +-- -) Always do, with exceptions: 3, 4, 6, 8, 9, 10 (these are processes) +-- -) Boundary conditions: 5, 7 (these define corner cases) +-- + + +-- This is INCOMPLETE + + +create or replace package gilded_rose + authid definer +as + + g_name varchar2(100); + g_sell_in number(6); + g_quality number(6); + + -- Package variables are publicly modifiable in PL/SQL. + --procedure initialize + -- (in_name in varchar2 + -- ,in_quality in number + -- ,in_days_remaining in number); + + procedure tick; + + $IF $$WTPLSQL_ENABLE + $THEN + procedure WTPLSQL_RUN; + $END + +end gilded_rose; +/ + + +create or replace package body gilded_rose +as + +-- Package variables are publicly modifiable in PL/SQL. +--procedure initialize +-- (in_name in varchar2 +-- ,in_quality in number +-- ,in_days_remaining in number); + +procedure tick +is +begin + if g_name <> 'Aged Brie' + and g_name <> 'Backstage passes to a TAFKAL80ETC concert' + then + if g_quality > 0 + then + if g_name <> 'Sulfuras, Hand of Ragnaros' + then + g_quality := g_quality - 1; + end if; + end if; + else + if (g_quality < 50) + then + g_quality := g_quality + 1; + if g_name = 'Backstage passes to a TAFKAL80ETC concert' + then + if g_sell_in < 11 + then + if g_quality < 50 + then + g_quality := g_quality + 1; + end if; + end if; + if g_sell_in < 6 + then + if g_quality < 50 + then + g_quality := g_quality + 1; + end if; + end if; + end if; + end if; + end if; + if g_name <> 'Sulfuras, Hand of Ragnaros' + then + g_sell_in := g_sell_in - 1; + end if; + if g_sell_in < 0 + then + if g_name <> 'Aged Brie' + then + if g_name <> 'Backstage passes to a TAFKAL80ETC concert' + then + if g_quality > 0 + then + if g_name <> 'Sulfuras, Hand of Ragnaros' + then + g_quality := g_quality - 1; + end if; + end if; + else + g_quality := g_quality - g_quality; + end if; + else + if g_quality < 50 + then + g_quality := g_quality + 1; + end if; + end if; + end if; +end tick; + +$IF $$WTPLSQL_ENABLE +$THEN +procedure WTPLSQL_RUN +is +begin + utassert.g_testcase_name = ' +end WTPLSQL_RUN; +$END + +end gilded_rose; +/ From 1846687b333ff0deeab25b62dcb6052cd074fab6 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Thu, 22 Nov 2018 07:30:28 -0600 Subject: [PATCH 037/141] Rearrange folders --- src/{stats_gui => gui}/APEX Notes.txt | 0 src/{stats_gui => gui}/Notes.txt | 0 src/{stats_gui => gui}/WTP_workspace.sql | 0 src/{stats_gui => gui}/f700.sql | 0 src/{stats_gui => gui}/install.sql | 0 src/{stats_gui => gui}/wt_scheduler_jobs.vw | 0 src/{junit_xml => junit}/README.txt | 0 .../tables_junit_xml_all.prc} | 0 .../tables_stats_junit_xml_all.prc} | 0 src/{stats => persist}/install.sql | 0 src/persist/proftab.sql | 112 + src/persist/proftab_comments.sql | 42 + src/persist/wt_dbout.pkb | 114 + src/persist/wt_dbout.pks | 30 + src/persist/wt_dbout_runs_vw.vw | 39 + src/persist/wt_dbouts.tab | 27 + src/persist/wt_profile.pkb | 1855 +++++++++++++++++ src/persist/wt_profile.pks | 57 + src/{stats => persist}/wt_profiler_stats.tab | 0 .../wt_profiler_stats_vw.vw | 0 src/persist/wt_profiles.tab | 32 + src/persist/wt_profiles_vw.vw | 51 + src/persist/wt_result.pkb | 488 +++++ src/persist/wt_result.pks | 24 + src/persist/wt_results.tab | 39 + src/persist/wt_results_vw.vw | 49 + src/persist/wt_test_run.pkb | 492 +++++ src/persist/wt_test_run.pks | 29 + src/{stats => persist}/wt_test_run_stat.pkb | 0 src/{stats => persist}/wt_test_run_stat.pks | 0 src/{stats => persist}/wt_test_run_stats.tab | 0 .../wt_test_run_stats_vw.vw | 0 src/persist/wt_test_runner.pkb | 137 ++ src/persist/wt_test_runner.pks | 29 + src/persist/wt_test_runners.tab | 22 + src/persist/wt_test_runs.tab | 51 + src/persist/wt_test_runs_vw.vw | 29 + src/persist/wt_testcase.pkb | 109 + src/persist/wt_testcase.pks | 26 + src/{stats => persist}/wt_testcase_stats.tab | 0 .../wt_testcase_stats_vw.vw | 0 src/persist/wt_testcases.tab | 20 + src/{stats => persist}/wt_text_report.pkb | 0 src/{stats => persist}/wt_text_report.pks | 0 44 files changed, 3903 insertions(+) rename src/{stats_gui => gui}/APEX Notes.txt (100%) rename src/{stats_gui => gui}/Notes.txt (100%) rename src/{stats_gui => gui}/WTP_workspace.sql (100%) rename src/{stats_gui => gui}/f700.sql (100%) rename src/{stats_gui => gui}/install.sql (100%) rename src/{stats_gui => gui}/wt_scheduler_jobs.vw (100%) rename src/{junit_xml => junit}/README.txt (100%) rename src/{junit_xml/junit_report_all.prc => junit/tables_junit_xml_all.prc} (100%) rename src/{junit_xml/stats_junit_report_all.prc => junit/tables_stats_junit_xml_all.prc} (100%) rename src/{stats => persist}/install.sql (100%) create mode 100644 src/persist/proftab.sql create mode 100644 src/persist/proftab_comments.sql create mode 100644 src/persist/wt_dbout.pkb create mode 100644 src/persist/wt_dbout.pks create mode 100644 src/persist/wt_dbout_runs_vw.vw create mode 100644 src/persist/wt_dbouts.tab create mode 100644 src/persist/wt_profile.pkb create mode 100644 src/persist/wt_profile.pks rename src/{stats => persist}/wt_profiler_stats.tab (100%) rename src/{stats => persist}/wt_profiler_stats_vw.vw (100%) create mode 100644 src/persist/wt_profiles.tab create mode 100644 src/persist/wt_profiles_vw.vw create mode 100644 src/persist/wt_result.pkb create mode 100644 src/persist/wt_result.pks create mode 100644 src/persist/wt_results.tab create mode 100644 src/persist/wt_results_vw.vw create mode 100644 src/persist/wt_test_run.pkb create mode 100644 src/persist/wt_test_run.pks rename src/{stats => persist}/wt_test_run_stat.pkb (100%) rename src/{stats => persist}/wt_test_run_stat.pks (100%) rename src/{stats => persist}/wt_test_run_stats.tab (100%) rename src/{stats => persist}/wt_test_run_stats_vw.vw (100%) create mode 100644 src/persist/wt_test_runner.pkb create mode 100644 src/persist/wt_test_runner.pks create mode 100644 src/persist/wt_test_runners.tab create mode 100644 src/persist/wt_test_runs.tab create mode 100644 src/persist/wt_test_runs_vw.vw create mode 100644 src/persist/wt_testcase.pkb create mode 100644 src/persist/wt_testcase.pks rename src/{stats => persist}/wt_testcase_stats.tab (100%) rename src/{stats => persist}/wt_testcase_stats_vw.vw (100%) create mode 100644 src/persist/wt_testcases.tab rename src/{stats => persist}/wt_text_report.pkb (100%) rename src/{stats => persist}/wt_text_report.pks (100%) diff --git a/src/stats_gui/APEX Notes.txt b/src/gui/APEX Notes.txt similarity index 100% rename from src/stats_gui/APEX Notes.txt rename to src/gui/APEX Notes.txt diff --git a/src/stats_gui/Notes.txt b/src/gui/Notes.txt similarity index 100% rename from src/stats_gui/Notes.txt rename to src/gui/Notes.txt diff --git a/src/stats_gui/WTP_workspace.sql b/src/gui/WTP_workspace.sql similarity index 100% rename from src/stats_gui/WTP_workspace.sql rename to src/gui/WTP_workspace.sql diff --git a/src/stats_gui/f700.sql b/src/gui/f700.sql similarity index 100% rename from src/stats_gui/f700.sql rename to src/gui/f700.sql diff --git a/src/stats_gui/install.sql b/src/gui/install.sql similarity index 100% rename from src/stats_gui/install.sql rename to src/gui/install.sql diff --git a/src/stats_gui/wt_scheduler_jobs.vw b/src/gui/wt_scheduler_jobs.vw similarity index 100% rename from src/stats_gui/wt_scheduler_jobs.vw rename to src/gui/wt_scheduler_jobs.vw diff --git a/src/junit_xml/README.txt b/src/junit/README.txt similarity index 100% rename from src/junit_xml/README.txt rename to src/junit/README.txt diff --git a/src/junit_xml/junit_report_all.prc b/src/junit/tables_junit_xml_all.prc similarity index 100% rename from src/junit_xml/junit_report_all.prc rename to src/junit/tables_junit_xml_all.prc diff --git a/src/junit_xml/stats_junit_report_all.prc b/src/junit/tables_stats_junit_xml_all.prc similarity index 100% rename from src/junit_xml/stats_junit_report_all.prc rename to src/junit/tables_stats_junit_xml_all.prc diff --git a/src/stats/install.sql b/src/persist/install.sql similarity index 100% rename from src/stats/install.sql rename to src/persist/install.sql diff --git a/src/persist/proftab.sql b/src/persist/proftab.sql new file mode 100644 index 0000000..1ccf0a0 --- /dev/null +++ b/src/persist/proftab.sql @@ -0,0 +1,112 @@ +Rem +Rem $Header: proftab.sql 07-oct-99.11:04:02 jmuller Exp $ +Rem +Rem proftab.sql +Rem +Rem Copyright (c) Oracle Corporation 1998, 1999. All Rights Reserved. +Rem +Rem NAME +Rem proftab.sql +Rem +Rem DESCRIPTION +Rem Create tables for the PL/SQL profiler +Rem +Rem NOTES +Rem The following tables are required to collect data: +Rem plsql_profiler_runs - information on profiler runs +Rem plsql_profiler_units - information on each lu profiled +Rem plsql_profiler_data - profiler data for each lu profiled +Rem +Rem The plsql_profiler_runnumber sequence is used for generating unique +Rem run numbers. +Rem +Rem The tables and sequence can be created in the schema for each user +Rem who wants to gather profiler data. Alternately these tables can be +Rem created in a central schema. In the latter case the user creating +Rem these objects is responsible for granting appropriate privileges +Rem (insert,update on the tables and select on the sequence) to all +Rem users who want to store data in the tables. Appropriate synonyms +Rem must also be created so the tables are visible from other user +Rem schemas. +Rem +Rem The other tables are used for rolling up to line level; the views are +Rem used to roll up across multiple runs. These are not required to +Rem collect data, but help with analysis of the gathered data. +Rem +Rem THIS SCRIPT DELETES ALL EXISTING DATA! +Rem +Rem MODIFIED (MM/DD/YY) +Rem jmuller 10/07/99 - Fix bug 708690: TAB -> blank +Rem astocks 04/19/99 - Add owner,related_run field to runtab +Rem astocks 10/21/98 - Add another spare field +Rem ciyer 09/15/98 - Create tables for profiler +Rem ciyer 09/15/98 - Created +Rem + +drop table plsql_profiler_data cascade constraints; +drop table plsql_profiler_units cascade constraints; +drop table plsql_profiler_runs cascade constraints; + +drop sequence plsql_profiler_runnumber; + +create table plsql_profiler_runs +( + runid number primary key, -- unique run identifier, + -- from plsql_profiler_runnumber + related_run number, -- runid of related run (for client/ + -- server correlation) + run_owner varchar2(32), -- user who started run + run_date date, -- start time of run + run_comment varchar2(2047), -- user provided comment for this run + run_total_time number, -- elapsed time for this run + run_system_info varchar2(2047), -- currently unused + run_comment1 varchar2(2047), -- additional comment + spare1 varchar2(256) -- unused +); + +comment on table plsql_profiler_runs is + 'Run-specific information for the PL/SQL profiler'; + +create table plsql_profiler_units +( + runid number references plsql_profiler_runs, + unit_number number, -- internally generated library unit # + unit_type varchar2(32), -- library unit type + unit_owner varchar2(32), -- library unit owner name + unit_name varchar2(32), -- library unit name + -- timestamp on library unit, can be used to detect changes to + -- unit between runs + unit_timestamp date, + total_time number DEFAULT 0 NOT NULL, + spare1 number, -- unused + spare2 number, -- unused + -- + primary key (runid, unit_number) +); + +comment on table plsql_profiler_units is + 'Information about each library unit in a run'; + +create table plsql_profiler_data +( + runid number, -- unique (generated) run identifier + unit_number number, -- internally generated library unit # + line# number not null, -- line number in unit + total_occur number, -- number of times line was executed + total_time number, -- total time spent executing line + min_time number, -- minimum execution time for this line + max_time number, -- maximum execution time for this line + spare1 number, -- unused + spare2 number, -- unused + spare3 number, -- unused + spare4 number, -- unused + -- + primary key (runid, unit_number, line#), + foreign key (runid, unit_number) references plsql_profiler_units +); + +comment on table plsql_profiler_data is + 'Accumulated data from all profiler runs'; + +create sequence plsql_profiler_runnumber start with 1 nocache; + diff --git a/src/persist/proftab_comments.sql b/src/persist/proftab_comments.sql new file mode 100644 index 0000000..1294d2a --- /dev/null +++ b/src/persist/proftab_comments.sql @@ -0,0 +1,42 @@ + +-- +-- Comments taken from +-- Oracle Database Online Documentation 11g Release 2 (11.2) +-- Database PL/SQL Packages and Types Reference +-- https://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_profil.htm#ARPLS67461 +-- + +comment on table PLSQL_PROFILER_RUNS is 'Table of profiler runs for DBMS_PROFILER'; +comment on column PLSQL_PROFILER_RUNS.runid is '(PRIMARY KEY) Unique run identifier from plsql_profiler_runnumber'; +comment on column PLSQL_PROFILER_RUNS.related_run is 'Runid of related run (for client/server correlation)'; +comment on column PLSQL_PROFILER_RUNS.run_owner is 'User who started run'; +comment on column PLSQL_PROFILER_RUNS.run_date is 'Start time of run'; +comment on column PLSQL_PROFILER_RUNS.run_comment is 'User provided comment for this run'; +comment on column PLSQL_PROFILER_RUNS.run_total_time is 'Elapsed time for this run in nanoseconds'; +comment on column PLSQL_PROFILER_RUNS.run_system_info is 'Currently unused'; +comment on column PLSQL_PROFILER_RUNS.run_comment1 is 'Additional comment'; +comment on column PLSQL_PROFILER_RUNS.spare1 is 'Unused'; + +comment on table PLSQL_PROFILER_UNITS is 'Table of program units for DBMS_PROFILER'; +comment on column PLSQL_PROFILER_UNITS.runid is '(Primary key) References plsql_profiler_runs'; +comment on column PLSQL_PROFILER_UNITS.unit_number is '(Primary key) Internally generated library unit #'; +comment on column PLSQL_PROFILER_UNITS.unit_type is 'Library unit type'; +comment on column PLSQL_PROFILER_UNITS.unit_owner is 'Library unit owner name'; +comment on column PLSQL_PROFILER_UNITS.unit_name is 'Library unit name timestamp on library unit'; +comment on column PLSQL_PROFILER_UNITS.unit_timestamp is 'In the future will be used to detect changes to unit between runs'; +comment on column PLSQL_PROFILER_UNITS.total_time is 'Total time spent in this unit in nanoseconds. The profiler does not set this field, but it is provided for the convenience of analysis tools'; +comment on column PLSQL_PROFILER_UNITS.spare1 is 'Unused'; +comment on column PLSQL_PROFILER_UNITS.spare2 is 'Unused'; + +comment on table PLSQL_PROFILER_DATA is 'Table of program units for DBMS_PROFILER'; +comment on column PLSQL_PROFILER_DATA.runid is 'Primary key, unique (generated) run identifier'; +comment on column PLSQL_PROFILER_DATA.unit_number is 'Primary key, internally generated library unit number'; +comment on column PLSQL_PROFILER_DATA.line# is 'Primary key, not null, line number in unit'; +comment on column PLSQL_PROFILER_DATA.total_occur is 'Number of times line was executed'; +comment on column PLSQL_PROFILER_DATA.total_time is 'Total time spent executing line in nanoseconds'; +comment on column PLSQL_PROFILER_DATA.min_time is 'Minimum execution time for this line in nanoseconds'; +comment on column PLSQL_PROFILER_DATA.max_time is 'Maximum execution time for this line in nanoseconds'; +comment on column PLSQL_PROFILER_DATA.spare1 is 'Unused'; +comment on column PLSQL_PROFILER_DATA.spare2 is 'Unused'; +comment on column PLSQL_PROFILER_DATA.spare3 is 'Unused'; +comment on column PLSQL_PROFILER_DATA.spare4 is 'Unused'; diff --git a/src/persist/wt_dbout.pkb b/src/persist/wt_dbout.pkb new file mode 100644 index 0000000..eabff54 --- /dev/null +++ b/src/persist/wt_dbout.pkb @@ -0,0 +1,114 @@ +create or replace package body wt_dbout + authid definer +as + + +--------------------- +-- Public Procedures +--------------------- + + +------------------------------------------------------------ +function get_id + (in_owner in varchar2 + ,in_name in varchar2 + ,in_type in varchar2) + return number +is + l_id number; +begin + select id into rec.id from wt_testcases + where owner = in_owner + and name = in_name + and type = in_type; + return l_id; +exception + when NO_DATA_FOUND + then + return l_id; +end get_id; + +------------------------------------------------------------ +function dim_id + (in_owner in varchar2 + ,in_name in varchar2 + ,in_type in varchar2) + return number +is + rec wt_dbouts%ROWTYPE; +begin + rec.id := get_id (in_owner, in_name, in_type); + if rec.id is null + then + rec.id := wt_dbouts_seq.nextval; + rec.owner := in_owner; + rec.name := in_name; + rec.type := in_type; + insert into wt_dbouts values rec; + end if; + return rec.id; +end get_id; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_get_id + is + begin + -------------------------------------- WTPLSQL Testing -- + null; + end t_get_id; + procedure t_insert_test_runner + is + C_OWNER CONSTANT varchar2(50) := 'WT_TEST_RUNNER_OWNER_FOR_TESTING'; + C_NAME CONSTANT varchar2(50) := 'WT_TEST_RUNNER_NAME_FOR_TESTING'; + l_id number; + num_recs number; + begin + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'INSERT_TEST_RUNNER Happy Path 1'; + delete from wt_test_runners + where owner = C_OWNER + and name = C_NAME; + wt_assert.eqqueryvalue + (msg_in => 'Number of Starting Records' + ,check_query_in => 'select count(name) from wt_test_runners' || + ' where owner = ' || C_OWNER || + ' and name = ' || C_NAME + ,against_value_in => 0); + end t_insert_test_runner; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +------------------------------------------------------------ +procedure delete_records +is +begin + with q1 as ( + select id + from wt_dbouts + MINUS + select dbout_id ID + from wt_test_runs + group by dbout_id + ) + delete from wt_dbouts + where id in (select id from q1); +end delete_records; + + +--==============================================================-- +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_TEST_RUNNER:PACKAGE BODY" %-- + is + begin + -------------------------------------- WTPLSQL Testing -- + t_get_id; + t_dim_id; + t_delete_records; + end; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- +--==============================================================-- + + +end wt_dbout; diff --git a/src/persist/wt_dbout.pks b/src/persist/wt_dbout.pks new file mode 100644 index 0000000..5e4a7e4 --- /dev/null +++ b/src/persist/wt_dbout.pks @@ -0,0 +1,30 @@ +create or replace package wt_dbout + authid definer +as + + function get_id + (in_owner in varchar2 + ,in_name in varchar2 + ,in_type in varchar2) + return number; + + function load_dim + (in_owner in varchar2 + ,in_name in varchar2 + ,in_type in varchar2) + return number; + + procedure delete_records; + + -- WtPLSQL Self Test Procedures + -- + -- alter system set PLSQL_CCFLAGS = + -- 'WTPLSQL_SELFTEST:TRUE' + -- scope=BOTH; + -- + $IF $$WTPLSQL_SELFTEST + $THEN + procedure WTPLSQL_RUN; + $END + +end wt_dbout; diff --git a/src/persist/wt_dbout_runs_vw.vw b/src/persist/wt_dbout_runs_vw.vw new file mode 100644 index 0000000..b544b9b --- /dev/null +++ b/src/persist/wt_dbout_runs_vw.vw @@ -0,0 +1,39 @@ + +-- +-- Database Object Under Test Runs Table View Installation +-- + +create view wt_dbout_runs_vw as +select tr.dbout_id + ,db.owner DBOUT_OWNER + ,db.name DBOUT_NAME + ,db.type DBOUT_TYPE + ,tr.test_runner_id + ,tnr.owner TEST_RUNNER_OWNER + ,tnr.name TEST_RUNNER_NAME + ,tr.id TEST_RUN_ID + ,tr.is_last_run + ,tr.trigger_offset + ,tr.profiler_runid + ,tr.error_message + from wt_test_runs tr + join wt_dbouts db + on db.id = tr.dbout_id + join wt_test_runners tnr + on tnr.id = tr.test_runner_id; + +comment on table wt_dbout_runs_vw is 'Test Run data for each execution of a Test Runner.'; +comment on column wt_dbout_runs_vw.dbout_id is 'Surrogate Key to the Database Object Under Test (DBOUT).'; +comment on column wt_dbout_runs_vw.dbout_owner is 'Owner of the Database Object Under Test (DBOUT).'; +comment on column wt_dbout_runs_vw.dbout_name is 'Name of the Database Object Under Test (DBOUT).'; +comment on column wt_dbout_runs_vw.dbout_type is 'Type of the Database Object Under Test (DBOUT).'; +comment on column wt_dbout_runs_vw.test_runner_id is 'Surrogate Key the Test Runner package.'; +comment on column wt_dbout_runs_vw.test_runner_owner is 'Owner of the Test Runner package.'; +comment on column wt_dbout_runs_vw.test_runner_name is 'Name of the Test Runner package.'; +comment on column wt_dbout_runs_vw.test_run_id is 'Primary (Surrogate) Key for each Test Run'; +comment on column wt_dbout_runs_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; +comment on column wt_dbout_runs_vw.trigger_offset is 'Calculated offset from start of Trigger Source to start of Trigger PL/SQL Block.'; +comment on column wt_dbout_runs_vw.profiler_runid is 'DBMS_PROFILER unique run identifier from plsql_profiler_runnumber sequence'; +comment on column wt_dbout_runs_vw.error_message is 'Optional Error messages from this Test Run.'; + +grant select on wt_dbout_runs_vw to public; diff --git a/src/persist/wt_dbouts.tab b/src/persist/wt_dbouts.tab new file mode 100644 index 0000000..a3f2b0a --- /dev/null +++ b/src/persist/wt_dbouts.tab @@ -0,0 +1,27 @@ + +-- +-- Test Runs Statistics Table Installation +-- + +create sequence wt_dbouts_seq; + +create table wt_dbouts + (id number(38) constraint wt_dbouts_nn1 not null + ,owner varchar2(128) constraint wt_dbouts_nn2 not null + ,name varchar2(128) constraint wt_dbouts_nn3 not null + ,type varchar2(20) constraint wt_dbouts_nn4 not null + ,constraint wt_dbouts_pk primary key (id) + ,constraint wt_dbouts_nk1 unique (owner, name, type) + ) pctfree 0; + +create index wt_dbouts_ix1 + on wt_dbouts (type, owner); + +comment on table wt_dbouts is 'List of Database Objects Under Test (DBOUT).'; +comment on column wt_dbouts.id is 'Primary (Surrogate) Key for each Database Objects Under Test (DBOUT)'; +comment on column wt_dbouts.owner is 'Owner of the Database Object Under Test (DBOUT).'; +comment on column wt_dbouts.name is 'Name of the Database Object Under Test (DBOUT).'; +comment on column wt_dbouts.type is 'Type of the Database Object Under Test (DBOUT).'; + +grant select on wt_dbouts to public; +grant delete on wt_dbouts to public; diff --git a/src/persist/wt_profile.pkb b/src/persist/wt_profile.pkb new file mode 100644 index 0000000..4cd4eee --- /dev/null +++ b/src/persist/wt_profile.pkb @@ -0,0 +1,1855 @@ +create or replace package body wt_profile +as + + $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ + g_current_user varchar2(30); + g_skip_insert boolean := FALSE; + g_skip_add boolean := FALSE; + $END ----------------%WTPLSQL_end_ignore_lines%---------------- + +---------------------- +-- Private Procedures +---------------------- + + +--==============================================================-- +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + + procedure tl_compile_db_object + (in_ptype in varchar2 + ,in_pname in varchar2 + ,in_source in varchar2) + is + l_sql_txt varchar2(4000); + l_errtxt varchar2(32000) := ''; + begin + -------------------------------------- WTPLSQL Testing -- + -- Wrap in_source to complete the DDL statement + l_sql_txt := 'create or replace ' || in_ptype || ' ' || + in_pname || ' is' || CHR(10) || + in_source || CHR(10) || + 'end ' || in_pname || ';'; + wt_assert.raises + (msg_in => 'Compile ' || in_ptype || ' ' || in_pname + ,check_call_in => l_sql_txt + ,against_exc_in => ''); + -------------------------------------- WTPLSQL Testing -- + for buff in (select * from user_errors + where attribute = 'ERROR' + and name = in_pname + and type = in_ptype + order by sequence) + loop + l_errtxt := l_errtxt || buff.line || ', ' || + buff.position || ': ' || buff.text || CHR(10); + end loop; + wt_assert.isnull + (msg_in => 'Compile ' || in_ptype || ' ' || in_pname || + ' Error' + ,check_this_in => l_errtxt); + -------------------------------------- WTPLSQL Testing -- + wt_assert.objexists ( + msg_in => in_pname || ' ' || in_ptype, + obj_owner_in => g_current_user, + obj_name_in => upper(in_pname), + obj_type_in => upper(in_ptype)); + end tl_compile_db_object; +--==============================================================-- + -------------------------------------- WTPLSQL Testing -- + procedure tl_drop_db_object + (in_pname in varchar2, + in_ptype in varchar2) + is + l_sql_txt varchar2(4000); + begin + -------------------------------------- WTPLSQL Testing -- + l_sql_txt := 'drop ' || in_ptype || ' ' || in_pname; + wt_assert.raises + (msg_in => 'drop ' || in_ptype || ' ' || in_pname + ,check_call_in => l_sql_txt + ,against_exc_in => ''); + wt_assert.objnotexists ( + msg_in => in_pname || ' ' || in_ptype, + obj_owner_in => g_current_user, + obj_name_in => upper(in_pname), + obj_type_in => upper(in_ptype)); + end tl_drop_db_object; +--==============================================================-- + -------------------------------------- WTPLSQL Testing -- + procedure tl_count_plsql_profiler_recs + (in_test_run_id in number + ,in_expected_count in number) + is + begin + -------------------------------------- WTPLSQL Testing -- + wt_assert.eqqueryvalue + (msg_in => 'Number of plsql_profiler_runs (' || in_test_run_id || ')' + ,check_query_in => 'select count(*) from plsql_profiler_runs' || + ' where runid = ' || in_test_run_id + ,against_value_in => in_expected_count); + wt_assert.eqqueryvalue + (msg_in => 'Number of plsql_profiler_units (' || in_test_run_id || ')' + ,check_query_in => 'select count(*) from plsql_profiler_units' || + ' where runid = ' || in_test_run_id + ,against_value_in => in_expected_count); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eqqueryvalue + (msg_in => 'Number of plsql_profiler_data (' || in_test_run_id || ')' + ,check_query_in => 'select count(*) from plsql_profiler_data' || + ' where runid = ' || in_test_run_id + ,against_value_in => in_expected_count); + end tl_count_plsql_profiler_recs; +--==============================================================-- + -------------------------------------- WTPLSQL Testing -- + procedure tl_insert_plsql_profiler_recs + (in_test_run_id in number) + is + l_sql_txt varchar2(4000); + begin + -------------------------------------- WTPLSQL Testing -- + l_sql_txt := 'insert into plsql_profiler_runs (runid)' || + ' values (' || in_test_run_id || ')'; + wt_assert.raises ( + msg_in => 'insert plsql_profiler_runs (' || in_test_run_id || ')', + check_call_in => l_sql_txt, + against_exc_in => ''); + -------------------------------------- WTPLSQL Testing -- + l_sql_txt := 'insert into plsql_profiler_units (runid, unit_number, total_time)' || + ' values (' || in_test_run_id || ', ' || in_test_run_id || ', 0)'; + wt_assert.raises ( + msg_in => 'insert plsql_profiler_units (' || in_test_run_id || ')', + check_call_in => l_sql_txt, + against_exc_in => ''); + -------------------------------------- WTPLSQL Testing -- + l_sql_txt := 'insert into plsql_profiler_data (runid, unit_number, line#)' || + ' values (' || in_test_run_id || ', ' || in_test_run_id || ', 0)'; + wt_assert.raises ( + msg_in => 'insert plsql_profiler_data (RUNID: ' || in_test_run_id || ')', + check_call_in => l_sql_txt, + against_exc_in => ''); + commit; + end tl_insert_plsql_profiler_recs; +--==============================================================-- + -------------------------------------- WTPLSQL Testing -- + procedure tl_delete_plsql_profiler_recs + (in_test_run_id in number) + is + l_sql_txt varchar2(4000); + begin + -------------------------------------- WTPLSQL Testing -- + l_sql_txt := 'delete from plsql_profiler_data' || + ' where runid = ' || in_test_run_id; + wt_assert.raises ( + msg_in => 'delete plsql_profiler_data (' || in_test_run_id || ')', + check_call_in => l_sql_txt, + against_exc_in => ''); + -------------------------------------- WTPLSQL Testing -- + l_sql_txt := 'delete from plsql_profiler_units' || + ' where runid = ' || in_test_run_id; + wt_assert.raises ( + msg_in => 'delete plsql_profiler_units (' || in_test_run_id || ')', + check_call_in => l_sql_txt, + against_exc_in => ''); + -------------------------------------- WTPLSQL Testing -- + l_sql_txt := 'delete from plsql_profiler_runs' || + ' where runid = ' || in_test_run_id; + wt_assert.raises ( + msg_in => 'delete plsql_profiler_runs (' || in_test_run_id || ')', + check_call_in => l_sql_txt, + against_exc_in => ''); + commit; + end tl_delete_plsql_profiler_recs; +--==============================================================-- + -------------------------------------- WTPLSQL Testing -- + procedure tl_insert_test_runs + (in_test_run_id in NUMBER + ,in_runner_name in varchar2) + is + l_sql_txt varchar2(4000); + begin + -------------------------------------- WTPLSQL Testing -- + l_sql_txt := 'insert into wt_test_runs' || + ' (id, start_dtm, runner_owner, runner_name)' || + ' values (' || in_test_run_id || ', sysdate, ''' || + g_current_user || ''', ''' || + in_runner_name || ''')'; + wt_assert.raises ( + msg_in => 'Insert wt_test_runs (' || in_test_run_id || ')', + check_call_in => l_sql_txt, + against_exc_in => ''); + wt_assert.eqqueryvalue ( + msg_in => 'wt_test_runs (' || in_test_run_id || ') Count', + check_query_in => 'select count(*) from wt_test_runs' || + ' where id = ' || in_test_run_id, + against_value_in => 1); + commit; + end tl_insert_test_runs; +--==============================================================-- + -------------------------------------- WTPLSQL Testing -- + procedure tl_delete_test_runs + (in_test_run_id in NUMBER) + is + l_sql_txt varchar2(4000); + begin + -------------------------------------- WTPLSQL Testing -- + l_sql_txt := 'delete from wt_test_runs where id = ' || in_test_run_id; + wt_assert.raises ( + msg_in => 'Delete wt_test_runs (' || in_test_run_id || ')', + check_call_in => l_sql_txt, + against_exc_in => ''); + wt_assert.eqqueryvalue ( + msg_in => 'wt_test_runs (' || in_test_run_id || ') Count', + check_query_in => 'select count(*) from wt_test_runs' || + ' where id = ' || in_test_run_id, + against_value_in => 0); + commit; + end tl_delete_test_runs; +--==============================================================-- + -------------------------------------- WTPLSQL Testing -- + procedure tl_insert_dbout_profiles + (in_rec in wt_dbout_profiles%ROWTYPE) + is + l_sqlerrm varchar2(4000); + begin + -------------------------------------- WTPLSQL Testing -- + begin + insert into wt_dbout_profiles values in_rec; + l_sqlerrm := SQLERRM; + commit; + exception when others then + l_sqlerrm := SQLERRM; + end; + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq ( + msg_in => 'Insert wt_dbout_profiles (' || in_rec.test_run_id || + ',' || in_rec.line || ')', + check_this_in => l_sqlerrm, + against_this_in => 'ORA-0000: normal, successful completion'); + wt_assert.eqqueryvalue ( + msg_in => 'wt_dbout_profiles (' || in_rec.test_run_id || + ',' || in_rec.line || ') Count', + check_query_in => 'select count(*) from wt_dbout_profiles' || + ' where test_run_id = ' || in_rec.test_run_id || + ' and line = ' || in_rec.line, + against_value_in => 1); + end tl_insert_dbout_profiles; +--==============================================================-- + -------------------------------------- WTPLSQL Testing -- + procedure tl_delete_dbout_profiles + (in_test_run_id in NUMBER) + is + l_sql_txt varchar2(4000); + begin + -------------------------------------- WTPLSQL Testing -- + l_sql_txt := 'delete from wt_dbout_profiles where test_run_id = ' || + in_test_run_id; + wt_assert.raises ( + msg_in => 'Delete wt_dbout_profiles (' || in_test_run_id || ')', + check_call_in => l_sql_txt, + against_exc_in => ''); + wt_assert.eqqueryvalue ( + msg_in => 'wt_dbout_profiles (' || in_test_run_id || ') Count', + check_query_in => 'select count(*) from wt_dbout_profiles' || + ' where test_run_id = ' || in_test_run_id, + against_value_in => 0); + commit; + end tl_delete_dbout_profiles; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- +--==============================================================-- + + +------------------------------------------------------------ +-- Return DBMS_PROFILER specific error messages +function get_error_msg + (retnum_in in binary_integer) + return varchar2 +is + l_msg_prefix varchar2(50) := 'DBMS_PROFILER Error: '; +begin + case retnum_in + when dbms_profiler.error_param then return l_msg_prefix || + 'A subprogram was called with an incorrect parameter.'; + when dbms_profiler.error_io then return l_msg_prefix || + 'Data flush operation failed.' || + ' Check whether the profiler tables have been created,' || + ' are accessible, and that there is adequate space.'; + when dbms_profiler.error_version then return l_msg_prefix || + 'There is a mismatch between package and database implementation.' || + ' Oracle returns this error if an incorrect version of the' || + ' DBMS_PROFILER package is installed, and if the version of the' || + ' profiler package cannot work with this database version.'; + else return l_msg_prefix || + 'Unknown error number ' || retnum_in; + end case; +end get_error_msg; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_get_error_msg + is + begin + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Get Error Messages'; + wt_assert.isnotnull ( + msg_in => 'ERROR_PARAM Test 1', + check_this_in => get_error_msg(dbms_profiler.error_param)); + wt_assert.this ( + msg_in => 'ERROR_PARAM Test 2', + check_this_in => regexp_like(get_error_msg(dbms_profiler.error_param) + ,'incorrect parameter','i')); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnotnull ( + msg_in => 'ERROR_IO Test 1', + check_this_in => get_error_msg(dbms_profiler.error_io)); + wt_assert.this ( + msg_in => 'ERROR_IO Test 2', + check_this_in => regexp_like(get_error_msg(dbms_profiler.error_io) + ,'Data flush operation','i')); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnotnull ( + msg_in => 'ERROR_VERSION Test 1', + check_this_in => get_error_msg(dbms_profiler.error_version)); + wt_assert.this ( + msg_in => 'ERROR_VERSION Test 2', + check_this_in => regexp_like(get_error_msg(dbms_profiler.error_version) + ,'incorrect version','i')); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnotnull ( + msg_in => 'Unknown Error Test 1', + check_this_in => get_error_msg(-9999)); + wt_assert.this ( + msg_in => 'Unknown Error Test 2', + check_this_in => regexp_like(get_error_msg(-9999) + ,'Unknown error','i')); + end t_get_error_msg; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +------------------------------------------------------------ +procedure find_dbout +is + cursor c_readable + (in_owner varchar2 + ,in_name varchar2 + ,in_type varchar2) + is + select src.name + from dba_source src + where src.owner = core_data.g_run_rec.dbout_owner + and src.name = core_data.g_run_rec.dbout_name + and src.type = core_data.g_run_rec.dbout_type; + b_readable c_readable%ROWTYPE; +begin + -- Find the first occurance of any PL/SQL source + open c_readable (core_data.g_run_rec.dbout_owner + ,core_data.g_run_rec.dbout_name + ,core_data.g_run_rec.dbout_type); + fetch c_readable into b_readable; + if c_readable%NOTFOUND + then + if core_data.g_run_rec.dbout_type in ('FUNCTION', 'PROCEDURE', 'PACKAGE BODY', + 'TYPE BODY', 'TRIGGER') + then + -- These object types should have PL/SQL source code available + --%WTPLSQL_begin_ignore_lines%-- Untestable: + core_data.g_run_rec.error_message := 'Unable to read source for ' || core_data.g_run_rec.dbout_type || + ' ' || core_data.g_run_rec.dbout_owner || '.' || core_data.g_run_rec.dbout_name ; + --%WTPLSQL_end_ignore_lines%-- + else + core_data.g_run_rec.prof_runid := -1; -- Don't run profiler. + end if; + end if; + close c_readable; +end find_dbout; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_find_dbout + is + l_recSAVE rec_type; + l_recNULL rec_type; + l_recTEST rec_type; + l_owner varchar2(128); + l_pname varchar2(128) := 'WT_PROFILE_FIND_DBOUT'; + -------------------------------------- WTPLSQL Testing -- + procedure run_find_dbout is begin + l_recSAVE := g_rec; + g_rec := l_recNULL; + find_dbout(l_owner, l_pname); + l_recTEST := g_rec; + g_rec := l_recSAVE; + end run_find_dbout; + begin + select username into l_owner from user_users; + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Find DBOUT Setup'; + tl_compile_db_object + (in_ptype => 'package' + ,in_pname => l_pname + ,in_source => ' l_junk number;' ); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Find DBOUT Happy Path 1'; + tl_compile_db_object + (in_ptype => 'package body' + ,in_pname => l_pname + ,in_source => 'begin' || CHR(10) || + ' l_junk := 1;' ); + run_find_dbout; + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull + (msg_in => 'l_recTEST.dbout_owner' + ,check_this_in => l_recTEST.dbout_owner); + wt_assert.isnull + (msg_in => 'l_recTEST.dbout_name' + ,check_this_in => l_recTEST.dbout_name); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull + (msg_in => 'l_recTEST.dbout_type' + ,check_this_in => l_recTEST.dbout_type); + wt_assert.isnull + (msg_in => 'l_recTEST.error_message' + ,check_this_in => l_recTEST.error_message); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Find DBOUT Happy Path 2'; + tl_compile_db_object + (in_ptype => 'package body' + ,in_pname => l_pname + ,in_source => + ' --% WTPLSQL SET DBOUT "' || l_pname || + ':PACKAGE BODY" %--' || CHR(10) || + 'begin' || CHR(10) || + ' l_junk := 1;' ); + run_find_dbout; + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq + (msg_in => 'l_recTEST.dbout_owner' + ,check_this_in => l_recTEST.dbout_owner + ,against_this_in => g_current_user); + wt_assert.eq + (msg_in => 'l_recTEST.dbout_name' + ,check_this_in => l_recTEST.dbout_name + ,against_this_in => l_pname); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq + (msg_in => 'l_recTEST.dbout_type' + ,check_this_in => l_recTEST.dbout_type + ,against_this_in => 'PACKAGE BODY'); + wt_assert.isnull + (msg_in => 'l_recTEST.error_message' + ,check_this_in => l_recTEST.error_message); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Find DBOUT Happy Path 3'; + tl_compile_db_object + (in_ptype => 'package body' + ,in_pname => l_pname + ,in_source => + ' --% WTPLSQL SET DBOUT "' || g_current_user || + '.' || l_pname || + ':PACKAGE BODY" %--' || CHR(10) || + 'begin' || CHR(10) || + ' l_junk := 1;' ); + run_find_dbout; + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq + (msg_in => 'l_recTEST.dbout_owner' + ,check_this_in => l_recTEST.dbout_owner + ,against_this_in => g_current_user); + wt_assert.eq + (msg_in => 'l_recTEST.dbout_name' + ,check_this_in => l_recTEST.dbout_name + ,against_this_in => l_pname); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq + (msg_in => 'l_recTEST.dbout_type' + ,check_this_in => l_recTEST.dbout_type + ,against_this_in => 'PACKAGE BODY'); + wt_assert.isnull + (msg_in => 'l_recTEST.error_message' + ,check_this_in => l_recTEST.error_message); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Find DBOUT Sad Path 1'; + tl_compile_db_object + (in_ptype => 'package body' + ,in_pname => l_pname + ,in_source => + -- Don't remove the "||", otherwise this will set the DBOUT + ' --% WTPLSQL SET DBOUT ' || '"BOGUS1" %--' || CHR(10) || + 'begin' || CHR(10) || + ' l_junk := 1;' ); + run_find_dbout; + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull + (msg_in => 'l_recTEST.dbout_owner' + ,check_this_in => l_recTEST.dbout_owner); + wt_assert.isnull + (msg_in => 'l_recTEST.dbout_name' + ,check_this_in => l_recTEST.dbout_name); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull + (msg_in => 'l_recTEST.dbout_type' + ,check_this_in => l_recTEST.dbout_type); + wt_assert.eq + (msg_in => 'l_recTEST.error_message' + ,check_this_in => l_recTEST.error_message + ,against_this_in => 'Unable to find database object "BOGUS1".'); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Find DBOUT Sad Path 2'; + tl_compile_db_object + (in_ptype => 'package body' + ,in_pname => l_pname + ,in_source => + ' --% WTPLSQL SET DBOUT "' || g_current_user || + '.' || l_pname || '" %--' || CHR(10) || + 'begin' || CHR(10) || + ' l_junk := 1;' ); + run_find_dbout; + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq + (msg_in => 'l_recTEST.dbout_owner' + ,check_this_in => l_recTEST.dbout_owner + ,against_this_in => g_current_user); + wt_assert.eq + (msg_in => 'l_recTEST.dbout_name' + ,check_this_in => l_recTEST.dbout_name + ,against_this_in => l_pname); + wt_assert.eq + (msg_in => 'l_recTEST.error_message' + ,check_this_in => l_recTEST.error_message + ,against_this_in => 'Found too many database objects "WTP.WT_PROFILE_FIND_DBOUT".'); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Find DBOUT Sad Path 3'; + tl_compile_db_object + (in_ptype => 'package body' + ,in_pname => l_pname + ,in_source => + -- Don't remove the "||", otherwise this will set the DBOUT + ' --% WTPLSQL SET DBOUT ' || '"SYS.ALL_OBJECTS:VIEW" %--' || CHR(10) || + 'begin' || CHR(10) || + ' l_junk := 1;' ); + run_find_dbout; + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq + (msg_in => 'l_recTEST.dbout_owner' + ,check_this_in => l_recTEST.dbout_owner + ,against_this_in => 'SYS'); + wt_assert.eq + (msg_in => 'l_recTEST.dbout_name' + ,check_this_in => l_recTEST.dbout_name + ,against_this_in => 'ALL_OBJECTS'); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq + (msg_in => 'l_recTEST.dbout_type' + ,check_this_in => l_recTEST.dbout_type + ,against_this_in => 'VIEW'); + wt_assert.isnull + (msg_in => 'l_recTEST.error_message' + ,check_this_in => l_recTEST.error_message); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Find DBOUT Teardown'; + tl_drop_db_object(l_pname, 'package'); + end t_find_dbout; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +------------------------------------------------------------ +procedure delete_plsql_profiler_recs + (in_profiler_runid in number) +is +begin + delete from plsql_profiler_data + where runid = in_profiler_runid; + delete from plsql_profiler_units + where runid = in_profiler_runid; + delete from plsql_profiler_runs + where runid = in_profiler_runid; +end delete_plsql_profiler_recs; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_delete_profiler_recs + is + c_test_run_id constant number := -99; + l_err_stack varchar2(32000); + begin + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Delete PL/SQL Profiler Records Happy Path 1'; + begin + delete_plsql_profiler_recs(c_test_run_id); -- Should run without error + l_err_stack := dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace ; + exception when others then + l_err_stack := dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace ; + end; + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull ( + msg_in => 'delete_plsql_profiler_recs(' || c_test_run_id || ') 1', + check_this_in => l_err_stack); + tl_count_plsql_profiler_recs(c_test_run_id, 0); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Delete PL/SQL Profiler Records Happy Path 2'; + tl_insert_plsql_profiler_recs(c_test_run_id); + tl_count_plsql_profiler_recs(c_test_run_id, 1); + begin + delete_plsql_profiler_recs(c_test_run_id); -- Should run without error + l_err_stack := dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace ; + exception when others then + l_err_stack := dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace ; + end; + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull ( + msg_in => 'delete_plsql_profiler_recs(' || c_test_run_id || ') 2', + check_this_in => l_err_stack); + tl_count_plsql_profiler_recs(c_test_run_id, 0); + end t_delete_profiler_recs; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +------------------------------------------------------------ +procedure load_ignr_aa +is + cursor c_find_begin is + select line + ,instr(text,'--%WTPLSQL_begin_ignore_lines%--') col + from dba_source + where owner = g_rec.dbout_owner + and name = g_rec.dbout_name + and type = g_rec.dbout_type + and text like '%--\%WTPLSQL_begin_ignore_lines\%--%' escape '\' + order by line; + buff_find_begin c_find_begin%ROWTYPE; + cursor c_find_end (in_line in number, in_col in number) is + with q1 as ( + select line + ,instr(text,'--%WTPLSQL_end_ignore_lines%--') col + from dba_source + where owner = g_rec.dbout_owner + and name = g_rec.dbout_name + and type = g_rec.dbout_type + and line >= in_line + and text like '%--\%WTPLSQL_end_ignore_lines\%--%' escape '\' + ) + select line + ,col + from q1 + where line > in_line + or ( line = in_line + and col > in_col) + order by line + ,col; + buff_find_end c_find_end%ROWTYPE; +begin + g_ignr_aa.delete; + open c_find_begin; + loop + fetch c_find_begin into buff_find_begin; + exit when c_find_begin%NOTFOUND; + open c_find_end (buff_find_begin.line, buff_find_begin.col); + fetch c_find_end into buff_find_end; + if c_find_end%NOTFOUND + then + select max(line) + into buff_find_end.line + from dba_source + where owner = g_rec.dbout_owner + and name = g_rec.dbout_name + and type = g_rec.dbout_type; + end if; + close c_find_end; + for i in buff_find_begin.line + g_rec.trigger_offset .. + buff_find_end.line + g_rec.trigger_offset + loop + g_ignr_aa(i) := 'X'; + end loop; + end loop; + close c_find_begin; +end load_ignr_aa; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_load_ignr_aa + is + l_recSAVE rec_type; + l_ignrSAVE ignr_aa_type; + l_ignrTEST ignr_aa_type; + l_pname varchar2(128) := 'WT_PROFILE_LOAD_IGNR'; + -------------------------------------- WTPLSQL Testing -- + procedure run_load_ignr is begin + l_recSAVE := g_rec; + l_ignrSAVE := g_ignr_aa; + g_ignr_aa.delete; + g_rec.dbout_owner := g_current_user; + g_rec.dbout_name := l_pname; + g_rec.dbout_type := 'PACKAGE BODY'; + g_rec.trigger_offset := 0; + load_ignr_aa; + l_ignrTEST := g_ignr_aa; + g_ignr_aa := l_ignrSAVE; + g_rec := l_recSAVE; + end run_load_ignr; + begin + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Load Ignr Setup'; + wt_assert.isnotnull + (msg_in => 'Number of IGNR_AA elements' + ,check_this_in => g_ignr_aa.COUNT); + tl_compile_db_object + (in_ptype => 'package' + ,in_pname => l_pname + ,in_source => ' l_junk number;' ); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Load Ignr Happy Path 1'; + tl_compile_db_object + (in_ptype => 'package body' + ,in_pname => l_pname + ,in_source => 'begin' || CHR(10) || + ' l_junk := 1;' ); + run_load_ignr; + wt_assert.eq + (msg_in => 'l_ignrTest.COUNT' + ,check_this_in => l_ignrTest.COUNT + ,against_this_in => 0); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Load Ignr Happy Path 2'; + tl_compile_db_object + (in_ptype => 'package body' + ,in_pname => l_pname + ,in_source => + 'begin' || CHR(10) || -- Line 2 + ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 3 + ' l_junk := 1;' ); -- Line 4 + -- end -- Line 5 + run_load_ignr; + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq + (msg_in => 'l_ignrTest.COUNT' + ,check_this_in => l_ignrTest.COUNT + ,against_this_in => 3); + for i in 3 .. 5 + loop + wt_assert.eq + (msg_in => 'l_ignrTest.exists(' || i || ')' + ,check_this_in => l_ignrTest.exists(i) + ,against_this_in => TRUE); + end loop; + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Load Ignr Happy Path 3'; + tl_compile_db_object + (in_ptype => 'package body' + ,in_pname => l_pname + ,in_source => + 'begin' || CHR(10) || -- Line 2 + ' l_junk := 1;' || CHR(10) || -- Line 3 + ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 4 + ' l_junk := 2;' || CHR(10) || -- Line 5 + ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 6 + ' l_junk := 3;' ); -- Line 7 + run_load_ignr; + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq + (msg_in => 'l_ignrTest.COUNT' + ,check_this_in => l_ignrTest.COUNT + ,against_this_in => 3); + for i in 4 .. 6 + loop + wt_assert.eq + (msg_in => 'l_ignrTest.exists(' || i || ')' + ,check_this_in => l_ignrTest.exists(i) + ,against_this_in => TRUE); + end loop; + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Load Ignr Happy Path 4'; + tl_compile_db_object + (in_ptype => 'package body' + ,in_pname => l_pname + ,in_source => + 'begin' || CHR(10) || -- Line 2 + ' l_junk := 1;' || CHR(10) || -- Line 3 + ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 4 + ' l_junk := 2;' || CHR(10) || -- Line 5 + ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 6 + ' l_junk := 3;' || CHR(10) || -- Line 7 + ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 8 + ' l_junk := 4;' ); -- Line 9 + -- end -- Line 10 + run_load_ignr; + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq + (msg_in => 'l_ignrTest.COUNT' + ,check_this_in => l_ignrTest.COUNT + ,against_this_in => 6); + for i in 4 .. 6 + loop + wt_assert.eq + (msg_in => 'l_ignrTest.exists(' || i || ')' + ,check_this_in => l_ignrTest.exists(i) + ,against_this_in => TRUE); + end loop; + -------------------------------------- WTPLSQL Testing -- + for i in 8 .. 10 + loop + wt_assert.eq + (msg_in => 'l_ignrTest.exists(' || i || ')' + ,check_this_in => l_ignrTest.exists(i) + ,against_this_in => TRUE); + end loop; + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Load Ignr Sad Path 1'; + tl_compile_db_object + (in_ptype => 'package body' + ,in_pname => l_pname + ,in_source => + 'begin' || CHR(10) || -- Line 2 + ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 3 + ' l_junk := 4;' ); -- Line 4 + run_load_ignr; + wt_assert.eq + (msg_in => 'l_ignrTest.COUNT' + ,check_this_in => l_ignrTest.COUNT + ,against_this_in => 0); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Load Ignr Sad Path 2'; + tl_compile_db_object + (in_ptype => 'package body' + ,in_pname => l_pname + ,in_source => + 'begin' || CHR(10) || -- Line 2 + ' l_junk := 1;' || CHR(10) || -- Line 3 + ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 4 + ' l_junk := 2;' || CHR(10) || -- Line 5 + ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 6 + ' l_junk := 3;' || CHR(10) || -- Line 7 + ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 8 + ' l_junk := 4;' ); -- Line 9 + run_load_ignr; + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq + (msg_in => 'l_ignrTest.COUNT' + ,check_this_in => l_ignrTest.COUNT + ,against_this_in => 3); + for i in 4 .. 6 + loop + wt_assert.eq + (msg_in => 'l_ignrTest.exists(' || i || ')' + ,check_this_in => l_ignrTest.exists(i) + ,against_this_in => TRUE); + end loop; + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Load Ignr Sad Path 3'; + tl_compile_db_object + (in_ptype => 'package body' + ,in_pname => l_pname + ,in_source => + 'begin' || CHR(10) || -- Line 2 + ' l_junk := 1;' || CHR(10) || -- Line 3 + ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 4 + ' l_junk := 2;' || CHR(10) || -- Line 5 + ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 6 + ' l_junk := 3;' || CHR(10) || -- Line 7 + ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 8 + ' l_junk := 4;' ); -- Line 9 + run_load_ignr; + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq + (msg_in => 'l_ignrTest.COUNT' + ,check_this_in => l_ignrTest.COUNT + ,against_this_in => 5); + for i in 4 .. 8 + loop + wt_assert.eq + (msg_in => 'l_ignrTest.exists(' || i || ')' + ,check_this_in => l_ignrTest.exists(i) + ,against_this_in => TRUE); + end loop; + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Load Ignr Teardown'; + tl_drop_db_object(l_pname, 'package'); + wt_assert.isnotnull + (msg_in => 'Number of IGNR_AA elements' + ,check_this_in => g_ignr_aa.COUNT); + end t_load_ignr_aa; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +------------------------------------------------------------ +procedure insert_dbout_profile +is + prof_rec wt_dbout_profiles%ROWTYPE; + l_max_line number; + procedure l_set_status is begin + if g_ignr_aa.EXISTS(prof_rec.line) + then + -- Found Statement to Ignore + prof_rec.status := 'IGNR'; + return; + end if; + if prof_rec.total_occur > 0 + then + -- Found Executed Statement + prof_rec.status := 'EXEC'; + return; + end if; + if prof_rec.total_occur = 0 + and prof_rec.total_usecs = 0 + then + -- Check for declaration if Not Executed + if regexp_like(prof_rec.text, '^[[:space:]]*' || + '(FUNCTION|PROCEDURE|PACKAGE|TYPE|TRIGGER)' || + '[[:space:]]', 'i') + then + -- Exclude declarations if Not Executed + prof_rec.status := 'EXCL'; + elsif prof_rec.line = l_max_line + AND regexp_like(prof_rec.text, 'END', 'i') + then + prof_rec.status := 'EXCL'; + else + -- Found Not Executed Statement + prof_rec.status := 'NOTX'; + end if; + return; + end if; + -- Everything else is unknown + prof_rec.status := 'UNKN'; + end l_set_status; +begin + -- This will not RAISE NO_DATA_FOUND because it uses a GROUP FUNCTION. + select max(ppd.line#) into l_max_line + from plsql_profiler_units ppu + join plsql_profiler_data ppd + on ppd.unit_number = ppu.unit_number + and ppd.runid = g_rec.prof_runid + where ppu.unit_owner = g_rec.dbout_owner + and ppu.unit_name = g_rec.dbout_name + and ppu.unit_type = g_rec.dbout_type + and ppu.runid = g_rec.prof_runid; + load_ignr_aa; + prof_rec.test_run_id := g_rec.test_run_id; + for buf1 in ( + select src.line + ,ppd.total_occur + ,ppd.total_time + ,ppd.min_time + ,ppd.max_time + ,src.text + from plsql_profiler_units ppu + join plsql_profiler_data ppd + on ppd.unit_number = ppu.unit_number + and ppd.runid = g_rec.prof_runid + join dba_source src + on src.line = ppd.line# + g_rec.trigger_offset + and src.owner = g_rec.dbout_owner + and src.name = g_rec.dbout_name + and src.type = g_rec.dbout_type + where ppu.unit_owner = g_rec.dbout_owner + and ppu.unit_name = g_rec.dbout_name + and ppu.unit_type = g_rec.dbout_type + and ppu.runid = g_rec.prof_runid ) + loop + prof_rec.line := buf1.line; + prof_rec.total_occur := buf1.total_occur; + prof_rec.total_usecs := buf1.total_time/1000; + prof_rec.min_usecs := buf1.min_time/1000; + prof_rec.max_usecs := buf1.max_time/1000; + prof_rec.text := buf1.text; + prof_rec.status := NULL; + l_set_status; + insert into wt_dbout_profiles values prof_rec; + + $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ + if not g_skip_add then + $END + wt_test_run_stat.add_profile(prof_rec); + $IF $$WTPLSQL_SELFTEST $THEN + end if; + $END ----------------%WTPLSQL_end_ignore_lines%---------------- + + end loop; + g_ignr_aa.delete; + delete_plsql_profiler_recs(g_rec.prof_runid); +end insert_dbout_profile; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_insert_dbout_profile + is + units_rec plsql_profiler_units%ROWTYPE; + data_rec plsql_profiler_data%ROWTYPE; + l_recSAVE rec_type; + l_recNULL rec_type; + c_test_run_id constant number := -97; + l_pname varchar2(128) := 'WT_PROFILE_INSERT_DBOUT'; + l_sqlerrm varchar2(4000); + l_err_stack varchar2(32000); + -------------------------------------- WTPLSQL Testing -- + procedure insert_plsql_profiler_data + (in_line# in number + ,in_total_occur in number + ,in_total_time in number) + is + begin + data_rec.line# := in_line#; + data_rec.total_occur := in_total_occur; + data_rec.total_time := in_total_time; + -------------------------------------- WTPLSQL Testing -- + begin + insert into plsql_profiler_data values data_rec; + commit; + l_sqlerrm := SQLERRM; + exception when others then + l_sqlerrm := SQLERRM; + end; + wt_assert.eq ( + msg_in => 'insert plsql_profiler_data (LINE#: ' || data_rec.line#|| ')', + check_this_in => SQLERRM, + against_this_in => 'ORA-0000: normal, successful completion'); + end insert_plsql_profiler_data; + -------------------------------------- WTPLSQL Testing -- + procedure test_dbout_profiler + (in_line# in number + ,in_col_name in varchar2 + ,in_value in varchar2) + is + begin + wt_assert.eqqueryvalue + (msg_in => 'wt_dbout_profiles line ' || in_line# || + ', column ' || in_col_name + ,check_query_in => 'select ' || in_col_name || + ' from wt_dbout_profiles' || + ' where test_run_id = ' || c_test_run_id || + ' and line = ' || in_line# + ,against_value_in => in_value); + end test_dbout_profiler; + begin + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Insert DBOUT Profile Setup'; + tl_compile_db_object + (in_ptype => 'package' + ,in_pname => l_pname + ,in_source => ' l_junk number;' ); + -------------------------------------- WTPLSQL Testing -- + tl_compile_db_object + (in_ptype => 'package body' + ,in_pname => l_pname + ,in_source => + 'begin' || CHR(10) || -- Line 2 + ' l_junk := 1;' || CHR(10) || -- Line 3 + ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 4 + ' l_junk := 2;' || CHR(10) || -- Line 5 + ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 6 + ' if 0 = 1 then' || CHR(10) || -- Line 7 + ' l_junk := 3;' || CHR(10) || -- Line 8 + ' end if;' ); -- Line 9 + tl_insert_plsql_profiler_recs(c_test_run_id); + tl_count_plsql_profiler_recs(c_test_run_id, 1); + tl_insert_test_runs(c_test_run_id, 'Insert DBOUT Test'); + -------------------------------------- WTPLSQL Testing -- + units_rec.runid := c_test_run_id; + units_rec.unit_number := 1; + units_rec.unit_owner := g_current_user; + units_rec.unit_name := l_pname; + units_rec.unit_type := 'PACKAGE BODY'; + units_rec.total_time := 0; + -------------------------------------- WTPLSQL Testing -- + begin + insert into plsql_profiler_units values units_rec; + commit; + l_err_stack := dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace ; + exception when others then + l_err_stack := dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace ; + end; + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull ( + msg_in => 'insert UNIT 1 into plsql_profiler_units', + check_this_in => l_err_stack); + wt_assert.eqqueryvalue + (msg_in => 'Number of UNIT 1 plsql_profiler_units' + ,check_query_in => 'select count(*) from plsql_profiler_units' || + ' where runid = ' || c_test_run_id || + ' and unit_number = 1' + ,against_value_in => 1); + -------------------------------------- WTPLSQL Testing -- + data_rec.runid := c_test_run_id; + data_rec.unit_number := 1; + data_rec.min_time := 0; + data_rec.max_time := 1; + insert_plsql_profiler_data(1, 0, 0); + insert_plsql_profiler_data(2, 0, 1); + insert_plsql_profiler_data(3, 1, 1); + insert_plsql_profiler_data(5, 1, 1); + insert_plsql_profiler_data(7, 1, 1); + insert_plsql_profiler_data(8, 0, 0); + insert_plsql_profiler_data(9, 1, 1); + insert_plsql_profiler_data(10, 0, 0); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eqqueryvalue + (msg_in => 'Number of UNIT 1 plsql_profiler_data' + ,check_query_in => 'select count(*) from plsql_profiler_data' || + ' where runid = ' || c_test_run_id || + ' and unit_number = 1' + ,against_value_in => 8); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Insert DBOUT Profile Happy Path'; + l_recSAVE := g_rec; + g_rec.test_run_id := c_test_run_id; + g_rec.dbout_owner := g_current_user; + g_rec.dbout_name := l_pname; + g_rec.dbout_type := 'PACKAGE BODY'; + g_rec.prof_runid := c_test_run_id; + g_rec.trigger_offset := 0; + g_rec.error_message := ''; + -------------------------------------- WTPLSQL Testing -- + g_skip_add := TRUE; + begin + insert_dbout_profile; + l_err_stack := dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace ; + exception when others then + l_err_stack := dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace ; + end; + g_skip_add := FALSE; + g_rec := l_recSAVE; + wt_assert.isnull ( + msg_in => 'SQLERRM', + check_this_in => l_err_stack); + -------------------------------------- WTPLSQL Testing -- + test_dbout_profiler(1, 'STATUS', 'EXCL'); + test_dbout_profiler(1, 'TEXT', 'package body WT_PROFILE_INSERT_DBOUT is' || CHR(10)); + test_dbout_profiler(2, 'STATUS', 'UNKN'); + test_dbout_profiler(2, 'TEXT', 'begin' || CHR(10)); + test_dbout_profiler(3, 'STATUS', 'EXEC'); + test_dbout_profiler(3, 'TEXT', ' l_junk := 1;' || CHR(10)); + test_dbout_profiler(5, 'STATUS', 'IGNR'); + test_dbout_profiler(5, 'TEXT', ' l_junk := 2;' || CHR(10)); + test_dbout_profiler(7, 'STATUS', 'EXEC'); + test_dbout_profiler(7, 'TEXT', ' if 0 = 1 then' || CHR(10)); + test_dbout_profiler(8, 'STATUS', 'NOTX'); + test_dbout_profiler(8, 'TEXT', ' l_junk := 3;' || CHR(10)); + test_dbout_profiler(9, 'STATUS', 'EXEC'); + test_dbout_profiler(9, 'TEXT', ' end if;' || CHR(10)); + test_dbout_profiler(10, 'STATUS', 'EXCL'); + test_dbout_profiler(10, 'TEXT', 'end WT_PROFILE_INSERT_DBOUT;'); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Insert DBOUT Profile Teardown'; + tl_delete_dbout_profiles(c_test_run_id); + tl_delete_test_runs(c_test_run_id); + tl_delete_plsql_profiler_recs(c_test_run_id); + tl_count_plsql_profiler_recs(c_test_run_id, 0); + tl_drop_db_object(l_pname, 'package'); + end t_insert_dbout_profile; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +--------------------- +-- Public Procedures +--------------------- + + +------------------------------------------------------------ +procedure initialize + (in_test_run_id in number, + in_runner_owner in varchar2, + in_runner_name in varchar2, + out_dbout_owner out varchar2, + out_dbout_name out varchar2, + out_dbout_type out varchar2, + out_trigger_offset out number, + out_profiler_runid out number, + out_error_message out varchar2) +is + l_rec_NULL rec_type; + l_retnum binary_integer; +begin + -- Reset variables + out_dbout_owner := ''; + out_dbout_name := ''; + out_dbout_type := ''; + out_trigger_offset := NULL; + out_profiler_runid := NULL; + out_error_message := ''; + g_rec := l_rec_NULL; + $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ + $THEN + -- In case a test failed and left this set to TRUE + g_skip_insert := FALSE; + g_skip_add := FALSE; + $END ----------------%WTPLSQL_end_ignore_lines%---------------- + -- Abort if there is no Test Run ID + if in_test_run_id is null + then + raise_application_error (-20004, 'i_test_run_id is null'); + end if; + g_rec.test_run_id := in_test_run_id; + -- Find the Database Object Under Test + find_dbout(in_owner => in_runner_owner + ,in_pkg_name => in_runner_name); + out_dbout_owner := g_rec.dbout_owner; + out_dbout_name := g_rec.dbout_name; + out_dbout_type := g_rec.dbout_type; + out_error_message := g_rec.error_message; + -- There muxt be a name and no error message + if g_rec.dbout_name is null -- No DBOUT notation + or g_rec.error_message is not null -- Error with DBOUT or Source + or g_rec.prof_runid = -1 -- Skip Profiling + then + g_rec.prof_runid := NULL; + return; + end if; + -- Calculate the trigger offset, if any. + g_rec.trigger_offset := wt_profiler.trigger_offset + (dbout_owner_in => g_rec.dbout_owner + ,dbout_name_in => g_rec.dbout_name + ,dbout_type_in => g_rec.dbout_type ); + out_trigger_offset := g_rec.trigger_offset; + -- Check Versions + l_retnum := dbms_profiler.INTERNAL_VERSION_CHECK; + if l_retnum <> 0 then + ------%WTPLSQL_begin_ignore_lines%------ Can't test this + --dbms_profiler.get_version(major_version, minor_version); + raise_application_error(-20005, + 'dbms_profiler.INTERNAL_VERSION_CHECK returned: ' || get_error_msg(l_retnum)); + ----------------%WTPLSQL_end_ignore_lines%---------------- + end if; + -- This starts the PROFILER Running!!! + l_retnum := dbms_profiler.START_PROFILER(run_number => g_rec.prof_runid); + if l_retnum <> 0 then + ------%WTPLSQL_begin_ignore_lines%------ Can't test this + raise_application_error(-20006, + 'dbms_profiler.START_PROFILER returned: ' || get_error_msg(l_retnum)); + ----------------%WTPLSQL_end_ignore_lines%---------------- + end if; + -- Everything is OK, set the Profiler Run ID + out_profiler_runid := g_rec.prof_runid; +end initialize; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_initialize + is + c_test_run_id constant number := -96; + l_owner varchar2(128); + l_pname varchar2(128) := 'WT_PROFILE_INITIALIZE'; + l_recSAVE rec_type; + l_recTEST rec_type; + l_recOUT rec_type; + l_sqlerrm varchar2(4000); + begin + select username into l_owner from user_users; + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Insert DBOUT Profile Setup'; + tl_compile_db_object + (in_ptype => 'package' + ,in_pname => l_pname + ,in_source => ' l_junk number;' ); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Initialize Test HAPPY Path 1'; + tl_compile_db_object + (in_ptype => 'package body' + ,in_pname => l_pname + ,in_source => + 'begin' || CHR(10) || -- Line 2 + ' l_junk := 7;' ); -- Line 3 + -------------------------------------- WTPLSQL Testing -- + l_recSAVE := g_rec; + initialize + (in_test_run_id => c_test_run_id, + in_runner_owner => l_owner, + in_runner_name => l_pname, + out_dbout_owner => l_recOUT.dbout_owner, + out_dbout_name => l_recOUT.dbout_name, + out_dbout_type => l_recOUT.dbout_type, + out_trigger_offset => l_recOUT.trigger_offset, + out_profiler_runid => l_recOUT.prof_runid, + out_error_message => l_recOUT.error_message); + l_recTEST := g_rec; + g_rec := l_recSAVE; + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull ( + msg_in => 'OUT dbout_owner', + check_this_in => l_recOUT.dbout_owner); + wt_assert.isnull ( + msg_in => 'OUT dbout_name', + check_this_in => l_recOUT.dbout_name); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull ( + msg_in => 'OUT dbout_type', + check_this_in => l_recOUT.dbout_type); + wt_assert.isnull ( + msg_in => 'OUT prof_runid', + check_this_in => l_recOUT.prof_runid); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull ( + msg_in => 'OUT trigger_offset', + check_this_in => l_recOUT.trigger_offset); + wt_assert.isnull ( + msg_in => 'OUT error_message', + check_this_in => l_recOUT.error_message); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull ( + msg_in => 'l_recTEST.dbout_owner', + check_this_in => l_recTEST.dbout_owner); + wt_assert.isnull ( + msg_in => 'l_recTEST.dbout_name', + check_this_in => l_recTEST.dbout_name); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull ( + msg_in => 'l_recTEST.dbout_type', + check_this_in => l_recTEST.dbout_type); + wt_assert.isnull ( + msg_in => 'l_recTEST.prof_runid', + check_this_in => l_recTEST.prof_runid); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull ( + msg_in => 'l_recTEST.trigger_offset', + check_this_in => l_recTEST.trigger_offset); + wt_assert.isnull ( + msg_in => 'l_recTEST.error_message', + check_this_in => l_recTEST.error_message); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Initialize Test HAPPY Path 2'; + tl_compile_db_object + (in_ptype => 'package body' + ,in_pname => l_pname + ,in_source => + 'begin' || CHR(10) || -- Line 2 + '--% WTPLSQL SET DBOUT "' || l_pname || + ':PACKAGE BODY" %--' || CHR(10) || -- Line 3 + ' l_junk := 7;' ); -- Line 4 + -------------------------------------- WTPLSQL Testing -- + l_recSAVE := g_rec; + initialize + (in_test_run_id => c_test_run_id, + in_runner_owner => l_owner, + in_runner_name => l_pname, + out_dbout_owner => l_recOUT.dbout_owner, + out_dbout_name => l_recOUT.dbout_name, + out_dbout_type => l_recOUT.dbout_type, + out_trigger_offset => l_recOUT.trigger_offset, + out_profiler_runid => l_recOUT.prof_runid, + out_error_message => l_recOUT.error_message); + l_recTEST := g_rec; + g_rec := l_recSAVE; + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq ( + msg_in => 'OUT dbout_owner', + check_this_in => l_recOUT.dbout_owner, + against_this_in => g_current_user); + wt_assert.eq ( + msg_in => 'OUT dbout_name', + check_this_in => l_recOUT.dbout_name, + against_this_in => l_pname); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq ( + msg_in => 'OUT dbout_type', + check_this_in => l_recOUT.dbout_type, + against_this_in => 'PACKAGE BODY'); + wt_assert.isnotnull ( + msg_in => 'OUT prof_runid', + check_this_in => l_recOUT.prof_runid); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq ( + msg_in => 'OUT trigger_offset', + check_this_in => l_recOUT.trigger_offset, + against_this_in => 0); + wt_assert.isnull ( + msg_in => 'OUT error_message', + check_this_in => l_recOUT.error_message); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq ( + msg_in => 'l_recTEST.dbout_owner', + check_this_in => l_recTEST.dbout_owner, + against_this_in => g_current_user); + wt_assert.eq ( + msg_in => 'l_recTEST.dbout_name', + check_this_in => l_recTEST.dbout_name, + against_this_in => l_pname); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq ( + msg_in => 'l_recTEST.dbout_type', + check_this_in => l_recTEST.dbout_type, + against_this_in => 'PACKAGE BODY'); + wt_assert.isnotnull ( + msg_in => 'l_recTEST.prof_runid', + check_this_in => l_recTEST.prof_runid); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq ( + msg_in => 'l_recTEST.trigger_offset', + check_this_in => l_recTEST.trigger_offset, + against_this_in => 0); + wt_assert.isnull ( + msg_in => 'l_recTEST.error_message', + check_this_in => l_recTEST.error_message); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Initialize Test Sad Path 1'; + l_recSAVE := g_rec; + begin + initialize + (in_test_run_id => null, + in_runner_owner => l_owner, + in_runner_name => 'Sad Path 1', + out_dbout_owner => l_recOUT.dbout_owner, + out_dbout_name => l_recOUT.dbout_name, + out_dbout_type => l_recOUT.dbout_type, + out_trigger_offset => l_recOUT.trigger_offset, + out_profiler_runid => l_recOUT.prof_runid, + out_error_message => l_recOUT.error_message); + l_sqlerrm := SQLERRM; + -------------------------------------- WTPLSQL Testing -- + exception when others then + l_sqlerrm := SQLERRM; + end; + l_recTEST := g_rec; + g_rec := l_recSAVE; + wt_assert.eq ( + msg_in => 'SQLERRM', + check_this_in => l_sqlerrm, + against_this_in => 'ORA-20004: i_test_run_id is null'); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Insert DBOUT Profile Teardown'; + tl_drop_db_object + (in_ptype => 'package' + ,in_pname => l_pname); + end t_initialize; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +------------------------------------------------------------ +-- Because this procedure is called to cleanup after erorrs, +-- it must be able to run multiple times without causing damage. +procedure finalize +is + l_rec_NULL rec_type; +begin + if g_rec.prof_runid is null + then + return; + end if; + if g_rec.test_run_id is null + then + raise_application_error (-20000, 'g_rec.test_run_id is null'); + end if; + $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ + $THEN + if not g_skip_insert + then + $END + begin + -- DBMS_PROFILER.FLUSH_DATA is included with DBMS_PROFILER.STOP_PROFILER + dbms_profiler.STOP_PROFILER; + exception when others then + g_rec := l_rec_NULL; + raise; + end; + insert_dbout_profile; + $IF $$WTPLSQL_SELFTEST + $THEN + end if; + $END ----------------%WTPLSQL_end_ignore_lines%---------------- + g_rec := l_rec_NULL; +end finalize; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_finalize + is + l_recSAVE rec_type; + l_recTEST rec_type; + l_sqlerrm varchar2(4000); + l_err_stack varchar2(32000); + begin + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Finalize Happy Path 1'; + l_recSAVE := g_rec; + g_rec.prof_runid := NULL; + wt_assert.isnull ( + msg_in => 'g_rec.prof_runid', + check_this_in => g_rec.prof_runid); + -------------------------------------- WTPLSQL Testing -- + begin + finalize; + l_err_stack := dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace ; + exception when others then + l_err_stack := dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace ; + end; + g_rec := l_recSAVE; + wt_assert.isnull ( + msg_in => 'format_error_stack and format_error_backtrace', + check_this_in => l_err_stack); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Finalize Happy Path 2'; + l_recSAVE := g_rec; + g_rec.test_run_id := -1; + g_rec.dbout_owner := 'TEST OWNER'; + g_rec.dbout_name := 'TEST NAME'; + g_rec.dbout_type := 'TEST TYPE'; + g_rec.prof_runid := -2; + g_rec.trigger_offset := -3; + g_rec.error_message := 'TEST MESSAGE'; + -------------------------------------- WTPLSQL Testing -- + g_skip_insert := TRUE; + begin + finalize; + l_err_stack := dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace ; + exception when others then + l_err_stack := dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace ; + end; + g_skip_insert := FALSE; + -------------------------------------- WTPLSQL Testing -- + l_recTEST := g_rec; + g_rec := l_recSAVE; + wt_assert.isnull ( + msg_in => 'SQLERRM', + check_this_in => l_err_stack); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull ( + msg_in => 'l_recTEST.test_run_id', + check_this_in => l_recTEST.test_run_id); + wt_assert.isnull ( + msg_in => 'l_recTEST.dbout_owner', + check_this_in => l_recTEST.dbout_owner); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull ( + msg_in => 'l_recTEST.dbout_name', + check_this_in => l_recTEST.dbout_name); + wt_assert.isnull ( + msg_in => 'l_recTEST.dbout_type', + check_this_in => l_recTEST.dbout_type); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull ( + msg_in => 'l_recTEST.prof_runid', + check_this_in => l_recTEST.prof_runid); + wt_assert.isnull ( + msg_in => 'l_recTEST.trigger_offset', + check_this_in => l_recTEST.trigger_offset); + wt_assert.isnull ( + msg_in => 'l_recTEST.error_message', + check_this_in => l_recTEST.error_message); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Finalize Sad Path 1'; + l_recSAVE := g_rec; + g_rec.prof_runid := -1; + g_rec.test_run_id := NULL; + begin + finalize; + exception when others then + l_sqlerrm := SQLERRM; + end; + -------------------------------------- WTPLSQL Testing -- + g_rec := l_recSAVE; + wt_assert.eq ( + msg_in => 'SQLERRM', + check_this_in => l_sqlerrm, + against_this_in => 'ORA-20000: g_rec.test_run_id is null'); + end t_finalize; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +------------------------------------------------------------ +-- Find begining of PL/SQL Block in a Trigger +function trigger_offset + (dbout_owner_in in varchar2 + ,dbout_name_in in varchar2 + ,dbout_type_in in varchar2) + return number +is +begin + if dbout_type_in != 'TRIGGER' + then + return 0; + end if; + for buff in ( + select line, text from dba_source + where owner = dbout_owner_in + and name = dbout_name_in + and type = 'TRIGGER' + order by line ) + loop + if regexp_instr(buff.text, + '(^declare$' || + '|^declare[[:space:]]' || + '|[[:space:]]declare$' || + '|[[:space:]]declare[[:space:]])', 1, 1, 0, 'i') <> 0 + OR + regexp_instr(buff.text, + '(^begin$' || + '|^begin[[:space:]]' || + '|[[:space:]]begin$' || + '|[[:space:]]begin[[:space:]])', 1, 1, 0, 'i') <> 0 + then + return buff.line - 1; + end if; + end loop; + return 0; +end trigger_offset; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_trigger_offset + is + begin + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Trigger Offset Happy Path'; + wt_assert.eq ( + msg_in => 'Trigger Test', + check_this_in => trigger_offset (dbout_owner_in => g_current_user + ,dbout_name_in => 'WT_SELF_TEST$TEST' + ,dbout_type_in => 'TRIGGER'), + against_this_in => 3); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq ( + msg_in => 'Package Test', + check_this_in => trigger_offset (dbout_owner_in => g_current_user + ,dbout_name_in => 'WT_PROFILER' + ,dbout_type_in => 'PACKAGE BODY'), + against_this_in => 0); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Trigger Offset Sad Path'; + wt_assert.eq ( + msg_in => 'Non Existent Object', + check_this_in => trigger_offset (dbout_owner_in => 'BOGUS456' + ,dbout_name_in => 'BOGUS123' + ,dbout_type_in => 'TRIGGER'), + against_this_in => 0); + end t_trigger_offset; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +------------------------------------------------------------ +function calc_pct_coverage + (in_test_run_id in number) + return number +IS +BEGIN + for buff in ( + select sum(case status when 'EXEC' then 1 else 0 end) HITS + ,sum(case status when 'NOTX' then 1 else 0 end) MISSES + from wt_dbout_profiles p + where test_run_id = in_test_run_id ) + loop + if buff.hits + buff.misses = 0 + then + return -1; + else + return round(100 * buff.hits / (buff.hits + buff.misses),2); + end if; + end loop; + return null; +END calc_pct_coverage; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_calc_pct_coverage + is + c_test_run_id constant number := -95; + l_rec wt_dbout_profiles%ROWTYPE; + begin + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Calculate Percent Coverage Setup'; + tl_insert_test_runs(c_test_run_id, 'Calculate Offset Test'); + l_rec.test_run_id := c_test_run_id; + l_rec.total_occur := 1; + l_rec.total_usecs := 1; + l_rec.min_usecs := 1; + l_rec.max_usecs := 1; + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Calculate Percent Coverage Happy Path 1'; + l_rec.line := 1; + l_rec.status := 'EXEC'; + l_rec.text := 'Testing ' || l_rec.line; + tl_insert_dbout_profiles(l_rec); + -------------------------------------- WTPLSQL Testing -- + l_rec.line := 2; + l_rec.status := 'NOTX'; + l_rec.text := 'Testing ' || l_rec.line; + tl_insert_dbout_profiles(l_rec); + -------------------------------------- WTPLSQL Testing -- + l_rec.line := 3; + l_rec.status := 'EXEC'; + l_rec.text := 'Testing ' || l_rec.line; + tl_insert_dbout_profiles(l_rec); + wt_assert.eq ( + msg_in => 'Main Test', + check_this_in => calc_pct_coverage(c_test_run_id), + against_this_in => 66.67); + tl_delete_dbout_profiles(c_test_run_id); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Calculate Percent Coverage Happy Path 2'; + l_rec.line := 1; + l_rec.status := 'EXCL'; + l_rec.text := 'Testing ' || l_rec.line; + tl_insert_dbout_profiles(l_rec); + -------------------------------------- WTPLSQL Testing -- + l_rec.line := 2; + l_rec.status := 'UNKN'; + l_rec.text := 'Testing ' || l_rec.line; + tl_insert_dbout_profiles(l_rec); + -------------------------------------- WTPLSQL Testing -- + l_rec.line := 3; + l_rec.status := 'EXCL'; + l_rec.text := 'Testing ' || l_rec.line; + tl_insert_dbout_profiles(l_rec); + wt_assert.eq ( + msg_in => 'Main Test', + check_this_in => calc_pct_coverage(c_test_run_id), + against_this_in => -1); + tl_delete_dbout_profiles(c_test_run_id); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Calculate Percent Coverage Sad Path'; + wt_assert.isnull ( + msg_in => 'Missing Test Run ID', + check_this_in => calc_pct_coverage(-99990)); + wt_assert.isnull ( + msg_in => 'NULL Test Run ID', + check_this_in => calc_pct_coverage(null)); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Calculate Percent Coverage Teardown'; + tl_delete_test_runs(c_test_run_id); + end t_calc_pct_coverage; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +------------------------------------------------------------ +procedure delete_records + (in_test_run_id in number) +is + l_profiler_runid number; +begin + select profiler_runid into l_profiler_runid + from wt_test_runs where id = in_test_run_id; + delete_plsql_profiler_recs(l_profiler_runid); + delete from wt_dbout_profiles + where test_run_id = in_test_run_id; +exception + when NO_DATA_FOUND + then + return; +end delete_records; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_delete_records + is + c_test_run_id constant number := -98; + l_rec wt_dbout_profiles%ROWTYPE; + l_err_stack varchar2(32000); + begin + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Delete Records Setup'; + wt_assert.eqqueryvalue ( + msg_in => 'wt_test_runs Count 0', + check_query_in => 'select count(*) from wt_test_runs' || + ' where id = ' || c_test_run_id, + against_value_in => 0); + wt_assert.eqqueryvalue ( + msg_in => 'wt_dbout_profiles Count 0', + check_query_in => 'select count(*) from wt_dbout_profiles' || + ' where test_run_id = ' || c_test_run_id, + against_value_in => 0); + tl_insert_test_runs(c_test_run_id, 'Delete Records Test'); + -------------------------------------- WTPLSQL Testing -- + l_rec.test_run_id := c_test_run_id; + l_rec.line := 1; + l_rec.status := 'EXEC'; + l_rec.total_occur := 1; + l_rec.total_usecs := 1; + l_rec.min_usecs := 1; + l_rec.max_usecs := 1; + l_rec.text := 'Testing'; + tl_insert_dbout_profiles(l_rec); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Delete Records Happy Path 1'; + begin + delete_records(c_test_run_id); + l_err_stack := dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace ; + exception when others then + l_err_stack := dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace ; + end; + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull ( + msg_in => 'SQLERRM', + check_this_in => l_err_stack); + wt_assert.eqqueryvalue ( + msg_in => 'wt_dbout_profiles Count 2', + check_query_in => 'select count(*) from wt_dbout_profiles' || + ' where test_run_id = ' || c_test_run_id, + against_value_in => 0); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Delete Records Sad Path 1'; + begin + delete_records(-9876); + l_err_stack := dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace ; + exception when others then + l_err_stack := dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace ; + end; + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull ( + msg_in => 'SQLERRM', + check_this_in => l_err_stack); + wt_assert.eqqueryvalue ( + msg_in => 'wt_dbout_profiles Count 2', + check_query_in => 'select count(*) from wt_dbout_profiles' || + ' where test_run_id = ' || c_test_run_id, + against_value_in => 0); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Delete Records Sad Path 2'; + begin + delete_records(NULL); + l_err_stack := dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace ; + exception when others then + l_err_stack := dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace ; + end; + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull ( + msg_in => 'SQLERRM', + check_this_in => l_err_stack); + wt_assert.eqqueryvalue ( + msg_in => 'wt_dbout_profiles Count 2', + check_query_in => 'select count(*) from wt_dbout_profiles' || + ' where test_run_id = ' || c_test_run_id, + against_value_in => 0); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Delete Records Teardown'; + tl_delete_test_runs(c_test_run_id); + end t_delete_records; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +--==============================================================-- +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_PROFILER:PACKAGE BODY" %-- + is + begin + select username into g_current_user from user_users; + t_get_error_msg; + t_delete_profiler_recs; + t_find_dbout; + t_load_ignr_aa; + t_insert_dbout_profile; + t_initialize; + t_finalize; + t_trigger_offset; + t_calc_pct_coverage; + t_delete_records; + end WTPLSQL_RUN; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- +--==============================================================-- + + +end wt_profile; diff --git a/src/persist/wt_profile.pks b/src/persist/wt_profile.pks new file mode 100644 index 0000000..c2aeb37 --- /dev/null +++ b/src/persist/wt_profile.pks @@ -0,0 +1,57 @@ +create or replace package wt_profile + authid definer +as + + TYPE rec_type is record + (test_run_id wt_test_runs.id%TYPE + ,dbout_owner wt_test_runs.dbout_owner%TYPE + ,dbout_name wt_test_runs.dbout_name%TYPE + ,dbout_type wt_test_runs.dbout_type%TYPE + ,prof_runid binary_integer + ,trigger_offset binary_integer + ,error_message varchar2(4000)); + g_rec rec_type; + + TYPE ignr_aa_type is table + of varchar2(1) + index by PLS_INTEGER; + g_ignr_aa ignr_aa_type; + + procedure initialize + (in_test_run_id in number, + in_runner_owner in varchar2, + in_runner_name in varchar2, + out_dbout_owner out varchar2, + out_dbout_name out varchar2, + out_dbout_type out varchar2, + out_trigger_offset out number, + out_profiler_runid out number, + out_error_message out varchar2); + + procedure finalize; + + function trigger_offset + (dbout_owner_in in varchar2 + ,dbout_name_in in varchar2 + ,dbout_type_in in varchar2) + return number; + + function calc_pct_coverage + (in_test_run_id in number) + return number; + + procedure delete_records + (in_test_run_id in number); + + -- WtPLSQL Self Test Procedures + -- + -- alter system set PLSQL_CCFLAGS = + -- 'WTPLSQL_SELFTEST:TRUE' + -- scope=BOTH; + -- + $IF $$WTPLSQL_SELFTEST + $THEN + procedure WTPLSQL_RUN; + $END + +end wt_profile; diff --git a/src/stats/wt_profiler_stats.tab b/src/persist/wt_profiler_stats.tab similarity index 100% rename from src/stats/wt_profiler_stats.tab rename to src/persist/wt_profiler_stats.tab diff --git a/src/stats/wt_profiler_stats_vw.vw b/src/persist/wt_profiler_stats_vw.vw similarity index 100% rename from src/stats/wt_profiler_stats_vw.vw rename to src/persist/wt_profiler_stats_vw.vw diff --git a/src/persist/wt_profiles.tab b/src/persist/wt_profiles.tab new file mode 100644 index 0000000..614f027 --- /dev/null +++ b/src/persist/wt_profiles.tab @@ -0,0 +1,32 @@ + +-- +-- DBOUT Profiles Table Installation +-- + +create table wt_profiles + (test_run_id number(38) constraint wt_profiles_nn1 not null + ,line number(6) constraint wt_profiles_nn2 not null + ,status varchar2(4) constraint wt_profiles_nn3 not null + ,total_occur number(9) constraint wt_profiles_nn4 not null + ,total_usecs number constraint wt_profiles_nn5 not null + ,min_usecs number constraint wt_profiles_nn6 not null + ,max_usecs number constraint wt_profiles_nn7 not null + ,text varchar2(4000) constraint wt_profiles_nn8 not null + ,constraint wt_profiles_pk primary key (test_run_id, line) + ,constraint wt_profiles_fk1 foreign key (test_run_id) + references wt_test_runs (id) + ,constraint wt_profiles_ck1 check (status in ('EXEC','NOTX','EXCL','IGNR','UNKN')) + ) pctfree 0; + +comment on table wt_profiles is 'PL/SQL Profiler data for Database Object Under Test (DBOUT).'; +comment on column wt_profiles.test_run_id is 'Foreign Key for the Test Run, Primary Key part 1.'; +comment on column wt_profiles.line is 'Source code line number, Primary Key part 2.'; +comment on column wt_profiles.status is 'Executed/NotExecuted/Excluded/Ignored/Unknown Status from the Profiler'; +comment on column wt_profiles.total_occur is 'Number of times this line was executed.'; +comment on column wt_profiles.total_usecs is 'Total time in microseconds spent executing this line.'; +comment on column wt_profiles.min_usecs is 'Minimum execution time in microseconds for this line.'; +comment on column wt_profiles.max_usecs is 'Maximum execution time in microseconds for this line.'; +comment on column wt_profiles.text is 'Source code text for this line number.'; + +grant select on wt_profiles to public; +grant delete on wt_profiles to public; diff --git a/src/persist/wt_profiles_vw.vw b/src/persist/wt_profiles_vw.vw new file mode 100644 index 0000000..ef86b9f --- /dev/null +++ b/src/persist/wt_profiles_vw.vw @@ -0,0 +1,51 @@ + +-- +-- DBOUT Profiles View Installation +-- + +create view wt_profiles_vw as +select db.dbout_id + ,db.dbout_owner + ,db.dbout_name + ,db.dbout_type + ,db.test_runner_id + ,db.test_runner_owner + ,db.test_runner_name + ,db.test_run_id + ,db.is_last_run + ,db.trigger_offset + ,db.profiler_runid + ,db.error_message + ,prof.line + ,prof.status + ,prof.total_occur + ,prof.total_usecs + ,prof.min_usecs + ,prof.max_usecs + ,prof.text + from wt_profiles prof + join wt_dbout_runs_vw db + on db.test_run_id = prof.test_run_id; + +comment on table wt_profiles_vw is 'PL/SQL Profiler data for Database Object Under Test (DBOUT).'; +comment on column wt_profiles_vw.dbout_id is 'Surrogate Key to the Database Object Under Test (DBOUT).'; +comment on column wt_profiles_vw.dbout_owner is 'Owner of the Database Object Under Test (DBOUT).'; +comment on column wt_profiles_vw.dbout_name is 'Name of the Database Object Under Test (DBOUT).'; +comment on column wt_profiles_vw.dbout_type is 'Type of the Database Object Under Test (DBOUT).'; +comment on column wt_profiles_vw.test_runner_id is 'Surrogate Key the Test Runner package.'; +comment on column wt_profiles_vw.test_runner_owner is 'Owner of the Test Runner package.'; +comment on column wt_profiles_vw.test_runner_name is 'Name of the Test Runner package.'; +comment on column wt_profiles_vw.test_run_id is 'Foreign Key for the Test Run.'; +comment on column wt_profiles_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; +comment on column wt_profiles_vw.trigger_offset is 'Calculated offset from start of Trigger Source to start of Trigger PL/SQL Block.'; +comment on column wt_profiles_vw.profiler_runid is 'DBMS_PROFILER unique run identifier from plsql_profiler_runnumber sequence'; +comment on column wt_profiles_vw.error_message is 'Optional Error messages from this Test Run.'; +comment on column wt_profiles_vw.line is 'Source code line number.'; +comment on column wt_profiles_vw.status is 'Executed/NotExecuted/Excluded/Ignored/Unknown Status from the Profiler'; +comment on column wt_profiles_vw.total_occur is 'Number of times this line was executed.'; +comment on column wt_profiles_vw.total_usecs is 'Total time in microseconds spent executing this line.'; +comment on column wt_profiles_vw.min_usecs is 'Minimum execution time in microseconds for this line.'; +comment on column wt_profiles_vw.max_usecs is 'Maximum execution time in microseconds for this line.'; +comment on column wt_profiles_vw.text is 'Source code text for this line number.'; + +grant select on wt_profiles_vw to public; diff --git a/src/persist/wt_result.pkb b/src/persist/wt_result.pkb new file mode 100644 index 0000000..9267b58 --- /dev/null +++ b/src/persist/wt_result.pkb @@ -0,0 +1,488 @@ +create or replace package body wt_result +as + +---------------------- +-- Private Procedures +---------------------- + +------------------------------------------------------------ +procedure adhoc_report + (in_assertion in varchar2 + ,in_status in varchar2 + ,in_details in varchar2 + ,in_testcase_name in varchar2 + ,in_message in varchar2) +is +begin + g_results_rec.testcase_name := in_testcase_name; + g_results_rec.message := in_message; + g_results_rec.status := in_status; + g_results_rec.assertion := in_assertion; + g_results_rec.details := in_details; +end adhoc_report; + + +--------------------- +-- Public Procedures +--------------------- + +------------------------------------------------------------ +procedure initialize + (in_test_run_id in wt_test_runs.id%TYPE) +is + l_results_recNULL wt_results_vw%ROWTYPE; +begin + if in_test_run_id is NULL + then + raise_application_error(-20009, '"in_test_run_id" cannot be NULL'); + end if; + g_results_rec := l_results_recNULL; + g_results_rec.test_run_id := in_test_run_id; + g_results_rec.result_seq := 0; + g_results_rec.executed_dtm := systimestamp; + g_results_nt := results_nt_type(null); +end initialize; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_initialize + is + l_results_recNULL wt_results_vw%ROWTYPE; + l_results_recSAVE wt_results_vw%ROWTYPE; + l_results_recTEST wt_results_vw%ROWTYPE; + l_results_ntSAVE results_nt_type; + l_results_ntTEST results_nt_type; + begin + -------------------------------------- WTPLSQL Testing -- + l_results_ntSAVE := g_results_nt; + l_results_recSAVE := g_results_rec; + g_results_rec := l_results_recNULL; + initialize(-99); + l_results_recTEST := g_results_rec; + g_results_rec := l_results_recSAVE; + l_results_ntTEST := g_results_nt; + g_results_nt := l_results_ntSAVE; + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase_name := 'Initialize Happy Path'; + wt_assert.eq ( + msg_in => 'l_results_recTEST.test_run_id', + check_this_in => l_results_recTEST.test_run_id, + against_this_in => -99); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq ( + msg_in => 'l_results_recTEST.result_seq', + check_this_in => l_results_recTEST.result_seq, + against_this_in => 0); + wt_assert.isnotnull ( + msg_in => 'l_results_recTEST.executed_dtm', + check_this_in => l_results_recTEST.executed_dtm); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull ( + msg_in => 'l_results_recTEST.interval_msecs', + check_this_in => l_results_recTEST.interval_msecs); + wt_assert.isnull ( + msg_in => 'l_results_recTEST.assertion', + check_this_in => l_results_recTEST.assertion); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull ( + msg_in => 'l_results_recTEST.status', + check_this_in => l_results_recTEST.status); + wt_assert.isnull ( + msg_in => 'l_results_recTEST.details', + check_this_in => l_results_recTEST.details); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull ( + msg_in => 'l_results_recTEST.testcase_id', + check_this_in => l_results_recTEST.testcase_id); + wt_assert.isnull ( + msg_in => 'l_results_recTEST.message', + check_this_in => l_results_recTEST.message); + wt_assert.eq ( + msg_in => 'l_results_ntTEST.COUNT', + check_this_in => l_results_ntTEST.COUNT, + against_this_in => 1); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull ( + msg_in => 'l_results_ntTEST(1).test_run_id', + check_this_in => l_results_ntTEST(1).test_run_id); + wt_assert.raises ( + msg_in => 'Raises ORA-20009', + check_call_in => 'begin wt_result.initialize(NULL); end;', + against_exc_in => 'ORA-20009: "in_test_run_id" cannot be NULL'); + end t_initialize; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +------------------------------------------------------------ +-- Because this procedure is called to cleanup after errors, +-- it must be able to run multiple times without causing damage. +procedure finalize +is + l_results_rec wt_results%ROWTYPE; +begin + if g_results_rec.test_run_id IS NULL + then + return; + end if; + -- There is always an extra NULL element in the g_results_nt array. + for i in 1 .. g_results_nt.COUNT - 1 + loop + l_results_rec.TEST_RUN_ID := g_results_nt(i).TEST_RUN_ID; + l_results_rec.RESULT_SEQ := g_results_nt(i).RESULT_SEQ; + l_results_rec.TESTCASE_ID := g_results_nt(i).TESTCASE_ID; + l_results_rec.EXECUTED_DTM := g_results_nt(i).EXECUTED_DTM; + l_results_rec.INTERVAL_MSECS := g_results_nt(i).INTERVAL_MSECS; + l_results_rec.ASSERTION := g_results_nt(i).ASSERTION; + l_results_rec.STATUS := g_results_nt(i).STATUS; + l_results_rec.MESSAGE := g_results_nt(i).MESSAGE; + l_results_rec.DETAILS := g_results_nt(i).DETAILS; + insert into wt_results values l_results_rec; + end loop; +end finalize; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_finalize + is + -------------------------------------- WTPLSQL Testing -- + type num_recs_aa_type is table of number index by varchar2(50); + num_recs_aa num_recs_aa_type; + l_test_runs_rec wt_test_runs%ROWTYPE; + l_results_recNULL wt_results_vw%ROWTYPE; + l_results_recSAVE wt_results_vw%ROWTYPE; + l_results_recTEST wt_results_vw%ROWTYPE; + l_results_ntSAVE results_nt_type; + l_results_ntTEST results_nt_type; + l_num_recs number; + begin + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase_name := ' '; + l_results_ntSAVE := g_results_nt; -- Capture Original Values + l_results_recSAVE := g_results_rec; -- Capture Original Values + -------------------------------------- WTPLSQL Testing -- + -- Can't Test in this block because g_results_rec has test data + g_results_rec := l_results_recNULL; + g_results_rec.test_run_id := -99; + g_results_rec.result_seq := 1; + g_results_rec.executed_dtm := systimestamp; + g_results_rec.interval_msecs := 99; + -------------------------------------- WTPLSQL Testing -- + g_results_rec.assertion := 'FINALTEST'; + g_results_rec.status := wt_assert.C_PASS; + g_results_rec.details := 'This is a WT_RESULT.FINALIZE Test'; + g_results_nt := results_nt_type(null); + g_results_nt(1) := g_results_rec; + g_results_nt.extend; -- Finalize expects that last element to be NULL + -------------------------------------- WTPLSQL Testing -- + -- Can't Test in this block because g_results_rec has test data + g_results_rec.test_run_id := NULL; + select count(*) + into num_recs_aa('Finalize Before NULL Test Record Count') + from wt_results + where test_run_id = -99; + finalize; + -------------------------------------- WTPLSQL Testing -- + select count(*) + into num_recs_aa('Finalize After NULL Test Record Count') + from wt_results + where test_run_id = -99; + rollback; -- UNDO all database changes + g_results_rec.test_run_id := -99; + -------------------------------------- WTPLSQL Testing -- + -- Can't Test in this block because g_results_rec has test data + l_test_runs_rec.id := -99; + l_test_runs_rec.start_dtm := systimestamp; + --l_test_runs_rec.runner_name := 'Finalize Test'; + --l_test_runs_rec.runner_owner := 'BOGUS'; + insert into wt_test_runs values l_test_runs_rec; + -------------------------------------- WTPLSQL Testing -- + finalize; -- g_results_nt is still loaded with one element + l_results_ntTEST := g_results_nt; + l_results_recTEST := g_results_rec; + select count(*) + into num_recs_aa('Finalize Record Count Test') + from wt_results + where test_run_id = -99; + delete from wt_results where test_run_id = -99; + delete from wt_test_runs where id = -99; + commit; -- UNDO all database changes + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase_name := 'Finalize Happy Path'; + -- Restore values so we can test + g_results_rec := l_results_recSAVE; + g_results_nt := l_results_ntSAVE; + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq ( + msg_in => 'Before NULL Test Record Count', + check_this_in => num_recs_aa('Finalize Before NULL Test Record Count'), + against_this_in => 0); + wt_assert.eq ( + msg_in => 'After NULL Test Record Count', + check_this_in => num_recs_aa('Finalize After NULL Test Record Count'), + against_this_in => 0); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull ( + msg_in => 'l_results_recTEST.test_run_id', + check_this_in => l_results_recTEST.test_run_id); + wt_assert.eq ( + msg_in => 'l_results_ntTEST.COUNT', + check_this_in => l_results_ntTEST.COUNT, + against_this_in => 1); + wt_assert.eq ( + msg_in => 'Record Count Test', + check_this_in => num_recs_aa('Finalize Record Count Test'), + against_this_in => 1); + end t_finalize; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +------------------------------------------------------------ +procedure save + (in_assertion in varchar2 + ,in_status in varchar2 + ,in_details in varchar2 + ,in_testcase_name in varchar2 + ,in_message in varchar2) +is + l_current_tstamp timestamp; +begin + if g_results_rec.test_run_id IS NULL + then + adhoc_report(in_assertion + ,in_status + ,in_details + ,in_testcase_name + ,in_message); + return; + end if; + -- Set the time and interval + l_current_tstamp := systimestamp; + g_results_rec.interval_msecs := extract(day from ( + l_current_tstamp - g_results_rec.executed_dtm + ) * 86400 * 1000); + g_results_rec.executed_dtm := l_current_tstamp; + -- Set the IN variables + g_results_rec.assertion := in_assertion; + g_results_rec.status := in_status; + g_results_rec.details := substr(in_details,1,4000); + g_results_rec.testcase_name := substr(in_testcase_name,1,128); + g_results_rec.message := substr(in_message,1,200); + -- Increment, Load, and Extend + g_results_rec.result_seq := g_results_rec.result_seq + 1; + g_results_nt(g_results_nt.COUNT) := g_results_rec; + g_results_nt.extend; + +end save; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_save_testing + is + -------------------------------------- WTPLSQL Testing -- + TYPE l_dbmsout_buff_type is table of varchar2(32767); + l_dbmsout_buff l_dbmsout_buff_type := l_dbmsout_buff_type(1); + l_test_run_id number; + l_dbmsout_line varchar2(32767); + l_dbmsout_stat number; + l_nt_count number; + begin + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase_name := 'Ad Hoc Save Happy Path Setup'; + dbms_output.enable; + -- Save/Clear the DBMS_OUPTUT Buffer + loop + DBMS_OUTPUT.GET_LINE ( + line => l_dbmsout_line, + status => l_dbmsout_stat); + exit when l_dbmsout_stat != 0; + l_dbmsout_buff(l_dbmsout_buff.COUNT) := l_dbmsout_line; + l_dbmsout_buff.extend; + end loop; + wt_assert.isnotnull ( + msg_in => 'l_dbmsout_buff.COUNT - 1', + check_this_in => l_dbmsout_buff.COUNT - 1); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase_name := 'Ad Hoc Save Testing Happy Path'; + l_test_run_id := g_results_rec.test_run_id; + g_results_rec.test_run_id := NULL; + wt_result.save ( + in_assertion => 'SELFTEST1', + in_status => wt_assert.C_PASS, + in_details => 't_save_testing Details', + in_testcase_name => wt_assert.g_testcase_name, + in_message => 't_save_testing Message'); + g_results_rec.test_run_id := l_test_run_id; + -------------------------------------- WTPLSQL Testing -- + DBMS_OUTPUT.GET_LINE ( + line => l_dbmsout_line, + status => l_dbmsout_stat); + wt_assert.eq ( + msg_in => 'DBMS_OUTPUT Status', + check_this_in => l_dbmsout_stat, + against_this_in => 0); + -------------------------------------- WTPLSQL Testing -- + if wt_assert.last_pass + then + wt_assert.isnotnull ( + msg_in => 'DBMS_OUTPUT Line', + check_this_in => l_dbmsout_line); + wt_assert.this ( + msg_in => 'Save Testing NULL Test DBMS_OUTPUT 3 Message', + check_this_in => (l_dbmsout_line like '%' || wt_assert.g_testcase_name || + '%t_save_testing %')); + -------------------------------------- WTPLSQL Testing -- + if not wt_assert.last_pass + then + -- No match, put the line back into DBMS_OUTPUT buffer and end this. + DBMS_OUTPUT.PUT_LINE(l_dbmsout_line); + end if; + end if; + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase_name := 'Ad Hoc Save Happy Path Teardown'; + -- Restore the DBMS_OUPTUT Buffer + for i in 1 .. l_dbmsout_buff.COUNT - 1 + loop + DBMS_OUTPUT.PUT_LINE(l_dbmsout_buff(i)); + end loop; + wt_assert.isnotnull ( + msg_in => 'l_dbmsout_buff.COUNT - 1', + check_this_in => l_dbmsout_buff.COUNT - 1); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase_name := 'Save Testing Happy Path'; + l_nt_count := g_results_nt.COUNT; + wt_result.save ( + in_assertion => 'SELFTEST2', + in_status => wt_assert.C_PASS, + in_details => 't_save_testing Testing Details', + in_testcase_name => wt_assert.g_testcase_name, + in_message => 't_save_testing Testing Message'); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq ( + msg_in => 'g_results_nt.COUNT', + check_this_in => g_results_nt.COUNT, + against_this_in => l_nt_count + 1); + if not wt_assert.last_pass + then + return; -- Something went wrong, end this now. + end if; + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq ( + msg_in => 'g_results_nt(' || l_nt_count || ').assetion', + check_this_in => g_results_nt(l_nt_count).assertion, + against_this_in => 'SELFTEST2'); + wt_assert.eq ( + msg_in => 'g_results_nt(' || l_nt_count || ').status', + check_this_in => g_results_nt(l_nt_count).status, + against_this_in => wt_assert.C_PASS); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq ( + msg_in => 'g_results_nt(' || l_nt_count || ').details', + check_this_in => g_results_nt(l_nt_count).details, + against_this_in => 't_save_testing Testing Details'); + wt_assert.eq ( + msg_in => 'g_results_nt(' || l_nt_count || ').testcase_name', + check_this_in => g_results_nt(l_nt_count).testcase_name, + against_this_in => wt_assert.g_testcase_name); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq ( + msg_in => 'g_results_nt(' || l_nt_count || ').message', + check_this_in => g_results_nt(l_nt_count).message, + against_this_in => 't_save_testing Testing Message'); + wt_assert.isnotnull ( + msg_in => 'g_results_nt(' || l_nt_count || ').interval_msecs', + check_this_in => g_results_nt(l_nt_count).interval_msecs); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnotnull ( + msg_in => 'g_results_nt(' || l_nt_count || ').executed_dtm', + check_this_in => g_results_nt(l_nt_count).executed_dtm); + wt_assert.isnotnull ( + msg_in => 'g_results_nt(' || l_nt_count || ').result_seq', + check_this_in => g_results_nt(l_nt_count).result_seq); + -- Can't Delete Test Element. g_results_nt.COUNT is not reduced + -- because nested tables are not dense. + --g_results_nt.delete(l_nt_count + 1); + end t_save_testing; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +------------------------------------------------------------ +procedure delete_records + (in_test_run_id in number) +is +begin + delete from wt_results + where test_run_id = in_test_run_id; +end delete_records; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_delete_records + is + -------------------------------------- WTPLSQL Testing -- + l_test_runs_rec wt_test_runs%ROWTYPE; + l_results_rec wt_results%ROWTYPE; + l_num_recs number; + begin + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase_name := 'Delete Records Happy Path'; + select count(*) into l_num_recs + from wt_results + where test_run_id = -99; + wt_assert.isnotnull ( + msg_in => 'Before Insert Count', + check_this_in => l_num_recs); + -------------------------------------- WTPLSQL Testing -- + l_test_runs_rec.id := -99; + l_test_runs_rec.start_dtm := sysdate; + l_test_runs_rec.runner_name := 'Delete Records Test'; + l_test_runs_rec.runner_owner := 'BOGUS'; + insert into wt_test_runs values l_test_runs_rec; + l_results_rec.test_run_id := -99; + -------------------------------------- WTPLSQL Testing -- + l_results_rec.result_seq := 1; + l_results_rec.executed_dtm := sysdate; + l_results_rec.interval_msecs := 99; + l_results_rec.assertion := 'DELRECTEST'; + l_results_rec.status := wt_assert.C_PASS; + l_results_rec.details := 'This is a WT_RESULT.DELETE_RECORDS Test'; + insert into wt_results values l_results_rec; + -------------------------------------- WTPLSQL Testing -- + wt_assert.eqqueryvalue ( + msg_in => 'After Insert Count', + check_query_in => 'select count(*) from wt_results' || + ' where test_run_id = -99', + against_value_in => l_num_recs + 1); + delete_records(-99); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eqqueryvalue ( + msg_in => 'After Test Count', + check_query_in => 'select count(*) from wt_results' || + ' where test_run_id = -99', + against_value_in => l_num_recs); + rollback; + wt_assert.eqqueryvalue ( + msg_in => 'After ROLLBACK Count', + check_query_in => 'select count(*) from wt_results' || + ' where test_run_id = -99', + against_value_in => l_num_recs); + end t_delete_records; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +--==============================================================-- +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_RESULT:PACKAGE BODY" %-- + is + begin + -------------------------------------- WTPLSQL Testing -- + t_initialize; + t_finalize; + t_save_testing; + t_delete_records; + end WTPLSQL_RUN; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- +--==============================================================-- + + +end wt_result; diff --git a/src/persist/wt_result.pks b/src/persist/wt_result.pks new file mode 100644 index 0000000..a611a02 --- /dev/null +++ b/src/persist/wt_result.pks @@ -0,0 +1,24 @@ +create or replace package wt_result + authid definer +as + + procedure initialize + (in_test_run_id in wt_test_runs.id%TYPE); + + procedure save_results; + + procedure delete_records + (in_test_run_id in number); + + -- WtPLSQL Self Test Procedures + -- + -- alter system set PLSQL_CCFLAGS = + -- 'WTPLSQL_SELFTEST:TRUE' + -- scope=BOTH; + -- + $IF $$WTPLSQL_SELFTEST + $THEN + procedure WTPLSQL_RUN; + $END + +end wt_result; diff --git a/src/persist/wt_results.tab b/src/persist/wt_results.tab new file mode 100644 index 0000000..d6757ae --- /dev/null +++ b/src/persist/wt_results.tab @@ -0,0 +1,39 @@ + +-- +-- Results Table Installation +-- + +create table wt_results + (test_run_id number(38) constraint wt_results_nn1 not null + ,result_seq number(8) constraint wt_results_nn2 not null + ,testcase_id number(38) constraint wt_results_nn3 not null + ,executed_dtm timestamp(6) constraint wt_results_nn4 not null + ,interval_msecs number(10,3) constraint wt_results_nn5 not null + ,assertion varchar2(15) constraint wt_results_nn6 not null + ,status varchar2(4) constraint wt_results_nn7 not null + ,message varchar2(200) + ,details varchar2(4000) + ,constraint wt_results_pk primary key (test_run_id, result_seq) + ,constraint wt_results_fk1 foreign key (test_run_id) + references wt_test_runs (id) + ,constraint wt_results_fk2 foreign key (testcase_id) + references wt_testcases (id) + ,constraint wt_results_ck1 check (status in ('PASS','FAIL')) + ) pctfree 0; + +create index wt_results_ix1 + on wt_results(testcase_id, test_run_id); + +comment on table wt_results is 'Results data from Test Runs.'; +comment on column wt_results.test_run_id is 'Foreign Key for the Test Run, Primary Key part 1.'; +comment on column wt_results.result_seq is 'Sequence number for this Result, Primary Key part 2.'; +comment on column wt_results.testcase_id is 'Foreign Key for the Test Case.'; +comment on column wt_results.executed_dtm is 'Date/Time (with Fractional Seconds) this Result was captured'; +comment on column wt_results.interval_msecs is 'Interval time in milliseonds since the previous Result or start ot the Test Run.'; +comment on column wt_results.assertion is 'Name of the Assertion Test performed'; +comment on column wt_results.status is 'PASS/FAIL Status from the Assertion'; +comment on column wt_results.details is 'Assertion Details, i.e. Expected Value and Actual Value'; +comment on column wt_results.message is 'Optional test identifier that helps connect an Assertion to the Test Runner.'; + +grant select on wt_results to public; +grant delete on wt_results to public; diff --git a/src/persist/wt_results_vw.vw b/src/persist/wt_results_vw.vw new file mode 100644 index 0000000..3db8447 --- /dev/null +++ b/src/persist/wt_results_vw.vw @@ -0,0 +1,49 @@ + +-- +-- Results View Installation +-- + +create view wt_results_vw as +select tr.test_runner_id + ,tr.test_runner_owner + ,tr.test_runner_name + ,res.test_run_id + ,tr.is_last_run + ,tr.start_dtm + ,tr.end_dtm + ,tr.error_message + ,res.result_seq + ,res.testcase_id + ,tc.name TESTCASE_NAME + ,res.executed_dtm + ,res.interval_msecs + ,res.assertion + ,res.status + ,res.message + ,res.details + from wt_results res + join wt_test_runs_vw tr + on tr.test_run_id = res.test_run_id + join wt_testcases tc + on tc.id = res.testcase_id; + +comment on table wt_results_vw is 'Results data from Test Runs.'; +comment on column wt_results_vw.test_runner_id is 'Surrogate Key the Test Runner package.'; +comment on column wt_results_vw.test_runner_owner is 'Owner of the Test Runner package.'; +comment on column wt_results_vw.test_runner_name is 'Name of the Test Runner package.'; +comment on column wt_results_vw.test_run_id is 'Foreign Key for the Test Run'; +comment on column wt_results_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; +comment on column wt_results_vw.start_dtm is 'Date/time (and fractional seconds) this Test Run started.'; +comment on column wt_results_vw.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; +comment on column wt_results_vw.error_message is 'Optional Error messages from this Test Run.'; +comment on column wt_results_vw.result_seq is 'Sequence number for this Result'; +comment on column wt_results_vw.testcase_id is 'Foreign Key for the Test Case.'; +comment on column wt_results_vw.testcase_name is 'The Test Case name'; +comment on column wt_results_vw.executed_dtm is 'Date/Time (with Fractional Seconds) this Result was captured'; +comment on column wt_results_vw.interval_msecs is 'Interval time in milliseonds since the previous Result or start ot the Test Run.'; +comment on column wt_results_vw.assertion is 'Name of the Assertion Test performed'; +comment on column wt_results_vw.status is 'PASS/FAIL Status from the Assertion'; +comment on column wt_results_vw.details is 'Assertion Details, i.e. Expected Value and Actual Value'; +comment on column wt_results_vw.message is 'Optional test identifier that helps connect an Assertion to the Test Runner.'; + +grant select on wt_results_vw to public; diff --git a/src/persist/wt_test_run.pkb b/src/persist/wt_test_run.pkb new file mode 100644 index 0000000..3e0a113 --- /dev/null +++ b/src/persist/wt_test_run.pkb @@ -0,0 +1,492 @@ +create or replace package body wt_testcase +as + + +------------------------------------------------------------ +-- Use the CLEAR_LAST_RUN procedure to clear the IS_LAST_RUN +-- flag before running this procedure. +procedure clear_last_run + (in_runner_owner in varchar2 + ,in_runner_name in varchar2 + ,in_last_run_flag in varchar2) +as +begin + update wt_test_runs + set is_last_run = NULL + where runner_owner = in_runner_owner + and runner_name = in_runner_name + and is_last_run = in_last_run_flag; +end clear_last_run; + + +------------------------------------------------------------ +-- Use the SET_LAST_RUN procedure to set the IS_LAST_RUN flag +-- after running this procedure. +procedure set_last_run + (in_runner_owner in varchar2 + ,in_runner_name in varchar2 + ,in_last_run_flag in varchar2) +as +begin + for buff in (select * from wt_test_runs + where runner_owner = in_runner_owner + and runner_name = in_runner_name + and is_last_run = in_last_run_flag ) + loop + -- Abort if a IS_LAST_RUN flag is already set + return; + end loop; + update wt_test_runs + set is_last_run = in_last_run_flag + where runner_owner = in_runner_owner + and runner_name = in_runner_name + and start_dtm = ( + select max(trn.start_dtm) + from wt_test_runs trn + where trn.runner_owner = in_runner_owner + and trn.runner_name = in_runner_name ); +end set_last_run; + + +--------------------- +-- Public Procedures +--------------------- + + +------------------------------------------------------------ +function get_last_run_flag + return varchar2 +is +begin + return IS_LAST_RUN_FLAG; +end get_last_run_flag; + +------------------------------------------------------------ +procedure insert_test_run + (in_test_runs_rec in wt_test_runs_vw%ROWTYPE) +is +begin + if core_data.g_run_rec.runner_name is null + then + return; + end if; + core_data.g_run_rec.id := wt_test_runs_seq.nextval; + clear_last_run + (in_runner_owner => g_test_runs_rec.runner_owner + ,in_runner_name => g_test_runs_rec.runner_name + ,in_last_run_flag => IS_LAST_RUN_FLAG); + insert into wt_test_runs values g_test_runs_rec; +end insert_test_run; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_insert_test_run + is + -------------------------------------- WTPLSQL Testing -- + TYPE l_dbmsout_buff_type is table of varchar2(32767); + l_dbmsout_buff l_dbmsout_buff_type; + l_test_runs_rec wt_test_runs%ROWTYPE; + l_dbmsout_line varchar2(32767); + l_dbmsout_stat number; + l_num_recs number; + begin + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'INSERT_TEST_RUN Happy Path 1'; + wt_assert.eqqueryvalue ( + msg_in => 'Records Before Insert', + check_query_in => 'select count(*) from wt_test_runs' || + ' where id = ' || g_test_runs_rec.id, + against_value_in => 0); + -------------------------------------- WTPLSQL Testing -- + l_test_runs_rec := g_test_runs_rec; + insert_test_run; + g_test_runs_rec := l_test_runs_rec; + wt_assert.eqqueryvalue ( + msg_in => 'Number of Records', + check_query_in => 'select count(*) from wt_test_runs' || + ' where id = ' || g_test_runs_rec.id, + against_value_in => 1); + -------------------------------------- WTPLSQL Testing -- + delete from wt_test_runs + where id = l_test_runs_rec.id; + COMMIT; + wt_assert.eqqueryvalue ( + msg_in => 'Records After Delete', + check_query_in => 'select count(*) from wt_test_runs' || + ' where id = ' || g_test_runs_rec.id, + against_value_in => 0); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'INSERT_TEST_RUN Happy Path 2'; + l_test_runs_rec := g_test_runs_rec; + g_test_runs_rec.id := null; + insert_test_run; + g_test_runs_rec := l_test_runs_rec; + wt_assert.eqqueryvalue ( + msg_in => 'Records After Delete', + check_query_in => 'select count(*) from wt_test_runs' || + ' where id = ' || g_test_runs_rec.id, + against_value_in => 0); + end t_insert_test_run; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + +------------------------------------------------------------ +procedure delete_run + (in_test_run_id in number) +is + r_owner varchar2(200); + r_name varchar2(200); +begin + hook.before_delete_runs; + wt_test_run_stat.delete_records(in_test_run_id); + wt_profiler.delete_records(in_test_run_id); + wt_result.delete_records(in_test_run_id); + wt_test_run.delete_records(in_test_run_id); + hook.after_delete_runs; +end delete_run; + +procedure delete_runner + (in_test_runner_id in number + ,in_keep_records in number default null) +is +begin + for buff in (select id from wt_test_runs + where test_runner_id = in_test_runner_id + order by start_dtm desc, id desc) + loop + -- Keep the last test runs for this Test Runner + if num_recs > nvl(in_keep_records, g_keep_num_recs) + then + -- Autonomous Transaction COMMIT + delete_runs(buff.id); + end if; + end loop; + if in_keep_records = 0 + then + surrogate_key.delete_records(in_test_runner_id); + end if; +end delete_runner; + +procedure delete_runner + (in_runner_owner in varchar2 + ,in_runner_name in varchar2 + ,in_keep_records in number default null) +is + l_id number; +begin + select id into l_id + from wt_test_runners + where owner = in_runner_owner + and name = in_runner_name; + delete_runner(l_id, in_keep_records); +exception + when no_data_found then + null; -- Nothing to delete. Return silently. +end delete_runner; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_delete_run_id + is + l_num_recs number; + l_err_stack varchar2(32000); + begin + -------------------------------------- WTPLSQL Testing -- + -- DELETE_RECORDS has already run when we arrive here. + -- Cleanup from previous test + delete from wt_test_runs + where id between 0-g_keep_num_recs and 0-1; + commit; + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'DELETE_RUNS Happy Path 1'; + select count(*) + into l_num_recs + from wt_test_runs + where runner_owner = core_data.g_run_rec.runner_owner + and runner_name = core_data.g_run_rec.runner_name; + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnotnull ( + msg_in => 'Number of Records Before Insert', + check_this_in => l_num_recs); + wt_assert.this ( + msg_in => 'Number of Records Before Insert <= ' || g_keep_num_recs, + check_this_in => l_num_recs <= g_keep_num_recs); + -------------------------------------- WTPLSQL Testing -- + insert into wt_test_runs values core_data.g_run_rec; + COMMIT; + wt_assert.eqqueryvalue ( + msg_in => 'Number of Records After Insert', + check_query_in => 'select count(*) from wt_test_runs' || + ' where id = ' || core_data.g_run_rec.id, + against_value_in => 1); + delete_runs(core_data.g_run_rec.id); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eqqueryvalue ( + msg_in => 'Number of Records After Delete', + check_query_in => 'select count(*) from wt_test_runs' || + ' where id = ' || core_data.g_run_rec.id, + against_value_in => 0); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'DELETE_RUNS Happy Path 2'; + wt_assert.eqqueryvalue ( + msg_in => 'Confirm number of records', + check_query_in => 'select count(*) from wt_test_runs' || + ' where runner_owner = ''' || core_data.g_run_rec.runner_owner || + ''' and runner_name = ''' || core_data.g_run_rec.runner_name || + '''', + against_value_in => l_num_recs); + -------------------------------------- WTPLSQL Testing -- + for i in 1 .. g_keep_num_recs + loop + insert into wt_test_runs + (id, start_dtm, runner_owner, runner_name) + values + (0-i, sysdate-7000-i, core_data.g_run_rec.runner_owner, core_data.g_run_rec.runner_name); + end loop; + commit; + -------------------------------------- WTPLSQL Testing -- + wt_assert.eqqueryvalue ( + msg_in => 'Check Added ' || g_keep_num_recs || ' records', + check_query_in => 'select count(*) from wt_test_runs' || + ' where runner_owner = ''' || core_data.g_run_rec.runner_owner || + ''' and runner_name = ''' || core_data.g_run_rec.runner_name || + '''', + against_value_in => l_num_recs + g_keep_num_recs); + delete_runs(core_data.g_run_rec.runner_owner, core_data.g_run_rec.runner_name); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eqqueryvalue ( + msg_in => 'Check number of records reduced', + check_query_in => 'select count(*) from wt_test_runs' || + ' where runner_owner = ''' || core_data.g_run_rec.runner_owner || + ''' and runner_name = ''' || core_data.g_run_rec.runner_name || + '''', + against_value_in => g_keep_num_recs); + delete from wt_test_runs + where id between 0-g_keep_num_recs and 0-1; + commit; + -------------------------------------- WTPLSQL Testing -- + wt_assert.eqqueryvalue ( + msg_in => 'Confirm original number of records', + check_query_in => 'select count(*) from wt_test_runs' || + ' where runner_owner = ''' || core_data.g_run_rec.runner_owner || + ''' and runner_name = ''' || core_data.g_run_rec.runner_name || + '''', + against_value_in => l_num_recs); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'DELETE_RUNS Sad Path 1'; + begin + delete_runs(-9995); -- Should run without error + l_err_stack := dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace ; + exception when others then + l_err_stack := dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace ; + end; + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull ( + msg_in => 'Delete Runs(-9995)', + check_this_in => l_err_stack); + end t_delete_run_id; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +------------------------------------------------------------ +procedure delete_runs + (in_test_run_id in number) +is + r_owner varchar2(200); + r_name varchar2(200); +begin + wt_hook.before_delete_runs; + wt_test_run_stat.delete_records(in_test_run_id); + wt_profiler.delete_records(in_test_run_id); + wt_result.delete_records(in_test_run_id); + begin + -- + select runner_owner, runner_name + into r_owner, r_name + from wt_test_runs + where id = in_test_run_id; + -- + delete from wt_test_runs + where id = in_test_run_id; + -- + set_last_run(in_runner_owner => r_owner + ,in_runner_name => r_name + ,in_last_run_flag => IS_LAST_RUN_FLAG); + -- + exception when NO_DATA_FOUND + then + null; -- Ignore Error + end; + wt_hook.after_delete_runs; +end delete_runs; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_delete_run_id + is + l_num_recs number; + l_err_stack varchar2(32000); + begin + -------------------------------------- WTPLSQL Testing -- + -- DELETE_RECORDS has already run when we arrive here. + -- Cleanup from previous test + delete from wt_test_runs + where id between 0-g_keep_num_recs and 0-1; + commit; + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'DELETE_RUNS Happy Path 1'; + select count(*) + into l_num_recs + from wt_test_runs + where runner_owner = g_test_runs_rec.runner_owner + and runner_name = g_test_runs_rec.runner_name; + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnotnull ( + msg_in => 'Number of Records Before Insert', + check_this_in => l_num_recs); + wt_assert.this ( + msg_in => 'Number of Records Before Insert <= ' || g_keep_num_recs, + check_this_in => l_num_recs <= g_keep_num_recs); + -------------------------------------- WTPLSQL Testing -- + insert into wt_test_runs values g_test_runs_rec; + COMMIT; + wt_assert.eqqueryvalue ( + msg_in => 'Number of Records After Insert', + check_query_in => 'select count(*) from wt_test_runs' || + ' where id = ' || g_test_runs_rec.id, + against_value_in => 1); + delete_runs(g_test_runs_rec.id); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eqqueryvalue ( + msg_in => 'Number of Records After Delete', + check_query_in => 'select count(*) from wt_test_runs' || + ' where id = ' || g_test_runs_rec.id, + against_value_in => 0); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'DELETE_RUNS Happy Path 2'; + wt_assert.eqqueryvalue ( + msg_in => 'Confirm number of records', + check_query_in => 'select count(*) from wt_test_runs' || + ' where runner_owner = ''' || g_test_runs_rec.runner_owner || + ''' and runner_name = ''' || g_test_runs_rec.runner_name || + '''', + against_value_in => l_num_recs); + -------------------------------------- WTPLSQL Testing -- + for i in 1 .. g_keep_num_recs + loop + insert into wt_test_runs + (id, start_dtm, runner_owner, runner_name) + values + (0-i, sysdate-7000-i, g_test_runs_rec.runner_owner, g_test_runs_rec.runner_name); + end loop; + commit; + -------------------------------------- WTPLSQL Testing -- + wt_assert.eqqueryvalue ( + msg_in => 'Check Added ' || g_keep_num_recs || ' records', + check_query_in => 'select count(*) from wt_test_runs' || + ' where runner_owner = ''' || g_test_runs_rec.runner_owner || + ''' and runner_name = ''' || g_test_runs_rec.runner_name || + '''', + against_value_in => l_num_recs + g_keep_num_recs); + delete_runs(g_test_runs_rec.runner_owner, g_test_runs_rec.runner_name); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eqqueryvalue ( + msg_in => 'Check number of records reduced', + check_query_in => 'select count(*) from wt_test_runs' || + ' where runner_owner = ''' || g_test_runs_rec.runner_owner || + ''' and runner_name = ''' || g_test_runs_rec.runner_name || + '''', + against_value_in => g_keep_num_recs); + delete from wt_test_runs + where id between 0-g_keep_num_recs and 0-1; + commit; + -------------------------------------- WTPLSQL Testing -- + wt_assert.eqqueryvalue ( + msg_in => 'Confirm original number of records', + check_query_in => 'select count(*) from wt_test_runs' || + ' where runner_owner = ''' || g_test_runs_rec.runner_owner || + ''' and runner_name = ''' || g_test_runs_rec.runner_name || + '''', + against_value_in => l_num_recs); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'DELETE_RUNS Sad Path 1'; + begin + delete_runs(-9995); -- Should run without error + l_err_stack := dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace ; + exception when others then + l_err_stack := dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace ; + end; + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull ( + msg_in => 'Delete Runs(-9995)', + check_this_in => l_err_stack); + end t_delete_run_id; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + +--==============================================================-- +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_test_runs_rec_and_table + is + begin + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'TEST_RUNS_REC_AND_TABLE Happy Path'; + -- This Test Case runs in the EXECUTE IMMEDAITE in the TEST_RUN + -- procedure in this package. + wt_assert.isnotnull + (msg_in => 'g_test_runs_rec.id' + ,check_this_in => g_test_runs_rec.id); + wt_assert.isnotnull + (msg_in => 'g_test_runs_rec.start_dtm' + ,check_this_in => g_test_runs_rec.start_dtm); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnotnull + (msg_in => 'g_test_runs_rec.runner_owner' + ,check_this_in => g_test_runs_rec.runner_owner); + wt_assert.eq + (msg_in => 'g_test_runs_rec.runner_name' + ,check_this_in => g_test_runs_rec.runner_name + ,against_this_in => 'WTPLSQL'); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull + (msg_in => 'g_test_runs_rec.dbout_owner' + ,check_this_in => g_test_runs_rec.dbout_owner); + wt_assert.isnull + (msg_in => 'g_test_runs_rec.dbout_name' + ,check_this_in => g_test_runs_rec.dbout_name); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull + (msg_in => 'g_test_runs_rec.dbout_type' + ,check_this_in => g_test_runs_rec.dbout_type); + wt_assert.isnull + (msg_in => 'g_test_runs_rec.profiler_runid' + ,check_this_in => g_test_runs_rec.profiler_runid); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull + (msg_in => 'g_test_runs_rec.end_dtm' + ,check_this_in => g_test_runs_rec.end_dtm); + wt_assert.isnull + (msg_in => 'g_test_runs_rec.error_message' + ,check_this_in => g_test_runs_rec.error_message); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eqqueryvalue + (msg_in => 'TEST_RUNS Record for this TEST_RUN' + ,check_query_in => 'select count(*) from WT_TEST_RUNS' || + ' where id = ''' || g_test_runs_rec.id || '''' + ,against_value_in => 0); + end t_test_runs_rec_and_table; + + procedure WTPLSQL_RUN + is + begin + -------------------------------------- WTPLSQL Testing -- + t_insert_test_run; + end; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- +--==============================================================-- + + +end wt_testcase; diff --git a/src/persist/wt_test_run.pks b/src/persist/wt_test_run.pks new file mode 100644 index 0000000..077770b --- /dev/null +++ b/src/persist/wt_test_run.pks @@ -0,0 +1,29 @@ +create or replace package wt_test_run + authid definer +as + + IS_LAST_RUN_FLAG constant varchar2(1) := 'Y'; + + function get_last_run_flag + return varchar2 deterministic; + + g_test_runs_rec wt_test_runs_vw%ROWTYPE; + + procedure insert_test_run + (in_test_runs_rec in wt_test_runs_vw%ROWTYPE); + + procedure delete_runs + (in_test_run_id in number); + + -- WtPLSQL Self Test Procedures + -- + -- alter system set PLSQL_CCFLAGS = + -- 'WTPLSQL_SELFTEST:TRUE' + -- scope=BOTH; + -- + $IF $$WTPLSQL_SELFTEST + $THEN + procedure WTPLSQL_RUN; + $END + +end wt_testcase; diff --git a/src/stats/wt_test_run_stat.pkb b/src/persist/wt_test_run_stat.pkb similarity index 100% rename from src/stats/wt_test_run_stat.pkb rename to src/persist/wt_test_run_stat.pkb diff --git a/src/stats/wt_test_run_stat.pks b/src/persist/wt_test_run_stat.pks similarity index 100% rename from src/stats/wt_test_run_stat.pks rename to src/persist/wt_test_run_stat.pks diff --git a/src/stats/wt_test_run_stats.tab b/src/persist/wt_test_run_stats.tab similarity index 100% rename from src/stats/wt_test_run_stats.tab rename to src/persist/wt_test_run_stats.tab diff --git a/src/stats/wt_test_run_stats_vw.vw b/src/persist/wt_test_run_stats_vw.vw similarity index 100% rename from src/stats/wt_test_run_stats_vw.vw rename to src/persist/wt_test_run_stats_vw.vw diff --git a/src/persist/wt_test_runner.pkb b/src/persist/wt_test_runner.pkb new file mode 100644 index 0000000..eb6bae9 --- /dev/null +++ b/src/persist/wt_test_runner.pkb @@ -0,0 +1,137 @@ +create or replace package body wt_test_runner + authid definer +as + + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + C_OWNER CONSTANT varchar2(50) := 'WT_TEST_RUNNER_OWNER_FOR_TESTING_1234ABCD'; + C_NAME CONSTANT varchar2(50) := 'WT_TEST_RUNNER_NAME_FOR_TESTING_1234ABCD'; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +--------------------- +-- Public Procedures +--------------------- + + +------------------------------------------------------------ +function get_id + (in_owner in varchar2 + ,in_name in varchar2) + return number +is + l_id number; +begin + select id into l_id + from wt_test_runners + where owner = in_owner + and name = in_name; + return l_id; +exception when NO_DATA_FOUND then + return null; +end get_id; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_get_id + is + l_id number; + begin + wt_assert.g_testcase := 't_get_id Happy Path 1'; + -------------------------------------- WTPLSQL Testing -- + delete from wt_test_runners + where owner = C_OWNER + and name = C_NAME; + wt_assert.isnull + (msg_in => 'Check for Null return' + ,check_this_in => get_id(C_OWNER, C_NAME)); + -------------------------------------- WTPLSQL Testing -- + insert into wt_test_runners (id, owner, name) + values (wt_test_runners_seq.nextval, C_OWNER, C_NAME) + returning id into l_id; + wt_assert.eq + (msg_in => 'Check for Not Null return' + ,check_this_in => get_id(C_OWNER, C_NAME) + ,against_this_in => l_id); + delete from wt_test_runners + where id = l_id; + end t_get_id; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +------------------------------------------------------------ +function load_dim + (in_owner in varchar2 + ,in_name in varchar2) + return number +is + pragma AUTONOMOUS_TRANSACTION; + rec wt_test_runners%ROWTYPE; +begin + rec.id := get_id (in_owner, in_name); + if rec.id is null + then + rec.id := wt_test_runners_seq.nextval; + rec.owner := in_owner; + rec.name := in_name; + insert into wt_dbouts values rec; + end if; + return rec.id; +end load_dim; + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_dim_id + is + l_id number; + begin + wt_assert.g_testcase := 't_get_id Happy Path 1'; + -------------------------------------- WTPLSQL Testing -- + delete from wt_test_runners + where owner = C_OWNER + and name = C_NAME; + wt_assert.isnull + (msg_in => 'Check for Null return' + ,check_this_in => get_id(C_OWNER, C_NAME)); + -------------------------------------- WTPLSQL Testing -- + insert into wt_test_runners (id, owner, name) + values (wt_test_runners_seq.nextval, C_OWNER, C_NAME) + returning id into l_id; + wt_assert.eq + (msg_in => 'Check for Not Null return' + ,check_this_in => get_id(C_OWNER, C_NAME) + ,against_this_in => l_id); + delete from wt_test_runners + where id = l_id; + end t_dim_id; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +------------------------------------------------------------ +procedure delete_records + (in_test_runner_id in number) +is +begin + delete from wt_test_runners + where id = in_test_runner_id; +end delete_records; + + + +--==============================================================-- +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_TEST_RUNNER:PACKAGE BODY" %-- + is + begin + -------------------------------------- WTPLSQL Testing -- + t_get_id; + t_dim_id; + delete_records; + end; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- +--==============================================================-- + + +end wt_test_runner; diff --git a/src/persist/wt_test_runner.pks b/src/persist/wt_test_runner.pks new file mode 100644 index 0000000..a4717a7 --- /dev/null +++ b/src/persist/wt_test_runner.pks @@ -0,0 +1,29 @@ +create or replace package wt_test_runner + authid definer +as + + function get_id + (in_owner in varchar2 + ,in_name in varchar2) + return number; + + function load_dim + (in_owner in varchar2 + ,in_name in varchar2) + return number; + + procedure delete_records + (in_id in number); + + -- WtPLSQL Self Test Procedures + -- + -- alter system set PLSQL_CCFLAGS = + -- 'WTPLSQL_SELFTEST:TRUE' + -- scope=BOTH; + -- + $IF $$WTPLSQL_SELFTEST + $THEN + procedure WTPLSQL_RUN; + $END + +end wt_test_runner; diff --git a/src/persist/wt_test_runners.tab b/src/persist/wt_test_runners.tab new file mode 100644 index 0000000..bbd4b37 --- /dev/null +++ b/src/persist/wt_test_runners.tab @@ -0,0 +1,22 @@ + +-- +-- Test Runs Statistics Table Installation +-- + +create sequence wt_test_runners_seq order; + +create table wt_test_runners + (id number(38) constraint wt_test_runners_nn1 not null + ,owner varchar2(128) constraint wt_test_runners_nn2 not null + ,name varchar2(128) constraint wt_test_runners_nn3 not null + ,constraint wt_test_runners_pk primary key (id) + ,constraint wt_test_runners_nk1 unique (owner, name) + ) pctfree 0; + +comment on table wt_test_runners is 'List of Test Runners.'; +comment on column wt_test_runners.id is 'Primary (Surrogate) Key for each Test Runner'; +comment on column wt_test_runners.owner is 'Owner of the Test Runner package. Natural Key 1 part 1'; +comment on column wt_test_runners.name is 'Name of the Test Runner package. Natural Key 1 part 2'; + +grant select on wt_test_runners to public; +grant delete on wt_test_runners to public; diff --git a/src/persist/wt_test_runs.tab b/src/persist/wt_test_runs.tab new file mode 100644 index 0000000..e00ee90 --- /dev/null +++ b/src/persist/wt_test_runs.tab @@ -0,0 +1,51 @@ + +-- +-- Test Runs Table Installation +-- + +create sequence wt_test_runs_seq order; + +grant select on wt_test_runs_seq to public; + +create table wt_test_runs + (id number(38) constraint wt_test_runs_nn1 not null + ,test_runner_id number(38) constraint wt_test_runs_nn2 not null + ,start_dtm timestamp constraint wt_test_runs_nn3 not null + ,end_dtm timestamp + ,dbout_id number(38) + ,trigger_offset number(6) + ,profiler_runid number + ,is_last_run varchar2(1) + ,error_message varchar2(4000) + ,constraint wt_test_runs_pk primary key (id) + ,constraint wt_test_runs_nk1 unique (test_runner_id, start_dtm) + ,constraint wt_test_runs_fk1 foreign key (test_runner_id) + references wt_test_runners (id) + ,constraint wt_test_runs_fk2 foreign key (dbout_id) + references wt_dbouts (id) + ,constraint wt_test_runs_fk3 foreign key (profiler_runid) + references plsql_profiler_runs (runid) disable + ,constraint wt_test_runs_ck1 check (trigger_offset >= 0) + ,constraint wt_test_runs_ck2 check (is_last_run = 'Y') + ) pctfree 0; + +create index wt_test_runs_ix1 + on wt_test_runs(is_last_run, test_runner_id); + +create index wt_test_runs_ix2 + on wt_test_runs(dbout_id, test_runner_id); + +comment on table wt_test_runs is 'Test Run data for each execution of a Test Runner.'; +comment on column wt_test_runs.id is 'Primary (Surrogate) Key for each Test Run'; +comment on column wt_test_runs.test_runner_id is 'Surrogate Key the Test Runner package. Natural Key 1 part 1'; +comment on column wt_test_runs.start_dtm is 'Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 2'; +comment on column wt_test_runs.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; +comment on column wt_test_runs.dbout_id is 'Optional Surrogate Key to the Database Object Under Test (DBOUT).'; +comment on column wt_test_runs.trigger_offset is 'Optional calculated offset from start of Trigger Source to start of Trigger PL/SQL Block.'; +comment on column wt_test_runs.profiler_runid is 'Optional DBMS_PROFILER unique run identifier from plsql_profiler_runnumber sequence'; +comment on column wt_test_runs.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; +comment on column wt_test_runs.error_message is 'Optional Error messages from this Test Run.'; + +grant select on wt_test_runs to public; +grant insert on wt_test_runs to public; +grant delete on wt_test_runs to public; diff --git a/src/persist/wt_test_runs_vw.vw b/src/persist/wt_test_runs_vw.vw new file mode 100644 index 0000000..2a446bd --- /dev/null +++ b/src/persist/wt_test_runs_vw.vw @@ -0,0 +1,29 @@ + +-- +-- Test Runs Table View Installation +-- + +create view wt_test_runs_vw as +select tr.id TEST_RUN_ID + ,tr.test_runner_id + ,tnr.owner TEST_RUNNER_OWNER + ,tnr.name TEST_RUNNER_NAME + ,tr.is_last_run + ,tr.start_dtm + ,tr.end_dtm + ,tr.error_message + from wt_test_runs tr + join wt_test_runners tnr + on tnr.id = tr.test_runner_id; + +comment on table wt_test_runs_vw is 'Test Run data for each execution of a Test Runner.'; +comment on column wt_test_runs_vw.test_run_id is 'Primary (Surrogate) Key for each Test Run'; +comment on column wt_test_runs_vw.test_runner_id is 'Surrogate Key the Test Runner package.'; +comment on column wt_test_runs_vw.test_runner_owner is 'Owner of the Test Runner package.'; +comment on column wt_test_runs_vw.test_runner_name is 'Name of the Test Runner package.'; +comment on column wt_test_runs_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; +comment on column wt_test_runs_vw.start_dtm is 'Date/time (and fractional seconds) this Test Run started.'; +comment on column wt_test_runs_vw.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; +comment on column wt_test_runs_vw.error_message is 'Optional Error messages from this Test Run.'; + +grant select on wt_test_runs_vw to public; diff --git a/src/persist/wt_testcase.pkb b/src/persist/wt_testcase.pkb new file mode 100644 index 0000000..cef2232 --- /dev/null +++ b/src/persist/wt_testcase.pkb @@ -0,0 +1,109 @@ +create or replace package body wt_testcase + authid definer +as + + +--------------------- +-- Public Procedures +--------------------- + + +------------------------------------------------------------ +function get_id + (in_name in varchar2) + return number +is + l_id number; +begin + select id into rec.id from wt_testcases + where name = in_name; + return rec.id; +exception + when NO_DATA_FOUND + then + return null; +end get_id; + + +------------------------------------------------------------ +function dim_id + (in_name in varchar2) + return number +is + rec wt_testcases%ROWTYPE; +begin + rec.id := get_id (in_name); + if rec.id is null + then + rec.id := wt_testcases_seq.nextval; + rec.name := in_name; + insert into wt_testcases values rec; + end if; + return rec.id; +end dim_id; + + +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_get_id + is + begin + -------------------------------------- WTPLSQL Testing -- + null; + end t_get_id; + procedure t_insert_test_runner + is + C_OWNER CONSTANT varchar2(50) := 'WT_TEST_RUNNER_OWNER_FOR_TESTING'; + C_NAME CONSTANT varchar2(50) := 'WT_TEST_RUNNER_NAME_FOR_TESTING'; + l_id number; + num_recs number; + begin + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'INSERT_TEST_RUNNER Happy Path 1'; + delete from wt_test_runners + where owner = C_OWNER + and name = C_NAME; + wt_assert.eqqueryvalue + (msg_in => 'Number of Starting Records' + ,check_query_in => 'select count(name) from wt_test_runners' || + ' where owner = ' || C_OWNER || + ' and name = ' || C_NAME + ,against_value_in => 0); + end t_insert_test_runner; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- + + +------------------------------------------------------------ +procedure delete_records + (in_test_runner_id in number) +is +begin + with q1 as ( + select id + from wt_testcases + MINUS + select testcase_id ID + from wt_results + group by testcase_id + ) + delete from wt_testcases + where id in (select id from q1); +end delete_records; + + +--==============================================================-- +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_TEST_RUNNER:PACKAGE BODY" %-- + is + begin + -------------------------------------- WTPLSQL Testing -- + t_get_id; + t_dim_id; + t_delete_records; + end; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- +--==============================================================-- + + +end wt_testcase; diff --git a/src/persist/wt_testcase.pks b/src/persist/wt_testcase.pks new file mode 100644 index 0000000..54c3f9e --- /dev/null +++ b/src/persist/wt_testcase.pks @@ -0,0 +1,26 @@ +create or replace package wt_testcase + authid definer +as + + function get_id + (in_testcase in varchar2) + return number; + + function load_dim + (in_testcase in varchar2) + return number; + + procedure delete_records; + + -- WtPLSQL Self Test Procedures + -- + -- alter system set PLSQL_CCFLAGS = + -- 'WTPLSQL_SELFTEST:TRUE' + -- scope=BOTH; + -- + $IF $$WTPLSQL_SELFTEST + $THEN + procedure WTPLSQL_RUN; + $END + +end wt_testcase; diff --git a/src/stats/wt_testcase_stats.tab b/src/persist/wt_testcase_stats.tab similarity index 100% rename from src/stats/wt_testcase_stats.tab rename to src/persist/wt_testcase_stats.tab diff --git a/src/stats/wt_testcase_stats_vw.vw b/src/persist/wt_testcase_stats_vw.vw similarity index 100% rename from src/stats/wt_testcase_stats_vw.vw rename to src/persist/wt_testcase_stats_vw.vw diff --git a/src/persist/wt_testcases.tab b/src/persist/wt_testcases.tab new file mode 100644 index 0000000..042fbd5 --- /dev/null +++ b/src/persist/wt_testcases.tab @@ -0,0 +1,20 @@ + +-- +-- Test Cases Table Installation +-- + +create sequence wt_testcases_seq; + +create table wt_testcases + (id number(38) constraint wt_testcases_nn1 not null + ,name varchar2(128) constraint wt_testcases_nn2 not null + ,constraint wt_testcases_pk primary key (id) + ,constraint wt_testcases_nk1 unique (name) + ); + +comment on table wt_testcases is 'Test Cases Used by Test Runners.'; +comment on column wt_testcases.id is 'Primary (Surrogate) Key for each Test Case'; +comment on column wt_testcases.name is 'Natural Key. The Test Case name'; + +grant select on wt_testcases to public; +grant delete on wt_testcases to public; diff --git a/src/stats/wt_text_report.pkb b/src/persist/wt_text_report.pkb similarity index 100% rename from src/stats/wt_text_report.pkb rename to src/persist/wt_text_report.pkb diff --git a/src/stats/wt_text_report.pks b/src/persist/wt_text_report.pks similarity index 100% rename from src/stats/wt_text_report.pks rename to src/persist/wt_text_report.pks From b242118d8693343bb736d53e92aee3cd47518956 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Thu, 22 Nov 2018 08:48:50 -0600 Subject: [PATCH 038/141] Add "add" test --- src/core/core_data.pkb | 144 ++++++++++++++++++++++++++------- src/core/core_data.pks | 1 - src/core/install.sql | 2 +- src/core/wt_text_report.pks | 14 +++- src/persist/wt_text_report.pks | 2 +- 5 files changed, 127 insertions(+), 36 deletions(-) diff --git a/src/core/core_data.pkb b/src/core/core_data.pkb index 2483195..01c7def 100644 --- a/src/core/core_data.pkb +++ b/src/core/core_data.pkb @@ -1,6 +1,8 @@ create or replace package body core_data is + g_results_rec results_rec_type; + --------------------- -- Public Procedures --------------------- @@ -14,11 +16,12 @@ is begin -- Initialize Test Run Record g_run_rec := l_run_recNULL; - --g_run_rec.runner_owner := USER; - --g_run_rec.runner_owner := sys_context('userenv', 'current_schema'); - select username into g_run_rec.runner_owner from user_users; - g_run_rec.runner_name := in_package_name; g_run_rec.start_dtm := systimestamp; + g_run_rec.runner_name := in_package_name; + -- These don't work: + -- g_run_rec.runner_owner := USER; + -- g_run_rec.runner_owner := sys_context('userenv', 'current_schema'); + select username into g_run_rec.runner_owner from user_users; -- Initialize Test Results Array g_results_nt := results_nt_type(null); -- Initialize Test Results Record @@ -41,20 +44,20 @@ $THEN wt_assert.g_testcase := 'INIT "One" Starting Point Confirmation'; wt_assert.isnotnull (msg_in => 'g_run_rec.runner_owner' - ,check_this_in => g_run_rec.runner_owner); + ,check_this_in => g_run_rec.runner_owner); wt_assert.isnotnull (msg_in => 'g_run_rec.runner_name' - ,check_this_in => g_run_rec.runner_name); + ,check_this_in => g_run_rec.runner_name); wt_assert.isnotnull (msg_in => 'g_run_rec.start_dtm' - ,check_this_in => g_run_rec.start_dtm); + ,check_this_in => g_run_rec.start_dtm); num_recs := g_results_nt.COUNT; wt_assert.isnotnull (msg_in => 'Number of Records in g_results_nt' - ,check_this_in => num_recs); + ,check_this_in => num_recs); wt_assert.isnotnull (msg_in => 'g_results_rec.pass' - ,check_this_in => g_results_rec.pass); + ,check_this_in => g_results_rec.pass); -------------------------------------- WTPLSQL Testing -- l_run_recSAVE := g_run_rec; l_results_recSAVE := g_results_rec; @@ -63,32 +66,32 @@ $THEN l_run_recTEST := g_run_rec; l_results_recTEST := g_results_rec; l_results_ntTEST := g_results_nt; - g_run_rec := l_run_recSAVE; - g_results_rec := l_results_recSAVE; - g_results_nt := l_results_ntSAVE; + g_run_rec := l_run_recSAVE; + g_results_rec := l_results_recSAVE; + g_results_nt := l_results_ntSAVE; -------------------------------------- WTPLSQL Testing -- wt_assert.g_testcase := 'INIT "One" Happy Path 1'; wt_assert.eq (msg_in => 'l_run_recSAVE.runner_owner' - ,check_this_in => l_run_recSAVE.runner_owner - ,against_this_in => USER); + ,check_this_in => l_run_recSAVE.runner_owner + ,against_this_in => USER); wt_assert.eq (msg_in => 'l_run_recTEST.runner_name' - ,check_this_in => l_run_recTEST.runner_name + ,check_this_in => l_run_recTEST.runner_name ,against_this_in => 'WTPLSQL'); wt_assert.isnotnull - (msg_in => 'l_run_recTEST.start_dtm' - ,check_this_in => l_run_recTEST.start_dtm); + (msg_in => 'l_run_recTEST.start_dtm' + ,check_this_in => l_run_recTEST.start_dtm); wt_assert.this - (msg_in => 'l_run_recTEST.start_dtm > g_run_rec.start_dtm' - ,check_this_in => l_run_recTEST.start_dtm > g_run_rec.start_dtm); + (msg_in => 'l_run_recTEST.start_dtm > g_run_rec.start_dtm' + ,check_this_in => l_run_recTEST.start_dtm > g_run_rec.start_dtm); wt_assert.eq (msg_in => 'Number of Records in l_results_ntTEST' - ,check_this_in => l_results_ntTEST.COUNT - ,against_this_in => 1); + ,check_this_in => l_results_ntTEST.COUNT + ,against_this_in => 1); wt_assert.isnull - (msg_in => 'l_results_recTEST.pass' - ,check_this_in => l_results_recTEST.pass); + (msg_in => 'l_results_recTEST.pass' + ,check_this_in => l_results_recTEST.pass); end t_init1; $END ----------------%WTPLSQL_end_ignore_lines%---------------- @@ -99,7 +102,8 @@ is l_run_recNULL run_rec_type; l_results_recNULL results_rec_type; begin - g_results_rec.executed_dtm := systimestamp; + g_results_rec.result_seq := 0; + g_results_rec.executed_dtm := systimestamp; end init2; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ @@ -120,12 +124,16 @@ $THEN -------------------------------------- WTPLSQL Testing -- init2; l_results_recTEST := g_results_rec; - g_run_rec := l_run_recSAVE; - g_results_rec := l_results_recSAVE; - g_results_nt := l_results_ntSAVE; + g_run_rec := l_run_recSAVE; + g_results_rec := l_results_recSAVE; + g_results_nt := l_results_ntSAVE; + wt_assert.eq + (msg_in => 'l_results_recTEST.result_seq' + ,check_this_in => l_results_recTEST.result_seq + ,against_this_in => 0); wt_assert.isnotnull - (msg_in => 'l_results_recTEST.executed_dtm' - ,check_this_in => l_results_recTEST.executed_dtm); + (msg_in => 'l_results_recTEST.executed_dtm' + ,check_this_in => l_results_recTEST.executed_dtm); end t_init2; $END ----------------%WTPLSQL_end_ignore_lines%---------------- @@ -161,10 +169,84 @@ $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN procedure t_add is - l_run_recSAVE run_rec_type; + l_run_recSAVE run_rec_type; + l_results_ntSAVE results_nt_type; + l_results_recSAVE results_rec_type; + l_run_recTEST run_rec_type; + l_results_ntTEST results_nt_type; + l_results_recTEST results_rec_type; + num_recs number; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'TEST_ALL Happy Path'; + wt_assert.g_testcase := 'Add Happy Path'; + num_recs := g_results_nt.COUNT; + l_run_recSAVE := g_run_rec; + l_results_recSAVE := g_results_rec; + l_results_ntSAVE := g_results_nt; + add(in_testcase => 'The Testcase' + ,in_assertion => 'The Assert' + ,in_pass => TRUE + ,in_details => 'The Details' + ,in_message => 'The Message'); + l_run_recTEST := g_run_rec; + l_results_recTEST := g_results_rec; + l_results_ntTEST := g_results_nt; + g_run_rec := l_run_recSAVE; + g_results_rec := l_results_recSAVE; + g_results_nt := l_results_ntSAVE; + -------------------------------------- WTPLSQL Testing -- + -- Must use num_recs - 1 to find the previous record + -- num_recs is the test record added here + -- num_recs + 1 is a NULL record + wt_assert.isnotnull + (msg_in => 'Number of Records Before Test' + ,check_this_in => num_recs); + wt_assert.eq + (msg_in => 'Confirm Records After Test' + ,check_this_in => l_results_ntTEST.COUNT + ,against_this_in => num_recs + 1); + wt_assert.isnotnull + (msg_in => 'l_results_recTEST.result_seq' + ,check_this_in => l_results_recTEST.result_seq); + wt_assert.isnotnull + (msg_in => 'l_results_ntTEST(num_recs-1).result_seq' + ,check_this_in => l_results_ntTEST(num_recs-1).result_seq); + wt_assert.this + (msg_in => 'l_results_recTEST.result_seq = ' || + 'l_results_ntTEST(num_recs-1).result_seq + 1' + ,check_this_in => l_results_recTEST.result_seq = + l_results_ntTEST(num_recs-1).result_seq + 1); + wt_assert.isnotnull + (msg_in => 'l_results_recTEST.interval_msecs' + ,check_this_in => l_results_recTEST.interval_msecs); + wt_assert.isnotnull + (msg_in => 'l_results_recTEST.executed_dtm' + ,check_this_in => l_results_recTEST.executed_dtm); + wt_assert.this + (msg_in => 'l_results_recTEST.executed_dtm >= ' || + 'l_results_ntTEST(num_recs-1).executed_dtm' + ,check_this_in => l_results_recTEST.executed_dtm >= + l_results_ntTEST(num_recs-1).executed_dtm); + wt_assert.eq + (msg_in => 'l_results_recTEST.testcase' + ,check_this_in => l_results_recTEST.testcase + ,against_this_in => 'The Testcase'); + wt_assert.eq + (msg_in => 'l_results_recTEST.assertion' + ,check_this_in => l_results_recTEST.assertion + ,against_this_in => 'The Assert'); + wt_assert.eq + (msg_in => 'l_results_recTEST.pass' + ,check_this_in => l_results_recTEST.pass + ,against_this_in => TRUE); + wt_assert.eq + (msg_in => 'l_results_recTEST.details' + ,check_this_in => l_results_recTEST.details + ,against_this_in => 'The Details'); + wt_assert.eq + (msg_in => 'l_results_recTEST.message' + ,check_this_in => l_results_recTEST.message + ,against_this_in => 'The Message'); end t_add; $END ----------------%WTPLSQL_end_ignore_lines%---------------- diff --git a/src/core/core_data.pks b/src/core/core_data.pks index abbefdf..72b0ed4 100644 --- a/src/core/core_data.pks +++ b/src/core/core_data.pks @@ -25,7 +25,6 @@ is ,details varchar2(4000) ,message varchar2(200)); TYPE results_nt_type is table of results_rec_type; - g_results_rec results_rec_type; g_results_nt results_nt_type; procedure init1 diff --git a/src/core/install.sql b/src/core/install.sql index 6a2a3b4..fa125e2 100644 --- a/src/core/install.sql +++ b/src/core/install.sql @@ -183,7 +183,7 @@ insert into hooks (hook_name, seq, run_string) -- Run this report after testing because this is no storage insert into hooks (hook_name, seq, run_string) - values ('after_test_run', 1, 'begin wt_text_report.dbms_out(30, TRUE); end;'); + values ('after_test_run', 1, 'begin wt_text_report.dbms_out(10); end;'); -- This is the default ad-hoc result report insert into hooks (hook_name, seq, run_string) diff --git a/src/core/wt_text_report.pks b/src/core/wt_text_report.pks index 10b5a7d..61facf8 100644 --- a/src/core/wt_text_report.pks +++ b/src/core/wt_text_report.pks @@ -4,9 +4,9 @@ as g_run_rec core_data.run_rec_type; - -- To report the latest result details for test runner: + -- To report the latest result details: -- begin - -- wt_text_report.dbms_out('TEST_RUNNER', FALSE, FALSE, TRUE, TRUE); + -- wt_text_report.dbms_out(30, TRUE); -- end; -- / @@ -24,6 +24,16 @@ as procedure show_result_header; +-- "in_detail_level" settings for DBMS_OUT procedure: +-- * Less than 10 (including null) - No Detail +-- * Assertion results summary. +-- * 10 to 19 - Minimal Detail +-- * Assertion results summary. +-- * Failed assertion result details. +-- * 20 or more - Full Detail +-- * Assertion results summary. +-- * All assertion result details. + function format_test_result (in_rec in core_data.results_rec_type) return varchar2; diff --git a/src/persist/wt_text_report.pks b/src/persist/wt_text_report.pks index 15493a9..893076b 100644 --- a/src/persist/wt_text_report.pks +++ b/src/persist/wt_text_report.pks @@ -3,7 +3,7 @@ as -- To report the latest result details for test runner: -- begin - -- wt_text_report.dbms_out('TEST_RUNNER', FALSE, FALSE, TRUE, TRUE); + -- wt_text_report.dbms_out('RUNNER_OWNER', 'RUNNER', 30); -- end; -- / From b7c1ce6ddc207d4dd41168d68c562ec3692f2609 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Fri, 23 Nov 2018 07:23:49 -0600 Subject: [PATCH 039/141] Core Testing Complete --- src/core/core_data.pkb | 157 +++++++++++++++++++++++++----------- src/core/wt_text_report.pkb | 1 + src/core/wtplsql.pkb | 15 +--- 3 files changed, 111 insertions(+), 62 deletions(-) diff --git a/src/core/core_data.pkb b/src/core/core_data.pkb index 01c7def..3b70bbd 100644 --- a/src/core/core_data.pkb +++ b/src/core/core_data.pkb @@ -38,27 +38,9 @@ $THEN l_run_recTEST run_rec_type; l_results_ntTEST results_nt_type; l_results_recTEST results_rec_type; - num_recs number; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'INIT "One" Starting Point Confirmation'; - wt_assert.isnotnull - (msg_in => 'g_run_rec.runner_owner' - ,check_this_in => g_run_rec.runner_owner); - wt_assert.isnotnull - (msg_in => 'g_run_rec.runner_name' - ,check_this_in => g_run_rec.runner_name); - wt_assert.isnotnull - (msg_in => 'g_run_rec.start_dtm' - ,check_this_in => g_run_rec.start_dtm); - num_recs := g_results_nt.COUNT; - wt_assert.isnotnull - (msg_in => 'Number of Records in g_results_nt' - ,check_this_in => num_recs); - wt_assert.isnotnull - (msg_in => 'g_results_rec.pass' - ,check_this_in => g_results_rec.pass); - -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'INIT "One" Happy Path 1'; l_run_recSAVE := g_run_rec; l_results_recSAVE := g_results_rec; l_results_ntSAVE := g_results_nt; @@ -70,10 +52,17 @@ $THEN g_results_rec := l_results_recSAVE; g_results_nt := l_results_ntSAVE; -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'INIT "One" Happy Path 1'; + wt_assert.isnotnull + (msg_in => 'l_results_ntSAVE.COUNT' + ,check_this_in => l_results_ntSAVE.COUNT); + wt_assert.eq + (msg_in => 'l_results_ntTEST.COUNT' + ,check_this_in => l_results_ntTEST.COUNT + ,against_this_in => 1); + -------------------------------------- WTPLSQL Testing -- wt_assert.eq - (msg_in => 'l_run_recSAVE.runner_owner' - ,check_this_in => l_run_recSAVE.runner_owner + (msg_in => 'l_run_recTEST.runner_owner' + ,check_this_in => l_run_recTEST.runner_owner ,against_this_in => USER); wt_assert.eq (msg_in => 'l_run_recTEST.runner_name' @@ -83,12 +72,8 @@ $THEN (msg_in => 'l_run_recTEST.start_dtm' ,check_this_in => l_run_recTEST.start_dtm); wt_assert.this - (msg_in => 'l_run_recTEST.start_dtm > g_run_rec.start_dtm' - ,check_this_in => l_run_recTEST.start_dtm > g_run_rec.start_dtm); - wt_assert.eq - (msg_in => 'Number of Records in l_results_ntTEST' - ,check_this_in => l_results_ntTEST.COUNT - ,against_this_in => 1); + (msg_in => 'l_run_recTEST.start_dtm > l_run_recSAVE.start_dtm' + ,check_this_in => l_run_recTEST.start_dtm > l_run_recSAVE.start_dtm); wt_assert.isnull (msg_in => 'l_results_recTEST.pass' ,check_this_in => l_results_recTEST.pass); @@ -175,11 +160,9 @@ $THEN l_run_recTEST run_rec_type; l_results_ntTEST results_nt_type; l_results_recTEST results_rec_type; - num_recs number; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Add Happy Path'; - num_recs := g_results_nt.COUNT; + wt_assert.g_testcase := 'Add Procedure Happy Path'; l_run_recSAVE := g_run_rec; l_results_recSAVE := g_results_rec; l_results_ntSAVE := g_results_nt; @@ -195,27 +178,22 @@ $THEN g_results_rec := l_results_recSAVE; g_results_nt := l_results_ntSAVE; -------------------------------------- WTPLSQL Testing -- - -- Must use num_recs - 1 to find the previous record - -- num_recs is the test record added here - -- num_recs + 1 is a NULL record wt_assert.isnotnull - (msg_in => 'Number of Records Before Test' - ,check_this_in => num_recs); + (msg_in => 'l_results_ntSAVE.COUNT' + ,check_this_in => l_results_ntSAVE.COUNT); wt_assert.eq - (msg_in => 'Confirm Records After Test' + (msg_in => 'Confirm l_results_ntTEST.COUNT' ,check_this_in => l_results_ntTEST.COUNT - ,against_this_in => num_recs + 1); + ,against_this_in => l_results_ntSAVE.COUNT + 1); wt_assert.isnotnull (msg_in => 'l_results_recTEST.result_seq' ,check_this_in => l_results_recTEST.result_seq); - wt_assert.isnotnull - (msg_in => 'l_results_ntTEST(num_recs-1).result_seq' - ,check_this_in => l_results_ntTEST(num_recs-1).result_seq); wt_assert.this (msg_in => 'l_results_recTEST.result_seq = ' || - 'l_results_ntTEST(num_recs-1).result_seq + 1' + 'l_results_recSAVE.result_seq + 1' ,check_this_in => l_results_recTEST.result_seq = - l_results_ntTEST(num_recs-1).result_seq + 1); + l_results_recSAVE.result_seq + 1); + -------------------------------------- WTPLSQL Testing -- wt_assert.isnotnull (msg_in => 'l_results_recTEST.interval_msecs' ,check_this_in => l_results_recTEST.interval_msecs); @@ -224,9 +202,10 @@ $THEN ,check_this_in => l_results_recTEST.executed_dtm); wt_assert.this (msg_in => 'l_results_recTEST.executed_dtm >= ' || - 'l_results_ntTEST(num_recs-1).executed_dtm' + 'l_results_recSAVE.executed_dtm' ,check_this_in => l_results_recTEST.executed_dtm >= - l_results_ntTEST(num_recs-1).executed_dtm); + l_results_recSAVE.executed_dtm); + -------------------------------------- WTPLSQL Testing -- wt_assert.eq (msg_in => 'l_results_recTEST.testcase' ,check_this_in => l_results_recTEST.testcase @@ -263,9 +242,38 @@ $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN procedure t_finalize is + l_run_recSAVE run_rec_type; + l_results_ntSAVE results_nt_type; + l_results_recSAVE results_rec_type; + l_run_recTEST run_rec_type; + l_results_ntTEST results_nt_type; + l_results_recTEST results_rec_type; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'TEST_ALL Happy Path'; + wt_assert.g_testcase := 'Finalize Happy Path'; + l_run_recSAVE := g_run_rec; + l_results_recSAVE := g_results_rec; + l_results_ntSAVE := g_results_nt; + finalize; + l_run_recTEST := g_run_rec; + l_results_recTEST := g_results_rec; + l_results_ntTEST := g_results_nt; + g_run_rec := l_run_recSAVE; + g_results_rec := l_results_recSAVE; + g_results_nt := l_results_ntSAVE; + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull + (msg_in => 'l_run_recSAVE.end_dtm' + ,check_this_in => l_run_recSAVE.end_dtm); + wt_assert.isnotnull + (msg_in => 'l_run_recTEST.end_dtm' + ,check_this_in => l_run_recTEST.end_dtm); + wt_assert.isnotnull + (msg_in => 'l_results_ntSAVE.COUNT' + ,check_this_in => l_results_ntSAVE.COUNT); + wt_assert.this + (msg_in => 'l_results_ntTEST.COUNT = l_results_ntSAVE.COUNT - 1' + ,check_this_in => l_results_ntTEST.COUNT = l_results_ntSAVE.COUNT - 1); end t_finalize; $END ----------------%WTPLSQL_end_ignore_lines%---------------- @@ -274,7 +282,6 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- procedure run_error (in_error_message in varchar2) is - l_run_recSAVE run_rec_type; begin if g_run_rec.error_message is null then @@ -290,9 +297,63 @@ $THEN procedure t_run_error is l_run_recSAVE run_rec_type; + l_run_recTEST run_rec_type; + test_message varchar2(32767); begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'TEST_ALL Happy Path'; + wt_assert.g_testcase := 'RUN_ERROR Happy Path 1'; + l_run_recSAVE := g_run_rec; + g_run_rec.error_message := ''; + run_error('Simlple Message'); + l_run_recTEST := g_run_rec; + g_run_rec := l_run_recSAVE; + wt_assert.eq + (msg_in => 'l_run_recTEST.error_message' + ,check_this_in => l_run_recTEST.error_message + ,against_this_in => 'Simlple Message'); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'RUN_ERROR Happy Path 2'; + l_run_recSAVE := g_run_rec; + g_run_rec.error_message := ''; + run_error('Message 1'); + run_error('Message 2'); + l_run_recTEST := g_run_rec; + g_run_rec := l_run_recSAVE; + wt_assert.eq + (msg_in => 'l_run_recTEST.error_message' + ,check_this_in => l_run_recTEST.error_message + ,against_this_in => 'Message 1' || CHR(10) || 'Message 2'); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'RUN_ERROR Happy Path 3'; + for i in 1 .. 399 + loop + test_message := test_message || '1234567890'; + end loop; + l_run_recSAVE := g_run_rec; + g_run_rec.error_message := ''; + run_error(test_message); + run_error('Longer than 10 characters.'); + l_run_recTEST := g_run_rec; + g_run_rec := l_run_recSAVE; + wt_assert.isnotnull + (msg_in => 'substr(l_run_recTEST.error_message,3000)' + ,check_this_in => substr(l_run_recTEST.error_message,3000)); + wt_assert.this + (msg_in => 'l_run_recTEST.error_message like ''%Longer th''' + ,check_this_in => l_run_recTEST.error_message like '%Longer th'); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'RUN_ERROR Happy Path 4'; + l_run_recSAVE := g_run_rec; + g_run_rec.error_message := ''; + run_error(''); + run_error('Message'); + run_error(''); + l_run_recTEST := g_run_rec; + g_run_rec := l_run_recSAVE; + wt_assert.eq + (msg_in => 'l_run_recTEST.error_message' + ,check_this_in => l_run_recTEST.error_message + ,against_this_in => 'Message' || CHR(10)); end t_run_error; $END ----------------%WTPLSQL_end_ignore_lines%---------------- diff --git a/src/core/wt_text_report.pkb b/src/core/wt_text_report.pkb index 3d76df0..6c2ec0a 100644 --- a/src/core/wt_text_report.pkb +++ b/src/core/wt_text_report.pkb @@ -143,6 +143,7 @@ begin results_out(in_detail_level >= 20); end if; end if; + p(''); end dbms_out; diff --git a/src/core/wtplsql.pkb b/src/core/wtplsql.pkb index 4a9f7b0..ef1e2d0 100644 --- a/src/core/wtplsql.pkb +++ b/src/core/wtplsql.pkb @@ -408,19 +408,6 @@ procedure test_run is pragma AUTONOMOUS_TRANSACTION; -- Required if called as Remote Procedure Call (RPC) l_error_stack varchar2(32000); - procedure concat_err_message - (in_err_msg in varchar2) - is - begin - if core_data.g_run_rec.error_message is not null - then - core_data.g_run_rec.error_message := substr(in_err_msg || CHR(10)|| - core_data.g_run_rec.error_message - ,1,4000); - else - core_data.g_run_rec.error_message := in_err_msg; - end if; - end concat_err_message; begin $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN @@ -449,7 +436,7 @@ begin then l_error_stack := dbms_utility.format_error_stack || dbms_utility.format_error_backtrace ; - concat_err_message(l_error_stack); + core_data.run_error(l_error_stack); end; -- Finalize rollback; -- Discard any pending transactions. From a9adea52caa8356a1f02ad3a4129d6f029555439 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Fri, 23 Nov 2018 07:42:15 -0600 Subject: [PATCH 040/141] Update List Files --- src/core/installO.LST | 568 +---- src/core/test_allO.LST | 4329 +-------------------------------------- src/core/uninstallO.LST | 52 +- 3 files changed, 132 insertions(+), 4817 deletions(-) diff --git a/src/core/installO.LST b/src/core/installO.LST index 184178c..0290ef2 100644 --- a/src/core/installO.LST +++ b/src/core/installO.LST @@ -2,436 +2,102 @@ old: showmode BOTH PL/SQL procedure successfully completed. -old:create user &schema_owner. identified by &schema_owner. - default tablespace users - quota unlimited on users - temporary tablespace temp -new:create user wtp identified by wtp - default tablespace users - quota unlimited on users - temporary tablespace temp +old 1: create user &schema_owner. identified by &schema_owner. +new 1: create user wtp identified by wtp -User WTP created. +User created. -old:grant create session to &schema_owner. -new:grant create session to wtp +old 1: grant create session to &schema_owner. +new 1: grant create session to wtp Grant succeeded. -old:grant create type to &schema_owner. -new:grant create type to wtp +old 1: grant create type to &schema_owner. +new 1: grant create type to wtp Grant succeeded. -old:grant create sequence to &schema_owner. -new:grant create sequence to wtp +old 1: grant create sequence to &schema_owner. +new 1: grant create sequence to wtp Grant succeeded. -old:grant create table to &schema_owner. -new:grant create table to wtp +old 1: grant create table to &schema_owner. +new 1: grant create table to wtp Grant succeeded. -old:grant create trigger to &schema_owner. -new:grant create trigger to wtp +old 1: grant create trigger to &schema_owner. +new 1: grant create trigger to wtp Grant succeeded. -old:grant create view to &schema_owner. -new:grant create view to wtp +old 1: grant create view to &schema_owner. +new 1: grant create view to wtp Grant succeeded. -old:grant create procedure to &schema_owner. -new:grant create procedure to wtp +old 1: grant create procedure to &schema_owner. +new 1: grant create procedure to wtp Grant succeeded. -old:grant select on dba_source to &schema_owner. -new:grant select on dba_source to wtp +old 1: grant create database link to &schema_owner. +new 1: grant create database link to wtp Grant succeeded. -old:grant select on dba_objects to &schema_owner. -new:grant select on dba_objects to wtp +old 1: grant create job to &schema_owner. +new 1: grant create job to wtp Grant succeeded. -PLSQL_CCFLAGS Before: WTPLSQL_ENABLE:TRUE, WTPLSQL_SELFTEST:TRUE - - -PL/SQL procedure successfully completed. - - -PL/SQL procedure successfully completed. - -PLSQL_CCFLAGS After: WTPLSQL_ENABLE:TRUE, WTPLSQL_SELFTEST:TRUE - - -PL/SQL procedure successfully completed. - -old:create or replace public synonym wt_version for &schema_owner..wt_version -new:create or replace public synonym wt_version for wtp.wt_version - -Synonym WT_VERSION created. - -old:create or replace public synonym wt_test_runs_seq for &schema_owner..wt_test_runs_seq -new:create or replace public synonym wt_test_runs_seq for wtp.wt_test_runs_seq - -Synonym WT_TEST_RUNS_SEQ created. - -old:create or replace public synonym wt_test_runs for &schema_owner..wt_test_runs -new:create or replace public synonym wt_test_runs for wtp.wt_test_runs - -Synonym WT_TEST_RUNS created. - -old:create or replace public synonym wt_results for &schema_owner..wt_results -new:create or replace public synonym wt_results for wtp.wt_results - -Synonym WT_RESULTS created. - -old:create or replace public synonym wt_dbout_profiles for &schema_owner..wt_dbout_profiles -new:create or replace public synonym wt_dbout_profiles for wtp.wt_dbout_profiles - -Synonym WT_DBOUT_PROFILES created. - -old:create or replace public synonym wt_test_run_stats for &schema_owner..wt_test_run_stats -new:create or replace public synonym wt_test_run_stats for wtp.wt_test_run_stats - -Synonym WT_TEST_RUN_STATS created. - -old:create or replace public synonym wt_testcase_stats for &schema_owner..wt_testcase_stats -new:create or replace public synonym wt_testcase_stats for wtp.wt_testcase_stats - -Synonym WT_TESTCASE_STATS created. - -old:create or replace public synonym wt_self_test for &schema_owner..wt_self_test -new:create or replace public synonym wt_self_test for wtp.wt_self_test - -Synonym WT_SELF_TEST created. - -old:create or replace public synonym utassert for &schema_owner..wt_assert -new:create or replace public synonym utassert for wtp.wt_assert - -Synonym UTASSERT created. - -old:create or replace public synonym wt_assert for &schema_owner..wt_assert -new:create or replace public synonym wt_assert for wtp.wt_assert - -Synonym WT_ASSERT created. - -old:create or replace public synonym wt_text_report for &schema_owner..wt_text_report -new:create or replace public synonym wt_text_report for wtp.wt_text_report - -Synonym WT_TEXT_REPORT created. - -old:create or replace public synonym wt_wtplsql for &schema_owner..wtplsql -new:create or replace public synonym wt_wtplsql for wtp.wtplsql - -Synonym WT_WTPLSQL created. - -old:create or replace public synonym wtplsql for &schema_owner..wtplsql -new:create or replace public synonym wtplsql for wtp.wtplsql - -Synonym WTPLSQL created. - -Connected. -old:begin - if USER != upper('&schema_owner') - then - raise_application_error (-20000, - 'Not logged in as &schema_owner'); - end if; -end; - -new:begin - if USER != upper('wtp') - then - raise_application_error (-20000, - 'Not logged in as wtp'); - end if; -end; - -PL/SQL procedure successfully completed. - - -Error starting at line : 46 File @ C:\Users\Duane\Documents\GitHub\wtPLSQL\src\core\proftab.sql -In command - -drop table plsql_profiler_data cascade constraints -Error report - -ORA-00942: table or view does not exist -00942. 00000 - "table or view does not exist" -*Cause: -*Action: - -Error starting at line : 47 File @ C:\Users\Duane\Documents\GitHub\wtPLSQL\src\core\proftab.sql -In command - -drop table plsql_profiler_units cascade constraints -Error report - -ORA-00942: table or view does not exist -00942. 00000 - "table or view does not exist" -*Cause: -*Action: - -Error starting at line : 48 File @ C:\Users\Duane\Documents\GitHub\wtPLSQL\src\core\proftab.sql -In command - -drop table plsql_profiler_runs cascade constraints -Error report - -ORA-00942: table or view does not exist -00942. 00000 - "table or view does not exist" -*Cause: -*Action: - -Error starting at line : 50 File @ C:\Users\Duane\Documents\GitHub\wtPLSQL\src\core\proftab.sql -In command - -drop sequence plsql_profiler_runnumber -Error report - -ORA-02289: sequence does not exist -02289. 00000 - "sequence does not exist" -*Cause: The specified sequence does not exist, or the user does - not have the required privilege to perform this operation. -*Action: Make sure the sequence name is correct, and that you have - the right to perform the desired operation on this sequence. - -Table PLSQL_PROFILER_RUNS created. - - -Comment created. - - -Table PLSQL_PROFILER_UNITS created. - - -Comment created. - - -Table PLSQL_PROFILER_DATA created. - - -Comment created. - - -Sequence PLSQL_PROFILER_RUNNUMBER created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Index PLSQL_PROFILER_RUNS_IDX1 created. - - -Table WT_VERSION created. - - -Comment created. - - -Comment created. - - -Comment created. - - -1 row inserted. - - -Commit complete. - +old 1: grant create public synonym to &schema_owner. +new 1: grant create public synonym to wtp Grant succeeded. - -Sequence WT_TEST_RUNS_SEQ created. - +old 1: grant select on dba_objects to &schema_owner. +new 1: grant select on dba_objects to wtp Grant succeeded. - -Table WT_TEST_RUNS created. - - -Index WT_TEST_RUNS_IDX1 created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - +old 1: grant select on dba_procedures to &schema_owner. +new 1: grant select on dba_procedures to wtp Grant succeeded. +old 1: grant select on dba_source to &schema_owner. +new 1: grant select on dba_source to wtp Grant succeeded. +old 1: grant select on sys.gv_$parameter to &schema_owner. +new 1: grant select on sys.gv_$parameter to wtp Grant succeeded. +PLSQL_CCFLAGS Before: WTPLSQL_ENABLE:TRUE, WTPLSQL_SELFTEST:TRUE -Table WT_RESULTS created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. +PL/SQL procedure successfully completed. -Comment created. +PL/SQL procedure successfully completed. +PLSQL_CCFLAGS After: WTPLSQL_ENABLE:TRUE, WTPLSQL_SELFTEST:TRUE -Grant succeeded. +PL/SQL procedure successfully completed. +Connected. +old 2: if USER != upper('&schema_owner') +new 2: if USER != upper('wtp') +old 5: 'Not logged in as &schema_owner'); +new 5: 'Not logged in as wtp'); -Grant succeeded. +PL/SQL procedure successfully completed. -Table WT_DBOUT_PROFILES created. +Table created. Comment created. @@ -449,7 +115,7 @@ Comment created. Comment created. -Comment created. +Table created. Comment created. @@ -463,47 +129,19 @@ Comment created. Grant succeeded. +old 1: create or replace public synonym wt_version for &schema_owner..wt_versions +new 1: create or replace public synonym wt_version for wtp.wt_versions -Grant succeeded. - - -Table WT_TEST_RUN_STATS created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. - - -Comment created. +Synonym created. -Comment created. +1 row created. -Comment created. +Commit complete. -Comment created. +Table created. Comment created. @@ -524,144 +162,90 @@ Comment created. Comment created. -Comment created. +Trigger created. -Comment created. +PL/SQL procedure successfully completed. -Comment created. +Commit complete. -Comment created. +Package created. -Comment created. +Package created. -Grant succeeded. +Package created. Grant succeeded. -Table WT_TESTCASE_STATS created. - - -Comment created. - - -Comment created. - - -Comment created. +Synonym created. -Comment created. +Synonym created. -Comment created. +Package created. -Comment created. +Grant succeeded. -Comment created. +Synonym created. -Comment created. +Synonym created. -Comment created. +Package created. -Comment created. +Grant succeeded. -Comment created. +Synonym created. -Comment created. +Procedure created. -Grant succeeded. +Procedure created. Grant succeeded. -Table WT_SELF_TEST created. +Synonym created. -Comment created. +Package body created. -Comment created. +Package body created. -Comment created. +Package body created. -Comment created. +Package body created. -Comment created. +Package body created. -Comment created. +1 row created. -Trigger WT_SELF_TEST$TEST compiled +1 row created. -PL/SQL procedure successfully completed. +1 row created. Commit complete. - -Package WTPLSQL compiled - - -Package WT_RESULT compiled - - -Package WT_ASSERT compiled - - -Package WT_PROFILER compiled - - -Package WT_TEST_RUN_STAT compiled - - -Package WT_TEXT_REPORT compiled - - -Grant succeeded. - - -Grant succeeded. - - -Grant succeeded. - - -Package Body WTPLSQL compiled - - -Package Body WT_RESULT compiled - - -Package Body WT_ASSERT compiled - - -Package Body WT_PROFILER compiled - - -Package Body WT_TEST_RUN_STAT compiled - - -Package Body WT_TEXT_REPORT compiled - new: showmode BOTH diff --git a/src/core/test_allO.LST b/src/core/test_allO.LST index d30fbbb..7725c08 100644 --- a/src/core/test_allO.LST +++ b/src/core/test_allO.LST @@ -1,4302 +1,71 @@ - wtPLSQL 1.1.0 - Run ID 5: 29-Jun-2018 03:21:58 PM + wtPLSQL 1.2.0 - Start Date/Time: 23-Nov-2018 07:22:20 AM - Test Results for WTP.WTPLSQL - Total Test Cases: 10 Total Assertions: 34 - Minimum Interval msec: 0 Failed Assertions: 0 - Average Interval msec: 3 Error Assertions: 0 - Maximum Interval msec: 39 Test Yield: 100.00% - Total Run Time (sec): 0.1 +Test Results for WTP.CORE_DATA +Database Object Under Test is PACKAGE BODY WTP.CORE_DATA +---------------------------------------- + Minimum Elapsed msec: 0 Total Testcases: 8 + Average Elapsed msec: 0 Total Assertions: 30 + Maximum Elapsed msec: 2 Failed Assertions: 0 + Total Run Time (sec): 0.1 Test Yield: 100.00% - - WTP.WTPLSQL Test Result Details (Test Run ID 5) ------------------------------------------------------------ - ---- Test Case: Show Version Happy Path - PASS 39ms Test Existing Version. ISNOTNULL - Expected NOT NULL and got "1.1.0" - PASS 2ms Test New Version. EQ - Expected "TESTING" and got "TESTING" - PASS 0ms Return to Existing Version. EQ - Expected "1.1.0" and got "1.1.0" - ---- Test Case: CHECK_RUNNER Sad Path 1 - PASS 0ms Null RUNNER_NAME. EQ - Expected "ORA-20001: RUNNER_NAME is null" and got "ORA-20001: RUNNER_NAME is null" - ---- Test Case: CHECK_RUNNER Sad Path 2 - PASS 1ms Invalid RUNNER_NAME. EQ - Expected "ORA-20002: RUNNER_NAME "BOGUS.WTPLSQL_RUN" is not valid" and got "ORA-20002: RUNNER_NAME "BOGUS.WTPLSQL_RUN" is not valid" - ---- Test Case: INSERT_TEST_RUN Happy Path 1 - PASS 3ms Number of Records. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_test_runs where id = 5 - PASS 2ms Records After Delete. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_test_runs where id = 5 - ---- Test Case: INSERT_TEST_RUN Sad Path 1 - PASS 0ms l_dbmsout_buff.COUNT - 1. ISNOTNULL - Expected NOT NULL and got "0" - PASS 3ms Number of Records should stay the same. EQQUERYVALUE - Expected "4" and got "4" for Query: select count(*) from wt_test_runs - PASS 0ms DBMS_OUTPUT Status. EQ - Expected "0" and got "0" - PASS 0ms DBMS_OUTPUT Line. ISNOTNULL - Expected NOT NULL and got "ORA-01400: cannot insert NULL into ("WTP"."WT_TEST_RUNS"."START_DTM")\nORA-06512: at "WTP.WTPLSQL", line 106\n" - PASS 0ms Confirm DBMS_OUTPUT Line text. THIS - Expected "TRUE" and got "TRUE" - PASS 0ms l_dbmsout_buff.COUNT - 1. ISNOTNULL - Expected NOT NULL and got "0" - ---- Test Case: TEST_ALL Happy Path - PASS 2ms test_all_aa.EXISTS('WTPLSQL'). THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: DELETE_RUNS Happy Path 1 - PASS 20ms Number of Records Before Insert. ISNOTNULL - Expected NOT NULL and got "1" - PASS 0ms Number of Records Before Insert <= 20. THIS - Expected "TRUE" and got "TRUE" - PASS 1ms Number of Records After Insert. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_test_runs where id = 5 - PASS 23ms Number of Records After Delete. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_test_runs where id = 5 - ---- Test Case: DELETE_RUNS Happy Path 2 - PASS 3ms Confirm number of records. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_test_runs where runner_owner = 'WTP' and runner_name = 'WTPLSQL' - PASS 3ms Check Added 20 records. EQQUERYVALUE - Expected "21" and got "21" for Query: select count(*) from wt_test_runs where runner_owner = 'WTP' and runner_name = 'WTPLSQL' - PASS 8ms Check number of records reduced. EQQUERYVALUE - Expected "20" and got "20" for Query: select count(*) from wt_test_runs where runner_owner = 'WTP' and runner_name = 'WTPLSQL' - PASS 3ms Confirm original number of records. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_test_runs where runner_owner = 'WTP' and runner_name = 'WTPLSQL' - ---- Test Case: DELETE_RUNS Sad Path 1 - PASS 2ms Delete Runs(-9995). ISNULL - Expected NULL and got "" - ---- Test Case: TEST_RUNS_REC_AND_TABLE Happy Path - PASS 0ms g_test_runs_rec.id. ISNOTNULL - Expected NOT NULL and got "5" - PASS 0ms g_test_runs_rec.start_dtm. ISNOTNULL - Expected NOT NULL and got "29-JUN-2018 15:21:58.271000" - PASS 0ms g_test_runs_rec.runner_owner. ISNOTNULL - Expected NOT NULL and got "WTP" - PASS 0ms g_test_runs_rec.runner_name. EQ - Expected "WTPLSQL" and got "WTPLSQL" - PASS 0ms g_test_runs_rec.dbout_owner. ISNULL - Expected NULL and got "" - PASS 0ms g_test_runs_rec.dbout_name. ISNULL - Expected NULL and got "" - PASS 0ms g_test_runs_rec.dbout_type. ISNULL - Expected NULL and got "" - PASS 0ms g_test_runs_rec.profiler_runid. ISNULL - Expected NULL and got "" - PASS 0ms g_test_runs_rec.end_dtm. ISNULL - Expected NULL and got "" - PASS 0ms g_test_runs_rec.error_message. ISNULL - Expected NULL and got "" - PASS 2ms TEST_RUNS Record for this TEST_RUN. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from WT_TEST_RUNS where id = '5' +WTP.CORE_DATA Test Runner Details: +---------------------------------------- - wtPLSQL 1.1.0 - Run ID 6: 29-Jun-2018 03:21:58 PM + wtPLSQL 1.2.0 - Start Date/Time: 23-Nov-2018 07:22:20 AM - Test Results for WTP.WT_ASSERT - Total Test Cases: 150 Total Assertions: 404 - Minimum Interval msec: 0 Failed Assertions: 0 - Average Interval msec: 5 Error Assertions: 0 - Maximum Interval msec: 496 Test Yield: 100.00% - Total Run Time (sec): 2.0 +Test Results for WTP.HOOK +Database Object Under Test is PACKAGE BODY WTP.HOOK +---------------------------------------- + Minimum Elapsed msec: 0 Total Testcases: 3 + Average Elapsed msec: 1 Total Assertions: 18 + Maximum Elapsed msec: 4 Failed Assertions: 0 + Total Run Time (sec): 0.0 Test Yield: 100.00% - Code Coverage for PACKAGE BODY WTP.WT_ASSERT - Ignored Lines: 1103 Total Profiled Lines: 1464 - Excluded Lines: 7 Total Executed Lines: 309 - Minimum LineExec usec: 0 Not Executed Lines: 1 - Average LineExec usec: 344 Unknown Lines: 44 - Maximum LineExec usec: 68989 Code Coverage: 99.70% - Trigger Source Offset: 0 +WTP.HOOK Test Runner Details: +---------------------------------------- - - WTP.WT_ASSERT Test Result Details (Test Run ID 6) ------------------------------------------------------------ - ---- Test Case: BOOLEAN_TO_STATUS - PASS 172ms Test for "TRUE" conversion. EQ - Expected "TRUE" and got "TRUE" - PASS 1ms Test for "FALSE" conversion. EQ - Expected "FALSE" and got "FALSE" - PASS 0ms Test for NULL. ISNULL - Expected NULL and got "" - ---- Test Case: COMPARE_QUERIES Bad Query Test 1 - PASS 3ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - PASS 0ms temp_rec.last_details value. ISNOTNULL - Expected NOT NULL and got "ORA-06550: line 2, column 60:\nPL/SQL: ORA-00942: table or view does not exist\nORA-06550: line 2, column 18:\nPL/SQL: SQL Statement ignored\nORA-06550: line 2, column 11:\nPLS-00341: declaration of cursor 'CUR' is incomplete or malformed\nORA-06550: line 3, column 8:\nPL/SQL: Item ignored\nORA-06550: line 6, column 19:\nPLS-00320: the declaration of the type of this expression is incomplete or malformed\nORA-06550: line 6, column 4:\nPL/SQL: SQL Statement ignored\nFAILURE of Compare Query: with check_query as (select bogus123 from bogus456), against_query as (select bogus987 from bogus654), q1 as (select * from check_query MINUS select * from against_query), q2 as (select * from against_query MINUS select * from check_query) select * from q1 UNION select * from q2;" - PASS 1ms temp_rec.last_details. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: COMPARE_QUERIES Bad Query Test 2 - PASS 291ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - PASS 0ms temp_rec.last_details value. ISNOTNULL - Expected NOT NULL and got "Comparison Query: with check_query as (select table_name from user_tables), against_query as (select tablespace_name from user_tables), q1 as (select * from check_query MINUS select * from against_query), q2 as (select * from against_query MINUS select * from check_query) select * from q1 UNION select * from q2" - PASS 0ms temp_rec.last_details. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: NLS Settings - PASS 0ms get_NLS_DATE_FORMAT 1. EQ - Expected "DD-MON-YYYY" and got "DD-MON-YYYY" - PASS 0ms get_NLS_DATE_FORMAT 2. EQ - Expected "DD-MON-YYYY HH24:MI:SS" and got "DD-MON-YYYY HH24:MI:SS" - PASS 1ms get_NLS_TIMESTAMP_FORMAT 2. EQ - Expected "DD-MON-YYYY" and got "DD-MON-YYYY" - PASS 0ms get_NLS_TIMESTAMP_FORMAT 2. EQ - Expected "DD-MON-YYYY HH24:MI:SS.FF6" and got "DD-MON-YYYY HH24:MI:SS.FF6" - PASS 1ms get_NLS_TIMESTAMP_TZ_FORMAT 2. EQ - Expected "DD-MON-YYYY" and got "DD-MON-YYYY" - PASS 0ms get_NLS_TIMESTAMP_TZ_FORMAT 2. EQ - Expected "DD-MON-YYYY HH24:MI:SS.FF6 TZH:TZM" and got "DD-MON-YYYY HH24:MI:SS.FF6 TZH:TZM" - ---- Test Case: Last Values Tests - PASS 0ms Last Pass. EQ - Expected "TRUE" and got "TRUE" - PASS 0ms Last Assert. EQ - Expected "EQ" and got "EQ" - PASS 0ms Last MSG. EQ - Expected "Last Assert" and got "Last Assert" - PASS 0ms Last Details. EQ - Expected "Expected "Last Assert" and got "Last Assert"" and got "Expected "Last Assert" and got "Last Assert"" - ---- Test Case: RESET_GLOBALS - PASS 0ms temp_testcase. ISNULL - Expected NULL and got "" - PASS 0ms temp_rec.last_pass. ISNULL - Expected NULL and got "" - PASS 0ms temp_rec.raise_exception. EQ - Expected "FALSE" and got "FALSE" - PASS 0ms temp_rec.last_assert. ISNULL - Expected NULL and got "" - PASS 1ms temp_rec.last_msg. ISNULL - Expected NULL and got "" - PASS 0ms temp_rec.last_details. ISNULL - Expected NULL and got "" - ---- Test Case: This Happy Path - PASS 0ms Run Test. THIS - Expected "TRUE" and got "TRUE" - PASS 0ms temp_rec.last_pass. EQ - Expected "TRUE" and got "TRUE" - PASS 0ms temp_rec.last_assert. EQ - Expected "THIS" and got "THIS" - PASS 0ms temp_rec.last_msg. EQ - Expected "Run Test" and got "Run Test" - PASS 0ms temp_rec.last_details. EQ - Expected "Expected "TRUE" and got "TRUE"" and got "Expected "TRUE" and got "TRUE"" - ---- Test Case: This Sad Path 1 - PASS 0ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - ---- Test Case: This Sad Path 2 - PASS 0ms RAISE_EXC_IN Test, Exception Raised?. EQ - Expected "TRUE" and got "TRUE" - PASS 0ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - ---- Test Case: This Sad Path 3 - PASS 0ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - ---- Test Case: EQ VARCHAR2 Happy Path 1 - PASS 0ms Run Test. EQ - Expected "X" and got "X" - PASS 0ms temp_rec.last_pass value. ISNOTNULL - Expected NOT NULL and got "TRUE" - PASS 0ms temp_rec.last_pass. THIS - Expected "TRUE" and got "TRUE" - PASS 0ms temp_rec.last_assert value. ISNOTNULL - Expected NOT NULL and got "EQ" - PASS 1ms temp_rec.last_assert. THIS - Expected "TRUE" and got "TRUE" - PASS 0ms temp_rec.last_msg value. ISNOTNULL - Expected NOT NULL and got "Run Test" - PASS 0ms temp_rec.last_msg. THIS - Expected "TRUE" and got "TRUE" - PASS 0ms temp_rec.last_details value. ISNOTNULL - Expected NOT NULL and got "Expected "X" and got "X"" - PASS 0ms temp_rec.last_details. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ VARCHAR2 Happy Path 2 - PASS 0ms Run Test. EQ - Expected "X" and got "X" - ---- Test Case: EQ VARCHAR2 Happy Path 3 - PASS 0ms Run Test. EQ - Expected "" and got "" - ---- Test Case: EQ VARCHAR2 Sad Path 1 - PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "X" - PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "Y" - PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ VARCHAR2 Sad Path 2 - PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - PASS 0ms RAISE_EXC_IN Test, Exception Raised?. EQ - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ VARCHAR2 Sad Path 3 - PASS 0ms check_this_in value. ISNULL - Expected NULL and got "" - PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "Y" - PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ VARCHAR2 Sad Path 4 - PASS 0ms check_this_in value. ISNULL - Expected NULL and got "" - PASS 0ms against_this_in value. ISNULL - Expected NULL and got "" - PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ VARCHAR2 Sad Path 5 - PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "X" - PASS 1ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "Y" - PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ VARCHAR2 Sad Path 6 - PASS 0ms check_this_in value. ISNULL - Expected NULL and got "" - PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "Y" - PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ ROWID Happy Path 1 - PASS 0ms Run Test. EQ - Expected "AAAFd1AAFAAAABSAA/" and got "AAAFd1AAFAAAABSAA/" - ---- Test Case: EQ ROWID Sad Path 1 - PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "AAAFd1AAFAAAABSAA/" - PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "AAAFd1AAFAAAABSAB/" - PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ LONG Happy Path 1 - PASS 0ms Run Test. EQ - Expected "0123456789ABCDEF0123456789ABCDEF" and got "0123456789ABCDEF0123456789ABCDEF" - ---- Test Case: EQ LONG Sad Path 1 - PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "0123456789ABCDEF0123456789ABCDEF" - PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "FEDCBA9876543210FEDCBA9876543210" - PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ RAW Happy Path 1 - PASS 0ms Run Test. EQ - Expected "2345" and got "2345" - ---- Test Case: EQ RAW Sad Path 1 - PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "2345" - PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "6789" - PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ LANG RAW Happy Path 1 - PASS 0ms Run Test. EQ - Expected "0123456789ABCDEF0123456789ABCDEF" and got "0123456789ABCDEF0123456789ABCDEF" - ---- Test Case: EQ LONG RAW Sad Path 1 - PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "0123456789ABCDEF0123456789ABCDEF" - PASS 1ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "FEDCBA9876543210FEDCBA9876543210" - PASS 0ms Sad Path 1. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ NVARCHAR2 Happy Path 1 - PASS 0ms Run Test. EQ - Expected "NCHAR1" and got "NCHAR1" - ---- Test Case: EQ NVARCHAR2 Sad Path 1 - PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "NCHAR1" - PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "NCHAR2" - PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ BOOLEAN Happy Path 1 - PASS 0ms Run Test. EQ - Expected "FALSE" and got "FALSE" - ---- Test Case: EQ BOOLEAN Happy Path 2 - PASS 0ms Run Test. EQ - Expected "FALSE" and got "FALSE" - ---- Test Case: EQ BOOLEAN Happy Path 3 - PASS 0ms Run Test. EQ - Expected "" and got "" - ---- Test Case: EQ BOOLEAN Happy Sad 1 - PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "FALSE" - PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "TRUE" - PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ BOOLEAN Happy Sad 2 - PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "FALSE" - PASS 0ms against_this_in value. ISNULL - Expected NULL and got "" - PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ BOOLEAN Happy Sad 3 - PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "FALSE" - PASS 1ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "TRUE" - PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ BOOLEAN Happy Sad 4 - PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "FALSE" - PASS 0ms against_this_in value. ISNULL - Expected NULL and got "" - PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ NUMBER Happy Path 1 - PASS 0ms Run Test. EQ - Expected "4" and got "4" - ---- Test Case: EQ NUMBER Happy Path 2 - PASS 0ms Run Test. EQ - Expected "9876543210987654321098765432109876543210" and got "9876543210987654321098765432109876543210" - ---- Test Case: EQ NUMBER Happy Path 1 - PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "4" - PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "5" - PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ PLS_INTEGER Happy Path 1 - PASS 0ms Run Test. EQ - Expected "2" and got "2" - ---- Test Case: EQ PLS_INTEGER Sad Path 1 - PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "2" - PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "3" - PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ DATE Happy Path 1 - PASS 0ms Run Test. EQ - Expected "29-JUN-2018 15:21:58" and got "29-JUN-2018 15:21:58" - ---- Test Case: EQ DATE Sad Path 1 - PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "29-JUN-2018 15:21:58" - PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "29-JUN-2018 16:21:58" - PASS 2ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ TIMSETAMP Happy Path 1 - PASS 0ms EQ TIMSETAMP Happy Path 1. EQ - Expected "29-JUN-2018 15:21:58.278000" and got "29-JUN-2018 15:21:58.278000" - ---- Test Case: EQ TIMSETAMP Sad Path 1 - PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "29-JUN-2018 15:21:58.278000" - PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "29-JUN-2018 16:21:58" - PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ TIMSETAMP WITH LOCAL TIME ZONE Happy Path 1 - PASS 0ms Run Test. EQ - Expected "29-JUN-2018 15:21:58.278000 -05:00" and got "29-JUN-2018 15:21:58.278000 -05:00" - ---- Test Case: EQ TIMSETAMP WITH LOCAL TIME ZONE Sad Path 1 - PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "29-JUN-2018 15:21:58.278000" - PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "29-JUN-2018 16:21:58" - PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ TIMSETAMP WITH TIME ZONE Happy Path 1 - PASS 0ms Run Test. EQ - Expected "29-JUN-2018 15:21:58.278000 -05:00" and got "29-JUN-2018 15:21:58.278000 -05:00" - ---- Test Case: EQ TIMSETAMP WITH TIME ZONE Sad Path 1 - PASS 1ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "29-JUN-2018 15:21:58.278000 -05:00" - PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "29-JUN-2018 16:21:58" - PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ INTERVAL DAY TO SECOND Happy Path 1 - PASS 0ms Run Test. EQ - Expected "+01 01:01:01.001000" and got "+01 01:01:01.001000" - ---- Test Case: EQ INTERVAL DAY TO SECOND Sad Path 1 - PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "+01 01:01:01.001000" - PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "+02 02:02:02.002000" - PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ INTERVAL YEAR TO MONTH Happy Path 1 - PASS 0ms Run Test. EQ - Expected "+01-01" and got "+01-01" - ---- Test Case: EQ INTERVAL YEAR TO MONTH Sad Path 1 - PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "+01-01" - PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "+02-02" - PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ XMLTYPE Happy Path 1 - PASS 58ms Run Test. EQ - Expected "\n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n " and got "\n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n " - PASS 1ms temp_rec.last_pass value. ISNOTNULL - Expected NOT NULL and got "TRUE" - PASS 0ms temp_rec.last_pass. THIS - Expected "TRUE" and got "TRUE" - PASS 0ms g_rec.last_assert value. ISNOTNULL - Expected NOT NULL and got "EQ" - PASS 0ms temp_rec.last_assert. THIS - Expected "TRUE" and got "TRUE" - PASS 0ms temp_rec.last_msg value. ISNOTNULL - Expected NOT NULL and got "Run Test" - PASS 0ms temp_rec.last_msg. THIS - Expected "TRUE" and got "TRUE" - PASS 0ms temp_rec.last_details value. ISNOTNULL - Expected NOT NULL and got "Expected "\n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n " and got "\n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n 2016-02-16 13:10:02\n \n \n \n \n 1625\n DOLF072J11595\n 0\n 0\n \n \n 4730\n GS35F4543G\n 0\n \n \n \n 2007-05-04 00:00:00\n 20 -07-04-15 00:00:00\n 2008-04-14 00:00:002" - PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ XMLTYPE Sad Path 2 - PASS 21ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE" - PASS 0ms RAISE_EXC_IN Test, Exception Raised?. EQ - Expected "TRUE" and got "TRUE" - ---- Test Case: EQ CLOB Happy Path 1 - PASS 3ms Run Test. EQ - Expected "\n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n 2016-02-16 13:10:02\n \n \n \n \n 1625\n DOLF072J11595\n 0\n 0\n \n 4730\n GS35F4543G\n 0\n \n 2007-05-04 00:00:00\n 2007-04-15 0 -0:00:00\n 2008-04-14 00:00:00\n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n 2016-02-16 13:10:02\n \n \n \n \n 1625\n DOLF072J11595\n 0\n 0\n \n 4730\n GS35F4543G\n 0\n \n 2007-05-04 00:00:00\n 2007-04-15 0 -0:00:00\n 2008-04-14 00:00:00\n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n 2016-02-16 13:10:02\n \n \n \n \n 1625\n DOLF072J11595\n 0\n 0\n \n 4730\n GS35F4543G\n 0\n \n 2007-05-04 00:00:00\n 2007-04-15 0 -0:00:00\n 2008-04-14 00:00:00\n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n 2016-02-16 13:10:02\n \n \n \n \n 1625\n DOLF072J11595\n 0\n 0\n \n 4730\n GS35F4543G\n 0\n \n 2007-05-04 00:00:00\n 2007-04-15 0 -0:00:00\n 2008-04-14 00:00:00\n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n 2016-02-16 13:10:02\n \n \n \n \n 1625\n DOLF072J11595\n 0\n 0\n \n 4730\n GS35F4543G\n 0\n \n 2007-05-04 00:00:00\n 2007-04-15 0 -0:00:00\n 2008-04-14 00:00:00\n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n 2016-02-16 13:10:02\n \n \n \n \n 1625\n DOLF072J11595\n 0\n 0\n \n 4730\n GS35F4543G\n 0\n \n 2007-05-04 00:00:00\n 2007-04-15 0 -0:00:00\n 2008-04-14 00:00:00\n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n 2016-02-16 13:10:02\n \n \n \n \n 1625\n DOLF072J11595\n 0\n 0\n \n 4730\n GS35F4543G\n 0\n \n 2007-05-04 00:00:00\n 2007-04-15 00:00:00\n 2008-04-14 00:00:00\n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n 2016-02-16 13:10:02\n \n \n \n \n 1625\n DOLF072J11595\n 0\n 0\n \n 4730\n GS35F4543G\n 0\n \n 2007-05-04 00:00:00\n - 2007-04-15 00:00:00\n 2008-04-1" - PASS 0ms temp_rec.last_details. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: ISNOTNULL CLOB Sad Path 1 - PASS 1ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - ---- Test Case: ISNOTNULL CLOB Sad Path 2 - PASS 1ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - PASS 0ms RAISE_EXC_IN Test, Exception Raised?. EQ - Expected "TRUE" and got "TRUE" - ---- Test Case: ISNOTNULL BLOB Happy Path 1 - PASS 0ms Run Test. ISNOTNULL - BLOB is NOT NULL - PASS 0ms temp_rec.last_pass. EQ - Expected "TRUE" and got "TRUE" - PASS 0ms temp_rec.last_assert. EQ - Expected "ISNOTNULL" and got "ISNOTNULL" - PASS 0ms temp_rec.last_msg. EQ - Expected "Run Test" and got "Run Test" - PASS 0ms temp_rec.last_details. EQ - Expected "BLOB is NOT NULL" and got "BLOB is NOT NULL" - ---- Test Case: ISNOTNULL BLOB Sad Path 1 - PASS 0ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - ---- Test Case: ISNOTNULL BLOB Sad Path 2 - PASS 0ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - PASS 0ms RAISE_EXC_IN Test, Exception Raised?. EQ - Expected "TRUE" and got "TRUE" - ---- Test Case: ISNULL VARCHAR2 Happy Path 1 - PASS 0ms Run Test. ISNULL - Expected NULL and got "" - PASS 0ms temp_rec.last_pass. EQ - Expected "TRUE" and got "TRUE" - PASS 0ms temp_rec.last_assert. EQ - Expected "ISNULL" and got "ISNULL" - PASS 0ms temp_rec.last_msg. EQ - Expected "Run Test" and got "Run Test" - PASS 0ms temp_rec.last_details. EQ - Expected "Expected NULL and got """ and got "Expected NULL and got """ - ---- Test Case: ISNULL VARCHAR2 Sad Path 1 - PASS 1ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - ---- Test Case: ISNULL VARCHAR2 Sad Path 2 - PASS 0ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - PASS 0ms RAISE_EXC_IN Test, Exception Raised?. EQ - Expected "TRUE" and got "TRUE" - ---- Test Case: ISNULL BOOLEAN Happy Path 1 - PASS 0ms Run Test. ISNULL - Expected NULL and got "" - ---- Test Case: ISNULL BOOLEAN Sad Path 1 - PASS 0ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - ---- Test Case: ISNULL BOOLEAN Sad Path 2 - PASS 0ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - PASS 0ms RAISE_EXC_IN Test, Exception Raised?. EQ - Expected "TRUE" and got "TRUE" - ---- Test Case: ISNULL CLOB Happy Path 1 - PASS 1ms Run Test. ISNULL - Expected NULL and got "" - PASS 0ms temp_rec.last_pass. EQ - Expected "TRUE" and got "TRUE" - PASS 0ms temp_rec.last_assert. EQ - Expected "ISNULL" and got "ISNULL" - PASS 0ms temp_rec.last_msg. EQ - Expected "Run Test" and got "Run Test" - PASS 0ms temp_rec.last_details. EQ - Expected "Expected NULL and got """ and got "Expected NULL and got """ - ---- Test Case: ISNULL CLOB Sad Path 1 - PASS 2ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - ---- Test Case: ISNULL CLOB Sad Path 2 - PASS 2ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - PASS 0ms RAISE_EXC_IN Test, Exception Raised?. EQ - Expected "TRUE" and got "TRUE" - ---- Test Case: ISNULL BLOB Happy Path 1 - PASS 0ms Run Test. ISNULL - BLOB is NULL - PASS 0ms temp_rec.last_pass. EQ - Expected "TRUE" and got "TRUE" - PASS 0ms temp_rec.last_assert. EQ - Expected "ISNULL" and got "ISNULL" - PASS 0ms temp_rec.last_msg. EQ - Expected "Run Test" and got "Run Test" - PASS 0ms temp_rec.last_details. EQ - Expected "BLOB is NULL" and got "BLOB is NULL" - ---- Test Case: ISNULL BLOB Sad Path 1 - PASS 0ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - ---- Test Case: ISNULL BLOB Sad Path 2 - PASS 0ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - PASS 0ms RAISE_EXC_IN Test, Exception Raised?. EQ - Expected "TRUE" and got "TRUE" - ---- Test Case: Raises Tests Happy Path 1 - PASS 2ms RAISES Varchar2 Test. RAISES/THROWS - Expected exception "%PLS-00302: component 'BOGUS' must be declared%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;". - PASS 0ms temp_rec.last_pass. EQ - Expected "TRUE" and got "TRUE" - PASS 0ms temp_rec.last_assert. EQ - Expected "RAISES/THROWS" and got "RAISES/THROWS" - PASS 0ms temp_rec.last_msg. EQ - Expected "RAISES Varchar2 Test" and got "RAISES Varchar2 Test" - PASS 0ms temp_rec.last_details. EQ - Expected "Expected exception "%PLS-00302: component 'BOGUS' must be declared%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;"." and got "Expected exception "%PLS-00302: component 'BOGUS' must be declared%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;"." - ---- Test Case: Raises Tests Happy Path 2 - PASS 1ms RAISES Number Test. RAISES/THROWS - Expected exception "%-00302%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;". - PASS 0ms temp_rec.last_details value. EQ - Expected "Expected exception "%-00302%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;"." and got "Expected exception "%-00302%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;"." - PASS 1ms THROWS Varchar2 Test. RAISES/THROWS - Expected exception "%PLS-00302: component 'BOGUS' must be declared%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;". - PASS 0ms temp_rec.last_details value. EQ - Expected "Expected exception "%PLS-00302: component 'BOGUS' must be declared%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;"." and got "Expected exception "%PLS-00302: component 'BOGUS' must be declared%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;"." - PASS 1ms THROWS Number Test. RAISES/THROWS - Expected exception "%-00302%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;". - PASS 0ms temp_rec.last_details value. EQ - Expected "Expected exception "%-00302%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;"." and got "Expected exception "%-00302%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;"." - ---- Test Case: Raises Tests Happy Path 3 - PASS 2ms RAISES Varchar2 No Error. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;". - PASS 0ms temp_rec.last_details value. EQ - Expected "No exception was expected. Exception raised was "". Exception raised by: "begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;"." and got "No exception was expected. Exception raised was "". Exception raised by: "begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;"." - PASS 0ms RAISES Number No Error. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;". - PASS 0ms temp_rec.last_details value. EQ - Expected "No exception was expected. Exception raised was "". Exception raised by: "begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;"." and got "No exception was expected. Exception raised was "". Exception raised by: "begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;"." - ---- Test Case: Raises Tests Sad Path 1 - PASS 2ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - PASS 0ms temp_rec.last_details value. ISNOTNULL - Expected NOT NULL and got "Expected exception "%Incorrect Exception%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;". Error Stack: ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored\nORA-06512: at "WTP.WT_ASSERT", line 2326\n" - PASS 0ms temp_rec.last_details. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: Raises Tests Sad Path 2 - PASS 1ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - PASS 0ms temp_rec.last_details. EQ - Expected "Expected exception "%Incorrect Exception%". No exception was raised by: "begin wt_assert.set_NLS_DATE_FORMAT; end;". Error Stack: " and got "Expected exception "%Incorrect Exception%". No exception was raised by: "begin wt_assert.set_NLS_DATE_FORMAT; end;". Error Stack: " - ---- Test Case: EQQUERYVALUE VARCHAR2 Happy Path 1 - PASS 0ms Run Test. EQQUERYVALUE - Expected "X" and got "X" for Query: select dummy from DUAL - PASS 1ms temp_rec.last_pass. EQ - Expected "TRUE" and got "TRUE" - PASS 0ms temp_rec.last_assert. EQ - Expected "EQQUERYVALUE" and got "EQQUERYVALUE" - PASS 0ms temp_rec.last_msg. EQ - Expected "Run Test" and got "Run Test" - PASS 0ms temp_rec.last_details. EQ - Expected "Expected "X" and got "X" for Query: select dummy from DUAL" and got "Expected "X" and got "X" for Query: select dummy from DUAL" - ---- Test Case: EQQUERYVALUE VARCHAR2 Happy Path 2 - PASS 0ms Run Test. EQQUERYVALUE - Expected "" and got "" for Query: select max(dummy) from DUAL where 0 = 1 - ---- Test Case: EQQUERYVALUE VARCHAR2 Sad Path 1 - PASS 0ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - ---- Test Case: EQQUERYVALUE VARCHAR2 Sad Path 2 - PASS 1ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - PASS 0ms RAISE_EXC_IN Test, Exception Raised?. EQ - Expected "TRUE" and got "TRUE" - ---- Test Case: EQQUERYVALUE VARCHAR2 Sad Path 3 - PASS 0ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - PASS 0ms temp_rec.last_details. ISNOTNULL - Expected NOT NULL and got "Exception raised for Query: Garbage query that won't work\nORA-00900: invalid SQL statement\nORA-06512: at "WTP.WT_ASSERT", line 2586\n" - PASS 0ms temp_rec.last_details value. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQQUERYVALUE XMLTYPE Happy Path 1 - PASS 67ms Run Test. EQQUERYVALUE - Expected "\n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n " and got "\n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n " for Query: select temp_xml from wt_self_test where id = 1 - PASS 1ms temp_rec.last_pass. EQ - Expected "TRUE" and got "TRUE" - PASS 0ms temp_rec.last_assert. EQ - Expected "EQQUERYVALUE" and got "EQQUERYVALUE" - PASS 0ms temp_rec.last_msg. EQ - Expected "Run Test" and got "Run Test" - PASS 0ms temp_rec.last_details value. ISNOTNULL - Expected NOT NULL and got "Expected "\n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n " and got "\n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n 2" and got "\n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n " for Query: select temp_xml from wt_self_test where id = 1" - PASS 0ms temp_rec.last_details. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQQUERYVALUE XMLTYPE Sad Path 2 - PASS 20ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - PASS 1ms RAISE_EXC_IN Test, Exception Raised?. EQ - Expected "TRUE" and got "TRUE" - ---- Test Case: EQQUERYVALUE XMLTYPE Sad Path 3 - PASS 0ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE" - PASS 0ms temp_rec.last_details. ISNOTNULL - Expected NOT NULL and got "Exception raised for Query: Garbage query that won't work\nORA-00900: invalid SQL statement\nORA-06512: at "WTP.WT_ASSERT", line 2624\n" - PASS 1ms temp_rec.last_details value. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: EQQUERYVALUE CLOB Happy Path 1 - PASS 13ms Run Test. EQQUERYVALUE - Expected "\n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n \n\n FPDS-NG search results for<![CDATA[: pl/sql]]>\n \n \n \n \n \n \n \n \n <![CDATA[New DELIVERY ORDER DOLF072J11595 awarded to DLT SOLUTIONS INCORPORATED for the amount of $12,638.59]]>\n 2'); - 34 IGNR 0 0 0 0 temp_pint1 CONSTANT pls_integer := 2; - 35 IGNR 0 0 0 0 temp_pint2 CONSTANT pls_integer := 3; - 36 IGNR 0 0 0 0 temp_date CONSTANT date := sysdate; - 37 IGNR 0 0 0 0 temp_tstmp CONSTANT timestamp := systimestamp; - 38 IGNR 0 0 0 0 temp_tstlzn CONSTANT timestamp with local time zone := systimestamp; - 39 IGNR 0 0 0 0 temp_tstzn CONSTANT timestamp with time zone := systimestamp; - 40 IGNR 0 0 0 0 temp_intds1 CONSTANT interval day to second := interval '+01 01:01:01.001' day to second; - 41 IGNR 0 0 0 0 temp_intds2 CONSTANT interval day to second := interval '+02 02:02:02.002' day to second; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 42 IGNR 0 0 0 0 temp_intym1 CONSTANT interval year to month := interval '+01-01' year to month; - 43 IGNR 0 0 0 0 temp_intym2 CONSTANT interval year to month := interval '+02-02' year to month; - 47 IGNR 0 0 0 0 wtplsql_skip_save boolean := FALSE; - 55 UNKN 0 89 0 31 function boolean_to_status - 60 EXEC 298 42 0 4 if in_boolean is null - 62 EXEC 12 0 0 0 return ''; - 63 EXEC 286 47 0 1 elsif in_boolean - 65 EXEC 169 38 1 5 return 'TRUE'; - 67 EXEC 117 36 0 2 return 'FALSE'; - 68 EXEC 298 43 0 2 end boolean_to_status; - 72 IGNR 0 5 5 5 procedure t_boolean_to_status - 75 IGNR 1 2 2 2 wt_assert.g_testcase := 'BOOLEAN_TO_STATUS'; - 77 IGNR 1 0 0 0 wt_assert.eq - 81 IGNR 1 1 0 1 wt_assert.eq - 86 IGNR 1 1 1 1 wt_assert.isnull - 89 IGNR 1 0 0 0 end t_boolean_to_status; - 94 UNKN 0 465 1 7 procedure process_assertion - 99 IGNR 493 98 0 1 if not wtplsql_skip_save then - 101 EXEC 404 159 0 4 wt_result.save - 103 UNKN 0 499 1 6 ,in_status => case g_rec.last_pass - 104 UNKN 0 83 0 1 when TRUE then C_PASS - 114 EXEC 493 118 0 1 if g_rec.raise_exception and not g_rec.last_pass - 116 EXEC 28 1781 1 171 raise_application_error(-20003, wt_text_report.format_test_result - 124 UNKN 0 113 0 3 end process_assertion; - 128 IGNR 0 0 0 0 procedure t_process_assertion -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 132 IGNR 1 1 1 1 g_testcase := 'PROCESS_ASSERTION'; - 133 IGNR 1 0 0 0 g_rec.last_assert := 'THIS'; - 134 IGNR 1 0 0 0 g_rec.last_pass := FALSE; - 135 IGNR 1 1 1 1 g_rec.last_details := 'Expected "PASS" and got "FAIL"'; - 136 IGNR 1 0 0 0 g_rec.last_msg := 'Process Assertion Forced Failure'; - 137 IGNR 1 0 0 0 g_rec.raise_exception := TRUE; - 138 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 139 IGNR 1 0 0 0 process_assertion; -- Should throw exception - 140 IGNR 0 0 0 0 wtplsql_skip_save := FALSE; - 143 IGNR 1 0 0 0 when ASSERT_FAILURE_EXCEPTION then - 144 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 145 IGNR 1 1 0 1 end t_process_assertion; - 150 EXEC 11 18 0 2 procedure compare_queries ( - 159 EXEC 11 20 1 3 l_qry_txt := 'with check_query as (' || check_query_in || - 168 EXEC 11 14 1 3 l_exec_txt := - 181 EXEC 11 11514 69 3349 execute immediate l_exec_txt using out l_ret_txt; - 182 EXEC 8 12 1 3 if l_ret_txt = 'FOUND' - 184 EXEC 5 8 1 2 g_rec.last_pass := FALSE; -- Some Difference Found - 186 EXEC 3 6 2 2 g_rec.last_pass := TRUE; -- Nothing found, queries match - 189 EXEC 8 96 4 61 g_rec.last_details := 'Comparison Query: ' || l_qry_txt; - 191 EXEC 3 0 0 0 when OTHERS - 193 EXEC 3 198 53 84 g_rec.last_details := SQLERRM || CHR(10) || - 195 EXEC 3 3 1 1 g_rec.last_pass := FALSE; - 196 EXEC 11 19 3 3 end compare_queries; - 200 IGNR 0 1 1 1 procedure t_compare_queries -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 204 IGNR 1 0 0 0 wt_assert.g_testcase := 'COMPARE_QUERIES Bad Query Test 1'; - 205 IGNR 1 0 0 0 compare_queries ( - 208 IGNR 1 4 4 4 temp_rec := g_rec; - 209 IGNR 1 1 1 1 wt_assert.eq ( - 214 IGNR 1 1 1 1 wt_assert.isnotnull( - 217 IGNR 1 10 10 10 wt_assert.this( - 222 IGNR 1 0 0 0 wt_assert.g_testcase := 'COMPARE_QUERIES Bad Query Test 2'; - 223 IGNR 1 0 0 0 compare_queries ( - 226 IGNR 1 5 5 5 temp_rec := g_rec; - 227 IGNR 1 1 1 1 wt_assert.eq ( - 232 IGNR 1 1 1 1 wt_assert.isnotnull( - 235 IGNR 1 6 6 6 wt_assert.this( - 240 IGNR 1 1 1 1 end t_compare_queries; - 249 UNKN 0 1 1 1 function last_pass - 253 EXEC 1 0 0 0 return g_rec.last_pass; - 254 EXEC 1 0 0 0 end last_pass; - 256 EXCL 0 0 0 0 function last_assert - 260 EXEC 1 1 1 1 return g_rec.last_assert; - 261 EXEC 1 0 0 0 end last_assert; - 263 EXCL 0 0 0 0 function last_msg - 267 EXEC 1 0 0 0 return g_rec.last_msg; - 268 EXEC 1 1 1 1 end last_msg; - 270 EXCL 0 0 0 0 function last_details - 274 EXEC 1 0 0 0 return g_rec.last_details; - 275 EXEC 1 0 0 0 end last_details; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 279 IGNR 0 1 1 1 procedure t_last_values - 283 IGNR 1 0 0 0 wt_assert.g_testcase := 'Last Values Tests'; - 284 IGNR 1 0 0 0 wt_assert.eq ( - 289 IGNR 1 0 0 0 wt_assert.eq ( - 295 IGNR 1 0 0 0 temp_rec := g_rec; - 296 IGNR 1 0 0 0 wt_assert.eq ( - 301 IGNR 1 2 1 1 wt_assert.eq ( - 306 IGNR 1 0 0 0 end t_last_values; - 311 EXCL 0 0 0 0 procedure reset_globals - 314 EXEC 1 0 0 0 g_testcase := ''; - 315 EXEC 1 0 0 0 g_rec.last_pass := NULL; - 316 EXEC 1 1 1 1 g_rec.last_assert := ''; - 317 EXEC 1 0 0 0 g_rec.last_msg := ''; - 318 EXEC 1 0 0 0 g_rec.last_details := ''; - 319 EXEC 1 0 0 0 g_rec.raise_exception := FALSE; - 320 EXEC 1 0 0 0 end reset_globals; - 324 IGNR 0 1 1 1 procedure t_reset_globals - 327 IGNR 1 0 0 0 reset_globals; -- Resets g_testcase - 328 IGNR 1 0 0 0 temp_rec := g_rec; - 329 IGNR 1 0 0 0 temp_testcase := g_testcase; - 331 IGNR 1 0 0 0 g_testcase := 'RESET_GLOBALS'; - 332 IGNR 1 0 0 0 wt_assert.isnull( - 335 IGNR 1 1 1 1 wt_assert.isnull - 339 IGNR 1 0 0 0 wt_assert.eq( - 343 IGNR 1 1 1 1 wt_assert.isnull -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 347 IGNR 1 1 1 1 wt_assert.isnull - 350 IGNR 1 0 0 0 wt_assert.isnull - 353 IGNR 1 1 1 1 end t_reset_globals; - 358 UNKN 0 6 1 2 function get_NLS_DATE_FORMAT - 363 EXEC 4 538 71 258 select value into l_format - 366 EXEC 4 6 0 3 return l_format; - 367 EXEC 4 5 1 2 end get_NLS_DATE_FORMAT; - 369 UNKN 0 6 1 2 procedure set_NLS_DATE_FORMAT - 373 EXEC 5 677 84 198 execute immediate 'alter session set NLS_DATE_FORMAT = ''' || - 375 EXEC 5 6 1 2 end set_NLS_DATE_FORMAT; - 377 UNKN 0 3 1 2 function get_NLS_TIMESTAMP_FORMAT - 382 EXEC 2 214 70 144 select value into l_format - 385 EXEC 2 2 1 1 return l_format; - 386 EXEC 2 2 1 1 end get_NLS_TIMESTAMP_FORMAT; - 388 UNKN 0 2 1 1 procedure set_NLS_TIMESTAMP_FORMAT - 392 EXEC 2 319 141 178 execute immediate 'alter session set NLS_TIMESTAMP_FORMAT = ''' || - 394 EXEC 2 0 0 0 end set_NLS_TIMESTAMP_FORMAT; - 396 UNKN 0 2 1 1 function get_NLS_TIMESTAMP_TZ_FORMAT - 401 EXEC 2 277 69 208 select value into l_format - 404 EXEC 2 2 1 1 return l_format; - 405 EXEC 2 2 1 1 end get_NLS_TIMESTAMP_TZ_FORMAT; - 407 UNKN 0 2 1 1 procedure set_NLS_TIMESTAMP_TZ_FORMAT - 411 EXEC 2 277 126 151 execute immediate 'alter session set NLS_TIMESTAMP_TZ_FORMAT = ''' || - 413 EXEC 2 2 1 1 end set_NLS_TIMESTAMP_TZ_FORMAT; - 417 IGNR 0 3 3 3 procedure t_nls_settings -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 421 IGNR 1 1 1 1 wt_assert.g_testcase := 'NLS Settings'; - 422 IGNR 1 0 0 0 set_NLS_DATE_FORMAT('DD-MON-YYYY'); - 423 IGNR 1 2 1 1 wt_assert.eq - 427 IGNR 1 0 0 0 set_NLS_DATE_FORMAT; - 429 IGNR 1 1 0 1 wt_assert.eq - 433 IGNR 1 1 1 1 set_NLS_TIMESTAMP_FORMAT('DD-MON-YYYY'); - 434 IGNR 1 0 0 0 wt_assert.eq - 438 IGNR 1 0 0 0 set_NLS_TIMESTAMP_FORMAT; - 440 IGNR 1 1 1 1 wt_assert.eq - 444 IGNR 1 0 0 0 set_NLS_TIMESTAMP_TZ_FORMAT('DD-MON-YYYY'); - 446 IGNR 1 0 0 0 wt_assert.eq - 450 IGNR 1 0 0 0 set_NLS_TIMESTAMP_TZ_FORMAT; - 451 IGNR 1 2 1 1 wt_assert.eq - 455 IGNR 1 1 1 1 end t_nls_settings; - 464 UNKN 0 61 0 3 procedure this ( - 471 EXEC 80 60 1 26 g_rec.last_assert := 'THIS'; - 472 EXEC 80 37 0 1 g_rec.last_msg := msg_in; - 473 EXEC 80 19 1 1 g_rec.last_pass := nvl(check_this_in, FALSE); - 474 EXEC 80 91 0 3 g_rec.last_details := 'Expected "TRUE" and got "' || - 476 EXEC 80 17 0 2 g_rec.raise_exception := raise_exc_in; - 477 EXEC 80 5 0 1 process_assertion; - 478 EXEC 79 16 0 1 end this; - 482 IGNR 0 1 1 1 procedure t_this - 487 IGNR 1 0 0 0 wt_assert.g_testcase := 'This Happy Path'; - 488 IGNR 1 0 0 0 wt_assert.this ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 491 IGNR 1 0 0 0 temp_rec := g_rec; - 492 IGNR 1 0 0 0 wt_assert.eq ( - 497 IGNR 1 0 0 0 wt_assert.eq ( - 501 IGNR 1 1 1 1 wt_assert.eq ( - 505 IGNR 1 0 0 0 wt_assert.eq ( - 510 IGNR 1 0 0 0 wt_assert.g_testcase := 'This Sad Path 1'; - 511 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 512 IGNR 1 1 1 1 this ( - 515 IGNR 1 2 2 2 temp_rec := g_rec; - 516 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 517 IGNR 1 0 0 0 wt_assert.eq ( - 522 IGNR 1 0 0 0 wt_assert.g_testcase := 'This Sad Path 2'; - 523 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 525 IGNR 1 0 0 0 this ( - 529 IGNR 0 0 0 0 l_found_exception := FALSE; - 530 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then - 531 IGNR 1 0 0 0 l_found_exception := TRUE; - 532 IGNR 0 1 1 1 end; - 534 IGNR 1 1 1 1 temp_rec := g_rec; - 535 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 536 IGNR 1 0 0 0 wt_assert.eq ( - 540 IGNR 1 0 0 0 wt_assert.eq ( - 545 IGNR 1 0 0 0 wt_assert.g_testcase := 'This Sad Path 3'; - 546 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 547 IGNR 1 0 0 0 this ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 550 IGNR 1 1 1 1 temp_rec := g_rec; - 551 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 552 IGNR 1 0 0 0 wt_assert.eq ( - 556 IGNR 1 1 1 1 end t_this; - 562 UNKN 0 176 1 35 procedure eq ( - 570 EXEC 199 67 0 1 g_rec.last_assert := 'EQ'; - 571 EXEC 199 58 1 1 g_rec.last_msg := msg_in; - 572 EXEC 199 211 0 10 g_rec.last_pass := ( nvl(check_this_in = against_this_in, false) - 573 UNKN 0 14 0 2 or ( check_this_in is null - 577 EXEC 199 435 1 103 g_rec.last_details := 'Expected "' || substr(against_this_in,1,1000) || - 580 EXEC 199 27 1 1 g_rec.raise_exception := raise_exc_in; - 581 EXEC 199 29 0 1 process_assertion; - 582 EXEC 198 42 1 1 end eq; - 585 UNKN 0 80 1 4 procedure eq ( - 593 EXEC 98 69 0 1 eq (msg_in => msg_in - 598 EXEC 98 16 0 1 end eq; - 601 UNKN 0 28 6 12 procedure eq ( - 609 EXEC 3 1 1 1 g_rec.last_assert := 'EQ'; - 610 EXEC 3 1 1 1 g_rec.last_msg := msg_in; - 611 EXEC 3 52471 1 37004 g_rec.last_pass := (xmltype.getclobval(check_this_in) = - 613 EXEC 3 36668 4 11763 g_rec.last_details := 'Expected "' || substr(xmltype.getclobval(against_this_in),1,1000) || - 616 EXEC 3 4 1 2 g_rec.raise_exception := raise_exc_in; - 617 EXEC 3 4 1 2 process_assertion; - 618 EXEC 2 175 58 117 end eq; - 621 UNKN 0 362 5 157 procedure eq ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 629 EXEC 14 18 1 3 g_rec.last_assert := 'EQ'; - 630 EXEC 14 8 1 1 g_rec.last_msg := msg_in; - 631 EXEC 14 4133 0 1644 g_rec.last_pass := ( nvl(check_this_in = against_this_in, false) - 632 UNKN 0 20 1 3 or ( check_this_in is null - 636 EXEC 14 24392 601 3388 g_rec.last_details := 'Expected "' || substr(against_this_in,1,1000) || - 639 EXEC 14 12 2 2 g_rec.raise_exception := raise_exc_in; - 640 EXEC 14 9 1 2 process_assertion; - 641 EXEC 12 919 62 113 end eq; - 644 UNKN 0 6 1 2 procedure eq ( - 653 EXEC 7 42 0 39 g_rec.last_assert := 'EQ'; - 654 EXEC 7 1 0 1 g_rec.last_msg := msg_in; - 655 EXEC 7 74 0 64 compare_results := nvl(DBMS_LOB.COMPARE(check_this_in, against_this_in),-1); - 656 EXEC 7 38 1 32 g_rec.last_pass := ( (compare_results = 0) - 657 UNKN 0 5 0 2 or ( check_this_in is null - 661 EXEC 7 16 1 4 g_rec.last_details := 'DBMS_LOB.COMPARE on BLOBs, compare_results: ' || compare_results; - 662 EXEC 7 1 0 1 g_rec.raise_exception := raise_exc_in; - 663 EXEC 7 0 0 0 process_assertion; - 664 EXEC 6 0 0 0 end eq; - 672 IGNR 0 21 21 21 procedure t_eq - 677 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ VARCHAR2 Happy Path 1'; - 678 IGNR 1 1 1 1 eq ( - 682 IGNR 1 0 0 0 temp_rec := g_rec; - 684 IGNR 1 1 1 1 wt_assert.isnotnull ( - 687 IGNR 1 1 1 1 wt_assert.this ( - 691 IGNR 1 0 0 0 wt_assert.isnotnull ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 694 IGNR 1 0 0 0 wt_assert.this ( - 698 IGNR 1 0 0 0 wt_assert.isnotnull ( - 701 IGNR 1 0 0 0 wt_assert.this ( - 705 IGNR 1 1 1 1 wt_assert.isnotnull ( - 708 IGNR 1 1 1 1 wt_assert.this ( - 712 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ VARCHAR2 Happy Path 2'; - 713 IGNR 1 0 0 0 eq ( - 718 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ VARCHAR2 Happy Path 3'; - 719 IGNR 1 0 0 0 eq ( - 725 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 1'; - 726 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 727 IGNR 1 0 0 0 eq ( - 731 IGNR 1 1 1 1 wtplsql_skip_save := FALSE; - 732 IGNR 1 1 1 1 temp_rec := g_rec; - 734 IGNR 1 0 0 0 wt_assert.isnotnull ( - 737 IGNR 1 0 0 0 wt_assert.isnotnull ( - 740 IGNR 1 0 0 0 wt_assert.this ( - 744 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 2'; - 745 IGNR 1 1 1 1 wtplsql_skip_save := TRUE; - 747 IGNR 1 0 0 0 eq ( - 752 IGNR 0 0 0 0 l_found_exception := FALSE; - 753 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then - 754 IGNR 1 0 0 0 l_found_exception := TRUE; - 755 IGNR 0 1 1 1 end; - 757 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 758 IGNR 1 0 0 0 temp_rec := g_rec; - 759 IGNR 1 0 0 0 wt_assert.this ( - 762 IGNR 1 0 0 0 wt_assert.eq ( - 767 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 3'; - 768 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 769 IGNR 1 0 0 0 eq ( - 773 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 774 IGNR 1 1 1 1 temp_rec := g_rec; - 776 IGNR 1 0 0 0 wt_assert.isnull ( - 779 IGNR 1 0 0 0 wt_assert.isnotnull ( - 782 IGNR 1 0 0 0 wt_assert.this ( - 786 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 4'; - 787 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 788 IGNR 1 0 0 0 eq ( - 792 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 793 IGNR 1 1 1 1 temp_rec := g_rec; - 795 IGNR 1 0 0 0 wt_assert.isnull ( - 798 IGNR 1 0 0 0 wt_assert.isnull ( - 801 IGNR 1 0 0 0 wt_assert.this ( - 805 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 5'; - 806 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 807 IGNR 1 0 0 0 eq ( - 812 IGNR 1 1 1 1 wtplsql_skip_save := FALSE; - 813 IGNR 1 1 1 1 temp_rec := g_rec; - 815 IGNR 1 0 0 0 wt_assert.isnotnull ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 818 IGNR 1 0 0 0 wt_assert.isnotnull ( - 821 IGNR 1 0 0 0 wt_assert.this ( - 825 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 6'; - 826 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 827 IGNR 1 1 1 1 eq ( - 832 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 833 IGNR 1 1 1 1 temp_rec := g_rec; - 835 IGNR 1 0 0 0 wt_assert.isnull ( - 838 IGNR 1 0 0 0 wt_assert.isnotnull ( - 841 IGNR 1 1 1 1 wt_assert.this ( - 846 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ ROWID Happy Path 1'; - 847 IGNR 1 1 1 1 eq ( - 852 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ ROWID Sad Path 1'; - 853 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 854 IGNR 1 0 0 0 eq ( - 858 IGNR 1 1 1 1 wtplsql_skip_save := FALSE; - 859 IGNR 1 1 1 1 temp_rec := g_rec; - 861 IGNR 1 0 0 0 wt_assert.isnotnull ( - 864 IGNR 1 1 1 1 wt_assert.isnotnull ( - 867 IGNR 1 1 1 1 wt_assert.this ( - 872 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ LONG Happy Path 1'; - 873 IGNR 1 0 0 0 eq ( - 878 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ LONG Sad Path 1'; - 879 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 880 IGNR 1 0 0 0 eq ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 884 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 885 IGNR 1 1 1 1 temp_rec := g_rec; - 887 IGNR 1 0 0 0 wt_assert.isnotnull ( - 890 IGNR 1 0 0 0 wt_assert.isnotnull ( - 893 IGNR 1 1 1 1 wt_assert.this ( - 898 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ RAW Happy Path 1'; - 899 IGNR 1 1 1 1 eq ( - 904 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ RAW Sad Path 1'; - 905 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 906 IGNR 1 0 0 0 eq ( - 910 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 911 IGNR 1 1 1 1 temp_rec := g_rec; - 913 IGNR 1 1 1 1 wt_assert.isnotnull ( - 916 IGNR 1 0 0 0 wt_assert.isnotnull ( - 919 IGNR 1 1 1 1 wt_assert.this ( - 924 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ LANG RAW Happy Path 1'; - 925 IGNR 1 1 1 1 eq ( - 931 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ LANG RAW Happy Path 1'; - 932 IGNR 1 1 1 1 wtplsql_skip_save := TRUE; - 933 IGNR 1 1 1 1 eq ( - 938 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ LONG RAW Sad Path 1'; - 939 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 940 IGNR 1 0 0 0 temp_rec := g_rec; - 941 IGNR 1 0 0 0 wt_assert.isnotnull ( - 945 IGNR 1 7 7 7 wt_assert.isnotnull ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 948 IGNR 1 1 1 1 wt_assert.this ( - 953 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ NVARCHAR2 Happy Path 1'; - 954 IGNR 1 7 7 7 eq ( - 959 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ NVARCHAR2 Sad Path 1'; - 960 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 961 IGNR 1 3 3 3 eq ( - 965 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 966 IGNR 1 1 1 1 temp_rec := g_rec; - 968 IGNR 1 1 1 1 wt_assert.isnotnull ( - 971 IGNR 1 2 2 2 wt_assert.isnotnull ( - 974 IGNR 1 0 0 0 wt_assert.this ( - 978 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ BOOLEAN Happy Path 1'; - 979 IGNR 1 0 0 0 eq ( - 983 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ BOOLEAN Happy Path 2'; - 984 IGNR 1 0 0 0 eq ( - 990 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ BOOLEAN Happy Path 3'; - 991 IGNR 1 1 1 1 eq ( - 997 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 1'; - 998 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 999 IGNR 1 0 0 0 eq ( - 1003 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1004 IGNR 1 0 0 0 temp_rec := g_rec; - 1006 IGNR 1 0 0 0 wt_assert.isnotnull ( - 1009 IGNR 1 1 1 1 wt_assert.isnotnull ( - 1012 IGNR 1 1 1 1 wt_assert.this ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1016 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 2'; - 1017 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1018 IGNR 1 0 0 0 eq ( - 1022 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1023 IGNR 1 1 1 1 temp_rec := g_rec; - 1025 IGNR 1 0 0 0 wt_assert.isnotnull ( - 1028 IGNR 1 0 0 0 wt_assert.isnull ( - 1031 IGNR 1 1 1 1 wt_assert.this ( - 1035 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 3'; - 1036 IGNR 1 1 1 1 wtplsql_skip_save := TRUE; - 1037 IGNR 1 0 0 0 eq ( - 1042 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1043 IGNR 1 1 1 1 temp_rec := g_rec; - 1045 IGNR 1 0 0 0 wt_assert.isnotnull ( - 1048 IGNR 1 1 1 1 wt_assert.isnotnull ( - 1051 IGNR 1 0 0 0 wt_assert.this ( - 1055 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 4'; - 1056 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1057 IGNR 1 0 0 0 eq ( - 1062 IGNR 1 1 1 1 wtplsql_skip_save := FALSE; - 1063 IGNR 1 1 1 1 temp_rec := g_rec; - 1065 IGNR 1 1 1 1 wt_assert.isnotnull ( - 1068 IGNR 1 1 1 1 wt_assert.isnull ( - 1071 IGNR 1 0 0 0 wt_assert.this ( - 1075 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ NUMBER Happy Path 1'; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1076 IGNR 1 4 4 4 eq ( - 1080 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ NUMBER Happy Path 2'; - 1081 IGNR 1 2 2 2 eq ( - 1086 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ NUMBER Happy Path 1'; - 1087 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1088 IGNR 1 2 2 2 eq ( - 1092 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1093 IGNR 1 1 1 1 temp_rec := g_rec; - 1095 IGNR 1 1 1 1 wt_assert.isnotnull ( - 1098 IGNR 1 1 1 1 wt_assert.isnotnull ( - 1101 IGNR 1 0 0 0 wt_assert.this ( - 1106 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ PLS_INTEGER Happy Path 1'; - 1107 IGNR 1 2 2 2 eq ( - 1111 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1113 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ PLS_INTEGER Sad Path 1'; - 1114 IGNR 1 2 2 2 eq ( - 1118 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1119 IGNR 1 1 1 1 temp_rec := g_rec; - 1121 IGNR 1 0 0 0 wt_assert.isnotnull ( - 1124 IGNR 1 1 1 1 wt_assert.isnotnull ( - 1127 IGNR 1 0 0 0 wt_assert.this ( - 1131 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ DATE Happy Path 1'; - 1132 IGNR 1 12 12 12 eq ( - 1137 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ DATE Sad Path 1'; - 1138 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1139 IGNR 1 8 8 8 eq ( - 1143 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1144 IGNR 1 1 1 1 temp_rec := g_rec; - 1146 IGNR 1 1 1 1 wt_assert.isnotnull ( - 1149 IGNR 1 5 5 5 wt_assert.isnotnull ( - 1152 IGNR 1 2 2 2 wt_assert.this ( - 1157 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ TIMSETAMP Happy Path 1'; - 1158 IGNR 1 16 16 16 eq ( - 1163 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ TIMSETAMP Sad Path 1'; - 1164 IGNR 1 1 1 1 wtplsql_skip_save := TRUE; - 1165 IGNR 1 13 13 13 eq ( - 1169 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1170 IGNR 1 2 2 2 temp_rec := g_rec; - 1172 IGNR 1 2 2 2 wt_assert.isnotnull ( - 1175 IGNR 1 5 5 5 wt_assert.isnotnull ( - 1178 IGNR 1 1 1 1 wt_assert.this ( - 1183 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ TIMSETAMP WITH LOCAL TIME ZONE Happy Path 1'; - 1184 IGNR 1 5 5 5 eq ( - 1189 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ TIMSETAMP WITH LOCAL TIME ZONE Sad Path 1'; - 1190 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1191 IGNR 1 16 16 16 eq ( - 1195 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1196 IGNR 1 1 1 1 temp_rec := g_rec; - 1198 IGNR 1 4 4 4 wt_assert.isnotnull ( - 1201 IGNR 1 5 5 5 wt_assert.isnotnull ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1204 IGNR 1 1 1 1 wt_assert.this ( - 1209 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ TIMSETAMP WITH TIME ZONE Happy Path 1'; - 1210 IGNR 1 4 4 4 eq ( - 1215 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ TIMSETAMP WITH TIME ZONE Sad Path 1'; - 1216 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1217 IGNR 1 12 12 12 eq ( - 1221 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1222 IGNR 1 1 1 1 temp_rec := g_rec; - 1224 IGNR 1 2 2 2 wt_assert.isnotnull ( - 1227 IGNR 1 5 5 5 wt_assert.isnotnull ( - 1230 IGNR 1 1 1 1 wt_assert.this ( - 1235 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ INTERVAL DAY TO SECOND Happy Path 1'; - 1236 IGNR 1 4 4 4 eq ( - 1241 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ INTERVAL DAY TO SECOND Sad Path 1'; - 1242 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1243 IGNR 1 3 3 3 eq ( - 1247 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1248 IGNR 1 2 2 2 temp_rec := g_rec; - 1250 IGNR 1 2 2 2 wt_assert.isnotnull ( - 1253 IGNR 1 1 1 1 wt_assert.isnotnull ( - 1256 IGNR 1 1 1 1 wt_assert.this ( - 1261 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ INTERVAL YEAR TO MONTH Happy Path 1'; - 1262 IGNR 1 2 2 2 eq ( - 1267 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ INTERVAL YEAR TO MONTH Sad Path 1'; - 1268 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1269 IGNR 1 2 2 2 eq ( - 1273 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1274 IGNR 1 0 0 0 temp_rec := g_rec; - 1276 IGNR 1 1 1 1 wt_assert.isnotnull ( - 1279 IGNR 1 2 2 2 wt_assert.isnotnull ( - 1282 IGNR 1 0 0 0 wt_assert.this ( - 1286 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ XMLTYPE Happy Path 1'; - 1287 IGNR 1 1 1 1 eq ( - 1291 IGNR 1 5 5 5 temp_rec := g_rec; - 1293 IGNR 1 1 1 1 wt_assert.isnotnull ( - 1296 IGNR 1 1 1 1 wt_assert.this ( - 1300 IGNR 1 0 0 0 wt_assert.isnotnull ( - 1303 IGNR 1 1 1 1 wt_assert.this ( - 1307 IGNR 1 1 1 1 wt_assert.isnotnull ( - 1310 IGNR 1 1 1 1 wt_assert.this ( - 1314 IGNR 1 0 0 0 wt_assert.isnotnull ( - 1317 IGNR 1 17 17 17 wt_assert.this ( - 1322 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ XMLTYPE Sad Path 1'; - 1323 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1324 IGNR 1 0 0 0 eq ( - 1328 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1329 IGNR 1 4 4 4 temp_rec := g_rec; - 1331 IGNR 1 4 0 4 wt_assert.isnotnull ( - 1334 IGNR 1 5 0 5 wt_assert.isnotnull ( - 1337 IGNR 1 1 1 1 wt_assert.this ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1341 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ XMLTYPE Sad Path 2'; - 1342 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1343 IGNR 0 0 0 0 begin - 1344 IGNR 1 0 0 0 eq ( - 1349 IGNR 0 0 0 0 l_found_exception := FALSE; - 1350 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then - 1351 IGNR 1 0 0 0 l_found_exception := TRUE; - 1352 IGNR 0 2 2 2 end; - 1354 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1355 IGNR 1 5 5 5 temp_rec := g_rec; - 1356 IGNR 1 2 2 2 wt_assert.this ( - 1359 IGNR 1 0 0 0 wt_assert.eq ( - 1364 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ CLOB Happy Path 1'; - 1365 IGNR 1 0 0 0 eq ( - 1369 IGNR 1 3 3 3 temp_rec := g_rec; - 1371 IGNR 1 1 1 1 wt_assert.isnotnull ( - 1374 IGNR 1 1 1 1 wt_assert.this ( - 1378 IGNR 1 1 1 1 wt_assert.isnotnull ( - 1381 IGNR 1 1 1 1 wt_assert.this ( - 1385 IGNR 1 0 0 0 wt_assert.isnotnull ( - 1388 IGNR 1 0 0 0 wt_assert.this ( - 1392 IGNR 1 0 0 0 wt_assert.isnotnull ( - 1395 IGNR 1 17 17 17 wt_assert.this ( - 1400 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ CLOB Happy Path 2'; - 1401 IGNR 1 0 0 0 eq ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1407 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ CLOB Happy Path 3'; - 1408 IGNR 1 1 1 1 eq ( - 1414 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ CLOB Sad Path 1'; - 1415 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1416 IGNR 1 0 0 0 eq ( - 1420 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1421 IGNR 1 5 5 5 temp_rec := g_rec; - 1423 IGNR 1 1 1 1 wt_assert.isnotnull ( - 1426 IGNR 1 0 0 0 wt_assert.isnotnull ( - 1429 IGNR 1 1 1 1 wt_assert.this ( - 1433 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ CLOB Sad Path 2'; - 1434 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1436 IGNR 1 1 1 1 eq ( - 1441 IGNR 0 0 0 0 l_found_exception := FALSE; - 1442 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then - 1443 IGNR 1 1 1 1 l_found_exception := TRUE; - 1444 IGNR 0 2 2 2 end; - 1446 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1447 IGNR 1 1 1 1 temp_rec := g_rec; - 1448 IGNR 1 0 0 0 wt_assert.this ( - 1451 IGNR 1 1 1 1 wt_assert.eq ( - 1456 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ CLOB Sad Path 3'; - 1457 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1458 IGNR 1 0 0 0 eq ( - 1462 IGNR 1 1 1 1 wtplsql_skip_save := FALSE; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1463 IGNR 1 2 2 2 temp_rec := g_rec; - 1465 IGNR 1 1 1 1 wt_assert.isnotnull ( - 1468 IGNR 1 1 1 1 wt_assert.isnull ( - 1471 IGNR 1 1 1 1 wt_assert.this ( - 1475 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ CLOB Sad Path 4'; - 1476 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1477 IGNR 1 0 0 0 eq ( - 1482 IGNR 1 1 1 1 wtplsql_skip_save := FALSE; - 1483 IGNR 1 5 5 5 temp_rec := g_rec; - 1485 IGNR 1 1 1 1 wt_assert.isnotnull ( - 1488 IGNR 1 1 1 1 wt_assert.isnull ( - 1491 IGNR 1 1 1 1 wt_assert.this ( - 1495 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ NCLOB Happy Path 1'; - 1496 IGNR 1 9341 9341 9341 eq ( - 1501 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ NCLOB Happy Path 2'; - 1502 IGNR 1 10989 10989 10989 eq ( - 1508 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ NCLOB Happy Path 3'; - 1509 IGNR 1 3 3 3 eq ( - 1515 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ NCLOB Sad Path 1'; - 1516 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1517 IGNR 1 5318 5318 5318 eq ( - 1521 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1522 IGNR 1 6 6 6 temp_rec := g_rec; - 1524 IGNR 1 4845 4845 4845 wt_assert.isnotnull ( - 1527 IGNR 1 121 121 121 wt_assert.isnotnull ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1530 IGNR 1 1 1 1 wt_assert.this ( - 1534 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ NCLOB Sad Path 2'; - 1535 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1536 IGNR 0 0 0 0 begin - 1537 IGNR 1 5776 5776 5776 eq ( - 1542 IGNR 0 0 0 0 l_found_exception := FALSE; - 1543 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then - 1544 IGNR 1 1 1 1 l_found_exception := TRUE; - 1545 IGNR 0 3 3 3 end; - 1547 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1548 IGNR 1 5 5 5 temp_rec := g_rec; - 1549 IGNR 1 2 2 2 wt_assert.this ( - 1552 IGNR 1 1 1 1 wt_assert.eq ( - 1557 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ NCLOB Sad Path 3'; - 1558 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1559 IGNR 1 5180 5180 5180 eq ( - 1563 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1564 IGNR 1 4 4 4 temp_rec := g_rec; - 1566 IGNR 1 4615 4615 4615 wt_assert.isnotnull ( - 1569 IGNR 1 17 17 17 wt_assert.isnull ( - 1572 IGNR 1 1 1 1 wt_assert.this ( - 1576 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ NCLOB Sad Path 4'; - 1577 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1578 IGNR 1 10241 10241 10241 eq ( - 1583 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1584 IGNR 1 7 7 7 temp_rec := g_rec; - 1586 IGNR 1 10520 10520 10520 wt_assert.isnotnull ( - 1589 IGNR 1 442 442 442 wt_assert.isnull ( - 1592 IGNR 1 1 1 1 wt_assert.this ( - 1596 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ BLOB Happy Path 1'; - 1597 IGNR 1 1 1 1 eq ( - 1601 IGNR 1 1 1 1 temp_rec := g_rec; - 1603 IGNR 1 0 0 0 wt_assert.isnotnull ( - 1606 IGNR 1 0 0 0 wt_assert.this ( - 1610 IGNR 1 0 0 0 wt_assert.isnotnull ( - 1613 IGNR 1 0 0 0 wt_assert.this ( - 1617 IGNR 1 0 0 0 wt_assert.isnotnull ( - 1620 IGNR 1 0 0 0 wt_assert.this ( - 1624 IGNR 1 1 1 1 wt_assert.isnotnull ( - 1627 IGNR 1 0 0 0 wt_assert.this ( - 1632 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ BLOB Happy Path 2'; - 1633 IGNR 1 0 0 0 eq ( - 1639 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ BLOB Happy Path 3'; - 1640 IGNR 1 0 0 0 eq ( - 1646 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ BLOB Sad Path 1'; - 1647 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1648 IGNR 1 0 0 0 eq ( - 1652 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1653 IGNR 1 2 2 2 temp_rec := g_rec; - 1655 IGNR 1 0 0 0 wt_assert.isnotnull ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1658 IGNR 1 0 0 0 wt_assert.isnotnull ( - 1661 IGNR 1 0 0 0 wt_assert.this ( - 1665 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ BLOB Sad Path 2'; - 1666 IGNR 1 1 1 1 wtplsql_skip_save := TRUE; - 1668 IGNR 1 0 0 0 eq ( - 1673 IGNR 0 0 0 0 l_found_exception := FALSE; - 1674 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then - 1675 IGNR 1 0 0 0 l_found_exception := TRUE; - 1676 IGNR 0 1 1 1 end; - 1678 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1679 IGNR 1 1 1 1 temp_rec := g_rec; - 1680 IGNR 1 0 0 0 wt_assert.this ( - 1683 IGNR 1 1 1 1 wt_assert.eq ( - 1688 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ BLOB Sad Path 3'; - 1689 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1690 IGNR 1 0 0 0 eq ( - 1694 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1695 IGNR 1 0 0 0 temp_rec := g_rec; - 1697 IGNR 1 0 0 0 wt_assert.isnotnull ( - 1700 IGNR 1 0 0 0 wt_assert.isnull ( - 1703 IGNR 1 1 1 1 wt_assert.this ( - 1707 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ BLOB Sad Path 4'; - 1708 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1709 IGNR 1 0 0 0 eq ( - 1714 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1715 IGNR 1 0 0 0 temp_rec := g_rec; - 1717 IGNR 1 0 0 0 wt_assert.isnotnull ( - 1720 IGNR 1 1 1 1 wt_assert.isnull ( - 1723 IGNR 1 0 0 0 wt_assert.this ( - 1726 IGNR 1 1440 1440 1440 end t_eq; - 1736 UNKN 0 44 1 2 procedure isnotnull ( - 1743 EXEC 82 41 1 1 g_rec.last_assert := 'ISNOTNULL'; - 1744 EXEC 82 29 1 1 g_rec.last_msg := msg_in; - 1745 EXEC 82 16 0 1 g_rec.last_pass := (check_this_in is not null); - 1746 EXEC 82 221 1 34 g_rec.last_details := 'Expected NOT NULL and got "' || - 1748 EXEC 82 24 0 7 g_rec.raise_exception := raise_exc_in; - 1749 EXEC 82 14 0 1 process_assertion; - 1750 EXEC 80 22 0 1 end isnotnull; - 1753 UNKN 0 9 1 1 procedure isnotnull ( - 1760 EXEC 13 3 0 1 isnotnull (msg_in => msg_in - 1764 EXEC 12 2 0 1 end isnotnull; - 1767 UNKN 0 153 5 29 procedure isnotnull ( - 1774 EXEC 13 16 0 3 g_rec.last_assert := 'ISNOTNULL'; - 1775 EXEC 13 6 0 1 g_rec.last_msg := msg_in; - 1776 EXEC 13 5 0 1 g_rec.last_pass := (check_this_in is not null); - 1777 EXEC 13 19161 390 9579 g_rec.last_details := 'Expected NOT NULL and got "' || - 1779 EXEC 13 9 0 2 g_rec.raise_exception := raise_exc_in; - 1780 EXEC 13 6 0 2 process_assertion; - 1781 EXEC 12 736 48 127 end isnotnull; - 1784 UNKN 0 4 0 1 procedure isnotnull ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1791 EXEC 7 2 0 1 g_rec.last_assert := 'ISNOTNULL'; - 1792 EXEC 7 4 0 1 g_rec.last_msg := msg_in; - 1793 EXEC 7 1 0 1 g_rec.last_pass := (check_this_in is not null); - 1794 EXEC 7 0 0 0 if g_rec.last_pass - 1796 EXEC 5 2 0 1 g_rec.last_details := 'BLOB is NOT NULL'; - 1798 EXEC 2 1 1 1 g_rec.last_details := 'BLOB is NULL'; - 1800 EXEC 7 1 0 1 g_rec.raise_exception := raise_exc_in; - 1801 EXEC 7 1 1 1 process_assertion; - 1802 EXEC 6 0 0 0 end isnotnull; - 1806 IGNR 0 9 9 9 procedure t_isnotnull - 1811 IGNR 1 1 1 1 wt_assert.g_testcase := 'ISNOTNULL VARCHAR2 Happy Path 1'; - 1812 IGNR 1 0 0 0 isnotnull ( - 1815 IGNR 1 1 1 1 temp_rec := g_rec; - 1817 IGNR 1 1 1 1 wt_assert.eq ( - 1821 IGNR 1 0 0 0 wt_assert.eq ( - 1826 IGNR 1 1 1 1 wt_assert.eq ( - 1830 IGNR 1 0 0 0 wt_assert.eq ( - 1835 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNOTNULL VARCHAR2 Sad Path 1'; - 1836 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1837 IGNR 1 1 1 1 isnotnull ( - 1840 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1841 IGNR 1 0 0 0 wt_assert.eq ( - 1846 IGNR 1 1 1 1 wt_assert.g_testcase := 'ISNOTNULL VARCHAR2 Sad Path 2'; - 1847 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1849 IGNR 1 1 1 1 isnotnull ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1853 IGNR 0 0 0 0 l_found_exception := FALSE; - 1854 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then - 1855 IGNR 1 0 0 0 l_found_exception := TRUE; - 1856 IGNR 0 1 1 1 end; - 1858 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1859 IGNR 1 0 0 0 wt_assert.eq ( - 1863 IGNR 1 0 0 0 wt_assert.eq ( - 1868 IGNR 1 1 1 1 wt_assert.g_testcase := 'ISNOTNULL BOOLEAN Happy Path 1'; - 1869 IGNR 1 1 1 1 isnotnull ( - 1873 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNOTNULL BOOLEAN Sad Path 1'; - 1874 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1875 IGNR 1 1 1 1 isnotnull ( - 1878 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1879 IGNR 1 0 0 0 wt_assert.eq ( - 1884 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNOTNULL BOOLEAN Sad Path 2'; - 1885 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1887 IGNR 1 1 1 1 isnotnull ( - 1891 IGNR 0 0 0 0 l_found_exception := FALSE; - 1892 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then - 1893 IGNR 1 1 1 1 l_found_exception := TRUE; - 1894 IGNR 0 1 1 1 end; - 1896 IGNR 1 1 1 1 wtplsql_skip_save := FALSE; - 1897 IGNR 1 0 0 0 wt_assert.eq ( - 1901 IGNR 1 0 0 0 wt_assert.eq ( - 1906 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNOTNULL CLOB Happy Path 1'; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1907 IGNR 1 0 0 0 isnotnull ( - 1910 IGNR 1 2 2 2 temp_rec := g_rec; - 1912 IGNR 1 0 0 0 wt_assert.eq ( - 1916 IGNR 1 0 0 0 wt_assert.eq ( - 1921 IGNR 1 0 0 0 wt_assert.eq ( - 1925 IGNR 1 0 0 0 wt_assert.isnotnull ( - 1928 IGNR 1 16 16 16 wt_assert.this ( - 1933 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNOTNULL CLOB Sad Path 1'; - 1934 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1935 IGNR 1 0 0 0 isnotnull ( - 1938 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1939 IGNR 1 0 0 0 wt_assert.eq ( - 1944 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNOTNULL CLOB Sad Path 2'; - 1945 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1947 IGNR 1 1 1 1 isnotnull ( - 1951 IGNR 0 0 0 0 l_found_exception := FALSE; - 1952 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then - 1953 IGNR 1 0 0 0 l_found_exception := TRUE; - 1954 IGNR 0 2 2 2 end; - 1956 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1957 IGNR 1 0 0 0 wt_assert.eq ( - 1961 IGNR 1 0 0 0 wt_assert.eq ( - 1966 IGNR 1 1 1 1 wt_assert.g_testcase := 'ISNOTNULL BLOB Happy Path 1'; - 1967 IGNR 1 0 0 0 isnotnull ( - 1970 IGNR 1 1 1 1 temp_rec := g_rec; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1972 IGNR 1 0 0 0 wt_assert.eq ( - 1976 IGNR 1 0 0 0 wt_assert.eq ( - 1981 IGNR 1 0 0 0 wt_assert.eq ( - 1985 IGNR 1 1 1 1 wt_assert.eq ( - 1990 IGNR 1 1 1 1 wt_assert.g_testcase := 'ISNOTNULL BLOB Sad Path 1'; - 1991 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 1992 IGNR 1 0 0 0 isnotnull ( - 1995 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 1996 IGNR 1 0 0 0 wt_assert.eq ( - 2001 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNOTNULL BLOB Sad Path 2'; - 2002 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 2004 IGNR 1 0 0 0 isnotnull ( - 2008 IGNR 0 0 0 0 l_found_exception := FALSE; - 2009 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then - 2010 IGNR 1 0 0 0 l_found_exception := TRUE; - 2011 IGNR 0 1 1 1 end; - 2013 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 2014 IGNR 1 0 0 0 wt_assert.eq ( - 2018 IGNR 1 0 0 0 wt_assert.eq ( - 2022 IGNR 1 3 3 3 end t_isnotnull; - 2028 UNKN 0 10 0 1 procedure isnull ( - 2035 EXEC 18 5 0 1 g_rec.last_assert := 'ISNULL'; - 2036 EXEC 18 4 1 1 g_rec.last_msg := msg_in; - 2037 EXEC 18 6 0 1 g_rec.last_pass := (check_this_in is null); - 2038 EXEC 18 20 1 3 g_rec.last_details := 'Expected NULL and got "' || -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 2040 EXEC 18 9 0 7 g_rec.raise_exception := raise_exc_in; - 2041 EXEC 18 4 0 1 process_assertion; - 2042 EXEC 16 3 0 1 end isnull; - 2045 UNKN 0 4 1 1 procedure isnull ( - 2052 EXEC 6 4 0 1 isnull (msg_in => msg_in - 2056 EXEC 5 0 0 0 end isnull; - 2059 UNKN 0 53 6 12 procedure isnull ( - 2066 EXEC 7 5 0 2 g_rec.last_assert := 'ISNULL'; - 2067 EXEC 7 2 0 1 g_rec.last_msg := msg_in; - 2068 EXEC 7 3 1 1 g_rec.last_pass := (check_this_in is null); - 2069 EXEC 7 4758 327 1715 g_rec.last_details := 'Expected NULL and got "' || - 2071 EXEC 7 6 1 2 g_rec.raise_exception := raise_exc_in; - 2072 EXEC 7 3 1 1 process_assertion; - 2073 EXEC 6 323 52 60 end isnull; - 2076 UNKN 0 2 1 1 procedure isnull ( - 2083 EXEC 5 1 0 1 g_rec.last_assert := 'ISNULL'; - 2084 EXEC 5 2 1 1 g_rec.last_msg := msg_in; - 2085 EXEC 5 3 0 1 g_rec.last_pass := (check_this_in is null); - 2086 EXEC 5 1 0 1 if g_rec.last_pass - 2088 EXEC 3 0 0 0 g_rec.last_details := 'BLOB is NULL'; - 2090 EXEC 2 2 1 1 g_rec.last_details := 'BLOB is NOT NULL'; - 2092 EXEC 5 0 0 0 g_rec.raise_exception := raise_exc_in; - 2093 EXEC 5 1 0 1 process_assertion; - 2094 EXEC 4 0 0 0 end isnull; - 2098 IGNR 0 5 5 5 procedure t_isnull -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 2103 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNULL VARCHAR2 Happy Path 1'; - 2104 IGNR 1 0 0 0 isnull ( - 2107 IGNR 1 0 0 0 temp_rec := g_rec; - 2109 IGNR 1 0 0 0 wt_assert.eq ( - 2113 IGNR 1 0 0 0 wt_assert.eq ( - 2118 IGNR 1 1 1 1 wt_assert.eq ( - 2122 IGNR 1 1 1 1 wt_assert.eq ( - 2127 IGNR 1 1 1 1 wt_assert.g_testcase := 'ISNULL VARCHAR2 Sad Path 1'; - 2128 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 2129 IGNR 1 0 0 0 isnull ( - 2132 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 2133 IGNR 1 0 0 0 wt_assert.eq ( - 2138 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNULL VARCHAR2 Sad Path 2'; - 2139 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 2141 IGNR 1 0 0 0 isnull ( - 2145 IGNR 0 0 0 0 l_found_exception := FALSE; - 2146 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then - 2147 IGNR 1 0 0 0 l_found_exception := TRUE; - 2148 IGNR 0 0 0 0 end; - 2149 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 2151 IGNR 1 0 0 0 wt_assert.eq ( - 2155 IGNR 1 0 0 0 wt_assert.eq ( - 2160 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNULL BOOLEAN Happy Path 1'; - 2161 IGNR 1 0 0 0 isnull ( - 2165 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNULL BOOLEAN Sad Path 1'; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 2166 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 2167 IGNR 1 0 0 0 isnull ( - 2170 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 2171 IGNR 1 0 0 0 wt_assert.eq ( - 2176 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNULL BOOLEAN Sad Path 2'; - 2177 IGNR 1 1 1 1 wtplsql_skip_save := TRUE; - 2179 IGNR 1 0 0 0 isnull ( - 2183 IGNR 0 0 0 0 l_found_exception := FALSE; - 2184 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then - 2185 IGNR 1 0 0 0 l_found_exception := TRUE; - 2186 IGNR 0 1 1 1 end; - 2187 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 2189 IGNR 1 0 0 0 wt_assert.eq ( - 2193 IGNR 1 0 0 0 wt_assert.eq ( - 2198 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNULL CLOB Happy Path 1'; - 2199 IGNR 1 0 0 0 isnull ( - 2202 IGNR 1 1 1 1 temp_rec := g_rec; - 2204 IGNR 1 0 0 0 wt_assert.eq ( - 2208 IGNR 1 1 1 1 wt_assert.eq ( - 2213 IGNR 1 0 0 0 wt_assert.eq ( - 2217 IGNR 1 1 1 1 wt_assert.eq ( - 2222 IGNR 1 1 1 1 wt_assert.g_testcase := 'ISNULL CLOB Sad Path 1'; - 2223 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 2224 IGNR 1 0 0 0 isnull ( - 2227 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 2228 IGNR 1 1 1 1 wt_assert.eq ( - 2233 IGNR 1 1 1 1 wt_assert.g_testcase := 'ISNULL CLOB Sad Path 2'; - 2234 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 2236 IGNR 1 0 0 0 isnull ( - 2240 IGNR 0 0 0 0 l_found_exception := FALSE; - 2241 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then - 2242 IGNR 1 0 0 0 l_found_exception := TRUE; - 2243 IGNR 0 2 2 2 end; - 2245 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 2246 IGNR 1 1 1 1 wt_assert.eq ( - 2250 IGNR 1 1 1 1 wt_assert.eq ( - 2255 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNULL BLOB Happy Path 1'; - 2256 IGNR 1 1 1 1 isnull ( - 2259 IGNR 1 1 1 1 temp_rec := g_rec; - 2261 IGNR 1 0 0 0 wt_assert.eq ( - 2265 IGNR 1 1 1 1 wt_assert.eq ( - 2270 IGNR 1 0 0 0 wt_assert.eq ( - 2274 IGNR 1 1 1 1 wt_assert.eq ( - 2279 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNULL BLOB Sad Path 1'; - 2280 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 2281 IGNR 1 1 1 1 isnull ( - 2284 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 2285 IGNR 1 0 0 0 wt_assert.eq ( - 2290 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNULL BLOB Sad Path 2'; - 2291 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 2293 IGNR 1 1 1 1 isnull ( - 2297 IGNR 0 0 0 0 l_found_exception := FALSE; - 2298 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then - 2299 IGNR 1 0 0 0 l_found_exception := TRUE; - 2300 IGNR 0 1 1 1 end; - 2302 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 2303 IGNR 1 0 0 0 wt_assert.eq ( - 2307 IGNR 1 0 0 0 wt_assert.eq ( - 2311 IGNR 1 4 4 4 end t_isnull; - 2317 EXEC 8 17 0 4 procedure raises ( - 2326 EXEC 8 7213 0 1298 execute immediate check_call_in; - 2327 EXEC 5 0 0 0 exception when OTHERS then - 2328 EXEC 5 177 26 41 l_sqlerrm := SQLERRM; - 2329 EXEC 5 209 30 85 l_errstack := substr(dbms_utility.format_error_stack || - 2332 UNKN 0 4 1 1 end; - 2334 EXEC 8 7 1 1 g_rec.last_assert := 'RAISES/THROWS'; - 2335 EXEC 8 4 1 1 g_rec.last_msg := msg_in; - 2336 EXEC 8 3 0 1 if against_exc_in is null AND l_sqlerrm is null - 2339 EXEC 2 1 0 1 g_rec.last_pass := TRUE; - 2340#NOTX# 0 0 0 0 elsif against_exc_in is null OR l_sqlerrm is null - 2344 EXEC 1 1 1 1 g_rec.last_pass := FALSE; - 2347 EXEC 5 30 5 7 g_rec.last_pass := l_sqlerrm like '%' || against_exc_in || '%'; - 2349 EXEC 8 0 0 0 if against_exc_in is null - 2351 EXEC 2 4 2 2 g_rec.last_details := 'No exception was expected' || - 2354 EXEC 6 1 0 1 elsif l_sqlerrm is null -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 2356 EXEC 1 2 2 2 g_rec.last_details := 'Expected exception "%' || against_exc_in || - 2359 EXEC 5 6 1 2 g_rec.last_details := 'Expected exception "%' || against_exc_in || - 2363 EXEC 8 1 0 1 if not g_rec.last_pass - 2365 EXEC 2 8 3 5 g_rec.last_details := - 2368 EXEC 8 2 1 1 process_assertion; - 2369 EXEC 8 14 2 4 end raises; - 2371 UNKN 0 3 1 1 procedure raises ( - 2377 EXEC 3 1 0 1 if against_exc_in is null - 2379 EXEC 1 1 1 1 raises ( - 2384 EXEC 2 15 7 8 raises ( - 2389 EXEC 3 0 0 0 end raises; - 2391 UNKN 0 1 1 1 procedure throws ( - 2397 EXEC 1 0 0 0 raises ( - 2401 EXEC 1 1 1 1 end throws; - 2403 EXCL 0 0 0 0 procedure throws ( - 2409 EXEC 1 0 0 0 raises ( - 2413 EXEC 1 0 0 0 end throws; - 2417 IGNR 0 2 2 2 procedure t_raises - 2421 IGNR 1 0 0 0 wt_assert.g_testcase := 'Raises Tests Happy Path 1'; - 2422 IGNR 1 0 0 0 raises ( - 2426 IGNR 1 2 2 2 temp_rec := g_rec; - 2428 IGNR 1 1 1 1 wt_assert.eq ( - 2432 IGNR 1 1 1 1 wt_assert.eq ( - 2437 IGNR 1 0 0 0 wt_assert.eq ( - 2441 IGNR 1 5 5 5 wt_assert.eq ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 2451 IGNR 1 0 0 0 wt_assert.g_testcase := 'Raises Tests Happy Path 2'; - 2452 IGNR 1 0 0 0 raises ( - 2456 IGNR 1 1 1 1 temp_rec := g_rec; - 2457 IGNR 1 3 3 3 wt_assert.eq ( - 2468 IGNR 1 0 0 0 throws ( - 2472 IGNR 1 1 1 1 temp_rec := g_rec; - 2473 IGNR 1 3 3 3 wt_assert.eq ( - 2484 IGNR 1 0 0 0 throws ( - 2488 IGNR 1 2 2 2 temp_rec := g_rec; - 2489 IGNR 1 3 3 3 wt_assert.eq ( - 2500 IGNR 1 0 0 0 wt_assert.g_testcase := 'Raises Tests Happy Path 3'; - 2501 IGNR 1 0 0 0 raises ( - 2505 IGNR 1 1 1 1 temp_rec := g_rec; - 2506 IGNR 1 2 2 2 wt_assert.eq ( - 2513 IGNR 1 1 1 1 raises ( - 2517 IGNR 1 0 0 0 temp_rec := g_rec; - 2518 IGNR 1 1 1 1 wt_assert.eq ( - 2525 IGNR 1 0 0 0 wt_assert.g_testcase := 'Raises Tests Sad Path 1'; - 2526 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 2527 IGNR 1 1 1 1 raises ( - 2531 IGNR 1 11 11 11 temp_rec := g_rec; - 2532 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 2534 IGNR 1 0 0 0 wt_assert.eq ( - 2538 IGNR 1 0 0 0 wt_assert.isnotnull ( - 2541 IGNR 1 5 5 5 wt_assert.this ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 2547 IGNR 1 0 0 0 wt_assert.g_testcase := 'Raises Tests Sad Path 2'; - 2548 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 2549 IGNR 1 1 1 1 raises ( - 2553 IGNR 1 2 2 2 temp_rec := g_rec; - 2554 IGNR 1 1 1 1 wtplsql_skip_save := FALSE; - 2556 IGNR 1 0 0 0 wt_assert.eq ( - 2560 IGNR 1 2 2 2 wt_assert.eq ( - 2566 IGNR 1 0 0 0 end t_raises; - 2572 EXEC 6 11 0 2 procedure eqqueryvalue ( - 2584 EXEC 6 0 0 0 g_rec.last_assert := 'EQQUERYVALUE'; - 2585 EXEC 6 1 0 1 g_rec.last_msg := msg_in; - 2586 EXEC 6 3347 46 2815 open l_rc for check_query_in; - 2587 EXEC 5 313 31 91 fetch l_rc into l_rc_buff; - 2588 EXEC 5 71 10 19 close l_rc; - 2589 EXEC 5 10 0 2 g_rec.last_pass := ( l_rc_buff = against_value_in - 2590 UNKN 0 5 1 2 or ( l_rc_buff is null - 2593 EXEC 5 30 4 10 g_rec.last_details := 'Expected "' || substr(against_value_in,1,1000) || - 2596 EXEC 5 0 0 0 g_rec.raise_exception := raise_exc_in; - 2597 EXEC 5 3 1 1 process_assertion; - 2598 EXEC 2 0 0 0 exception when others then - 2599 EXEC 2 124 52 72 l_errstack := substr(dbms_utility.format_error_stack || - 2601 EXEC 2 4 2 2 g_rec.last_details := 'Exception raised for Query: ' || - 2604 EXEC 2 0 0 0 g_rec.last_pass := FALSE; - 2605 EXEC 2 0 0 0 g_rec.raise_exception := raise_exc_in; - 2606 EXEC 2 0 0 0 process_assertion; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 2607 EXEC 5 29 4 19 end eqqueryvalue; - 2610 EXEC 4 46 10 14 procedure eqqueryvalue ( - 2622 EXEC 4 1 0 1 g_rec.last_assert := 'EQQUERYVALUE'; - 2623 EXEC 4 1 0 1 g_rec.last_msg := msg_in; - 2624 EXEC 4 3847 358 2615 open l_rc for check_query_in; - 2625 EXEC 3 687 211 246 fetch l_rc into l_rc_buff; - 2626 EXEC 3 179 40 87 close l_rc; - 2627 EXEC 3 56609 2 38968 g_rec.last_pass := (xmltype.getclobval(l_rc_buff) = - 2629 EXEC 3 39064 4 9936 g_rec.last_details := 'Expected "' || substr(xmltype.getclobval(against_value_in),1,1000) || - 2632 EXEC 3 4 1 2 g_rec.raise_exception := raise_exc_in; - 2633 EXEC 3 3 1 1 process_assertion; - 2634 EXEC 2 0 0 0 exception when others then - 2635 EXEC 2 212 94 118 l_errstack := substr(dbms_utility.format_error_stack || - 2637 EXEC 2 7 3 4 g_rec.last_details := 'Exception raised for Query: ' || - 2640 EXEC 2 0 0 0 g_rec.last_pass := FALSE; - 2641 EXEC 2 0 0 0 g_rec.raise_exception := raise_exc_in; - 2642 EXEC 2 1 1 1 process_assertion; - 2643 EXEC 3 191 1 74 end eqqueryvalue; - 2646 EXEC 4 43 1 10 procedure eqqueryvalue ( - 2658 EXEC 4 2 1 1 g_rec.last_assert := 'EQQUERYVALUE'; - 2659 EXEC 4 2 1 1 g_rec.last_msg := msg_in; - 2660 EXEC 4 2128 156 1465 open l_rc for check_query_in; - 2661 EXEC 3 219 56 98 fetch l_rc into l_rc_buff; - 2662 EXEC 3 70 14 31 close l_rc; - 2663 EXEC 3 10777 0 9404 g_rec.last_pass := ( l_rc_buff = against_value_in -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 2664 UNKN 0 3 1 2 or ( l_rc_buff is null - 2667 EXEC 3 6496 2072 2351 g_rec.last_details := 'Expected "' || substr(against_value_in,1,1000) || - 2670 EXEC 3 2 1 1 g_rec.raise_exception := raise_exc_in; - 2671 EXEC 3 3 1 1 process_assertion; - 2672 EXEC 2 0 0 0 exception when others then - 2673 EXEC 2 226 43 183 l_errstack := substr(dbms_utility.format_error_stack || - 2675 EXEC 2 5 2 3 g_rec.last_details := 'Exception raised for Query: ' || - 2678 EXEC 2 1 1 1 g_rec.last_pass := FALSE; - 2679 EXEC 2 0 0 0 g_rec.raise_exception := raise_exc_in; - 2680 EXEC 2 1 1 1 process_assertion; - 2681 EXEC 3 140 25 59 end eqqueryvalue; - 2684 EXEC 5 30 1 6 procedure eqqueryvalue ( - 2697 EXEC 5 2 0 1 g_rec.last_assert := 'EQQUERYVALUE'; - 2698 EXEC 5 2 0 1 g_rec.last_msg := msg_in; - 2699 EXEC 5 3441 90 1669 open l_rc for check_query_in; - 2700 EXEC 4 225 37 83 fetch l_rc into l_rc_buff; - 2701 EXEC 4 78 14 27 close l_rc; - 2702 EXEC 4 18 0 6 compare_results := nvl(DBMS_LOB.COMPARE(l_rc_buff, against_value_in),-1); - 2703 EXEC 4 10 0 3 g_rec.last_pass := ( (compare_results = 0) - 2704 UNKN 0 4 1 2 or ( l_rc_buff is null - 2707 EXEC 4 25 4 8 g_rec.last_details := 'DBMS_LOB.COMPARE between BLOB and Query: ' || - 2710 EXEC 4 0 0 0 g_rec.raise_exception := raise_exc_in; - 2711 EXEC 4 3 1 1 process_assertion; - 2712 EXEC 2 0 0 0 exception when others then - 2713 EXEC 2 117 41 76 l_errstack := substr(dbms_utility.format_error_stack || -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 2715 EXEC 2 5 2 3 g_rec.last_details := 'Exception raised for Query: ' || - 2718 EXEC 2 0 0 0 g_rec.last_pass := FALSE; - 2719 EXEC 2 1 1 1 g_rec.raise_exception := raise_exc_in; - 2720 EXEC 2 0 0 0 process_assertion; - 2721 EXEC 4 30 1 19 end eqqueryvalue; - 2725 IGNR 0 6 6 6 procedure t_eqqueryvalue - 2730 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Happy Path 1'; - 2731 IGNR 1 0 0 0 eqqueryvalue ( - 2736 IGNR 1 0 0 0 temp_rec := g_rec; - 2738 IGNR 1 0 0 0 wt_assert.eq ( - 2742 IGNR 1 1 1 1 wt_assert.eq ( - 2747 IGNR 1 1 1 1 wt_assert.eq ( - 2751 IGNR 1 0 0 0 wt_assert.eq ( - 2756 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Happy Path 2'; - 2757 IGNR 1 0 0 0 eqqueryvalue ( - 2763 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Sad Path 1'; - 2764 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 2765 IGNR 1 0 0 0 eqqueryvalue ( - 2769 IGNR 1 1 1 1 temp_rec := g_rec; - 2770 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 2771 IGNR 1 0 0 0 wt_assert.eq ( - 2776 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Sad Path 2'; - 2777 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 2779 IGNR 1 0 0 0 eqqueryvalue ( - 2784 IGNR 0 0 0 0 l_found_exception := FALSE; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 2785 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then - 2786 IGNR 1 0 0 0 l_found_exception := TRUE; - 2787 IGNR 0 1 1 1 end; - 2789 IGNR 1 2 2 2 temp_rec := g_rec; - 2790 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 2791 IGNR 1 1 1 1 wt_assert.eq ( - 2795 IGNR 1 0 0 0 wt_assert.eq ( - 2800 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Sad Path 3'; - 2801 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 2802 IGNR 1 0 0 0 eqqueryvalue ( - 2806 IGNR 1 2 2 2 temp_rec := g_rec; - 2807 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 2809 IGNR 1 0 0 0 wt_assert.eq ( - 2813 IGNR 1 0 0 0 wt_assert.isnotnull ( - 2816 IGNR 1 7 7 7 wt_assert.this ( - 2822 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Happy Path 1'; - 2823 IGNR 1 0 0 0 eqqueryvalue ( - 2827 IGNR 1 2 2 2 temp_rec := g_rec; - 2829 IGNR 1 1 1 1 wt_assert.eq ( - 2833 IGNR 1 1 1 1 wt_assert.eq ( - 2838 IGNR 1 0 0 0 wt_assert.eq ( - 2842 IGNR 1 0 0 0 wt_assert.isnotnull ( - 2845 IGNR 1 18 18 18 wt_assert.this ( - 2850 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Sad Path 1'; - 2851 IGNR 1 1 1 1 wtplsql_skip_save := TRUE; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 2852 IGNR 1 1 1 1 eqqueryvalue ( - 2856 IGNR 1 5 5 5 temp_rec := g_rec; - 2857 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 2859 IGNR 1 1 1 1 wt_assert.eq ( - 2863 IGNR 1 0 0 0 wt_assert.isnotnull ( - 2866 IGNR 1 14 14 14 wt_assert.this ( - 2872 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Sad Path 2'; - 2873 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 2875 IGNR 1 0 0 0 eqqueryvalue ( - 2880 IGNR 0 0 0 0 l_found_exception := FALSE; - 2881 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then - 2882 IGNR 1 0 0 0 l_found_exception := TRUE; - 2883 IGNR 0 3 3 3 end; - 2885 IGNR 1 5 5 5 temp_rec := g_rec; - 2886 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 2887 IGNR 1 1 1 1 wt_assert.eq ( - 2891 IGNR 1 0 0 0 wt_assert.eq ( - 2896 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Sad Path 3'; - 2897 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 2898 IGNR 1 0 0 0 eqqueryvalue ( - 2902 IGNR 1 3 3 3 temp_rec := g_rec; - 2903 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 2905 IGNR 1 1 1 1 wt_assert.eq ( - 2909 IGNR 1 1 1 1 wt_assert.isnotnull ( - 2912 IGNR 1 9 9 9 wt_assert.this ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 2918 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQQUERYVALUE CLOB Happy Path 1'; - 2919 IGNR 1 1 1 1 eqqueryvalue ( - 2924 IGNR 1 5 5 5 temp_rec := g_rec; - 2926 IGNR 1 0 0 0 wt_assert.eq ( - 2930 IGNR 1 1 1 1 wt_assert.eq ( - 2935 IGNR 1 0 0 0 wt_assert.eq ( - 2939 IGNR 1 1 1 1 wt_assert.isnotnull ( - 2942 IGNR 1 17 17 17 wt_assert.this ( - 2947 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERYVALUE CLOB Happy Path 2'; - 2948 IGNR 1 0 0 0 eqqueryvalue ( - 2953 IGNR 1 1 1 1 temp_rec := g_rec; - 2955 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERYVALUE CLOB Sad Path 1'; - 2956 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 2957 IGNR 1 0 0 0 eqqueryvalue ( - 2961 IGNR 1 4 4 4 temp_rec := g_rec; - 2962 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 2964 IGNR 1 0 0 0 wt_assert.eq ( - 2968 IGNR 1 1 1 1 wt_assert.isnotnull ( - 2971 IGNR 1 12 12 12 wt_assert.this ( - 2977 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQQUERYVALUE CLOB Sad Path 2'; - 2978 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 2980 IGNR 1 0 0 0 eqqueryvalue ( - 2985 IGNR 0 0 0 0 l_found_exception := FALSE; - 2986 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then - 2987 IGNR 1 0 0 0 l_found_exception := TRUE; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 2988 IGNR 0 1 1 1 end; - 2990 IGNR 1 4 4 4 temp_rec := g_rec; - 2991 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 2992 IGNR 1 0 0 0 wt_assert.eq ( - 2996 IGNR 1 0 0 0 wt_assert.eq ( - 3001 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQQUERYVALUE CLOB Sad Path 3'; - 3002 IGNR 1 1 1 1 wtplsql_skip_save := TRUE; - 3003 IGNR 1 1 1 1 eqqueryvalue ( - 3007 IGNR 1 1 1 1 temp_rec := g_rec; - 3008 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 3010 IGNR 1 0 0 0 wt_assert.eq ( - 3014 IGNR 1 0 0 0 wt_assert.isnotnull ( - 3017 IGNR 1 7 7 7 wt_assert.this ( - 3023 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQQUERYVALUE BLOB Happy Path 1'; - 3024 IGNR 1 0 0 0 eqqueryvalue ( - 3029 IGNR 1 1 1 1 temp_rec := g_rec; - 3031 IGNR 1 0 0 0 wt_assert.eq ( - 3035 IGNR 1 1 1 1 wt_assert.eq ( - 3040 IGNR 1 0 0 0 wt_assert.eq ( - 3044 IGNR 1 1 1 1 wt_assert.eq ( - 3050 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERYVALUE BLOB Happy Path 2'; - 3051 IGNR 1 0 0 0 eqqueryvalue ( - 3057 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERYVALUE BLOB Sad Path 1'; - 3058 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 3059 IGNR 1 1 1 1 eqqueryvalue ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 3063 IGNR 1 2 2 2 temp_rec := g_rec; - 3064 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 3066 IGNR 1 1 1 1 wt_assert.eq ( - 3070 IGNR 1 2 2 2 wt_assert.eq ( - 3076 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERYVALUE BLOB Sad Path 2'; - 3077 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 3079 IGNR 1 0 0 0 eqqueryvalue ( - 3084 IGNR 0 0 0 0 l_found_exception := FALSE; - 3085 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then - 3086 IGNR 1 0 0 0 l_found_exception := TRUE; - 3087 IGNR 0 1 1 1 end; - 3089 IGNR 1 2 2 2 temp_rec := g_rec; - 3090 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 3091 IGNR 1 1 1 1 wt_assert.eq ( - 3095 IGNR 1 1 1 1 wt_assert.eq ( - 3100 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERYVALUE BLOB Sad Path 3'; - 3101 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 3102 IGNR 1 0 0 0 eqqueryvalue ( - 3106 IGNR 1 1 1 1 temp_rec := g_rec; - 3107 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 3109 IGNR 1 0 0 0 wt_assert.eq ( - 3113 IGNR 1 0 0 0 wt_assert.isnotnull ( - 3116 IGNR 1 7 7 7 wt_assert.this ( - 3121 IGNR 1 2 2 2 end t_eqqueryvalue; - 3126 UNKN 0 2 1 1 procedure eqquery ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 3133 EXEC 4 3 1 1 g_rec.last_assert := 'EQQUERY'; - 3134 EXEC 4 3 1 1 g_rec.last_msg := msg_in; - 3135 EXEC 4 2 1 1 compare_queries(check_query_in, against_query_in); - 3136 EXEC 4 1 0 1 g_rec.raise_exception := raise_exc_in; - 3137 EXEC 4 4 1 1 process_assertion; - 3138 EXEC 3 2 0 1 end eqquery; - 3142 IGNR 0 3 3 3 procedure t_eqquery - 3147 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERY Tests Happy Path 1'; - 3148 IGNR 1 0 0 0 wt_assert.eqquery ( - 3152 IGNR 1 2 2 2 temp_rec := g_rec; - 3154 IGNR 1 1 1 1 wt_assert.eq ( - 3158 IGNR 1 0 0 0 wt_assert.eq ( - 3163 IGNR 1 1 1 1 wt_assert.eq ( - 3167 IGNR 1 0 0 0 wt_assert.isnotnull ( - 3170 IGNR 1 3 3 3 wt_assert.this ( - 3175 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERY Tests Sad Path 1'; - 3176 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 3177 IGNR 1 1 1 1 eqquery ( - 3181 IGNR 1 4 4 4 temp_rec := g_rec; - 3182 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 3184 IGNR 1 1 1 1 wt_assert.eq ( - 3188 IGNR 1 1 1 1 wt_assert.isnotnull ( - 3191 IGNR 1 3 3 3 wt_assert.this ( - 3196 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQQUERY Tests Sad Path 2'; - 3197 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 3199 IGNR 1 1 1 1 eqquery ( - 3204 IGNR 0 0 0 0 l_found_exception := FALSE; - 3205 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then - 3206 IGNR 1 0 0 0 l_found_exception := TRUE; - 3207 IGNR 0 1 1 1 end; - 3208 IGNR 1 4 4 4 temp_rec := g_rec; - 3209 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 3211 IGNR 1 1 1 1 wt_assert.eq ( - 3215 IGNR 1 1 1 1 wt_assert.eq ( - 3220 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERY Tests Sad Path 3'; - 3221 IGNR 1 1 1 1 wtplsql_skip_save := TRUE; - 3222 IGNR 1 0 0 0 eqquery ( - 3226 IGNR 1 4 4 4 temp_rec := g_rec; - 3227 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 3229 IGNR 1 1 1 1 wt_assert.eq ( - 3233 IGNR 1 1 1 1 wt_assert.isnotnull ( - 3236 IGNR 1 10 10 10 wt_assert.this ( - 3240 IGNR 1 1 1 1 end t_eqquery; - 3245 UNKN 0 6 1 2 procedure eqtable ( - 3253 EXEC 5 5 1 1 l_check_query varchar2(16000) := 'select * from ' || check_this_in; - 3254 EXEC 5 2 1 1 l_against_query varchar2(16000) := 'select * from ' || against_this_in; - 3256 EXEC 5 4 1 1 g_rec.last_assert := 'EQTABLE'; - 3257 EXEC 5 3 0 1 g_rec.last_msg := msg_in; - 3258 EXEC 5 1 0 1 if check_where_in is not null - 3260 EXEC 3 2 0 1 l_check_query := l_check_query || ' where ' || check_where_in; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 3262 EXEC 3 0 0 0 if against_where_in is not null - 3264 EXEC 3 1 1 1 l_against_query := l_against_query || ' where ' || against_where_in; - 3266 EXEC 5 1 0 1 compare_queries(l_check_query, l_against_query); - 3267 EXEC 5 1 0 1 g_rec.raise_exception := raise_exc_in; - 3268 EXEC 5 5 1 2 process_assertion; - 3269 EXEC 4 3 1 1 end eqtable; - 3273 IGNR 0 4 4 4 procedure t_eqtable - 3278 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQTABLE Tests Happy Path 1'; - 3279 IGNR 1 0 0 0 wt_assert.eqtable ( - 3285 IGNR 1 1 1 1 temp_rec := g_rec; - 3287 IGNR 1 1 1 1 wt_assert.eq ( - 3291 IGNR 1 0 0 0 wt_assert.eq ( - 3296 IGNR 1 1 1 1 wt_assert.eq ( - 3300 IGNR 1 1 1 1 wt_assert.isnotnull ( - 3303 IGNR 1 4 4 4 wt_assert.this ( - 3308 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQTABLE Tests Happy Path 2'; - 3309 IGNR 1 9 1 5 eqtable ( - 3316 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQTABLE Sad Path 1'; - 3317 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 3318 IGNR 1 4 1 3 eqtable ( - 3324 IGNR 1 6 6 6 temp_rec := g_rec; - 3325 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 3327 IGNR 1 1 1 1 wt_assert.eq ( - 3331 IGNR 1 0 0 0 wt_assert.isnotnull ( - 3334 IGNR 1 7 7 7 wt_assert.this ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 3339 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQTABLE Sad Path 2'; - 3340 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 3342 IGNR 1 4 1 3 eqtable ( - 3349 IGNR 0 0 0 0 l_found_exception := FALSE; - 3350 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then - 3351 IGNR 1 1 1 1 l_found_exception := TRUE; - 3352 IGNR 0 2 2 2 end; - 3354 IGNR 1 4 4 4 temp_rec := g_rec; - 3355 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 3356 IGNR 1 1 1 1 wt_assert.eq ( - 3360 IGNR 1 0 0 0 wt_assert.eq ( - 3365 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQTABLE Sad Path 3'; - 3366 IGNR 1 1 1 1 wtplsql_skip_save := TRUE; - 3367 IGNR 1 0 0 0 eqtable ( - 3371 IGNR 1 6 6 6 temp_rec := g_rec; - 3372 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 3374 IGNR 1 1 1 1 wt_assert.eq ( - 3378 IGNR 1 1 1 1 wt_assert.isnotnull ( - 3381 IGNR 1 11 11 11 wt_assert.this ( - 3385 IGNR 1 2 2 2 end t_eqtable; - 3390 UNKN 0 10 1 2 procedure eqtabcount ( - 3398 EXEC 6 7 1 2 l_query varchar2(16000) := 'select count(*) from ' || check_this_in; - 3402 EXEC 11 27 1 5 procedure l_run_query is - 3406 EXEC 11 71425 112 68989 open l_rc for l_query; - 3407 EXEC 10 200334 1177 33514 fetch l_rc into l_cnt; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 3408 EXEC 10 666 41 154 close l_rc; - 3409 EXEC 10 18 1 2 l_success := TRUE; - 3411 EXEC 1 0 0 0 when OTHERS - 3413 EXEC 1 231 231 231 g_rec.last_details := SQLERRM || CHR(10) || - 3415 EXEC 1 1 1 1 g_rec.last_pass := FALSE; - 3416 EXEC 1 0 0 0 l_success := FALSE; - 3417 EXEC 1 1 1 1 g_rec.raise_exception := raise_exc_in; - 3418 EXEC 1 1 1 1 process_assertion; - 3419 EXEC 11 86 1 38 end l_run_query; - 3421 EXEC 6 2 0 1 g_rec.last_assert := 'EQTABCOUNT'; - 3422 EXEC 6 2 0 1 g_rec.last_msg := msg_in; - 3424 EXEC 6 1 0 1 l_query := 'select count(*) from ' || check_this_in; - 3425 EXEC 6 2 0 1 if check_where_in is not null - 3427 EXEC 4 3 1 1 l_query := l_query || ' where ' || check_where_in; - 3429 EXEC 6 1 0 1 l_run_query; - 3430 EXEC 7 5 1 1 if NOT l_success then return; end if; - 3431 EXEC 5 6 1 2 l_check_cnt := l_cnt; - 3433 EXEC 5 22 4 5 l_query := 'select count(*) from ' || against_this_in; - 3434 EXEC 5 1 0 1 if against_where_in is not null - 3436 EXEC 3 4 1 2 l_query := l_query || ' where ' || against_where_in; - 3438 EXEC 5 5 1 1 l_run_query; - 3439 EXEC 5 2 0 1 if NOT l_success then return; end if; - 3440 EXEC 5 11 2 3 g_rec.last_pass := (l_check_cnt = l_cnt); - 3442 EXEC 5 54 10 11 g_rec.last_details := 'Expected ' || l_cnt || ' rows from "' || against_this_in || - 3445 EXEC 5 0 0 0 g_rec.raise_exception := raise_exc_in; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 3446 EXEC 5 5 1 1 process_assertion; - 3447 EXEC 4 3 1 1 end eqtabcount; - 3451 IGNR 0 4 4 4 procedure t_eqtabcount - 3456 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQTABCOUNT Tests Happy Path 1'; - 3457 IGNR 1 7 1 4 eqtabcount ( - 3463 IGNR 1 1 1 1 temp_rec := g_rec; - 3465 IGNR 1 0 0 0 wt_assert.eq ( - 3469 IGNR 1 1 1 1 wt_assert.eq ( - 3474 IGNR 1 1 1 1 wt_assert.eq ( - 3478 IGNR 1 1 1 1 wt_assert.isnotnull ( - 3481 IGNR 1 8 8 8 wt_assert.this ( - 3487 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQTABCOUNT Tests Happy Path 2'; - 3488 IGNR 1 4 1 3 eqtabcount ( - 3495 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQTABCOUNT Sad Path 1'; - 3496 IGNR 1 1 1 1 wtplsql_skip_save := TRUE; - 3497 IGNR 1 3 1 2 eqtabcount ( - 3503 IGNR 1 5 5 5 temp_rec := g_rec; - 3504 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 3506 IGNR 1 0 0 0 wt_assert.eq ( - 3510 IGNR 1 0 0 0 wt_assert.isnotnull ( - 3513 IGNR 1 8 8 8 wt_assert.this ( - 3519 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQTABCOUNT Sad Path 2'; - 3520 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 3522 IGNR 1 3 1 2 eqtabcount ( - 3529 IGNR 0 0 0 0 l_found_exception := FALSE; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 3530 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then - 3531 IGNR 1 1 1 1 l_found_exception := TRUE; - 3532 IGNR 0 1 1 1 end; - 3534 IGNR 1 4 4 4 temp_rec := g_rec; - 3535 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 3536 IGNR 1 0 0 0 wt_assert.eq ( - 3540 IGNR 1 0 0 0 wt_assert.eq ( - 3545 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQTABCOUNT Sad Path 3'; - 3546 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 3547 IGNR 1 1 1 1 eqtabcount ( - 3551 IGNR 1 6 6 6 temp_rec := g_rec; - 3552 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 3554 IGNR 1 0 0 0 wt_assert.eq ( - 3558 IGNR 1 0 0 0 wt_assert.isnotnull ( - 3561 IGNR 1 8 8 8 wt_assert.this ( - 3566 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQTABCOUNT Sad Path 4'; - 3567 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 3568 IGNR 1 0 0 0 eqtabcount ( - 3572 IGNR 1 4 4 4 temp_rec := g_rec; - 3573 IGNR 1 1 1 1 wtplsql_skip_save := FALSE; - 3575 IGNR 1 1 1 1 wt_assert.eq ( - 3579 IGNR 1 0 0 0 wt_assert.isnotnull ( - 3583 IGNR 1 6 6 6 wt_assert.this ( - 3587 IGNR 1 2 2 2 wt_assert.this ( - 3591 IGNR 1 2 2 2 end t_eqtabcount; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 3596 EXEC 6 6 0 1 procedure objexists ( - 3605 EXEC 6 1 0 1 g_rec.last_assert := 'OBJEXISTS'; - 3606 EXEC 6 2 0 1 g_rec.last_msg := msg_in; - 3607 EXEC 6 4528 118 1586 select count(*) into l_num_objects - 3614 EXEC 6 15 0 3 g_rec.last_pass := case l_num_objects when 0 then FALSE else TRUE end; - 3615 EXEC 6 5 0 2 g_rec.last_details := 'Number of objects found for "' || - 3616 UNKN 0 20 0 6 case when obj_owner_in is null then '' - 3619 UNKN 0 31 1 6 case when obj_type_in is null then '' - 3622 EXEC 6 0 0 0 g_rec.raise_exception := raise_exc_in; - 3623 EXEC 6 4 1 1 process_assertion; - 3624 EXEC 5 5 1 1 end objexists; - 3627 UNKN 0 3 1 2 procedure objexists ( - 3633 EXEC 2 7 3 4 l_pos number := instr(check_this_in, '.'); - 3635 EXEC 2 7 3 4 objexists(msg_in => msg_in - 3638 EXEC 2 0 0 0 end objexists; - 3642 IGNR 0 2 2 2 procedure t_object_exists - 3647 IGNR 1 0 0 0 wt_assert.g_testcase := 'OBJEXISTS Happy Path 1'; - 3648 IGNR 1 0 0 0 objexists ( - 3652 IGNR 1 2 2 2 temp_rec := g_rec; - 3654 IGNR 1 1 1 1 wt_assert.eq ( - 3658 IGNR 1 0 0 0 wt_assert.eq ( - 3663 IGNR 1 0 0 0 wt_assert.eq ( - 3667 IGNR 1 0 0 0 wt_assert.eq ( - 3672 IGNR 1 1 1 1 wt_assert.g_testcase := 'OBJEXISTS Happy Path 2'; - 3673 IGNR 1 1 1 1 objexists ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 3679 IGNR 1 0 0 0 wt_assert.g_testcase := 'OBJEXISTS Happy Path 3'; - 3680 IGNR 1 0 0 0 objexists ( - 3684 IGNR 1 0 0 0 wt_assert.g_testcase := 'OBJEXISTS Happy Path 4'; - 3685 IGNR 1 1 1 1 objexists ( - 3689 IGNR 1 1 1 1 wt_assert.g_testcase := 'OBJEXISTS Sad Path 1'; - 3690 IGNR 1 1 1 1 wtplsql_skip_save := TRUE; - 3691 IGNR 1 1 1 1 objexists ( - 3695 IGNR 1 2 2 2 temp_rec := g_rec; - 3696 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 3698 IGNR 1 1 1 1 wt_assert.eq ( - 3702 IGNR 1 0 0 0 wt_assert.eq ( - 3707 IGNR 1 0 0 0 wt_assert.g_testcase := 'OBJEXISTS Sad Path 2'; - 3708 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 3710 IGNR 1 0 0 0 objexists ( - 3715 IGNR 0 0 0 0 l_found_exception := FALSE; - 3716 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then - 3717 IGNR 1 0 0 0 l_found_exception := TRUE; - 3718 IGNR 0 1 1 1 end; - 3719 IGNR 1 1 1 1 temp_rec := g_rec; - 3720 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 3722 IGNR 1 0 0 0 wt_assert.eq ( - 3726 IGNR 1 0 0 0 wt_assert.eq ( - 3730 IGNR 1 0 0 0 end t_object_exists; - 3735 EXEC 5 5 0 1 procedure objnotexists ( - 3744 EXEC 5 1 0 1 g_rec.last_assert := 'OBJNOTEXISTS'; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 3745 EXEC 5 0 0 0 g_rec.last_msg := msg_in; - 3746 EXEC 5 888 121 249 select count(*) into l_num_objects - 3753 EXEC 5 11 0 5 g_rec.last_pass := case l_num_objects when 0 then TRUE else FALSE end; - 3754 EXEC 5 1 1 1 g_rec.last_details := 'Number of objects found for "' || - 3755 UNKN 0 8 0 2 case when obj_owner_in is null then '' - 3758 UNKN 0 9 1 2 case when obj_type_in is null then '' - 3761 EXEC 5 1 0 1 g_rec.raise_exception := raise_exc_in; - 3762 EXEC 5 0 0 0 process_assertion; - 3763 EXEC 4 2 1 1 end objnotexists; - 3766 UNKN 0 2 2 2 procedure objnotexists ( - 3772 EXEC 1 2 2 2 l_pos number := instr(check_this_in, '.'); - 3774 EXEC 1 3 3 3 objnotexists(msg_in => msg_in - 3777 EXEC 1 0 0 0 end objnotexists; - 3781 IGNR 0 2 2 2 procedure t_object_not_exists - 3786 IGNR 1 0 0 0 wt_assert.g_testcase := 'OBJNOTEXISTS Happy Path 1'; - 3787 IGNR 1 0 0 0 objnotexists ( - 3791 IGNR 1 1 1 1 temp_rec := g_rec; - 3793 IGNR 1 1 1 1 wt_assert.eq ( - 3797 IGNR 1 0 0 0 wt_assert.eq ( - 3802 IGNR 1 1 1 1 wt_assert.eq ( - 3806 IGNR 1 1 1 1 wt_assert.eq ( - 3811 IGNR 1 0 0 0 wt_assert.g_testcase := 'OBJNOTEXISTS Happy Path 2'; - 3812 IGNR 1 0 0 0 objnotexists ( - 3818 IGNR 1 0 0 0 wt_assert.g_testcase := 'OBJNOTEXISTS Happy Path 3'; - 3819 IGNR 1 0 0 0 objnotexists ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 3823 IGNR 1 1 1 1 wt_assert.g_testcase := 'OBJNOTEXISTS Sad Path 1'; - 3824 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 3825 IGNR 1 0 0 0 objnotexists ( - 3829 IGNR 1 2 2 2 temp_rec := g_rec; - 3830 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 3832 IGNR 1 0 0 0 wt_assert.eq ( - 3836 IGNR 1 0 0 0 wt_assert.eq ( - 3841 IGNR 1 1 1 1 wt_assert.g_testcase := 'OBJNOTEXISTS Sad Path 2'; - 3842 IGNR 1 0 0 0 wtplsql_skip_save := TRUE; - 3844 IGNR 1 0 0 0 objnotexists ( - 3849 IGNR 0 0 0 0 l_found_exception := FALSE; - 3850 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then - 3851 IGNR 1 0 0 0 l_found_exception := TRUE; - 3852 IGNR 0 1 1 1 end; - 3854 IGNR 1 1 1 1 temp_rec := g_rec; - 3855 IGNR 1 0 0 0 wtplsql_skip_save := FALSE; - 3856 IGNR 1 0 0 0 wt_assert.eq ( - 3860 IGNR 1 0 0 0 wt_assert.eq ( - 3864 IGNR 1 1 1 1 end t_object_not_exists; - 3873 IGNR 0 5 5 5 procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_ASSERT:PACKAGE BODY" %-- - 3876 IGNR 1 2874 2874 2874 select temp_clob, temp_nclob, temp_xml, temp_blob - 3880 IGNR 1 1 1 1 t_boolean_to_status; - 3881 IGNR 1 0 0 0 t_process_assertion; - 3882 IGNR 1 0 0 0 t_compare_queries; - 3883 IGNR 1 0 0 0 t_nls_settings; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 3884 IGNR 1 0 0 0 t_last_values; - 3885 IGNR 1 0 0 0 t_reset_globals; - 3886 IGNR 1 0 0 0 t_this; - 3887 IGNR 1 0 0 0 t_eq; - 3888 IGNR 1 0 0 0 t_isnotnull; - 3889 IGNR 1 0 0 0 t_isnull; - 3891 IGNR 1 0 0 0 t_raises; - 3892 IGNR 1 0 0 0 t_eqqueryvalue; - 3893 IGNR 1 1 1 1 t_eqquery; - 3894 IGNR 1 0 0 0 t_eqtable; - 3895 IGNR 1 1 1 1 t_eqtabcount; - 3896 IGNR 1 1 1 1 t_object_exists; - 3897 IGNR 1 0 0 0 t_object_not_exists; - 3898 IGNR 1 2 2 2 end WTPLSQL_RUN; - 3903 EXCL 0 0 0 0 end wt_assert; + wtPLSQL 1.2.0 - Start Date/Time: 23-Nov-2018 07:22:20 AM +Test Results for WTP.TR1 +---------------------------------------- + Minimum Elapsed msec: 0 Total Testcases: 1 + Average Elapsed msec: 0 Total Assertions: 2 + Maximum Elapsed msec: 0 Failed Assertions: 1 + Total Run Time (sec): 0.0 Test Yield: 50.00% - wtPLSQL 1.1.0 - Run ID 7: 29-Jun-2018 03:22:00 PM +WTP.TR1 Test Runner Details: +---------------------------------------- +#FAIL# 0ms Test 2. EQ - Expected "2" and got "1" - Test Results for WTP.WT_PROFILER - Total Test Cases: 41 Total Assertions: 265 - Minimum Interval msec: 0 Failed Assertions: 1 - Average Interval msec: 5 Error Assertions: 0 - Maximum Interval msec: 129 Test Yield: 99.60% - Total Run Time (sec): 1.3 - Code Coverage for PACKAGE BODY WTP.WT_PROFILER - Ignored Lines: 534 Total Profiled Lines: 696 - Excluded Lines: 2 Total Executed Lines: 143 - Minimum LineExec usec: 0 Not Executed Lines: 6 - Average LineExec usec: 672 Unknown Lines: 11 - Maximum LineExec usec: 86060 Code Coverage: 96.00% - Trigger Source Offset: 0 + wtPLSQL 1.2.0 - Start Date/Time: 23-Nov-2018 07:22:20 AM - - WTP.WT_PROFILER Test Result Details (Test Run ID 7) ------------------------------------------------------------ - ---- Test Case: Get Error Messages - PASS 129ms ERROR_PARAM Test 1. ISNOTNULL - Expected NOT NULL and got "DBMS_PROFILER Error: A subprogram was called with an incorrect parameter." - PASS 1ms ERROR_PARAM Test 2. THIS - Expected "TRUE" and got "TRUE" - PASS 0ms ERROR_IO Test 1. ISNOTNULL - Expected NOT NULL and got "DBMS_PROFILER Error: Data flush operation failed. Check whether the profiler tables have been created, are accessible, and that there is adequate space." - PASS 0ms ERROR_IO Test 2. THIS - Expected "TRUE" and got "TRUE" - PASS 0ms ERROR_VERSION Test 1. ISNOTNULL - Expected NOT NULL and got "DBMS_PROFILER Error: There is a mismatch between package and database implementation. Oracle returns this error if an incorrect version of the DBMS_PROFILER package is installed, and if the version of the profiler package cannot work with this database version." - PASS 0ms ERROR_VERSION Test 2. THIS - Expected "TRUE" and got "TRUE" - PASS 0ms Unknown Error Test 1. ISNOTNULL - Expected NOT NULL and got "DBMS_PROFILER Error: Unknown error number -9999" - PASS 0ms Unknown Error Test 2. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: Delete PL/SQL Profiler Records Happy Path 1 - PASS 1ms delete_plsql_profiler_recs(-99) 1. ISNULL - Expected NULL and got "" - PASS 1ms Number of plsql_profiler_runs (-99). EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from plsql_profiler_runs where runid = -99 - PASS 5ms Number of plsql_profiler_units (-99). EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from plsql_profiler_units where runid = -99 - PASS 3ms Number of plsql_profiler_data (-99). EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from plsql_profiler_data where runid = -99 - ---- Test Case: Delete PL/SQL Profiler Records Happy Path 2 - PASS 4ms insert plsql_profiler_runs (-99). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into plsql_profiler_runs (runid) values (-99)". - PASS 6ms insert plsql_profiler_units (-99). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into plsql_profiler_units (runid, unit_number, total_time) values (-99, -99, 0)". - PASS 2ms insert plsql_profiler_data (RUNID: -99). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into plsql_profiler_data (runid, unit_number, line#) values (-99, -99, 0)". - PASS 1ms Number of plsql_profiler_runs (-99). EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from plsql_profiler_runs where runid = -99 - PASS 1ms Number of plsql_profiler_units (-99). EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from plsql_profiler_units where runid = -99 - PASS 0ms Number of plsql_profiler_data (-99). EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from plsql_profiler_data where runid = -99 - PASS 1ms delete_plsql_profiler_recs(-99) 2. ISNULL - Expected NULL and got "" - PASS 0ms Number of plsql_profiler_runs (-99). EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from plsql_profiler_runs where runid = -99 - PASS 0ms Number of plsql_profiler_units (-99). EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from plsql_profiler_units where runid = -99 - PASS 1ms Number of plsql_profiler_data (-99). EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from plsql_profiler_data where runid = -99 - ---- Test Case: Find DBOUT Setup - PASS 13ms Compile package WT_PROFILE_FIND_DBOUT. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package WT_PROFILE_FIND_DBOUT is\n l_junk number;\nend WT_PROFILE_FIND_DBOUT;". - PASS 0ms Compile package WT_PROFILE_FIND_DBOUT Error. ISNULL - Expected NULL and got "" - PASS 1ms WT_PROFILE_FIND_DBOUT package. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_FIND_DBOUT"(PACKAGE) is 1 - ---- Test Case: Find DBOUT Happy Path 1 - PASS 11ms Compile package body WT_PROFILE_FIND_DBOUT. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_FIND_DBOUT is\nbegin\n l_junk := 1;\nend WT_PROFILE_FIND_DBOUT;". - PASS 1ms Compile package body WT_PROFILE_FIND_DBOUT Error. ISNULL - Expected NULL and got "" - PASS 0ms WT_PROFILE_FIND_DBOUT package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_FIND_DBOUT"(PACKAGE BODY) is 1 - PASS 1ms l_recTEST.dbout_owner. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.dbout_name. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.dbout_type. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.error_message. ISNULL - Expected NULL and got "" - ---- Test Case: Find DBOUT Happy Path 2 - PASS 20ms Compile package body WT_PROFILE_FIND_DBOUT. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_FIND_DBOUT is\n --% WTPLSQL SET DBOUT "WT_PROFILE_FIND_DBOUT:PACKAGE BODY" %--\nbegin\n l_junk := 1;\nend WT_PROFILE_FIND_DBOUT;". - PASS 1ms Compile package body WT_PROFILE_FIND_DBOUT Error. ISNULL - Expected NULL and got "" - PASS 0ms WT_PROFILE_FIND_DBOUT package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_FIND_DBOUT"(PACKAGE BODY) is 1 - PASS 88ms l_recTEST.dbout_owner. EQ - Expected "WTP" and got "WTP" - PASS 1ms l_recTEST.dbout_name. EQ - Expected "WT_PROFILE_FIND_DBOUT" and got "WT_PROFILE_FIND_DBOUT" - PASS 0ms l_recTEST.dbout_type. EQ - Expected "PACKAGE BODY" and got "PACKAGE BODY" - PASS 0ms l_recTEST.error_message. ISNULL - Expected NULL and got "" - ---- Test Case: Find DBOUT Happy Path 3 - PASS 22ms Compile package body WT_PROFILE_FIND_DBOUT. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_FIND_DBOUT is\n --% WTPLSQL SET DBOUT "WTP.WT_PROFILE_FIND_DBOUT:PACKAGE BODY" %--\nbegin\n l_junk := 1;\nend WT_PROFILE_FIND_DBOUT;". - PASS 0ms Compile package body WT_PROFILE_FIND_DBOUT Error. ISNULL - Expected NULL and got "" - PASS 1ms WT_PROFILE_FIND_DBOUT package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_FIND_DBOUT"(PACKAGE BODY) is 1 - PASS 75ms l_recTEST.dbout_owner. EQ - Expected "WTP" and got "WTP" - PASS 0ms l_recTEST.dbout_name. EQ - Expected "WT_PROFILE_FIND_DBOUT" and got "WT_PROFILE_FIND_DBOUT" - PASS 0ms l_recTEST.dbout_type. EQ - Expected "PACKAGE BODY" and got "PACKAGE BODY" - PASS 0ms l_recTEST.error_message. ISNULL - Expected NULL and got "" - ---- Test Case: Find DBOUT Sad Path 1 - PASS 25ms Compile package body WT_PROFILE_FIND_DBOUT. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_FIND_DBOUT is\n --% WTPLSQL SET DBOUT "BOGUS1" %--\nbegin\n l_junk := 1;\nend WT_PROFILE_FIND_DBOUT;". - PASS 0ms Compile package body WT_PROFILE_FIND_DBOUT Error. ISNULL - Expected NULL and got "" - PASS 1ms WT_PROFILE_FIND_DBOUT package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_FIND_DBOUT"(PACKAGE BODY) is 1 - PASS 72ms l_recTEST.dbout_owner. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.dbout_name. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.dbout_type. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.error_message. EQ - Expected "Unable to find database object "BOGUS1"." and got "Unable to find database object "BOGUS1"." - ---- Test Case: Find DBOUT Sad Path 2 - PASS 21ms Compile package body WT_PROFILE_FIND_DBOUT. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_FIND_DBOUT is\n --% WTPLSQL SET DBOUT "WTP.WT_PROFILE_FIND_DBOUT" %--\nbegin\n l_junk := 1;\nend WT_PROFILE_FIND_DBOUT;". - PASS 2ms Compile package body WT_PROFILE_FIND_DBOUT Error. ISNULL - Expected NULL and got "" - PASS 2ms WT_PROFILE_FIND_DBOUT package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_FIND_DBOUT"(PACKAGE BODY) is 1 - PASS 69ms l_recTEST.dbout_owner. EQ - Expected "WTP" and got "WTP" - PASS 0ms l_recTEST.dbout_name. EQ - Expected "WT_PROFILE_FIND_DBOUT" and got "WT_PROFILE_FIND_DBOUT" - PASS 0ms l_recTEST.error_message. EQ - Expected "Found too many database objects "WTP.WT_PROFILE_FIND_DBOUT"." and got "Found too many database objects "WTP.WT_PROFILE_FIND_DBOUT"." - ---- Test Case: Find DBOUT Sad Path 3 - PASS 22ms Compile package body WT_PROFILE_FIND_DBOUT. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_FIND_DBOUT is\n --% WTPLSQL SET DBOUT "SYS.ALL_OBJECTS:VIEW" %--\nbegin\n l_junk := 1;\nend WT_PROFILE_FIND_DBOUT;". - PASS 1ms Compile package body WT_PROFILE_FIND_DBOUT Error. ISNULL - Expected NULL and got "" - PASS 0ms WT_PROFILE_FIND_DBOUT package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_FIND_DBOUT"(PACKAGE BODY) is 1 - PASS 78ms l_recTEST.dbout_owner. EQ - Expected "SYS" and got "SYS" - PASS 0ms l_recTEST.dbout_name. EQ - Expected "ALL_OBJECTS" and got "ALL_OBJECTS" - PASS 0ms l_recTEST.dbout_type. EQ - Expected "VIEW" and got "VIEW" - PASS 0ms l_recTEST.error_message. ISNULL - Expected NULL and got "" - ---- Test Case: Find DBOUT Teardown - PASS 23ms drop package WT_PROFILE_FIND_DBOUT. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "drop package WT_PROFILE_FIND_DBOUT". - PASS 0ms WT_PROFILE_FIND_DBOUT package. OBJNOTEXISTS - Number of objects found for "WTP.WT_PROFILE_FIND_DBOUT"(PACKAGE) is 0 - ---- Test Case: Load Ignr Setup - PASS 0ms Number of IGNR_AA elements. ISNOTNULL - Expected NOT NULL and got "0" - PASS 14ms Compile package WT_PROFILE_LOAD_IGNR. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package WT_PROFILE_LOAD_IGNR is\n l_junk number;\nend WT_PROFILE_LOAD_IGNR;". - PASS 0ms Compile package WT_PROFILE_LOAD_IGNR Error. ISNULL - Expected NULL and got "" - PASS 1ms WT_PROFILE_LOAD_IGNR package. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_LOAD_IGNR"(PACKAGE) is 1 - ---- Test Case: Load Ignr Happy Path 1 - PASS 10ms Compile package body WT_PROFILE_LOAD_IGNR. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_LOAD_IGNR is\nbegin\n l_junk := 1;\nend WT_PROFILE_LOAD_IGNR;". - PASS 1ms Compile package body WT_PROFILE_LOAD_IGNR Error. ISNULL - Expected NULL and got "" - PASS 0ms WT_PROFILE_LOAD_IGNR package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_LOAD_IGNR"(PACKAGE BODY) is 1 - PASS 1ms l_ignrTest.COUNT. EQ - Expected "0" and got "0" - ---- Test Case: Load Ignr Happy Path 2 - PASS 19ms Compile package body WT_PROFILE_LOAD_IGNR. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_LOAD_IGNR is\nbegin\n --%WTPLSQL_begin_ignore_lines%--\n l_junk := 1;\nend WT_PROFILE_LOAD_IGNR;". - PASS 1ms Compile package body WT_PROFILE_LOAD_IGNR Error. ISNULL - Expected NULL and got "" - PASS 1ms WT_PROFILE_LOAD_IGNR package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_LOAD_IGNR"(PACKAGE BODY) is 1 - PASS 44ms l_ignrTest.COUNT. EQ - Expected "3" and got "3" - PASS 0ms l_ignrTest.exists(3). EQ - Expected "TRUE" and got "TRUE" - PASS 0ms l_ignrTest.exists(4). EQ - Expected "TRUE" and got "TRUE" - PASS 0ms l_ignrTest.exists(5). EQ - Expected "TRUE" and got "TRUE" - ---- Test Case: Load Ignr Happy Path 3 - PASS 20ms Compile package body WT_PROFILE_LOAD_IGNR. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_LOAD_IGNR is\nbegin\n l_junk := 1;\n --%WTPLSQL_begin_ignore_lines%--\n l_junk := 2;\n --%WTPLSQL_end_ignore_lines%--\n l_junk := 3;\nend WT_PROFILE_LOAD_IGNR;". - PASS 0ms Compile package body WT_PROFILE_LOAD_IGNR Error. ISNULL - Expected NULL and got "" - PASS 1ms WT_PROFILE_LOAD_IGNR package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_LOAD_IGNR"(PACKAGE BODY) is 1 - PASS 1ms l_ignrTest.COUNT. EQ - Expected "3" and got "3" - PASS 0ms l_ignrTest.exists(4). EQ - Expected "TRUE" and got "TRUE" - PASS 0ms l_ignrTest.exists(5). EQ - Expected "TRUE" and got "TRUE" - PASS 0ms l_ignrTest.exists(6). EQ - Expected "TRUE" and got "TRUE" - ---- Test Case: Load Ignr Happy Path 4 - PASS 18ms Compile package body WT_PROFILE_LOAD_IGNR. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_LOAD_IGNR is\nbegin\n l_junk := 1;\n --%WTPLSQL_begin_ignore_lines%--\n l_junk := 2;\n --%WTPLSQL_end_ignore_lines%--\n l_junk := 3;\n --%WTPLSQL_begin_ignore_lines%--\n l_junk := 4;\nend WT_PROFILE_LOAD_IGNR;". - PASS 0ms Compile package body WT_PROFILE_LOAD_IGNR Error. ISNULL - Expected NULL and got "" - PASS 1ms WT_PROFILE_LOAD_IGNR package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_LOAD_IGNR"(PACKAGE BODY) is 1 - PASS 2ms l_ignrTest.COUNT. EQ - Expected "6" and got "6" - PASS 0ms l_ignrTest.exists(4). EQ - Expected "TRUE" and got "TRUE" - PASS 0ms l_ignrTest.exists(5). EQ - Expected "TRUE" and got "TRUE" - PASS 2ms l_ignrTest.exists(6). EQ - Expected "TRUE" and got "TRUE" - PASS 0ms l_ignrTest.exists(8). EQ - Expected "TRUE" and got "TRUE" - PASS 0ms l_ignrTest.exists(9). EQ - Expected "TRUE" and got "TRUE" - PASS 0ms l_ignrTest.exists(10). EQ - Expected "TRUE" and got "TRUE" - ---- Test Case: Load Ignr Sad Path 1 - PASS 25ms Compile package body WT_PROFILE_LOAD_IGNR. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_LOAD_IGNR is\nbegin\n --%WTPLSQL_end_ignore_lines%--\n l_junk := 4;\nend WT_PROFILE_LOAD_IGNR;". - PASS 0ms Compile package body WT_PROFILE_LOAD_IGNR Error. ISNULL - Expected NULL and got "" - PASS 1ms WT_PROFILE_LOAD_IGNR package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_LOAD_IGNR"(PACKAGE BODY) is 1 - PASS 0ms l_ignrTest.COUNT. EQ - Expected "0" and got "0" - ---- Test Case: Load Ignr Sad Path 2 - PASS 21ms Compile package body WT_PROFILE_LOAD_IGNR. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_LOAD_IGNR is\nbegin\n l_junk := 1;\n --%WTPLSQL_begin_ignore_lines%--\n l_junk := 2;\n --%WTPLSQL_end_ignore_lines%--\n l_junk := 3;\n --%WTPLSQL_end_ignore_lines%--\n l_junk := 4;\nend WT_PROFILE_LOAD_IGNR;". - PASS 0ms Compile package body WT_PROFILE_LOAD_IGNR Error. ISNULL - Expected NULL and got "" - PASS 4ms WT_PROFILE_LOAD_IGNR package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_LOAD_IGNR"(PACKAGE BODY) is 1 - PASS 2ms l_ignrTest.COUNT. EQ - Expected "3" and got "3" - PASS 0ms l_ignrTest.exists(4). EQ - Expected "TRUE" and got "TRUE" - PASS 0ms l_ignrTest.exists(5). EQ - Expected "TRUE" and got "TRUE" - PASS 0ms l_ignrTest.exists(6). EQ - Expected "TRUE" and got "TRUE" - ---- Test Case: Load Ignr Sad Path 3 - PASS 21ms Compile package body WT_PROFILE_LOAD_IGNR. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_LOAD_IGNR is\nbegin\n l_junk := 1;\n --%WTPLSQL_begin_ignore_lines%--\n l_junk := 2;\n --%WTPLSQL_begin_ignore_lines%--\n l_junk := 3;\n --%WTPLSQL_end_ignore_lines%--\n l_junk := 4;\nend WT_PROFILE_LOAD_IGNR;". - PASS 0ms Compile package body WT_PROFILE_LOAD_IGNR Error. ISNULL - Expected NULL and got "" - PASS 1ms WT_PROFILE_LOAD_IGNR package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_LOAD_IGNR"(PACKAGE BODY) is 1 - PASS 1ms l_ignrTest.COUNT. EQ - Expected "5" and got "5" - PASS 0ms l_ignrTest.exists(4). EQ - Expected "TRUE" and got "TRUE" - PASS 0ms l_ignrTest.exists(5). EQ - Expected "TRUE" and got "TRUE" - PASS 0ms l_ignrTest.exists(6). EQ - Expected "TRUE" and got "TRUE" - PASS 0ms l_ignrTest.exists(7). EQ - Expected "TRUE" and got "TRUE" - PASS 0ms l_ignrTest.exists(8). EQ - Expected "TRUE" and got "TRUE" - ---- Test Case: Load Ignr Teardown - PASS 25ms drop package WT_PROFILE_LOAD_IGNR. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "drop package WT_PROFILE_LOAD_IGNR". - PASS 1ms WT_PROFILE_LOAD_IGNR package. OBJNOTEXISTS - Number of objects found for "WTP.WT_PROFILE_LOAD_IGNR"(PACKAGE) is 0 - PASS 0ms Number of IGNR_AA elements. ISNOTNULL - Expected NOT NULL and got "0" - ---- Test Case: Insert DBOUT Profile Setup - PASS 15ms Compile package WT_PROFILE_INSERT_DBOUT. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package WT_PROFILE_INSERT_DBOUT is\n l_junk number;\nend WT_PROFILE_INSERT_DBOUT;". - PASS 0ms Compile package WT_PROFILE_INSERT_DBOUT Error. ISNULL - Expected NULL and got "" - PASS 1ms WT_PROFILE_INSERT_DBOUT package. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_INSERT_DBOUT"(PACKAGE) is 1 - PASS 9ms Compile package body WT_PROFILE_INSERT_DBOUT. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_INSERT_DBOUT is\nbegin\n l_junk := 1;\n --%WTPLSQL_begin_ignore_lines%--\n l_junk := 2;\n --%WTPLSQL_end_ignore_lines%--\n if 0 = 1 then\n l_junk := 3;\n end if;\nend WT_PROFILE_INSERT_DBOUT;". - PASS 1ms Compile package body WT_PROFILE_INSERT_DBOUT Error. ISNULL - Expected NULL and got "" - PASS 0ms WT_PROFILE_INSERT_DBOUT package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_INSERT_DBOUT"(PACKAGE BODY) is 1 - PASS 2ms insert plsql_profiler_runs (-97). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into plsql_profiler_runs (runid) values (-97)". - PASS 3ms insert plsql_profiler_units (-97). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into plsql_profiler_units (runid, unit_number, total_time) values (-97, -97, 0)". - PASS 3ms insert plsql_profiler_data (RUNID: -97). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into plsql_profiler_data (runid, unit_number, line#) values (-97, -97, 0)". - PASS 1ms Number of plsql_profiler_runs (-97). EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from plsql_profiler_runs where runid = -97 - PASS 2ms Number of plsql_profiler_units (-97). EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from plsql_profiler_units where runid = -97 - PASS 2ms Number of plsql_profiler_data (-97). EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from plsql_profiler_data where runid = -97 - PASS 1ms Insert wt_test_runs (-97). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into wt_test_runs (id, start_dtm, runner_owner, runner_name) values (-97, sysdate, USER, 'Insert DBOUT Test')". - PASS 1ms wt_test_runs (-97) Count. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_test_runs where id = -97 - PASS 2ms insert UNIT 1 into plsql_profiler_units. ISNULL - Expected NULL and got "" - PASS 1ms Number of UNIT 1 plsql_profiler_units. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from plsql_profiler_units where runid = -97 and unit_number = 1 - PASS 4ms insert plsql_profiler_data (LINE#: 1). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion" - PASS 1ms insert plsql_profiler_data (LINE#: 2). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion" - PASS 0ms insert plsql_profiler_data (LINE#: 3). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion" - PASS 0ms insert plsql_profiler_data (LINE#: 5). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion" - PASS 1ms insert plsql_profiler_data (LINE#: 7). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion" - PASS 0ms insert plsql_profiler_data (LINE#: 8). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion" - PASS 1ms insert plsql_profiler_data (LINE#: 9). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion" - PASS 1ms insert plsql_profiler_data (LINE#: 10). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion" - PASS 5ms Number of UNIT 1 plsql_profiler_data. EQQUERYVALUE - Expected "8" and got "8" for Query: select count(*) from plsql_profiler_data where runid = -97 and unit_number = 1 - ---- Test Case: Insert DBOUT Profile Happy Path - PASS 4ms SQLERRM. ISNULL - Expected NULL and got "" - PASS 6ms wt_dbout_profiles line 1, column STATUS. EQQUERYVALUE - Expected "EXCL" and got "EXCL" for Query: select STATUS from wt_dbout_profiles where test_run_id = -97 and line = 1 - PASS 2ms wt_dbout_profiles line 1, column TEXT. EQQUERYVALUE - Expected "package body WT_PROFILE_INSERT_DBOUT is\n" and got "package body WT_PROFILE_INSERT_DBOUT is\n" for Query: select TEXT from wt_dbout_profiles where test_run_id = -97 and line = 1 -#FAIL# 2ms wt_dbout_profiles line 2, column STATUS. EQQUERYVALUE - Expected "UNKN" and got "NOTX" for Query: select STATUS from wt_dbout_profiles where test_run_id = -97 and line = 2 - PASS 1ms wt_dbout_profiles line 2, column TEXT. EQQUERYVALUE - Expected "begin\n" and got "begin\n" for Query: select TEXT from wt_dbout_profiles where test_run_id = -97 and line = 2 - PASS 1ms wt_dbout_profiles line 3, column STATUS. EQQUERYVALUE - Expected "EXEC" and got "EXEC" for Query: select STATUS from wt_dbout_profiles where test_run_id = -97 and line = 3 - PASS 1ms wt_dbout_profiles line 3, column TEXT. EQQUERYVALUE - Expected " l_junk := 1;\n" and got " l_junk := 1;\n" for Query: select TEXT from wt_dbout_profiles where test_run_id = -97 and line = 3 - PASS 1ms wt_dbout_profiles line 5, column STATUS. EQQUERYVALUE - Expected "IGNR" and got "IGNR" for Query: select STATUS from wt_dbout_profiles where test_run_id = -97 and line = 5 - PASS 1ms wt_dbout_profiles line 5, column TEXT. EQQUERYVALUE - Expected " l_junk := 2;\n" and got " l_junk := 2;\n" for Query: select TEXT from wt_dbout_profiles where test_run_id = -97 and line = 5 - PASS 2ms wt_dbout_profiles line 7, column STATUS. EQQUERYVALUE - Expected "EXEC" and got "EXEC" for Query: select STATUS from wt_dbout_profiles where test_run_id = -97 and line = 7 - PASS 2ms wt_dbout_profiles line 7, column TEXT. EQQUERYVALUE - Expected " if 0 = 1 then\n" and got " if 0 = 1 then\n" for Query: select TEXT from wt_dbout_profiles where test_run_id = -97 and line = 7 - PASS 2ms wt_dbout_profiles line 8, column STATUS. EQQUERYVALUE - Expected "NOTX" and got "NOTX" for Query: select STATUS from wt_dbout_profiles where test_run_id = -97 and line = 8 - PASS 1ms wt_dbout_profiles line 8, column TEXT. EQQUERYVALUE - Expected " l_junk := 3;\n" and got " l_junk := 3;\n" for Query: select TEXT from wt_dbout_profiles where test_run_id = -97 and line = 8 - PASS 2ms wt_dbout_profiles line 9, column STATUS. EQQUERYVALUE - Expected "EXEC" and got "EXEC" for Query: select STATUS from wt_dbout_profiles where test_run_id = -97 and line = 9 - PASS 1ms wt_dbout_profiles line 9, column TEXT. EQQUERYVALUE - Expected " end if;\n" and got " end if;\n" for Query: select TEXT from wt_dbout_profiles where test_run_id = -97 and line = 9 - PASS 2ms wt_dbout_profiles line 10, column STATUS. EQQUERYVALUE - Expected "EXCL" and got "EXCL" for Query: select STATUS from wt_dbout_profiles where test_run_id = -97 and line = 10 - PASS 1ms wt_dbout_profiles line 10, column TEXT. EQQUERYVALUE - Expected "end WT_PROFILE_INSERT_DBOUT;" and got "end WT_PROFILE_INSERT_DBOUT;" for Query: select TEXT from wt_dbout_profiles where test_run_id = -97 and line = 10 - ---- Test Case: Insert DBOUT Profile Teardown - PASS 4ms Delete wt_dbout_profiles (-97). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from wt_dbout_profiles where test_run_id = -97". - PASS 7ms wt_dbout_profiles (-97) Count. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_dbout_profiles where test_run_id = -97 - PASS 3ms Delete wt_test_runs (-97). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from wt_test_runs where id = -97". - PASS 0ms wt_test_runs (-97) Count. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_test_runs where id = -97 - PASS 3ms delete plsql_profiler_data (-97). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from plsql_profiler_data where runid = -97". - PASS 3ms delete plsql_profiler_units (-97). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from plsql_profiler_units where runid = -97". - PASS 1ms delete plsql_profiler_runs (-97). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from plsql_profiler_runs where runid = -97". - PASS 1ms Number of plsql_profiler_runs (-97). EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from plsql_profiler_runs where runid = -97 - PASS 0ms Number of plsql_profiler_units (-97). EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from plsql_profiler_units where runid = -97 - PASS 0ms Number of plsql_profiler_data (-97). EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from plsql_profiler_data where runid = -97 - PASS 24ms drop package WT_PROFILE_INSERT_DBOUT. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "drop package WT_PROFILE_INSERT_DBOUT". - PASS 1ms WT_PROFILE_INSERT_DBOUT package. OBJNOTEXISTS - Number of objects found for "WTP.WT_PROFILE_INSERT_DBOUT"(PACKAGE) is 0 - ---- Test Case: Insert DBOUT Profile Setup - PASS 22ms Compile package WT_PROFILE_INITIALIZE. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package WT_PROFILE_INITIALIZE is\n l_junk number;\nend WT_PROFILE_INITIALIZE;". - PASS 1ms Compile package WT_PROFILE_INITIALIZE Error. ISNULL - Expected NULL and got "" - PASS 0ms WT_PROFILE_INITIALIZE package. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_INITIALIZE"(PACKAGE) is 1 - ---- Test Case: Initialize Test HAPPY Path 1 - PASS 16ms Compile package body WT_PROFILE_INITIALIZE. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_INITIALIZE is\nbegin\n l_junk := 7;\nend WT_PROFILE_INITIALIZE;". - PASS 0ms Compile package body WT_PROFILE_INITIALIZE Error. ISNULL - Expected NULL and got "" - PASS 1ms WT_PROFILE_INITIALIZE package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_INITIALIZE"(PACKAGE BODY) is 1 - PASS 0ms OUT dbout_owner. ISNULL - Expected NULL and got "" - PASS 0ms OUT dbout_name. ISNULL - Expected NULL and got "" - PASS 0ms OUT dbout_type. ISNULL - Expected NULL and got "" - PASS 0ms OUT prof_runid. ISNULL - Expected NULL and got "" - PASS 1ms OUT trigger_offset. ISNULL - Expected NULL and got "" - PASS 0ms OUT error_message. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.dbout_owner. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.dbout_name. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.dbout_type. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.prof_runid. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.trigger_offset. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.error_message. ISNULL - Expected NULL and got "" - ---- Test Case: Initialize Test HAPPY Path 2 - PASS 17ms Compile package body WT_PROFILE_INITIALIZE. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_INITIALIZE is\nbegin\n--% WTPLSQL SET DBOUT "WT_PROFILE_INITIALIZE:PACKAGE BODY" %--\n l_junk := 7;\nend WT_PROFILE_INITIALIZE;". - PASS 1ms Compile package body WT_PROFILE_INITIALIZE Error. ISNULL - Expected NULL and got "" - PASS 1ms WT_PROFILE_INITIALIZE package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_INITIALIZE"(PACKAGE BODY) is 1 - PASS 86ms OUT dbout_owner. EQ - Expected "WTP" and got "WTP" - PASS 0ms OUT dbout_name. EQ - Expected "WT_PROFILE_INITIALIZE" and got "WT_PROFILE_INITIALIZE" - PASS 0ms OUT dbout_type. EQ - Expected "PACKAGE BODY" and got "PACKAGE BODY" - PASS 0ms OUT prof_runid. ISNOTNULL - Expected NOT NULL and got "5" - PASS 1ms OUT trigger_offset. EQ - Expected "0" and got "0" - PASS 0ms OUT error_message. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.dbout_owner. EQ - Expected "WTP" and got "WTP" - PASS 0ms l_recTEST.dbout_name. EQ - Expected "WT_PROFILE_INITIALIZE" and got "WT_PROFILE_INITIALIZE" - PASS 0ms l_recTEST.dbout_type. EQ - Expected "PACKAGE BODY" and got "PACKAGE BODY" - PASS 0ms l_recTEST.prof_runid. ISNOTNULL - Expected NOT NULL and got "5" - PASS 0ms l_recTEST.trigger_offset. EQ - Expected "0" and got "0" - PASS 0ms l_recTEST.error_message. ISNULL - Expected NULL and got "" - ---- Test Case: Initialize Test Sad Path 1 - PASS 1ms SQLERRM. EQ - Expected "ORA-20004: i_test_run_id is null" and got "ORA-20004: i_test_run_id is null" - ---- Test Case: Insert DBOUT Profile Teardown - PASS 22ms drop package WT_PROFILE_INITIALIZE. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "drop package WT_PROFILE_INITIALIZE". - PASS 2ms WT_PROFILE_INITIALIZE package. OBJNOTEXISTS - Number of objects found for "WTP.WT_PROFILE_INITIALIZE"(PACKAGE) is 0 - ---- Test Case: Finalize Happy Path 1 - PASS 0ms g_rec.prof_runid. ISNULL - Expected NULL and got "" - PASS 0ms format_error_stack and format_error_backtrace. ISNULL - Expected NULL and got "" - ---- Test Case: Finalize Happy Path 2 - PASS 0ms SQLERRM. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.test_run_id. ISNULL - Expected NULL and got "" - PASS 1ms l_recTEST.dbout_owner. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.dbout_name. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.dbout_type. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.prof_runid. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.trigger_offset. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.error_message. ISNULL - Expected NULL and got "" - ---- Test Case: Finalize Sad Path 1 - PASS 0ms SQLERRM. EQ - Expected "ORA-20000: g_rec.test_run_id is null" and got "ORA-20000: g_rec.test_run_id is null" - ---- Test Case: Trigger Offset Happy Path - PASS 22ms Trigger Test. EQ - Expected "3" and got "3" - PASS 1ms Package Test. EQ - Expected "0" and got "0" - ---- Test Case: Trigger Offset Sad Path - PASS 0ms Non Existent Object. EQ - Expected "0" and got "0" - ---- Test Case: Calculate Percent Coverage Setup - PASS 1ms Insert wt_test_runs (-95). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into wt_test_runs (id, start_dtm, runner_owner, runner_name) values (-95, sysdate, USER, 'Calculate Offset Test')". - PASS 2ms wt_test_runs (-95) Count. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_test_runs where id = -95 - ---- Test Case: Calculate Percent Coverage Happy Path 1 - PASS 0ms Insert wt_dbout_profiles (-95,1). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion" - PASS 2ms wt_dbout_profiles (-95,1) Count. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_dbout_profiles where test_run_id = -95 and line = 1 - PASS 0ms Insert wt_dbout_profiles (-95,2). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion" - PASS 2ms wt_dbout_profiles (-95,2) Count. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_dbout_profiles where test_run_id = -95 and line = 2 - PASS 0ms Insert wt_dbout_profiles (-95,3). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion" - PASS 2ms wt_dbout_profiles (-95,3) Count. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_dbout_profiles where test_run_id = -95 and line = 3 - PASS 4ms Main Test. EQ - Expected "66.67" and got "66.67" - PASS 5ms Delete wt_dbout_profiles (-95). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from wt_dbout_profiles where test_run_id = -95". - PASS 4ms wt_dbout_profiles (-95) Count. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_dbout_profiles where test_run_id = -95 - ---- Test Case: Calculate Percent Coverage Happy Path 2 - PASS 2ms Insert wt_dbout_profiles (-95,1). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion" - PASS 0ms wt_dbout_profiles (-95,1) Count. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_dbout_profiles where test_run_id = -95 and line = 1 - PASS 1ms Insert wt_dbout_profiles (-95,2). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion" - PASS 1ms wt_dbout_profiles (-95,2) Count. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_dbout_profiles where test_run_id = -95 and line = 2 - PASS 0ms Insert wt_dbout_profiles (-95,3). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion" - PASS 0ms wt_dbout_profiles (-95,3) Count. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_dbout_profiles where test_run_id = -95 and line = 3 - PASS 0ms Main Test. EQ - Expected "-1" and got "-1" - PASS 1ms Delete wt_dbout_profiles (-95). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from wt_dbout_profiles where test_run_id = -95". - PASS 0ms wt_dbout_profiles (-95) Count. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_dbout_profiles where test_run_id = -95 - ---- Test Case: Calculate Percent Coverage Sad Path - PASS 0ms Missing Test Run ID. ISNULL - Expected NULL and got "" - PASS 0ms NULL Test Run ID. ISNULL - Expected NULL and got "" - ---- Test Case: Calculate Percent Coverage Teardown - PASS 2ms Delete wt_test_runs (-95). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from wt_test_runs where id = -95". - PASS 0ms wt_test_runs (-95) Count. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_test_runs where id = -95 - ---- Test Case: Delete Records Setup - PASS 2ms wt_test_runs Count 0. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_test_runs where id = -98 - PASS 6ms wt_dbout_profiles Count 0. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_dbout_profiles where test_run_id = -98 - PASS 1ms Insert wt_test_runs (-98). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into wt_test_runs (id, start_dtm, runner_owner, runner_name) values (-98, sysdate, USER, 'Delete Records Test')". - PASS 0ms wt_test_runs (-98) Count. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_test_runs where id = -98 - PASS 1ms Insert wt_dbout_profiles (-98,1). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion" - PASS 1ms wt_dbout_profiles (-98,1) Count. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_dbout_profiles where test_run_id = -98 and line = 1 - ---- Test Case: Delete Records Happy Path 1 - PASS 1ms SQLERRM. ISNULL - Expected NULL and got "" - PASS 0ms wt_dbout_profiles Count 2. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_dbout_profiles where test_run_id = -98 - ---- Test Case: Delete Records Sad Path 1 - PASS 1ms SQLERRM. ISNULL - Expected NULL and got "" - PASS 0ms wt_dbout_profiles Count 2. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_dbout_profiles where test_run_id = -98 - ---- Test Case: Delete Records Sad Path 2 - PASS 0ms SQLERRM. ISNULL - Expected NULL and got "" - PASS 0ms wt_dbout_profiles Count 2. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_dbout_profiles where test_run_id = -98 - ---- Test Case: Delete Records Teardown - PASS 2ms Delete wt_test_runs (-98). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from wt_test_runs where id = -98". - PASS 0ms wt_test_runs (-98) Count. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_test_runs where id = -98 +Test Results for WTP.WTPLSQL +---------------------------------------- + Minimum Elapsed msec: 0 Total Testcases: 11 + Average Elapsed msec: 11 Total Assertions: 29 + Maximum Elapsed msec: 77 Failed Assertions: 0 + Total Run Time (sec): 0.3 Test Yield: 100.00% - - WTP.WT_PROFILER PACKAGE BODY Code Coverage Details (Test Run ID 7) -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1 EXCL 0 0 0 0 package body wt_profiler - 20 IGNR 0 0 0 0 g_skip_insert boolean := FALSE; - 21 IGNR 0 0 0 0 g_skip_add boolean := FALSE; - 33 IGNR 0 191 5 49 procedure tl_compile_db_object - 39 IGNR 20 10 0 1 l_errtxt varchar2(32000) := ''; - 43 IGNR 20 83 2 8 l_sql_txt := 'create or replace ' || in_ptype || ' ' || - 47 IGNR 20 41 1 5 wt_assert.raises - 52 IGNR 40 5932 20 1212 for buff in (select * from user_errors - 58 IGNR 0 0 0 0 l_errtxt := l_errtxt || buff.line || ', ' || - 61 IGNR 20 205 4 113 wt_assert.isnull - 66 IGNR 20 215 2 15 wt_assert.objexists ( - 71 IGNR 20 50 1 4 end tl_compile_db_object; - 74 IGNR 0 5 1 2 procedure tl_drop_db_object - 81 IGNR 4 4 1 1 l_sql_txt := 'drop ' || in_ptype || ' ' || in_pname; - 82 IGNR 4 5 1 2 wt_assert.raises - 86 IGNR 4 54 2 16 wt_assert.objnotexists ( - 91 IGNR 4 3 1 1 end tl_drop_db_object; - 94 IGNR 0 11 1 5 procedure tl_count_plsql_profiler_recs - 100 IGNR 5 43 5 16 wt_assert.eqqueryvalue - 105 IGNR 5 24 3 8 wt_assert.eqqueryvalue - 111 IGNR 5 25 3 8 wt_assert.eqqueryvalue - 116 IGNR 5 1 0 1 end tl_count_plsql_profiler_recs; - 119 IGNR 0 3 1 2 procedure tl_insert_plsql_profiler_recs - 125 IGNR 2 7 3 4 l_sql_txt := 'insert into plsql_profiler_runs (runid)' || -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 127 IGNR 2 5 2 3 wt_assert.raises ( - 132 IGNR 2 11 5 6 l_sql_txt := 'insert into plsql_profiler_units (runid, unit_number, total_time)' || - 134 IGNR 2 6 3 3 wt_assert.raises ( - 139 IGNR 2 12 6 6 l_sql_txt := 'insert into plsql_profiler_data (runid, unit_number, line#)' || - 141 IGNR 2 8 3 5 wt_assert.raises ( - 145 IGNR 2 1296 161 1136 commit; - 146 IGNR 2 4 1 3 end tl_insert_plsql_profiler_recs; - 149 IGNR 0 3 3 3 procedure tl_delete_plsql_profiler_recs - 155 IGNR 1 5 5 5 l_sql_txt := 'delete from plsql_profiler_data' || - 157 IGNR 1 3 3 3 wt_assert.raises ( - 162 IGNR 1 7 7 7 l_sql_txt := 'delete from plsql_profiler_units' || - 164 IGNR 1 3 3 3 wt_assert.raises ( - 169 IGNR 1 4 4 4 l_sql_txt := 'delete from plsql_profiler_runs' || - 171 IGNR 1 2 2 2 wt_assert.raises ( - 175 IGNR 1 85 85 85 commit; - 176 IGNR 1 1 1 1 end tl_delete_plsql_profiler_recs; - 179 IGNR 0 6 2 2 procedure tl_insert_test_runs - 186 IGNR 3 13 3 7 l_sql_txt := 'insert into wt_test_runs' || - 190 IGNR 3 3 1 1 wt_assert.raises ( - 194 IGNR 3 21 7 7 wt_assert.eqqueryvalue ( - 199 IGNR 3 439 134 159 commit; - 200 IGNR 3 3 1 1 end tl_insert_test_runs; - 203 IGNR 0 7 1 5 procedure tl_delete_test_runs - 209 IGNR 3 13 1 10 l_sql_txt := 'delete from wt_test_runs where id = ' || in_test_run_id; - 210 IGNR 3 8 1 5 wt_assert.raises ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 214 IGNR 3 23 6 10 wt_assert.eqqueryvalue ( - 219 IGNR 3 762 111 481 commit; - 220 IGNR 3 4 1 3 end tl_delete_test_runs; - 223 IGNR 0 17 1 7 procedure tl_insert_dbout_profiles - 230 IGNR 7 2324 159 713 insert into wt_dbout_profiles values in_rec; - 231 IGNR 7 15 1 4 l_sqlerrm := SQLERRM; - 232 IGNR 7 1212 78 531 commit; - 233 IGNR 0 0 0 0 exception when others then - 234 IGNR 0 0 0 0 l_sqlerrm := SQLERRM; - 235 IGNR 0 0 0 0 end; - 237 IGNR 7 53 5 16 wt_assert.eq ( - 242 IGNR 7 39 5 7 wt_assert.eqqueryvalue ( - 249 IGNR 7 6 1 1 end tl_insert_dbout_profiles; - 252 IGNR 0 5 1 2 procedure tl_delete_dbout_profiles - 258 IGNR 3 6 1 3 l_sql_txt := 'delete from wt_dbout_profiles where test_run_id = ' || - 260 IGNR 3 6 1 3 wt_assert.raises ( - 264 IGNR 3 23 4 10 wt_assert.eqqueryvalue ( - 269 IGNR 3 1292 81 643 commit; - 270 IGNR 3 8 1 4 end tl_delete_dbout_profiles; - 277 UNKN 0 7 1 1 function get_error_msg - 281 EXEC 8 1 0 1 l_msg_prefix varchar2(50) := 'DBMS_PROFILER Error: '; - 283 EXEC 8 0 0 0 case retnum_in - 284 EXEC 10 11 0 5 when dbms_profiler.error_param then return l_msg_prefix || - 286 EXEC 8 4 0 2 when dbms_profiler.error_io then return l_msg_prefix || - 290 EXEC 6 6 0 2 when dbms_profiler.error_version then return l_msg_prefix || -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 295 EXEC 2 6 1 5 else return l_msg_prefix || - 298 EXEC 8 3 0 1 end get_error_msg; - 302 IGNR 0 5 5 5 procedure t_get_error_msg - 306 IGNR 2 6 1 5 wt_assert.g_testcase := 'Get Error Messages'; - 307 IGNR 1 1 1 1 wt_assert.isnotnull ( - 310 IGNR 1 24 1 23 wt_assert.this ( - 315 IGNR 1 1 0 1 wt_assert.isnotnull ( - 318 IGNR 1 7 7 7 wt_assert.this ( - 323 IGNR 1 2 1 1 wt_assert.isnotnull ( - 326 IGNR 1 28 28 28 wt_assert.this ( - 331 IGNR 1 2 1 1 wt_assert.isnotnull ( - 334 IGNR 1 7 7 7 wt_assert.this ( - 338 IGNR 1 2 2 2 end t_get_error_msg; - 343 UNKN 0 3 1 1 procedure delete_plsql_profiler_recs - 347 EXEC 4 69 13 20 begin - 348 EXEC 4 972 112 395 delete from plsql_profiler_data - 350 EXEC 4 510 60 227 delete from plsql_profiler_units - 352 EXEC 4 355 46 134 delete from plsql_profiler_runs - 354 EXEC 4 325 54 105 COMMIT; - 355 EXEC 4 39 9 10 end delete_plsql_profiler_recs; - 359 IGNR 0 2 2 2 procedure t_delete_profiler_recs - 361 IGNR 1 1 1 1 c_test_run_id constant number := -99; - 365 IGNR 1 1 1 1 wt_assert.g_testcase := 'Delete PL/SQL Profiler Records Happy Path 1'; - 367 IGNR 1 0 0 0 delete_plsql_profiler_recs(c_test_run_id); -- Should run without error - 368 IGNR 1 47 47 47 l_err_stack := dbms_utility.format_error_stack || -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 370 IGNR 0 0 0 0 exception when others then - 371 IGNR 0 0 0 0 l_err_stack := dbms_utility.format_error_stack || - 373 IGNR 0 0 0 0 end; - 375 IGNR 1 8 8 8 wt_assert.isnull ( - 378 IGNR 1 0 0 0 tl_count_plsql_profiler_recs(c_test_run_id, 0); - 380 IGNR 1 0 0 0 wt_assert.g_testcase := 'Delete PL/SQL Profiler Records Happy Path 2'; - 381 IGNR 1 1 1 1 tl_insert_plsql_profiler_recs(c_test_run_id); - 382 IGNR 1 1 1 1 tl_count_plsql_profiler_recs(c_test_run_id, 1); - 384 IGNR 1 0 0 0 delete_plsql_profiler_recs(c_test_run_id); -- Should run without error - 385 IGNR 1 6 6 6 l_err_stack := dbms_utility.format_error_stack || - 387 IGNR 0 0 0 0 exception when others then - 388 IGNR 0 0 0 0 l_err_stack := dbms_utility.format_error_stack || - 390 IGNR 0 0 0 0 end; - 392 IGNR 1 5 5 5 wt_assert.isnull ( - 395 IGNR 1 0 0 0 tl_count_plsql_profiler_recs(c_test_run_id, 0); - 396 IGNR 1 2 2 2 end t_delete_profiler_recs; - 401 UNKN 0 33 3 5 procedure find_dbout - 445 EXEC 8 2 0 1 C_HEAD_RE CONSTANT varchar2(30) := '--% WTPLSQL SET DBOUT "'; - 446 EXEC 8 1 0 1 C_MAIN_RE CONSTANT varchar2(30) := '[[:alnum:] ._$#:]+'; - 447 EXEC 8 3 0 1 C_TAIL_RE CONSTANT varchar2(30) := '" %--'; - 449#NOTX# 0 0 0 0 cursor c_annotation is - 450 EXEC 8 1355 118 320 select regexp_substr(src.text, C_HEAD_RE||C_MAIN_RE||C_TAIL_RE) TEXT - 456 UNKN 0 7 1 1 order by src.line; - 459 UNKN 0 5 1 2 cursor c_readable is - 460 EXEC 4 903 179 352 select * -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 464 UNKN 0 8 2 2 and src.type = g_rec.dbout_type; - 471 EXEC 8 0 0 0 open c_annotation; - 472 EXEC 8 1861 200 277 fetch c_annotation into l_target; - 473 EXEC 8 11 1 2 if c_annotation%NOTFOUND - 476 EXEC 2 15 3 12 close c_annotation; - 477 EXEC 2 3 1 2 return; - 479 EXEC 6 190 29 37 close c_annotation; - 481 EXEC 6 197 26 58 l_target := regexp_replace(SRCSTR => l_target - 487 EXEC 6 72 10 14 l_target := regexp_replace(SRCSTR => l_target - 493 EXEC 6 25 4 5 l_dot_pos := instr(l_target,'.'); - 494 EXEC 6 6 1 2 l_cln_pos := instr(l_target,':'); - 496 EXEC 6 460474 68570 86060 select obj.owner - 528 EXEC 1 0 0 0 when NO_DATA_FOUND - 530 EXEC 1 10 10 10 g_rec.error_message := 'Unable to find database object "' || - 532 EXEC 1 1 1 1 return; - 533 EXEC 1 0 0 0 when TOO_MANY_ROWS - 535 EXEC 1 10 10 10 g_rec.error_message := 'Found too many database objects "' || - 537 EXEC 1 1 1 1 return; - 540 EXEC 4 4 1 1 open c_readable; - 541 EXEC 4 2085 125 1201 fetch c_readable into b_readable; - 542 EXEC 4 7 1 2 if c_readable%NOTFOUND - 544 EXEC 1 4 0 3 if g_rec.dbout_type in ('FUNCTION', 'PROCEDURE', 'PACKAGE BODY', - 549 IGNR 0 0 0 0 g_rec.error_message := 'Unable to read source for ' || g_rec.dbout_type || - 553 EXEC 1 1 1 1 g_rec.prof_runid := -1; -- Don't run profiler. - 554 EXEC 1 0 0 0 end if; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 556 EXEC 4 129 15 47 close c_readable; - 558 EXEC 6 46 6 9 end find_dbout; - 562 IGNR 1 4 4 4 procedure t_find_dbout - 567 IGNR 1 1 1 1 l_pname varchar2(128) := 'WT_PROFILE_FIND_DBOUT'; - 569 IGNR 0 3 0 1 procedure run_find_dbout is begin - 570 IGNR 6 10 1 2 l_recSAVE := g_rec; - 571 IGNR 6 5 1 1 g_rec := l_recNULL; - 572 IGNR 6 3 0 1 find_dbout(l_pname); - 573 IGNR 6 31 2 8 l_recTEST := g_rec; - 574 IGNR 6 4 1 1 g_rec := l_recSAVE; - 575 IGNR 6 0 0 0 end run_find_dbout; - 578 IGNR 1 1 1 1 wt_assert.g_testcase := 'Find DBOUT Setup'; - 579 IGNR 1 1 1 1 tl_compile_db_object - 584 IGNR 1 1 1 1 wt_assert.g_testcase := 'Find DBOUT Happy Path 1'; - 585 IGNR 1 6 6 6 tl_compile_db_object - 590 IGNR 1 0 0 0 run_find_dbout; - 592 IGNR 1 2 2 2 wt_assert.isnull - 595 IGNR 1 1 1 1 wt_assert.isnull - 599 IGNR 1 1 1 1 wt_assert.isnull - 602 IGNR 1 0 0 0 wt_assert.isnull - 606 IGNR 1 1 1 1 wt_assert.g_testcase := 'Find DBOUT Happy Path 2'; - 607 IGNR 1 6 6 6 tl_compile_db_object - 615 IGNR 1 0 0 0 run_find_dbout; - 617 IGNR 1 8 3 5 wt_assert.eq - 621 IGNR 1 1 1 1 wt_assert.eq -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 626 IGNR 1 1 1 1 wt_assert.eq - 630 IGNR 1 1 1 1 wt_assert.isnull - 634 IGNR 1 1 1 1 wt_assert.g_testcase := 'Find DBOUT Happy Path 3'; - 635 IGNR 1 13 2 11 tl_compile_db_object - 644 IGNR 1 1 1 1 run_find_dbout; - 646 IGNR 1 8 3 5 wt_assert.eq - 650 IGNR 1 0 0 0 wt_assert.eq - 655 IGNR 1 1 1 1 wt_assert.eq - 659 IGNR 1 1 1 1 wt_assert.isnull - 663 IGNR 1 1 1 1 wt_assert.g_testcase := 'Find DBOUT Sad Path 1'; - 664 IGNR 1 5 5 5 tl_compile_db_object - 672 IGNR 1 0 0 0 run_find_dbout; - 674 IGNR 1 5 5 5 wt_assert.isnull - 677 IGNR 1 0 0 0 wt_assert.isnull - 681 IGNR 1 0 0 0 wt_assert.isnull - 684 IGNR 1 0 0 0 wt_assert.eq - 689 IGNR 1 0 0 0 wt_assert.g_testcase := 'Find DBOUT Sad Path 2'; - 690 IGNR 1 7 1 6 tl_compile_db_object - 698 IGNR 1 0 0 0 run_find_dbout; - 700 IGNR 1 8 4 4 wt_assert.eq - 704 IGNR 1 1 1 1 wt_assert.eq - 708 IGNR 1 0 0 0 wt_assert.eq - 713 IGNR 1 0 0 0 wt_assert.g_testcase := 'Find DBOUT Sad Path 3'; - 714 IGNR 1 5 5 5 tl_compile_db_object - 722 IGNR 1 1 1 1 run_find_dbout; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 724 IGNR 1 4 4 4 wt_assert.eq - 728 IGNR 1 0 0 0 wt_assert.eq - 733 IGNR 1 0 0 0 wt_assert.eq - 737 IGNR 1 1 1 1 wt_assert.isnull - 741 IGNR 1 0 0 0 wt_assert.g_testcase := 'Find DBOUT Teardown'; - 742 IGNR 1 0 0 0 tl_drop_db_object(l_pname, 'package'); - 743 IGNR 1 4 4 4 end t_find_dbout; - 748 EXEC 8 40 4 6 procedure load_ignr_aa - 750 UNKN 0 6 1 1 cursor c_find_begin is - 751 EXEC 8 24214 111 23121 select line - 758 IGNR 0 8 1 2 order by line; - 760 IGNR 0 7 1 1 cursor c_find_end (in_line in number, in_col in number) is - 761 IGNR 8 909 43 253 with q1 as ( - 778 UNKN 0 5 1 1 ,col; - 781 EXEC 8 11 1 2 g_ignr_aa.delete; - 782 EXEC 8 6 1 1 open c_find_begin; - 783 EXEC 16 0 0 0 loop - 784 EXEC 16 2786 16 1002 fetch c_find_begin into buff_find_begin; - 785 EXEC 16 17 0 4 exit when c_find_begin%NOTFOUND; - 786 EXEC 8 3 0 1 open c_find_end (buff_find_begin.line, buff_find_begin.col); - 787 EXEC 8 830 76 130 fetch c_find_end into buff_find_end; - 788 EXEC 8 10 1 2 if c_find_end%NOTFOUND - 790 EXEC 2 20550 466 20084 select max(line) - 797 EXEC 8 283 11 105 close c_find_end; - 798 EXEC 34 45 1 7 for i in buff_find_begin.line + g_rec.trigger_offset .. -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 801 EXEC 26 52 0 8 g_ignr_aa(i) := 'X'; - 804 EXEC 8 129 11 37 close c_find_begin; - 805 EXEC 8 25 1 8 end load_ignr_aa; - 809 IGNR 1 8 8 8 procedure t_load_ignr_aa - 814 IGNR 1 0 0 0 l_pname varchar2(128) := 'WT_PROFILE_LOAD_IGNR'; - 816 IGNR 0 7 1 1 procedure run_load_ignr is begin - 817 IGNR 7 14 2 2 l_recSAVE := g_rec; - 818 IGNR 7 18 2 3 l_ignrSAVE := g_ignr_aa; - 819 IGNR 7 8 1 2 g_ignr_aa.delete; - 820 IGNR 7 3 0 3 g_rec.dbout_owner := USER; - 821 IGNR 7 3 0 1 g_rec.dbout_name := l_pname; - 822 IGNR 7 2 1 1 g_rec.dbout_type := 'PACKAGE BODY'; - 823 IGNR 7 1 0 1 g_rec.trigger_offset := 0; - 824 IGNR 7 4 1 1 load_ignr_aa; - 825 IGNR 7 43 1 10 l_ignrTEST := g_ignr_aa; - 826 IGNR 7 19 2 6 g_ignr_aa := l_ignrSAVE; - 827 IGNR 7 16 1 4 g_rec := l_recSAVE; - 828 IGNR 7 1 0 1 end run_load_ignr; - 831 IGNR 1 1 1 1 wt_assert.g_testcase := 'Load Ignr Setup'; - 832 IGNR 1 5 5 5 wt_assert.isnotnull - 835 IGNR 1 1 1 1 tl_compile_db_object - 840 IGNR 1 0 0 0 wt_assert.g_testcase := 'Load Ignr Happy Path 1'; - 841 IGNR 1 6 6 6 tl_compile_db_object - 846 IGNR 1 0 0 0 run_load_ignr; - 847 IGNR 1 7 7 7 wt_assert.eq -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 852 IGNR 1 1 1 1 wt_assert.g_testcase := 'Load Ignr Happy Path 2'; - 853 IGNR 1 6 6 6 tl_compile_db_object - 861 IGNR 1 0 0 0 run_load_ignr; - 863 IGNR 1 11 11 11 wt_assert.eq - 867 IGNR 4 0 0 0 for i in 3 .. 5 - 869 IGNR 3 10 2 5 wt_assert.eq - 875 IGNR 1 0 0 0 wt_assert.g_testcase := 'Load Ignr Happy Path 3'; - 876 IGNR 1 7 7 7 tl_compile_db_object - 886 IGNR 1 0 0 0 run_load_ignr; - 888 IGNR 1 5 5 5 wt_assert.eq - 892 IGNR 4 0 0 0 for i in 4 .. 6 - 894 IGNR 3 10 2 5 wt_assert.eq - 900 IGNR 1 1 1 1 wt_assert.g_testcase := 'Load Ignr Happy Path 4'; - 901 IGNR 1 7 7 7 tl_compile_db_object - 914 IGNR 1 0 0 0 run_load_ignr; - 916 IGNR 1 14 14 14 wt_assert.eq - 920 IGNR 4 1 0 1 for i in 4 .. 6 - 922 IGNR 3 38 2 30 wt_assert.eq - 928 IGNR 3 1 0 1 for i in 8 .. 10 - 930 IGNR 3 9 2 4 wt_assert.eq - 936 IGNR 1 1 1 1 wt_assert.g_testcase := 'Load Ignr Sad Path 1'; - 937 IGNR 1 4 4 4 tl_compile_db_object - 944 IGNR 1 0 0 0 run_load_ignr; - 945 IGNR 1 5 5 5 wt_assert.eq - 950 IGNR 1 1 1 1 wt_assert.g_testcase := 'Load Ignr Sad Path 2'; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 951 IGNR 1 6 6 6 tl_compile_db_object - 963 IGNR 1 1 1 1 run_load_ignr; - 965 IGNR 1 10 10 10 wt_assert.eq - 969 IGNR 4 2 0 1 for i in 4 .. 6 - 971 IGNR 3 12 2 7 wt_assert.eq - 977 IGNR 1 0 0 0 wt_assert.g_testcase := 'Load Ignr Sad Path 3'; - 978 IGNR 1 8 8 8 tl_compile_db_object - 990 IGNR 1 1 1 1 run_load_ignr; - 992 IGNR 1 6 6 6 wt_assert.eq - 996 IGNR 6 1 0 1 for i in 4 .. 8 - 998 IGNR 5 15 2 5 wt_assert.eq - 1004 IGNR 1 0 0 0 wt_assert.g_testcase := 'Load Ignr Teardown'; - 1005 IGNR 1 0 0 0 tl_drop_db_object(l_pname, 'package'); - 1006 IGNR 1 5 5 5 wt_assert.isnotnull - 1009 IGNR 1 122 122 122 end t_load_ignr_aa; - 1014 EXEC 1 11 1 10 procedure insert_dbout_profile - 1019 UNKN 0 21 2 6 procedure l_set_status is begin - 1020 EXEC 8 19 2 4 if g_ignr_aa.EXISTS(prof_rec.line) - 1023 EXEC 1 1 1 1 prof_rec.status := 'IGNR'; - 1024 EXEC 1 1 1 1 return; - 1026 EXEC 7 3 0 2 if prof_rec.total_occur > 0 - 1029 EXEC 3 1 0 1 prof_rec.status := 'EXEC'; - 1030 EXEC 3 2 1 1 return; - 1032 EXEC 4 2 0 1 if prof_rec.total_occur = 0 - 1036 EXEC 4 79 13 31 if regexp_like(prof_rec.text, '^[[:space:]]*' || -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1041 EXEC 2 1 1 1 prof_rec.status := 'EXCL'; - 1042 EXEC 3 3 2 2 elsif prof_rec.line = l_max_line - 1048 EXEC 2 0 0 0 prof_rec.status := 'NOTX'; - 1050 EXEC 4 10 2 4 return; - 1053#NOTX# 0 0 0 0 prof_rec.status := 'UNKN'; - 1054#NOTX# 0 0 0 0 end l_set_status; - 1055 EXEC 1 20 20 20 begin - 1057 EXEC 1 257 257 257 select max(ppd.line#) into l_max_line - 1066 EXEC 1 0 0 0 load_ignr_aa; - 1067 EXEC 1 1 1 1 prof_rec.test_run_id := g_rec.test_run_id; - 1068 EXEC 3 768 1 731 for buf1 in ( - 1069#NOTX# 0 0 0 0 select src.line - 1089 EXEC 8 8 1 3 prof_rec.line := buf1.line; - 1090 EXEC 8 3 1 1 prof_rec.total_occur := buf1.total_occur; - 1091 EXEC 8 8 0 2 prof_rec.total_usecs := buf1.total_time/1000; - 1092 EXEC 8 1 1 1 prof_rec.min_usecs := buf1.min_time/1000; - 1093 EXEC 8 5 1 1 prof_rec.max_usecs := buf1.max_time/1000; - 1094 EXEC 8 10 1 2 prof_rec.text := buf1.text; - 1095 EXEC 8 0 0 0 prof_rec.status := NULL; - 1096 EXEC 8 2 0 1 l_set_status; - 1097 EXEC 8 1086 81 408 insert into wt_dbout_profiles values prof_rec; - 1100 IGNR 8 0 0 0 if not g_skip_add then - 1102 IGNR 0 0 0 0 wt_test_run_stat.add_profile(prof_rec); - 1108 EXEC 1 109 109 109 COMMIT; - 1111 EXEC 1 5 5 5 g_ignr_aa.delete; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1112 EXEC 1 2 2 2 delete_plsql_profiler_recs(g_rec.prof_runid); - 1113 EXEC 1 6 6 6 end insert_dbout_profile; - 1117 IGNR 1 9 9 9 procedure t_insert_dbout_profile - 1123 IGNR 1 0 0 0 c_test_run_id constant number := -97; - 1124 IGNR 1 1 1 1 l_pname varchar2(128) := 'WT_PROFILE_INSERT_DBOUT'; - 1128 IGNR 0 8 1 2 procedure insert_plsql_profiler_data - 1134 IGNR 8 5 1 1 data_rec.line# := in_line#; - 1135 IGNR 8 1 0 1 data_rec.total_occur := in_total_occur; - 1136 IGNR 8 0 0 0 data_rec.total_time := in_total_time; - 1139 IGNR 8 2464 95 979 insert into plsql_profiler_data values data_rec; - 1140 IGNR 8 4392 77 2632 commit; - 1141 IGNR 8 31 2 7 l_sqlerrm := SQLERRM; - 1142 IGNR 0 0 0 0 exception when others then - 1143 IGNR 0 0 0 0 l_sqlerrm := SQLERRM; - 1144 IGNR 0 0 0 0 end; - 1145 IGNR 8 72 4 16 wt_assert.eq ( - 1149 IGNR 8 6 1 1 end insert_plsql_profiler_data; - 1151 IGNR 0 14 1 2 procedure test_dbout_profiler - 1157 IGNR 16 169 3 76 wt_assert.eqqueryvalue - 1165 IGNR 16 10 0 1 end test_dbout_profiler; - 1168 IGNR 1 1 1 1 wt_assert.g_testcase := 'Insert DBOUT Profile Setup'; - 1169 IGNR 1 0 0 0 tl_compile_db_object - 1174 IGNR 1 8 8 8 tl_compile_db_object - 1186 IGNR 1 1 1 1 tl_insert_plsql_profiler_recs(c_test_run_id); - 1187 IGNR 1 1 1 1 tl_count_plsql_profiler_recs(c_test_run_id, 1); -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1188 IGNR 1 1 1 1 tl_insert_test_runs(c_test_run_id, 'Insert DBOUT Test'); - 1190 IGNR 1 1 1 1 units_rec.runid := c_test_run_id; - 1191 IGNR 1 1 1 1 units_rec.unit_number := 1; - 1192 IGNR 1 2 0 2 units_rec.unit_owner := USER; - 1193 IGNR 1 0 0 0 units_rec.unit_name := l_pname; - 1194 IGNR 1 1 1 1 units_rec.unit_type := 'PACKAGE BODY'; - 1195 IGNR 1 0 0 0 units_rec.total_time := 0; - 1198 IGNR 1 1005 1005 1005 insert into plsql_profiler_units values units_rec; - 1199 IGNR 1 101 101 101 commit; - 1200 IGNR 1 7 7 7 l_err_stack := dbms_utility.format_error_stack || - 1202 IGNR 0 0 0 0 exception when others then - 1203 IGNR 0 0 0 0 l_err_stack := dbms_utility.format_error_stack || - 1205 IGNR 0 0 0 0 end; - 1207 IGNR 1 3 3 3 wt_assert.isnull ( - 1210 IGNR 1 9 9 9 wt_assert.eqqueryvalue - 1217 IGNR 1 0 0 0 data_rec.runid := c_test_run_id; - 1218 IGNR 1 0 0 0 data_rec.unit_number := 1; - 1219 IGNR 1 1 1 1 data_rec.min_time := 0; - 1220 IGNR 1 0 0 0 data_rec.max_time := 1; - 1221 IGNR 1 1 1 1 insert_plsql_profiler_data(1, 0, 0); - 1222 IGNR 1 1 1 1 insert_plsql_profiler_data(2, 0, 1); - 1223 IGNR 1 0 0 0 insert_plsql_profiler_data(3, 1, 1); - 1224 IGNR 1 1 1 1 insert_plsql_profiler_data(5, 1, 1); - 1225 IGNR 1 1 1 1 insert_plsql_profiler_data(7, 1, 1); - 1226 IGNR 1 0 0 0 insert_plsql_profiler_data(8, 0, 0); -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1227 IGNR 1 0 0 0 insert_plsql_profiler_data(9, 1, 1); - 1228 IGNR 1 1 1 1 insert_plsql_profiler_data(10, 0, 0); - 1230 IGNR 1 7 7 7 wt_assert.eqqueryvalue - 1237 IGNR 1 1 1 1 wt_assert.g_testcase := 'Insert DBOUT Profile Happy Path'; - 1238 IGNR 1 1 1 1 l_recSAVE := g_rec; - 1239 IGNR 1 1 1 1 g_rec.test_run_id := c_test_run_id; - 1240 IGNR 1 3 1 2 g_rec.dbout_owner := USER; - 1241 IGNR 1 1 1 1 g_rec.dbout_name := l_pname; - 1242 IGNR 1 0 0 0 g_rec.dbout_type := 'PACKAGE BODY'; - 1243 IGNR 1 1 1 1 g_rec.prof_runid := c_test_run_id; - 1244 IGNR 1 0 0 0 g_rec.trigger_offset := 0; - 1245 IGNR 1 0 0 0 g_rec.error_message := ''; - 1247 IGNR 1 0 0 0 g_skip_add := TRUE; - 1249 IGNR 1 1 1 1 insert_dbout_profile; - 1250 IGNR 1 7 7 7 l_err_stack := dbms_utility.format_error_stack || - 1252 IGNR 0 0 0 0 exception when others then - 1253 IGNR 0 0 0 0 l_err_stack := dbms_utility.format_error_stack || - 1255 IGNR 0 0 0 0 end; - 1256 IGNR 1 0 0 0 g_skip_add := FALSE; - 1257 IGNR 1 2 2 2 g_rec := l_recSAVE; - 1258 IGNR 1 4 4 4 wt_assert.isnull ( - 1262 IGNR 1 0 0 0 test_dbout_profiler(1, 'STATUS', 'EXCL'); - 1263 IGNR 1 8 8 8 test_dbout_profiler(1, 'TEXT', 'package body WT_PROFILE_INSERT_DBOUT is' || CHR(10)); - 1264 IGNR 1 1 1 1 test_dbout_profiler(2, 'STATUS', 'UNKN'); - 1265 IGNR 1 3 3 3 test_dbout_profiler(2, 'TEXT', 'begin' || CHR(10)); -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1266 IGNR 1 1 1 1 test_dbout_profiler(3, 'STATUS', 'EXEC'); - 1267 IGNR 1 2 2 2 test_dbout_profiler(3, 'TEXT', ' l_junk := 1;' || CHR(10)); - 1268 IGNR 1 1 1 1 test_dbout_profiler(5, 'STATUS', 'IGNR'); - 1269 IGNR 1 2 2 2 test_dbout_profiler(5, 'TEXT', ' l_junk := 2;' || CHR(10)); - 1270 IGNR 1 0 0 0 test_dbout_profiler(7, 'STATUS', 'EXEC'); - 1271 IGNR 1 2 2 2 test_dbout_profiler(7, 'TEXT', ' if 0 = 1 then' || CHR(10)); - 1272 IGNR 1 1 1 1 test_dbout_profiler(8, 'STATUS', 'NOTX'); - 1273 IGNR 1 3 3 3 test_dbout_profiler(8, 'TEXT', ' l_junk := 3;' || CHR(10)); - 1274 IGNR 1 0 0 0 test_dbout_profiler(9, 'STATUS', 'EXEC'); - 1275 IGNR 1 3 3 3 test_dbout_profiler(9, 'TEXT', ' end if;' || CHR(10)); - 1276 IGNR 1 0 0 0 test_dbout_profiler(10, 'STATUS', 'EXCL'); - 1277 IGNR 1 1 1 1 test_dbout_profiler(10, 'TEXT', 'end WT_PROFILE_INSERT_DBOUT;'); - 1279 IGNR 1 0 0 0 wt_assert.g_testcase := 'Insert DBOUT Profile Teardown'; - 1280 IGNR 1 0 0 0 tl_delete_dbout_profiles(c_test_run_id); - 1281 IGNR 1 1 1 1 tl_delete_test_runs(c_test_run_id); - 1282 IGNR 1 1 1 1 tl_delete_plsql_profiler_recs(c_test_run_id); - 1283 IGNR 1 2 2 2 tl_count_plsql_profiler_recs(c_test_run_id, 0); - 1284 IGNR 1 0 0 0 tl_drop_db_object(l_pname, 'package'); - 1285 IGNR 1 3 3 3 end t_insert_dbout_profile; - 1295 EXEC 3 8 2 3 procedure initialize - 1309 EXEC 3 2 0 1 out_dbout_owner := ''; - 1310 EXEC 3 0 0 0 out_dbout_name := ''; - 1311 EXEC 3 0 0 0 out_dbout_type := ''; - 1312 EXEC 3 0 0 0 out_trigger_offset := NULL; - 1313 EXEC 3 0 0 0 out_profiler_runid := NULL; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1314 EXEC 3 0 0 0 out_error_message := ''; - 1315 EXEC 3 0 0 0 g_rec := l_rec_NULL; - 1319 IGNR 3 2 1 1 g_skip_insert := FALSE; - 1320 IGNR 3 0 0 0 g_skip_add := FALSE; - 1323 EXEC 3 1 1 1 if in_test_run_id is null - 1325 EXEC 1 88 88 88 raise_application_error (-20004, 'i_test_run_id is null'); - 1327 EXEC 2 1 0 1 g_rec.test_run_id := in_test_run_id; - 1329 EXEC 2 1 0 1 find_dbout(in_pkg_name => in_runner_name); - 1330 EXEC 2 3 1 2 out_dbout_owner := g_rec.dbout_owner; - 1331 EXEC 2 1 1 1 out_dbout_name := g_rec.dbout_name; - 1332 EXEC 2 1 1 1 out_dbout_type := g_rec.dbout_type; - 1333 EXEC 2 0 0 0 out_error_message := g_rec.error_message; - 1335 EXEC 2 2 2 2 if g_rec.dbout_name is null -- No DBOUT notation - 1339 EXEC 1 0 0 0 g_rec.prof_runid := NULL; - 1340 EXEC 1 0 0 0 return; - 1343 EXEC 1 2 1 1 g_rec.trigger_offset := wt_profiler.trigger_offset - 1347 EXEC 1 1 1 1 out_trigger_offset := g_rec.trigger_offset; - 1349 EXEC 1 6 1 5 l_retnum := dbms_profiler.INTERNAL_VERSION_CHECK; - 1350 EXEC 1 1 1 1 if l_retnum <> 0 then - 1353 IGNR 0 0 0 0 raise_application_error(-20005, - 1359 EXEC 1 295 0 289 l_retnum := dbms_profiler.START_PROFILER(run_number => g_rec.prof_runid); - 1360 EXEC 2 1 0 1 if l_retnum <> 0 then - 1362 IGNR 0 0 0 0 raise_application_error(-20006, - 1367 EXEC 2 4 1 3 out_profiler_runid := g_rec.prof_runid; - 1369 EXEC 2 8 1 7 end initialize; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1373 IGNR 0 8 8 8 procedure t_initialize - 1375 IGNR 1 0 0 0 c_test_run_id constant number := -96; - 1376 IGNR 1 1 1 1 l_pname varchar2(128) := 'WT_PROFILE_INITIALIZE'; - 1383 IGNR 1 1 1 1 wt_assert.g_testcase := 'Insert DBOUT Profile Setup'; - 1384 IGNR 1 1 1 1 tl_compile_db_object - 1389 IGNR 1 1 1 1 wt_assert.g_testcase := 'Initialize Test HAPPY Path 1'; - 1390 IGNR 1 5 5 5 tl_compile_db_object - 1397 IGNR 1 1 1 1 l_recSAVE := g_rec; - 1398 IGNR 1 4 1 3 initialize - 1407 IGNR 1 1 1 1 l_recTEST := g_rec; - 1408 IGNR 1 0 0 0 g_rec := l_recSAVE; - 1410 IGNR 1 2 2 2 wt_assert.isnull ( - 1413 IGNR 1 1 1 1 wt_assert.isnull ( - 1417 IGNR 1 1 1 1 wt_assert.isnull ( - 1420 IGNR 1 1 1 1 wt_assert.isnull ( - 1424 IGNR 1 1 1 1 wt_assert.isnull ( - 1427 IGNR 1 1 1 1 wt_assert.isnull ( - 1431 IGNR 1 1 1 1 wt_assert.isnull ( - 1434 IGNR 1 1 1 1 wt_assert.isnull ( - 1438 IGNR 1 1 1 1 wt_assert.isnull ( - 1441 IGNR 1 1 1 1 wt_assert.isnull ( - 1445 IGNR 1 1 1 1 wt_assert.isnull ( - 1448 IGNR 1 1 1 1 wt_assert.isnull ( - 1452 IGNR 1 0 0 0 wt_assert.g_testcase := 'Initialize Test HAPPY Path 2'; - 1453 IGNR 1 4 4 4 tl_compile_db_object -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1462 IGNR 1 1 1 1 l_recSAVE := g_rec; - 1463 IGNR 1 5 2 3 initialize - 1472 IGNR 1 4 4 4 l_recTEST := g_rec; - 1473 IGNR 1 1 1 1 g_rec := l_recSAVE; - 1475 IGNR 1 4 1 3 wt_assert.eq ( - 1479 IGNR 1 1 1 1 wt_assert.eq ( - 1484 IGNR 1 0 0 0 wt_assert.eq ( - 1488 IGNR 1 5 5 5 wt_assert.isnotnull ( - 1492 IGNR 1 4 4 4 wt_assert.eq ( - 1496 IGNR 1 1 1 1 wt_assert.isnull ( - 1500 IGNR 1 2 1 1 wt_assert.eq ( - 1504 IGNR 1 0 0 0 wt_assert.eq ( - 1509 IGNR 1 0 0 0 wt_assert.eq ( - 1513 IGNR 1 4 4 4 wt_assert.isnotnull ( - 1517 IGNR 1 2 2 2 wt_assert.eq ( - 1521 IGNR 1 1 1 1 wt_assert.isnull ( - 1525 IGNR 1 1 1 1 wt_assert.g_testcase := 'Initialize Test Sad Path 1'; - 1526 IGNR 1 1 1 1 l_recSAVE := g_rec; - 1528 IGNR 1 1 1 1 initialize - 1537 IGNR 0 0 0 0 l_sqlerrm := SQLERRM; - 1539 IGNR 1 0 0 0 exception when others then - 1540 IGNR 1 87 87 87 l_sqlerrm := SQLERRM; - 1541 IGNR 0 3 3 3 end; - 1542 IGNR 1 1 1 1 l_recTEST := g_rec; - 1543 IGNR 1 1 1 1 g_rec := l_recSAVE; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1544 IGNR 1 1 1 1 wt_assert.eq ( - 1549 IGNR 1 0 0 0 wt_assert.g_testcase := 'Insert DBOUT Profile Teardown'; - 1550 IGNR 1 0 0 0 tl_drop_db_object - 1553 IGNR 1 2 2 2 end t_initialize; - 1560 EXEC 4 8 1 4 procedure finalize - 1564 EXEC 4 1 0 1 if g_rec.prof_runid is null - 1566 EXEC 1 0 0 0 return; - 1568 EXEC 3 0 0 0 if g_rec.test_run_id is null - 1570 EXEC 1 43 43 43 raise_application_error (-20000, 'g_rec.test_run_id is null'); - 1574 IGNR 0 0 0 0 if not g_skip_insert - 1580 IGNR 1 1 1 1 dbms_profiler.STOP_PROFILER; - 1581 IGNR 0 0 0 0 exception when others then - 1582 IGNR 0 0 0 0 g_rec := l_rec_NULL; - 1584 IGNR 0 0 0 0 raise; - 1586 IGNR 0 0 0 0 insert_dbout_profile; - 1591 EXEC 1 1 1 1 g_rec := l_rec_NULL; - 1592 EXEC 1 0 0 0 end finalize; - 1596 IGNR 1 6 1 5 procedure t_finalize - 1604 IGNR 1 1 1 1 wt_assert.g_testcase := 'Finalize Happy Path 1'; - 1605 IGNR 1 1 1 1 l_recSAVE := g_rec; - 1606 IGNR 1 1 1 1 g_rec.prof_runid := NULL; - 1607 IGNR 1 2 2 2 wt_assert.isnull ( - 1612 IGNR 1 1 1 1 finalize; - 1613 IGNR 1 7 7 7 l_err_stack := dbms_utility.format_error_stack || - 1615 IGNR 0 0 0 0 exception when others then -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1616 IGNR 0 0 0 0 l_err_stack := dbms_utility.format_error_stack || - 1618 IGNR 0 0 0 0 end; - 1619 IGNR 1 1 1 1 g_rec := l_recSAVE; - 1620 IGNR 1 1 1 1 wt_assert.isnull ( - 1624 IGNR 1 1 1 1 wt_assert.g_testcase := 'Finalize Happy Path 2'; - 1625 IGNR 1 0 0 0 l_recSAVE := g_rec; - 1626 IGNR 1 0 0 0 g_rec.test_run_id := -1; - 1627 IGNR 1 0 0 0 g_rec.dbout_owner := 'TEST OWNER'; - 1628 IGNR 1 0 0 0 g_rec.dbout_name := 'TEST NAME'; - 1629 IGNR 1 1 1 1 g_rec.dbout_type := 'TEST TYPE'; - 1630 IGNR 1 0 0 0 g_rec.prof_runid := -2; - 1631 IGNR 1 0 0 0 g_rec.trigger_offset := -3; - 1632 IGNR 1 1 1 1 g_rec.error_message := 'TEST MESSAGE'; - 1634 IGNR 1 1 1 1 g_skip_insert := TRUE; - 1636 IGNR 1 0 0 0 finalize; - 1637 IGNR 1 2 2 2 l_err_stack := dbms_utility.format_error_stack || - 1639 IGNR 0 0 0 0 exception when others then - 1640 IGNR 0 0 0 0 l_err_stack := dbms_utility.format_error_stack || - 1642 IGNR 0 0 0 0 end; - 1643 IGNR 1 0 0 0 g_skip_insert := FALSE; - 1645 IGNR 1 0 0 0 l_recTEST := g_rec; - 1646 IGNR 1 0 0 0 g_rec := l_recSAVE; - 1647 IGNR 1 0 0 0 wt_assert.isnull ( - 1651 IGNR 1 1 1 1 wt_assert.isnull ( - 1654 IGNR 1 0 0 0 wt_assert.isnull ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1658 IGNR 1 1 1 1 wt_assert.isnull ( - 1661 IGNR 1 0 0 0 wt_assert.isnull ( - 1665 IGNR 1 1 1 1 wt_assert.isnull ( - 1668 IGNR 1 1 1 1 wt_assert.isnull ( - 1671 IGNR 1 0 0 0 wt_assert.isnull ( - 1675 IGNR 1 0 0 0 wt_assert.g_testcase := 'Finalize Sad Path 1'; - 1676 IGNR 1 1 1 1 l_recSAVE := g_rec; - 1677 IGNR 1 0 0 0 g_rec.prof_runid := -1; - 1678 IGNR 1 0 0 0 g_rec.test_run_id := NULL; - 1680 IGNR 1 1 1 1 finalize; - 1681 IGNR 1 0 0 0 exception when others then - 1682 IGNR 1 42 42 42 l_sqlerrm := SQLERRM; - 1683 IGNR 0 1 1 1 end; - 1685 IGNR 1 1 1 1 g_rec := l_recSAVE; - 1686 IGNR 1 2 2 2 wt_assert.eq ( - 1690 IGNR 1 1 1 1 end t_finalize; - 1696 UNKN 0 37 3 18 function trigger_offset - 1703 EXEC 4 2 0 1 if dbout_type_in != 'TRIGGER' - 1705 EXEC 2 0 0 0 return 0; - 1707 EXEC 4 22048 3 21861 for buff in ( - 1708#NOTX# 0 0 0 0 select line, text from dba_source - 1714 EXEC 4 163 4 72 if regexp_instr(buff.text, - 1726 EXEC 1 41 2 39 return buff.line - 1; - 1729 EXEC 1 0 0 0 return 0; - 1730 EXEC 4 10 1 7 end trigger_offset; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1734 IGNR 0 2 2 2 procedure t_trigger_offset - 1738 IGNR 1 1 1 1 wt_assert.g_testcase := 'Trigger Offset Happy Path'; - 1739 IGNR 1 12 11 11 wt_assert.eq ( - 1746 IGNR 1 5 4 4 wt_assert.eq ( - 1753 IGNR 1 0 0 0 wt_assert.g_testcase := 'Trigger Offset Sad Path'; - 1754 IGNR 1 4 4 4 wt_assert.eq ( - 1760 IGNR 1 1 1 1 end t_trigger_offset; - 1765 UNKN 0 20 2 7 function calc_pct_coverage - 1770 EXEC 8 4265 2 3991 for buff in ( - 1776 EXEC 4 6 1 3 if buff.hits + buff.misses = 0 - 1778 EXEC 1 26 2 19 return -1; - 1780 EXEC 3 11 1 8 return round(100 * buff.hits / (buff.hits + buff.misses),2); - 1783#NOTX# 0 0 0 0 return null; - 1784 EXEC 4 11 2 5 END calc_pct_coverage; - 1788 IGNR 0 4 4 4 procedure t_calc_pct_coverage - 1790 IGNR 1 1 1 1 c_test_run_id constant number := -95; - 1794 IGNR 1 1 1 1 wt_assert.g_testcase := 'Calculate Percent Coverage Setup'; - 1795 IGNR 1 0 0 0 tl_insert_test_runs(c_test_run_id, 'Calculate Offset Test'); - 1796 IGNR 1 1 1 1 l_rec.test_run_id := c_test_run_id; - 1797 IGNR 1 0 0 0 l_rec.total_occur := 1; - 1798 IGNR 1 1 1 1 l_rec.total_usecs := 1; - 1799 IGNR 1 0 0 0 l_rec.min_usecs := 1; - 1800 IGNR 1 1 1 1 l_rec.max_usecs := 1; - 1802 IGNR 1 1 1 1 wt_assert.g_testcase := 'Calculate Percent Coverage Happy Path 1'; - 1803 IGNR 1 0 0 0 l_rec.line := 1; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1804 IGNR 1 1 1 1 l_rec.status := 'EXEC'; - 1805 IGNR 1 6 6 6 l_rec.text := 'Testing ' || l_rec.line; - 1806 IGNR 1 1 1 1 tl_insert_dbout_profiles(l_rec); - 1808 IGNR 1 0 0 0 l_rec.line := 2; - 1809 IGNR 1 0 0 0 l_rec.status := 'NOTX'; - 1810 IGNR 1 3 3 3 l_rec.text := 'Testing ' || l_rec.line; - 1811 IGNR 1 1 1 1 tl_insert_dbout_profiles(l_rec); - 1813 IGNR 1 0 0 0 l_rec.line := 3; - 1814 IGNR 1 1 1 1 l_rec.status := 'EXEC'; - 1815 IGNR 1 3 3 3 l_rec.text := 'Testing ' || l_rec.line; - 1816 IGNR 1 1 1 1 tl_insert_dbout_profiles(l_rec); - 1817 IGNR 1 10 10 10 wt_assert.eq ( - 1821 IGNR 1 0 0 0 tl_delete_dbout_profiles(c_test_run_id); - 1823 IGNR 1 3 3 3 wt_assert.g_testcase := 'Calculate Percent Coverage Happy Path 2'; - 1824 IGNR 1 1 1 1 l_rec.line := 1; - 1825 IGNR 1 1 1 1 l_rec.status := 'EXCL'; - 1826 IGNR 1 12 12 12 l_rec.text := 'Testing ' || l_rec.line; - 1827 IGNR 1 1 1 1 tl_insert_dbout_profiles(l_rec); - 1829 IGNR 1 1 1 1 l_rec.line := 2; - 1830 IGNR 1 0 0 0 l_rec.status := 'UNKN'; - 1831 IGNR 1 2 2 2 l_rec.text := 'Testing ' || l_rec.line; - 1832 IGNR 1 0 0 0 tl_insert_dbout_profiles(l_rec); - 1834 IGNR 1 1 1 1 l_rec.line := 3; - 1835 IGNR 1 0 0 0 l_rec.status := 'EXCL'; - 1836 IGNR 1 2 2 2 l_rec.text := 'Testing ' || l_rec.line; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1837 IGNR 1 1 1 1 tl_insert_dbout_profiles(l_rec); - 1838 IGNR 1 6 1 5 wt_assert.eq ( - 1842 IGNR 1 1 1 1 tl_delete_dbout_profiles(c_test_run_id); - 1844 IGNR 1 1 1 1 wt_assert.g_testcase := 'Calculate Percent Coverage Sad Path'; - 1845 IGNR 1 2 1 1 wt_assert.isnull ( - 1848 IGNR 1 2 2 2 wt_assert.isnull ( - 1852 IGNR 1 0 0 0 wt_assert.g_testcase := 'Calculate Percent Coverage Teardown'; - 1853 IGNR 1 0 0 0 tl_delete_test_runs(c_test_run_id); - 1854 IGNR 1 3 3 3 end t_calc_pct_coverage; - 1859 EXEC 3 5 0 1 procedure delete_records - 1864 EXEC 3 360 62 161 select profiler_runid into l_profiler_runid - 1866 EXEC 1 0 0 0 delete_plsql_profiler_recs(l_profiler_runid); - 1867 EXEC 1 283 283 283 delete from wt_dbout_profiles - 1870 EXEC 2 0 0 0 when NO_DATA_FOUND - 1872 EXEC 2 1 0 1 return; - 1873 EXEC 3 3 1 1 end delete_records; - 1877 IGNR 0 6 6 6 procedure t_delete_records - 1879 IGNR 1 0 0 0 c_test_run_id constant number := -98; - 1884 IGNR 1 1 1 1 wt_assert.g_testcase := 'Delete Records Setup'; - 1885 IGNR 1 7 7 7 wt_assert.eqqueryvalue ( - 1890 IGNR 1 12 12 12 wt_assert.eqqueryvalue ( - 1895 IGNR 1 1 1 1 tl_insert_test_runs(c_test_run_id, 'Delete Records Test'); - 1897 IGNR 1 1 1 1 l_rec.test_run_id := c_test_run_id; - 1898 IGNR 1 0 0 0 l_rec.line := 1; - 1899 IGNR 1 0 0 0 l_rec.status := 'EXEC'; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1900 IGNR 1 0 0 0 l_rec.total_occur := 1; - 1901 IGNR 1 0 0 0 l_rec.total_usecs := 1; - 1902 IGNR 1 0 0 0 l_rec.min_usecs := 1; - 1903 IGNR 1 0 0 0 l_rec.max_usecs := 1; - 1904 IGNR 1 2 2 2 l_rec.text := 'Testing'; - 1905 IGNR 1 1 1 1 tl_insert_dbout_profiles(l_rec); - 1907 IGNR 1 0 0 0 wt_assert.g_testcase := 'Delete Records Happy Path 1'; - 1908 IGNR 0 0 0 0 begin - 1909 IGNR 1 0 0 0 delete_records(c_test_run_id); - 1910 IGNR 1 6 6 6 l_err_stack := dbms_utility.format_error_stack || - 1912 IGNR 0 0 0 0 exception when others then - 1913 IGNR 0 0 0 0 l_err_stack := dbms_utility.format_error_stack || - 1915 IGNR 0 0 0 0 end; - 1917 IGNR 1 1 1 1 wt_assert.isnull ( - 1920 IGNR 1 6 6 6 wt_assert.eqqueryvalue ( - 1926 IGNR 1 0 0 0 wt_assert.g_testcase := 'Delete Records Sad Path 1'; - 1928 IGNR 1 0 0 0 delete_records(-9876); - 1929 IGNR 1 2 2 2 l_err_stack := dbms_utility.format_error_stack || - 1931 IGNR 0 0 0 0 exception when others then - 1932 IGNR 0 0 0 0 l_err_stack := dbms_utility.format_error_stack || - 1934 IGNR 0 0 0 0 end; - 1936 IGNR 1 1 1 1 wt_assert.isnull ( - 1939 IGNR 1 3 3 3 wt_assert.eqqueryvalue ( - 1945 IGNR 1 0 0 0 wt_assert.g_testcase := 'Delete Records Sad Path 2'; - 1947 IGNR 1 1 1 1 delete_records(NULL); -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1948 IGNR 1 3 3 3 l_err_stack := dbms_utility.format_error_stack || - 1950 IGNR 0 0 0 0 exception when others then - 1951 IGNR 0 0 0 0 l_err_stack := dbms_utility.format_error_stack || - 1953 IGNR 0 0 0 0 end; - 1955 IGNR 1 1 1 1 wt_assert.isnull ( - 1958 IGNR 1 3 3 3 wt_assert.eqqueryvalue ( - 1964 IGNR 1 0 0 0 wt_assert.g_testcase := 'Delete Records Teardown'; - 1965 IGNR 1 0 0 0 tl_delete_test_runs(c_test_run_id); - 1966 IGNR 1 3 3 3 end t_delete_records; - 1973 IGNR 0 1 1 1 procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_PROFILER:PACKAGE BODY" %-- - 1976 IGNR 1 1 1 1 t_get_error_msg; - 1977 IGNR 1 1 1 1 t_delete_profiler_recs; - 1978 IGNR 1 0 0 0 t_find_dbout; - 1979 IGNR 1 0 0 0 t_load_ignr_aa; - 1980 IGNR 1 1 1 1 t_insert_dbout_profile; - 1981 IGNR 1 1 1 1 t_initialize; - 1982 IGNR 1 1 1 1 t_finalize; - 1983 IGNR 1 1 1 1 t_trigger_offset; - 1984 IGNR 1 1 1 1 t_calc_pct_coverage; - 1985 IGNR 1 1 1 1 t_delete_records; - 1986 IGNR 1 2 2 2 end WTPLSQL_RUN; - 1991 EXCL 0 0 0 0 end wt_profiler; +WTP.WTPLSQL Test Runner Details: +---------------------------------------- - wtPLSQL 1.1.0 - Run ID 8: 29-Jun-2018 03:22:02 PM + wtPLSQL 1.2.0 - Start Date/Time: 23-Nov-2018 07:22:21 AM - Test Results for WTP.WT_RESULT - Total Test Cases: 7 Total Assertions: 35 - Minimum Interval msec: 0 Failed Assertions: 0 - Average Interval msec: 3 Error Assertions: 0 - Maximum Interval msec: 87 Test Yield: 100.00% - Total Run Time (sec): 0.1 +Test Results for WTP.WT_ASSERT +Database Object Under Test is PACKAGE BODY WTP.WT_ASSERT +---------------------------------------- + Minimum Elapsed msec: 0 Total Testcases: 150 + Average Elapsed msec: 5 Total Assertions: 404 + Maximum Elapsed msec: 375 Failed Assertions: 0 + Total Run Time (sec): 2.1 Test Yield: 100.00% - Code Coverage for PACKAGE BODY WTP.WT_RESULT - Ignored Lines: 144 Total Profiled Lines: 185 - Excluded Lines: 2 Total Executed Lines: 36 - Minimum LineExec usec: 0 Not Executed Lines: 1 - Average LineExec usec: 21 Unknown Lines: 2 - Maximum LineExec usec: 287 Code Coverage: 97.30% - Trigger Source Offset: 0 - - - WTP.WT_RESULT Test Result Details (Test Run ID 8) ------------------------------------------------------------ - ---- Test Case: Initialize Happy Path - PASS 87ms l_results_recTEST.test_run_id. EQ - Expected "-99" and got "-99" - PASS 0ms l_results_recTEST.result_seq. EQ - Expected "0" and got "0" - PASS 0ms l_results_recTEST.executed_dtm. ISNOTNULL - Expected NOT NULL and got "29-JUN-2018 15:22:02.761000" - PASS 0ms l_results_recTEST.interval_msecs. ISNULL - Expected NULL and got "" - PASS 0ms l_results_recTEST.assertion. ISNULL - Expected NULL and got "" - PASS 0ms l_results_recTEST.status. ISNULL - Expected NULL and got "" - PASS 1ms l_results_recTEST.details. ISNULL - Expected NULL and got "" - PASS 0ms l_results_recTEST.testcase. ISNULL - Expected NULL and got "" - PASS 0ms l_results_recTEST.message. ISNULL - Expected NULL and got "" - PASS 0ms l_results_ntTEST.COUNT. EQ - Expected "1" and got "1" - PASS 0ms l_results_ntTEST(1).test_run_id. ISNULL - Expected NULL and got "" - PASS 3ms Raises ORA-20009. RAISES/THROWS - Expected exception "%ORA-20009: "in_test_run_id" cannot be NULL%". Actual exception raised was "ORA-20009: "in_test_run_id" cannot be NULL". Exception raised by: "begin wt_result.initialize(NULL); end;". - ---- Test Case: Finalize Happy Path - PASS 8ms Before NULL Test Record Count. EQ - Expected "0" and got "0" - PASS 1ms After NULL Test Record Count. EQ - Expected "0" and got "0" - PASS 0ms l_results_recTEST.test_run_id. ISNULL - Expected NULL and got "" - PASS 0ms l_results_ntTEST.COUNT. EQ - Expected "1" and got "1" - PASS 0ms Record Count Test. EQ - Expected "1" and got "1" - ---- Test Case: Ad Hoc Save Happy Path Setup - PASS 0ms l_dbmsout_buff.COUNT - 1. ISNOTNULL - Expected NOT NULL and got "0" - ---- Test Case: Ad Hoc Save Testing Happy Path - PASS 0ms DBMS_OUTPUT Status. EQ - Expected "0" and got "0" - PASS 0ms DBMS_OUTPUT Line. ISNOTNULL - Expected NOT NULL and got " ---- Test Case: Ad Hoc Save Testing Happy Path\n PASS t_save_testing Message. SELFTEST1 - t_save_testing Details" - PASS 0ms Save Testing NULL Test DBMS_OUTPUT 3 Message. THIS - Expected "TRUE" and got "TRUE" - ---- Test Case: Ad Hoc Save Happy Path Teardown - PASS 0ms l_dbmsout_buff.COUNT - 1. ISNOTNULL - Expected NOT NULL and got "0" - ---- Test Case: Save Testing Happy Path - PASS 1ms t_save_testing Testing Message. SELFTEST2 - t_save_testing Testing Details - PASS 0ms g_results_nt.COUNT. EQ - Expected "24" and got "24" - PASS 0ms g_results_nt(23).assetion. EQ - Expected "SELFTEST2" and got "SELFTEST2" - PASS 0ms g_results_nt(23).status. EQ - Expected "PASS" and got "PASS" - PASS 0ms g_results_nt(23).details. EQ - Expected "t_save_testing Testing Details" and got "t_save_testing Testing Details" - PASS 0ms g_results_nt(23).testcase. EQ - Expected "Save Testing Happy Path" and got "Save Testing Happy Path" - PASS 0ms g_results_nt(23).message. EQ - Expected "t_save_testing Testing Message" and got "t_save_testing Testing Message" - PASS 0ms g_results_nt(23).interval_msecs. ISNOTNULL - Expected NOT NULL and got "1" - PASS 0ms g_results_nt(23).executed_dtm. ISNOTNULL - Expected NOT NULL and got "29-JUN-2018 15:22:02.777000" - PASS 0ms g_results_nt(23).result_seq. ISNOTNULL - Expected NOT NULL and got "23" - ---- Test Case: Delete Records Happy Path - PASS 1ms Before Insert Count. ISNOTNULL - Expected NOT NULL and got "0" - PASS 5ms After Insert Count. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_results where test_run_id = -99 - PASS 1ms After Test Count. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_results where test_run_id = -99 - PASS 0ms After ROLLBACK Count. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_results where test_run_id = -99 - - - WTP.WT_RESULT PACKAGE BODY Code Coverage Details (Test Run ID 8) -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1 EXCL 0 0 0 0 package body wt_result - 9 IGNR 0 0 0 0 g_skip_add BOOLEAN := FALSE; - 22 EXEC 2 28 10 19 procedure initialize - 27 EXEC 2 1 1 1 if in_test_run_id is NULL - 29 EXEC 1 89 89 89 raise_application_error(-20009, '"in_test_run_id" cannot be NULL'); - 31 EXEC 1 0 0 0 g_results_rec := l_results_recNULL; - 32 EXEC 1 1 1 1 g_results_rec.test_run_id := in_test_run_id; - 33 EXEC 1 0 0 0 g_results_rec.result_seq := 0; - 34 EXEC 1 7 3 4 g_results_rec.executed_dtm := systimestamp; - 35 EXEC 1 2 2 2 g_results_nt := results_nt_type(null); - 37 IGNR 1 0 0 0 g_skip_add := FALSE; - 39 EXEC 1 2 2 2 end initialize; - 43 IGNR 1 16 16 16 procedure t_initialize - 52 IGNR 1 10 10 10 l_results_ntSAVE := g_results_nt; - 53 IGNR 1 1 1 1 l_results_recSAVE := g_results_rec; - 54 IGNR 1 0 0 0 g_results_rec := l_results_recNULL; - 55 IGNR 1 1 1 1 initialize(-99); - 56 IGNR 1 0 0 0 l_results_recTEST := g_results_rec; - 57 IGNR 1 0 0 0 g_results_rec := l_results_recSAVE; - 58 IGNR 1 2 2 2 l_results_ntTEST := g_results_nt; - 59 IGNR 1 1 1 1 g_results_nt := l_results_ntSAVE; - 61 IGNR 2 7 1 6 wt_assert.g_testcase := 'Initialize Happy Path'; - 62 IGNR 1 9 9 9 wt_assert.eq ( - 67 IGNR 1 5 5 5 wt_assert.eq ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 71 IGNR 1 18 18 18 wt_assert.isnotnull ( - 75 IGNR 1 2 2 2 wt_assert.isnull ( - 78 IGNR 1 1 1 1 wt_assert.isnull ( - 82 IGNR 1 0 0 0 wt_assert.isnull ( - 85 IGNR 1 3 3 3 wt_assert.isnull ( - 89 IGNR 1 1 1 1 wt_assert.isnull ( - 92 IGNR 1 0 0 0 wt_assert.isnull ( - 95 IGNR 1 5 5 5 wt_assert.eq ( - 100 IGNR 1 2 2 2 wt_assert.isnull ( - 103 IGNR 1 0 0 0 wt_assert.raises ( - 107 IGNR 1 4 4 4 end t_initialize; - 114 EXEC 2 35 12 24 procedure finalize - 118 EXEC 2 21 8 13 begin - 119 EXEC 2 1 0 1 if g_results_rec.test_run_id IS NULL - 121 EXEC 1 10 10 10 return; - 124 EXEC 1 185 185 185 forall i in 1 .. g_results_nt.COUNT - 1 - 125#NOTX# 0 0 0 0 insert into wt_results values g_results_nt(i); - 126 EXEC 1 78 78 78 COMMIT; - 127 EXEC 1 8 8 8 g_results_nt := results_nt_type(null); - 128 EXEC 1 0 0 0 g_results_rec := l_results_recNULL; - 129 EXEC 1 0 0 0 g_results_nt := results_nt_type(null); - 130 EXEC 1 12 12 12 end finalize; - 134 IGNR 1 13 13 13 procedure t_finalize - 148 IGNR 1 1 1 1 wt_assert.g_testcase := ' '; - 149 IGNR 1 17 17 17 l_results_ntSAVE := g_results_nt; -- Capture Original Values -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 150 IGNR 1 1 1 1 l_results_recSAVE := g_results_rec; -- Capture Original Values - 153 IGNR 1 0 0 0 g_results_rec := l_results_recNULL; - 154 IGNR 1 0 0 0 g_results_rec.test_run_id := -99; - 155 IGNR 1 0 0 0 g_results_rec.result_seq := 1; - 156 IGNR 1 2 1 1 g_results_rec.executed_dtm := systimestamp; - 157 IGNR 1 0 0 0 g_results_rec.interval_msecs := 99; - 159 IGNR 1 1 1 1 g_results_rec.assertion := 'FINALTEST'; - 160 IGNR 1 1 1 1 g_results_rec.status := wt_assert.C_PASS; - 161 IGNR 1 0 0 0 g_results_rec.details := 'This is a WT_RESULT.FINALIZE Test'; - 162 IGNR 1 9 9 9 g_results_nt := results_nt_type(null); - 163 IGNR 1 1 1 1 g_results_nt(1) := g_results_rec; - 164 IGNR 1 1 1 1 g_results_nt.extend; -- Finalize expects that last element to be NULL - 167 IGNR 1 1 1 1 g_results_rec.test_run_id := NULL; - 168 IGNR 1 3158 3158 3158 select count(*) - 172 IGNR 1 1 1 1 finalize; - 174 IGNR 1 188 188 188 select count(*) - 178 IGNR 1 45 45 45 rollback; -- UNDO all database changes - 179 IGNR 1 1 1 1 g_results_rec.test_run_id := -99; - 182 IGNR 1 0 0 0 l_test_runs_rec.id := -99; - 183 IGNR 1 6 2 4 l_test_runs_rec.start_dtm := systimestamp; - 184 IGNR 1 2 2 2 l_test_runs_rec.runner_name := 'Finalize Test'; - 185 IGNR 1 0 0 0 l_test_runs_rec.runner_owner := 'BOGUS'; - 186 IGNR 1 302 302 302 insert into wt_test_runs values l_test_runs_rec; - 187 IGNR 1 124 124 124 commit; -- Must commit because finalize is AUTONOMOUS TRANSACTION - 189 IGNR 1 1 1 1 finalize; -- g_results_nt is still loaded with one element -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 190 IGNR 1 4 4 4 l_results_ntTEST := g_results_nt; - 191 IGNR 1 0 0 0 l_results_recTEST := g_results_rec; - 192 IGNR 1 238 238 238 select count(*) - 196 IGNR 1 2420 2420 2420 delete from wt_results where test_run_id = -99; - 197 IGNR 1 1216 1216 1216 delete from wt_test_runs where id = -99; - 198 IGNR 1 131 131 131 commit; -- UNDO all database changes - 200 IGNR 1 2 2 2 wt_assert.g_testcase := 'Finalize Happy Path'; - 202 IGNR 1 5 5 5 g_results_rec := l_results_recSAVE; - 203 IGNR 1 21 21 21 g_results_nt := l_results_ntSAVE; - 205 IGNR 1 11 11 11 wt_assert.eq ( - 209 IGNR 1 4 4 4 wt_assert.eq ( - 214 IGNR 1 2 2 2 wt_assert.isnull ( - 217 IGNR 1 3 3 3 wt_assert.eq ( - 221 IGNR 1 2 2 2 wt_assert.eq ( - 225 IGNR 1 6 6 6 end t_finalize; - 230 UNKN 0 218 2 57 procedure save - 239 EXEC 37 9 0 2 if g_results_rec.test_run_id IS NULL - 241 EXEC 1 14 14 14 wt_text_report.ad_hoc_result - 247 EXEC 1 2 2 2 return; - 250 EXEC 36 61 1 4 l_current_tstamp := systimestamp; - 251 EXEC 36 313 5 28 g_results_rec.interval_msecs := extract(day from ( - 254 EXEC 36 7 1 1 g_results_rec.executed_dtm := l_current_tstamp; - 256 EXEC 36 13 0 1 g_results_rec.assertion := in_assertion; - 257 EXEC 36 11 1 1 g_results_rec.status := in_status; - 258 EXEC 36 45 1 3 g_results_rec.details := substr(in_details,1,4000); -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 259 EXEC 36 15 1 1 g_results_rec.testcase := substr(in_testcase,1,50); - 260 EXEC 36 12 1 1 g_results_rec.message := substr(in_message,1,200); - 262 EXEC 36 20 0 1 g_results_rec.result_seq := g_results_rec.result_seq + 1; - 263 EXEC 36 83 1 8 g_results_nt(g_results_nt.COUNT) := g_results_rec; - 264 EXEC 36 79 1 6 g_results_nt.extend; - 267 IGNR 36 3 0 1 if not g_skip_add then - 269 IGNR 35 34 1 3 wt_test_run_stat.add_result(g_results_rec); - 274 EXEC 35 62 1 10 end save; - 278 IGNR 0 10 10 10 procedure t_save_testing - 282 IGNR 1 4 4 4 l_dbmsout_buff l_dbmsout_buff_type := l_dbmsout_buff_type(1); - 289 IGNR 1 1 1 1 wt_assert.g_testcase := 'Ad Hoc Save Happy Path Setup'; - 291 IGNR 1 0 0 0 loop - 292 IGNR 1 41 41 41 DBMS_OUTPUT.GET_LINE ( - 295 IGNR 1 1 1 1 exit when l_dbmsout_stat != 0; - 296 IGNR 0 0 0 0 l_dbmsout_buff(l_dbmsout_buff.COUNT) := l_dbmsout_line; - 297 IGNR 0 0 0 0 l_dbmsout_buff.extend; - 299 IGNR 1 3 3 3 wt_assert.isnotnull ( - 303 IGNR 1 0 0 0 wt_assert.g_testcase := 'Ad Hoc Save Testing Happy Path'; - 304 IGNR 1 1 1 1 l_test_run_id := g_results_rec.test_run_id; - 305 IGNR 1 0 0 0 g_results_rec.test_run_id := NULL; - 306 IGNR 1 0 0 0 g_skip_add := TRUE; - 307 IGNR 1 1 1 1 wt_result.save ( - 313 IGNR 1 1 1 1 g_skip_add := FALSE; - 314 IGNR 1 1 1 1 g_results_rec.test_run_id := l_test_run_id; - 316 IGNR 1 1 0 1 DBMS_OUTPUT.GET_LINE ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 319 IGNR 1 2 2 2 wt_assert.eq ( - 324 IGNR 1 1 0 1 if wt_assert.last_pass - 326 IGNR 1 1 1 1 wt_assert.isnotnull ( - 329 IGNR 1 7 7 7 wt_assert.this ( - 334 IGNR 1 0 0 0 if not wt_assert.last_pass - 337 IGNR 0 0 0 0 DBMS_OUTPUT.PUT_LINE(l_dbmsout_line); - 338 IGNR 0 0 0 0 end if; - 341 IGNR 1 0 0 0 wt_assert.g_testcase := 'Ad Hoc Save Happy Path Teardown'; - 343 IGNR 1 0 0 0 for i in 1 .. l_dbmsout_buff.COUNT - 1 - 345 IGNR 0 0 0 0 DBMS_OUTPUT.PUT_LINE(l_dbmsout_buff(i)); - 347 IGNR 1 1 1 1 wt_assert.isnotnull ( - 351 IGNR 1 0 0 0 wt_assert.g_testcase := 'Save Testing Happy Path'; - 352 IGNR 1 1 1 1 l_nt_count := g_results_nt.COUNT; - 353 IGNR 1 0 0 0 g_skip_add := TRUE; - 354 IGNR 1 0 0 0 wt_result.save ( - 360 IGNR 1 1 1 1 g_skip_add := FALSE; - 362 IGNR 1 3 3 3 wt_assert.eq ( - 366 IGNR 1 0 0 0 if not wt_assert.last_pass - 368 IGNR 0 0 0 0 return; -- Something went wrong, end this now. - 371 IGNR 1 3 3 3 wt_assert.eq ( - 375 IGNR 1 2 2 2 wt_assert.eq ( - 380 IGNR 1 2 2 2 wt_assert.eq ( - 384 IGNR 1 2 2 2 wt_assert.eq ( - 389 IGNR 1 2 2 2 wt_assert.eq ( - 393 IGNR 1 2 2 2 wt_assert.isnotnull ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 397 IGNR 1 15 15 15 wt_assert.isnotnull ( - 400 IGNR 1 2 2 2 wt_assert.isnotnull ( - 406 IGNR 1 1 1 1 end t_save_testing; - 411 UNKN 0 1 1 1 procedure delete_records - 415 EXEC 1 287 287 287 delete from wt_results - 417 EXEC 1 2 2 2 end delete_records; - 421 IGNR 1 5 0 5 procedure t_delete_records - 429 IGNR 1 1 1 1 wt_assert.g_testcase := 'Delete Records Happy Path'; - 430 IGNR 1 232 232 232 select count(*) into l_num_recs - 433 IGNR 1 3 3 3 wt_assert.isnotnull ( - 437 IGNR 1 1 1 1 l_test_runs_rec.id := -99; - 438 IGNR 1 1 0 1 l_test_runs_rec.start_dtm := sysdate; - 439 IGNR 1 0 0 0 l_test_runs_rec.runner_name := 'Delete Records Test'; - 440 IGNR 1 0 0 0 l_test_runs_rec.runner_owner := 'BOGUS'; - 441 IGNR 1 318 318 318 insert into wt_test_runs values l_test_runs_rec; - 442 IGNR 1 0 0 0 l_results_rec.test_run_id := -99; - 444 IGNR 1 0 0 0 l_results_rec.result_seq := 1; - 445 IGNR 1 3 1 2 l_results_rec.executed_dtm := sysdate; - 446 IGNR 1 0 0 0 l_results_rec.interval_msecs := 99; - 447 IGNR 1 1 1 1 l_results_rec.assertion := 'DELRECTEST'; - 448 IGNR 1 1 1 1 l_results_rec.status := wt_assert.C_PASS; - 449 IGNR 1 3 3 3 l_results_rec.details := 'This is a WT_RESULT.DELETE_RECORDS Test'; - 450 IGNR 1 1265 1265 1265 insert into wt_results values l_results_rec; - 452 IGNR 1 9 9 9 wt_assert.eqqueryvalue ( - 457 IGNR 1 1 1 1 delete_records(-99); -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 459 IGNR 1 7 7 7 wt_assert.eqqueryvalue ( - 464 IGNR 1 291 291 291 rollback; - 465 IGNR 1 4 4 4 wt_assert.eqqueryvalue ( - 470 IGNR 1 2 2 2 end t_delete_records; - 477 IGNR 0 1 1 1 procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_RESULT:PACKAGE BODY" %-- - 481 IGNR 1 1 1 1 t_initialize; - 482 IGNR 1 1 1 1 t_finalize; - 483 IGNR 1 0 0 0 t_save_testing; - 484 IGNR 1 0 0 0 t_delete_records; - 485 IGNR 1 1 1 1 end WTPLSQL_RUN; - 490 EXCL 0 0 0 0 end wt_result; - - - wtPLSQL 1.1.0 - Run ID 9: 29-Jun-2018 03:22:02 PM - - Test Results for WTP.WT_TEST_RUN_STAT - Total Test Cases: 12 Total Assertions: 108 - Minimum Interval msec: 0 Failed Assertions: 0 - Average Interval msec: 1 Error Assertions: 0 - Maximum Interval msec: 94 Test Yield: 100.00% - Total Run Time (sec): 0.1 - - Code Coverage for PACKAGE BODY WTP.WT_TEST_RUN_STAT - Ignored Lines: 302 Total Profiled Lines: 402 - Excluded Lines: 2 Total Executed Lines: 94 - Minimum LineExec usec: 0 Not Executed Lines: 0 - Average LineExec usec: 39 Unknown Lines: 4 - Maximum LineExec usec: 1966 Code Coverage: 100.00% - Trigger Source Offset: 0 - - - WTP.WT_TEST_RUN_STAT Test Result Details (Test Run ID 9) ------------------------------------------------------------ - ---- Test Case: Initialize Happy Path 1 Setup - PASS 94ms l_tc_aaTEST('TESTCASE1').test_run_id. EQ - Expected "-2" and got "-2" - PASS 0ms l_recTEST.test_run_id. EQ - Expected "-1" and got "-1" - ---- Test Case: Initialize Happy Path 1 - PASS 0ms l_tc_aaTEST.COUNT. EQ - Expected "0" and got "0" - PASS 0ms l_recTEST.test_run_id. ISNULL - Expected NULL and got "" - ---- Test Case: Add Result Testing - PASS 0ms Add Result Sad Path 1. EQ - Expected "ORA-20010: Unknown Result status "ABC"" and got "ORA-20010: Unknown Result status "ABC"" - PASS 0ms l_recTEST.test_run_id. EQ - Expected "-10" and got "-10" - PASS 0ms l_recTEST.asserts. EQ - Expected "3" and got "3" - PASS 1ms l_recTEST.passes. EQ - Expected "1" and got "1" - PASS 0ms l_recTEST.failures. EQ - Expected "1" and got "1" - PASS 0ms l_recTEST.errors. EQ - Expected "1" and got "1" - PASS 0ms l_recTEST.min_interval_msecs. EQ - Expected "10" and got "10" - PASS 0ms l_recTEST.max_interval_msecs. EQ - Expected "30" and got "30" - PASS 0ms l_recTEST.tot_interval_msecs. EQ - Expected "60" and got "60" - PASS 0ms l_tc_aaTEST('TESTCASE1').test_run_id. EQ - Expected "-10" and got "-10" - PASS 0ms l_tc_aaTEST('TESTCASE1').asserts. EQ - Expected "3" and got "3" - PASS 0ms l_tc_aaTEST('TESTCASE1').passes. EQ - Expected "1" and got "1" - PASS 0ms l_tc_aaTEST('TESTCASE1').failures. EQ - Expected "1" and got "1" - PASS 0ms l_tc_aaTEST('TESTCASE1').errors. EQ - Expected "1" and got "1" - PASS 0ms l_tc_aaTEST('TESTCASE1').min_interval_msecs. EQ - Expected "10" and got "10" - PASS 0ms l_tc_aaTEST('TESTCASE1').max_interval_msecs. EQ - Expected "30" and got "30" - PASS 0ms l_tc_aaTEST('TESTCASE1').tot_interval_msecs. EQ - Expected "60" and got "60" - ---- Test Case: Add Profile Testing - PASS 2ms l_recTEST.test_run_id. EQ - Expected "-20" and got "-20" - PASS 0ms l_recTEST.profiled_lines. EQ - Expected "15" and got "15" - PASS 1ms l_recTEST.min_executed_usecs. EQ - Expected "10" and got "10" - PASS 0ms l_recTEST.max_executed_usecs. EQ - Expected "20" and got "20" - PASS 0ms l_recTEST.tot_executed_usecs. EQ - Expected "150" and got "150" - PASS 0ms l_recTEST.executed_lines. EQ - Expected "5" and got "5" - PASS 0ms l_recTEST.ignored_lines. EQ - Expected "4" and got "4" - PASS 1ms l_recTEST.notexec_lines. EQ - Expected "3" and got "3" - PASS 0ms l_recTEST.excluded_lines. EQ - Expected "2" and got "2" - PASS 0ms l_recTEST.unknown_lines. EQ - Expected "1" and got "1" - PASS 0ms Add Result Sad Path 1. EQ - Expected "ORA-20011: Unknown Profile status "ABC"" and got "ORA-20011: Unknown Profile status "ABC"" - ---- Test Case: FINALIZE Happy Path Setup - PASS 3ms Insert WT_TEST_RUNS Record. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into WT_TEST_RUNS (id, start_dtm, runner_owner, runner_name) values (-102, sysdate, USER, 'TESTRUNNER3')". - ---- Test Case: FINALIZE Happy Path 1 - PASS 1ms Run Finalize for Happy Path 1. EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion" - PASS 3ms Retieve WT_TEST_RUN_STATS record. EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion" - PASS 0ms l_recTEST.test_run_id. EQ - Expected "-102" and got "-102" - PASS 0ms l_recTEST.test_yield. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.asserts. EQ - Expected "0" and got "0" - PASS 0ms l_recTEST.passes. EQ - Expected "0" and got "0" - PASS 0ms l_recTEST.failures. EQ - Expected "0" and got "0" - PASS 0ms l_recTEST.errors. EQ - Expected "0" and got "0" - PASS 0ms l_recTEST.testcases. EQ - Expected "0" and got "0" - PASS 0ms l_recTEST.min_interval_msecs. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.avg_interval_msecs. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.max_interval_msecs. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.tot_interval_msecs. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.code_coverage. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.profiled_lines. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.executed_lines. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.ignored_lines. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.excluded_lines. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.notexec_lines. ISNULL - Expected NULL and got "" - PASS 1ms l_recTEST.unknown_lines. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.avg_executed_usecs. ISNULL - Expected NULL and got "" - PASS 2ms There should be no WT_TESTCASE_STATS records. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from WT_TESTCASE_STATS where test_run_id = -102 - PASS 2ms Delete WT_TEST_RUN_STATS Record. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from WT_TEST_RUN_STATS where test_run_id = -102". - PASS 2ms There should be no WT_TEST_RUN_STATS records. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from WT_TEST_RUN_STATS where test_run_id = -102 - ---- Test Case: FINALIZE Happy Path 2 - PASS 3ms Run Finalize for Happy Path 2. EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion" - PASS 2ms Retieve WT_TESTCASE_STATS record. EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion" - PASS 0ms l_tstat_rec.test_run_id. EQ - Expected "-102" and got "-102" - PASS 1ms l_tstat_rec.testcase. EQ - Expected "TC2a" and got "TC2a" - PASS 0ms l_tstat_rec.asserts. EQ - Expected "3" and got "3" - PASS 0ms l_tstat_rec.passes. EQ - Expected "2" and got "2" - PASS 0ms l_tstat_rec.failures. EQ - Expected "1" and got "1" - PASS 0ms l_tstat_rec.errors. EQ - Expected "0" and got "0" - PASS 0ms l_tstat_rec.test_yield. EQ - Expected ".667" and got ".667" - PASS 0ms l_tstat_rec.avg_interval_msecs. EQ - Expected "100" and got "100" - PASS 1ms Retieve WT_TESTCASE_STATS record. EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion" - PASS 0ms l_tstat_rec.test_run_id. EQ - Expected "-102" and got "-102" - PASS 0ms l_tstat_rec.testcase. EQ - Expected "TC2b" and got "TC2b" - PASS 0ms l_tstat_rec.asserts. EQ - Expected "3" and got "3" - PASS 1ms l_tstat_rec.passes. EQ - Expected "2" and got "2" - PASS 0ms l_tstat_rec.failures. EQ - Expected "1" and got "1" - PASS 0ms l_tstat_rec.errors. EQ - Expected "0" and got "0" - PASS 0ms l_tstat_rec.test_yield. EQ - Expected ".667" and got ".667" - PASS 0ms l_tstat_rec.avg_interval_msecs. EQ - Expected "100" and got "100" - PASS 0ms Retieve WT_TEST_RUN_STATS record. EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion" - PASS 0ms l_recTEST.test_run_id. EQ - Expected "-102" and got "-102" - PASS 0ms l_recTEST.test_yield. EQ - Expected ".667" and got ".667" - PASS 0ms l_recTEST.asserts. EQ - Expected "6" and got "6" - PASS 0ms l_recTEST.passes. EQ - Expected "4" and got "4" - PASS 0ms l_recTEST.failures. EQ - Expected "2" and got "2" - PASS 0ms l_recTEST.errors. EQ - Expected "0" and got "0" - PASS 1ms l_recTEST.testcases. EQ - Expected "2" and got "2" - PASS 0ms l_recTEST.avg_interval_msecs. EQ - Expected "100" and got "100" - PASS 0ms l_recTEST.code_coverage. EQ - Expected ".8" and got ".8" - PASS 0ms l_recTEST.profiled_lines. EQ - Expected "20" and got "20" - PASS 0ms l_recTEST.executed_lines. EQ - Expected "8" and got "8" - PASS 0ms l_recTEST.ignored_lines. EQ - Expected "6" and got "6" - PASS 0ms l_recTEST.excluded_lines. EQ - Expected "4" and got "4" - PASS 0ms l_recTEST.notexec_lines. EQ - Expected "2" and got "2" - PASS 0ms l_recTEST.unknown_lines. EQ - Expected "0" and got "0" - PASS 0ms l_recTEST.avg_executed_usecs. EQ - Expected "200" and got "200" - PASS 2ms Delete WT_TESTCASE_STATS Record. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from WT_TESTCASE_STATS where test_run_id = -102". - PASS 1ms There should be no WT_TESTCASE_STATS records. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from WT_TESTCASE_STATS where test_run_id = -102 - PASS 0ms Delete WT_TEST_RUN_STATS Record. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from WT_TEST_RUN_STATS where test_run_id = -102". - PASS 1ms There should be no WT_TEST_RUN_STATS records. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from WT_TEST_RUN_STATS where test_run_id = -102 - ---- Test Case: FINALIZE Sad Path 1 - PASS 0ms Run Finalize for Sad Path 1. EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion" - PASS 0ms l_recTEST.test_run_id. ISNULL - Expected NULL and got "" - PASS 0ms l_recTEST.asserts. ISNULL - Expected NULL and got "" - ---- Test Case: FINALIZE Happy Path Teardown - PASS 1ms Delete WT_TEST_RUNS Record. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from WT_TEST_RUNS where id = -102". - ---- Test Case: Delete Records Happy Path Setup - PASS 2ms Insert WT_TEST_RUNS Record. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into WT_TEST_RUNS (id, start_dtm, runner_owner, runner_name) values (-100, sysdate, USER, 'TESTRUNNER2')". - PASS 3ms Insert WT_TEST_RUN_STATS Record. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into WT_TEST_RUN_STATS (test_run_id) values (-100)". - PASS 4ms Insert WT_TESTCASE_STATS Record. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into WT_TESTCASE_STATS (test_run_id, testcase) values (-100, 'TESTCASE2')". - ---- Test Case: Delete Records Happy Path and Teardown - PASS 3ms Delete Records with NULL ID. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "begin wt_test_run_stat.delete_records(-100); end;". - PASS 3ms Delete WT_TEST_RUNS Record. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from WT_TEST_RUNS where id = -100". - ---- Test Case: Delete Records Test Sad Paths - PASS 1ms Delete Records with NULL ID. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "begin wt_test_run_stat.delete_records(null); end;". - PASS 2ms Delete Records with Invalid ID. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "begin wt_test_run_stat.delete_records(-0.01); end;". - - - WTP.WT_TEST_RUN_STAT PACKAGE BODY Code Coverage Details (Test Run ID 9) -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1 EXCL 0 0 0 0 package body wt_test_run_stat - 22 EXEC 4 25 2 15 procedure initialize - 26 EXEC 4 4 0 3 g_rec := l_recNULL; - 27 EXEC 4 12 0 9 g_tc_aa.delete; - 28 EXEC 4 5 0 4 end initialize; - 32 IGNR 2 25 25 25 procedure t_initialize - 40 IGNR 2 10 2 8 wt_assert.g_testcase := 'Initialize Happy Path 1 Setup'; - 41 IGNR 1 9 9 9 l_tc_aaTEST('TESTCASE1').test_run_id := -2; - 42 IGNR 1 0 0 0 l_recTEST.test_run_id := -1; - 43 IGNR 1 9 9 9 wt_assert.eq ( - 47 IGNR 1 8 8 8 wt_assert.eq ( - 52 IGNR 1 9 9 9 l_tc_aaSAVE := g_tc_aa; - 53 IGNR 1 1 1 1 l_recSAVE := g_rec; - 54 IGNR 1 5 5 5 g_tc_aa := l_tc_aaTEST; - 55 IGNR 1 1 1 1 g_rec := l_recTEST; - 56 IGNR 1 0 0 0 initialize; - 57 IGNR 1 0 0 0 l_tc_aaTEST := g_tc_aa; - 58 IGNR 1 0 0 0 l_recTEST := g_rec; - 59 IGNR 1 1 1 1 g_tc_aa := l_tc_aaSAVE; - 60 IGNR 1 0 0 0 g_rec := l_recSAVE; - 62 IGNR 1 0 0 0 wt_assert.g_testcase := 'Initialize Happy Path 1'; - 63 IGNR 1 3 3 3 wt_assert.eq ( - 67 IGNR 1 1 1 1 wt_assert.isnull ( - 70 IGNR 1 3 3 3 end t_initialize; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 75 UNKN 0 135 1 7 procedure add_result - 82 EXEC 112 72 1 53 case in_results_rec.status - 83 EXEC 112 45 0 2 when 'PASS' then - 84 EXEC 109 69 1 3 g_rec.passes := nvl(g_rec.passes,0) + 1; - 85 EXEC 3 1 0 1 when 'FAIL' then - 86 EXEC 1 0 0 0 g_rec.failures := nvl(g_rec.failures,0) + 1; - 87 EXEC 2 1 0 1 when 'ERR' then - 88 EXEC 1 0 0 0 g_rec.errors := nvl(g_rec.errors,0) + 1; - 90 EXEC 1 105 105 105 raise_application_error(-20010, 'Unknown Result status "' || - 93 EXEC 111 35 0 1 g_rec.test_run_id := in_results_rec.test_run_id; - 94 EXEC 111 30 0 1 g_rec.asserts := nvl(g_rec.asserts,0) + 1; - 95 EXEC 111 68 1 2 g_rec.min_interval_msecs := least(nvl(g_rec.min_interval_msecs,999999999) - 97 EXEC 111 30 0 1 g_rec.max_interval_msecs := greatest(nvl(g_rec.max_interval_msecs,0) - 99 EXEC 111 38 0 1 g_rec.tot_interval_msecs := nvl(g_rec.tot_interval_msecs,0) + - 101 EXEC 111 71 1 44 if in_results_rec.testcase is not null - 103 EXEC 111 19 0 1 tc := in_results_rec.testcase; - 104 EXEC 111 311 1 66 g_tc_aa(tc).testcase := tc; - 105 EXEC 111 19 0 2 g_tc_aa(tc).test_run_id := in_results_rec.test_run_id; - 106 EXEC 111 49 0 1 g_tc_aa(tc).asserts := nvl(g_tc_aa(tc).asserts,0) + 1; - 107 EXEC 111 0 0 0 case in_results_rec.status - 108 EXEC 111 15 0 1 when 'PASS' then - 109 EXEC 109 214 0 174 g_tc_aa(tc).passes := nvl(g_tc_aa(tc).passes,0) + 1; - 110 EXEC 2 0 0 0 when 'FAIL' then - 111 EXEC 1 0 0 0 g_tc_aa(tc).failures := nvl(g_tc_aa(tc).failures,0) + 1; - 112 EXEC 1 0 0 0 when 'ERR' then -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 113 EXEC 1 0 0 0 g_tc_aa(tc).errors := nvl(g_tc_aa(tc).errors,0) + 1; - 116 EXEC 111 46 1 4 g_tc_aa(tc).min_interval_msecs := least(nvl(g_tc_aa(tc).min_interval_msecs,999999999) - 118 EXEC 111 32 0 1 g_tc_aa(tc).max_interval_msecs := greatest(nvl(g_tc_aa(tc).max_interval_msecs,0) - 120 EXEC 111 29 0 1 g_tc_aa(tc).tot_interval_msecs := nvl(g_tc_aa(tc).tot_interval_msecs,0) + - 123 EXEC 111 32 1 1 end add_result; - 127 IGNR 1 14 14 14 procedure t_add_result - 145 IGNR 1 2 2 2 l_tc_aaSAVE := g_tc_aa; - 146 IGNR 1 0 0 0 l_recSAVE := g_rec; - 147 IGNR 1 1 1 1 g_tc_aa := l_tc_aaTEST; - 148 IGNR 1 1 1 1 g_rec := l_recTEST; - 149 IGNR 1 0 0 0 l_resultTEST.test_run_id := -10; - 150 IGNR 1 0 0 0 l_resultTEST.interval_msecs := 10; - 151 IGNR 1 1 1 1 l_resultTEST.status := 'PASS'; - 152 IGNR 1 0 0 0 l_resultTEST.testcase := 'TESTCASE1'; - 153 IGNR 1 0 0 0 add_result(l_resultTEST); - 155 IGNR 1 0 0 0 l_resultTEST.interval_msecs := 20; - 156 IGNR 1 0 0 0 l_resultTEST.status := 'FAIL'; - 157 IGNR 1 0 0 0 l_resultTEST.testcase := 'TESTCASE1'; - 158 IGNR 1 0 0 0 add_result(l_resultTEST); - 159 IGNR 1 1 1 1 l_resultTEST.interval_msecs := 30; - 160 IGNR 1 0 0 0 l_resultTEST.status := 'ERR'; - 161 IGNR 1 0 0 0 l_resultTEST.testcase := 'TESTCASE1'; - 162 IGNR 1 0 0 0 add_result(l_resultTEST); - 164 IGNR 1 0 0 0 l_resultTEST.interval_msecs := 40; - 165 IGNR 1 1 1 1 l_resultTEST.status := 'ABC'; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 166 IGNR 1 0 0 0 l_resultTEST.testcase := 'TESTCASE1'; - 168 IGNR 1 0 0 0 add_result(l_resultTEST); - 169 IGNR 0 0 0 0 l_sqlerrm := SQLERRM; - 170 IGNR 1 0 0 0 exception when others then - 171 IGNR 1 123 123 123 l_sqlerrm := SQLERRM; - 172 IGNR 0 3 3 3 end; - 174 IGNR 1 6 6 6 l_tc_aaTEST := g_tc_aa; - 175 IGNR 1 1 1 1 l_recTEST := g_rec; - 176 IGNR 1 3 3 3 g_tc_aa := l_tc_aaSAVE; - 177 IGNR 1 1 1 1 g_rec := l_recSAVE; - 178 IGNR 1 0 0 0 wt_assert.g_testcase := 'Add Result Testing'; - 179 IGNR 1 2 2 2 wt_assert.eq ( - 184 IGNR 1 5 5 5 wt_assert.eq ( - 188 IGNR 1 2 2 2 wt_assert.eq ( - 193 IGNR 1 2 2 2 wt_assert.eq ( - 197 IGNR 1 2 2 2 wt_assert.eq ( - 202 IGNR 1 2 2 2 wt_assert.eq ( - 206 IGNR 1 3 3 3 wt_assert.eq ( - 211 IGNR 1 2 2 2 wt_assert.eq ( - 215 IGNR 1 2 2 2 wt_assert.eq ( - 220 IGNR 1 4 4 4 wt_assert.eq ( - 224 IGNR 1 3 3 3 wt_assert.eq ( - 229 IGNR 1 2 2 2 wt_assert.eq ( - 233 IGNR 1 2 2 2 wt_assert.eq ( - 238 IGNR 1 1 1 1 wt_assert.eq ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 242 IGNR 1 2 2 2 wt_assert.eq ( - 247 IGNR 1 2 2 2 wt_assert.eq ( - 251 IGNR 1 2 2 2 wt_assert.eq ( - 255 IGNR 1 4 4 4 end t_add_result; - 260 UNKN 0 5 0 1 procedure add_profile - 266 EXEC 16 2 0 1 case in_dbout_profiles_rec.status - 267 EXEC 16 6 0 1 when 'EXEC' then - 268 EXEC 5 0 0 0 g_rec.executed_lines := nvl(g_rec.executed_lines,0) + 1; - 270 EXEC 5 3 1 1 g_rec.min_executed_usecs := least(nvl(g_rec.min_executed_usecs,999999999) - 272 EXEC 5 1 0 1 g_rec.max_executed_usecs := greatest(nvl(g_rec.max_executed_usecs,0) - 274 EXEC 5 3 0 1 g_rec.tot_executed_usecs := nvl(g_rec.tot_executed_usecs,0) + - 277 EXEC 11 0 0 0 when 'IGNR' then - 278 EXEC 4 4 1 1 g_rec.ignored_lines := nvl(g_rec.ignored_lines,0) + 1; - 279 EXEC 7 2 1 1 when 'EXCL' then - 280 EXEC 2 1 1 1 g_rec.excluded_lines := nvl(g_rec.excluded_lines,0) + 1; - 281 EXEC 5 0 0 0 when 'NOTX' then - 282 EXEC 3 1 0 1 g_rec.notexec_lines := nvl(g_rec.notexec_lines,0) + 1; - 283 EXEC 2 0 0 0 when 'UNKN' then - 284 EXEC 1 1 1 1 g_rec.unknown_lines := nvl(g_rec.unknown_lines,0) + 1; - 286 EXEC 1 1527 1527 1527 raise_application_error(-20011, 'Unknown Profile status "' || - 289 EXEC 15 3 0 1 g_rec.test_run_id := in_dbout_profiles_rec.test_run_id; - 290 EXEC 15 1 0 1 g_rec.profiled_lines := nvl(g_rec.profiled_lines,0) + 1; - 291 EXEC 15 1 0 1 end add_profile; - 295 IGNR 1 60 60 60 procedure t_add_profile - 311 IGNR 1 1 1 1 l_recSAVE := g_rec; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 312 IGNR 1 1 1 1 g_rec := l_recTEST; - 313 IGNR 1 1 1 1 l_profileTEST.test_run_id := -20; - 314 IGNR 1 1 1 1 l_profileTEST.min_usecs := 10; - 315 IGNR 1 0 0 0 l_profileTEST.max_usecs := 20; - 316 IGNR 1 1 1 1 l_profileTEST.total_usecs := 30; - 317 IGNR 1 0 0 0 l_profileTEST.total_occur := 1; - 318 IGNR 1 1 1 1 l_profileTEST.status := 'EXEC'; - 319 IGNR 1 0 0 0 add_profile(l_profileTEST); - 320 IGNR 1 0 0 0 l_profileTEST.status := 'EXEC'; - 321 IGNR 1 0 0 0 add_profile(l_profileTEST); - 323 IGNR 1 0 0 0 l_profileTEST.status := 'EXEC'; - 324 IGNR 1 0 0 0 add_profile(l_profileTEST); - 325 IGNR 1 0 0 0 l_profileTEST.status := 'EXEC'; - 326 IGNR 1 0 0 0 add_profile(l_profileTEST); - 327 IGNR 1 0 0 0 l_profileTEST.status := 'EXEC'; - 328 IGNR 1 0 0 0 add_profile(l_profileTEST); - 329 IGNR 1 0 0 0 l_profileTEST.status := 'IGNR'; - 330 IGNR 1 0 0 0 add_profile(l_profileTEST); - 331 IGNR 1 0 0 0 l_profileTEST.status := 'IGNR'; - 332 IGNR 1 1 1 1 add_profile(l_profileTEST); - 334 IGNR 1 0 0 0 l_profileTEST.status := 'IGNR'; - 335 IGNR 1 0 0 0 add_profile(l_profileTEST); - 336 IGNR 1 0 0 0 l_profileTEST.status := 'IGNR'; - 337 IGNR 1 0 0 0 add_profile(l_profileTEST); - 338 IGNR 1 0 0 0 l_profileTEST.status := 'NOTX'; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 339 IGNR 1 0 0 0 add_profile(l_profileTEST); - 340 IGNR 1 0 0 0 l_profileTEST.status := 'NOTX'; - 341 IGNR 1 0 0 0 add_profile(l_profileTEST); - 342 IGNR 1 0 0 0 l_profileTEST.status := 'NOTX'; - 343 IGNR 1 1 1 1 add_profile(l_profileTEST); - 345 IGNR 1 0 0 0 l_profileTEST.status := 'EXCL'; - 346 IGNR 1 0 0 0 add_profile(l_profileTEST); - 347 IGNR 1 0 0 0 l_profileTEST.status := 'EXCL'; - 348 IGNR 1 0 0 0 add_profile(l_profileTEST); - 349 IGNR 1 0 0 0 l_profileTEST.status := 'UNKN'; - 350 IGNR 1 0 0 0 add_profile(l_profileTEST); - 352 IGNR 1 0 0 0 l_profileTEST.status := 'ABC'; - 354 IGNR 1 0 0 0 add_profile(l_profileTEST); - 355 IGNR 0 0 0 0 l_sqlerrm := SQLERRM; - 356 IGNR 1 0 0 0 exception when others then - 357 IGNR 1 131 131 131 l_sqlerrm := SQLERRM; - 358 IGNR 0 3 3 3 end; - 359 IGNR 1 5 5 5 l_recTEST := g_rec; - 360 IGNR 1 2 2 2 g_rec := l_recSAVE; - 362 IGNR 1 1 1 1 wt_assert.g_testcase := 'Add Profile Testing'; - 363 IGNR 1 17 17 17 wt_assert.eq ( - 367 IGNR 1 5 5 5 wt_assert.eq ( - 372 IGNR 1 295 295 295 wt_assert.eq ( - 376 IGNR 1 3 3 3 wt_assert.eq ( - 381 IGNR 1 2 2 2 wt_assert.eq ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 385 IGNR 1 2 2 2 wt_assert.eq ( - 390 IGNR 1 2 2 2 wt_assert.eq ( - 394 IGNR 1 4 4 4 wt_assert.eq ( - 399 IGNR 1 6 6 6 wt_assert.eq ( - 403 IGNR 1 4 4 4 wt_assert.eq ( - 408 IGNR 1 0 0 0 wt_assert.eq ( - 412 IGNR 1 3 3 3 end t_add_profile; - 417 UNKN 0 10 3 4 procedure finalize - 422 EXEC 3 48 15 17 begin - 423 EXEC 3 3 1 1 if g_rec.test_run_id is null - 425 EXEC 1 0 0 0 initialize; - 426 EXEC 1 6 6 6 return; - 428 EXEC 2 2 1 1 g_rec.testcases := g_tc_aa.COUNT; - 429 EXEC 2 0 0 0 g_rec.asserts := nvl(g_rec.asserts ,0); - 430 EXEC 2 1 0 1 g_rec.passes := nvl(g_rec.passes ,0); - 431 EXEC 2 0 0 0 g_rec.failures := nvl(g_rec.failures,0); - 432 EXEC 2 0 0 0 g_rec.errors := nvl(g_rec.errors ,0); - 433 EXEC 2 1 0 1 if g_rec.asserts != 0 - 435 EXEC 1 3 3 3 g_rec.test_yield := round(g_rec.passes/g_rec.asserts, 3); - 436 EXEC 1 1 1 1 g_rec.avg_interval_msecs := round(g_rec.tot_interval_msecs/g_rec.asserts, 3); - 438 EXEC 2 1 0 1 if g_rec.profiled_lines is not null - 440 EXEC 1 1 1 1 g_rec.executed_lines := nvl(g_rec.executed_lines ,0); - 441 EXEC 1 0 0 0 g_rec.ignored_lines := nvl(g_rec.ignored_lines,0); - 442 EXEC 1 0 0 0 g_rec.excluded_lines := nvl(g_rec.excluded_lines ,0); - 443 EXEC 1 0 0 0 g_rec.notexec_lines := nvl(g_rec.notexec_lines ,0); -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 444 EXEC 1 1 1 1 g_rec.unknown_lines := nvl(g_rec.unknown_lines ,0); - 445 EXEC 1 0 0 0 l_executable_lines := g_rec.executed_lines + g_rec.notexec_lines; - 446 EXEC 1 0 0 0 if l_executable_lines != 0 - 448 EXEC 1 1 1 1 g_rec.code_coverage := round(g_rec.executed_lines/l_executable_lines, 3); - 449 EXEC 1 1 1 1 g_rec.avg_executed_usecs := round(g_rec.tot_executed_usecs/l_executable_lines, 3); - 450 EXEC 1 0 0 0 end if; - 452 EXEC 2 421 171 250 insert into wt_test_run_stats values g_rec; - 453 EXEC 2 2 1 1 if g_rec.testcases > 0 - 455 EXEC 1 4 4 4 tc := g_tc_aa.FIRST; - 456 EXEC 2 0 0 0 loop - 457 EXEC 2 3 1 2 g_tc_aa(tc).asserts := nvl(g_tc_aa(tc).asserts ,0); - 458 EXEC 2 0 0 0 g_tc_aa(tc).passes := nvl(g_tc_aa(tc).passes ,0); - 459 EXEC 2 0 0 0 g_tc_aa(tc).failures := nvl(g_tc_aa(tc).failures,0); - 460 EXEC 2 0 0 0 g_tc_aa(tc).errors := nvl(g_tc_aa(tc).errors ,0); - 461 EXEC 2 0 0 0 if g_rec.asserts != 0 - 463 EXEC 2 4 2 2 g_tc_aa(tc).test_yield := round(g_tc_aa(tc).passes / - 465 EXEC 2 2 1 1 g_tc_aa(tc).avg_interval_msecs := round(g_tc_aa(tc).tot_interval_msecs / - 468 EXEC 2 439 79 360 insert into wt_testcase_stats values g_tc_aa(tc); - 469 EXEC 2 6 2 4 exit when tc = g_tc_aa.LAST; - 470 EXEC 1 2 2 2 tc := g_tc_aa.NEXT(tc); - 473 EXEC 2 2303 337 1966 COMMIT; - 474 EXEC 2 2 1 1 initialize; - 475 EXEC 2 34 11 23 end finalize; - 479 IGNR 1 23 23 23 procedure t_finalize - 487 IGNR 1 0 0 0 l_test_run_id number := -102; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 488 IGNR 1 1 1 1 l_tc varchar2(50) := 'TC2'; - 492 IGNR 0 4 1 2 procedure run_finalize (in_msg_txt in varchar2) is begin - 493 IGNR 3 47 14 18 l_tc_aaSAVE := g_tc_aa; - 494 IGNR 3 4 1 2 l_recSAVE := g_rec; - 495 IGNR 3 14 4 5 g_tc_aa := l_tc_aaTEST; - 496 IGNR 3 3 1 1 g_rec := l_recTEST; - 498 IGNR 3 2 1 1 finalize; - 499 IGNR 3 10 2 5 l_sqlerrm := SQLERRM; - 500 IGNR 0 0 0 0 exception when others then - 501 IGNR 0 0 0 0 l_sqlerrm := SQLERRM; - 502 IGNR 0 0 0 0 end; - 504 IGNR 3 7 1 5 l_tc_aaTEST := g_tc_aa; - 505 IGNR 3 3 1 2 l_recTEST := g_rec; - 506 IGNR 3 22 5 12 g_tc_aa := l_tc_aaSAVE; - 507 IGNR 3 1 0 1 g_rec := l_recSAVE; - 508 IGNR 3 8 1 5 wt_assert.eq ( - 512 IGNR 3 0 0 0 end run_finalize; - 515 IGNR 1 2 2 2 wt_assert.g_testcase := 'FINALIZE Happy Path Setup'; - 516 IGNR 1 3 3 3 l_sql_txt := 'insert into WT_TEST_RUNS' || - 519 IGNR 1 1 1 1 wt_assert.raises ( - 523 IGNR 1 167 167 167 commit; - 525 IGNR 1 1 1 1 wt_assert.g_testcase := 'FINALIZE Happy Path 1'; - 526 IGNR 1 3 3 3 l_tc_aaTEST.delete; - 527 IGNR 1 2 2 2 l_recTEST := l_recNULL; - 528 IGNR 1 1 1 1 l_recTEST.test_run_id := l_test_run_id; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 529 IGNR 1 1 1 1 run_finalize('Run Finalize for Happy Path 1'); -- AUTONOMOUS COMMIT - 532 IGNR 1 2866 2866 2866 select * into l_recTEST - 535 IGNR 1 6 6 6 l_sqlerrm := SQLERRM; - 536 IGNR 0 0 0 0 exception when others then - 537 IGNR 0 0 0 0 l_sqlerrm := SQLERRM; - 538 IGNR 0 0 0 0 end; - 540 IGNR 1 3 3 3 wt_assert.eq ( - 544 IGNR 1 5 5 5 wt_assert.eq ( - 549 IGNR 1 1 1 1 wt_assert.isnull ( - 552 IGNR 1 3 3 3 wt_assert.eq ( - 557 IGNR 1 2 2 2 wt_assert.eq ( - 561 IGNR 1 1 1 1 wt_assert.eq ( - 566 IGNR 1 2 2 2 wt_assert.eq ( - 570 IGNR 1 1 1 1 wt_assert.eq ( - 575 IGNR 1 0 0 0 wt_assert.isnull ( - 578 IGNR 1 1 1 1 wt_assert.isnull ( - 581 IGNR 1 1 1 1 wt_assert.isnull ( - 585 IGNR 1 1 1 1 wt_assert.isnull ( - 588 IGNR 1 1 1 1 wt_assert.isnull ( - 591 IGNR 1 0 0 0 wt_assert.isnull ( - 595 IGNR 1 1 1 1 wt_assert.isnull ( - 598 IGNR 1 1 1 1 wt_assert.isnull ( - 601 IGNR 1 0 0 0 wt_assert.isnull ( - 605 IGNR 1 1 1 1 wt_assert.isnull ( - 608 IGNR 1 0 0 0 wt_assert.isnull ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 611 IGNR 1 1 1 1 wt_assert.isnull ( - 615 IGNR 1 4 4 4 wt_assert.eqqueryvalue ( - 621 IGNR 1 6 6 6 wt_assert.raises ( - 626 IGNR 1 144 144 144 commit; - 627 IGNR 1 9 9 9 wt_assert.eqqueryvalue ( - 633 IGNR 1 0 0 0 wt_assert.g_testcase := 'FINALIZE Happy Path 2'; - 634 IGNR 1 2 2 2 l_tc_aaTEST.delete; - 635 IGNR 1 6 6 6 l_tc_aaTEST(l_tc||'a').test_run_id := l_test_run_id; - 636 IGNR 1 1 1 1 l_tc_aaTEST(l_tc||'a').testcase := l_tc||'a'; - 637 IGNR 1 1 1 1 l_tc_aaTEST(l_tc||'a').asserts := 3; - 638 IGNR 1 1 1 1 l_tc_aaTEST(l_tc||'a').passes := 2; - 639 IGNR 1 1 1 1 l_tc_aaTEST(l_tc||'a').failures := 1; - 641 IGNR 1 1 1 1 l_tc_aaTEST(l_tc||'a').tot_interval_msecs := 300; - 643 IGNR 1 2 2 2 l_tc_aaTEST(l_tc||'b').test_run_id := l_test_run_id; - 644 IGNR 1 1 1 1 l_tc_aaTEST(l_tc||'b').testcase := l_tc||'b'; - 645 IGNR 1 1 1 1 l_tc_aaTEST(l_tc||'b').asserts := 3; - 646 IGNR 1 1 1 1 l_tc_aaTEST(l_tc||'b').passes := 2; - 647 IGNR 1 1 1 1 l_tc_aaTEST(l_tc||'b').failures := 1; - 649 IGNR 1 1 1 1 l_tc_aaTEST(l_tc||'b').tot_interval_msecs := 300; - 651 IGNR 1 1 1 1 l_recTEST := l_recNULL; - 652 IGNR 1 0 0 0 l_recTEST.test_run_id := l_test_run_id; - 653 IGNR 1 1 1 1 l_recTEST.asserts := 6; - 654 IGNR 1 0 0 0 l_recTEST.passes := 4; - 655 IGNR 1 1 1 1 l_recTEST.failures := 2; - 657 IGNR 1 0 0 0 l_recTEST.tot_interval_msecs := 600; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 659 IGNR 1 0 0 0 l_recTEST.profiled_lines := 20; - 660 IGNR 1 0 0 0 l_recTEST.executed_lines := 8; - 661 IGNR 1 0 0 0 l_recTEST.ignored_lines := 6; - 662 IGNR 1 0 0 0 l_recTEST.excluded_lines := 4; - 663 IGNR 1 0 0 0 l_recTEST.notexec_lines := 2; - 665 IGNR 1 0 0 0 l_recTEST.tot_executed_usecs := 2000; - 666 IGNR 1 0 0 0 run_finalize('Run Finalize for Happy Path 2'); -- AUTONOMOUS COMMIT - 668 IGNR 0 0 0 0 begin - 669 IGNR 1 2288 2288 2288 select * into l_tstat_rec - 673 IGNR 1 4 4 4 l_sqlerrm := SQLERRM; - 674 IGNR 0 0 0 0 exception when others then - 675 IGNR 0 0 0 0 l_sqlerrm := SQLERRM; - 676 IGNR 0 0 0 0 end; - 678 IGNR 1 3 3 3 wt_assert.eq ( - 682 IGNR 1 5 5 5 wt_assert.eq ( - 687 IGNR 1 2 2 2 wt_assert.eq ( - 691 IGNR 1 4 4 4 wt_assert.eq ( - 696 IGNR 1 2 2 2 wt_assert.eq ( - 700 IGNR 1 2 2 2 wt_assert.eq ( - 705 IGNR 1 2 2 2 wt_assert.eq ( - 709 IGNR 1 3 3 3 wt_assert.eq ( - 713 IGNR 1 3 3 3 wt_assert.eq ( - 719 IGNR 1 1319 1319 1319 select * into l_tstat_rec - 723 IGNR 1 2 2 2 l_sqlerrm := SQLERRM; - 724 IGNR 0 0 0 0 exception when others then -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 725 IGNR 0 0 0 0 l_sqlerrm := SQLERRM; - 726 IGNR 0 0 0 0 end; - 728 IGNR 1 2 2 2 wt_assert.eq ( - 732 IGNR 1 3 3 3 wt_assert.eq ( - 737 IGNR 1 1 1 1 wt_assert.eq ( - 741 IGNR 1 3 3 3 wt_assert.eq ( - 746 IGNR 1 3 3 3 wt_assert.eq ( - 750 IGNR 1 1 1 1 wt_assert.eq ( - 755 IGNR 1 2 2 2 wt_assert.eq ( - 759 IGNR 1 1 1 1 wt_assert.eq ( - 763 IGNR 1 2 2 2 wt_assert.eq ( - 769 IGNR 1 207 207 207 select * into l_recTEST - 772 IGNR 1 2 2 2 l_sqlerrm := SQLERRM; - 773 IGNR 0 0 0 0 exception when others then - 774 IGNR 0 0 0 0 l_sqlerrm := SQLERRM; - 775 IGNR 0 0 0 0 end; - 777 IGNR 1 1 1 1 wt_assert.eq ( - 781 IGNR 1 2 2 2 wt_assert.eq ( - 786 IGNR 1 3 3 3 wt_assert.eq ( - 790 IGNR 1 2 2 2 wt_assert.eq ( - 795 IGNR 1 3 3 3 wt_assert.eq ( - 799 IGNR 1 1 1 1 wt_assert.eq ( - 804 IGNR 1 1 1 1 wt_assert.eq ( - 808 IGNR 1 1 1 1 wt_assert.eq ( - 813 IGNR 1 2 2 2 wt_assert.eq ( -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 817 IGNR 1 3 3 3 wt_assert.eq ( - 822 IGNR 1 2 2 2 wt_assert.eq ( - 826 IGNR 1 2 2 2 wt_assert.eq ( - 831 IGNR 1 2 2 2 wt_assert.eq ( - 835 IGNR 1 1 1 1 wt_assert.eq ( - 840 IGNR 1 2 2 2 wt_assert.eq ( - 844 IGNR 1 3 3 3 wt_assert.eq ( - 848 IGNR 1 3 3 3 wt_assert.eq ( - 853 IGNR 1 3 3 3 wt_assert.raises ( - 858 IGNR 1 147 147 147 commit; - 859 IGNR 1 10 10 10 wt_assert.eqqueryvalue ( - 865 IGNR 1 3 3 3 wt_assert.raises ( - 870 IGNR 1 86 86 86 commit; - 871 IGNR 1 5 5 5 wt_assert.eqqueryvalue ( - 877 IGNR 1 1 1 1 wt_assert.g_testcase := 'FINALIZE Sad Path 1'; - 878 IGNR 1 2 2 2 l_tc_aaTEST.delete; - 879 IGNR 1 1 1 1 l_recTEST := l_recNULL; - 880 IGNR 1 0 0 0 l_recTEST.asserts := 2; - 881 IGNR 1 1 1 1 run_finalize('Run Finalize for Sad Path 1'); -- AUTONOMOUS COMMIT - 882 IGNR 1 1 1 1 wt_assert.isnull ( - 885 IGNR 1 0 0 0 wt_assert.isnull ( - 889 IGNR 1 0 0 0 wt_assert.g_testcase := 'FINALIZE Happy Path Teardown'; - 890 IGNR 1 3 3 3 wt_assert.raises ( - 895 IGNR 1 128 128 128 commit; - 896 IGNR 1 7 7 7 end t_finalize; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 901 UNKN 0 8 2 4 procedure delete_records - 905 EXEC 3 672 81 489 delete from wt_testcase_stats - 907 EXEC 3 263 40 167 delete from wt_test_run_stats - 909 EXEC 3 6 1 3 end delete_records; - 913 IGNR 0 3 3 3 procedure t_delete_records - 915 IGNR 1 0 0 0 l_test_run_id number := -100; - 919 IGNR 1 1 1 1 wt_assert.g_testcase := 'Delete Records Happy Path Setup'; - 920 IGNR 1 5 5 5 l_sql_txt := 'insert into WT_TEST_RUNS' || - 923 IGNR 1 2 2 2 wt_assert.raises ( - 928 IGNR 1 4 4 4 l_sql_txt := 'insert into WT_TEST_RUN_STATS (test_run_id) values (' || - 930 IGNR 1 0 0 0 wt_assert.raises ( - 934 IGNR 1 5 5 5 l_sql_txt := 'insert into WT_TESTCASE_STATS (test_run_id, testcase)' || - 936 IGNR 1 1 1 1 wt_assert.raises ( - 941 IGNR 1 0 0 0 wt_assert.g_testcase := 'Delete Records Happy Path and Teardown'; - 942 IGNR 1 9 9 9 wt_assert.raises ( - 947 IGNR 1 8 8 8 wt_assert.raises ( - 952 IGNR 1 1 1 1 wt_assert.g_testcase := 'Delete Records Test Sad Paths'; - 953 IGNR 1 1 1 1 wt_assert.raises ( - 957 IGNR 1 2 2 2 wt_assert.raises ( - 961 IGNR 1 0 0 0 end t_delete_records; - 968 IGNR 0 1 1 1 procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_TEST_RUN_STAT:PACKAGE BODY" %-- - 971 IGNR 1 1 1 1 t_initialize; - 972 IGNR 1 1 1 1 t_add_result; - 973 IGNR 1 0 0 0 t_add_profile; - 974 IGNR 1 1 1 1 t_finalize; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 975 IGNR 1 0 0 0 t_delete_records; - 976 IGNR 1 1 1 1 end WTPLSQL_RUN; - 981 EXCL 0 0 0 0 end wt_test_run_stat; +WTP.WT_ASSERT Test Runner Details: +---------------------------------------- diff --git a/src/core/uninstallO.LST b/src/core/uninstallO.LST index 9e45782..67ac00c 100644 --- a/src/core/uninstallO.LST +++ b/src/core/uninstallO.LST @@ -1,54 +1,16 @@ old: showmode BOTH -old:drop user &schema_owner. cascade -new:drop user wtp cascade +old 1: drop user &schema_owner. cascade +new 1: drop user wtp cascade -User WTP dropped. - -old:declare - sql_txt varchar2(4000); -begin - for buff in (select synonym_name from dba_synonyms - where owner = 'PUBLIC' - and regexp_like(table_owner, '&schema_owner.', 'i') ) - loop - sql_txt := 'drop public synonym ' || buff.synonym_name; - dbms_output.put_line(sql_txt); - execute immediate sql_txt; - end loop; -end; - -new:declare - sql_txt varchar2(4000); -begin - for buff in (select synonym_name from dba_synonyms - where owner = 'PUBLIC' - and regexp_like(table_owner, 'wtp', 'i') ) - loop - sql_txt := 'drop public synonym ' || buff.synonym_name; - dbms_output.put_line(sql_txt); - execute immediate sql_txt; - end loop; -end; -drop public synonym WT_WTPLSQL -drop public synonym WT_VERSION -drop public synonym WT_TEXT_REPORT -drop public synonym WT_TEST_RUN_STATS -drop public synonym WT_TEST_RUNS_SEQ -drop public synonym WT_TEST_RUNS -drop public synonym WT_TESTCASE_STATS -drop public synonym WT_SELF_TEST -drop public synonym WT_RESULTS -drop public synonym WT_DBOUT_PROFILES -drop public synonym WT_ASSERT -drop public synonym WTPLSQL -drop public synonym UTASSERT +User dropped. +old 6: and regexp_like(table_owner, '&schema_owner.', 'i') ) +new 6: and regexp_like(table_owner, 'wtp', 'i') ) PL/SQL procedure successfully completed. -Remove "WTPLSQL_ENABLE" from PLSQL_CCFLAGS - *) "WTPLSQL_ENABLE:TRUE, WTPLSQL_SELFTEST:TRUE" - +Remove "WTPLSQL_ENABLE" from PLSQL_CCFLAGS + *) "WTPLSQL_ENABLE:TRUE, WTPLSQL_SELFTEST:TRUE" PL/SQL procedure successfully completed. From 608437e01c9d8ec1853346a94c744f4f2dffc778 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Sun, 25 Nov 2018 00:10:13 -0600 Subject: [PATCH 041/141] Add Stats to Core --- src/core/core_data.pkb | 438 ++++++++++++++---- src/core/core_data.pks | 56 ++- src/core/hook.pkb | 122 +++-- src/core/hook.pks | 14 +- src/core/wt_assert.pkb | 4 +- src/core/wt_text_report.pkb | 73 ++- src/core/wt_text_report.pks | 2 - src/core/wtplsql.pkb | 130 +++--- src/junit/junit_xml_core_data.prc | 110 +++++ ..._xml_all.prc => junit_xml_persist_all.prc} | 4 +- src/junit/tables_junit_xml_all.prc | 123 ----- src/persist/wt_test_run_stats.tab | 4 +- 12 files changed, 659 insertions(+), 421 deletions(-) create mode 100644 src/junit/junit_xml_core_data.prc rename src/junit/{tables_stats_junit_xml_all.prc => junit_xml_persist_all.prc} (98%) delete mode 100644 src/junit/tables_junit_xml_all.prc diff --git a/src/core/core_data.pkb b/src/core/core_data.pkb index 3b70bbd..99d6966 100644 --- a/src/core/core_data.pkb +++ b/src/core/core_data.pkb @@ -1,31 +1,49 @@ create or replace package body core_data is - g_results_rec results_rec_type; --------------------- -- Public Procedures --------------------- +------------------------------------------------------------ +function get_testcase + return long_name +is +begin + return nvl(wt_assert.g_testcase + ,substr(core_data.g_run_rec.runner_owner || '.' || + core_data.g_run_rec.runner_name, 1, 128)); +end get_testcase; + ------------------------------------------------------------ procedure init1 (in_package_name in varchar2) is l_run_recNULL run_rec_type; + l_testcase long_name; l_results_recNULL results_rec_type; begin -- Initialize Test Run Record - g_run_rec := l_run_recNULL; - g_run_rec.start_dtm := systimestamp; - g_run_rec.runner_name := in_package_name; + g_run_rec := l_run_recNULL; + g_run_rec.start_dtm := systimestamp; + g_run_rec.runner_name := in_package_name; -- These don't work: -- g_run_rec.runner_owner := USER; -- g_run_rec.runner_owner := sys_context('userenv', 'current_schema'); select username into g_run_rec.runner_owner from user_users; + -- Initialize Test Cases Array + l_testcase := g_tcases_aa.LAST; + while l_testcase is not null + loop + g_tcases_aa.DELETE(l_testcase); + l_testcase := g_tcases_aa.PRIOR(l_testcase); + end loop; -- Initialize Test Results Array g_results_nt := results_nt_type(null); - -- Initialize Test Results Record - g_results_rec := l_results_recNULL; + g_results_nt(1) := l_results_recNULL; + -- Set this for any "hook" that might run "add" + g_results_nt(1).executed_dtm := systimestamp; end init1; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ @@ -33,33 +51,25 @@ $THEN procedure t_init1 is l_run_recSAVE run_rec_type; + l_tcases_aaSAVE tcases_aa_type; l_results_ntSAVE results_nt_type; - l_results_recSAVE results_rec_type; l_run_recTEST run_rec_type; + l_tcases_aaTEST tcases_aa_type; l_results_ntTEST results_nt_type; - l_results_recTEST results_rec_type; begin -------------------------------------- WTPLSQL Testing -- wt_assert.g_testcase := 'INIT "One" Happy Path 1'; l_run_recSAVE := g_run_rec; - l_results_recSAVE := g_results_rec; + l_tcases_aaSAVE := g_tcases_aa; l_results_ntSAVE := g_results_nt; init1 ('WTPLSQL'); l_run_recTEST := g_run_rec; - l_results_recTEST := g_results_rec; + l_tcases_aaTEST := g_tcases_aa; l_results_ntTEST := g_results_nt; g_run_rec := l_run_recSAVE; - g_results_rec := l_results_recSAVE; + g_tcases_aa := l_tcases_aaSAVE; g_results_nt := l_results_ntSAVE; -------------------------------------- WTPLSQL Testing -- - wt_assert.isnotnull - (msg_in => 'l_results_ntSAVE.COUNT' - ,check_this_in => l_results_ntSAVE.COUNT); - wt_assert.eq - (msg_in => 'l_results_ntTEST.COUNT' - ,check_this_in => l_results_ntTEST.COUNT - ,against_this_in => 1); - -------------------------------------- WTPLSQL Testing -- wt_assert.eq (msg_in => 'l_run_recTEST.runner_owner' ,check_this_in => l_run_recTEST.runner_owner @@ -75,8 +85,57 @@ $THEN (msg_in => 'l_run_recTEST.start_dtm > l_run_recSAVE.start_dtm' ,check_this_in => l_run_recTEST.start_dtm > l_run_recSAVE.start_dtm); wt_assert.isnull - (msg_in => 'l_results_recTEST.pass' - ,check_this_in => l_results_recTEST.pass); + (msg_in => 'l_run_recTEST.end_dtm' + ,check_this_in => l_run_recTEST.end_dtm); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq + (msg_in => 'l_run_recTEST.runner_sec' + ,check_this_in => l_run_recTEST.runner_sec + ,against_this_in => 0); + wt_assert.eq + (msg_in => 'l_run_recTEST.runner_sec' + ,check_this_in => l_run_recTEST.runner_sec + ,against_this_in => 0); + wt_assert.eq + (msg_in => 'l_run_recTEST.tc_cnt' + ,check_this_in => l_run_recTEST.tc_cnt + ,against_this_in => 0); + wt_assert.eq + (msg_in => 'l_run_recTEST.tc_fail' + ,check_this_in => l_run_recTEST.tc_fail + ,against_this_in => 0); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq + (msg_in => 'l_run_recTEST.asrt_cnt' + ,check_this_in => l_run_recTEST.asrt_cnt + ,against_this_in => 0); + wt_assert.eq + (msg_in => 'l_run_recTEST.asrt_fail' + ,check_this_in => l_run_recTEST.asrt_fail + ,against_this_in => 0); + wt_assert.eq + (msg_in => 'l_run_recTEST.asrt_tot_msec' + ,check_this_in => l_run_recTEST.asrt_tot_msec + ,against_this_in => 0); + wt_assert.eq + (msg_in => 'l_run_recTEST.asrt_sos_msec' + ,check_this_in => l_run_recTEST.asrt_sos_msec + ,against_this_in => 0); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull + (msg_in => 'l_tcases_aaTEST.FIRST' + ,check_this_in => l_tcases_aaTEST.FIRST); + wt_assert.eq + (msg_in => 'l_results_ntTEST.COUNT' + ,check_this_in => l_results_ntTEST.COUNT + ,against_this_in => 1); + wt_assert.eq + (msg_in => 'l_results_ntTEST(1).result_seq' + ,check_this_in => l_results_ntTEST(1).result_seq + ,against_this_in => 0); + wt_assert.isnull + (msg_in => 'l_results_ntTEST(1).pass' + ,check_this_in => l_results_ntTEST(1).pass); end t_init1; $END ----------------%WTPLSQL_end_ignore_lines%---------------- @@ -84,11 +143,9 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- ------------------------------------------------------------ procedure init2 is - l_run_recNULL run_rec_type; - l_results_recNULL results_rec_type; begin - g_results_rec.result_seq := 0; - g_results_rec.executed_dtm := systimestamp; + -- Overwrite this value + g_results_nt(g_results_nt.COUNT).executed_dtm := systimestamp; end init2; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ @@ -96,29 +153,35 @@ $THEN procedure t_init2 is l_run_recSAVE run_rec_type; + l_tcases_aaSAVE tcases_aa_type; l_results_ntSAVE results_nt_type; - l_results_recSAVE results_rec_type; - l_results_recTEST results_rec_type; + l_run_recTEST run_rec_type; + l_tcases_aaTEST tcases_aa_type; + l_results_ntTEST results_nt_type; + lt PLS_INTEGER; begin -------------------------------------- WTPLSQL Testing -- wt_assert.g_testcase := 'INIT "Two" Happy Path 1'; l_run_recSAVE := g_run_rec; - l_results_recSAVE := g_results_rec; + l_tcases_aaSAVE := g_tcases_aa; l_results_ntSAVE := g_results_nt; - g_results_rec.executed_dtm := null; - -------------------------------------- WTPLSQL Testing -- + -- lt points to the NULL record in g_results_nt + lt := g_results_nt.COUNT; + g_results_nt(lt).executed_dtm := null; init2; - l_results_recTEST := g_results_rec; + l_run_recTEST := g_run_rec; + l_tcases_aaTEST := g_tcases_aa; + l_results_ntTEST := g_results_nt; g_run_rec := l_run_recSAVE; - g_results_rec := l_results_recSAVE; + g_tcases_aa := l_tcases_aaSAVE; g_results_nt := l_results_ntSAVE; - wt_assert.eq - (msg_in => 'l_results_recTEST.result_seq' - ,check_this_in => l_results_recTEST.result_seq - ,against_this_in => 0); + -------------------------------------- WTPLSQL Testing -- wt_assert.isnotnull - (msg_in => 'l_results_recTEST.executed_dtm' - ,check_this_in => l_results_recTEST.executed_dtm); + (msg_in => 'l_results_ntTEST(1).executed_dtm' + ,check_this_in => l_results_ntTEST(1).executed_dtm); + wt_assert.this + (msg_in => 'l_results_ntTEST(1).executed_dtm >= l_run_recTEST.start_dtm' + ,check_this_in => l_results_ntTEST(1).executed_dtm >= l_run_recTEST.start_dtm); end t_init2; $END ----------------%WTPLSQL_end_ignore_lines%---------------- @@ -131,23 +194,89 @@ procedure add ,in_details in varchar2 ,in_message in varchar2) is + l_results_rec results_rec_type; + l_tcases_rec tcases_rec_type; l_current_tstamp timestamp(6); + l_interval_buff interval day(9) to second(6); begin - g_results_rec.result_seq := g_results_rec.result_seq + 1; + ------------------------------------------------------------ + -- Set "l_results_rec" and add a new "g_results_nt" element + -- + if g_results_nt.COUNT != 1 + then + l_results_rec := g_results_nt(g_results_nt.COUNT-1); + else + -- g_results_nt should have only 1 element. + l_results_rec := g_results_nt(1); + end if; + l_results_rec.result_seq := l_results_rec.result_seq + 1; -- g_results_rec.executed_dtm still has the last execution time -- core_data.init also sets this during test runner startup - l_current_tstamp := systimestamp; - g_results_rec.interval_msecs := extract(day from ( - l_current_tstamp - g_results_rec.executed_dtm - ) * 86400 * 1000); - g_results_rec.executed_dtm := l_current_tstamp; - g_results_rec.testcase := in_testcase; - g_results_rec.assertion := in_assertion; - g_results_rec.pass := in_pass; - g_results_rec.details := in_details; - g_results_rec.message := in_message; - g_results_nt(g_results_nt.COUNT) := g_results_rec; + l_current_tstamp := systimestamp; + l_interval_buff := l_current_tstamp - l_results_rec.executed_dtm; + l_results_rec.interval_msecs := (extract(second from l_interval_buff) + + 60 * ( extract(minute from l_interval_buff) + + 60 * ( extract(hour from l_interval_buff) + + 24 * ( extract(day from l_interval_buff) + ) ) ) ) * 1000; + l_results_rec.executed_dtm := l_current_tstamp; + l_results_rec.testcase := nvl(in_testcase + ,substr(g_run_rec.runner_owner || '.' || + g_run_rec.runner_name, 1, 128)); + l_results_rec.assertion := in_assertion; + l_results_rec.pass := in_pass; + l_results_rec.details := in_details; + l_results_rec.message := in_message; + g_results_nt(g_results_nt.COUNT) := l_results_rec; g_results_nt.extend; + ----------------------------------------------- + -- Update "g_run_rec" based on "l_results_rec" + -- + g_run_rec.asrt_cnt := g_run_rec.asrt_cnt + 1; + if NOT l_results_rec.pass + then + g_run_rec.asrt_fail := g_run_rec.asrt_fail + 1; + end if; + g_run_rec.asrt_tot_msec := g_run_rec.asrt_tot_msec + + l_results_rec.interval_msecs; + g_run_rec.asrt_sos_msec := g_run_rec.asrt_sos_msec + + (l_results_rec.interval_msecs * + l_results_rec.interval_msecs ); + if l_results_rec.interval_msecs < nvl(g_run_rec.asrt_min_msec,9999999) + then + g_run_rec.asrt_min_msec := l_results_rec.interval_msecs; + end if; + if l_results_rec.interval_msecs > nvl(g_run_rec.asrt_max_msec,0) + then + g_run_rec.asrt_max_msec := l_results_rec.interval_msecs; + end if; + ----------------------------------------------------------------------- + -- Set "l_tcases_rec" and update the appropriate "g_tcases_aa" element + -- + if g_tcases_aa.EXISTS(l_results_rec.testcase) + then + l_tcases_rec := g_tcases_aa(l_results_rec.testcase); + end if; + l_tcases_rec.asrt_cnt := l_tcases_rec.asrt_cnt + 1; + if NOT l_results_rec.pass + then + l_tcases_rec.asrt_fail := l_tcases_rec.asrt_fail + 1; + end if; + l_tcases_rec.asrt_tot_msec := l_tcases_rec.asrt_tot_msec + + l_results_rec.interval_msecs; + l_tcases_rec.asrt_sos_msec := l_tcases_rec.asrt_sos_msec + + (l_results_rec.interval_msecs * + l_results_rec.interval_msecs ); + if l_results_rec.interval_msecs < nvl(l_tcases_rec.asrt_min_msec,9999999) + then + l_tcases_rec.asrt_min_msec := l_results_rec.interval_msecs; + end if; + if l_results_rec.interval_msecs > nvl(l_tcases_rec.asrt_max_msec,-1) + then + l_tcases_rec.asrt_max_msec := l_results_rec.interval_msecs; + end if; + g_tcases_aa(l_results_rec.testcase) := l_tcases_rec; + -- end add; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ @@ -155,77 +284,163 @@ $THEN procedure t_add is l_run_recSAVE run_rec_type; + l_tcases_aaSAVE tcases_aa_type; l_results_ntSAVE results_nt_type; - l_results_recSAVE results_rec_type; l_run_recTEST run_rec_type; + l_tcases_aaTEST tcases_aa_type; l_results_ntTEST results_nt_type; - l_results_recTEST results_rec_type; + lt PLS_INTEGER; begin -------------------------------------- WTPLSQL Testing -- wt_assert.g_testcase := 'Add Procedure Happy Path'; l_run_recSAVE := g_run_rec; - l_results_recSAVE := g_results_rec; + l_tcases_aaSAVE := g_tcases_aa; l_results_ntSAVE := g_results_nt; + -- lt points to the NULL element in l_resultsSAVE_nt + lt := l_results_ntSAVE.COUNT; add(in_testcase => 'The Testcase' ,in_assertion => 'The Assert' ,in_pass => TRUE ,in_details => 'The Details' ,in_message => 'The Message'); + -------------------------------------- WTPLSQL Testing -- l_run_recTEST := g_run_rec; - l_results_recTEST := g_results_rec; + l_tcases_aaTEST := g_tcases_aa; l_results_ntTEST := g_results_nt; g_run_rec := l_run_recSAVE; - g_results_rec := l_results_recSAVE; + g_tcases_aa := l_tcases_aaSAVE; g_results_nt := l_results_ntSAVE; - -------------------------------------- WTPLSQL Testing -- wt_assert.isnotnull - (msg_in => 'l_results_ntSAVE.COUNT' - ,check_this_in => l_results_ntSAVE.COUNT); + (msg_in => 'The NULL element in l_resultsSAVE_nt' + ,check_this_in => lt); + -------------------------------------- WTPLSQL Testing -- + -- l_results_nt Testing + ----------------------- wt_assert.eq - (msg_in => 'Confirm l_results_ntTEST.COUNT' + (msg_in => 'l_results_ntTEST.COUNT = ' || + 'l_results_ntSAVE.COUNT + 1' ,check_this_in => l_results_ntTEST.COUNT ,against_this_in => l_results_ntSAVE.COUNT + 1); + wt_assert.eq + (msg_in => 'l_results_ntTEST(lt).result_seq = ' || + 'l_results_ntTEST(lt-1).result_seq + 1' + ,check_this_in => l_results_ntTEST(lt).result_seq + ,against_this_in => l_results_ntTEST(lt-1).result_seq + 1); + -------------------------------------- WTPLSQL Testing -- wt_assert.isnotnull - (msg_in => 'l_results_recTEST.result_seq' - ,check_this_in => l_results_recTEST.result_seq); + (msg_in => 'l_results_ntTEST(lt).interval_msecs' + ,check_this_in => l_results_ntTEST(lt).interval_msecs); wt_assert.this - (msg_in => 'l_results_recTEST.result_seq = ' || - 'l_results_recSAVE.result_seq + 1' - ,check_this_in => l_results_recTEST.result_seq = - l_results_recSAVE.result_seq + 1); + (msg_in => 'l_results_ntTEST(lt).interval_msecs >= 0' + ,check_this_in => l_results_ntTEST(lt).interval_msecs >= 0); -------------------------------------- WTPLSQL Testing -- wt_assert.isnotnull - (msg_in => 'l_results_recTEST.interval_msecs' - ,check_this_in => l_results_recTEST.interval_msecs); - wt_assert.isnotnull - (msg_in => 'l_results_recTEST.executed_dtm' - ,check_this_in => l_results_recTEST.executed_dtm); + (msg_in => 'l_results_ntTEST(lt).executed_dtm' + ,check_this_in => l_results_ntTEST(lt).executed_dtm); wt_assert.this - (msg_in => 'l_results_recTEST.executed_dtm >= ' || - 'l_results_recSAVE.executed_dtm' - ,check_this_in => l_results_recTEST.executed_dtm >= - l_results_recSAVE.executed_dtm); + (msg_in => 'l_results_ntTEST(lt).executed_dtm >= ' || + 'l_results_ntTEST(lt-1).executed_dtm' + ,check_this_in => l_results_ntTEST(lt).executed_dtm >= + l_results_ntTEST(lt-1).executed_dtm); -------------------------------------- WTPLSQL Testing -- wt_assert.eq - (msg_in => 'l_results_recTEST.testcase' - ,check_this_in => l_results_recTEST.testcase + (msg_in => 'l_results_ntTEST(lt).testcase' + ,check_this_in => l_results_ntTEST(lt).testcase ,against_this_in => 'The Testcase'); wt_assert.eq - (msg_in => 'l_results_recTEST.assertion' - ,check_this_in => l_results_recTEST.assertion + (msg_in => 'l_results_ntTEST(lt).assertion' + ,check_this_in => l_results_ntTEST(lt).assertion ,against_this_in => 'The Assert'); + -------------------------------------- WTPLSQL Testing -- wt_assert.eq - (msg_in => 'l_results_recTEST.pass' - ,check_this_in => l_results_recTEST.pass - ,against_this_in => TRUE); + (msg_in => 'l_results_ntTEST(lt).pass' + ,check_this_in => l_results_ntTEST(lt).pass + ,against_this_in => TRUE); wt_assert.eq - (msg_in => 'l_results_recTEST.details' - ,check_this_in => l_results_recTEST.details + (msg_in => 'l_results_ntTEST(lt).details' + ,check_this_in => l_results_ntTEST(lt).details ,against_this_in => 'The Details'); wt_assert.eq - (msg_in => 'l_results_recTEST.message' - ,check_this_in => l_results_recTEST.message + (msg_in => 'l_results_ntTEST(lt).message' + ,check_this_in => l_results_ntTEST(lt).message ,against_this_in => 'The Message'); + -------------------------------------- WTPLSQL Testing -- + -- l_run_rec Testing + -------------------- + wt_assert.eq + (msg_in => 'l_run_recTEST.asrt_cnt = ' || + 'l_run_recSAVE.asrt_cnt + 1' + ,check_this_in => l_run_recTEST.asrt_cnt + ,against_this_in => l_run_recSAVE.asrt_cnt + 1); + wt_assert.eq + (msg_in => 'l_run_recTEST.asrt_fail = ' || + 'l_run_recSAVE.asrt_fail' + ,check_this_in => l_run_recTEST.asrt_fail + ,against_this_in => l_run_recSAVE.asrt_fail); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq + (msg_in => 'l_run_recTEST.asrt_tot_msec = ' || + 'l_run_recSAVE.asrt_tot_msec + ' || + 'l_results_ntTEST(lt).interval_msecs' + ,check_this_in => l_run_recTEST.asrt_tot_msec + ,against_this_in => l_run_recSAVE.asrt_tot_msec + + l_results_ntTEST(lt).interval_msecs); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq + (msg_in => 'l_run_recTEST.asrt_sos_msec = ' || + 'l_run_recSAVE.asrt_sos_msec + ' || + '(l_results_ntTEST(lt).interval_msecs *' || + 'l_results_ntTEST(lt).interval_msecs )' + ,check_this_in => l_run_recTEST.asrt_sos_msec + ,against_this_in => l_run_recSAVE.asrt_sos_msec + + (l_results_ntTEST(lt).interval_msecs * + l_results_ntTEST(lt).interval_msecs ) ); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnotnull + (msg_in => 'l_run_recTEST.asrt_min_msec' + ,check_this_in => l_run_recTEST.asrt_min_msec); + wt_assert.this + (msg_in => 'l_run_recTEST.asrt_min_msec <= ' || + 'l_run_recSAVE.asrt_min_msec' + ,check_this_in => l_run_recTEST.asrt_min_msec <= + l_run_recSAVE.asrt_min_msec); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnotnull + (msg_in => 'l_run_recTEST.asrt_max_msec' + ,check_this_in => l_run_recTEST.asrt_max_msec); + wt_assert.this + (msg_in => 'l_run_recTEST.asrt_max_msec <= ' || + 'l_run_recSAVE.asrt_max_msec' + ,check_this_in => l_run_recTEST.asrt_max_msec <= + l_run_recSAVE.asrt_max_msec); + -------------------------------------- WTPLSQL Testing -- + -- l_tcases_aa Testing + ---------------------- + wt_assert.eq + (msg_in => 'l_tcases_aaTEST(''The Testcase'').asrt_cnt' + ,check_this_in => l_tcases_aaTEST('The Testcase').asrt_cnt + ,against_this_in => 1); + wt_assert.eq + (msg_in => 'l_tcases_aaTEST(''The Testcase'').asrt_fail' + ,check_this_in => l_tcases_aaTEST('The Testcase').asrt_fail + ,against_this_in => 0); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnotnull + (msg_in => 'l_tcases_aaTEST(''The Testcase'').asrt_fail' + ,check_this_in => l_tcases_aaTEST('The Testcase').asrt_fail); + wt_assert.isnotnull + (msg_in => 'l_tcases_aaTEST(''The Testcase'').asrt_tot_msec' + ,check_this_in => l_tcases_aaTEST('The Testcase').asrt_tot_msec); + wt_assert.isnotnull + (msg_in => 'l_tcases_aaTEST(''The Testcase'').asrt_sos_msec' + ,check_this_in => l_tcases_aaTEST('The Testcase').asrt_sos_msec); + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnotnull + (msg_in => 'l_tcases_aaTEST(''The Testcase'').asrt_min_msec' + ,check_this_in => l_tcases_aaTEST('The Testcase').asrt_min_msec); + wt_assert.isnotnull + (msg_in => 'l_tcases_aaTEST(''The Testcase'').asrt_max_msec' + ,check_this_in => l_tcases_aaTEST('The Testcase').asrt_max_msec); end t_add; $END ----------------%WTPLSQL_end_ignore_lines%---------------- @@ -233,8 +448,30 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- ------------------------------------------------------------ procedure finalize is + l_testcase long_name; + l_interval_buff interval day(9) to second(6); begin - core_data.g_run_rec.end_dtm := systimestamp; + g_run_rec.tc_cnt := g_tcases_aa.COUNT; + g_run_rec.tc_fail := 0; + if g_tcases_aa.COUNT > 0 + then + l_testcase := g_tcases_aa.FIRST; + loop + if g_tcases_aa(l_testcase).asrt_fail > 0 + then + g_run_rec.tc_fail := g_run_rec.tc_fail + 1; + end if; + exit when l_testcase = g_tcases_aa.LAST; + l_testcase := g_tcases_aa.NEXT(l_testcase); + end loop; + end if; + g_run_rec.end_dtm := systimestamp; + l_interval_buff := g_run_rec.end_dtm - g_run_rec.start_dtm; + g_run_rec.runner_sec := (extract(second from l_interval_buff) + + 60 * ( extract(minute from l_interval_buff) + + 60 * ( extract(hour from l_interval_buff) + + 24 * ( extract(day from l_interval_buff) + ) ) ) ); g_results_nt.delete(g_results_nt.COUNT); end finalize; @@ -243,37 +480,36 @@ $THEN procedure t_finalize is l_run_recSAVE run_rec_type; + l_tcases_aaSAVE tcases_aa_type; l_results_ntSAVE results_nt_type; - l_results_recSAVE results_rec_type; l_run_recTEST run_rec_type; + l_tcases_aaTEST tcases_aa_type; l_results_ntTEST results_nt_type; - l_results_recTEST results_rec_type; begin -------------------------------------- WTPLSQL Testing -- wt_assert.g_testcase := 'Finalize Happy Path'; l_run_recSAVE := g_run_rec; - l_results_recSAVE := g_results_rec; + l_tcases_aaSAVE := g_tcases_aa; l_results_ntSAVE := g_results_nt; finalize; l_run_recTEST := g_run_rec; - l_results_recTEST := g_results_rec; + l_tcases_aaTEST := g_tcases_aa; l_results_ntTEST := g_results_nt; g_run_rec := l_run_recSAVE; - g_results_rec := l_results_recSAVE; + g_tcases_aa := l_tcases_aaSAVE; g_results_nt := l_results_ntSAVE; -------------------------------------- WTPLSQL Testing -- wt_assert.isnull - (msg_in => 'l_run_recSAVE.end_dtm' - ,check_this_in => l_run_recSAVE.end_dtm); - wt_assert.isnotnull - (msg_in => 'l_run_recTEST.end_dtm' - ,check_this_in => l_run_recTEST.end_dtm); + (msg_in => 'l_run_recSAVE.end_dtm' + ,check_this_in => l_run_recSAVE.end_dtm); wt_assert.isnotnull - (msg_in => 'l_results_ntSAVE.COUNT' - ,check_this_in => l_results_ntSAVE.COUNT); - wt_assert.this - (msg_in => 'l_results_ntTEST.COUNT = l_results_ntSAVE.COUNT - 1' - ,check_this_in => l_results_ntTEST.COUNT = l_results_ntSAVE.COUNT - 1); + (msg_in => 'l_run_recTEST.end_dtm' + ,check_this_in => l_run_recTEST.end_dtm); + wt_assert.eq + (msg_in => 'l_results_ntTEST.COUNT = ' || + 'l_results_ntSAVE.COUNT - 1' + ,check_this_in => l_results_ntTEST.COUNT + ,against_this_in => l_results_ntSAVE.COUNT - 1); end t_finalize; $END ----------------%WTPLSQL_end_ignore_lines%---------------- diff --git a/src/core/core_data.pks b/src/core/core_data.pks index 72b0ed4..e859cbc 100644 --- a/src/core/core_data.pks +++ b/src/core/core_data.pks @@ -5,28 +5,50 @@ is SUBTYPE long_name is varchar2(128); TYPE run_rec_type is record - (runner_owner long_name - ,runner_name long_name - ,dbout_owner long_name - ,dbout_name long_name - ,dbout_type varchar2(20) - ,start_dtm timestamp - ,end_dtm timestamp - ,error_message varchar2(4000)); + (runner_owner long_name -- Owner of the Test Runner + ,runner_name long_name -- Name of the Test Runner + ,dbout_owner long_name -- Owner of the Database Object Under Test + ,dbout_name long_name -- Name of the Database Object Under Test + ,dbout_type varchar2(20) -- Type of the Database Object Under Test + ,start_dtm timestamp(3) with time zone -- Test Runner Start Date/Time + ,end_dtm timestamp(3) with time zone -- Test Runner End Date/Time + ,error_message varchar2(4000) -- Error Message + ,runner_sec number(6,1) default 0 -- Total Runtime for Test Runner in Seconds + ,tc_cnt number(7) default 0 -- Number of Test Cases + ,tc_fail number(7) default 0 -- Number of Failed Test Cases + ,asrt_cnt number(7) default 0 -- Number of Assertions across all Test Cases + ,asrt_fail number(7) default 0 -- Number of Assertion Failures across all Test Cases + ,asrt_min_msec number(10) -- Minumum Assertion Interval in Milliseconds across all Test Cases + ,asrt_max_msec number(10) -- Maximum Assertion Interval in Milliseconds across all Test Cases + ,asrt_tot_msec number(10) default 0 -- Total Assertion Intervals in Milliseconds across all Test Cases + ,asrt_sos_msec number(20) default 0 -- Sum of Squares of Assertion Interval in Milliseconds across all Test Cases + ); g_run_rec run_rec_type; + TYPE tcases_rec_type is record + (asrt_cnt number(7) default 0 -- Number of Assertions in this Test Case + ,asrt_fail number(7) default 0 -- Number of Failed Assertsion in this Test Case + ,asrt_min_msec number(10) -- Minumum Assertion Interval in Milliseconds in this Test Cases + ,asrt_max_msec number(10) -- Maximum Assertion Interval in Milliseconds in this Test Cases + ,asrt_tot_msec number(10) default 0 -- Total Assertion Interval in Milliseconds in this Test Cases + ,asrt_sos_msec number(20) default 0 -- Sum of Squares Assertion Interval in Milliseconds in this Test Cases + ); + TYPE tcases_aa_type is table of tcases_rec_type index by long_name; + g_tcases_aa tcases_aa_type; + TYPE results_rec_type is record - (result_seq number(8) - ,executed_dtm timestamp(6) - ,interval_msecs number(10,3) - ,testcase long_name - ,assertion varchar2(15) - ,pass boolean - ,details varchar2(4000) - ,message varchar2(200)); + (result_seq number(8) default 0 -- Sequence Number of the Assertion + ,executed_dtm timestamp(6) with time zone -- Execution Date/Time of the Assertion + ,interval_msecs number(10,3) -- Interval from Previous Assertion in Milliseconds + ,testcase long_name -- Test Case Name of the Assertion + ,assertion varchar2(15) -- Name of the Assertion + ,pass boolean -- Did the Assertion Pass? (TRUE/FALSE) + ,details varchar2(4000) -- Test Details of the Assertion + ,message varchar2(200) -- Identifcation Message of the Assertion + ); TYPE results_nt_type is table of results_rec_type; g_results_nt results_nt_type; - + procedure init1 (in_package_name in varchar2); diff --git a/src/core/hook.pkb b/src/core/hook.pkb index 845a34b..77585cb 100644 --- a/src/core/hook.pkb +++ b/src/core/hook.pkb @@ -12,9 +12,9 @@ procedure run_hooks (in_hook_name in varchar2) is begin - for i in 1 .. run_aa(in_hook_name).COUNT + for i in 1 .. g_run_aa(in_hook_name).COUNT loop - execute immediate run_aa(in_hook_name)(i); + execute immediate g_run_aa(in_hook_name)(i); end loop; end run_hooks; @@ -61,7 +61,7 @@ begin -- $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN - if t_run_assert_hook + if g_run_assert_hook then $END ------%WTPLSQL_end_ignore_lines%------ -- @@ -110,6 +110,7 @@ end ad_hoc_report; ------------------------------------------------------------ procedure init is + l_run_nt run_nt_type; begin before_test_all_active := FALSE; before_test_run_active := FALSE; @@ -123,13 +124,13 @@ begin from hooks group by hook_name ) loop - select run_string bulk collect into run_nt + select run_string bulk collect into l_run_nt from hooks where hook_name = buff.hook_name order by hooks.seq; if SQL%FOUND then - run_aa(buff.hook_name) := run_nt; + g_run_aa(buff.hook_name) := l_run_nt; case buff.hook_name when 'before_test_all' then before_test_all_active := TRUE; when 'before_test_run' then before_test_run_active := TRUE; @@ -148,84 +149,70 @@ end init; --==============================================================-- $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN - + -------------------------------------- WTPLSQL Testing -- procedure test_hook (in_msg in varchar2) is begin - t_test_hook_msg := in_msg; + g_test_hook_msg := in_msg; end test_hook; - - procedure test_setup + -------------------------------------- WTPLSQL Testing -- + procedure WTPLSQL_RUN is + TYPE hooks_nt_type is table of hooks%ROWTYPE; + l_hooks_ntSAVE hooks_nt_type; + TYPE hname_nt_type is table of hooks.hook_name%TYPE; + l_hname_nt hname_nt_type; + l_hooks_rec hooks%ROWTYPE; + num_recs number; begin - -- - t_hooks_nt := hooks_nt_type('before_test_all' + wtplsql.g_DBOUT := 'HOOK:PACKAGE BODY'; + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Setup'; + g_run_assert_hook := FALSE; + select count(*) into num_recs from hooks; + wt_assert.isnotnull + (msg_in => 'Number of records before setup' + ,check_this_in => num_recs); + -------------------------------------- WTPLSQL Testing -- + l_hname_nt := hname_nt_type('before_test_all' ,'before_test_run' ,'execute_test_runner' ,'after_assertion' ,'after_test_run' ,'after_test_all' ,'ad_hoc_report'); - -- - select * bulk collect into t_save_nt from hooks; + select * bulk collect into l_hooks_ntSAVE from hooks; delete from hooks; - -- - t_hooks_rec.seq := 1; - t_hooks_rec.description := 'WTPSQL Self Test'; - for i in 1 .. t_hooks_nt.COUNT + -------------------------------------- WTPLSQL Testing -- + l_hooks_rec.seq := 1; + l_hooks_rec.description := 'WTPSQL Self Test'; + for i in 1 .. l_hname_nt.COUNT loop - t_hooks_rec.hook_name := t_hooks_nt(i); - t_hooks_rec.run_string := 'begin hook.test_hook(''' || - t_hooks_nt(i) || '''); end;'; - insert into hooks values t_hooks_rec; + l_hooks_rec.hook_name := l_hname_nt(i); + l_hooks_rec.run_string := 'begin hook.test_hook(''' || + l_hname_nt(i) || '''); end;'; + insert into hooks values l_hooks_rec; end loop; - -- commit; - t_run_assert_hook := FALSE; - init; - -- - end test_setup; - - procedure test_teardown - is - begin - delete from hooks; - forall i in 1 .. t_save_nt.COUNT - insert into hooks values t_save_nt(i); - commit; - init; - t_run_assert_hook := TRUE; - end test_teardown; - - procedure WTPLSQL_RUN - is - num_recs number; - begin - wtplsql.g_DBOUT := 'HOOK:PACKAGE BODY'; -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Setup'; - select count(*) into num_recs from hooks; - wt_assert.isnotnull - (msg_in => 'Number of records before setup' - ,check_this_in => num_recs); - test_setup; + init; wt_assert.eqqueryvalue (msg_in => 'Confirm number of test records' ,check_query_in => 'select count(*) from hooks' - ,against_value_in => t_hooks_nt.COUNT); + ,against_value_in => l_hname_nt.COUNT); -------------------------------------- WTPLSQL Testing -- wt_assert.g_testcase := 'All Hooks On'; - t_test_hook_msg := ''; - for i in 1 .. t_hooks_nt.COUNT + g_test_hook_msg := ''; + for i in 1 .. l_hname_nt.COUNT loop - hook.t_run_assert_hook := TRUE; - execute immediate 'begin hook.' || t_hooks_nt(i) || '; end;'; - hook.t_run_assert_hook := FALSE; + g_run_assert_hook := TRUE; + execute immediate 'begin hook.' || l_hname_nt(i) || '; end;'; + g_run_assert_hook := FALSE; wt_assert.eq - (msg_in => t_hooks_nt(i) || ' is active' - ,check_this_in => t_test_hook_msg - ,against_this_in => t_hooks_nt(i)); + (msg_in => l_hname_nt(i) || ' is active' + ,check_this_in => g_test_hook_msg + ,against_this_in => l_hname_nt(i)); end loop; -------------------------------------- WTPLSQL Testing -- wt_assert.g_testcase := 'All Hooks Off'; @@ -237,21 +224,26 @@ $THEN ,check_query_in => 'select count(*) from hooks' ,against_value_in => 0); -------------------------------------- WTPLSQL Testing -- - t_test_hook_msg := ''; - for i in 1 .. t_hooks_nt.COUNT + g_test_hook_msg := ''; + for i in 1 .. l_hname_nt.COUNT loop - execute immediate 'begin hook.' || t_hooks_nt(i) || '; end;'; + execute immediate 'begin hook.' || l_hname_nt(i) || '; end;'; wt_assert.isnull - (msg_in => t_hooks_nt(i) || ' is not active' - ,check_this_in => t_test_hook_msg); + (msg_in => l_hname_nt(i) || ' is not active' + ,check_this_in => g_test_hook_msg); end loop; -------------------------------------- WTPLSQL Testing -- - test_teardown; + wt_assert.g_testcase := 'Teardown'; + delete from hooks; + forall i in 1 .. l_hooks_ntSAVE.COUNT + insert into hooks values l_hooks_ntSAVE(i); + commit; + init; wt_assert.eqqueryvalue (msg_in => 'Number of records after teardown' ,check_query_in => 'select count(*) from hooks' ,against_value_in => num_recs); - hook.t_run_assert_hook := TRUE; + g_run_assert_hook := TRUE; end; $END ----------------%WTPLSQL_end_ignore_lines%---------------- diff --git a/src/core/hook.pks b/src/core/hook.pks index 7c3e862..332b1d9 100644 --- a/src/core/hook.pks +++ b/src/core/hook.pks @@ -4,11 +4,10 @@ as TYPE run_nt_type is table of varchar2(4000); - run_nt run_nt_type; TYPE run_aa_type is table of run_nt_type index by varchar2(20); - run_aa run_aa_type; + g_run_aa run_aa_type; before_test_all_active boolean := FALSE; before_test_run_active boolean := FALSE; @@ -35,15 +34,8 @@ as -- $IF $$WTPLSQL_SELFTEST $THEN - TYPE save_nt_type is table of hooks%ROWTYPE; - t_hooks_rec hooks%ROWTYPE; - t_save_nt save_nt_type; - -- - TYPE hooks_nt_type is table of hooks.hook_name%TYPE; - t_hooks_nt hooks_nt_type; - -- - t_run_assert_hook boolean := TRUE; - t_test_hook_msg varchar2(4000); + g_run_assert_hook boolean := TRUE; + g_test_hook_msg varchar2(4000); -- procedure test_hook (in_msg in varchar2); diff --git a/src/core/wt_assert.pkb b/src/core/wt_assert.pkb index aa191bb..4a0ab66 100644 --- a/src/core/wt_assert.pkb +++ b/src/core/wt_assert.pkb @@ -3864,7 +3864,7 @@ $THEN is begin wtplsql.g_DBOUT := 'WT_ASSERT:PACKAGE BODY'; - hook.t_run_assert_hook := FALSE; + hook.g_run_assert_hook := FALSE; select temp_clob, temp_nclob, temp_xml, temp_blob into temp_clob1, temp_nclob1, temp_xml1, temp_blob1 from wt_self_test where id = 1; @@ -3888,7 +3888,7 @@ $THEN t_object_exists; t_object_not_exists; -------------------------------------- WTPLSQL Testing -- - hook.t_run_assert_hook := TRUE; + hook.g_run_assert_hook := TRUE; end WTPLSQL_RUN; $END ----------------%WTPLSQL_end_ignore_lines%---------------- --==============================================================-- diff --git a/src/core/wt_text_report.pkb b/src/core/wt_text_report.pkb index 6c2ec0a..2d5450d 100644 --- a/src/core/wt_text_report.pkb +++ b/src/core/wt_text_report.pkb @@ -18,49 +18,40 @@ end p; ------------------------------------------------------------ procedure result_summary is - TYPE tcase_aa_type is table of varchar2(1) - index by varchar2(200); - tcase_aa tcase_aa_type; - tot_cnt number := 0; - fail_cnt number := 0; - min_msec number := 0; - max_msec number := 0; - tot_msec number := 0; - avg_msec number := 0; + asrt_cnt number; + run_sec number; + tc_cnt number; + tc_fail number; + min_msec number; + max_msec number; + tot_msec number; + avg_msec number; l_yield_txt varchar2(50); begin - tot_cnt := core_data.g_results_nt.COUNT; - for i in 1 .. tot_cnt - loop - tcase_aa(core_data.g_results_nt(i).testcase) := 'x'; - if not core_data.g_results_nt(i).pass - then - fail_cnt := fail_cnt + 1; - end if; - min_msec := LEAST(min_msec, core_data.g_results_nt(i).interval_msecs); - max_msec := GREATEST(max_msec, core_data.g_results_nt(i).interval_msecs); - tot_msec := tot_msec + core_data.g_results_nt(i).interval_msecs; - end loop; - if nvl(tot_cnt,0) = 0 - then - avg_msec := 0; - l_yield_txt := '(Divide by Zero)'; - else - avg_msec := tot_msec / tot_cnt; - l_yield_txt := to_char(round(100*(1-(fail_cnt/tot_cnt)), 2) - ,'9990.99') || '%'; - end if; - p(' Minimum Elapsed msec: ' || to_char(min_msec, '9999999') || - ' Total Testcases: ' || to_char(tcase_aa.COUNT,'9999999') ); - p(' Average Elapsed msec: ' || to_char(avg_msec, '9999999') || - ' Total Assertions: ' || to_char(tot_cnt, '9999999') ); - p(' Maximum Elapsed msec: ' || to_char(max_msec, '9999999') || - ' Failed Assertions: ' || to_char(fail_cnt, '9999999') ); - p(' Total Run Time (sec): ' || - to_char(extract(day from (core_data.g_run_rec.end_dtm - - core_data.g_run_rec.start_dtm) * 86400 * 100) / 100 - ,'99990.9') || - ' Test Yield: ' || l_yield_txt ); + asrt_cnt := core_data.g_run_rec.asrt_cnt; + run_sec := core_data.g_run_rec.runner_sec; + tc_cnt := core_data.g_run_rec.tc_cnt; + tc_fail := core_data.g_run_rec.tc_fail; + min_msec := core_data.g_run_rec.asrt_min_msec; + max_msec := core_data.g_run_rec.asrt_max_msec; + tot_msec := core_data.g_run_rec.asrt_tot_msec; + case nvl(asrt_cnt,0) + when 0 then avg_msec := 0; + else avg_msec := tot_msec/asrt_cnt; + end case; + case nvl(tc_cnt,0) + when 0 then l_yield_txt := '(Divide by Zero)'; + else l_yield_txt := to_char(100 * ( 1 - (tc_fail/tc_cnt) ) + ,'9999999') || '%'; + end case; + p(' Minimum Elapsed msec: ' || to_char(min_msec ,'9999999') || + ' Total Assertions: ' || to_char(asrt_cnt ,'9999999') ); + p(' Average Elapsed msec: ' || to_char(avg_msec ,'9999999') || + ' Total Testcases: ' || to_char(tc_cnt ,'9999999') ); + p(' Maximum Elapsed msec: ' || to_char(max_msec ,'9999999') || + ' Failed Testcases: ' || to_char(tc_fail ,'9999999') ); + p(' Total Run Time (sec): ' || to_char(run_sec ,'99990.9') || + ' Testcase Yield: ' || l_yield_txt ); end result_summary; ------------------------------------------------------------ diff --git a/src/core/wt_text_report.pks b/src/core/wt_text_report.pks index 61facf8..37b4583 100644 --- a/src/core/wt_text_report.pks +++ b/src/core/wt_text_report.pks @@ -2,8 +2,6 @@ create or replace package wt_text_report authid definer as - g_run_rec core_data.run_rec_type; - -- To report the latest result details: -- begin -- wt_text_report.dbms_out(30, TRUE); diff --git a/src/core/wtplsql.pkb b/src/core/wtplsql.pkb index ef1e2d0..1e7070f 100644 --- a/src/core/wtplsql.pkb +++ b/src/core/wtplsql.pkb @@ -32,7 +32,7 @@ begin where procedure_name = C_RUNNER_ENTRY_POINT and object_name = core_data.g_run_rec.runner_name and object_type = 'PACKAGE'; - if l_package_check != 1 + if l_package_check = 0 then raise_application_error (-20002, 'RUNNER_NAME Procedure "' || core_data.g_run_rec.runner_name || @@ -45,13 +45,13 @@ $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN procedure t_check_runner is - l_save_test_run_rec core_data.run_rec_type; + l_run_recSAVE core_data.run_rec_type; l_msg_in varchar2(4000); l_err_in varchar2(4000); -------------------------------------- WTPLSQL Testing -- procedure l_test_sqlerrm is begin -- Restore the core_data.g_run_rec - core_data.g_run_rec := l_save_test_run_rec; + core_data.g_run_rec := l_run_recSAVE; wt_assert.eq (msg_in => l_msg_in ,check_this_in => SQLERRM @@ -59,7 +59,7 @@ $THEN end l_test_sqlerrm; begin -- Save CORE_DATA data - l_save_test_run_rec := core_data.g_run_rec; + l_run_recSAVE := core_data.g_run_rec; -------------------------------------- WTPLSQL Testing -- wt_assert.g_testcase := 'CHECK_RUNNER Happy Path 1'; wt_assert.eq @@ -214,7 +214,8 @@ $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN procedure t_find_dbout is - l_save_test_run_rec core_data.run_rec_type; + l_run_recSAVE core_data.run_rec_type; + l_run_recTEST core_data.run_rec_type; procedure clear_run_rec is begin core_data.g_run_rec.dbout_owner := ''; core_data.g_run_rec.dbout_name := ''; @@ -222,124 +223,140 @@ $THEN core_data.g_run_rec.error_message := ''; end clear_run_rec; begin - -- Save CORE_DATA data - l_save_test_run_rec := core_data.g_run_rec; -------------------------------------- WTPLSQL Testing -- - -- These tests assume this package does not set a DBOUT wt_assert.g_testcase := 'Find DBOUT Happy Path 1'; + l_run_recSAVE := core_data.g_run_rec; clear_run_rec; g_DBOUT := ''; find_dbout; + l_run_recTEST := core_data.g_run_rec; + core_data.g_run_rec := l_run_recSAVE; + -------------------------------------- WTPLSQL Testing -- wt_assert.isnull( - msg_in => 'core_data.g_run_rec.dbout_owner', - check_this_in => core_data.g_run_rec.dbout_owner); + msg_in => 'l_run_recTEST.dbout_owner', + check_this_in => l_run_recTEST.dbout_owner); wt_assert.isnull( - msg_in => 'core_data.g_run_rec.dbout_name', - check_this_in => core_data.g_run_rec.dbout_name); + msg_in => 'l_run_recTEST.dbout_name', + check_this_in => l_run_recTEST.dbout_name); wt_assert.isnull( - msg_in => 'core_data.g_run_rec.dbout_type', - check_this_in => core_data.g_run_rec.dbout_type); + msg_in => 'l_run_recTEST.dbout_type', + check_this_in => l_run_recTEST.dbout_type); -------------------------------------- WTPLSQL Testing -- wt_assert.g_testcase := 'Find DBOUT Happy Path 2'; + l_run_recSAVE := core_data.g_run_rec; clear_run_rec; g_DBOUT := 'SYS.DUAL'; find_dbout; + l_run_recTEST := core_data.g_run_rec; + core_data.g_run_rec := l_run_recSAVE; + -------------------------------------- WTPLSQL Testing -- wt_assert.eq( - msg_in => 'core_data.g_run_rec.dbout_owner', - check_this_in => core_data.g_run_rec.dbout_owner, + msg_in => 'l_run_recTEST.dbout_owner', + check_this_in => l_run_recTEST.dbout_owner, against_this_in => 'SYS'); wt_assert.eq( - msg_in => 'core_data.g_run_rec.dbout_name', - check_this_in => core_data.g_run_rec.dbout_name, + msg_in => 'l_run_recTEST.dbout_name', + check_this_in => l_run_recTEST.dbout_name, against_this_in => 'DUAL'); wt_assert.eq( - msg_in => 'core_data.g_run_rec.dbout_type', - check_this_in => core_data.g_run_rec.dbout_type, + msg_in => 'l_run_recTEST.dbout_type', + check_this_in => l_run_recTEST.dbout_type, against_this_in => 'TABLE'); -------------------------------------- WTPLSQL Testing -- wt_assert.g_testcase := 'Find DBOUT Happy Path 3'; + l_run_recSAVE := core_data.g_run_rec; clear_run_rec; g_DBOUT := 'WTPLSQL:PACKAGE BODY'; find_dbout; + l_run_recTEST := core_data.g_run_rec; + core_data.g_run_rec := l_run_recSAVE; + -------------------------------------- WTPLSQL Testing -- wt_assert.eq( - msg_in => 'core_data.g_run_rec.dbout_owner', - check_this_in => core_data.g_run_rec.dbout_owner, + msg_in => 'l_run_recTEST.dbout_owner', + check_this_in => l_run_recTEST.dbout_owner, against_this_in => USER); wt_assert.eq( - msg_in => 'core_data.g_run_rec.dbout_name', - check_this_in => core_data.g_run_rec.dbout_name, + msg_in => 'l_run_recTEST.dbout_name', + check_this_in => l_run_recTEST.dbout_name, against_this_in => 'WTPLSQL'); wt_assert.eq( - msg_in => 'core_data.g_run_rec.dbout_type', - check_this_in => core_data.g_run_rec.dbout_type, + msg_in => 'l_run_recTEST.dbout_type', + check_this_in => l_run_recTEST.dbout_type, against_this_in => 'PACKAGE BODY'); -------------------------------------- WTPLSQL Testing -- wt_assert.g_testcase := 'Find DBOUT Happy Path 4'; + l_run_recSAVE := core_data.g_run_rec; clear_run_rec; g_DBOUT := 'WT_EXECUTE_TEST_RUNNER'; find_dbout; + l_run_recTEST := core_data.g_run_rec; + core_data.g_run_rec := l_run_recSAVE; + -------------------------------------- WTPLSQL Testing -- wt_assert.eq( - msg_in => 'core_data.g_run_rec.dbout_owner', - check_this_in => core_data.g_run_rec.dbout_owner, + msg_in => 'l_run_recTEST.dbout_owner', + check_this_in => l_run_recTEST.dbout_owner, against_this_in => USER); wt_assert.eq( - msg_in => 'core_data.g_run_rec.dbout_name', - check_this_in => core_data.g_run_rec.dbout_name, + msg_in => 'l_run_recTEST.dbout_name', + check_this_in => l_run_recTEST.dbout_name, against_this_in => 'WT_EXECUTE_TEST_RUNNER'); wt_assert.eq( - msg_in => 'core_data.g_run_rec.dbout_type', - check_this_in => core_data.g_run_rec.dbout_type, + msg_in => 'l_run_recTEST.dbout_type', + check_this_in => l_run_recTEST.dbout_type, against_this_in => 'PROCEDURE'); -------------------------------------- WTPLSQL Testing -- wt_assert.g_testcase := 'Find DBOUT Sad Path 1'; + l_run_recSAVE := core_data.g_run_rec; clear_run_rec; g_DBOUT := 'someone.bogus:thingy'; find_dbout; + l_run_recTEST := core_data.g_run_rec; + core_data.g_run_rec := l_run_recSAVE; + -------------------------------------- WTPLSQL Testing -- wt_assert.isnull( - msg_in => 'core_data.g_run_rec.dbout_owner', - check_this_in => core_data.g_run_rec.dbout_owner); + msg_in => 'l_run_recTEST.dbout_owner', + check_this_in => l_run_recTEST.dbout_owner); wt_assert.isnull( - msg_in => 'core_data.g_run_rec.dbout_name', - check_this_in => core_data.g_run_rec.dbout_name); + msg_in => 'l_run_recTEST.dbout_name', + check_this_in => l_run_recTEST.dbout_name); wt_assert.isnull( - msg_in => 'core_data.g_run_rec.dbout_type', - check_this_in => core_data.g_run_rec.dbout_type); + msg_in => 'l_run_recTEST.dbout_type', + check_this_in => l_run_recTEST.dbout_type); wt_assert.isnotnull( - msg_in => 'core_data.g_run_rec.error_message', - check_this_in => core_data.g_run_rec.error_message); + msg_in => 'l_run_recTEST.error_message', + check_this_in => l_run_recTEST.error_message); wt_assert.eqqueryvalue ( - msg_in => 'core_data.g_run_rec.error_message', + msg_in => 'l_run_recTEST.error_message', check_query_in => 'select 1 from dual where ''' || - core_data.g_run_rec.error_message || + l_run_recTEST.error_message || ''' like ''%Unable to find database object "' || g_DBOUT || '".%''', against_value_in => 1); -------------------------------------- WTPLSQL Testing -- wt_assert.g_testcase := 'Find DBOUT Sad Path 2'; + l_run_recSAVE := core_data.g_run_rec; clear_run_rec; g_DBOUT := 'WTPLSQL'; find_dbout; + l_run_recTEST := core_data.g_run_rec; + core_data.g_run_rec := l_run_recSAVE; + -------------------------------------- WTPLSQL Testing -- wt_assert.isnull( - msg_in => 'core_data.g_run_rec.dbout_owner', - check_this_in => core_data.g_run_rec.dbout_owner); + msg_in => 'l_run_recTEST.dbout_owner', + check_this_in => l_run_recTEST.dbout_owner); wt_assert.isnull( - msg_in => 'core_data.g_run_rec.dbout_name', - check_this_in => core_data.g_run_rec.dbout_name); + msg_in => 'l_run_recTEST.dbout_name', + check_this_in => l_run_recTEST.dbout_name); wt_assert.isnull( - msg_in => 'core_data.g_run_rec.dbout_type', - check_this_in => core_data.g_run_rec.dbout_type); + msg_in => 'l_run_recTEST.dbout_type', + check_this_in => l_run_recTEST.dbout_type); wt_assert.eqqueryvalue ( - msg_in => 'core_data.g_run_rec.error_message', + msg_in => 'l_run_recTEST.error_message', check_query_in => 'select 1 from dual where ''' || - core_data.g_run_rec.error_message || + l_run_recTEST.error_message || ''' like ''%Found too many database objects "' || g_DBOUT || '".%''', against_value_in => 1); - -------------------------------------- WTPLSQL Testing -- - -- Restore CORE_DATA data - core_data.g_run_rec := l_save_test_run_rec; - -- Reset package data - g_DBOUT := ''; end t_find_dbout; $END ----------------%WTPLSQL_end_ignore_lines%---------------- @@ -437,6 +454,9 @@ begin l_error_stack := dbms_utility.format_error_stack || dbms_utility.format_error_backtrace ; core_data.run_error(l_error_stack); + wt_assert.this + (msg_in => 'Un-handled Exception from Test Runner' + ,check_this_in => FALSE); end; -- Finalize rollback; -- Discard any pending transactions. diff --git a/src/junit/junit_xml_core_data.prc b/src/junit/junit_xml_core_data.prc new file mode 100644 index 0000000..811a0d5 --- /dev/null +++ b/src/junit/junit_xml_core_data.prc @@ -0,0 +1,110 @@ +create or replace procedure junit_xml_core_data +is + l_rec core_data.results_rec_type; + l_testcase core_data.long_name; + single_line_save boolean; + -- Print to DBMS_OUTPUT + procedure p (in_line in varchar2) is begin + DBMS_OUTPUT.PUT_LINE(in_line); + end p; + -- XML Escape + function xe (in_txt in varchar2) return varchar2 is begin + return replace + (replace + (replace + (replace + (replace + (in_txt + ,'<','<') -- Less Than + ,'>','>') -- Greater Than + ,'&','&') -- Ampersand + ,'''',''') -- Apostrophe + ,'"','"'); -- Quotation Mark + end xe; +begin + single_line_save := wt_text_report.g_single_line_output; + wt_text_report.g_single_line_output := TRUE; + p(''); + p(''); + p(''); + p(''); + p(''); + if core_data.g_tcases_aa.COUNT > 0 + then + --------------------- + -- Test Suite Header + p(' ' ); + l_testcase := core_data.g_tcases_aa.FIRST; + loop + -------------------- + -- Test Case Header + p(' ' ); + if core_data.g_tcases_aa(l_testcase).asrt_fail > 0 + or ( core_data.g_run_rec.error_message is not null + and l_testcase = core_data.g_results_nt(core_data.g_results_nt.COUNT).testcase) + then + ----------------------- + -- Short Error Message + if core_data.g_run_rec.error_message is not null + and l_testcase = core_data.g_results_nt(core_data.g_results_nt.COUNT).testcase + then + p(' ' ); + else + p(' ' ); + end if; + p(' '); + p(' '); + ----------------------- + end if; + p(' '); + -------------------- + exit when l_testcase = core_data.g_tcases_aa.LAST; + l_testcase := core_data.g_tcases_aa.NEXT(l_testcase); + end loop; + p(' '); + --------------------- + end if; + p(''); + wt_text_report.g_single_line_output := single_line_save; +end junit_xml_core_data; +/ diff --git a/src/junit/tables_stats_junit_xml_all.prc b/src/junit/junit_xml_persist_all.prc similarity index 98% rename from src/junit/tables_stats_junit_xml_all.prc rename to src/junit/junit_xml_persist_all.prc index af1db9c..a8bc6c9 100644 --- a/src/junit/tables_stats_junit_xml_all.prc +++ b/src/junit/junit_xml_persist_all.prc @@ -1,4 +1,4 @@ -create or replace procedure junit_report_all +create or replace procedure junit_xml_persist_all is procedure p (in_line in varchar2) is begin @@ -98,5 +98,5 @@ begin end loop; p('
      '); p('
      '); -end junit_report_all; +end junit_xml_persist_all; / diff --git a/src/junit/tables_junit_xml_all.prc b/src/junit/tables_junit_xml_all.prc deleted file mode 100644 index eced83a..0000000 --- a/src/junit/tables_junit_xml_all.prc +++ /dev/null @@ -1,123 +0,0 @@ -create or replace procedure junit_report_all -is - procedure p (in_line in varchar2) is - begin - DBMS_OUTPUT.PUT_LINE(in_line); - end p; -begin - p(''); - p(''); - p(''); - p(''); - p(''); - for suites in ( - select tr.start_dtm - ,tr.end_dtm - ,tr.id - ,tr.owner || '.' || tr.name SUITE_NAME - ,tr.name - ,nvl(db.owner, tr.runner_owner) PACKAGE_NAME - ,case when tr.dbout_name || tr.dbout_type is null - then 'TEST_RUNNER' - else tr.dbout_name || ':' || tr.dbout_type - end CLASS_NAME - ,count(distinct res.testcase_id) TESTCASES - ,sum(case res.status - when wt_assert.C_FAIL then 1 - else 0 - end) FAILURES - ,extract(day from (tr.end_dtm - - tr.start_dtm) * 86400000) TOT_INTERVAL_MSECS - ,tr.error_message - from wt_test_runs tr - left join wt_dbouts db - on db.id = tr.dbout_id - left join wt_results res - on res.test_run_id = tr.id - where tr.is_last_run = wtplsql.get_last_run_flag - group by tr.start_dtm - ,tr.end_dtm - ,tr.id - ,tr.runner_owner - ,tr.runner_name - ,nvl(tr.dbout_owner, tr.runner_owner) - ,case when tr.dbout_name || tr.dbout_type is null - then 'TEST_RUNNER' - else tr.dbout_name || ':' || tr.dbout_type - end - ,extract(day from (tr.end_dtm - - tr.start_dtm) * 86400000) - ,tr.error_message - order by tr.start_dtm, tr.id ) - loop - p(' ' ); - for cases in ( - select tr.id - ,nvl(res.name,suites.runner_name) TESTCASE - ,count(res.test_run_id) - ,sum(case res.status when 'FAIL' then 1 - else 0 - end) FAILURES - ,sum(nvl(res.interval_msecs,0)) TOT_INTERVAL_MSECS - from wt_test_runs tr - left join wt_results res - on res.test_run_id = tr.id - left join wt_testcases tc - on tc.id = res.testcase_id - where tr.id = suites.id - group by tr.id - ,res.name - order by testcase ) - loop - if nvl(cases.failures,1) = 0 - and suites.error_message is null - then - p(' '); - else - p(' '); - p(' '); - -- Print each of the non-passing results - for asrts in ( - select result_seq - ,status - ,interval_msecs - ,message - ,assertion - ,details - from wt_results - where test_run_id = suites.id - and ( (cases.testcase is null - and testcase is null) - or testcase = cases.testcase) - and status = wt_assert.C_FAIL - order by result_seq ) - loop - p(lpad(asrts.result_seq,4) || ': ' || - rpad(asrts.status,4) || ' ' || - lpad(asrts.interval_msecs,4) || 'ms ' || - asrts.message || '. ' || - asrts.assertion || ' - ' || - replace(replace(asrts.details - ,CHR(13),'\r') - ,CHR(10),'\n') || '.' ); - end loop; - p(' '); - p(' '); - end if; - end loop; - end loop; - p(' '); - p(''); -end junit_report_all; -/ diff --git a/src/persist/wt_test_run_stats.tab b/src/persist/wt_test_run_stats.tab index 16d2723..a394f71 100644 --- a/src/persist/wt_test_run_stats.tab +++ b/src/persist/wt_test_run_stats.tab @@ -7,8 +7,8 @@ create table wt_test_run_stats (test_run_id number(38) constraint wt_test_run_stats_nn1 not null ,yield_pct number(3) constraint wt_test_run_stats_nn2 not null ,testcases number(7) constraint wt_test_run_stats_nn3 not null - ,passes number(7) constraint wt_test_run_stats_nn4 not null ,failures number(7) constraint wt_test_run_stats_nn5 not null + ,assertions number(7) constraint wt_test_run_stats_nn4 not null ,min_interval_msecs number(10) constraint wt_test_run_stats_nn6 not null ,avg_interval_msecs number(10) constraint wt_test_run_stats_nn7 not null ,max_interval_msecs number(10) constraint wt_test_run_stats_nn10 not null @@ -30,8 +30,8 @@ comment on table wt_test_run_stats is 'Test Run data statistics for each executi comment on column wt_test_run_stats.test_run_id is 'Primary Key for each Test Run. Also the Test Runs foreign key.'; comment on column wt_test_run_stats.yield_pct is 'Percentage of successful test cases to total Test Cases.'; comment on column wt_test_run_stats.testcases is 'Total number of Test Cases.'; -comment on column wt_test_run_stats.passes is 'Number of passed Test Cases.'; comment on column wt_test_run_stats.failures is 'Number of failed Test Cases.'; +comment on column wt_test_run_stats.passes is 'Number of Test Assertions.'; comment on column wt_test_run_stats.min_interval_msecs is 'Minimum tot_interval_msecs between assertions across all Test Cases'; comment on column wt_test_run_stats.avg_interval_msecs is 'Average tot_interval_msecs between assertions across all Test Cases'; comment on column wt_test_run_stats.max_interval_msecs is 'Maximum tot_interval_msecs between assertions across all Test Cases'; From 4b1c7d420c161a412de1f846a97ea787c61f8381 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Sun, 25 Nov 2018 20:46:19 -0600 Subject: [PATCH 042/141] JUnit Core Updates --- src/core/test_allO.LST | 54 +++---- src/core/uninstallO.LST | 8 +- src/core/wtplsql.pkb | 31 ++-- src/junit/README.txt | 32 +++-- src/junit/junit_core_install.sql | 33 +++++ ...ml_core_data.prc => junit_core_report.pkb} | 132 +++++++++++++++--- src/junit/junit_core_report.pks | 19 +++ src/junit/junit_core_uninstall.sql | 36 +++++ ...rsist_all.prc => junit_persist_report.prc} | 0 9 files changed, 262 insertions(+), 83 deletions(-) create mode 100644 src/junit/junit_core_install.sql rename src/junit/{junit_xml_core_data.prc => junit_core_report.pkb} (72%) create mode 100644 src/junit/junit_core_report.pks create mode 100644 src/junit/junit_core_uninstall.sql rename src/junit/{junit_xml_persist_all.prc => junit_persist_report.prc} (100%) diff --git a/src/core/test_allO.LST b/src/core/test_allO.LST index 7725c08..993c552 100644 --- a/src/core/test_allO.LST +++ b/src/core/test_allO.LST @@ -1,68 +1,54 @@ - wtPLSQL 1.2.0 - Start Date/Time: 23-Nov-2018 07:22:20 AM + wtPLSQL 1.2.0 - Start Date/Time: 25-Nov-2018 07:58:12 PM Test Results for WTP.CORE_DATA Database Object Under Test is PACKAGE BODY WTP.CORE_DATA ---------------------------------------- - Minimum Elapsed msec: 0 Total Testcases: 8 - Average Elapsed msec: 0 Total Assertions: 30 - Maximum Elapsed msec: 2 Failed Assertions: 0 - Total Run Time (sec): 0.1 Test Yield: 100.00% + Minimum Elapsed msec: 0 Total Assertions: 54 + Average Elapsed msec: 0 Total Testcases: 8 + Maximum Elapsed msec: 1 Failed Testcases: 0 + Total Run Time (sec): 0.0 Testcase Yield: 100% WTP.CORE_DATA Test Runner Details: ---------------------------------------- - wtPLSQL 1.2.0 - Start Date/Time: 23-Nov-2018 07:22:20 AM + wtPLSQL 1.2.0 - Start Date/Time: 25-Nov-2018 07:58:12 PM Test Results for WTP.HOOK Database Object Under Test is PACKAGE BODY WTP.HOOK ---------------------------------------- - Minimum Elapsed msec: 0 Total Testcases: 3 - Average Elapsed msec: 1 Total Assertions: 18 - Maximum Elapsed msec: 4 Failed Assertions: 0 - Total Run Time (sec): 0.0 Test Yield: 100.00% + Minimum Elapsed msec: 0 Total Assertions: 18 + Average Elapsed msec: 2 Total Testcases: 4 + Maximum Elapsed msec: 12 Failed Testcases: 0 + Total Run Time (sec): 0.0 Testcase Yield: 100% WTP.HOOK Test Runner Details: ---------------------------------------- - wtPLSQL 1.2.0 - Start Date/Time: 23-Nov-2018 07:22:20 AM - -Test Results for WTP.TR1 ----------------------------------------- - Minimum Elapsed msec: 0 Total Testcases: 1 - Average Elapsed msec: 0 Total Assertions: 2 - Maximum Elapsed msec: 0 Failed Assertions: 1 - Total Run Time (sec): 0.0 Test Yield: 50.00% - -WTP.TR1 Test Runner Details: ----------------------------------------- -#FAIL# 0ms Test 2. EQ - Expected "2" and got "1" - - - wtPLSQL 1.2.0 - Start Date/Time: 23-Nov-2018 07:22:20 AM + wtPLSQL 1.2.0 - Start Date/Time: 25-Nov-2018 07:58:12 PM Test Results for WTP.WTPLSQL ---------------------------------------- - Minimum Elapsed msec: 0 Total Testcases: 11 - Average Elapsed msec: 11 Total Assertions: 29 - Maximum Elapsed msec: 77 Failed Assertions: 0 - Total Run Time (sec): 0.3 Test Yield: 100.00% + Minimum Elapsed msec: 0 Total Assertions: 26 + Average Elapsed msec: 15 Total Testcases: 11 + Maximum Elapsed msec: 125 Failed Testcases: 0 + Total Run Time (sec): 0.4 Testcase Yield: 100% WTP.WTPLSQL Test Runner Details: ---------------------------------------- - wtPLSQL 1.2.0 - Start Date/Time: 23-Nov-2018 07:22:21 AM + wtPLSQL 1.2.0 - Start Date/Time: 25-Nov-2018 07:58:12 PM Test Results for WTP.WT_ASSERT Database Object Under Test is PACKAGE BODY WTP.WT_ASSERT ---------------------------------------- - Minimum Elapsed msec: 0 Total Testcases: 150 - Average Elapsed msec: 5 Total Assertions: 404 - Maximum Elapsed msec: 375 Failed Assertions: 0 - Total Run Time (sec): 2.1 Test Yield: 100.00% + Minimum Elapsed msec: 0 Total Assertions: 404 + Average Elapsed msec: 6 Total Testcases: 150 + Maximum Elapsed msec: 449 Failed Testcases: 0 + Total Run Time (sec): 2.6 Testcase Yield: 100% WTP.WT_ASSERT Test Runner Details: ---------------------------------------- diff --git a/src/core/uninstallO.LST b/src/core/uninstallO.LST index 67ac00c..bb47a21 100644 --- a/src/core/uninstallO.LST +++ b/src/core/uninstallO.LST @@ -1,4 +1,3 @@ -old: showmode BOTH old 1: drop user &schema_owner. cascade new 1: drop user wtp cascade @@ -6,6 +5,13 @@ User dropped. old 6: and regexp_like(table_owner, '&schema_owner.', 'i') ) new 6: and regexp_like(table_owner, 'wtp', 'i') ) +drop public synonym UTASSERT +drop public synonym WTPLSQL +drop public synonym WT_ASSERT +drop public synonym WT_EXECUTE_TEST_RUNNER +drop public synonym WT_TEXT_REPORT +drop public synonym WT_VERSION +drop public synonym WT_WTPLSQL PL/SQL procedure successfully completed. diff --git a/src/core/wtplsql.pkb b/src/core/wtplsql.pkb index 1e7070f..5ba21a5 100644 --- a/src/core/wtplsql.pkb +++ b/src/core/wtplsql.pkb @@ -338,6 +338,7 @@ $THEN clear_run_rec; g_DBOUT := 'WTPLSQL'; find_dbout; + g_DBOUT := ''; l_run_recTEST := core_data.g_run_rec; core_data.g_run_rec := l_run_recSAVE; -------------------------------------- WTPLSQL Testing -- @@ -426,13 +427,10 @@ is pragma AUTONOMOUS_TRANSACTION; -- Required if called as Remote Procedure Call (RPC) l_error_stack varchar2(32000); begin - $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ - $THEN - -- This will avoid running the TEST_RUN procedure for some self-tests - if wtplsql_skip_test - then + $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ + if wtplsql_skip_test then test_all_aa(in_package_name) := 'X'; - return; + return; -- Avoid running the TEST_RUN procedure for some self-tests end if; $END ----------------%WTPLSQL_end_ignore_lines%---------------- -- Start a new Transaction @@ -454,9 +452,9 @@ begin l_error_stack := dbms_utility.format_error_stack || dbms_utility.format_error_backtrace ; core_data.run_error(l_error_stack); - wt_assert.this + wt_assert.isnull (msg_in => 'Un-handled Exception from Test Runner' - ,check_this_in => FALSE); + ,check_this_in => substr(core_data.g_run_rec.error_message,1,60)); end; -- Finalize rollback; -- Discard any pending transactions. @@ -465,6 +463,9 @@ begin hook.after_test_run; -- Required if called as Remote Procedure Call (RPC) COMMIT; +--exception +-- when OTHERS +-- then Allow WTPLSQL exception (Unhandled) end test_run; @@ -481,7 +482,11 @@ is TYPE runners_nt_type is table of varchar2(128); l_runners_nt runners_nt_type; begin - hook.before_test_all; + $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ + if NOT wtplsql_skip_test then + hook.before_test_all; -- Avoid running the hook for some self-tests + end if; + $END ----------------%WTPLSQL_end_ignore_lines%---------------- select object_name bulk collect into l_runners_nt from user_procedures t1 @@ -493,7 +498,11 @@ begin loop test_run(l_runners_nt(i)); end loop; - hook.after_test_all; + $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ + if NOT wtplsql_skip_test then + hook.after_test_all; -- Avoid running the hook for some self-tests + end if; + $END ----------------%WTPLSQL_end_ignore_lines%---------------- end test_all; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ @@ -512,7 +521,7 @@ $THEN -------------------------------------- WTPLSQL Testing -- wt_assert.this ( msg_in => 'test_all_aa.EXISTS(''WTPLSQL'')', - check_this_in => test_all_aa.EXISTS('WTPLSQL')); + check_this_in => test_all_aa.EXISTS( 'WTPLSQL' )); end t_test_all; $END ----------------%WTPLSQL_end_ignore_lines%---------------- diff --git a/src/junit/README.txt b/src/junit/README.txt index d92959c..f1072cf 100644 --- a/src/junit/README.txt +++ b/src/junit/README.txt @@ -1,20 +1,24 @@ White Box PL/SQL Testing - src/core/README.txt + src/junit/README.txt -FILE DESCRIPTION ----------------------- ----------------------- -junit_report_all.prc Procedure that create JUnit XML from WT_TEST_RUNS -wtplsql_conversion.sql PL/SQL block that adds Runner Entry Point to packages +FILE DESCRIPTION +------------------------ ----------------------- +junit_core_install.sql Install JUnit XML (from CORE_DATA) +junit_core_report.pkb Package for creating JUnit XML from CORE_DATA +junit_core_report.pks Package Body for creating JUnit XML from CORE_DATA +junit_core_uninstall.sql Un-Install JUnit XML (from CORE_DATA) +junit_persist_report.pks Package Body for creating JUnit XML from Tables -NOTE: "install.sql" creates PUBLIC SYNONYMS. +JUnit Core Install Procedure: +----------------------------- +1) Review ../common_setup.sql +2) Review junit_core_install.sql +3) Run junit_core_install.sql using SQL*Plus -Install Procedure: ------------------- -All extras a individually installed. - - -UnInstall Procedure: --------------------- -No automated un-install. +JUnit Core Un-Install Procedure: +-------------------------------- +1) Review ../common_setup.sql +2) Review junit_core_uninstall.sql +3) Run junit_core_uninstall.sql using SQL*Plus diff --git a/src/junit/junit_core_install.sql b/src/junit/junit_core_install.sql new file mode 100644 index 0000000..754724b --- /dev/null +++ b/src/junit/junit_core_install.sql @@ -0,0 +1,33 @@ + +-- +-- JUnit Core Report Installation +-- + +-- Capture output +spool junit_core_install + +-- Connect as SCHEMA_OWNER +connect &schema_owner./&schema_owner.&connect_string. +set serveroutput on size unlimited format truncated + +-- Shared Setup Script +@../common_setup.sql + +-- Install Packages +@junit_core_report.pks +@junit_core_report.pkb + +-- Install Hooks +insert into hooks (hook_name, seq, run_string) + values ('before_test_all', 1, 'begin junit_core_report.before_test_all; end;'); +update hooks set run_string = 'begin junit_core_report.show_current; end;' + where hook_name = 'after_test_run' and seq = 1; +insert into hooks (hook_name, seq, run_string) + values ('after_test_all', 1, 'begin junit_core_report.after_test_all; end;'); +commit; +begin + hook.init; +end; +/ + +spool off diff --git a/src/junit/junit_xml_core_data.prc b/src/junit/junit_core_report.pkb similarity index 72% rename from src/junit/junit_xml_core_data.prc rename to src/junit/junit_core_report.pkb index 811a0d5..4164cf6 100644 --- a/src/junit/junit_xml_core_data.prc +++ b/src/junit/junit_core_report.pkb @@ -1,17 +1,30 @@ -create or replace procedure junit_xml_core_data +create or replace package body junit_core_report +as + + +---------------------- +-- PRivate Procedures +---------------------- + + +-- Print to DBMS_OUTPUT +procedure p + (in_line in varchar2) is - l_rec core_data.results_rec_type; - l_testcase core_data.long_name; - single_line_save boolean; - -- Print to DBMS_OUTPUT - procedure p (in_line in varchar2) is begin - DBMS_OUTPUT.PUT_LINE(in_line); - end p; - -- XML Escape - function xe (in_txt in varchar2) return varchar2 is begin - return replace +begin + DBMS_OUTPUT.PUT_LINE(in_line); +end p; + + +-- XML Escape +function xe + (in_txt in varchar2) + return varchar2 +is +begin + return replace + (replace (replace - (replace (replace (replace (in_txt @@ -20,21 +33,47 @@ is ,'&','&') -- Ampersand ,'''',''') -- Apostrophe ,'"','"'); -- Quotation Mark - end xe; +end xe; + + +--------------------- +-- Public Procedures +--------------------- + + +procedure xml_header +is begin - single_line_save := wt_text_report.g_single_line_output; - wt_text_report.g_single_line_output := TRUE; p(''); p(''); p(''); p(''); p(''); +end xml_header; + + +procedure xml_body +is + l_rec core_data.results_rec_type; + l_testcase core_data.long_name; + l_classname varchar2(4000); + single_line_save boolean; +begin + single_line_save := wt_text_report.g_single_line_output; + wt_text_report.g_single_line_output := TRUE; + if core_data.g_run_rec.dbout_name is not null + then + l_classname := xe(core_data.g_run_rec.dbout_owner) || + '.' || xe(core_data.g_run_rec.dbout_name) || + ':' || xe(replace(core_data.g_run_rec.dbout_type,' ','_')); + end if; if core_data.g_tcases_aa.COUNT > 0 then --------------------- -- Test Suite Header p(' ' ); if core_data.g_tcases_aa(l_testcase).asrt_fail > 0 or ( core_data.g_run_rec.error_message is not null @@ -104,7 +141,56 @@ begin p(' '); --------------------- end if; - p(''); wt_text_report.g_single_line_output := single_line_save; -end junit_xml_core_data; -/ +end xml_body; + + +procedure xml_trailer +is +begin + p(''); +end xml_trailer; + + +procedure before_test_all +is +begin + if not g_in_process + then + xml_header; + end if; + g_in_process := TRUE; +end before_test_all; + + +procedure show_current +is +begin + -- + if not g_in_process + then + xml_header; + end if; + -- + xml_body; + -- + if not g_in_process + then + xml_trailer; + end if; + -- +end show_current; + + +procedure after_test_all +is +begin + if g_in_process + then + xml_trailer; + end if; + g_in_process := FALSE; +end after_test_all; + + +end junit_core_report; diff --git a/src/junit/junit_core_report.pks b/src/junit/junit_core_report.pks new file mode 100644 index 0000000..306092e --- /dev/null +++ b/src/junit/junit_core_report.pks @@ -0,0 +1,19 @@ +create or replace package junit_core_report + authid definer +as + + g_in_process boolean := FALSE; + + procedure xml_header; + + procedure xml_body; + + procedure xml_trailer; + + procedure before_test_all; + + procedure show_current; + + procedure after_test_all; + +end junit_core_report; diff --git a/src/junit/junit_core_uninstall.sql b/src/junit/junit_core_uninstall.sql new file mode 100644 index 0000000..5b3ece2 --- /dev/null +++ b/src/junit/junit_core_uninstall.sql @@ -0,0 +1,36 @@ + +-- +-- JUnit Core Report Un-Install +-- + +-- Capture output +spool junit_core_uninstall + +-- Shared Setup Script +@../common_setup.sql + +-- Connect as SCHEMA_OWNER +connect &schema_owner./&schema_owner.&connect_string. +set serveroutput on size unlimited format truncated + +-- Un-Install Hooks +delete from hooks + where hook_name = 'before_test_all' + and seq = 1 + and run_string = 'begin junit_core_report.before_test_all; end;'; +update hooks set run_string = 'begin wt_text_report.dbms_out(10); end;' + where hook_name = 'after_test_run' and seq = 1; +delete from hooks + where hook_name = 'after_test_all' + and seq = 1 + and run_string = 'begin junit_core_report.after_test_all; end;'; +commit; +begin + hook.init; +end; +/ + +-- Un-Install Package +drop package junit_core_report; + +spool off diff --git a/src/junit/junit_xml_persist_all.prc b/src/junit/junit_persist_report.prc similarity index 100% rename from src/junit/junit_xml_persist_all.prc rename to src/junit/junit_persist_report.prc From 72c7681dd4ff11552441100188f4dbf73a9d6c09 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Sun, 25 Nov 2018 23:06:12 -0600 Subject: [PATCH 043/141] Move Docs and Persist Changes --- docs/{stats_gui => gui}/README.md | 0 docs/{stats_gui => gui}/README.txt | 0 docs/{stats_gui => gui}/_config.yml | 0 docs/{stats_gui => gui}/md-to-htm.bat | 0 docs/{stats_gui => gui}/md-to-htm.lua | 0 docs/persist/Call_Tree_Diagrams.odg | Bin 0 -> 27281 bytes docs/persist/Call_Tree_Diagrams.pdf | Bin 0 -> 364558 bytes docs/persist/DBDocs/dbdoc.css | 151 + docs/persist/DBDocs/dbdoc.js | 409 ++ docs/persist/DBDocs/empty.html | 12 + docs/persist/DBDocs/index.html | 19 + docs/persist/DBDocs/nodeTypes.html | 14 + docs/persist/DBDocs/package body/WTPLSQL.html | 788 ++++ .../DBDocs/package body/WTPLSQL/headerBg.jpg | Bin 0 -> 13911 bytes .../DBDocs/package body/WTPLSQL/report.css | 149 + .../DBDocs/package body/WTPLSQL/report.js | 148 + .../package body/WTPLSQL/topDimTabBg.gif | Bin 0 -> 149 bytes .../package body/WTPLSQL/topDimTabL.gif | Bin 0 -> 579 bytes .../package body/WTPLSQL/topDimTabR.gif | Bin 0 -> 580 bytes .../DBDocs/package body/WTPLSQL/topTabBg.gif | Bin 0 -> 95 bytes .../DBDocs/package body/WTPLSQL/topTabL.gif | Bin 0 -> 330 bytes .../DBDocs/package body/WTPLSQL/topTabR.gif | Bin 0 -> 332 bytes .../DBDocs/package body/WT_ASSERT.html | 4080 +++++++++++++++++ .../package body/WT_ASSERT/headerBg.jpg | Bin 0 -> 13911 bytes .../DBDocs/package body/WT_ASSERT/report.css | 149 + .../DBDocs/package body/WT_ASSERT/report.js | 148 + .../package body/WT_ASSERT/topDimTabBg.gif | Bin 0 -> 149 bytes .../package body/WT_ASSERT/topDimTabL.gif | Bin 0 -> 579 bytes .../package body/WT_ASSERT/topDimTabR.gif | Bin 0 -> 580 bytes .../package body/WT_ASSERT/topTabBg.gif | Bin 0 -> 95 bytes .../DBDocs/package body/WT_ASSERT/topTabL.gif | Bin 0 -> 330 bytes .../DBDocs/package body/WT_ASSERT/topTabR.gif | Bin 0 -> 332 bytes .../DBDocs/package body/WT_PROFILER.html | 2167 +++++++++ .../package body/WT_PROFILER/headerBg.jpg | Bin 0 -> 13911 bytes .../package body/WT_PROFILER/report.css | 149 + .../DBDocs/package body/WT_PROFILER/report.js | 148 + .../package body/WT_PROFILER/topDimTabBg.gif | Bin 0 -> 149 bytes .../package body/WT_PROFILER/topDimTabL.gif | Bin 0 -> 579 bytes .../package body/WT_PROFILER/topDimTabR.gif | Bin 0 -> 580 bytes .../package body/WT_PROFILER/topTabBg.gif | Bin 0 -> 95 bytes .../package body/WT_PROFILER/topTabL.gif | Bin 0 -> 330 bytes .../package body/WT_PROFILER/topTabR.gif | Bin 0 -> 332 bytes .../DBDocs/package body/WT_RESULT.html | 666 +++ .../package body/WT_RESULT/headerBg.jpg | Bin 0 -> 13911 bytes .../DBDocs/package body/WT_RESULT/report.css | 149 + .../DBDocs/package body/WT_RESULT/report.js | 148 + .../package body/WT_RESULT/topDimTabBg.gif | Bin 0 -> 149 bytes .../package body/WT_RESULT/topDimTabL.gif | Bin 0 -> 579 bytes .../package body/WT_RESULT/topDimTabR.gif | Bin 0 -> 580 bytes .../package body/WT_RESULT/topTabBg.gif | Bin 0 -> 95 bytes .../DBDocs/package body/WT_RESULT/topTabL.gif | Bin 0 -> 330 bytes .../DBDocs/package body/WT_RESULT/topTabR.gif | Bin 0 -> 332 bytes .../DBDocs/package body/WT_TEST_RUN_STAT.html | 1150 +++++ .../WT_TEST_RUN_STAT/headerBg.jpg | Bin 0 -> 13911 bytes .../package body/WT_TEST_RUN_STAT/report.css | 149 + .../package body/WT_TEST_RUN_STAT/report.js | 148 + .../WT_TEST_RUN_STAT/topDimTabBg.gif | Bin 0 -> 149 bytes .../WT_TEST_RUN_STAT/topDimTabL.gif | Bin 0 -> 579 bytes .../WT_TEST_RUN_STAT/topDimTabR.gif | Bin 0 -> 580 bytes .../WT_TEST_RUN_STAT/topTabBg.gif | Bin 0 -> 95 bytes .../package body/WT_TEST_RUN_STAT/topTabL.gif | Bin 0 -> 330 bytes .../package body/WT_TEST_RUN_STAT/topTabR.gif | Bin 0 -> 332 bytes .../DBDocs/package body/WT_TEXT_REPORT.html | 527 +++ .../package body/WT_TEXT_REPORT/headerBg.jpg | Bin 0 -> 13911 bytes .../package body/WT_TEXT_REPORT/report.css | 149 + .../package body/WT_TEXT_REPORT/report.js | 148 + .../WT_TEXT_REPORT/topDimTabBg.gif | Bin 0 -> 149 bytes .../WT_TEXT_REPORT/topDimTabL.gif | Bin 0 -> 579 bytes .../WT_TEXT_REPORT/topDimTabR.gif | Bin 0 -> 580 bytes .../package body/WT_TEXT_REPORT/topTabBg.gif | Bin 0 -> 95 bytes .../package body/WT_TEXT_REPORT/topTabL.gif | Bin 0 -> 330 bytes .../package body/WT_TEXT_REPORT/topTabR.gif | Bin 0 -> 332 bytes docs/persist/DBDocs/package body/index.html | 16 + docs/persist/DBDocs/package/WTPLSQL.html | 225 + .../DBDocs/package/WTPLSQL/headerBg.jpg | Bin 0 -> 13911 bytes .../persist/DBDocs/package/WTPLSQL/report.css | 149 + docs/persist/DBDocs/package/WTPLSQL/report.js | 148 + .../DBDocs/package/WTPLSQL/topDimTabBg.gif | Bin 0 -> 149 bytes .../DBDocs/package/WTPLSQL/topDimTabL.gif | Bin 0 -> 579 bytes .../DBDocs/package/WTPLSQL/topDimTabR.gif | Bin 0 -> 580 bytes .../DBDocs/package/WTPLSQL/topTabBg.gif | Bin 0 -> 95 bytes .../DBDocs/package/WTPLSQL/topTabL.gif | Bin 0 -> 330 bytes .../DBDocs/package/WTPLSQL/topTabR.gif | Bin 0 -> 332 bytes docs/persist/DBDocs/package/WT_ASSERT.html | 528 +++ .../DBDocs/package/WT_ASSERT/headerBg.jpg | Bin 0 -> 13911 bytes .../DBDocs/package/WT_ASSERT/report.css | 149 + .../DBDocs/package/WT_ASSERT/report.js | 148 + .../DBDocs/package/WT_ASSERT/topDimTabBg.gif | Bin 0 -> 149 bytes .../DBDocs/package/WT_ASSERT/topDimTabL.gif | Bin 0 -> 579 bytes .../DBDocs/package/WT_ASSERT/topDimTabR.gif | Bin 0 -> 580 bytes .../DBDocs/package/WT_ASSERT/topTabBg.gif | Bin 0 -> 95 bytes .../DBDocs/package/WT_ASSERT/topTabL.gif | Bin 0 -> 330 bytes .../DBDocs/package/WT_ASSERT/topTabR.gif | Bin 0 -> 332 bytes docs/persist/DBDocs/package/WT_PROFILER.html | 229 + .../DBDocs/package/WT_PROFILER/headerBg.jpg | Bin 0 -> 13911 bytes .../DBDocs/package/WT_PROFILER/report.css | 149 + .../DBDocs/package/WT_PROFILER/report.js | 148 + .../package/WT_PROFILER/topDimTabBg.gif | Bin 0 -> 149 bytes .../DBDocs/package/WT_PROFILER/topDimTabL.gif | Bin 0 -> 579 bytes .../DBDocs/package/WT_PROFILER/topDimTabR.gif | Bin 0 -> 580 bytes .../DBDocs/package/WT_PROFILER/topTabBg.gif | Bin 0 -> 95 bytes .../DBDocs/package/WT_PROFILER/topTabL.gif | Bin 0 -> 330 bytes .../DBDocs/package/WT_PROFILER/topTabR.gif | Bin 0 -> 332 bytes docs/persist/DBDocs/package/WT_RESULT.html | 217 + .../DBDocs/package/WT_RESULT/headerBg.jpg | Bin 0 -> 13911 bytes .../DBDocs/package/WT_RESULT/report.css | 149 + .../DBDocs/package/WT_RESULT/report.js | 148 + .../DBDocs/package/WT_RESULT/topDimTabBg.gif | Bin 0 -> 149 bytes .../DBDocs/package/WT_RESULT/topDimTabL.gif | Bin 0 -> 579 bytes .../DBDocs/package/WT_RESULT/topDimTabR.gif | Bin 0 -> 580 bytes .../DBDocs/package/WT_RESULT/topTabBg.gif | Bin 0 -> 95 bytes .../DBDocs/package/WT_RESULT/topTabL.gif | Bin 0 -> 330 bytes .../DBDocs/package/WT_RESULT/topTabR.gif | Bin 0 -> 332 bytes .../DBDocs/package/WT_TEST_RUN_STAT.html | 210 + .../package/WT_TEST_RUN_STAT/headerBg.jpg | Bin 0 -> 13911 bytes .../package/WT_TEST_RUN_STAT/report.css | 149 + .../DBDocs/package/WT_TEST_RUN_STAT/report.js | 148 + .../package/WT_TEST_RUN_STAT/topDimTabBg.gif | Bin 0 -> 149 bytes .../package/WT_TEST_RUN_STAT/topDimTabL.gif | Bin 0 -> 579 bytes .../package/WT_TEST_RUN_STAT/topDimTabR.gif | Bin 0 -> 580 bytes .../package/WT_TEST_RUN_STAT/topTabBg.gif | Bin 0 -> 95 bytes .../package/WT_TEST_RUN_STAT/topTabL.gif | Bin 0 -> 330 bytes .../package/WT_TEST_RUN_STAT/topTabR.gif | Bin 0 -> 332 bytes .../DBDocs/package/WT_TEXT_REPORT.html | 241 + .../package/WT_TEXT_REPORT/headerBg.jpg | Bin 0 -> 13911 bytes .../DBDocs/package/WT_TEXT_REPORT/report.css | 149 + .../DBDocs/package/WT_TEXT_REPORT/report.js | 148 + .../package/WT_TEXT_REPORT/topDimTabBg.gif | Bin 0 -> 149 bytes .../package/WT_TEXT_REPORT/topDimTabL.gif | Bin 0 -> 579 bytes .../package/WT_TEXT_REPORT/topDimTabR.gif | Bin 0 -> 580 bytes .../package/WT_TEXT_REPORT/topTabBg.gif | Bin 0 -> 95 bytes .../DBDocs/package/WT_TEXT_REPORT/topTabL.gif | Bin 0 -> 330 bytes .../DBDocs/package/WT_TEXT_REPORT/topTabR.gif | Bin 0 -> 332 bytes docs/persist/DBDocs/package/index.html | 16 + docs/persist/DBDocs/round_text.png | Bin 0 -> 710 bytes .../sequence/PLSQL_PROFILER_RUNNUMBER.html | 107 + .../PLSQL_PROFILER_RUNNUMBER/headerBg.jpg | Bin 0 -> 13911 bytes .../PLSQL_PROFILER_RUNNUMBER/report.css | 149 + .../PLSQL_PROFILER_RUNNUMBER/report.js | 148 + .../PLSQL_PROFILER_RUNNUMBER/topDimTabBg.gif | Bin 0 -> 149 bytes .../PLSQL_PROFILER_RUNNUMBER/topDimTabL.gif | Bin 0 -> 579 bytes .../PLSQL_PROFILER_RUNNUMBER/topDimTabR.gif | Bin 0 -> 580 bytes .../PLSQL_PROFILER_RUNNUMBER/topTabBg.gif | Bin 0 -> 95 bytes .../PLSQL_PROFILER_RUNNUMBER/topTabL.gif | Bin 0 -> 330 bytes .../PLSQL_PROFILER_RUNNUMBER/topTabR.gif | Bin 0 -> 332 bytes .../DBDocs/sequence/WT_TEST_RUNS_SEQ.html | 107 + .../sequence/WT_TEST_RUNS_SEQ/headerBg.jpg | Bin 0 -> 13911 bytes .../sequence/WT_TEST_RUNS_SEQ/report.css | 149 + .../sequence/WT_TEST_RUNS_SEQ/report.js | 148 + .../sequence/WT_TEST_RUNS_SEQ/topDimTabBg.gif | Bin 0 -> 149 bytes .../sequence/WT_TEST_RUNS_SEQ/topDimTabL.gif | Bin 0 -> 579 bytes .../sequence/WT_TEST_RUNS_SEQ/topDimTabR.gif | Bin 0 -> 580 bytes .../sequence/WT_TEST_RUNS_SEQ/topTabBg.gif | Bin 0 -> 95 bytes .../sequence/WT_TEST_RUNS_SEQ/topTabL.gif | Bin 0 -> 330 bytes .../sequence/WT_TEST_RUNS_SEQ/topTabR.gif | Bin 0 -> 332 bytes docs/persist/DBDocs/sequence/index.html | 12 + .../DBDocs/table/PLSQL_PROFILER_DATA.html | 799 ++++ .../table/PLSQL_PROFILER_DATA/headerBg.jpg | Bin 0 -> 13911 bytes .../table/PLSQL_PROFILER_DATA/report.css | 149 + .../table/PLSQL_PROFILER_DATA/report.js | 148 + .../table/PLSQL_PROFILER_DATA/topDimTabBg.gif | Bin 0 -> 149 bytes .../table/PLSQL_PROFILER_DATA/topDimTabL.gif | Bin 0 -> 579 bytes .../table/PLSQL_PROFILER_DATA/topDimTabR.gif | Bin 0 -> 580 bytes .../table/PLSQL_PROFILER_DATA/topTabBg.gif | Bin 0 -> 95 bytes .../table/PLSQL_PROFILER_DATA/topTabL.gif | Bin 0 -> 330 bytes .../table/PLSQL_PROFILER_DATA/topTabR.gif | Bin 0 -> 332 bytes .../DBDocs/table/PLSQL_PROFILER_RUNS.html | 722 +++ .../table/PLSQL_PROFILER_RUNS/headerBg.jpg | Bin 0 -> 13911 bytes .../table/PLSQL_PROFILER_RUNS/report.css | 149 + .../table/PLSQL_PROFILER_RUNS/report.js | 148 + .../table/PLSQL_PROFILER_RUNS/topDimTabBg.gif | Bin 0 -> 149 bytes .../table/PLSQL_PROFILER_RUNS/topDimTabL.gif | Bin 0 -> 579 bytes .../table/PLSQL_PROFILER_RUNS/topDimTabR.gif | Bin 0 -> 580 bytes .../table/PLSQL_PROFILER_RUNS/topTabBg.gif | Bin 0 -> 95 bytes .../table/PLSQL_PROFILER_RUNS/topTabL.gif | Bin 0 -> 330 bytes .../table/PLSQL_PROFILER_RUNS/topTabR.gif | Bin 0 -> 332 bytes .../DBDocs/table/PLSQL_PROFILER_UNITS.html | 763 +++ .../table/PLSQL_PROFILER_UNITS/headerBg.jpg | Bin 0 -> 13911 bytes .../table/PLSQL_PROFILER_UNITS/report.css | 149 + .../table/PLSQL_PROFILER_UNITS/report.js | 148 + .../PLSQL_PROFILER_UNITS/topDimTabBg.gif | Bin 0 -> 149 bytes .../table/PLSQL_PROFILER_UNITS/topDimTabL.gif | Bin 0 -> 579 bytes .../table/PLSQL_PROFILER_UNITS/topDimTabR.gif | Bin 0 -> 580 bytes .../table/PLSQL_PROFILER_UNITS/topTabBg.gif | Bin 0 -> 95 bytes .../table/PLSQL_PROFILER_UNITS/topTabL.gif | Bin 0 -> 330 bytes .../table/PLSQL_PROFILER_UNITS/topTabR.gif | Bin 0 -> 332 bytes .../DBDocs/table/WT_DBOUT_PROFILES.html | 1096 +++++ .../table/WT_DBOUT_PROFILES/headerBg.jpg | Bin 0 -> 13911 bytes .../DBDocs/table/WT_DBOUT_PROFILES/report.css | 149 + .../DBDocs/table/WT_DBOUT_PROFILES/report.js | 148 + .../table/WT_DBOUT_PROFILES/topDimTabBg.gif | Bin 0 -> 149 bytes .../table/WT_DBOUT_PROFILES/topDimTabL.gif | Bin 0 -> 579 bytes .../table/WT_DBOUT_PROFILES/topDimTabR.gif | Bin 0 -> 580 bytes .../table/WT_DBOUT_PROFILES/topTabBg.gif | Bin 0 -> 95 bytes .../table/WT_DBOUT_PROFILES/topTabL.gif | Bin 0 -> 330 bytes .../table/WT_DBOUT_PROFILES/topTabR.gif | Bin 0 -> 332 bytes docs/persist/DBDocs/table/WT_RESULTS.html | 1155 +++++ .../DBDocs/table/WT_RESULTS/headerBg.jpg | Bin 0 -> 13911 bytes .../DBDocs/table/WT_RESULTS/report.css | 149 + .../persist/DBDocs/table/WT_RESULTS/report.js | 148 + .../DBDocs/table/WT_RESULTS/topDimTabBg.gif | Bin 0 -> 149 bytes .../DBDocs/table/WT_RESULTS/topDimTabL.gif | Bin 0 -> 579 bytes .../DBDocs/table/WT_RESULTS/topDimTabR.gif | Bin 0 -> 580 bytes .../DBDocs/table/WT_RESULTS/topTabBg.gif | Bin 0 -> 95 bytes .../DBDocs/table/WT_RESULTS/topTabL.gif | Bin 0 -> 330 bytes .../DBDocs/table/WT_RESULTS/topTabR.gif | Bin 0 -> 332 bytes docs/persist/DBDocs/table/WT_SELF_TEST.html | 739 +++ .../DBDocs/table/WT_SELF_TEST/headerBg.jpg | Bin 0 -> 13911 bytes .../DBDocs/table/WT_SELF_TEST/report.css | 149 + .../DBDocs/table/WT_SELF_TEST/report.js | 148 + .../DBDocs/table/WT_SELF_TEST/topDimTabBg.gif | Bin 0 -> 149 bytes .../DBDocs/table/WT_SELF_TEST/topDimTabL.gif | Bin 0 -> 579 bytes .../DBDocs/table/WT_SELF_TEST/topDimTabR.gif | Bin 0 -> 580 bytes .../DBDocs/table/WT_SELF_TEST/topTabBg.gif | Bin 0 -> 95 bytes .../DBDocs/table/WT_SELF_TEST/topTabL.gif | Bin 0 -> 330 bytes .../DBDocs/table/WT_SELF_TEST/topTabR.gif | Bin 0 -> 332 bytes .../DBDocs/table/WT_TESTCASE_STATS.html | 826 ++++ .../table/WT_TESTCASE_STATS/headerBg.jpg | Bin 0 -> 13911 bytes .../DBDocs/table/WT_TESTCASE_STATS/report.css | 149 + .../DBDocs/table/WT_TESTCASE_STATS/report.js | 148 + .../table/WT_TESTCASE_STATS/topDimTabBg.gif | Bin 0 -> 149 bytes .../table/WT_TESTCASE_STATS/topDimTabL.gif | Bin 0 -> 579 bytes .../table/WT_TESTCASE_STATS/topDimTabR.gif | Bin 0 -> 580 bytes .../table/WT_TESTCASE_STATS/topTabBg.gif | Bin 0 -> 95 bytes .../table/WT_TESTCASE_STATS/topTabL.gif | Bin 0 -> 330 bytes .../table/WT_TESTCASE_STATS/topTabR.gif | Bin 0 -> 332 bytes docs/persist/DBDocs/table/WT_TEST_RUNS.html | 1156 +++++ .../DBDocs/table/WT_TEST_RUNS/headerBg.jpg | Bin 0 -> 13911 bytes .../DBDocs/table/WT_TEST_RUNS/report.css | 149 + .../DBDocs/table/WT_TEST_RUNS/report.js | 148 + .../DBDocs/table/WT_TEST_RUNS/topDimTabBg.gif | Bin 0 -> 149 bytes .../DBDocs/table/WT_TEST_RUNS/topDimTabL.gif | Bin 0 -> 579 bytes .../DBDocs/table/WT_TEST_RUNS/topDimTabR.gif | Bin 0 -> 580 bytes .../DBDocs/table/WT_TEST_RUNS/topTabBg.gif | Bin 0 -> 95 bytes .../DBDocs/table/WT_TEST_RUNS/topTabL.gif | Bin 0 -> 330 bytes .../DBDocs/table/WT_TEST_RUNS/topTabR.gif | Bin 0 -> 332 bytes .../DBDocs/table/WT_TEST_RUN_STATS.html | 886 ++++ .../table/WT_TEST_RUN_STATS/headerBg.jpg | Bin 0 -> 13911 bytes .../DBDocs/table/WT_TEST_RUN_STATS/report.css | 149 + .../DBDocs/table/WT_TEST_RUN_STATS/report.js | 148 + .../table/WT_TEST_RUN_STATS/topDimTabBg.gif | Bin 0 -> 149 bytes .../table/WT_TEST_RUN_STATS/topDimTabL.gif | Bin 0 -> 579 bytes .../table/WT_TEST_RUN_STATS/topDimTabR.gif | Bin 0 -> 580 bytes .../table/WT_TEST_RUN_STATS/topTabBg.gif | Bin 0 -> 95 bytes .../table/WT_TEST_RUN_STATS/topTabL.gif | Bin 0 -> 330 bytes .../table/WT_TEST_RUN_STATS/topTabR.gif | Bin 0 -> 332 bytes docs/persist/DBDocs/table/WT_VERSION.html | 587 +++ .../DBDocs/table/WT_VERSION/headerBg.jpg | Bin 0 -> 13911 bytes .../DBDocs/table/WT_VERSION/report.css | 149 + .../persist/DBDocs/table/WT_VERSION/report.js | 148 + .../DBDocs/table/WT_VERSION/topDimTabBg.gif | Bin 0 -> 149 bytes .../DBDocs/table/WT_VERSION/topDimTabL.gif | Bin 0 -> 579 bytes .../DBDocs/table/WT_VERSION/topDimTabR.gif | Bin 0 -> 580 bytes .../DBDocs/table/WT_VERSION/topTabBg.gif | Bin 0 -> 95 bytes .../DBDocs/table/WT_VERSION/topTabL.gif | Bin 0 -> 330 bytes .../DBDocs/table/WT_VERSION/topTabR.gif | Bin 0 -> 332 bytes docs/persist/DBDocs/table/index.html | 20 + docs/persist/ER_Diagrams.pdf | Bin 0 -> 2761 bytes docs/persist/README.md | 11 + src/persist/wt_dbout_runs_vw.vw | 22 + src/persist/wt_profiler_stats.tab | 50 - src/persist/wt_profiler_stats_vw.vw | 61 - src/persist/wt_profiles.tab | 18 +- src/persist/wt_profiles_vw.vw | 80 +- src/persist/wt_test_run_stats.tab | 41 - src/persist/wt_test_run_stats_vw.vw | 47 - src/persist/wt_test_runs.tab | 75 +- src/persist/wt_test_runs_vw.vw | 16 + ...ase_stats_vw.vw => wt_testcase_runs_vw.vw} | 2 +- src/persist/wt_testcase_stats.tab | 4 +- 270 files changed, 27937 insertions(+), 258 deletions(-) rename docs/{stats_gui => gui}/README.md (100%) rename docs/{stats_gui => gui}/README.txt (100%) rename docs/{stats_gui => gui}/_config.yml (100%) rename docs/{stats_gui => gui}/md-to-htm.bat (100%) rename docs/{stats_gui => gui}/md-to-htm.lua (100%) create mode 100644 docs/persist/Call_Tree_Diagrams.odg create mode 100644 docs/persist/Call_Tree_Diagrams.pdf create mode 100644 docs/persist/DBDocs/dbdoc.css create mode 100644 docs/persist/DBDocs/dbdoc.js create mode 100644 docs/persist/DBDocs/empty.html create mode 100644 docs/persist/DBDocs/index.html create mode 100644 docs/persist/DBDocs/nodeTypes.html create mode 100644 docs/persist/DBDocs/package body/WTPLSQL.html create mode 100644 docs/persist/DBDocs/package body/WTPLSQL/headerBg.jpg create mode 100644 docs/persist/DBDocs/package body/WTPLSQL/report.css create mode 100644 docs/persist/DBDocs/package body/WTPLSQL/report.js create mode 100644 docs/persist/DBDocs/package body/WTPLSQL/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/package body/WTPLSQL/topDimTabL.gif create mode 100644 docs/persist/DBDocs/package body/WTPLSQL/topDimTabR.gif create mode 100644 docs/persist/DBDocs/package body/WTPLSQL/topTabBg.gif create mode 100644 docs/persist/DBDocs/package body/WTPLSQL/topTabL.gif create mode 100644 docs/persist/DBDocs/package body/WTPLSQL/topTabR.gif create mode 100644 docs/persist/DBDocs/package body/WT_ASSERT.html create mode 100644 docs/persist/DBDocs/package body/WT_ASSERT/headerBg.jpg create mode 100644 docs/persist/DBDocs/package body/WT_ASSERT/report.css create mode 100644 docs/persist/DBDocs/package body/WT_ASSERT/report.js create mode 100644 docs/persist/DBDocs/package body/WT_ASSERT/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/package body/WT_ASSERT/topDimTabL.gif create mode 100644 docs/persist/DBDocs/package body/WT_ASSERT/topDimTabR.gif create mode 100644 docs/persist/DBDocs/package body/WT_ASSERT/topTabBg.gif create mode 100644 docs/persist/DBDocs/package body/WT_ASSERT/topTabL.gif create mode 100644 docs/persist/DBDocs/package body/WT_ASSERT/topTabR.gif create mode 100644 docs/persist/DBDocs/package body/WT_PROFILER.html create mode 100644 docs/persist/DBDocs/package body/WT_PROFILER/headerBg.jpg create mode 100644 docs/persist/DBDocs/package body/WT_PROFILER/report.css create mode 100644 docs/persist/DBDocs/package body/WT_PROFILER/report.js create mode 100644 docs/persist/DBDocs/package body/WT_PROFILER/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/package body/WT_PROFILER/topDimTabL.gif create mode 100644 docs/persist/DBDocs/package body/WT_PROFILER/topDimTabR.gif create mode 100644 docs/persist/DBDocs/package body/WT_PROFILER/topTabBg.gif create mode 100644 docs/persist/DBDocs/package body/WT_PROFILER/topTabL.gif create mode 100644 docs/persist/DBDocs/package body/WT_PROFILER/topTabR.gif create mode 100644 docs/persist/DBDocs/package body/WT_RESULT.html create mode 100644 docs/persist/DBDocs/package body/WT_RESULT/headerBg.jpg create mode 100644 docs/persist/DBDocs/package body/WT_RESULT/report.css create mode 100644 docs/persist/DBDocs/package body/WT_RESULT/report.js create mode 100644 docs/persist/DBDocs/package body/WT_RESULT/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/package body/WT_RESULT/topDimTabL.gif create mode 100644 docs/persist/DBDocs/package body/WT_RESULT/topDimTabR.gif create mode 100644 docs/persist/DBDocs/package body/WT_RESULT/topTabBg.gif create mode 100644 docs/persist/DBDocs/package body/WT_RESULT/topTabL.gif create mode 100644 docs/persist/DBDocs/package body/WT_RESULT/topTabR.gif create mode 100644 docs/persist/DBDocs/package body/WT_TEST_RUN_STAT.html create mode 100644 docs/persist/DBDocs/package body/WT_TEST_RUN_STAT/headerBg.jpg create mode 100644 docs/persist/DBDocs/package body/WT_TEST_RUN_STAT/report.css create mode 100644 docs/persist/DBDocs/package body/WT_TEST_RUN_STAT/report.js create mode 100644 docs/persist/DBDocs/package body/WT_TEST_RUN_STAT/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/package body/WT_TEST_RUN_STAT/topDimTabL.gif create mode 100644 docs/persist/DBDocs/package body/WT_TEST_RUN_STAT/topDimTabR.gif create mode 100644 docs/persist/DBDocs/package body/WT_TEST_RUN_STAT/topTabBg.gif create mode 100644 docs/persist/DBDocs/package body/WT_TEST_RUN_STAT/topTabL.gif create mode 100644 docs/persist/DBDocs/package body/WT_TEST_RUN_STAT/topTabR.gif create mode 100644 docs/persist/DBDocs/package body/WT_TEXT_REPORT.html create mode 100644 docs/persist/DBDocs/package body/WT_TEXT_REPORT/headerBg.jpg create mode 100644 docs/persist/DBDocs/package body/WT_TEXT_REPORT/report.css create mode 100644 docs/persist/DBDocs/package body/WT_TEXT_REPORT/report.js create mode 100644 docs/persist/DBDocs/package body/WT_TEXT_REPORT/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/package body/WT_TEXT_REPORT/topDimTabL.gif create mode 100644 docs/persist/DBDocs/package body/WT_TEXT_REPORT/topDimTabR.gif create mode 100644 docs/persist/DBDocs/package body/WT_TEXT_REPORT/topTabBg.gif create mode 100644 docs/persist/DBDocs/package body/WT_TEXT_REPORT/topTabL.gif create mode 100644 docs/persist/DBDocs/package body/WT_TEXT_REPORT/topTabR.gif create mode 100644 docs/persist/DBDocs/package body/index.html create mode 100644 docs/persist/DBDocs/package/WTPLSQL.html create mode 100644 docs/persist/DBDocs/package/WTPLSQL/headerBg.jpg create mode 100644 docs/persist/DBDocs/package/WTPLSQL/report.css create mode 100644 docs/persist/DBDocs/package/WTPLSQL/report.js create mode 100644 docs/persist/DBDocs/package/WTPLSQL/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/package/WTPLSQL/topDimTabL.gif create mode 100644 docs/persist/DBDocs/package/WTPLSQL/topDimTabR.gif create mode 100644 docs/persist/DBDocs/package/WTPLSQL/topTabBg.gif create mode 100644 docs/persist/DBDocs/package/WTPLSQL/topTabL.gif create mode 100644 docs/persist/DBDocs/package/WTPLSQL/topTabR.gif create mode 100644 docs/persist/DBDocs/package/WT_ASSERT.html create mode 100644 docs/persist/DBDocs/package/WT_ASSERT/headerBg.jpg create mode 100644 docs/persist/DBDocs/package/WT_ASSERT/report.css create mode 100644 docs/persist/DBDocs/package/WT_ASSERT/report.js create mode 100644 docs/persist/DBDocs/package/WT_ASSERT/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/package/WT_ASSERT/topDimTabL.gif create mode 100644 docs/persist/DBDocs/package/WT_ASSERT/topDimTabR.gif create mode 100644 docs/persist/DBDocs/package/WT_ASSERT/topTabBg.gif create mode 100644 docs/persist/DBDocs/package/WT_ASSERT/topTabL.gif create mode 100644 docs/persist/DBDocs/package/WT_ASSERT/topTabR.gif create mode 100644 docs/persist/DBDocs/package/WT_PROFILER.html create mode 100644 docs/persist/DBDocs/package/WT_PROFILER/headerBg.jpg create mode 100644 docs/persist/DBDocs/package/WT_PROFILER/report.css create mode 100644 docs/persist/DBDocs/package/WT_PROFILER/report.js create mode 100644 docs/persist/DBDocs/package/WT_PROFILER/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/package/WT_PROFILER/topDimTabL.gif create mode 100644 docs/persist/DBDocs/package/WT_PROFILER/topDimTabR.gif create mode 100644 docs/persist/DBDocs/package/WT_PROFILER/topTabBg.gif create mode 100644 docs/persist/DBDocs/package/WT_PROFILER/topTabL.gif create mode 100644 docs/persist/DBDocs/package/WT_PROFILER/topTabR.gif create mode 100644 docs/persist/DBDocs/package/WT_RESULT.html create mode 100644 docs/persist/DBDocs/package/WT_RESULT/headerBg.jpg create mode 100644 docs/persist/DBDocs/package/WT_RESULT/report.css create mode 100644 docs/persist/DBDocs/package/WT_RESULT/report.js create mode 100644 docs/persist/DBDocs/package/WT_RESULT/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/package/WT_RESULT/topDimTabL.gif create mode 100644 docs/persist/DBDocs/package/WT_RESULT/topDimTabR.gif create mode 100644 docs/persist/DBDocs/package/WT_RESULT/topTabBg.gif create mode 100644 docs/persist/DBDocs/package/WT_RESULT/topTabL.gif create mode 100644 docs/persist/DBDocs/package/WT_RESULT/topTabR.gif create mode 100644 docs/persist/DBDocs/package/WT_TEST_RUN_STAT.html create mode 100644 docs/persist/DBDocs/package/WT_TEST_RUN_STAT/headerBg.jpg create mode 100644 docs/persist/DBDocs/package/WT_TEST_RUN_STAT/report.css create mode 100644 docs/persist/DBDocs/package/WT_TEST_RUN_STAT/report.js create mode 100644 docs/persist/DBDocs/package/WT_TEST_RUN_STAT/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/package/WT_TEST_RUN_STAT/topDimTabL.gif create mode 100644 docs/persist/DBDocs/package/WT_TEST_RUN_STAT/topDimTabR.gif create mode 100644 docs/persist/DBDocs/package/WT_TEST_RUN_STAT/topTabBg.gif create mode 100644 docs/persist/DBDocs/package/WT_TEST_RUN_STAT/topTabL.gif create mode 100644 docs/persist/DBDocs/package/WT_TEST_RUN_STAT/topTabR.gif create mode 100644 docs/persist/DBDocs/package/WT_TEXT_REPORT.html create mode 100644 docs/persist/DBDocs/package/WT_TEXT_REPORT/headerBg.jpg create mode 100644 docs/persist/DBDocs/package/WT_TEXT_REPORT/report.css create mode 100644 docs/persist/DBDocs/package/WT_TEXT_REPORT/report.js create mode 100644 docs/persist/DBDocs/package/WT_TEXT_REPORT/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/package/WT_TEXT_REPORT/topDimTabL.gif create mode 100644 docs/persist/DBDocs/package/WT_TEXT_REPORT/topDimTabR.gif create mode 100644 docs/persist/DBDocs/package/WT_TEXT_REPORT/topTabBg.gif create mode 100644 docs/persist/DBDocs/package/WT_TEXT_REPORT/topTabL.gif create mode 100644 docs/persist/DBDocs/package/WT_TEXT_REPORT/topTabR.gif create mode 100644 docs/persist/DBDocs/package/index.html create mode 100644 docs/persist/DBDocs/round_text.png create mode 100644 docs/persist/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER.html create mode 100644 docs/persist/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/headerBg.jpg create mode 100644 docs/persist/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/report.css create mode 100644 docs/persist/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/report.js create mode 100644 docs/persist/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topDimTabL.gif create mode 100644 docs/persist/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topDimTabR.gif create mode 100644 docs/persist/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topTabBg.gif create mode 100644 docs/persist/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topTabL.gif create mode 100644 docs/persist/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topTabR.gif create mode 100644 docs/persist/DBDocs/sequence/WT_TEST_RUNS_SEQ.html create mode 100644 docs/persist/DBDocs/sequence/WT_TEST_RUNS_SEQ/headerBg.jpg create mode 100644 docs/persist/DBDocs/sequence/WT_TEST_RUNS_SEQ/report.css create mode 100644 docs/persist/DBDocs/sequence/WT_TEST_RUNS_SEQ/report.js create mode 100644 docs/persist/DBDocs/sequence/WT_TEST_RUNS_SEQ/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/sequence/WT_TEST_RUNS_SEQ/topDimTabL.gif create mode 100644 docs/persist/DBDocs/sequence/WT_TEST_RUNS_SEQ/topDimTabR.gif create mode 100644 docs/persist/DBDocs/sequence/WT_TEST_RUNS_SEQ/topTabBg.gif create mode 100644 docs/persist/DBDocs/sequence/WT_TEST_RUNS_SEQ/topTabL.gif create mode 100644 docs/persist/DBDocs/sequence/WT_TEST_RUNS_SEQ/topTabR.gif create mode 100644 docs/persist/DBDocs/sequence/index.html create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_DATA.html create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_DATA/headerBg.jpg create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_DATA/report.css create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_DATA/report.js create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_DATA/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_DATA/topDimTabL.gif create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_DATA/topDimTabR.gif create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_DATA/topTabBg.gif create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_DATA/topTabL.gif create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_DATA/topTabR.gif create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_RUNS.html create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_RUNS/headerBg.jpg create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_RUNS/report.css create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_RUNS/report.js create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_RUNS/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_RUNS/topDimTabL.gif create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_RUNS/topDimTabR.gif create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_RUNS/topTabBg.gif create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_RUNS/topTabL.gif create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_RUNS/topTabR.gif create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_UNITS.html create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_UNITS/headerBg.jpg create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_UNITS/report.css create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_UNITS/report.js create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_UNITS/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_UNITS/topDimTabL.gif create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_UNITS/topDimTabR.gif create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_UNITS/topTabBg.gif create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_UNITS/topTabL.gif create mode 100644 docs/persist/DBDocs/table/PLSQL_PROFILER_UNITS/topTabR.gif create mode 100644 docs/persist/DBDocs/table/WT_DBOUT_PROFILES.html create mode 100644 docs/persist/DBDocs/table/WT_DBOUT_PROFILES/headerBg.jpg create mode 100644 docs/persist/DBDocs/table/WT_DBOUT_PROFILES/report.css create mode 100644 docs/persist/DBDocs/table/WT_DBOUT_PROFILES/report.js create mode 100644 docs/persist/DBDocs/table/WT_DBOUT_PROFILES/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/table/WT_DBOUT_PROFILES/topDimTabL.gif create mode 100644 docs/persist/DBDocs/table/WT_DBOUT_PROFILES/topDimTabR.gif create mode 100644 docs/persist/DBDocs/table/WT_DBOUT_PROFILES/topTabBg.gif create mode 100644 docs/persist/DBDocs/table/WT_DBOUT_PROFILES/topTabL.gif create mode 100644 docs/persist/DBDocs/table/WT_DBOUT_PROFILES/topTabR.gif create mode 100644 docs/persist/DBDocs/table/WT_RESULTS.html create mode 100644 docs/persist/DBDocs/table/WT_RESULTS/headerBg.jpg create mode 100644 docs/persist/DBDocs/table/WT_RESULTS/report.css create mode 100644 docs/persist/DBDocs/table/WT_RESULTS/report.js create mode 100644 docs/persist/DBDocs/table/WT_RESULTS/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/table/WT_RESULTS/topDimTabL.gif create mode 100644 docs/persist/DBDocs/table/WT_RESULTS/topDimTabR.gif create mode 100644 docs/persist/DBDocs/table/WT_RESULTS/topTabBg.gif create mode 100644 docs/persist/DBDocs/table/WT_RESULTS/topTabL.gif create mode 100644 docs/persist/DBDocs/table/WT_RESULTS/topTabR.gif create mode 100644 docs/persist/DBDocs/table/WT_SELF_TEST.html create mode 100644 docs/persist/DBDocs/table/WT_SELF_TEST/headerBg.jpg create mode 100644 docs/persist/DBDocs/table/WT_SELF_TEST/report.css create mode 100644 docs/persist/DBDocs/table/WT_SELF_TEST/report.js create mode 100644 docs/persist/DBDocs/table/WT_SELF_TEST/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/table/WT_SELF_TEST/topDimTabL.gif create mode 100644 docs/persist/DBDocs/table/WT_SELF_TEST/topDimTabR.gif create mode 100644 docs/persist/DBDocs/table/WT_SELF_TEST/topTabBg.gif create mode 100644 docs/persist/DBDocs/table/WT_SELF_TEST/topTabL.gif create mode 100644 docs/persist/DBDocs/table/WT_SELF_TEST/topTabR.gif create mode 100644 docs/persist/DBDocs/table/WT_TESTCASE_STATS.html create mode 100644 docs/persist/DBDocs/table/WT_TESTCASE_STATS/headerBg.jpg create mode 100644 docs/persist/DBDocs/table/WT_TESTCASE_STATS/report.css create mode 100644 docs/persist/DBDocs/table/WT_TESTCASE_STATS/report.js create mode 100644 docs/persist/DBDocs/table/WT_TESTCASE_STATS/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/table/WT_TESTCASE_STATS/topDimTabL.gif create mode 100644 docs/persist/DBDocs/table/WT_TESTCASE_STATS/topDimTabR.gif create mode 100644 docs/persist/DBDocs/table/WT_TESTCASE_STATS/topTabBg.gif create mode 100644 docs/persist/DBDocs/table/WT_TESTCASE_STATS/topTabL.gif create mode 100644 docs/persist/DBDocs/table/WT_TESTCASE_STATS/topTabR.gif create mode 100644 docs/persist/DBDocs/table/WT_TEST_RUNS.html create mode 100644 docs/persist/DBDocs/table/WT_TEST_RUNS/headerBg.jpg create mode 100644 docs/persist/DBDocs/table/WT_TEST_RUNS/report.css create mode 100644 docs/persist/DBDocs/table/WT_TEST_RUNS/report.js create mode 100644 docs/persist/DBDocs/table/WT_TEST_RUNS/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/table/WT_TEST_RUNS/topDimTabL.gif create mode 100644 docs/persist/DBDocs/table/WT_TEST_RUNS/topDimTabR.gif create mode 100644 docs/persist/DBDocs/table/WT_TEST_RUNS/topTabBg.gif create mode 100644 docs/persist/DBDocs/table/WT_TEST_RUNS/topTabL.gif create mode 100644 docs/persist/DBDocs/table/WT_TEST_RUNS/topTabR.gif create mode 100644 docs/persist/DBDocs/table/WT_TEST_RUN_STATS.html create mode 100644 docs/persist/DBDocs/table/WT_TEST_RUN_STATS/headerBg.jpg create mode 100644 docs/persist/DBDocs/table/WT_TEST_RUN_STATS/report.css create mode 100644 docs/persist/DBDocs/table/WT_TEST_RUN_STATS/report.js create mode 100644 docs/persist/DBDocs/table/WT_TEST_RUN_STATS/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/table/WT_TEST_RUN_STATS/topDimTabL.gif create mode 100644 docs/persist/DBDocs/table/WT_TEST_RUN_STATS/topDimTabR.gif create mode 100644 docs/persist/DBDocs/table/WT_TEST_RUN_STATS/topTabBg.gif create mode 100644 docs/persist/DBDocs/table/WT_TEST_RUN_STATS/topTabL.gif create mode 100644 docs/persist/DBDocs/table/WT_TEST_RUN_STATS/topTabR.gif create mode 100644 docs/persist/DBDocs/table/WT_VERSION.html create mode 100644 docs/persist/DBDocs/table/WT_VERSION/headerBg.jpg create mode 100644 docs/persist/DBDocs/table/WT_VERSION/report.css create mode 100644 docs/persist/DBDocs/table/WT_VERSION/report.js create mode 100644 docs/persist/DBDocs/table/WT_VERSION/topDimTabBg.gif create mode 100644 docs/persist/DBDocs/table/WT_VERSION/topDimTabL.gif create mode 100644 docs/persist/DBDocs/table/WT_VERSION/topDimTabR.gif create mode 100644 docs/persist/DBDocs/table/WT_VERSION/topTabBg.gif create mode 100644 docs/persist/DBDocs/table/WT_VERSION/topTabL.gif create mode 100644 docs/persist/DBDocs/table/WT_VERSION/topTabR.gif create mode 100644 docs/persist/DBDocs/table/index.html create mode 100644 docs/persist/ER_Diagrams.pdf create mode 100644 docs/persist/README.md delete mode 100644 src/persist/wt_profiler_stats.tab delete mode 100644 src/persist/wt_profiler_stats_vw.vw delete mode 100644 src/persist/wt_test_run_stats.tab delete mode 100644 src/persist/wt_test_run_stats_vw.vw rename src/persist/{wt_testcase_stats_vw.vw => wt_testcase_runs_vw.vw} (98%) diff --git a/docs/stats_gui/README.md b/docs/gui/README.md similarity index 100% rename from docs/stats_gui/README.md rename to docs/gui/README.md diff --git a/docs/stats_gui/README.txt b/docs/gui/README.txt similarity index 100% rename from docs/stats_gui/README.txt rename to docs/gui/README.txt diff --git a/docs/stats_gui/_config.yml b/docs/gui/_config.yml similarity index 100% rename from docs/stats_gui/_config.yml rename to docs/gui/_config.yml diff --git a/docs/stats_gui/md-to-htm.bat b/docs/gui/md-to-htm.bat similarity index 100% rename from docs/stats_gui/md-to-htm.bat rename to docs/gui/md-to-htm.bat diff --git a/docs/stats_gui/md-to-htm.lua b/docs/gui/md-to-htm.lua similarity index 100% rename from docs/stats_gui/md-to-htm.lua rename to docs/gui/md-to-htm.lua diff --git a/docs/persist/Call_Tree_Diagrams.odg b/docs/persist/Call_Tree_Diagrams.odg new file mode 100644 index 0000000000000000000000000000000000000000..8da667664280d54b7fd93976a9144f657d06f21c GIT binary patch literal 27281 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ℜ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 B*mnQ` literal 0 HcmV?d00001 diff --git a/docs/persist/Call_Tree_Diagrams.pdf b/docs/persist/Call_Tree_Diagrams.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f3ebd38b5858daaf03d716e5f69b6812b5802a95 GIT binary patch literal 364558 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

      4|+r^Wsc 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
      xiP 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%0AbY;58D&Z9FVNAMpNfK2RwE`$FnX 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

      WTP

      +Tables +Packages +Package Bodies +Sequences + + \ No newline at end of file diff --git a/docs/persist/DBDocs/package body/WTPLSQL.html b/docs/persist/DBDocs/package body/WTPLSQL.html new file mode 100644 index 0000000..e70c1f3 --- /dev/null +++ b/docs/persist/DBDocs/package body/WTPLSQL.html @@ -0,0 +1,788 @@ + + + + + + + +

      Ao2(6r>!5F*eGgv6%?UfnOH@ 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�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�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%0Dx6 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 G!T&#hr#v_S literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/dbdoc.css b/docs/persist/DBDocs/dbdoc.css new file mode 100644 index 0000000..d3a861e --- /dev/null +++ b/docs/persist/DBDocs/dbdoc.css @@ -0,0 +1,151 @@ +img { + border: 0; +} + +* { + font-size: 9pt; + font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif; +} + +body { + background-color: #fff; + font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif; + margin: 5px; +} + +#top_left, #bottom_left { + margin: 0px; +} + +td, body, p, div, span { + font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif; + font-size: 9pt; + color: #000; +} + +a:link, a:visited { + color: #2B7C92; + text-decoration: underline; +} + +a:active, a:hover { + color: red; +} + +td { + empty-cells: show; + border-collapse: collapse; +} + +iframe { + border: 1px solid black; +} + +br { + clear: both !important; +} + +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} +/* Hides from IE-mac \*/ +* html .clearfix { + height: 1%; +} +/* End hide from IE-mac */ +table { + border-spacing: 0; + empty-cells: show; +} + +table th { + color: #2b7c92 !important; + white-space: nowrap; + padding: 2px 8px; + background-color: #cfe0f1 !important; + background-image: none !important; + color: #2b7c92 !important; + font-size: 11px; + letter-spacing: 1; + text-decoration: underline; + cursor: pointer; +} + +table td { + background: none; + border-top: 1px #fff solid; + border-bottom: 1px #ccc solid; + font-size: 8pt; + padding: 3px 9px; + empty-cells: show; + background-color: #f2f2f5 !important +} + +#bottom_left h2 { + text-align: center; + padding: 4px 0; + background: #CFE0F1; + color: #2B7C92; + font-size: 1.2em; +} + +#top_left h2 { + text-align: center; + padding: 4px 0; + background: #CFE0F1; + color: #2B7C92; + font-size: 1.2em; +} + +#top_left a, #bottom_left a { + display: block; + font-size: 8pt; + padding: 2px 8px; +} + +#top_left a:hover, #bottom_left a:hover, #top_left .current, #bottom_left .current { + background: #CFE0F1; + color: #2B7C92; +} + +#header { + background-image: url(headerBg.jpg); + background-repeat: repeat-x; + padding: 5px 5px 0 5px; + margin: 0 0 15px 0; +} + +body.object { + margin: 0; +} + +body.object h2 { + color: #fff; + font-size: 2em; +} + +#loading { + text-align: center; +} + +#search { + line-height: 25px; + vertical-align: middle; + background-position: center center; + background-image: url('round_text.png'); + height: 25px; + background-repeat: no-repeat; + vertical-align: center; +} + +#search input { + line-height: 25px; + vertical-align: middle; + border: none; + height: 22px; + margin: 2px; +} \ No newline at end of file diff --git a/docs/persist/DBDocs/dbdoc.js b/docs/persist/DBDocs/dbdoc.js new file mode 100644 index 0000000..5f49736 --- /dev/null +++ b/docs/persist/DBDocs/dbdoc.js @@ -0,0 +1,409 @@ +function $x(pNd){ + var lThis; + switch(typeof (pNd)){ + case 'string':lThis = document.getElementById(pNd);break; + case 'object':lThis = pNd;break; + default:return false;break; + } + return (lThis.nodeType == 1)?lThis:false; +} + +function $u_Narray(pNd){return (pNd.length == 1)?pNd[0]:pNd;} +function $u_Carray(pNd){return ($x(pNd))?[pNd]:pNd;} + +function $x_Class(pNd,pClass){ + if($x(pNd)){pNd = [pNd];} + var l=pNd.length; + for(var i=0;i 2) ? argv[2] : null; + var path = (argc > 3) ? argv[3] : null; + var domain = (argc > 4) ? argv[4] : null; + var secure = (argc > 5) ? true : false; + document.cookie = pName + "=" + escape (pValue) + + ((expires === null) ? "" : ("; expires=" + expires.toGMTString())) + + ((path === null) ? "" : ("; path=" + path)) + + ((domain === null) ? "" : ("; domain=" + domain)) + + ((secure === true) ? "; secure" : ""); +} + + + +function $h(pThis,pThat){ + $x('current').id = ''; + pThis.parentNode.parentNode.id = 'current'; + $d_TabClick(pThis,pThat); + SetCookie ('dbdoc_tab',pThis.id+':'+pThat); +} + +function $init(pThis,pThat){ + var lCook = GetCookie ('dbdoc_tab',pThis.id); + if(!!lCook){ + var lArray = lCook.split(":"); + if($x(lArray[0])){$h($x(lArray[0]),lArray[1]);} + else{$h($x(pThis),pThat);} + }else{ + $h($x(pThis),pThat); + } + $x_Hide('loading'); + $x_Show('tab-panes'); +} + +function html_GetTarget(e){ + var targ,lEvt; + if(!e){e = window.event;} + if(e.target){targ = e.target;} + else if(e.srcElement){targ = e.srcElement;} + if(targ.nodeType == 3){targ = targ.parentNode;}// defeat Safari bug + return targ; +} + +function $d(pThis){ + $x_SetSiblingsClass($x(pThis),'','current'); + parent.ObjectDetailsFrame.location = pThis +'_details.html'; +} + +function $n(pThis){ + $x_SetSiblingsClass($x(pThis),'','current'); + parent.ObjectDetailsFrame.location = 'about:blank'; + parent.DBObjectsFrame.location = pThis +'/index.html'; +} + +var gRegex=false; +function $d_Find(pThis,pString,pTags,pClass){ + if(!pTags){pTags = 'DIV';} + pThis = $x(pThis); + if(pThis){ + var d=pThis.getElementsByTagName(pTags); + pThis.style.display="none"; + if(!gRegex){gRegex =new RegExp("test");} + gRegex.compile(pString,"i"); + for(var i=0,len=d.length ;i 0 && + (elementClassName == className || + new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName) + )); +} + +function addClassName(element, className) { + if (!hasClassName(element, className)) { + element.className += (element.className ? ' ' : '') + className; + } + return element; +} + +function removeClassName(element, className) { + if (hasClassName(element, className)) { + // Replace className and surrounding whitespace to single space + // Then remove leading and trailing whitespace + element.className = element.className.replace( + new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').replace(/^\s+/, '').replace(/\s+$/, '') + } + return element; +} + +function toggleBranch(anEvent) { + var branch, subBranches; + branch = getEventTarget(anEvent); + // If user clicks in area to left of tree (background UL area), + // we don't want to do anything + // FIXME: BUT what about clicking to left of sub list & target + // being parent LI + if ("UL" == branch.tagName || + "OL" == branch.tagName) { + return; + } + // We expect branch to be a li, but Chrome treats click on li icon as + // clicking on it's content (even though icon is "outside") so need to + // do some tweaking here + while ("LI" != branch.tagName && branch.parentNode) { + branch = branch.parentNode; + } + if ("LI" == branch.tagName) { + subBranches = branch.getElementsByTagName("ul"); + if (subBranches.length > 0) { + var subBranch = subBranches[0]; + if (subBranch.style.display == "block") { + subBranch.style.display = "none"; + removeClassName(branch, "expanded"); + addClassName(branch, "collapsed"); + } else { + subBranch.style.display = "block"; + removeClassName(branch, "collapsed"); + addClassName(branch, "expanded"); + } + } + } +} + +function addEventListener(anElement, anEventName, anEventHandler) { + if (anElement.addEventListener) { + anElement.addEventListener(anEventName, anEventHandler, false); + } else if (tree.attachEvent) { + ieEventName = "on" + anEventName; // MS IE different (of course) + anElement.attachEvent(ieEventName, anEventHandler); + } +} + +function activateTree(tree) { + // Collapse (hide) the tree branches + var branches = tree.getElementsByTagName("ul"); + for (var i=0; i < branches.length; i++) { + branches[i].style.display="none"; + } + // Style the items (see dbdoc.css) + var items = tree.getElementsByTagName("li"); + for (var i=0; i < items.length; i++) { + if (items[i].getElementsByTagName("li").length > 0) { + addClassName(items[i], "collapsed"); + } else { + addClassName(items[i], "noChildren"); + } + } + addEventListener(tree, "click", toggleBranch); +} + +function initializeTrees() { + var trees = document.getElementsByName("Tree"); + for (var idx = 0; idx < trees.length; idx++) { + activateTree(trees[idx]); + } +} + +//=============== +// Frame Loaders +//=============== + +//http://stackoverflow.com/questions/984510/what-is-my-script-src-url/984656#984656 +var scriptSource = (function(scripts) { + var scripts = document.getElementsByTagName('script'), + script = scripts[scripts.length - 1]; + + return (script.getAttribute.length !== undefined) ? + //FF/Chrome/Safari + script.src : //(only FYI, this would work also in IE8) + //IE 6/7/8 + script.getAttribute('src', 4); //using 4 (and not -1) see MSDN http://msdn.microsoft.com/en-us/library/ms536429(VS.85).aspx +}()); +// Now that we know where we are, compose URL fo empty.html (which should +// be in the same directory as this script) +var emptyHtml = scriptSource.substr(0, scriptSource.length - 8) + "empty.html"; + +function loadDBObjects(src) { + parent.DBObjectsFrame.location.href = src; +} + +function loadDetails(src) { + parent.ObjectDetailsFrame.location.href = src; +} + +function loadChildren(src) { + parent.ObjectDetailsChildrenFrame.location.href = src; +} + +function loadDependentFrames() { + var found = false; + // ObjectsFrame + // ObjectTypeFrame + // DBObjectsFrame + if (window.name == "ObjectsFrame") { + for (idx = 0; idx < document.links.length; idx++) { + if (document.links[idx].target == "ObjectDetailsFrame") { + loadDetails(document.links[idx].href); + found = true; + break; + } + } + if (!found) { + loadDetails(emptyHtml); + } + } else if (window.name == "ObjectTypeFrame") { + for (idx = 0; idx < document.links.length; idx++) { + if (document.links[idx].target == "DBObjectsFrame") { + loadDBObjects(document.links[idx].href); + found = true; + break; + } + } + if (!found) { + loadChildren(emptyHtml); + } + } else if (window.name == "DBObjectsFrame") { + for (idx = 0; idx < document.links.length; idx++) { + if (document.links[idx].target == "ObjectDetailsFrame") { + loadDetails(document.links[idx].href); + found = true; + break; + } + } + if (!found) { + loadChildren(emptyHtml); + } + } else if (window.name == "ObjectDetailsFrame") { + for (idx = 0; idx < document.links.length; idx++) { + if (document.links[idx].target == "ObjectDetailsChildrenFrame") { + loadChildren(document.links[idx].href); + found = true; + break; + } + } + if (!found) { + loadChildren(emptyHtml); + } + } +} + +// Initialization +function addLoadEventListener(func) { + var prevOnLoad = window.onload; + if (typeof window.onload != 'function') { + // That is, not defined yet + window.onload = func; + } else { + window.onload = function() { + if (prevOnLoad) { + prevOnLoad(); + } + func(); + } + } +} +addLoadEventListener(initializeTrees); +addLoadEventListener(loadDependentFrames); diff --git a/docs/persist/DBDocs/empty.html b/docs/persist/DBDocs/empty.html new file mode 100644 index 0000000..736f5f3 --- /dev/null +++ b/docs/persist/DBDocs/empty.html @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/persist/DBDocs/index.html b/docs/persist/DBDocs/index.html new file mode 100644 index 0000000..729eb44 --- /dev/null +++ b/docs/persist/DBDocs/index.html @@ -0,0 +1,19 @@ + + + + + + + + + + <H2> + Frame Alert</H2> + <P> + This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. + <BR> + + + + + diff --git a/docs/persist/DBDocs/nodeTypes.html b/docs/persist/DBDocs/nodeTypes.html new file mode 100644 index 0000000..710bc57 --- /dev/null +++ b/docs/persist/DBDocs/nodeTypes.html @@ -0,0 +1,14 @@ + + + + + + + +

    + +
    +
    +
    +
    +

    Doc

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Code

    +
    +
    +
    +
    +
    +
    +
    + +


    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMEWTPLSQL
    SUBOBJECT_NAMEnull
    OBJECT_ID41930
    DATA_OBJECT_IDnull
    OBJECT_TYPEPACKAGE BODY
    CREATED29-JUN-2018 15:09:15
    LAST_DDL_TIME29-JUN-2018 15:21:16
    TIMESTAMP2018-06-29:15:21:16
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE2
    EDITION_NAMEnull
    +
    +
    +
    +
    + + + + + + + + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    EXECUTEPUBLICNOWTPWTPLSQL
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    +
    +package body wtplsql
    +as
    +
    +   C_KEEP_NUM_RECS  number := 20;
    +
    +   g_test_runs_rec   wt_test_runs%ROWTYPE;
    +
    +   $IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +   $THEN
    +      TYPE test_all_aa_type is table of varchar2(400) index by varchar2(400);
    +      test_all_aa       test_all_aa_type;
    +      wtplsql_skip_test boolean := FALSE;
    +   $END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +----------------------
    +--  Private Procedures
    +----------------------
    +
    +
    +------------------------------------------------------------
    +-- This procedure is separated for internal WTPLSQL testing
    +procedure check_runner
    +is
    +   l_package_check        number;
    +begin
    +   -- These RAISEs can be captured because the Test Runs Record is set.
    +   --  Check for NULL Runner Name
    +   if g_test_runs_rec.runner_name is null
    +   then
    +      raise_application_error (-20001, 'RUNNER_NAME is null');
    +   end if;
    +   --  Check for Valid Runner Name
    +   select count(*) into l_package_check
    +    from  all_arguments
    +    where owner         = USER
    +     and  object_name   = 'WTPLSQL_RUN'
    +     and  package_name  = g_test_runs_rec.runner_name
    +     and  argument_name is null
    +     and  position      = 1
    +     and  sequence      = 0;
    +   if l_package_check != 1
    +   then
    +      raise_application_error (-20002, 'RUNNER_NAME "' ||
    +                           g_test_runs_rec.runner_name ||
    +                           '.WTPLSQL_RUN" is not valid');
    +   end if;
    +end check_runner;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_check_runner
    +   is
    +      l_save_test_runs_rec   wt_test_runs%ROWTYPE := g_test_runs_rec;
    +      l_msg_in   varchar2(4000);
    +      l_err_in   varchar2(4000);
    +      --------------------------------------  WTPLSQL Testing --
    +      procedure l_test_sqlerrm is begin
    +         -- Restore the G_TEST_RUNS_REC
    +         g_test_runs_rec := l_save_test_runs_rec;
    +         wt_assert.eq
    +                  (msg_in          => l_msg_in
    +                  ,check_this_in   => SQLERRM
    +                  ,against_this_in => l_err_in);
    +      end l_test_sqlerrm;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      -- This Test Case runs in the EXECUTE IMMEDAITE in the TEST_RUN
    +      --   procedure in this package.
    +      wt_assert.g_testcase := 'CHECK_RUNNER Sad Path 1';
    +      begin
    +         g_test_runs_rec.runner_name := '';
    +         l_msg_in := 'Null RUNNER_NAME';
    +         l_err_in := 'ORA-20001: RUNNER_NAME is null';
    +         check_runner;
    +         l_test_sqlerrm;
    +      exception when others then
    +         l_test_sqlerrm;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'CHECK_RUNNER Sad Path 2';
    +      begin
    +         g_test_runs_rec.runner_name := 'BOGUS';
    +         l_msg_in := 'Invalid RUNNER_NAME';
    +         l_err_in := 'ORA-20002: RUNNER_NAME "BOGUS.WTPLSQL_RUN" is not valid';
    +         check_runner;
    +         l_test_sqlerrm;
    +      exception when others then
    +         l_test_sqlerrm;
    +      end;
    +   end t_check_runner;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure insert_test_run
    +is
    +   PRAGMA AUTONOMOUS_TRANSACTION;
    +   l_wt_test_runs_recNULL  wt_test_runs%ROWTYPE;
    +begin
    +   if g_test_runs_rec.id is null
    +   then
    +      return;
    +   end if;
    +   g_test_runs_rec.end_dtm := systimestamp;
    +   insert into wt_test_runs values g_test_runs_rec;
    +   g_test_runs_rec := l_wt_test_runs_recNULL;
    +   COMMIT;
    +exception
    +   when OTHERS
    +   then
    +      DBMS_OUTPUT.PUT_LINE(dbms_utility.format_error_stack ||
    +                           dbms_utility.format_error_backtrace);
    +end insert_test_run;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_insert_test_run
    +   is
    +      --------------------------------------  WTPLSQL Testing --
    +      TYPE l_dbmsout_buff_type is table of varchar2(32767);
    +      l_dbmsout_buff   l_dbmsout_buff_type := l_dbmsout_buff_type(1);
    +      l_test_runs_rec  wt_test_runs%ROWTYPE;
    +      l_dbmsout_line   varchar2(32767);
    +      l_dbmsout_stat   number;
    +      l_num_recs       number;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'INSERT_TEST_RUN Happy Path 1';
    +      l_test_runs_rec := g_test_runs_rec;
    +      insert_test_run;
    +      g_test_runs_rec := l_test_runs_rec;
    +      wt_assert.eqqueryvalue (
    +         msg_in           => 'Number of Records',
    +         check_query_in   => 'select count(*) from wt_test_runs' ||
    +                             ' where id = ' || l_test_runs_rec.id,
    +         against_value_in => 1);
    +      --------------------------------------  WTPLSQL Testing --
    +      delete from wt_test_runs
    +       where id = l_test_runs_rec.id;
    +      COMMIT;
    +      wt_assert.eqqueryvalue (
    +         msg_in           => 'Records After Delete',
    +         check_query_in   => 'select count(*) from wt_test_runs' ||
    +                             ' where id = ' || l_test_runs_rec.id,
    +         against_value_in => 0);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'INSERT_TEST_RUN Sad Path 1';
    +      -- Save/Clear the DBMS_OUPTUT Buffer
    +      loop
    +         DBMS_OUTPUT.GET_LINE (
    +            line   => l_dbmsout_line,
    +            status => l_dbmsout_stat);
    +         exit when l_dbmsout_stat != 0;
    +         l_dbmsout_buff(l_dbmsout_buff.COUNT) := l_dbmsout_line;
    +         l_dbmsout_buff.extend;
    +      end loop;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in        => 'l_dbmsout_buff.COUNT - 1',
    +         check_this_in => l_dbmsout_buff.COUNT - 1);
    +      --------------------------------------  WTPLSQL Testing --
    +      select count(*) into l_num_recs from wt_test_runs;
    +      l_test_runs_rec := g_test_runs_rec;
    +      g_test_runs_rec.start_dtm := null;
    +      insert_test_run;
    +      g_test_runs_rec := l_test_runs_rec;
    +      wt_assert.eqqueryvalue (
    +         msg_in           => 'Number of Records should stay the same',
    +         check_query_in   => 'select count(*) from wt_test_runs',
    +         against_value_in => l_num_recs);
    +      --------------------------------------  WTPLSQL Testing --
    +      DBMS_OUTPUT.GET_LINE (
    +         line   => l_dbmsout_line,
    +         status => l_dbmsout_stat);
    +      wt_assert.eq (
    +         msg_in          => 'DBMS_OUTPUT Status',
    +         check_this_in   => l_dbmsout_stat,
    +         against_this_in => 0);
    +      --------------------------------------  WTPLSQL Testing --
    +      if wt_assert.last_pass
    +      then
    +         wt_assert.isnotnull (
    +            msg_in        => 'DBMS_OUTPUT Line',
    +            check_this_in => l_dbmsout_line);
    +         wt_assert.this (
    +            msg_in        => 'Confirm DBMS_OUTPUT Line text',
    +            check_this_in => (l_dbmsout_line like 'ORA-01400: cannot insert NULL into ("WTP"."WT_TEST_RUNS"."START_DTM")%'));
    +      --------------------------------------  WTPLSQL Testing --
    +         if not wt_assert.last_pass
    +         then
    +            -- No match, put the line back into DBMS_OUTPUT buffer and end this.
    +            DBMS_OUTPUT.PUT_LINE(l_dbmsout_line);
    +         end if;
    +      end if;
    +      --------------------------------------  WTPLSQL Testing --
    +      -- Restore the DBMS_OUPTUT Buffer
    +      for i in 1 .. l_dbmsout_buff.COUNT - 1
    +      loop
    +         DBMS_OUTPUT.PUT_LINE(l_dbmsout_buff(i));
    +      end loop;
    +      wt_assert.isnotnull (
    +         msg_in        => 'l_dbmsout_buff.COUNT - 1',
    +         check_this_in =>  l_dbmsout_buff.COUNT - 1);
    +   end t_insert_test_run;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +---------------------
    +--  Public Procedures
    +---------------------
    +
    +
    +------------------------------------------------------------
    +function show_version
    +   return varchar2
    +is
    +   ret_str  wt_version.text%TYPE;
    +begin
    +   select max(t1.text) into ret_str
    +    from  wt_version  t1
    +    where t1.install_dtm = (select max(t2.install_dtm)
    +                             from  wt_version  t2);
    +   return ret_str;
    +exception when NO_DATA_FOUND
    +then
    +   return '';
    +end show_version;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_show_version
    +   is
    +      existing_version   wt_version.text%TYPE;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Show Version Happy Path';
    +      existing_version := show_version;
    +      wt_assert.isnotnull (
    +         msg_in        => 'Test Existing Version',
    +         check_this_in => existing_version);
    +      --------------------------------------  WTPLSQL Testing --
    +      insert into wt_version (install_dtm, action, text)
    +         values (to_date('31-DEC-4000','DD-MON-YYYY'), 'TESTING', 'TESTING');
    +      wt_assert.eq (
    +         msg_in          => 'Test New Version',
    +         check_this_in   => show_version,
    +         against_this_in => 'TESTING');
    +      --------------------------------------  WTPLSQL Testing --
    +      rollback;
    +      wt_assert.eq (
    +         msg_in          => 'Return to Existing Version',
    +         check_this_in   => show_version,
    +         against_this_in => existing_version);
    +   end t_show_version;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure test_run
    +      (in_package_name  in  varchar2)
    +is
    +   l_test_runs_rec_NULL   wt_test_runs%ROWTYPE;
    +   l_error_stack          varchar2(32000);
    +   procedure concat_err_message is begin
    +      if g_test_runs_rec.error_message is not null
    +      then
    +         g_test_runs_rec.error_message := substr(l_error_stack || CHR(10)||
    +                                                 g_test_runs_rec.error_message
    +                                                ,1,4000);
    +      else
    +         g_test_runs_rec.error_message := l_error_stack;
    +      end if;
    +   end concat_err_message;
    +begin
    +   $IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +   $THEN
    +      -- This will avoid running the TEST_RUN procedure for some self-tests
    +      if wtplsql_skip_test
    +      then
    +         test_all_aa(in_package_name) := 'X';
    +         return;
    +      end if;
    +      --DBMS_OUTPUT.PUT_LINE('DEBUG WTPLSQL selftest Enabled for Test Runner "' || in_package_name || '"');
    +   $END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +   -- Reset the Test Runs Record before checking anything
    +   g_test_runs_rec               := l_test_runs_rec_NULL;
    +   g_test_runs_rec.id            := wt_test_runs_seq.nextval;
    +   g_test_runs_rec.start_dtm     := systimestamp;
    +   g_test_runs_rec.runner_owner  := USER;
    +   g_test_runs_rec.runner_name   := in_package_name;
    +   g_test_runs_rec.error_message := '';
    +   check_runner;
    +   -- Initialize
    +   delete_runs(in_runner_owner => g_test_runs_rec.runner_owner  -- Autonomous Transaction COMMIT
    +              ,in_runner_name  => g_test_runs_rec.runner_name);
    +   wt_assert.reset_globals;
    +   wt_test_run_stat.initialize;
    +   wt_result.initialize(g_test_runs_rec.id);
    +   wt_profiler.initialize(in_test_run_id      => g_test_runs_rec.id,
    +                          in_runner_name      => g_test_runs_rec.runner_name,
    +                          out_dbout_owner     => g_test_runs_rec.dbout_owner,
    +                          out_dbout_name      => g_test_runs_rec.dbout_name,
    +                          out_dbout_type      => g_test_runs_rec.dbout_type,
    +                          out_trigger_offset  => g_test_runs_rec.trigger_offset,
    +                          out_profiler_runid  => g_test_runs_rec.profiler_runid,
    +                          out_error_message   => l_error_stack);
    +   concat_err_message;
    +   -- Call the Test Runner
    +   begin
    +      execute immediate 'BEGIN ' || in_package_name || '.WTPLSQL_RUN; END;';
    +   exception
    +      when OTHERS
    +      then
    +         l_error_stack := dbms_utility.format_error_stack     ||
    +                          dbms_utility.format_error_backtrace ;
    +         concat_err_message;
    +   end;
    +
    +   -- Finalize
    +   insert_test_run;            -- Autonomous Transaction COMMIT
    +   wt_profiler.finalize;       -- Autonomous Transaction COMMIT
    +   wt_result.finalize;         -- Autonomous Transaction COMMIT
    +   wt_test_run_stat.finalize;  -- Autonomous Transaction COMMIT
    +
    +exception
    +   when OTHERS
    +   then
    +      l_error_stack := dbms_utility.format_error_stack     ||
    +                       dbms_utility.format_error_backtrace ;
    +      if g_test_runs_rec.id is null
    +      then
    +         DBMS_OUTPUT.PUT_LINE(l_error_stack);
    +         DBMS_OUTPUT.PUT_LINE('---------------------------');
    +         DBMS_OUTPUT.PUT_LINE(g_test_runs_rec.error_message);
    +      else
    +         concat_err_message;
    +         insert_test_run;    -- Autonomous Transaction COMMIT
    +      end if;
    +      wt_profiler.finalize;       -- Autonomous Transaction COMMIT
    +      wt_result.finalize;         -- Autonomous Transaction COMMIT
    +      wt_test_run_stat.finalize;  -- Autonomous Transaction COMMIT
    +
    +end test_run;
    +
    +--==============================================================--
    +-- No Unit Test for TEST_RUN.
    +--   Too complicated because testing occurs while the TEST_RUN
    +--   procedure is executing.  This also prevents 100% profiling.
    +--==============================================================--
    +
    +
    +------------------------------------------------------------
    +procedure test_all
    +is
    +   TYPE runners_nt_type is table of varchar2(128);
    +   l_runners_nt      runners_nt_type;
    +begin
    +   select package_name
    +     bulk collect into l_runners_nt
    +    from  user_arguments  t1
    +    where object_name = 'WTPLSQL_RUN'
    +     and  position    = 1
    +     and  sequence    = 0
    +     and  data_type   is null
    +     and  not exists (
    +          select 'x' from user_arguments  t2
    +           where t2.object_name = t1.object_name
    +            and  t2.position    > t1.position
    +            and  t2.sequence    > t1.sequence
    +            and  (   t2.overload is null
    +                  OR t2.overload = t1.overload)
    +          );
    +   for i in 1 .. l_runners_nt.COUNT
    +   loop
    +      test_run(l_runners_nt(i));
    +   end loop;
    +end test_all;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_test_all
    +   is
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'TEST_ALL Happy Path';
    +      test_all_aa.DELETE;
    +      wtplsql_skip_test := TRUE;
    +      -- TEST_ALL will populate the test_all_aa array
    +      wtplsql.test_all;
    +      wtplsql_skip_test := FALSE;
    +      -- This package should be in the test_all_aa array
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.this (
    +         msg_in        => 'test_all_aa.EXISTS(''WTPLSQL'')',
    +         check_this_in => test_all_aa.EXISTS('WTPLSQL'));
    +   end t_test_all;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure delete_runs
    +      (in_test_run_id  in number)
    +is
    +   PRAGMA AUTONOMOUS_TRANSACTION;
    +begin
    +   -- Profiler delete must be first because it contains a
    +   --    PRAGMA AUTONOMOUS_TRANSACTION
    +   wt_test_run_stat.delete_records(in_test_run_id);
    +   wt_profiler.delete_records(in_test_run_id);
    +   wt_result.delete_records(in_test_run_id);
    +   delete from wt_test_runs where id = in_test_run_id;
    +   COMMIT;
    +end delete_runs;
    +
    +procedure delete_runs
    +      (in_runner_owner  in varchar2
    +      ,in_runner_name   in varchar2)
    +is
    +   num_recs    number;
    +begin
    +   num_recs := 1;
    +   for buf2 in (select id from wt_test_runs
    +                 where runner_owner = in_runner_owner
    +                  and  runner_name  = in_runner_name
    +                 order by start_dtm desc, id desc)
    +   loop
    +      -- Keep the last 20 rest runs for this USER
    +      if num_recs > C_KEEP_NUM_RECS
    +      then
    +       -- Autonomous Transaction COMMIT
    +       delete_runs(buf2.id);
    +      end if;
    +      num_recs := num_recs + 1;
    +   end loop;
    +end delete_runs;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_delete_run_id
    +   is
    +      l_num_recs   number;
    +      l_err_stack  varchar2(32000);
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      --  DELETE_RECORDS has already run when we arrive here.
    +      -- Cleanup from previous test
    +      delete from wt_test_runs
    +        where id between 0-C_KEEP_NUM_RECS and 0-1;
    +      commit;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'DELETE_RUNS Happy Path 1';
    +      select count(*)
    +       into  l_num_recs
    +       from  wt_test_runs
    +       where runner_owner = USER
    +        and  runner_name  = g_test_runs_rec.runner_name;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in        => 'Number of Records Before Insert',
    +         check_this_in => l_num_recs);
    +      wt_assert.this (
    +         msg_in        => 'Number of Records Before Insert <= ' || C_KEEP_NUM_RECS,
    +         check_this_in => l_num_recs <= C_KEEP_NUM_RECS);
    +      --------------------------------------  WTPLSQL Testing --
    +      insert into wt_test_runs values g_test_runs_rec;
    +      COMMIT;
    +      wt_assert.eqqueryvalue (
    +         msg_in           => 'Number of Records After Insert',
    +         check_query_in   => 'select count(*) from wt_test_runs' ||
    +                             ' where id = ' || g_test_runs_rec.id,
    +         against_value_in => 1);
    +      delete_runs(g_test_runs_rec.id);  -- Autonomous Transaction
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eqqueryvalue (
    +         msg_in           => 'Number of Records After Delete',
    +         check_query_in   => 'select count(*) from wt_test_runs' ||
    +                             ' where id = ' || g_test_runs_rec.id,
    +         against_value_in => 0);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'DELETE_RUNS Happy Path 2';
    +      wt_assert.eqqueryvalue (
    +         msg_in           => 'Confirm number of records',
    +         check_query_in   => 'select count(*) from wt_test_runs' ||
    +                             ' where runner_owner = ''' || USER ||
    +                           ''' and runner_name = ''' || g_test_runs_rec.runner_name ||
    +                           '''',
    +         against_value_in => l_num_recs);
    +      --------------------------------------  WTPLSQL Testing --
    +      for i in 1 .. C_KEEP_NUM_RECS
    +      loop
    +         insert into wt_test_runs
    +               (id, start_dtm, runner_owner, runner_name)
    +            values
    +               (0-i, sysdate-7000-i, USER, g_test_runs_rec.runner_name);
    +      end loop;
    +      commit;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eqqueryvalue (
    +         msg_in           => 'Check Added ' || C_KEEP_NUM_RECS || ' records',
    +         check_query_in   => 'select count(*) from wt_test_runs' ||
    +                             ' where runner_owner = ''' || USER ||
    +                           ''' and runner_name = ''' || g_test_runs_rec.runner_name ||
    +                           '''',
    +         against_value_in => l_num_recs + C_KEEP_NUM_RECS);
    +      delete_runs(USER, g_test_runs_rec.runner_name);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eqqueryvalue (
    +         msg_in           => 'Check number of records reduced',
    +         check_query_in   => 'select count(*) from wt_test_runs' ||
    +                             ' where runner_owner = ''' || USER ||
    +                           ''' and runner_name = ''' || g_test_runs_rec.runner_name ||
    +                           '''',
    +         against_value_in => C_KEEP_NUM_RECS);
    +      delete from wt_test_runs
    +        where id between 0-C_KEEP_NUM_RECS and 0-1;
    +      commit;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eqqueryvalue (
    +         msg_in           => 'Confirm original number of records',
    +         check_query_in   => 'select count(*) from wt_test_runs' ||
    +                             ' where runner_owner = ''' || USER ||
    +                           ''' and runner_name = ''' || g_test_runs_rec.runner_name ||
    +                           '''',
    +         against_value_in => l_num_recs);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'DELETE_RUNS Sad Path 1';
    +      begin
    +         delete_runs(-9995);  -- Should run without error
    +         l_err_stack := dbms_utility.format_error_stack     ||
    +                        dbms_utility.format_error_backtrace ;
    +      exception when others then
    +         l_err_stack := dbms_utility.format_error_stack     ||
    +                        dbms_utility.format_error_backtrace ;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'Delete Runs(-9995)',
    +         check_this_in   => l_err_stack);
    +   end t_delete_run_id;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +--==============================================================--
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_test_runs_rec_and_table
    +   is
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'TEST_RUNS_REC_AND_TABLE Happy Path';
    +      -- This Test Case runs in the EXECUTE IMMEDAITE in the TEST_RUN
    +      --   procedure in this package.
    +      wt_assert.isnotnull
    +               (msg_in        => 'g_test_runs_rec.id'
    +               ,check_this_in => g_test_runs_rec.id);
    +      wt_assert.isnotnull
    +               (msg_in        => 'g_test_runs_rec.start_dtm'
    +               ,check_this_in => g_test_runs_rec.start_dtm);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull
    +               (msg_in        => 'g_test_runs_rec.runner_owner'
    +               ,check_this_in => g_test_runs_rec.runner_owner);
    +      wt_assert.eq
    +               (msg_in          => 'g_test_runs_rec.runner_name'
    +               ,check_this_in   => g_test_runs_rec.runner_name
    +               ,against_this_in => 'WTPLSQL');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull
    +               (msg_in        => 'g_test_runs_rec.dbout_owner'
    +               ,check_this_in => g_test_runs_rec.dbout_owner);
    +      wt_assert.isnull
    +               (msg_in          => 'g_test_runs_rec.dbout_name'
    +               ,check_this_in   => g_test_runs_rec.dbout_name);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull
    +               (msg_in          => 'g_test_runs_rec.dbout_type'
    +               ,check_this_in   => g_test_runs_rec.dbout_type);
    +      wt_assert.isnull
    +               (msg_in        => 'g_test_runs_rec.profiler_runid'
    +               ,check_this_in => g_test_runs_rec.profiler_runid);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull
    +               (msg_in        => 'g_test_runs_rec.end_dtm'
    +               ,check_this_in => g_test_runs_rec.end_dtm);
    +      wt_assert.isnull
    +               (msg_in        => 'g_test_runs_rec.error_message'
    +               ,check_this_in => g_test_runs_rec.error_message);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eqqueryvalue
    +               (msg_in             => 'TEST_RUNS Record for this TEST_RUN'
    +               ,check_query_in     => 'select count(*) from WT_TEST_RUNS' ||
    +                                      ' where id = ''' || g_test_runs_rec.id || ''''
    +               ,against_value_in   => 0);
    +   end t_test_runs_rec_and_table;
    +   ----------------------------------------
    +   procedure WTPLSQL_RUN
    +   is
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      t_show_version;
    +      t_check_runner;
    +      t_insert_test_run;
    +      t_test_all;
    +      t_delete_run_id;
    +      t_test_runs_rec_and_table;
    +   end;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +--==============================================================--
    +
    +
    +end wtplsql;
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/package body/WTPLSQL/headerBg.jpg b/docs/persist/DBDocs/package body/WTPLSQL/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 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 literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package body/WTPLSQL/topDimTabR.gif b/docs/persist/DBDocs/package body/WTPLSQL/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package body/WTPLSQL/topTabBg.gif b/docs/persist/DBDocs/package body/WTPLSQL/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package body/WTPLSQL/topTabR.gif b/docs/persist/DBDocs/package body/WTPLSQL/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + + +
    +
    +
    +

    Doc

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Code

    +
    +
    +
    +
    +
    +
    +
    + +

    See (public) RESET_GLOBALS procedure for default global values


    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMEWT_ASSERT
    SUBOBJECT_NAMEnull
    OBJECT_ID41932
    DATA_OBJECT_IDnull
    OBJECT_TYPEPACKAGE BODY
    CREATED29-JUN-2018 15:09:16
    LAST_DDL_TIME29-JUN-2018 15:21:16
    TIMESTAMP2018-06-29:15:21:16
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE2
    EDITION_NAMEnull
    +
    +
    +
    +
    + + + + + + + + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    EXECUTEPUBLICNOWTPWT_ASSERT
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    +
    +package body wt_assert is
    +
    +   -- See (public) RESET_GLOBALS procedure for default global values
    +   TYPE g_rec_type is record
    +      (last_pass        boolean
    +      ,raise_exception  boolean
    +      ,last_assert      wt_results.assertion%TYPE
    +      ,last_msg         wt_results.message%TYPE
    +      ,last_details     wt_results.details%TYPE);
    +   g_rec  g_rec_type;
    +
    +   $IF $$WTPLSQL_SELFTEST $THEN  ------%WTPLSQL_begin_ignore_lines%------
    +      temp_rowid1 CONSTANT rowid          := chartorowid('AAAFd1AAFAAAABSAA/');
    +      temp_rowid2 CONSTANT rowid          := chartorowid('AAAFd1AAFAAAABSAB/');
    +      temp_long1  CONSTANT long           := hextoraw('0123456789ABCDEF0123456789ABCDEF');
    +      temp_long2  CONSTANT long           := hextoraw('FEDCBA9876543210FEDCBA9876543210');
    +      temp_raw1   CONSTANT raw(2)         := hextoraw('2345');
    +      temp_raw2   CONSTANT raw(2)         := hextoraw('6789');
    +      temp_lraw1  CONSTANT long raw       := hextoraw('0123456789ABCDEF0123456789ABCDEF');
    +      temp_lraw2  CONSTANT long raw       := hextoraw('FEDCBA9876543210FEDCBA9876543210');
    +      temp_blob1           BLOB;
    +      temp_blob2  CONSTANT BLOB           := hextoraw('FEDCBA9876543210FEDCBA9876543210');
    +      --------------------------------------  WTPLSQL Testing --
    +      temp_nc1    CONSTANT NVARCHAR2(12)  := 'NCHAR1';
    +      temp_nc2    CONSTANT NVARCHAR2(12)  := 'NCHAR2';
    +      temp_bool   CONSTANT boolean        := NULL;
    +      temp_clob1           CLOB;
    +      temp_clob2  CONSTANT CLOB           := 'This is another clob.';
    +      temp_nclob1          NCLOB;
    +      temp_nclob2 CONSTANT NCLOB          := 'This is another clob.';
    +      temp_xml1            XMLTYPE;
    +      temp_xml2   CONSTANT XMLTYPE        := xmltype('<?xml version="1.0" encoding="UTF-8"?><note>2</note>');
    +      --------------------------------------  WTPLSQL Testing --
    +      temp_pint1  CONSTANT pls_integer    := 2;
    +      temp_pint2  CONSTANT pls_integer    := 3;
    +      temp_date   CONSTANT date           := sysdate;
    +      temp_tstmp  CONSTANT timestamp      := systimestamp;
    +      temp_tstlzn CONSTANT timestamp with local time zone := systimestamp;
    +      temp_tstzn  CONSTANT timestamp with time zone := systimestamp;
    +      temp_intds1 CONSTANT interval day to second   := interval '+01 01:01:01.001' day to second;
    +      temp_intds2 CONSTANT interval day to second   := interval '+02 02:02:02.002' day to second;
    +      temp_intym1 CONSTANT interval year to month   := interval '+01-01' year to month;
    +      temp_intym2 CONSTANT interval year to month   := interval '+02-02' year to month;
    +      --------------------------------------  WTPLSQL Testing --
    +      temp_rec          g_rec_type;
    +      temp_testcase     VARCHAR2(4000);
    +      wtplsql_skip_save boolean := FALSE;
    +   $END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +----------------------
    +--  Private Procedures
    +----------------------
    +
    +------------------------------------------------------------
    +function boolean_to_status
    +      (in_boolean  in boolean)
    +   return varchar2
    +is
    +begin
    +   if in_boolean is null
    +   then
    +      return '';
    +   elsif in_boolean
    +   then
    +      return 'TRUE';
    +   end if;
    +   return 'FALSE';
    +end boolean_to_status;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_boolean_to_status
    +   is
    +   begin
    +      wt_assert.g_testcase := 'BOOLEAN_TO_STATUS';
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq
    +         (msg_in            => 'Test for "TRUE" conversion'
    +         ,check_this_in     => boolean_to_status(TRUE)
    +         ,against_this_in   => 'TRUE');
    +      wt_assert.eq
    +         (msg_in            => 'Test for "FALSE" conversion'
    +         ,check_this_in     => boolean_to_status(FALSE)
    +         ,against_this_in   => 'FALSE');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull
    +         (msg_in            => 'Test for NULL'
    +         ,check_this_in     => boolean_to_status(temp_bool));
    +   end t_boolean_to_status;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure process_assertion
    +is
    +begin
    +
    +$IF $$WTPLSQL_SELFTEST $THEN  ------%WTPLSQL_begin_ignore_lines%------
    +   if not wtplsql_skip_save then
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +   wt_result.save
    +      (in_assertion      => g_rec.last_assert
    +      ,in_status         => case g_rec.last_pass
    +                            when TRUE then C_PASS
    +                                      else C_FAIL
    +                            end
    +      ,in_details        => g_rec.last_details
    +      ,in_testcase       => g_testcase
    +      ,in_message        => g_rec.last_msg);
    +$IF $$WTPLSQL_SELFTEST $THEN   ------%WTPLSQL_begin_ignore_lines%------
    +   end if;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +   if g_rec.raise_exception and not g_rec.last_pass
    +   then
    +      raise_application_error(-20003, wt_text_report.format_test_result
    +                                         (in_assertion      => g_rec.last_assert
    +                                         ,in_status         => C_FAIL
    +                                         ,in_details        => g_rec.last_details
    +                                         ,in_testcase       => g_testcase
    +                                         ,in_message        => g_rec.last_msg) );
    +   end if;
    +
    +end process_assertion;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_process_assertion
    +   is
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      g_testcase  := 'PROCESS_ASSERTION';
    +      g_rec.last_assert     := 'THIS';
    +      g_rec.last_pass       := FALSE;
    +      g_rec.last_details    := 'Expected "PASS" and got "FAIL"';
    +      g_rec.last_msg        := 'Process Assertion Forced Failure';
    +      g_rec.raise_exception := TRUE;
    +      wtplsql_skip_save  := TRUE;
    +      process_assertion;  -- Should throw exception
    +      wtplsql_skip_save  := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +   exception
    +      when ASSERT_FAILURE_EXCEPTION then
    +         wtplsql_skip_save := FALSE;
    +   end t_process_assertion;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure compare_queries (
    +      check_query_in     in   varchar2,
    +      against_query_in   in   varchar2)
    +is
    +   l_ret_txt    varchar2(10);
    +   l_qry_txt    varchar2(32000);
    +   l_exec_txt   varchar2(32767);
    +begin
    +   -- Define Query for the Comparison
    +   l_qry_txt := 'with check_query as (' || check_query_in   ||
    +                '), against_query as (' || against_query_in ||
    +                '), q1 as (select * from check_query'       ||
    +                   ' MINUS select * from against_query'     ||
    +                '), q2 as (select * from against_query'     ||
    +                   ' MINUS select * from check_query'       ||
    +                ') select * from q1 UNION select * from q2' ;
    +   ----------------------------------------
    +   -- Define EXECUTE IMMEDIATE text
    +   l_exec_txt :=
    +'declare
    +   cursor cur is ' || l_qry_txt || ';
    +   rec cur%rowtype;
    +begin     
    +   open cur;
    +   fetch cur into rec;
    +	:ret_txt := case cur%FOUND when TRUE then ''FOUND''
    +                              else ''NOTFOUND'' end;
    +   close cur;
    +end;';
    +   ----------------------------------------
    +   -- Run the Comparison
    +   execute immediate l_exec_txt using out l_ret_txt;
    +   if l_ret_txt = 'FOUND'
    +   then
    +      g_rec.last_pass := FALSE; -- Some Difference Found
    +   else
    +      g_rec.last_pass := TRUE;  -- Nothing found, queries match
    +   end if;
    +   -- No Exceptions Raised
    +   g_rec.last_details := 'Comparison Query: ' || l_qry_txt;
    +exception
    +   when OTHERS
    +   then
    +      g_rec.last_details := SQLERRM || CHR(10) ||
    +                            'FAILURE of Compare Query: ' || l_qry_txt || ';';
    +      g_rec.last_pass    := FALSE;
    +end compare_queries;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_compare_queries
    +   is
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'COMPARE_QUERIES Bad Query Test 1';
    +      compare_queries (
    +         check_query_in     => 'select bogus123 from bogus456',
    +         against_query_in   => 'select bogus987 from bogus654');
    +      temp_rec := g_rec;
    +      wt_assert.eq (
    +         msg_in           => 'temp_rec.last_pass',
    +         check_this_in    => temp_rec.last_pass,
    +         against_this_in  => FALSE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull(
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this(
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => (temp_rec.last_details like
    +                            '%PL/SQL: ORA-00942: table or view does not exist%'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'COMPARE_QUERIES Bad Query Test 2';
    +      compare_queries (
    +         check_query_in     => 'select table_name from user_tables',
    +         against_query_in   => 'select tablespace_name from user_tables');
    +      temp_rec := g_rec;
    +      wt_assert.eq (
    +         msg_in           => 'temp_rec.last_pass',
    +         check_this_in    => temp_rec.last_pass,
    +         against_this_in  => FALSE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull(
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this(
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => temp_rec.last_details like
    +                            '%Comparison Query: with check_query as' ||
    +                            ' (select table_name from user_tables%');
    +   end t_compare_queries;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +---------------------
    +--  Public Procedures
    +---------------------
    +
    +------------------------------------------------------------
    +function last_pass
    +   return boolean
    +is
    +begin
    +   return g_rec.last_pass;
    +end last_pass;
    +
    +function last_assert
    +   return wt_results.assertion%TYPE
    +is
    +begin
    +   return g_rec.last_assert;
    +end last_assert;
    +
    +function last_msg
    +   return wt_results.message%TYPE
    +is
    +begin
    +   return g_rec.last_msg;
    +end last_msg;
    +
    +function last_details
    +   return wt_results.details%TYPE
    +is
    +begin
    +   return g_rec.last_details;
    +end last_details;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_last_values
    +   is
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Last Values Tests';
    +      wt_assert.eq (
    +         msg_in          => 'Last Pass',
    +         check_this_in   => last_pass,
    +         against_this_in => g_rec.last_pass,
    +         null_ok_in      => TRUE);
    +      wt_assert.eq (
    +         msg_in          => 'Last Assert',
    +         check_this_in   => last_assert,
    +         against_this_in => g_rec.last_assert,
    +         null_ok_in      => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      temp_rec := g_rec;
    +      wt_assert.eq (
    +         msg_in          => 'Last MSG',
    +         check_this_in   => last_msg,
    +         against_this_in => temp_rec.last_msg,
    +         null_ok_in      => TRUE);
    +      wt_assert.eq (
    +         msg_in          => 'Last Details',
    +         check_this_in   => last_details,
    +         against_this_in => g_rec.last_details,
    +         null_ok_in      => TRUE);
    +   end t_last_values;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure reset_globals
    +is
    +begin
    +   g_testcase            := '';
    +   g_rec.last_pass       := NULL;
    +   g_rec.last_assert     := '';
    +   g_rec.last_msg        := '';
    +   g_rec.last_details    := '';
    +   g_rec.raise_exception := FALSE;
    +end reset_globals;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_reset_globals
    +   is
    +   begin
    +      reset_globals;  -- Resets g_testcase
    +      temp_rec         := g_rec;
    +      temp_testcase    := g_testcase;
    +      --------------------------------------  WTPLSQL Testing --
    +      g_testcase       := 'RESET_GLOBALS';
    +      wt_assert.isnull(
    +         msg_in        => 'temp_testcase',
    +         check_this_in => temp_testcase);
    +      wt_assert.isnull
    +         (msg_in        => 'temp_rec.last_pass'
    +         ,check_this_in => temp_rec.last_pass);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq(
    +         msg_in          => 'temp_rec.raise_exception',
    +         check_this_in   => temp_rec.raise_exception,
    +         against_this_in => FALSE);
    +      wt_assert.isnull
    +         (msg_in        => 'temp_rec.last_assert'
    +         ,check_this_in => temp_rec.last_assert);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull
    +         (msg_in        => 'temp_rec.last_msg'
    +         ,check_this_in => temp_rec.last_msg);
    +      wt_assert.isnull
    +         (msg_in        => 'temp_rec.last_details'
    +         ,check_this_in => temp_rec.last_details);
    +   end t_reset_globals;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +function get_NLS_DATE_FORMAT
    +      return varchar2
    +is
    +   l_format   varchar2(50);
    +begin
    +   select value into l_format
    +    from  nls_session_parameters
    +    where parameter in 'NLS_DATE_FORMAT';
    +   return l_format;
    +end get_NLS_DATE_FORMAT;
    +
    +procedure set_NLS_DATE_FORMAT
    +      (in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS')
    +is
    +begin
    +   execute immediate 'alter session set NLS_DATE_FORMAT = ''' ||
    +                      in_format || '''';
    +end set_NLS_DATE_FORMAT;
    +
    +function get_NLS_TIMESTAMP_FORMAT
    +      return varchar2
    +is
    +   l_format   varchar2(50);
    +begin
    +   select value into l_format
    +    from  nls_session_parameters
    +    where parameter in 'NLS_TIMESTAMP_FORMAT';
    +   return l_format;
    +end get_NLS_TIMESTAMP_FORMAT;
    +
    +procedure set_NLS_TIMESTAMP_FORMAT
    +      (in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS.FF6')
    +is
    +begin
    +   execute immediate 'alter session set NLS_TIMESTAMP_FORMAT = ''' ||
    +                      in_format || '''';
    +end set_NLS_TIMESTAMP_FORMAT;
    +
    +function get_NLS_TIMESTAMP_TZ_FORMAT
    +      return varchar2
    +is
    +   l_format   varchar2(50);
    +begin
    +   select value into l_format
    +    from  nls_session_parameters
    +    where parameter in 'NLS_TIMESTAMP_TZ_FORMAT';
    +   return l_format;
    +end get_NLS_TIMESTAMP_TZ_FORMAT;
    +
    +procedure set_NLS_TIMESTAMP_TZ_FORMAT
    +      (in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS.FF6 TZH:TZM')
    +is
    +begin
    +   execute immediate 'alter session set NLS_TIMESTAMP_TZ_FORMAT = ''' ||
    +                      in_format || '''';
    +end set_NLS_TIMESTAMP_TZ_FORMAT;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_nls_settings
    +   is
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'NLS Settings';
    +      set_NLS_DATE_FORMAT('DD-MON-YYYY');
    +      wt_assert.eq
    +         (msg_in          => 'get_NLS_DATE_FORMAT 1'
    +         ,check_this_in   => get_NLS_DATE_FORMAT
    +         ,against_this_in => 'DD-MON-YYYY');
    +      set_NLS_DATE_FORMAT;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq
    +         (msg_in          => 'get_NLS_DATE_FORMAT 2'
    +         ,check_this_in   => get_NLS_DATE_FORMAT
    +         ,against_this_in => 'DD-MON-YYYY HH24:MI:SS');
    +      set_NLS_TIMESTAMP_FORMAT('DD-MON-YYYY');
    +      wt_assert.eq
    +         (msg_in          => 'get_NLS_TIMESTAMP_FORMAT 2'
    +         ,check_this_in   => get_NLS_TIMESTAMP_FORMAT
    +         ,against_this_in => 'DD-MON-YYYY');
    +      set_NLS_TIMESTAMP_FORMAT;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq
    +         (msg_in          => 'get_NLS_TIMESTAMP_FORMAT 2'
    +         ,check_this_in   => get_NLS_TIMESTAMP_FORMAT
    +         ,against_this_in => 'DD-MON-YYYY HH24:MI:SS.FF6');
    +      set_NLS_TIMESTAMP_TZ_FORMAT('DD-MON-YYYY');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq
    +         (msg_in          => 'get_NLS_TIMESTAMP_TZ_FORMAT 2'
    +         ,check_this_in   => get_NLS_TIMESTAMP_TZ_FORMAT
    +         ,against_this_in => 'DD-MON-YYYY');
    +      set_NLS_TIMESTAMP_TZ_FORMAT;
    +      wt_assert.eq
    +         (msg_in          => 'get_NLS_TIMESTAMP_TZ_FORMAT 2'
    +         ,check_this_in   => get_NLS_TIMESTAMP_TZ_FORMAT
    +         ,against_this_in => 'DD-MON-YYYY HH24:MI:SS.FF6 TZH:TZM');
    +   end t_nls_settings;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------
    +--  Assertion Procedures
    +------------------------
    +
    +------------------------------------------------------------
    +procedure this (
    +      msg_in          in   varchar2,
    +      check_this_in   in   boolean,
    +      null_ok_in      in   boolean := false,   -- Not Used, utPLSQL V1 API
    +      raise_exc_in    in   boolean := false)
    +is
    +begin
    +   g_rec.last_assert  := 'THIS';
    +   g_rec.last_msg     := msg_in;
    +   g_rec.last_pass    := nvl(check_this_in, FALSE);
    +   g_rec.last_details := 'Expected "TRUE" and got "' ||
    +                          boolean_to_status(check_this_in) || '"';
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +end this;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_this
    +   is
    +      l_found_exception  BOOLEAN;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'This Happy Path';
    +      wt_assert.this (
    +         msg_in         => 'Run Test',
    +         check_this_in  => TRUE);
    +      temp_rec := g_rec;
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_assert',
    +         check_this_in   => temp_rec.last_assert,
    +         against_this_in => 'THIS');
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_msg',
    +         check_this_in   => temp_rec.last_msg,
    +         against_this_in => 'Run Test');
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => temp_rec.last_details,
    +         against_this_in => 'Expected "TRUE" and got "TRUE"');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'This Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      this (
    +         msg_in         => 'Not Used',
    +         check_this_in  => FALSE);
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'This Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      begin
    +         this (
    +            msg_in         => 'Not Used',
    +            check_this_in  => FALSE,
    +            raise_exc_in   => TRUE);
    +         l_found_exception := FALSE;
    +      exception when ASSERT_FAILURE_EXCEPTION then
    +         l_found_exception := TRUE;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'RAISE_EXC_IN Test, Exception Raised?',
    +         check_this_in   => l_found_exception,
    +         against_this_in => TRUE);
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'This Sad Path 3';
    +      wtplsql_skip_save := TRUE;
    +      this (
    +         msg_in         => 'Not Used',
    +         check_this_in  => NULL);
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +   end t_this;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +-- EQ: string overload
    +procedure eq (
    +   msg_in            in   varchar2,
    +   check_this_in     in   varchar2,
    +   against_this_in   in   varchar2,
    +   null_ok_in        in   boolean := false,
    +   raise_exc_in      in   boolean := false)
    +is
    +begin
    +   g_rec.last_assert  := 'EQ';
    +   g_rec.last_msg     := msg_in;
    +   g_rec.last_pass    := (   nvl(check_this_in = against_this_in, false)
    +                           or (    check_this_in is null
    +                              and against_this_in is null
    +                              and null_ok_in              )
    +                         );
    +   g_rec.last_details := 'Expected "' || substr(against_this_in,1,1000) ||
    +                        '" and got "' || substr(check_this_in  ,1,1000) ||
    +                        '"';
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +end eq;
    +
    +-- EQ: boolean overload
    +procedure eq (
    +   msg_in            in   varchar2,
    +   check_this_in     in   boolean,
    +   against_this_in   in   boolean,
    +   null_ok_in        in   boolean := false,
    +   raise_exc_in      in   boolean := false)
    +is
    +begin
    +   eq (msg_in           => msg_in
    +      ,check_this_in    => boolean_to_status(check_this_in)
    +      ,against_this_in  => boolean_to_status(against_this_in)
    +      ,null_ok_in       => null_ok_in
    +      ,raise_exc_in     => raise_exc_in);
    +end eq;
    +
    +-- EQ: XMLTYPE
    +procedure eq (
    +   msg_in            in   varchar2,
    +   check_this_in     in   XMLTYPE,
    +   against_this_in   in   XMLTYPE,
    +   null_ok_in        in   boolean := false,   -- Not Used, utPLSQL V1 API
    +   raise_exc_in      in   boolean := false)
    +is
    +begin
    +   g_rec.last_assert  := 'EQ';
    +   g_rec.last_msg     := msg_in;
    +   g_rec.last_pass    := (xmltype.getclobval(check_this_in)  =
    +                          xmltype.getclobval(against_this_in)  );
    +   g_rec.last_details := 'Expected "' || substr(xmltype.getclobval(against_this_in),1,1000) ||
    +                        '" and got "' || substr(xmltype.getclobval(check_this_in)  ,1,1000) ||
    +                        '"';
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +end eq;
    +
    +-- EQ: CLOB
    +procedure eq (
    +   msg_in            in   varchar2,
    +   check_this_in     in   CLOB,
    +   against_this_in   in   CLOB,
    +   null_ok_in        in   boolean := false,
    +   raise_exc_in      in   boolean := false)
    +is
    +begin
    +   g_rec.last_assert  := 'EQ';
    +   g_rec.last_msg     := msg_in;
    +   g_rec.last_pass    := (   nvl(check_this_in = against_this_in, false)
    +                           or (    check_this_in is null
    +                              and against_this_in is null
    +                              and null_ok_in              )
    +                         );
    +   g_rec.last_details := 'Expected "' || substr(against_this_in,1,1000) ||
    +                        '" and got "' || substr(check_this_in  ,1,1000) ||
    +                        '"';
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +end eq;
    +
    +-- EQ: BLOB
    +procedure eq (
    +   msg_in            in   varchar2,
    +   check_this_in     in   BLOB,
    +   against_this_in   in   BLOB,
    +   null_ok_in        in   boolean := false,
    +   raise_exc_in      in   boolean := false)
    +is
    +   compare_results  number;
    +begin
    +   g_rec.last_assert  := 'EQ';
    +   g_rec.last_msg     := msg_in;
    +   compare_results    := nvl(DBMS_LOB.COMPARE(check_this_in, against_this_in),-1);
    +   g_rec.last_pass    := (    (compare_results = 0)
    +                           or (    check_this_in is null
    +                              and against_this_in is null
    +                              and null_ok_in              )
    +                         );
    +   g_rec.last_details := 'DBMS_LOB.COMPARE on BLOBs, compare_results: ' || compare_results;
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +end eq;
    +
    +-------------------------------------------------------------------------
    +--   This is the start of a MASSIVE Unit Test on the "EQ" assertion   ---
    +-------------------------------------------------------------------------
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_eq
    +   is
    +      l_found_exception  BOOLEAN;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ VARCHAR2 Happy Path 1';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => 'X',
    +         against_this_in => 'X');
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_pass value',
    +         check_this_in   => temp_rec.last_pass);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => (temp_rec.last_pass = TRUE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_assert value',
    +         check_this_in   => temp_rec.last_assert);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_assert',
    +         check_this_in   => (temp_rec.last_assert = 'EQ'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_msg value',
    +         check_this_in   => temp_rec.last_msg);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_msg',
    +         check_this_in   => (temp_rec.last_msg = 'Run Test'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => (temp_rec.last_details = 'Expected "X" and got "X"'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ VARCHAR2 Happy Path 2';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => 'X',
    +         against_this_in => 'X',
    +         null_ok_in      => TRUE);
    +      wt_assert.g_testcase := 'EQ VARCHAR2 Happy Path 3';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => '',
    +         against_this_in => '',
    +         null_ok_in      => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => 'X',
    +         against_this_in => 'Y');
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => 'X');
    +      wt_assert.isnotnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => 'Y');
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      begin
    +         eq (
    +            msg_in          => 'Not Used',
    +            check_this_in   => 'X',
    +            against_this_in => 'Y',
    +            raise_exc_in    => TRUE);
    +         l_found_exception := FALSE;
    +      exception when ASSERT_FAILURE_EXCEPTION then
    +         l_found_exception := TRUE;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      wt_assert.eq (
    +         msg_in          => 'RAISE_EXC_IN Test, Exception Raised?',
    +         check_this_in   => l_found_exception,
    +         against_this_in => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 3';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => '',
    +         against_this_in => 'Y');
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => '');
    +      wt_assert.isnotnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => 'Y');
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 4';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => '',
    +         against_this_in => '');
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => '');
    +      wt_assert.isnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => '');
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 5';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => 'X',
    +         against_this_in => 'Y',
    +         null_ok_in      => TRUE);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => 'X');
    +      wt_assert.isnotnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => 'Y');
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 6';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => '',
    +         against_this_in => 'Y',
    +         null_ok_in      => TRUE);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => '');
    +      wt_assert.isnotnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => 'Y');
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      -- VARCHAR2 includes Includes ROWID
    +      wt_assert.g_testcase := 'EQ ROWID Happy Path 1';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => temp_rowid1,
    +         against_this_in => temp_rowid1);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ ROWID Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => temp_rowid1,
    +         against_this_in => temp_rowid2);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => temp_rowid1);
    +      wt_assert.isnotnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => temp_rowid2);
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      -- VARCHAR2 includes Includes LONG
    +      wt_assert.g_testcase := 'EQ LONG Happy Path 1';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => temp_long1,
    +         against_this_in => temp_long1);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ LONG Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => temp_long1,
    +         against_this_in => temp_long2);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => temp_long1);
    +      wt_assert.isnotnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => temp_long2);
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      -- VARCHAR2 includes Includes RAW
    +      wt_assert.g_testcase := 'EQ RAW Happy Path 1';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => temp_raw1,
    +         against_this_in => temp_raw1);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ RAW Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => temp_raw1,
    +         against_this_in => temp_raw2);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => temp_raw1);
    +      wt_assert.isnotnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => temp_raw2);
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      -- VARCHAR2 includes Includes LONG RAW
    +      wt_assert.g_testcase := 'EQ LANG RAW Happy Path 1';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => temp_lraw1,
    +         against_this_in => temp_lraw1);
    +      --------------------------------------  WTPLSQL Testing --
    +      -- VARCHAR2 includes Includes LONG RAW
    +      wt_assert.g_testcase := 'EQ LANG RAW Happy Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => temp_lraw1,
    +         against_this_in => temp_lraw2);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ LONG RAW Sad Path 1';
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => temp_lraw1);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => temp_lraw2);
    +      wt_assert.this (
    +         msg_in          => 'Sad Path 1',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      -- VARCHAR2 includes Includes NVARCHAR2
    +      wt_assert.g_testcase := 'EQ NVARCHAR2 Happy Path 1';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => temp_nc1,
    +         against_this_in => temp_nc1);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ NVARCHAR2 Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => temp_nc1,
    +         against_this_in => temp_nc2);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => temp_nc1);
    +      wt_assert.isnotnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => temp_nc2);
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ BOOLEAN Happy Path 1';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => FALSE,
    +         against_this_in => FALSE);
    +      wt_assert.g_testcase := 'EQ BOOLEAN Happy Path 2';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => FALSE,
    +         against_this_in => FALSE,
    +         null_ok_in      => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ BOOLEAN Happy Path 3';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => temp_bool,
    +         against_this_in => temp_bool,
    +         null_ok_in      => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 1';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => FALSE,
    +         against_this_in => TRUE);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => FALSE);
    +      wt_assert.isnotnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => TRUE);
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 2';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => FALSE,
    +         against_this_in => temp_bool);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => FALSE);
    +      wt_assert.isnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => temp_bool);
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 3';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => FALSE,
    +         against_this_in => TRUE,
    +         null_ok_in      => TRUE);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => FALSE);
    +      wt_assert.isnotnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => TRUE);
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 4';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => FALSE,
    +         against_this_in => temp_bool,
    +         null_ok_in      => TRUE);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => FALSE);
    +      wt_assert.isnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => temp_bool);
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ NUMBER Happy Path 1';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => 4,
    +         against_this_in => 4);
    +      wt_assert.g_testcase := 'EQ NUMBER Happy Path 2';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => 9876543210987654321098765432109876543210,
    +         against_this_in => 9876543210987654321098765432109876543210);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ NUMBER Happy Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => 4,
    +         against_this_in => 5);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => 4);
    +      wt_assert.isnotnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => 5);
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      -- EQ: NUMBER implicit conversion includes PLS_INTEGER
    +      wt_assert.g_testcase := 'EQ PLS_INTEGER Happy Path 1';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => temp_pint1,
    +         against_this_in => temp_pint1);
    +      wtplsql_skip_save := TRUE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ PLS_INTEGER Sad Path 1';
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => temp_pint1,
    +         against_this_in => temp_pint2);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => temp_pint1);
    +      wt_assert.isnotnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => temp_pint2);
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ DATE Happy Path 1';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => temp_date,
    +         against_this_in => temp_date);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ DATE Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => temp_date,
    +         against_this_in => temp_date + 1/24);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => temp_date);
    +      wt_assert.isnotnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => temp_date + 1/24);
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      -- EQ: DATE implicit conversion includes TIMESTAMP
    +      wt_assert.g_testcase := 'EQ TIMSETAMP Happy Path 1';
    +      eq (
    +         msg_in          => 'EQ TIMSETAMP Happy Path 1',
    +         check_this_in   => temp_tstmp,
    +         against_this_in => temp_tstmp);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ TIMSETAMP Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => temp_tstmp,
    +         against_this_in => temp_tstmp + 1/24);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => temp_tstmp);
    +      wt_assert.isnotnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => temp_tstmp + 1/24);
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      -- EQ: DATE implicit conversion includes TIMESTAMP
    +      wt_assert.g_testcase := 'EQ TIMSETAMP WITH LOCAL TIME ZONE Happy Path 1';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => temp_tstzn,
    +         against_this_in => temp_tstzn);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ TIMSETAMP WITH LOCAL TIME ZONE Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => temp_tstlzn,
    +         against_this_in => temp_tstlzn + 1/24);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => temp_tstlzn);
    +      wt_assert.isnotnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => temp_tstlzn + 1/24);
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      -- EQ: DATE implicit conversion includes TIMESTAMP
    +      wt_assert.g_testcase := 'EQ TIMSETAMP WITH TIME ZONE Happy Path 1';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => temp_tstzn,
    +         against_this_in => temp_tstzn);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ TIMSETAMP WITH TIME ZONE Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => temp_tstzn,
    +         against_this_in => temp_tstzn + 1/24);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => temp_tstzn);
    +      wt_assert.isnotnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => temp_tstzn + 1/24);
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      -- EQ: DATE implicit conversion includes INTERVAL
    +      wt_assert.g_testcase := 'EQ INTERVAL DAY TO SECOND Happy Path 1';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => temp_intds1,
    +         against_this_in => temp_intds1);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ INTERVAL DAY TO SECOND Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => temp_intds1,
    +         against_this_in => temp_intds2);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => temp_intds1);
    +      wt_assert.isnotnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => temp_intds2);
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      -- EQ: DATE implicit conversion includes INTERVAL
    +      wt_assert.g_testcase := 'EQ INTERVAL YEAR TO MONTH Happy Path 1';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => temp_intym1,
    +         against_this_in => temp_intym1);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ INTERVAL YEAR TO MONTH Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => temp_intym1,
    +         against_this_in => temp_intym2);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => temp_intym1);
    +      wt_assert.isnotnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => temp_intym2);
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ XMLTYPE Happy Path 1';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => temp_xml1,
    +         against_this_in => temp_xml1);
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_pass value',
    +         check_this_in   => temp_rec.last_pass);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => (temp_rec.last_pass = TRUE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => ' g_rec.last_assert value',
    +         check_this_in   => temp_rec.last_assert);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_assert',
    +         check_this_in   => (temp_rec.last_assert = 'EQ'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_msg value',
    +         check_this_in   => temp_rec.last_msg);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_msg',
    +         check_this_in   => (temp_rec.last_msg = 'Run Test'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => (temp_rec.last_details like
    +                            'Expected "<?xml version="1.0" encoding="UTF-8"?>%'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ XMLTYPE Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => temp_xml1,
    +         against_this_in => temp_xml2);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => xmltype.getclobval(temp_xml1));
    +      wt_assert.isnotnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => xmltype.getclobval(temp_xml2));
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ XMLTYPE Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      begin
    +         eq (
    +            msg_in          => 'Not Used',
    +            check_this_in   => temp_xml1,
    +            against_this_in => temp_xml2,
    +            raise_exc_in    => TRUE);
    +         l_found_exception := FALSE;
    +      exception when ASSERT_FAILURE_EXCEPTION then
    +         l_found_exception := TRUE;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      wt_assert.eq (
    +         msg_in          => 'RAISE_EXC_IN Test, Exception Raised?',
    +         check_this_in   => l_found_exception,
    +         against_this_in => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ CLOB Happy Path 1';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => temp_clob1,
    +         against_this_in => temp_clob1);
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_pass value',
    +         check_this_in   => temp_rec.last_pass);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => (temp_rec.last_pass = TRUE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_assert value',
    +         check_this_in   => temp_rec.last_assert);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_assert',
    +         check_this_in   => (temp_rec.last_assert = 'EQ'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_msg value',
    +         check_this_in   => temp_rec.last_msg);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_msg',
    +         check_this_in   => (temp_rec.last_msg = 'Run Test'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => (temp_rec.last_details like
    +                            'Expected "<?xml version="1.0" encoding="UTF-8"?>%'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ CLOB Happy Path 2';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => temp_clob1,
    +         against_this_in => temp_clob1,
    +         null_ok_in      => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ CLOB Happy Path 3';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => cast (NULL as CLOB),
    +         against_this_in => cast (NULL as CLOB),
    +         null_ok_in      => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ CLOB Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => temp_clob1,
    +         against_this_in => temp_clob2);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => temp_clob1);
    +      wt_assert.isnotnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => temp_clob2);
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ CLOB Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      begin
    +         eq (
    +            msg_in          => 'Not Used',
    +            check_this_in   => temp_clob1,
    +            against_this_in => temp_clob2,
    +            raise_exc_in    => TRUE);
    +         l_found_exception := FALSE;
    +      exception when ASSERT_FAILURE_EXCEPTION then
    +         l_found_exception := TRUE;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      wt_assert.eq (
    +         msg_in          => 'RAISE_EXC_IN Test, Exception Raised?',
    +         check_this_in   => l_found_exception,
    +         against_this_in => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ CLOB Sad Path 3';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => temp_clob1,
    +         against_this_in => cast (NULL as CLOB));
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => temp_clob1);
    +      wt_assert.isnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => cast (NULL as CLOB));
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ CLOB Sad Path 4';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => temp_clob1,
    +         against_this_in => cast (NULL as CLOB),
    +         null_ok_in      => TRUE);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => temp_clob1);
    +      wt_assert.isnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => cast (NULL as CLOB));
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ NCLOB Happy Path 1';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => temp_nclob1,
    +         against_this_in => temp_nclob1);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ NCLOB Happy Path 2';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => temp_nclob1,
    +         against_this_in => temp_nclob1,
    +         null_ok_in      => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ NCLOB Happy Path 3';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => cast (NULL as NCLOB),
    +         against_this_in => cast (NULL as NCLOB),
    +         null_ok_in      => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ NCLOB Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => temp_nclob1,
    +         against_this_in => temp_nclob2);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => temp_nclob1);
    +      wt_assert.isnotnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => temp_nclob2);
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ NCLOB Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      begin
    +         eq (
    +            msg_in          => 'Not Used',
    +            check_this_in   => temp_nclob1,
    +            against_this_in => temp_nclob2,
    +            raise_exc_in    => TRUE);
    +         l_found_exception := FALSE;
    +      exception when ASSERT_FAILURE_EXCEPTION then
    +         l_found_exception := TRUE;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      wt_assert.eq (
    +         msg_in          => 'RAISE_EXC_IN Test, Exception Raised?',
    +         check_this_in   => l_found_exception,
    +         against_this_in => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ NCLOB Sad Path 3';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => temp_nclob1,
    +         against_this_in => cast (NULL as NCLOB));
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => temp_nclob1);
    +      wt_assert.isnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => cast (NULL as NCLOB));
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ NCLOB Sad Path 4';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => temp_nclob1,
    +         against_this_in => cast (NULL as NCLOB),
    +         null_ok_in      => TRUE);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => temp_nclob1);
    +      wt_assert.isnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => cast (NULL as NCLOB));
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ BLOB Happy Path 1';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => temp_blob1,
    +         against_this_in => temp_blob1);
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_pass value',
    +         check_this_in   => temp_rec.last_pass);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => (temp_rec.last_pass = TRUE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_assert value',
    +         check_this_in   => temp_rec.last_assert);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_assert',
    +         check_this_in   => (temp_rec.last_assert = 'EQ'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_msg value',
    +         check_this_in   => temp_rec.last_msg);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_msg',
    +         check_this_in   => (temp_rec.last_msg = 'Run Test'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => (temp_rec.last_details =
    +                            'DBMS_LOB.COMPARE on BLOBs, compare_results: 0'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ BLOB Happy Path 2';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => temp_blob1,
    +         against_this_in => temp_blob1,
    +         null_ok_in      => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ BLOB Happy Path 3';
    +      eq (
    +         msg_in          => 'Run Test',
    +         check_this_in   => cast (NULL as BLOB),
    +         against_this_in => cast (NULL as BLOB),
    +         null_ok_in      => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ BLOB Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => temp_blob1,
    +         against_this_in => temp_blob2);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => temp_blob1);
    +      wt_assert.isnotnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => temp_blob2);
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ BLOB Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      begin
    +         eq (
    +            msg_in          => 'Not Used',
    +            check_this_in   => temp_blob1,
    +            against_this_in => temp_blob2,
    +            raise_exc_in    => TRUE);
    +         l_found_exception := FALSE;
    +      exception when ASSERT_FAILURE_EXCEPTION then
    +         l_found_exception := TRUE;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      wt_assert.eq (
    +         msg_in          => 'RAISE_EXC_IN Test, Exception Raised?',
    +         check_this_in   => l_found_exception,
    +         against_this_in => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ BLOB Sad Path 3';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => temp_blob1,
    +         against_this_in => cast (NULL as BLOB));
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => temp_blob1);
    +      wt_assert.isnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => cast (NULL as BLOB));
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQ BLOB Sad Path 4';
    +      wtplsql_skip_save := TRUE;
    +      eq (
    +         msg_in          => 'Not Used',
    +         check_this_in   => temp_blob1,
    +         against_this_in => cast (NULL as BLOB),
    +         null_ok_in      => TRUE);
    +      wtplsql_skip_save := FALSE;
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'check_this_in value',
    +         check_this_in   => temp_blob1);
    +      wt_assert.isnull (
    +         msg_in          => 'against_this_in value',
    +         check_this_in   => cast (NULL as BLOB));
    +      wt_assert.this (
    +         msg_in          => 'last_pass = FALSE',
    +         check_this_in   => (temp_rec.last_pass = FALSE));
    +   end t_eq;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +-----------------------------------------------------------------------
    +--   This is the end of a MASSIVE Unit Test on the "EQ" assertion   ---
    +-----------------------------------------------------------------------
    +
    +
    +------------------------------------------------------------
    +-- ISNOTNULL string overload
    +procedure isnotnull (
    +   msg_in          in   varchar2,
    +   check_this_in   in   varchar2,
    +   null_ok_in      in   boolean := false,   -- Not Used, utPLSQL V1 API
    +   raise_exc_in    in   boolean := false)
    +is
    +begin
    +   g_rec.last_assert  := 'ISNOTNULL';
    +   g_rec.last_msg     := msg_in;
    +   g_rec.last_pass    := (check_this_in is not null);
    +   g_rec.last_details := 'Expected NOT NULL and got "' ||
    +                          substr(check_this_in,1,2000) || '"';
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +end isnotnull;
    +
    +-- ISNOTNULL boolean overload
    +procedure isnotnull (
    +   msg_in          in   varchar2,
    +   check_this_in   in   boolean,
    +   null_ok_in      in   boolean := false,   -- Not Used, utPLSQL V1 API
    +   raise_exc_in    in   boolean := false)
    +is
    +begin
    +   isnotnull (msg_in        => msg_in
    +             ,check_this_in => boolean_to_status(check_this_in)
    +             ,null_ok_in    => null_ok_in
    +             ,raise_exc_in  => raise_exc_in);
    +end isnotnull;
    +
    +-- ISNOTNULL CLOB overload
    +procedure isnotnull (
    +   msg_in          in   varchar2,
    +   check_this_in   in   CLOB,
    +   null_ok_in      in   boolean := false,   -- Not Used, utPLSQL V1 API
    +   raise_exc_in    in   boolean := false)
    +is
    +begin
    +   g_rec.last_assert  := 'ISNOTNULL';
    +   g_rec.last_msg     := msg_in;
    +   g_rec.last_pass    := (check_this_in is not null);
    +   g_rec.last_details := 'Expected NOT NULL and got "' ||
    +                          substr(check_this_in,1,2000) || '"';
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +end isnotnull;
    +
    +-- ISNOTNULL BLOB overload
    +procedure isnotnull (
    +   msg_in          in   varchar2,
    +   check_this_in   in   BLOB,
    +   null_ok_in      in   boolean := false,   -- Not Used, utPLSQL V1 API
    +   raise_exc_in    in   boolean := false)
    +is
    +begin
    +   g_rec.last_assert  := 'ISNOTNULL';
    +   g_rec.last_msg     := msg_in;
    +   g_rec.last_pass    := (check_this_in is not null);
    +   if g_rec.last_pass
    +   then
    +      g_rec.last_details := 'BLOB is NOT NULL';
    +   else
    +      g_rec.last_details := 'BLOB is NULL';
    +   end if;
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +end isnotnull;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_isnotnull
    +   is
    +      l_found_exception  BOOLEAN;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNOTNULL VARCHAR2 Happy Path 1';
    +      isnotnull (
    +         msg_in        => 'Run Test',
    +         check_this_in => 'X');
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => TRUE);
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_assert',
    +         check_this_in   => temp_rec.last_assert,
    +         against_this_in => 'ISNOTNULL');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_msg',
    +         check_this_in   => temp_rec.last_msg,
    +         against_this_in => 'Run Test');
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => temp_rec.last_details,
    +         against_this_in => 'Expected NOT NULL and got "X"');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNOTNULL VARCHAR2 Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      isnotnull (
    +         msg_in        => 'Not Used',
    +         check_this_in => '');
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'g_rec.last_pass',
    +         check_this_in   => g_rec.last_pass,
    +         against_this_in => FALSE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNOTNULL VARCHAR2 Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      begin
    +         isnotnull (
    +            msg_in        => 'Not Used',
    +            check_this_in => '',
    +            raise_exc_in  => TRUE);
    +         l_found_exception := FALSE;
    +      exception when ASSERT_FAILURE_EXCEPTION then
    +         l_found_exception := TRUE;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'g_rec.last_pass',
    +         check_this_in   => g_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.eq (
    +         msg_in          => 'RAISE_EXC_IN Test, Exception Raised?',
    +         check_this_in   => l_found_exception,
    +         against_this_in => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNOTNULL BOOLEAN Happy Path 1';
    +      isnotnull (
    +         msg_in        => 'Run Test',
    +         check_this_in => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNOTNULL BOOLEAN Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      isnotnull (
    +         msg_in        => 'Not Used',
    +         check_this_in => temp_bool);
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'g_rec.last_pass',
    +         check_this_in   => g_rec.last_pass,
    +         against_this_in => FALSE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNOTNULL BOOLEAN Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      begin
    +         isnotnull (
    +            msg_in        => 'Not Used',
    +            check_this_in => temp_bool,
    +            raise_exc_in  => TRUE);
    +         l_found_exception := FALSE;
    +      exception when ASSERT_FAILURE_EXCEPTION then
    +         l_found_exception := TRUE;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'g_rec.last_pass',
    +         check_this_in   => g_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.eq (
    +         msg_in          => 'RAISE_EXC_IN Test, Exception Raised?',
    +         check_this_in   => l_found_exception,
    +         against_this_in => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNOTNULL CLOB Happy Path 1';
    +      isnotnull (
    +         msg_in        => 'Run Test',
    +         check_this_in => temp_clob1);
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => TRUE);
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_assert',
    +         check_this_in   => temp_rec.last_assert,
    +         against_this_in => 'ISNOTNULL');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_msg',
    +         check_this_in   => temp_rec.last_msg,
    +         against_this_in => 'Run Test');
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => (temp_rec.last_details like
    +                            'Expected NOT NULL and got "<?xml version="1.0" encoding="UTF-8"?>%'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNOTNULL CLOB Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      isnotnull (
    +         msg_in        => 'Not Used',
    +         check_this_in => cast (null as CLOB));
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'g_rec.last_pass',
    +         check_this_in   => g_rec.last_pass,
    +         against_this_in => FALSE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNOTNULL CLOB Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      begin
    +         isnotnull (
    +            msg_in        => 'Not Used',
    +            check_this_in => cast (null as CLOB),
    +            raise_exc_in  => TRUE);
    +         l_found_exception := FALSE;
    +      exception when ASSERT_FAILURE_EXCEPTION then
    +         l_found_exception := TRUE;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'g_rec.last_pass',
    +         check_this_in   => g_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.eq (
    +         msg_in          => 'RAISE_EXC_IN Test, Exception Raised?',
    +         check_this_in   => l_found_exception,
    +         against_this_in => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNOTNULL BLOB Happy Path 1';
    +      isnotnull (
    +         msg_in        => 'Run Test',
    +         check_this_in => temp_blob1);
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => TRUE);
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_assert',
    +         check_this_in   => temp_rec.last_assert,
    +         against_this_in => 'ISNOTNULL');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_msg',
    +         check_this_in   => temp_rec.last_msg,
    +         against_this_in => 'Run Test');
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => temp_rec.last_details,
    +         against_this_in => 'BLOB is NOT NULL');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNOTNULL BLOB Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      isnotnull (
    +         msg_in        => 'Not Used',
    +         check_this_in => cast (null as BLOB));
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'g_rec.last_pass',
    +         check_this_in   => g_rec.last_pass,
    +         against_this_in => FALSE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNOTNULL BLOB Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      begin
    +         isnotnull (
    +            msg_in        => 'Not Used',
    +            check_this_in => cast (null as BLOB),
    +            raise_exc_in  => TRUE);
    +         l_found_exception := FALSE;
    +      exception when ASSERT_FAILURE_EXCEPTION then
    +         l_found_exception := TRUE;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'g_rec.last_pass',
    +         check_this_in   => g_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.eq (
    +         msg_in          => 'RAISE_EXC_IN Test, Exception Raised?',
    +         check_this_in   => l_found_exception,
    +         against_this_in => TRUE);
    +   end t_isnotnull;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +-- ISNULL string overload
    +procedure isnull (
    +   msg_in          in   varchar2,
    +   check_this_in   in   varchar2,
    +   null_ok_in      in   boolean := false,   -- Not Used, utPLSQL V1 API
    +   raise_exc_in    in   boolean := false)
    +is
    +begin
    +   g_rec.last_assert  := 'ISNULL';
    +   g_rec.last_msg     := msg_in;
    +   g_rec.last_pass    := (check_this_in is null);
    +   g_rec.last_details := 'Expected NULL and got "' ||
    +                      substr(check_this_in,1,2000) || '"';
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +end isnull;
    +
    +-- ISNULL boolean overload
    +procedure isnull (
    +   msg_in          in   varchar2,
    +   check_this_in   in   boolean,
    +   null_ok_in      in   boolean := false,   -- Not Used, utPLSQL V1 API
    +   raise_exc_in    in   boolean := false)
    +is
    +begin
    +   isnull (msg_in        => msg_in
    +          ,check_this_in => boolean_to_status(check_this_in)
    +          ,null_ok_in    => null_ok_in
    +          ,raise_exc_in  => raise_exc_in);
    +end isnull;
    +
    +-- ISNULL CLOB overload
    +procedure isnull (
    +   msg_in          in   varchar2,
    +   check_this_in   in   CLOB,
    +   null_ok_in      in   boolean := false,   -- Not Used, utPLSQL V1 API
    +   raise_exc_in    in   boolean := false)
    +is
    +begin
    +   g_rec.last_assert  := 'ISNULL';
    +   g_rec.last_msg     := msg_in;
    +   g_rec.last_pass    := (check_this_in is null);
    +   g_rec.last_details := 'Expected NULL and got "' ||
    +                      substr(check_this_in,1,2000) || '"';
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +end isnull;
    +
    +-- ISNULL BLOB overload
    +procedure isnull (
    +   msg_in          in   varchar2,
    +   check_this_in   in   BLOB,
    +   null_ok_in      in   boolean := false,   -- Not Used, utPLSQL V1 API
    +   raise_exc_in    in   boolean := false)
    +is
    +begin
    +   g_rec.last_assert  := 'ISNULL';
    +   g_rec.last_msg     := msg_in;
    +   g_rec.last_pass    := (check_this_in is null);
    +   if g_rec.last_pass
    +   then
    +      g_rec.last_details := 'BLOB is NULL';
    +   else
    +      g_rec.last_details := 'BLOB is NOT NULL';
    +   end if;
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +end isnull;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_isnull
    +   is
    +      l_found_exception  BOOLEAN;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNULL VARCHAR2 Happy Path 1';
    +      isnull (
    +         msg_in        => 'Run Test',
    +         check_this_in => '');
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => TRUE);
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_assert',
    +         check_this_in   => temp_rec.last_assert,
    +         against_this_in => 'ISNULL');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_msg',
    +         check_this_in   => temp_rec.last_msg,
    +         against_this_in => 'Run Test');
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => temp_rec.last_details,
    +         against_this_in => 'Expected NULL and got ""');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNULL VARCHAR2 Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      isnull (
    +         msg_in        => 'Not Used',
    +         check_this_in => 'X');
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'g_rec.last_pass',
    +         check_this_in   => g_rec.last_pass,
    +         against_this_in => FALSE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNULL VARCHAR2 Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      begin
    +         isnull (
    +            msg_in        => 'Not Used',
    +            check_this_in => 'X',
    +            raise_exc_in  => TRUE);
    +         l_found_exception := FALSE;
    +      exception when ASSERT_FAILURE_EXCEPTION then
    +         l_found_exception := TRUE;
    +      end;
    +      wtplsql_skip_save := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'g_rec.last_pass',
    +         check_this_in   => g_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.eq (
    +         msg_in          => 'RAISE_EXC_IN Test, Exception Raised?',
    +         check_this_in   => l_found_exception,
    +         against_this_in => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNULL BOOLEAN Happy Path 1';
    +      isnull (
    +         msg_in        => 'Run Test',
    +         check_this_in => temp_bool);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNULL BOOLEAN Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      isnull (
    +         msg_in        => 'Not Used',
    +         check_this_in => FALSE);
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'g_rec.last_pass',
    +         check_this_in   => g_rec.last_pass,
    +         against_this_in => FALSE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNULL BOOLEAN Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      begin
    +         isnull (
    +            msg_in        => 'Not Used',
    +            check_this_in => FALSE,
    +            raise_exc_in  => TRUE);
    +         l_found_exception := FALSE;
    +      exception when ASSERT_FAILURE_EXCEPTION then
    +         l_found_exception := TRUE;
    +      end;
    +      wtplsql_skip_save := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'g_rec.last_pass',
    +         check_this_in   => g_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.eq (
    +         msg_in          => 'RAISE_EXC_IN Test, Exception Raised?',
    +         check_this_in   => l_found_exception,
    +         against_this_in => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNULL CLOB Happy Path 1';
    +      isnull (
    +         msg_in        => 'Run Test',
    +         check_this_in => cast (null as CLOB));
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => TRUE);
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_assert',
    +         check_this_in   => temp_rec.last_assert,
    +         against_this_in => 'ISNULL');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_msg',
    +         check_this_in   => temp_rec.last_msg,
    +         against_this_in => 'Run Test');
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => temp_rec.last_details,
    +         against_this_in => 'Expected NULL and got ""');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNULL CLOB Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      isnull (
    +         msg_in        => 'Not Used',
    +         check_this_in => temp_clob1);
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'g_rec.last_pass',
    +         check_this_in   => g_rec.last_pass,
    +         against_this_in => FALSE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNULL CLOB Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      begin
    +         isnull (
    +            msg_in        => 'Not Used',
    +            check_this_in => temp_clob1,
    +            raise_exc_in  => TRUE);
    +         l_found_exception := FALSE;
    +      exception when ASSERT_FAILURE_EXCEPTION then
    +         l_found_exception := TRUE;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'g_rec.last_pass',
    +         check_this_in   => g_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.eq (
    +         msg_in          => 'RAISE_EXC_IN Test, Exception Raised?',
    +         check_this_in   => l_found_exception,
    +         against_this_in => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNULL BLOB Happy Path 1';
    +      isnull (
    +         msg_in        => 'Run Test',
    +         check_this_in => cast (null as BLOB));
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => TRUE);
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_assert',
    +         check_this_in   => temp_rec.last_assert,
    +         against_this_in => 'ISNULL');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_msg',
    +         check_this_in   => temp_rec.last_msg,
    +         against_this_in => 'Run Test');
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => temp_rec.last_details,
    +         against_this_in => 'BLOB is NULL');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNULL BLOB Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      isnull (
    +         msg_in        => 'Not Used',
    +         check_this_in => temp_blob1);
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'g_rec.last_pass',
    +         check_this_in   => g_rec.last_pass,
    +         against_this_in => FALSE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'ISNULL BLOB Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      begin
    +         isnull (
    +            msg_in        => 'Not Used',
    +            check_this_in => temp_blob1,
    +            raise_exc_in  => TRUE);
    +         l_found_exception := FALSE;
    +      exception when ASSERT_FAILURE_EXCEPTION then
    +         l_found_exception := TRUE;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'g_rec.last_pass',
    +         check_this_in   => g_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.eq (
    +         msg_in          => 'RAISE_EXC_IN Test, Exception Raised?',
    +         check_this_in   => l_found_exception,
    +         against_this_in => TRUE);
    +   end t_isnull;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +--  Check a given call raises an exception
    +procedure raises (
    +      msg_in                varchar2,
    +      check_call_in    in   varchar2,
    +      against_exc_in   in   varchar2)
    +is
    +   l_sqlerrm    varchar2(4000);
    +   l_errstack   varchar2(4000);
    +begin
    +   begin
    +      execute immediate check_call_in;
    +   exception when OTHERS then
    +      l_sqlerrm := SQLERRM;
    +      l_errstack := substr(dbms_utility.format_error_stack  ||
    +                           dbms_utility.format_error_backtrace
    +                           ,1,4000);
    +   end;
    +   --
    +   g_rec.last_assert  := 'RAISES/THROWS';
    +   g_rec.last_msg     := msg_in;
    +   if against_exc_in is null AND l_sqlerrm is null
    +   then
    +      -- Both are Null
    +      g_rec.last_pass := TRUE;
    +   elsif against_exc_in is null OR l_sqlerrm is null
    +   then
    +      -- If both were Null, it would have been caught above.
    +      --   So, only one can be Null
    +      g_rec.last_pass := FALSE;
    +   else
    +      -- If either was Null, it would have been caught above.
    +      g_rec.last_pass := l_sqlerrm like '%' || against_exc_in || '%';
    +   end if;
    +   if against_exc_in is null
    +   then
    +      g_rec.last_details := 'No exception was expected' ||
    +                             '. Exception raised was "' || l_sqlerrm      ||
    +                            '". Exception raised by: "' || check_call_in  || '".';
    +   elsif l_sqlerrm is null
    +   then
    +      g_rec.last_details := 'Expected exception "%'           || against_exc_in ||
    +                          '%". No exception was raised by: "' || check_call_in  || '".';
    +   else
    +      g_rec.last_details := 'Expected exception "%'           || against_exc_in ||
    +                          '%". Actual exception raised was "' || l_sqlerrm      ||
    +                                  '". Exception raised by: "' || check_call_in  || '".';
    +   end if;
    +   if not g_rec.last_pass
    +   then
    +      g_rec.last_details := 
    +         substr(g_rec.last_details || ' Error Stack: ' || l_errstack, 1, 4000);
    +   end if;
    +   process_assertion;
    +end raises;
    +
    +procedure raises (
    +      msg_in                varchar2,
    +      check_call_in    in   varchar2,
    +      against_exc_in   in   number)
    +is
    +begin
    +   if against_exc_in is null
    +   then
    +      raises (
    +         msg_in          => msg_in,
    +         check_call_in   => check_call_in,
    +         against_exc_in  => '');
    +   else
    +      raises (
    +         msg_in          => msg_in,
    +         check_call_in   => check_call_in,
    +         against_exc_in  => '-' || lpad(abs(against_exc_in),5,'0'));
    +   end if;
    +end raises;
    +
    +procedure throws (
    +      msg_in              varchar2,
    +      check_call_in   in  varchar2,
    +      against_exc_in  in  varchar2)
    +is
    +begin
    +   raises (
    +      msg_in          => msg_in,
    +      check_call_in   => check_call_in,
    +      against_exc_in  => against_exc_in);
    +end throws;
    +
    +procedure throws (
    +      msg_in              varchar2,
    +      check_call_in   in  varchar2,
    +      against_exc_in  in  number)
    +is
    +begin
    +   raises (
    +      msg_in          => msg_in,
    +      check_call_in   => check_call_in,
    +      against_exc_in  => against_exc_in);
    +end throws;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_raises
    +   is
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Raises Tests Happy Path 1';
    +      raises (
    +         msg_in         => 'RAISES Varchar2 Test',
    +         check_call_in  => 'begin wt_assert.bogus; end;',
    +         against_exc_in => 'PLS-00302: component ''BOGUS'' must be declared');
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => TRUE);
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_assert',
    +         check_this_in   => temp_rec.last_assert,
    +         against_this_in => 'RAISES/THROWS');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_msg',
    +         check_this_in   => temp_rec.last_msg,
    +         against_this_in => 'RAISES Varchar2 Test');
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => temp_rec.last_details,
    +         against_this_in => 'Expected exception "%PLS-00302: component ''BOGUS'' must be declared%". ' ||
    +                            'Actual exception raised was "ORA-06550: line 1, column 17:' || CHR(10) ||
    +                            'PLS-00302: component ''BOGUS'' must be declared' || CHR(10) ||
    +                            'ORA-06550: line 1, column 7:' || CHR(10) ||
    +                            'PL/SQL: Statement ignored". ' ||
    +                            'Exception raised by: "begin wt_assert.bogus; end;".');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Raises Tests Happy Path 2';
    +      raises (
    +         msg_in         => 'RAISES Number Test',
    +         check_call_in  => 'begin wt_assert.bogus; end;',
    +         against_exc_in => 302);
    +      temp_rec := g_rec;
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details,
    +         against_this_in => 'Expected exception "%-00302%". ' ||
    +                            'Actual exception raised was "' ||
    +                            'ORA-06550: line 1, column 17:' || CHR(10) ||
    +                            'PLS-00302: component ''BOGUS'' must be declared' || CHR(10) ||
    +                            'ORA-06550: line 1, column 7:' || CHR(10) ||
    +                            'PL/SQL: Statement ignored". ' ||
    +                            'Exception raised by: "begin wt_assert.bogus; end;".');
    +      --------------------------------------  WTPLSQL Testing --
    +      throws (
    +         msg_in         => 'THROWS Varchar2 Test',
    +         check_call_in  => 'begin wt_assert.bogus; end;',
    +         against_exc_in => 'PLS-00302: component ''BOGUS'' must be declared');
    +      temp_rec := g_rec;
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details,
    +         against_this_in => 'Expected exception "%PLS-00302: component ''BOGUS'' must be declared%". ' ||
    +                            'Actual exception raised was "' ||
    +                            'ORA-06550: line 1, column 17:' || CHR(10) ||
    +                            'PLS-00302: component ''BOGUS'' must be declared' || CHR(10) ||
    +                            'ORA-06550: line 1, column 7:' || CHR(10) ||
    +                            'PL/SQL: Statement ignored". ' ||
    +                            'Exception raised by: "begin wt_assert.bogus; end;".');
    +      --------------------------------------  WTPLSQL Testing --
    +      throws (
    +         msg_in         => 'THROWS Number Test',
    +         check_call_in  => 'begin wt_assert.bogus; end;',
    +         against_exc_in => 302);
    +      temp_rec := g_rec;
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details,
    +         against_this_in => 'Expected exception "%-00302%". ' ||
    +                            'Actual exception raised was "' ||
    +                            'ORA-06550: line 1, column 17:' || CHR(10) ||
    +                            'PLS-00302: component ''BOGUS'' must be declared' || CHR(10) ||
    +                            'ORA-06550: line 1, column 7:' || CHR(10) ||
    +                            'PL/SQL: Statement ignored". ' ||
    +                            'Exception raised by: "begin wt_assert.bogus; end;".');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Raises Tests Happy Path 3';
    +      raises (
    +         msg_in         => 'RAISES Varchar2 No Error',
    +         check_call_in  => 'begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;',
    +         against_exc_in => '');
    +      temp_rec := g_rec;
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details,
    +         against_this_in => 'No exception was expected. ' ||
    +                            'Exception raised was "". ' ||
    +                            'Exception raised by: "begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;".');
    +      --------------------------------------  WTPLSQL Testing --
    +      raises (
    +         msg_in         => 'RAISES Number No Error',
    +         check_call_in  => 'begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;',
    +         against_exc_in => cast (null as number));
    +      temp_rec := g_rec;
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details,
    +         against_this_in => 'No exception was expected. ' ||
    +                            'Exception raised was "". ' ||
    +                            'Exception raised by: "begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;".');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Raises Tests Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      raises (
    +         msg_in         => 'Not Used',
    +         check_call_in  => 'begin wt_assert.bogus; end;',
    +         against_exc_in => 'Incorrect Exception');
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => (temp_rec.last_details like
    +                            'Expected exception "%Incorrect Exception%". ' ||
    +                            'Actual exception raised was "ORA-%'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Raises Tests Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      raises (
    +         msg_in         => 'Not Used',
    +         check_call_in  => 'begin wt_assert.set_NLS_DATE_FORMAT; end;',
    +         against_exc_in => 'Incorrect Exception');
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => temp_rec.last_details,
    +         against_this_in => 'Expected exception "%Incorrect Exception%". ' ||
    +                            'No exception was raised by: "begin wt_assert.set_NLS_DATE_FORMAT; end;". ' ||
    +                            'Error Stack: ');
    +   end t_raises;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +-- EQQUERYVALUE
    +procedure eqqueryvalue (
    +      msg_in             in   varchar2,
    +      check_query_in     in   varchar2,
    +      against_value_in   in   varchar2,
    +      null_ok_in         in   boolean := false,
    +      raise_exc_in       in   boolean := false)
    +is
    +   type rc_type is ref cursor;
    +   l_rc          rc_type;
    +   l_rc_buff     varchar2(32000);
    +   l_errstack    varchar2(4000);
    +begin
    +   g_rec.last_assert     := 'EQQUERYVALUE';
    +   g_rec.last_msg        := msg_in;
    +   open l_rc for check_query_in;
    +   fetch l_rc into l_rc_buff;
    +   close l_rc;
    +   g_rec.last_pass    := (   l_rc_buff = against_value_in
    +                          or (    l_rc_buff is null
    +                              and against_value_in is null
    +                              and null_ok_in               )  );
    +   g_rec.last_details := 'Expected "' || substr(against_value_in,1,1000) ||
    +                        '" and got "' || substr(l_rc_buff       ,1,1000) ||
    +                      '" for Query: ' || substr(check_query_in  ,1,1000) ;
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +exception when others then
    +   l_errstack := substr(dbms_utility.format_error_stack ||
    +                        dbms_utility.format_error_backtrace,1,2900);
    +   g_rec.last_details := 'Exception raised for Query: ' ||
    +                          substr(check_query_in  ,1,1000) ||
    +                          CHR(10) || l_errstack;
    +   g_rec.last_pass    := FALSE;
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +end eqqueryvalue;
    +
    +-- EQQUERYVALUE XMLTYPE Overload
    +procedure eqqueryvalue (
    +      msg_in             in   varchar2,
    +      check_query_in     in   varchar2,
    +      against_value_in   in   XMLTYPE,
    +      null_ok_in         in   boolean := false,  -- Not Used, utPLSQL V1 API
    +      raise_exc_in       in   boolean := false)
    +is
    +   type rc_type is ref cursor;
    +   l_rc          rc_type;
    +   l_rc_buff     XMLTYPE;
    +   l_errstack    varchar2(4000);
    +begin
    +   g_rec.last_assert  := 'EQQUERYVALUE';
    +   g_rec.last_msg     := msg_in;
    +   open l_rc for check_query_in;
    +   fetch l_rc into l_rc_buff;
    +   close l_rc;
    +   g_rec.last_pass    := (xmltype.getclobval(l_rc_buff)       =
    +                          xmltype.getclobval(against_value_in)  );
    +   g_rec.last_details := 'Expected "' || substr(xmltype.getclobval(against_value_in),1,1000) ||
    +                        '" and got "' || substr(xmltype.getclobval(l_rc_buff       ),1,1000) ||
    +                      '" for Query: ' || substr(                   check_query_in   ,1,1000) ;
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +exception when others then
    +   l_errstack := substr(dbms_utility.format_error_stack ||
    +                        dbms_utility.format_error_backtrace,1,2900);
    +   g_rec.last_details := 'Exception raised for Query: ' ||
    +                          substr(check_query_in  ,1,1000) ||
    +                          CHR(10) || l_errstack;
    +   g_rec.last_pass    := FALSE;
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +end eqqueryvalue;
    +
    +-- EQQUERYVALUE CLOB Overload
    +procedure eqqueryvalue (
    +      msg_in             in   varchar2,
    +      check_query_in     in   varchar2,
    +      against_value_in   in   CLOB,
    +      null_ok_in         in   boolean := false,
    +      raise_exc_in       in   boolean := false)
    +is
    +   type rc_type is ref cursor;
    +   l_rc          rc_type;
    +   l_rc_buff     CLOB;
    +   l_errstack    varchar2(4000);
    +begin
    +   g_rec.last_assert  := 'EQQUERYVALUE';
    +   g_rec.last_msg     := msg_in;
    +   open l_rc for check_query_in;
    +   fetch l_rc into l_rc_buff;
    +   close l_rc;
    +   g_rec.last_pass    := (   l_rc_buff = against_value_in
    +                          or (    l_rc_buff is null
    +                              and against_value_in is null
    +                              and null_ok_in               )  );
    +   g_rec.last_details := 'Expected "' || substr(against_value_in,1,1000) ||
    +                        '" and got "' || substr(l_rc_buff       ,1,1000) ||
    +                      '" for Query: ' || substr(check_query_in  ,1,1000) ;
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +exception when others then
    +   l_errstack := substr(dbms_utility.format_error_stack ||
    +                        dbms_utility.format_error_backtrace,1,2900);
    +   g_rec.last_details := 'Exception raised for Query: ' ||
    +                          substr(check_query_in  ,1,1000) ||
    +                          CHR(10) || l_errstack;
    +   g_rec.last_pass    := FALSE;
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +end eqqueryvalue;
    +
    +-- EQQUERYVALUE BLOB Overload
    +procedure eqqueryvalue (
    +      msg_in             in   varchar2,
    +      check_query_in     in   varchar2,
    +      against_value_in   in   BLOB,
    +      null_ok_in         in   boolean := false,
    +      raise_exc_in       in   boolean := false)
    +is
    +   type rc_type is ref cursor;
    +   l_rc            rc_type;
    +   l_rc_buff       BLOB;
    +   compare_results number;
    +   l_errstack      varchar2(4000);
    +begin
    +   g_rec.last_assert  := 'EQQUERYVALUE';
    +   g_rec.last_msg     := msg_in;
    +   open l_rc for check_query_in;
    +   fetch l_rc into l_rc_buff;
    +   close l_rc;
    +   compare_results    := nvl(DBMS_LOB.COMPARE(l_rc_buff, against_value_in),-1);
    +   g_rec.last_pass    := (   (compare_results = 0)
    +                          or (    l_rc_buff is null
    +                              and against_value_in is null
    +                              and null_ok_in               )  );
    +   g_rec.last_details := 'DBMS_LOB.COMPARE between BLOB and Query: ' ||
    +                           substr(check_query_in  ,1,2000) ||
    +                        ', compare_results: ' || compare_results;
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +exception when others then
    +   l_errstack := substr(dbms_utility.format_error_stack ||
    +                        dbms_utility.format_error_backtrace,1,2900);
    +   g_rec.last_details := 'Exception raised for Query: ' ||
    +                          substr(check_query_in  ,1,1000) ||
    +                          CHR(10) || l_errstack;
    +   g_rec.last_pass    := FALSE;
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +end eqqueryvalue;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_eqqueryvalue
    +   is
    +      l_found_exception  BOOLEAN;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Happy Path 1';
    +      eqqueryvalue (
    +         msg_in             =>   'Run Test',
    +         check_query_in     =>   'select dummy from DUAL',
    +         against_value_in   =>   'X',
    +         null_ok_in         =>   false);
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => TRUE);
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_assert',
    +         check_this_in   => temp_rec.last_assert,
    +         against_this_in => 'EQQUERYVALUE');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_msg',
    +         check_this_in   => temp_rec.last_msg,
    +         against_this_in => 'Run Test');
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => temp_rec.last_details,
    +         against_this_in => 'Expected "X" and got "X" for Query: select dummy from DUAL');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Happy Path 2';
    +      eqqueryvalue (
    +         msg_in             =>   'Run Test',
    +         check_query_in     =>   'select max(dummy) from DUAL where 0 = 1',
    +         against_value_in   =>   '',
    +         null_ok_in         =>   true);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eqqueryvalue (
    +         msg_in             =>   'Not Used',
    +         check_query_in     =>   'select dummy from DUAL',
    +         against_value_in   =>   'Y');
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      begin
    +         eqqueryvalue (
    +            msg_in             =>   'Not Used',
    +            check_query_in     =>   'select dummy from DUAL',
    +            against_value_in   =>   'Y',
    +            raise_exc_in       =>   TRUE);
    +         l_found_exception := FALSE;
    +      exception when ASSERT_FAILURE_EXCEPTION then
    +         l_found_exception := TRUE;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.eq (
    +         msg_in          => 'RAISE_EXC_IN Test, Exception Raised?',
    +         check_this_in   => l_found_exception,
    +         against_this_in => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Sad Path 3';
    +      wtplsql_skip_save := TRUE;
    +      eqqueryvalue (
    +         msg_in             =>   'Not Used',
    +         check_query_in     =>   'Garbage query that won''t work',
    +         against_value_in   =>   'Y');
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details like
    +            'Exception raised for Query: Garbage query that won''t work' ||
    +            CHR(10) || 'ORA-00900: invalid SQL statement%');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Happy Path 1';
    +      eqqueryvalue (
    +         msg_in           => 'Run Test',
    +         check_query_in   => 'select temp_xml from wt_self_test where id = 1',
    +         against_value_in => temp_xml1);
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => TRUE);
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_assert',
    +         check_this_in   => temp_rec.last_assert,
    +         against_this_in => 'EQQUERYVALUE');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_msg',
    +         check_this_in   => temp_rec.last_msg,
    +         against_this_in => 'Run Test');
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => (temp_rec.last_details like
    +                            'Expected "<?xml version="1.0" encoding="UTF-8"?>%'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eqqueryvalue (
    +         msg_in             =>   'Not Used',
    +         check_query_in     =>   'select temp_xml from wt_self_test where id = 1',
    +         against_value_in   =>   temp_xml2);
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => (temp_rec.last_details like
    +                            'Expected "<?xml version="1.0" encoding="UTF-8"?>' ||
    +             '<note>2</note>" and got "<?xml version="1.0" encoding="UTF-8"?>%'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      begin
    +         eqqueryvalue (
    +            msg_in             =>   'Not Used',
    +            check_query_in     =>   'select temp_xml from wt_self_test where id = 1',
    +            against_value_in   =>   temp_xml2,
    +            raise_exc_in       =>   TRUE);
    +         l_found_exception := FALSE;
    +      exception when ASSERT_FAILURE_EXCEPTION then
    +         l_found_exception := TRUE;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.eq (
    +         msg_in          => 'RAISE_EXC_IN Test, Exception Raised?',
    +         check_this_in   => l_found_exception,
    +         against_this_in => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Sad Path 3';
    +      wtplsql_skip_save := TRUE;
    +      eqqueryvalue (
    +         msg_in             =>   'Not Used',
    +         check_query_in     =>   'Garbage query that won''t work',
    +         against_value_in   =>   temp_xml2);
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details like
    +            'Exception raised for Query: Garbage query that won''t work' ||
    +            CHR(10) || 'ORA-00900: invalid SQL statement%');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQQUERYVALUE CLOB Happy Path 1';
    +      eqqueryvalue (
    +         msg_in             =>   'Run Test',
    +         check_query_in     =>   'select temp_clob from wt_self_test where id = 1',
    +         against_value_in   =>   temp_clob1,
    +         null_ok_in         =>   false);
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => TRUE);
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_assert',
    +         check_this_in   => temp_rec.last_assert,
    +         against_this_in => 'EQQUERYVALUE');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_msg',
    +         check_this_in   => temp_rec.last_msg,
    +         against_this_in => 'Run Test');
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => (temp_rec.last_details like
    +                            'Expected "<?xml version="1.0" encoding="UTF-8"?>%'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQQUERYVALUE CLOB Happy Path 2';
    +      eqqueryvalue (
    +         msg_in             =>   'Run Test',
    +         check_query_in     =>   'select temp_clob from wt_self_test where 0 = 1',
    +         against_value_in   =>   '',
    +         null_ok_in         =>   true);
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQQUERYVALUE CLOB Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eqqueryvalue (
    +         msg_in             =>   'Not Used',
    +         check_query_in     =>   'select temp_clob from wt_self_test where id = 1',
    +         against_value_in   =>   temp_clob2);
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => (temp_rec.last_details like
    +                            'Expected "This is another clob." and got "' ||
    +                            '<?xml version="1.0" encoding="UTF-8"?>%'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQQUERYVALUE CLOB Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      begin
    +         eqqueryvalue (
    +            msg_in             =>   'Not Used',
    +            check_query_in     =>   'select temp_clob from wt_self_test where id = 1',
    +            against_value_in   =>   temp_clob2,
    +            raise_exc_in       =>   TRUE);
    +         l_found_exception := FALSE;
    +      exception when ASSERT_FAILURE_EXCEPTION then
    +         l_found_exception := TRUE;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.eq (
    +         msg_in          => 'RAISE_EXC_IN Test, Exception Raised?',
    +         check_this_in   => l_found_exception,
    +         against_this_in => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQQUERYVALUE CLOB Sad Path 3';
    +      wtplsql_skip_save := TRUE;
    +      eqqueryvalue (
    +         msg_in             =>   'Not Used',
    +         check_query_in     =>   'Garbage query that won''t work',
    +         against_value_in   =>   temp_clob2);
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details like
    +            'Exception raised for Query: Garbage query that won''t work' ||
    +            CHR(10) || 'ORA-00900: invalid SQL statement%');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQQUERYVALUE BLOB Happy Path 1';
    +      eqqueryvalue (
    +         msg_in             =>   'Run Test',
    +         check_query_in     =>   'select temp_blob from wt_self_test where id = 1',
    +         against_value_in   =>   temp_blob1,
    +         null_ok_in         =>   false);
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => TRUE);
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_assert',
    +         check_this_in   => temp_rec.last_assert,
    +         against_this_in => 'EQQUERYVALUE');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_msg',
    +         check_this_in   => temp_rec.last_msg,
    +         against_this_in => 'Run Test');
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => temp_rec.last_details,
    +         against_this_in => 'DBMS_LOB.COMPARE between BLOB and Query:' ||
    +                           ' select temp_blob from wt_self_test where id = 1, compare_results: 0');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQQUERYVALUE BLOB Happy Path 2';
    +      eqqueryvalue (
    +         msg_in             =>   'Run Test',
    +         check_query_in     =>   'select temp_blob from wt_self_test where 0 = 1',
    +         against_value_in   =>   cast (null as BLOB),
    +         null_ok_in         =>   true);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQQUERYVALUE BLOB Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eqqueryvalue (
    +         msg_in             =>   'Not Used',
    +         check_query_in     =>   'select temp_blob from wt_self_test where id = 1',
    +         against_value_in   =>   temp_blob2);
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => temp_rec.last_details,
    +         against_this_in => 'DBMS_LOB.COMPARE between BLOB and Query: ' ||
    +               'select temp_blob from wt_self_test where id = 1, compare_results: -1');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQQUERYVALUE BLOB Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      begin
    +         eqqueryvalue (
    +            msg_in             =>   'Not Used',
    +            check_query_in     =>   'select temp_blob from wt_self_test where id = 1',
    +            against_value_in   =>   temp_blob2,
    +            raise_exc_in       =>   TRUE);
    +         l_found_exception := FALSE;
    +      exception when ASSERT_FAILURE_EXCEPTION then
    +         l_found_exception := TRUE;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.eq (
    +         msg_in          => 'RAISE_EXC_IN Test, Exception Raised?',
    +         check_this_in   => l_found_exception,
    +         against_this_in => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQQUERYVALUE BLOB Sad Path 3';
    +      wtplsql_skip_save := TRUE;
    +      eqqueryvalue (
    +         msg_in             =>   'Not Used',
    +         check_query_in     =>   'Garbage query that won''t work',
    +         against_value_in   =>   temp_blob2);
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details like
    +            'Exception raised for Query: Garbage query that won''t work' ||
    +            CHR(10) || 'ORA-00900: invalid SQL statement%');
    +   end t_eqqueryvalue;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure eqquery (
    +      msg_in             in   varchar2,
    +      check_query_in     in   varchar2,
    +      against_query_in   in   varchar2,
    +      raise_exc_in       in   boolean := false)
    +is
    +begin
    +   g_rec.last_assert  := 'EQQUERY';
    +   g_rec.last_msg     := msg_in;
    +   compare_queries(check_query_in, against_query_in);
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +end eqquery;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_eqquery
    +   is
    +      l_found_exception  BOOLEAN;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQQUERY Tests Happy Path 1';
    +      wt_assert.eqquery (
    +         msg_in             =>   'Run Test',
    +         check_query_in     =>   'select * from USER_TABLES',
    +         against_query_in   =>   'select * from USER_TABLES');
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => TRUE);
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_assert',
    +         check_this_in   => temp_rec.last_assert,
    +         against_this_in => 'EQQUERY');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_msg',
    +         check_this_in   => temp_rec.last_msg,
    +         against_this_in => 'Run Test');
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this (
    +         msg_in          => 'EQQUERY Tests Happy Path 1b g_rec.last_details',
    +         check_this_in   => (temp_rec.last_details like
    +                            'Comparison Query: %'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQQUERY Tests Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eqquery (
    +         msg_in             =>   'Not Used',
    +         check_query_in     =>   'select * from USER_TABLES',
    +         against_query_in   =>   'select * from USER_TABLES where 0 = 1');
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => (temp_rec.last_details like
    +                            'Comparison Query: %'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQQUERY Tests Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      begin
    +         eqquery (
    +            msg_in             =>   'Not Used',
    +            check_query_in     =>   'select * from USER_TABLES',
    +            against_query_in   =>   'select * from USER_TABLES where 0 = 1',
    +            raise_exc_in       =>   TRUE);
    +         l_found_exception := FALSE;
    +      exception when ASSERT_FAILURE_EXCEPTION then
    +         l_found_exception := TRUE;
    +      end;
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.eq (
    +         msg_in          => 'RAISE_EXC_IN Test, Exception Raised?',
    +         check_this_in   => l_found_exception,
    +         against_this_in => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQQUERY Tests Sad Path 3';
    +      wtplsql_skip_save := TRUE;
    +      eqquery (
    +         msg_in             =>   'Not Used',
    +         check_query_in     =>   'select * from USER_TABLES',
    +         against_query_in   =>   'select * from ALL_TABLES');
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => (temp_rec.last_details like
    +                '%PL/SQL: ORA-01789: query block has incorrect number of result columns%'));
    +   end t_eqquery;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure eqtable (
    +      msg_in             in   varchar2,
    +      check_this_in      in   varchar2,
    +      against_this_in    in   varchar2,
    +      check_where_in     in   varchar2 := null,
    +      against_where_in   in   varchar2 := null,
    +      raise_exc_in       in   boolean := false)
    +is
    +   l_check_query    varchar2(16000) := 'select * from ' || check_this_in;
    +   l_against_query  varchar2(16000) := 'select * from ' || against_this_in;
    +begin
    +   g_rec.last_assert  := 'EQTABLE';
    +   g_rec.last_msg     := msg_in;
    +   if check_where_in is not null
    +   then
    +      l_check_query := l_check_query || ' where ' || check_where_in;
    +   end if;
    +   if against_where_in is not null
    +   then
    +      l_against_query := l_against_query || ' where ' || against_where_in;
    +   end if;
    +   compare_queries(l_check_query, l_against_query);
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +end eqtable;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_eqtable
    +   is
    +      l_found_exception  BOOLEAN;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQTABLE Tests Happy Path 1';
    +      wt_assert.eqtable (
    +         msg_in             =>   'Run Test',
    +         check_this_in      =>   'USER_TABLES',
    +         against_this_in    =>   'USER_TABLES',
    +         check_where_in     =>   '',
    +         against_where_in   =>   '');
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => TRUE);
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_assert',
    +         check_this_in   => temp_rec.last_assert,
    +         against_this_in => 'EQTABLE');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_msg',
    +         check_this_in   => temp_rec.last_msg,
    +         against_this_in => 'Run Test');
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => (temp_rec.last_details like
    +                            'Comparison Query: %'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQTABLE Tests Happy Path 2';
    +      eqtable (
    +         msg_in             =>   'Run Test',
    +         check_this_in      =>   'ALL_TABLES',
    +         against_this_in    =>   'ALL_TABLES',
    +         check_where_in     =>   'owner = ''' || USER || '''',
    +         against_where_in   =>   'owner = ''' || USER || '''');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQTABLE Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eqtable (
    +         msg_in             =>   'Not Used',
    +         check_this_in      =>   'ALL_TABLES',
    +         against_this_in    =>   'ALL_TABLES',
    +         check_where_in     =>   'owner = ''' || USER || '''',
    +         against_where_in   =>   '0 = 1');
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => (temp_rec.last_details like
    +                            'Comparison Query: %'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQTABLE Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      begin
    +         eqtable (
    +            msg_in             =>   'Not Used',
    +            check_this_in      =>   'ALL_TABLES',
    +            against_this_in    =>   'ALL_TABLES',
    +            check_where_in     =>   'owner = ''' || USER || '''',
    +            against_where_in   =>   '0 = 1',
    +            raise_exc_in       =>   TRUE);
    +         l_found_exception := FALSE;
    +      exception when ASSERT_FAILURE_EXCEPTION then
    +         l_found_exception := TRUE;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.eq (
    +         msg_in          => 'RAISE_EXC_IN Test, Exception Raised?',
    +         check_this_in   => l_found_exception,
    +         against_this_in => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQTABLE Sad Path 3';
    +      wtplsql_skip_save := TRUE;
    +      eqtable (
    +         msg_in             =>   'Not Used',
    +         check_this_in      =>   'USER_TABLES',
    +         against_this_in    =>   'ALL_TABLES');
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => temp_rec.last_details like
    +               '%PL/SQL: ORA-01789: query block has incorrect number of result columns%');
    +   end t_eqtable;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure eqtabcount (
    +      msg_in             in   varchar2,
    +      check_this_in      in   varchar2,
    +      against_this_in    in   varchar2,
    +      check_where_in     in   varchar2 := null,
    +      against_where_in   in   varchar2 := null,
    +      raise_exc_in       in   boolean := false)
    +is
    +   l_query      varchar2(16000) := 'select count(*) from ' || check_this_in;
    +   l_cnt        number;
    +   l_success    boolean;
    +   l_check_cnt  number;
    +   procedure l_run_query is
    +      type rc_type is ref cursor;
    +      l_rc rc_type;
    +   begin
    +      open l_rc for l_query;
    +      fetch l_rc into l_cnt;
    +      close l_rc;
    +      l_success := TRUE;
    +   exception
    +      when OTHERS
    +      then
    +         g_rec.last_details := SQLERRM || CHR(10) ||
    +                           'FAILURE of Compare Query: ' || l_query || ';';
    +         g_rec.last_pass    := FALSE;
    +         l_success      := FALSE;
    +         g_rec.raise_exception := raise_exc_in;
    +         process_assertion;
    +   end l_run_query;
    +begin
    +   g_rec.last_assert  := 'EQTABCOUNT';
    +   g_rec.last_msg     := msg_in;
    +   --
    +   l_query := 'select count(*) from ' || check_this_in;
    +   if check_where_in is not null
    +   then
    +      l_query := l_query || ' where ' || check_where_in;
    +   end if;
    +   l_run_query;
    +   if NOT l_success then return; end if;
    +   l_check_cnt := l_cnt;
    +   --
    +   l_query := 'select count(*) from ' || against_this_in;
    +   if against_where_in is not null
    +   then
    +      l_query := l_query || ' where ' || against_where_in;
    +   end if;
    +   l_run_query;
    +   if NOT l_success then return; end if;
    +   g_rec.last_pass    := (l_check_cnt = l_cnt);
    +   --
    +   g_rec.last_details := 'Expected ' || l_cnt       || ' rows from "' || against_this_in ||
    +                        '" and got ' || l_check_cnt || ' rows from "' || check_this_in   ||
    +                        '"';
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +end eqtabcount;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_eqtabcount
    +   is
    +      l_found_exception  BOOLEAN;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQTABCOUNT Tests Happy Path 1';
    +      eqtabcount (
    +         msg_in             =>   'Run Test',
    +         check_this_in      =>   'ALL_TABLES',
    +         against_this_in    =>   'ALL_TABLES',
    +         check_where_in     =>   'owner = ''' || USER || '''',
    +         against_where_in   =>   'owner = ''' || USER || '''');
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => TRUE);
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_assert',
    +         check_this_in   => temp_rec.last_assert,
    +         against_this_in => 'EQTABCOUNT');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_msg',
    +         check_this_in   => temp_rec.last_msg,
    +         against_this_in => 'Run Test');
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => (temp_rec.last_details like
    +                            'Expected % rows from "ALL_TABLES"' ||
    +                            ' and got % rows from "ALL_TABLES"'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQTABCOUNT Tests Happy Path 2';
    +      eqtabcount (
    +         msg_in             =>   'Run Test',
    +         check_this_in      =>   'ALL_TABLES',
    +         against_this_in    =>   'USER_TABLES',
    +         check_where_in     =>   'owner = ''' || USER || '''',
    +         against_where_in   =>   '');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQTABCOUNT Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      eqtabcount (
    +         msg_in             =>   'Not Used',
    +         check_this_in      =>   'ALL_TABLES',
    +         against_this_in    =>   'ALL_TABLES',
    +         check_where_in     =>   'owner = ''JOHN DOE''',
    +         against_where_in   =>   'owner = ''' || USER || '''');
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => (temp_rec.last_details like
    +                            'Expected % rows from "ALL_TABLES" and ' ||
    +                                 'got % rows from "ALL_TABLES"'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQTABCOUNT Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      begin
    +         eqtabcount (
    +            msg_in             =>   'Not Used',
    +            check_this_in      =>   'ALL_TABLES',
    +            against_this_in    =>   'ALL_TABLES',
    +            check_where_in     =>   'owner = ''JOHN DOE''',
    +            against_where_in   =>   'owner = ''' || USER || '''',
    +            raise_exc_in       =>   TRUE);
    +         l_found_exception := FALSE;
    +      exception when ASSERT_FAILURE_EXCEPTION then
    +         l_found_exception := TRUE;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.eq (
    +         msg_in          => 'RAISE_EXC_IN Test, Exception Raised?',
    +         check_this_in   => l_found_exception,
    +         against_this_in => TRUE);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQTABCOUNT Sad Path 3';
    +      wtplsql_skip_save := TRUE;
    +      eqtabcount (
    +         msg_in             =>   'Not Used',
    +         check_this_in      =>   'USER_TABLES',
    +         against_this_in    =>   'USER_TAB_COLUMNS');
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details);
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => (temp_rec.last_details like
    +               'Expected % rows from "USER_TAB_COLUMNS" and got % rows from "USER_TABLES"'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'EQTABCOUNT Sad Path 4';
    +      wtplsql_skip_save := TRUE;
    +      eqtabcount (
    +         msg_in             =>   'Not Used',
    +         check_this_in      =>   'BOGUS1',
    +         against_this_in    =>   'BOGUS2');
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.isnotnull (
    +         msg_in          => 'temp_rec.last_details value',
    +         check_this_in   => temp_rec.last_details);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => (temp_rec.last_details like
    +               '%table or view does not exist%'));
    +      wt_assert.this (
    +         msg_in          => 'temp_rec.last_details 2',
    +         check_this_in   => (temp_rec.last_details like
    +               '%FAILURE of Compare Query%'));
    +   end t_eqtabcount;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure objexists (
    +      msg_in        in   varchar2,
    +      obj_owner_in  in   varchar2,
    +      obj_name_in   in   varchar2,
    +      obj_type_in   in   varchar2 default null,
    +      raise_exc_in  in   boolean := false)
    +is
    +   l_num_objects  number;
    +begin
    +   g_rec.last_assert  := 'OBJEXISTS';
    +   g_rec.last_msg     := msg_in;
    +   select count(*) into l_num_objects
    +    from  all_objects
    +    where object_name = obj_name_in
    +     and  (   obj_owner_in is null
    +           or obj_owner_in = owner)
    +     and  (   obj_type_in is null
    +           or obj_type_in = object_type);
    +   g_rec.last_pass    := case l_num_objects when 0 then FALSE else TRUE end;
    +   g_rec.last_details := 'Number of objects found for "' ||
    +                         case when obj_owner_in is null then ''
    +                              else obj_owner_in || '.' end ||
    +                         obj_name_in || '"' ||
    +                         case when obj_type_in is null then ''
    +                              else '(' || obj_type_in || ')' end ||
    +                         ' is ' || l_num_objects;
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +end objexists;
    +
    +-- Concatenated SCHEMA_NAME.OBJECT_NAME
    +procedure objexists (
    +      msg_in          in   varchar2,
    +      check_this_in   in   varchar2,
    +      null_ok_in      in   boolean := false,  -- Not Used, utPLSQL V1 API
    +      raise_exc_in    in   boolean := false)
    +is
    +   l_pos    number := instr(check_this_in, '.');
    +begin
    +   objexists(msg_in       => msg_in
    +            ,obj_owner_in => substr(check_this_in, 1, l_pos-1)
    +            ,obj_name_in  => substr(check_this_in, l_pos+1, length(check_this_in)));
    +end objexists;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_object_exists
    +   is
    +      l_found_exception  BOOLEAN;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'OBJEXISTS Happy Path 1';
    +      objexists (
    +         msg_in        =>   'Run Test',
    +         obj_owner_in  =>   'SYS',
    +         obj_name_in   =>   'DUAL');
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => TRUE);
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_assert',
    +         check_this_in   => temp_rec.last_assert,
    +         against_this_in => 'OBJEXISTS');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_msg',
    +         check_this_in   => temp_rec.last_msg,
    +         against_this_in => 'Run Test');
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => temp_rec.last_details,
    +         against_this_in => 'Number of objects found for "SYS.DUAL" is 1');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'OBJEXISTS Happy Path 2';
    +      objexists (
    +         msg_in        =>   'Run Test',
    +         obj_owner_in  =>   'SYS',
    +         obj_name_in   =>   'DUAL',
    +         obj_type_in   =>   'TABLE');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'OBJEXISTS Happy Path 3';
    +      objexists (
    +         msg_in          =>  'Run Test',
    +         check_this_in   =>  'SYS.DUAL');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'OBJEXISTS Happy Path 4';
    +      objexists (
    +         msg_in          =>  'Run Test',
    +         check_this_in   =>  'DUAL');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'OBJEXISTS Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      objexists (
    +         msg_in        =>   'Not Used',
    +         obj_owner_in  =>   'JOE SMITH',
    +         obj_name_in   =>   'BOGUS');
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => temp_rec.last_details,
    +         against_this_in => 'Number of objects found for "JOE SMITH.BOGUS" is 0');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'OBJEXISTS Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      begin
    +         objexists (
    +            msg_in        =>   'Not Used',
    +            obj_owner_in  =>   'JOE SMITH',
    +            obj_name_in   =>   'BOGUS',
    +            raise_exc_in  =>   TRUE);
    +         l_found_exception := FALSE;
    +      exception when ASSERT_FAILURE_EXCEPTION then
    +         l_found_exception := TRUE;
    +      end;
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.eq (
    +         msg_in          => 'RAISE_EXC_IN Test, Exception Raised?',
    +         check_this_in   => l_found_exception,
    +         against_this_in => TRUE);
    +   end t_object_exists;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure objnotexists (
    +      msg_in        in   varchar2,
    +      obj_owner_in  in   varchar2,
    +      obj_name_in   in   varchar2,
    +      obj_type_in   in   varchar2 default null,
    +      raise_exc_in  in   boolean := false)
    +is
    +   l_num_objects  number;
    +begin
    +   g_rec.last_assert  := 'OBJNOTEXISTS';
    +   g_rec.last_msg     := msg_in;
    +   select count(*) into l_num_objects
    +    from  all_objects
    +    where object_name = obj_name_in
    +     and  (   obj_owner_in is null
    +           or obj_owner_in = owner)
    +     and  (   obj_type_in is null
    +           or obj_type_in = object_type);
    +   g_rec.last_pass    := case l_num_objects when 0 then TRUE else FALSE end;
    +   g_rec.last_details := 'Number of objects found for "' ||
    +                         case when obj_owner_in is null then ''
    +                              else obj_owner_in || '.' end ||
    +                         obj_name_in || '"' ||
    +                         case when obj_type_in is null then ''
    +                              else '(' || obj_type_in || ')' end ||
    +                         ' is ' || l_num_objects;
    +   g_rec.raise_exception := raise_exc_in;
    +   process_assertion;
    +end objnotexists;
    +
    +-- Concatenated SCHEMA_NAME.OBJECT_NAME
    +procedure objnotexists (
    +      msg_in          in   varchar2,
    +      check_this_in   in   varchar2,
    +      null_ok_in      in   boolean := false,  -- Not Used, utPLSQL V1 API
    +      raise_exc_in    in   boolean := false)
    +is
    +   l_pos    number := instr(check_this_in, '.');
    +begin
    +   objnotexists(msg_in       => msg_in
    +               ,obj_owner_in => substr(check_this_in, 1, l_pos-1)
    +               ,obj_name_in  => substr(check_this_in, l_pos+1, length(check_this_in)));
    +end objnotexists;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_object_not_exists
    +   is
    +      l_found_exception  BOOLEAN;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'OBJNOTEXISTS Happy Path 1';
    +      objnotexists (
    +         msg_in        =>   'Run Test',
    +         obj_owner_in  =>   'BOGUS',
    +         obj_name_in   =>   'THING123');
    +      temp_rec := g_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => TRUE);
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_assert',
    +         check_this_in   => temp_rec.last_assert,
    +         against_this_in => 'OBJNOTEXISTS');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_msg',
    +         check_this_in   => temp_rec.last_msg,
    +         against_this_in => 'Run Test');
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => temp_rec.last_details,
    +         against_this_in => 'Number of objects found for "BOGUS.THING123" is 0');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'OBJNOTEXISTS Happy Path 2';
    +      objnotexists (
    +         msg_in        =>   'Run Test',
    +         obj_owner_in  =>   'BOGUS',
    +         obj_name_in   =>   'THING123',
    +         obj_type_in   =>   'PACKAGE');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'OBJNOTEXISTS Happy Path 3';
    +      objnotexists (
    +         msg_in          =>   'Run Test',
    +         check_this_in   =>   'BOGUS.THING123');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'OBJNOTEXISTS Sad Path 1';
    +      wtplsql_skip_save := TRUE;
    +      objnotexists (
    +         msg_in        =>   'Not Used',
    +         obj_owner_in  =>   'SYS',
    +         obj_name_in   =>   'DUAL');
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_details',
    +         check_this_in   => temp_rec.last_details,
    +         against_this_in => 'Number of objects found for "SYS.DUAL" is 1');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'OBJNOTEXISTS Sad Path 2';
    +      wtplsql_skip_save := TRUE;
    +      begin
    +         objnotexists (
    +            msg_in        =>   'Not Used',
    +            obj_owner_in  =>   'SYS',
    +            obj_name_in   =>   'DUAL',
    +            raise_exc_in  =>   TRUE);
    +         l_found_exception := FALSE;
    +      exception when ASSERT_FAILURE_EXCEPTION then
    +         l_found_exception := TRUE;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      temp_rec := g_rec;
    +      wtplsql_skip_save := FALSE;
    +      wt_assert.eq (
    +         msg_in          => 'temp_rec.last_pass',
    +         check_this_in   => temp_rec.last_pass,
    +         against_this_in => FALSE);
    +      wt_assert.eq (
    +         msg_in          => 'RAISE_EXC_IN Test, Exception Raised?',
    +         check_this_in   => l_found_exception,
    +         against_this_in => TRUE);
    +   end t_object_not_exists;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +--==============================================================--
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   -- Can't profile this package because all the "assert" tests
    +   --   pause profiling before they execute.
    +   procedure WTPLSQL_RUN  --% WTPLSQL SET DBOUT "WT_ASSERT:PACKAGE BODY" %--
    +   is
    +   begin
    +      select temp_clob,  temp_nclob,  temp_xml,  temp_blob
    +       into  temp_clob1, temp_nclob1, temp_xml1, temp_blob1
    +       from  wt_self_test where id = 1;
    +      --------------------------------------  WTPLSQL Testing --
    +      t_boolean_to_status;
    +      t_process_assertion;
    +      t_compare_queries;
    +      t_nls_settings;
    +      t_last_values;
    +      t_reset_globals;
    +      t_this;
    +      t_eq;
    +      t_isnotnull;
    +      t_isnull;
    +      --------------------------------------  WTPLSQL Testing --
    +      t_raises;
    +      t_eqqueryvalue;
    +      t_eqquery;
    +      t_eqtable;
    +      t_eqtabcount;
    +      t_object_exists;
    +      t_object_not_exists;
    +   end WTPLSQL_RUN;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +--==============================================================--
    +
    +
    +end wt_assert;
    +
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/package body/WT_ASSERT/headerBg.jpg b/docs/persist/DBDocs/package body/WT_ASSERT/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 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
    nZDH?O8gS~#y@TeK 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 literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package body/WT_ASSERT/topDimTabR.gif b/docs/persist/DBDocs/package body/WT_ASSERT/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package body/WT_ASSERT/topTabBg.gif b/docs/persist/DBDocs/package body/WT_ASSERT/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package body/WT_ASSERT/topTabR.gif b/docs/persist/DBDocs/package body/WT_ASSERT/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + + +
    +
    +
    +

    Doc

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Code

    +
    +
    +
    +
    +
    +
    +
    + +


    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMEWT_PROFILER
    SUBOBJECT_NAMEnull
    OBJECT_ID41933
    DATA_OBJECT_IDnull
    OBJECT_TYPEPACKAGE BODY
    CREATED29-JUN-2018 15:09:17
    LAST_DDL_TIME29-JUN-2018 15:21:17
    TIMESTAMP2018-06-29:15:21:17
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE2
    EDITION_NAMEnull
    +
    +
    +
    +
    + + + + + + + + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    EXECUTEPUBLICNOWTPWT_PROFILER
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    +
    +package body wt_profiler
    +as
    +
    +   TYPE rec_type is record
    +      (test_run_id     wt_test_runs.id%TYPE
    +      ,dbout_owner     wt_test_runs.dbout_owner%TYPE
    +      ,dbout_name      wt_test_runs.dbout_name%TYPE
    +      ,dbout_type      wt_test_runs.dbout_type%TYPE
    +      ,prof_runid      binary_integer
    +      ,trigger_offset  binary_integer
    +      ,error_message   varchar2(4000));
    +   g_rec  rec_type;
    +
    +   TYPE ignr_aa_type is table
    +      of varchar2(1)
    +      index by PLS_INTEGER;
    +   g_ignr_aa   ignr_aa_type;
    +
    +   $IF $$WTPLSQL_SELFTEST $THEN  ------%WTPLSQL_begin_ignore_lines%------
    +      g_skip_insert  boolean := FALSE;
    +      g_skip_add     boolean := FALSE;
    +   $END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +----------------------
    +--  Private Procedures
    +----------------------
    +
    +
    +--==============================================================--
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +
    +   procedure tl_compile_db_object
    +         (in_ptype   in varchar2
    +         ,in_pname   in varchar2
    +         ,in_source  in varchar2)
    +   is
    +      l_sql_txt  varchar2(4000);
    +      l_errtxt   varchar2(32000) := '';
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      -- Wrap in_source to complete the DDL statement
    +      l_sql_txt := 'create or replace ' || in_ptype || ' ' ||
    +                   in_pname || ' is' || CHR(10) ||
    +                   in_source || CHR(10) ||
    +                   'end ' || in_pname || ';';
    +      wt_assert.raises
    +         (msg_in         => 'Compile ' || in_ptype || ' ' || in_pname
    +         ,check_call_in  => l_sql_txt
    +         ,against_exc_in => '');
    +      --------------------------------------  WTPLSQL Testing --
    +      for buff in (select * from user_errors
    +                    where attribute = 'ERROR'
    +                     and  name      = in_pname
    +                     and  type      = in_ptype
    +                    order by sequence)
    +      loop
    +         l_errtxt := l_errtxt || buff.line || ', ' ||
    +            buff.position || ': ' || buff.text || CHR(10);
    +      end loop;
    +      wt_assert.isnull
    +         (msg_in        => 'Compile ' || in_ptype || ' ' || in_pname ||
    +                            ' Error'
    +         ,check_this_in => l_errtxt);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.objexists (
    +         msg_in        => in_pname || ' ' || in_ptype,
    +         obj_owner_in  => USER,
    +         obj_name_in   => upper(in_pname),
    +         obj_type_in   => upper(in_ptype));
    +   end tl_compile_db_object;
    +--==============================================================--
    +      --------------------------------------  WTPLSQL Testing --
    +   procedure tl_drop_db_object
    +      (in_pname  in  varchar2,
    +       in_ptype  in  varchar2)
    +   is
    +      l_sql_txt  varchar2(4000);
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      l_sql_txt := 'drop ' || in_ptype || ' ' || in_pname;
    +      wt_assert.raises
    +         (msg_in         => 'drop ' || in_ptype || ' ' || in_pname
    +         ,check_call_in  => l_sql_txt
    +         ,against_exc_in => '');
    +      wt_assert.objnotexists (
    +         msg_in        => in_pname || ' ' || in_ptype,
    +         obj_owner_in  => USER,
    +         obj_name_in   => upper(in_pname),
    +         obj_type_in   => upper(in_ptype));
    +   end tl_drop_db_object;
    +--==============================================================--
    +      --------------------------------------  WTPLSQL Testing --
    +   procedure tl_count_plsql_profiler_recs
    +         (in_test_run_id     in number
    +         ,in_expected_count  in number)
    +   is
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eqqueryvalue
    +         (msg_in           => 'Number of plsql_profiler_runs (' || in_test_run_id || ')'
    +         ,check_query_in   => 'select count(*) from plsql_profiler_runs' ||
    +                              ' where runid = ' || in_test_run_id
    +         ,against_value_in => in_expected_count);
    +      wt_assert.eqqueryvalue
    +         (msg_in           => 'Number of plsql_profiler_units (' || in_test_run_id || ')'
    +         ,check_query_in   => 'select count(*) from plsql_profiler_units' ||
    +                              ' where runid = ' || in_test_run_id
    +         ,against_value_in => in_expected_count);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eqqueryvalue
    +         (msg_in           => 'Number of plsql_profiler_data (' || in_test_run_id || ')'
    +         ,check_query_in   => 'select count(*) from plsql_profiler_data' ||
    +                              ' where runid = ' || in_test_run_id
    +         ,against_value_in => in_expected_count);
    +   end tl_count_plsql_profiler_recs;
    +--==============================================================--
    +      --------------------------------------  WTPLSQL Testing --
    +   procedure tl_insert_plsql_profiler_recs
    +         (in_test_run_id     in number)
    +   is
    +      l_sql_txt    varchar2(4000);
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      l_sql_txt := 'insert into plsql_profiler_runs (runid)' ||
    +                   ' values (' || in_test_run_id || ')';
    +      wt_assert.raises (
    +         msg_in         => 'insert plsql_profiler_runs (' || in_test_run_id || ')',
    +         check_call_in  => l_sql_txt,
    +         against_exc_in => '');
    +      --------------------------------------  WTPLSQL Testing --
    +      l_sql_txt := 'insert into plsql_profiler_units (runid, unit_number, total_time)' ||
    +                   ' values (' || in_test_run_id || ', ' || in_test_run_id || ', 0)';
    +      wt_assert.raises (
    +         msg_in         => 'insert plsql_profiler_units (' || in_test_run_id || ')',
    +         check_call_in  => l_sql_txt,
    +         against_exc_in => '');
    +      --------------------------------------  WTPLSQL Testing --
    +      l_sql_txt := 'insert into plsql_profiler_data (runid, unit_number, line#)' ||
    +                   ' values (' || in_test_run_id || ', ' || in_test_run_id || ', 0)';
    +      wt_assert.raises (
    +         msg_in         => 'insert plsql_profiler_data (RUNID: ' || in_test_run_id || ')',
    +         check_call_in  => l_sql_txt,
    +         against_exc_in => '');
    +      commit;
    +   end tl_insert_plsql_profiler_recs;
    +--==============================================================--
    +      --------------------------------------  WTPLSQL Testing --
    +   procedure tl_delete_plsql_profiler_recs
    +         (in_test_run_id     in number)
    +   is
    +      l_sql_txt    varchar2(4000);
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      l_sql_txt := 'delete from plsql_profiler_data' ||
    +                   ' where runid = ' || in_test_run_id;
    +      wt_assert.raises (
    +         msg_in         => 'delete plsql_profiler_data (' || in_test_run_id || ')',
    +         check_call_in  => l_sql_txt,
    +         against_exc_in => '');
    +      --------------------------------------  WTPLSQL Testing --
    +      l_sql_txt := 'delete from plsql_profiler_units' ||
    +                   ' where runid = ' || in_test_run_id;
    +      wt_assert.raises (
    +         msg_in         => 'delete plsql_profiler_units (' || in_test_run_id || ')',
    +         check_call_in  => l_sql_txt,
    +         against_exc_in => '');
    +      --------------------------------------  WTPLSQL Testing --
    +      l_sql_txt := 'delete from plsql_profiler_runs' ||
    +                   ' where runid = ' || in_test_run_id;
    +      wt_assert.raises (
    +         msg_in         => 'delete plsql_profiler_runs (' || in_test_run_id || ')',
    +         check_call_in  => l_sql_txt,
    +         against_exc_in => '');
    +      commit;
    +   end tl_delete_plsql_profiler_recs;
    +--==============================================================--
    +      --------------------------------------  WTPLSQL Testing --
    +   procedure tl_insert_test_runs
    +         (in_test_run_id  in NUMBER
    +         ,in_runner_name  in varchar2)
    +   is
    +      l_sql_txt    varchar2(4000);
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      l_sql_txt := 'insert into wt_test_runs' ||
    +                   ' (id, start_dtm, runner_owner, runner_name)' ||
    +                   ' values (' || in_test_run_id || ', sysdate, USER, ''' ||
    +                                  in_runner_name || ''')';
    +      wt_assert.raises (
    +         msg_in         => 'Insert wt_test_runs (' || in_test_run_id || ')',
    +         check_call_in  => l_sql_txt,
    +         against_exc_in => '');
    +      wt_assert.eqqueryvalue (
    +         msg_in           => 'wt_test_runs (' || in_test_run_id || ') Count',
    +         check_query_in   => 'select count(*) from wt_test_runs' ||
    +                             ' where id = ' || in_test_run_id,
    +         against_value_in => 1);
    +      commit;
    +   end tl_insert_test_runs;
    +--==============================================================--
    +      --------------------------------------  WTPLSQL Testing --
    +   procedure tl_delete_test_runs
    +         (in_test_run_id  in NUMBER)
    +   is
    +      l_sql_txt  varchar2(4000);
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      l_sql_txt := 'delete from wt_test_runs where id = ' || in_test_run_id;
    +      wt_assert.raises (
    +         msg_in         => 'Delete wt_test_runs (' || in_test_run_id || ')',
    +         check_call_in  => l_sql_txt,
    +         against_exc_in => '');
    +      wt_assert.eqqueryvalue (
    +         msg_in           => 'wt_test_runs (' || in_test_run_id || ') Count',
    +         check_query_in   => 'select count(*) from wt_test_runs' ||
    +                             ' where id = ' || in_test_run_id,
    +         against_value_in => 0);
    +      commit;
    +   end tl_delete_test_runs;
    +--==============================================================--
    +      --------------------------------------  WTPLSQL Testing --
    +   procedure tl_insert_dbout_profiles
    +         (in_rec  in wt_dbout_profiles%ROWTYPE)
    +   is
    +      l_sqlerrm  varchar2(4000);
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      begin
    +         insert into wt_dbout_profiles values in_rec;
    +         l_sqlerrm := SQLERRM;
    +         commit;
    +      exception when others then
    +         l_sqlerrm := SQLERRM;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in        => 'Insert wt_dbout_profiles (' || in_rec.test_run_id ||
    +                                                   ',' || in_rec.line || ')',
    +         check_this_in => l_sqlerrm,
    +         against_this_in => 'ORA-0000: normal, successful completion');
    +      wt_assert.eqqueryvalue (
    +         msg_in           => 'wt_dbout_profiles (' || in_rec.test_run_id || 
    +                                               ',' || in_rec.line || ') Count',
    +         check_query_in   => 'select count(*) from wt_dbout_profiles' ||
    +                             ' where test_run_id = ' || in_rec.test_run_id ||
    +                             ' and line = ' || in_rec.line,
    +         against_value_in => 1);
    +   end tl_insert_dbout_profiles;
    +--==============================================================--
    +      --------------------------------------  WTPLSQL Testing --
    +   procedure tl_delete_dbout_profiles
    +         (in_test_run_id  in NUMBER)
    +   is
    +      l_sql_txt  varchar2(4000);
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      l_sql_txt := 'delete from wt_dbout_profiles where test_run_id = ' ||
    +                    in_test_run_id;
    +      wt_assert.raises (
    +         msg_in         => 'Delete wt_dbout_profiles (' || in_test_run_id || ')',
    +         check_call_in  => l_sql_txt,
    +         against_exc_in => '');
    +      wt_assert.eqqueryvalue (
    +         msg_in           => 'wt_dbout_profiles (' || in_test_run_id || ') Count',
    +         check_query_in   => 'select count(*) from wt_dbout_profiles' ||
    +                             ' where test_run_id = ' || in_test_run_id,
    +         against_value_in => 0);
    +      commit;
    +   end tl_delete_dbout_profiles;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +--==============================================================--
    +
    +
    +------------------------------------------------------------
    +-- Return DBMS_PROFILER specific error messages
    +function get_error_msg
    +      (retnum_in  in  binary_integer)
    +   return varchar2
    +is
    +   l_msg_prefix  varchar2(50) := 'DBMS_PROFILER Error: ';
    +begin
    +   case retnum_in
    +   when dbms_profiler.error_param then return l_msg_prefix ||
    +       'A subprogram was called with an incorrect parameter.';
    +   when dbms_profiler.error_io then return l_msg_prefix ||
    +       'Data flush operation failed.' ||
    +       ' Check whether the profiler tables have been created,' ||
    +       ' are accessible, and that there is adequate space.';
    +   when dbms_profiler.error_version then return l_msg_prefix ||
    +       'There is a mismatch between package and database implementation.' ||
    +       ' Oracle returns this error if an incorrect version of the' ||
    +       ' DBMS_PROFILER package is installed, and if the version of the' ||
    +       ' profiler package cannot work with this database version.';
    +   else return l_msg_prefix ||
    +       'Unknown error number ' || retnum_in;
    +   end case;
    +end get_error_msg;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_get_error_msg
    +   is
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Get Error Messages';
    +      wt_assert.isnotnull (
    +         msg_in        => 'ERROR_PARAM Test 1',
    +         check_this_in => get_error_msg(dbms_profiler.error_param));
    +      wt_assert.this (
    +         msg_in        => 'ERROR_PARAM Test 2',
    +         check_this_in => regexp_like(get_error_msg(dbms_profiler.error_param)
    +                                     ,'incorrect parameter','i'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in        => 'ERROR_IO Test 1',
    +         check_this_in => get_error_msg(dbms_profiler.error_io));
    +      wt_assert.this (
    +         msg_in        => 'ERROR_IO Test 2',
    +         check_this_in => regexp_like(get_error_msg(dbms_profiler.error_io)
    +                                     ,'Data flush operation','i'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in        => 'ERROR_VERSION Test 1',
    +         check_this_in => get_error_msg(dbms_profiler.error_version));
    +      wt_assert.this (
    +         msg_in        => 'ERROR_VERSION Test 2',
    +         check_this_in => regexp_like(get_error_msg(dbms_profiler.error_version)
    +                                     ,'incorrect version','i'));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in        => 'Unknown Error Test 1',
    +         check_this_in => get_error_msg(-9999));
    +      wt_assert.this (
    +         msg_in        => 'Unknown Error Test 2',
    +         check_this_in => regexp_like(get_error_msg(-9999)
    +                                     ,'Unknown error','i'));
    +   end t_get_error_msg;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure delete_plsql_profiler_recs
    +      (in_profiler_runid  in number)
    +is
    +   PRAGMA AUTONOMOUS_TRANSACTION;
    +begin
    +   delete from plsql_profiler_data
    +    where runid = in_profiler_runid;
    +   delete from plsql_profiler_units
    +    where runid = in_profiler_runid;
    +   delete from plsql_profiler_runs
    +    where runid = in_profiler_runid;
    +   COMMIT;
    +end delete_plsql_profiler_recs;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_delete_profiler_recs
    +   is
    +      c_test_run_id   constant number := -99;
    +      l_err_stack     varchar2(32000);
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Delete PL/SQL Profiler Records Happy Path 1';
    +      begin
    +         delete_plsql_profiler_recs(c_test_run_id);  -- Should run without error
    +         l_err_stack := dbms_utility.format_error_stack     ||
    +                        dbms_utility.format_error_backtrace ;
    +      exception when others then
    +         l_err_stack := dbms_utility.format_error_stack     ||
    +                        dbms_utility.format_error_backtrace ;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'delete_plsql_profiler_recs(' || c_test_run_id || ') 1',
    +         check_this_in   => l_err_stack);
    +      tl_count_plsql_profiler_recs(c_test_run_id, 0);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Delete PL/SQL Profiler Records Happy Path 2';
    +      tl_insert_plsql_profiler_recs(c_test_run_id);
    +      tl_count_plsql_profiler_recs(c_test_run_id, 1);
    +      begin
    +         delete_plsql_profiler_recs(c_test_run_id);  -- Should run without error
    +         l_err_stack := dbms_utility.format_error_stack     ||
    +                        dbms_utility.format_error_backtrace ;
    +      exception when others then
    +         l_err_stack := dbms_utility.format_error_stack     ||
    +                        dbms_utility.format_error_backtrace ;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'delete_plsql_profiler_recs(' || c_test_run_id || ') 2',
    +         check_this_in   => l_err_stack);
    +      tl_count_plsql_profiler_recs(c_test_run_id, 0);
    +   end t_delete_profiler_recs;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure find_dbout
    +      (in_pkg_name  in  varchar2)
    +is
    +   --
    +   -- https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements008.htm#SQLRF51129
    +   -- Within a namespace, no two objects can have the same name.  The following
    +   --   schema objects share one namespace:
    +   --  -) Packages
    +   --  -) Private synonyms
    +   --  -) Sequences
    +   --  -) Stand-alone procedures
    +   --  -) Stand-alone stored functions
    +   --  -) User-defined operators
    +   --  -) User-defined types
    +   --  -) Tables
    +   --  -) Views
    +   -- Each of the following schema objects has its own namespace:
    +   --  -) Clusters
    +   --  -) Constraints
    +   --  -) Database triggers
    +   --  -) Dimensions
    +   --  -) Indexes
    +   --  -) Materialized views (When you create a materialized view, the database
    +   --     creates an internal table of the same name. This table has the same
    +   --     namespace as the other tables in the schema. Therefore, a schema
    +   --     cannot contain a table and a materialized view of the same name.)
    +   --  -) Private database links
    +   -- Because tables and sequences are in the same namespace, a table and a
    +   --   sequence in the same schema cannot have the same name. However, tables
    +   --   and indexes are in different namespaces. Therefore, a table and an index
    +   --   in the same schema can have the same name.
    +   -- Each schema in the database has its own namespaces for the objects it
    +   --   contains. This means, for example, that two tables in different schemas
    +   --   are in different namespaces and can have the same name.
    +   -- Results are unknown if a Database Object Under Test has the same name in
    +   --   different namespaces.
    +   --
    +   -- Head Regular Expression is
    +   --   '--% WTPLSQL SET DBOUT "' - literal string
    +   -- Main Regular Expression is
    +   --   '[[:alnum:] ._$#:]'         - Any alpha, numeric, " ", ".", "_", "$", "#", or ":" character
    +   --   +                         - One or more of the previous characters
    +   -- Tail Regular Expression is
    +   --   '" %--'                   - literal string
    +   C_HEAD_RE CONSTANT varchar2(30) := '--% WTPLSQL SET DBOUT "';
    +   C_MAIN_RE CONSTANT varchar2(30) := '[[:alnum:] ._$#:]+';
    +   C_TAIL_RE CONSTANT varchar2(30) := '" %--';
    +   -- This cursor is used to catch the first occurance of a DBOUT annotation
    +   cursor c_annotation is
    +      select regexp_substr(src.text, C_HEAD_RE||C_MAIN_RE||C_TAIL_RE)  TEXT
    +       from  dba_source  src
    +       where src.owner = USER
    +        and  src.name  = in_pkg_name
    +        and  src.type  = 'PACKAGE BODY'
    +        and  regexp_like(src.text, C_HEAD_RE||C_MAIN_RE||C_TAIL_RE)
    +       order by src.line;
    +   l_target   varchar2(32000);
    +   -- This cursor is used to confirm the PL/SQL source is readable
    +   cursor c_readable is
    +      select *
    +       from  dba_source  src
    +       where src.owner  = g_rec.dbout_owner
    +        and  src.name   = g_rec.dbout_name
    +        and  src.type   = g_rec.dbout_type;
    +   b_readable  c_readable%ROWTYPE;
    +   -- These hold the positions of the separators dot (.) and colon (:)
    +   l_dot_pos   number;
    +   l_cln_pos   number;
    +begin
    +   -- Find the first occurance of the DBOUT annotation
    +   open c_annotation;
    +   fetch c_annotation into l_target;
    +   if c_annotation%NOTFOUND
    +   then
    +      -- No annotation was found, close and end
    +      close c_annotation;
    +      return;
    +   end if;
    +   close c_annotation;
    +   -- Strip the Head Sub-String
    +   l_target := regexp_replace(SRCSTR      => l_target
    +                             ,PATTERN     => '^' || C_HEAD_RE
    +                             ,REPLACESTR  => ''
    +                             ,POSITION    => 1
    +                             ,OCCURRENCE  => 1);
    +   -- Strip the Tail Sub-String
    +   l_target := regexp_replace(SRCSTR      => l_target
    +                             ,PATTERN     => C_TAIL_RE || '$'
    +                             ,REPLACESTR  => ''
    +                             ,POSITION    => 1
    +                             ,OCCURRENCE  => 1);
    +   -- Locate the Owner/Name separator
    +   l_dot_pos := instr(l_target,'.');
    +   l_cln_pos := instr(l_target,':');
    +   begin
    +      select obj.owner
    +            ,obj.object_name
    +            ,obj.object_type
    +       into  g_rec.dbout_owner
    +            ,g_rec.dbout_name
    +            ,g_rec.dbout_type
    +       from  dba_objects  obj
    +       where (   ( -- No separators were given, assume USER is the owner.
    +                   -- No object type was given. This could throw TOO_MANY_ROWS.
    +                      l_dot_pos       = 0
    +                  and l_cln_pos       = 0
    +                  and obj.owner       = USER
    +                  and obj.object_name = l_target  )
    +              OR ( -- No object type was given. This could throw TOO_MANY_ROWS.
    +                      l_dot_pos      != 0
    +                  and l_cln_pos       = 0
    +                  and obj.owner       = substr(l_target, 1, l_dot_pos-1)
    +                  and obj.object_name = substr(l_target, l_dot_pos+1, 512) )
    +              OR ( -- No object owner was given, assume USER is the owner.
    +                      l_dot_pos       = 0
    +                  and l_cln_pos      != 0
    +                  and obj.owner       = USER
    +                  and obj.object_name = substr(l_target, 1, l_cln_pos-1)
    +                  and obj.object_type = substr(l_target, l_cln_pos+1, 512) )
    +              OR ( -- All separators were given
    +                      l_dot_pos      != 0
    +                  and l_cln_pos      != 0
    +                  and obj.owner       = substr(l_target, 1, l_dot_pos-1)
    +                  and obj.object_name = substr(l_target, l_dot_pos+1, l_cln_pos-l_dot_pos-1)
    +                  and obj.object_type = substr(l_target, l_cln_pos+1, 512) )
    +             );
    +   exception
    +      when NO_DATA_FOUND
    +      then
    +         g_rec.error_message := 'Unable to find database object "' ||
    +                                 l_target  || '".';
    +         return;
    +      when TOO_MANY_ROWS
    +      then
    +         g_rec.error_message := 'Found too many database objects "' ||
    +                                 l_target || '".';
    +         return;
    +   end;
    +   -- Find the first occurance of any PL/SQL source
    +   open c_readable;
    +   fetch c_readable into b_readable;
    +   if c_readable%NOTFOUND
    +   then
    +      if g_rec.dbout_type in ('FUNCTION', 'PROCEDURE', 'PACKAGE BODY',
    +                              'TYPE BODY', 'TRIGGER')
    +      then
    +         -- These object types should have PL/SQL source code available
    +         --%WTPLSQL_begin_ignore_lines%--  Untestable:
    +         g_rec.error_message := 'Unable to read source for ' || g_rec.dbout_type ||
    +                             ' ' || g_rec.dbout_owner || '.' || g_rec.dbout_name ;
    +         --%WTPLSQL_end_ignore_lines%--
    +      else
    +         g_rec.prof_runid := -1;  -- Don't run profiler.
    +      end if;
    +   end if;
    +   close c_readable;
    +   --
    +end find_dbout;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_find_dbout
    +   is
    +      l_recSAVE    rec_type;
    +      l_recNULL    rec_type;
    +      l_recTEST    rec_type;
    +      l_pname      varchar2(128) := 'WT_PROFILE_FIND_DBOUT';
    +      --------------------------------------  WTPLSQL Testing --
    +      procedure run_find_dbout is begin
    +         l_recSAVE := g_rec;
    +         g_rec := l_recNULL;
    +         find_dbout(l_pname);
    +         l_recTEST := g_rec;
    +         g_rec := l_recSAVE;
    +      end run_find_dbout;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Find DBOUT Setup';
    +      tl_compile_db_object
    +         (in_ptype   => 'package'
    +         ,in_pname   => l_pname
    +         ,in_source  => '   l_junk number;' );
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Find DBOUT Happy Path 1';
    +      tl_compile_db_object
    +         (in_ptype   => 'package body'
    +         ,in_pname   => l_pname
    +         ,in_source  => 'begin'          || CHR(10) ||
    +                        '  l_junk := 1;' );
    +      run_find_dbout;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull
    +         (msg_in          => 'l_recTEST.dbout_owner'
    +         ,check_this_in   => l_recTEST.dbout_owner);
    +      wt_assert.isnull
    +         (msg_in          => 'l_recTEST.dbout_name'
    +         ,check_this_in   => l_recTEST.dbout_name);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull
    +         (msg_in          => 'l_recTEST.dbout_type'
    +         ,check_this_in   => l_recTEST.dbout_type);
    +      wt_assert.isnull
    +         (msg_in          => 'l_recTEST.error_message'
    +         ,check_this_in   => l_recTEST.error_message);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Find DBOUT Happy Path 2';
    +      tl_compile_db_object
    +         (in_ptype   => 'package body'
    +         ,in_pname   => l_pname
    +         ,in_source  => 
    +            '  --% WTPLSQL SET DBOUT "' || l_pname ||
    +                                     ':PACKAGE BODY" %--' || CHR(10) ||
    +            'begin'                                       || CHR(10) ||
    +            '  l_junk := 1;'                              );
    +      run_find_dbout;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq
    +         (msg_in          => 'l_recTEST.dbout_owner'
    +         ,check_this_in   => l_recTEST.dbout_owner
    +         ,against_this_in => USER);
    +      wt_assert.eq
    +         (msg_in          => 'l_recTEST.dbout_name'
    +         ,check_this_in   => l_recTEST.dbout_name
    +         ,against_this_in => l_pname);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq
    +         (msg_in          => 'l_recTEST.dbout_type'
    +         ,check_this_in   => l_recTEST.dbout_type
    +         ,against_this_in => 'PACKAGE BODY');
    +      wt_assert.isnull
    +         (msg_in        => 'l_recTEST.error_message'
    +         ,check_this_in => l_recTEST.error_message);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Find DBOUT Happy Path 3';
    +      tl_compile_db_object
    +         (in_ptype   => 'package body'
    +         ,in_pname   => l_pname
    +         ,in_source  => 
    +            '  --% WTPLSQL SET DBOUT "' || USER ||
    +                                    '.' || l_pname ||
    +                                    ':PACKAGE BODY" %--' || CHR(10) ||
    +            'begin'                                      || CHR(10) ||
    +            '  l_junk := 1;'                             );
    +      run_find_dbout;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq
    +         (msg_in          => 'l_recTEST.dbout_owner'
    +         ,check_this_in   => l_recTEST.dbout_owner
    +         ,against_this_in => USER);
    +      wt_assert.eq
    +         (msg_in          => 'l_recTEST.dbout_name'
    +         ,check_this_in   => l_recTEST.dbout_name
    +         ,against_this_in => l_pname);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq
    +         (msg_in          => 'l_recTEST.dbout_type'
    +         ,check_this_in   => l_recTEST.dbout_type
    +         ,against_this_in => 'PACKAGE BODY');
    +      wt_assert.isnull
    +         (msg_in        => 'l_recTEST.error_message'
    +         ,check_this_in => l_recTEST.error_message);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Find DBOUT Sad Path 1';
    +      tl_compile_db_object
    +         (in_ptype   => 'package body'
    +         ,in_pname   => l_pname
    +         ,in_source  =>
    +            -- Don't remove the "||", otherwise this will set the DBOUT
    +            '  --% WTPLSQL SET DBOUT ' || '"BOGUS1" %--' || CHR(10) ||
    +            'begin'                                      || CHR(10) ||
    +            '  l_junk := 1;'                             );
    +      run_find_dbout;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull
    +         (msg_in          => 'l_recTEST.dbout_owner'
    +         ,check_this_in   => l_recTEST.dbout_owner);
    +      wt_assert.isnull
    +         (msg_in          => 'l_recTEST.dbout_name'
    +         ,check_this_in   => l_recTEST.dbout_name);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull
    +         (msg_in          => 'l_recTEST.dbout_type'
    +         ,check_this_in   => l_recTEST.dbout_type);
    +      wt_assert.eq
    +         (msg_in          => 'l_recTEST.error_message'
    +         ,check_this_in   => l_recTEST.error_message
    +         ,against_this_in => 'Unable to find database object "BOGUS1".');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Find DBOUT Sad Path 2';
    +      tl_compile_db_object
    +         (in_ptype   => 'package body'
    +         ,in_pname   => l_pname
    +         ,in_source  => 
    +            '  --% WTPLSQL SET DBOUT "' || USER ||
    +                                    '.' || l_pname || '" %--'  || CHR(10) ||
    +            'begin'                                            || CHR(10) ||
    +            '  l_junk := 1;'                                   );
    +      run_find_dbout;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq
    +         (msg_in          => 'l_recTEST.dbout_owner'
    +         ,check_this_in   => l_recTEST.dbout_owner
    +         ,against_this_in => USER);
    +      wt_assert.eq
    +         (msg_in          => 'l_recTEST.dbout_name'
    +         ,check_this_in   => l_recTEST.dbout_name
    +         ,against_this_in => l_pname);
    +      wt_assert.eq
    +         (msg_in          => 'l_recTEST.error_message'
    +         ,check_this_in   => l_recTEST.error_message
    +         ,against_this_in => 'Found too many database objects "WTP.WT_PROFILE_FIND_DBOUT".');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Find DBOUT Sad Path 3';
    +      tl_compile_db_object
    +         (in_ptype   => 'package body'
    +         ,in_pname   => l_pname
    +         ,in_source  => 
    +            -- Don't remove the "||", otherwise this will set the DBOUT
    +            '  --% WTPLSQL SET DBOUT ' || '"SYS.ALL_OBJECTS:VIEW" %--' || CHR(10) ||
    +            'begin'                                                    || CHR(10) ||
    +            '  l_junk := 1;'                                           );
    +      run_find_dbout;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq
    +         (msg_in          => 'l_recTEST.dbout_owner'
    +         ,check_this_in   => l_recTEST.dbout_owner
    +         ,against_this_in => 'SYS');
    +      wt_assert.eq
    +         (msg_in          => 'l_recTEST.dbout_name'
    +         ,check_this_in   => l_recTEST.dbout_name
    +         ,against_this_in => 'ALL_OBJECTS');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq
    +         (msg_in          => 'l_recTEST.dbout_type'
    +         ,check_this_in   => l_recTEST.dbout_type
    +         ,against_this_in => 'VIEW');
    +      wt_assert.isnull
    +         (msg_in          => 'l_recTEST.error_message'
    +         ,check_this_in   => l_recTEST.error_message);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Find DBOUT Teardown';
    +      tl_drop_db_object(l_pname, 'package');
    +   end t_find_dbout;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure load_ignr_aa
    +is
    +   cursor c_find_begin is
    +      select line
    +            ,instr(text,'--%WTPLSQL_begin_ignore_lines%--') col
    +       from  dba_source
    +       where owner = g_rec.dbout_owner
    +        and  name  = g_rec.dbout_name
    +        and  type  = g_rec.dbout_type
    +        and  text like '%--\%WTPLSQL_begin_ignore_lines\%--%' escape '\'
    +       order by line;
    +   buff_find_begin  c_find_begin%ROWTYPE;
    +   cursor c_find_end (in_line in number, in_col in number) is
    +      with q1 as (
    +      select line
    +            ,instr(text,'--%WTPLSQL_end_ignore_lines%--') col
    +       from  dba_source
    +       where owner = g_rec.dbout_owner
    +        and  name  = g_rec.dbout_name
    +        and  type  = g_rec.dbout_type
    +        and  line >= in_line
    +        and  text like '%--\%WTPLSQL_end_ignore_lines\%--%' escape '\'
    +      )
    +      select line
    +            ,col
    +       from  q1
    +       where line > in_line
    +          or (    line = in_line
    +              and col  > in_col)
    +       order by line
    +            ,col;
    +   buff_find_end  c_find_end%ROWTYPE;
    +begin
    +   g_ignr_aa.delete;
    +   open c_find_begin;
    +   loop
    +      fetch c_find_begin into buff_find_begin;
    +      exit when c_find_begin%NOTFOUND;
    +      open c_find_end (buff_find_begin.line, buff_find_begin.col);
    +      fetch c_find_end into buff_find_end;
    +      if c_find_end%NOTFOUND
    +      then
    +         select max(line)
    +          into  buff_find_end.line
    +          from  dba_source
    +          where owner = g_rec.dbout_owner
    +           and  name  = g_rec.dbout_name
    +           and  type  = g_rec.dbout_type;
    +      end if;
    +      close c_find_end;
    +      for i in buff_find_begin.line + g_rec.trigger_offset ..
    +               buff_find_end.line   + g_rec.trigger_offset
    +      loop
    +         g_ignr_aa(i) := 'X';
    +      end loop;
    +   end loop;
    +   close c_find_begin;
    +end load_ignr_aa;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_load_ignr_aa
    +   is
    +      l_recSAVE    rec_type;
    +      l_ignrSAVE   ignr_aa_type;
    +      l_ignrTEST   ignr_aa_type;
    +      l_pname      varchar2(128) := 'WT_PROFILE_LOAD_IGNR';
    +      --------------------------------------  WTPLSQL Testing --
    +      procedure run_load_ignr is begin
    +         l_recSAVE  := g_rec;
    +         l_ignrSAVE := g_ignr_aa;
    +         g_ignr_aa.delete;
    +         g_rec.dbout_owner    := USER;
    +         g_rec.dbout_name     := l_pname;
    +         g_rec.dbout_type     := 'PACKAGE BODY';
    +         g_rec.trigger_offset := 0;
    +         load_ignr_aa;
    +         l_ignrTEST := g_ignr_aa;
    +         g_ignr_aa := l_ignrSAVE;
    +         g_rec   := l_recSAVE;
    +      end run_load_ignr;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Load Ignr Setup';
    +      wt_assert.isnotnull
    +         (msg_in    => 'Number of IGNR_AA elements'
    +         ,check_this_in => g_ignr_aa.COUNT);
    +      tl_compile_db_object
    +         (in_ptype   => 'package'
    +         ,in_pname   => l_pname
    +         ,in_source  => '  l_junk number;' );
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Load Ignr Happy Path 1';
    +      tl_compile_db_object
    +         (in_ptype   => 'package body'
    +         ,in_pname   => l_pname
    +         ,in_source  => 'begin'          || CHR(10) ||
    +                        '  l_junk := 1;' );
    +      run_load_ignr;
    +      wt_assert.eq
    +         (msg_in          => 'l_ignrTest.COUNT'
    +         ,check_this_in   => l_ignrTest.COUNT
    +         ,against_this_in => 0);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Load Ignr Happy Path 2';
    +      tl_compile_db_object
    +         (in_ptype   => 'package body'
    +         ,in_pname   => l_pname
    +         ,in_source  => 
    +            'begin'                                    || CHR(10) ||  -- Line 2
    +            '  --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) ||  -- Line 3
    +            '  l_junk := 1;'                           );             -- Line 4
    +            -- end                                                    -- Line 5
    +      run_load_ignr;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq
    +         (msg_in          => 'l_ignrTest.COUNT'
    +         ,check_this_in   => l_ignrTest.COUNT
    +         ,against_this_in => 3);
    +      for i in 3 .. 5
    +      loop
    +         wt_assert.eq
    +            (msg_in          => 'l_ignrTest.exists(' || i || ')'
    +            ,check_this_in   => l_ignrTest.exists(i)
    +            ,against_this_in => TRUE);
    +      end loop;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Load Ignr Happy Path 3';
    +      tl_compile_db_object
    +         (in_ptype   => 'package body'
    +         ,in_pname   => l_pname
    +         ,in_source  => 
    +            'begin'                                    || CHR(10) ||  -- Line 2
    +            '  l_junk := 1;'                           || CHR(10) ||  -- Line 3
    +            '  --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) ||  -- Line 4
    +            '  l_junk := 2;'                           || CHR(10) ||  -- Line 5
    +            '  --%WTPLSQL_end_' || 'ignore_lines%--'   || CHR(10) ||  -- Line 6
    +            '  l_junk := 3;'                           );             -- Line 7
    +      run_load_ignr;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq
    +         (msg_in          => 'l_ignrTest.COUNT'
    +         ,check_this_in   => l_ignrTest.COUNT
    +         ,against_this_in => 3);
    +      for i in 4 .. 6
    +      loop
    +         wt_assert.eq
    +            (msg_in          => 'l_ignrTest.exists(' || i || ')'
    +            ,check_this_in   => l_ignrTest.exists(i)
    +            ,against_this_in => TRUE);
    +      end loop;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Load Ignr Happy Path 4';
    +      tl_compile_db_object
    +         (in_ptype   => 'package body'
    +         ,in_pname   => l_pname
    +         ,in_source  => 
    +            'begin'                                    || CHR(10) ||  -- Line 2
    +            '  l_junk := 1;'                           || CHR(10) ||  -- Line 3
    +            '  --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) ||  -- Line 4
    +            '  l_junk := 2;'                           || CHR(10) ||  -- Line 5
    +            '  --%WTPLSQL_end_' || 'ignore_lines%--'   || CHR(10) ||  -- Line 6
    +            '  l_junk := 3;'                           || CHR(10) ||  -- Line 7
    +            '  --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) ||  -- Line 8
    +            '  l_junk := 4;'                           );             -- Line 9
    +            -- end                                                    -- Line 10
    +      run_load_ignr;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq
    +         (msg_in          => 'l_ignrTest.COUNT'
    +         ,check_this_in   => l_ignrTest.COUNT
    +         ,against_this_in => 6);
    +      for i in 4 .. 6
    +      loop
    +         wt_assert.eq
    +            (msg_in          => 'l_ignrTest.exists(' || i || ')'
    +            ,check_this_in   => l_ignrTest.exists(i)
    +            ,against_this_in => TRUE);
    +      end loop;
    +      --------------------------------------  WTPLSQL Testing --
    +      for i in 8 .. 10
    +      loop
    +         wt_assert.eq
    +            (msg_in          => 'l_ignrTest.exists(' || i || ')'
    +            ,check_this_in   => l_ignrTest.exists(i)
    +            ,against_this_in => TRUE);
    +      end loop;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Load Ignr Sad Path 1';
    +      tl_compile_db_object
    +         (in_ptype   => 'package body'
    +         ,in_pname   => l_pname
    +         ,in_source  => 
    +            'begin'                                    || CHR(10) ||  -- Line 2
    +            '  --%WTPLSQL_end_' || 'ignore_lines%--'   || CHR(10) ||  -- Line 3
    +            '  l_junk := 4;'                           );             -- Line 4
    +      run_load_ignr;
    +      wt_assert.eq
    +         (msg_in          => 'l_ignrTest.COUNT'
    +         ,check_this_in   => l_ignrTest.COUNT
    +         ,against_this_in => 0);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Load Ignr Sad Path 2';
    +      tl_compile_db_object
    +         (in_ptype   => 'package body'
    +         ,in_pname   => l_pname
    +         ,in_source  => 
    +            'begin'                                    || CHR(10) ||  -- Line 2
    +            '  l_junk := 1;'                           || CHR(10) ||  -- Line 3
    +            '  --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) ||  -- Line 4
    +            '  l_junk := 2;'                           || CHR(10) ||  -- Line 5
    +            '  --%WTPLSQL_end_' || 'ignore_lines%--'   || CHR(10) ||  -- Line 6
    +            '  l_junk := 3;'                           || CHR(10) ||  -- Line 7
    +            '  --%WTPLSQL_end_' || 'ignore_lines%--'   || CHR(10) ||  -- Line 8
    +            '  l_junk := 4;'                           );             -- Line 9
    +      run_load_ignr;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq
    +         (msg_in          => 'l_ignrTest.COUNT'
    +         ,check_this_in   => l_ignrTest.COUNT
    +         ,against_this_in => 3);
    +      for i in 4 .. 6
    +      loop
    +         wt_assert.eq
    +            (msg_in          => 'l_ignrTest.exists(' || i || ')'
    +            ,check_this_in   => l_ignrTest.exists(i)
    +            ,against_this_in => TRUE);
    +      end loop;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Load Ignr Sad Path 3';
    +      tl_compile_db_object
    +         (in_ptype   => 'package body'
    +         ,in_pname   => l_pname
    +         ,in_source  => 
    +            'begin'                                    || CHR(10) ||  -- Line 2
    +            '  l_junk := 1;'                           || CHR(10) ||  -- Line 3
    +            '  --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) ||  -- Line 4
    +            '  l_junk := 2;'                           || CHR(10) ||  -- Line 5
    +            '  --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) ||  -- Line 6
    +            '  l_junk := 3;'                           || CHR(10) ||  -- Line 7
    +            '  --%WTPLSQL_end_' || 'ignore_lines%--'   || CHR(10) ||  -- Line 8
    +            '  l_junk := 4;'                           );             -- Line 9
    +      run_load_ignr;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq
    +         (msg_in          => 'l_ignrTest.COUNT'
    +         ,check_this_in   => l_ignrTest.COUNT
    +         ,against_this_in => 5);
    +      for i in 4 .. 8
    +      loop
    +         wt_assert.eq
    +            (msg_in          => 'l_ignrTest.exists(' || i || ')'
    +            ,check_this_in   => l_ignrTest.exists(i)
    +            ,against_this_in => TRUE);
    +      end loop;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Load Ignr Teardown';
    +      tl_drop_db_object(l_pname, 'package');
    +      wt_assert.isnotnull
    +         (msg_in    => 'Number of IGNR_AA elements'
    +         ,check_this_in => g_ignr_aa.COUNT);
    +   end t_load_ignr_aa;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure insert_dbout_profile
    +is
    +   PRAGMA AUTONOMOUS_TRANSACTION;
    +   prof_rec    wt_dbout_profiles%ROWTYPE;
    +   l_max_line  number;
    +   procedure l_set_status is begin
    +      if g_ignr_aa.EXISTS(prof_rec.line)
    +      then
    +         -- Found Statement to Ignore
    +         prof_rec.status := 'IGNR';
    +         return;
    +      end if;
    +      if prof_rec.total_occur > 0
    +      then
    +         -- Found Executed Statement
    +         prof_rec.status := 'EXEC';
    +         return;
    +      end if;
    +      if    prof_rec.total_occur = 0
    +        and prof_rec.total_usecs = 0
    +      then
    +         -- Check for declaration if Not Executed
    +         if regexp_like(prof_rec.text, '^[[:space:]]*' ||
    +                       '(FUNCTION|PROCEDURE|PACKAGE|TYPE|TRIGGER)' ||
    +                       '[[:space:]]', 'i')
    +         then
    +            -- Exclude declarations if Not Executed
    +            prof_rec.status := 'EXCL';
    +         elsif     prof_rec.line = l_max_line
    +               AND regexp_like(prof_rec.text, 'END', 'i')
    +         then
    +            prof_rec.status := 'EXCL';
    +         else
    +            -- Found Not Executed Statement
    +            prof_rec.status := 'NOTX';
    +         end if;
    +         return;
    +      end if;
    +      -- Everything else is unknown
    +      prof_rec.status := 'UNKN';
    +   end l_set_status;
    +begin
    +   -- This will not RAISE NO_DATA_FOUND because it uses a GROUP FUNCTION.
    +   select max(ppd.line#) into l_max_line
    +    from  plsql_profiler_units ppu
    +          join plsql_profiler_data  ppd
    +               on  ppd.unit_number = ppu.unit_number
    +               and ppd.runid       = g_rec.prof_runid
    +    where ppu.unit_owner = g_rec.dbout_owner
    +     and  ppu.unit_name  = g_rec.dbout_name
    +     and  ppu.unit_type  = g_rec.dbout_type
    +     and  ppu.runid      = g_rec.prof_runid;
    +   load_ignr_aa;
    +   prof_rec.test_run_id := g_rec.test_run_id;
    +   for buf1 in (
    +      select src.line
    +            ,ppd.total_occur
    +            ,ppd.total_time
    +            ,ppd.min_time
    +            ,ppd.max_time
    +            ,src.text
    +       from  plsql_profiler_units ppu
    +             join plsql_profiler_data  ppd
    +                  on  ppd.unit_number = ppu.unit_number
    +                  and ppd.runid       = g_rec.prof_runid
    +             join dba_source  src
    +                  on  src.line  = ppd.line# + g_rec.trigger_offset
    +                  and src.owner = g_rec.dbout_owner
    +                  and src.name  = g_rec.dbout_name
    +                  and src.type  = g_rec.dbout_type
    +       where ppu.unit_owner = g_rec.dbout_owner
    +        and  ppu.unit_name  = g_rec.dbout_name
    +        and  ppu.unit_type  = g_rec.dbout_type
    +        and  ppu.runid      = g_rec.prof_runid )
    +   loop
    +      prof_rec.line        := buf1.line;
    +      prof_rec.total_occur := buf1.total_occur;
    +      prof_rec.total_usecs := buf1.total_time/1000;
    +      prof_rec.min_usecs   := buf1.min_time/1000;
    +      prof_rec.max_usecs   := buf1.max_time/1000;
    +      prof_rec.text        := buf1.text;
    +      prof_rec.status      := NULL;
    +      l_set_status;
    +      insert into wt_dbout_profiles values prof_rec;
    +
    +   $IF $$WTPLSQL_SELFTEST $THEN  ------%WTPLSQL_begin_ignore_lines%------
    +      if not g_skip_add then
    +   $END
    +      wt_test_run_stat.add_profile(prof_rec);
    +   $IF $$WTPLSQL_SELFTEST $THEN
    +      end if;
    +   $END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +   end loop;
    +   COMMIT;
    +   -- Delete PLSQL Profiler has it's own
    +   --   PRAGMA AUTONOMOUS_TRANSACTION and COMMIT;
    +   g_ignr_aa.delete;
    +   delete_plsql_profiler_recs(g_rec.prof_runid);
    +end insert_dbout_profile;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_insert_dbout_profile
    +   is
    +      units_rec      plsql_profiler_units%ROWTYPE;
    +      data_rec       plsql_profiler_data%ROWTYPE;
    +      l_recSAVE      rec_type;
    +      l_recNULL      rec_type;
    +      c_test_run_id  constant number := -97;
    +      l_pname        varchar2(128) := 'WT_PROFILE_INSERT_DBOUT';
    +      l_sqlerrm      varchar2(4000);
    +      l_err_stack    varchar2(32000);
    +      --------------------------------------  WTPLSQL Testing --
    +      procedure insert_plsql_profiler_data
    +            (in_line#        in number
    +            ,in_total_occur  in number
    +            ,in_total_time   in number)
    +      is
    +      begin
    +         data_rec.line#       := in_line#;
    +         data_rec.total_occur := in_total_occur;
    +         data_rec.total_time  := in_total_time;
    +      --------------------------------------  WTPLSQL Testing --
    +         begin
    +            insert into plsql_profiler_data values data_rec;
    +            commit;
    +            l_sqlerrm := SQLERRM;
    +         exception when others then
    +            l_sqlerrm := SQLERRM;
    +         end;
    +         wt_assert.eq (
    +            msg_in          => 'insert plsql_profiler_data (LINE#: ' || data_rec.line#|| ')',
    +            check_this_in   => SQLERRM,
    +            against_this_in => 'ORA-0000: normal, successful completion');
    +      end insert_plsql_profiler_data;
    +      --------------------------------------  WTPLSQL Testing --
    +      procedure test_dbout_profiler
    +            (in_line#     in  number
    +            ,in_col_name  in  varchar2
    +            ,in_value     in  varchar2)
    +      is
    +      begin
    +         wt_assert.eqqueryvalue
    +            (msg_in           => 'wt_dbout_profiles line ' || in_line# ||
    +                                               ', column ' || in_col_name
    +            ,check_query_in   => 'select ' || in_col_name ||
    +                                 ' from wt_dbout_profiles' ||
    +                                 ' where test_run_id = ' || c_test_run_id ||
    +                                 ' and line = ' || in_line#
    +            ,against_value_in => in_value);
    +      end test_dbout_profiler;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Insert DBOUT Profile Setup';
    +      tl_compile_db_object
    +         (in_ptype   => 'package'
    +         ,in_pname   => l_pname
    +         ,in_source  => '  l_junk number;' );
    +      --------------------------------------  WTPLSQL Testing --
    +      tl_compile_db_object
    +         (in_ptype   => 'package body'
    +         ,in_pname   => l_pname
    +         ,in_source  => 
    +            'begin'                                    || CHR(10) ||  -- Line 2
    +            '  l_junk := 1;'                           || CHR(10) ||  -- Line 3
    +            '  --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) ||  -- Line 4
    +            '  l_junk := 2;'                           || CHR(10) ||  -- Line 5
    +            '  --%WTPLSQL_end_' || 'ignore_lines%--'   || CHR(10) ||  -- Line 6
    +            '  if 0 = 1 then'                          || CHR(10) ||  -- Line 7
    +            '     l_junk := 3;'                        || CHR(10) ||  -- Line 8
    +            '  end if;'                                );             -- Line 9
    +      tl_insert_plsql_profiler_recs(c_test_run_id);
    +      tl_count_plsql_profiler_recs(c_test_run_id, 1);
    +      tl_insert_test_runs(c_test_run_id, 'Insert DBOUT Test');
    +      --------------------------------------  WTPLSQL Testing --
    +      units_rec.runid        := c_test_run_id;
    +      units_rec.unit_number  := 1;
    +      units_rec.unit_owner   := USER;
    +      units_rec.unit_name    := l_pname;
    +      units_rec.unit_type    := 'PACKAGE BODY';
    +      units_rec.total_time   := 0;
    +      --------------------------------------  WTPLSQL Testing --
    +      begin
    +         insert into plsql_profiler_units values units_rec;
    +         commit;
    +         l_err_stack := dbms_utility.format_error_stack     ||
    +                        dbms_utility.format_error_backtrace ;
    +      exception when others then
    +         l_err_stack := dbms_utility.format_error_stack     ||
    +                        dbms_utility.format_error_backtrace ;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'insert UNIT 1 into plsql_profiler_units',
    +         check_this_in   => l_err_stack);
    +      wt_assert.eqqueryvalue
    +         (msg_in           => 'Number of UNIT 1 plsql_profiler_units'
    +         ,check_query_in   => 'select count(*) from plsql_profiler_units' ||
    +                              ' where runid = ' || c_test_run_id ||
    +                              ' and unit_number = 1'
    +         ,against_value_in => 1);
    +      --------------------------------------  WTPLSQL Testing --
    +      data_rec.runid       := c_test_run_id;
    +      data_rec.unit_number := 1;
    +      data_rec.min_time    := 0;
    +      data_rec.max_time    := 1;
    +      insert_plsql_profiler_data(1, 0, 0);
    +      insert_plsql_profiler_data(2, 0, 1);
    +      insert_plsql_profiler_data(3, 1, 1);
    +      insert_plsql_profiler_data(5, 1, 1);
    +      insert_plsql_profiler_data(7, 1, 1);
    +      insert_plsql_profiler_data(8, 0, 0);
    +      insert_plsql_profiler_data(9, 1, 1);
    +      insert_plsql_profiler_data(10, 0, 0);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eqqueryvalue
    +         (msg_in           => 'Number of UNIT 1 plsql_profiler_data'
    +         ,check_query_in   => 'select count(*) from plsql_profiler_data' ||
    +                              ' where runid = ' || c_test_run_id ||
    +                              ' and unit_number = 1'
    +         ,against_value_in => 8);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Insert DBOUT Profile Happy Path';
    +      l_recSAVE := g_rec;
    +      g_rec.test_run_id     := c_test_run_id;
    +      g_rec.dbout_owner     := USER;
    +      g_rec.dbout_name      := l_pname;
    +      g_rec.dbout_type      := 'PACKAGE BODY';
    +      g_rec.prof_runid      := c_test_run_id;
    +      g_rec.trigger_offset  := 0;
    +      g_rec.error_message   := '';
    +      --------------------------------------  WTPLSQL Testing --
    +      g_skip_add := TRUE;
    +      begin
    +         insert_dbout_profile;
    +         l_err_stack := dbms_utility.format_error_stack     ||
    +                        dbms_utility.format_error_backtrace ;
    +      exception when others then
    +         l_err_stack := dbms_utility.format_error_stack     ||
    +                        dbms_utility.format_error_backtrace ;
    +      end;
    +      g_skip_add := FALSE;
    +      g_rec := l_recSAVE;
    +      wt_assert.isnull (
    +         msg_in          => 'SQLERRM',
    +         check_this_in   => l_err_stack);
    +      --------------------------------------  WTPLSQL Testing --
    +      test_dbout_profiler(1, 'STATUS', 'EXCL');
    +      test_dbout_profiler(1, 'TEXT',   'package body WT_PROFILE_INSERT_DBOUT is' || CHR(10));
    +      test_dbout_profiler(2, 'STATUS', 'UNKN');
    +      test_dbout_profiler(2, 'TEXT',   'begin' || CHR(10));
    +      test_dbout_profiler(3, 'STATUS', 'EXEC');
    +      test_dbout_profiler(3, 'TEXT',   '  l_junk := 1;' || CHR(10));
    +      test_dbout_profiler(5, 'STATUS', 'IGNR');
    +      test_dbout_profiler(5, 'TEXT',   '  l_junk := 2;' || CHR(10));
    +      test_dbout_profiler(7, 'STATUS', 'EXEC');
    +      test_dbout_profiler(7, 'TEXT',   '  if 0 = 1 then' || CHR(10));
    +      test_dbout_profiler(8, 'STATUS', 'NOTX');
    +      test_dbout_profiler(8, 'TEXT',   '     l_junk := 3;' || CHR(10));
    +      test_dbout_profiler(9, 'STATUS', 'EXEC');
    +      test_dbout_profiler(9, 'TEXT',   '  end if;' || CHR(10));
    +      test_dbout_profiler(10, 'STATUS', 'EXCL');
    +      test_dbout_profiler(10, 'TEXT',   'end WT_PROFILE_INSERT_DBOUT;');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Insert DBOUT Profile Teardown';
    +      tl_delete_dbout_profiles(c_test_run_id);
    +      tl_delete_test_runs(c_test_run_id);
    +      tl_delete_plsql_profiler_recs(c_test_run_id);
    +      tl_count_plsql_profiler_recs(c_test_run_id, 0);
    +      tl_drop_db_object(l_pname, 'package');
    +   end t_insert_dbout_profile;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +---------------------
    +--  Public Procedures
    +---------------------
    +
    +
    +------------------------------------------------------------
    +procedure initialize
    +      (in_test_run_id      in  number,
    +       in_runner_name      in  varchar2,
    +       out_dbout_owner     out varchar2,
    +       out_dbout_name      out varchar2,
    +       out_dbout_type      out varchar2,
    +       out_trigger_offset  out number,
    +       out_profiler_runid  out number,
    +       out_error_message   out varchar2)
    +is
    +   l_rec_NULL     rec_type;
    +   l_retnum       binary_integer;
    +begin
    +   -- Reset variables
    +   out_dbout_owner     := '';
    +   out_dbout_name      := '';
    +   out_dbout_type      := '';
    +   out_trigger_offset  := NULL;
    +   out_profiler_runid  := NULL;
    +   out_error_message   := '';
    +   g_rec := l_rec_NULL;
    +   $IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +   $THEN
    +      -- In case a test failed and left this set to TRUE
    +      g_skip_insert := FALSE;
    +      g_skip_add    := FALSE;
    +   $END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +   -- Abort if there is no Test Run ID
    +   if in_test_run_id is null
    +   then
    +      raise_application_error  (-20004, 'i_test_run_id is null');
    +   end if;
    +   g_rec.test_run_id := in_test_run_id;
    +   -- Find the Database Object Under Test
    +   find_dbout(in_pkg_name => in_runner_name);
    +   out_dbout_owner    := g_rec.dbout_owner;
    +   out_dbout_name     := g_rec.dbout_name;
    +   out_dbout_type     := g_rec.dbout_type;
    +   out_error_message  := g_rec.error_message;
    +   -- There muxt be a name and no error message
    +   if    g_rec.dbout_name    is null      -- No DBOUT notation
    +      or g_rec.error_message is not null  -- Error with DBOUT or Source
    +      or g_rec.prof_runid     = -1        -- Skip Profiling
    +   then
    +      g_rec.prof_runid := NULL;
    +      return;
    +   end if;
    +   -- Calculate the trigger offset, if any.
    +   g_rec.trigger_offset := wt_profiler.trigger_offset
    +                              (dbout_owner_in => g_rec.dbout_owner
    +                              ,dbout_name_in  => g_rec.dbout_name
    +                              ,dbout_type_in  => g_rec.dbout_type );
    +   out_trigger_offset := g_rec.trigger_offset;
    +   -- Check Versions
    +   l_retnum := dbms_profiler.INTERNAL_VERSION_CHECK;
    +   if l_retnum <> 0 then
    +      ------%WTPLSQL_begin_ignore_lines%------  Can't test this
    +      --dbms_profiler.get_version(major_version, minor_version);
    +      raise_application_error(-20005,
    +         'dbms_profiler.INTERNAL_VERSION_CHECK returned: ' || get_error_msg(l_retnum));
    +      ----------------%WTPLSQL_end_ignore_lines%----------------
    +   end if;
    +   -- This starts the PROFILER Running!!!
    +   --dbms_output.put_line('DEBUG1. g_rec.prof_runid = ' || g_rec.prof_runid);
    +   l_retnum := dbms_profiler.START_PROFILER(run_number => g_rec.prof_runid);
    +   if l_retnum <> 0 then
    +      ------%WTPLSQL_begin_ignore_lines%------  Can't test this
    +      raise_application_error(-20006,
    +         'dbms_profiler.START_PROFILER returned: ' || get_error_msg(l_retnum));
    +      ----------------%WTPLSQL_end_ignore_lines%----------------
    +   end if;
    +   -- Everything is OK, set the Profiler Run ID
    +   out_profiler_runid := g_rec.prof_runid;
    +   --dbms_output.put_line('DEBUG2. g_rec.prof_runid = ' || g_rec.prof_runid);
    +end initialize;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_initialize
    +   is
    +      c_test_run_id   constant number := -96;
    +      l_pname         varchar2(128) := 'WT_PROFILE_INITIALIZE';
    +      l_recSAVE       rec_type;
    +      l_recTEST       rec_type;
    +      l_recOUT        rec_type;
    +      l_sqlerrm       varchar2(4000);
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Insert DBOUT Profile Setup';
    +      tl_compile_db_object
    +         (in_ptype   => 'package'
    +         ,in_pname   => l_pname
    +         ,in_source  => '  l_junk number;' );
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Initialize Test HAPPY Path 1';
    +      tl_compile_db_object
    +         (in_ptype   => 'package body'
    +         ,in_pname   => l_pname
    +         ,in_source  => 
    +            'begin'          || CHR(10) ||  -- Line 2
    +            '  l_junk := 7;' );             -- Line 3
    +      --------------------------------------  WTPLSQL Testing --
    +      l_recSAVE := g_rec;
    +      initialize
    +         (in_test_run_id      => c_test_run_id,
    +          in_runner_name      => l_pname,
    +          out_dbout_owner     => l_recOUT.dbout_owner,
    +          out_dbout_name      => l_recOUT.dbout_name,
    +          out_dbout_type      => l_recOUT.dbout_type,
    +          out_trigger_offset  => l_recOUT.trigger_offset,
    +          out_profiler_runid  => l_recOUT.prof_runid,
    +          out_error_message   => l_recOUT.error_message);
    +      l_recTEST := g_rec;
    +      g_rec := l_recSAVE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'OUT dbout_owner',
    +         check_this_in   => l_recOUT.dbout_owner);
    +      wt_assert.isnull (
    +         msg_in          => 'OUT dbout_name',
    +         check_this_in   => l_recOUT.dbout_name);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'OUT dbout_type',
    +         check_this_in   => l_recOUT.dbout_type);
    +      wt_assert.isnull (
    +         msg_in          => 'OUT prof_runid',
    +         check_this_in   => l_recOUT.prof_runid);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'OUT trigger_offset',
    +         check_this_in   => l_recOUT.trigger_offset);
    +      wt_assert.isnull (
    +         msg_in          => 'OUT error_message',
    +         check_this_in   => l_recOUT.error_message);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.dbout_owner',
    +         check_this_in   => l_recTEST.dbout_owner);
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.dbout_name',
    +         check_this_in   => l_recTEST.dbout_name);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.dbout_type',
    +         check_this_in   => l_recTEST.dbout_type);
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.prof_runid',
    +         check_this_in   => l_recTEST.prof_runid);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.trigger_offset',
    +         check_this_in   => l_recTEST.trigger_offset);
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.error_message',
    +         check_this_in   => l_recTEST.error_message);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Initialize Test HAPPY Path 2';
    +      tl_compile_db_object
    +         (in_ptype   => 'package body'
    +         ,in_pname   => l_pname
    +         ,in_source  => 
    +            'begin'                                     || CHR(10) ||  -- Line 2
    +            '--% WTPLSQL SET DBOUT "' || l_pname ||
    +                                   ':PACKAGE BODY" %--' || CHR(10) ||  -- Line 3
    +            '  l_junk := 7;'                            );             -- Line 4
    +      --------------------------------------  WTPLSQL Testing --
    +      l_recSAVE := g_rec;
    +      initialize
    +         (in_test_run_id      => c_test_run_id,
    +          in_runner_name      => l_pname,
    +          out_dbout_owner     => l_recOUT.dbout_owner,
    +          out_dbout_name      => l_recOUT.dbout_name,
    +          out_dbout_type      => l_recOUT.dbout_type,
    +          out_trigger_offset  => l_recOUT.trigger_offset,
    +          out_profiler_runid  => l_recOUT.prof_runid,
    +          out_error_message   => l_recOUT.error_message);
    +      l_recTEST := g_rec;
    +      g_rec := l_recSAVE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'OUT dbout_owner',
    +         check_this_in   => l_recOUT.dbout_owner,
    +         against_this_in => USER);
    +      wt_assert.eq (
    +         msg_in          => 'OUT dbout_name',
    +         check_this_in   => l_recOUT.dbout_name,
    +         against_this_in => l_pname);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'OUT dbout_type',
    +         check_this_in   => l_recOUT.dbout_type,
    +         against_this_in => 'PACKAGE BODY');
    +      wt_assert.isnotnull (
    +         msg_in          => 'OUT prof_runid',
    +         check_this_in   => l_recOUT.prof_runid);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'OUT trigger_offset',
    +         check_this_in   => l_recOUT.trigger_offset,
    +         against_this_in => 0);
    +      wt_assert.isnull (
    +         msg_in          => 'OUT error_message',
    +         check_this_in   => l_recOUT.error_message);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.dbout_owner',
    +         check_this_in   => l_recTEST.dbout_owner,
    +         against_this_in => USER);
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.dbout_name',
    +         check_this_in   => l_recTEST.dbout_name,
    +         against_this_in => l_pname);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.dbout_type',
    +         check_this_in   => l_recTEST.dbout_type,
    +         against_this_in => 'PACKAGE BODY');
    +      wt_assert.isnotnull (
    +         msg_in          => 'l_recTEST.prof_runid',
    +         check_this_in   => l_recTEST.prof_runid);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.trigger_offset',
    +         check_this_in   => l_recTEST.trigger_offset,
    +         against_this_in => 0);
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.error_message',
    +         check_this_in   => l_recTEST.error_message);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Initialize Test Sad Path 1';
    +      l_recSAVE := g_rec;
    +      begin
    +         initialize
    +            (in_test_run_id      => null,
    +             in_runner_name      => 'Sad Path 1',
    +             out_dbout_owner     => l_recOUT.dbout_owner,
    +             out_dbout_name      => l_recOUT.dbout_name,
    +             out_dbout_type      => l_recOUT.dbout_type,
    +             out_trigger_offset  => l_recOUT.trigger_offset,
    +             out_profiler_runid  => l_recOUT.prof_runid,
    +             out_error_message   => l_recOUT.error_message);
    +         l_sqlerrm := SQLERRM;
    +      --------------------------------------  WTPLSQL Testing --
    +      exception when others then
    +         l_sqlerrm := SQLERRM;
    +      end;
    +      l_recTEST := g_rec;
    +      g_rec := l_recSAVE;
    +      wt_assert.eq (
    +         msg_in          => 'SQLERRM',
    +         check_this_in   => l_sqlerrm,
    +         against_this_in => 'ORA-20004: i_test_run_id is null');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Insert DBOUT Profile Teardown';
    +      tl_drop_db_object
    +         (in_ptype   => 'package'
    +         ,in_pname   => l_pname);
    +   end t_initialize;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +-- Because this procedure is called to cleanup after erorrs,
    +--  it must be able to run multiple times without causing damage.
    +procedure finalize
    +is
    +   l_rec_NULL  rec_type;
    +begin
    +   if g_rec.prof_runid is null
    +   then
    +      return;
    +   end if;
    +   if g_rec.test_run_id is null
    +   then
    +      raise_application_error (-20000, 'g_rec.test_run_id is null');
    +   end if;
    +   $IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +   $THEN
    +      if not g_skip_insert
    +      then
    +   $END
    +   begin
    +      -- DBMS_PROFILER.FLUSH_DATA is included with DBMS_PROFILER.STOP_PROFILER
    +      --dbms_output.put_line('DEBUG3. g_rec.prof_runid = ' || g_rec.prof_runid);
    +      dbms_profiler.STOP_PROFILER;
    +   exception when others then
    +      g_rec := l_rec_NULL;
    +      --dbms_output.put_line('DEBUG4. SQLERRM = ' || sqlerrm);
    +      raise;
    +   end;
    +   insert_dbout_profile;
    +   $IF $$WTPLSQL_SELFTEST
    +   $THEN
    +      end if;
    +   $END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +   g_rec := l_rec_NULL;
    +end finalize;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_finalize
    +   is
    +      l_recSAVE    rec_type;
    +      l_recTEST    rec_type;
    +      l_sqlerrm    varchar2(4000);
    +      l_err_stack  varchar2(32000);
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Finalize Happy Path 1';
    +      l_recSAVE := g_rec;
    +      g_rec.prof_runid := NULL;
    +      wt_assert.isnull (
    +         msg_in          => 'g_rec.prof_runid',
    +         check_this_in   => g_rec.prof_runid);
    +      --------------------------------------  WTPLSQL Testing --
    +      begin
    +         finalize;
    +         l_err_stack := dbms_utility.format_error_stack     ||
    +                        dbms_utility.format_error_backtrace ;
    +      exception when others then
    +         l_err_stack := dbms_utility.format_error_stack     ||
    +                        dbms_utility.format_error_backtrace ;
    +      end;
    +      g_rec := l_recSAVE;
    +      wt_assert.isnull (
    +         msg_in          => 'format_error_stack and format_error_backtrace',
    +         check_this_in   => l_err_stack);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Finalize Happy Path 2';
    +      l_recSAVE := g_rec;
    +      g_rec.test_run_id    := -1;
    +      g_rec.dbout_owner    := 'TEST OWNER';
    +      g_rec.dbout_name     := 'TEST NAME';
    +      g_rec.dbout_type     := 'TEST TYPE';
    +      g_rec.prof_runid     := -2;
    +      g_rec.trigger_offset := -3;
    +      g_rec.error_message  := 'TEST MESSAGE';
    +      --------------------------------------  WTPLSQL Testing --
    +      g_skip_insert := TRUE;
    +      begin
    +         finalize;
    +         l_err_stack := dbms_utility.format_error_stack     ||
    +                        dbms_utility.format_error_backtrace ;
    +      exception when others then
    +         l_err_stack := dbms_utility.format_error_stack     ||
    +                        dbms_utility.format_error_backtrace ;
    +      end;
    +      g_skip_insert := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      l_recTEST := g_rec;
    +      g_rec := l_recSAVE;
    +      wt_assert.isnull (
    +         msg_in          => 'SQLERRM',
    +         check_this_in   => l_err_stack);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.test_run_id',
    +         check_this_in   => l_recTEST.test_run_id);
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.dbout_owner',
    +         check_this_in   => l_recTEST.dbout_owner);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.dbout_name',
    +         check_this_in   => l_recTEST.dbout_name);
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.dbout_type',
    +         check_this_in   => l_recTEST.dbout_type);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.prof_runid',
    +         check_this_in   => l_recTEST.prof_runid);
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.trigger_offset',
    +         check_this_in   => l_recTEST.trigger_offset);
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.error_message',
    +         check_this_in   => l_recTEST.error_message);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Finalize Sad Path 1';
    +      l_recSAVE := g_rec;
    +      g_rec.prof_runid := -1;
    +      g_rec.test_run_id := NULL;
    +      begin
    +         finalize;
    +      exception when others then
    +         l_sqlerrm := SQLERRM;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      g_rec := l_recSAVE;
    +      wt_assert.eq (
    +         msg_in          => 'SQLERRM',
    +         check_this_in   => l_sqlerrm,
    +         against_this_in => 'ORA-20000: g_rec.test_run_id is null');
    +   end t_finalize;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +-- Find begining of PL/SQL Block in a Trigger
    +function trigger_offset
    +      (dbout_owner_in  in  varchar2
    +      ,dbout_name_in   in  varchar2
    +      ,dbout_type_in   in  varchar2)
    +   return number
    +is
    +begin
    +   if dbout_type_in != 'TRIGGER'
    +   then
    +      return 0;
    +   end if;
    +   for buff in (
    +      select line, text from dba_source
    +       where owner = dbout_owner_in
    +        and  name  = dbout_name_in
    +        and  type  = 'TRIGGER'
    +      order by line )
    +   loop
    +      if regexp_instr(buff.text,
    +                      '(^declare$' ||
    +                      '|^declare[[:space:]]' ||
    +                      '|[[:space:]]declare$' ||
    +                      '|[[:space:]]declare[[:space:]])', 1, 1, 0, 'i') <> 0
    +         OR
    +         regexp_instr(buff.text,
    +                      '(^begin$' ||
    +                      '|^begin[[:space:]]' ||
    +                      '|[[:space:]]begin$' ||
    +                      '|[[:space:]]begin[[:space:]])', 1, 1, 0, 'i') <> 0 
    +      then
    +         return buff.line - 1;
    +      end if;
    +   end loop;
    +   return 0;
    +end trigger_offset;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_trigger_offset
    +   is
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Trigger Offset Happy Path';
    +      wt_assert.eq (
    +         msg_in          => 'Trigger Test',
    +         check_this_in   => trigger_offset (dbout_owner_in => USER
    +                                           ,dbout_name_in  => 'WT_SELF_TEST$TEST'
    +                                           ,dbout_type_in  => 'TRIGGER'),
    +         against_this_in => 3);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'Package Test',
    +         check_this_in   => trigger_offset (dbout_owner_in => USER
    +                                           ,dbout_name_in  => 'WT_PROFILER'
    +                                           ,dbout_type_in  => 'PACKAGE BODY'),
    +         against_this_in => 0);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Trigger Offset Sad Path';
    +      wt_assert.eq (
    +         msg_in          => 'Non Existent Object',
    +         check_this_in   => trigger_offset (dbout_owner_in => 'BOGUS456'
    +                                           ,dbout_name_in  => 'BOGUS123'
    +                                           ,dbout_type_in  => 'TRIGGER'),
    +         against_this_in => 0);
    +   end t_trigger_offset;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +function calc_pct_coverage
    +      (in_test_run_id  in  number)
    +   return number
    +IS
    +BEGIN
    +   for buff in (
    +      select sum(case status when 'EXEC' then 1 else 0 end)    HITS
    +            ,sum(case status when 'NOTX' then 1 else 0 end)    MISSES
    +       from  wt_dbout_profiles  p
    +       where test_run_id = in_test_run_id  )
    +   loop
    +      if buff.hits + buff.misses = 0
    +      then
    +         return -1;
    +      else
    +         return round(100 * buff.hits / (buff.hits + buff.misses),2);
    +      end if;
    +   end loop;
    +   return null;
    +END calc_pct_coverage;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_calc_pct_coverage
    +   is
    +      c_test_run_id  constant number := -95;
    +      l_rec          wt_dbout_profiles%ROWTYPE;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Calculate Percent Coverage Setup';
    +      tl_insert_test_runs(c_test_run_id, 'Calculate Offset Test');
    +      l_rec.test_run_id  := c_test_run_id;
    +      l_rec.total_occur  := 1;
    +      l_rec.total_usecs  := 1;
    +      l_rec.min_usecs    := 1;
    +      l_rec.max_usecs    := 1;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Calculate Percent Coverage Happy Path 1';
    +      l_rec.line         := 1;
    +      l_rec.status       := 'EXEC';
    +      l_rec.text         := 'Testing ' || l_rec.line;
    +      tl_insert_dbout_profiles(l_rec);
    +      --------------------------------------  WTPLSQL Testing --
    +      l_rec.line         := 2;
    +      l_rec.status       := 'NOTX';
    +      l_rec.text         := 'Testing ' || l_rec.line;
    +      tl_insert_dbout_profiles(l_rec);
    +      --------------------------------------  WTPLSQL Testing --
    +      l_rec.line         := 3;
    +      l_rec.status       := 'EXEC';
    +      l_rec.text         := 'Testing ' || l_rec.line;
    +      tl_insert_dbout_profiles(l_rec);
    +      wt_assert.eq (
    +         msg_in          => 'Main Test',
    +         check_this_in   => calc_pct_coverage(c_test_run_id),
    +         against_this_in => 66.67);
    +      tl_delete_dbout_profiles(c_test_run_id);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Calculate Percent Coverage Happy Path 2';
    +      l_rec.line         := 1;
    +      l_rec.status       := 'EXCL';
    +      l_rec.text         := 'Testing ' || l_rec.line;
    +      tl_insert_dbout_profiles(l_rec);
    +      --------------------------------------  WTPLSQL Testing --
    +      l_rec.line         := 2;
    +      l_rec.status       := 'UNKN';
    +      l_rec.text         := 'Testing ' || l_rec.line;
    +      tl_insert_dbout_profiles(l_rec);
    +      --------------------------------------  WTPLSQL Testing --
    +      l_rec.line         := 3;
    +      l_rec.status       := 'EXCL';
    +      l_rec.text         := 'Testing ' || l_rec.line;
    +      tl_insert_dbout_profiles(l_rec);
    +      wt_assert.eq (
    +         msg_in          => 'Main Test',
    +         check_this_in   => calc_pct_coverage(c_test_run_id),
    +         against_this_in => -1);
    +      tl_delete_dbout_profiles(c_test_run_id);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Calculate Percent Coverage Sad Path';
    +      wt_assert.isnull (
    +         msg_in        => 'Missing Test Run ID',
    +         check_this_in => calc_pct_coverage(-99990));
    +      wt_assert.isnull (
    +         msg_in        => 'NULL Test Run ID',
    +         check_this_in => calc_pct_coverage(null));
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Calculate Percent Coverage Teardown';
    +      tl_delete_test_runs(c_test_run_id);
    +   end t_calc_pct_coverage;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure delete_records
    +      (in_test_run_id  in number)
    +is
    +   l_profiler_runid  number;
    +begin
    +   select profiler_runid into l_profiler_runid
    +    from wt_test_runs where id = in_test_run_id;
    +   delete_plsql_profiler_recs(l_profiler_runid);
    +   delete from wt_dbout_profiles
    +    where test_run_id = in_test_run_id;
    +exception
    +   when NO_DATA_FOUND
    +   then
    +      return;
    +end delete_records;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_delete_records
    +   is
    +      c_test_run_id  constant number := -98;
    +      l_rec          wt_dbout_profiles%ROWTYPE;
    +      l_err_stack    varchar2(32000);
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Delete Records Setup';
    +      wt_assert.eqqueryvalue (
    +         msg_in           => 'wt_test_runs Count 0',
    +         check_query_in   => 'select count(*) from wt_test_runs' ||
    +                             ' where id = ' || c_test_run_id,
    +         against_value_in => 0);
    +      wt_assert.eqqueryvalue (
    +         msg_in           => 'wt_dbout_profiles Count 0',
    +         check_query_in   => 'select count(*) from wt_dbout_profiles' ||
    +                             ' where test_run_id = ' || c_test_run_id,
    +         against_value_in => 0);
    +      tl_insert_test_runs(c_test_run_id, 'Delete Records Test');
    +      --------------------------------------  WTPLSQL Testing --
    +      l_rec.test_run_id  := c_test_run_id;
    +      l_rec.line         := 1;
    +      l_rec.status       := 'EXEC';
    +      l_rec.total_occur  := 1;
    +      l_rec.total_usecs  := 1;
    +      l_rec.min_usecs    := 1;
    +      l_rec.max_usecs    := 1;
    +      l_rec.text         := 'Testing';
    +      tl_insert_dbout_profiles(l_rec);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Delete Records Happy Path 1';
    +      begin
    +         delete_records(c_test_run_id);
    +         l_err_stack := dbms_utility.format_error_stack     ||
    +                        dbms_utility.format_error_backtrace ;
    +      exception when others then
    +         l_err_stack := dbms_utility.format_error_stack     ||
    +                        dbms_utility.format_error_backtrace ;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in        => 'SQLERRM',
    +         check_this_in => l_err_stack);
    +      wt_assert.eqqueryvalue (
    +         msg_in           => 'wt_dbout_profiles Count 2',
    +         check_query_in   => 'select count(*) from wt_dbout_profiles' ||
    +                             ' where test_run_id = ' || c_test_run_id,
    +         against_value_in => 0);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Delete Records Sad Path 1';
    +      begin
    +         delete_records(-9876);
    +         l_err_stack := dbms_utility.format_error_stack     ||
    +                        dbms_utility.format_error_backtrace ;
    +      exception when others then
    +         l_err_stack := dbms_utility.format_error_stack     ||
    +                        dbms_utility.format_error_backtrace ;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in        => 'SQLERRM',
    +         check_this_in => l_err_stack);
    +      wt_assert.eqqueryvalue (
    +         msg_in           => 'wt_dbout_profiles Count 2',
    +         check_query_in   => 'select count(*) from wt_dbout_profiles' ||
    +                             ' where test_run_id = ' || c_test_run_id,
    +         against_value_in => 0);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Delete Records Sad Path 2';
    +      begin
    +         delete_records(NULL);
    +         l_err_stack := dbms_utility.format_error_stack     ||
    +                        dbms_utility.format_error_backtrace ;
    +      exception when others then
    +         l_err_stack := dbms_utility.format_error_stack     ||
    +                        dbms_utility.format_error_backtrace ;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in        => 'SQLERRM',
    +         check_this_in => l_err_stack);
    +      wt_assert.eqqueryvalue (
    +         msg_in           => 'wt_dbout_profiles Count 2',
    +         check_query_in   => 'select count(*) from wt_dbout_profiles' ||
    +                             ' where test_run_id = ' || c_test_run_id,
    +         against_value_in => 0);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Delete Records Teardown';
    +      tl_delete_test_runs(c_test_run_id);
    +   end t_delete_records;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +--==============================================================--
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure WTPLSQL_RUN  --% WTPLSQL SET DBOUT "WT_PROFILER:PACKAGE BODY" %--
    +   is
    +   begin
    +      t_get_error_msg;
    +      t_delete_profiler_recs;
    +      t_find_dbout;
    +      t_load_ignr_aa;
    +      t_insert_dbout_profile;
    +      t_initialize;
    +      t_finalize;
    +      t_trigger_offset;
    +      t_calc_pct_coverage;
    +      t_delete_records;
    +   end WTPLSQL_RUN;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +--==============================================================--
    +
    +
    +end wt_profiler;
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/package body/WT_PROFILER/headerBg.jpg b/docs/persist/DBDocs/package body/WT_PROFILER/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 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
    nZDH?O8gS~#y@TeK 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 literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package body/WT_PROFILER/topDimTabR.gif b/docs/persist/DBDocs/package body/WT_PROFILER/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package body/WT_PROFILER/topTabBg.gif b/docs/persist/DBDocs/package body/WT_PROFILER/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package body/WT_PROFILER/topTabR.gif b/docs/persist/DBDocs/package body/WT_PROFILER/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + + +
    +
    +
    +

    Doc

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Code

    +
    +
    +
    +
    +
    +
    +
    + +


    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMEWT_RESULT
    SUBOBJECT_NAMEnull
    OBJECT_ID41931
    DATA_OBJECT_IDnull
    OBJECT_TYPEPACKAGE BODY
    CREATED29-JUN-2018 15:09:15
    LAST_DDL_TIME29-JUN-2018 15:21:16
    TIMESTAMP2018-06-29:15:21:16
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE2
    EDITION_NAMEnull
    +
    +
    +
    +
    + + + + + + + + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    EXECUTEPUBLICNOWTPWT_RESULT
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    +
    +package body wt_result
    +as
    +
    +   TYPE results_nt_type is table of wt_results%ROWTYPE;
    +   g_results_nt      results_nt_type;
    +   g_results_rec     wt_results%ROWTYPE;
    +
    +   $IF $$WTPLSQL_SELFTEST $THEN  ------%WTPLSQL_begin_ignore_lines%------
    +      g_skip_add  BOOLEAN := FALSE;
    +   $END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +----------------------
    +--  Private Procedures
    +----------------------
    +
    +
    +---------------------
    +--  Public Procedures
    +---------------------
    +
    +------------------------------------------------------------
    +procedure initialize
    +      (in_test_run_id   in wt_test_runs.id%TYPE)
    +is
    +   l_results_recNULL  wt_results%ROWTYPE;
    +begin
    +   if in_test_run_id is NULL
    +   then
    +      raise_application_error(-20009, '"in_test_run_id" cannot be NULL');
    +   end if;
    +   g_results_rec := l_results_recNULL;
    +   g_results_rec.test_run_id  := in_test_run_id;
    +   g_results_rec.result_seq   := 0;
    +   g_results_rec.executed_dtm := systimestamp;
    +   g_results_nt := results_nt_type(null);
    +$IF $$WTPLSQL_SELFTEST $THEN  ------%WTPLSQL_begin_ignore_lines%------
    +   g_skip_add := FALSE;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +end initialize;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_initialize
    +   is
    +      l_results_recNULL  wt_results%ROWTYPE;
    +      l_results_recSAVE  wt_results%ROWTYPE;
    +      l_results_recTEST  wt_results%ROWTYPE;
    +      l_results_ntSAVE   results_nt_type;
    +      l_results_ntTEST   results_nt_type;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      l_results_ntSAVE  := g_results_nt;
    +      l_results_recSAVE := g_results_rec;
    +      g_results_rec     := l_results_recNULL;
    +      initialize(-99);
    +      l_results_recTEST := g_results_rec;
    +      g_results_rec     := l_results_recSAVE;
    +      l_results_ntTEST  := g_results_nt;
    +      g_results_nt      := l_results_ntSAVE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Initialize Happy Path';
    +      wt_assert.eq (
    +         msg_in          => 'l_results_recTEST.test_run_id',
    +         check_this_in   => l_results_recTEST.test_run_id,
    +         against_this_in => -99);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_results_recTEST.result_seq',
    +         check_this_in   => l_results_recTEST.result_seq,
    +         against_this_in => 0);
    +      wt_assert.isnotnull (
    +         msg_in          => 'l_results_recTEST.executed_dtm',
    +         check_this_in   => l_results_recTEST.executed_dtm);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'l_results_recTEST.interval_msecs',
    +         check_this_in   => l_results_recTEST.interval_msecs);
    +      wt_assert.isnull (
    +         msg_in          => 'l_results_recTEST.assertion',
    +         check_this_in   => l_results_recTEST.assertion);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'l_results_recTEST.status',
    +         check_this_in   => l_results_recTEST.status);
    +      wt_assert.isnull (
    +         msg_in          => 'l_results_recTEST.details',
    +         check_this_in   => l_results_recTEST.details);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'l_results_recTEST.testcase',
    +         check_this_in   => l_results_recTEST.testcase);
    +      wt_assert.isnull (
    +         msg_in          => 'l_results_recTEST.message',
    +         check_this_in   => l_results_recTEST.message);
    +      wt_assert.eq (
    +         msg_in          => 'l_results_ntTEST.COUNT',
    +         check_this_in   => l_results_ntTEST.COUNT,
    +         against_this_in => 1);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'l_results_ntTEST(1).test_run_id',
    +         check_this_in   => l_results_ntTEST(1).test_run_id);
    +      wt_assert.raises (
    +         msg_in         => 'Raises ORA-20009',
    +         check_call_in  => 'begin wt_result.initialize(NULL); end;',
    +         against_exc_in => 'ORA-20009: "in_test_run_id" cannot be NULL');
    +   end t_initialize;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +-- Because this procedure is called to cleanup after errors,
    +--  it must be able to run multiple times without causing damage.
    +procedure finalize
    +is
    +   PRAGMA AUTONOMOUS_TRANSACTION;
    +   l_results_recNULL   wt_results%ROWTYPE;
    +begin
    +   if g_results_rec.test_run_id IS NULL
    +   then
    +      return;
    +   end if;
    +   -- There is always an extra NULL element in the g_results_nt array.
    +   forall i in 1 .. g_results_nt.COUNT - 1
    +      insert into wt_results values g_results_nt(i);
    +   COMMIT;
    +   g_results_nt := results_nt_type(null);
    +   g_results_rec := l_results_recNULL;
    +   g_results_nt := results_nt_type(null);
    +end finalize;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_finalize
    +   is
    +      --------------------------------------  WTPLSQL Testing --
    +      type num_recs_aa_type is table of number index by varchar2(50);
    +      num_recs_aa   num_recs_aa_type;
    +      l_test_runs_rec      wt_test_runs%ROWTYPE;
    +      l_results_recNULL    wt_results%ROWTYPE;
    +      l_results_recSAVE    wt_results%ROWTYPE;
    +      l_results_recTEST    wt_results%ROWTYPE;
    +      l_results_ntSAVE     results_nt_type;
    +      l_results_ntTEST     results_nt_type;
    +      l_num_recs           number;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := '   ';
    +      l_results_ntSAVE     := g_results_nt;    -- Capture Original Values
    +      l_results_recSAVE    := g_results_rec;   -- Capture Original Values
    +      --------------------------------------  WTPLSQL Testing --
    +      -- Can't Test in this block because g_results_rec has test data
    +      g_results_rec  := l_results_recNULL;
    +      g_results_rec.test_run_id    := -99;
    +      g_results_rec.result_seq     := 1;
    +      g_results_rec.executed_dtm   := systimestamp;
    +      g_results_rec.interval_msecs := 99;
    +      --------------------------------------  WTPLSQL Testing --
    +      g_results_rec.assertion     := 'FINALTEST';
    +      g_results_rec.status        := wt_assert.C_PASS;
    +      g_results_rec.details       := 'This is a WT_RESULT.FINALIZE Test';
    +      g_results_nt := results_nt_type(null);
    +      g_results_nt(1) := g_results_rec;
    +      g_results_nt.extend;  -- Finalize expects that last element to be NULL
    +      --------------------------------------  WTPLSQL Testing --
    +      -- Can't Test in this block because g_results_rec has test data
    +      g_results_rec.test_run_id   := NULL;
    +      select count(*)
    +       into  num_recs_aa('Finalize Before NULL Test Record Count')
    +       from  wt_results
    +       where test_run_id = -99;
    +      finalize;
    +      --------------------------------------  WTPLSQL Testing --
    +      select count(*)
    +       into  num_recs_aa('Finalize After NULL Test Record Count')
    +       from  wt_results
    +       where test_run_id = -99;
    +      rollback;    -- UNDO all database changes
    +      g_results_rec.test_run_id   := -99;
    +      --------------------------------------  WTPLSQL Testing --
    +      -- Can't Test in this block because g_results_rec has test data
    +      l_test_runs_rec.id           := -99;
    +      l_test_runs_rec.start_dtm    := systimestamp;
    +      l_test_runs_rec.runner_name  := 'Finalize Test';
    +      l_test_runs_rec.runner_owner := 'BOGUS';
    +      insert into wt_test_runs values l_test_runs_rec;
    +      commit;      -- Must commit because finalize is AUTONOMOUS TRANSACTION
    +      --------------------------------------  WTPLSQL Testing --
    +      finalize;    -- g_results_nt is still loaded with one element
    +      l_results_ntTEST  := g_results_nt;
    +      l_results_recTEST := g_results_rec;
    +      select count(*)
    +       into  num_recs_aa('Finalize Record Count Test')
    +       from  wt_results
    +       where test_run_id = -99;
    +      delete from wt_results where test_run_id = -99;
    +      delete from wt_test_runs where id = -99;
    +      commit;      -- UNDO all database changes
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Finalize Happy Path';
    +      -- Restore values so we can test
    +      g_results_rec := l_results_recSAVE;
    +      g_results_nt  := l_results_ntSAVE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'Before NULL Test Record Count',
    +         check_this_in   => num_recs_aa('Finalize Before NULL Test Record Count'),
    +         against_this_in => 0);
    +      wt_assert.eq (
    +         msg_in          => 'After NULL Test Record Count',
    +         check_this_in   => num_recs_aa('Finalize After NULL Test Record Count'),
    +         against_this_in => 0);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in        => 'l_results_recTEST.test_run_id',
    +         check_this_in => l_results_recTEST.test_run_id);
    +      wt_assert.eq (
    +         msg_in          => 'l_results_ntTEST.COUNT',
    +         check_this_in   => l_results_ntTEST.COUNT,
    +         against_this_in => 1);
    +      wt_assert.eq (
    +         msg_in          => 'Record Count Test',
    +         check_this_in   => num_recs_aa('Finalize Record Count Test'),
    +         against_this_in => 1);
    +   end t_finalize;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure save
    +      (in_assertion      in wt_results.assertion%TYPE
    +      ,in_status         in wt_results.status%TYPE
    +      ,in_details        in wt_results.details%TYPE
    +      ,in_testcase       in wt_results.testcase%TYPE
    +      ,in_message        in wt_results.message%TYPE)
    +is
    +   l_current_tstamp  timestamp;
    +begin
    +   if g_results_rec.test_run_id IS NULL
    +   then
    +      wt_text_report.ad_hoc_result
    +         (in_assertion
    +         ,in_status
    +         ,in_details
    +         ,in_testcase
    +         ,in_message);
    +      return;
    +   end if;
    +   -- Set the time and interval
    +   l_current_tstamp := systimestamp;
    +   g_results_rec.interval_msecs := extract(day from (
    +                                  l_current_tstamp - g_results_rec.executed_dtm
    +                                  ) * 86400 * 1000);
    +   g_results_rec.executed_dtm  := l_current_tstamp;
    +   -- Set the IN variables
    +   g_results_rec.assertion     := in_assertion;
    +   g_results_rec.status        := in_status;
    +   g_results_rec.details       := substr(in_details,1,4000);
    +   g_results_rec.testcase      := substr(in_testcase,1,50);
    +   g_results_rec.message       := substr(in_message,1,200);
    +   -- Increment, Extend, and Load
    +   g_results_rec.result_seq    := g_results_rec.result_seq + 1;
    +   g_results_nt(g_results_nt.COUNT) := g_results_rec;
    +   g_results_nt.extend;
    +
    +$IF $$WTPLSQL_SELFTEST $THEN  ------%WTPLSQL_begin_ignore_lines%------
    +   if not g_skip_add then
    +$END
    +   wt_test_run_stat.add_result(g_results_rec);
    +$IF $$WTPLSQL_SELFTEST $THEN
    +   end if;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +end save;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_save_testing
    +   is
    +      --------------------------------------  WTPLSQL Testing --
    +      TYPE l_dbmsout_buff_type is table of varchar2(32767);
    +      l_dbmsout_buff   l_dbmsout_buff_type := l_dbmsout_buff_type(1);
    +      l_test_run_id    number;
    +      l_dbmsout_line   varchar2(32767);
    +      l_dbmsout_stat   number;
    +      l_nt_count       number;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Ad Hoc Save Happy Path Setup';
    +      -- Save/Clear the DBMS_OUPTUT Buffer
    +      loop
    +         DBMS_OUTPUT.GET_LINE (
    +            line   => l_dbmsout_line,
    +            status => l_dbmsout_stat);
    +         exit when l_dbmsout_stat != 0;
    +         l_dbmsout_buff(l_dbmsout_buff.COUNT) := l_dbmsout_line;
    +         l_dbmsout_buff.extend;
    +      end loop;
    +      wt_assert.isnotnull (
    +         msg_in        => 'l_dbmsout_buff.COUNT - 1',
    +         check_this_in => l_dbmsout_buff.COUNT - 1);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Ad Hoc Save Testing Happy Path';
    +      l_test_run_id  := g_results_rec.test_run_id;
    +      g_results_rec.test_run_id := NULL;
    +      g_skip_add := TRUE;
    +      wt_result.save (
    +         in_assertion  => 'SELFTEST1',
    +         in_status     => wt_assert.C_PASS,
    +         in_details    => 't_save_testing Details',
    +         in_testcase   => wt_assert.g_testcase,
    +         in_message    => 't_save_testing Message');
    +      g_skip_add := FALSE;
    +      g_results_rec.test_run_id := l_test_run_id;
    +      --------------------------------------  WTPLSQL Testing --
    +      DBMS_OUTPUT.GET_LINE (
    +         line   => l_dbmsout_line,
    +         status => l_dbmsout_stat);
    +      wt_assert.eq (
    +         msg_in          => 'DBMS_OUTPUT Status',
    +         check_this_in   => l_dbmsout_stat,
    +         against_this_in => 0);
    +      --------------------------------------  WTPLSQL Testing --
    +      if wt_assert.last_pass
    +      then
    +         wt_assert.isnotnull (
    +            msg_in        => 'DBMS_OUTPUT Line',
    +            check_this_in => l_dbmsout_line);
    +         wt_assert.this (
    +            msg_in        => 'Save Testing NULL Test DBMS_OUTPUT 3 Message',
    +            check_this_in => (l_dbmsout_line like '%' || wt_assert.g_testcase ||
    +                             '%t_save_testing %'));
    +      --------------------------------------  WTPLSQL Testing --
    +         if not wt_assert.last_pass
    +         then
    +            -- No match, put the line back into DBMS_OUTPUT buffer and end this.
    +            DBMS_OUTPUT.PUT_LINE(l_dbmsout_line);
    +         end if;
    +      end if;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Ad Hoc Save Happy Path Teardown';
    +      -- Restore the DBMS_OUPTUT Buffer
    +      for i in 1 .. l_dbmsout_buff.COUNT - 1
    +      loop
    +         DBMS_OUTPUT.PUT_LINE(l_dbmsout_buff(i));
    +      end loop;
    +      wt_assert.isnotnull (
    +         msg_in        => 'l_dbmsout_buff.COUNT - 1',
    +         check_this_in =>  l_dbmsout_buff.COUNT - 1);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Save Testing Happy Path';
    +      l_nt_count     := g_results_nt.COUNT;
    +      g_skip_add := TRUE;
    +      wt_result.save (
    +         in_assertion  => 'SELFTEST2',
    +         in_status     => wt_assert.C_PASS,
    +         in_details    => 't_save_testing Testing Details',
    +         in_testcase   => wt_assert.g_testcase,
    +         in_message    => 't_save_testing Testing Message');
    +      g_skip_add := FALSE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'g_results_nt.COUNT',
    +         check_this_in   => g_results_nt.COUNT,
    +         against_this_in => l_nt_count + 1);
    +      if not wt_assert.last_pass
    +      then
    +         return;   -- Something went wrong, end this now.
    +      end if;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'g_results_nt(' || l_nt_count || ').assetion',
    +         check_this_in   => g_results_nt(l_nt_count).assertion,
    +         against_this_in => 'SELFTEST2');
    +      wt_assert.eq (
    +         msg_in          => 'g_results_nt(' || l_nt_count || ').status',
    +         check_this_in   => g_results_nt(l_nt_count).status,
    +         against_this_in => wt_assert.C_PASS);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'g_results_nt(' || l_nt_count || ').details',
    +         check_this_in   => g_results_nt(l_nt_count).details,
    +         against_this_in => 't_save_testing Testing Details');
    +      wt_assert.eq (
    +         msg_in          => 'g_results_nt(' || l_nt_count || ').testcase',
    +         check_this_in   => g_results_nt(l_nt_count).testcase,
    +         against_this_in => wt_assert.g_testcase);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'g_results_nt(' || l_nt_count || ').message',
    +         check_this_in   => g_results_nt(l_nt_count).message,
    +         against_this_in => 't_save_testing Testing Message');
    +      wt_assert.isnotnull (
    +         msg_in          => 'g_results_nt(' || l_nt_count || ').interval_msecs',
    +         check_this_in   => g_results_nt(l_nt_count).interval_msecs);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull (
    +         msg_in          => 'g_results_nt(' || l_nt_count || ').executed_dtm',
    +         check_this_in   => g_results_nt(l_nt_count).executed_dtm);
    +      wt_assert.isnotnull (
    +         msg_in          => 'g_results_nt(' || l_nt_count || ').result_seq',
    +         check_this_in   => g_results_nt(l_nt_count).result_seq);
    +      --  Can't Delete Test Element.  g_results_nt.COUNT is not reduced
    +      --    because nested tables are not dense.
    +      --g_results_nt.delete(l_nt_count + 1);
    +   end t_save_testing;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure delete_records
    +      (in_test_run_id  in number)
    +is
    +begin
    +   delete from wt_results
    +    where test_run_id = in_test_run_id;
    +end delete_records;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_delete_records
    +   is
    +      --------------------------------------  WTPLSQL Testing --
    +      l_test_runs_rec  wt_test_runs%ROWTYPE;
    +      l_results_rec    wt_results%ROWTYPE;
    +      l_num_recs       number;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Delete Records Happy Path';
    +      select count(*) into l_num_recs
    +       from  wt_results
    +       where test_run_id = -99;
    +      wt_assert.isnotnull (
    +         msg_in        => 'Before Insert Count',
    +         check_this_in => l_num_recs);
    +      --------------------------------------  WTPLSQL Testing --
    +      l_test_runs_rec.id           := -99;
    +      l_test_runs_rec.start_dtm    := sysdate;
    +      l_test_runs_rec.runner_name  := 'Delete Records Test';
    +      l_test_runs_rec.runner_owner := 'BOGUS';
    +      insert into wt_test_runs values l_test_runs_rec;
    +      l_results_rec.test_run_id    := -99;
    +      --------------------------------------  WTPLSQL Testing --
    +      l_results_rec.result_seq     := 1;
    +      l_results_rec.executed_dtm   := sysdate;
    +      l_results_rec.interval_msecs := 99;
    +      l_results_rec.assertion      := 'DELRECTEST';
    +      l_results_rec.status         := wt_assert.C_PASS;
    +      l_results_rec.details        := 'This is a WT_RESULT.DELETE_RECORDS Test';
    +      insert into wt_results values l_results_rec;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eqqueryvalue (
    +         msg_in            => 'After Insert Count',
    +         check_query_in    => 'select count(*) from wt_results' ||
    +                              ' where test_run_id = -99',
    +         against_value_in  => l_num_recs + 1);
    +      delete_records(-99);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eqqueryvalue (
    +         msg_in            => 'After Test Count',
    +         check_query_in    => 'select count(*) from wt_results' ||
    +                              ' where test_run_id = -99',
    +         against_value_in  => l_num_recs);
    +      rollback;
    +      wt_assert.eqqueryvalue (
    +         msg_in            => 'After ROLLBACK Count',
    +         check_query_in    => 'select count(*) from wt_results' ||
    +                              ' where test_run_id = -99',
    +         against_value_in  => l_num_recs);
    +   end t_delete_records;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +--==============================================================--
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure WTPLSQL_RUN  --% WTPLSQL SET DBOUT "WT_RESULT:PACKAGE BODY" %--
    +   is
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      t_initialize;
    +      t_finalize;
    +      t_save_testing;
    +      t_delete_records;
    +   end WTPLSQL_RUN;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +--==============================================================--
    +
    +
    +end wt_result;
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/package body/WT_RESULT/headerBg.jpg b/docs/persist/DBDocs/package body/WT_RESULT/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 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
    nZDH?O8gS~#y@TeK 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 literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package body/WT_RESULT/topDimTabR.gif b/docs/persist/DBDocs/package body/WT_RESULT/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package body/WT_RESULT/topTabBg.gif b/docs/persist/DBDocs/package body/WT_RESULT/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package body/WT_RESULT/topTabR.gif b/docs/persist/DBDocs/package body/WT_RESULT/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + + +
    +
    +
    +

    Doc

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Code

    +
    +
    +
    +
    +
    +
    +
    + +


    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMEWT_TEST_RUN_STAT
    SUBOBJECT_NAMEnull
    OBJECT_ID41961
    DATA_OBJECT_IDnull
    OBJECT_TYPEPACKAGE BODY
    CREATED29-JUN-2018 15:21:18
    LAST_DDL_TIME29-JUN-2018 15:21:18
    TIMESTAMP2018-06-29:15:21:18
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE2
    EDITION_NAMEnull
    +
    +
    +
    +
    + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    +
    +package body wt_test_run_stat
    +as
    +
    +   TYPE tc_aa_type is
    +        table of wt_testcase_stats%ROWTYPE
    +        index by varchar2(50);
    +   g_tc_aa  tc_aa_type;
    +   g_rec    wt_test_run_stats%ROWTYPE;
    +
    +
    +----------------------
    +--  Private Procedures
    +----------------------
    +
    +
    +---------------------
    +--  Public Procedures
    +---------------------
    +
    +
    +------------------------------------------------------------
    +procedure initialize
    +is
    +   l_recNULL  wt_test_run_stats%ROWTYPE;
    +begin
    +   g_rec := l_recNULL;
    +   g_tc_aa.delete;
    +end initialize;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_initialize
    +   is
    +      l_tc_aaSAVE  tc_aa_type;
    +      l_recSAVE    wt_test_run_stats%ROWTYPE;
    +      l_tc_aaTEST  tc_aa_type;
    +      l_recTEST    wt_test_run_stats%ROWTYPE;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Initialize Happy Path 1 Setup';
    +      l_tc_aaTEST('TESTCASE1').test_run_id := -2;
    +      l_recTEST.test_run_id := -1;
    +      wt_assert.eq (
    +         msg_in          => 'l_tc_aaTEST(''TESTCASE1'').test_run_id',
    +         check_this_in   =>  l_tc_aaTEST('TESTCASE1').test_run_id,
    +         against_this_in =>  -2 );
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.test_run_id',
    +         check_this_in   =>  l_recTEST.test_run_id,
    +         against_this_in =>  -1 );
    +      --------------------------------------  WTPLSQL Testing --
    +      l_tc_aaSAVE := g_tc_aa;
    +      l_recSAVE   := g_rec;
    +      g_tc_aa     := l_tc_aaTEST;
    +      g_rec       := l_recTEST;
    +      initialize;
    +      l_tc_aaTEST := g_tc_aa;
    +      l_recTEST   := g_rec;
    +      g_tc_aa     := l_tc_aaSAVE;
    +      g_rec       := l_recSAVE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Initialize Happy Path 1';
    +      wt_assert.eq (
    +         msg_in          => 'l_tc_aaTEST.COUNT',
    +         check_this_in   =>  l_tc_aaTEST.COUNT,
    +         against_this_in =>  0 );
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.test_run_id',
    +         check_this_in   =>  l_recTEST.test_run_id );
    +   end t_initialize;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure add_result
    +      (in_results_rec  in wt_results%ROWTYPE)
    +is
    +   tc  varchar2(50);
    +begin
    +   -- If this raises an exception, it must be done before any other values
    +   --   are set because they will not be rolled-back after the "raise".
    +   case in_results_rec.status
    +      when 'PASS' then
    +         g_rec.passes := nvl(g_rec.passes,0) + 1;
    +      when 'FAIL' then
    +         g_rec.failures := nvl(g_rec.failures,0) + 1;
    +      when 'ERR' then
    +         g_rec.errors := nvl(g_rec.errors,0) + 1;
    +      else
    +         raise_application_error(-20010, 'Unknown Result status "' ||
    +                                      in_results_rec.status || '"');
    +   end case;
    +   g_rec.test_run_id := in_results_rec.test_run_id;
    +   g_rec.asserts     := nvl(g_rec.asserts,0) + 1;
    +   g_rec.min_interval_msecs := least(nvl(g_rec.min_interval_msecs,999999999)
    +                                    ,in_results_rec.interval_msecs);
    +   g_rec.max_interval_msecs := greatest(nvl(g_rec.max_interval_msecs,0)
    +                                       ,in_results_rec.interval_msecs);
    +   g_rec.tot_interval_msecs := nvl(g_rec.tot_interval_msecs,0) +
    +                               in_results_rec.interval_msecs;
    +   if in_results_rec.testcase is not null
    +   then
    +      tc := in_results_rec.testcase;
    +      g_tc_aa(tc).testcase    := tc;
    +      g_tc_aa(tc).test_run_id := in_results_rec.test_run_id;
    +      g_tc_aa(tc).asserts     := nvl(g_tc_aa(tc).asserts,0) + 1;
    +      case in_results_rec.status
    +         when 'PASS' then
    +            g_tc_aa(tc).passes := nvl(g_tc_aa(tc).passes,0) + 1;
    +         when 'FAIL' then
    +            g_tc_aa(tc).failures := nvl(g_tc_aa(tc).failures,0) + 1;
    +         when 'ERR' then
    +            g_tc_aa(tc).errors := nvl(g_tc_aa(tc).errors,0) + 1;
    +         -- No need to check "ELSE" because it would have been caught above
    +      end case;
    +      g_tc_aa(tc).min_interval_msecs := least(nvl(g_tc_aa(tc).min_interval_msecs,999999999)
    +                                             ,in_results_rec.interval_msecs);
    +      g_tc_aa(tc).max_interval_msecs := greatest(nvl(g_tc_aa(tc).max_interval_msecs,0)
    +                                                ,in_results_rec.interval_msecs);
    +      g_tc_aa(tc).tot_interval_msecs := nvl(g_tc_aa(tc).tot_interval_msecs,0) +
    +                                        in_results_rec.interval_msecs;
    +   end if;
    +end add_result;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_add_result
    +   is
    +      l_tc_aaSAVE   tc_aa_type;
    +      l_recSAVE     wt_test_run_stats%ROWTYPE;
    +      l_tc_aaTEST   tc_aa_type;
    +      l_recTEST     wt_test_run_stats%ROWTYPE;
    +      l_resultTEST  wt_results%ROWTYPE;
    +      l_sqlerrm     varchar2(4000);
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      -- Overview:
    +      -- 1) Save results in temporary variables
    +      -- 2) Clear ADD_RESULT variables
    +      -- 3) Call ADD_RESULT several times with test data.
    +      -- 4) Capture test results
    +      -- 5) Restore saved results
    +      -- 6) Confirm the test results using WT_ASSERT.
    +      --------------------------------------  WTPLSQL Testing --
    +      l_tc_aaSAVE := g_tc_aa;
    +      l_recSAVE   := g_rec;
    +      g_tc_aa     := l_tc_aaTEST;
    +      g_rec       := l_recTEST;
    +      l_resultTEST.test_run_id    := -10;
    +      l_resultTEST.interval_msecs := 10;
    +      l_resultTEST.status         := 'PASS';
    +      l_resultTEST.testcase       := 'TESTCASE1';
    +      add_result(l_resultTEST);
    +      --------------------------------------  WTPLSQL Testing --
    +      l_resultTEST.interval_msecs := 20;
    +      l_resultTEST.status         := 'FAIL';
    +      l_resultTEST.testcase       := 'TESTCASE1';
    +      add_result(l_resultTEST);
    +      l_resultTEST.interval_msecs := 30;
    +      l_resultTEST.status         := 'ERR';
    +      l_resultTEST.testcase       := 'TESTCASE1';
    +      add_result(l_resultTEST);
    +      --------------------------------------  WTPLSQL Testing --
    +      l_resultTEST.interval_msecs := 40;
    +      l_resultTEST.status         := 'ABC';
    +      l_resultTEST.testcase       := 'TESTCASE1';
    +      begin
    +         add_result(l_resultTEST);
    +         l_sqlerrm := SQLERRM;
    +      exception when others then
    +         l_sqlerrm := SQLERRM;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      l_tc_aaTEST := g_tc_aa;
    +      l_recTEST   := g_rec;
    +      g_tc_aa     := l_tc_aaSAVE;
    +      g_rec       := l_recSAVE;
    +      wt_assert.g_testcase := 'Add Result Testing';
    +      wt_assert.eq (
    +          msg_in          => 'Add Result Sad Path 1',
    +          check_this_in   => 'ORA-20010: Unknown Result status "ABC"',
    +          against_this_in => l_sqlerrm);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.test_run_id',
    +         check_this_in   => l_recTEST.test_run_id,
    +         against_this_in => -10);
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.asserts',
    +         check_this_in   => l_recTEST.asserts,
    +         against_this_in => 3);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.passes',
    +         check_this_in   => l_recTEST.passes,
    +         against_this_in => 1);
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.failures',
    +         check_this_in   => l_recTEST.failures,
    +         against_this_in => 1);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.errors',
    +         check_this_in   => l_recTEST.errors,
    +         against_this_in => 1);
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.min_interval_msecs',
    +         check_this_in   => l_recTEST.min_interval_msecs,
    +         against_this_in => 10);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.max_interval_msecs',
    +         check_this_in   => l_recTEST.max_interval_msecs,
    +         against_this_in => 30);
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.tot_interval_msecs',
    +         check_this_in   => l_recTEST.tot_interval_msecs,
    +         against_this_in => 60);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_tc_aaTEST(''TESTCASE1'').test_run_id',
    +         check_this_in   => l_tc_aaTEST('TESTCASE1').test_run_id,
    +         against_this_in => -10);
    +      wt_assert.eq (
    +         msg_in          => 'l_tc_aaTEST(''TESTCASE1'').asserts',
    +         check_this_in   => l_tc_aaTEST('TESTCASE1').asserts,
    +         against_this_in => 3);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_tc_aaTEST(''TESTCASE1'').passes',
    +         check_this_in   => l_tc_aaTEST('TESTCASE1').passes,
    +         against_this_in => 1);
    +      wt_assert.eq (
    +         msg_in          => 'l_tc_aaTEST(''TESTCASE1'').failures',
    +         check_this_in   => l_tc_aaTEST('TESTCASE1').failures,
    +         against_this_in => 1);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_tc_aaTEST(''TESTCASE1'').errors',
    +         check_this_in   => l_tc_aaTEST('TESTCASE1').errors,
    +         against_this_in => 1);
    +      wt_assert.eq (
    +         msg_in          => 'l_tc_aaTEST(''TESTCASE1'').min_interval_msecs',
    +         check_this_in   => l_tc_aaTEST('TESTCASE1').min_interval_msecs,
    +         against_this_in => 10);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_tc_aaTEST(''TESTCASE1'').max_interval_msecs',
    +         check_this_in   => l_tc_aaTEST('TESTCASE1').max_interval_msecs,
    +         against_this_in => 30);
    +      wt_assert.eq (
    +         msg_in          => 'l_tc_aaTEST(''TESTCASE1'').tot_interval_msecs',
    +         check_this_in   => l_tc_aaTEST('TESTCASE1').tot_interval_msecs,
    +         against_this_in => 60);
    +   end t_add_result;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure add_profile
    +      (in_dbout_profiles_rec  in wt_dbout_profiles%ROWTYPE)
    +is
    +begin
    +   -- If this raises an exception, it must be done before any other values
    +   --   are set because they will not be rolled-back after the "raise".
    +   case in_dbout_profiles_rec.status
    +      when 'EXEC' then
    +         g_rec.executed_lines := nvl(g_rec.executed_lines,0) + 1;
    +         -- Only count the executed time.
    +         g_rec.min_executed_usecs := least(nvl(g_rec.min_executed_usecs,999999999)
    +                                          ,in_dbout_profiles_rec.min_usecs);
    +         g_rec.max_executed_usecs := greatest(nvl(g_rec.max_executed_usecs,0)
    +                                             ,in_dbout_profiles_rec.max_usecs);
    +         g_rec.tot_executed_usecs := nvl(g_rec.tot_executed_usecs,0) +
    +                                     ( in_dbout_profiles_rec.total_usecs /
    +                                       in_dbout_profiles_rec.total_occur  );
    +      when 'IGNR' then
    +         g_rec.ignored_lines := nvl(g_rec.ignored_lines,0) + 1;
    +      when 'EXCL' then
    +         g_rec.excluded_lines := nvl(g_rec.excluded_lines,0) + 1;
    +      when 'NOTX' then
    +         g_rec.notexec_lines := nvl(g_rec.notexec_lines,0) + 1;
    +      when 'UNKN' then
    +         g_rec.unknown_lines := nvl(g_rec.unknown_lines,0) + 1;
    +      else
    +         raise_application_error(-20011, 'Unknown Profile status "' ||
    +                                       in_dbout_profiles_rec.status || '"');
    +   end case;
    +   g_rec.test_run_id    := in_dbout_profiles_rec.test_run_id;
    +   g_rec.profiled_lines := nvl(g_rec.profiled_lines,0) + 1;
    +end add_profile;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_add_profile
    +   is
    +      l_recSAVE      wt_test_run_stats%ROWTYPE;
    +      l_recTEST      wt_test_run_stats%ROWTYPE;
    +      l_profileTEST  wt_dbout_profiles%ROWTYPE;
    +      l_sqlerrm      varchar2(4000);
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      -- Overview:
    +      -- 1) Save results in temporary variables
    +      -- 2) Clear ADD_PROFILE variables
    +      -- 3) Call ADD_PROFILE several times with test data.
    +      -- 4) Capture test results
    +      -- 5) Restore saved results
    +      -- 6) Confirm the test results using WT_ASSERT.
    +      --------------------------------------  WTPLSQL Testing --
    +      l_recSAVE   := g_rec;
    +      g_rec       := l_recTEST;
    +      l_profileTEST.test_run_id := -20;
    +      l_profileTEST.min_usecs   := 10;
    +      l_profileTEST.max_usecs   := 20;
    +      l_profileTEST.total_usecs := 30;
    +      l_profileTEST.total_occur := 1;
    +      l_profileTEST.status := 'EXEC';
    +      add_profile(l_profileTEST);
    +      l_profileTEST.status := 'EXEC';
    +      add_profile(l_profileTEST);
    +      --------------------------------------  WTPLSQL Testing --
    +      l_profileTEST.status := 'EXEC';
    +      add_profile(l_profileTEST);
    +      l_profileTEST.status := 'EXEC';
    +      add_profile(l_profileTEST);
    +      l_profileTEST.status := 'EXEC';
    +      add_profile(l_profileTEST);
    +      l_profileTEST.status := 'IGNR';
    +      add_profile(l_profileTEST);
    +      l_profileTEST.status := 'IGNR';
    +      add_profile(l_profileTEST);
    +      --------------------------------------  WTPLSQL Testing --
    +      l_profileTEST.status := 'IGNR';
    +      add_profile(l_profileTEST);
    +      l_profileTEST.status := 'IGNR';
    +      add_profile(l_profileTEST);
    +      l_profileTEST.status := 'NOTX';
    +      add_profile(l_profileTEST);
    +      l_profileTEST.status := 'NOTX';
    +      add_profile(l_profileTEST);
    +      l_profileTEST.status := 'NOTX';
    +      add_profile(l_profileTEST);
    +      --------------------------------------  WTPLSQL Testing --
    +      l_profileTEST.status := 'EXCL';
    +      add_profile(l_profileTEST);
    +      l_profileTEST.status := 'EXCL';
    +      add_profile(l_profileTEST);
    +      l_profileTEST.status := 'UNKN';
    +      add_profile(l_profileTEST);
    +      --------------------------------------  WTPLSQL Testing --
    +      l_profileTEST.status := 'ABC';
    +      begin
    +         add_profile(l_profileTEST);
    +         l_sqlerrm := SQLERRM;
    +      exception when others then
    +         l_sqlerrm := SQLERRM;
    +      end;
    +      l_recTEST := g_rec;
    +      g_rec     := l_recSAVE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Add Profile Testing';
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.test_run_id',
    +         check_this_in   => l_recTEST.test_run_id,
    +         against_this_in => -20);
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.profiled_lines',
    +         check_this_in   => l_recTEST.profiled_lines,
    +         against_this_in => 15);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.min_executed_usecs',
    +         check_this_in   => l_recTEST.min_executed_usecs,
    +         against_this_in => 10);
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.max_executed_usecs',
    +         check_this_in   => l_recTEST.max_executed_usecs,
    +         against_this_in => 20);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.tot_executed_usecs',
    +         check_this_in   => l_recTEST.tot_executed_usecs,
    +         against_this_in => 150);
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.executed_lines',
    +         check_this_in   => l_recTEST.executed_lines,
    +         against_this_in => 5);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.ignored_lines',
    +         check_this_in   => l_recTEST.ignored_lines,
    +         against_this_in => 4);
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.notexec_lines',
    +         check_this_in   => l_recTEST.notexec_lines,
    +         against_this_in => 3);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.excluded_lines',
    +         check_this_in   => l_recTEST.excluded_lines,
    +         against_this_in => 2);
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.unknown_lines',
    +         check_this_in   => l_recTEST.unknown_lines,
    +         against_this_in => 1);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +          msg_in          => 'Add Result Sad Path 1',
    +          check_this_in   => 'ORA-20011: Unknown Profile status "ABC"',
    +          against_this_in => l_sqlerrm);
    +   end t_add_profile;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure finalize
    +is
    +   PRAGMA AUTONOMOUS_TRANSACTION;
    +   l_executable_lines   number;
    +   tc                   varchar2(50);
    +begin
    +   if g_rec.test_run_id is null
    +   then
    +      initialize;
    +      return;
    +   end if;
    +   g_rec.testcases := g_tc_aa.COUNT;
    +   g_rec.asserts   := nvl(g_rec.asserts ,0);
    +   g_rec.passes    := nvl(g_rec.passes  ,0);
    +   g_rec.failures  := nvl(g_rec.failures,0);
    +   g_rec.errors    := nvl(g_rec.errors  ,0);
    +   if g_rec.asserts != 0
    +   then
    +      g_rec.test_yield := round(g_rec.passes/g_rec.asserts, 3);
    +      g_rec.avg_interval_msecs := round(g_rec.tot_interval_msecs/g_rec.asserts, 3);
    +   end if;
    +   if g_rec.profiled_lines is not null
    +   then
    +      g_rec.executed_lines  := nvl(g_rec.executed_lines ,0);
    +      g_rec.ignored_lines   := nvl(g_rec.ignored_lines,0);
    +      g_rec.excluded_lines  := nvl(g_rec.excluded_lines ,0);
    +      g_rec.notexec_lines   := nvl(g_rec.notexec_lines  ,0);
    +      g_rec.unknown_lines   := nvl(g_rec.unknown_lines  ,0);
    +      l_executable_lines    := g_rec.executed_lines + g_rec.notexec_lines;
    +      if l_executable_lines != 0
    +      then
    +         g_rec.code_coverage := round(g_rec.executed_lines/l_executable_lines, 3);
    +         g_rec.avg_executed_usecs := round(g_rec.tot_executed_usecs/l_executable_lines, 3);
    +      end if;
    +   end if;
    +   insert into wt_test_run_stats values g_rec;
    +   if g_rec.testcases > 0
    +   then
    +      tc := g_tc_aa.FIRST;
    +      loop
    +         g_tc_aa(tc).asserts  := nvl(g_tc_aa(tc).asserts ,0);
    +         g_tc_aa(tc).passes   := nvl(g_tc_aa(tc).passes  ,0);
    +         g_tc_aa(tc).failures := nvl(g_tc_aa(tc).failures,0);
    +         g_tc_aa(tc).errors   := nvl(g_tc_aa(tc).errors  ,0);
    +         if g_rec.asserts != 0
    +         then
    +            g_tc_aa(tc).test_yield := round(g_tc_aa(tc).passes /
    +                                            g_tc_aa(tc).asserts, 3);
    +            g_tc_aa(tc).avg_interval_msecs := round(g_tc_aa(tc).tot_interval_msecs /
    +                                                   g_tc_aa(tc).asserts, 3);
    +         end if;
    +         insert into wt_testcase_stats values g_tc_aa(tc);
    +         exit when tc = g_tc_aa.LAST;
    +         tc := g_tc_aa.NEXT(tc);
    +      end loop;
    +   end if;
    +   COMMIT;
    +   initialize;
    +end finalize;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_finalize
    +   is
    +      l_tc_aaSAVE    tc_aa_type;
    +      l_recSAVE      wt_test_run_stats%ROWTYPE;
    +      l_tc_aaTEST    tc_aa_type;
    +      l_recTEST      wt_test_run_stats%ROWTYPE;
    +      l_recNULL      wt_test_run_stats%ROWTYPE;
    +      l_tstat_rec    wt_testcase_stats%ROWTYPE;
    +      l_test_run_id  number       := -102;
    +      l_tc           varchar2(50) := 'TC2';
    +      l_sql_txt      varchar2(4000);
    +      l_sqlerrm      varchar2(4000);
    +      --------------------------------------  WTPLSQL Testing --
    +      procedure run_finalize (in_msg_txt in varchar2) is begin
    +         l_tc_aaSAVE := g_tc_aa;
    +         l_recSAVE   := g_rec;
    +         g_tc_aa     := l_tc_aaTEST;
    +         g_rec       := l_recTEST;
    +         begin
    +            finalize;
    +            l_sqlerrm := SQLERRM;
    +         exception when others then
    +            l_sqlerrm := SQLERRM;
    +         end;
    +      --------------------------------------  WTPLSQL Testing --
    +         l_tc_aaTEST := g_tc_aa;
    +         l_recTEST   := g_rec;
    +         g_tc_aa     := l_tc_aaSAVE;
    +         g_rec       := l_recSAVE;
    +         wt_assert.eq (
    +            msg_in          => in_msg_txt,
    +            check_this_in   => l_sqlerrm,
    +            against_this_in => 'ORA-0000: normal, successful completion');
    +      end run_finalize;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'FINALIZE Happy Path Setup';
    +      l_sql_txt := 'insert into WT_TEST_RUNS' ||
    +                   ' (id, start_dtm, runner_owner, runner_name)' ||
    +         ' values (' || l_test_run_id || ', sysdate, USER, ''TESTRUNNER3'')';
    +      wt_assert.raises (
    +         msg_in         => 'Insert WT_TEST_RUNS Record',
    +         check_call_in  => l_sql_txt,
    +         against_exc_in => '');
    +      commit;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase  := 'FINALIZE Happy Path 1';
    +      l_tc_aaTEST.delete;
    +      l_recTEST := l_recNULL;
    +      l_recTEST.test_run_id := l_test_run_id;
    +      run_finalize('Run Finalize for Happy Path 1');  -- AUTONOMOUS COMMIT
    +      --------------------------------------  WTPLSQL Testing --
    +      begin
    +         select * into l_recTEST
    +          from  WT_TEST_RUN_STATS
    +          where test_run_id = l_test_run_id;
    +         l_sqlerrm := SQLERRM;
    +      exception when others then
    +         l_sqlerrm := SQLERRM;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'Retieve WT_TEST_RUN_STATS record',
    +         check_this_in   => l_sqlerrm,
    +         against_this_in => 'ORA-0000: normal, successful completion');
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.test_run_id',
    +         check_this_in   => l_recTEST.test_run_id,
    +         against_this_in => l_test_run_id);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.test_yield',
    +         check_this_in   => l_recTEST.test_yield);
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.asserts',
    +         check_this_in   => l_recTEST.asserts,
    +         against_this_in => 0);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.passes',
    +         check_this_in   => l_recTEST.passes,
    +         against_this_in => 0);
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.failures',
    +         check_this_in   => l_recTEST.failures,
    +         against_this_in => 0);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.errors',
    +         check_this_in   => l_recTEST.errors,
    +         against_this_in => 0);
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.testcases',
    +         check_this_in   => l_recTEST.testcases,
    +         against_this_in => 0);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.min_interval_msecs',
    +         check_this_in   => l_recTEST.min_interval_msecs);
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.avg_interval_msecs',
    +         check_this_in   => l_recTEST.avg_interval_msecs);
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.max_interval_msecs',
    +         check_this_in   => l_recTEST.max_interval_msecs);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.tot_interval_msecs',
    +         check_this_in   => l_recTEST.tot_interval_msecs);
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.code_coverage',
    +         check_this_in   => l_recTEST.code_coverage);
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.profiled_lines',
    +         check_this_in   => l_recTEST.profiled_lines);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.executed_lines',
    +         check_this_in   => l_recTEST.executed_lines);
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.ignored_lines',
    +         check_this_in   => l_recTEST.ignored_lines);
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.excluded_lines',
    +         check_this_in   => l_recTEST.excluded_lines);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.notexec_lines',
    +         check_this_in   => l_recTEST.notexec_lines);
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.unknown_lines',
    +         check_this_in   => l_recTEST.unknown_lines);
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.avg_executed_usecs',
    +         check_this_in   => l_recTEST.avg_executed_usecs);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eqqueryvalue (
    +         msg_in           => 'There should be no WT_TESTCASE_STATS records',
    +         check_query_in   => 'select count(*) from WT_TESTCASE_STATS' ||
    +                             ' where test_run_id = ' || l_test_run_id,
    +         against_value_in => 0);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.raises (
    +         msg_in         => 'Delete WT_TEST_RUN_STATS Record',
    +         check_call_in  => 'delete from WT_TEST_RUN_STATS where test_run_id = ' ||
    +                                                              l_test_run_id,
    +         against_exc_in => '');
    +      commit;
    +      wt_assert.eqqueryvalue (
    +         msg_in           => 'There should be no WT_TEST_RUN_STATS records',
    +         check_query_in   => 'select count(*) from WT_TEST_RUN_STATS' ||
    +                             ' where test_run_id = ' || l_test_run_id,
    +         against_value_in => 0);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'FINALIZE Happy Path 2';
    +      l_tc_aaTEST.delete;
    +      l_tc_aaTEST(l_tc||'a').test_run_id        := l_test_run_id;
    +      l_tc_aaTEST(l_tc||'a').testcase           := l_tc||'a';
    +      l_tc_aaTEST(l_tc||'a').asserts            := 3;
    +      l_tc_aaTEST(l_tc||'a').passes             := 2;
    +      l_tc_aaTEST(l_tc||'a').failures           := 1;
    +      --l_tc_aaTEST(l_tc||'a').errors             := null;
    +      l_tc_aaTEST(l_tc||'a').tot_interval_msecs := 300;
    +      --------------------------------------  WTPLSQL Testing --
    +      l_tc_aaTEST(l_tc||'b').test_run_id        := l_test_run_id;
    +      l_tc_aaTEST(l_tc||'b').testcase           := l_tc||'b';
    +      l_tc_aaTEST(l_tc||'b').asserts            := 3;
    +      l_tc_aaTEST(l_tc||'b').passes             := 2;
    +      l_tc_aaTEST(l_tc||'b').failures           := 1;
    +      --l_tc_aaTEST(l_tc||'b').errors             := null;
    +      l_tc_aaTEST(l_tc||'b').tot_interval_msecs := 300;
    +      --------------------------------------  WTPLSQL Testing --
    +      l_recTEST := l_recNULL;
    +      l_recTEST.test_run_id         := l_test_run_id;
    +      l_recTEST.asserts             := 6;
    +      l_recTEST.passes              := 4;
    +      l_recTEST.failures            := 2;
    +      --l_recTEST.errors              := null;
    +      l_recTEST.tot_interval_msecs  := 600;
    +      --------------------------------------  WTPLSQL Testing --
    +      l_recTEST.profiled_lines      := 20;
    +      l_recTEST.executed_lines      := 8;
    +      l_recTEST.ignored_lines       := 6;
    +      l_recTEST.excluded_lines      := 4;
    +      l_recTEST.notexec_lines       := 2;
    +      --l_recTEST.unknown_lines       := null;
    +      l_recTEST.tot_executed_usecs  := 2000;
    +      run_finalize('Run Finalize for Happy Path 2');  -- AUTONOMOUS COMMIT
    +      --------------------------------------  WTPLSQL Testing --
    +      begin
    +         select * into l_tstat_rec
    +          from  WT_TESTCASE_STATS
    +          where test_run_id = l_test_run_id
    +           and  testcase    = l_tc||'a';
    +         l_sqlerrm := SQLERRM;
    +      exception when others then
    +         l_sqlerrm := SQLERRM;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'Retieve WT_TESTCASE_STATS record',
    +         check_this_in   => l_sqlerrm,
    +         against_this_in => 'ORA-0000: normal, successful completion');
    +      wt_assert.eq (
    +         msg_in          => 'l_tstat_rec.test_run_id',
    +         check_this_in   => l_tstat_rec.test_run_id,
    +         against_this_in => l_test_run_id);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_tstat_rec.testcase',
    +         check_this_in   => l_tstat_rec.testcase,
    +         against_this_in => l_tc||'a');
    +      wt_assert.eq (
    +         msg_in          => 'l_tstat_rec.asserts',
    +         check_this_in   => l_tstat_rec.asserts,
    +         against_this_in => 3);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_tstat_rec.passes',
    +         check_this_in   => l_tstat_rec.passes,
    +         against_this_in => 2);
    +      wt_assert.eq (
    +         msg_in          => 'l_tstat_rec.failures',
    +         check_this_in   => l_tstat_rec.failures,
    +         against_this_in => 1);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_tstat_rec.errors',
    +         check_this_in   => l_tstat_rec.errors,
    +         against_this_in => 0);
    +      wt_assert.eq (
    +         msg_in          => 'l_tstat_rec.test_yield',
    +         check_this_in   => l_tstat_rec.test_yield,
    +         against_this_in => 0.667);
    +      wt_assert.eq (
    +         msg_in          => 'l_tstat_rec.avg_interval_msecs',
    +         check_this_in   => l_tstat_rec.avg_interval_msecs,
    +         against_this_in => 100);
    +      --------------------------------------  WTPLSQL Testing --
    +      begin
    +         select * into l_tstat_rec
    +          from  WT_TESTCASE_STATS
    +          where test_run_id = l_test_run_id
    +           and  testcase    = l_tc||'b';
    +         l_sqlerrm := SQLERRM;
    +      exception when others then
    +         l_sqlerrm := SQLERRM;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'Retieve WT_TESTCASE_STATS record',
    +         check_this_in   => l_sqlerrm,
    +         against_this_in => 'ORA-0000: normal, successful completion');
    +      wt_assert.eq (
    +         msg_in          => 'l_tstat_rec.test_run_id',
    +         check_this_in   => l_tstat_rec.test_run_id,
    +         against_this_in => l_test_run_id);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_tstat_rec.testcase',
    +         check_this_in   => l_tstat_rec.testcase,
    +         against_this_in => l_tc||'b');
    +      wt_assert.eq (
    +         msg_in          => 'l_tstat_rec.asserts',
    +         check_this_in   => l_tstat_rec.asserts,
    +         against_this_in => 3);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_tstat_rec.passes',
    +         check_this_in   => l_tstat_rec.passes,
    +         against_this_in => 2);
    +      wt_assert.eq (
    +         msg_in          => 'l_tstat_rec.failures',
    +         check_this_in   => l_tstat_rec.failures,
    +         against_this_in => 1);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_tstat_rec.errors',
    +         check_this_in   => l_tstat_rec.errors,
    +         against_this_in => 0);
    +      wt_assert.eq (
    +         msg_in          => 'l_tstat_rec.test_yield',
    +         check_this_in   => l_tstat_rec.test_yield,
    +         against_this_in => 0.667);
    +      wt_assert.eq (
    +         msg_in          => 'l_tstat_rec.avg_interval_msecs',
    +         check_this_in   => l_tstat_rec.avg_interval_msecs,
    +         against_this_in => 100);
    +      --------------------------------------  WTPLSQL Testing --
    +      begin
    +         select * into l_recTEST
    +          from  WT_TEST_RUN_STATS
    +          where test_run_id = l_test_run_id;
    +         l_sqlerrm := SQLERRM;
    +      exception when others then
    +         l_sqlerrm := SQLERRM;
    +      end;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'Retieve WT_TEST_RUN_STATS record',
    +         check_this_in   => l_sqlerrm,
    +         against_this_in => 'ORA-0000: normal, successful completion');
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.test_run_id',
    +         check_this_in   => l_recTEST.test_run_id,
    +         against_this_in => l_test_run_id);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.test_yield',
    +         check_this_in   => l_recTEST.test_yield,
    +         against_this_in => 0.667);
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.asserts',
    +         check_this_in   => l_recTEST.asserts,
    +         against_this_in => 6);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.passes',
    +         check_this_in   => l_recTEST.passes,
    +         against_this_in => 4);
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.failures',
    +         check_this_in   => l_recTEST.failures,
    +         against_this_in => 2);
    +       --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.errors',
    +         check_this_in   => l_recTEST.errors,
    +         against_this_in => 0);
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.testcases',
    +         check_this_in   => l_recTEST.testcases,
    +         against_this_in => 2);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.avg_interval_msecs',
    +         check_this_in   => l_recTEST.avg_interval_msecs,
    +         against_this_in => 100);
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.code_coverage',
    +         check_this_in   => l_recTEST.code_coverage,
    +         against_this_in => 0.8);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.profiled_lines',
    +         check_this_in   => l_recTEST.profiled_lines,
    +         against_this_in => 20);
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.executed_lines',
    +         check_this_in   => l_recTEST.executed_lines,
    +         against_this_in => 8);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.ignored_lines',
    +         check_this_in   => l_recTEST.ignored_lines,
    +         against_this_in => 6);
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.excluded_lines',
    +         check_this_in   => l_recTEST.excluded_lines,
    +         against_this_in => 4);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.notexec_lines',
    +         check_this_in   => l_recTEST.notexec_lines,
    +         against_this_in => 2);
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.unknown_lines',
    +         check_this_in   => l_recTEST.unknown_lines,
    +         against_this_in => 0);
    +      wt_assert.eq (
    +         msg_in          => 'l_recTEST.avg_executed_usecs',
    +         check_this_in   => l_recTEST.avg_executed_usecs,
    +         against_this_in => 200);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.raises (
    +         msg_in         => 'Delete WT_TESTCASE_STATS Record',
    +         check_call_in  => 'delete from WT_TESTCASE_STATS where test_run_id = ' ||
    +                                                              l_test_run_id,
    +         against_exc_in => '');
    +      commit;
    +      wt_assert.eqqueryvalue (
    +         msg_in           => 'There should be no WT_TESTCASE_STATS records',
    +         check_query_in   => 'select count(*) from WT_TESTCASE_STATS' ||
    +                             ' where test_run_id = ' || l_test_run_id,
    +         against_value_in => 0);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.raises (
    +         msg_in         => 'Delete WT_TEST_RUN_STATS Record',
    +         check_call_in  => 'delete from WT_TEST_RUN_STATS where test_run_id = ' ||
    +                                                              l_test_run_id,
    +         against_exc_in => '');
    +      commit;
    +      wt_assert.eqqueryvalue (
    +         msg_in           => 'There should be no WT_TEST_RUN_STATS records',
    +         check_query_in   => 'select count(*) from WT_TEST_RUN_STATS' ||
    +                             ' where test_run_id = ' || l_test_run_id,
    +         against_value_in => 0);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase  := 'FINALIZE Sad Path 1';
    +      l_tc_aaTEST.delete;
    +      l_recTEST := l_recNULL;
    +      l_recTEST.asserts := 2;
    +      run_finalize('Run Finalize for Sad Path 1');  -- AUTONOMOUS COMMIT
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.test_run_id',
    +         check_this_in   => l_recTEST.test_run_id);
    +      wt_assert.isnull (
    +         msg_in          => 'l_recTEST.asserts',
    +         check_this_in   => l_recTEST.asserts);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'FINALIZE Happy Path Teardown';
    +      wt_assert.raises (
    +         msg_in         => 'Delete WT_TEST_RUNS Record',
    +         check_call_in  => 'delete from WT_TEST_RUNS where id = ' ||
    +                                                l_test_run_id,
    +         against_exc_in => '');
    +      commit;
    +   end t_finalize;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure delete_records
    +      (in_test_run_id  in number)
    +is
    +begin
    +   delete from wt_testcase_stats
    +    where test_run_id = in_test_run_id;
    +   delete from wt_test_run_stats
    +    where test_run_id = in_test_run_id;
    +end delete_records;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_delete_records
    +   is
    +      l_test_run_id  number := -100;
    +      l_sql_txt      varchar2(4000);
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Delete Records Happy Path Setup';
    +      l_sql_txt := 'insert into WT_TEST_RUNS' ||
    +                   ' (id, start_dtm, runner_owner, runner_name)' ||
    +         ' values (' || l_test_run_id || ', sysdate, USER, ''TESTRUNNER2'')';
    +      wt_assert.raises (
    +         msg_in         => 'Insert WT_TEST_RUNS Record',
    +         check_call_in  => l_sql_txt,
    +         against_exc_in => '');
    +      --------------------------------------  WTPLSQL Testing --
    +      l_sql_txt := 'insert into WT_TEST_RUN_STATS (test_run_id) values (' ||
    +                                                 l_test_run_id || ')';
    +      wt_assert.raises (
    +         msg_in         => 'Insert WT_TEST_RUN_STATS Record',
    +         check_call_in  => l_sql_txt,
    +         against_exc_in => '');
    +      l_sql_txt := 'insert into WT_TESTCASE_STATS (test_run_id, testcase)' ||
    +                   ' values (' || l_test_run_id || ', ''TESTCASE2'')';
    +      wt_assert.raises (
    +         msg_in         => 'Insert WT_TESTCASE_STATS Record',
    +         check_call_in  => l_sql_txt,
    +         against_exc_in => '');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Delete Records Happy Path and Teardown';
    +      wt_assert.raises (
    +         msg_in         => 'Delete Records with NULL ID',
    +         check_call_in  => 'begin wt_test_run_stat.delete_records(' ||
    +                                       l_test_run_id || '); end;',
    +         against_exc_in => '');
    +      wt_assert.raises (
    +         msg_in         => 'Delete WT_TEST_RUNS Record',
    +         check_call_in  => 'delete from WT_TEST_RUNS where id = ' || l_test_run_id,
    +         against_exc_in => '');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Delete Records Test Sad Paths';
    +      wt_assert.raises (
    +         msg_in         => 'Delete Records with NULL ID',
    +         check_call_in  => 'begin wt_test_run_stat.delete_records(null); end;',
    +         against_exc_in => '');
    +      wt_assert.raises (
    +         msg_in         => 'Delete Records with Invalid ID',
    +         check_call_in  => 'begin wt_test_run_stat.delete_records(-0.01); end;',
    +         against_exc_in => '');
    +   end t_delete_records;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +--==============================================================--
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure WTPLSQL_RUN  --% WTPLSQL SET DBOUT "WT_TEST_RUN_STAT:PACKAGE BODY" %--
    +   is
    +   begin
    +      t_initialize;
    +      t_add_result;
    +      t_add_profile;
    +      t_finalize;
    +      t_delete_records;
    +   end WTPLSQL_RUN;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +--==============================================================--
    +
    +
    +end wt_test_run_stat;
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/package body/WT_TEST_RUN_STAT/headerBg.jpg b/docs/persist/DBDocs/package body/WT_TEST_RUN_STAT/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 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
    nZDH?O8gS~#y@TeK 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 literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package body/WT_TEST_RUN_STAT/topDimTabR.gif b/docs/persist/DBDocs/package body/WT_TEST_RUN_STAT/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package body/WT_TEST_RUN_STAT/topTabBg.gif b/docs/persist/DBDocs/package body/WT_TEST_RUN_STAT/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package body/WT_TEST_RUN_STAT/topTabR.gif b/docs/persist/DBDocs/package body/WT_TEST_RUN_STAT/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + + +
    +
    +
    +

    Doc

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Code

    +
    +
    +
    +
    +
    +
    +
    + +


    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMEWT_TEXT_REPORT
    SUBOBJECT_NAMEnull
    OBJECT_ID41934
    DATA_OBJECT_IDnull
    OBJECT_TYPEPACKAGE BODY
    CREATED29-JUN-2018 15:09:17
    LAST_DDL_TIME29-JUN-2018 15:21:18
    TIMESTAMP2018-06-29:15:21:18
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE2
    EDITION_NAMEnull
    +
    +
    +
    +
    + + + + + + + + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    EXECUTEPUBLICNOWTPWT_TEXT_REPORT
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    +
    +package body wt_text_report
    +as
    +
    +   g_test_runs_rec       wt_test_runs%ROWTYPE;
    +   g_test_run_stats_rec  wt_test_run_stats%ROWTYPE;
    +
    +
    +----------------------
    +--  Private Procedures
    +----------------------
    +
    +------------------------------------------------------------
    +procedure p
    +      (in_text  in  varchar2)
    +is
    +begin
    +   dbms_output.put_line(in_text);
    +end p;
    +
    +------------------------------------------------------------
    +procedure result_summary
    +is
    +begin
    +   p('       Total Test Cases: ' || to_char(nvl(g_test_run_stats_rec.testcases         ,0),'9999999') ||
    +     '       Total Assertions: ' || to_char(nvl(g_test_run_stats_rec.asserts           ,0),'9999999') );
    +   p('  Minimum Interval msec: ' || to_char(nvl(g_test_run_stats_rec.min_interval_msecs,0),'9999999') ||
    +     '      Failed Assertions: ' || to_char(nvl(g_test_run_stats_rec.failures          ,0),'9999999') );
    +   p('  Average Interval msec: ' || to_char(nvl(g_test_run_stats_rec.avg_interval_msecs,0),'9999999') ||
    +     '       Error Assertions: ' || to_char(nvl(g_test_run_stats_rec.errors            ,0),'9999999') );
    +   p('  Maximum Interval msec: ' || to_char(nvl(g_test_run_stats_rec.max_interval_msecs,0),'9999999') ||
    +     '             Test Yield: ' || to_char(    g_test_run_stats_rec.test_yield * 100     ,'9990.99') ||
    +                                                                                                  '%' );
    +   p('   Total Run Time (sec): ' || to_char(extract(day from (g_test_runs_rec.end_dtm -
    +                                                g_test_runs_rec.start_dtm)*86400*100)/100 ,'99990.9') );
    +end result_summary;
    +
    +------------------------------------------------------------
    +procedure profile_summary
    +is
    +begin
    +   p('          Ignored Lines: ' || to_char(nvl(g_test_run_stats_rec.ignored_lines     ,0),'9999999') ||
    +     '   Total Profiled Lines: ' || to_char(nvl(g_test_run_stats_rec.profiled_lines    ,0),'9999999') );
    +   p('         Excluded Lines: ' || to_char(nvl(g_test_run_stats_rec.excluded_lines    ,0),'9999999') ||
    +     '   Total Executed Lines: ' || to_char(nvl(g_test_run_stats_rec.executed_lines    ,0),'9999999') );
    +   p('  Minimum LineExec usec: ' || to_char(nvl(g_test_run_stats_rec.min_executed_usecs,0),'9999999') ||
    +     '     Not Executed Lines: ' || to_char(nvl(g_test_run_stats_rec.notexec_lines     ,0),'9999999') );
    +   p('  Average LineExec usec: ' || to_char(nvl(g_test_run_stats_rec.avg_executed_usecs,0),'9999999') ||
    +     '          Unknown Lines: ' || to_char(nvl(g_test_run_stats_rec.unknown_lines     ,0),'9999999') );
    +   p('  Maximum LineExec usec: ' || to_char(nvl(g_test_run_stats_rec.max_executed_usecs,0),'9999999') ||
    +     '          Code Coverage: ' || to_char(    g_test_run_stats_rec.code_coverage * 100  ,'9990.99') ||
    +                                                                                                  '%' );
    +   p('  Trigger Source Offset: ' || to_char(    g_test_runs_rec.trigger_offset            ,'9999999') );
    +end profile_summary;
    +
    +------------------------------------------------------------
    +procedure summary_out
    +is
    +begin
    +   p('');
    +   p('    wtPLSQL ' || wtplsql.show_version ||
    +       ' - Run ID ' || g_test_runs_rec.id   ||
    +               ': ' || to_char(g_test_runs_rec.start_dtm, g_date_format) ||
    +            CHR(10) );
    +   p('  Test Results for ' || g_test_runs_rec.runner_owner ||
    +                       '.' || g_test_runs_rec.runner_name  );
    +   result_summary;
    +   if     g_test_runs_rec.dbout_name is not null
    +      AND g_test_runs_rec.profiler_runid is null
    +   then
    +      p('');
    +      p('  Note: ' || g_test_runs_rec.dbout_type  || ' ' ||
    +                      g_test_runs_rec.dbout_owner || '.' ||
    +                      g_test_runs_rec.dbout_name  || ' was not profiled.');
    +   end if;
    +   if g_test_runs_rec.error_message is not null
    +   then
    +      p('');
    +      p('  *** Test Runner Error ***');
    +      p(g_test_runs_rec.error_message);
    +   end if;
    +   ----------------------------------------
    +   if g_test_runs_rec.profiler_runid is null
    +   then
    +      return;
    +   end if;
    +   p('');
    +   p('  Code Coverage for ' || g_test_runs_rec.dbout_type  ||
    +                        ' ' || g_test_runs_rec.dbout_owner ||
    +                        '.' || g_test_runs_rec.dbout_name  );
    +   profile_summary;
    +end summary_out;
    +
    +------------------------------------------------------------
    +procedure results_out
    +      (in_show_pass  in boolean)
    +is
    +   l_last_testcase  wt_results.testcase%TYPE;
    +   l_show_pass_txt  varchar2(1);
    +   header_shown     boolean;
    +   procedure l_show_header is begin
    +      p('');
    +      p(' - ' || g_test_runs_rec.runner_owner  ||
    +          '.' || g_test_runs_rec.runner_name   || 
    +          ' Test Result Details (Test Run ID ' ||
    +                 g_test_runs_rec.id            ||
    +          ')' );
    +      p('-----------------------------------------------------------');
    +   end l_show_header;
    +begin
    +   if in_show_pass
    +   then
    +      l_show_pass_txt := 'Y';
    +   else
    +      l_show_pass_txt := 'N';
    +   end if;
    +   header_shown := FALSE;
    +   for buff in (
    +      select status
    +            ,interval_msecs
    +            ,testcase
    +            ,assertion
    +            ,details
    +            ,message
    +       from  wt_results
    +       where test_run_id = g_test_runs_rec.id
    +       and  (   l_show_pass_txt = 'Y'
    +             or status         != 'PASS')
    +       order by result_seq )
    +   loop
    +      if not header_shown
    +      then
    +         l_show_header;
    +         header_shown := TRUE;
    +      end if;
    +      if    buff.testcase = l_last_testcase
    +         OR (      buff.testcase is null
    +             AND l_last_testcase is null )
    +      then
    +         p(format_test_result
    +                        (in_assertion       => buff.assertion
    +                        ,in_status          => buff.status
    +                        ,in_details         => buff.details
    +                        ,in_testcase        => NULL
    +                        ,in_message         => buff.message
    +                        ,in_interval_msecs  => buff.interval_msecs) );
    +      else
    +         p(format_test_result
    +                        (in_assertion       => buff.assertion
    +                        ,in_status          => buff.status
    +                        ,in_details         => buff.details
    +                        ,in_testcase        => buff.testcase
    +                        ,in_message         => buff.message
    +                        ,in_interval_msecs  => buff.interval_msecs) );
    +         l_last_testcase := buff.testcase;
    +      end if;
    +   end loop;
    +end results_out;
    +
    +------------------------------------------------------------
    +procedure profile_out
    +      (in_show_aux  in boolean)
    +is
    +   l_header_txt  CONSTANT varchar2(2000) := 
    +     'Source               TotTime MinTime   MaxTime     ' || chr(10) ||
    +     '  Line Stat Occurs    (usec)  (usec)    (usec) Text' || chr(10) ||
    +     '------ ---- ------ --------- ------- --------- ------------';
    +   l_show_aux_txt  varchar2(1);
    +   header_shown     boolean;
    +   procedure l_show_header is begin
    +     p('');
    +     p(' - ' || g_test_runs_rec.dbout_owner     ||
    +         '.' || g_test_runs_rec.dbout_name      ||
    +         ' ' || g_test_runs_rec.dbout_type      ||
    +         ' Code Coverage Details (Test Run ID ' ||
    +                g_test_runs_rec.id              ||
    +         ')' );
    +   end l_show_header;
    +begin
    +   if g_test_runs_rec.profiler_runid is null
    +   then
    +      return;
    +   end if;
    +   if in_show_aux
    +   then
    +      l_show_aux_txt := 'Y';
    +   else
    +      l_show_aux_txt := 'N';
    +   end if;
    +   header_shown := FALSE;
    +   for buff in (
    +      select line
    +            ,status
    +            ,total_occur
    +            ,total_usecs
    +            ,min_usecs
    +            ,max_usecs
    +            ,text
    +            ,rownum
    +       from  wt_dbout_profiles
    +       where test_run_id = g_test_runs_rec.id
    +       and  (   l_show_aux_txt = 'Y'
    +             or status not in ('EXEC','IGNR','UNKN','EXCL'))
    +       order by line  )
    +   loop
    +      if not header_shown
    +      then
    +         l_show_header;
    +         p(l_header_txt);
    +         header_shown := TRUE;
    +      end if;
    +      if mod(buff.rownum,25) = 0
    +      then
    +         p(l_header_txt);
    +      end if;
    +      p(to_char(buff.line,'99999') ||
    +        case buff.status when 'NOTX' then '#NOTX#'
    +        else ' ' || rpad(buff.status,4) || ' '
    +        end                                  ||
    +        to_char(buff.total_occur,'99999')    || ' ' ||
    +        to_char(buff.total_usecs,'99999999') || ' ' ||
    +        to_char(buff.min_usecs,'999999')     || ' ' ||
    +        to_char(buff.max_usecs,'99999999')   || ' ' ||
    +        replace(buff.text,CHR(10),'')            );
    +   end loop;
    +end profile_out;
    +
    +
    +---------------------
    +--  Public Procedures
    +---------------------
    +
    +------------------------------------------------------------
    +function format_test_result
    +      (in_assertion       in wt_results.assertion%TYPE
    +      ,in_status          in wt_results.status%TYPE
    +      ,in_details         in wt_results.details%TYPE
    +      ,in_testcase        in wt_results.testcase%TYPE
    +      ,in_message         in wt_results.message%TYPE
    +      ,in_interval_msecs  in wt_results.interval_msecs%TYPE DEFAULT NULL)
    +   return varchar2
    +is
    +   l_out_str  varchar2(32000) := '';
    +begin
    +   if in_testcase is not null
    +   then
    +      l_out_str := ' ---- Test Case: ' || in_testcase || CHR(10);
    +   end if;
    +   if in_status = wt_assert.C_PASS
    +   then
    +      l_out_str := l_out_str || ' ' || rpad(in_status,4) || ' ';
    +   else
    +      l_out_str := l_out_str || '#' || rpad(in_status,4) || '#';
    +   end if;
    +   if in_interval_msecs is not null
    +   then
    +      l_out_str := l_out_str || lpad(in_interval_msecs,4) || 'ms ';
    +   end if;
    +   if in_message is not null
    +   then
    +      l_out_str := l_out_str || in_message  || '. ';
    +   end if;
    +   l_out_str := l_out_str || in_assertion || ' - ';
    +   if g_single_line_output
    +   then
    +      l_out_str := l_out_str || replace(replace(in_details,CHR(13),'\r'),CHR(10),'\n');
    +   else
    +      l_out_str := l_out_str || in_details;
    +   end if;
    +   return l_out_str;
    +end format_test_result;
    +
    +------------------------------------------------------------
    +procedure ad_hoc_result
    +      (in_assertion      in wt_results.assertion%TYPE
    +      ,in_status         in wt_results.status%TYPE
    +      ,in_details        in wt_results.details%TYPE
    +      ,in_testcase       in wt_results.testcase%TYPE
    +      ,in_message        in wt_results.message%TYPE)
    +is
    +begin
    +   p(format_test_result
    +        (in_assertion  => in_assertion
    +        ,in_status     => in_status
    +        ,in_details    => in_details
    +        ,in_testcase   => in_testcase
    +        ,in_message    => in_message));
    +end ad_hoc_result;
    +
    +------------------------------------------------------------
    +procedure dbms_out
    +      (in_runner_owner   in  wt_test_runs.runner_owner%TYPE default USER
    +      ,in_runner_name    in  wt_test_runs.runner_name%TYPE  default null
    +      ,in_detail_level   in  number                         default 0
    +      ,in_summary_last   in  boolean                        default FALSE)
    +is
    +
    +   cursor c_main(in_test_run_id  in number) is
    +      select * from wt_test_run_stats
    +       where test_run_id = in_test_run_id;
    +   g_test_run_statsNULL   wt_test_run_stats%ROWTYPE;
    +
    +begin
    +
    +   for buff in (
    +      select * from wt_test_runs
    +       where (          runner_name,        start_dtm) in
    +             (select t2.runner_name, max(t2.start_dtm)
    +               from  wt_test_runs  t2
    +               where (   (    in_runner_name is not null
    +                          and in_runner_name = t2.runner_name)
    +                      OR in_runner_name is null  )
    +                and  t2.runner_owner = in_runner_owner
    +               group by t2.runner_name )
    +       order by start_dtm, runner_name )
    +   loop
    +
    +      --  Load Test Run Record
    +      g_test_runs_rec := buff;
    +
    +      --  Load the Stats Record
    +      g_test_run_stats_rec := g_test_run_statsNULL;
    +      open c_main(buff.id);
    +      fetch c_main into g_test_run_stats_rec;
    +      close c_main;
    +
    +      --  Setup Display Order
    +      if in_summary_last
    +      then
    +        if in_detail_level >= 10
    +         then
    +            profile_out(in_detail_level >= 30);
    +            results_out(in_detail_level >= 20);
    +         end if;
    +         summary_out;
    +      else
    +         summary_out;
    +         if in_detail_level >= 10
    +         then
    +            results_out(in_detail_level >= 20);
    +            profile_out(in_detail_level >= 30);
    +         end if;
    +      end if;
    +
    +      p('');
    +
    +   end loop;
    +
    +end dbms_out;
    +
    +
    +end wt_text_report;
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/package body/WT_TEXT_REPORT/headerBg.jpg b/docs/persist/DBDocs/package body/WT_TEXT_REPORT/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 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
    nZDH?O8gS~#y@TeK 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 literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package body/WT_TEXT_REPORT/topDimTabR.gif b/docs/persist/DBDocs/package body/WT_TEXT_REPORT/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package body/WT_TEXT_REPORT/topTabBg.gif b/docs/persist/DBDocs/package body/WT_TEXT_REPORT/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package body/WT_TEXT_REPORT/topTabR.gif b/docs/persist/DBDocs/package body/WT_TEXT_REPORT/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + +

    Package Bodies +

    \ No newline at end of file diff --git a/docs/persist/DBDocs/package/WTPLSQL.html b/docs/persist/DBDocs/package/WTPLSQL.html new file mode 100644 index 0000000..96ff75c --- /dev/null +++ b/docs/persist/DBDocs/package/WTPLSQL.html @@ -0,0 +1,225 @@ + + + + + + + + +
    +
    +
    +

    Doc

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Code

    +
    +
    +
    +
    +
    +
    +
    + +

    AUTHID CURRENT_USER is required for dynamic PL/SQL execution.


    + + + + + +
    Method Summary
     delete_runs( in_test_run_id in number )
              
     delete_runs( in_runner_owner in varchar2 , in_runner_name in varchar2 )
              
     show_version
              
     test_all
              
     test_run( in_package_name in varchar2 )
              
     WTPLSQL_RUN
              
    +

    Method Detail
    +

    delete_runs

              delete_runs( in_test_run_id in number ) 
              

    +

    delete_runs

              delete_runs( in_runner_owner in varchar2 , in_runner_name in varchar2 ) 
              

    +

    show_version

              show_version
              

    +

    test_all

              test_all
              

    +

    test_run

              test_run( in_package_name in varchar2 ) 
              

    +

    WTPLSQL_RUN

              WTPLSQL_RUN
              

    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMEWTPLSQL
    SUBOBJECT_NAMEnull
    OBJECT_ID41925
    DATA_OBJECT_IDnull
    OBJECT_TYPEPACKAGE
    CREATED29-JUN-2018 15:09:14
    LAST_DDL_TIME29-JUN-2018 15:21:16
    TIMESTAMP2018-06-29:15:21:15
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE1
    EDITION_NAMEnull
    +
    +
    +
    +
    + + + + + + + + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    EXECUTEPUBLICNOWTPWTPLSQL
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    +
    +package wtplsql authid current_user
    +as
    +   -- AUTHID CURRENT_USER is required for dynamic PL/SQL execution.
    +
    +   function show_version
    +      return varchar2;
    +
    +   procedure test_run
    +      (in_package_name  in  varchar2);
    +
    +   procedure test_all;
    +
    +   procedure delete_runs
    +      (in_test_run_id  in number);
    +
    +   procedure delete_runs
    +      (in_runner_owner  in varchar2
    +      ,in_runner_name   in varchar2);
    +
    +   --   WtPLSQL Self Test Procedures
    +   --
    +   -- alter system set PLSQL_CCFLAGS = 
    +   --    'WTPLSQL_ENABLE:TRUE, WTPLSQL_SELFTEST:TRUE'
    +   --    scope=BOTH;
    +   --
    +   -- begin
    +   --    dbms_utility.compile_schema('WTP',TRUE,FALSE);
    +   -- end;
    +   -- /
    +   --
    +   $IF $$WTPLSQL_SELFTEST
    +   $THEN
    +      procedure WTPLSQL_RUN;
    +   $END
    +
    +end wtplsql;
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/package/WTPLSQL/headerBg.jpg b/docs/persist/DBDocs/package/WTPLSQL/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 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 literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package/WTPLSQL/topDimTabR.gif b/docs/persist/DBDocs/package/WTPLSQL/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package/WTPLSQL/topTabBg.gif b/docs/persist/DBDocs/package/WTPLSQL/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package/WTPLSQL/topTabR.gif b/docs/persist/DBDocs/package/WTPLSQL/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + + +
    +
    +
    +

    Doc

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Code

    +
    +
    +
    +
    +
    +
    +
    + +

    AUTHID CURRENT_USER is required for dynamic PL/SQL execution.


    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
     eq( msg_in in varchar2 , check_this_in in varchar2 , against_this_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
              
     eq( msg_in in varchar2 , check_this_in in boolean , against_this_in in boolean , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
              
     eq( msg_in in varchar2 , check_this_in in XMLTYPE , against_this_in in XMLTYPE , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
              
     eq( msg_in in varchar2 , check_this_in in CLOB , against_this_in in CLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
               Not Used, utPLSQL V1 API
     eq( msg_in in varchar2 , check_this_in in BLOB , against_this_in in BLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
              
     eqquery( msg_in in varchar2 , check_query_in in varchar2 , against_query_in in varchar2 , raise_exc_in in boolean : = false )
              
     eqqueryvalue( msg_in in varchar2 , check_query_in in varchar2 , against_value_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
              
     eqqueryvalue( msg_in in varchar2 , check_query_in in varchar2 , against_value_in in XMLTYPE , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
              
     eqqueryvalue( msg_in in varchar2 , check_query_in in varchar2 , against_value_in in CLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
               Not Used, utPLSQL V1 API
     eqqueryvalue( msg_in in varchar2 , check_query_in in varchar2 , against_value_in in BLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
              
     eqtabcount( msg_in in varchar2 , check_this_in in varchar2 , against_this_in in varchar2 , check_where_in in varchar2 : = null , against_where_in in varchar2 : = null , raise_exc_in in boolean : = false )
              
     eqtable( msg_in in varchar2 , check_this_in in varchar2 , against_this_in in varchar2 , check_where_in in varchar2 : = null , against_where_in in varchar2 : = null , raise_exc_in in boolean : = false )
              
     get_NLS_DATE_FORMAT
               Date/Time Formats are configured at the Session Level
     get_NLS_TIMESTAMP_FORMAT
              
     get_NLS_TIMESTAMP_TZ_FORMAT
              
     isnotnull( msg_in in varchar2 , check_this_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
              
     isnotnull( msg_in in varchar2 , check_this_in in boolean , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
               Not Used, utPLSQL V1 API
     isnotnull( msg_in in varchar2 , check_this_in in CLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
               Not Used, utPLSQL V1 API
     isnotnull( msg_in in varchar2 , check_this_in in BLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
               Not Used, utPLSQL V1 API
     isnull( msg_in in varchar2 , check_this_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
              
     isnull( msg_in in varchar2 , check_this_in in boolean , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
               Not Used, utPLSQL V1 API
     isnull( msg_in in varchar2 , check_this_in in CLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
               Not Used, utPLSQL V1 API
     isnull( msg_in in varchar2 , check_this_in in BLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
               Not Used, utPLSQL V1 API
     last_assert
              
     last_details
              
     last_msg
              
     last_pass
               Modify as required
     objexists( msg_in in varchar2 , obj_owner_in in varchar2 , obj_name_in in varchar2 , obj_type_in in varchar2 default null , raise_exc_in in boolean : = false )
              
     objexists( msg_in in varchar2 , check_this_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
              
     objnotexists( msg_in in varchar2 , obj_owner_in in varchar2 , obj_name_in in varchar2 , obj_type_in in varchar2 default null , raise_exc_in in boolean : = false )
              
     objnotexists( msg_in in varchar2 , check_this_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
              
     raises( msg_in varchar2 , check_call_in in varchar2 , against_exc_in in varchar2 )
              
     raises( msg_in varchar2 , check_call_in in varchar2 , against_exc_in in number )
              
     reset_globals
              
     set_NLS_DATE_FORMAT( in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS' )
              
     set_NLS_TIMESTAMP_FORMAT( in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS.FF6' )
              
     set_NLS_TIMESTAMP_TZ_FORMAT( in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS.FF6 TZH:TZM' )
              
     this( msg_in in varchar2 , check_this_in in boolean , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
              
     throws( msg_in varchar2 , check_call_in in varchar2 , against_exc_in in varchar2 )
              
     throws( msg_in varchar2 , check_call_in in varchar2 , against_exc_in in number )
              
     WTPLSQL_RUN
              
    +

    Method Detail
    +

    eq

              eq( msg_in in varchar2 , check_this_in in varchar2 , against_this_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) 
              

    +

    eq

              eq( msg_in in varchar2 , check_this_in in boolean , against_this_in in boolean , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) 
              

    +

    eq

              eq( msg_in in varchar2 , check_this_in in XMLTYPE , against_this_in in XMLTYPE , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) 
              

    +

    eq

              eq( msg_in in varchar2 , check_this_in in CLOB , against_this_in in CLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) 
               Not Used, utPLSQL V1 API

    +

    eq

              eq( msg_in in varchar2 , check_this_in in BLOB , against_this_in in BLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) 
              

    +

    eqquery

              eqquery( msg_in in varchar2 , check_query_in in varchar2 , against_query_in in varchar2 , raise_exc_in in boolean : = false ) 
              

    +

    eqqueryvalue

              eqqueryvalue( msg_in in varchar2 , check_query_in in varchar2 , against_value_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) 
              

    +

    eqqueryvalue

              eqqueryvalue( msg_in in varchar2 , check_query_in in varchar2 , against_value_in in XMLTYPE , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) 
              

    +

    eqqueryvalue

              eqqueryvalue( msg_in in varchar2 , check_query_in in varchar2 , against_value_in in CLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) 
               Not Used, utPLSQL V1 API

    +

    eqqueryvalue

              eqqueryvalue( msg_in in varchar2 , check_query_in in varchar2 , against_value_in in BLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) 
              

    +

    eqtabcount

              eqtabcount( msg_in in varchar2 , check_this_in in varchar2 , against_this_in in varchar2 , check_where_in in varchar2 : = null , against_where_in in varchar2 : = null , raise_exc_in in boolean : = false ) 
              

    +

    eqtable

              eqtable( msg_in in varchar2 , check_this_in in varchar2 , against_this_in in varchar2 , check_where_in in varchar2 : = null , against_where_in in varchar2 : = null , raise_exc_in in boolean : = false ) 
              

    +

    get_NLS_DATE_FORMAT

              get_NLS_DATE_FORMAT
               Date/Time Formats are configured at the Session Level

    +

    get_NLS_TIMESTAMP_FORMAT

              get_NLS_TIMESTAMP_FORMAT
              

    +

    get_NLS_TIMESTAMP_TZ_FORMAT

              get_NLS_TIMESTAMP_TZ_FORMAT
              

    +

    isnotnull

              isnotnull( msg_in in varchar2 , check_this_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) 
              

    +

    isnotnull

              isnotnull( msg_in in varchar2 , check_this_in in boolean , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) 
               Not Used, utPLSQL V1 API

    +

    isnotnull

              isnotnull( msg_in in varchar2 , check_this_in in CLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) 
               Not Used, utPLSQL V1 API

    +

    isnotnull

              isnotnull( msg_in in varchar2 , check_this_in in BLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) 
               Not Used, utPLSQL V1 API

    +

    isnull

              isnull( msg_in in varchar2 , check_this_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) 
              

    +

    isnull

              isnull( msg_in in varchar2 , check_this_in in boolean , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) 
               Not Used, utPLSQL V1 API

    +

    isnull

              isnull( msg_in in varchar2 , check_this_in in CLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) 
               Not Used, utPLSQL V1 API

    +

    isnull

              isnull( msg_in in varchar2 , check_this_in in BLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) 
               Not Used, utPLSQL V1 API

    +

    last_assert

              last_assert
              

    +

    last_details

              last_details
              

    +

    last_msg

              last_msg
              

    +

    last_pass

              last_pass
               Modify as required

    +

    objexists

              objexists( msg_in in varchar2 , obj_owner_in in varchar2 , obj_name_in in varchar2 , obj_type_in in varchar2 default null , raise_exc_in in boolean : = false ) 
              

    +

    objexists

              objexists( msg_in in varchar2 , check_this_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) 
              

    +

    objnotexists

              objnotexists( msg_in in varchar2 , obj_owner_in in varchar2 , obj_name_in in varchar2 , obj_type_in in varchar2 default null , raise_exc_in in boolean : = false ) 
              

    +

    objnotexists

              objnotexists( msg_in in varchar2 , check_this_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) 
              

    +

    raises

              raises( msg_in varchar2 , check_call_in in varchar2 , against_exc_in in varchar2 ) 
              

    +

    raises

              raises( msg_in varchar2 , check_call_in in varchar2 , against_exc_in in number ) 
              

    +

    reset_globals

              reset_globals
              

    +

    set_NLS_DATE_FORMAT

              set_NLS_DATE_FORMAT( in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS' ) 
              

    +

    set_NLS_TIMESTAMP_FORMAT

              set_NLS_TIMESTAMP_FORMAT( in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS.FF6' ) 
              

    +

    set_NLS_TIMESTAMP_TZ_FORMAT

              set_NLS_TIMESTAMP_TZ_FORMAT( in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS.FF6 TZH:TZM' ) 
              

    +

    this

              this( msg_in in varchar2 , check_this_in in boolean , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) 
              

    +

    throws

              throws( msg_in varchar2 , check_call_in in varchar2 , against_exc_in in varchar2 ) 
              

    +

    throws

              throws( msg_in varchar2 , check_call_in in varchar2 , against_exc_in in number ) 
              

    +

    WTPLSQL_RUN

              WTPLSQL_RUN
              

    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMEWT_ASSERT
    SUBOBJECT_NAMEnull
    OBJECT_ID41927
    DATA_OBJECT_IDnull
    OBJECT_TYPEPACKAGE
    CREATED29-JUN-2018 15:09:15
    LAST_DDL_TIME29-JUN-2018 15:21:16
    TIMESTAMP2018-06-29:15:21:15
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE1
    EDITION_NAMEnull
    +
    +
    +
    +
    + + + + + + + + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    EXECUTEPUBLICNOWTPWT_ASSERT
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    +
    +package wt_assert authid current_user
    +is
    +   -- AUTHID CURRENT_USER is required for dynamic PL/SQL execution.
    +
    +   ASSERT_FAILURE_EXCEPTION  exception;
    +   PRAGMA EXCEPTION_INIT(ASSERT_FAILURE_EXCEPTION, -20003);
    +
    +   C_PASS  CONSTANT varchar2(10) := 'PASS';
    +   C_FAIL  CONSTANT varchar2(10) := 'FAIL';
    +
    +   -- See RESET_GLOBALS procedure for default global values
    +
    +   -- Testcase name for a series of assertions.
    +   --   Modify as required
    +   g_testcase         wt_results.testcase%TYPE;
    +
    +   function last_pass
    +   return boolean;
    +
    +   function last_assert
    +   return wt_results.assertion%TYPE;
    +
    +   function last_msg
    +   return wt_results.message%TYPE;
    +
    +   function last_details
    +   return wt_results.details%TYPE;
    +
    +   procedure reset_globals;
    +
    +   -- Date/Time Formats are configured at the Session Level
    +   function get_NLS_DATE_FORMAT
    +      return varchar2;
    +   procedure set_NLS_DATE_FORMAT
    +      (in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS');
    +   function get_NLS_TIMESTAMP_FORMAT
    +      return varchar2;
    +   procedure set_NLS_TIMESTAMP_FORMAT
    +      (in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS.FF6');
    +   function get_NLS_TIMESTAMP_TZ_FORMAT
    +       return varchar2;
    +   procedure set_NLS_TIMESTAMP_TZ_FORMAT
    +      (in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS.FF6 TZH:TZM');
    +
    +   ------------------------
    +   --   Datatypes Supported
    +   --     Oracle Data Type Families
    +   --   https://docs.oracle.com/cd/E11882_01/appdev.112/e25519/predefined.htm#LNPLS2047
    +   --
    +   -- VARCHAR2 - Includes ROWID, LONG*, RAW, LONG RAW*, and NVARCHAR2
    +   -- DATE** - Includes TIMESTAMP and INTERVAL
    +   -- NUMBER** - Includes PLS_INTEGER
    +   -- BOOLEAN
    +   -- XMLTYPE
    +   -- CLOB - Includes NCLOB
    +   -- BLOB
    +   --
    +   -- *LONG and LONG RAW data length is limited to VARCHAR2 length in PL/SQL (32K).
    +   -- **VARCHAR2 includes DATE and NUMBER using Implicit Data Conversions:
    +   --   https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements002.htm#i163326
    +   --
    +
    +   procedure this (
    +      msg_in          in   varchar2,
    +      check_this_in   in   boolean,
    +      null_ok_in      in   boolean := false,   -- Not Used, utPLSQL V1 API
    +      raise_exc_in    in   boolean := false);
    +
    +   --
    +   procedure eq (
    +      msg_in            in   varchar2,
    +      check_this_in     in   varchar2,
    +      against_this_in   in   varchar2,
    +      null_ok_in        in   boolean := false,
    +      raise_exc_in      in   boolean := false);
    +
    +   procedure eq (
    +      msg_in            in   varchar2,
    +      check_this_in     in   boolean,
    +      against_this_in   in   boolean,
    +      null_ok_in        in   boolean := false,
    +      raise_exc_in      in   boolean := false);
    +
    +   procedure eq (
    +      msg_in            in   varchar2,
    +      check_this_in     in   XMLTYPE,
    +      against_this_in   in   XMLTYPE,
    +      null_ok_in        in   boolean := false,   -- Not Used, utPLSQL V1 API
    +      raise_exc_in      in   boolean := false);
    +
    +   procedure eq (
    +      msg_in            in   varchar2,
    +      check_this_in     in   CLOB,
    +      against_this_in   in   CLOB,
    +      null_ok_in        in   boolean := false,
    +      raise_exc_in      in   boolean := false);
    +
    +   procedure eq (
    +      msg_in            in   varchar2,
    +      check_this_in     in   BLOB,
    +      against_this_in   in   BLOB,
    +      null_ok_in        in   boolean := false,
    +      raise_exc_in      in   boolean := false);
    +
    +   --
    +   procedure isnotnull (
    +      msg_in          in   varchar2,
    +      check_this_in   in   varchar2,
    +      null_ok_in      in   boolean := false,   -- Not Used, utPLSQL V1 API
    +      raise_exc_in    in   boolean := false);
    +
    +   procedure isnotnull (
    +      msg_in          in   varchar2,
    +      check_this_in   in   boolean,
    +      null_ok_in      in   boolean := false,   -- Not Used, utPLSQL V1 API
    +      raise_exc_in    in   boolean := false);
    +
    +   procedure isnotnull (
    +      msg_in          in   varchar2,
    +      check_this_in   in   CLOB,
    +      null_ok_in      in   boolean := false,   -- Not Used, utPLSQL V1 API
    +      raise_exc_in    in   boolean := false);
    +
    +   procedure isnotnull (
    +      msg_in          in   varchar2,
    +      check_this_in   in   BLOB,
    +      null_ok_in      in   boolean := false,   -- Not Used, utPLSQL V1 API
    +      raise_exc_in    in   boolean := false);
    +
    +   --
    +   procedure isnull (
    +      msg_in          in   varchar2,
    +      check_this_in   in   varchar2,
    +      null_ok_in      in   boolean := false,   -- Not Used, utPLSQL V1 API
    +      raise_exc_in    in   boolean := false);
    +
    +   procedure isnull (
    +      msg_in          in   varchar2,
    +      check_this_in   in   boolean,
    +      null_ok_in      in   boolean := false,   -- Not Used, utPLSQL V1 API
    +      raise_exc_in    in   boolean := false);
    +
    +   procedure isnull (
    +      msg_in          in   varchar2,
    +      check_this_in   in   CLOB,
    +      null_ok_in      in   boolean := false,   -- Not Used, utPLSQL V1 API
    +      raise_exc_in    in   boolean := false);
    +
    +   procedure isnull (
    +      msg_in          in   varchar2,
    +      check_this_in   in   BLOB,
    +      null_ok_in      in   boolean := false,   -- Not Used, utPLSQL V1 API
    +      raise_exc_in    in   boolean := false);
    +
    +   --
    +   procedure raises (
    +      msg_in                varchar2,
    +      check_call_in    in   varchar2,
    +      against_exc_in   in   varchar2);
    +
    +   procedure raises (
    +      msg_in                varchar2,
    +      check_call_in    in   varchar2,
    +      against_exc_in   in   number);
    +
    +   procedure throws (
    +      msg_in                varchar2,
    +      check_call_in    in   varchar2,
    +      against_exc_in   in   varchar2);
    +
    +   procedure throws (
    +      msg_in                varchar2,
    +      check_call_in    in   varchar2,
    +      against_exc_in   in   number);
    +
    +   --
    +   procedure eqqueryvalue (
    +      msg_in             in   varchar2,
    +      check_query_in     in   varchar2,
    +      against_value_in   in   varchar2,
    +      null_ok_in         in   boolean := false,
    +      raise_exc_in       in   boolean := false);
    +
    +   procedure eqqueryvalue (
    +      msg_in             in   varchar2,
    +      check_query_in     in   varchar2,
    +      against_value_in   in   XMLTYPE,
    +      null_ok_in         in   boolean := false,  -- Not Used, utPLSQL V1 API
    +      raise_exc_in       in   boolean := false);
    +
    +   procedure eqqueryvalue (
    +      msg_in             in   varchar2,
    +      check_query_in     in   varchar2,
    +      against_value_in   in   CLOB,
    +      null_ok_in         in   boolean := false,
    +      raise_exc_in       in   boolean := false);
    +
    +   procedure eqqueryvalue (
    +      msg_in             in   varchar2,
    +      check_query_in     in   varchar2,
    +      against_value_in   in   BLOB,
    +      null_ok_in         in   boolean := false,
    +      raise_exc_in       in   boolean := false);
    +
    +   --
    +   procedure eqquery (
    +      msg_in             in   varchar2,
    +      check_query_in     in   varchar2,
    +      against_query_in   in   varchar2,
    +      raise_exc_in       in   boolean := false);
    +
    +   --
    +   procedure eqtable (
    +      msg_in             in   varchar2,
    +      check_this_in      in   varchar2,
    +      against_this_in    in   varchar2,
    +      check_where_in     in   varchar2 := null,
    +      against_where_in   in   varchar2 := null,
    +      raise_exc_in       in   boolean := false);
    +
    +   --
    +   procedure eqtabcount (
    +      msg_in             in   varchar2,
    +      check_this_in      in   varchar2,
    +      against_this_in    in   varchar2,
    +      check_where_in     in   varchar2 := null,
    +      against_where_in   in   varchar2 := null,
    +      raise_exc_in       in   boolean := false);
    +
    +   --
    +   procedure objexists (
    +      msg_in        in   varchar2,
    +      obj_owner_in  in   varchar2,
    +      obj_name_in   in   varchar2,
    +      obj_type_in   in   varchar2 default null,
    +      raise_exc_in  in   boolean := false);
    +
    +   procedure objexists (
    +      msg_in          in   varchar2,
    +      check_this_in   in   varchar2,
    +      null_ok_in      in   boolean := false,  -- Not Used, utPLSQL V1 API
    +      raise_exc_in    in   boolean := false);
    +
    +   --
    +   procedure objnotexists (
    +      msg_in        in   varchar2,
    +      obj_owner_in  in   varchar2,
    +      obj_name_in   in   varchar2,
    +      obj_type_in   in   varchar2 default null,
    +      raise_exc_in  in   boolean := false);
    +
    +   procedure objnotexists (
    +      msg_in          in   varchar2,
    +      check_this_in   in   varchar2,
    +      null_ok_in      in   boolean := false,  -- Not Used, utPLSQL V1 API
    +      raise_exc_in    in   boolean := false);
    +
    +   --   WtPLSQL Self Test Procedures
    +   --
    +   -- alter system set PLSQL_CCFLAGS = 
    +   --    'WTPLSQL_SELFTEST:TRUE'
    +   --    scope=BOTH;
    +   --
    +   $IF $$WTPLSQL_SELFTEST
    +   $THEN
    +      procedure WTPLSQL_RUN;
    +   $END
    +
    +end wt_assert;
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/package/WT_ASSERT/headerBg.jpg b/docs/persist/DBDocs/package/WT_ASSERT/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 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 literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package/WT_ASSERT/topDimTabR.gif b/docs/persist/DBDocs/package/WT_ASSERT/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package/WT_ASSERT/topTabBg.gif b/docs/persist/DBDocs/package/WT_ASSERT/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package/WT_ASSERT/topTabR.gif b/docs/persist/DBDocs/package/WT_ASSERT/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + + +
    +
    +
    +

    Doc

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Code

    +
    +
    +
    +
    +
    +
    +
    + +

    current_user


    + + + + + +
    Method Summary
     calc_pct_coverage( in_test_run_id in number ) return number ;
              
     delete_records( in_test_run_id in number )
              
     finalize
              
     initialize( in_test_run_id in number , in_runner_name in varchar2 , out_dbout_owner out varchar2 , out_dbout_name out varchar2 , out_dbout_type out varchar2 , out_trigger_offset out number , out_profiler_runid out number , out_error_message out varchar2 )
              
     trigger_offset( dbout_owner_in in varchar2 , dbout_name_in in varchar2 , dbout_type_in in varchar2 ) return number ;
              
     WTPLSQL_RUN
              
    +

    Method Detail
    +

    calc_pct_coverage

              calc_pct_coverage( in_test_run_id in number ) return number ; 
              

    +

    delete_records

              delete_records( in_test_run_id in number ) 
              

    +

    finalize

              finalize
              

    +

    initialize

              initialize( in_test_run_id in number , in_runner_name in varchar2 , out_dbout_owner out varchar2 , out_dbout_name out varchar2 , out_dbout_type out varchar2 , out_trigger_offset out number , out_profiler_runid out number , out_error_message out varchar2 ) 
              

    +

    trigger_offset

              trigger_offset( dbout_owner_in in varchar2 , dbout_name_in in varchar2 , dbout_type_in in varchar2 ) return number ; 
              

    +

    WTPLSQL_RUN

              WTPLSQL_RUN
              

    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMEWT_PROFILER
    SUBOBJECT_NAMEnull
    OBJECT_ID41928
    DATA_OBJECT_IDnull
    OBJECT_TYPEPACKAGE
    CREATED29-JUN-2018 15:09:15
    LAST_DDL_TIME29-JUN-2018 15:21:15
    TIMESTAMP2018-06-29:15:21:15
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE1
    EDITION_NAMEnull
    +
    +
    +
    +
    + + + + + + + + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    EXECUTEPUBLICNOWTPWT_PROFILER
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    +
    +package wt_profiler authid definer --current_user
    +as
    +
    +   procedure initialize
    +      (in_test_run_id      in  number,
    +       in_runner_name      in  varchar2,
    +       out_dbout_owner     out varchar2,
    +       out_dbout_name      out varchar2,
    +       out_dbout_type      out varchar2,
    +       out_trigger_offset  out number,
    +       out_profiler_runid  out number,
    +       out_error_message   out varchar2);
    +
    +   procedure finalize;
    +
    +   function trigger_offset
    +      (dbout_owner_in  in  varchar2
    +      ,dbout_name_in   in  varchar2
    +      ,dbout_type_in   in  varchar2)
    +   return number;
    +
    +   function calc_pct_coverage
    +      (in_test_run_id  in  number)
    +   return number;
    +
    +   procedure delete_records
    +      (in_test_run_id  in number);
    +
    +   --   WtPLSQL Self Test Procedures
    +   --
    +   -- alter system set PLSQL_CCFLAGS = 
    +   --    'WTPLSQL_SELFTEST:TRUE'
    +   --    scope=BOTH;
    +   --
    +   $IF $$WTPLSQL_SELFTEST
    +   $THEN
    +      procedure WTPLSQL_RUN;
    +   $END
    +
    +end wt_profiler;
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/package/WT_PROFILER/headerBg.jpg b/docs/persist/DBDocs/package/WT_PROFILER/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 zcma)jbzD>7_wZ;XMHtPH76ua1g5-vb5*RhQq(x$s3P?#KF_4mm(IFry-Q7q@juc4= ziFba#@B91x`=0x`_c=S~-ltAH=ZW3T-K_u~z@REn01hqyV2!;1cl!WJC8U+34*&;% z4*&q5SkeK2T;AHn(gtANhNa-#EdYW6_;~*S`@|>2$KFH)`1k}w_Xr7z2np{I-@A{6 zd&I<~{{Z_WBO@iH{0G$k1335u1ow#UQ4kYTP?M9B{}28D8@X!(P~HPr6BOg&Py%o% zaquW{?z#Xm0017&KfqS>zkq{_2f!yFB*OVG;VR_Xde zAL&6%ZF)n-z$l5H!VINx&MA|zHh=<;3pVE@~Dm^gZuW6af!^|kW2K@`6{lsK%V zH*IFtn5!t9=4+MRBAi`kW7z~xIRTtAd5HAsrQZH4C5+TbxEZ?rcF-l9V%Bih>gK`h z#(mc6$u{s1V|+D#Q5mNbq1jM>W?9yDHMCG?{7P85XS-jdj=(M=ZJ@@i! zcw0%Y)}a3!o3>xNG&Y3$lUSH+K6-mO^yPkO?$zbs9e z{}*#jVJvGkvgTlB%^=AqBKh3%ed3KPGbU&pTpR9upqfN{pY zb$*U5X7ANN>7m9kD=M0w&MmkP?73HaPruC`=lKZiUW9Gw|8Z$9aHCCVRReFe(Cd7Z zHS?d)-qJK|b=x9;`&0kAP+*9ob;EDJ;e_Y+xpp$9%)ej2)A-Uq-`2k|>JA{4MAFZ# z2G(&_TkdoF)|Fc|{tn=pccD3{a=d#7NR7Syb5e0uI4kCO2N;!Amo2H7_y1dN zRKAeRa|h_(Fgta>inuNLOLSQ%ldt;KfG?l*4q!%g&64@Y`$X~%Fx=M=d$nxgvwlY9 zEA4Uu5{UCEJgQCZO2-oXBEXBScYvIAkE_kUec%1HSbk_!xXHG--~2w0dv}}TU!7sP z!FdPp^=r!f&2@RB^fUh^!>r}z$JIfStgtLg-rv1HE)6Y^8^c+FHOu}h&F`(w=i()I z08jq|>`&0uP3)4X>g_(tf2xyv+jsBW(5=GX&5^uR*e`O{tnP2gbjL>JLH8#tNBN+< z;*#@r>+gSGR6KBTbTd1!NH~@GC*Xf_KNmcagdG(BC!|L(76SKU7=>=60yz9INM5x0F7uU!ORS9>{u1hgIK> zo`3Zp<#RMPG^ETR-Wo?Sgu5 z%GpnK3DYlsuf1Jmqe8-~oxbGH)WVcv_Tf_XeYfH3B$izdfx}|r)0t=a2Up2_5KIfX zESod$2x7J2_Gr-^$%nPno#4%bek-Ki5=u746lJ~stU$-Dz5l#Bkgwc+E^1Hj=7)Rn zgNC-qUNaq)vqFB?(c>NN3&!(T2|EJEGw*qyuDh{)byF>|NY~XYb6GM(3F z512Y_?FaHcu|C$i&U zJ4fKSK^6y`y35-@>Gdq!n|LLbg7M2nGRn#wvBuWT?mnjoj2?AmL1nw+vu=*R#u%*N z(MFHl=751w%XsRM3hRATkDoF49j;Y)6CQB)!7qR!UWBjU`) z;aRov*WR^-x=H^C#a@c{^QWvLXnuEtoseJmYco;VUJYW&DBa}^dmoWk41OBr&Eex4 zx;^}Kd9V2Sq#D#!#wEec%ZkP;<(op~tiFzt>`jZ2x*^Bkig??ju43dv^|eJqqA`$; zo)fl6ydj|vm;*e#A>m{4LzehwjU>7o-=Vi`(>@}u)+Mxo+)yd!9A^!w>`-e&8cozr z9Kj~Ubt_W4I&c6fTdWFM_fr`LOhO{A zzYDp_`P0nT6aDuI#%s6dh9;Qpt3j#S9iR&JTR&Pf-#6hGsxWE-$@M4Ig}V=7z`Nm4 zRk-u1rgB*g2$CxNgl(`Lx)QfX|Jj-8#&%W4)E(drsf!>fi>Q$16d_&{ITQSH}1{c5q_k1cax1VV* zRFzc3#_m{IpgXh6S7^MqL213*Wz4ttJ9AZ9KiRMkLfr9-Md@#1=;qV$wR_Da8=A~Y zqx}g6I93+MFg|;Pwt@1Kpb7WIwH{U8WGT2$^A~)^f+^=`Wj=c#Zh?@x8s4+=pPAzu zCf__4I@DiAvVTkCeYjy3+0FAVyt(IVjJ@BPzcj-sEy`bWHv(he{kpK|xxK$W3>=qy z*e?sk`o~UvbUayDM-7>@LztDM;6vO51lHqZ0Gd;bVS$&KTYdsF6_DiWS#zReZKrsb=U4N-O76=ip7-JLD?qpV~gM1nEY% zlMF;`$y4z5?640UHWFaH%Yj@PGi8IE2AHv*b&WUfd!UjoYDfC9B)zT`*NK(IRPBpe zm;RT^59SF$naWv}eZoyjSKp3c|B+x}sd|*aTvI@61l{&>Vgx#ES z!>lD0)^xZUpOK*Z_l~@?h76Ir>cRtoaP{y!^%{~-P3@-gi*kP285^OqnQ1ZST&dwd zPA;XtD+@@=?_7Tu5WWNO)^>q1N7q)G-dB1Zow$u`%1@8-Na7h1&pigr;SFy5%rgOT zIdgdH+wcs>IhI2%uI(3*uj8gu-3`wdV{K#a%}2AL8#5kCylremiINzuqI#z?G?SH{ z2=i;AR>h!6{P)H9`Sks$6`=Gg7{IPtyi^i?dSIGgAUtXb$BnXogScbugeAdYtO3V( zCxJe0(c)wD2CqWTF)-xA#myn(Yf!@n^Mm)0{805XZdi)S872AFl+r?` zRuuNFP{Q*mMI!6~M84%31#V8t@+SF|luKvmwpQEaZTjM}##`v3a3vlys!#~j!6Y_( z^UZS}?RQ^O?r)s-N*ztNf6fEj-z<6cHHASlF$&cSOTN(mV$tl50=iQuS2O&i!cwTR$iMVR%16^Jcm1Irm^T``P z=Rn*IQx5Dd=+TGuKfB1;xjNxd3m2&3uDqWw$HQUk#a$wY-#u%)e5E5cMbp3&E<<~t z53eBuBZvM?F2pGGAvp24$St>hmSBgD-syh6q?h$vfvRp`Xpz{ zU_1CtmanbaK9}SV$Aq|E509RL=08P~-57(M_mv*vn7!Q8!v?XZVCH6zlh;PQOtqZT z;4hvzCsc;h3hxY>^;pZeCldB|qWnbKd|Q9H05AMWH@;inK0d=nUO1bZilkgMV}?Xu zc+7+y=@TdXD_syga%6j~o=w=aFEqG! zMIBDPq-3i;rDVg!>j1Unv~ZmjLdBH0JE=8#a9vF~O+}Jvfay=^P4%OGzO=O*FzKZ? zK)Qd&>tTkli_bP_JYSvKmDt>6bk8U56@R(wq$gCB*h<5EziST3cOMd%_WDCesA2PC z4Xz9UR}Kb`_ipq_ zquMERdA4RRJGyiAQ>ZPA1+@8}N^%BRbSl8Xlk)!V$_5KORscKo@7vPp!_LqwO#j@7%`d z_P}{tJ`wd6C*~;OH6{59;UXK5Lxnh1f%UlfUfNJVCG+Mi4hV096KxLO$Z7-m*nJEr z-|US)XW9TZrS`KG@}?(g?q*iyt-43(gMI4;4~tGXDikEyw#c~q>D@pfBaE8q&L>HV z*NXj&-8@z=&mWz!)&0_P_7}RELQdv9h#1ST^_7YkC($a@QX$c?Ux|PJqLv1YZjlMA z%_zliphju+LqzCb{`?{{Mk7+LPjDn>z>8_EI0tmP{FbL7{z50+W8i!>Q|5=l?R4oR zirvR;Urs1DZNM=v@|_hF`uWlJuk4#adUc0eHaarQ9pI%!%s$IYGM<9NGLdpi9-Kib zTVq1=t<=jfb4h_^cC1%`;(1ogQQ&zt;;g*J3E0$}dfKD;fS6|$7WgK53;GnC+y9{} z?CmRth$6&n6Yt*))cS8Im4w!-_G>r(* zp#hUvffy^eMwSQ9&mb`AtQA9%llBf8!!1A-C%j2bWV2iB;m8ZWk7aiNqC3DD=Y_3a zW2DX5P)o2w=y_JZhx}my$+$tFIHj>H@XyCqoMr!LP^Q589?1X|I z8)hh@oHto51x89hN~YTAql~pOawVO7R}gn+0aM~x2@MmbYzv+{WY9nY-s6n~hQW?~ zr583=q%?po$^Df!x+GH-Kow0qb+S$9mj(dVL}aIie5S5uZ&`ck1+ zUzS^DMBmMIe6+jYJ;6k2Z+&B}$uGwf8(wH^8f2s&C!pj@gPmvt2;1neo`jsUr~hTI zsLUT1GGT+%5rZoipp5#X42sypGKl@a__uJH3jL5ujS@P&&xG9S>!bqefoI&LW5HOR zC&r)uRcleG|G8LnlF{BbWnv~it8(qFkvA&hzG$K!UlG27TC@Fwi~+r@31#VnZ`)k) z+#5(7Yh*lDTw;Cf-cADfcBzHFO&GN%l9B^i)%9TpL85o#%6wB8kfB&b|5oLn=_=#)cNq|MAbYG15pUOX6? zEKrrXFV+Qdxh8-n^Lo$|godhpkyw2|rY9(3RK#1MDaSw-i6^TEC~m;16IdzM0HIa{DR^gE z+D>_Ifp|opdxD&x<1XX@Fw&Z`u~#NCa;Nd~g*-xXWiX#V1WFvlU^-KDeVdSt`Ql$T5f!9af z?^X!ZGYh}hVeY9@t!fqhj>e0WekoX=VTADlPm+Is-DEtnx)XBQxH{Moy%IWb+$<@f zogG%C+*dqG9uz0Z#8iTcgjQ~Nr>%-wkd8Zw4G#cJ$_=)QSduJIxQydb?{upEs_?abrr68 zs%v!_{5+fc${{k7qJ)z6bjElyc8x~<27a{lB;Q)|Y{Y7f+$5)S#3k| z$a(a7#3(a$miwck%8`fr9pGukt&RR?v$P!l5fwl4pC{&!%i67#sD|2dF0YTuvefy5 z<$0ziOxJPA9GU!=m+as(c4nr-#Bwop7fJPML?2mL8(DxLA)t*8XHlmEOrFgiS-i~u zkSDVMmHNmy@38rCcuzuZZ_FW>;FsN;VwdmpX&~ftf2l8tnc7+P`y7+;FeEiNC z5LNkwM|c6azvM#~bcG)Pfn&v{@2u zB=U^c%HISZ@ct1?7t0hev55!MVuY)gML_KrQkAtz%OCUE9l$N5zwKL!7#*`SN`KqF zG$F|M)q(~>w&&tA>}9H4*e+AKF%3+`hf;-4Ld^5V*ru~V1)g7P;g#%{Hg@K8B8<3T z4;tLM>Gv%?YM;%S6iFbjc9P{fCOt{HW&xk zK1CRbypalUTBcYe3~}4WX*G2+z+>Y1Vkg+X@kOyc-?EdC&iv2{C$`?)uF7KCgW<)F z>ADOU_%Yu*6cn%Sci64Oahh$AXJe*BoEW`A2(7h}(Qw@sg#{<^r5m${Z3s({4y@sb zJ6UUjm_HUU0%*+%=h&EYibQl2rsj~6td7ryq+d6pc0lkDOc7M}MY908Qd0g%$}+Rq zWvrg8TH~eEuamdQQWmrQvo0x%4U;6t9*T*ZMeYUS7^81q+~IDCs~c_^M!mS3*wwSa z`Xyg}GER>X<6~Vid$!kX(=|E>!i)%Kh(-b`qnWN&TVG~DmP%?N+<2t_%eVN1&N)#- z#SZMWG&uuMIsP@mMrm%h)>0#!;drprqc`ddGDDN%YBc$v%kCx==#bT*lZ>++TruFb z^1`6Vo`oQA)$IN$=*xs^=*)+bq}(S`CJ<-G2bs)l{LXyphTUV44mXP6hZj^ePI_Y2 zL0V2aosXvWU8s9=Epi?FLSSi@W8d6)zxTvf)$!%J^QJ<@>A?-WiJ5KMe{?U#tPV#9 zQoAN-S9F@P4boWGpEYj4A#u9TYTyF&KY&5ar%#}IZaa15{dWM8EWzEry^y9k^KREs z-_3>B)4ickPh|lU$aG2ENS?LrF8xA7ni-Ded!JZC+aO@j6qF+#mDB_d*y5i(V`BnRobBFNgYtHem#v;Qe`u1P4#7xTH+2wD z3aq8Z51-eU+ECvyRdkHY*vX6N7#L32Uea3~r)o?`cKp;)p(=JF)u@~2Qx4Ke75Q{_ zzc|r1IA?EHeN#K{7fMnuZk{C}gSJZ#^exgMWL7q}PV)X?t_&AGT^Uh~=GxRY3ec>M`y^b~3IW zmm-};PGeskJqh0N75>1v10lwJ&uFRmsisyp+fU6n8>qMUgVwT}E4|Q}gBUQ;Sehgsq@wN{N+MrjvFfN5OJc|m2`Mmp z9w4H<6X`fdq7G9f6D;m2b3A%51Iz6gzdWa*iQ(7U%mAFFdJM#7nJ2pD`xT#(+211pmeArS z4fFB>i~(&na772GN4&!TTWuK0rE9_NciT&>#ZjJM}N^waW zUu8dMs)3X0|7j@f$`JC9kIYnN9ubvFu=1Hq+KiA6tNJEVJg)pV0&o z)`BiAerOtEpxY-{p{%E`MnvhWE%ufHD&tw>J*UgIPToY@)5$A*COc>Lt=z6GXx=3@ zpE&U*qB3Fd;TdhMRgb2^rj1|BXIJ)k#nX-(6VG~*!W`hQ;n^QQZI90ooJVXo#u+zD zf9?PRfd&FP;4?Smc{%!!6`0&WyJKKhTk!4$|NV@q(K6U(NY<9)Rt;x&aaY5F;VI16 zCfY+_LFH8bXhz*!zu^0LCcO^d$6t9@+W>ZEGSu^(rpIW#DzN-eDep@PDm6K#-{Q9+9MFBN#fV8P?Xzzstm(!Nnl(ry;ggv{1c59`W=SZ`=r$rCqpTHVI6 zz=i!2kTh~kKL;DegR^OJCnClfGNDH~szyDm1xHyOr_Z!OG)eAJx}v;qiiX{dzc0Cp zrHgL`CnQ!02${9#5@YZt#%t%IZG26|`fYu+1+zsNoa^t^Fxe60FNET?=Q%!L&=VMeQ`wUjVs5m1Xhdx)JS zl!^So$;r*4iHP*(JiPQ9|#i~}Eb_e0UhvB1BcL?J^6Z!8P+HP!?w z!ZSq}Iwr#}h&NFm3X0M-ut4O*B0?=r6W54&!G+nlg3J)(|I9`tq+ zFO_-SVrmF>H6AsnRJY=kDB7CK%CD1wBG>Uw8HEZfM`6EKKb_i3I}yf4XOp?GXhTzs z_IcCP*G=y6Q?OW&@qRNQe06l6uM8mV^amd+c>%c2GZVdEH8R-UBwG1BS^Oqv(LfQ@ zb5nh;VP1Q%hUvSt$?lhvh>l6hoz*pza#490hw0a1jv(##5djDl1H&jfu3-BTR(I)XSG;g3(+1`Z*^q$7fE~@$gfTDBqZT8!0iJFQ}s?;Z2UMp6!o? zMc<`V1x`TG;C0bx-cY~zWR}X)EseL$b|OFJW)d1te3(3{Xc~QXwwCIuR47fDPPdNg z4%J3x8ohrcXG@tTN7qzZ&qq!~JVs< z>>n+z_(h!c)ksbwCkv*7C(vfOndM8K^{wGr=Agx!_n?q3&w0io7h)@N$7(GEObfgU zX-yil@tdkWD{Iao3=+@-!CU&F5NI{4SdwIo{dH{|y-MxXfFql>3g7O)beE0k`phRD znxoDsy)QA{F#VP8T%CAWy+Bwh4AXc5rz-i#*{g;#J(#rrDI;B(V?!Nz!Zgbf2b>;q zAF}+)zg5A!C{n&%|BoD9<(*C?xgwW8J2UrWdBzFQpTwAMJZ7MJ zySAP+$)sg@X3`|%Q+m*ZG*$g?#MUmOJS|e$c=m(fiKBp{jO}HqSMcytLwOG4kR5tO zCgS!TZk)9iyt;rJ+8$0{iU+X}Lu*8tRCP%lO$j_Y55iExC!S4R>pchiObIPvM8shY zZH^`~fGPjYACZU&Cq=!lAum^Ev~pfR%Ib=9^7CCe9NeN`;%`z0O5BTB=?wm4WtkH;QBdop@$&l7BdjJ*b87l)#q-%;H&Qyt&>JZ*@Zu+> znUgUWy`n>)2FGFwzJ{isI3{he>V>CiroHx7_9&MIkv8{ah6#PukKyA7&mYz#5qef* zeSr!Ux&=(fhNMAfeU2-9Nr`yIfW+UHSiK4rNz;9bljkb`FnZDH?O8gS~#y@TeK zm&cj6p}s!}m9l`%&Jm9#T~ zo*^73Dddwv2UczXr=F8)0gldUgmu%pCpg*P<`fM(Plv1&o!thqe92`_9!%8lKK*yk zXiX7jKqgvnq!>+jvh2p*6x&f~y>XN;k#FCU|5Et4idWk?3k;j=vyv~*@>K@t<*gi* z%SX%5T8&c>#`Lh}zj;_w4)6;yADx6P)8Y7XM^A~IzH=h{79KCMET&>tVhL96&Wapo zchH0qpCau~AHJtYAlpf?<6WkF&S^7$)Hf5sk4|z)Q8aWo_+=Ql^5&LXnfc+XPq3qg z2lmbMr7pwnYt<0G@npDgmA9JHRU{Mw71fm{?3uR-i_ys|T1*O3!sjJx#xLU6;$+f$ zui_%n&EKz21E-OBB0a0~0<$Z_=q!RZN=6s!=8TouD0enk1vof^t7|~HFMj<2#j3!D z@{ZfYC|(;i8(J9?p8=o8K8v&9ouxF*kp6S>q-Wlvb3@(Z#4$#LXGejt;{fr{msf$| zIm}u;_}L!1GMYX=4aC;SKT@A%F=GGd_2iYG-iPA+KbvKo|O_6qk*YYZ<&)-|(=3mn(^) zNUKn2WOsYqIh$j+IrTwol7e$$nJ^$ty z^w}uMINL;z`+26jC2U%y{5=aL$XP%8Xl&-)VM}PICf-;NVM5U9_BS%JLcZS`eab8| zdO|I{C?ZMaY)3u#=JT*=)%KzRkuy@s7i+;SWPzRIM+pT36Hja1G7wMUg?grRRCd$3 zHXdx_#XUbV7)qVv5%0tAIZ8w$hFSaEP&sSa3=F4_(NAq2mIYh>jeezQBa!(N!yqspvHb1yZpIpc8S~jpJ?j(J#bG& z3hbn#HN2>Ss#{xS++y`E?#!ND+glsE>zJ*#n7!PC3SGqRUFTIgT$NI@7^WItq#yj zf$+`lXwDIoW+hoNEcgaY>Ja0I^71i=+{i#h>%#2D%q`}F^JZ+YHg3X4rawF+VzBv+iyFyiEP@CzAq+lNaIDf z)i4>5u?K)qoew4_>IsYCTV&88okY3Q7<$rECSC?k_Bu+_uvI-7Nktn%zYm>R_B)=< zZ^&f8k=yKJZ=5J5op8!3MeOScqn(4JfjBfVXvH-49h{*kBHz0pyh)_r136-}>h^LV;gev-AIjOdtw&qE$gKUZoQ z8Z`DP&v{yRCA?%S60%a+?m^`v7?ayxT4_UM2J*0}+SMap534AeL^zJIQYoRbujc- zS4p^7Q~hSI+vbbfh0(`#3r}mu**PG^qL1anx&H5b7aIZp=)pfT791eqjzby6t2(8N zsx5p$cFwNI8jefY`Z~ZX2)5y>ho({4`vXIu44O5GG!sg{Zc7TSzE9{j@vsrfg8pgf zLMZMu`TP}SA%Q%l!|73I;?rD>EL;2C2$`@N`ze+2Vh%JUYdMgV5KqvlfgD&pdv9SF zL&EP~1nobkBv6w3Apvp1RS)3w12Af8+c7lX%i{@P2y=v6RDq&}m39#Cp5xX^N!*tb zZ4*o_B3FQJaV<3uOJ447jm(lQJLT=*6=r_%fAYoe>2=n1GV`m!Yt7YfYyO0Kj?vFK zmQ&8gryHqCU0{#nBjGP1q9x+J!xAHM)TkW7l&k}4PW$iGJQm7#6y#?IKn0nD>EU=@ z7BBP%`QBy&^56K}9*+5PejMU)B$1n3B&-!I+>s|^){)P1K#qyL5;pB1lV^O1lkR6O zxBl@LWss_TXwE1GAP87$>)S+>r$z-f;#2~hpaUqtdszc2@moB6$^d$!KX@<`7+gae z?-8RExdND3SjIP8K46F$0Q|6H0172F5N%b$QxZJYelUK9JCkF{;N2r2>}=1WYZR-% zZ;xR{gw>jIvOJ{840{e#!y7kCr=S}1OSrMBMo{S7yn?C9Zy%|pHxd>OGgR%^K+h01 z15rLqXlacYd*w9OmlGl=)(W-Hr?qxMIkS*&V|KOU#LZvHY#X6O)DOn$SkC)}Gdh|(1$QXXk0f8~9D=iT05{k(r^>OuH)*iasU+Ly+JA}RbY z%cP<*G9amLyx7K5=i==8#uBtOO?3;HQ7zJNIXU_}dSpgFe-&T7)J3(sbX;PfjIlUn z4Zexm*gf%pCL~@+rId5^Eb0DL4#L^E34O!R&eue&6W%PN0@qMo6YUU%=mtzbNIV*8 zttn#Y({CvL7BH2#37KQpuu9s<=lg=^aU|63>l)&)%kOzKT!B5E!Y)!xHF0^p_%tmp zqe3x8FtG?#mIr+3tcBJHr3^^?U)x#Oh$@?nqljfQgJ%gt9V@5{UV|T81?Q``d zvhCNZ6k8rv1wC!S>lUHP)#LP44+{4cv|E-UjB?;&5GvZ&_#80_1O?CAYOzfUE4@TA zy(qAb+Q}4{dm&a!8S&s1p?=((fy2`$yp+|mtc;eXMB3S_j>_t|?a}pumC<7c@TL?A z$ouX9g5dkaNihbLa#Kp+dYVcyhOj8M@rTItc*Rej8iqm|r_4qvjvh10c1aZI6F#|wy$snQddWs^iPxkt(oAlOFWF(1E)PM=v| zM`NTmG5;U=oEa@|M|5a3_zFq$Y2x$Shz~h1RGFMz`9INHRZ#(X1* z4m(~WDp)Lthd+qwK0ezeoHosndx{*wLw4OSUg#sO1w4$8C}H}*EiSOAXKuYr!96BO zo+HsA<}WBFN1^)u-w!WW@i{EMR4X7s;N@5KVVgl8VaBXbaFHTIz}iR z+49w6#Zi_5ihjPzpN|FRR2rEd77n=%O!m{}c7ol=G=tFnWFT;H7gJg}aTLFDq{*8F zpb~NV3T*QYlOVc3fE);z0_=RH+3qf?fKAMY&mhhC35t6DMgV!tZ#piLi8}_)p~hCT zkH0Hw((2e@eh0h@KH(YmadmsbV@V?rc68|?2JvO#M!A(uee~iPLq!whjph98DDQhuOGCiiXAG{cFt%b92*=Yq(!N)9=dQ=Sx;VYKb$^38=^yNuDwp%XfT7mmmgI z_$G#wDeL2h6K7LTE@>x<6}_%6yssnAoZ)&cF3H24TpK6CwcAI1&O)`#mPqdoX$ug5 z@!#s|e>YC>esMRgXiBUVt$9E_zWv$%oo&4L_k}_={Vfrh;;}-JwtUh!PNxFgTAe8R-qR--_|PL+bV6V;z;z0+O=vbw zORb`>y_PNI!E8vk_9IGRSHfJKI)NJYI``4r@JC(nH0FDGwg@WiLChnG02{3bYxpkR z$M+%(T?(k5SoG3z9~52KE9S;NiOtMBJ}$&8-C&p9Ggp_MUW1mN<4<|)L_45u4W`)} zKT{e`vzvCs+jbN(MLTy{NKR{R*RmOft44$9V-CyvP;n_UY3EWZPU z0Q_VpB400xAC%`{&w1wD0c2M!R!e?<&)u87Xn*hjQN6XMWT53(cy9sJQr>LvE1%S# z5BuGx_eJXXkR&je%pC*6;@%4Qo#BbVBnk5)jmf?sxYo6}5V}^l#Z1wOZYd?E?& zX=P*16i@L)b*?Ek#q&PQ?MbvQ_#%@1xVX1I&P2>J`lIie#CKT?5z(w^St}3-{)@l5 zXYz6ZQj@xsD;-D;Gpe~r9kLf1mHC@e+Vhp(Wg?Ry)sK9w?tGT4<^pwLJ0s32t(QeVpGuuxw4G&t Z)c7KwGBZY(1aSI)mi`~3m%aP(e*k-(rCIY?@*TKQ>gA5^r(j*Ea z-wy;q=%(FF7)4?RiA_RuO|vb_vTa@01K($iwOj3fTCU?5hG|=N%2JH6lSR{%u+(a| zf*{Dwvy>rGWGs~=eB^nWrfa$`@5@RSqbAoWlsP0~;r0upT7a$V<8Rrh5%Nod@OC5$Ph-jRnT+=*kyb$#Dg6eW&h zRaHIDlV$nim+!q^5Bwj_$29n2liIsOSa@#$^74tMw7<@2{5KF-6z*})q_LwDfR z^O>hpGZ$g)YVC9F3EaB2^>ywM1RMv>eS>#%!^6wD9IX6Ut1MOEmEz@*+apDI`qaH& z^9yjYurfMYn1s_4H(#tyOvCD*>c*ui>@&}fy&Qwr`9+=|7=Ys^JLNNFxV^cZE4?Yb f1|PWfJf1K0{p9%jh2{6NYkRxJ3ky5_JXrb*T&4?) literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package/WT_PROFILER/topDimTabR.gif b/docs/persist/DBDocs/package/WT_PROFILER/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package/WT_PROFILER/topTabBg.gif b/docs/persist/DBDocs/package/WT_PROFILER/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package/WT_PROFILER/topTabR.gif b/docs/persist/DBDocs/package/WT_PROFILER/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + + +
    +
    +
    +

    Doc

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Code

    +
    +
    +
    +
    +
    +
    +
    + +


    + + + + +
    Method Summary
     delete_records( in_test_run_id in number )
              
     finalize
              
     initialize( in_test_run_id in wt_test_runs . id % TYPE )
              
     save( in_assertion in wt_results . assertion % TYPE , in_status in wt_results . status % TYPE , in_details in wt_results . details % TYPE , in_testcase in wt_results . testcase % TYPE , in_message in wt_results . message % TYPE )
              
     WTPLSQL_RUN
              
    +

    Method Detail
    +

    delete_records

              delete_records( in_test_run_id in number ) 
              

    +

    finalize

              finalize
              

    +

    initialize

              initialize( in_test_run_id in wt_test_runs . id % TYPE ) 
              

    +

    save

              save( in_assertion in wt_results . assertion % TYPE , in_status in wt_results . status % TYPE , in_details in wt_results . details % TYPE , in_testcase in wt_results . testcase % TYPE , in_message in wt_results . message % TYPE ) 
              

    +

    WTPLSQL_RUN

              WTPLSQL_RUN
              

    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMEWT_RESULT
    SUBOBJECT_NAMEnull
    OBJECT_ID41926
    DATA_OBJECT_IDnull
    OBJECT_TYPEPACKAGE
    CREATED29-JUN-2018 15:09:14
    LAST_DDL_TIME29-JUN-2018 15:21:15
    TIMESTAMP2018-06-29:15:21:15
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE1
    EDITION_NAMEnull
    +
    +
    +
    +
    + + + + + + + + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    EXECUTEPUBLICNOWTPWT_RESULT
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    +
    +package wt_result authid definer
    +as
    +
    +   procedure initialize
    +      (in_test_run_id   in wt_test_runs.id%TYPE);
    +
    +   procedure finalize;
    +
    +   procedure save
    +      (in_assertion      in wt_results.assertion%TYPE
    +      ,in_status         in wt_results.status%TYPE
    +      ,in_details        in wt_results.details%TYPE
    +      ,in_testcase       in wt_results.testcase%TYPE
    +      ,in_message        in wt_results.message%TYPE);
    +
    +   procedure delete_records
    +      (in_test_run_id  in number);
    +
    +   --   WtPLSQL Self Test Procedures
    +   --
    +   -- alter system set PLSQL_CCFLAGS = 
    +   --    'WTPLSQL_SELFTEST:TRUE'
    +   --    scope=BOTH;
    +   --
    +   $IF $$WTPLSQL_SELFTEST
    +   $THEN
    +      procedure WTPLSQL_RUN;
    +   $END
    +
    +end wt_result;
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/package/WT_RESULT/headerBg.jpg b/docs/persist/DBDocs/package/WT_RESULT/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 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 literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package/WT_RESULT/topDimTabR.gif b/docs/persist/DBDocs/package/WT_RESULT/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package/WT_RESULT/topTabBg.gif b/docs/persist/DBDocs/package/WT_RESULT/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package/WT_RESULT/topTabR.gif b/docs/persist/DBDocs/package/WT_RESULT/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + + +
    +
    +
    +

    Doc

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Code

    +
    +
    +
    +
    +
    +
    +
    + +


    + + + + + +
    Method Summary
     add_profile( in_dbout_profiles_rec in wt_dbout_profiles % ROWTYPE )
              
     add_result( in_results_rec in wt_results % ROWTYPE )
              
     delete_records( in_test_run_id in number )
              
     finalize
              
     initialize
              
     WTPLSQL_RUN
              
    +

    Method Detail
    +

    add_profile

              add_profile( in_dbout_profiles_rec in wt_dbout_profiles % ROWTYPE ) 
              

    +

    add_result

              add_result( in_results_rec in wt_results % ROWTYPE ) 
              

    +

    delete_records

              delete_records( in_test_run_id in number ) 
              

    +

    finalize

              finalize
              

    +

    initialize

              initialize
              

    +

    WTPLSQL_RUN

              WTPLSQL_RUN
              

    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMEWT_TEST_RUN_STAT
    SUBOBJECT_NAMEnull
    OBJECT_ID41960
    DATA_OBJECT_IDnull
    OBJECT_TYPEPACKAGE
    CREATED29-JUN-2018 15:21:15
    LAST_DDL_TIME29-JUN-2018 15:21:15
    TIMESTAMP2018-06-29:15:21:15
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE1
    EDITION_NAMEnull
    +
    +
    +
    +
    + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    +
    +package wt_test_run_stat authid definer
    +as
    +
    +   procedure initialize;
    +
    +   procedure add_result
    +      (in_results_rec  in wt_results%ROWTYPE);
    +
    +   procedure add_profile
    +      (in_dbout_profiles_rec  in wt_dbout_profiles%ROWTYPE);
    +
    +   procedure finalize;
    +
    +   procedure delete_records
    +      (in_test_run_id  in number);
    +
    +   --   WtPLSQL Self Test Procedures
    +   --
    +   -- alter system set PLSQL_CCFLAGS = 
    +   --    'WTPLSQL_SELFTEST:TRUE'
    +   --    scope=BOTH;
    +   --
    +   $IF $$WTPLSQL_SELFTEST
    +   $THEN
    +      procedure WTPLSQL_RUN;
    +   $END
    +
    +end wt_test_run_stat;
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/package/WT_TEST_RUN_STAT/headerBg.jpg b/docs/persist/DBDocs/package/WT_TEST_RUN_STAT/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 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 literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package/WT_TEST_RUN_STAT/topDimTabR.gif b/docs/persist/DBDocs/package/WT_TEST_RUN_STAT/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package/WT_TEST_RUN_STAT/topTabBg.gif b/docs/persist/DBDocs/package/WT_TEST_RUN_STAT/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package/WT_TEST_RUN_STAT/topTabR.gif b/docs/persist/DBDocs/package/WT_TEST_RUN_STAT/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + + +
    +
    +
    +

    Doc

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Code

    +
    +
    +
    +
    +
    +
    +
    + +

    To report the latest result details for test runner:


    + + +
    Method Summary
     ad_hoc_result( in_assertion in wt_results . assertion % TYPE , in_status in wt_results . status % TYPE , in_details in wt_results . details % TYPE , in_testcase in wt_results . testcase % TYPE , in_message in wt_results . message % TYPE )
              
     dbms_out( in_runner_owner in wt_test_runs . runner_owner % TYPE default USER , in_runner_name in wt_test_runs . runner_name % TYPE default null , in_detail_level in number default 0 , in_summary_last in boolean default FALSE )
               All profiled source lines.
     format_test_result( in_assertion in wt_results . assertion % TYPE , in_status in wt_results . status % TYPE , in_details in wt_results . details % TYPE , in_testcase in wt_results . testcase % TYPE , in_message in wt_results . message % TYPE , in_interval_msecs in wt_results . interval_msecs % TYPE DEFAULT NULL ) return varchar2 ;
              
    +

    Method Detail
    +

    ad_hoc_result

              ad_hoc_result( in_assertion in wt_results . assertion % TYPE , in_status in wt_results . status % TYPE , in_details in wt_results . details % TYPE , in_testcase in wt_results . testcase % TYPE , in_message in wt_results . message % TYPE ) 
              

    +

    dbms_out

              dbms_out( in_runner_owner in wt_test_runs . runner_owner % TYPE default USER , in_runner_name in wt_test_runs . runner_name % TYPE default null , in_detail_level in number default 0 , in_summary_last in boolean default FALSE ) 
               All profiled source lines.

    +

    format_test_result

              format_test_result( in_assertion in wt_results . assertion % TYPE , in_status in wt_results . status % TYPE , in_details in wt_results . details % TYPE , in_testcase in wt_results . testcase % TYPE , in_message in wt_results . message % TYPE , in_interval_msecs in wt_results . interval_msecs % TYPE DEFAULT NULL ) return varchar2 ; 
              

    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMEWT_TEXT_REPORT
    SUBOBJECT_NAMEnull
    OBJECT_ID41929
    DATA_OBJECT_IDnull
    OBJECT_TYPEPACKAGE
    CREATED29-JUN-2018 15:09:15
    LAST_DDL_TIME29-JUN-2018 15:21:16
    TIMESTAMP2018-06-29:15:21:15
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE1
    EDITION_NAMEnull
    +
    +
    +
    +
    + + + + + + + + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    EXECUTEPUBLICNOWTPWT_TEXT_REPORT
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    +
    +package wt_text_report authid definer
    +as
    +
    +   --   To report the latest result details for test runner:
    +   -- begin
    +   --    wt_text_report.dbms_out('TEST_RUNNER', FALSE, FALSE, TRUE, TRUE);
    +   -- end;
    +   -- /
    +
    +   -- Turn this off to allow output across multiple lines of text
    +   g_single_line_output  boolean := TRUE;
    +
    +   -- DATE data type format for Report Header
    +   g_date_format  varchar2(100) := 'DD-Mon-YYYY HH:MI:SS PM';
    +
    +   function format_test_result
    +      (in_assertion      in wt_results.assertion%TYPE
    +      ,in_status         in wt_results.status%TYPE
    +      ,in_details        in wt_results.details%TYPE
    +      ,in_testcase       in wt_results.testcase%TYPE
    +      ,in_message        in wt_results.message%TYPE
    +      ,in_interval_msecs in wt_results.interval_msecs%TYPE DEFAULT NULL)
    +   return varchar2;
    +
    +   procedure ad_hoc_result
    +      (in_assertion      in wt_results.assertion%TYPE
    +      ,in_status         in wt_results.status%TYPE
    +      ,in_details        in wt_results.details%TYPE
    +      ,in_testcase       in wt_results.testcase%TYPE
    +      ,in_message        in wt_results.message%TYPE);
    +
    +--  "in_detail_level" settings for DBMS_OUT procedure:
    +--  * Less than 10 (including null) - No Detail
    +--     * Assertion results summary.
    +--     * Profiled lines summary.
    +--  * 10 to 19 - Minimal Detail
    +--     * Assertion results summary.
    +--     * Profiled lines summary.
    +--     * Failed assertion result details.
    +--     * Profiled source lines that were "not executed".
    +--  * 20 to 29 - Partial Full Detail
    +--     * Assertion results summary.
    +--     * Profiled lines summary.
    +--     * All assertion result details.
    +--     * Profiled source lines that were "not executed".
    +--  * 30 or more - Full Detail
    +--     * Assertion results summary.
    +--     * Profiled lines summary.
    +--     * All assertion result details.
    +--     * All profiled source lines.
    +
    +   procedure dbms_out
    +      (in_runner_owner   in  wt_test_runs.runner_owner%TYPE default USER
    +      ,in_runner_name    in  wt_test_runs.runner_name%TYPE  default null
    +      ,in_detail_level   in  number                         default 0
    +      ,in_summary_last   in  boolean                        default FALSE);
    +
    +end wt_text_report;
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/package/WT_TEXT_REPORT/headerBg.jpg b/docs/persist/DBDocs/package/WT_TEXT_REPORT/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 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 literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package/WT_TEXT_REPORT/topDimTabR.gif b/docs/persist/DBDocs/package/WT_TEXT_REPORT/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package/WT_TEXT_REPORT/topTabBg.gif b/docs/persist/DBDocs/package/WT_TEXT_REPORT/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/package/WT_TEXT_REPORT/topTabR.gif b/docs/persist/DBDocs/package/WT_TEXT_REPORT/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + +

    Packages +

    \ No newline at end of file diff --git a/docs/persist/DBDocs/round_text.png b/docs/persist/DBDocs/round_text.png new file mode 100644 index 0000000000000000000000000000000000000000..fd54f2a405a5752b0212a5111b45eb8b9c301239 GIT binary patch literal 710 zcmV;%0y+JOP)X1^@s6m`?-(00004b3#c}2nYxW zdxcJjU z7x#C+P`WTNIiW(I(4YwgssMzdblXPci|cuCT)=icSWO%Cri1w<15?v)y6#i{R?v=Z z<6Hg|OOdxou6%&P0w#$(&%?>tIWEdS@IID+s%bB-d$FL)#XP3e2V_2_S;+LNc%Fy- zuUXtXFg_7z&5QO$rThuD zHrH9q^y-B|GuYZ(M=5{OG2bfaqIrsqOnT_Si2T^dq){|aTVnwLH`isv7sHqi2Biff z>c@02i1=a{H`iqVPX+DPDu^4;f3S&0LEMPJtyKU3;;LX`Z8ar15|KY^t0`O+ObB7u zq3gQrJVd_ex(;F2Ap&En>?}kB5g1b;G?fP@^ncJ)1ws}7UPv?wQ~?Obl^ugU zw$t^p9nr|J9S@@M=*Z4NG!TtP2g21RVOf^!EJVIomIYUvgjiTMaBz4eI}edB2Zu*k zST_C~eT!fiIWsRi6H#AsW*#CK2Jm#3V|Ffr++_uKwVKpmM7_GJ)sVZaV0JD7pzZo- z)JR}=KPxR5Q9pL~vxpjr*0|$XWj>a~_Rb!v)!U&5BkD!9dW-FyJ<87 sPhmTDebZ~=tLwWR-{l|~`hAz + + + + + + + +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    CREATED29-JUN-2018 15:09:11
    LAST_DDL_TIME29-JUN-2018 15:21:11
    SEQUENCE_OWNERWTP
    SEQUENCE_NAMEPLSQL_PROFILER_RUNNUMBER
    MIN_VALUE1
    MAX_VALUE9999999999999999999999999999
    INCREMENT_BY1
    CYCLE_FLAGN
    ORDER_FLAGN
    CACHE_SIZE0
    LAST_NUMBER16
    +
    +
    +
    +
    + + + + + + + + + +
    OBJECT_IDOWNEROBJECT_TYPEOBJECT_NAMESTATUSTYPE_LINK
    +
    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/headerBg.jpg b/docs/persist/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 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 literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topDimTabR.gif b/docs/persist/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topTabBg.gif b/docs/persist/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topTabR.gif b/docs/persist/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + + +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    CREATED29-JUN-2018 15:09:12
    LAST_DDL_TIME29-JUN-2018 15:21:14
    SEQUENCE_OWNERWTP
    SEQUENCE_NAMEWT_TEST_RUNS_SEQ
    MIN_VALUE1
    MAX_VALUE9999999999999999999999999999
    INCREMENT_BY1
    CYCLE_FLAGN
    ORDER_FLAGN
    CACHE_SIZE20
    LAST_NUMBER41
    +
    +
    +
    +
    + + + + + + + + + +
    OBJECT_IDOWNEROBJECT_TYPEOBJECT_NAMESTATUSTYPE_LINK
    +
    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/sequence/WT_TEST_RUNS_SEQ/headerBg.jpg b/docs/persist/DBDocs/sequence/WT_TEST_RUNS_SEQ/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 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
    nZDH?O8gS~#y@TeK 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 literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/sequence/WT_TEST_RUNS_SEQ/topDimTabR.gif b/docs/persist/DBDocs/sequence/WT_TEST_RUNS_SEQ/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/sequence/WT_TEST_RUNS_SEQ/topTabBg.gif b/docs/persist/DBDocs/sequence/WT_TEST_RUNS_SEQ/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/sequence/WT_TEST_RUNS_SEQ/topTabR.gif b/docs/persist/DBDocs/sequence/WT_TEST_RUNS_SEQ/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + +

    Sequences +

    \ No newline at end of file diff --git a/docs/persist/DBDocs/table/PLSQL_PROFILER_DATA.html b/docs/persist/DBDocs/table/PLSQL_PROFILER_DATA.html new file mode 100644 index 0000000..78343f9 --- /dev/null +++ b/docs/persist/DBDocs/table/PLSQL_PROFILER_DATA.html @@ -0,0 +1,799 @@ + + + + + + + + +
    +
    +
    +

    Columns

    +
    +
    +
    +
    +

    Constraints

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    Statistics

    +
    +
    +
    +
    +

    Triggers

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Partitions

    +
    +
    +
    +
    +

    Indexes

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    COLUMN_NAMEDATA_TYPENULLABLEDATA_DEFAULTCOLUMN_IDCOMMENTS
    RUNIDNUMBERNonull1Primary key, unique (generated) run identifier
    UNIT_NUMBERNUMBERNonull2Primary key, internally generated library unit number
    LINE#NUMBERNonull3Primary key, not null, line number in unit
    TOTAL_OCCURNUMBERYesnull4Number of times line was executed
    TOTAL_TIMENUMBERYesnull5Total time spent executing line in nanoseconds
    MIN_TIMENUMBERYesnull6Minimum execution time for this line in nanoseconds
    MAX_TIMENUMBERYesnull7Maximum execution time for this line in nanoseconds
    SPARE1NUMBERYesnull8Unused
    SPARE2NUMBERYesnull9Unused
    SPARE3NUMBERYesnull10Unused
    SPARE4NUMBERYesnull11Unused
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CONSTRAINT_NAMECONSTRAINT_TYPESEARCH_CONDITIONR_OWNERR_TABLE_NAMER_CONSTRAINT_NAMEDELETE_RULESTATUSDEFERRABLEVALIDATEDGENERATEDBADRELYLAST_CHANGEINDEX_OWNERINDEX_NAMEINVALIDVIEW_RELATED
    SYS_C0020887Check"LINE#" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDGENERATED NAMEnullnull29-JUN-2018 15:09:11nullnullnullnull
    SYS_C0020888Primary_KeynullnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDGENERATED NAMEnullnull29-JUN-2018 15:09:11nullSYS_C0020888nullnull
    SYS_C0020889Foreign_KeynullWTPPLSQL_PROFILER_UNITSSYS_C0020885NO ACTIONENABLEDNOT DEFERRABLEVALIDATEDGENERATED NAMEnullnull29-JUN-2018 15:09:11nullnullnullnull
    +
    +
    +
    +
    +
    +

    Columns

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    LINE#null
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    RUNID1
    UNIT_NUMBER2
    LINE#3
    +
    +
    +
    +
    + + + + + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    RUNID1
    UNIT_NUMBER2
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    NUM_ROWSnull
    BLOCKSnull
    AVG_ROW_LENnull
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    LAST_ANALYZED_SINCEnull
    +
    +
    +
    +
    +
    +

    Column Statistics

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + +
    TRIGGER_NAMETRIGGER_TYPETRIGGER_OWNERTRIGGERING_EVENTSTATUSTABLE_NAME
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    WTPWT_PROFILERPACKAGE BODYWTPPLSQL_PROFILER_DATATABLE
    +
    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    CREATED29-JUN-2018 15:09:11
    LAST_DDL_TIME29-JUN-2018 15:21:12
    OWNERWTP
    TABLE_NAMEPLSQL_PROFILER_DATA
    TABLESPACE_NAMEUSERS
    CLUSTER_NAMEnull
    IOT_NAMEnull
    STATUSVALID
    PCT_FREE10
    PCT_USEDnull
    INI_TRANS1
    MAX_TRANS255
    INITIAL_EXTENT65536
    NEXT_EXTENT1048576
    MIN_EXTENTS1
    MAX_EXTENTS2147483645
    PCT_INCREASEnull
    FREELISTSnull
    FREELIST_GROUPSnull
    LOGGINGYES
    BACKED_UPN
    NUM_ROWSnull
    BLOCKSnull
    EMPTY_BLOCKSnull
    AVG_SPACEnull
    CHAIN_CNTnull
    AVG_ROW_LENnull
    AVG_SPACE_FREELIST_BLOCKSnull
    NUM_FREELIST_BLOCKSnull
    DEGREE1
    INSTANCES1
    CACHEN
    TABLE_LOCKENABLED
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    PARTITIONEDNO
    IOT_TYPEnull
    OBJECT_ID_TYPEnull
    TABLE_TYPE_OWNERnull
    TABLE_TYPEnull
    TEMPORARYN
    SECONDARYN
    NESTEDNO
    BUFFER_POOLDEFAULT
    ROW_MOVEMENTDISABLED
    GLOBAL_STATSNO
    USER_STATSNO
    DURATIONnull
    SKIP_CORRUPTDISABLED
    MONITORINGYES
    CLUSTER_OWNERnull
    DEPENDENCIESDISABLED
    COMPRESSIONDISABLED
    COMPRESS_FORnull
    DROPPEDNO
    COMMENTSTable of program units for DBMS_PROFILER
    +
    +
    +
    +
    + + + + + + + + + +
    PARTITION_NAMELAST_ANALYZEDNUM_ROWSBLOCKSSAMPLE_SIZEHIGH_VALUE
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMEUNIQUENESSSTATUSINDEX_TYPETEMPORARYPARTITIONEDFUNCIDX_STATUSJOIN_INDEXCOLUMNS
    WTPSYS_C0020888UNIQUEVALIDNORMALNNOnullNORUNID, UNIT_NUMBER, LINE#
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONCOLUMN_LENGTHCHAR_LENGTHDESCENDCOLUMN_EXPRESSION
    WTPSYS_C0020888WTPPLSQL_PROFILER_DATARUNID1220ASCnull
    WTPSYS_C0020888WTPPLSQL_PROFILER_DATAUNIT_NUMBER2220ASCnull
    WTPSYS_C0020888WTPPLSQL_PROFILER_DATALINE#3220ASCnull
    +
    +
    +
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/table/PLSQL_PROFILER_DATA/headerBg.jpg b/docs/persist/DBDocs/table/PLSQL_PROFILER_DATA/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 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 literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/PLSQL_PROFILER_DATA/topDimTabR.gif b/docs/persist/DBDocs/table/PLSQL_PROFILER_DATA/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/PLSQL_PROFILER_DATA/topTabBg.gif b/docs/persist/DBDocs/table/PLSQL_PROFILER_DATA/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/PLSQL_PROFILER_DATA/topTabR.gif b/docs/persist/DBDocs/table/PLSQL_PROFILER_DATA/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + + +
    +
    +
    +

    Columns

    +
    +
    +
    +
    +

    Constraints

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    Statistics

    +
    +
    +
    +
    +

    Triggers

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Partitions

    +
    +
    +
    +
    +

    Indexes

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    COLUMN_NAMEDATA_TYPENULLABLEDATA_DEFAULTCOLUMN_IDCOMMENTS
    RUNIDNUMBERNonull1(PRIMARY KEY) Unique run identifier from plsql_profiler_runnumber
    RELATED_RUNNUMBERYesnull2Runid of related run (for client/server correlation)
    RUN_OWNERVARCHAR2(32 BYTE)Yesnull3User who started run
    RUN_DATEDATEYesnull4Start time of run
    RUN_COMMENTVARCHAR2(2047 BYTE)Yesnull5User provided comment for this run
    RUN_TOTAL_TIMENUMBERYesnull6Elapsed time for this run in nanoseconds
    RUN_SYSTEM_INFOVARCHAR2(2047 BYTE)Yesnull7Currently unused
    RUN_COMMENT1VARCHAR2(2047 BYTE)Yesnull8Additional comment
    SPARE1VARCHAR2(256 BYTE)Yesnull9Unused
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CONSTRAINT_NAMECONSTRAINT_TYPESEARCH_CONDITIONR_OWNERR_TABLE_NAMER_CONSTRAINT_NAMEDELETE_RULESTATUSDEFERRABLEVALIDATEDGENERATEDBADRELYLAST_CHANGEINDEX_OWNERINDEX_NAMEINVALIDVIEW_RELATED
    SYS_C0020883Primary_KeynullnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDGENERATED NAMEnullnull29-JUN-2018 15:09:11nullSYS_C0020883nullnull
    +
    +
    +
    +
    +
    +

    Columns

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    RUNID1
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    NUM_ROWSnull
    BLOCKSnull
    AVG_ROW_LENnull
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    LAST_ANALYZED_SINCEnull
    +
    +
    +
    +
    +
    +

    Column Statistics

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + +
    TRIGGER_NAMETRIGGER_TYPETRIGGER_OWNERTRIGGERING_EVENTSTATUSTABLE_NAME
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    WTPWT_PROFILERPACKAGE BODYWTPPLSQL_PROFILER_RUNSTABLE
    +
    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    CREATED29-JUN-2018 15:09:11
    LAST_DDL_TIME29-JUN-2018 15:21:12
    OWNERWTP
    TABLE_NAMEPLSQL_PROFILER_RUNS
    TABLESPACE_NAMEUSERS
    CLUSTER_NAMEnull
    IOT_NAMEnull
    STATUSVALID
    PCT_FREE10
    PCT_USEDnull
    INI_TRANS1
    MAX_TRANS255
    INITIAL_EXTENT65536
    NEXT_EXTENT1048576
    MIN_EXTENTS1
    MAX_EXTENTS2147483645
    PCT_INCREASEnull
    FREELISTSnull
    FREELIST_GROUPSnull
    LOGGINGYES
    BACKED_UPN
    NUM_ROWSnull
    BLOCKSnull
    EMPTY_BLOCKSnull
    AVG_SPACEnull
    CHAIN_CNTnull
    AVG_ROW_LENnull
    AVG_SPACE_FREELIST_BLOCKSnull
    NUM_FREELIST_BLOCKSnull
    DEGREE1
    INSTANCES1
    CACHEN
    TABLE_LOCKENABLED
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    PARTITIONEDNO
    IOT_TYPEnull
    OBJECT_ID_TYPEnull
    TABLE_TYPE_OWNERnull
    TABLE_TYPEnull
    TEMPORARYN
    SECONDARYN
    NESTEDNO
    BUFFER_POOLDEFAULT
    ROW_MOVEMENTDISABLED
    GLOBAL_STATSNO
    USER_STATSNO
    DURATIONnull
    SKIP_CORRUPTDISABLED
    MONITORINGYES
    CLUSTER_OWNERnull
    DEPENDENCIESDISABLED
    COMPRESSIONDISABLED
    COMPRESS_FORnull
    DROPPEDNO
    COMMENTSTable of profiler runs for DBMS_PROFILER
    +
    +
    +
    +
    + + + + + + + + + +
    PARTITION_NAMELAST_ANALYZEDNUM_ROWSBLOCKSSAMPLE_SIZEHIGH_VALUE
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMEUNIQUENESSSTATUSINDEX_TYPETEMPORARYPARTITIONEDFUNCIDX_STATUSJOIN_INDEXCOLUMNS
    WTPSYS_C0020883UNIQUEVALIDNORMALNNOnullNORUNID
    WTPPLSQL_PROFILER_RUNS_IDX1NONUNIQUEVALIDNORMALNNOnullNORUN_DATE
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONCOLUMN_LENGTHCHAR_LENGTHDESCENDCOLUMN_EXPRESSION
    WTPSYS_C0020883WTPPLSQL_PROFILER_RUNSRUNID1220ASCnull
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONCOLUMN_LENGTHCHAR_LENGTHDESCENDCOLUMN_EXPRESSION
    WTPPLSQL_PROFILER_RUNS_IDX1WTPPLSQL_PROFILER_RUNSRUN_DATE170ASCnull
    +
    +
    +
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/table/PLSQL_PROFILER_RUNS/headerBg.jpg b/docs/persist/DBDocs/table/PLSQL_PROFILER_RUNS/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 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
    nZDH?O8gS~#y@TeK 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 literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/PLSQL_PROFILER_RUNS/topDimTabR.gif b/docs/persist/DBDocs/table/PLSQL_PROFILER_RUNS/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/PLSQL_PROFILER_RUNS/topTabBg.gif b/docs/persist/DBDocs/table/PLSQL_PROFILER_RUNS/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/PLSQL_PROFILER_RUNS/topTabR.gif b/docs/persist/DBDocs/table/PLSQL_PROFILER_RUNS/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + + +
    +
    +
    +

    Columns

    +
    +
    +
    +
    +

    Constraints

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    Statistics

    +
    +
    +
    +
    +

    Triggers

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Partitions

    +
    +
    +
    +
    +

    Indexes

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    COLUMN_NAMEDATA_TYPENULLABLEDATA_DEFAULTCOLUMN_IDCOMMENTS
    RUNIDNUMBERNonull1(Primary key) References plsql_profiler_runs
    UNIT_NUMBERNUMBERNonull2(Primary key) Internally generated library unit #
    UNIT_TYPEVARCHAR2(32 BYTE)Yesnull3Library unit type
    UNIT_OWNERVARCHAR2(32 BYTE)Yesnull4Library unit owner name
    UNIT_NAMEVARCHAR2(32 BYTE)Yesnull5Library unit name timestamp on library unit
    UNIT_TIMESTAMPDATEYesnull6In the future will be used to detect changes to unit between runs
    TOTAL_TIMENUMBERNo7Total time spent in this unit in nanoseconds. The profiler does not set this field, but it is provided for the convenience of analysis tools
    SPARE1NUMBERYesnull8Unused
    SPARE2NUMBERYesnull9Unused
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CONSTRAINT_NAMECONSTRAINT_TYPESEARCH_CONDITIONR_OWNERR_TABLE_NAMER_CONSTRAINT_NAMEDELETE_RULESTATUSDEFERRABLEVALIDATEDGENERATEDBADRELYLAST_CHANGEINDEX_OWNERINDEX_NAMEINVALIDVIEW_RELATED
    SYS_C0020884Check"TOTAL_TIME" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDGENERATED NAMEnullnull29-JUN-2018 15:09:11nullnullnullnull
    SYS_C0020885Primary_KeynullnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDGENERATED NAMEnullnull29-JUN-2018 15:09:11nullSYS_C0020885nullnull
    SYS_C0020886Foreign_KeynullWTPPLSQL_PROFILER_RUNSSYS_C0020883NO ACTIONENABLEDNOT DEFERRABLEVALIDATEDGENERATED NAMEnullnull29-JUN-2018 15:09:11nullnullnullnull
    +
    +
    +
    +
    +
    +

    Columns

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    TOTAL_TIMEnull
    +
    +
    +
    +
    + + + + + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    RUNID1
    UNIT_NUMBER2
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    RUNID1
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    NUM_ROWSnull
    BLOCKSnull
    AVG_ROW_LENnull
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    LAST_ANALYZED_SINCEnull
    +
    +
    +
    +
    +
    +

    Column Statistics

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + +
    TRIGGER_NAMETRIGGER_TYPETRIGGER_OWNERTRIGGERING_EVENTSTATUSTABLE_NAME
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    WTPWT_PROFILERPACKAGE BODYWTPPLSQL_PROFILER_UNITSTABLE
    +
    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    CREATED29-JUN-2018 15:09:11
    LAST_DDL_TIME29-JUN-2018 15:21:12
    OWNERWTP
    TABLE_NAMEPLSQL_PROFILER_UNITS
    TABLESPACE_NAMEUSERS
    CLUSTER_NAMEnull
    IOT_NAMEnull
    STATUSVALID
    PCT_FREE10
    PCT_USEDnull
    INI_TRANS1
    MAX_TRANS255
    INITIAL_EXTENT65536
    NEXT_EXTENT1048576
    MIN_EXTENTS1
    MAX_EXTENTS2147483645
    PCT_INCREASEnull
    FREELISTSnull
    FREELIST_GROUPSnull
    LOGGINGYES
    BACKED_UPN
    NUM_ROWSnull
    BLOCKSnull
    EMPTY_BLOCKSnull
    AVG_SPACEnull
    CHAIN_CNTnull
    AVG_ROW_LENnull
    AVG_SPACE_FREELIST_BLOCKSnull
    NUM_FREELIST_BLOCKSnull
    DEGREE1
    INSTANCES1
    CACHEN
    TABLE_LOCKENABLED
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    PARTITIONEDNO
    IOT_TYPEnull
    OBJECT_ID_TYPEnull
    TABLE_TYPE_OWNERnull
    TABLE_TYPEnull
    TEMPORARYN
    SECONDARYN
    NESTEDNO
    BUFFER_POOLDEFAULT
    ROW_MOVEMENTDISABLED
    GLOBAL_STATSNO
    USER_STATSNO
    DURATIONnull
    SKIP_CORRUPTDISABLED
    MONITORINGYES
    CLUSTER_OWNERnull
    DEPENDENCIESDISABLED
    COMPRESSIONDISABLED
    COMPRESS_FORnull
    DROPPEDNO
    COMMENTSTable of program units for DBMS_PROFILER
    +
    +
    +
    +
    + + + + + + + + + +
    PARTITION_NAMELAST_ANALYZEDNUM_ROWSBLOCKSSAMPLE_SIZEHIGH_VALUE
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMEUNIQUENESSSTATUSINDEX_TYPETEMPORARYPARTITIONEDFUNCIDX_STATUSJOIN_INDEXCOLUMNS
    WTPSYS_C0020885UNIQUEVALIDNORMALNNOnullNORUNID, UNIT_NUMBER
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONCOLUMN_LENGTHCHAR_LENGTHDESCENDCOLUMN_EXPRESSION
    WTPSYS_C0020885WTPPLSQL_PROFILER_UNITSRUNID1220ASCnull
    WTPSYS_C0020885WTPPLSQL_PROFILER_UNITSUNIT_NUMBER2220ASCnull
    +
    +
    +
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/table/PLSQL_PROFILER_UNITS/headerBg.jpg b/docs/persist/DBDocs/table/PLSQL_PROFILER_UNITS/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 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
    nZDH?O8gS~#y@TeK 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 literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/PLSQL_PROFILER_UNITS/topDimTabR.gif b/docs/persist/DBDocs/table/PLSQL_PROFILER_UNITS/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/PLSQL_PROFILER_UNITS/topTabBg.gif b/docs/persist/DBDocs/table/PLSQL_PROFILER_UNITS/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/PLSQL_PROFILER_UNITS/topTabR.gif b/docs/persist/DBDocs/table/PLSQL_PROFILER_UNITS/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + + +
    +
    +
    +

    Columns

    +
    +
    +
    +
    +

    Constraints

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    Statistics

    +
    +
    +
    +
    +

    Triggers

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Partitions

    +
    +
    +
    +
    +

    Indexes

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    COLUMN_NAMEDATA_TYPENULLABLEDATA_DEFAULTCOLUMN_IDCOMMENTS
    TEST_RUN_IDNUMBER(38,0)Nonull1Foreign Key for the Test Run, Primary Key part 1.
    LINENUMBER(6,0)Nonull2Source code line number, Primary Key part 2.
    STATUSVARCHAR2(4 BYTE)Nonull3Executed/NotExecuted/Excluded/Ignored/Unknown Status from the Profiler
    TOTAL_OCCURNUMBER(9,0)Nonull4Number of times this line was executed.
    TOTAL_USECSNUMBER(9,0)Nonull5Total time in microseconds spent executing this line.
    MIN_USECSNUMBER(9,0)Nonull6Minimum execution time in microseconds for this line.
    MAX_USECSNUMBER(9,0)Nonull7Maximum execution time in microseconds for this line.
    TEXTVARCHAR2(4000 BYTE)Nonull8Source code text for this line number.
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CONSTRAINT_NAMECONSTRAINT_TYPESEARCH_CONDITIONR_OWNERR_TABLE_NAMER_CONSTRAINT_NAMEDELETE_RULESTATUSDEFERRABLEVALIDATEDGENERATEDBADRELYLAST_CHANGEINDEX_OWNERINDEX_NAMEINVALIDVIEW_RELATED
    WT_DBOUT_PROFILES_CK1Checkstatus in ('EXEC','NOTX','EXCL','IGNR','UNKN')nullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:21:14nullnullnullnull
    WT_DBOUT_PROFILES_FK1Foreign_KeynullWTPWT_TEST_RUNSWT_TEST_RUNS_PKNO ACTIONENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:13nullnullnullnull
    WT_DBOUT_PROFILES_NN1Check"TEST_RUN_ID" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:13nullnullnullnull
    WT_DBOUT_PROFILES_NN2Check"LINE" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:13nullnullnullnull
    WT_DBOUT_PROFILES_NN3Check"STATUS" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:13nullnullnullnull
    WT_DBOUT_PROFILES_NN4Check"TOTAL_OCCUR" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:13nullnullnullnull
    WT_DBOUT_PROFILES_NN5Check"TOTAL_USECS" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:13nullnullnullnull
    WT_DBOUT_PROFILES_NN6Check"MIN_USECS" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:13nullnullnullnull
    WT_DBOUT_PROFILES_NN7Check"MAX_USECS" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:13nullnullnullnull
    WT_DBOUT_PROFILES_NN8Check"TEXT" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:13nullnullnullnull
    WT_DBOUT_PROFILES_PKPrimary_KeynullnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:13nullWT_DBOUT_PROFILES_PKnullnull
    +
    +
    +
    +
    +
    +

    Columns

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    STATUSnull
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    TEST_RUN_ID1
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    TEST_RUN_IDnull
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    LINEnull
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    STATUSnull
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    TOTAL_OCCURnull
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    TOTAL_USECSnull
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    MIN_USECSnull
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    MAX_USECSnull
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    TEXTnull
    +
    +
    +
    +
    + + + + + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    TEST_RUN_ID1
    LINE2
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    DELETEPUBLICNOWTPWT_DBOUT_PROFILES
    SELECTPUBLICNOWTPWT_DBOUT_PROFILES
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    NUM_ROWSnull
    BLOCKSnull
    AVG_ROW_LENnull
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    LAST_ANALYZED_SINCEnull
    +
    +
    +
    +
    +
    +

    Column Statistics

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + +
    TRIGGER_NAMETRIGGER_TYPETRIGGER_OWNERTRIGGERING_EVENTSTATUSTABLE_NAME
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    WTPWT_PROFILERPACKAGE BODYWTPWT_DBOUT_PROFILESTABLE
    WTPWT_TEST_RUN_STATPACKAGE BODYWTPWT_DBOUT_PROFILESTABLE
    WTPWT_TEXT_REPORTPACKAGE BODYWTPWT_DBOUT_PROFILESTABLE
    WTPWT_TEST_RUN_STATPACKAGEWTPWT_DBOUT_PROFILESTABLE
    +
    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    CREATED29-JUN-2018 15:09:13
    LAST_DDL_TIME29-JUN-2018 15:21:14
    OWNERWTP
    TABLE_NAMEWT_DBOUT_PROFILES
    TABLESPACE_NAMEUSERS
    CLUSTER_NAMEnull
    IOT_NAMEnull
    STATUSVALID
    PCT_FREE0
    PCT_USEDnull
    INI_TRANS1
    MAX_TRANS255
    INITIAL_EXTENT65536
    NEXT_EXTENT1048576
    MIN_EXTENTS1
    MAX_EXTENTS2147483645
    PCT_INCREASEnull
    FREELISTSnull
    FREELIST_GROUPSnull
    LOGGINGYES
    BACKED_UPN
    NUM_ROWSnull
    BLOCKSnull
    EMPTY_BLOCKSnull
    AVG_SPACEnull
    CHAIN_CNTnull
    AVG_ROW_LENnull
    AVG_SPACE_FREELIST_BLOCKSnull
    NUM_FREELIST_BLOCKSnull
    DEGREE1
    INSTANCES1
    CACHEN
    TABLE_LOCKENABLED
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    PARTITIONEDNO
    IOT_TYPEnull
    OBJECT_ID_TYPEnull
    TABLE_TYPE_OWNERnull
    TABLE_TYPEnull
    TEMPORARYN
    SECONDARYN
    NESTEDNO
    BUFFER_POOLDEFAULT
    ROW_MOVEMENTDISABLED
    GLOBAL_STATSNO
    USER_STATSNO
    DURATIONnull
    SKIP_CORRUPTDISABLED
    MONITORINGYES
    CLUSTER_OWNERnull
    DEPENDENCIESDISABLED
    COMPRESSIONDISABLED
    COMPRESS_FORnull
    DROPPEDNO
    COMMENTSPL/SQL Profiler data for Database Object Under Test (DBOUT).
    +
    +
    +
    +
    + + + + + + + + + +
    PARTITION_NAMELAST_ANALYZEDNUM_ROWSBLOCKSSAMPLE_SIZEHIGH_VALUE
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMEUNIQUENESSSTATUSINDEX_TYPETEMPORARYPARTITIONEDFUNCIDX_STATUSJOIN_INDEXCOLUMNS
    WTPWT_DBOUT_PROFILES_PKUNIQUEVALIDNORMALNNOnullNOTEST_RUN_ID, LINE
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONCOLUMN_LENGTHCHAR_LENGTHDESCENDCOLUMN_EXPRESSION
    WTPWT_DBOUT_PROFILES_PKWTPWT_DBOUT_PROFILESTEST_RUN_ID1220ASCnull
    WTPWT_DBOUT_PROFILES_PKWTPWT_DBOUT_PROFILESLINE2220ASCnull
    +
    +
    +
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/table/WT_DBOUT_PROFILES/headerBg.jpg b/docs/persist/DBDocs/table/WT_DBOUT_PROFILES/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 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
    nZDH?O8gS~#y@TeK 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 literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/WT_DBOUT_PROFILES/topDimTabR.gif b/docs/persist/DBDocs/table/WT_DBOUT_PROFILES/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/WT_DBOUT_PROFILES/topTabBg.gif b/docs/persist/DBDocs/table/WT_DBOUT_PROFILES/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/WT_DBOUT_PROFILES/topTabR.gif b/docs/persist/DBDocs/table/WT_DBOUT_PROFILES/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + + +
    +
    +
    +

    Columns

    +
    +
    +
    +
    +

    Constraints

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    Statistics

    +
    +
    +
    +
    +

    Triggers

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Partitions

    +
    +
    +
    +
    +

    Indexes

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    COLUMN_NAMEDATA_TYPENULLABLEDATA_DEFAULTCOLUMN_IDCOMMENTS
    TEST_RUN_IDNUMBER(38,0)Nonull1Foreign Key for the Test Run, Primary Key part 1.
    RESULT_SEQNUMBER(8,0)Nonull2Sequence number for this Result, Primary Key part 2.
    EXECUTED_DTMTIMESTAMP(6)Nonull3Date/Time (with Fractional Seconds) this Result was captured
    INTERVAL_MSECSNUMBER(10,3)Nonull4Interval time in milliseonds since the previous Result or start ot the Test Run.
    ASSERTIONVARCHAR2(15 BYTE)Nonull5Name of the Assertion Test performed
    STATUSVARCHAR2(4 BYTE)Nonull6Passed/Failed Status from the Assertion
    DETAILSVARCHAR2(4000 BYTE)Nonull7Assertion Details, i.e. Expected Value and Actual Value
    TESTCASEVARCHAR2(50 BYTE)Yesnull8Optional Test Case name.
    MESSAGEVARCHAR2(200 BYTE)Yesnull9Optional test identifier that helps connect an Assertion to the Test Runner.
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CONSTRAINT_NAMECONSTRAINT_TYPESEARCH_CONDITIONR_OWNERR_TABLE_NAMER_CONSTRAINT_NAMEDELETE_RULESTATUSDEFERRABLEVALIDATEDGENERATEDBADRELYLAST_CHANGEINDEX_OWNERINDEX_NAMEINVALIDVIEW_RELATED
    WT_RESULTS_CK1Checkstatus in ('PASS','FAIL')nullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_RESULTS_FK1Foreign_KeynullWTPWT_TEST_RUNSWT_TEST_RUNS_PKNO ACTIONENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_RESULTS_NN2Check"TEST_RUN_ID" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_RESULTS_NN3Check"RESULT_SEQ" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_RESULTS_NN4Check"EXECUTED_DTM" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_RESULTS_NN5Check"INTERVAL_MSECS" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_RESULTS_NN6Check"ASSERTION" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_RESULTS_NN7Check"STATUS" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_RESULTS_NN8Check"DETAILS" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_RESULTS_PKPrimary_KeynullnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullWT_RESULTS_PKnullnull
    +
    +
    +
    +
    +
    +

    Columns

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    STATUSnull
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    TEST_RUN_ID1
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    TEST_RUN_IDnull
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    RESULT_SEQnull
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    EXECUTED_DTMnull
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    INTERVAL_MSECSnull
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    ASSERTIONnull
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    STATUSnull
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    DETAILSnull
    +
    +
    +
    +
    + + + + + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    TEST_RUN_ID1
    RESULT_SEQ2
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    DELETEPUBLICNOWTPWT_RESULTS
    SELECTPUBLICNOWTPWT_RESULTS
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    NUM_ROWSnull
    BLOCKSnull
    AVG_ROW_LENnull
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    LAST_ANALYZED_SINCEnull
    +
    +
    +
    +
    +
    +

    Column Statistics

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + +
    TRIGGER_NAMETRIGGER_TYPETRIGGER_OWNERTRIGGERING_EVENTSTATUSTABLE_NAME
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    WTPWT_RESULTPACKAGE BODYWTPWT_RESULTSTABLE
    WTPWT_ASSERTPACKAGE BODYWTPWT_RESULTSTABLE
    WTPWT_TEST_RUN_STATPACKAGE BODYWTPWT_RESULTSTABLE
    WTPWT_TEXT_REPORTPACKAGE BODYWTPWT_RESULTSTABLE
    WTPWT_ASSERTPACKAGEWTPWT_RESULTSTABLE
    WTPWT_TEST_RUN_STATPACKAGEWTPWT_RESULTSTABLE
    WTPWT_TEXT_REPORTPACKAGEWTPWT_RESULTSTABLE
    WTPWT_RESULTPACKAGEWTPWT_RESULTSTABLE
    +
    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    CREATED29-JUN-2018 15:09:12
    LAST_DDL_TIME29-JUN-2018 15:21:14
    OWNERWTP
    TABLE_NAMEWT_RESULTS
    TABLESPACE_NAMEUSERS
    CLUSTER_NAMEnull
    IOT_NAMEnull
    STATUSVALID
    PCT_FREE0
    PCT_USEDnull
    INI_TRANS1
    MAX_TRANS255
    INITIAL_EXTENT65536
    NEXT_EXTENT1048576
    MIN_EXTENTS1
    MAX_EXTENTS2147483645
    PCT_INCREASEnull
    FREELISTSnull
    FREELIST_GROUPSnull
    LOGGINGYES
    BACKED_UPN
    NUM_ROWSnull
    BLOCKSnull
    EMPTY_BLOCKSnull
    AVG_SPACEnull
    CHAIN_CNTnull
    AVG_ROW_LENnull
    AVG_SPACE_FREELIST_BLOCKSnull
    NUM_FREELIST_BLOCKSnull
    DEGREE1
    INSTANCES1
    CACHEN
    TABLE_LOCKENABLED
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    PARTITIONEDNO
    IOT_TYPEnull
    OBJECT_ID_TYPEnull
    TABLE_TYPE_OWNERnull
    TABLE_TYPEnull
    TEMPORARYN
    SECONDARYN
    NESTEDNO
    BUFFER_POOLDEFAULT
    ROW_MOVEMENTDISABLED
    GLOBAL_STATSNO
    USER_STATSNO
    DURATIONnull
    SKIP_CORRUPTDISABLED
    MONITORINGYES
    CLUSTER_OWNERnull
    DEPENDENCIESDISABLED
    COMPRESSIONDISABLED
    COMPRESS_FORnull
    DROPPEDNO
    COMMENTSResults data from Test Runs.
    +
    +
    +
    +
    + + + + + + + + + +
    PARTITION_NAMELAST_ANALYZEDNUM_ROWSBLOCKSSAMPLE_SIZEHIGH_VALUE
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMEUNIQUENESSSTATUSINDEX_TYPETEMPORARYPARTITIONEDFUNCIDX_STATUSJOIN_INDEXCOLUMNS
    WTPWT_RESULTS_PKUNIQUEVALIDNORMALNNOnullNOTEST_RUN_ID, RESULT_SEQ
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONCOLUMN_LENGTHCHAR_LENGTHDESCENDCOLUMN_EXPRESSION
    WTPWT_RESULTS_PKWTPWT_RESULTSTEST_RUN_ID1220ASCnull
    WTPWT_RESULTS_PKWTPWT_RESULTSRESULT_SEQ2220ASCnull
    +
    +
    +
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/table/WT_RESULTS/headerBg.jpg b/docs/persist/DBDocs/table/WT_RESULTS/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 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
    nZDH?O8gS~#y@TeK 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 literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/WT_RESULTS/topDimTabR.gif b/docs/persist/DBDocs/table/WT_RESULTS/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/WT_RESULTS/topTabBg.gif b/docs/persist/DBDocs/table/WT_RESULTS/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/WT_RESULTS/topTabR.gif b/docs/persist/DBDocs/table/WT_RESULTS/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + + +
    +
    +
    +

    Columns

    +
    +
    +
    +
    +

    Constraints

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    Statistics

    +
    +
    +
    +
    +

    Triggers

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Partitions

    +
    +
    +
    +
    +

    Indexes

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    COLUMN_NAMEDATA_TYPENULLABLEDATA_DEFAULTCOLUMN_IDCOMMENTS
    IDNUMBERNonull1Primary Key
    TEMP_CLOBCLOBYesnull2CLOB test data
    TEMP_NCLOBNCLOBYesnull3NCLOB test data
    TEMP_XMLXMLTYPEYesnull4XML test data
    TEMP_BLOBBLOBYesnull5BLOB test data
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CONSTRAINT_NAMECONSTRAINT_TYPESEARCH_CONDITIONR_OWNERR_TABLE_NAMER_CONSTRAINT_NAMEDELETE_RULESTATUSDEFERRABLEVALIDATEDGENERATEDBADRELYLAST_CHANGEINDEX_OWNERINDEX_NAMEINVALIDVIEW_RELATED
    WT_SELF_TEST_PKPrimary_KeynullnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:21:13nullWT_SELF_TEST_PKnullnull
    +
    +
    +
    +
    +
    +

    Columns

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    ID1
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    NUM_ROWSnull
    BLOCKSnull
    AVG_ROW_LENnull
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    LAST_ANALYZED_SINCEnull
    +
    +
    +
    +
    +
    +

    Column Statistics

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + +
    TRIGGER_NAMETRIGGER_TYPETRIGGER_OWNERTRIGGERING_EVENTSTATUSTABLE_NAME
    WT_SELF_TEST$TESTBEFORE EACH ROWWTPINSERTENABLEDWT_SELF_TEST
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    +trigger wt_self_test$test
    +   before insert on wt_self_test
    +   for each row
    +declare
    +   l_junk  number;
    +begin
    +   l_junk := 1;
    +end;
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    WTPWT_ASSERTPACKAGE BODYWTPWT_SELF_TESTTABLE
    WTPWT_SELF_TEST$TESTTRIGGERWTPWT_SELF_TESTTABLE
    +
    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    WTPWT_SELF_TESTTABLESYSXMLTYPETYPE
    WTPWT_SELF_TESTTABLESYSSTANDARDPACKAGE
    WTPWT_SELF_TESTTABLEPUBLICXMLTYPESYNONYM
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    WTPWT_SELF_TESTTABLESYSXMLTYPETYPE
    WTPWT_SELF_TESTTABLESYSSTANDARDPACKAGE
    WTPWT_SELF_TESTTABLEPUBLICXMLTYPESYNONYM
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    CREATED29-JUN-2018 15:21:13
    LAST_DDL_TIME29-JUN-2018 15:21:13
    OWNERWTP
    TABLE_NAMEWT_SELF_TEST
    TABLESPACE_NAMEUSERS
    CLUSTER_NAMEnull
    IOT_NAMEnull
    STATUSVALID
    PCT_FREE10
    PCT_USEDnull
    INI_TRANS1
    MAX_TRANS255
    INITIAL_EXTENT65536
    NEXT_EXTENT1048576
    MIN_EXTENTS1
    MAX_EXTENTS2147483645
    PCT_INCREASEnull
    FREELISTSnull
    FREELIST_GROUPSnull
    LOGGINGYES
    BACKED_UPN
    NUM_ROWSnull
    BLOCKSnull
    EMPTY_BLOCKSnull
    AVG_SPACEnull
    CHAIN_CNTnull
    AVG_ROW_LENnull
    AVG_SPACE_FREELIST_BLOCKSnull
    NUM_FREELIST_BLOCKSnull
    DEGREE1
    INSTANCES1
    CACHEN
    TABLE_LOCKENABLED
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    PARTITIONEDNO
    IOT_TYPEnull
    OBJECT_ID_TYPEnull
    TABLE_TYPE_OWNERnull
    TABLE_TYPEnull
    TEMPORARYN
    SECONDARYN
    NESTEDNO
    BUFFER_POOLDEFAULT
    ROW_MOVEMENTDISABLED
    GLOBAL_STATSNO
    USER_STATSNO
    DURATIONnull
    SKIP_CORRUPTDISABLED
    MONITORINGYES
    CLUSTER_OWNERnull
    DEPENDENCIESDISABLED
    COMPRESSIONDISABLED
    COMPRESS_FORnull
    DROPPEDNO
    COMMENTSTest Data for unit testing of WTPLSQL.
    +
    +
    +
    +
    + + + + + + + + + +
    PARTITION_NAMELAST_ANALYZEDNUM_ROWSBLOCKSSAMPLE_SIZEHIGH_VALUE
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMEUNIQUENESSSTATUSINDEX_TYPETEMPORARYPARTITIONEDFUNCIDX_STATUSJOIN_INDEXCOLUMNS
    WTPWT_SELF_TEST_PKUNIQUEVALIDNORMALNNOnullNOID
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONCOLUMN_LENGTHCHAR_LENGTHDESCENDCOLUMN_EXPRESSION
    WTPWT_SELF_TEST_PKWTPWT_SELF_TESTID1220ASCnull
    +
    +
    +
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/table/WT_SELF_TEST/headerBg.jpg b/docs/persist/DBDocs/table/WT_SELF_TEST/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 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
    nZDH?O8gS~#y@TeK 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 literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/WT_SELF_TEST/topDimTabR.gif b/docs/persist/DBDocs/table/WT_SELF_TEST/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/WT_SELF_TEST/topTabBg.gif b/docs/persist/DBDocs/table/WT_SELF_TEST/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/WT_SELF_TEST/topTabR.gif b/docs/persist/DBDocs/table/WT_SELF_TEST/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + + +
    +
    +
    +

    Columns

    +
    +
    +
    +
    +

    Constraints

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    Statistics

    +
    +
    +
    +
    +

    Triggers

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Partitions

    +
    +
    +
    +
    +

    Indexes

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    COLUMN_NAMEDATA_TYPENULLABLEDATA_DEFAULTCOLUMN_IDCOMMENTS
    TEST_RUN_IDNUMBER(38,0)Nonull1Primary (Surrogate) Key for each Test Run. Also the Test Runs Foreign Key.
    TESTCASEVARCHAR2(50 BYTE)Nonull2Primary Key (part 2). The testcase name
    TEST_YIELDNUMBERYesnull3Ratio of successful assertions to total assertions.
    ASSERTSNUMBERYesnull4Total number of assetions for the testcase.
    PASSESNUMBERYesnull5Number of passed assertions for the testcase.
    FAILURESNUMBERYesnull6Number of failed assertions for the testcase.
    ERRORSNUMBERYesnull7Number of errored assertions for the testcase.
    MIN_INTERVAL_MSECSNUMBERYesnull8Minimum interval time between assertions in milliseconds for the testcase
    AVG_INTERVAL_MSECSNUMBERYesnull9Average interval time between assertions in milliseconds for the testcase
    MAX_INTERVAL_MSECSNUMBERYesnull10Maximum interval time between assertions in milliseconds for the testcase
    TOT_INTERVAL_MSECSNUMBERYesnull11Total (sum) of interval times between assertions in milliseconds for the testcase
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CONSTRAINT_NAMECONSTRAINT_TYPESEARCH_CONDITIONR_OWNERR_TABLE_NAMER_CONSTRAINT_NAMEDELETE_RULESTATUSDEFERRABLEVALIDATEDGENERATEDBADRELYLAST_CHANGEINDEX_OWNERINDEX_NAMEINVALIDVIEW_RELATED
    WT_TESTCASE_STATS_FK1Foreign_KeynullWTPWT_TEST_RUNSWT_TEST_RUNS_PKNO ACTIONENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:21:12nullnullnullnull
    WT_TESTCASE_STATS_NN1Check"TEST_RUN_ID" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:21:12nullnullnullnull
    WT_TESTCASE_STATS_NN2Check"TESTCASE" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:21:12nullnullnullnull
    WT_TESTCASE_STATS_PKPrimary_KeynullnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:21:12nullWT_TESTCASE_STATS_PKnullnull
    +
    +
    +
    +
    +
    +

    Columns

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    TEST_RUN_ID1
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    TEST_RUN_IDnull
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    TESTCASEnull
    +
    +
    +
    +
    + + + + + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    TEST_RUN_ID1
    TESTCASE2
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    DELETEPUBLICNOWTPWT_TESTCASE_STATS
    SELECTPUBLICNOWTPWT_TESTCASE_STATS
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    NUM_ROWSnull
    BLOCKSnull
    AVG_ROW_LENnull
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    LAST_ANALYZED_SINCEnull
    +
    +
    +
    +
    +
    +

    Column Statistics

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + +
    TRIGGER_NAMETRIGGER_TYPETRIGGER_OWNERTRIGGERING_EVENTSTATUSTABLE_NAME
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    WTPWT_TEST_RUN_STATPACKAGE BODYWTPWT_TESTCASE_STATSTABLE
    +
    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    CREATED29-JUN-2018 15:21:12
    LAST_DDL_TIME29-JUN-2018 15:21:12
    OWNERWTP
    TABLE_NAMEWT_TESTCASE_STATS
    TABLESPACE_NAMEUSERS
    CLUSTER_NAMEnull
    IOT_NAMEnull
    STATUSVALID
    PCT_FREE0
    PCT_USEDnull
    INI_TRANS1
    MAX_TRANS255
    INITIAL_EXTENT65536
    NEXT_EXTENT1048576
    MIN_EXTENTS1
    MAX_EXTENTS2147483645
    PCT_INCREASEnull
    FREELISTSnull
    FREELIST_GROUPSnull
    LOGGINGYES
    BACKED_UPN
    NUM_ROWSnull
    BLOCKSnull
    EMPTY_BLOCKSnull
    AVG_SPACEnull
    CHAIN_CNTnull
    AVG_ROW_LENnull
    AVG_SPACE_FREELIST_BLOCKSnull
    NUM_FREELIST_BLOCKSnull
    DEGREE1
    INSTANCES1
    CACHEN
    TABLE_LOCKENABLED
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    PARTITIONEDNO
    IOT_TYPEnull
    OBJECT_ID_TYPEnull
    TABLE_TYPE_OWNERnull
    TABLE_TYPEnull
    TEMPORARYN
    SECONDARYN
    NESTEDNO
    BUFFER_POOLDEFAULT
    ROW_MOVEMENTDISABLED
    GLOBAL_STATSNO
    USER_STATSNO
    DURATIONnull
    SKIP_CORRUPTDISABLED
    MONITORINGYES
    CLUSTER_OWNERnull
    DEPENDENCIESDISABLED
    COMPRESSIONDISABLED
    COMPRESS_FORnull
    DROPPEDNO
    COMMENTSTest Run data statistics for each testcase in the execution of the WTPLSQL_RUN procedure.
    +
    +
    +
    +
    + + + + + + + + + +
    PARTITION_NAMELAST_ANALYZEDNUM_ROWSBLOCKSSAMPLE_SIZEHIGH_VALUE
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMEUNIQUENESSSTATUSINDEX_TYPETEMPORARYPARTITIONEDFUNCIDX_STATUSJOIN_INDEXCOLUMNS
    WTPWT_TESTCASE_STATS_PKUNIQUEVALIDNORMALNNOnullNOTEST_RUN_ID, TESTCASE
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONCOLUMN_LENGTHCHAR_LENGTHDESCENDCOLUMN_EXPRESSION
    WTPWT_TESTCASE_STATS_PKWTPWT_TESTCASE_STATSTEST_RUN_ID1220ASCnull
    WTPWT_TESTCASE_STATS_PKWTPWT_TESTCASE_STATSTESTCASE25050ASCnull
    +
    +
    +
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/table/WT_TESTCASE_STATS/headerBg.jpg b/docs/persist/DBDocs/table/WT_TESTCASE_STATS/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 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
    nZDH?O8gS~#y@TeK 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 literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/WT_TESTCASE_STATS/topDimTabR.gif b/docs/persist/DBDocs/table/WT_TESTCASE_STATS/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/WT_TESTCASE_STATS/topTabBg.gif b/docs/persist/DBDocs/table/WT_TESTCASE_STATS/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/WT_TESTCASE_STATS/topTabR.gif b/docs/persist/DBDocs/table/WT_TESTCASE_STATS/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + + +
    +
    +
    +

    Columns

    +
    +
    +
    +
    +

    Constraints

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    Statistics

    +
    +
    +
    +
    +

    Triggers

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Partitions

    +
    +
    +
    +
    +

    Indexes

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    COLUMN_NAMEDATA_TYPENULLABLEDATA_DEFAULTCOLUMN_IDCOMMENTS
    IDNUMBER(38,0)Nonull1Primary (Surrogate) Key for each Test Run
    START_DTMTIMESTAMP(6)Nonull2Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 1
    RUNNER_NAMEVARCHAR2(128 BYTE)Nonull3Name of the package with the WTPLSQL_RUN procedure. Natural Key 1 part 2
    RUNNER_OWNERVARCHAR2(128 BYTE)Nonull4Owner of the package with the WTPLSQL_RUN procedure. Natural Key 2 part 3
    DBOUT_OWNERVARCHAR2(128 BYTE)Yesnull5Optional Owner of the Database Object Under Test (DBOUT).
    DBOUT_NAMEVARCHAR2(128 BYTE)Yesnull6Optional Name of the Database Object Under Test (DBOUT).
    DBOUT_TYPEVARCHAR2(20 BYTE)Yesnull7Optional Type of the Database Object Under Test (DBOUT).
    TRIGGER_OFFSETNUMBERYesnull8Optional calculated offset from start of Trigger Source to start of Trigger PL/SQL Block.
    PROFILER_RUNIDNUMBERYesnull9Optional DBMS_PROFILER unique run identifier from plsql_profiler_runnumber sequence
    END_DTMTIMESTAMP(6)Yesnull10Date/time (and fractional seconds) this Test Run ended.
    ERROR_MESSAGEVARCHAR2(4000 BYTE)Yesnull11Optional Last error messages from this Test Run.
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CONSTRAINT_NAMECONSTRAINT_TYPESEARCH_CONDITIONR_OWNERR_TABLE_NAMER_CONSTRAINT_NAMEDELETE_RULESTATUSDEFERRABLEVALIDATEDGENERATEDBADRELYLAST_CHANGEINDEX_OWNERINDEX_NAMEINVALIDVIEW_RELATED
    WT_TEST_RUNS_FK1Foreign_KeynullWTPPLSQL_PROFILER_RUNSSYS_C0020883NO ACTIONDISABLEDNOT DEFERRABLENOT VALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_TEST_RUNS_NK1UniquenullnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullWT_TEST_RUNS_NK1nullnull
    WT_TEST_RUNS_NN1Check"ID" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_TEST_RUNS_NN2Check"START_DTM" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_TEST_RUNS_NN3Check"RUNNER_NAME" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_TEST_RUNS_NN4Check"RUNNER_OWNER" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_TEST_RUNS_PKPrimary_KeynullnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullWT_TEST_RUNS_PKnullnull
    +
    +
    +
    +
    +
    +

    Columns

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    PROFILER_RUNID1
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    START_DTM1
    RUNNER_NAME2
    RUNNER_OWNER3
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    IDnull
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    START_DTMnull
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    RUNNER_NAMEnull
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    RUNNER_OWNERnull
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    ID1
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    DELETEPUBLICNOWTPWT_TEST_RUNS
    INSERTPUBLICNOWTPWT_TEST_RUNS
    SELECTPUBLICNOWTPWT_TEST_RUNS
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    NUM_ROWSnull
    BLOCKSnull
    AVG_ROW_LENnull
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    LAST_ANALYZED_SINCEnull
    +
    +
    +
    +
    +
    +

    Column Statistics

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + +
    TRIGGER_NAMETRIGGER_TYPETRIGGER_OWNERTRIGGERING_EVENTSTATUSTABLE_NAME
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    WTPWT_RESULTPACKAGE BODYWTPWT_TEST_RUNSTABLE
    WTPWT_PROFILERPACKAGE BODYWTPWT_TEST_RUNSTABLE
    WTPWT_TEXT_REPORTPACKAGE BODYWTPWT_TEST_RUNSTABLE
    PUBLICWT_TEST_RUNSSYNONYMWTPWT_TEST_RUNSTABLE
    WTPWTPLSQLPACKAGE BODYWTPWT_TEST_RUNSTABLE
    WTPWT_RESULTPACKAGEWTPWT_TEST_RUNSTABLE
    WTPWT_TEXT_REPORTPACKAGEWTPWT_TEST_RUNSTABLE
    +
    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    CREATED29-JUN-2018 15:09:12
    LAST_DDL_TIME29-JUN-2018 15:09:12
    OWNERWTP
    TABLE_NAMEWT_TEST_RUNS
    TABLESPACE_NAMEUSERS
    CLUSTER_NAMEnull
    IOT_NAMEnull
    STATUSVALID
    PCT_FREE0
    PCT_USEDnull
    INI_TRANS1
    MAX_TRANS255
    INITIAL_EXTENT65536
    NEXT_EXTENT1048576
    MIN_EXTENTS1
    MAX_EXTENTS2147483645
    PCT_INCREASEnull
    FREELISTSnull
    FREELIST_GROUPSnull
    LOGGINGYES
    BACKED_UPN
    NUM_ROWSnull
    BLOCKSnull
    EMPTY_BLOCKSnull
    AVG_SPACEnull
    CHAIN_CNTnull
    AVG_ROW_LENnull
    AVG_SPACE_FREELIST_BLOCKSnull
    NUM_FREELIST_BLOCKSnull
    DEGREE1
    INSTANCES1
    CACHEN
    TABLE_LOCKENABLED
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    PARTITIONEDNO
    IOT_TYPEnull
    OBJECT_ID_TYPEnull
    TABLE_TYPE_OWNERnull
    TABLE_TYPEnull
    TEMPORARYN
    SECONDARYN
    NESTEDNO
    BUFFER_POOLDEFAULT
    ROW_MOVEMENTDISABLED
    GLOBAL_STATSNO
    USER_STATSNO
    DURATIONnull
    SKIP_CORRUPTDISABLED
    MONITORINGYES
    CLUSTER_OWNERnull
    DEPENDENCIESDISABLED
    COMPRESSIONDISABLED
    COMPRESS_FORnull
    DROPPEDNO
    COMMENTSTest Run data for each execution of the WTPLSQL_RUN procedure.
    +
    +
    +
    +
    + + + + + + + + + +
    PARTITION_NAMELAST_ANALYZEDNUM_ROWSBLOCKSSAMPLE_SIZEHIGH_VALUE
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMEUNIQUENESSSTATUSINDEX_TYPETEMPORARYPARTITIONEDFUNCIDX_STATUSJOIN_INDEXCOLUMNS
    WTPWT_TEST_RUNS_PKUNIQUEVALIDNORMALNNOnullNOID
    WTPWT_TEST_RUNS_NK1UNIQUEVALIDNORMALNNOnullNOSTART_DTM, RUNNER_NAME, RUNNER_OWNER
    WTPWT_TEST_RUNS_IDX1NONUNIQUEVALIDNORMALNNOnullNOSTART_DTM
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONCOLUMN_LENGTHCHAR_LENGTHDESCENDCOLUMN_EXPRESSION
    WTPWT_TEST_RUNS_PKWTPWT_TEST_RUNSID1220ASCnull
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONCOLUMN_LENGTHCHAR_LENGTHDESCENDCOLUMN_EXPRESSION
    WTPWT_TEST_RUNS_NK1WTPWT_TEST_RUNSSTART_DTM1110ASCnull
    WTPWT_TEST_RUNS_NK1WTPWT_TEST_RUNSRUNNER_NAME2128128ASCnull
    WTPWT_TEST_RUNS_NK1WTPWT_TEST_RUNSRUNNER_OWNER3128128ASCnull
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONCOLUMN_LENGTHCHAR_LENGTHDESCENDCOLUMN_EXPRESSION
    WTPWT_TEST_RUNS_IDX1WTPWT_TEST_RUNSSTART_DTM1110ASCnull
    +
    +
    +
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/table/WT_TEST_RUNS/headerBg.jpg b/docs/persist/DBDocs/table/WT_TEST_RUNS/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 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
    nZDH?O8gS~#y@TeK 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 literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/WT_TEST_RUNS/topDimTabR.gif b/docs/persist/DBDocs/table/WT_TEST_RUNS/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/WT_TEST_RUNS/topTabBg.gif b/docs/persist/DBDocs/table/WT_TEST_RUNS/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/WT_TEST_RUNS/topTabR.gif b/docs/persist/DBDocs/table/WT_TEST_RUNS/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + + +
    +
    +
    +

    Columns

    +
    +
    +
    +
    +

    Constraints

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    Statistics

    +
    +
    +
    +
    +

    Triggers

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Partitions

    +
    +
    +
    +
    +

    Indexes

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    COLUMN_NAMEDATA_TYPENULLABLEDATA_DEFAULTCOLUMN_IDCOMMENTS
    TEST_RUN_IDNUMBER(38,0)Nonull1Primary (Surrogate) Key for each Test Run. Also the Test Runs foreign key.
    TEST_YIELDNUMBERYesnull2Ratio of successful assertions to total assertions.
    ASSERTSNUMBERYesnull3Total number of assetions.
    PASSESNUMBERYesnull4Number of passed assertions.
    FAILURESNUMBERYesnull5Number of failed assertions.
    ERRORSNUMBERYesnull6Number of errored assertions.
    TESTCASESNUMBERYesnull7Total number of test cases.
    MIN_INTERVAL_MSECSNUMBERYesnull8Minimum interval time between assertions in milliseconds
    AVG_INTERVAL_MSECSNUMBERYesnull9Average interval time between assertions in milliseconds
    MAX_INTERVAL_MSECSNUMBERYesnull10Maximum interval time between assertions in milliseconds
    TOT_INTERVAL_MSECSNUMBERYesnull11Total (Sum) of interval times between assertions in milliseconds
    CODE_COVERAGENUMBERYesnull12Ratio of execute source lines to valid executable source lines.
    PROFILED_LINESNUMBERYesnull13Total number of source lines as counted by DBMS_PROFILER
    EXECUTED_LINESNUMBERYesnull14Number of source lines executed
    IGNORED_LINESNUMBERYesnull15Number of source lines ignored as uncountable
    EXCLUDED_LINESNUMBERYesnull16Number of source lines excluded due to unexplained DBMS_PROFILER metrics
    NOTEXEC_LINESNUMBERYesnull17Number of source lines not execute
    UNKNOWN_LINESNUMBERYesnull18Number of source lines that have unexplained DBMS_PROFILER metrics
    MIN_EXECUTED_USECSNUMBERYesnull19Minumum execution time for a line of source in microseconds
    AVG_EXECUTED_USECSNUMBERYesnull20Average execution time for a line of source in microseconds
    MAX_EXECUTED_USECSNUMBERYesnull21Maximum execution time for a line of source in microseconds
    TOT_EXECUTED_USECSNUMBERYesnull22Total (Sum) of execution times for a line of source in microseconds
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CONSTRAINT_NAMECONSTRAINT_TYPESEARCH_CONDITIONR_OWNERR_TABLE_NAMER_CONSTRAINT_NAMEDELETE_RULESTATUSDEFERRABLEVALIDATEDGENERATEDBADRELYLAST_CHANGEINDEX_OWNERINDEX_NAMEINVALIDVIEW_RELATED
    WT_TEST_RUN_STATS_FK1Foreign_KeynullWTPWT_TEST_RUNSWT_TEST_RUNS_PKNO ACTIONENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:21:12nullnullnullnull
    WT_TEST_RUN_STATS_NN1Check"TEST_RUN_ID" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:21:12nullnullnullnull
    WT_TEST_RUN_STATS_PKPrimary_KeynullnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:21:12nullWT_TEST_RUN_STATS_PKnullnull
    +
    +
    +
    +
    +
    +

    Columns

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    TEST_RUN_ID1
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    TEST_RUN_IDnull
    +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    TEST_RUN_ID1
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    DELETEPUBLICNOWTPWT_TEST_RUN_STATS
    SELECTPUBLICNOWTPWT_TEST_RUN_STATS
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    NUM_ROWSnull
    BLOCKSnull
    AVG_ROW_LENnull
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    LAST_ANALYZED_SINCEnull
    +
    +
    +
    +
    +
    +

    Column Statistics

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + +
    TRIGGER_NAMETRIGGER_TYPETRIGGER_OWNERTRIGGERING_EVENTSTATUSTABLE_NAME
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    WTPWT_TEST_RUN_STATPACKAGE BODYWTPWT_TEST_RUN_STATSTABLE
    WTPWT_TEXT_REPORTPACKAGE BODYWTPWT_TEST_RUN_STATSTABLE
    +
    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    CREATED29-JUN-2018 15:21:12
    LAST_DDL_TIME29-JUN-2018 15:21:13
    OWNERWTP
    TABLE_NAMEWT_TEST_RUN_STATS
    TABLESPACE_NAMEUSERS
    CLUSTER_NAMEnull
    IOT_NAMEnull
    STATUSVALID
    PCT_FREE0
    PCT_USEDnull
    INI_TRANS1
    MAX_TRANS255
    INITIAL_EXTENT65536
    NEXT_EXTENT1048576
    MIN_EXTENTS1
    MAX_EXTENTS2147483645
    PCT_INCREASEnull
    FREELISTSnull
    FREELIST_GROUPSnull
    LOGGINGYES
    BACKED_UPN
    NUM_ROWSnull
    BLOCKSnull
    EMPTY_BLOCKSnull
    AVG_SPACEnull
    CHAIN_CNTnull
    AVG_ROW_LENnull
    AVG_SPACE_FREELIST_BLOCKSnull
    NUM_FREELIST_BLOCKSnull
    DEGREE1
    INSTANCES1
    CACHEN
    TABLE_LOCKENABLED
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    PARTITIONEDNO
    IOT_TYPEnull
    OBJECT_ID_TYPEnull
    TABLE_TYPE_OWNERnull
    TABLE_TYPEnull
    TEMPORARYN
    SECONDARYN
    NESTEDNO
    BUFFER_POOLDEFAULT
    ROW_MOVEMENTDISABLED
    GLOBAL_STATSNO
    USER_STATSNO
    DURATIONnull
    SKIP_CORRUPTDISABLED
    MONITORINGYES
    CLUSTER_OWNERnull
    DEPENDENCIESDISABLED
    COMPRESSIONDISABLED
    COMPRESS_FORnull
    DROPPEDNO
    COMMENTSTest Run data statistics for each execution of the WTPLSQL_RUN procedure.
    +
    +
    +
    +
    + + + + + + + + + +
    PARTITION_NAMELAST_ANALYZEDNUM_ROWSBLOCKSSAMPLE_SIZEHIGH_VALUE
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMEUNIQUENESSSTATUSINDEX_TYPETEMPORARYPARTITIONEDFUNCIDX_STATUSJOIN_INDEXCOLUMNS
    WTPWT_TEST_RUN_STATS_PKUNIQUEVALIDNORMALNNOnullNOTEST_RUN_ID
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONCOLUMN_LENGTHCHAR_LENGTHDESCENDCOLUMN_EXPRESSION
    WTPWT_TEST_RUN_STATS_PKWTPWT_TEST_RUN_STATSTEST_RUN_ID1220ASCnull
    +
    +
    +
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/table/WT_TEST_RUN_STATS/headerBg.jpg b/docs/persist/DBDocs/table/WT_TEST_RUN_STATS/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 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
    nZDH?O8gS~#y@TeK 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 literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/WT_TEST_RUN_STATS/topDimTabR.gif b/docs/persist/DBDocs/table/WT_TEST_RUN_STATS/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/WT_TEST_RUN_STATS/topTabBg.gif b/docs/persist/DBDocs/table/WT_TEST_RUN_STATS/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/WT_TEST_RUN_STATS/topTabR.gif b/docs/persist/DBDocs/table/WT_TEST_RUN_STATS/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + + +
    +
    +
    +

    Columns

    +
    +
    +
    +
    +

    Constraints

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    Statistics

    +
    +
    +
    +
    +

    Triggers

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Partitions

    +
    +
    +
    +
    +

    Indexes

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    COLUMN_NAMEDATA_TYPENULLABLEDATA_DEFAULTCOLUMN_IDCOMMENTS
    INSTALL_DTMDATEYesnull1Date/Time the version that was installed/upgraded
    ACTIONVARCHAR2(15 BYTE)Yesnull2null
    TEXTVARCHAR2(15 BYTE)Yesnull3Name of the version that was installed/upgraded
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    CONSTRAINT_NAMECONSTRAINT_TYPESEARCH_CONDITIONR_OWNERR_TABLE_NAMER_CONSTRAINT_NAMEDELETE_RULESTATUSDEFERRABLEVALIDATEDGENERATEDBADRELYLAST_CHANGEINDEX_OWNERINDEX_NAMEINVALIDVIEW_RELATED
    +
    +
    +
    +
    +
    +

    Columns

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    SELECTPUBLICNOWTPWT_VERSION
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    NUM_ROWSnull
    BLOCKSnull
    AVG_ROW_LENnull
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    LAST_ANALYZED_SINCEnull
    +
    +
    +
    +
    +
    +

    Column Statistics

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + +
    TRIGGER_NAMETRIGGER_TYPETRIGGER_OWNERTRIGGERING_EVENTSTATUSTABLE_NAME
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    PUBLICWT_VERSIONSYNONYMWTPWT_VERSIONTABLE
    WTPWTPLSQLPACKAGE BODYWTPWT_VERSIONTABLE
    +
    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    + + + + + + + + +
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    CREATED29-JUN-2018 15:12:21
    LAST_DDL_TIME29-JUN-2018 15:21:12
    OWNERWTP
    TABLE_NAMEWT_VERSION
    TABLESPACE_NAMEUSERS
    CLUSTER_NAMEnull
    IOT_NAMEnull
    STATUSVALID
    PCT_FREE0
    PCT_USEDnull
    INI_TRANS1
    MAX_TRANS255
    INITIAL_EXTENT65536
    NEXT_EXTENT1048576
    MIN_EXTENTS1
    MAX_EXTENTS2147483645
    PCT_INCREASEnull
    FREELISTSnull
    FREELIST_GROUPSnull
    LOGGINGYES
    BACKED_UPN
    NUM_ROWSnull
    BLOCKSnull
    EMPTY_BLOCKSnull
    AVG_SPACEnull
    CHAIN_CNTnull
    AVG_ROW_LENnull
    AVG_SPACE_FREELIST_BLOCKSnull
    NUM_FREELIST_BLOCKSnull
    DEGREE1
    INSTANCES1
    CACHEN
    TABLE_LOCKENABLED
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    PARTITIONEDNO
    IOT_TYPEnull
    OBJECT_ID_TYPEnull
    TABLE_TYPE_OWNERnull
    TABLE_TYPEnull
    TEMPORARYN
    SECONDARYN
    NESTEDNO
    BUFFER_POOLDEFAULT
    ROW_MOVEMENTDISABLED
    GLOBAL_STATSNO
    USER_STATSNO
    DURATIONnull
    SKIP_CORRUPTDISABLED
    MONITORINGYES
    CLUSTER_OWNERnull
    DEPENDENCIESDISABLED
    COMPRESSIONDISABLED
    COMPRESS_FORnull
    DROPPEDNO
    COMMENTSRecords the installed and upgraded versions.
    +
    +
    +
    +
    + + + + + + + + + +
    PARTITION_NAMELAST_ANALYZEDNUM_ROWSBLOCKSSAMPLE_SIZEHIGH_VALUE
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMEUNIQUENESSSTATUSINDEX_TYPETEMPORARYPARTITIONEDFUNCIDX_STATUSJOIN_INDEXCOLUMNS
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + diff --git a/docs/persist/DBDocs/table/WT_VERSION/headerBg.jpg b/docs/persist/DBDocs/table/WT_VERSION/headerBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69df3af4d8445b259f94c4f787e913f812704db6 GIT binary patch literal 13911 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
    nZDH?O8gS~#y@TeK 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 literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/WT_VERSION/topDimTabR.gif b/docs/persist/DBDocs/table/WT_VERSION/topDimTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..3233a6e58473a5d8b6c9c273d2cdc563cfdb0382 GIT binary patch literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/WT_VERSION/topTabBg.gif b/docs/persist/DBDocs/table/WT_VERSION/topTabBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b692b7a181cddb49590c86d7e6e99d3f549b6d GIT binary patch literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} literal 0 HcmV?d00001 diff --git a/docs/persist/DBDocs/table/WT_VERSION/topTabR.gif b/docs/persist/DBDocs/table/WT_VERSION/topTabR.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24e5eb9739ea67df271b693d03d235e861222b3 GIT binary patch literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue + + + + + + +

    Tables +

    \ No newline at end of file diff --git a/docs/persist/ER_Diagrams.pdf b/docs/persist/ER_Diagrams.pdf new file mode 100644 index 0000000000000000000000000000000000000000..12a4675397f97b422834f35a098db71defe5391e GIT binary patch literal 2761 zcmb7Gc|4R`A5Y6L6C+EqRgcP&ZJyc3#0W#QpfQq4%<>GQF{4?8T(Ts$MTjU|A(bLa zh4$P`jii)Nxgnz~d@8PLq#Jj}?R~v(f4s~2=Q-zle!uVeJ>T=3=X=b3sUCJ{dji6| zU;elqfdxQ7zzjz?I-)$dJTW9hdGHuwhzhX;YzVax;)jaE05s77OQDFwLWmK8h%S%@ zdL8X1=-(O%(0FUEwJ7(iut4l6)xWgu#}5j-RqhT^t6~t^Fi*-M zLA(6^I?C{_@mqq+yN+Z)bSi6ZeVaRdD5@*Eyk&YKuItYZM`8l8_FMht zcU8crtC=M?BPf5`zdU+siaBrm+2a9^x(UVOBKIALjfP%};?5S%w}oYNI2YP@ENDNQ zy})6Cn%PSoAyQ4#;0~+8TxK>E5ue!DWGn*+~BBJ4pDzC?Kg`_esL!t(@o#D zwBumETxU}9x!`&eL-TOVK^gbpQ>{L$1Nb~Pa-}d;*EIxnmz?Rhp~wo(J@;jedD7KS zJVSS!cNJKS?yY<vwK$Xy}(Qzes*JHG%ww@Z>Z7>pfvq68Tj0 zs{619rb~9X(l20*-{dZ%Y2mAbgl}-wd;FzQ>rW>K+Xq?%+BI+QSs6xeS-eh9mm=Cy zSyw4EOu}cjrDxu;URyd(_&#z=WnyJPfsStKVbB=LSw`NFlumCGdZyKq&7U@+a&3=Q z3}m={K2(}DqUMxS<*QBit$ae&k{OjOH9Oss?xEgPdN-3+aiiL-ZAI0?=S++C{MP4A z*di;O*Mc|mKiQWj?+Kd|e=RAE+MSRjo49HKEX)^7m&I6aan-N_zb$XgADm)*ifni4 z;Vma90=kGJtx@CRu5Zs1V9CH7t@&4rCpjTRTvn(%ho7Q&1kHpiwL#qwiV>AQGF!Zd5{m~zRgm7$e z9-O<7iH&-^QCj5p?CeD8C>62pN}}`m(ZQ>|pGPiEr;^yqEi~k#DV#;>3Wn_0xc)mH z0l43F4!pGJJmuSa_zPy`TETHx9`2Xl)n&$}Azi_|$#+n~b_T66dL62HkQdJSUr8ud2(YxKi~J@F>T52;Z9-z zz1ZWr@%g@GHW90ELHVQ4baN}LZeYC-~naO z@gNmN2w9#+=^ka7EOs*(@kY;oN%F%srPo#UcILmIoVw^uc*%(;d4vk`g~^uw{M9;7 z%6p!LdffHVgorSxl z^VD0a_KJS0kFSi?a~p1mkk!|wRhRzu|@%8+@j4Nh1|hl9&c!d+Q_ z4NtmvZ^c-Wo{Mt{<%>>Me`X4YM~l?(YeX@QE((;hKb!d9h_7FguXDX?1Ix#F{G3l_ zEo{>PxhGoDef?~=LXPb-%AHePc&o+AD*Mk$*gn^NBfz&0>7A1 z3Bg_Rn=a4)b(!(p_UGi_^9dvGhd5Q+ zN+g>U^d7yF9NqZq8R5-NIjLoNIB(9eI_bzE?S&s<%;x>@n~7V64A-$*nDj!7bu{wS z&Dgj~O6OUhC|J7UV;M4$y4lqF&eGfEOKqR?)V8j=w7{XxS5e)9v;5F?s<>ux_mvk_ zh0ej^5y39YYhY8%)&NdVhplO~!K;UpdHUX#H)NFHhkG=G?Tgo>qL$PIv9*WJh|&xO z`*IriW0aqbX-9k2%fGrdNs#N5e*krOaQ#k248dzxV6iso~1$sd?$3#LXUq&c|@)toue?C_XpiwkPB#;PMkVs{^%6QcS4WMTdJTL%8)uAYxGEu1H z0&p`kn;=dY8jL(Lj=uq zJRx2bB<8XhcCG>*8|BVdnmv~viVEQJUHBsIKgP4eU3iL=3*1Z=AEVq--mV?ZHZzVph*rtVrUXksoxKA7@YEp`Vk}j3!hlX;PN1$>W=8e z=Li6msx*`r71-{GXLC3h0>~z?u^cq0tR5nwiD&|WNy3uYXcmd`-y?!hG=V@2sP>hH l^5e!r07= 0) - ,constraint wt_profiler_stats_ck3 check (executed_lines >= 0) - ,constraint wt_profiler_stats_ck4 check (ignored_lines >= 0) - ,constraint wt_profiler_stats_ck5 check (excluded_lines >= 0) - ,constraint wt_profiler_stats_ck6 check (notexec_lines >= 0) - ,constraint wt_profiler_stats_ck7 check (unknown_lines >= 0) - ,constraint wt_profiler_stats_ck8 check (min_executed_usecs >= 0) - ,constraint wt_profiler_stats_ck9 check (avg_executed_usecs >= min_executed_usecs) - ,constraint wt_profiler_stats_ck10 check (max_executed_usecs >= avg_executed_usecs) - ,constraint wt_profiler_stats_ck11 check (tot_executed_usecs >= max_executed_usecs) - ) pctfree 0; - -comment on table wt_profiler_stats is 'Test Run profile statistics for each execution of a Test Runner.'; -comment on column wt_profiler_stats.test_run_id is 'Primary (Surrogate) Key for each Test Run. Also the Test Runs foreign key.'; -comment on column wt_profiler_stats.coverage_pct is 'Percentage of executed source lines to valid executable source lines.'; -comment on column wt_profiler_stats.profiled_lines is 'Total number of source lines as counted by DBMS_PROFILER'; -comment on column wt_profiler_stats.executed_lines is 'Number of source lines executed'; -comment on column wt_profiler_stats.ignored_lines is 'Number of source lines ignored as uncountable'; -comment on column wt_profiler_stats.excluded_lines is 'Number of source lines excluded due to unexplained DBMS_PROFILER metrics'; -comment on column wt_profiler_stats.notexec_lines is 'Number of source lines not executed'; -comment on column wt_profiler_stats.unknown_lines is 'Number of source lines that have unexplained DBMS_PROFILER metrics'; -comment on column wt_profiler_stats.min_executed_usecs is 'Minumum execution time for a line of source in microseconds'; -comment on column wt_profiler_stats.avg_executed_usecs is 'Average execution time for a line of source in microseconds'; -comment on column wt_profiler_stats.max_executed_usecs is 'Maximum execution time for a line of source in microseconds'; -comment on column wt_profiler_stats.tot_executed_usecs is 'Total (Sum) of execution times for a line of source in microseconds'; - -grant select on wt_profiler_stats to public; -grant delete on wt_profiler_stats to public; diff --git a/src/persist/wt_profiler_stats_vw.vw b/src/persist/wt_profiler_stats_vw.vw deleted file mode 100644 index d728599..0000000 --- a/src/persist/wt_profiler_stats_vw.vw +++ /dev/null @@ -1,61 +0,0 @@ - --- --- Test Run Profile Statistics View Installation --- - -create view wt_profiler_stats_vw as -select stat.test_run_id - ,run.test_runner_id - ,tr.runner_owner - ,tr.runner_name - ,run.dbout_id - ,dbo.dbout_owner - ,dbo.dbout_name - ,dbo.dbout_type - ,run.start_dtm - ,run.end_dtm - ,run.trigger_offset - ,run.profiler_runid - ,run.is_last_run - ,run.error_message - ,stat.line - ,stat.status - ,stat.total_occur - ,stat.total_usecs - ,stat.min_usecs - ,stat.max_usecs - ,stat.text - from wt_profiler_stats stat - join wt_test_runs run - on run.id = stat.test_run_id - join wt_test_runners tr - on tr.id = run.test_runner_id - join wt_profilers dbo - on dbo.id = run.dbout_id; - -comment on table wt_profiler_stats_vw is 'Test Run profile statistics for each execution of a Test Runner.'; -comment on column wt_profiler_stats_vw.test_run_id is 'Primary (Surrogate) Key for each Test Run'; -comment on column wt_profiler_stats_vw.test_runner_id is 'Primary (Surrogate) Key for each Test Runner'; -comment on column wt_profiler_stats_vw.runner_owner is 'Owner of the Test Runner package. Natural Key 1 part 1'; -comment on column wt_profiler_stats_vw.runner_name is 'Name of the Test Runner package. Natural Key 1 part 2'; -comment on column wt_profiler_stats_vw.id is 'Primary (Surrogate) Key for each Database Objects Under Test (DBOUT)'; -comment on column wt_profiler_stats_vw.dbout_owner is 'Owner of the Database Object Under Test (DBOUT).'; -comment on column wt_profiler_stats_vw.dbout_name is 'Name of the Database Object Under Test (DBOUT).'; -comment on column wt_profiler_stats_vw.dbout_type is 'Type of the Database Object Under Test (DBOUT).'; -comment on column wt_profiler_stats_vw.start_dtm is 'Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 2'; -comment on column wt_profiler_stats_vw.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; -comment on column wt_profiler_stats_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; -comment on column wt_profiler_stats_vw.error_message is 'Optional Error messages from this Test Run.'; -comment on column wt_profiler_stats_vw.coverage_pct is 'Percentage of executed source lines to valid executable source lines.'; -comment on column wt_profiler_stats_vw.profiled_lines is 'Total number of source lines as counted by DBMS_PROFILER'; -comment on column wt_profiler_stats_vw.executed_lines is 'Number of source lines executed'; -comment on column wt_profiler_stats_vw.ignored_lines is 'Number of source lines ignored as uncountable'; -comment on column wt_profiler_stats_vw.excluded_lines is 'Number of source lines excluded due to unexplained DBMS_PROFILER metrics'; -comment on column wt_profiler_stats_vw.notexec_lines is 'Number of source lines not executed'; -comment on column wt_profiler_stats_vw.unknown_lines is 'Number of source lines that have unexplained DBMS_PROFILER metrics'; -comment on column wt_profiler_stats_vw.min_executed_usecs is 'Minumum execution time for a line of source in microseconds'; -comment on column wt_profiler_stats_vw.avg_executed_usecs is 'Average execution time for a line of source in microseconds'; -comment on column wt_profiler_stats_vw.max_executed_usecs is 'Maximum execution time for a line of source in microseconds'; -comment on column wt_profiler_stats_vw.tot_executed_usecs is 'Total (Sum) of execution times for a line of source in microseconds'; - -grant select on wt_profiler_stats_vw to public; diff --git a/src/persist/wt_profiles.tab b/src/persist/wt_profiles.tab index 614f027..6f86c91 100644 --- a/src/persist/wt_profiles.tab +++ b/src/persist/wt_profiles.tab @@ -4,18 +4,18 @@ -- create table wt_profiles - (test_run_id number(38) constraint wt_profiles_nn1 not null - ,line number(6) constraint wt_profiles_nn2 not null - ,status varchar2(4) constraint wt_profiles_nn3 not null - ,total_occur number(9) constraint wt_profiles_nn4 not null - ,total_usecs number constraint wt_profiles_nn5 not null - ,min_usecs number constraint wt_profiles_nn6 not null - ,max_usecs number constraint wt_profiles_nn7 not null - ,text varchar2(4000) constraint wt_profiles_nn8 not null + (test_run_id number(38) constraint wt_profiles_nn1 not null + ,line number(6) constraint wt_profiles_nn2 not null + ,status varchar2(4) constraint wt_profiles_nn3 not null + ,total_occur number(9) constraint wt_profiles_nn4 not null + ,total_usecs number constraint wt_profiles_nn5 not null + ,min_usecs number constraint wt_profiles_nn6 not null + ,max_usecs number constraint wt_profiles_nn7 not null + ,text varchar2(4000) constraint wt_profiles_nn8 not null ,constraint wt_profiles_pk primary key (test_run_id, line) ,constraint wt_profiles_fk1 foreign key (test_run_id) references wt_test_runs (id) - ,constraint wt_profiles_ck1 check (status in ('EXEC','NOTX','EXCL','IGNR','UNKN')) + ,constraint wt_profiles_ck1 check (status in ('EXEC','NOTX','EXCL','IGNR','UNKN')) ) pctfree 0; comment on table wt_profiles is 'PL/SQL Profiler data for Database Object Under Test (DBOUT).'; diff --git a/src/persist/wt_profiles_vw.vw b/src/persist/wt_profiles_vw.vw index ef86b9f..8417e98 100644 --- a/src/persist/wt_profiles_vw.vw +++ b/src/persist/wt_profiles_vw.vw @@ -1,51 +1,55 @@ -- --- DBOUT Profiles View Installation +-- Test Run Profiles View Installation -- create view wt_profiles_vw as -select db.dbout_id - ,db.dbout_owner - ,db.dbout_name - ,db.dbout_type - ,db.test_runner_id - ,db.test_runner_owner - ,db.test_runner_name - ,db.test_run_id - ,db.is_last_run - ,db.trigger_offset - ,db.profiler_runid - ,db.error_message - ,prof.line - ,prof.status - ,prof.total_occur - ,prof.total_usecs - ,prof.min_usecs - ,prof.max_usecs - ,prof.text - from wt_profiles prof - join wt_dbout_runs_vw db - on db.test_run_id = prof.test_run_id; +select run.id TEST_RUN_ID + ,run.test_runner_id + ,tr.owner RUNNER_OWNER + ,tr.name RUNNER_NAME + ,run.dbout_id + ,dbo.owner DBOUT_OWNER + ,dbo.name DBOUT_NAME + ,dbo.type DBOUT_TYPE + ,run.start_dtm + ,run.end_dtm + ,run.trigger_offset + ,run.profiler_runid + ,run.is_last_run + ,run.error_message + ,dbo.line + ,dbo.status + ,dbo.total_occur + ,dbo.total_usecs + ,dbo.min_usecs + ,dbo.max_usecs + ,dbo.text + from wt_profiles dbo + join wt_test_runs run + on run.dbout_id = dbo.id + join wt_test_runners tr + on tr.id = run.test_runner_id; -comment on table wt_profiles_vw is 'PL/SQL Profiler data for Database Object Under Test (DBOUT).'; -comment on column wt_profiles_vw.dbout_id is 'Surrogate Key to the Database Object Under Test (DBOUT).'; +comment on table wt_profiles_vw is 'Test Run profile statistics for each execution of a Test Runner.'; +comment on column wt_profiles_vw.test_run_id is 'Primary (Surrogate) Key for each Test Run'; +comment on column wt_profiles_vw.test_runner_id is 'Primary (Surrogate) Key for each Test Runner'; +comment on column wt_profiles_vw.runner_owner is 'Owner of the Test Runner package. Natural Key 1 part 1'; +comment on column wt_profiles_vw.runner_name is 'Name of the Test Runner package. Natural Key 1 part 2'; +comment on column wt_profiles_vw.id is 'Primary (Surrogate) Key for each Database Objects Under Test (DBOUT)'; comment on column wt_profiles_vw.dbout_owner is 'Owner of the Database Object Under Test (DBOUT).'; comment on column wt_profiles_vw.dbout_name is 'Name of the Database Object Under Test (DBOUT).'; comment on column wt_profiles_vw.dbout_type is 'Type of the Database Object Under Test (DBOUT).'; -comment on column wt_profiles_vw.test_runner_id is 'Surrogate Key the Test Runner package.'; -comment on column wt_profiles_vw.test_runner_owner is 'Owner of the Test Runner package.'; -comment on column wt_profiles_vw.test_runner_name is 'Name of the Test Runner package.'; -comment on column wt_profiles_vw.test_run_id is 'Foreign Key for the Test Run.'; +comment on column wt_profiles_vw.start_dtm is 'Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 2'; +comment on column wt_profiles_vw.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; comment on column wt_profiles_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; -comment on column wt_profiles_vw.trigger_offset is 'Calculated offset from start of Trigger Source to start of Trigger PL/SQL Block.'; -comment on column wt_profiles_vw.profiler_runid is 'DBMS_PROFILER unique run identifier from plsql_profiler_runnumber sequence'; comment on column wt_profiles_vw.error_message is 'Optional Error messages from this Test Run.'; -comment on column wt_profiles_vw.line is 'Source code line number.'; -comment on column wt_profiles_vw.status is 'Executed/NotExecuted/Excluded/Ignored/Unknown Status from the Profiler'; -comment on column wt_profiles_vw.total_occur is 'Number of times this line was executed.'; -comment on column wt_profiles_vw.total_usecs is 'Total time in microseconds spent executing this line.'; -comment on column wt_profiles_vw.min_usecs is 'Minimum execution time in microseconds for this line.'; -comment on column wt_profiles_vw.max_usecs is 'Maximum execution time in microseconds for this line.'; -comment on column wt_profiles_vw.text is 'Source code text for this line number.'; +comment on column wt_profiles.line is 'Source code line number, Primary Key part 2.'; +comment on column wt_profiles.status is 'Executed/NotExecuted/Excluded/Ignored/Unknown Status from the Profiler'; +comment on column wt_profiles.total_occur is 'Number of times this line was executed.'; +comment on column wt_profiles.total_usecs is 'Total time in microseconds spent executing this line.'; +comment on column wt_profiles.min_usecs is 'Minimum execution time in microseconds for this line.'; +comment on column wt_profiles.max_usecs is 'Maximum execution time in microseconds for this line.'; +comment on column wt_profiles.text is 'Source code text for this line number.'; grant select on wt_profiles_vw to public; diff --git a/src/persist/wt_test_run_stats.tab b/src/persist/wt_test_run_stats.tab deleted file mode 100644 index a394f71..0000000 --- a/src/persist/wt_test_run_stats.tab +++ /dev/null @@ -1,41 +0,0 @@ - --- --- Test Runs Statistics Table Installation --- - -create table wt_test_run_stats - (test_run_id number(38) constraint wt_test_run_stats_nn1 not null - ,yield_pct number(3) constraint wt_test_run_stats_nn2 not null - ,testcases number(7) constraint wt_test_run_stats_nn3 not null - ,failures number(7) constraint wt_test_run_stats_nn5 not null - ,assertions number(7) constraint wt_test_run_stats_nn4 not null - ,min_interval_msecs number(10) constraint wt_test_run_stats_nn6 not null - ,avg_interval_msecs number(10) constraint wt_test_run_stats_nn7 not null - ,max_interval_msecs number(10) constraint wt_test_run_stats_nn10 not null - ,tot_interval_msecs number(10) constraint wt_test_run_stats_nn11 not null - ,constraint wt_test_run_stats_pk primary key (test_run_id) - ,constraint wt_test_run_stats_fk1 foreign key (test_run_id) - references wt_test_runs (id) - ,constraint wt_test_run_stats_ck1 check (yield_pct = trunc(100*passes/testcases)) - ,constraint wt_test_run_stats_ck2 check (testcases = passes + failures) - ,constraint wt_test_run_stats_ck3 check (passes >= 0) - ,constraint wt_test_run_stats_ck4 check (failures >= 0) - ,constraint wt_test_run_stats_ck5 check (min_interval_msecs >= 0) - ,constraint wt_test_run_stats_ck6 check (avg_interval_msecs >= min_interval_msecs) - ,constraint wt_test_run_stats_ck7 check (max_interval_msecs >= avg_interval_msecs) - ,constraint wt_test_run_stats_ck8 check (tot_interval_msecs >= max_interval_msecs) - ) pctfree 0; - -comment on table wt_test_run_stats is 'Test Run data statistics for each execution of a Test Runner.'; -comment on column wt_test_run_stats.test_run_id is 'Primary Key for each Test Run. Also the Test Runs foreign key.'; -comment on column wt_test_run_stats.yield_pct is 'Percentage of successful test cases to total Test Cases.'; -comment on column wt_test_run_stats.testcases is 'Total number of Test Cases.'; -comment on column wt_test_run_stats.failures is 'Number of failed Test Cases.'; -comment on column wt_test_run_stats.passes is 'Number of Test Assertions.'; -comment on column wt_test_run_stats.min_interval_msecs is 'Minimum tot_interval_msecs between assertions across all Test Cases'; -comment on column wt_test_run_stats.avg_interval_msecs is 'Average tot_interval_msecs between assertions across all Test Cases'; -comment on column wt_test_run_stats.max_interval_msecs is 'Maximum tot_interval_msecs between assertions across all Test Cases'; -comment on column wt_test_run_stats.tot_interval_msecs is 'Total (sum) of tot_interval_msecs between assertions across all Test Cases'; - -grant select on wt_test_run_stats to public; -grant delete on wt_test_run_stats to public; diff --git a/src/persist/wt_test_run_stats_vw.vw b/src/persist/wt_test_run_stats_vw.vw deleted file mode 100644 index 533377d..0000000 --- a/src/persist/wt_test_run_stats_vw.vw +++ /dev/null @@ -1,47 +0,0 @@ - --- --- Test Runs Statistics View Installation --- - -create view wt_test_run_stats_vw as -select stat.test_run_id - ,run.test_runner_id - ,tr.runner_owner - ,tr.runner_name - ,run.start_dtm - ,run.end_dtm - ,run.is_last_run - ,run.error_message - ,stat.yield_pct - ,stat.testcases - ,stat.passes - ,stat.failures - ,stat.min_interval_msecs - ,stat.avg_interval_msecs - ,stat.max_interval_msecs - ,stat.tot_interval_msecs - from wt_test_run_stats stat - join wt_test_runs run - on run.id = stat.test_run_id - join wt_test_runners tr - on tr.id = run.test_runner_id; - -comment on table wt_test_run_stats_vw is 'Test Run data statistics for each execution of a Test Runner.'; -comment on column wt_test_run_stats_vw.test_run_id is 'Primary (Surrogate) Key for each Test Run'; -comment on column wt_test_run_stats_vw.test_runner_id is 'Primary (Surrogate) Key for each Test Runner'; -comment on column wt_test_run_stats_vw.runner_owner is 'Owner of the Test Runner package. Natural Key 1 part 1'; -comment on column wt_test_run_stats_vw.runner_name is 'Name of the Test Runner package. Natural Key 1 part 2'; -comment on column wt_test_run_stats_vw.start_dtm is 'Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 2'; -comment on column wt_test_run_stats_vw.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; -comment on column wt_test_run_stats_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; -comment on column wt_test_run_stats_vw.error_message is 'Optional Error messages from this Test Run.'; -comment on column wt_test_run_stats_vw.yield_pct is 'Percentage of successful test cases to total Test Cases.'; -comment on column wt_test_run_stats_vw.testcases is 'Total number of Test Cases.'; -comment on column wt_test_run_stats_vw.passes is 'Number of passed Test Cases.'; -comment on column wt_test_run_stats_vw.failures is 'Number of failed Test Cases.'; -comment on column wt_test_run_stats_vw.min_interval_msecs is 'Minimum tot_interval_msecs between assertions across all Test Cases'; -comment on column wt_test_run_stats_vw.avg_interval_msecs is 'Average tot_interval_msecs between assertions across all Test Cases'; -comment on column wt_test_run_stats_vw.max_interval_msecs is 'Maximum tot_interval_msecs between assertions across all Test Cases'; -comment on column wt_test_run_stats_vw.tot_interval_msecs is 'Total (sum) of tot_interval_msecs between assertions across all Test Cases'; - -grant select on wt_test_run_stats_vw to public; \ No newline at end of file diff --git a/src/persist/wt_test_runs.tab b/src/persist/wt_test_runs.tab index e00ee90..3396f55 100644 --- a/src/persist/wt_test_runs.tab +++ b/src/persist/wt_test_runs.tab @@ -8,15 +8,34 @@ create sequence wt_test_runs_seq order; grant select on wt_test_runs_seq to public; create table wt_test_runs - (id number(38) constraint wt_test_runs_nn1 not null - ,test_runner_id number(38) constraint wt_test_runs_nn2 not null - ,start_dtm timestamp constraint wt_test_runs_nn3 not null - ,end_dtm timestamp - ,dbout_id number(38) - ,trigger_offset number(6) - ,profiler_runid number - ,is_last_run varchar2(1) - ,error_message varchar2(4000) + (id number(38) constraint wt_test_runs_nn1 not null + ,test_runner_id number(38) constraint wt_test_runs_nn2 not null + ,start_dtm timestamp constraint wt_test_runs_nn3 not null + ,end_dtm timestamp constraint wt_test_runs_nn4 not null + ,yield_pct number(3) constraint wt_test_runs_nn5 not null + ,testcases number(7) constraint wt_test_runs_nn6 not null + ,failures number(7) constraint wt_test_runs_nn7 not null + ,assertions number(7) constraint wt_test_runs_nn8 not null + ,min_interval_msecs number(10) constraint wt_test_runs_nn9 not null + ,avg_interval_msecs number(10) constraint wt_test_runs_nn10 not null + ,max_interval_msecs number(10) constraint wt_test_runs_nn11 not null + ,tot_interval_msecs number(10) constraint wt_test_runs_nn12 not null + ,dbout_id number(38) + ,trigger_offset number(6) + ,profiler_runid number + ,coverage_pct number(3) + ,profiled_lines number(6) + ,executed_lines number(6) + ,ignored_lines number(6) + ,excluded_lines number(6) + ,notexec_lines number(6) + ,unknown_lines number(6) + ,min_executed_usecs number(11) + ,avg_executed_usecs number(11) + ,max_executed_usecs number(11) + ,tot_executed_usecs number(11) + ,is_last_run varchar2(1) + ,error_message varchar2(4000) ,constraint wt_test_runs_pk primary key (id) ,constraint wt_test_runs_nk1 unique (test_runner_id, start_dtm) ,constraint wt_test_runs_fk1 foreign key (test_runner_id) @@ -25,7 +44,26 @@ create table wt_test_runs references wt_dbouts (id) ,constraint wt_test_runs_fk3 foreign key (profiler_runid) references plsql_profiler_runs (runid) disable + ,constraint wt_test_runs_ck1 check (yield_pct = trunc(100*passes/testcases)) + ,constraint wt_test_runs_ck2 check (testcases = passes + failures) + ,constraint wt_test_runs_ck3 check (passes >= 0) + ,constraint wt_test_runs_ck4 check (failures >= 0) + ,constraint wt_test_runs_ck5 check (min_interval_msecs >= 0) + ,constraint wt_test_runs_ck6 check (avg_interval_msecs >= min_interval_msecs) + ,constraint wt_test_runs_ck7 check (max_interval_msecs >= avg_interval_msecs) + ,constraint wt_test_runs_ck8 check (tot_interval_msecs >= max_interval_msecs) ,constraint wt_test_runs_ck1 check (trigger_offset >= 0) + ,constraint wt_profiler_ck2 check (coverage_pct between 0 and 100) + ,constraint wt_profiler_ck3 check (profiled_lines >= 0) + ,constraint wt_profiler_ck4 check (executed_lines >= 0) + ,constraint wt_profiler_ck5 check (ignored_lines >= 0) + ,constraint wt_profiler_ck6 check (excluded_lines >= 0) + ,constraint wt_profiler_ck7 check (notexec_lines >= 0) + ,constraint wt_profiler_ck8 check (unknown_lines >= 0) + ,constraint wt_profiler_ck9 check (min_executed_usecs >= 0) + ,constraint wt_profiler_ck10 check (avg_executed_usecs >= min_executed_usecs) + ,constraint wt_profiler_ck11 check (max_executed_usecs >= avg_executed_usecs) + ,constraint wt_profiler_ck11 check (tot_executed_usecs >= max_executed_usecs) ,constraint wt_test_runs_ck2 check (is_last_run = 'Y') ) pctfree 0; @@ -40,9 +78,28 @@ comment on column wt_test_runs.id is 'Primary (Surrogate) Key for each Test Run' comment on column wt_test_runs.test_runner_id is 'Surrogate Key the Test Runner package. Natural Key 1 part 1'; comment on column wt_test_runs.start_dtm is 'Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 2'; comment on column wt_test_runs.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; +comment on column wt_test_runs.yield_pct is 'Percentage of successful test cases to total Test Cases.'; +comment on column wt_test_runs.testcases is 'Total number of Test Cases.'; +comment on column wt_test_runs.failures is 'Number of failed Test Cases.'; +comment on column wt_test_runs.passes is 'Number of Test Assertions.'; +comment on column wt_test_runs.min_interval_msecs is 'Minimum tot_interval_msecs between assertions across all Test Cases'; +comment on column wt_test_runs.avg_interval_msecs is 'Average tot_interval_msecs between assertions across all Test Cases'; +comment on column wt_test_runs.max_interval_msecs is 'Maximum tot_interval_msecs between assertions across all Test Cases'; +comment on column wt_test_runs.tot_interval_msecs is 'Total (sum) of tot_interval_msecs between assertions across all Test Cases'; comment on column wt_test_runs.dbout_id is 'Optional Surrogate Key to the Database Object Under Test (DBOUT).'; comment on column wt_test_runs.trigger_offset is 'Optional calculated offset from start of Trigger Source to start of Trigger PL/SQL Block.'; comment on column wt_test_runs.profiler_runid is 'Optional DBMS_PROFILER unique run identifier from plsql_profiler_runnumber sequence'; +comment on column wt_profiler.coverage_pct is 'Percentage of executed source lines to valid executable source lines.'; +comment on column wt_profiler.profiled_lines is 'Total number of source lines as counted by DBMS_PROFILER'; +comment on column wt_profiler.executed_lines is 'Number of source lines executed'; +comment on column wt_profiler.ignored_lines is 'Number of source lines ignored as uncountable'; +comment on column wt_profiler.excluded_lines is 'Number of source lines excluded due to unexplained DBMS_PROFILER metrics'; +comment on column wt_profiler.notexec_lines is 'Number of source lines not executed'; +comment on column wt_profiler.unknown_lines is 'Number of source lines that have unexplained DBMS_PROFILER metrics'; +comment on column wt_profiler.min_executed_usecs is 'Minumum execution time for a line of source in microseconds'; +comment on column wt_profiler.avg_executed_usecs is 'Average execution time for a line of source in microseconds'; +comment on column wt_profiler.max_executed_usecs is 'Maximum execution time for a line of source in microseconds'; +comment on column wt_profiler.tot_executed_usecs is 'Total (Sum) of execution times for a line of source in microseconds'; comment on column wt_test_runs.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; comment on column wt_test_runs.error_message is 'Optional Error messages from this Test Run.'; diff --git a/src/persist/wt_test_runs_vw.vw b/src/persist/wt_test_runs_vw.vw index 2a446bd..be92d10 100644 --- a/src/persist/wt_test_runs_vw.vw +++ b/src/persist/wt_test_runs_vw.vw @@ -12,6 +12,14 @@ select tr.id TEST_RUN_ID ,tr.start_dtm ,tr.end_dtm ,tr.error_message + ,stat.yield_pct + ,stat.testcases + ,stat.passes + ,stat.failures + ,stat.min_interval_msecs + ,stat.avg_interval_msecs + ,stat.max_interval_msecs + ,stat.tot_interval_msecs from wt_test_runs tr join wt_test_runners tnr on tnr.id = tr.test_runner_id; @@ -25,5 +33,13 @@ comment on column wt_test_runs_vw.is_last_run is 'Optional Flag "Y" to indicate comment on column wt_test_runs_vw.start_dtm is 'Date/time (and fractional seconds) this Test Run started.'; comment on column wt_test_runs_vw.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; comment on column wt_test_runs_vw.error_message is 'Optional Error messages from this Test Run.'; +comment on column wt_test_run_stats_vw.yield_pct is 'Percentage of successful test cases to total Test Cases.'; +comment on column wt_test_run_stats_vw.testcases is 'Total number of Test Cases.'; +comment on column wt_test_run_stats_vw.passes is 'Number of passed Test Cases.'; +comment on column wt_test_run_stats_vw.failures is 'Number of failed Test Cases.'; +comment on column wt_test_run_stats_vw.min_interval_msecs is 'Minimum tot_interval_msecs between assertions across all Test Cases'; +comment on column wt_test_run_stats_vw.avg_interval_msecs is 'Average tot_interval_msecs between assertions across all Test Cases'; +comment on column wt_test_run_stats_vw.max_interval_msecs is 'Maximum tot_interval_msecs between assertions across all Test Cases'; +comment on column wt_test_run_stats_vw.tot_interval_msecs is 'Total (sum) of tot_interval_msecs between assertions across all Test Cases'; grant select on wt_test_runs_vw to public; diff --git a/src/persist/wt_testcase_stats_vw.vw b/src/persist/wt_testcase_runs_vw.vw similarity index 98% rename from src/persist/wt_testcase_stats_vw.vw rename to src/persist/wt_testcase_runs_vw.vw index 734db41..56fb679 100644 --- a/src/persist/wt_testcase_stats_vw.vw +++ b/src/persist/wt_testcase_runs_vw.vw @@ -3,7 +3,7 @@ -- Test Cases Statistics View Installation -- -create view wt_testcase_stats_vw as +create view wt_testcase_runs_vw as select stat.test_run_id ,run.test_runner_id ,tr.runner_owner diff --git a/src/persist/wt_testcase_stats.tab b/src/persist/wt_testcase_stats.tab index 1418172..507ad24 100644 --- a/src/persist/wt_testcase_stats.tab +++ b/src/persist/wt_testcase_stats.tab @@ -1,9 +1,9 @@ -- --- Test Runs Statistics Table Installation +-- Test Case Runs Table Installation -- -create table wt_testcase_stats +create table wt_testcase_runs (test_run_id number(38) constraint wt_testcase_stats_nn1 not null ,testcase_id number(38) constraint wt_testcase_stats_nn2 not null ,yield_pct number(3) constraint wt_testcase_stats_nn3 not null From b8ac557b2e96aef4a7e4e2c9ca64e7ce048eb4f4 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Mon, 26 Nov 2018 22:59:31 -0600 Subject: [PATCH 044/141] Documentation Updates --- docs/core/Call_Tree_Diagrams.odg | Bin 27281 -> 25165 bytes docs/core/DBDocs/index/HOOKS_PK.html | 439 ++++ .../HOOKS_PK}/headerBg.jpg | Bin .../WT_PROFILER => index/HOOKS_PK}/report.css | 0 .../WT_PROFILER => index/HOOKS_PK}/report.js | 0 .../HOOKS_PK}/topDimTabBg.gif | Bin .../HOOKS_PK}/topDimTabL.gif | Bin .../HOOKS_PK}/topDimTabR.gif | Bin .../HOOKS_PK}/topTabBg.gif | Bin .../HOOKS_PK}/topTabL.gif | Bin .../HOOKS_PK}/topTabR.gif | Bin docs/core/DBDocs/index/WT_SELF_TEST_PK.html | 430 ++++ .../WT_SELF_TEST_PK}/headerBg.jpg | Bin .../WT_SELF_TEST_PK}/report.css | 0 .../WT_SELF_TEST_PK}/report.js | 0 .../WT_SELF_TEST_PK}/topDimTabBg.gif | Bin .../WT_SELF_TEST_PK}/topDimTabL.gif | Bin .../WT_SELF_TEST_PK}/topDimTabR.gif | Bin .../WT_SELF_TEST_PK}/topTabBg.gif | Bin .../WT_SELF_TEST_PK}/topTabL.gif | Bin .../WT_SELF_TEST_PK}/topTabR.gif | Bin docs/core/DBDocs/index/WT_VERSIONS_PK.html | 430 ++++ .../WT_VERSIONS_PK}/headerBg.jpg | Bin .../WT_VERSIONS_PK}/report.css | 0 .../WT_VERSIONS_PK}/report.js | 0 .../WT_VERSIONS_PK}/topDimTabBg.gif | Bin .../WT_VERSIONS_PK}/topDimTabL.gif | Bin .../WT_VERSIONS_PK}/topDimTabR.gif | Bin .../WT_VERSIONS_PK}/topTabBg.gif | Bin .../WT_VERSIONS_PK}/topTabL.gif | Bin .../WT_VERSIONS_PK}/topTabR.gif | Bin docs/core/DBDocs/index/index.html | 13 + docs/core/DBDocs/nodeTypes.html | 4 +- docs/core/DBDocs/package body/CORE_DATA.html | 784 ++++++ .../CORE_DATA}/headerBg.jpg | Bin .../CORE_DATA}/report.css | 0 .../CORE_DATA}/report.js | 0 .../CORE_DATA}/topDimTabBg.gif | Bin .../CORE_DATA}/topDimTabL.gif | Bin .../CORE_DATA}/topDimTabR.gif | Bin .../CORE_DATA}/topTabBg.gif | Bin .../CORE_DATA}/topTabL.gif | Bin .../CORE_DATA}/topTabR.gif | Bin docs/core/DBDocs/package body/HOOK.html | 425 ++++ .../HOOK}/headerBg.jpg | Bin .../HOOK}/report.css | 0 .../WT_RESULT => package body/HOOK}/report.js | 0 .../HOOK}/topDimTabBg.gif | Bin .../HOOK}/topDimTabL.gif | Bin .../HOOK}/topDimTabR.gif | Bin .../HOOK}/topTabBg.gif | Bin .../HOOK}/topTabL.gif | Bin .../HOOK}/topTabR.gif | Bin docs/core/DBDocs/package body/WTPLSQL.html | 739 +++--- docs/core/DBDocs/package body/WT_ASSERT.html | 87 +- .../core/DBDocs/package body/WT_PROFILER.html | 2167 ----------------- docs/core/DBDocs/package body/WT_RESULT.html | 666 ----- .../DBDocs/package body/WT_TEST_RUN_STAT.html | 1150 --------- .../DBDocs/package body/WT_TEXT_REPORT.html | 405 +-- docs/core/DBDocs/package body/index.html | 7 +- docs/core/DBDocs/package/CORE_DATA.html | 268 ++ .../headerBg.jpg | Bin .../report.css | 0 .../{WT_TEST_RUN_STAT => CORE_DATA}/report.js | 0 .../topDimTabBg.gif | Bin .../topDimTabL.gif | Bin .../topDimTabR.gif | Bin .../topTabBg.gif | Bin .../topTabL.gif | Bin .../topTabR.gif | Bin docs/core/DBDocs/package/HOOK.html | 237 ++ .../HOOK}/headerBg.jpg | Bin .../HOOK}/report.css | 0 .../HOOK}/report.js | 0 .../HOOK}/topDimTabBg.gif | Bin .../HOOK}/topDimTabL.gif | Bin .../HOOK}/topDimTabR.gif | Bin .../HOOK}/topTabBg.gif | Bin .../HOOK}/topTabL.gif | Bin .../HOOK}/topTabR.gif | Bin docs/core/DBDocs/package/WTPLSQL.html | 40 +- docs/core/DBDocs/package/WT_ASSERT.html | 37 +- docs/core/DBDocs/package/WT_PROFILER.html | 229 -- docs/core/DBDocs/package/WT_RESULT.html | 217 -- .../core/DBDocs/package/WT_TEST_RUN_STAT.html | 210 -- docs/core/DBDocs/package/WT_TEXT_REPORT.html | 69 +- docs/core/DBDocs/package/index.html | 7 +- .../procedure/WT_EXECUTE_TEST_RUNNER.html | 192 ++ .../WT_EXECUTE_TEST_RUNNER}/headerBg.jpg | Bin .../WT_EXECUTE_TEST_RUNNER}/report.css | 0 .../WT_EXECUTE_TEST_RUNNER}/report.js | 0 .../WT_EXECUTE_TEST_RUNNER}/topDimTabBg.gif | Bin .../WT_EXECUTE_TEST_RUNNER}/topDimTabL.gif | Bin .../WT_EXECUTE_TEST_RUNNER}/topDimTabR.gif | Bin .../WT_EXECUTE_TEST_RUNNER}/topTabBg.gif | Bin .../WT_EXECUTE_TEST_RUNNER}/topTabL.gif | Bin .../WT_EXECUTE_TEST_RUNNER}/topTabR.gif | Bin .../DBDocs/{sequence => procedure}/index.html | 5 +- .../sequence/PLSQL_PROFILER_RUNNUMBER.html | 107 - .../DBDocs/sequence/WT_TEST_RUNS_SEQ.html | 107 - .../{WT_TESTCASE_STATS.html => HOOKS.html} | 328 +-- .../headerBg.jpg | Bin .../{PLSQL_PROFILER_DATA => HOOKS}/report.css | 0 .../{PLSQL_PROFILER_DATA => HOOKS}/report.js | 0 .../topDimTabBg.gif | Bin .../topDimTabL.gif | Bin .../topDimTabR.gif | Bin .../topTabBg.gif | Bin .../topTabL.gif | Bin .../topTabR.gif | Bin .../DBDocs/table/PLSQL_PROFILER_DATA.html | 799 ------ .../DBDocs/table/PLSQL_PROFILER_RUNS.html | 722 ------ .../DBDocs/table/PLSQL_PROFILER_UNITS.html | 763 ------ docs/core/DBDocs/table/WT_DBOUT_PROFILES.html | 1096 --------- .../table/WT_DBOUT_PROFILES/headerBg.jpg | Bin 13911 -> 0 bytes .../DBDocs/table/WT_DBOUT_PROFILES/report.css | 149 -- .../DBDocs/table/WT_DBOUT_PROFILES/report.js | 148 -- .../table/WT_DBOUT_PROFILES/topDimTabBg.gif | Bin 149 -> 0 bytes .../table/WT_DBOUT_PROFILES/topDimTabL.gif | Bin 579 -> 0 bytes .../table/WT_DBOUT_PROFILES/topDimTabR.gif | Bin 580 -> 0 bytes .../table/WT_DBOUT_PROFILES/topTabBg.gif | Bin 95 -> 0 bytes .../table/WT_DBOUT_PROFILES/topTabL.gif | Bin 330 -> 0 bytes .../table/WT_DBOUT_PROFILES/topTabR.gif | Bin 332 -> 0 bytes docs/core/DBDocs/table/WT_RESULTS.html | 1155 --------- .../core/DBDocs/table/WT_RESULTS/headerBg.jpg | Bin 13911 -> 0 bytes docs/core/DBDocs/table/WT_RESULTS/report.css | 149 -- docs/core/DBDocs/table/WT_RESULTS/report.js | 148 -- .../DBDocs/table/WT_RESULTS/topDimTabBg.gif | Bin 149 -> 0 bytes .../DBDocs/table/WT_RESULTS/topDimTabL.gif | Bin 579 -> 0 bytes .../DBDocs/table/WT_RESULTS/topDimTabR.gif | Bin 580 -> 0 bytes .../core/DBDocs/table/WT_RESULTS/topTabBg.gif | Bin 95 -> 0 bytes docs/core/DBDocs/table/WT_RESULTS/topTabL.gif | Bin 330 -> 0 bytes docs/core/DBDocs/table/WT_RESULTS/topTabR.gif | Bin 332 -> 0 bytes docs/core/DBDocs/table/WT_SELF_TEST.html | 51 +- .../table/WT_TESTCASE_STATS/headerBg.jpg | Bin 13911 -> 0 bytes .../DBDocs/table/WT_TESTCASE_STATS/report.css | 149 -- .../DBDocs/table/WT_TESTCASE_STATS/report.js | 148 -- .../table/WT_TESTCASE_STATS/topDimTabBg.gif | Bin 149 -> 0 bytes .../table/WT_TESTCASE_STATS/topDimTabL.gif | Bin 579 -> 0 bytes .../table/WT_TESTCASE_STATS/topDimTabR.gif | Bin 580 -> 0 bytes .../table/WT_TESTCASE_STATS/topTabBg.gif | Bin 95 -> 0 bytes .../table/WT_TESTCASE_STATS/topTabL.gif | Bin 330 -> 0 bytes .../table/WT_TESTCASE_STATS/topTabR.gif | Bin 332 -> 0 bytes docs/core/DBDocs/table/WT_TEST_RUNS.html | 1156 --------- .../DBDocs/table/WT_TEST_RUNS/headerBg.jpg | Bin 13911 -> 0 bytes .../core/DBDocs/table/WT_TEST_RUNS/report.css | 149 -- docs/core/DBDocs/table/WT_TEST_RUNS/report.js | 148 -- .../DBDocs/table/WT_TEST_RUNS/topDimTabBg.gif | Bin 149 -> 0 bytes .../DBDocs/table/WT_TEST_RUNS/topDimTabL.gif | Bin 579 -> 0 bytes .../DBDocs/table/WT_TEST_RUNS/topDimTabR.gif | Bin 580 -> 0 bytes .../DBDocs/table/WT_TEST_RUNS/topTabBg.gif | Bin 95 -> 0 bytes .../DBDocs/table/WT_TEST_RUNS/topTabL.gif | Bin 330 -> 0 bytes .../DBDocs/table/WT_TEST_RUNS/topTabR.gif | Bin 332 -> 0 bytes docs/core/DBDocs/table/WT_TEST_RUN_STATS.html | 886 ------- .../table/WT_TEST_RUN_STATS/headerBg.jpg | Bin 13911 -> 0 bytes .../DBDocs/table/WT_TEST_RUN_STATS/report.css | 149 -- .../DBDocs/table/WT_TEST_RUN_STATS/report.js | 148 -- .../table/WT_TEST_RUN_STATS/topDimTabBg.gif | Bin 149 -> 0 bytes .../table/WT_TEST_RUN_STATS/topDimTabL.gif | Bin 579 -> 0 bytes .../table/WT_TEST_RUN_STATS/topDimTabR.gif | Bin 580 -> 0 bytes .../table/WT_TEST_RUN_STATS/topTabBg.gif | Bin 95 -> 0 bytes .../table/WT_TEST_RUN_STATS/topTabL.gif | Bin 330 -> 0 bytes .../table/WT_TEST_RUN_STATS/topTabR.gif | Bin 332 -> 0 bytes .../core/DBDocs/table/WT_VERSION/headerBg.jpg | Bin 13911 -> 0 bytes docs/core/DBDocs/table/WT_VERSION/report.css | 149 -- docs/core/DBDocs/table/WT_VERSION/report.js | 148 -- .../DBDocs/table/WT_VERSION/topDimTabBg.gif | Bin 149 -> 0 bytes .../DBDocs/table/WT_VERSION/topDimTabL.gif | Bin 579 -> 0 bytes .../DBDocs/table/WT_VERSION/topDimTabR.gif | Bin 580 -> 0 bytes .../core/DBDocs/table/WT_VERSION/topTabBg.gif | Bin 95 -> 0 bytes docs/core/DBDocs/table/WT_VERSION/topTabL.gif | Bin 330 -> 0 bytes docs/core/DBDocs/table/WT_VERSION/topTabR.gif | Bin 332 -> 0 bytes .../{WT_VERSION.html => WT_VERSIONS.html} | 161 +- .../headerBg.jpg | Bin .../report.css | 0 .../report.js | 0 .../topDimTabBg.gif | Bin .../topDimTabL.gif | Bin .../topDimTabR.gif | Bin .../topTabBg.gif | Bin .../topTabL.gif | Bin .../topTabR.gif | Bin docs/core/DBDocs/table/index.html | 11 +- .../DBDocs/trigger/WT_SELF_TEST%24TEST.html | 166 ++ .../WT_SELF_TEST%24TEST}/headerBg.jpg | Bin .../WT_SELF_TEST%24TEST}/report.css | 0 .../WT_SELF_TEST%24TEST}/report.js | 0 .../WT_SELF_TEST%24TEST}/topDimTabBg.gif | Bin .../WT_SELF_TEST%24TEST}/topDimTabL.gif | Bin .../WT_SELF_TEST%24TEST}/topDimTabR.gif | Bin .../WT_SELF_TEST%24TEST}/topTabBg.gif | Bin .../WT_SELF_TEST%24TEST}/topTabL.gif | Bin .../WT_SELF_TEST%24TEST}/topTabR.gif | Bin docs/core/DBDocs/trigger/index.html | 11 + docs/core/README.md | 11 + .../V1.1.0/downgrade_to_V1.0.0/README.txt | 0 .../V1.1.0/upgrade_from_V1.0.0/README.txt | 0 .../upgrade_from_V1.0.0/RELEASE_NOTES.txt | 0 .../upgrade_from_V1.0.0/update_all_stats.sql | 0 .../V1.1.0/upgrade_from_V1.0.0/upgrade.sql | 0 .../V1.1.0/upgrade_from_V1.0.0/upgradeO.LST | 0 .../V1.2.0/upgrade_from_V1.1.0/README.txt | 0 .../upgrade_from_V1.1.0/RELEASE_NOTES.txt | 0 203 files changed, 4291 insertions(+), 14278 deletions(-) create mode 100644 docs/core/DBDocs/index/HOOKS_PK.html rename docs/core/DBDocs/{package body/WT_PROFILER => index/HOOKS_PK}/headerBg.jpg (100%) rename docs/core/DBDocs/{package body/WT_PROFILER => index/HOOKS_PK}/report.css (100%) rename docs/core/DBDocs/{package body/WT_PROFILER => index/HOOKS_PK}/report.js (100%) rename docs/core/DBDocs/{package body/WT_PROFILER => index/HOOKS_PK}/topDimTabBg.gif (100%) rename docs/core/DBDocs/{package body/WT_PROFILER => index/HOOKS_PK}/topDimTabL.gif (100%) rename docs/core/DBDocs/{package body/WT_PROFILER => index/HOOKS_PK}/topDimTabR.gif (100%) rename docs/core/DBDocs/{package body/WT_PROFILER => index/HOOKS_PK}/topTabBg.gif (100%) rename docs/core/DBDocs/{package body/WT_PROFILER => index/HOOKS_PK}/topTabL.gif (100%) rename docs/core/DBDocs/{package body/WT_PROFILER => index/HOOKS_PK}/topTabR.gif (100%) create mode 100644 docs/core/DBDocs/index/WT_SELF_TEST_PK.html rename docs/core/DBDocs/{package body/WT_RESULT => index/WT_SELF_TEST_PK}/headerBg.jpg (100%) rename docs/core/DBDocs/{package body/WT_RESULT => index/WT_SELF_TEST_PK}/report.css (100%) rename docs/core/DBDocs/{package body/WT_RESULT => index/WT_SELF_TEST_PK}/report.js (100%) rename docs/core/DBDocs/{package body/WT_RESULT => index/WT_SELF_TEST_PK}/topDimTabBg.gif (100%) rename docs/core/DBDocs/{package body/WT_RESULT => index/WT_SELF_TEST_PK}/topDimTabL.gif (100%) rename docs/core/DBDocs/{package body/WT_RESULT => index/WT_SELF_TEST_PK}/topDimTabR.gif (100%) rename docs/core/DBDocs/{package body/WT_RESULT => index/WT_SELF_TEST_PK}/topTabBg.gif (100%) rename docs/core/DBDocs/{package body/WT_RESULT => index/WT_SELF_TEST_PK}/topTabL.gif (100%) rename docs/core/DBDocs/{package body/WT_RESULT => index/WT_SELF_TEST_PK}/topTabR.gif (100%) create mode 100644 docs/core/DBDocs/index/WT_VERSIONS_PK.html rename docs/core/DBDocs/{package body/WT_TEST_RUN_STAT => index/WT_VERSIONS_PK}/headerBg.jpg (100%) rename docs/core/DBDocs/{package body/WT_TEST_RUN_STAT => index/WT_VERSIONS_PK}/report.css (100%) rename docs/core/DBDocs/{package body/WT_TEST_RUN_STAT => index/WT_VERSIONS_PK}/report.js (100%) rename docs/core/DBDocs/{package body/WT_TEST_RUN_STAT => index/WT_VERSIONS_PK}/topDimTabBg.gif (100%) rename docs/core/DBDocs/{package body/WT_TEST_RUN_STAT => index/WT_VERSIONS_PK}/topDimTabL.gif (100%) rename docs/core/DBDocs/{package body/WT_TEST_RUN_STAT => index/WT_VERSIONS_PK}/topDimTabR.gif (100%) rename docs/core/DBDocs/{package body/WT_TEST_RUN_STAT => index/WT_VERSIONS_PK}/topTabBg.gif (100%) rename docs/core/DBDocs/{package body/WT_TEST_RUN_STAT => index/WT_VERSIONS_PK}/topTabL.gif (100%) rename docs/core/DBDocs/{package body/WT_TEST_RUN_STAT => index/WT_VERSIONS_PK}/topTabR.gif (100%) create mode 100644 docs/core/DBDocs/index/index.html create mode 100644 docs/core/DBDocs/package body/CORE_DATA.html rename docs/core/DBDocs/{package/WT_PROFILER => package body/CORE_DATA}/headerBg.jpg (100%) rename docs/core/DBDocs/{package/WT_PROFILER => package body/CORE_DATA}/report.css (100%) rename docs/core/DBDocs/{package/WT_PROFILER => package body/CORE_DATA}/report.js (100%) rename docs/core/DBDocs/{package/WT_PROFILER => package body/CORE_DATA}/topDimTabBg.gif (100%) rename docs/core/DBDocs/{package/WT_PROFILER => package body/CORE_DATA}/topDimTabL.gif (100%) rename docs/core/DBDocs/{package/WT_PROFILER => package body/CORE_DATA}/topDimTabR.gif (100%) rename docs/core/DBDocs/{package/WT_PROFILER => package body/CORE_DATA}/topTabBg.gif (100%) rename docs/core/DBDocs/{package/WT_PROFILER => package body/CORE_DATA}/topTabL.gif (100%) rename docs/core/DBDocs/{package/WT_PROFILER => package body/CORE_DATA}/topTabR.gif (100%) create mode 100644 docs/core/DBDocs/package body/HOOK.html rename docs/core/DBDocs/{package/WT_RESULT => package body/HOOK}/headerBg.jpg (100%) rename docs/core/DBDocs/{package/WT_RESULT => package body/HOOK}/report.css (100%) rename docs/core/DBDocs/{package/WT_RESULT => package body/HOOK}/report.js (100%) rename docs/core/DBDocs/{package/WT_RESULT => package body/HOOK}/topDimTabBg.gif (100%) rename docs/core/DBDocs/{package/WT_RESULT => package body/HOOK}/topDimTabL.gif (100%) rename docs/core/DBDocs/{package/WT_RESULT => package body/HOOK}/topDimTabR.gif (100%) rename docs/core/DBDocs/{package/WT_RESULT => package body/HOOK}/topTabBg.gif (100%) rename docs/core/DBDocs/{package/WT_RESULT => package body/HOOK}/topTabL.gif (100%) rename docs/core/DBDocs/{package/WT_RESULT => package body/HOOK}/topTabR.gif (100%) delete mode 100644 docs/core/DBDocs/package body/WT_PROFILER.html delete mode 100644 docs/core/DBDocs/package body/WT_RESULT.html delete mode 100644 docs/core/DBDocs/package body/WT_TEST_RUN_STAT.html create mode 100644 docs/core/DBDocs/package/CORE_DATA.html rename docs/core/DBDocs/package/{WT_TEST_RUN_STAT => CORE_DATA}/headerBg.jpg (100%) rename docs/core/DBDocs/package/{WT_TEST_RUN_STAT => CORE_DATA}/report.css (100%) rename docs/core/DBDocs/package/{WT_TEST_RUN_STAT => CORE_DATA}/report.js (100%) rename docs/core/DBDocs/package/{WT_TEST_RUN_STAT => CORE_DATA}/topDimTabBg.gif (100%) rename docs/core/DBDocs/package/{WT_TEST_RUN_STAT => CORE_DATA}/topDimTabL.gif (100%) rename docs/core/DBDocs/package/{WT_TEST_RUN_STAT => CORE_DATA}/topDimTabR.gif (100%) rename docs/core/DBDocs/package/{WT_TEST_RUN_STAT => CORE_DATA}/topTabBg.gif (100%) rename docs/core/DBDocs/package/{WT_TEST_RUN_STAT => CORE_DATA}/topTabL.gif (100%) rename docs/core/DBDocs/package/{WT_TEST_RUN_STAT => CORE_DATA}/topTabR.gif (100%) create mode 100644 docs/core/DBDocs/package/HOOK.html rename docs/core/DBDocs/{sequence/PLSQL_PROFILER_RUNNUMBER => package/HOOK}/headerBg.jpg (100%) rename docs/core/DBDocs/{sequence/PLSQL_PROFILER_RUNNUMBER => package/HOOK}/report.css (100%) rename docs/core/DBDocs/{sequence/PLSQL_PROFILER_RUNNUMBER => package/HOOK}/report.js (100%) rename docs/core/DBDocs/{sequence/PLSQL_PROFILER_RUNNUMBER => package/HOOK}/topDimTabBg.gif (100%) rename docs/core/DBDocs/{sequence/PLSQL_PROFILER_RUNNUMBER => package/HOOK}/topDimTabL.gif (100%) rename docs/core/DBDocs/{sequence/PLSQL_PROFILER_RUNNUMBER => package/HOOK}/topDimTabR.gif (100%) rename docs/core/DBDocs/{sequence/PLSQL_PROFILER_RUNNUMBER => package/HOOK}/topTabBg.gif (100%) rename docs/core/DBDocs/{sequence/PLSQL_PROFILER_RUNNUMBER => package/HOOK}/topTabL.gif (100%) rename docs/core/DBDocs/{sequence/PLSQL_PROFILER_RUNNUMBER => package/HOOK}/topTabR.gif (100%) delete mode 100644 docs/core/DBDocs/package/WT_PROFILER.html delete mode 100644 docs/core/DBDocs/package/WT_RESULT.html delete mode 100644 docs/core/DBDocs/package/WT_TEST_RUN_STAT.html create mode 100644 docs/core/DBDocs/procedure/WT_EXECUTE_TEST_RUNNER.html rename docs/core/DBDocs/{sequence/WT_TEST_RUNS_SEQ => procedure/WT_EXECUTE_TEST_RUNNER}/headerBg.jpg (100%) rename docs/core/DBDocs/{sequence/WT_TEST_RUNS_SEQ => procedure/WT_EXECUTE_TEST_RUNNER}/report.css (100%) rename docs/core/DBDocs/{sequence/WT_TEST_RUNS_SEQ => procedure/WT_EXECUTE_TEST_RUNNER}/report.js (100%) rename docs/core/DBDocs/{sequence/WT_TEST_RUNS_SEQ => procedure/WT_EXECUTE_TEST_RUNNER}/topDimTabBg.gif (100%) rename docs/core/DBDocs/{sequence/WT_TEST_RUNS_SEQ => procedure/WT_EXECUTE_TEST_RUNNER}/topDimTabL.gif (100%) rename docs/core/DBDocs/{sequence/WT_TEST_RUNS_SEQ => procedure/WT_EXECUTE_TEST_RUNNER}/topDimTabR.gif (100%) rename docs/core/DBDocs/{sequence/WT_TEST_RUNS_SEQ => procedure/WT_EXECUTE_TEST_RUNNER}/topTabBg.gif (100%) rename docs/core/DBDocs/{sequence/WT_TEST_RUNS_SEQ => procedure/WT_EXECUTE_TEST_RUNNER}/topTabL.gif (100%) rename docs/core/DBDocs/{sequence/WT_TEST_RUNS_SEQ => procedure/WT_EXECUTE_TEST_RUNNER}/topTabR.gif (100%) rename docs/core/DBDocs/{sequence => procedure}/index.html (57%) delete mode 100644 docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER.html delete mode 100644 docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ.html rename docs/core/DBDocs/table/{WT_TESTCASE_STATS.html => HOOKS.html} (66%) rename docs/core/DBDocs/table/{PLSQL_PROFILER_DATA => HOOKS}/headerBg.jpg (100%) rename docs/core/DBDocs/table/{PLSQL_PROFILER_DATA => HOOKS}/report.css (100%) rename docs/core/DBDocs/table/{PLSQL_PROFILER_DATA => HOOKS}/report.js (100%) rename docs/core/DBDocs/table/{PLSQL_PROFILER_DATA => HOOKS}/topDimTabBg.gif (100%) rename docs/core/DBDocs/table/{PLSQL_PROFILER_DATA => HOOKS}/topDimTabL.gif (100%) rename docs/core/DBDocs/table/{PLSQL_PROFILER_DATA => HOOKS}/topDimTabR.gif (100%) rename docs/core/DBDocs/table/{PLSQL_PROFILER_DATA => HOOKS}/topTabBg.gif (100%) rename docs/core/DBDocs/table/{PLSQL_PROFILER_DATA => HOOKS}/topTabL.gif (100%) rename docs/core/DBDocs/table/{PLSQL_PROFILER_DATA => HOOKS}/topTabR.gif (100%) delete mode 100644 docs/core/DBDocs/table/PLSQL_PROFILER_DATA.html delete mode 100644 docs/core/DBDocs/table/PLSQL_PROFILER_RUNS.html delete mode 100644 docs/core/DBDocs/table/PLSQL_PROFILER_UNITS.html delete mode 100644 docs/core/DBDocs/table/WT_DBOUT_PROFILES.html delete mode 100644 docs/core/DBDocs/table/WT_DBOUT_PROFILES/headerBg.jpg delete mode 100644 docs/core/DBDocs/table/WT_DBOUT_PROFILES/report.css delete mode 100644 docs/core/DBDocs/table/WT_DBOUT_PROFILES/report.js delete mode 100644 docs/core/DBDocs/table/WT_DBOUT_PROFILES/topDimTabBg.gif delete mode 100644 docs/core/DBDocs/table/WT_DBOUT_PROFILES/topDimTabL.gif delete mode 100644 docs/core/DBDocs/table/WT_DBOUT_PROFILES/topDimTabR.gif delete mode 100644 docs/core/DBDocs/table/WT_DBOUT_PROFILES/topTabBg.gif delete mode 100644 docs/core/DBDocs/table/WT_DBOUT_PROFILES/topTabL.gif delete mode 100644 docs/core/DBDocs/table/WT_DBOUT_PROFILES/topTabR.gif delete mode 100644 docs/core/DBDocs/table/WT_RESULTS.html delete mode 100644 docs/core/DBDocs/table/WT_RESULTS/headerBg.jpg delete mode 100644 docs/core/DBDocs/table/WT_RESULTS/report.css delete mode 100644 docs/core/DBDocs/table/WT_RESULTS/report.js delete mode 100644 docs/core/DBDocs/table/WT_RESULTS/topDimTabBg.gif delete mode 100644 docs/core/DBDocs/table/WT_RESULTS/topDimTabL.gif delete mode 100644 docs/core/DBDocs/table/WT_RESULTS/topDimTabR.gif delete mode 100644 docs/core/DBDocs/table/WT_RESULTS/topTabBg.gif delete mode 100644 docs/core/DBDocs/table/WT_RESULTS/topTabL.gif delete mode 100644 docs/core/DBDocs/table/WT_RESULTS/topTabR.gif delete mode 100644 docs/core/DBDocs/table/WT_TESTCASE_STATS/headerBg.jpg delete mode 100644 docs/core/DBDocs/table/WT_TESTCASE_STATS/report.css delete mode 100644 docs/core/DBDocs/table/WT_TESTCASE_STATS/report.js delete mode 100644 docs/core/DBDocs/table/WT_TESTCASE_STATS/topDimTabBg.gif delete mode 100644 docs/core/DBDocs/table/WT_TESTCASE_STATS/topDimTabL.gif delete mode 100644 docs/core/DBDocs/table/WT_TESTCASE_STATS/topDimTabR.gif delete mode 100644 docs/core/DBDocs/table/WT_TESTCASE_STATS/topTabBg.gif delete mode 100644 docs/core/DBDocs/table/WT_TESTCASE_STATS/topTabL.gif delete mode 100644 docs/core/DBDocs/table/WT_TESTCASE_STATS/topTabR.gif delete mode 100644 docs/core/DBDocs/table/WT_TEST_RUNS.html delete mode 100644 docs/core/DBDocs/table/WT_TEST_RUNS/headerBg.jpg delete mode 100644 docs/core/DBDocs/table/WT_TEST_RUNS/report.css delete mode 100644 docs/core/DBDocs/table/WT_TEST_RUNS/report.js delete mode 100644 docs/core/DBDocs/table/WT_TEST_RUNS/topDimTabBg.gif delete mode 100644 docs/core/DBDocs/table/WT_TEST_RUNS/topDimTabL.gif delete mode 100644 docs/core/DBDocs/table/WT_TEST_RUNS/topDimTabR.gif delete mode 100644 docs/core/DBDocs/table/WT_TEST_RUNS/topTabBg.gif delete mode 100644 docs/core/DBDocs/table/WT_TEST_RUNS/topTabL.gif delete mode 100644 docs/core/DBDocs/table/WT_TEST_RUNS/topTabR.gif delete mode 100644 docs/core/DBDocs/table/WT_TEST_RUN_STATS.html delete mode 100644 docs/core/DBDocs/table/WT_TEST_RUN_STATS/headerBg.jpg delete mode 100644 docs/core/DBDocs/table/WT_TEST_RUN_STATS/report.css delete mode 100644 docs/core/DBDocs/table/WT_TEST_RUN_STATS/report.js delete mode 100644 docs/core/DBDocs/table/WT_TEST_RUN_STATS/topDimTabBg.gif delete mode 100644 docs/core/DBDocs/table/WT_TEST_RUN_STATS/topDimTabL.gif delete mode 100644 docs/core/DBDocs/table/WT_TEST_RUN_STATS/topDimTabR.gif delete mode 100644 docs/core/DBDocs/table/WT_TEST_RUN_STATS/topTabBg.gif delete mode 100644 docs/core/DBDocs/table/WT_TEST_RUN_STATS/topTabL.gif delete mode 100644 docs/core/DBDocs/table/WT_TEST_RUN_STATS/topTabR.gif delete mode 100644 docs/core/DBDocs/table/WT_VERSION/headerBg.jpg delete mode 100644 docs/core/DBDocs/table/WT_VERSION/report.css delete mode 100644 docs/core/DBDocs/table/WT_VERSION/report.js delete mode 100644 docs/core/DBDocs/table/WT_VERSION/topDimTabBg.gif delete mode 100644 docs/core/DBDocs/table/WT_VERSION/topDimTabL.gif delete mode 100644 docs/core/DBDocs/table/WT_VERSION/topDimTabR.gif delete mode 100644 docs/core/DBDocs/table/WT_VERSION/topTabBg.gif delete mode 100644 docs/core/DBDocs/table/WT_VERSION/topTabL.gif delete mode 100644 docs/core/DBDocs/table/WT_VERSION/topTabR.gif rename docs/core/DBDocs/table/{WT_VERSION.html => WT_VERSIONS.html} (72%) rename docs/core/DBDocs/table/{PLSQL_PROFILER_RUNS => WT_VERSIONS}/headerBg.jpg (100%) rename docs/core/DBDocs/table/{PLSQL_PROFILER_RUNS => WT_VERSIONS}/report.css (100%) rename docs/core/DBDocs/table/{PLSQL_PROFILER_RUNS => WT_VERSIONS}/report.js (100%) rename docs/core/DBDocs/table/{PLSQL_PROFILER_RUNS => WT_VERSIONS}/topDimTabBg.gif (100%) rename docs/core/DBDocs/table/{PLSQL_PROFILER_RUNS => WT_VERSIONS}/topDimTabL.gif (100%) rename docs/core/DBDocs/table/{PLSQL_PROFILER_RUNS => WT_VERSIONS}/topDimTabR.gif (100%) rename docs/core/DBDocs/table/{PLSQL_PROFILER_RUNS => WT_VERSIONS}/topTabBg.gif (100%) rename docs/core/DBDocs/table/{PLSQL_PROFILER_RUNS => WT_VERSIONS}/topTabL.gif (100%) rename docs/core/DBDocs/table/{PLSQL_PROFILER_RUNS => WT_VERSIONS}/topTabR.gif (100%) create mode 100644 docs/core/DBDocs/trigger/WT_SELF_TEST%24TEST.html rename docs/core/DBDocs/{table/PLSQL_PROFILER_UNITS => trigger/WT_SELF_TEST%24TEST}/headerBg.jpg (100%) rename docs/core/DBDocs/{table/PLSQL_PROFILER_UNITS => trigger/WT_SELF_TEST%24TEST}/report.css (100%) rename docs/core/DBDocs/{table/PLSQL_PROFILER_UNITS => trigger/WT_SELF_TEST%24TEST}/report.js (100%) rename docs/core/DBDocs/{table/PLSQL_PROFILER_UNITS => trigger/WT_SELF_TEST%24TEST}/topDimTabBg.gif (100%) rename docs/core/DBDocs/{table/PLSQL_PROFILER_UNITS => trigger/WT_SELF_TEST%24TEST}/topDimTabL.gif (100%) rename docs/core/DBDocs/{table/PLSQL_PROFILER_UNITS => trigger/WT_SELF_TEST%24TEST}/topDimTabR.gif (100%) rename docs/core/DBDocs/{table/PLSQL_PROFILER_UNITS => trigger/WT_SELF_TEST%24TEST}/topTabBg.gif (100%) rename docs/core/DBDocs/{table/PLSQL_PROFILER_UNITS => trigger/WT_SELF_TEST%24TEST}/topTabL.gif (100%) rename docs/core/DBDocs/{table/PLSQL_PROFILER_UNITS => trigger/WT_SELF_TEST%24TEST}/topTabR.gif (100%) create mode 100644 docs/core/DBDocs/trigger/index.html rename src/{core => persist}/releases/V1.1.0/downgrade_to_V1.0.0/README.txt (100%) rename src/{core => persist}/releases/V1.1.0/upgrade_from_V1.0.0/README.txt (100%) rename src/{core => persist}/releases/V1.1.0/upgrade_from_V1.0.0/RELEASE_NOTES.txt (100%) rename src/{core => persist}/releases/V1.1.0/upgrade_from_V1.0.0/update_all_stats.sql (100%) rename src/{core => persist}/releases/V1.1.0/upgrade_from_V1.0.0/upgrade.sql (100%) rename src/{core => persist}/releases/V1.1.0/upgrade_from_V1.0.0/upgradeO.LST (100%) rename src/{core => persist}/releases/V1.2.0/upgrade_from_V1.1.0/README.txt (100%) rename src/{core => persist}/releases/V1.2.0/upgrade_from_V1.1.0/RELEASE_NOTES.txt (100%) diff --git a/docs/core/Call_Tree_Diagrams.odg b/docs/core/Call_Tree_Diagrams.odg index 8da667664280d54b7fd93976a9144f657d06f21c..ad4e13a0500e37303a07444bc1c666a16ad33c71 100644 GIT binary patch delta 23423 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 delta 25540 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 Yzvuhee_B1ADTCk~7PJ_f)_-gN4{hUl6951J diff --git a/docs/core/DBDocs/index/HOOKS_PK.html b/docs/core/DBDocs/index/HOOKS_PK.html new file mode 100644 index 0000000..b5d0778 --- /dev/null +++ b/docs/core/DBDocs/index/HOOKS_PK.html @@ -0,0 +1,439 @@ + + + + + + + + +
    +
    +
    +

    Columns

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Statistics

    +
    +
    +
    +
    +

    Partitions

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONDESCEND
    WTPHOOKS_PKWTPHOOKSHOOK_NAME1ASC
    WTPHOOKS_PKWTPHOOKSSEQ2ASC
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    CREATED25-NOV-2018 19:55:40
    LAST_DDL_TIME25-NOV-2018 19:55:40
    OWNERWTP
    INDEX_NAMEHOOKS_PK
    INDEX_TYPENORMAL
    TABLE_OWNERWTP
    TABLE_NAMEHOOKS
    TABLE_TYPETABLE
    UNIQUENESSUNIQUE
    COMPRESSIONDISABLED
    PREFIX_LENGTHnull
    TABLESPACE_NAMEUSERS
    INI_TRANS2
    MAX_TRANS255
    INITIAL_EXTENT65536
    NEXT_EXTENT1048576
    MIN_EXTENTS1
    MAX_EXTENTS2147483645
    PCT_INCREASEnull
    PCT_THRESHOLDnull
    INCLUDE_COLUMNnull
    FREELISTSnull
    FREELIST_GROUPSnull
    PCT_FREE10
    LOGGINGYES
    BLEVEL0
    LEAF_BLOCKS1
    DISTINCT_KEYS3
    AVG_LEAF_BLOCKS_PER_KEY1
    AVG_DATA_BLOCKS_PER_KEY1
    CLUSTERING_FACTOR1
    STATUSVALID
    NUM_ROWS3
    SAMPLE_SIZE3
    LAST_ANALYZED25-NOV-2018 20:04:09
    DEGREE1
    INSTANCES1
    PARTITIONEDNO
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    BUFFER_POOLDEFAULT
    FLASH_CACHEDEFAULT
    CELL_FLASH_CACHEDEFAULT
    USER_STATSNO
    DURATIONnull
    PCT_DIRECT_ACCESSnull
    ITYP_OWNERnull
    ITYP_NAMEnull
    PARAMETERSnull
    GLOBAL_STATSYES
    DOMIDX_STATUSnull
    DOMIDX_OPSTATUSnull
    FUNCIDX_STATUSnull
    JOIN_INDEXNO
    IOT_REDUNDANT_PKEY_ELIMNO
    DROPPEDNO
    VISIBILITYVISIBLE
    DOMIDX_MANAGEMENTnull
    SEGMENT_CREATEDYES
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    OWNERWTP
    INDEX_NAMEHOOKS_PK
    TABLE_OWNERWTP
    TABLE_NAMEHOOKS
    PARTITION_NAMEnull
    PARTITION_POSITIONnull
    SUBPARTITION_NAMEnull
    SUBPARTITION_POSITIONnull
    OBJECT_TYPEINDEX
    BLEVEL0
    LEAF_BLOCKS1
    DISTINCT_KEYS3
    AVG_LEAF_BLOCKS_PER_KEY1
    AVG_DATA_BLOCKS_PER_KEY1
    CLUSTERING_FACTOR1
    NUM_ROWS3
    AVG_CACHED_BLOCKSnull
    AVG_CACHE_HIT_RATIOnull
    SAMPLE_SIZE3
    LAST_ANALYZED25-NOV-2018 20:04:09
    GLOBAL_STATSYES
    USER_STATSNO
    STATTYPE_LOCKEDnull
    STALE_STATSNO
    +
    +
    +
    +
    + + + + + + + + + +
    PARTITION_NAMELAST_ANALYZEDNUM_ROWSLEAF_BLOCKSDISTINCT_KEYSSAMPLE_SIZE
    +
    +
    +
    + + diff --git a/docs/core/DBDocs/package body/WT_PROFILER/headerBg.jpg b/docs/core/DBDocs/index/HOOKS_PK/headerBg.jpg similarity index 100% rename from docs/core/DBDocs/package body/WT_PROFILER/headerBg.jpg rename to docs/core/DBDocs/index/HOOKS_PK/headerBg.jpg diff --git a/docs/core/DBDocs/package body/WT_PROFILER/report.css b/docs/core/DBDocs/index/HOOKS_PK/report.css similarity index 100% rename from docs/core/DBDocs/package body/WT_PROFILER/report.css rename to docs/core/DBDocs/index/HOOKS_PK/report.css diff --git a/docs/core/DBDocs/package body/WT_PROFILER/report.js b/docs/core/DBDocs/index/HOOKS_PK/report.js similarity index 100% rename from docs/core/DBDocs/package body/WT_PROFILER/report.js rename to docs/core/DBDocs/index/HOOKS_PK/report.js diff --git a/docs/core/DBDocs/package body/WT_PROFILER/topDimTabBg.gif b/docs/core/DBDocs/index/HOOKS_PK/topDimTabBg.gif similarity index 100% rename from docs/core/DBDocs/package body/WT_PROFILER/topDimTabBg.gif rename to docs/core/DBDocs/index/HOOKS_PK/topDimTabBg.gif diff --git a/docs/core/DBDocs/package body/WT_PROFILER/topDimTabL.gif b/docs/core/DBDocs/index/HOOKS_PK/topDimTabL.gif similarity index 100% rename from docs/core/DBDocs/package body/WT_PROFILER/topDimTabL.gif rename to docs/core/DBDocs/index/HOOKS_PK/topDimTabL.gif diff --git a/docs/core/DBDocs/package body/WT_PROFILER/topDimTabR.gif b/docs/core/DBDocs/index/HOOKS_PK/topDimTabR.gif similarity index 100% rename from docs/core/DBDocs/package body/WT_PROFILER/topDimTabR.gif rename to docs/core/DBDocs/index/HOOKS_PK/topDimTabR.gif diff --git a/docs/core/DBDocs/package body/WT_PROFILER/topTabBg.gif b/docs/core/DBDocs/index/HOOKS_PK/topTabBg.gif similarity index 100% rename from docs/core/DBDocs/package body/WT_PROFILER/topTabBg.gif rename to docs/core/DBDocs/index/HOOKS_PK/topTabBg.gif diff --git a/docs/core/DBDocs/package body/WT_PROFILER/topTabL.gif b/docs/core/DBDocs/index/HOOKS_PK/topTabL.gif similarity index 100% rename from docs/core/DBDocs/package body/WT_PROFILER/topTabL.gif rename to docs/core/DBDocs/index/HOOKS_PK/topTabL.gif diff --git a/docs/core/DBDocs/package body/WT_PROFILER/topTabR.gif b/docs/core/DBDocs/index/HOOKS_PK/topTabR.gif similarity index 100% rename from docs/core/DBDocs/package body/WT_PROFILER/topTabR.gif rename to docs/core/DBDocs/index/HOOKS_PK/topTabR.gif diff --git a/docs/core/DBDocs/index/WT_SELF_TEST_PK.html b/docs/core/DBDocs/index/WT_SELF_TEST_PK.html new file mode 100644 index 0000000..c5e460c --- /dev/null +++ b/docs/core/DBDocs/index/WT_SELF_TEST_PK.html @@ -0,0 +1,430 @@ + + + + + + + + +
    +
    +
    +

    Columns

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Statistics

    +
    +
    +
    +
    +

    Partitions

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONDESCEND
    WTPWT_SELF_TEST_PKWTPWT_SELF_TESTID1ASC
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    CREATED25-NOV-2018 19:55:40
    LAST_DDL_TIME25-NOV-2018 19:55:40
    OWNERWTP
    INDEX_NAMEWT_SELF_TEST_PK
    INDEX_TYPENORMAL
    TABLE_OWNERWTP
    TABLE_NAMEWT_SELF_TEST
    TABLE_TYPETABLE
    UNIQUENESSUNIQUE
    COMPRESSIONDISABLED
    PREFIX_LENGTHnull
    TABLESPACE_NAMEUSERS
    INI_TRANS2
    MAX_TRANS255
    INITIAL_EXTENT65536
    NEXT_EXTENT1048576
    MIN_EXTENTS1
    MAX_EXTENTS2147483645
    PCT_INCREASEnull
    PCT_THRESHOLDnull
    INCLUDE_COLUMNnull
    FREELISTSnull
    FREELIST_GROUPSnull
    PCT_FREE10
    LOGGINGYES
    BLEVEL0
    LEAF_BLOCKS1
    DISTINCT_KEYS2
    AVG_LEAF_BLOCKS_PER_KEY1
    AVG_DATA_BLOCKS_PER_KEY1
    CLUSTERING_FACTOR1
    STATUSVALID
    NUM_ROWS2
    SAMPLE_SIZE2
    LAST_ANALYZED25-NOV-2018 20:04:09
    DEGREE1
    INSTANCES1
    PARTITIONEDNO
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    BUFFER_POOLDEFAULT
    FLASH_CACHEDEFAULT
    CELL_FLASH_CACHEDEFAULT
    USER_STATSNO
    DURATIONnull
    PCT_DIRECT_ACCESSnull
    ITYP_OWNERnull
    ITYP_NAMEnull
    PARAMETERSnull
    GLOBAL_STATSYES
    DOMIDX_STATUSnull
    DOMIDX_OPSTATUSnull
    FUNCIDX_STATUSnull
    JOIN_INDEXNO
    IOT_REDUNDANT_PKEY_ELIMNO
    DROPPEDNO
    VISIBILITYVISIBLE
    DOMIDX_MANAGEMENTnull
    SEGMENT_CREATEDYES
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    OWNERWTP
    INDEX_NAMEWT_SELF_TEST_PK
    TABLE_OWNERWTP
    TABLE_NAMEWT_SELF_TEST
    PARTITION_NAMEnull
    PARTITION_POSITIONnull
    SUBPARTITION_NAMEnull
    SUBPARTITION_POSITIONnull
    OBJECT_TYPEINDEX
    BLEVEL0
    LEAF_BLOCKS1
    DISTINCT_KEYS2
    AVG_LEAF_BLOCKS_PER_KEY1
    AVG_DATA_BLOCKS_PER_KEY1
    CLUSTERING_FACTOR1
    NUM_ROWS2
    AVG_CACHED_BLOCKSnull
    AVG_CACHE_HIT_RATIOnull
    SAMPLE_SIZE2
    LAST_ANALYZED25-NOV-2018 20:04:09
    GLOBAL_STATSYES
    USER_STATSNO
    STATTYPE_LOCKEDnull
    STALE_STATSNO
    +
    +
    +
    +
    + + + + + + + + + +
    PARTITION_NAMELAST_ANALYZEDNUM_ROWSLEAF_BLOCKSDISTINCT_KEYSSAMPLE_SIZE
    +
    +
    +
    + + diff --git a/docs/core/DBDocs/package body/WT_RESULT/headerBg.jpg b/docs/core/DBDocs/index/WT_SELF_TEST_PK/headerBg.jpg similarity index 100% rename from docs/core/DBDocs/package body/WT_RESULT/headerBg.jpg rename to docs/core/DBDocs/index/WT_SELF_TEST_PK/headerBg.jpg diff --git a/docs/core/DBDocs/package body/WT_RESULT/report.css b/docs/core/DBDocs/index/WT_SELF_TEST_PK/report.css similarity index 100% rename from docs/core/DBDocs/package body/WT_RESULT/report.css rename to docs/core/DBDocs/index/WT_SELF_TEST_PK/report.css diff --git a/docs/core/DBDocs/package body/WT_RESULT/report.js b/docs/core/DBDocs/index/WT_SELF_TEST_PK/report.js similarity index 100% rename from docs/core/DBDocs/package body/WT_RESULT/report.js rename to docs/core/DBDocs/index/WT_SELF_TEST_PK/report.js diff --git a/docs/core/DBDocs/package body/WT_RESULT/topDimTabBg.gif b/docs/core/DBDocs/index/WT_SELF_TEST_PK/topDimTabBg.gif similarity index 100% rename from docs/core/DBDocs/package body/WT_RESULT/topDimTabBg.gif rename to docs/core/DBDocs/index/WT_SELF_TEST_PK/topDimTabBg.gif diff --git a/docs/core/DBDocs/package body/WT_RESULT/topDimTabL.gif b/docs/core/DBDocs/index/WT_SELF_TEST_PK/topDimTabL.gif similarity index 100% rename from docs/core/DBDocs/package body/WT_RESULT/topDimTabL.gif rename to docs/core/DBDocs/index/WT_SELF_TEST_PK/topDimTabL.gif diff --git a/docs/core/DBDocs/package body/WT_RESULT/topDimTabR.gif b/docs/core/DBDocs/index/WT_SELF_TEST_PK/topDimTabR.gif similarity index 100% rename from docs/core/DBDocs/package body/WT_RESULT/topDimTabR.gif rename to docs/core/DBDocs/index/WT_SELF_TEST_PK/topDimTabR.gif diff --git a/docs/core/DBDocs/package body/WT_RESULT/topTabBg.gif b/docs/core/DBDocs/index/WT_SELF_TEST_PK/topTabBg.gif similarity index 100% rename from docs/core/DBDocs/package body/WT_RESULT/topTabBg.gif rename to docs/core/DBDocs/index/WT_SELF_TEST_PK/topTabBg.gif diff --git a/docs/core/DBDocs/package body/WT_RESULT/topTabL.gif b/docs/core/DBDocs/index/WT_SELF_TEST_PK/topTabL.gif similarity index 100% rename from docs/core/DBDocs/package body/WT_RESULT/topTabL.gif rename to docs/core/DBDocs/index/WT_SELF_TEST_PK/topTabL.gif diff --git a/docs/core/DBDocs/package body/WT_RESULT/topTabR.gif b/docs/core/DBDocs/index/WT_SELF_TEST_PK/topTabR.gif similarity index 100% rename from docs/core/DBDocs/package body/WT_RESULT/topTabR.gif rename to docs/core/DBDocs/index/WT_SELF_TEST_PK/topTabR.gif diff --git a/docs/core/DBDocs/index/WT_VERSIONS_PK.html b/docs/core/DBDocs/index/WT_VERSIONS_PK.html new file mode 100644 index 0000000..27db915 --- /dev/null +++ b/docs/core/DBDocs/index/WT_VERSIONS_PK.html @@ -0,0 +1,430 @@ + + + + + + + + +
    +
    +
    +

    Columns

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Statistics

    +
    +
    +
    +
    +

    Partitions

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONDESCEND
    WTPWT_VERSIONS_PKWTPWT_VERSIONSINSTALL_DTM1ASC
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    CREATED25-NOV-2018 19:55:40
    LAST_DDL_TIME25-NOV-2018 19:55:40
    OWNERWTP
    INDEX_NAMEWT_VERSIONS_PK
    INDEX_TYPENORMAL
    TABLE_OWNERWTP
    TABLE_NAMEWT_VERSIONS
    TABLE_TYPETABLE
    UNIQUENESSUNIQUE
    COMPRESSIONDISABLED
    PREFIX_LENGTHnull
    TABLESPACE_NAMEUSERS
    INI_TRANS2
    MAX_TRANS255
    INITIAL_EXTENT65536
    NEXT_EXTENT1048576
    MIN_EXTENTS1
    MAX_EXTENTS2147483645
    PCT_INCREASEnull
    PCT_THRESHOLDnull
    INCLUDE_COLUMNnull
    FREELISTSnull
    FREELIST_GROUPSnull
    PCT_FREE10
    LOGGINGYES
    BLEVEL0
    LEAF_BLOCKS1
    DISTINCT_KEYS1
    AVG_LEAF_BLOCKS_PER_KEY1
    AVG_DATA_BLOCKS_PER_KEY1
    CLUSTERING_FACTOR1
    STATUSVALID
    NUM_ROWS1
    SAMPLE_SIZE1
    LAST_ANALYZED25-NOV-2018 20:04:09
    DEGREE1
    INSTANCES1
    PARTITIONEDNO
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    BUFFER_POOLDEFAULT
    FLASH_CACHEDEFAULT
    CELL_FLASH_CACHEDEFAULT
    USER_STATSNO
    DURATIONnull
    PCT_DIRECT_ACCESSnull
    ITYP_OWNERnull
    ITYP_NAMEnull
    PARAMETERSnull
    GLOBAL_STATSYES
    DOMIDX_STATUSnull
    DOMIDX_OPSTATUSnull
    FUNCIDX_STATUSnull
    JOIN_INDEXNO
    IOT_REDUNDANT_PKEY_ELIMNO
    DROPPEDNO
    VISIBILITYVISIBLE
    DOMIDX_MANAGEMENTnull
    SEGMENT_CREATEDYES
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    OWNERWTP
    INDEX_NAMEWT_VERSIONS_PK
    TABLE_OWNERWTP
    TABLE_NAMEWT_VERSIONS
    PARTITION_NAMEnull
    PARTITION_POSITIONnull
    SUBPARTITION_NAMEnull
    SUBPARTITION_POSITIONnull
    OBJECT_TYPEINDEX
    BLEVEL0
    LEAF_BLOCKS1
    DISTINCT_KEYS1
    AVG_LEAF_BLOCKS_PER_KEY1
    AVG_DATA_BLOCKS_PER_KEY1
    CLUSTERING_FACTOR1
    NUM_ROWS1
    AVG_CACHED_BLOCKSnull
    AVG_CACHE_HIT_RATIOnull
    SAMPLE_SIZE1
    LAST_ANALYZED25-NOV-2018 20:04:09
    GLOBAL_STATSYES
    USER_STATSNO
    STATTYPE_LOCKEDnull
    STALE_STATSNO
    +
    +
    +
    +
    + + + + + + + + + +
    PARTITION_NAMELAST_ANALYZEDNUM_ROWSLEAF_BLOCKSDISTINCT_KEYSSAMPLE_SIZE
    +
    +
    +
    + + diff --git a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/headerBg.jpg b/docs/core/DBDocs/index/WT_VERSIONS_PK/headerBg.jpg similarity index 100% rename from docs/core/DBDocs/package body/WT_TEST_RUN_STAT/headerBg.jpg rename to docs/core/DBDocs/index/WT_VERSIONS_PK/headerBg.jpg diff --git a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/report.css b/docs/core/DBDocs/index/WT_VERSIONS_PK/report.css similarity index 100% rename from docs/core/DBDocs/package body/WT_TEST_RUN_STAT/report.css rename to docs/core/DBDocs/index/WT_VERSIONS_PK/report.css diff --git a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/report.js b/docs/core/DBDocs/index/WT_VERSIONS_PK/report.js similarity index 100% rename from docs/core/DBDocs/package body/WT_TEST_RUN_STAT/report.js rename to docs/core/DBDocs/index/WT_VERSIONS_PK/report.js diff --git a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topDimTabBg.gif b/docs/core/DBDocs/index/WT_VERSIONS_PK/topDimTabBg.gif similarity index 100% rename from docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topDimTabBg.gif rename to docs/core/DBDocs/index/WT_VERSIONS_PK/topDimTabBg.gif diff --git a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topDimTabL.gif b/docs/core/DBDocs/index/WT_VERSIONS_PK/topDimTabL.gif similarity index 100% rename from docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topDimTabL.gif rename to docs/core/DBDocs/index/WT_VERSIONS_PK/topDimTabL.gif diff --git a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topDimTabR.gif b/docs/core/DBDocs/index/WT_VERSIONS_PK/topDimTabR.gif similarity index 100% rename from docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topDimTabR.gif rename to docs/core/DBDocs/index/WT_VERSIONS_PK/topDimTabR.gif diff --git a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topTabBg.gif b/docs/core/DBDocs/index/WT_VERSIONS_PK/topTabBg.gif similarity index 100% rename from docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topTabBg.gif rename to docs/core/DBDocs/index/WT_VERSIONS_PK/topTabBg.gif diff --git a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topTabL.gif b/docs/core/DBDocs/index/WT_VERSIONS_PK/topTabL.gif similarity index 100% rename from docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topTabL.gif rename to docs/core/DBDocs/index/WT_VERSIONS_PK/topTabL.gif diff --git a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topTabR.gif b/docs/core/DBDocs/index/WT_VERSIONS_PK/topTabR.gif similarity index 100% rename from docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topTabR.gif rename to docs/core/DBDocs/index/WT_VERSIONS_PK/topTabR.gif diff --git a/docs/core/DBDocs/index/index.html b/docs/core/DBDocs/index/index.html new file mode 100644 index 0000000..19a5e39 --- /dev/null +++ b/docs/core/DBDocs/index/index.html @@ -0,0 +1,13 @@ + + + + + + + +

    Indexes +

    \ No newline at end of file diff --git a/docs/core/DBDocs/nodeTypes.html b/docs/core/DBDocs/nodeTypes.html index 710bc57..af18d32 100644 --- a/docs/core/DBDocs/nodeTypes.html +++ b/docs/core/DBDocs/nodeTypes.html @@ -7,8 +7,10 @@

    WTP

    Tables +Indexes +Triggers Packages Package Bodies -Sequences +Procedures \ No newline at end of file diff --git a/docs/core/DBDocs/package body/CORE_DATA.html b/docs/core/DBDocs/package body/CORE_DATA.html new file mode 100644 index 0000000..8a447ba --- /dev/null +++ b/docs/core/DBDocs/package body/CORE_DATA.html @@ -0,0 +1,784 @@ + + + + + + + + +
    +
    +
    +

    Doc

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Code

    +
    +
    +
    +
    +
    +
    +
    + +

    -------------------


    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMECORE_DATA
    SUBOBJECT_NAMEnull
    OBJECT_ID42810
    DATA_OBJECT_IDnull
    OBJECT_TYPEPACKAGE BODY
    CREATED25-NOV-2018 19:55:40
    LAST_DDL_TIME25-NOV-2018 19:55:40
    TIMESTAMP2018-11-25:19:55:40
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE2
    EDITION_NAMEnull
    +
    +
    +
    +
    + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    +
    +package body core_data
    +is
    +
    +
    +---------------------
    +--  Public Procedures
    +---------------------
    +
    +------------------------------------------------------------
    +function get_testcase
    +   return long_name
    +is
    +begin
    +   return nvl(wt_assert.g_testcase
    +             ,substr(core_data.g_run_rec.runner_owner || '.' ||
    +                     core_data.g_run_rec.runner_name, 1, 128));
    +end get_testcase;
    +
    +------------------------------------------------------------
    +procedure init1
    +      (in_package_name  in  varchar2)
    +is
    +   l_run_recNULL      run_rec_type;
    +   l_testcase         long_name;
    +   l_results_recNULL  results_rec_type;
    +begin
    +   -- Initialize Test Run Record
    +   g_run_rec  := l_run_recNULL;
    +   g_run_rec.start_dtm   := systimestamp;
    +   g_run_rec.runner_name := in_package_name;
    +   --  These don't work:
    +   --  g_run_rec.runner_owner := USER;
    +   --  g_run_rec.runner_owner := sys_context('userenv', 'current_schema');
    +   select username into g_run_rec.runner_owner from user_users;
    +   -- Initialize Test Cases Array
    +   l_testcase := g_tcases_aa.LAST;
    +   while l_testcase is not null
    +   loop
    +                    g_tcases_aa.DELETE(l_testcase);
    +      l_testcase := g_tcases_aa.PRIOR(l_testcase);
    +   end loop;
    +   -- Initialize Test Results Array
    +   g_results_nt := results_nt_type(null);
    +   g_results_nt(1) := l_results_recNULL;
    +   -- Set this for any "hook" that might run "add"
    +   g_results_nt(1).executed_dtm := systimestamp;
    +end init1;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_init1
    +   is
    +      l_run_recSAVE      run_rec_type;
    +      l_tcases_aaSAVE    tcases_aa_type;
    +      l_results_ntSAVE   results_nt_type;
    +      l_run_recTEST      run_rec_type;
    +      l_tcases_aaTEST    tcases_aa_type;
    +      l_results_ntTEST   results_nt_type;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'INIT "One" Happy Path 1';
    +      l_run_recSAVE     := g_run_rec;
    +      l_tcases_aaSAVE   := g_tcases_aa;
    +      l_results_ntSAVE  := g_results_nt;
    +      init1 ('WTPLSQL');
    +      l_run_recTEST     := g_run_rec;
    +      l_tcases_aaTEST   := g_tcases_aa;
    +      l_results_ntTEST  := g_results_nt;
    +      g_run_rec         := l_run_recSAVE;
    +      g_tcases_aa       := l_tcases_aaSAVE;
    +      g_results_nt      := l_results_ntSAVE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq
    +         (msg_in          => 'l_run_recTEST.runner_owner'
    +         ,check_this_in   =>  l_run_recTEST.runner_owner
    +         ,against_this_in =>  USER);
    +      wt_assert.eq
    +         (msg_in          => 'l_run_recTEST.runner_name'
    +         ,check_this_in   =>  l_run_recTEST.runner_name
    +         ,against_this_in => 'WTPLSQL');
    +      wt_assert.isnotnull
    +         (msg_in          => 'l_run_recTEST.start_dtm'
    +         ,check_this_in   =>  l_run_recTEST.start_dtm);
    +      wt_assert.this
    +         (msg_in          => 'l_run_recTEST.start_dtm > l_run_recSAVE.start_dtm'
    +         ,check_this_in   =>  l_run_recTEST.start_dtm > l_run_recSAVE.start_dtm);
    +      wt_assert.isnull
    +         (msg_in          => 'l_run_recTEST.end_dtm'
    +         ,check_this_in   =>  l_run_recTEST.end_dtm);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq
    +         (msg_in          => 'l_run_recTEST.runner_sec'
    +         ,check_this_in   =>  l_run_recTEST.runner_sec
    +         ,against_this_in =>  0);
    +      wt_assert.eq
    +         (msg_in          => 'l_run_recTEST.runner_sec'
    +         ,check_this_in   =>  l_run_recTEST.runner_sec
    +         ,against_this_in =>  0);
    +      wt_assert.eq
    +         (msg_in          => 'l_run_recTEST.tc_cnt'
    +         ,check_this_in   =>  l_run_recTEST.tc_cnt
    +         ,against_this_in =>  0);
    +      wt_assert.eq
    +         (msg_in          => 'l_run_recTEST.tc_fail'
    +         ,check_this_in   =>  l_run_recTEST.tc_fail
    +         ,against_this_in =>  0);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq
    +         (msg_in          => 'l_run_recTEST.asrt_cnt'
    +         ,check_this_in   =>  l_run_recTEST.asrt_cnt
    +         ,against_this_in =>  0);
    +      wt_assert.eq
    +         (msg_in          => 'l_run_recTEST.asrt_fail'
    +         ,check_this_in   =>  l_run_recTEST.asrt_fail
    +         ,against_this_in =>  0);
    +      wt_assert.eq
    +         (msg_in          => 'l_run_recTEST.asrt_tot_msec'
    +         ,check_this_in   =>  l_run_recTEST.asrt_tot_msec
    +         ,against_this_in =>  0);
    +      wt_assert.eq
    +         (msg_in          => 'l_run_recTEST.asrt_sos_msec'
    +         ,check_this_in   =>  l_run_recTEST.asrt_sos_msec
    +         ,against_this_in =>  0);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull
    +         (msg_in          => 'l_tcases_aaTEST.FIRST'
    +         ,check_this_in   =>  l_tcases_aaTEST.FIRST);
    +      wt_assert.eq
    +         (msg_in          => 'l_results_ntTEST.COUNT'
    +         ,check_this_in   =>  l_results_ntTEST.COUNT
    +         ,against_this_in =>  1);
    +      wt_assert.eq
    +         (msg_in          => 'l_results_ntTEST(1).result_seq'
    +         ,check_this_in   =>  l_results_ntTEST(1).result_seq
    +         ,against_this_in =>  0);
    +      wt_assert.isnull
    +         (msg_in          => 'l_results_ntTEST(1).pass'
    +         ,check_this_in   =>  l_results_ntTEST(1).pass);
    +   end t_init1;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure init2
    +is
    +begin
    +   -- Overwrite this value
    +   g_results_nt(g_results_nt.COUNT).executed_dtm := systimestamp;
    +end init2;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_init2
    +   is
    +      l_run_recSAVE      run_rec_type;
    +      l_tcases_aaSAVE    tcases_aa_type;
    +      l_results_ntSAVE   results_nt_type;
    +      l_run_recTEST      run_rec_type;
    +      l_tcases_aaTEST    tcases_aa_type;
    +      l_results_ntTEST   results_nt_type;
    +      lt   PLS_INTEGER;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'INIT "Two" Happy Path 1';
    +      l_run_recSAVE     := g_run_rec;
    +      l_tcases_aaSAVE   := g_tcases_aa;
    +      l_results_ntSAVE  := g_results_nt;
    +      -- lt points to the NULL record in g_results_nt
    +      lt := g_results_nt.COUNT;
    +      g_results_nt(lt).executed_dtm := null;
    +      init2;
    +      l_run_recTEST     := g_run_rec;
    +      l_tcases_aaTEST   := g_tcases_aa;
    +      l_results_ntTEST  := g_results_nt;
    +      g_run_rec         := l_run_recSAVE;
    +      g_tcases_aa       := l_tcases_aaSAVE;
    +      g_results_nt      := l_results_ntSAVE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull
    +         (msg_in          => 'l_results_ntTEST(1).executed_dtm'
    +         ,check_this_in   =>  l_results_ntTEST(1).executed_dtm);
    +      wt_assert.this
    +         (msg_in          => 'l_results_ntTEST(1).executed_dtm >= l_run_recTEST.start_dtm'
    +         ,check_this_in   =>  l_results_ntTEST(1).executed_dtm >= l_run_recTEST.start_dtm);
    +   end t_init2;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure add
    +      (in_testcase   in varchar2
    +      ,in_assertion  in varchar2
    +      ,in_pass       in boolean
    +      ,in_details    in varchar2
    +      ,in_message    in varchar2)
    +is
    +   l_results_rec      results_rec_type;
    +   l_tcases_rec       tcases_rec_type;
    +   l_current_tstamp   timestamp(6);
    +   l_interval_buff    interval day(9) to second(6);
    +begin
    +   ------------------------------------------------------------
    +   --  Set "l_results_rec" and add a new "g_results_nt" element
    +   --
    +   if g_results_nt.COUNT != 1
    +   then
    +      l_results_rec := g_results_nt(g_results_nt.COUNT-1);
    +   else
    +      -- g_results_nt should have only 1 element.
    +      l_results_rec := g_results_nt(1);
    +   end if;
    +   l_results_rec.result_seq     := l_results_rec.result_seq + 1;
    +   -- g_results_rec.executed_dtm still has the last execution time
    +   --   core_data.init also sets this during test runner startup
    +   l_current_tstamp             := systimestamp;
    +   l_interval_buff              := l_current_tstamp - l_results_rec.executed_dtm;
    +   l_results_rec.interval_msecs := (extract(second from l_interval_buff) +
    +                                    60 * ( extract(minute from l_interval_buff) +
    +                                          60 * ( extract(hour from l_interval_buff) +
    +                                                24 * ( extract(day from l_interval_buff)
    +                                   )     )     )     ) * 1000;
    +   l_results_rec.executed_dtm   := l_current_tstamp;
    +   l_results_rec.testcase       := nvl(in_testcase
    +                                      ,substr(g_run_rec.runner_owner || '.' ||
    +                                              g_run_rec.runner_name, 1, 128));
    +   l_results_rec.assertion      := in_assertion;
    +   l_results_rec.pass           := in_pass;
    +   l_results_rec.details        := in_details;
    +   l_results_rec.message        := in_message;
    +   g_results_nt(g_results_nt.COUNT) := l_results_rec;
    +   g_results_nt.extend;
    +   -----------------------------------------------
    +   --  Update "g_run_rec" based on "l_results_rec"
    +   --
    +   g_run_rec.asrt_cnt      := g_run_rec.asrt_cnt +  1;
    +   if NOT l_results_rec.pass
    +   then
    +      g_run_rec.asrt_fail := g_run_rec.asrt_fail + 1;
    +   end if;
    +   g_run_rec.asrt_tot_msec := g_run_rec.asrt_tot_msec +
    +                              l_results_rec.interval_msecs;
    +   g_run_rec.asrt_sos_msec := g_run_rec.asrt_sos_msec +
    +                             (l_results_rec.interval_msecs *
    +                              l_results_rec.interval_msecs   );
    +   if l_results_rec.interval_msecs < nvl(g_run_rec.asrt_min_msec,9999999)
    +   then
    +      g_run_rec.asrt_min_msec := l_results_rec.interval_msecs;
    +   end if;
    +   if l_results_rec.interval_msecs > nvl(g_run_rec.asrt_max_msec,0)
    +   then
    +      g_run_rec.asrt_max_msec := l_results_rec.interval_msecs;
    +   end if;
    +   -----------------------------------------------------------------------
    +   --  Set "l_tcases_rec" and update the appropriate "g_tcases_aa" element
    +   --
    +   if g_tcases_aa.EXISTS(l_results_rec.testcase)
    +   then
    +      l_tcases_rec := g_tcases_aa(l_results_rec.testcase);
    +   end if;
    +   l_tcases_rec.asrt_cnt      := l_tcases_rec.asrt_cnt + 1;
    +   if NOT l_results_rec.pass
    +   then
    +      l_tcases_rec.asrt_fail  := l_tcases_rec.asrt_fail + 1;
    +   end if;
    +   l_tcases_rec.asrt_tot_msec := l_tcases_rec.asrt_tot_msec +
    +                                 l_results_rec.interval_msecs;
    +   l_tcases_rec.asrt_sos_msec := l_tcases_rec.asrt_sos_msec +
    +                                (l_results_rec.interval_msecs *
    +                                 l_results_rec.interval_msecs   );
    +   if l_results_rec.interval_msecs < nvl(l_tcases_rec.asrt_min_msec,9999999)
    +   then
    +      l_tcases_rec.asrt_min_msec := l_results_rec.interval_msecs;
    +   end if;
    +   if l_results_rec.interval_msecs > nvl(l_tcases_rec.asrt_max_msec,-1)
    +   then
    +      l_tcases_rec.asrt_max_msec := l_results_rec.interval_msecs;
    +   end if;
    +   g_tcases_aa(l_results_rec.testcase) := l_tcases_rec;
    +   --
    +end add;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_add
    +   is
    +      l_run_recSAVE      run_rec_type;
    +      l_tcases_aaSAVE    tcases_aa_type;
    +      l_results_ntSAVE   results_nt_type;
    +      l_run_recTEST      run_rec_type;
    +      l_tcases_aaTEST    tcases_aa_type;
    +      l_results_ntTEST   results_nt_type;
    +      lt   PLS_INTEGER;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Add Procedure Happy Path';
    +      l_run_recSAVE     := g_run_rec;
    +      l_tcases_aaSAVE   := g_tcases_aa;
    +      l_results_ntSAVE  := g_results_nt;
    +      -- lt points to the NULL element in l_resultsSAVE_nt
    +      lt := l_results_ntSAVE.COUNT;
    +      add(in_testcase  => 'The Testcase'
    +         ,in_assertion => 'The Assert'
    +         ,in_pass      => TRUE
    +         ,in_details   => 'The Details'
    +         ,in_message   => 'The Message');
    +      --------------------------------------  WTPLSQL Testing --
    +      l_run_recTEST     := g_run_rec;
    +      l_tcases_aaTEST   := g_tcases_aa;
    +      l_results_ntTEST  := g_results_nt;
    +      g_run_rec         := l_run_recSAVE;
    +      g_tcases_aa       := l_tcases_aaSAVE;
    +      g_results_nt      := l_results_ntSAVE;
    +      wt_assert.isnotnull
    +         (msg_in          => 'The NULL element in l_resultsSAVE_nt'
    +         ,check_this_in   =>  lt);
    +      --------------------------------------  WTPLSQL Testing --
    +      -- l_results_nt Testing
    +      -----------------------
    +      wt_assert.eq
    +         (msg_in          => 'l_results_ntTEST.COUNT = ' ||
    +                             'l_results_ntSAVE.COUNT + 1'
    +         ,check_this_in   =>  l_results_ntTEST.COUNT
    +         ,against_this_in =>  l_results_ntSAVE.COUNT + 1);
    +      wt_assert.eq
    +         (msg_in          => 'l_results_ntTEST(lt).result_seq = ' ||
    +                             'l_results_ntTEST(lt-1).result_seq + 1'
    +         ,check_this_in   =>  l_results_ntTEST(lt).result_seq
    +         ,against_this_in =>  l_results_ntTEST(lt-1).result_seq + 1);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull
    +         (msg_in          => 'l_results_ntTEST(lt).interval_msecs'
    +         ,check_this_in   =>  l_results_ntTEST(lt).interval_msecs);
    +      wt_assert.this
    +         (msg_in          => 'l_results_ntTEST(lt).interval_msecs >= 0'
    +         ,check_this_in   =>  l_results_ntTEST(lt).interval_msecs >= 0);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull
    +         (msg_in          => 'l_results_ntTEST(lt).executed_dtm'
    +         ,check_this_in   =>  l_results_ntTEST(lt).executed_dtm);
    +      wt_assert.this
    +         (msg_in          => 'l_results_ntTEST(lt).executed_dtm >= ' ||
    +                             'l_results_ntTEST(lt-1).executed_dtm'
    +         ,check_this_in   =>  l_results_ntTEST(lt).executed_dtm >=
    +                              l_results_ntTEST(lt-1).executed_dtm);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq
    +         (msg_in          => 'l_results_ntTEST(lt).testcase'
    +         ,check_this_in   =>  l_results_ntTEST(lt).testcase
    +         ,against_this_in => 'The Testcase');
    +      wt_assert.eq
    +         (msg_in          => 'l_results_ntTEST(lt).assertion'
    +         ,check_this_in   =>  l_results_ntTEST(lt).assertion
    +         ,against_this_in => 'The Assert');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq
    +         (msg_in          => 'l_results_ntTEST(lt).pass'
    +         ,check_this_in   =>  l_results_ntTEST(lt).pass
    +         ,against_this_in => TRUE);
    +      wt_assert.eq
    +         (msg_in          => 'l_results_ntTEST(lt).details'
    +         ,check_this_in   =>  l_results_ntTEST(lt).details
    +         ,against_this_in => 'The Details');
    +      wt_assert.eq
    +         (msg_in          => 'l_results_ntTEST(lt).message'
    +         ,check_this_in   =>  l_results_ntTEST(lt).message
    +         ,against_this_in => 'The Message');
    +      --------------------------------------  WTPLSQL Testing --
    +      -- l_run_rec Testing
    +      --------------------
    +      wt_assert.eq
    +         (msg_in          => 'l_run_recTEST.asrt_cnt = ' ||
    +                             'l_run_recSAVE.asrt_cnt + 1'
    +         ,check_this_in   =>  l_run_recTEST.asrt_cnt
    +         ,against_this_in =>  l_run_recSAVE.asrt_cnt + 1);
    +      wt_assert.eq
    +         (msg_in          => 'l_run_recTEST.asrt_fail = ' ||
    +                             'l_run_recSAVE.asrt_fail'
    +         ,check_this_in   =>  l_run_recTEST.asrt_fail
    +         ,against_this_in =>  l_run_recSAVE.asrt_fail);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq
    +         (msg_in          => 'l_run_recTEST.asrt_tot_msec = ' ||
    +                             'l_run_recSAVE.asrt_tot_msec + ' ||
    +                             'l_results_ntTEST(lt).interval_msecs'
    +         ,check_this_in   =>  l_run_recTEST.asrt_tot_msec
    +         ,against_this_in =>  l_run_recSAVE.asrt_tot_msec +
    +                              l_results_ntTEST(lt).interval_msecs);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.eq
    +         (msg_in          => 'l_run_recTEST.asrt_sos_msec = ' ||
    +                             'l_run_recSAVE.asrt_sos_msec + ' ||
    +                            '(l_results_ntTEST(lt).interval_msecs *' ||
    +                             'l_results_ntTEST(lt).interval_msecs )'
    +         ,check_this_in   =>  l_run_recTEST.asrt_sos_msec
    +         ,against_this_in =>  l_run_recSAVE.asrt_sos_msec +
    +                             (l_results_ntTEST(lt).interval_msecs *
    +                              l_results_ntTEST(lt).interval_msecs ) );
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull
    +         (msg_in          => 'l_run_recTEST.asrt_min_msec'
    +         ,check_this_in   =>  l_run_recTEST.asrt_min_msec);
    +      wt_assert.this
    +         (msg_in          => 'l_run_recTEST.asrt_min_msec <= ' ||
    +                             'l_run_recSAVE.asrt_min_msec'
    +         ,check_this_in   =>  l_run_recTEST.asrt_min_msec <=
    +                              l_run_recSAVE.asrt_min_msec);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull
    +         (msg_in          => 'l_run_recTEST.asrt_max_msec'
    +         ,check_this_in   =>  l_run_recTEST.asrt_max_msec);
    +      wt_assert.this
    +         (msg_in          => 'l_run_recTEST.asrt_max_msec <= ' ||
    +                             'l_run_recSAVE.asrt_max_msec'
    +         ,check_this_in   =>  l_run_recTEST.asrt_max_msec <=
    +                              l_run_recSAVE.asrt_max_msec);
    +      --------------------------------------  WTPLSQL Testing --
    +      -- l_tcases_aa Testing
    +      ----------------------
    +      wt_assert.eq
    +         (msg_in          => 'l_tcases_aaTEST(''The Testcase'').asrt_cnt'
    +         ,check_this_in   =>  l_tcases_aaTEST('The Testcase').asrt_cnt
    +         ,against_this_in =>  1);
    +      wt_assert.eq
    +         (msg_in          => 'l_tcases_aaTEST(''The Testcase'').asrt_fail'
    +         ,check_this_in   =>  l_tcases_aaTEST('The Testcase').asrt_fail
    +         ,against_this_in =>  0);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull
    +         (msg_in          => 'l_tcases_aaTEST(''The Testcase'').asrt_fail'
    +         ,check_this_in   =>  l_tcases_aaTEST('The Testcase').asrt_fail);
    +      wt_assert.isnotnull
    +         (msg_in          => 'l_tcases_aaTEST(''The Testcase'').asrt_tot_msec'
    +         ,check_this_in   =>  l_tcases_aaTEST('The Testcase').asrt_tot_msec);
    +      wt_assert.isnotnull
    +         (msg_in          => 'l_tcases_aaTEST(''The Testcase'').asrt_sos_msec'
    +         ,check_this_in   =>  l_tcases_aaTEST('The Testcase').asrt_sos_msec);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnotnull
    +         (msg_in          => 'l_tcases_aaTEST(''The Testcase'').asrt_min_msec'
    +         ,check_this_in   =>  l_tcases_aaTEST('The Testcase').asrt_min_msec);
    +      wt_assert.isnotnull
    +         (msg_in          => 'l_tcases_aaTEST(''The Testcase'').asrt_max_msec'
    +         ,check_this_in   =>  l_tcases_aaTEST('The Testcase').asrt_max_msec);
    +   end t_add;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure finalize
    +is
    +   l_testcase         long_name;
    +   l_interval_buff    interval day(9) to second(6);
    +begin
    +   g_run_rec.tc_cnt  := g_tcases_aa.COUNT;
    +   g_run_rec.tc_fail := 0;
    +   if g_tcases_aa.COUNT > 0
    +   then
    +      l_testcase := g_tcases_aa.FIRST;
    +      loop
    +         if g_tcases_aa(l_testcase).asrt_fail > 0
    +         then
    +            g_run_rec.tc_fail := g_run_rec.tc_fail + 1;
    +         end if;
    +         exit when l_testcase = g_tcases_aa.LAST;
    +         l_testcase := g_tcases_aa.NEXT(l_testcase);
    +      end loop;
    +   end if;
    +   g_run_rec.end_dtm    := systimestamp;
    +   l_interval_buff      := g_run_rec.end_dtm - g_run_rec.start_dtm;
    +   g_run_rec.runner_sec := (extract(second from l_interval_buff) +
    +                            60 * ( extract(minute from l_interval_buff) +
    +                                  60 * ( extract(hour from l_interval_buff) +
    +                                        24 * ( extract(day from l_interval_buff)
    +                           )     )     )     );
    +   g_results_nt.delete(g_results_nt.COUNT);
    +end finalize;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_finalize
    +   is
    +      l_run_recSAVE      run_rec_type;
    +      l_tcases_aaSAVE    tcases_aa_type;
    +      l_results_ntSAVE   results_nt_type;
    +      l_run_recTEST      run_rec_type;
    +      l_tcases_aaTEST    tcases_aa_type;
    +      l_results_ntTEST   results_nt_type;
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Finalize Happy Path';
    +      l_run_recSAVE     := g_run_rec;
    +      l_tcases_aaSAVE   := g_tcases_aa;
    +      l_results_ntSAVE  := g_results_nt;
    +      finalize;
    +      l_run_recTEST     := g_run_rec;
    +      l_tcases_aaTEST   := g_tcases_aa;
    +      l_results_ntTEST  := g_results_nt;
    +      g_run_rec         := l_run_recSAVE;
    +      g_tcases_aa       := l_tcases_aaSAVE;
    +      g_results_nt      := l_results_ntSAVE;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.isnull
    +         (msg_in          => 'l_run_recSAVE.end_dtm'
    +         ,check_this_in   =>  l_run_recSAVE.end_dtm);
    +      wt_assert.isnotnull
    +         (msg_in          => 'l_run_recTEST.end_dtm'
    +         ,check_this_in   =>  l_run_recTEST.end_dtm);
    +      wt_assert.eq
    +         (msg_in          => 'l_results_ntTEST.COUNT = ' ||
    +                             'l_results_ntSAVE.COUNT - 1'
    +         ,check_this_in   =>  l_results_ntTEST.COUNT
    +         ,against_this_in =>  l_results_ntSAVE.COUNT - 1);
    +   end t_finalize;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +------------------------------------------------------------
    +procedure run_error
    +      (in_error_message  in  varchar2)
    +is
    +begin
    +   if g_run_rec.error_message is null
    +   then
    +      g_run_rec.error_message := substr(in_error_message,1,4000);
    +   else
    +      g_run_rec.error_message := substr(g_run_rec.error_message || CHR(10) ||
    +                                        in_error_message,1,4000);
    +   end if;
    +end run_error;
    +
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure t_run_error
    +   is
    +      l_run_recSAVE   run_rec_type;
    +      l_run_recTEST   run_rec_type;
    +      test_message    varchar2(32767);
    +   begin
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'RUN_ERROR Happy Path 1';
    +      l_run_recSAVE := g_run_rec;
    +      g_run_rec.error_message := '';
    +      run_error('Simlple Message');
    +      l_run_recTEST := g_run_rec;
    +      g_run_rec     := l_run_recSAVE;
    +      wt_assert.eq
    +         (msg_in          => 'l_run_recTEST.error_message'
    +         ,check_this_in   =>  l_run_recTEST.error_message
    +         ,against_this_in => 'Simlple Message');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'RUN_ERROR Happy Path 2';
    +      l_run_recSAVE := g_run_rec;
    +      g_run_rec.error_message := '';
    +      run_error('Message 1');
    +      run_error('Message 2');
    +      l_run_recTEST := g_run_rec;
    +      g_run_rec     := l_run_recSAVE;
    +      wt_assert.eq
    +         (msg_in          => 'l_run_recTEST.error_message'
    +         ,check_this_in   =>  l_run_recTEST.error_message
    +         ,against_this_in => 'Message 1' || CHR(10) || 'Message 2');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'RUN_ERROR Happy Path 3';
    +      for i in 1 .. 399
    +      loop
    +         test_message := test_message || '1234567890';
    +      end loop;
    +      l_run_recSAVE := g_run_rec;
    +      g_run_rec.error_message := '';
    +      run_error(test_message);
    +      run_error('Longer than 10 characters.');
    +      l_run_recTEST := g_run_rec;
    +      g_run_rec     := l_run_recSAVE;
    +      wt_assert.isnotnull
    +         (msg_in          => 'substr(l_run_recTEST.error_message,3000)'
    +         ,check_this_in   =>  substr(l_run_recTEST.error_message,3000));
    +      wt_assert.this
    +         (msg_in          => 'l_run_recTEST.error_message like ''%Longer th'''
    +         ,check_this_in   =>  l_run_recTEST.error_message like '%Longer th');
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'RUN_ERROR Happy Path 4';
    +      l_run_recSAVE := g_run_rec;
    +      g_run_rec.error_message := '';
    +      run_error('');
    +      run_error('Message');
    +      run_error('');
    +      l_run_recTEST := g_run_rec;
    +      g_run_rec     := l_run_recSAVE;
    +      wt_assert.eq
    +         (msg_in          => 'l_run_recTEST.error_message'
    +         ,check_this_in   =>  l_run_recTEST.error_message
    +         ,against_this_in => 'Message' || CHR(10));
    +   end t_run_error;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +
    +
    +--==============================================================--
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   procedure WTPLSQL_RUN
    +   is
    +   begin
    +      wtplsql.g_DBOUT := 'CORE_DATA:PACKAGE BODY';
    +      --------------------------------------  WTPLSQL Testing --
    +      t_init1;
    +      t_init2;
    +      t_add;
    +      t_finalize;
    +      t_run_error;
    +   end;
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +--==============================================================--
    +
    +
    +end core_data;
    +
    +
    +
    + + diff --git a/docs/core/DBDocs/package/WT_PROFILER/headerBg.jpg b/docs/core/DBDocs/package body/CORE_DATA/headerBg.jpg similarity index 100% rename from docs/core/DBDocs/package/WT_PROFILER/headerBg.jpg rename to docs/core/DBDocs/package body/CORE_DATA/headerBg.jpg diff --git a/docs/core/DBDocs/package/WT_PROFILER/report.css b/docs/core/DBDocs/package body/CORE_DATA/report.css similarity index 100% rename from docs/core/DBDocs/package/WT_PROFILER/report.css rename to docs/core/DBDocs/package body/CORE_DATA/report.css diff --git a/docs/core/DBDocs/package/WT_PROFILER/report.js b/docs/core/DBDocs/package body/CORE_DATA/report.js similarity index 100% rename from docs/core/DBDocs/package/WT_PROFILER/report.js rename to docs/core/DBDocs/package body/CORE_DATA/report.js diff --git a/docs/core/DBDocs/package/WT_PROFILER/topDimTabBg.gif b/docs/core/DBDocs/package body/CORE_DATA/topDimTabBg.gif similarity index 100% rename from docs/core/DBDocs/package/WT_PROFILER/topDimTabBg.gif rename to docs/core/DBDocs/package body/CORE_DATA/topDimTabBg.gif diff --git a/docs/core/DBDocs/package/WT_PROFILER/topDimTabL.gif b/docs/core/DBDocs/package body/CORE_DATA/topDimTabL.gif similarity index 100% rename from docs/core/DBDocs/package/WT_PROFILER/topDimTabL.gif rename to docs/core/DBDocs/package body/CORE_DATA/topDimTabL.gif diff --git a/docs/core/DBDocs/package/WT_PROFILER/topDimTabR.gif b/docs/core/DBDocs/package body/CORE_DATA/topDimTabR.gif similarity index 100% rename from docs/core/DBDocs/package/WT_PROFILER/topDimTabR.gif rename to docs/core/DBDocs/package body/CORE_DATA/topDimTabR.gif diff --git a/docs/core/DBDocs/package/WT_PROFILER/topTabBg.gif b/docs/core/DBDocs/package body/CORE_DATA/topTabBg.gif similarity index 100% rename from docs/core/DBDocs/package/WT_PROFILER/topTabBg.gif rename to docs/core/DBDocs/package body/CORE_DATA/topTabBg.gif diff --git a/docs/core/DBDocs/package/WT_PROFILER/topTabL.gif b/docs/core/DBDocs/package body/CORE_DATA/topTabL.gif similarity index 100% rename from docs/core/DBDocs/package/WT_PROFILER/topTabL.gif rename to docs/core/DBDocs/package body/CORE_DATA/topTabL.gif diff --git a/docs/core/DBDocs/package/WT_PROFILER/topTabR.gif b/docs/core/DBDocs/package body/CORE_DATA/topTabR.gif similarity index 100% rename from docs/core/DBDocs/package/WT_PROFILER/topTabR.gif rename to docs/core/DBDocs/package body/CORE_DATA/topTabR.gif diff --git a/docs/core/DBDocs/package body/HOOK.html b/docs/core/DBDocs/package body/HOOK.html new file mode 100644 index 0000000..c166327 --- /dev/null +++ b/docs/core/DBDocs/package body/HOOK.html @@ -0,0 +1,425 @@ + + + + + + + + +
    +
    +
    +

    Doc

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Code

    +
    +
    +
    +
    +
    +
    +
    + +

    --------------------


    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMEHOOK
    SUBOBJECT_NAMEnull
    OBJECT_ID42811
    DATA_OBJECT_IDnull
    OBJECT_TYPEPACKAGE BODY
    CREATED25-NOV-2018 19:55:40
    LAST_DDL_TIME25-NOV-2018 19:55:40
    TIMESTAMP2018-11-25:19:55:40
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE2
    EDITION_NAMEnull
    +
    +
    +
    +
    + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    +
    +package body hook
    +as
    +
    +
    +----------------------
    +--  Private Procedures
    +----------------------
    +
    +
    +------------------------------------------------------------
    +procedure run_hooks
    +      (in_hook_name  in varchar2)
    +is
    +begin
    +   for i in 1 .. g_run_aa(in_hook_name).COUNT
    +   loop
    +      execute immediate g_run_aa(in_hook_name)(i);
    +   end loop;
    +end run_hooks;
    +
    +
    +---------------------
    +--  Public Procedures
    +---------------------
    +
    +
    +------------------------------------------------------------
    +procedure before_test_all
    +is
    +begin
    +   if before_test_all_active
    +   then
    +      run_hooks('before_test_all');
    +   end if;
    +end before_test_all;
    +
    +------------------------------------------------------------
    +procedure before_test_run
    +is
    +begin
    +   if before_test_run_active
    +   then
    +      run_hooks('before_test_run');
    +   end if;
    +end before_test_run;
    +
    +------------------------------------------------------------
    +procedure execute_test_runner
    +is
    +begin
    +   if execute_test_runner_active
    +   then
    +      run_hooks('execute_test_runner');
    +   end if;
    +end execute_test_runner;
    +
    +------------------------------------------------------------
    +procedure after_assertion
    +is
    +begin
    +   --
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   if g_run_assert_hook
    +   then
    +$END  ------%WTPLSQL_end_ignore_lines%------
    +   --
    +   if after_assertion_active
    +   then
    +      run_hooks('after_assertion');
    +   end if;
    +   --
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   end if;
    +$END  ------%WTPLSQL_end_ignore_lines%------
    +   --
    +end after_assertion;
    +
    +------------------------------------------------------------
    +procedure after_test_run
    +is
    +begin
    +   if after_test_run_active
    +   then
    +      run_hooks('after_test_run');
    +   end if;
    +end after_test_run;
    +
    +------------------------------------------------------------
    +procedure after_test_all
    +is
    +begin
    +   if after_test_all_active
    +   then
    +      run_hooks('after_test_all');
    +   end if;
    +end after_test_all;
    +
    +------------------------------------------------------------
    +procedure ad_hoc_report
    +is
    +begin
    +   if ad_hoc_report_active
    +   then
    +      run_hooks('ad_hoc_report');
    +   end if;
    +end ad_hoc_report;
    +
    +------------------------------------------------------------
    +procedure init
    +is
    +   l_run_nt  run_nt_type;
    +begin
    +   before_test_all_active     := FALSE;
    +   before_test_run_active     := FALSE;
    +   execute_test_runner_active := FALSE;
    +   after_assertion_active     := FALSE;
    +   after_test_run_active      := FALSE;
    +   after_test_all_active      := FALSE;
    +   ad_hoc_report_active       := FALSE;
    +   for buff in (
    +      select hook_name
    +       from  hooks
    +       group by hook_name )
    +   loop
    +      select run_string bulk collect into l_run_nt
    +       from  hooks
    +       where hook_name = buff.hook_name
    +       order by hooks.seq;
    +      if SQL%FOUND
    +      then
    +         g_run_aa(buff.hook_name) := l_run_nt;
    +         case buff.hook_name
    +            when 'before_test_all'     then before_test_all_active     := TRUE;
    +            when 'before_test_run'     then before_test_run_active     := TRUE;
    +            when 'execute_test_runner' then execute_test_runner_active := TRUE;
    +            when 'after_assertion'     then after_assertion_active     := TRUE;
    +            when 'after_test_run'      then after_test_run_active      := TRUE;
    +            when 'after_test_all'      then after_test_all_active      := TRUE;
    +            when 'ad_hoc_report'       then ad_hoc_report_active       := TRUE;
    +            else raise_application_error(-20012, 'Unknown HOOK_NAME Case' || buff.hook_name);
    +          end case;
    +      end if;
    +   end loop;
    +end init;
    +
    +
    +--==============================================================--
    +$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    +$THEN
    +   --------------------------------------  WTPLSQL Testing --
    +   procedure test_hook
    +      (in_msg  in  varchar2)
    +   is
    +   begin
    +      g_test_hook_msg := in_msg;
    +   end test_hook;
    +   --------------------------------------  WTPLSQL Testing --
    +   procedure WTPLSQL_RUN
    +   is
    +      TYPE  hooks_nt_type is table of hooks%ROWTYPE;
    +      l_hooks_ntSAVE  hooks_nt_type;
    +      TYPE hname_nt_type is table of hooks.hook_name%TYPE;
    +      l_hname_nt      hname_nt_type;
    +      l_hooks_rec     hooks%ROWTYPE;
    +      num_recs  number;
    +   begin
    +      wtplsql.g_DBOUT := 'HOOK:PACKAGE BODY';
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Setup';
    +      g_run_assert_hook := FALSE;
    +      select count(*) into num_recs from hooks;
    +      wt_assert.isnotnull
    +         (msg_in           => 'Number of records before setup'
    +         ,check_this_in    => num_recs);
    +      --------------------------------------  WTPLSQL Testing --
    +      l_hname_nt := hname_nt_type('before_test_all'
    +                                 ,'before_test_run'
    +                                 ,'execute_test_runner'
    +                                 ,'after_assertion'
    +                                 ,'after_test_run'
    +                                 ,'after_test_all'
    +                                 ,'ad_hoc_report');
    +      select * bulk collect into l_hooks_ntSAVE from hooks;
    +      delete from hooks;
    +      --------------------------------------  WTPLSQL Testing --
    +      l_hooks_rec.seq         := 1;
    +      l_hooks_rec.description := 'WTPSQL Self Test';
    +      for i in 1 .. l_hname_nt.COUNT
    +      loop
    +         l_hooks_rec.hook_name  := l_hname_nt(i);
    +         l_hooks_rec.run_string := 'begin hook.test_hook(''' ||
    +                                    l_hname_nt(i) || '''); end;';
    +         insert into hooks values l_hooks_rec;
    +      end loop;
    +      commit;
    +      --------------------------------------  WTPLSQL Testing --
    +      init;
    +      wt_assert.eqqueryvalue
    +         (msg_in           => 'Confirm number of test records'
    +         ,check_query_in   => 'select count(*) from hooks'
    +         ,against_value_in => l_hname_nt.COUNT);
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'All Hooks On';
    +      g_test_hook_msg := '';
    +      for i in 1 .. l_hname_nt.COUNT
    +      loop
    +         g_run_assert_hook := TRUE;
    +         execute immediate 'begin hook.' || l_hname_nt(i) || '; end;';
    +         g_run_assert_hook := FALSE;
    +         wt_assert.eq
    +            (msg_in          => l_hname_nt(i) || ' is active'
    +            ,check_this_in   => g_test_hook_msg
    +            ,against_this_in => l_hname_nt(i));
    +      end loop;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'All Hooks Off';
    +      delete from hooks;
    +      commit;
    +      init;
    +      wt_assert.eqqueryvalue
    +         (msg_in           => 'Confirm number of test records 2'
    +         ,check_query_in   => 'select count(*) from hooks'
    +         ,against_value_in => 0);
    +      --------------------------------------  WTPLSQL Testing --
    +      g_test_hook_msg := '';
    +      for i in 1 .. l_hname_nt.COUNT
    +      loop
    +         execute immediate 'begin hook.' || l_hname_nt(i) || '; end;';
    +         wt_assert.isnull
    +            (msg_in          => l_hname_nt(i) || ' is not active'
    +            ,check_this_in   => g_test_hook_msg);
    +      end loop;
    +      --------------------------------------  WTPLSQL Testing --
    +      wt_assert.g_testcase := 'Teardown';
    +      delete from hooks;
    +      forall i in 1 .. l_hooks_ntSAVE.COUNT
    +         insert into hooks values l_hooks_ntSAVE(i);
    +      commit;
    +      init;
    +      wt_assert.eqqueryvalue
    +         (msg_in           => 'Number of records after teardown'
    +         ,check_query_in   => 'select count(*) from hooks'
    +         ,against_value_in => num_recs);
    +      g_run_assert_hook := TRUE;
    +   end;
    +
    +$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    +--==============================================================--
    +
    +
    +------------------------------------------------------------
    +begin
    +   init;
    +end hook;
    +
    +
    +
    + + diff --git a/docs/core/DBDocs/package/WT_RESULT/headerBg.jpg b/docs/core/DBDocs/package body/HOOK/headerBg.jpg similarity index 100% rename from docs/core/DBDocs/package/WT_RESULT/headerBg.jpg rename to docs/core/DBDocs/package body/HOOK/headerBg.jpg diff --git a/docs/core/DBDocs/package/WT_RESULT/report.css b/docs/core/DBDocs/package body/HOOK/report.css similarity index 100% rename from docs/core/DBDocs/package/WT_RESULT/report.css rename to docs/core/DBDocs/package body/HOOK/report.css diff --git a/docs/core/DBDocs/package/WT_RESULT/report.js b/docs/core/DBDocs/package body/HOOK/report.js similarity index 100% rename from docs/core/DBDocs/package/WT_RESULT/report.js rename to docs/core/DBDocs/package body/HOOK/report.js diff --git a/docs/core/DBDocs/package/WT_RESULT/topDimTabBg.gif b/docs/core/DBDocs/package body/HOOK/topDimTabBg.gif similarity index 100% rename from docs/core/DBDocs/package/WT_RESULT/topDimTabBg.gif rename to docs/core/DBDocs/package body/HOOK/topDimTabBg.gif diff --git a/docs/core/DBDocs/package/WT_RESULT/topDimTabL.gif b/docs/core/DBDocs/package body/HOOK/topDimTabL.gif similarity index 100% rename from docs/core/DBDocs/package/WT_RESULT/topDimTabL.gif rename to docs/core/DBDocs/package body/HOOK/topDimTabL.gif diff --git a/docs/core/DBDocs/package/WT_RESULT/topDimTabR.gif b/docs/core/DBDocs/package body/HOOK/topDimTabR.gif similarity index 100% rename from docs/core/DBDocs/package/WT_RESULT/topDimTabR.gif rename to docs/core/DBDocs/package body/HOOK/topDimTabR.gif diff --git a/docs/core/DBDocs/package/WT_RESULT/topTabBg.gif b/docs/core/DBDocs/package body/HOOK/topTabBg.gif similarity index 100% rename from docs/core/DBDocs/package/WT_RESULT/topTabBg.gif rename to docs/core/DBDocs/package body/HOOK/topTabBg.gif diff --git a/docs/core/DBDocs/package/WT_RESULT/topTabL.gif b/docs/core/DBDocs/package body/HOOK/topTabL.gif similarity index 100% rename from docs/core/DBDocs/package/WT_RESULT/topTabL.gif rename to docs/core/DBDocs/package body/HOOK/topTabL.gif diff --git a/docs/core/DBDocs/package/WT_RESULT/topTabR.gif b/docs/core/DBDocs/package body/HOOK/topTabR.gif similarity index 100% rename from docs/core/DBDocs/package/WT_RESULT/topTabR.gif rename to docs/core/DBDocs/package body/HOOK/topTabR.gif diff --git a/docs/core/DBDocs/package body/WTPLSQL.html b/docs/core/DBDocs/package body/WTPLSQL.html index e70c1f3..e36155f 100644 --- a/docs/core/DBDocs/package body/WTPLSQL.html +++ b/docs/core/DBDocs/package body/WTPLSQL.html @@ -69,7 +69,7 @@ OBJECT_ID -41930 +42812 DATA_OBJECT_ID @@ -81,15 +81,15 @@ CREATED -29-JUN-2018 15:09:15 +25-NOV-2018 19:55:41 LAST_DDL_TIME -29-JUN-2018 15:21:16 +25-NOV-2018 19:55:41 TIMESTAMP -2018-06-29:15:21:16 +2018-11-25:19:55:41 STATUS @@ -172,10 +172,6 @@ package body wtplsql as - C_KEEP_NUM_RECS number := 20; - - g_test_runs_rec wt_test_runs%ROWTYPE; - $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN TYPE test_all_aa_type is table of varchar2(400) index by varchar2(400); @@ -197,24 +193,22 @@ begin -- These RAISEs can be captured because the Test Runs Record is set. -- Check for NULL Runner Name - if g_test_runs_rec.runner_name is null + if core_data.g_run_rec.runner_name is null then raise_application_error (-20001, 'RUNNER_NAME is null'); end if; -- Check for Valid Runner Name select count(*) into l_package_check - from all_arguments - where owner = USER - and object_name = 'WTPLSQL_RUN' - and package_name = g_test_runs_rec.runner_name - and argument_name is null - and position = 1 - and sequence = 0; - if l_package_check != 1 + from user_procedures + where procedure_name = C_RUNNER_ENTRY_POINT + and object_name = core_data.g_run_rec.runner_name + and object_type = 'PACKAGE'; + if l_package_check = 0 then - raise_application_error (-20002, 'RUNNER_NAME "' || - g_test_runs_rec.runner_name || - '.WTPLSQL_RUN" is not valid'); + raise_application_error (-20002, 'RUNNER_NAME Procedure "' || + core_data.g_run_rec.runner_name || + '.' || C_RUNNER_ENTRY_POINT || + '" is not valid' ); end if; end check_runner; @@ -222,38 +216,55 @@ $THEN procedure t_check_runner is - l_save_test_runs_rec wt_test_runs%ROWTYPE := g_test_runs_rec; + l_run_recSAVE core_data.run_rec_type; l_msg_in varchar2(4000); l_err_in varchar2(4000); -------------------------------------- WTPLSQL Testing -- procedure l_test_sqlerrm is begin - -- Restore the G_TEST_RUNS_REC - g_test_runs_rec := l_save_test_runs_rec; + -- Restore the core_data.g_run_rec + core_data.g_run_rec := l_run_recSAVE; wt_assert.eq (msg_in => l_msg_in ,check_this_in => SQLERRM ,against_this_in => l_err_in); end l_test_sqlerrm; begin + -- Save CORE_DATA data + l_run_recSAVE := core_data.g_run_rec; + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'CHECK_RUNNER Happy Path 1'; + wt_assert.eq + (msg_in => 'Confirm RUNNER_OWNER' + ,check_this_in => core_data.g_run_rec.runner_owner + ,against_this_in => USER); + core_data.g_run_rec.runner_name := 'WTPLSQL'; + l_msg_in := 'Valid RUNNER_NAME'; + l_err_in := 'ORA-0000: normal, successful completion'; + begin + check_runner; + l_test_sqlerrm; + exception when others then + l_test_sqlerrm; + end; -------------------------------------- WTPLSQL Testing -- - -- This Test Case runs in the EXECUTE IMMEDAITE in the TEST_RUN - -- procedure in this package. wt_assert.g_testcase := 'CHECK_RUNNER Sad Path 1'; + core_data.g_run_rec.runner_name := ''; + l_msg_in := 'Null RUNNER_NAME'; + l_err_in := 'ORA-20001: RUNNER_NAME is null'; begin - g_test_runs_rec.runner_name := ''; - l_msg_in := 'Null RUNNER_NAME'; - l_err_in := 'ORA-20001: RUNNER_NAME is null'; check_runner; l_test_sqlerrm; exception when others then + -- This test is expected to throw an error l_test_sqlerrm; end; -------------------------------------- WTPLSQL Testing -- wt_assert.g_testcase := 'CHECK_RUNNER Sad Path 2'; + core_data.g_run_rec.runner_name := 'BOGUS'; + l_msg_in := 'Invalid RUNNER_NAME'; + l_err_in := 'ORA-20002: RUNNER_NAME Procedure "BOGUS.' || + C_RUNNER_ENTRY_POINT || '" is not valid'; begin - g_test_runs_rec.runner_name := 'BOGUS'; - l_msg_in := 'Invalid RUNNER_NAME'; - l_err_in := 'ORA-20002: RUNNER_NAME "BOGUS.WTPLSQL_RUN" is not valid'; check_runner; l_test_sqlerrm; exception when others then @@ -264,116 +275,261 @@ ------------------------------------------------------------ -procedure insert_test_run +procedure find_dbout is - PRAGMA AUTONOMOUS_TRANSACTION; - l_wt_test_runs_recNULL wt_test_runs%ROWTYPE; + -- + -- https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements008.htm#SQLRF51129 + -- Within a namespace, no two objects can have the same name. The following + -- schema objects share one namespace: + -- -) Packages + -- -) Private synonyms + -- -) Sequences + -- -) Stand-alone procedures + -- -) Stand-alone stored functions + -- -) User-defined operators + -- -) User-defined types + -- -) Tables + -- -) Views + -- Each of the following schema objects has its own namespace: + -- -) Clusters + -- -) Constraints + -- -) Database triggers + -- -) Dimensions + -- -) Indexes + -- -) Materialized views (When you create a materialized view, the database + -- creates an internal table of the same name. This table has the same + -- namespace as the other tables in the schema. Therefore, a schema + -- cannot contain a table and a materialized view of the same name.) + -- -) Private database links + -- Because tables and sequences are in the same namespace, a table and a + -- sequence in the same schema cannot have the same name. However, tables + -- and indexes are in different namespaces. Therefore, a table and an index + -- in the same schema can have the same name. + -- Each schema in the database has its own namespaces for the objects it + -- contains. This means, for example, that two tables in different schemas + -- are in different namespaces and can have the same name. + -- Results are unknown if a Database Object Under Test has the same name in + -- different namespaces. + -- + l_dot_pos number; + l_cln_pos number; begin - if g_test_runs_rec.id is null + if g_DBOUT is null then return; end if; - g_test_runs_rec.end_dtm := systimestamp; - insert into wt_test_runs values g_test_runs_rec; - g_test_runs_rec := l_wt_test_runs_recNULL; - COMMIT; -exception - when OTHERS - then - DBMS_OUTPUT.PUT_LINE(dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace); -end insert_test_run; + l_dot_pos := instr(g_DBOUT,'.'); + l_cln_pos := instr(g_DBOUT,':'); + begin + with q_main as ( + select obj.owner + ,obj.object_name + ,obj.object_type + from dba_objects obj + where obj.owner = core_data.g_run_rec.runner_owner + and ( ( -- No separators were given, assume USER is the owner. + -- No object type was given. This could throw TOO_MANY_ROWS. + l_dot_pos = 0 + and l_cln_pos = 0 + and obj.object_name = g_DBOUT ) + OR ( -- No object owner was given, assume USER is the owner. + l_dot_pos = 0 + and l_cln_pos != 0 + and obj.object_name = substr(g_DBOUT, 1, l_cln_pos-1) + and obj.object_type = substr(g_DBOUT, l_cln_pos+1, 512) ) ) + UNION ALL + select obj.owner + ,obj.object_name + ,obj.object_type + from dba_objects obj + where ( -- No object type was given. This could throw TOO_MANY_ROWS. + l_dot_pos != 0 + and l_cln_pos = 0 + and obj.owner = substr(g_DBOUT, 1, l_dot_pos-1) + and obj.object_name = substr(g_DBOUT, l_dot_pos+1, 512) ) + OR ( -- All separators were given + l_dot_pos != 0 + and l_cln_pos != 0 + and obj.owner = substr(g_DBOUT, 1, l_dot_pos-1) + and obj.object_name = substr(g_DBOUT, l_dot_pos+1, l_cln_pos-l_dot_pos-1) + and obj.object_type = substr(g_DBOUT, l_cln_pos+1, 512) ) + ) + select owner + ,object_name + ,object_type + into core_data.g_run_rec.dbout_owner + ,core_data.g_run_rec.dbout_name + ,core_data.g_run_rec.dbout_type + from q_main; + exception + when NO_DATA_FOUND + then + core_data.run_error('Unable to find database object "' || + g_DBOUT || '".' ); + return; + when TOO_MANY_ROWS + then + -- The SELECT INTO will load some values into these variables + -- when TOO_MANY_ROWS are selected. + core_data.g_run_rec.dbout_owner := ''; + core_data.g_run_rec.dbout_name := ''; + core_data.g_run_rec.dbout_type := ''; + core_data.run_error('Found too many database objects "' || + g_DBOUT || '".' ); + return; + end; + -- +end find_dbout; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN - procedure t_insert_test_run + procedure t_find_dbout is - -------------------------------------- WTPLSQL Testing -- - TYPE l_dbmsout_buff_type is table of varchar2(32767); - l_dbmsout_buff l_dbmsout_buff_type := l_dbmsout_buff_type(1); - l_test_runs_rec wt_test_runs%ROWTYPE; - l_dbmsout_line varchar2(32767); - l_dbmsout_stat number; - l_num_recs number; + l_run_recSAVE core_data.run_rec_type; + l_run_recTEST core_data.run_rec_type; + procedure clear_run_rec is begin + core_data.g_run_rec.dbout_owner := ''; + core_data.g_run_rec.dbout_name := ''; + core_data.g_run_rec.dbout_type := ''; + core_data.g_run_rec.error_message := ''; + end clear_run_rec; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'INSERT_TEST_RUN Happy Path 1'; - l_test_runs_rec := g_test_runs_rec; - insert_test_run; - g_test_runs_rec := l_test_runs_rec; + wt_assert.g_testcase := 'Find DBOUT Happy Path 1'; + l_run_recSAVE := core_data.g_run_rec; + clear_run_rec; + g_DBOUT := ''; + find_dbout; + l_run_recTEST := core_data.g_run_rec; + core_data.g_run_rec := l_run_recSAVE; + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull( + msg_in => 'l_run_recTEST.dbout_owner', + check_this_in => l_run_recTEST.dbout_owner); + wt_assert.isnull( + msg_in => 'l_run_recTEST.dbout_name', + check_this_in => l_run_recTEST.dbout_name); + wt_assert.isnull( + msg_in => 'l_run_recTEST.dbout_type', + check_this_in => l_run_recTEST.dbout_type); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Find DBOUT Happy Path 2'; + l_run_recSAVE := core_data.g_run_rec; + clear_run_rec; + g_DBOUT := 'SYS.DUAL'; + find_dbout; + l_run_recTEST := core_data.g_run_rec; + core_data.g_run_rec := l_run_recSAVE; + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq( + msg_in => 'l_run_recTEST.dbout_owner', + check_this_in => l_run_recTEST.dbout_owner, + against_this_in => 'SYS'); + wt_assert.eq( + msg_in => 'l_run_recTEST.dbout_name', + check_this_in => l_run_recTEST.dbout_name, + against_this_in => 'DUAL'); + wt_assert.eq( + msg_in => 'l_run_recTEST.dbout_type', + check_this_in => l_run_recTEST.dbout_type, + against_this_in => 'TABLE'); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Find DBOUT Happy Path 3'; + l_run_recSAVE := core_data.g_run_rec; + clear_run_rec; + g_DBOUT := 'WTPLSQL:PACKAGE BODY'; + find_dbout; + l_run_recTEST := core_data.g_run_rec; + core_data.g_run_rec := l_run_recSAVE; + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq( + msg_in => 'l_run_recTEST.dbout_owner', + check_this_in => l_run_recTEST.dbout_owner, + against_this_in => USER); + wt_assert.eq( + msg_in => 'l_run_recTEST.dbout_name', + check_this_in => l_run_recTEST.dbout_name, + against_this_in => 'WTPLSQL'); + wt_assert.eq( + msg_in => 'l_run_recTEST.dbout_type', + check_this_in => l_run_recTEST.dbout_type, + against_this_in => 'PACKAGE BODY'); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Find DBOUT Happy Path 4'; + l_run_recSAVE := core_data.g_run_rec; + clear_run_rec; + g_DBOUT := 'WT_EXECUTE_TEST_RUNNER'; + find_dbout; + l_run_recTEST := core_data.g_run_rec; + core_data.g_run_rec := l_run_recSAVE; + -------------------------------------- WTPLSQL Testing -- + wt_assert.eq( + msg_in => 'l_run_recTEST.dbout_owner', + check_this_in => l_run_recTEST.dbout_owner, + against_this_in => USER); + wt_assert.eq( + msg_in => 'l_run_recTEST.dbout_name', + check_this_in => l_run_recTEST.dbout_name, + against_this_in => 'WT_EXECUTE_TEST_RUNNER'); + wt_assert.eq( + msg_in => 'l_run_recTEST.dbout_type', + check_this_in => l_run_recTEST.dbout_type, + against_this_in => 'PROCEDURE'); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 'Find DBOUT Sad Path 1'; + l_run_recSAVE := core_data.g_run_rec; + clear_run_rec; + g_DBOUT := 'someone.bogus:thingy'; + find_dbout; + l_run_recTEST := core_data.g_run_rec; + core_data.g_run_rec := l_run_recSAVE; + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull( + msg_in => 'l_run_recTEST.dbout_owner', + check_this_in => l_run_recTEST.dbout_owner); + wt_assert.isnull( + msg_in => 'l_run_recTEST.dbout_name', + check_this_in => l_run_recTEST.dbout_name); + wt_assert.isnull( + msg_in => 'l_run_recTEST.dbout_type', + check_this_in => l_run_recTEST.dbout_type); + wt_assert.isnotnull( + msg_in => 'l_run_recTEST.error_message', + check_this_in => l_run_recTEST.error_message); wt_assert.eqqueryvalue ( - msg_in => 'Number of Records', - check_query_in => 'select count(*) from wt_test_runs' || - ' where id = ' || l_test_runs_rec.id, + msg_in => 'l_run_recTEST.error_message', + check_query_in => 'select 1 from dual where ''' || + l_run_recTEST.error_message || + ''' like ''%Unable to find database object "' || + g_DBOUT || '".%''', against_value_in => 1); -------------------------------------- WTPLSQL Testing -- - delete from wt_test_runs - where id = l_test_runs_rec.id; - COMMIT; - wt_assert.eqqueryvalue ( - msg_in => 'Records After Delete', - check_query_in => 'select count(*) from wt_test_runs' || - ' where id = ' || l_test_runs_rec.id, - against_value_in => 0); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'INSERT_TEST_RUN Sad Path 1'; - -- Save/Clear the DBMS_OUPTUT Buffer - loop - DBMS_OUTPUT.GET_LINE ( - line => l_dbmsout_line, - status => l_dbmsout_stat); - exit when l_dbmsout_stat != 0; - l_dbmsout_buff(l_dbmsout_buff.COUNT) := l_dbmsout_line; - l_dbmsout_buff.extend; - end loop; - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnotnull ( - msg_in => 'l_dbmsout_buff.COUNT - 1', - check_this_in => l_dbmsout_buff.COUNT - 1); - -------------------------------------- WTPLSQL Testing -- - select count(*) into l_num_recs from wt_test_runs; - l_test_runs_rec := g_test_runs_rec; - g_test_runs_rec.start_dtm := null; - insert_test_run; - g_test_runs_rec := l_test_runs_rec; + wt_assert.g_testcase := 'Find DBOUT Sad Path 2'; + l_run_recSAVE := core_data.g_run_rec; + clear_run_rec; + g_DBOUT := 'WTPLSQL'; + find_dbout; + g_DBOUT := ''; + l_run_recTEST := core_data.g_run_rec; + core_data.g_run_rec := l_run_recSAVE; + -------------------------------------- WTPLSQL Testing -- + wt_assert.isnull( + msg_in => 'l_run_recTEST.dbout_owner', + check_this_in => l_run_recTEST.dbout_owner); + wt_assert.isnull( + msg_in => 'l_run_recTEST.dbout_name', + check_this_in => l_run_recTEST.dbout_name); + wt_assert.isnull( + msg_in => 'l_run_recTEST.dbout_type', + check_this_in => l_run_recTEST.dbout_type); wt_assert.eqqueryvalue ( - msg_in => 'Number of Records should stay the same', - check_query_in => 'select count(*) from wt_test_runs', - against_value_in => l_num_recs); - -------------------------------------- WTPLSQL Testing -- - DBMS_OUTPUT.GET_LINE ( - line => l_dbmsout_line, - status => l_dbmsout_stat); - wt_assert.eq ( - msg_in => 'DBMS_OUTPUT Status', - check_this_in => l_dbmsout_stat, - against_this_in => 0); - -------------------------------------- WTPLSQL Testing -- - if wt_assert.last_pass - then - wt_assert.isnotnull ( - msg_in => 'DBMS_OUTPUT Line', - check_this_in => l_dbmsout_line); - wt_assert.this ( - msg_in => 'Confirm DBMS_OUTPUT Line text', - check_this_in => (l_dbmsout_line like 'ORA-01400: cannot insert NULL into ("WTP"."WT_TEST_RUNS"."START_DTM")%')); - -------------------------------------- WTPLSQL Testing -- - if not wt_assert.last_pass - then - -- No match, put the line back into DBMS_OUTPUT buffer and end this. - DBMS_OUTPUT.PUT_LINE(l_dbmsout_line); - end if; - end if; - -------------------------------------- WTPLSQL Testing -- - -- Restore the DBMS_OUPTUT Buffer - for i in 1 .. l_dbmsout_buff.COUNT - 1 - loop - DBMS_OUTPUT.PUT_LINE(l_dbmsout_buff(i)); - end loop; - wt_assert.isnotnull ( - msg_in => 'l_dbmsout_buff.COUNT - 1', - check_this_in => l_dbmsout_buff.COUNT - 1); - end t_insert_test_run; + msg_in => 'l_run_recTEST.error_message', + check_query_in => 'select 1 from dual where ''' || + l_run_recTEST.error_message || + ''' like ''%Found too many database objects "' || + g_DBOUT || '".%''', + against_value_in => 1); + end t_find_dbout; $END ----------------%WTPLSQL_end_ignore_lines%---------------- @@ -382,6 +538,14 @@ --------------------- +------------------------------------------------------------ +function get_runner_entry_point + return varchar2 +is +begin + return C_RUNNER_ENTRY_POINT; +end get_runner_entry_point; + ------------------------------------------------------------ function show_version return varchar2 @@ -431,89 +595,51 @@ procedure test_run (in_package_name in varchar2) is - l_test_runs_rec_NULL wt_test_runs%ROWTYPE; + pragma AUTONOMOUS_TRANSACTION; -- Required if called as Remote Procedure Call (RPC) l_error_stack varchar2(32000); - procedure concat_err_message is begin - if g_test_runs_rec.error_message is not null - then - g_test_runs_rec.error_message := substr(l_error_stack || CHR(10)|| - g_test_runs_rec.error_message - ,1,4000); - else - g_test_runs_rec.error_message := l_error_stack; - end if; - end concat_err_message; begin - $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ - $THEN - -- This will avoid running the TEST_RUN procedure for some self-tests - if wtplsql_skip_test - then + $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ + if wtplsql_skip_test then test_all_aa(in_package_name) := 'X'; - return; + return; -- Avoid running the TEST_RUN procedure for some self-tests end if; - --DBMS_OUTPUT.PUT_LINE('DEBUG WTPLSQL selftest Enabled for Test Runner "' || in_package_name || '"'); $END ----------------%WTPLSQL_end_ignore_lines%---------------- - -- Reset the Test Runs Record before checking anything - g_test_runs_rec := l_test_runs_rec_NULL; - g_test_runs_rec.id := wt_test_runs_seq.nextval; - g_test_runs_rec.start_dtm := systimestamp; - g_test_runs_rec.runner_owner := USER; - g_test_runs_rec.runner_name := in_package_name; - g_test_runs_rec.error_message := ''; - check_runner; + -- Start a new Transaction + COMMIT; -- Initialize - delete_runs(in_runner_owner => g_test_runs_rec.runner_owner -- Autonomous Transaction COMMIT - ,in_runner_name => g_test_runs_rec.runner_name); + core_data.init1(in_package_name); + g_DBOUT := ''; wt_assert.reset_globals; - wt_test_run_stat.initialize; - wt_result.initialize(g_test_runs_rec.id); - wt_profiler.initialize(in_test_run_id => g_test_runs_rec.id, - in_runner_name => g_test_runs_rec.runner_name, - out_dbout_owner => g_test_runs_rec.dbout_owner, - out_dbout_name => g_test_runs_rec.dbout_name, - out_dbout_type => g_test_runs_rec.dbout_type, - out_trigger_offset => g_test_runs_rec.trigger_offset, - out_profiler_runid => g_test_runs_rec.profiler_runid, - out_error_message => l_error_stack); - concat_err_message; + -- Reset the Test Runs Record before checking anything + check_runner; + hook.before_test_run; + core_data.init2; -- Call the Test Runner begin - execute immediate 'BEGIN ' || in_package_name || '.WTPLSQL_RUN; END;'; + hook.execute_test_runner; exception when OTHERS then l_error_stack := dbms_utility.format_error_stack || dbms_utility.format_error_backtrace ; - concat_err_message; + core_data.run_error(l_error_stack); + wt_assert.isnull + (msg_in => 'Un-handled Exception from Test Runner' + ,check_this_in => substr(core_data.g_run_rec.error_message,1,60)); end; - -- Finalize - insert_test_run; -- Autonomous Transaction COMMIT - wt_profiler.finalize; -- Autonomous Transaction COMMIT - wt_result.finalize; -- Autonomous Transaction COMMIT - wt_test_run_stat.finalize; -- Autonomous Transaction COMMIT - -exception - when OTHERS - then - l_error_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - if g_test_runs_rec.id is null - then - DBMS_OUTPUT.PUT_LINE(l_error_stack); - DBMS_OUTPUT.PUT_LINE('---------------------------'); - DBMS_OUTPUT.PUT_LINE(g_test_runs_rec.error_message); - else - concat_err_message; - insert_test_run; -- Autonomous Transaction COMMIT - end if; - wt_profiler.finalize; -- Autonomous Transaction COMMIT - wt_result.finalize; -- Autonomous Transaction COMMIT - wt_test_run_stat.finalize; -- Autonomous Transaction COMMIT - + rollback; -- Discard any pending transactions. + core_data.finalize; + find_dbout; + hook.after_test_run; + -- Required if called as Remote Procedure Call (RPC) + COMMIT; +--exception +-- when OTHERS +-- then Allow WTPLSQL exception (Unhandled) end test_run; + --==============================================================-- -- No Unit Test for TEST_RUN. -- Too complicated because testing occurs while the TEST_RUN @@ -527,25 +653,27 @@ TYPE runners_nt_type is table of varchar2(128); l_runners_nt runners_nt_type; begin - select package_name + $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ + if NOT wtplsql_skip_test then + hook.before_test_all; -- Avoid running the hook for some self-tests + end if; + $END ----------------%WTPLSQL_end_ignore_lines%---------------- + select object_name bulk collect into l_runners_nt - from user_arguments t1 - where object_name = 'WTPLSQL_RUN' - and position = 1 - and sequence = 0 - and data_type is null - and not exists ( - select 'x' from user_arguments t2 - where t2.object_name = t1.object_name - and t2.position > t1.position - and t2.sequence > t1.sequence - and ( t2.overload is null - OR t2.overload = t1.overload) - ); + from user_procedures t1 + where procedure_name = C_RUNNER_ENTRY_POINT + and object_type = 'PACKAGE' + group by object_name + order by object_name; for i in 1 .. l_runners_nt.COUNT loop test_run(l_runners_nt(i)); end loop; + $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ + if NOT wtplsql_skip_test then + hook.after_test_all; -- Avoid running the hook for some self-tests + end if; + $END ----------------%WTPLSQL_end_ignore_lines%---------------- end test_all; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ @@ -564,217 +692,22 @@ -------------------------------------- WTPLSQL Testing -- wt_assert.this ( msg_in => 'test_all_aa.EXISTS(''WTPLSQL'')', - check_this_in => test_all_aa.EXISTS('WTPLSQL')); + check_this_in => test_all_aa.EXISTS( 'WTPLSQL' )); end t_test_all; $END ----------------%WTPLSQL_end_ignore_lines%---------------- ------------------------------------------------------------- -procedure delete_runs - (in_test_run_id in number) -is - PRAGMA AUTONOMOUS_TRANSACTION; -begin - -- Profiler delete must be first because it contains a - -- PRAGMA AUTONOMOUS_TRANSACTION - wt_test_run_stat.delete_records(in_test_run_id); - wt_profiler.delete_records(in_test_run_id); - wt_result.delete_records(in_test_run_id); - delete from wt_test_runs where id = in_test_run_id; - COMMIT; -end delete_runs; - -procedure delete_runs - (in_runner_owner in varchar2 - ,in_runner_name in varchar2) -is - num_recs number; -begin - num_recs := 1; - for buf2 in (select id from wt_test_runs - where runner_owner = in_runner_owner - and runner_name = in_runner_name - order by start_dtm desc, id desc) - loop - -- Keep the last 20 rest runs for this USER - if num_recs > C_KEEP_NUM_RECS - then - -- Autonomous Transaction COMMIT - delete_runs(buf2.id); - end if; - num_recs := num_recs + 1; - end loop; -end delete_runs; - -$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ -$THEN - procedure t_delete_run_id - is - l_num_recs number; - l_err_stack varchar2(32000); - begin - -------------------------------------- WTPLSQL Testing -- - -- DELETE_RECORDS has already run when we arrive here. - -- Cleanup from previous test - delete from wt_test_runs - where id between 0-C_KEEP_NUM_RECS and 0-1; - commit; - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'DELETE_RUNS Happy Path 1'; - select count(*) - into l_num_recs - from wt_test_runs - where runner_owner = USER - and runner_name = g_test_runs_rec.runner_name; - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnotnull ( - msg_in => 'Number of Records Before Insert', - check_this_in => l_num_recs); - wt_assert.this ( - msg_in => 'Number of Records Before Insert <= ' || C_KEEP_NUM_RECS, - check_this_in => l_num_recs <= C_KEEP_NUM_RECS); - -------------------------------------- WTPLSQL Testing -- - insert into wt_test_runs values g_test_runs_rec; - COMMIT; - wt_assert.eqqueryvalue ( - msg_in => 'Number of Records After Insert', - check_query_in => 'select count(*) from wt_test_runs' || - ' where id = ' || g_test_runs_rec.id, - against_value_in => 1); - delete_runs(g_test_runs_rec.id); -- Autonomous Transaction - -------------------------------------- WTPLSQL Testing -- - wt_assert.eqqueryvalue ( - msg_in => 'Number of Records After Delete', - check_query_in => 'select count(*) from wt_test_runs' || - ' where id = ' || g_test_runs_rec.id, - against_value_in => 0); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'DELETE_RUNS Happy Path 2'; - wt_assert.eqqueryvalue ( - msg_in => 'Confirm number of records', - check_query_in => 'select count(*) from wt_test_runs' || - ' where runner_owner = ''' || USER || - ''' and runner_name = ''' || g_test_runs_rec.runner_name || - '''', - against_value_in => l_num_recs); - -------------------------------------- WTPLSQL Testing -- - for i in 1 .. C_KEEP_NUM_RECS - loop - insert into wt_test_runs - (id, start_dtm, runner_owner, runner_name) - values - (0-i, sysdate-7000-i, USER, g_test_runs_rec.runner_name); - end loop; - commit; - -------------------------------------- WTPLSQL Testing -- - wt_assert.eqqueryvalue ( - msg_in => 'Check Added ' || C_KEEP_NUM_RECS || ' records', - check_query_in => 'select count(*) from wt_test_runs' || - ' where runner_owner = ''' || USER || - ''' and runner_name = ''' || g_test_runs_rec.runner_name || - '''', - against_value_in => l_num_recs + C_KEEP_NUM_RECS); - delete_runs(USER, g_test_runs_rec.runner_name); - -------------------------------------- WTPLSQL Testing -- - wt_assert.eqqueryvalue ( - msg_in => 'Check number of records reduced', - check_query_in => 'select count(*) from wt_test_runs' || - ' where runner_owner = ''' || USER || - ''' and runner_name = ''' || g_test_runs_rec.runner_name || - '''', - against_value_in => C_KEEP_NUM_RECS); - delete from wt_test_runs - where id between 0-C_KEEP_NUM_RECS and 0-1; - commit; - -------------------------------------- WTPLSQL Testing -- - wt_assert.eqqueryvalue ( - msg_in => 'Confirm original number of records', - check_query_in => 'select count(*) from wt_test_runs' || - ' where runner_owner = ''' || USER || - ''' and runner_name = ''' || g_test_runs_rec.runner_name || - '''', - against_value_in => l_num_recs); - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'DELETE_RUNS Sad Path 1'; - begin - delete_runs(-9995); -- Should run without error - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - exception when others then - l_err_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - end; - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull ( - msg_in => 'Delete Runs(-9995)', - check_this_in => l_err_stack); - end t_delete_run_id; -$END ----------------%WTPLSQL_end_ignore_lines%---------------- - - --==============================================================-- $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN - procedure t_test_runs_rec_and_table - is - begin - -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'TEST_RUNS_REC_AND_TABLE Happy Path'; - -- This Test Case runs in the EXECUTE IMMEDAITE in the TEST_RUN - -- procedure in this package. - wt_assert.isnotnull - (msg_in => 'g_test_runs_rec.id' - ,check_this_in => g_test_runs_rec.id); - wt_assert.isnotnull - (msg_in => 'g_test_runs_rec.start_dtm' - ,check_this_in => g_test_runs_rec.start_dtm); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnotnull - (msg_in => 'g_test_runs_rec.runner_owner' - ,check_this_in => g_test_runs_rec.runner_owner); - wt_assert.eq - (msg_in => 'g_test_runs_rec.runner_name' - ,check_this_in => g_test_runs_rec.runner_name - ,against_this_in => 'WTPLSQL'); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull - (msg_in => 'g_test_runs_rec.dbout_owner' - ,check_this_in => g_test_runs_rec.dbout_owner); - wt_assert.isnull - (msg_in => 'g_test_runs_rec.dbout_name' - ,check_this_in => g_test_runs_rec.dbout_name); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull - (msg_in => 'g_test_runs_rec.dbout_type' - ,check_this_in => g_test_runs_rec.dbout_type); - wt_assert.isnull - (msg_in => 'g_test_runs_rec.profiler_runid' - ,check_this_in => g_test_runs_rec.profiler_runid); - -------------------------------------- WTPLSQL Testing -- - wt_assert.isnull - (msg_in => 'g_test_runs_rec.end_dtm' - ,check_this_in => g_test_runs_rec.end_dtm); - wt_assert.isnull - (msg_in => 'g_test_runs_rec.error_message' - ,check_this_in => g_test_runs_rec.error_message); - -------------------------------------- WTPLSQL Testing -- - wt_assert.eqqueryvalue - (msg_in => 'TEST_RUNS Record for this TEST_RUN' - ,check_query_in => 'select count(*) from WT_TEST_RUNS' || - ' where id = ''' || g_test_runs_rec.id || '''' - ,against_value_in => 0); - end t_test_runs_rec_and_table; - ---------------------------------------- procedure WTPLSQL_RUN is begin -------------------------------------- WTPLSQL Testing -- - t_show_version; t_check_runner; - t_insert_test_run; + t_find_dbout; + t_show_version; t_test_all; - t_delete_run_id; - t_test_runs_rec_and_table; end; $END ----------------%WTPLSQL_end_ignore_lines%---------------- --==============================================================-- diff --git a/docs/core/DBDocs/package body/WT_ASSERT.html b/docs/core/DBDocs/package body/WT_ASSERT.html index 20edb69..2ccf53f 100644 --- a/docs/core/DBDocs/package body/WT_ASSERT.html +++ b/docs/core/DBDocs/package body/WT_ASSERT.html @@ -46,7 +46,7 @@
    -

    See (public) RESET_GLOBALS procedure for default global values


    +


    @@ -69,7 +69,7 @@ OBJECT_ID -41932 +42813 DATA_OBJECT_ID @@ -81,15 +81,15 @@ CREATED -29-JUN-2018 15:09:16 +25-NOV-2018 19:55:41 LAST_DDL_TIME -29-JUN-2018 15:21:16 +25-NOV-2018 19:55:41 TIMESTAMP -2018-06-29:15:21:16 +2018-11-25:19:55:41 STATUS @@ -171,15 +171,6 @@
     package body wt_assert is
     
    -   -- See (public) RESET_GLOBALS procedure for default global values
    -   TYPE g_rec_type is record
    -      (last_pass        boolean
    -      ,raise_exception  boolean
    -      ,last_assert      wt_results.assertion%TYPE
    -      ,last_msg         wt_results.message%TYPE
    -      ,last_details     wt_results.details%TYPE);
    -   g_rec  g_rec_type;
    -
        $IF $$WTPLSQL_SELFTEST $THEN  ------%WTPLSQL_begin_ignore_lines%------
           temp_rowid1 CONSTANT rowid          := chartorowid('AAAFd1AAFAAAABSAA/');
           temp_rowid2 CONSTANT rowid          := chartorowid('AAAFd1AAFAAAABSAB/');
    @@ -265,33 +256,32 @@
     procedure process_assertion
     is
     begin
    -
     $IF $$WTPLSQL_SELFTEST $THEN  ------%WTPLSQL_begin_ignore_lines%------
        if not wtplsql_skip_save then
     $END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -   wt_result.save
    -      (in_assertion      => g_rec.last_assert
    -      ,in_status         => case g_rec.last_pass
    -                            when TRUE then C_PASS
    -                                      else C_FAIL
    -                            end
    -      ,in_details        => g_rec.last_details
    -      ,in_testcase       => g_testcase
    -      ,in_message        => g_rec.last_msg);
    +   if core_data.g_run_rec.runner_name is null
    +   then
    +      hook.ad_hoc_report;
    +   else
    +      core_data.add
    +         (in_testcase  => g_testcase
    +         ,in_assertion => g_rec.last_assert
    +         ,in_pass      => g_rec.last_pass
    +         ,in_details   => g_rec.last_details
    +         ,in_message   => g_rec.last_msg);
    +   end if;
     $IF $$WTPLSQL_SELFTEST $THEN   ------%WTPLSQL_begin_ignore_lines%------
        end if;
     $END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -   if g_rec.raise_exception and not g_rec.last_pass
    +   hook.after_assertion;
    +   if     g_rec.raise_exception
    +      and not g_rec.last_pass
        then
    -      raise_application_error(-20003, wt_text_report.format_test_result
    -                                         (in_assertion      => g_rec.last_assert
    -                                         ,in_status         => C_FAIL
    -                                         ,in_details        => g_rec.last_details
    -                                         ,in_testcase       => g_testcase
    -                                         ,in_message        => g_rec.last_msg) );
    +      raise_application_error(-20003, g_rec.last_msg      || CHR(10) ||
    +         ' Assertion ' || g_rec.last_assert || ' Failed.' || CHR(10) ||
    +         ' Testcase: ' || g_testcase                      || CHR(10) ||
    +                   ' ' || g_rec.last_details              );
        end if;
    -
     end process_assertion;
     
     $IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    @@ -300,7 +290,7 @@
        is
        begin
           --------------------------------------  WTPLSQL Testing --
    -      g_testcase  := 'PROCESS_ASSERTION';
    +      g_testcase            := 'PROCESS_ASSERTION';
           g_rec.last_assert     := 'THIS';
           g_rec.last_pass       := FALSE;
           g_rec.last_details    := 'Expected "PASS" and got "FAIL"';
    @@ -340,7 +330,7 @@
     'declare
        cursor cur is ' || l_qry_txt || ';
        rec cur%rowtype;
    -begin     
    +begin
        open cur;
        fetch cur into rec;
     	:ret_txt := case cur%FOUND when TRUE then ''FOUND''
    @@ -425,21 +415,21 @@
     end last_pass;
     
     function last_assert
    -   return wt_results.assertion%TYPE
    +   return varchar2
     is
     begin
        return g_rec.last_assert;
     end last_assert;
     
     function last_msg
    -   return wt_results.message%TYPE
    +   return varchar2
     is
     begin
        return g_rec.last_msg;
     end last_msg;
     
     function last_details
    -   return wt_results.details%TYPE
    +   return varchar2
     is
     begin
        return g_rec.last_details;
    @@ -484,10 +474,10 @@
     begin
        g_testcase            := '';
        g_rec.last_pass       := NULL;
    +   g_rec.raise_exception := FALSE;
        g_rec.last_assert     := '';
        g_rec.last_msg        := '';
        g_rec.last_details    := '';
    -   g_rec.raise_exception := FALSE;
     end reset_globals;
     
     $IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    @@ -640,7 +630,7 @@
     is
     begin
        g_rec.last_assert  := 'THIS';
    -   g_rec.last_msg     := msg_in;
    +   g_rec.last_msg     := substr(msg_in,1,200);
        g_rec.last_pass    := nvl(check_this_in, FALSE);
        g_rec.last_details := 'Expected "TRUE" and got "' ||
                               boolean_to_status(check_this_in) || '"';
    @@ -1092,14 +1082,14 @@
              check_this_in   => (temp_rec.last_pass = FALSE));
           --------------------------------------  WTPLSQL Testing --
           -- VARCHAR2 includes Includes LONG RAW
    -      wt_assert.g_testcase := 'EQ LANG RAW Happy Path 1';
    +      wt_assert.g_testcase := 'EQ LONG RAW Happy Path 1';
           eq (
              msg_in          => 'Run Test',
              check_this_in   => temp_lraw1,
              against_this_in => temp_lraw1);
           --------------------------------------  WTPLSQL Testing --
           -- VARCHAR2 includes Includes LONG RAW
    -      wt_assert.g_testcase := 'EQ LANG RAW Happy Path 1';
    +      wt_assert.g_testcase := 'EQ LONG RAW Happy Path 1';
           wtplsql_skip_save := TRUE;
           eq (
              msg_in          => 'Not Used',
    @@ -2533,7 +2523,7 @@
        end if;
        if not g_rec.last_pass
        then
    -      g_rec.last_details := 
    +      g_rec.last_details :=
              substr(g_rec.last_details || ' Error Stack: ' || l_errstack, 1, 4000);
        end if;
        process_assertion;
    @@ -4041,9 +4031,11 @@
     $THEN
        -- Can't profile this package because all the "assert" tests
        --   pause profiling before they execute.
    -   procedure WTPLSQL_RUN  --% WTPLSQL SET DBOUT "WT_ASSERT:PACKAGE BODY" %--
    +   procedure WTPLSQL_RUN
        is
        begin
    +      wtplsql.g_DBOUT := 'WT_ASSERT:PACKAGE BODY';
    +      hook.g_run_assert_hook := FALSE;
           select temp_clob,  temp_nclob,  temp_xml,  temp_blob
            into  temp_clob1, temp_nclob1, temp_xml1, temp_blob1
            from  wt_self_test where id = 1;
    @@ -4056,9 +4048,9 @@
           t_reset_globals;
           t_this;
           t_eq;
    +      --------------------------------------  WTPLSQL Testing --
           t_isnotnull;
           t_isnull;
    -      --------------------------------------  WTPLSQL Testing --
           t_raises;
           t_eqqueryvalue;
           t_eqquery;
    @@ -4066,13 +4058,14 @@
           t_eqtabcount;
           t_object_exists;
           t_object_not_exists;
    +      --------------------------------------  WTPLSQL Testing --
    +      hook.g_run_assert_hook := TRUE;
        end WTPLSQL_RUN;
     $END  ----------------%WTPLSQL_end_ignore_lines%----------------
     --==============================================================--
     
     
    -end wt_assert;
    -
    +end wt_assert;
    diff --git a/docs/core/DBDocs/package body/WT_PROFILER.html b/docs/core/DBDocs/package body/WT_PROFILER.html deleted file mode 100644 index 807c74b..0000000 --- a/docs/core/DBDocs/package body/WT_PROFILER.html +++ /dev/null @@ -1,2167 +0,0 @@ - - - - - - - - -
    -
    -
    -

    Doc

    -
    -
    -
    -
    -

    Details

    -
    -
    -
    -
    -

    Grants

    -
    -
    -
    -
    -

    References

    -
    -
    -
    -
    -

    Dependencies

    -
    -
    -
    -
    -

    Code

    -
    -
    -
    -
    -
    -
    -
    - -


    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMEWT_PROFILER
    SUBOBJECT_NAMEnull
    OBJECT_ID41933
    DATA_OBJECT_IDnull
    OBJECT_TYPEPACKAGE BODY
    CREATED29-JUN-2018 15:09:17
    LAST_DDL_TIME29-JUN-2018 15:21:17
    TIMESTAMP2018-06-29:15:21:17
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE2
    EDITION_NAMEnull
    -
    -
    -
    -
    - - - - - - - - - - - - - - - -
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    EXECUTEPUBLICNOWTPWT_PROFILER
    -
    -
    -
    -
    - - - - - - - - - -
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    -
    -
    -
    -
    - - - - - - - - - -
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    -
    -
    -
    -
    -
    -package body wt_profiler
    -as
    -
    -   TYPE rec_type is record
    -      (test_run_id     wt_test_runs.id%TYPE
    -      ,dbout_owner     wt_test_runs.dbout_owner%TYPE
    -      ,dbout_name      wt_test_runs.dbout_name%TYPE
    -      ,dbout_type      wt_test_runs.dbout_type%TYPE
    -      ,prof_runid      binary_integer
    -      ,trigger_offset  binary_integer
    -      ,error_message   varchar2(4000));
    -   g_rec  rec_type;
    -
    -   TYPE ignr_aa_type is table
    -      of varchar2(1)
    -      index by PLS_INTEGER;
    -   g_ignr_aa   ignr_aa_type;
    -
    -   $IF $$WTPLSQL_SELFTEST $THEN  ------%WTPLSQL_begin_ignore_lines%------
    -      g_skip_insert  boolean := FALSE;
    -      g_skip_add     boolean := FALSE;
    -   $END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -----------------------
    ---  Private Procedures
    -----------------------
    -
    -
    ---==============================================================--
    -$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -$THEN
    -
    -   procedure tl_compile_db_object
    -         (in_ptype   in varchar2
    -         ,in_pname   in varchar2
    -         ,in_source  in varchar2)
    -   is
    -      l_sql_txt  varchar2(4000);
    -      l_errtxt   varchar2(32000) := '';
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      -- Wrap in_source to complete the DDL statement
    -      l_sql_txt := 'create or replace ' || in_ptype || ' ' ||
    -                   in_pname || ' is' || CHR(10) ||
    -                   in_source || CHR(10) ||
    -                   'end ' || in_pname || ';';
    -      wt_assert.raises
    -         (msg_in         => 'Compile ' || in_ptype || ' ' || in_pname
    -         ,check_call_in  => l_sql_txt
    -         ,against_exc_in => '');
    -      --------------------------------------  WTPLSQL Testing --
    -      for buff in (select * from user_errors
    -                    where attribute = 'ERROR'
    -                     and  name      = in_pname
    -                     and  type      = in_ptype
    -                    order by sequence)
    -      loop
    -         l_errtxt := l_errtxt || buff.line || ', ' ||
    -            buff.position || ': ' || buff.text || CHR(10);
    -      end loop;
    -      wt_assert.isnull
    -         (msg_in        => 'Compile ' || in_ptype || ' ' || in_pname ||
    -                            ' Error'
    -         ,check_this_in => l_errtxt);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.objexists (
    -         msg_in        => in_pname || ' ' || in_ptype,
    -         obj_owner_in  => USER,
    -         obj_name_in   => upper(in_pname),
    -         obj_type_in   => upper(in_ptype));
    -   end tl_compile_db_object;
    ---==============================================================--
    -      --------------------------------------  WTPLSQL Testing --
    -   procedure tl_drop_db_object
    -      (in_pname  in  varchar2,
    -       in_ptype  in  varchar2)
    -   is
    -      l_sql_txt  varchar2(4000);
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      l_sql_txt := 'drop ' || in_ptype || ' ' || in_pname;
    -      wt_assert.raises
    -         (msg_in         => 'drop ' || in_ptype || ' ' || in_pname
    -         ,check_call_in  => l_sql_txt
    -         ,against_exc_in => '');
    -      wt_assert.objnotexists (
    -         msg_in        => in_pname || ' ' || in_ptype,
    -         obj_owner_in  => USER,
    -         obj_name_in   => upper(in_pname),
    -         obj_type_in   => upper(in_ptype));
    -   end tl_drop_db_object;
    ---==============================================================--
    -      --------------------------------------  WTPLSQL Testing --
    -   procedure tl_count_plsql_profiler_recs
    -         (in_test_run_id     in number
    -         ,in_expected_count  in number)
    -   is
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eqqueryvalue
    -         (msg_in           => 'Number of plsql_profiler_runs (' || in_test_run_id || ')'
    -         ,check_query_in   => 'select count(*) from plsql_profiler_runs' ||
    -                              ' where runid = ' || in_test_run_id
    -         ,against_value_in => in_expected_count);
    -      wt_assert.eqqueryvalue
    -         (msg_in           => 'Number of plsql_profiler_units (' || in_test_run_id || ')'
    -         ,check_query_in   => 'select count(*) from plsql_profiler_units' ||
    -                              ' where runid = ' || in_test_run_id
    -         ,against_value_in => in_expected_count);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eqqueryvalue
    -         (msg_in           => 'Number of plsql_profiler_data (' || in_test_run_id || ')'
    -         ,check_query_in   => 'select count(*) from plsql_profiler_data' ||
    -                              ' where runid = ' || in_test_run_id
    -         ,against_value_in => in_expected_count);
    -   end tl_count_plsql_profiler_recs;
    ---==============================================================--
    -      --------------------------------------  WTPLSQL Testing --
    -   procedure tl_insert_plsql_profiler_recs
    -         (in_test_run_id     in number)
    -   is
    -      l_sql_txt    varchar2(4000);
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      l_sql_txt := 'insert into plsql_profiler_runs (runid)' ||
    -                   ' values (' || in_test_run_id || ')';
    -      wt_assert.raises (
    -         msg_in         => 'insert plsql_profiler_runs (' || in_test_run_id || ')',
    -         check_call_in  => l_sql_txt,
    -         against_exc_in => '');
    -      --------------------------------------  WTPLSQL Testing --
    -      l_sql_txt := 'insert into plsql_profiler_units (runid, unit_number, total_time)' ||
    -                   ' values (' || in_test_run_id || ', ' || in_test_run_id || ', 0)';
    -      wt_assert.raises (
    -         msg_in         => 'insert plsql_profiler_units (' || in_test_run_id || ')',
    -         check_call_in  => l_sql_txt,
    -         against_exc_in => '');
    -      --------------------------------------  WTPLSQL Testing --
    -      l_sql_txt := 'insert into plsql_profiler_data (runid, unit_number, line#)' ||
    -                   ' values (' || in_test_run_id || ', ' || in_test_run_id || ', 0)';
    -      wt_assert.raises (
    -         msg_in         => 'insert plsql_profiler_data (RUNID: ' || in_test_run_id || ')',
    -         check_call_in  => l_sql_txt,
    -         against_exc_in => '');
    -      commit;
    -   end tl_insert_plsql_profiler_recs;
    ---==============================================================--
    -      --------------------------------------  WTPLSQL Testing --
    -   procedure tl_delete_plsql_profiler_recs
    -         (in_test_run_id     in number)
    -   is
    -      l_sql_txt    varchar2(4000);
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      l_sql_txt := 'delete from plsql_profiler_data' ||
    -                   ' where runid = ' || in_test_run_id;
    -      wt_assert.raises (
    -         msg_in         => 'delete plsql_profiler_data (' || in_test_run_id || ')',
    -         check_call_in  => l_sql_txt,
    -         against_exc_in => '');
    -      --------------------------------------  WTPLSQL Testing --
    -      l_sql_txt := 'delete from plsql_profiler_units' ||
    -                   ' where runid = ' || in_test_run_id;
    -      wt_assert.raises (
    -         msg_in         => 'delete plsql_profiler_units (' || in_test_run_id || ')',
    -         check_call_in  => l_sql_txt,
    -         against_exc_in => '');
    -      --------------------------------------  WTPLSQL Testing --
    -      l_sql_txt := 'delete from plsql_profiler_runs' ||
    -                   ' where runid = ' || in_test_run_id;
    -      wt_assert.raises (
    -         msg_in         => 'delete plsql_profiler_runs (' || in_test_run_id || ')',
    -         check_call_in  => l_sql_txt,
    -         against_exc_in => '');
    -      commit;
    -   end tl_delete_plsql_profiler_recs;
    ---==============================================================--
    -      --------------------------------------  WTPLSQL Testing --
    -   procedure tl_insert_test_runs
    -         (in_test_run_id  in NUMBER
    -         ,in_runner_name  in varchar2)
    -   is
    -      l_sql_txt    varchar2(4000);
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      l_sql_txt := 'insert into wt_test_runs' ||
    -                   ' (id, start_dtm, runner_owner, runner_name)' ||
    -                   ' values (' || in_test_run_id || ', sysdate, USER, ''' ||
    -                                  in_runner_name || ''')';
    -      wt_assert.raises (
    -         msg_in         => 'Insert wt_test_runs (' || in_test_run_id || ')',
    -         check_call_in  => l_sql_txt,
    -         against_exc_in => '');
    -      wt_assert.eqqueryvalue (
    -         msg_in           => 'wt_test_runs (' || in_test_run_id || ') Count',
    -         check_query_in   => 'select count(*) from wt_test_runs' ||
    -                             ' where id = ' || in_test_run_id,
    -         against_value_in => 1);
    -      commit;
    -   end tl_insert_test_runs;
    ---==============================================================--
    -      --------------------------------------  WTPLSQL Testing --
    -   procedure tl_delete_test_runs
    -         (in_test_run_id  in NUMBER)
    -   is
    -      l_sql_txt  varchar2(4000);
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      l_sql_txt := 'delete from wt_test_runs where id = ' || in_test_run_id;
    -      wt_assert.raises (
    -         msg_in         => 'Delete wt_test_runs (' || in_test_run_id || ')',
    -         check_call_in  => l_sql_txt,
    -         against_exc_in => '');
    -      wt_assert.eqqueryvalue (
    -         msg_in           => 'wt_test_runs (' || in_test_run_id || ') Count',
    -         check_query_in   => 'select count(*) from wt_test_runs' ||
    -                             ' where id = ' || in_test_run_id,
    -         against_value_in => 0);
    -      commit;
    -   end tl_delete_test_runs;
    ---==============================================================--
    -      --------------------------------------  WTPLSQL Testing --
    -   procedure tl_insert_dbout_profiles
    -         (in_rec  in wt_dbout_profiles%ROWTYPE)
    -   is
    -      l_sqlerrm  varchar2(4000);
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      begin
    -         insert into wt_dbout_profiles values in_rec;
    -         l_sqlerrm := SQLERRM;
    -         commit;
    -      exception when others then
    -         l_sqlerrm := SQLERRM;
    -      end;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in        => 'Insert wt_dbout_profiles (' || in_rec.test_run_id ||
    -                                                   ',' || in_rec.line || ')',
    -         check_this_in => l_sqlerrm,
    -         against_this_in => 'ORA-0000: normal, successful completion');
    -      wt_assert.eqqueryvalue (
    -         msg_in           => 'wt_dbout_profiles (' || in_rec.test_run_id || 
    -                                               ',' || in_rec.line || ') Count',
    -         check_query_in   => 'select count(*) from wt_dbout_profiles' ||
    -                             ' where test_run_id = ' || in_rec.test_run_id ||
    -                             ' and line = ' || in_rec.line,
    -         against_value_in => 1);
    -   end tl_insert_dbout_profiles;
    ---==============================================================--
    -      --------------------------------------  WTPLSQL Testing --
    -   procedure tl_delete_dbout_profiles
    -         (in_test_run_id  in NUMBER)
    -   is
    -      l_sql_txt  varchar2(4000);
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      l_sql_txt := 'delete from wt_dbout_profiles where test_run_id = ' ||
    -                    in_test_run_id;
    -      wt_assert.raises (
    -         msg_in         => 'Delete wt_dbout_profiles (' || in_test_run_id || ')',
    -         check_call_in  => l_sql_txt,
    -         against_exc_in => '');
    -      wt_assert.eqqueryvalue (
    -         msg_in           => 'wt_dbout_profiles (' || in_test_run_id || ') Count',
    -         check_query_in   => 'select count(*) from wt_dbout_profiles' ||
    -                             ' where test_run_id = ' || in_test_run_id,
    -         against_value_in => 0);
    -      commit;
    -   end tl_delete_dbout_profiles;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    ---==============================================================--
    -
    -
    -------------------------------------------------------------
    --- Return DBMS_PROFILER specific error messages
    -function get_error_msg
    -      (retnum_in  in  binary_integer)
    -   return varchar2
    -is
    -   l_msg_prefix  varchar2(50) := 'DBMS_PROFILER Error: ';
    -begin
    -   case retnum_in
    -   when dbms_profiler.error_param then return l_msg_prefix ||
    -       'A subprogram was called with an incorrect parameter.';
    -   when dbms_profiler.error_io then return l_msg_prefix ||
    -       'Data flush operation failed.' ||
    -       ' Check whether the profiler tables have been created,' ||
    -       ' are accessible, and that there is adequate space.';
    -   when dbms_profiler.error_version then return l_msg_prefix ||
    -       'There is a mismatch between package and database implementation.' ||
    -       ' Oracle returns this error if an incorrect version of the' ||
    -       ' DBMS_PROFILER package is installed, and if the version of the' ||
    -       ' profiler package cannot work with this database version.';
    -   else return l_msg_prefix ||
    -       'Unknown error number ' || retnum_in;
    -   end case;
    -end get_error_msg;
    -
    -$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -$THEN
    -   procedure t_get_error_msg
    -   is
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Get Error Messages';
    -      wt_assert.isnotnull (
    -         msg_in        => 'ERROR_PARAM Test 1',
    -         check_this_in => get_error_msg(dbms_profiler.error_param));
    -      wt_assert.this (
    -         msg_in        => 'ERROR_PARAM Test 2',
    -         check_this_in => regexp_like(get_error_msg(dbms_profiler.error_param)
    -                                     ,'incorrect parameter','i'));
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnotnull (
    -         msg_in        => 'ERROR_IO Test 1',
    -         check_this_in => get_error_msg(dbms_profiler.error_io));
    -      wt_assert.this (
    -         msg_in        => 'ERROR_IO Test 2',
    -         check_this_in => regexp_like(get_error_msg(dbms_profiler.error_io)
    -                                     ,'Data flush operation','i'));
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnotnull (
    -         msg_in        => 'ERROR_VERSION Test 1',
    -         check_this_in => get_error_msg(dbms_profiler.error_version));
    -      wt_assert.this (
    -         msg_in        => 'ERROR_VERSION Test 2',
    -         check_this_in => regexp_like(get_error_msg(dbms_profiler.error_version)
    -                                     ,'incorrect version','i'));
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnotnull (
    -         msg_in        => 'Unknown Error Test 1',
    -         check_this_in => get_error_msg(-9999));
    -      wt_assert.this (
    -         msg_in        => 'Unknown Error Test 2',
    -         check_this_in => regexp_like(get_error_msg(-9999)
    -                                     ,'Unknown error','i'));
    -   end t_get_error_msg;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -
    -------------------------------------------------------------
    -procedure delete_plsql_profiler_recs
    -      (in_profiler_runid  in number)
    -is
    -   PRAGMA AUTONOMOUS_TRANSACTION;
    -begin
    -   delete from plsql_profiler_data
    -    where runid = in_profiler_runid;
    -   delete from plsql_profiler_units
    -    where runid = in_profiler_runid;
    -   delete from plsql_profiler_runs
    -    where runid = in_profiler_runid;
    -   COMMIT;
    -end delete_plsql_profiler_recs;
    -
    -$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -$THEN
    -   procedure t_delete_profiler_recs
    -   is
    -      c_test_run_id   constant number := -99;
    -      l_err_stack     varchar2(32000);
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Delete PL/SQL Profiler Records Happy Path 1';
    -      begin
    -         delete_plsql_profiler_recs(c_test_run_id);  -- Should run without error
    -         l_err_stack := dbms_utility.format_error_stack     ||
    -                        dbms_utility.format_error_backtrace ;
    -      exception when others then
    -         l_err_stack := dbms_utility.format_error_stack     ||
    -                        dbms_utility.format_error_backtrace ;
    -      end;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in          => 'delete_plsql_profiler_recs(' || c_test_run_id || ') 1',
    -         check_this_in   => l_err_stack);
    -      tl_count_plsql_profiler_recs(c_test_run_id, 0);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Delete PL/SQL Profiler Records Happy Path 2';
    -      tl_insert_plsql_profiler_recs(c_test_run_id);
    -      tl_count_plsql_profiler_recs(c_test_run_id, 1);
    -      begin
    -         delete_plsql_profiler_recs(c_test_run_id);  -- Should run without error
    -         l_err_stack := dbms_utility.format_error_stack     ||
    -                        dbms_utility.format_error_backtrace ;
    -      exception when others then
    -         l_err_stack := dbms_utility.format_error_stack     ||
    -                        dbms_utility.format_error_backtrace ;
    -      end;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in          => 'delete_plsql_profiler_recs(' || c_test_run_id || ') 2',
    -         check_this_in   => l_err_stack);
    -      tl_count_plsql_profiler_recs(c_test_run_id, 0);
    -   end t_delete_profiler_recs;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -
    -------------------------------------------------------------
    -procedure find_dbout
    -      (in_pkg_name  in  varchar2)
    -is
    -   --
    -   -- https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements008.htm#SQLRF51129
    -   -- Within a namespace, no two objects can have the same name.  The following
    -   --   schema objects share one namespace:
    -   --  -) Packages
    -   --  -) Private synonyms
    -   --  -) Sequences
    -   --  -) Stand-alone procedures
    -   --  -) Stand-alone stored functions
    -   --  -) User-defined operators
    -   --  -) User-defined types
    -   --  -) Tables
    -   --  -) Views
    -   -- Each of the following schema objects has its own namespace:
    -   --  -) Clusters
    -   --  -) Constraints
    -   --  -) Database triggers
    -   --  -) Dimensions
    -   --  -) Indexes
    -   --  -) Materialized views (When you create a materialized view, the database
    -   --     creates an internal table of the same name. This table has the same
    -   --     namespace as the other tables in the schema. Therefore, a schema
    -   --     cannot contain a table and a materialized view of the same name.)
    -   --  -) Private database links
    -   -- Because tables and sequences are in the same namespace, a table and a
    -   --   sequence in the same schema cannot have the same name. However, tables
    -   --   and indexes are in different namespaces. Therefore, a table and an index
    -   --   in the same schema can have the same name.
    -   -- Each schema in the database has its own namespaces for the objects it
    -   --   contains. This means, for example, that two tables in different schemas
    -   --   are in different namespaces and can have the same name.
    -   -- Results are unknown if a Database Object Under Test has the same name in
    -   --   different namespaces.
    -   --
    -   -- Head Regular Expression is
    -   --   '--% WTPLSQL SET DBOUT "' - literal string
    -   -- Main Regular Expression is
    -   --   '[[:alnum:] ._$#:]'         - Any alpha, numeric, " ", ".", "_", "$", "#", or ":" character
    -   --   +                         - One or more of the previous characters
    -   -- Tail Regular Expression is
    -   --   '" %--'                   - literal string
    -   C_HEAD_RE CONSTANT varchar2(30) := '--% WTPLSQL SET DBOUT "';
    -   C_MAIN_RE CONSTANT varchar2(30) := '[[:alnum:] ._$#:]+';
    -   C_TAIL_RE CONSTANT varchar2(30) := '" %--';
    -   -- This cursor is used to catch the first occurance of a DBOUT annotation
    -   cursor c_annotation is
    -      select regexp_substr(src.text, C_HEAD_RE||C_MAIN_RE||C_TAIL_RE)  TEXT
    -       from  dba_source  src
    -       where src.owner = USER
    -        and  src.name  = in_pkg_name
    -        and  src.type  = 'PACKAGE BODY'
    -        and  regexp_like(src.text, C_HEAD_RE||C_MAIN_RE||C_TAIL_RE)
    -       order by src.line;
    -   l_target   varchar2(32000);
    -   -- This cursor is used to confirm the PL/SQL source is readable
    -   cursor c_readable is
    -      select *
    -       from  dba_source  src
    -       where src.owner  = g_rec.dbout_owner
    -        and  src.name   = g_rec.dbout_name
    -        and  src.type   = g_rec.dbout_type;
    -   b_readable  c_readable%ROWTYPE;
    -   -- These hold the positions of the separators dot (.) and colon (:)
    -   l_dot_pos   number;
    -   l_cln_pos   number;
    -begin
    -   -- Find the first occurance of the DBOUT annotation
    -   open c_annotation;
    -   fetch c_annotation into l_target;
    -   if c_annotation%NOTFOUND
    -   then
    -      -- No annotation was found, close and end
    -      close c_annotation;
    -      return;
    -   end if;
    -   close c_annotation;
    -   -- Strip the Head Sub-String
    -   l_target := regexp_replace(SRCSTR      => l_target
    -                             ,PATTERN     => '^' || C_HEAD_RE
    -                             ,REPLACESTR  => ''
    -                             ,POSITION    => 1
    -                             ,OCCURRENCE  => 1);
    -   -- Strip the Tail Sub-String
    -   l_target := regexp_replace(SRCSTR      => l_target
    -                             ,PATTERN     => C_TAIL_RE || '$'
    -                             ,REPLACESTR  => ''
    -                             ,POSITION    => 1
    -                             ,OCCURRENCE  => 1);
    -   -- Locate the Owner/Name separator
    -   l_dot_pos := instr(l_target,'.');
    -   l_cln_pos := instr(l_target,':');
    -   begin
    -      select obj.owner
    -            ,obj.object_name
    -            ,obj.object_type
    -       into  g_rec.dbout_owner
    -            ,g_rec.dbout_name
    -            ,g_rec.dbout_type
    -       from  dba_objects  obj
    -       where (   ( -- No separators were given, assume USER is the owner.
    -                   -- No object type was given. This could throw TOO_MANY_ROWS.
    -                      l_dot_pos       = 0
    -                  and l_cln_pos       = 0
    -                  and obj.owner       = USER
    -                  and obj.object_name = l_target  )
    -              OR ( -- No object type was given. This could throw TOO_MANY_ROWS.
    -                      l_dot_pos      != 0
    -                  and l_cln_pos       = 0
    -                  and obj.owner       = substr(l_target, 1, l_dot_pos-1)
    -                  and obj.object_name = substr(l_target, l_dot_pos+1, 512) )
    -              OR ( -- No object owner was given, assume USER is the owner.
    -                      l_dot_pos       = 0
    -                  and l_cln_pos      != 0
    -                  and obj.owner       = USER
    -                  and obj.object_name = substr(l_target, 1, l_cln_pos-1)
    -                  and obj.object_type = substr(l_target, l_cln_pos+1, 512) )
    -              OR ( -- All separators were given
    -                      l_dot_pos      != 0
    -                  and l_cln_pos      != 0
    -                  and obj.owner       = substr(l_target, 1, l_dot_pos-1)
    -                  and obj.object_name = substr(l_target, l_dot_pos+1, l_cln_pos-l_dot_pos-1)
    -                  and obj.object_type = substr(l_target, l_cln_pos+1, 512) )
    -             );
    -   exception
    -      when NO_DATA_FOUND
    -      then
    -         g_rec.error_message := 'Unable to find database object "' ||
    -                                 l_target  || '".';
    -         return;
    -      when TOO_MANY_ROWS
    -      then
    -         g_rec.error_message := 'Found too many database objects "' ||
    -                                 l_target || '".';
    -         return;
    -   end;
    -   -- Find the first occurance of any PL/SQL source
    -   open c_readable;
    -   fetch c_readable into b_readable;
    -   if c_readable%NOTFOUND
    -   then
    -      if g_rec.dbout_type in ('FUNCTION', 'PROCEDURE', 'PACKAGE BODY',
    -                              'TYPE BODY', 'TRIGGER')
    -      then
    -         -- These object types should have PL/SQL source code available
    -         --%WTPLSQL_begin_ignore_lines%--  Untestable:
    -         g_rec.error_message := 'Unable to read source for ' || g_rec.dbout_type ||
    -                             ' ' || g_rec.dbout_owner || '.' || g_rec.dbout_name ;
    -         --%WTPLSQL_end_ignore_lines%--
    -      else
    -         g_rec.prof_runid := -1;  -- Don't run profiler.
    -      end if;
    -   end if;
    -   close c_readable;
    -   --
    -end find_dbout;
    -
    -$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -$THEN
    -   procedure t_find_dbout
    -   is
    -      l_recSAVE    rec_type;
    -      l_recNULL    rec_type;
    -      l_recTEST    rec_type;
    -      l_pname      varchar2(128) := 'WT_PROFILE_FIND_DBOUT';
    -      --------------------------------------  WTPLSQL Testing --
    -      procedure run_find_dbout is begin
    -         l_recSAVE := g_rec;
    -         g_rec := l_recNULL;
    -         find_dbout(l_pname);
    -         l_recTEST := g_rec;
    -         g_rec := l_recSAVE;
    -      end run_find_dbout;
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Find DBOUT Setup';
    -      tl_compile_db_object
    -         (in_ptype   => 'package'
    -         ,in_pname   => l_pname
    -         ,in_source  => '   l_junk number;' );
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Find DBOUT Happy Path 1';
    -      tl_compile_db_object
    -         (in_ptype   => 'package body'
    -         ,in_pname   => l_pname
    -         ,in_source  => 'begin'          || CHR(10) ||
    -                        '  l_junk := 1;' );
    -      run_find_dbout;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull
    -         (msg_in          => 'l_recTEST.dbout_owner'
    -         ,check_this_in   => l_recTEST.dbout_owner);
    -      wt_assert.isnull
    -         (msg_in          => 'l_recTEST.dbout_name'
    -         ,check_this_in   => l_recTEST.dbout_name);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull
    -         (msg_in          => 'l_recTEST.dbout_type'
    -         ,check_this_in   => l_recTEST.dbout_type);
    -      wt_assert.isnull
    -         (msg_in          => 'l_recTEST.error_message'
    -         ,check_this_in   => l_recTEST.error_message);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Find DBOUT Happy Path 2';
    -      tl_compile_db_object
    -         (in_ptype   => 'package body'
    -         ,in_pname   => l_pname
    -         ,in_source  => 
    -            '  --% WTPLSQL SET DBOUT "' || l_pname ||
    -                                     ':PACKAGE BODY" %--' || CHR(10) ||
    -            'begin'                                       || CHR(10) ||
    -            '  l_junk := 1;'                              );
    -      run_find_dbout;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq
    -         (msg_in          => 'l_recTEST.dbout_owner'
    -         ,check_this_in   => l_recTEST.dbout_owner
    -         ,against_this_in => USER);
    -      wt_assert.eq
    -         (msg_in          => 'l_recTEST.dbout_name'
    -         ,check_this_in   => l_recTEST.dbout_name
    -         ,against_this_in => l_pname);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq
    -         (msg_in          => 'l_recTEST.dbout_type'
    -         ,check_this_in   => l_recTEST.dbout_type
    -         ,against_this_in => 'PACKAGE BODY');
    -      wt_assert.isnull
    -         (msg_in        => 'l_recTEST.error_message'
    -         ,check_this_in => l_recTEST.error_message);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Find DBOUT Happy Path 3';
    -      tl_compile_db_object
    -         (in_ptype   => 'package body'
    -         ,in_pname   => l_pname
    -         ,in_source  => 
    -            '  --% WTPLSQL SET DBOUT "' || USER ||
    -                                    '.' || l_pname ||
    -                                    ':PACKAGE BODY" %--' || CHR(10) ||
    -            'begin'                                      || CHR(10) ||
    -            '  l_junk := 1;'                             );
    -      run_find_dbout;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq
    -         (msg_in          => 'l_recTEST.dbout_owner'
    -         ,check_this_in   => l_recTEST.dbout_owner
    -         ,against_this_in => USER);
    -      wt_assert.eq
    -         (msg_in          => 'l_recTEST.dbout_name'
    -         ,check_this_in   => l_recTEST.dbout_name
    -         ,against_this_in => l_pname);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq
    -         (msg_in          => 'l_recTEST.dbout_type'
    -         ,check_this_in   => l_recTEST.dbout_type
    -         ,against_this_in => 'PACKAGE BODY');
    -      wt_assert.isnull
    -         (msg_in        => 'l_recTEST.error_message'
    -         ,check_this_in => l_recTEST.error_message);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Find DBOUT Sad Path 1';
    -      tl_compile_db_object
    -         (in_ptype   => 'package body'
    -         ,in_pname   => l_pname
    -         ,in_source  =>
    -            -- Don't remove the "||", otherwise this will set the DBOUT
    -            '  --% WTPLSQL SET DBOUT ' || '"BOGUS1" %--' || CHR(10) ||
    -            'begin'                                      || CHR(10) ||
    -            '  l_junk := 1;'                             );
    -      run_find_dbout;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull
    -         (msg_in          => 'l_recTEST.dbout_owner'
    -         ,check_this_in   => l_recTEST.dbout_owner);
    -      wt_assert.isnull
    -         (msg_in          => 'l_recTEST.dbout_name'
    -         ,check_this_in   => l_recTEST.dbout_name);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull
    -         (msg_in          => 'l_recTEST.dbout_type'
    -         ,check_this_in   => l_recTEST.dbout_type);
    -      wt_assert.eq
    -         (msg_in          => 'l_recTEST.error_message'
    -         ,check_this_in   => l_recTEST.error_message
    -         ,against_this_in => 'Unable to find database object "BOGUS1".');
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Find DBOUT Sad Path 2';
    -      tl_compile_db_object
    -         (in_ptype   => 'package body'
    -         ,in_pname   => l_pname
    -         ,in_source  => 
    -            '  --% WTPLSQL SET DBOUT "' || USER ||
    -                                    '.' || l_pname || '" %--'  || CHR(10) ||
    -            'begin'                                            || CHR(10) ||
    -            '  l_junk := 1;'                                   );
    -      run_find_dbout;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq
    -         (msg_in          => 'l_recTEST.dbout_owner'
    -         ,check_this_in   => l_recTEST.dbout_owner
    -         ,against_this_in => USER);
    -      wt_assert.eq
    -         (msg_in          => 'l_recTEST.dbout_name'
    -         ,check_this_in   => l_recTEST.dbout_name
    -         ,against_this_in => l_pname);
    -      wt_assert.eq
    -         (msg_in          => 'l_recTEST.error_message'
    -         ,check_this_in   => l_recTEST.error_message
    -         ,against_this_in => 'Found too many database objects "WTP.WT_PROFILE_FIND_DBOUT".');
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Find DBOUT Sad Path 3';
    -      tl_compile_db_object
    -         (in_ptype   => 'package body'
    -         ,in_pname   => l_pname
    -         ,in_source  => 
    -            -- Don't remove the "||", otherwise this will set the DBOUT
    -            '  --% WTPLSQL SET DBOUT ' || '"SYS.ALL_OBJECTS:VIEW" %--' || CHR(10) ||
    -            'begin'                                                    || CHR(10) ||
    -            '  l_junk := 1;'                                           );
    -      run_find_dbout;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq
    -         (msg_in          => 'l_recTEST.dbout_owner'
    -         ,check_this_in   => l_recTEST.dbout_owner
    -         ,against_this_in => 'SYS');
    -      wt_assert.eq
    -         (msg_in          => 'l_recTEST.dbout_name'
    -         ,check_this_in   => l_recTEST.dbout_name
    -         ,against_this_in => 'ALL_OBJECTS');
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq
    -         (msg_in          => 'l_recTEST.dbout_type'
    -         ,check_this_in   => l_recTEST.dbout_type
    -         ,against_this_in => 'VIEW');
    -      wt_assert.isnull
    -         (msg_in          => 'l_recTEST.error_message'
    -         ,check_this_in   => l_recTEST.error_message);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Find DBOUT Teardown';
    -      tl_drop_db_object(l_pname, 'package');
    -   end t_find_dbout;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -
    -------------------------------------------------------------
    -procedure load_ignr_aa
    -is
    -   cursor c_find_begin is
    -      select line
    -            ,instr(text,'--%WTPLSQL_begin_ignore_lines%--') col
    -       from  dba_source
    -       where owner = g_rec.dbout_owner
    -        and  name  = g_rec.dbout_name
    -        and  type  = g_rec.dbout_type
    -        and  text like '%--\%WTPLSQL_begin_ignore_lines\%--%' escape '\'
    -       order by line;
    -   buff_find_begin  c_find_begin%ROWTYPE;
    -   cursor c_find_end (in_line in number, in_col in number) is
    -      with q1 as (
    -      select line
    -            ,instr(text,'--%WTPLSQL_end_ignore_lines%--') col
    -       from  dba_source
    -       where owner = g_rec.dbout_owner
    -        and  name  = g_rec.dbout_name
    -        and  type  = g_rec.dbout_type
    -        and  line >= in_line
    -        and  text like '%--\%WTPLSQL_end_ignore_lines\%--%' escape '\'
    -      )
    -      select line
    -            ,col
    -       from  q1
    -       where line > in_line
    -          or (    line = in_line
    -              and col  > in_col)
    -       order by line
    -            ,col;
    -   buff_find_end  c_find_end%ROWTYPE;
    -begin
    -   g_ignr_aa.delete;
    -   open c_find_begin;
    -   loop
    -      fetch c_find_begin into buff_find_begin;
    -      exit when c_find_begin%NOTFOUND;
    -      open c_find_end (buff_find_begin.line, buff_find_begin.col);
    -      fetch c_find_end into buff_find_end;
    -      if c_find_end%NOTFOUND
    -      then
    -         select max(line)
    -          into  buff_find_end.line
    -          from  dba_source
    -          where owner = g_rec.dbout_owner
    -           and  name  = g_rec.dbout_name
    -           and  type  = g_rec.dbout_type;
    -      end if;
    -      close c_find_end;
    -      for i in buff_find_begin.line + g_rec.trigger_offset ..
    -               buff_find_end.line   + g_rec.trigger_offset
    -      loop
    -         g_ignr_aa(i) := 'X';
    -      end loop;
    -   end loop;
    -   close c_find_begin;
    -end load_ignr_aa;
    -
    -$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -$THEN
    -   procedure t_load_ignr_aa
    -   is
    -      l_recSAVE    rec_type;
    -      l_ignrSAVE   ignr_aa_type;
    -      l_ignrTEST   ignr_aa_type;
    -      l_pname      varchar2(128) := 'WT_PROFILE_LOAD_IGNR';
    -      --------------------------------------  WTPLSQL Testing --
    -      procedure run_load_ignr is begin
    -         l_recSAVE  := g_rec;
    -         l_ignrSAVE := g_ignr_aa;
    -         g_ignr_aa.delete;
    -         g_rec.dbout_owner    := USER;
    -         g_rec.dbout_name     := l_pname;
    -         g_rec.dbout_type     := 'PACKAGE BODY';
    -         g_rec.trigger_offset := 0;
    -         load_ignr_aa;
    -         l_ignrTEST := g_ignr_aa;
    -         g_ignr_aa := l_ignrSAVE;
    -         g_rec   := l_recSAVE;
    -      end run_load_ignr;
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Load Ignr Setup';
    -      wt_assert.isnotnull
    -         (msg_in    => 'Number of IGNR_AA elements'
    -         ,check_this_in => g_ignr_aa.COUNT);
    -      tl_compile_db_object
    -         (in_ptype   => 'package'
    -         ,in_pname   => l_pname
    -         ,in_source  => '  l_junk number;' );
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Load Ignr Happy Path 1';
    -      tl_compile_db_object
    -         (in_ptype   => 'package body'
    -         ,in_pname   => l_pname
    -         ,in_source  => 'begin'          || CHR(10) ||
    -                        '  l_junk := 1;' );
    -      run_load_ignr;
    -      wt_assert.eq
    -         (msg_in          => 'l_ignrTest.COUNT'
    -         ,check_this_in   => l_ignrTest.COUNT
    -         ,against_this_in => 0);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Load Ignr Happy Path 2';
    -      tl_compile_db_object
    -         (in_ptype   => 'package body'
    -         ,in_pname   => l_pname
    -         ,in_source  => 
    -            'begin'                                    || CHR(10) ||  -- Line 2
    -            '  --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) ||  -- Line 3
    -            '  l_junk := 1;'                           );             -- Line 4
    -            -- end                                                    -- Line 5
    -      run_load_ignr;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq
    -         (msg_in          => 'l_ignrTest.COUNT'
    -         ,check_this_in   => l_ignrTest.COUNT
    -         ,against_this_in => 3);
    -      for i in 3 .. 5
    -      loop
    -         wt_assert.eq
    -            (msg_in          => 'l_ignrTest.exists(' || i || ')'
    -            ,check_this_in   => l_ignrTest.exists(i)
    -            ,against_this_in => TRUE);
    -      end loop;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Load Ignr Happy Path 3';
    -      tl_compile_db_object
    -         (in_ptype   => 'package body'
    -         ,in_pname   => l_pname
    -         ,in_source  => 
    -            'begin'                                    || CHR(10) ||  -- Line 2
    -            '  l_junk := 1;'                           || CHR(10) ||  -- Line 3
    -            '  --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) ||  -- Line 4
    -            '  l_junk := 2;'                           || CHR(10) ||  -- Line 5
    -            '  --%WTPLSQL_end_' || 'ignore_lines%--'   || CHR(10) ||  -- Line 6
    -            '  l_junk := 3;'                           );             -- Line 7
    -      run_load_ignr;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq
    -         (msg_in          => 'l_ignrTest.COUNT'
    -         ,check_this_in   => l_ignrTest.COUNT
    -         ,against_this_in => 3);
    -      for i in 4 .. 6
    -      loop
    -         wt_assert.eq
    -            (msg_in          => 'l_ignrTest.exists(' || i || ')'
    -            ,check_this_in   => l_ignrTest.exists(i)
    -            ,against_this_in => TRUE);
    -      end loop;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Load Ignr Happy Path 4';
    -      tl_compile_db_object
    -         (in_ptype   => 'package body'
    -         ,in_pname   => l_pname
    -         ,in_source  => 
    -            'begin'                                    || CHR(10) ||  -- Line 2
    -            '  l_junk := 1;'                           || CHR(10) ||  -- Line 3
    -            '  --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) ||  -- Line 4
    -            '  l_junk := 2;'                           || CHR(10) ||  -- Line 5
    -            '  --%WTPLSQL_end_' || 'ignore_lines%--'   || CHR(10) ||  -- Line 6
    -            '  l_junk := 3;'                           || CHR(10) ||  -- Line 7
    -            '  --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) ||  -- Line 8
    -            '  l_junk := 4;'                           );             -- Line 9
    -            -- end                                                    -- Line 10
    -      run_load_ignr;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq
    -         (msg_in          => 'l_ignrTest.COUNT'
    -         ,check_this_in   => l_ignrTest.COUNT
    -         ,against_this_in => 6);
    -      for i in 4 .. 6
    -      loop
    -         wt_assert.eq
    -            (msg_in          => 'l_ignrTest.exists(' || i || ')'
    -            ,check_this_in   => l_ignrTest.exists(i)
    -            ,against_this_in => TRUE);
    -      end loop;
    -      --------------------------------------  WTPLSQL Testing --
    -      for i in 8 .. 10
    -      loop
    -         wt_assert.eq
    -            (msg_in          => 'l_ignrTest.exists(' || i || ')'
    -            ,check_this_in   => l_ignrTest.exists(i)
    -            ,against_this_in => TRUE);
    -      end loop;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Load Ignr Sad Path 1';
    -      tl_compile_db_object
    -         (in_ptype   => 'package body'
    -         ,in_pname   => l_pname
    -         ,in_source  => 
    -            'begin'                                    || CHR(10) ||  -- Line 2
    -            '  --%WTPLSQL_end_' || 'ignore_lines%--'   || CHR(10) ||  -- Line 3
    -            '  l_junk := 4;'                           );             -- Line 4
    -      run_load_ignr;
    -      wt_assert.eq
    -         (msg_in          => 'l_ignrTest.COUNT'
    -         ,check_this_in   => l_ignrTest.COUNT
    -         ,against_this_in => 0);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Load Ignr Sad Path 2';
    -      tl_compile_db_object
    -         (in_ptype   => 'package body'
    -         ,in_pname   => l_pname
    -         ,in_source  => 
    -            'begin'                                    || CHR(10) ||  -- Line 2
    -            '  l_junk := 1;'                           || CHR(10) ||  -- Line 3
    -            '  --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) ||  -- Line 4
    -            '  l_junk := 2;'                           || CHR(10) ||  -- Line 5
    -            '  --%WTPLSQL_end_' || 'ignore_lines%--'   || CHR(10) ||  -- Line 6
    -            '  l_junk := 3;'                           || CHR(10) ||  -- Line 7
    -            '  --%WTPLSQL_end_' || 'ignore_lines%--'   || CHR(10) ||  -- Line 8
    -            '  l_junk := 4;'                           );             -- Line 9
    -      run_load_ignr;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq
    -         (msg_in          => 'l_ignrTest.COUNT'
    -         ,check_this_in   => l_ignrTest.COUNT
    -         ,against_this_in => 3);
    -      for i in 4 .. 6
    -      loop
    -         wt_assert.eq
    -            (msg_in          => 'l_ignrTest.exists(' || i || ')'
    -            ,check_this_in   => l_ignrTest.exists(i)
    -            ,against_this_in => TRUE);
    -      end loop;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Load Ignr Sad Path 3';
    -      tl_compile_db_object
    -         (in_ptype   => 'package body'
    -         ,in_pname   => l_pname
    -         ,in_source  => 
    -            'begin'                                    || CHR(10) ||  -- Line 2
    -            '  l_junk := 1;'                           || CHR(10) ||  -- Line 3
    -            '  --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) ||  -- Line 4
    -            '  l_junk := 2;'                           || CHR(10) ||  -- Line 5
    -            '  --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) ||  -- Line 6
    -            '  l_junk := 3;'                           || CHR(10) ||  -- Line 7
    -            '  --%WTPLSQL_end_' || 'ignore_lines%--'   || CHR(10) ||  -- Line 8
    -            '  l_junk := 4;'                           );             -- Line 9
    -      run_load_ignr;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq
    -         (msg_in          => 'l_ignrTest.COUNT'
    -         ,check_this_in   => l_ignrTest.COUNT
    -         ,against_this_in => 5);
    -      for i in 4 .. 8
    -      loop
    -         wt_assert.eq
    -            (msg_in          => 'l_ignrTest.exists(' || i || ')'
    -            ,check_this_in   => l_ignrTest.exists(i)
    -            ,against_this_in => TRUE);
    -      end loop;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Load Ignr Teardown';
    -      tl_drop_db_object(l_pname, 'package');
    -      wt_assert.isnotnull
    -         (msg_in    => 'Number of IGNR_AA elements'
    -         ,check_this_in => g_ignr_aa.COUNT);
    -   end t_load_ignr_aa;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -
    -------------------------------------------------------------
    -procedure insert_dbout_profile
    -is
    -   PRAGMA AUTONOMOUS_TRANSACTION;
    -   prof_rec    wt_dbout_profiles%ROWTYPE;
    -   l_max_line  number;
    -   procedure l_set_status is begin
    -      if g_ignr_aa.EXISTS(prof_rec.line)
    -      then
    -         -- Found Statement to Ignore
    -         prof_rec.status := 'IGNR';
    -         return;
    -      end if;
    -      if prof_rec.total_occur > 0
    -      then
    -         -- Found Executed Statement
    -         prof_rec.status := 'EXEC';
    -         return;
    -      end if;
    -      if    prof_rec.total_occur = 0
    -        and prof_rec.total_usecs = 0
    -      then
    -         -- Check for declaration if Not Executed
    -         if regexp_like(prof_rec.text, '^[[:space:]]*' ||
    -                       '(FUNCTION|PROCEDURE|PACKAGE|TYPE|TRIGGER)' ||
    -                       '[[:space:]]', 'i')
    -         then
    -            -- Exclude declarations if Not Executed
    -            prof_rec.status := 'EXCL';
    -         elsif     prof_rec.line = l_max_line
    -               AND regexp_like(prof_rec.text, 'END', 'i')
    -         then
    -            prof_rec.status := 'EXCL';
    -         else
    -            -- Found Not Executed Statement
    -            prof_rec.status := 'NOTX';
    -         end if;
    -         return;
    -      end if;
    -      -- Everything else is unknown
    -      prof_rec.status := 'UNKN';
    -   end l_set_status;
    -begin
    -   -- This will not RAISE NO_DATA_FOUND because it uses a GROUP FUNCTION.
    -   select max(ppd.line#) into l_max_line
    -    from  plsql_profiler_units ppu
    -          join plsql_profiler_data  ppd
    -               on  ppd.unit_number = ppu.unit_number
    -               and ppd.runid       = g_rec.prof_runid
    -    where ppu.unit_owner = g_rec.dbout_owner
    -     and  ppu.unit_name  = g_rec.dbout_name
    -     and  ppu.unit_type  = g_rec.dbout_type
    -     and  ppu.runid      = g_rec.prof_runid;
    -   load_ignr_aa;
    -   prof_rec.test_run_id := g_rec.test_run_id;
    -   for buf1 in (
    -      select src.line
    -            ,ppd.total_occur
    -            ,ppd.total_time
    -            ,ppd.min_time
    -            ,ppd.max_time
    -            ,src.text
    -       from  plsql_profiler_units ppu
    -             join plsql_profiler_data  ppd
    -                  on  ppd.unit_number = ppu.unit_number
    -                  and ppd.runid       = g_rec.prof_runid
    -             join dba_source  src
    -                  on  src.line  = ppd.line# + g_rec.trigger_offset
    -                  and src.owner = g_rec.dbout_owner
    -                  and src.name  = g_rec.dbout_name
    -                  and src.type  = g_rec.dbout_type
    -       where ppu.unit_owner = g_rec.dbout_owner
    -        and  ppu.unit_name  = g_rec.dbout_name
    -        and  ppu.unit_type  = g_rec.dbout_type
    -        and  ppu.runid      = g_rec.prof_runid )
    -   loop
    -      prof_rec.line        := buf1.line;
    -      prof_rec.total_occur := buf1.total_occur;
    -      prof_rec.total_usecs := buf1.total_time/1000;
    -      prof_rec.min_usecs   := buf1.min_time/1000;
    -      prof_rec.max_usecs   := buf1.max_time/1000;
    -      prof_rec.text        := buf1.text;
    -      prof_rec.status      := NULL;
    -      l_set_status;
    -      insert into wt_dbout_profiles values prof_rec;
    -
    -   $IF $$WTPLSQL_SELFTEST $THEN  ------%WTPLSQL_begin_ignore_lines%------
    -      if not g_skip_add then
    -   $END
    -      wt_test_run_stat.add_profile(prof_rec);
    -   $IF $$WTPLSQL_SELFTEST $THEN
    -      end if;
    -   $END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -   end loop;
    -   COMMIT;
    -   -- Delete PLSQL Profiler has it's own
    -   --   PRAGMA AUTONOMOUS_TRANSACTION and COMMIT;
    -   g_ignr_aa.delete;
    -   delete_plsql_profiler_recs(g_rec.prof_runid);
    -end insert_dbout_profile;
    -
    -$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -$THEN
    -   procedure t_insert_dbout_profile
    -   is
    -      units_rec      plsql_profiler_units%ROWTYPE;
    -      data_rec       plsql_profiler_data%ROWTYPE;
    -      l_recSAVE      rec_type;
    -      l_recNULL      rec_type;
    -      c_test_run_id  constant number := -97;
    -      l_pname        varchar2(128) := 'WT_PROFILE_INSERT_DBOUT';
    -      l_sqlerrm      varchar2(4000);
    -      l_err_stack    varchar2(32000);
    -      --------------------------------------  WTPLSQL Testing --
    -      procedure insert_plsql_profiler_data
    -            (in_line#        in number
    -            ,in_total_occur  in number
    -            ,in_total_time   in number)
    -      is
    -      begin
    -         data_rec.line#       := in_line#;
    -         data_rec.total_occur := in_total_occur;
    -         data_rec.total_time  := in_total_time;
    -      --------------------------------------  WTPLSQL Testing --
    -         begin
    -            insert into plsql_profiler_data values data_rec;
    -            commit;
    -            l_sqlerrm := SQLERRM;
    -         exception when others then
    -            l_sqlerrm := SQLERRM;
    -         end;
    -         wt_assert.eq (
    -            msg_in          => 'insert plsql_profiler_data (LINE#: ' || data_rec.line#|| ')',
    -            check_this_in   => SQLERRM,
    -            against_this_in => 'ORA-0000: normal, successful completion');
    -      end insert_plsql_profiler_data;
    -      --------------------------------------  WTPLSQL Testing --
    -      procedure test_dbout_profiler
    -            (in_line#     in  number
    -            ,in_col_name  in  varchar2
    -            ,in_value     in  varchar2)
    -      is
    -      begin
    -         wt_assert.eqqueryvalue
    -            (msg_in           => 'wt_dbout_profiles line ' || in_line# ||
    -                                               ', column ' || in_col_name
    -            ,check_query_in   => 'select ' || in_col_name ||
    -                                 ' from wt_dbout_profiles' ||
    -                                 ' where test_run_id = ' || c_test_run_id ||
    -                                 ' and line = ' || in_line#
    -            ,against_value_in => in_value);
    -      end test_dbout_profiler;
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Insert DBOUT Profile Setup';
    -      tl_compile_db_object
    -         (in_ptype   => 'package'
    -         ,in_pname   => l_pname
    -         ,in_source  => '  l_junk number;' );
    -      --------------------------------------  WTPLSQL Testing --
    -      tl_compile_db_object
    -         (in_ptype   => 'package body'
    -         ,in_pname   => l_pname
    -         ,in_source  => 
    -            'begin'                                    || CHR(10) ||  -- Line 2
    -            '  l_junk := 1;'                           || CHR(10) ||  -- Line 3
    -            '  --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) ||  -- Line 4
    -            '  l_junk := 2;'                           || CHR(10) ||  -- Line 5
    -            '  --%WTPLSQL_end_' || 'ignore_lines%--'   || CHR(10) ||  -- Line 6
    -            '  if 0 = 1 then'                          || CHR(10) ||  -- Line 7
    -            '     l_junk := 3;'                        || CHR(10) ||  -- Line 8
    -            '  end if;'                                );             -- Line 9
    -      tl_insert_plsql_profiler_recs(c_test_run_id);
    -      tl_count_plsql_profiler_recs(c_test_run_id, 1);
    -      tl_insert_test_runs(c_test_run_id, 'Insert DBOUT Test');
    -      --------------------------------------  WTPLSQL Testing --
    -      units_rec.runid        := c_test_run_id;
    -      units_rec.unit_number  := 1;
    -      units_rec.unit_owner   := USER;
    -      units_rec.unit_name    := l_pname;
    -      units_rec.unit_type    := 'PACKAGE BODY';
    -      units_rec.total_time   := 0;
    -      --------------------------------------  WTPLSQL Testing --
    -      begin
    -         insert into plsql_profiler_units values units_rec;
    -         commit;
    -         l_err_stack := dbms_utility.format_error_stack     ||
    -                        dbms_utility.format_error_backtrace ;
    -      exception when others then
    -         l_err_stack := dbms_utility.format_error_stack     ||
    -                        dbms_utility.format_error_backtrace ;
    -      end;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in          => 'insert UNIT 1 into plsql_profiler_units',
    -         check_this_in   => l_err_stack);
    -      wt_assert.eqqueryvalue
    -         (msg_in           => 'Number of UNIT 1 plsql_profiler_units'
    -         ,check_query_in   => 'select count(*) from plsql_profiler_units' ||
    -                              ' where runid = ' || c_test_run_id ||
    -                              ' and unit_number = 1'
    -         ,against_value_in => 1);
    -      --------------------------------------  WTPLSQL Testing --
    -      data_rec.runid       := c_test_run_id;
    -      data_rec.unit_number := 1;
    -      data_rec.min_time    := 0;
    -      data_rec.max_time    := 1;
    -      insert_plsql_profiler_data(1, 0, 0);
    -      insert_plsql_profiler_data(2, 0, 1);
    -      insert_plsql_profiler_data(3, 1, 1);
    -      insert_plsql_profiler_data(5, 1, 1);
    -      insert_plsql_profiler_data(7, 1, 1);
    -      insert_plsql_profiler_data(8, 0, 0);
    -      insert_plsql_profiler_data(9, 1, 1);
    -      insert_plsql_profiler_data(10, 0, 0);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eqqueryvalue
    -         (msg_in           => 'Number of UNIT 1 plsql_profiler_data'
    -         ,check_query_in   => 'select count(*) from plsql_profiler_data' ||
    -                              ' where runid = ' || c_test_run_id ||
    -                              ' and unit_number = 1'
    -         ,against_value_in => 8);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Insert DBOUT Profile Happy Path';
    -      l_recSAVE := g_rec;
    -      g_rec.test_run_id     := c_test_run_id;
    -      g_rec.dbout_owner     := USER;
    -      g_rec.dbout_name      := l_pname;
    -      g_rec.dbout_type      := 'PACKAGE BODY';
    -      g_rec.prof_runid      := c_test_run_id;
    -      g_rec.trigger_offset  := 0;
    -      g_rec.error_message   := '';
    -      --------------------------------------  WTPLSQL Testing --
    -      g_skip_add := TRUE;
    -      begin
    -         insert_dbout_profile;
    -         l_err_stack := dbms_utility.format_error_stack     ||
    -                        dbms_utility.format_error_backtrace ;
    -      exception when others then
    -         l_err_stack := dbms_utility.format_error_stack     ||
    -                        dbms_utility.format_error_backtrace ;
    -      end;
    -      g_skip_add := FALSE;
    -      g_rec := l_recSAVE;
    -      wt_assert.isnull (
    -         msg_in          => 'SQLERRM',
    -         check_this_in   => l_err_stack);
    -      --------------------------------------  WTPLSQL Testing --
    -      test_dbout_profiler(1, 'STATUS', 'EXCL');
    -      test_dbout_profiler(1, 'TEXT',   'package body WT_PROFILE_INSERT_DBOUT is' || CHR(10));
    -      test_dbout_profiler(2, 'STATUS', 'UNKN');
    -      test_dbout_profiler(2, 'TEXT',   'begin' || CHR(10));
    -      test_dbout_profiler(3, 'STATUS', 'EXEC');
    -      test_dbout_profiler(3, 'TEXT',   '  l_junk := 1;' || CHR(10));
    -      test_dbout_profiler(5, 'STATUS', 'IGNR');
    -      test_dbout_profiler(5, 'TEXT',   '  l_junk := 2;' || CHR(10));
    -      test_dbout_profiler(7, 'STATUS', 'EXEC');
    -      test_dbout_profiler(7, 'TEXT',   '  if 0 = 1 then' || CHR(10));
    -      test_dbout_profiler(8, 'STATUS', 'NOTX');
    -      test_dbout_profiler(8, 'TEXT',   '     l_junk := 3;' || CHR(10));
    -      test_dbout_profiler(9, 'STATUS', 'EXEC');
    -      test_dbout_profiler(9, 'TEXT',   '  end if;' || CHR(10));
    -      test_dbout_profiler(10, 'STATUS', 'EXCL');
    -      test_dbout_profiler(10, 'TEXT',   'end WT_PROFILE_INSERT_DBOUT;');
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Insert DBOUT Profile Teardown';
    -      tl_delete_dbout_profiles(c_test_run_id);
    -      tl_delete_test_runs(c_test_run_id);
    -      tl_delete_plsql_profiler_recs(c_test_run_id);
    -      tl_count_plsql_profiler_recs(c_test_run_id, 0);
    -      tl_drop_db_object(l_pname, 'package');
    -   end t_insert_dbout_profile;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -
    ----------------------
    ---  Public Procedures
    ----------------------
    -
    -
    -------------------------------------------------------------
    -procedure initialize
    -      (in_test_run_id      in  number,
    -       in_runner_name      in  varchar2,
    -       out_dbout_owner     out varchar2,
    -       out_dbout_name      out varchar2,
    -       out_dbout_type      out varchar2,
    -       out_trigger_offset  out number,
    -       out_profiler_runid  out number,
    -       out_error_message   out varchar2)
    -is
    -   l_rec_NULL     rec_type;
    -   l_retnum       binary_integer;
    -begin
    -   -- Reset variables
    -   out_dbout_owner     := '';
    -   out_dbout_name      := '';
    -   out_dbout_type      := '';
    -   out_trigger_offset  := NULL;
    -   out_profiler_runid  := NULL;
    -   out_error_message   := '';
    -   g_rec := l_rec_NULL;
    -   $IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -   $THEN
    -      -- In case a test failed and left this set to TRUE
    -      g_skip_insert := FALSE;
    -      g_skip_add    := FALSE;
    -   $END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -   -- Abort if there is no Test Run ID
    -   if in_test_run_id is null
    -   then
    -      raise_application_error  (-20004, 'i_test_run_id is null');
    -   end if;
    -   g_rec.test_run_id := in_test_run_id;
    -   -- Find the Database Object Under Test
    -   find_dbout(in_pkg_name => in_runner_name);
    -   out_dbout_owner    := g_rec.dbout_owner;
    -   out_dbout_name     := g_rec.dbout_name;
    -   out_dbout_type     := g_rec.dbout_type;
    -   out_error_message  := g_rec.error_message;
    -   -- There muxt be a name and no error message
    -   if    g_rec.dbout_name    is null      -- No DBOUT notation
    -      or g_rec.error_message is not null  -- Error with DBOUT or Source
    -      or g_rec.prof_runid     = -1        -- Skip Profiling
    -   then
    -      g_rec.prof_runid := NULL;
    -      return;
    -   end if;
    -   -- Calculate the trigger offset, if any.
    -   g_rec.trigger_offset := wt_profiler.trigger_offset
    -                              (dbout_owner_in => g_rec.dbout_owner
    -                              ,dbout_name_in  => g_rec.dbout_name
    -                              ,dbout_type_in  => g_rec.dbout_type );
    -   out_trigger_offset := g_rec.trigger_offset;
    -   -- Check Versions
    -   l_retnum := dbms_profiler.INTERNAL_VERSION_CHECK;
    -   if l_retnum <> 0 then
    -      ------%WTPLSQL_begin_ignore_lines%------  Can't test this
    -      --dbms_profiler.get_version(major_version, minor_version);
    -      raise_application_error(-20005,
    -         'dbms_profiler.INTERNAL_VERSION_CHECK returned: ' || get_error_msg(l_retnum));
    -      ----------------%WTPLSQL_end_ignore_lines%----------------
    -   end if;
    -   -- This starts the PROFILER Running!!!
    -   --dbms_output.put_line('DEBUG1. g_rec.prof_runid = ' || g_rec.prof_runid);
    -   l_retnum := dbms_profiler.START_PROFILER(run_number => g_rec.prof_runid);
    -   if l_retnum <> 0 then
    -      ------%WTPLSQL_begin_ignore_lines%------  Can't test this
    -      raise_application_error(-20006,
    -         'dbms_profiler.START_PROFILER returned: ' || get_error_msg(l_retnum));
    -      ----------------%WTPLSQL_end_ignore_lines%----------------
    -   end if;
    -   -- Everything is OK, set the Profiler Run ID
    -   out_profiler_runid := g_rec.prof_runid;
    -   --dbms_output.put_line('DEBUG2. g_rec.prof_runid = ' || g_rec.prof_runid);
    -end initialize;
    -
    -$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -$THEN
    -   procedure t_initialize
    -   is
    -      c_test_run_id   constant number := -96;
    -      l_pname         varchar2(128) := 'WT_PROFILE_INITIALIZE';
    -      l_recSAVE       rec_type;
    -      l_recTEST       rec_type;
    -      l_recOUT        rec_type;
    -      l_sqlerrm       varchar2(4000);
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Insert DBOUT Profile Setup';
    -      tl_compile_db_object
    -         (in_ptype   => 'package'
    -         ,in_pname   => l_pname
    -         ,in_source  => '  l_junk number;' );
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Initialize Test HAPPY Path 1';
    -      tl_compile_db_object
    -         (in_ptype   => 'package body'
    -         ,in_pname   => l_pname
    -         ,in_source  => 
    -            'begin'          || CHR(10) ||  -- Line 2
    -            '  l_junk := 7;' );             -- Line 3
    -      --------------------------------------  WTPLSQL Testing --
    -      l_recSAVE := g_rec;
    -      initialize
    -         (in_test_run_id      => c_test_run_id,
    -          in_runner_name      => l_pname,
    -          out_dbout_owner     => l_recOUT.dbout_owner,
    -          out_dbout_name      => l_recOUT.dbout_name,
    -          out_dbout_type      => l_recOUT.dbout_type,
    -          out_trigger_offset  => l_recOUT.trigger_offset,
    -          out_profiler_runid  => l_recOUT.prof_runid,
    -          out_error_message   => l_recOUT.error_message);
    -      l_recTEST := g_rec;
    -      g_rec := l_recSAVE;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in          => 'OUT dbout_owner',
    -         check_this_in   => l_recOUT.dbout_owner);
    -      wt_assert.isnull (
    -         msg_in          => 'OUT dbout_name',
    -         check_this_in   => l_recOUT.dbout_name);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in          => 'OUT dbout_type',
    -         check_this_in   => l_recOUT.dbout_type);
    -      wt_assert.isnull (
    -         msg_in          => 'OUT prof_runid',
    -         check_this_in   => l_recOUT.prof_runid);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in          => 'OUT trigger_offset',
    -         check_this_in   => l_recOUT.trigger_offset);
    -      wt_assert.isnull (
    -         msg_in          => 'OUT error_message',
    -         check_this_in   => l_recOUT.error_message);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.dbout_owner',
    -         check_this_in   => l_recTEST.dbout_owner);
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.dbout_name',
    -         check_this_in   => l_recTEST.dbout_name);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.dbout_type',
    -         check_this_in   => l_recTEST.dbout_type);
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.prof_runid',
    -         check_this_in   => l_recTEST.prof_runid);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.trigger_offset',
    -         check_this_in   => l_recTEST.trigger_offset);
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.error_message',
    -         check_this_in   => l_recTEST.error_message);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Initialize Test HAPPY Path 2';
    -      tl_compile_db_object
    -         (in_ptype   => 'package body'
    -         ,in_pname   => l_pname
    -         ,in_source  => 
    -            'begin'                                     || CHR(10) ||  -- Line 2
    -            '--% WTPLSQL SET DBOUT "' || l_pname ||
    -                                   ':PACKAGE BODY" %--' || CHR(10) ||  -- Line 3
    -            '  l_junk := 7;'                            );             -- Line 4
    -      --------------------------------------  WTPLSQL Testing --
    -      l_recSAVE := g_rec;
    -      initialize
    -         (in_test_run_id      => c_test_run_id,
    -          in_runner_name      => l_pname,
    -          out_dbout_owner     => l_recOUT.dbout_owner,
    -          out_dbout_name      => l_recOUT.dbout_name,
    -          out_dbout_type      => l_recOUT.dbout_type,
    -          out_trigger_offset  => l_recOUT.trigger_offset,
    -          out_profiler_runid  => l_recOUT.prof_runid,
    -          out_error_message   => l_recOUT.error_message);
    -      l_recTEST := g_rec;
    -      g_rec := l_recSAVE;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'OUT dbout_owner',
    -         check_this_in   => l_recOUT.dbout_owner,
    -         against_this_in => USER);
    -      wt_assert.eq (
    -         msg_in          => 'OUT dbout_name',
    -         check_this_in   => l_recOUT.dbout_name,
    -         against_this_in => l_pname);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'OUT dbout_type',
    -         check_this_in   => l_recOUT.dbout_type,
    -         against_this_in => 'PACKAGE BODY');
    -      wt_assert.isnotnull (
    -         msg_in          => 'OUT prof_runid',
    -         check_this_in   => l_recOUT.prof_runid);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'OUT trigger_offset',
    -         check_this_in   => l_recOUT.trigger_offset,
    -         against_this_in => 0);
    -      wt_assert.isnull (
    -         msg_in          => 'OUT error_message',
    -         check_this_in   => l_recOUT.error_message);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.dbout_owner',
    -         check_this_in   => l_recTEST.dbout_owner,
    -         against_this_in => USER);
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.dbout_name',
    -         check_this_in   => l_recTEST.dbout_name,
    -         against_this_in => l_pname);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.dbout_type',
    -         check_this_in   => l_recTEST.dbout_type,
    -         against_this_in => 'PACKAGE BODY');
    -      wt_assert.isnotnull (
    -         msg_in          => 'l_recTEST.prof_runid',
    -         check_this_in   => l_recTEST.prof_runid);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.trigger_offset',
    -         check_this_in   => l_recTEST.trigger_offset,
    -         against_this_in => 0);
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.error_message',
    -         check_this_in   => l_recTEST.error_message);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Initialize Test Sad Path 1';
    -      l_recSAVE := g_rec;
    -      begin
    -         initialize
    -            (in_test_run_id      => null,
    -             in_runner_name      => 'Sad Path 1',
    -             out_dbout_owner     => l_recOUT.dbout_owner,
    -             out_dbout_name      => l_recOUT.dbout_name,
    -             out_dbout_type      => l_recOUT.dbout_type,
    -             out_trigger_offset  => l_recOUT.trigger_offset,
    -             out_profiler_runid  => l_recOUT.prof_runid,
    -             out_error_message   => l_recOUT.error_message);
    -         l_sqlerrm := SQLERRM;
    -      --------------------------------------  WTPLSQL Testing --
    -      exception when others then
    -         l_sqlerrm := SQLERRM;
    -      end;
    -      l_recTEST := g_rec;
    -      g_rec := l_recSAVE;
    -      wt_assert.eq (
    -         msg_in          => 'SQLERRM',
    -         check_this_in   => l_sqlerrm,
    -         against_this_in => 'ORA-20004: i_test_run_id is null');
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Insert DBOUT Profile Teardown';
    -      tl_drop_db_object
    -         (in_ptype   => 'package'
    -         ,in_pname   => l_pname);
    -   end t_initialize;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -
    -------------------------------------------------------------
    --- Because this procedure is called to cleanup after erorrs,
    ---  it must be able to run multiple times without causing damage.
    -procedure finalize
    -is
    -   l_rec_NULL  rec_type;
    -begin
    -   if g_rec.prof_runid is null
    -   then
    -      return;
    -   end if;
    -   if g_rec.test_run_id is null
    -   then
    -      raise_application_error (-20000, 'g_rec.test_run_id is null');
    -   end if;
    -   $IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -   $THEN
    -      if not g_skip_insert
    -      then
    -   $END
    -   begin
    -      -- DBMS_PROFILER.FLUSH_DATA is included with DBMS_PROFILER.STOP_PROFILER
    -      --dbms_output.put_line('DEBUG3. g_rec.prof_runid = ' || g_rec.prof_runid);
    -      dbms_profiler.STOP_PROFILER;
    -   exception when others then
    -      g_rec := l_rec_NULL;
    -      --dbms_output.put_line('DEBUG4. SQLERRM = ' || sqlerrm);
    -      raise;
    -   end;
    -   insert_dbout_profile;
    -   $IF $$WTPLSQL_SELFTEST
    -   $THEN
    -      end if;
    -   $END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -   g_rec := l_rec_NULL;
    -end finalize;
    -
    -$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -$THEN
    -   procedure t_finalize
    -   is
    -      l_recSAVE    rec_type;
    -      l_recTEST    rec_type;
    -      l_sqlerrm    varchar2(4000);
    -      l_err_stack  varchar2(32000);
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Finalize Happy Path 1';
    -      l_recSAVE := g_rec;
    -      g_rec.prof_runid := NULL;
    -      wt_assert.isnull (
    -         msg_in          => 'g_rec.prof_runid',
    -         check_this_in   => g_rec.prof_runid);
    -      --------------------------------------  WTPLSQL Testing --
    -      begin
    -         finalize;
    -         l_err_stack := dbms_utility.format_error_stack     ||
    -                        dbms_utility.format_error_backtrace ;
    -      exception when others then
    -         l_err_stack := dbms_utility.format_error_stack     ||
    -                        dbms_utility.format_error_backtrace ;
    -      end;
    -      g_rec := l_recSAVE;
    -      wt_assert.isnull (
    -         msg_in          => 'format_error_stack and format_error_backtrace',
    -         check_this_in   => l_err_stack);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Finalize Happy Path 2';
    -      l_recSAVE := g_rec;
    -      g_rec.test_run_id    := -1;
    -      g_rec.dbout_owner    := 'TEST OWNER';
    -      g_rec.dbout_name     := 'TEST NAME';
    -      g_rec.dbout_type     := 'TEST TYPE';
    -      g_rec.prof_runid     := -2;
    -      g_rec.trigger_offset := -3;
    -      g_rec.error_message  := 'TEST MESSAGE';
    -      --------------------------------------  WTPLSQL Testing --
    -      g_skip_insert := TRUE;
    -      begin
    -         finalize;
    -         l_err_stack := dbms_utility.format_error_stack     ||
    -                        dbms_utility.format_error_backtrace ;
    -      exception when others then
    -         l_err_stack := dbms_utility.format_error_stack     ||
    -                        dbms_utility.format_error_backtrace ;
    -      end;
    -      g_skip_insert := FALSE;
    -      --------------------------------------  WTPLSQL Testing --
    -      l_recTEST := g_rec;
    -      g_rec := l_recSAVE;
    -      wt_assert.isnull (
    -         msg_in          => 'SQLERRM',
    -         check_this_in   => l_err_stack);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.test_run_id',
    -         check_this_in   => l_recTEST.test_run_id);
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.dbout_owner',
    -         check_this_in   => l_recTEST.dbout_owner);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.dbout_name',
    -         check_this_in   => l_recTEST.dbout_name);
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.dbout_type',
    -         check_this_in   => l_recTEST.dbout_type);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.prof_runid',
    -         check_this_in   => l_recTEST.prof_runid);
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.trigger_offset',
    -         check_this_in   => l_recTEST.trigger_offset);
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.error_message',
    -         check_this_in   => l_recTEST.error_message);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Finalize Sad Path 1';
    -      l_recSAVE := g_rec;
    -      g_rec.prof_runid := -1;
    -      g_rec.test_run_id := NULL;
    -      begin
    -         finalize;
    -      exception when others then
    -         l_sqlerrm := SQLERRM;
    -      end;
    -      --------------------------------------  WTPLSQL Testing --
    -      g_rec := l_recSAVE;
    -      wt_assert.eq (
    -         msg_in          => 'SQLERRM',
    -         check_this_in   => l_sqlerrm,
    -         against_this_in => 'ORA-20000: g_rec.test_run_id is null');
    -   end t_finalize;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -
    -------------------------------------------------------------
    --- Find begining of PL/SQL Block in a Trigger
    -function trigger_offset
    -      (dbout_owner_in  in  varchar2
    -      ,dbout_name_in   in  varchar2
    -      ,dbout_type_in   in  varchar2)
    -   return number
    -is
    -begin
    -   if dbout_type_in != 'TRIGGER'
    -   then
    -      return 0;
    -   end if;
    -   for buff in (
    -      select line, text from dba_source
    -       where owner = dbout_owner_in
    -        and  name  = dbout_name_in
    -        and  type  = 'TRIGGER'
    -      order by line )
    -   loop
    -      if regexp_instr(buff.text,
    -                      '(^declare$' ||
    -                      '|^declare[[:space:]]' ||
    -                      '|[[:space:]]declare$' ||
    -                      '|[[:space:]]declare[[:space:]])', 1, 1, 0, 'i') <> 0
    -         OR
    -         regexp_instr(buff.text,
    -                      '(^begin$' ||
    -                      '|^begin[[:space:]]' ||
    -                      '|[[:space:]]begin$' ||
    -                      '|[[:space:]]begin[[:space:]])', 1, 1, 0, 'i') <> 0 
    -      then
    -         return buff.line - 1;
    -      end if;
    -   end loop;
    -   return 0;
    -end trigger_offset;
    -
    -$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -$THEN
    -   procedure t_trigger_offset
    -   is
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Trigger Offset Happy Path';
    -      wt_assert.eq (
    -         msg_in          => 'Trigger Test',
    -         check_this_in   => trigger_offset (dbout_owner_in => USER
    -                                           ,dbout_name_in  => 'WT_SELF_TEST$TEST'
    -                                           ,dbout_type_in  => 'TRIGGER'),
    -         against_this_in => 3);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'Package Test',
    -         check_this_in   => trigger_offset (dbout_owner_in => USER
    -                                           ,dbout_name_in  => 'WT_PROFILER'
    -                                           ,dbout_type_in  => 'PACKAGE BODY'),
    -         against_this_in => 0);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Trigger Offset Sad Path';
    -      wt_assert.eq (
    -         msg_in          => 'Non Existent Object',
    -         check_this_in   => trigger_offset (dbout_owner_in => 'BOGUS456'
    -                                           ,dbout_name_in  => 'BOGUS123'
    -                                           ,dbout_type_in  => 'TRIGGER'),
    -         against_this_in => 0);
    -   end t_trigger_offset;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -
    -------------------------------------------------------------
    -function calc_pct_coverage
    -      (in_test_run_id  in  number)
    -   return number
    -IS
    -BEGIN
    -   for buff in (
    -      select sum(case status when 'EXEC' then 1 else 0 end)    HITS
    -            ,sum(case status when 'NOTX' then 1 else 0 end)    MISSES
    -       from  wt_dbout_profiles  p
    -       where test_run_id = in_test_run_id  )
    -   loop
    -      if buff.hits + buff.misses = 0
    -      then
    -         return -1;
    -      else
    -         return round(100 * buff.hits / (buff.hits + buff.misses),2);
    -      end if;
    -   end loop;
    -   return null;
    -END calc_pct_coverage;
    -
    -$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -$THEN
    -   procedure t_calc_pct_coverage
    -   is
    -      c_test_run_id  constant number := -95;
    -      l_rec          wt_dbout_profiles%ROWTYPE;
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Calculate Percent Coverage Setup';
    -      tl_insert_test_runs(c_test_run_id, 'Calculate Offset Test');
    -      l_rec.test_run_id  := c_test_run_id;
    -      l_rec.total_occur  := 1;
    -      l_rec.total_usecs  := 1;
    -      l_rec.min_usecs    := 1;
    -      l_rec.max_usecs    := 1;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Calculate Percent Coverage Happy Path 1';
    -      l_rec.line         := 1;
    -      l_rec.status       := 'EXEC';
    -      l_rec.text         := 'Testing ' || l_rec.line;
    -      tl_insert_dbout_profiles(l_rec);
    -      --------------------------------------  WTPLSQL Testing --
    -      l_rec.line         := 2;
    -      l_rec.status       := 'NOTX';
    -      l_rec.text         := 'Testing ' || l_rec.line;
    -      tl_insert_dbout_profiles(l_rec);
    -      --------------------------------------  WTPLSQL Testing --
    -      l_rec.line         := 3;
    -      l_rec.status       := 'EXEC';
    -      l_rec.text         := 'Testing ' || l_rec.line;
    -      tl_insert_dbout_profiles(l_rec);
    -      wt_assert.eq (
    -         msg_in          => 'Main Test',
    -         check_this_in   => calc_pct_coverage(c_test_run_id),
    -         against_this_in => 66.67);
    -      tl_delete_dbout_profiles(c_test_run_id);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Calculate Percent Coverage Happy Path 2';
    -      l_rec.line         := 1;
    -      l_rec.status       := 'EXCL';
    -      l_rec.text         := 'Testing ' || l_rec.line;
    -      tl_insert_dbout_profiles(l_rec);
    -      --------------------------------------  WTPLSQL Testing --
    -      l_rec.line         := 2;
    -      l_rec.status       := 'UNKN';
    -      l_rec.text         := 'Testing ' || l_rec.line;
    -      tl_insert_dbout_profiles(l_rec);
    -      --------------------------------------  WTPLSQL Testing --
    -      l_rec.line         := 3;
    -      l_rec.status       := 'EXCL';
    -      l_rec.text         := 'Testing ' || l_rec.line;
    -      tl_insert_dbout_profiles(l_rec);
    -      wt_assert.eq (
    -         msg_in          => 'Main Test',
    -         check_this_in   => calc_pct_coverage(c_test_run_id),
    -         against_this_in => -1);
    -      tl_delete_dbout_profiles(c_test_run_id);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Calculate Percent Coverage Sad Path';
    -      wt_assert.isnull (
    -         msg_in        => 'Missing Test Run ID',
    -         check_this_in => calc_pct_coverage(-99990));
    -      wt_assert.isnull (
    -         msg_in        => 'NULL Test Run ID',
    -         check_this_in => calc_pct_coverage(null));
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Calculate Percent Coverage Teardown';
    -      tl_delete_test_runs(c_test_run_id);
    -   end t_calc_pct_coverage;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -
    -------------------------------------------------------------
    -procedure delete_records
    -      (in_test_run_id  in number)
    -is
    -   l_profiler_runid  number;
    -begin
    -   select profiler_runid into l_profiler_runid
    -    from wt_test_runs where id = in_test_run_id;
    -   delete_plsql_profiler_recs(l_profiler_runid);
    -   delete from wt_dbout_profiles
    -    where test_run_id = in_test_run_id;
    -exception
    -   when NO_DATA_FOUND
    -   then
    -      return;
    -end delete_records;
    -
    -$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -$THEN
    -   procedure t_delete_records
    -   is
    -      c_test_run_id  constant number := -98;
    -      l_rec          wt_dbout_profiles%ROWTYPE;
    -      l_err_stack    varchar2(32000);
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Delete Records Setup';
    -      wt_assert.eqqueryvalue (
    -         msg_in           => 'wt_test_runs Count 0',
    -         check_query_in   => 'select count(*) from wt_test_runs' ||
    -                             ' where id = ' || c_test_run_id,
    -         against_value_in => 0);
    -      wt_assert.eqqueryvalue (
    -         msg_in           => 'wt_dbout_profiles Count 0',
    -         check_query_in   => 'select count(*) from wt_dbout_profiles' ||
    -                             ' where test_run_id = ' || c_test_run_id,
    -         against_value_in => 0);
    -      tl_insert_test_runs(c_test_run_id, 'Delete Records Test');
    -      --------------------------------------  WTPLSQL Testing --
    -      l_rec.test_run_id  := c_test_run_id;
    -      l_rec.line         := 1;
    -      l_rec.status       := 'EXEC';
    -      l_rec.total_occur  := 1;
    -      l_rec.total_usecs  := 1;
    -      l_rec.min_usecs    := 1;
    -      l_rec.max_usecs    := 1;
    -      l_rec.text         := 'Testing';
    -      tl_insert_dbout_profiles(l_rec);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Delete Records Happy Path 1';
    -      begin
    -         delete_records(c_test_run_id);
    -         l_err_stack := dbms_utility.format_error_stack     ||
    -                        dbms_utility.format_error_backtrace ;
    -      exception when others then
    -         l_err_stack := dbms_utility.format_error_stack     ||
    -                        dbms_utility.format_error_backtrace ;
    -      end;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in        => 'SQLERRM',
    -         check_this_in => l_err_stack);
    -      wt_assert.eqqueryvalue (
    -         msg_in           => 'wt_dbout_profiles Count 2',
    -         check_query_in   => 'select count(*) from wt_dbout_profiles' ||
    -                             ' where test_run_id = ' || c_test_run_id,
    -         against_value_in => 0);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Delete Records Sad Path 1';
    -      begin
    -         delete_records(-9876);
    -         l_err_stack := dbms_utility.format_error_stack     ||
    -                        dbms_utility.format_error_backtrace ;
    -      exception when others then
    -         l_err_stack := dbms_utility.format_error_stack     ||
    -                        dbms_utility.format_error_backtrace ;
    -      end;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in        => 'SQLERRM',
    -         check_this_in => l_err_stack);
    -      wt_assert.eqqueryvalue (
    -         msg_in           => 'wt_dbout_profiles Count 2',
    -         check_query_in   => 'select count(*) from wt_dbout_profiles' ||
    -                             ' where test_run_id = ' || c_test_run_id,
    -         against_value_in => 0);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Delete Records Sad Path 2';
    -      begin
    -         delete_records(NULL);
    -         l_err_stack := dbms_utility.format_error_stack     ||
    -                        dbms_utility.format_error_backtrace ;
    -      exception when others then
    -         l_err_stack := dbms_utility.format_error_stack     ||
    -                        dbms_utility.format_error_backtrace ;
    -      end;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in        => 'SQLERRM',
    -         check_this_in => l_err_stack);
    -      wt_assert.eqqueryvalue (
    -         msg_in           => 'wt_dbout_profiles Count 2',
    -         check_query_in   => 'select count(*) from wt_dbout_profiles' ||
    -                             ' where test_run_id = ' || c_test_run_id,
    -         against_value_in => 0);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Delete Records Teardown';
    -      tl_delete_test_runs(c_test_run_id);
    -   end t_delete_records;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -
    ---==============================================================--
    -$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -$THEN
    -   procedure WTPLSQL_RUN  --% WTPLSQL SET DBOUT "WT_PROFILER:PACKAGE BODY" %--
    -   is
    -   begin
    -      t_get_error_msg;
    -      t_delete_profiler_recs;
    -      t_find_dbout;
    -      t_load_ignr_aa;
    -      t_insert_dbout_profile;
    -      t_initialize;
    -      t_finalize;
    -      t_trigger_offset;
    -      t_calc_pct_coverage;
    -      t_delete_records;
    -   end WTPLSQL_RUN;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    ---==============================================================--
    -
    -
    -end wt_profiler;
    -
    -
    -
    - - diff --git a/docs/core/DBDocs/package body/WT_RESULT.html b/docs/core/DBDocs/package body/WT_RESULT.html deleted file mode 100644 index 9358aa6..0000000 --- a/docs/core/DBDocs/package body/WT_RESULT.html +++ /dev/null @@ -1,666 +0,0 @@ - - - - - - - - -
    -
    -
    -

    Doc

    -
    -
    -
    -
    -

    Details

    -
    -
    -
    -
    -

    Grants

    -
    -
    -
    -
    -

    References

    -
    -
    -
    -
    -

    Dependencies

    -
    -
    -
    -
    -

    Code

    -
    -
    -
    -
    -
    -
    -
    - -


    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMEWT_RESULT
    SUBOBJECT_NAMEnull
    OBJECT_ID41931
    DATA_OBJECT_IDnull
    OBJECT_TYPEPACKAGE BODY
    CREATED29-JUN-2018 15:09:15
    LAST_DDL_TIME29-JUN-2018 15:21:16
    TIMESTAMP2018-06-29:15:21:16
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE2
    EDITION_NAMEnull
    -
    -
    -
    -
    - - - - - - - - - - - - - - - -
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    EXECUTEPUBLICNOWTPWT_RESULT
    -
    -
    -
    -
    - - - - - - - - - -
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    -
    -
    -
    -
    - - - - - - - - - -
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    -
    -
    -
    -
    -
    -package body wt_result
    -as
    -
    -   TYPE results_nt_type is table of wt_results%ROWTYPE;
    -   g_results_nt      results_nt_type;
    -   g_results_rec     wt_results%ROWTYPE;
    -
    -   $IF $$WTPLSQL_SELFTEST $THEN  ------%WTPLSQL_begin_ignore_lines%------
    -      g_skip_add  BOOLEAN := FALSE;
    -   $END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -----------------------
    ---  Private Procedures
    -----------------------
    -
    -
    ----------------------
    ---  Public Procedures
    ----------------------
    -
    -------------------------------------------------------------
    -procedure initialize
    -      (in_test_run_id   in wt_test_runs.id%TYPE)
    -is
    -   l_results_recNULL  wt_results%ROWTYPE;
    -begin
    -   if in_test_run_id is NULL
    -   then
    -      raise_application_error(-20009, '"in_test_run_id" cannot be NULL');
    -   end if;
    -   g_results_rec := l_results_recNULL;
    -   g_results_rec.test_run_id  := in_test_run_id;
    -   g_results_rec.result_seq   := 0;
    -   g_results_rec.executed_dtm := systimestamp;
    -   g_results_nt := results_nt_type(null);
    -$IF $$WTPLSQL_SELFTEST $THEN  ------%WTPLSQL_begin_ignore_lines%------
    -   g_skip_add := FALSE;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -end initialize;
    -
    -$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -$THEN
    -   procedure t_initialize
    -   is
    -      l_results_recNULL  wt_results%ROWTYPE;
    -      l_results_recSAVE  wt_results%ROWTYPE;
    -      l_results_recTEST  wt_results%ROWTYPE;
    -      l_results_ntSAVE   results_nt_type;
    -      l_results_ntTEST   results_nt_type;
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      l_results_ntSAVE  := g_results_nt;
    -      l_results_recSAVE := g_results_rec;
    -      g_results_rec     := l_results_recNULL;
    -      initialize(-99);
    -      l_results_recTEST := g_results_rec;
    -      g_results_rec     := l_results_recSAVE;
    -      l_results_ntTEST  := g_results_nt;
    -      g_results_nt      := l_results_ntSAVE;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Initialize Happy Path';
    -      wt_assert.eq (
    -         msg_in          => 'l_results_recTEST.test_run_id',
    -         check_this_in   => l_results_recTEST.test_run_id,
    -         against_this_in => -99);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_results_recTEST.result_seq',
    -         check_this_in   => l_results_recTEST.result_seq,
    -         against_this_in => 0);
    -      wt_assert.isnotnull (
    -         msg_in          => 'l_results_recTEST.executed_dtm',
    -         check_this_in   => l_results_recTEST.executed_dtm);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in          => 'l_results_recTEST.interval_msecs',
    -         check_this_in   => l_results_recTEST.interval_msecs);
    -      wt_assert.isnull (
    -         msg_in          => 'l_results_recTEST.assertion',
    -         check_this_in   => l_results_recTEST.assertion);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in          => 'l_results_recTEST.status',
    -         check_this_in   => l_results_recTEST.status);
    -      wt_assert.isnull (
    -         msg_in          => 'l_results_recTEST.details',
    -         check_this_in   => l_results_recTEST.details);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in          => 'l_results_recTEST.testcase',
    -         check_this_in   => l_results_recTEST.testcase);
    -      wt_assert.isnull (
    -         msg_in          => 'l_results_recTEST.message',
    -         check_this_in   => l_results_recTEST.message);
    -      wt_assert.eq (
    -         msg_in          => 'l_results_ntTEST.COUNT',
    -         check_this_in   => l_results_ntTEST.COUNT,
    -         against_this_in => 1);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in          => 'l_results_ntTEST(1).test_run_id',
    -         check_this_in   => l_results_ntTEST(1).test_run_id);
    -      wt_assert.raises (
    -         msg_in         => 'Raises ORA-20009',
    -         check_call_in  => 'begin wt_result.initialize(NULL); end;',
    -         against_exc_in => 'ORA-20009: "in_test_run_id" cannot be NULL');
    -   end t_initialize;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -
    -------------------------------------------------------------
    --- Because this procedure is called to cleanup after errors,
    ---  it must be able to run multiple times without causing damage.
    -procedure finalize
    -is
    -   PRAGMA AUTONOMOUS_TRANSACTION;
    -   l_results_recNULL   wt_results%ROWTYPE;
    -begin
    -   if g_results_rec.test_run_id IS NULL
    -   then
    -      return;
    -   end if;
    -   -- There is always an extra NULL element in the g_results_nt array.
    -   forall i in 1 .. g_results_nt.COUNT - 1
    -      insert into wt_results values g_results_nt(i);
    -   COMMIT;
    -   g_results_nt := results_nt_type(null);
    -   g_results_rec := l_results_recNULL;
    -   g_results_nt := results_nt_type(null);
    -end finalize;
    -
    -$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -$THEN
    -   procedure t_finalize
    -   is
    -      --------------------------------------  WTPLSQL Testing --
    -      type num_recs_aa_type is table of number index by varchar2(50);
    -      num_recs_aa   num_recs_aa_type;
    -      l_test_runs_rec      wt_test_runs%ROWTYPE;
    -      l_results_recNULL    wt_results%ROWTYPE;
    -      l_results_recSAVE    wt_results%ROWTYPE;
    -      l_results_recTEST    wt_results%ROWTYPE;
    -      l_results_ntSAVE     results_nt_type;
    -      l_results_ntTEST     results_nt_type;
    -      l_num_recs           number;
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := '   ';
    -      l_results_ntSAVE     := g_results_nt;    -- Capture Original Values
    -      l_results_recSAVE    := g_results_rec;   -- Capture Original Values
    -      --------------------------------------  WTPLSQL Testing --
    -      -- Can't Test in this block because g_results_rec has test data
    -      g_results_rec  := l_results_recNULL;
    -      g_results_rec.test_run_id    := -99;
    -      g_results_rec.result_seq     := 1;
    -      g_results_rec.executed_dtm   := systimestamp;
    -      g_results_rec.interval_msecs := 99;
    -      --------------------------------------  WTPLSQL Testing --
    -      g_results_rec.assertion     := 'FINALTEST';
    -      g_results_rec.status        := wt_assert.C_PASS;
    -      g_results_rec.details       := 'This is a WT_RESULT.FINALIZE Test';
    -      g_results_nt := results_nt_type(null);
    -      g_results_nt(1) := g_results_rec;
    -      g_results_nt.extend;  -- Finalize expects that last element to be NULL
    -      --------------------------------------  WTPLSQL Testing --
    -      -- Can't Test in this block because g_results_rec has test data
    -      g_results_rec.test_run_id   := NULL;
    -      select count(*)
    -       into  num_recs_aa('Finalize Before NULL Test Record Count')
    -       from  wt_results
    -       where test_run_id = -99;
    -      finalize;
    -      --------------------------------------  WTPLSQL Testing --
    -      select count(*)
    -       into  num_recs_aa('Finalize After NULL Test Record Count')
    -       from  wt_results
    -       where test_run_id = -99;
    -      rollback;    -- UNDO all database changes
    -      g_results_rec.test_run_id   := -99;
    -      --------------------------------------  WTPLSQL Testing --
    -      -- Can't Test in this block because g_results_rec has test data
    -      l_test_runs_rec.id           := -99;
    -      l_test_runs_rec.start_dtm    := systimestamp;
    -      l_test_runs_rec.runner_name  := 'Finalize Test';
    -      l_test_runs_rec.runner_owner := 'BOGUS';
    -      insert into wt_test_runs values l_test_runs_rec;
    -      commit;      -- Must commit because finalize is AUTONOMOUS TRANSACTION
    -      --------------------------------------  WTPLSQL Testing --
    -      finalize;    -- g_results_nt is still loaded with one element
    -      l_results_ntTEST  := g_results_nt;
    -      l_results_recTEST := g_results_rec;
    -      select count(*)
    -       into  num_recs_aa('Finalize Record Count Test')
    -       from  wt_results
    -       where test_run_id = -99;
    -      delete from wt_results where test_run_id = -99;
    -      delete from wt_test_runs where id = -99;
    -      commit;      -- UNDO all database changes
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Finalize Happy Path';
    -      -- Restore values so we can test
    -      g_results_rec := l_results_recSAVE;
    -      g_results_nt  := l_results_ntSAVE;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'Before NULL Test Record Count',
    -         check_this_in   => num_recs_aa('Finalize Before NULL Test Record Count'),
    -         against_this_in => 0);
    -      wt_assert.eq (
    -         msg_in          => 'After NULL Test Record Count',
    -         check_this_in   => num_recs_aa('Finalize After NULL Test Record Count'),
    -         against_this_in => 0);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in        => 'l_results_recTEST.test_run_id',
    -         check_this_in => l_results_recTEST.test_run_id);
    -      wt_assert.eq (
    -         msg_in          => 'l_results_ntTEST.COUNT',
    -         check_this_in   => l_results_ntTEST.COUNT,
    -         against_this_in => 1);
    -      wt_assert.eq (
    -         msg_in          => 'Record Count Test',
    -         check_this_in   => num_recs_aa('Finalize Record Count Test'),
    -         against_this_in => 1);
    -   end t_finalize;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -
    -------------------------------------------------------------
    -procedure save
    -      (in_assertion      in wt_results.assertion%TYPE
    -      ,in_status         in wt_results.status%TYPE
    -      ,in_details        in wt_results.details%TYPE
    -      ,in_testcase       in wt_results.testcase%TYPE
    -      ,in_message        in wt_results.message%TYPE)
    -is
    -   l_current_tstamp  timestamp;
    -begin
    -   if g_results_rec.test_run_id IS NULL
    -   then
    -      wt_text_report.ad_hoc_result
    -         (in_assertion
    -         ,in_status
    -         ,in_details
    -         ,in_testcase
    -         ,in_message);
    -      return;
    -   end if;
    -   -- Set the time and interval
    -   l_current_tstamp := systimestamp;
    -   g_results_rec.interval_msecs := extract(day from (
    -                                  l_current_tstamp - g_results_rec.executed_dtm
    -                                  ) * 86400 * 1000);
    -   g_results_rec.executed_dtm  := l_current_tstamp;
    -   -- Set the IN variables
    -   g_results_rec.assertion     := in_assertion;
    -   g_results_rec.status        := in_status;
    -   g_results_rec.details       := substr(in_details,1,4000);
    -   g_results_rec.testcase      := substr(in_testcase,1,50);
    -   g_results_rec.message       := substr(in_message,1,200);
    -   -- Increment, Extend, and Load
    -   g_results_rec.result_seq    := g_results_rec.result_seq + 1;
    -   g_results_nt(g_results_nt.COUNT) := g_results_rec;
    -   g_results_nt.extend;
    -
    -$IF $$WTPLSQL_SELFTEST $THEN  ------%WTPLSQL_begin_ignore_lines%------
    -   if not g_skip_add then
    -$END
    -   wt_test_run_stat.add_result(g_results_rec);
    -$IF $$WTPLSQL_SELFTEST $THEN
    -   end if;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -end save;
    -
    -$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -$THEN
    -   procedure t_save_testing
    -   is
    -      --------------------------------------  WTPLSQL Testing --
    -      TYPE l_dbmsout_buff_type is table of varchar2(32767);
    -      l_dbmsout_buff   l_dbmsout_buff_type := l_dbmsout_buff_type(1);
    -      l_test_run_id    number;
    -      l_dbmsout_line   varchar2(32767);
    -      l_dbmsout_stat   number;
    -      l_nt_count       number;
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Ad Hoc Save Happy Path Setup';
    -      -- Save/Clear the DBMS_OUPTUT Buffer
    -      loop
    -         DBMS_OUTPUT.GET_LINE (
    -            line   => l_dbmsout_line,
    -            status => l_dbmsout_stat);
    -         exit when l_dbmsout_stat != 0;
    -         l_dbmsout_buff(l_dbmsout_buff.COUNT) := l_dbmsout_line;
    -         l_dbmsout_buff.extend;
    -      end loop;
    -      wt_assert.isnotnull (
    -         msg_in        => 'l_dbmsout_buff.COUNT - 1',
    -         check_this_in => l_dbmsout_buff.COUNT - 1);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Ad Hoc Save Testing Happy Path';
    -      l_test_run_id  := g_results_rec.test_run_id;
    -      g_results_rec.test_run_id := NULL;
    -      g_skip_add := TRUE;
    -      wt_result.save (
    -         in_assertion  => 'SELFTEST1',
    -         in_status     => wt_assert.C_PASS,
    -         in_details    => 't_save_testing Details',
    -         in_testcase   => wt_assert.g_testcase,
    -         in_message    => 't_save_testing Message');
    -      g_skip_add := FALSE;
    -      g_results_rec.test_run_id := l_test_run_id;
    -      --------------------------------------  WTPLSQL Testing --
    -      DBMS_OUTPUT.GET_LINE (
    -         line   => l_dbmsout_line,
    -         status => l_dbmsout_stat);
    -      wt_assert.eq (
    -         msg_in          => 'DBMS_OUTPUT Status',
    -         check_this_in   => l_dbmsout_stat,
    -         against_this_in => 0);
    -      --------------------------------------  WTPLSQL Testing --
    -      if wt_assert.last_pass
    -      then
    -         wt_assert.isnotnull (
    -            msg_in        => 'DBMS_OUTPUT Line',
    -            check_this_in => l_dbmsout_line);
    -         wt_assert.this (
    -            msg_in        => 'Save Testing NULL Test DBMS_OUTPUT 3 Message',
    -            check_this_in => (l_dbmsout_line like '%' || wt_assert.g_testcase ||
    -                             '%t_save_testing %'));
    -      --------------------------------------  WTPLSQL Testing --
    -         if not wt_assert.last_pass
    -         then
    -            -- No match, put the line back into DBMS_OUTPUT buffer and end this.
    -            DBMS_OUTPUT.PUT_LINE(l_dbmsout_line);
    -         end if;
    -      end if;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Ad Hoc Save Happy Path Teardown';
    -      -- Restore the DBMS_OUPTUT Buffer
    -      for i in 1 .. l_dbmsout_buff.COUNT - 1
    -      loop
    -         DBMS_OUTPUT.PUT_LINE(l_dbmsout_buff(i));
    -      end loop;
    -      wt_assert.isnotnull (
    -         msg_in        => 'l_dbmsout_buff.COUNT - 1',
    -         check_this_in =>  l_dbmsout_buff.COUNT - 1);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Save Testing Happy Path';
    -      l_nt_count     := g_results_nt.COUNT;
    -      g_skip_add := TRUE;
    -      wt_result.save (
    -         in_assertion  => 'SELFTEST2',
    -         in_status     => wt_assert.C_PASS,
    -         in_details    => 't_save_testing Testing Details',
    -         in_testcase   => wt_assert.g_testcase,
    -         in_message    => 't_save_testing Testing Message');
    -      g_skip_add := FALSE;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'g_results_nt.COUNT',
    -         check_this_in   => g_results_nt.COUNT,
    -         against_this_in => l_nt_count + 1);
    -      if not wt_assert.last_pass
    -      then
    -         return;   -- Something went wrong, end this now.
    -      end if;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'g_results_nt(' || l_nt_count || ').assetion',
    -         check_this_in   => g_results_nt(l_nt_count).assertion,
    -         against_this_in => 'SELFTEST2');
    -      wt_assert.eq (
    -         msg_in          => 'g_results_nt(' || l_nt_count || ').status',
    -         check_this_in   => g_results_nt(l_nt_count).status,
    -         against_this_in => wt_assert.C_PASS);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'g_results_nt(' || l_nt_count || ').details',
    -         check_this_in   => g_results_nt(l_nt_count).details,
    -         against_this_in => 't_save_testing Testing Details');
    -      wt_assert.eq (
    -         msg_in          => 'g_results_nt(' || l_nt_count || ').testcase',
    -         check_this_in   => g_results_nt(l_nt_count).testcase,
    -         against_this_in => wt_assert.g_testcase);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'g_results_nt(' || l_nt_count || ').message',
    -         check_this_in   => g_results_nt(l_nt_count).message,
    -         against_this_in => 't_save_testing Testing Message');
    -      wt_assert.isnotnull (
    -         msg_in          => 'g_results_nt(' || l_nt_count || ').interval_msecs',
    -         check_this_in   => g_results_nt(l_nt_count).interval_msecs);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnotnull (
    -         msg_in          => 'g_results_nt(' || l_nt_count || ').executed_dtm',
    -         check_this_in   => g_results_nt(l_nt_count).executed_dtm);
    -      wt_assert.isnotnull (
    -         msg_in          => 'g_results_nt(' || l_nt_count || ').result_seq',
    -         check_this_in   => g_results_nt(l_nt_count).result_seq);
    -      --  Can't Delete Test Element.  g_results_nt.COUNT is not reduced
    -      --    because nested tables are not dense.
    -      --g_results_nt.delete(l_nt_count + 1);
    -   end t_save_testing;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -
    -------------------------------------------------------------
    -procedure delete_records
    -      (in_test_run_id  in number)
    -is
    -begin
    -   delete from wt_results
    -    where test_run_id = in_test_run_id;
    -end delete_records;
    -
    -$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -$THEN
    -   procedure t_delete_records
    -   is
    -      --------------------------------------  WTPLSQL Testing --
    -      l_test_runs_rec  wt_test_runs%ROWTYPE;
    -      l_results_rec    wt_results%ROWTYPE;
    -      l_num_recs       number;
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Delete Records Happy Path';
    -      select count(*) into l_num_recs
    -       from  wt_results
    -       where test_run_id = -99;
    -      wt_assert.isnotnull (
    -         msg_in        => 'Before Insert Count',
    -         check_this_in => l_num_recs);
    -      --------------------------------------  WTPLSQL Testing --
    -      l_test_runs_rec.id           := -99;
    -      l_test_runs_rec.start_dtm    := sysdate;
    -      l_test_runs_rec.runner_name  := 'Delete Records Test';
    -      l_test_runs_rec.runner_owner := 'BOGUS';
    -      insert into wt_test_runs values l_test_runs_rec;
    -      l_results_rec.test_run_id    := -99;
    -      --------------------------------------  WTPLSQL Testing --
    -      l_results_rec.result_seq     := 1;
    -      l_results_rec.executed_dtm   := sysdate;
    -      l_results_rec.interval_msecs := 99;
    -      l_results_rec.assertion      := 'DELRECTEST';
    -      l_results_rec.status         := wt_assert.C_PASS;
    -      l_results_rec.details        := 'This is a WT_RESULT.DELETE_RECORDS Test';
    -      insert into wt_results values l_results_rec;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eqqueryvalue (
    -         msg_in            => 'After Insert Count',
    -         check_query_in    => 'select count(*) from wt_results' ||
    -                              ' where test_run_id = -99',
    -         against_value_in  => l_num_recs + 1);
    -      delete_records(-99);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eqqueryvalue (
    -         msg_in            => 'After Test Count',
    -         check_query_in    => 'select count(*) from wt_results' ||
    -                              ' where test_run_id = -99',
    -         against_value_in  => l_num_recs);
    -      rollback;
    -      wt_assert.eqqueryvalue (
    -         msg_in            => 'After ROLLBACK Count',
    -         check_query_in    => 'select count(*) from wt_results' ||
    -                              ' where test_run_id = -99',
    -         against_value_in  => l_num_recs);
    -   end t_delete_records;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -
    ---==============================================================--
    -$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -$THEN
    -   procedure WTPLSQL_RUN  --% WTPLSQL SET DBOUT "WT_RESULT:PACKAGE BODY" %--
    -   is
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      t_initialize;
    -      t_finalize;
    -      t_save_testing;
    -      t_delete_records;
    -   end WTPLSQL_RUN;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    ---==============================================================--
    -
    -
    -end wt_result;
    -
    -
    -
    - - diff --git a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT.html b/docs/core/DBDocs/package body/WT_TEST_RUN_STAT.html deleted file mode 100644 index ad770f5..0000000 --- a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT.html +++ /dev/null @@ -1,1150 +0,0 @@ - - - - - - - - -
    -
    -
    -

    Doc

    -
    -
    -
    -
    -

    Details

    -
    -
    -
    -
    -

    Grants

    -
    -
    -
    -
    -

    References

    -
    -
    -
    -
    -

    Dependencies

    -
    -
    -
    -
    -

    Code

    -
    -
    -
    -
    -
    -
    -
    - -


    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMEWT_TEST_RUN_STAT
    SUBOBJECT_NAMEnull
    OBJECT_ID41961
    DATA_OBJECT_IDnull
    OBJECT_TYPEPACKAGE BODY
    CREATED29-JUN-2018 15:21:18
    LAST_DDL_TIME29-JUN-2018 15:21:18
    TIMESTAMP2018-06-29:15:21:18
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE2
    EDITION_NAMEnull
    -
    -
    -
    -
    - - - - - - - - -
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    -
    -
    -
    -
    - - - - - - - - - -
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    -
    -
    -
    -
    - - - - - - - - - -
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    -
    -
    -
    -
    -
    -package body wt_test_run_stat
    -as
    -
    -   TYPE tc_aa_type is
    -        table of wt_testcase_stats%ROWTYPE
    -        index by varchar2(50);
    -   g_tc_aa  tc_aa_type;
    -   g_rec    wt_test_run_stats%ROWTYPE;
    -
    -
    -----------------------
    ---  Private Procedures
    -----------------------
    -
    -
    ----------------------
    ---  Public Procedures
    ----------------------
    -
    -
    -------------------------------------------------------------
    -procedure initialize
    -is
    -   l_recNULL  wt_test_run_stats%ROWTYPE;
    -begin
    -   g_rec := l_recNULL;
    -   g_tc_aa.delete;
    -end initialize;
    -
    -$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -$THEN
    -   procedure t_initialize
    -   is
    -      l_tc_aaSAVE  tc_aa_type;
    -      l_recSAVE    wt_test_run_stats%ROWTYPE;
    -      l_tc_aaTEST  tc_aa_type;
    -      l_recTEST    wt_test_run_stats%ROWTYPE;
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Initialize Happy Path 1 Setup';
    -      l_tc_aaTEST('TESTCASE1').test_run_id := -2;
    -      l_recTEST.test_run_id := -1;
    -      wt_assert.eq (
    -         msg_in          => 'l_tc_aaTEST(''TESTCASE1'').test_run_id',
    -         check_this_in   =>  l_tc_aaTEST('TESTCASE1').test_run_id,
    -         against_this_in =>  -2 );
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.test_run_id',
    -         check_this_in   =>  l_recTEST.test_run_id,
    -         against_this_in =>  -1 );
    -      --------------------------------------  WTPLSQL Testing --
    -      l_tc_aaSAVE := g_tc_aa;
    -      l_recSAVE   := g_rec;
    -      g_tc_aa     := l_tc_aaTEST;
    -      g_rec       := l_recTEST;
    -      initialize;
    -      l_tc_aaTEST := g_tc_aa;
    -      l_recTEST   := g_rec;
    -      g_tc_aa     := l_tc_aaSAVE;
    -      g_rec       := l_recSAVE;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Initialize Happy Path 1';
    -      wt_assert.eq (
    -         msg_in          => 'l_tc_aaTEST.COUNT',
    -         check_this_in   =>  l_tc_aaTEST.COUNT,
    -         against_this_in =>  0 );
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.test_run_id',
    -         check_this_in   =>  l_recTEST.test_run_id );
    -   end t_initialize;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -
    -------------------------------------------------------------
    -procedure add_result
    -      (in_results_rec  in wt_results%ROWTYPE)
    -is
    -   tc  varchar2(50);
    -begin
    -   -- If this raises an exception, it must be done before any other values
    -   --   are set because they will not be rolled-back after the "raise".
    -   case in_results_rec.status
    -      when 'PASS' then
    -         g_rec.passes := nvl(g_rec.passes,0) + 1;
    -      when 'FAIL' then
    -         g_rec.failures := nvl(g_rec.failures,0) + 1;
    -      when 'ERR' then
    -         g_rec.errors := nvl(g_rec.errors,0) + 1;
    -      else
    -         raise_application_error(-20010, 'Unknown Result status "' ||
    -                                      in_results_rec.status || '"');
    -   end case;
    -   g_rec.test_run_id := in_results_rec.test_run_id;
    -   g_rec.asserts     := nvl(g_rec.asserts,0) + 1;
    -   g_rec.min_interval_msecs := least(nvl(g_rec.min_interval_msecs,999999999)
    -                                    ,in_results_rec.interval_msecs);
    -   g_rec.max_interval_msecs := greatest(nvl(g_rec.max_interval_msecs,0)
    -                                       ,in_results_rec.interval_msecs);
    -   g_rec.tot_interval_msecs := nvl(g_rec.tot_interval_msecs,0) +
    -                               in_results_rec.interval_msecs;
    -   if in_results_rec.testcase is not null
    -   then
    -      tc := in_results_rec.testcase;
    -      g_tc_aa(tc).testcase    := tc;
    -      g_tc_aa(tc).test_run_id := in_results_rec.test_run_id;
    -      g_tc_aa(tc).asserts     := nvl(g_tc_aa(tc).asserts,0) + 1;
    -      case in_results_rec.status
    -         when 'PASS' then
    -            g_tc_aa(tc).passes := nvl(g_tc_aa(tc).passes,0) + 1;
    -         when 'FAIL' then
    -            g_tc_aa(tc).failures := nvl(g_tc_aa(tc).failures,0) + 1;
    -         when 'ERR' then
    -            g_tc_aa(tc).errors := nvl(g_tc_aa(tc).errors,0) + 1;
    -         -- No need to check "ELSE" because it would have been caught above
    -      end case;
    -      g_tc_aa(tc).min_interval_msecs := least(nvl(g_tc_aa(tc).min_interval_msecs,999999999)
    -                                             ,in_results_rec.interval_msecs);
    -      g_tc_aa(tc).max_interval_msecs := greatest(nvl(g_tc_aa(tc).max_interval_msecs,0)
    -                                                ,in_results_rec.interval_msecs);
    -      g_tc_aa(tc).tot_interval_msecs := nvl(g_tc_aa(tc).tot_interval_msecs,0) +
    -                                        in_results_rec.interval_msecs;
    -   end if;
    -end add_result;
    -
    -$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -$THEN
    -   procedure t_add_result
    -   is
    -      l_tc_aaSAVE   tc_aa_type;
    -      l_recSAVE     wt_test_run_stats%ROWTYPE;
    -      l_tc_aaTEST   tc_aa_type;
    -      l_recTEST     wt_test_run_stats%ROWTYPE;
    -      l_resultTEST  wt_results%ROWTYPE;
    -      l_sqlerrm     varchar2(4000);
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      -- Overview:
    -      -- 1) Save results in temporary variables
    -      -- 2) Clear ADD_RESULT variables
    -      -- 3) Call ADD_RESULT several times with test data.
    -      -- 4) Capture test results
    -      -- 5) Restore saved results
    -      -- 6) Confirm the test results using WT_ASSERT.
    -      --------------------------------------  WTPLSQL Testing --
    -      l_tc_aaSAVE := g_tc_aa;
    -      l_recSAVE   := g_rec;
    -      g_tc_aa     := l_tc_aaTEST;
    -      g_rec       := l_recTEST;
    -      l_resultTEST.test_run_id    := -10;
    -      l_resultTEST.interval_msecs := 10;
    -      l_resultTEST.status         := 'PASS';
    -      l_resultTEST.testcase       := 'TESTCASE1';
    -      add_result(l_resultTEST);
    -      --------------------------------------  WTPLSQL Testing --
    -      l_resultTEST.interval_msecs := 20;
    -      l_resultTEST.status         := 'FAIL';
    -      l_resultTEST.testcase       := 'TESTCASE1';
    -      add_result(l_resultTEST);
    -      l_resultTEST.interval_msecs := 30;
    -      l_resultTEST.status         := 'ERR';
    -      l_resultTEST.testcase       := 'TESTCASE1';
    -      add_result(l_resultTEST);
    -      --------------------------------------  WTPLSQL Testing --
    -      l_resultTEST.interval_msecs := 40;
    -      l_resultTEST.status         := 'ABC';
    -      l_resultTEST.testcase       := 'TESTCASE1';
    -      begin
    -         add_result(l_resultTEST);
    -         l_sqlerrm := SQLERRM;
    -      exception when others then
    -         l_sqlerrm := SQLERRM;
    -      end;
    -      --------------------------------------  WTPLSQL Testing --
    -      l_tc_aaTEST := g_tc_aa;
    -      l_recTEST   := g_rec;
    -      g_tc_aa     := l_tc_aaSAVE;
    -      g_rec       := l_recSAVE;
    -      wt_assert.g_testcase := 'Add Result Testing';
    -      wt_assert.eq (
    -          msg_in          => 'Add Result Sad Path 1',
    -          check_this_in   => 'ORA-20010: Unknown Result status "ABC"',
    -          against_this_in => l_sqlerrm);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.test_run_id',
    -         check_this_in   => l_recTEST.test_run_id,
    -         against_this_in => -10);
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.asserts',
    -         check_this_in   => l_recTEST.asserts,
    -         against_this_in => 3);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.passes',
    -         check_this_in   => l_recTEST.passes,
    -         against_this_in => 1);
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.failures',
    -         check_this_in   => l_recTEST.failures,
    -         against_this_in => 1);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.errors',
    -         check_this_in   => l_recTEST.errors,
    -         against_this_in => 1);
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.min_interval_msecs',
    -         check_this_in   => l_recTEST.min_interval_msecs,
    -         against_this_in => 10);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.max_interval_msecs',
    -         check_this_in   => l_recTEST.max_interval_msecs,
    -         against_this_in => 30);
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.tot_interval_msecs',
    -         check_this_in   => l_recTEST.tot_interval_msecs,
    -         against_this_in => 60);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_tc_aaTEST(''TESTCASE1'').test_run_id',
    -         check_this_in   => l_tc_aaTEST('TESTCASE1').test_run_id,
    -         against_this_in => -10);
    -      wt_assert.eq (
    -         msg_in          => 'l_tc_aaTEST(''TESTCASE1'').asserts',
    -         check_this_in   => l_tc_aaTEST('TESTCASE1').asserts,
    -         against_this_in => 3);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_tc_aaTEST(''TESTCASE1'').passes',
    -         check_this_in   => l_tc_aaTEST('TESTCASE1').passes,
    -         against_this_in => 1);
    -      wt_assert.eq (
    -         msg_in          => 'l_tc_aaTEST(''TESTCASE1'').failures',
    -         check_this_in   => l_tc_aaTEST('TESTCASE1').failures,
    -         against_this_in => 1);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_tc_aaTEST(''TESTCASE1'').errors',
    -         check_this_in   => l_tc_aaTEST('TESTCASE1').errors,
    -         against_this_in => 1);
    -      wt_assert.eq (
    -         msg_in          => 'l_tc_aaTEST(''TESTCASE1'').min_interval_msecs',
    -         check_this_in   => l_tc_aaTEST('TESTCASE1').min_interval_msecs,
    -         against_this_in => 10);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_tc_aaTEST(''TESTCASE1'').max_interval_msecs',
    -         check_this_in   => l_tc_aaTEST('TESTCASE1').max_interval_msecs,
    -         against_this_in => 30);
    -      wt_assert.eq (
    -         msg_in          => 'l_tc_aaTEST(''TESTCASE1'').tot_interval_msecs',
    -         check_this_in   => l_tc_aaTEST('TESTCASE1').tot_interval_msecs,
    -         against_this_in => 60);
    -   end t_add_result;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -
    -------------------------------------------------------------
    -procedure add_profile
    -      (in_dbout_profiles_rec  in wt_dbout_profiles%ROWTYPE)
    -is
    -begin
    -   -- If this raises an exception, it must be done before any other values
    -   --   are set because they will not be rolled-back after the "raise".
    -   case in_dbout_profiles_rec.status
    -      when 'EXEC' then
    -         g_rec.executed_lines := nvl(g_rec.executed_lines,0) + 1;
    -         -- Only count the executed time.
    -         g_rec.min_executed_usecs := least(nvl(g_rec.min_executed_usecs,999999999)
    -                                          ,in_dbout_profiles_rec.min_usecs);
    -         g_rec.max_executed_usecs := greatest(nvl(g_rec.max_executed_usecs,0)
    -                                             ,in_dbout_profiles_rec.max_usecs);
    -         g_rec.tot_executed_usecs := nvl(g_rec.tot_executed_usecs,0) +
    -                                     ( in_dbout_profiles_rec.total_usecs /
    -                                       in_dbout_profiles_rec.total_occur  );
    -      when 'IGNR' then
    -         g_rec.ignored_lines := nvl(g_rec.ignored_lines,0) + 1;
    -      when 'EXCL' then
    -         g_rec.excluded_lines := nvl(g_rec.excluded_lines,0) + 1;
    -      when 'NOTX' then
    -         g_rec.notexec_lines := nvl(g_rec.notexec_lines,0) + 1;
    -      when 'UNKN' then
    -         g_rec.unknown_lines := nvl(g_rec.unknown_lines,0) + 1;
    -      else
    -         raise_application_error(-20011, 'Unknown Profile status "' ||
    -                                       in_dbout_profiles_rec.status || '"');
    -   end case;
    -   g_rec.test_run_id    := in_dbout_profiles_rec.test_run_id;
    -   g_rec.profiled_lines := nvl(g_rec.profiled_lines,0) + 1;
    -end add_profile;
    -
    -$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -$THEN
    -   procedure t_add_profile
    -   is
    -      l_recSAVE      wt_test_run_stats%ROWTYPE;
    -      l_recTEST      wt_test_run_stats%ROWTYPE;
    -      l_profileTEST  wt_dbout_profiles%ROWTYPE;
    -      l_sqlerrm      varchar2(4000);
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      -- Overview:
    -      -- 1) Save results in temporary variables
    -      -- 2) Clear ADD_PROFILE variables
    -      -- 3) Call ADD_PROFILE several times with test data.
    -      -- 4) Capture test results
    -      -- 5) Restore saved results
    -      -- 6) Confirm the test results using WT_ASSERT.
    -      --------------------------------------  WTPLSQL Testing --
    -      l_recSAVE   := g_rec;
    -      g_rec       := l_recTEST;
    -      l_profileTEST.test_run_id := -20;
    -      l_profileTEST.min_usecs   := 10;
    -      l_profileTEST.max_usecs   := 20;
    -      l_profileTEST.total_usecs := 30;
    -      l_profileTEST.total_occur := 1;
    -      l_profileTEST.status := 'EXEC';
    -      add_profile(l_profileTEST);
    -      l_profileTEST.status := 'EXEC';
    -      add_profile(l_profileTEST);
    -      --------------------------------------  WTPLSQL Testing --
    -      l_profileTEST.status := 'EXEC';
    -      add_profile(l_profileTEST);
    -      l_profileTEST.status := 'EXEC';
    -      add_profile(l_profileTEST);
    -      l_profileTEST.status := 'EXEC';
    -      add_profile(l_profileTEST);
    -      l_profileTEST.status := 'IGNR';
    -      add_profile(l_profileTEST);
    -      l_profileTEST.status := 'IGNR';
    -      add_profile(l_profileTEST);
    -      --------------------------------------  WTPLSQL Testing --
    -      l_profileTEST.status := 'IGNR';
    -      add_profile(l_profileTEST);
    -      l_profileTEST.status := 'IGNR';
    -      add_profile(l_profileTEST);
    -      l_profileTEST.status := 'NOTX';
    -      add_profile(l_profileTEST);
    -      l_profileTEST.status := 'NOTX';
    -      add_profile(l_profileTEST);
    -      l_profileTEST.status := 'NOTX';
    -      add_profile(l_profileTEST);
    -      --------------------------------------  WTPLSQL Testing --
    -      l_profileTEST.status := 'EXCL';
    -      add_profile(l_profileTEST);
    -      l_profileTEST.status := 'EXCL';
    -      add_profile(l_profileTEST);
    -      l_profileTEST.status := 'UNKN';
    -      add_profile(l_profileTEST);
    -      --------------------------------------  WTPLSQL Testing --
    -      l_profileTEST.status := 'ABC';
    -      begin
    -         add_profile(l_profileTEST);
    -         l_sqlerrm := SQLERRM;
    -      exception when others then
    -         l_sqlerrm := SQLERRM;
    -      end;
    -      l_recTEST := g_rec;
    -      g_rec     := l_recSAVE;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Add Profile Testing';
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.test_run_id',
    -         check_this_in   => l_recTEST.test_run_id,
    -         against_this_in => -20);
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.profiled_lines',
    -         check_this_in   => l_recTEST.profiled_lines,
    -         against_this_in => 15);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.min_executed_usecs',
    -         check_this_in   => l_recTEST.min_executed_usecs,
    -         against_this_in => 10);
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.max_executed_usecs',
    -         check_this_in   => l_recTEST.max_executed_usecs,
    -         against_this_in => 20);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.tot_executed_usecs',
    -         check_this_in   => l_recTEST.tot_executed_usecs,
    -         against_this_in => 150);
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.executed_lines',
    -         check_this_in   => l_recTEST.executed_lines,
    -         against_this_in => 5);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.ignored_lines',
    -         check_this_in   => l_recTEST.ignored_lines,
    -         against_this_in => 4);
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.notexec_lines',
    -         check_this_in   => l_recTEST.notexec_lines,
    -         against_this_in => 3);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.excluded_lines',
    -         check_this_in   => l_recTEST.excluded_lines,
    -         against_this_in => 2);
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.unknown_lines',
    -         check_this_in   => l_recTEST.unknown_lines,
    -         against_this_in => 1);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -          msg_in          => 'Add Result Sad Path 1',
    -          check_this_in   => 'ORA-20011: Unknown Profile status "ABC"',
    -          against_this_in => l_sqlerrm);
    -   end t_add_profile;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -
    -------------------------------------------------------------
    -procedure finalize
    -is
    -   PRAGMA AUTONOMOUS_TRANSACTION;
    -   l_executable_lines   number;
    -   tc                   varchar2(50);
    -begin
    -   if g_rec.test_run_id is null
    -   then
    -      initialize;
    -      return;
    -   end if;
    -   g_rec.testcases := g_tc_aa.COUNT;
    -   g_rec.asserts   := nvl(g_rec.asserts ,0);
    -   g_rec.passes    := nvl(g_rec.passes  ,0);
    -   g_rec.failures  := nvl(g_rec.failures,0);
    -   g_rec.errors    := nvl(g_rec.errors  ,0);
    -   if g_rec.asserts != 0
    -   then
    -      g_rec.test_yield := round(g_rec.passes/g_rec.asserts, 3);
    -      g_rec.avg_interval_msecs := round(g_rec.tot_interval_msecs/g_rec.asserts, 3);
    -   end if;
    -   if g_rec.profiled_lines is not null
    -   then
    -      g_rec.executed_lines  := nvl(g_rec.executed_lines ,0);
    -      g_rec.ignored_lines   := nvl(g_rec.ignored_lines,0);
    -      g_rec.excluded_lines  := nvl(g_rec.excluded_lines ,0);
    -      g_rec.notexec_lines   := nvl(g_rec.notexec_lines  ,0);
    -      g_rec.unknown_lines   := nvl(g_rec.unknown_lines  ,0);
    -      l_executable_lines    := g_rec.executed_lines + g_rec.notexec_lines;
    -      if l_executable_lines != 0
    -      then
    -         g_rec.code_coverage := round(g_rec.executed_lines/l_executable_lines, 3);
    -         g_rec.avg_executed_usecs := round(g_rec.tot_executed_usecs/l_executable_lines, 3);
    -      end if;
    -   end if;
    -   insert into wt_test_run_stats values g_rec;
    -   if g_rec.testcases > 0
    -   then
    -      tc := g_tc_aa.FIRST;
    -      loop
    -         g_tc_aa(tc).asserts  := nvl(g_tc_aa(tc).asserts ,0);
    -         g_tc_aa(tc).passes   := nvl(g_tc_aa(tc).passes  ,0);
    -         g_tc_aa(tc).failures := nvl(g_tc_aa(tc).failures,0);
    -         g_tc_aa(tc).errors   := nvl(g_tc_aa(tc).errors  ,0);
    -         if g_rec.asserts != 0
    -         then
    -            g_tc_aa(tc).test_yield := round(g_tc_aa(tc).passes /
    -                                            g_tc_aa(tc).asserts, 3);
    -            g_tc_aa(tc).avg_interval_msecs := round(g_tc_aa(tc).tot_interval_msecs /
    -                                                   g_tc_aa(tc).asserts, 3);
    -         end if;
    -         insert into wt_testcase_stats values g_tc_aa(tc);
    -         exit when tc = g_tc_aa.LAST;
    -         tc := g_tc_aa.NEXT(tc);
    -      end loop;
    -   end if;
    -   COMMIT;
    -   initialize;
    -end finalize;
    -
    -$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -$THEN
    -   procedure t_finalize
    -   is
    -      l_tc_aaSAVE    tc_aa_type;
    -      l_recSAVE      wt_test_run_stats%ROWTYPE;
    -      l_tc_aaTEST    tc_aa_type;
    -      l_recTEST      wt_test_run_stats%ROWTYPE;
    -      l_recNULL      wt_test_run_stats%ROWTYPE;
    -      l_tstat_rec    wt_testcase_stats%ROWTYPE;
    -      l_test_run_id  number       := -102;
    -      l_tc           varchar2(50) := 'TC2';
    -      l_sql_txt      varchar2(4000);
    -      l_sqlerrm      varchar2(4000);
    -      --------------------------------------  WTPLSQL Testing --
    -      procedure run_finalize (in_msg_txt in varchar2) is begin
    -         l_tc_aaSAVE := g_tc_aa;
    -         l_recSAVE   := g_rec;
    -         g_tc_aa     := l_tc_aaTEST;
    -         g_rec       := l_recTEST;
    -         begin
    -            finalize;
    -            l_sqlerrm := SQLERRM;
    -         exception when others then
    -            l_sqlerrm := SQLERRM;
    -         end;
    -      --------------------------------------  WTPLSQL Testing --
    -         l_tc_aaTEST := g_tc_aa;
    -         l_recTEST   := g_rec;
    -         g_tc_aa     := l_tc_aaSAVE;
    -         g_rec       := l_recSAVE;
    -         wt_assert.eq (
    -            msg_in          => in_msg_txt,
    -            check_this_in   => l_sqlerrm,
    -            against_this_in => 'ORA-0000: normal, successful completion');
    -      end run_finalize;
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'FINALIZE Happy Path Setup';
    -      l_sql_txt := 'insert into WT_TEST_RUNS' ||
    -                   ' (id, start_dtm, runner_owner, runner_name)' ||
    -         ' values (' || l_test_run_id || ', sysdate, USER, ''TESTRUNNER3'')';
    -      wt_assert.raises (
    -         msg_in         => 'Insert WT_TEST_RUNS Record',
    -         check_call_in  => l_sql_txt,
    -         against_exc_in => '');
    -      commit;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase  := 'FINALIZE Happy Path 1';
    -      l_tc_aaTEST.delete;
    -      l_recTEST := l_recNULL;
    -      l_recTEST.test_run_id := l_test_run_id;
    -      run_finalize('Run Finalize for Happy Path 1');  -- AUTONOMOUS COMMIT
    -      --------------------------------------  WTPLSQL Testing --
    -      begin
    -         select * into l_recTEST
    -          from  WT_TEST_RUN_STATS
    -          where test_run_id = l_test_run_id;
    -         l_sqlerrm := SQLERRM;
    -      exception when others then
    -         l_sqlerrm := SQLERRM;
    -      end;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'Retieve WT_TEST_RUN_STATS record',
    -         check_this_in   => l_sqlerrm,
    -         against_this_in => 'ORA-0000: normal, successful completion');
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.test_run_id',
    -         check_this_in   => l_recTEST.test_run_id,
    -         against_this_in => l_test_run_id);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.test_yield',
    -         check_this_in   => l_recTEST.test_yield);
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.asserts',
    -         check_this_in   => l_recTEST.asserts,
    -         against_this_in => 0);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.passes',
    -         check_this_in   => l_recTEST.passes,
    -         against_this_in => 0);
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.failures',
    -         check_this_in   => l_recTEST.failures,
    -         against_this_in => 0);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.errors',
    -         check_this_in   => l_recTEST.errors,
    -         against_this_in => 0);
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.testcases',
    -         check_this_in   => l_recTEST.testcases,
    -         against_this_in => 0);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.min_interval_msecs',
    -         check_this_in   => l_recTEST.min_interval_msecs);
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.avg_interval_msecs',
    -         check_this_in   => l_recTEST.avg_interval_msecs);
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.max_interval_msecs',
    -         check_this_in   => l_recTEST.max_interval_msecs);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.tot_interval_msecs',
    -         check_this_in   => l_recTEST.tot_interval_msecs);
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.code_coverage',
    -         check_this_in   => l_recTEST.code_coverage);
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.profiled_lines',
    -         check_this_in   => l_recTEST.profiled_lines);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.executed_lines',
    -         check_this_in   => l_recTEST.executed_lines);
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.ignored_lines',
    -         check_this_in   => l_recTEST.ignored_lines);
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.excluded_lines',
    -         check_this_in   => l_recTEST.excluded_lines);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.notexec_lines',
    -         check_this_in   => l_recTEST.notexec_lines);
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.unknown_lines',
    -         check_this_in   => l_recTEST.unknown_lines);
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.avg_executed_usecs',
    -         check_this_in   => l_recTEST.avg_executed_usecs);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eqqueryvalue (
    -         msg_in           => 'There should be no WT_TESTCASE_STATS records',
    -         check_query_in   => 'select count(*) from WT_TESTCASE_STATS' ||
    -                             ' where test_run_id = ' || l_test_run_id,
    -         against_value_in => 0);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.raises (
    -         msg_in         => 'Delete WT_TEST_RUN_STATS Record',
    -         check_call_in  => 'delete from WT_TEST_RUN_STATS where test_run_id = ' ||
    -                                                              l_test_run_id,
    -         against_exc_in => '');
    -      commit;
    -      wt_assert.eqqueryvalue (
    -         msg_in           => 'There should be no WT_TEST_RUN_STATS records',
    -         check_query_in   => 'select count(*) from WT_TEST_RUN_STATS' ||
    -                             ' where test_run_id = ' || l_test_run_id,
    -         against_value_in => 0);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'FINALIZE Happy Path 2';
    -      l_tc_aaTEST.delete;
    -      l_tc_aaTEST(l_tc||'a').test_run_id        := l_test_run_id;
    -      l_tc_aaTEST(l_tc||'a').testcase           := l_tc||'a';
    -      l_tc_aaTEST(l_tc||'a').asserts            := 3;
    -      l_tc_aaTEST(l_tc||'a').passes             := 2;
    -      l_tc_aaTEST(l_tc||'a').failures           := 1;
    -      --l_tc_aaTEST(l_tc||'a').errors             := null;
    -      l_tc_aaTEST(l_tc||'a').tot_interval_msecs := 300;
    -      --------------------------------------  WTPLSQL Testing --
    -      l_tc_aaTEST(l_tc||'b').test_run_id        := l_test_run_id;
    -      l_tc_aaTEST(l_tc||'b').testcase           := l_tc||'b';
    -      l_tc_aaTEST(l_tc||'b').asserts            := 3;
    -      l_tc_aaTEST(l_tc||'b').passes             := 2;
    -      l_tc_aaTEST(l_tc||'b').failures           := 1;
    -      --l_tc_aaTEST(l_tc||'b').errors             := null;
    -      l_tc_aaTEST(l_tc||'b').tot_interval_msecs := 300;
    -      --------------------------------------  WTPLSQL Testing --
    -      l_recTEST := l_recNULL;
    -      l_recTEST.test_run_id         := l_test_run_id;
    -      l_recTEST.asserts             := 6;
    -      l_recTEST.passes              := 4;
    -      l_recTEST.failures            := 2;
    -      --l_recTEST.errors              := null;
    -      l_recTEST.tot_interval_msecs  := 600;
    -      --------------------------------------  WTPLSQL Testing --
    -      l_recTEST.profiled_lines      := 20;
    -      l_recTEST.executed_lines      := 8;
    -      l_recTEST.ignored_lines       := 6;
    -      l_recTEST.excluded_lines      := 4;
    -      l_recTEST.notexec_lines       := 2;
    -      --l_recTEST.unknown_lines       := null;
    -      l_recTEST.tot_executed_usecs  := 2000;
    -      run_finalize('Run Finalize for Happy Path 2');  -- AUTONOMOUS COMMIT
    -      --------------------------------------  WTPLSQL Testing --
    -      begin
    -         select * into l_tstat_rec
    -          from  WT_TESTCASE_STATS
    -          where test_run_id = l_test_run_id
    -           and  testcase    = l_tc||'a';
    -         l_sqlerrm := SQLERRM;
    -      exception when others then
    -         l_sqlerrm := SQLERRM;
    -      end;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'Retieve WT_TESTCASE_STATS record',
    -         check_this_in   => l_sqlerrm,
    -         against_this_in => 'ORA-0000: normal, successful completion');
    -      wt_assert.eq (
    -         msg_in          => 'l_tstat_rec.test_run_id',
    -         check_this_in   => l_tstat_rec.test_run_id,
    -         against_this_in => l_test_run_id);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_tstat_rec.testcase',
    -         check_this_in   => l_tstat_rec.testcase,
    -         against_this_in => l_tc||'a');
    -      wt_assert.eq (
    -         msg_in          => 'l_tstat_rec.asserts',
    -         check_this_in   => l_tstat_rec.asserts,
    -         against_this_in => 3);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_tstat_rec.passes',
    -         check_this_in   => l_tstat_rec.passes,
    -         against_this_in => 2);
    -      wt_assert.eq (
    -         msg_in          => 'l_tstat_rec.failures',
    -         check_this_in   => l_tstat_rec.failures,
    -         against_this_in => 1);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_tstat_rec.errors',
    -         check_this_in   => l_tstat_rec.errors,
    -         against_this_in => 0);
    -      wt_assert.eq (
    -         msg_in          => 'l_tstat_rec.test_yield',
    -         check_this_in   => l_tstat_rec.test_yield,
    -         against_this_in => 0.667);
    -      wt_assert.eq (
    -         msg_in          => 'l_tstat_rec.avg_interval_msecs',
    -         check_this_in   => l_tstat_rec.avg_interval_msecs,
    -         against_this_in => 100);
    -      --------------------------------------  WTPLSQL Testing --
    -      begin
    -         select * into l_tstat_rec
    -          from  WT_TESTCASE_STATS
    -          where test_run_id = l_test_run_id
    -           and  testcase    = l_tc||'b';
    -         l_sqlerrm := SQLERRM;
    -      exception when others then
    -         l_sqlerrm := SQLERRM;
    -      end;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'Retieve WT_TESTCASE_STATS record',
    -         check_this_in   => l_sqlerrm,
    -         against_this_in => 'ORA-0000: normal, successful completion');
    -      wt_assert.eq (
    -         msg_in          => 'l_tstat_rec.test_run_id',
    -         check_this_in   => l_tstat_rec.test_run_id,
    -         against_this_in => l_test_run_id);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_tstat_rec.testcase',
    -         check_this_in   => l_tstat_rec.testcase,
    -         against_this_in => l_tc||'b');
    -      wt_assert.eq (
    -         msg_in          => 'l_tstat_rec.asserts',
    -         check_this_in   => l_tstat_rec.asserts,
    -         against_this_in => 3);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_tstat_rec.passes',
    -         check_this_in   => l_tstat_rec.passes,
    -         against_this_in => 2);
    -      wt_assert.eq (
    -         msg_in          => 'l_tstat_rec.failures',
    -         check_this_in   => l_tstat_rec.failures,
    -         against_this_in => 1);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_tstat_rec.errors',
    -         check_this_in   => l_tstat_rec.errors,
    -         against_this_in => 0);
    -      wt_assert.eq (
    -         msg_in          => 'l_tstat_rec.test_yield',
    -         check_this_in   => l_tstat_rec.test_yield,
    -         against_this_in => 0.667);
    -      wt_assert.eq (
    -         msg_in          => 'l_tstat_rec.avg_interval_msecs',
    -         check_this_in   => l_tstat_rec.avg_interval_msecs,
    -         against_this_in => 100);
    -      --------------------------------------  WTPLSQL Testing --
    -      begin
    -         select * into l_recTEST
    -          from  WT_TEST_RUN_STATS
    -          where test_run_id = l_test_run_id;
    -         l_sqlerrm := SQLERRM;
    -      exception when others then
    -         l_sqlerrm := SQLERRM;
    -      end;
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'Retieve WT_TEST_RUN_STATS record',
    -         check_this_in   => l_sqlerrm,
    -         against_this_in => 'ORA-0000: normal, successful completion');
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.test_run_id',
    -         check_this_in   => l_recTEST.test_run_id,
    -         against_this_in => l_test_run_id);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.test_yield',
    -         check_this_in   => l_recTEST.test_yield,
    -         against_this_in => 0.667);
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.asserts',
    -         check_this_in   => l_recTEST.asserts,
    -         against_this_in => 6);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.passes',
    -         check_this_in   => l_recTEST.passes,
    -         against_this_in => 4);
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.failures',
    -         check_this_in   => l_recTEST.failures,
    -         against_this_in => 2);
    -       --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.errors',
    -         check_this_in   => l_recTEST.errors,
    -         against_this_in => 0);
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.testcases',
    -         check_this_in   => l_recTEST.testcases,
    -         against_this_in => 2);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.avg_interval_msecs',
    -         check_this_in   => l_recTEST.avg_interval_msecs,
    -         against_this_in => 100);
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.code_coverage',
    -         check_this_in   => l_recTEST.code_coverage,
    -         against_this_in => 0.8);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.profiled_lines',
    -         check_this_in   => l_recTEST.profiled_lines,
    -         against_this_in => 20);
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.executed_lines',
    -         check_this_in   => l_recTEST.executed_lines,
    -         against_this_in => 8);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.ignored_lines',
    -         check_this_in   => l_recTEST.ignored_lines,
    -         against_this_in => 6);
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.excluded_lines',
    -         check_this_in   => l_recTEST.excluded_lines,
    -         against_this_in => 4);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.notexec_lines',
    -         check_this_in   => l_recTEST.notexec_lines,
    -         against_this_in => 2);
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.unknown_lines',
    -         check_this_in   => l_recTEST.unknown_lines,
    -         against_this_in => 0);
    -      wt_assert.eq (
    -         msg_in          => 'l_recTEST.avg_executed_usecs',
    -         check_this_in   => l_recTEST.avg_executed_usecs,
    -         against_this_in => 200);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.raises (
    -         msg_in         => 'Delete WT_TESTCASE_STATS Record',
    -         check_call_in  => 'delete from WT_TESTCASE_STATS where test_run_id = ' ||
    -                                                              l_test_run_id,
    -         against_exc_in => '');
    -      commit;
    -      wt_assert.eqqueryvalue (
    -         msg_in           => 'There should be no WT_TESTCASE_STATS records',
    -         check_query_in   => 'select count(*) from WT_TESTCASE_STATS' ||
    -                             ' where test_run_id = ' || l_test_run_id,
    -         against_value_in => 0);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.raises (
    -         msg_in         => 'Delete WT_TEST_RUN_STATS Record',
    -         check_call_in  => 'delete from WT_TEST_RUN_STATS where test_run_id = ' ||
    -                                                              l_test_run_id,
    -         against_exc_in => '');
    -      commit;
    -      wt_assert.eqqueryvalue (
    -         msg_in           => 'There should be no WT_TEST_RUN_STATS records',
    -         check_query_in   => 'select count(*) from WT_TEST_RUN_STATS' ||
    -                             ' where test_run_id = ' || l_test_run_id,
    -         against_value_in => 0);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase  := 'FINALIZE Sad Path 1';
    -      l_tc_aaTEST.delete;
    -      l_recTEST := l_recNULL;
    -      l_recTEST.asserts := 2;
    -      run_finalize('Run Finalize for Sad Path 1');  -- AUTONOMOUS COMMIT
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.test_run_id',
    -         check_this_in   => l_recTEST.test_run_id);
    -      wt_assert.isnull (
    -         msg_in          => 'l_recTEST.asserts',
    -         check_this_in   => l_recTEST.asserts);
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'FINALIZE Happy Path Teardown';
    -      wt_assert.raises (
    -         msg_in         => 'Delete WT_TEST_RUNS Record',
    -         check_call_in  => 'delete from WT_TEST_RUNS where id = ' ||
    -                                                l_test_run_id,
    -         against_exc_in => '');
    -      commit;
    -   end t_finalize;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -
    -------------------------------------------------------------
    -procedure delete_records
    -      (in_test_run_id  in number)
    -is
    -begin
    -   delete from wt_testcase_stats
    -    where test_run_id = in_test_run_id;
    -   delete from wt_test_run_stats
    -    where test_run_id = in_test_run_id;
    -end delete_records;
    -
    -$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -$THEN
    -   procedure t_delete_records
    -   is
    -      l_test_run_id  number := -100;
    -      l_sql_txt      varchar2(4000);
    -   begin
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Delete Records Happy Path Setup';
    -      l_sql_txt := 'insert into WT_TEST_RUNS' ||
    -                   ' (id, start_dtm, runner_owner, runner_name)' ||
    -         ' values (' || l_test_run_id || ', sysdate, USER, ''TESTRUNNER2'')';
    -      wt_assert.raises (
    -         msg_in         => 'Insert WT_TEST_RUNS Record',
    -         check_call_in  => l_sql_txt,
    -         against_exc_in => '');
    -      --------------------------------------  WTPLSQL Testing --
    -      l_sql_txt := 'insert into WT_TEST_RUN_STATS (test_run_id) values (' ||
    -                                                 l_test_run_id || ')';
    -      wt_assert.raises (
    -         msg_in         => 'Insert WT_TEST_RUN_STATS Record',
    -         check_call_in  => l_sql_txt,
    -         against_exc_in => '');
    -      l_sql_txt := 'insert into WT_TESTCASE_STATS (test_run_id, testcase)' ||
    -                   ' values (' || l_test_run_id || ', ''TESTCASE2'')';
    -      wt_assert.raises (
    -         msg_in         => 'Insert WT_TESTCASE_STATS Record',
    -         check_call_in  => l_sql_txt,
    -         against_exc_in => '');
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Delete Records Happy Path and Teardown';
    -      wt_assert.raises (
    -         msg_in         => 'Delete Records with NULL ID',
    -         check_call_in  => 'begin wt_test_run_stat.delete_records(' ||
    -                                       l_test_run_id || '); end;',
    -         against_exc_in => '');
    -      wt_assert.raises (
    -         msg_in         => 'Delete WT_TEST_RUNS Record',
    -         check_call_in  => 'delete from WT_TEST_RUNS where id = ' || l_test_run_id,
    -         against_exc_in => '');
    -      --------------------------------------  WTPLSQL Testing --
    -      wt_assert.g_testcase := 'Delete Records Test Sad Paths';
    -      wt_assert.raises (
    -         msg_in         => 'Delete Records with NULL ID',
    -         check_call_in  => 'begin wt_test_run_stat.delete_records(null); end;',
    -         against_exc_in => '');
    -      wt_assert.raises (
    -         msg_in         => 'Delete Records with Invalid ID',
    -         check_call_in  => 'begin wt_test_run_stat.delete_records(-0.01); end;',
    -         against_exc_in => '');
    -   end t_delete_records;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    -
    -
    ---==============================================================--
    -$IF $$WTPLSQL_SELFTEST  ------%WTPLSQL_begin_ignore_lines%------
    -$THEN
    -   procedure WTPLSQL_RUN  --% WTPLSQL SET DBOUT "WT_TEST_RUN_STAT:PACKAGE BODY" %--
    -   is
    -   begin
    -      t_initialize;
    -      t_add_result;
    -      t_add_profile;
    -      t_finalize;
    -      t_delete_records;
    -   end WTPLSQL_RUN;
    -$END  ----------------%WTPLSQL_end_ignore_lines%----------------
    ---==============================================================--
    -
    -
    -end wt_test_run_stat;
    -
    -
    -
    - - diff --git a/docs/core/DBDocs/package body/WT_TEXT_REPORT.html b/docs/core/DBDocs/package body/WT_TEXT_REPORT.html index 820be42..353a8d5 100644 --- a/docs/core/DBDocs/package body/WT_TEXT_REPORT.html +++ b/docs/core/DBDocs/package body/WT_TEXT_REPORT.html @@ -46,7 +46,7 @@
    -


    +

    --------------------


    @@ -69,7 +69,7 @@ OBJECT_ID -41934 +42814 DATA_OBJECT_ID @@ -81,15 +81,15 @@ CREATED -29-JUN-2018 15:09:17 +25-NOV-2018 19:55:41 LAST_DDL_TIME -29-JUN-2018 15:21:18 +25-NOV-2018 19:55:41 TIMESTAMP -2018-06-29:15:21:18 +2018-11-25:19:55:41 STATUS @@ -172,14 +172,12 @@ package body wt_text_report as - g_test_runs_rec wt_test_runs%ROWTYPE; - g_test_run_stats_rec wt_test_run_stats%ROWTYPE; - ---------------------- -- Private Procedures ---------------------- + ------------------------------------------------------------ procedure p (in_text in varchar2) @@ -191,333 +189,190 @@ ------------------------------------------------------------ procedure result_summary is + asrt_cnt number; + run_sec number; + tc_cnt number; + tc_fail number; + min_msec number; + max_msec number; + tot_msec number; + avg_msec number; + l_yield_txt varchar2(50); begin - p(' Total Test Cases: ' || to_char(nvl(g_test_run_stats_rec.testcases ,0),'9999999') || - ' Total Assertions: ' || to_char(nvl(g_test_run_stats_rec.asserts ,0),'9999999') ); - p(' Minimum Interval msec: ' || to_char(nvl(g_test_run_stats_rec.min_interval_msecs,0),'9999999') || - ' Failed Assertions: ' || to_char(nvl(g_test_run_stats_rec.failures ,0),'9999999') ); - p(' Average Interval msec: ' || to_char(nvl(g_test_run_stats_rec.avg_interval_msecs,0),'9999999') || - ' Error Assertions: ' || to_char(nvl(g_test_run_stats_rec.errors ,0),'9999999') ); - p(' Maximum Interval msec: ' || to_char(nvl(g_test_run_stats_rec.max_interval_msecs,0),'9999999') || - ' Test Yield: ' || to_char( g_test_run_stats_rec.test_yield * 100 ,'9990.99') || - '%' ); - p(' Total Run Time (sec): ' || to_char(extract(day from (g_test_runs_rec.end_dtm - - g_test_runs_rec.start_dtm)*86400*100)/100 ,'99990.9') ); + asrt_cnt := core_data.g_run_rec.asrt_cnt; + run_sec := core_data.g_run_rec.runner_sec; + tc_cnt := core_data.g_run_rec.tc_cnt; + tc_fail := core_data.g_run_rec.tc_fail; + min_msec := core_data.g_run_rec.asrt_min_msec; + max_msec := core_data.g_run_rec.asrt_max_msec; + tot_msec := core_data.g_run_rec.asrt_tot_msec; + case nvl(asrt_cnt,0) + when 0 then avg_msec := 0; + else avg_msec := tot_msec/asrt_cnt; + end case; + case nvl(tc_cnt,0) + when 0 then l_yield_txt := '(Divide by Zero)'; + else l_yield_txt := to_char(100 * ( 1 - (tc_fail/tc_cnt) ) + ,'9999999') || '%'; + end case; + p(' Minimum Elapsed msec: ' || to_char(min_msec ,'9999999') || + ' Total Assertions: ' || to_char(asrt_cnt ,'9999999') ); + p(' Average Elapsed msec: ' || to_char(avg_msec ,'9999999') || + ' Total Testcases: ' || to_char(tc_cnt ,'9999999') ); + p(' Maximum Elapsed msec: ' || to_char(max_msec ,'9999999') || + ' Failed Testcases: ' || to_char(tc_fail ,'9999999') ); + p(' Total Run Time (sec): ' || to_char(run_sec ,'99990.9') || + ' Testcase Yield: ' || l_yield_txt ); end result_summary; ------------------------------------------------------------- -procedure profile_summary -is -begin - p(' Ignored Lines: ' || to_char(nvl(g_test_run_stats_rec.ignored_lines ,0),'9999999') || - ' Total Profiled Lines: ' || to_char(nvl(g_test_run_stats_rec.profiled_lines ,0),'9999999') ); - p(' Excluded Lines: ' || to_char(nvl(g_test_run_stats_rec.excluded_lines ,0),'9999999') || - ' Total Executed Lines: ' || to_char(nvl(g_test_run_stats_rec.executed_lines ,0),'9999999') ); - p(' Minimum LineExec usec: ' || to_char(nvl(g_test_run_stats_rec.min_executed_usecs,0),'9999999') || - ' Not Executed Lines: ' || to_char(nvl(g_test_run_stats_rec.notexec_lines ,0),'9999999') ); - p(' Average LineExec usec: ' || to_char(nvl(g_test_run_stats_rec.avg_executed_usecs,0),'9999999') || - ' Unknown Lines: ' || to_char(nvl(g_test_run_stats_rec.unknown_lines ,0),'9999999') ); - p(' Maximum LineExec usec: ' || to_char(nvl(g_test_run_stats_rec.max_executed_usecs,0),'9999999') || - ' Code Coverage: ' || to_char( g_test_run_stats_rec.code_coverage * 100 ,'9990.99') || - '%' ); - p(' Trigger Source Offset: ' || to_char( g_test_runs_rec.trigger_offset ,'9999999') ); -end profile_summary; - ------------------------------------------------------------ procedure summary_out is begin p(''); - p(' wtPLSQL ' || wtplsql.show_version || - ' - Run ID ' || g_test_runs_rec.id || - ': ' || to_char(g_test_runs_rec.start_dtm, g_date_format) || - CHR(10) ); - p(' Test Results for ' || g_test_runs_rec.runner_owner || - '.' || g_test_runs_rec.runner_name ); - result_summary; - if g_test_runs_rec.dbout_name is not null - AND g_test_runs_rec.profiler_runid is null + p(' wtPLSQL ' || wtplsql.show_version || ' - Start Date/Time: ' || + to_char(core_data.g_run_rec.start_dtm, g_date_format) || + CHR(10)); + p('Test Results for ' || core_data.g_run_rec.runner_owner || + '.' || core_data.g_run_rec.runner_name ); + ---------------------------------------- + if core_data.g_run_rec.dbout_name is not null then - p(''); - p(' Note: ' || g_test_runs_rec.dbout_type || ' ' || - g_test_runs_rec.dbout_owner || '.' || - g_test_runs_rec.dbout_name || ' was not profiled.'); + p('Database Object Under Test is ' || core_data.g_run_rec.dbout_type || + ' ' || core_data.g_run_rec.dbout_owner || + '.' || core_data.g_run_rec.dbout_name ); end if; - if g_test_runs_rec.error_message is not null + p('----------------------------------------'); + result_summary; + if core_data.g_run_rec.error_message is not null then p(''); p(' *** Test Runner Error ***'); - p(g_test_runs_rec.error_message); + p(core_data.g_run_rec.error_message); end if; - ---------------------------------------- - if g_test_runs_rec.profiler_runid is null - then - return; - end if; - p(''); - p(' Code Coverage for ' || g_test_runs_rec.dbout_type || - ' ' || g_test_runs_rec.dbout_owner || - '.' || g_test_runs_rec.dbout_name ); - profile_summary; end summary_out; ------------------------------------------------------------ procedure results_out (in_show_pass in boolean) is - l_last_testcase wt_results.testcase%TYPE; - l_show_pass_txt varchar2(1); - header_shown boolean; - procedure l_show_header is begin - p(''); - p(' - ' || g_test_runs_rec.runner_owner || - '.' || g_test_runs_rec.runner_name || - ' Test Result Details (Test Run ID ' || - g_test_runs_rec.id || - ')' ); - p('-----------------------------------------------------------'); - end l_show_header; + l_rec core_data.results_rec_type; + l_last_testcase core_data.long_name; begin - if in_show_pass - then - l_show_pass_txt := 'Y'; - else - l_show_pass_txt := 'N'; - end if; - header_shown := FALSE; - for buff in ( - select status - ,interval_msecs - ,testcase - ,assertion - ,details - ,message - from wt_results - where test_run_id = g_test_runs_rec.id - and ( l_show_pass_txt = 'Y' - or status != 'PASS') - order by result_seq ) + show_result_header; + for i in 1 .. core_data.g_results_nt.COUNT loop - if not header_shown + if in_show_pass + OR NOT core_data.g_results_nt(i).pass then - l_show_header; - header_shown := TRUE; - end if; - if buff.testcase = l_last_testcase - OR ( buff.testcase is null - AND l_last_testcase is null ) - then - p(format_test_result - (in_assertion => buff.assertion - ,in_status => buff.status - ,in_details => buff.details - ,in_testcase => NULL - ,in_message => buff.message - ,in_interval_msecs => buff.interval_msecs) ); - else - p(format_test_result - (in_assertion => buff.assertion - ,in_status => buff.status - ,in_details => buff.details - ,in_testcase => buff.testcase - ,in_message => buff.message - ,in_interval_msecs => buff.interval_msecs) ); - l_last_testcase := buff.testcase; + if core_data.g_results_nt(i).testcase = l_last_testcase + then + l_rec := core_data.g_results_nt(i); + l_rec.testcase := ''; + p(format_test_result(l_rec)); + else + p(format_test_result(core_data.g_results_nt(i))); + l_last_testcase := core_data.g_results_nt(i).testcase; + end if; end if; end loop; end results_out; + +--------------------- +-- Public Procedures +--------------------- + + ------------------------------------------------------------ -procedure profile_out - (in_show_aux in boolean) +procedure dbms_out + (in_detail_level in number default 0 + ,in_summary_last in boolean default FALSE) is - l_header_txt CONSTANT varchar2(2000) := - 'Source TotTime MinTime MaxTime ' || chr(10) || - ' Line Stat Occurs (usec) (usec) (usec) Text' || chr(10) || - '------ ---- ------ --------- ------- --------- ------------'; - l_show_aux_txt varchar2(1); - header_shown boolean; - procedure l_show_header is begin - p(''); - p(' - ' || g_test_runs_rec.dbout_owner || - '.' || g_test_runs_rec.dbout_name || - ' ' || g_test_runs_rec.dbout_type || - ' Code Coverage Details (Test Run ID ' || - g_test_runs_rec.id || - ')' ); - end l_show_header; begin - if g_test_runs_rec.profiler_runid is null - then - return; - end if; - if in_show_aux + -- Setup Display Order + if in_summary_last then - l_show_aux_txt := 'Y'; - else - l_show_aux_txt := 'N'; - end if; - header_shown := FALSE; - for buff in ( - select line - ,status - ,total_occur - ,total_usecs - ,min_usecs - ,max_usecs - ,text - ,rownum - from wt_dbout_profiles - where test_run_id = g_test_runs_rec.id - and ( l_show_aux_txt = 'Y' - or status not in ('EXEC','IGNR','UNKN','EXCL')) - order by line ) - loop - if not header_shown + if in_detail_level >= 10 then - l_show_header; - p(l_header_txt); - header_shown := TRUE; + results_out(in_detail_level >= 20); end if; - if mod(buff.rownum,25) = 0 + summary_out; + else + summary_out; + if in_detail_level >= 10 then - p(l_header_txt); + results_out(in_detail_level >= 20); end if; - p(to_char(buff.line,'99999') || - case buff.status when 'NOTX' then '#NOTX#' - else ' ' || rpad(buff.status,4) || ' ' - end || - to_char(buff.total_occur,'99999') || ' ' || - to_char(buff.total_usecs,'99999999') || ' ' || - to_char(buff.min_usecs,'999999') || ' ' || - to_char(buff.max_usecs,'99999999') || ' ' || - replace(buff.text,CHR(10),'') ); - end loop; -end profile_out; + end if; + p(''); +end dbms_out; ---------------------- --- Public Procedures ---------------------- +------------------------------------------------------------ +procedure ad_hoc_result +is +begin + p(wt_assert.g_rec.last_msg || CHR(10) || + ' Assertion ' || wt_assert.g_rec.last_assert || + case wt_assert.last_pass + when TRUE then ' PASSED.' + else ' FAILED.' + end || CHR(10) || + ' Testcase: ' || wt_assert.g_testcase || CHR(10) || + ' ' || wt_assert.g_rec.last_details ); +end ad_hoc_result; + + +------------------------------------------------------------ +procedure show_result_header is begin + p(''); + p( core_data.g_run_rec.runner_owner || + '.' || core_data.g_run_rec.runner_name || + ' Test Runner Details:' ); + p('----------------------------------------'); +end show_result_header; + ------------------------------------------------------------ function format_test_result - (in_assertion in wt_results.assertion%TYPE - ,in_status in wt_results.status%TYPE - ,in_details in wt_results.details%TYPE - ,in_testcase in wt_results.testcase%TYPE - ,in_message in wt_results.message%TYPE - ,in_interval_msecs in wt_results.interval_msecs%TYPE DEFAULT NULL) + (in_rec in core_data.results_rec_type) return varchar2 is l_out_str varchar2(32000) := ''; begin - if in_testcase is not null + if in_rec.testcase is not null then - l_out_str := ' ---- Test Case: ' || in_testcase || CHR(10); + l_out_str := rpad('---*** ' || in_rec.testcase || + ' ***---' + ,80,'-') || CHR(10); end if; - if in_status = wt_assert.C_PASS + if in_rec.pass then - l_out_str := l_out_str || ' ' || rpad(in_status,4) || ' '; + l_out_str := l_out_str || ' PASS '; else - l_out_str := l_out_str || '#' || rpad(in_status,4) || '#'; + l_out_str := l_out_str || '#FAIL#'; end if; - if in_interval_msecs is not null + if in_rec.interval_msecs is not null then - l_out_str := l_out_str || lpad(in_interval_msecs,4) || 'ms '; + l_out_str := l_out_str || lpad(in_rec.interval_msecs,4) || 'ms '; end if; - if in_message is not null + if in_rec.message is not null then - l_out_str := l_out_str || in_message || '. '; + l_out_str := l_out_str || in_rec.message || '. '; end if; - l_out_str := l_out_str || in_assertion || ' - '; + l_out_str := l_out_str || in_rec.assertion || ' - '; if g_single_line_output then - l_out_str := l_out_str || replace(replace(in_details,CHR(13),'\r'),CHR(10),'\n'); + l_out_str := l_out_str || replace(replace(in_rec.details + ,CHR(13),'\r') + ,CHR(10),'\n'); else - l_out_str := l_out_str || in_details; + l_out_str := l_out_str || in_rec.details; end if; return l_out_str; end format_test_result; ------------------------------------------------------------- -procedure ad_hoc_result - (in_assertion in wt_results.assertion%TYPE - ,in_status in wt_results.status%TYPE - ,in_details in wt_results.details%TYPE - ,in_testcase in wt_results.testcase%TYPE - ,in_message in wt_results.message%TYPE) -is -begin - p(format_test_result - (in_assertion => in_assertion - ,in_status => in_status - ,in_details => in_details - ,in_testcase => in_testcase - ,in_message => in_message)); -end ad_hoc_result; - ------------------------------------------------------------- -procedure dbms_out - (in_runner_owner in wt_test_runs.runner_owner%TYPE default USER - ,in_runner_name in wt_test_runs.runner_name%TYPE default null - ,in_detail_level in number default 0 - ,in_summary_last in boolean default FALSE) -is - - cursor c_main(in_test_run_id in number) is - select * from wt_test_run_stats - where test_run_id = in_test_run_id; - g_test_run_statsNULL wt_test_run_stats%ROWTYPE; - -begin - - for buff in ( - select * from wt_test_runs - where ( runner_name, start_dtm) in - (select t2.runner_name, max(t2.start_dtm) - from wt_test_runs t2 - where ( ( in_runner_name is not null - and in_runner_name = t2.runner_name) - OR in_runner_name is null ) - and t2.runner_owner = in_runner_owner - group by t2.runner_name ) - order by start_dtm, runner_name ) - loop - - -- Load Test Run Record - g_test_runs_rec := buff; - - -- Load the Stats Record - g_test_run_stats_rec := g_test_run_statsNULL; - open c_main(buff.id); - fetch c_main into g_test_run_stats_rec; - close c_main; - - -- Setup Display Order - if in_summary_last - then - if in_detail_level >= 10 - then - profile_out(in_detail_level >= 30); - results_out(in_detail_level >= 20); - end if; - summary_out; - else - summary_out; - if in_detail_level >= 10 - then - results_out(in_detail_level >= 20); - profile_out(in_detail_level >= 30); - end if; - end if; - - p(''); - - end loop; - -end dbms_out; - end wt_text_report;
    diff --git a/docs/core/DBDocs/package body/index.html b/docs/core/DBDocs/package body/index.html index d7cc1f3..c4c5239 100644 --- a/docs/core/DBDocs/package body/index.html +++ b/docs/core/DBDocs/package body/index.html @@ -6,11 +6,10 @@

    Package Bodies -

    WTPLSQL + \ No newline at end of file diff --git a/docs/core/DBDocs/package/CORE_DATA.html b/docs/core/DBDocs/package/CORE_DATA.html new file mode 100644 index 0000000..e3c6b83 --- /dev/null +++ b/docs/core/DBDocs/package/CORE_DATA.html @@ -0,0 +1,268 @@ + + + + + + + + +
    +
    +
    +

    Doc

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Code

    +
    +
    +
    +
    +
    +
    +
    + +


    + + +
    Type Summary
     long_name( 128 ) ;
              
     run_rec_type( runner_owner long_name , runner_name long_name , dbout_owner long_name , dbout_name long_name , dbout_type varchar2 ( 20 ) , start_dtm timestamp ( 3 ) with time zone , end_dtm timestamp ( 3 ) with time zone , error_message varchar2 ( 4000 ) , runner_sec number ( 6 , 1 ) default 0 , tc_cnt number ( 7 ) default 0 , tc_fail number ( 7 ) default 0 , asrt_cnt number ( 7 ) default 0 , asrt_fail number ( 7 ) default 0 , asrt_min_msec number ( 10 ) , asrt_max_msec number ( 10 ) , asrt_tot_msec number ( 10 ) default 0 , asrt_sos_msec number ( 20 ) default 0 ) ;
              
     tcases_rec_type( asrt_cnt number ( 7 ) default 0 , asrt_fail number ( 7 ) default 0 , asrt_min_msec number ( 10 ) , asrt_max_msec number ( 10 ) , asrt_tot_msec number ( 10 ) default 0 , asrt_sos_msec number ( 20 ) default 0 ) ;
              

    + + + + + +
    Method Summary
     add( in_testcase in varchar2 , in_assertion in varchar2 , in_pass in boolean , in_details in varchar2 , in_message in varchar2 )
              
     finalize
              
     init1( in_package_name in varchar2 )
               Identifcation Message of the Assertion
     init2
              
     run_error( in_error_message in varchar2 )
              
     WTPLSQL_RUN
              
    +

    Type Detail
    +

    long_name

              long_name( 128 ) ; 
              

    +

    run_rec_type

              run_rec_type( runner_owner long_name , runner_name long_name , dbout_owner long_name , dbout_name long_name , dbout_type varchar2 ( 20 ) , start_dtm timestamp ( 3 ) with time zone , end_dtm timestamp ( 3 ) with time zone , error_message varchar2 ( 4000 ) , runner_sec number ( 6 , 1 ) default 0 , tc_cnt number ( 7 ) default 0 , tc_fail number ( 7 ) default 0 , asrt_cnt number ( 7 ) default 0 , asrt_fail number ( 7 ) default 0 , asrt_min_msec number ( 10 ) , asrt_max_msec number ( 10 ) , asrt_tot_msec number ( 10 ) default 0 , asrt_sos_msec number ( 20 ) default 0 ) ; 
              

    +

    tcases_rec_type

              tcases_rec_type( asrt_cnt number ( 7 ) default 0 , asrt_fail number ( 7 ) default 0 , asrt_min_msec number ( 10 ) , asrt_max_msec number ( 10 ) , asrt_tot_msec number ( 10 ) default 0 , asrt_sos_msec number ( 20 ) default 0 ) ; 
              

    Method Detail
    +

    add

              add( in_testcase in varchar2 , in_assertion in varchar2 , in_pass in boolean , in_details in varchar2 , in_message in varchar2 ) 
              

    +

    finalize

              finalize
              

    +

    init1

              init1( in_package_name in varchar2 ) 
               Identifcation Message of the Assertion

    +

    init2

              init2
              

    +

    run_error

              run_error( in_error_message in varchar2 ) 
              

    +

    WTPLSQL_RUN

              WTPLSQL_RUN
              

    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMECORE_DATA
    SUBOBJECT_NAMEnull
    OBJECT_ID42804
    DATA_OBJECT_IDnull
    OBJECT_TYPEPACKAGE
    CREATED25-NOV-2018 19:55:40
    LAST_DDL_TIME25-NOV-2018 19:55:40
    TIMESTAMP2018-11-25:19:55:40
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE1
    EDITION_NAMEnull
    +
    +
    +
    +
    + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    +
    +package core_data
    +   authid definer
    +is
    +
    +   SUBTYPE long_name is varchar2(128);
    +
    +   TYPE run_rec_type is record
    +      (runner_owner   long_name                   -- Owner of the Test Runner
    +      ,runner_name    long_name                   -- Name of the Test Runner
    +      ,dbout_owner    long_name                   -- Owner of the Database Object Under Test
    +      ,dbout_name     long_name                   -- Name of the Database Object Under Test
    +      ,dbout_type     varchar2(20)                -- Type of the Database Object Under Test
    +      ,start_dtm      timestamp(3) with time zone -- Test Runner Start Date/Time
    +      ,end_dtm        timestamp(3) with time zone -- Test Runner End Date/Time
    +      ,error_message  varchar2(4000)              -- Error Message
    +      ,runner_sec     number(6,1)    default 0    -- Total Runtime for Test Runner in Seconds
    +      ,tc_cnt         number(7)      default 0    -- Number of Test Cases
    +      ,tc_fail        number(7)      default 0    -- Number of Failed Test Cases
    +      ,asrt_cnt       number(7)      default 0    -- Number of Assertions across all Test Cases
    +      ,asrt_fail      number(7)      default 0    -- Number of Assertion Failures across all Test Cases
    +      ,asrt_min_msec  number(10)                  -- Minumum Assertion Interval in Milliseconds across all Test Cases
    +      ,asrt_max_msec  number(10)                  -- Maximum Assertion Interval in Milliseconds across all Test Cases
    +      ,asrt_tot_msec  number(10)     default 0    -- Total Assertion Intervals in Milliseconds across all Test Cases
    +      ,asrt_sos_msec  number(20)     default 0    -- Sum of Squares of Assertion Interval in Milliseconds across all Test Cases
    +      );
    +   g_run_rec  run_rec_type;
    +
    +   TYPE tcases_rec_type is record
    +      (asrt_cnt       number(7)      default 0    -- Number of Assertions in this Test Case
    +      ,asrt_fail      number(7)      default 0    -- Number of Failed Assertsion in this Test Case
    +      ,asrt_min_msec  number(10)                  -- Minumum Assertion Interval in Milliseconds in this Test Cases
    +      ,asrt_max_msec  number(10)                  -- Maximum Assertion Interval in Milliseconds in this Test Cases
    +      ,asrt_tot_msec  number(10)     default 0    -- Total Assertion Interval in Milliseconds in this Test Cases
    +      ,asrt_sos_msec  number(20)     default 0    -- Sum of Squares Assertion Interval in Milliseconds in this Test Cases
    +      );
    +   TYPE tcases_aa_type is table of tcases_rec_type index by long_name;
    +   g_tcases_aa   tcases_aa_type;
    +
    +   TYPE results_rec_type is record
    +      (result_seq     number(8)      default 0    -- Sequence Number of the Assertion
    +      ,executed_dtm   timestamp(6) with time zone -- Execution Date/Time of the Assertion
    +      ,interval_msecs number(10,3)                -- Interval from Previous Assertion in Milliseconds
    +      ,testcase       long_name                   -- Test Case Name of the Assertion
    +      ,assertion      varchar2(15)                -- Name of the Assertion
    +      ,pass           boolean                     -- Did the Assertion Pass? (TRUE/FALSE)
    +      ,details        varchar2(4000)              -- Test Details of the Assertion
    +      ,message        varchar2(200)               -- Identifcation Message of the Assertion
    +      );
    +   TYPE results_nt_type is table of results_rec_type;
    +   g_results_nt    results_nt_type;
    +
    +   procedure init1
    +      (in_package_name  in  varchar2);
    +
    +   procedure init2;
    +
    +   procedure add
    +      (in_testcase   in varchar2
    +      ,in_assertion  in varchar2
    +      ,in_pass       in boolean
    +      ,in_details    in varchar2
    +      ,in_message    in varchar2);
    +
    +   procedure finalize;
    +
    +   procedure run_error
    +      (in_error_message  in  varchar2);
    +
    +   --   WtPLSQL Self Test Procedures
    +   --
    +   -- alter system set PLSQL_CCFLAGS =
    +   --    'WTPLSQL_SELFTEST:TRUE'
    +   --    scope=BOTH;
    +   --
    +   $IF $$WTPLSQL_SELFTEST
    +   $THEN
    +      procedure WTPLSQL_RUN;
    +   $END
    +
    +end core_data;
    +
    +
    +
    + + diff --git a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/headerBg.jpg b/docs/core/DBDocs/package/CORE_DATA/headerBg.jpg similarity index 100% rename from docs/core/DBDocs/package/WT_TEST_RUN_STAT/headerBg.jpg rename to docs/core/DBDocs/package/CORE_DATA/headerBg.jpg diff --git a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/report.css b/docs/core/DBDocs/package/CORE_DATA/report.css similarity index 100% rename from docs/core/DBDocs/package/WT_TEST_RUN_STAT/report.css rename to docs/core/DBDocs/package/CORE_DATA/report.css diff --git a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/report.js b/docs/core/DBDocs/package/CORE_DATA/report.js similarity index 100% rename from docs/core/DBDocs/package/WT_TEST_RUN_STAT/report.js rename to docs/core/DBDocs/package/CORE_DATA/report.js diff --git a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topDimTabBg.gif b/docs/core/DBDocs/package/CORE_DATA/topDimTabBg.gif similarity index 100% rename from docs/core/DBDocs/package/WT_TEST_RUN_STAT/topDimTabBg.gif rename to docs/core/DBDocs/package/CORE_DATA/topDimTabBg.gif diff --git a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topDimTabL.gif b/docs/core/DBDocs/package/CORE_DATA/topDimTabL.gif similarity index 100% rename from docs/core/DBDocs/package/WT_TEST_RUN_STAT/topDimTabL.gif rename to docs/core/DBDocs/package/CORE_DATA/topDimTabL.gif diff --git a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topDimTabR.gif b/docs/core/DBDocs/package/CORE_DATA/topDimTabR.gif similarity index 100% rename from docs/core/DBDocs/package/WT_TEST_RUN_STAT/topDimTabR.gif rename to docs/core/DBDocs/package/CORE_DATA/topDimTabR.gif diff --git a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topTabBg.gif b/docs/core/DBDocs/package/CORE_DATA/topTabBg.gif similarity index 100% rename from docs/core/DBDocs/package/WT_TEST_RUN_STAT/topTabBg.gif rename to docs/core/DBDocs/package/CORE_DATA/topTabBg.gif diff --git a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topTabL.gif b/docs/core/DBDocs/package/CORE_DATA/topTabL.gif similarity index 100% rename from docs/core/DBDocs/package/WT_TEST_RUN_STAT/topTabL.gif rename to docs/core/DBDocs/package/CORE_DATA/topTabL.gif diff --git a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topTabR.gif b/docs/core/DBDocs/package/CORE_DATA/topTabR.gif similarity index 100% rename from docs/core/DBDocs/package/WT_TEST_RUN_STAT/topTabR.gif rename to docs/core/DBDocs/package/CORE_DATA/topTabR.gif diff --git a/docs/core/DBDocs/package/HOOK.html b/docs/core/DBDocs/package/HOOK.html new file mode 100644 index 0000000..d03edef --- /dev/null +++ b/docs/core/DBDocs/package/HOOK.html @@ -0,0 +1,237 @@ + + + + + + + + +
    +
    +
    +

    Doc

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Code

    +
    +
    +
    +
    +
    +
    +
    + +


    +
    Type Summary
     run_nt_type( 4000 ) ;
              

    + + + + + + + + + +
    Method Summary
     ad_hoc_report
              
     after_assertion
              
     after_test_all
              
     after_test_run
              
     before_test_all
              
     before_test_run
              
     execute_test_runner
              
     init
              
     test_hook( in_msg in varchar2 )
              
     WTPLSQL_RUN
              
    +

    Type Detail
    +

    run_nt_type

              run_nt_type( 4000 ) ; 
              

    Method Detail
    +

    ad_hoc_report

              ad_hoc_report
              

    +

    after_assertion

              after_assertion
              

    +

    after_test_all

              after_test_all
              

    +

    after_test_run

              after_test_run
              

    +

    before_test_all

              before_test_all
              

    +

    before_test_run

              before_test_run
              

    +

    execute_test_runner

              execute_test_runner
              

    +

    init

              init
              

    +

    test_hook

              test_hook( in_msg in varchar2 ) 
              

    +

    WTPLSQL_RUN

              WTPLSQL_RUN
              

    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMEHOOK
    SUBOBJECT_NAMEnull
    OBJECT_ID42805
    DATA_OBJECT_IDnull
    OBJECT_TYPEPACKAGE
    CREATED25-NOV-2018 19:55:40
    LAST_DDL_TIME25-NOV-2018 19:55:40
    TIMESTAMP2018-11-25:19:55:40
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE1
    EDITION_NAMEnull
    +
    +
    +
    +
    + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    +
    +package hook
    +   authid definer
    +as
    +
    +   TYPE run_nt_type is table
    +      of varchar2(4000);
    +   TYPE run_aa_type is table
    +      of run_nt_type
    +      index by varchar2(20);
    +   g_run_aa  run_aa_type;
    +
    +   before_test_all_active      boolean := FALSE;
    +   before_test_run_active      boolean := FALSE;
    +   execute_test_runner_active  boolean := FALSE;
    +   after_assertion_active      boolean := FALSE;
    +   after_test_run_active       boolean := FALSE;
    +   after_test_all_active       boolean := FALSE;
    +   ad_hoc_report_active        boolean := FALSE;
    +
    +   procedure before_test_all;
    +   procedure before_test_run;
    +   procedure execute_test_runner;
    +   procedure after_assertion;
    +   procedure after_test_run;
    +   procedure after_test_all;
    +   procedure ad_hoc_report;
    +   procedure init;
    +
    +   --   WtPLSQL Self Test Procedures
    +   --
    +   -- alter system set PLSQL_CCFLAGS =
    +   --    'WTPLSQL_SELFTEST:TRUE'
    +   --    scope=BOTH;
    +   --
    +   $IF $$WTPLSQL_SELFTEST
    +   $THEN
    +      g_run_assert_hook  boolean := TRUE;
    +      g_test_hook_msg    varchar2(4000);
    +      --
    +      procedure test_hook
    +         (in_msg  in  varchar2);
    +      procedure WTPLSQL_RUN;
    +   $END
    +
    +end hook;
    +
    +
    +
    + + diff --git a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/headerBg.jpg b/docs/core/DBDocs/package/HOOK/headerBg.jpg similarity index 100% rename from docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/headerBg.jpg rename to docs/core/DBDocs/package/HOOK/headerBg.jpg diff --git a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/report.css b/docs/core/DBDocs/package/HOOK/report.css similarity index 100% rename from docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/report.css rename to docs/core/DBDocs/package/HOOK/report.css diff --git a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/report.js b/docs/core/DBDocs/package/HOOK/report.js similarity index 100% rename from docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/report.js rename to docs/core/DBDocs/package/HOOK/report.js diff --git a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topDimTabBg.gif b/docs/core/DBDocs/package/HOOK/topDimTabBg.gif similarity index 100% rename from docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topDimTabBg.gif rename to docs/core/DBDocs/package/HOOK/topDimTabBg.gif diff --git a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topDimTabL.gif b/docs/core/DBDocs/package/HOOK/topDimTabL.gif similarity index 100% rename from docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topDimTabL.gif rename to docs/core/DBDocs/package/HOOK/topDimTabL.gif diff --git a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topDimTabR.gif b/docs/core/DBDocs/package/HOOK/topDimTabR.gif similarity index 100% rename from docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topDimTabR.gif rename to docs/core/DBDocs/package/HOOK/topDimTabR.gif diff --git a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topTabBg.gif b/docs/core/DBDocs/package/HOOK/topTabBg.gif similarity index 100% rename from docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topTabBg.gif rename to docs/core/DBDocs/package/HOOK/topTabBg.gif diff --git a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topTabL.gif b/docs/core/DBDocs/package/HOOK/topTabL.gif similarity index 100% rename from docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topTabL.gif rename to docs/core/DBDocs/package/HOOK/topTabL.gif diff --git a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topTabR.gif b/docs/core/DBDocs/package/HOOK/topTabR.gif similarity index 100% rename from docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topTabR.gif rename to docs/core/DBDocs/package/HOOK/topTabR.gif diff --git a/docs/core/DBDocs/package/WTPLSQL.html b/docs/core/DBDocs/package/WTPLSQL.html index 96ff75c..bd56440 100644 --- a/docs/core/DBDocs/package/WTPLSQL.html +++ b/docs/core/DBDocs/package/WTPLSQL.html @@ -46,16 +46,14 @@
    -

    AUTHID CURRENT_USER is required for dynamic PL/SQL execution.


    - +
    Method Summary
     delete_runs( in_test_run_id in number )
              
     delete_runs( in_runner_owner in varchar2 , in_runner_name in varchar2 )
              


    Method Summary
     get_runner_entry_point
              
     show_version
              
     test_all
              
     test_run( in_package_name in varchar2 )
              
     WTPLSQL_RUN
              
    -

    Method Detail
    -

    delete_runs

              delete_runs( in_test_run_id in number ) 
              

    -

    delete_runs

              delete_runs( in_runner_owner in varchar2 , in_runner_name in varchar2 ) 
              

    +

    Method Detail
    +

    get_runner_entry_point

              get_runner_entry_point
              

    show_version

              show_version
              

    test_all

              test_all
              

    test_run

              test_run( in_package_name in varchar2 ) 
              

    @@ -82,7 +80,7 @@

    WTPLSQL_RUN

              WTPLSQL_RUN
        OBJECT_ID -41925 +42806 DATA_OBJECT_ID @@ -94,15 +92,15 @@

    WTPLSQL_RUN

              WTPLSQL_RUN
        CREATED -29-JUN-2018 15:09:14 +25-NOV-2018 19:55:40 LAST_DDL_TIME -29-JUN-2018 15:21:16 +25-NOV-2018 19:55:40 TIMESTAMP -2018-06-29:15:21:15 +2018-11-25:19:55:40 STATUS @@ -182,28 +180,32 @@

    WTPLSQL_RUN

              WTPLSQL_RUN
       
    -package wtplsql authid current_user
    +package wtplsql
    +   authid definer
     as
    -   -- AUTHID CURRENT_USER is required for dynamic PL/SQL execution.
    +
    +   C_RUNNER_ENTRY_POINT constant varchar2(30) := 'WTPLSQL_RUN';
    +
    +   function get_runner_entry_point
    +      return varchar2 deterministic;
     
        function show_version
           return varchar2;
     
    +   g_keep_num_recs  number := 10;
    +
    +   -- Database Object Under Test.
    +   --   Modify as required
    +   g_DBOUT    varchar2(128);
    +
        procedure test_run
           (in_package_name  in  varchar2);
     
        procedure test_all;
     
    -   procedure delete_runs
    -      (in_test_run_id  in number);
    -
    -   procedure delete_runs
    -      (in_runner_owner  in varchar2
    -      ,in_runner_name   in varchar2);
    -
        --   WtPLSQL Self Test Procedures
        --
    -   -- alter system set PLSQL_CCFLAGS = 
    +   -- alter system set PLSQL_CCFLAGS =
        --    'WTPLSQL_ENABLE:TRUE, WTPLSQL_SELFTEST:TRUE'
        --    scope=BOTH;
        --
    diff --git a/docs/core/DBDocs/package/WT_ASSERT.html b/docs/core/DBDocs/package/WT_ASSERT.html
    index 0761ed8..df58405 100644
    --- a/docs/core/DBDocs/package/WT_ASSERT.html
    +++ b/docs/core/DBDocs/package/WT_ASSERT.html
    @@ -72,7 +72,7 @@
      last_assert
                last_details
                last_msg
               - last_pass
               Modify as required + last_pass
               See RESET_GLOBALS procedure for default global values  objexists( msg_in in varchar2 , obj_owner_in in varchar2 , obj_name_in in varchar2 , obj_type_in in varchar2 default null , raise_exc_in in boolean : = false )
                objexists( msg_in in varchar2 , check_this_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
                objnotexists( msg_in in varchar2 , obj_owner_in in varchar2 , obj_name_in in varchar2 , obj_type_in in varchar2 default null , raise_exc_in in boolean : = false )
               @@ -115,7 +115,7 @@

    isnull

              isnull( msg_in in varchar2 , check_this_in
     

    last_assert

              last_assert
              

    last_details

              last_details
              

    last_msg

              last_msg
              

    -

    last_pass

              last_pass
               Modify as required

    +

    last_pass

              last_pass
               See RESET_GLOBALS procedure for default global values

    objexists

              objexists( msg_in in varchar2 , obj_owner_in in varchar2 , obj_name_in in varchar2 , obj_type_in in varchar2 default null , raise_exc_in in boolean : = false ) 
              

    objexists

              objexists( msg_in in varchar2 , check_this_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) 
              

    objnotexists

              objnotexists( msg_in in varchar2 , obj_owner_in in varchar2 , obj_name_in in varchar2 , obj_type_in in varchar2 default null , raise_exc_in in boolean : = false ) 
              

    @@ -152,7 +152,7 @@

    WTPLSQL_RUN

              WTPLSQL_RUN
        OBJECT_ID -41927 +42807 DATA_OBJECT_ID @@ -164,15 +164,15 @@

    WTPLSQL_RUN

              WTPLSQL_RUN
        CREATED -29-JUN-2018 15:09:15 +25-NOV-2018 19:55:40 LAST_DDL_TIME -29-JUN-2018 15:21:16 +25-NOV-2018 19:55:40 TIMESTAMP -2018-06-29:15:21:15 +2018-11-25:19:55:40 STATUS @@ -252,33 +252,40 @@

    WTPLSQL_RUN

              WTPLSQL_RUN
       
    -package wt_assert authid current_user
    +package wt_assert
    +   authid current_user
     is
        -- AUTHID CURRENT_USER is required for dynamic PL/SQL execution.
     
        ASSERT_FAILURE_EXCEPTION  exception;
        PRAGMA EXCEPTION_INIT(ASSERT_FAILURE_EXCEPTION, -20003);
     
    -   C_PASS  CONSTANT varchar2(10) := 'PASS';
    -   C_FAIL  CONSTANT varchar2(10) := 'FAIL';
    -
        -- See RESET_GLOBALS procedure for default global values
     
        -- Testcase name for a series of assertions.
        --   Modify as required
    -   g_testcase         wt_results.testcase%TYPE;
    +   g_testcase   core_data.long_name;
    +
    +   -- See RESET_GLOBALS procedure for default global values
    +   TYPE g_rec_type is record
    +      (last_pass        boolean
    +      ,raise_exception  boolean
    +      ,last_assert      varchar2(15)
    +      ,last_msg         varchar2(200)
    +      ,last_details     varchar2(4000));
    +   g_rec  g_rec_type;
     
        function last_pass
        return boolean;
     
        function last_assert
    -   return wt_results.assertion%TYPE;
    +   return varchar2;
     
        function last_msg
    -   return wt_results.message%TYPE;
    +   return varchar2;
     
        function last_details
    -   return wt_results.details%TYPE;
    +   return varchar2;
     
        procedure reset_globals;
     
    @@ -511,7 +518,7 @@ 

    WTPLSQL_RUN

              WTPLSQL_RUN
        -- WtPLSQL Self Test Procedures -- - -- alter system set PLSQL_CCFLAGS = + -- alter system set PLSQL_CCFLAGS = -- 'WTPLSQL_SELFTEST:TRUE' -- scope=BOTH; -- diff --git a/docs/core/DBDocs/package/WT_PROFILER.html b/docs/core/DBDocs/package/WT_PROFILER.html deleted file mode 100644 index f5214dc..0000000 --- a/docs/core/DBDocs/package/WT_PROFILER.html +++ /dev/null @@ -1,229 +0,0 @@ - - - - - - - - -
    -
    -
    -

    Doc

    -
    -
    -
    -
    -

    Details

    -
    -
    -
    -
    -

    Grants

    -
    -
    -
    -
    -

    References

    -
    -
    -
    -
    -

    Dependencies

    -
    -
    -
    -
    -

    Code

    -
    -
    -
    -
    -
    -
    -
    - -

    current_user


    - - - - - -
    Method Summary
     calc_pct_coverage( in_test_run_id in number ) return number ;
              
     delete_records( in_test_run_id in number )
              
     finalize
              
     initialize( in_test_run_id in number , in_runner_name in varchar2 , out_dbout_owner out varchar2 , out_dbout_name out varchar2 , out_dbout_type out varchar2 , out_trigger_offset out number , out_profiler_runid out number , out_error_message out varchar2 )
              
     trigger_offset( dbout_owner_in in varchar2 , dbout_name_in in varchar2 , dbout_type_in in varchar2 ) return number ;
              
     WTPLSQL_RUN
              
    -

    Method Detail
    -

    calc_pct_coverage

              calc_pct_coverage( in_test_run_id in number ) return number ; 
              

    -

    delete_records

              delete_records( in_test_run_id in number ) 
              

    -

    finalize

              finalize
              

    -

    initialize

              initialize( in_test_run_id in number , in_runner_name in varchar2 , out_dbout_owner out varchar2 , out_dbout_name out varchar2 , out_dbout_type out varchar2 , out_trigger_offset out number , out_profiler_runid out number , out_error_message out varchar2 ) 
              

    -

    trigger_offset

              trigger_offset( dbout_owner_in in varchar2 , dbout_name_in in varchar2 , dbout_type_in in varchar2 ) return number ; 
              

    -

    WTPLSQL_RUN

              WTPLSQL_RUN
              

    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMEWT_PROFILER
    SUBOBJECT_NAMEnull
    OBJECT_ID41928
    DATA_OBJECT_IDnull
    OBJECT_TYPEPACKAGE
    CREATED29-JUN-2018 15:09:15
    LAST_DDL_TIME29-JUN-2018 15:21:15
    TIMESTAMP2018-06-29:15:21:15
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE1
    EDITION_NAMEnull
    -
    -
    -
    -
    - - - - - - - - - - - - - - - -
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    EXECUTEPUBLICNOWTPWT_PROFILER
    -
    -
    -
    -
    - - - - - - - - - -
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    -
    -
    -
    -
    - - - - - - - - - -
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    -
    -
    -
    -
    -
    -package wt_profiler authid definer --current_user
    -as
    -
    -   procedure initialize
    -      (in_test_run_id      in  number,
    -       in_runner_name      in  varchar2,
    -       out_dbout_owner     out varchar2,
    -       out_dbout_name      out varchar2,
    -       out_dbout_type      out varchar2,
    -       out_trigger_offset  out number,
    -       out_profiler_runid  out number,
    -       out_error_message   out varchar2);
    -
    -   procedure finalize;
    -
    -   function trigger_offset
    -      (dbout_owner_in  in  varchar2
    -      ,dbout_name_in   in  varchar2
    -      ,dbout_type_in   in  varchar2)
    -   return number;
    -
    -   function calc_pct_coverage
    -      (in_test_run_id  in  number)
    -   return number;
    -
    -   procedure delete_records
    -      (in_test_run_id  in number);
    -
    -   --   WtPLSQL Self Test Procedures
    -   --
    -   -- alter system set PLSQL_CCFLAGS = 
    -   --    'WTPLSQL_SELFTEST:TRUE'
    -   --    scope=BOTH;
    -   --
    -   $IF $$WTPLSQL_SELFTEST
    -   $THEN
    -      procedure WTPLSQL_RUN;
    -   $END
    -
    -end wt_profiler;
    -
    -
    -
    - - diff --git a/docs/core/DBDocs/package/WT_RESULT.html b/docs/core/DBDocs/package/WT_RESULT.html deleted file mode 100644 index 2d39d56..0000000 --- a/docs/core/DBDocs/package/WT_RESULT.html +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - - - -
    -
    -
    -

    Doc

    -
    -
    -
    -
    -

    Details

    -
    -
    -
    -
    -

    Grants

    -
    -
    -
    -
    -

    References

    -
    -
    -
    -
    -

    Dependencies

    -
    -
    -
    -
    -

    Code

    -
    -
    -
    -
    -
    -
    -
    - -


    - - - - -
    Method Summary
     delete_records( in_test_run_id in number )
              
     finalize
              
     initialize( in_test_run_id in wt_test_runs . id % TYPE )
              
     save( in_assertion in wt_results . assertion % TYPE , in_status in wt_results . status % TYPE , in_details in wt_results . details % TYPE , in_testcase in wt_results . testcase % TYPE , in_message in wt_results . message % TYPE )
              
     WTPLSQL_RUN
              
    -

    Method Detail
    -

    delete_records

              delete_records( in_test_run_id in number ) 
              

    -

    finalize

              finalize
              

    -

    initialize

              initialize( in_test_run_id in wt_test_runs . id % TYPE ) 
              

    -

    save

              save( in_assertion in wt_results . assertion % TYPE , in_status in wt_results . status % TYPE , in_details in wt_results . details % TYPE , in_testcase in wt_results . testcase % TYPE , in_message in wt_results . message % TYPE ) 
              

    -

    WTPLSQL_RUN

              WTPLSQL_RUN
              

    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMEWT_RESULT
    SUBOBJECT_NAMEnull
    OBJECT_ID41926
    DATA_OBJECT_IDnull
    OBJECT_TYPEPACKAGE
    CREATED29-JUN-2018 15:09:14
    LAST_DDL_TIME29-JUN-2018 15:21:15
    TIMESTAMP2018-06-29:15:21:15
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE1
    EDITION_NAMEnull
    -
    -
    -
    -
    - - - - - - - - - - - - - - - -
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    EXECUTEPUBLICNOWTPWT_RESULT
    -
    -
    -
    -
    - - - - - - - - - -
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    -
    -
    -
    -
    - - - - - - - - - -
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    -
    -
    -
    -
    -
    -package wt_result authid definer
    -as
    -
    -   procedure initialize
    -      (in_test_run_id   in wt_test_runs.id%TYPE);
    -
    -   procedure finalize;
    -
    -   procedure save
    -      (in_assertion      in wt_results.assertion%TYPE
    -      ,in_status         in wt_results.status%TYPE
    -      ,in_details        in wt_results.details%TYPE
    -      ,in_testcase       in wt_results.testcase%TYPE
    -      ,in_message        in wt_results.message%TYPE);
    -
    -   procedure delete_records
    -      (in_test_run_id  in number);
    -
    -   --   WtPLSQL Self Test Procedures
    -   --
    -   -- alter system set PLSQL_CCFLAGS = 
    -   --    'WTPLSQL_SELFTEST:TRUE'
    -   --    scope=BOTH;
    -   --
    -   $IF $$WTPLSQL_SELFTEST
    -   $THEN
    -      procedure WTPLSQL_RUN;
    -   $END
    -
    -end wt_result;
    -
    -
    -
    - - diff --git a/docs/core/DBDocs/package/WT_TEST_RUN_STAT.html b/docs/core/DBDocs/package/WT_TEST_RUN_STAT.html deleted file mode 100644 index 75f7997..0000000 --- a/docs/core/DBDocs/package/WT_TEST_RUN_STAT.html +++ /dev/null @@ -1,210 +0,0 @@ - - - - - - - - -
    -
    -
    -

    Doc

    -
    -
    -
    -
    -

    Details

    -
    -
    -
    -
    -

    Grants

    -
    -
    -
    -
    -

    References

    -
    -
    -
    -
    -

    Dependencies

    -
    -
    -
    -
    -

    Code

    -
    -
    -
    -
    -
    -
    -
    - -


    - - - - - -
    Method Summary
     add_profile( in_dbout_profiles_rec in wt_dbout_profiles % ROWTYPE )
              
     add_result( in_results_rec in wt_results % ROWTYPE )
              
     delete_records( in_test_run_id in number )
              
     finalize
              
     initialize
              
     WTPLSQL_RUN
              
    -

    Method Detail
    -

    add_profile

              add_profile( in_dbout_profiles_rec in wt_dbout_profiles % ROWTYPE ) 
              

    -

    add_result

              add_result( in_results_rec in wt_results % ROWTYPE ) 
              

    -

    delete_records

              delete_records( in_test_run_id in number ) 
              

    -

    finalize

              finalize
              

    -

    initialize

              initialize
              

    -

    WTPLSQL_RUN

              WTPLSQL_RUN
              

    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMEWT_TEST_RUN_STAT
    SUBOBJECT_NAMEnull
    OBJECT_ID41960
    DATA_OBJECT_IDnull
    OBJECT_TYPEPACKAGE
    CREATED29-JUN-2018 15:21:15
    LAST_DDL_TIME29-JUN-2018 15:21:15
    TIMESTAMP2018-06-29:15:21:15
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE1
    EDITION_NAMEnull
    -
    -
    -
    -
    - - - - - - - - -
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    -
    -
    -
    -
    - - - - - - - - - -
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    -
    -
    -
    -
    - - - - - - - - - -
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    -
    -
    -
    -
    -
    -package wt_test_run_stat authid definer
    -as
    -
    -   procedure initialize;
    -
    -   procedure add_result
    -      (in_results_rec  in wt_results%ROWTYPE);
    -
    -   procedure add_profile
    -      (in_dbout_profiles_rec  in wt_dbout_profiles%ROWTYPE);
    -
    -   procedure finalize;
    -
    -   procedure delete_records
    -      (in_test_run_id  in number);
    -
    -   --   WtPLSQL Self Test Procedures
    -   --
    -   -- alter system set PLSQL_CCFLAGS = 
    -   --    'WTPLSQL_SELFTEST:TRUE'
    -   --    scope=BOTH;
    -   --
    -   $IF $$WTPLSQL_SELFTEST
    -   $THEN
    -      procedure WTPLSQL_RUN;
    -   $END
    -
    -end wt_test_run_stat;
    -
    -
    -
    - - diff --git a/docs/core/DBDocs/package/WT_TEXT_REPORT.html b/docs/core/DBDocs/package/WT_TEXT_REPORT.html index a7e5a3f..1d9110c 100644 --- a/docs/core/DBDocs/package/WT_TEXT_REPORT.html +++ b/docs/core/DBDocs/package/WT_TEXT_REPORT.html @@ -46,14 +46,16 @@
    -

    To report the latest result details for test runner:


    - - +
    Method Summary
     ad_hoc_result( in_assertion in wt_results . assertion % TYPE , in_status in wt_results . status % TYPE , in_details in wt_results . details % TYPE , in_testcase in wt_results . testcase % TYPE , in_message in wt_results . message % TYPE )
              
     dbms_out( in_runner_owner in wt_test_runs . runner_owner % TYPE default USER , in_runner_name in wt_test_runs . runner_name % TYPE default null , in_detail_level in number default 0 , in_summary_last in boolean default FALSE )
               All profiled source lines.
     format_test_result( in_assertion in wt_results . assertion % TYPE , in_status in wt_results . status % TYPE , in_details in wt_results . details % TYPE , in_testcase in wt_results . testcase % TYPE , in_message in wt_results . message % TYPE , in_interval_msecs in wt_results . interval_msecs % TYPE DEFAULT NULL ) return varchar2 ;
              

    To report the latest result details:


    + + +
    Method Summary
     ad_hoc_result
              
     dbms_out( in_detail_level in number default 0 , in_summary_last in boolean default FALSE )
              
     format_test_result( in_rec in core_data . results_rec_type ) return varchar2 ;
               All assertion result details.
     show_result_header
              

    Method Detail
    -

    ad_hoc_result

              ad_hoc_result( in_assertion in wt_results . assertion % TYPE , in_status in wt_results . status % TYPE , in_details in wt_results . details % TYPE , in_testcase in wt_results . testcase % TYPE , in_message in wt_results . message % TYPE ) 
              

    -

    dbms_out

              dbms_out( in_runner_owner in wt_test_runs . runner_owner % TYPE default USER , in_runner_name in wt_test_runs . runner_name % TYPE default null , in_detail_level in number default 0 , in_summary_last in boolean default FALSE ) 
               All profiled source lines.

    -

    format_test_result

              format_test_result( in_assertion in wt_results . assertion % TYPE , in_status in wt_results . status % TYPE , in_details in wt_results . details % TYPE , in_testcase in wt_results . testcase % TYPE , in_message in wt_results . message % TYPE , in_interval_msecs in wt_results . interval_msecs % TYPE DEFAULT NULL ) return varchar2 ; 
              

    +

    ad_hoc_result

              ad_hoc_result
              

    +

    dbms_out

              dbms_out( in_detail_level in number default 0 , in_summary_last in boolean default FALSE ) 
              

    +

    format_test_result

              format_test_result( in_rec in core_data . results_rec_type ) return varchar2 ; 
               All assertion result details.

    +

    show_result_header

              show_result_header
              

    @@ -76,7 +78,7 @@

    format_test_result

              format_test_result( in_assertio
     
     
     OBJECT_ID
    -41929
    +42808
     
     
     DATA_OBJECT_ID
    @@ -88,15 +90,15 @@ 

    format_test_result

              format_test_result( in_assertio
     
     
     CREATED
    -29-JUN-2018 15:09:15
    +25-NOV-2018 19:55:40
     
     
     LAST_DDL_TIME
    -29-JUN-2018 15:21:16
    +25-NOV-2018 19:55:40
     
     
     TIMESTAMP
    -2018-06-29:15:21:15
    +2018-11-25:19:55:40
     
     
     STATUS
    @@ -176,12 +178,13 @@ 

    format_test_result

              format_test_result( in_assertio
     
    -package wt_text_report authid definer
    +package wt_text_report
    +   authid definer
     as
     
    -   --   To report the latest result details for test runner:
    +   --   To report the latest result details:
        -- begin
    -   --    wt_text_report.dbms_out('TEST_RUNNER', FALSE, FALSE, TRUE, TRUE);
    +   --    wt_text_report.dbms_out(30, TRUE);
        -- end;
        -- /
     
    @@ -191,47 +194,27 @@ 

    format_test_result

              format_test_result( in_assertio
        -- DATE data type format for Report Header
        g_date_format  varchar2(100) := 'DD-Mon-YYYY HH:MI:SS PM';
     
    -   function format_test_result
    -      (in_assertion      in wt_results.assertion%TYPE
    -      ,in_status         in wt_results.status%TYPE
    -      ,in_details        in wt_results.details%TYPE
    -      ,in_testcase       in wt_results.testcase%TYPE
    -      ,in_message        in wt_results.message%TYPE
    -      ,in_interval_msecs in wt_results.interval_msecs%TYPE DEFAULT NULL)
    -   return varchar2;
    +   procedure dbms_out
    +      (in_detail_level   in  number   default 0
    +      ,in_summary_last   in  boolean  default FALSE);
     
    -   procedure ad_hoc_result
    -      (in_assertion      in wt_results.assertion%TYPE
    -      ,in_status         in wt_results.status%TYPE
    -      ,in_details        in wt_results.details%TYPE
    -      ,in_testcase       in wt_results.testcase%TYPE
    -      ,in_message        in wt_results.message%TYPE);
    +   procedure ad_hoc_result;
    +
    +   procedure show_result_header;
     
     --  "in_detail_level" settings for DBMS_OUT procedure:
     --  * Less than 10 (including null) - No Detail
     --     * Assertion results summary.
    ---     * Profiled lines summary.
     --  * 10 to 19 - Minimal Detail
     --     * Assertion results summary.
    ---     * Profiled lines summary.
     --     * Failed assertion result details.
    ---     * Profiled source lines that were "not executed".
    ---  * 20 to 29 - Partial Full Detail
    +--  * 20 or more - Full Detail
     --     * Assertion results summary.
    ---     * Profiled lines summary.
     --     * All assertion result details.
    ---     * Profiled source lines that were "not executed".
    ---  * 30 or more - Full Detail
    ---     * Assertion results summary.
    ---     * Profiled lines summary.
    ---     * All assertion result details.
    ---     * All profiled source lines.
     
    -   procedure dbms_out
    -      (in_runner_owner   in  wt_test_runs.runner_owner%TYPE default USER
    -      ,in_runner_name    in  wt_test_runs.runner_name%TYPE  default null
    -      ,in_detail_level   in  number                         default 0
    -      ,in_summary_last   in  boolean                        default FALSE);
    +   function format_test_result
    +      (in_rec  in core_data.results_rec_type)
    +   return varchar2;
     
     end wt_text_report;
    diff --git a/docs/core/DBDocs/package/index.html b/docs/core/DBDocs/package/index.html index 06146e0..236bf52 100644 --- a/docs/core/DBDocs/package/index.html +++ b/docs/core/DBDocs/package/index.html @@ -6,11 +6,10 @@

    Packages -

    WTPLSQL + \ No newline at end of file diff --git a/docs/core/DBDocs/procedure/WT_EXECUTE_TEST_RUNNER.html b/docs/core/DBDocs/procedure/WT_EXECUTE_TEST_RUNNER.html new file mode 100644 index 0000000..b4444bf --- /dev/null +++ b/docs/core/DBDocs/procedure/WT_EXECUTE_TEST_RUNNER.html @@ -0,0 +1,192 @@ + + + + + + + + +
    +
    +
    +

    Doc

    +
    +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Code

    +
    +
    +
    +
    +
    +
    +
    + +


    +
    Method Summary
     wt_execute_test_runner
               dynamic PL/SQL execution.
    +

    Method Detail
    +

    wt_execute_test_runner

              wt_execute_test_runner
               dynamic PL/SQL execution.

    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMEWT_EXECUTE_TEST_RUNNER
    SUBOBJECT_NAMEnull
    OBJECT_ID42809
    DATA_OBJECT_IDnull
    OBJECT_TYPEPROCEDURE
    CREATED25-NOV-2018 19:55:40
    LAST_DDL_TIME25-NOV-2018 19:55:40
    TIMESTAMP2018-11-25:19:55:40
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE1
    EDITION_NAMEnull
    +
    +
    +
    +
    + + + + + + + + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    EXECUTEPUBLICNOWTPWT_EXECUTE_TEST_RUNNER
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    +
    +procedure wt_execute_test_runner
    +   authid current_user
    +   -- AUTHID CURRENT_USER is required for assertions with
    +   --   dynamic PL/SQL execution.
    +is
    +   sql_txt  varchar2(4000);
    +begin
    +   sql_txt := 'begin "' || core_data.g_run_rec.runner_owner ||
    +                  '"."' || core_data.g_run_rec.runner_name  ||
    +                   '".' || wtplsql.C_RUNNER_ENTRY_POINT     || '; end;';
    +   --dbms_output.put_line(sql_txt);
    +   execute immediate sql_txt;
    +end wt_execute_test_runner;
    +
    +
    +
    + + diff --git a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/headerBg.jpg b/docs/core/DBDocs/procedure/WT_EXECUTE_TEST_RUNNER/headerBg.jpg similarity index 100% rename from docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/headerBg.jpg rename to docs/core/DBDocs/procedure/WT_EXECUTE_TEST_RUNNER/headerBg.jpg diff --git a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/report.css b/docs/core/DBDocs/procedure/WT_EXECUTE_TEST_RUNNER/report.css similarity index 100% rename from docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/report.css rename to docs/core/DBDocs/procedure/WT_EXECUTE_TEST_RUNNER/report.css diff --git a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/report.js b/docs/core/DBDocs/procedure/WT_EXECUTE_TEST_RUNNER/report.js similarity index 100% rename from docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/report.js rename to docs/core/DBDocs/procedure/WT_EXECUTE_TEST_RUNNER/report.js diff --git a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topDimTabBg.gif b/docs/core/DBDocs/procedure/WT_EXECUTE_TEST_RUNNER/topDimTabBg.gif similarity index 100% rename from docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topDimTabBg.gif rename to docs/core/DBDocs/procedure/WT_EXECUTE_TEST_RUNNER/topDimTabBg.gif diff --git a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topDimTabL.gif b/docs/core/DBDocs/procedure/WT_EXECUTE_TEST_RUNNER/topDimTabL.gif similarity index 100% rename from docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topDimTabL.gif rename to docs/core/DBDocs/procedure/WT_EXECUTE_TEST_RUNNER/topDimTabL.gif diff --git a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topDimTabR.gif b/docs/core/DBDocs/procedure/WT_EXECUTE_TEST_RUNNER/topDimTabR.gif similarity index 100% rename from docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topDimTabR.gif rename to docs/core/DBDocs/procedure/WT_EXECUTE_TEST_RUNNER/topDimTabR.gif diff --git a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topTabBg.gif b/docs/core/DBDocs/procedure/WT_EXECUTE_TEST_RUNNER/topTabBg.gif similarity index 100% rename from docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topTabBg.gif rename to docs/core/DBDocs/procedure/WT_EXECUTE_TEST_RUNNER/topTabBg.gif diff --git a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topTabL.gif b/docs/core/DBDocs/procedure/WT_EXECUTE_TEST_RUNNER/topTabL.gif similarity index 100% rename from docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topTabL.gif rename to docs/core/DBDocs/procedure/WT_EXECUTE_TEST_RUNNER/topTabL.gif diff --git a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topTabR.gif b/docs/core/DBDocs/procedure/WT_EXECUTE_TEST_RUNNER/topTabR.gif similarity index 100% rename from docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topTabR.gif rename to docs/core/DBDocs/procedure/WT_EXECUTE_TEST_RUNNER/topTabR.gif diff --git a/docs/core/DBDocs/sequence/index.html b/docs/core/DBDocs/procedure/index.html similarity index 57% rename from docs/core/DBDocs/sequence/index.html rename to docs/core/DBDocs/procedure/index.html index d5945db..26739a4 100644 --- a/docs/core/DBDocs/sequence/index.html +++ b/docs/core/DBDocs/procedure/index.html @@ -5,8 +5,7 @@ -

    Sequences -

    PLSQL_PROFILER_RUNNUMBER -WT_TEST_RUNS_SEQ +

    Procedures +

    \ No newline at end of file diff --git a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER.html b/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER.html deleted file mode 100644 index 022482d..0000000 --- a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - - -
    -
    -
    -

    Details

    -
    -
    -
    -
    -

    Dependencies

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NAMEVALUE
    CREATED29-JUN-2018 15:09:11
    LAST_DDL_TIME29-JUN-2018 15:21:11
    SEQUENCE_OWNERWTP
    SEQUENCE_NAMEPLSQL_PROFILER_RUNNUMBER
    MIN_VALUE1
    MAX_VALUE9999999999999999999999999999
    INCREMENT_BY1
    CYCLE_FLAGN
    ORDER_FLAGN
    CACHE_SIZE0
    LAST_NUMBER16
    -
    -
    -
    -
    - - - - - - - - - -
    OBJECT_IDOWNEROBJECT_TYPEOBJECT_NAMESTATUSTYPE_LINK
    -
    -
    -
    -
    -
    -

    References

    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - diff --git a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ.html b/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ.html deleted file mode 100644 index 22af5be..0000000 --- a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - - -
    -
    -
    -

    Details

    -
    -
    -
    -
    -

    Dependencies

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NAMEVALUE
    CREATED29-JUN-2018 15:09:12
    LAST_DDL_TIME29-JUN-2018 15:21:14
    SEQUENCE_OWNERWTP
    SEQUENCE_NAMEWT_TEST_RUNS_SEQ
    MIN_VALUE1
    MAX_VALUE9999999999999999999999999999
    INCREMENT_BY1
    CYCLE_FLAGN
    ORDER_FLAGN
    CACHE_SIZE20
    LAST_NUMBER41
    -
    -
    -
    -
    - - - - - - - - - -
    OBJECT_IDOWNEROBJECT_TYPEOBJECT_NAMESTATUSTYPE_LINK
    -
    -
    -
    -
    -
    -

    References

    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - diff --git a/docs/core/DBDocs/table/WT_TESTCASE_STATS.html b/docs/core/DBDocs/table/HOOKS.html similarity index 66% rename from docs/core/DBDocs/table/WT_TESTCASE_STATS.html rename to docs/core/DBDocs/table/HOOKS.html index fdc8e9c..f1e336b 100644 --- a/docs/core/DBDocs/table/WT_TESTCASE_STATS.html +++ b/docs/core/DBDocs/table/HOOKS.html @@ -1,13 +1,13 @@ - - + +
    @@ -70,92 +70,36 @@ COMMENTS -TEST_RUN_ID -NUMBER(38,0) +HOOK_NAME +VARCHAR2(20 BYTE) No null 1 -Primary (Surrogate) Key for each Test Run. Also the Test Runs Foreign Key. +Primary Key for each Hook Name -TESTCASE -VARCHAR2(50 BYTE) +SEQ +NUMBER(2,0) No null 2 -Primary Key (part 2). The testcase name +Primary Key for the sequence of the Hook -TEST_YIELD -NUMBER -Yes +RUN_STRING +VARCHAR2(4000 BYTE) +No null 3 -Ratio of successful assertions to total assertions. +Procedure Name or Un-named PL/SQL Block for EXECUTE IMMEDIATE -ASSERTS -NUMBER +DESCRIPTION +VARCHAR2(1000 BYTE) Yes null 4 -Total number of assetions for the testcase. - - -PASSES -NUMBER -Yes -null -5 -Number of passed assertions for the testcase. - - -FAILURES -NUMBER -Yes -null -6 -Number of failed assertions for the testcase. - - -ERRORS -NUMBER -Yes -null -7 -Number of errored assertions for the testcase. - - -MIN_INTERVAL_MSECS -NUMBER -Yes -null -8 -Minimum interval time between assertions in milliseconds for the testcase - - -AVG_INTERVAL_MSECS -NUMBER -Yes -null -9 -Average interval time between assertions in milliseconds for the testcase - - -MAX_INTERVAL_MSECS -NUMBER -Yes -null -10 -Maximum interval time between assertions in milliseconds for the testcase - - -TOT_INTERVAL_MSECS -NUMBER -Yes -null -11 -Total (sum) of interval times between assertions in milliseconds for the testcase +Description of this Hook.
    @@ -184,29 +128,35 @@ VIEW_RELATED -WT_TESTCASE_STATS_FK1 -Foreign_Key +HOOKS_CK1 +Check +hook_name in ('before_test_all' +                                             ,'before_test_run' +                                             ,'execute_test_runner' +                                             ,'after_assertion' +                                             ,'after_test_run' +                                             ,'after_test_all' +                                             ,'ad_hoc_report') +null +null +null null -WTP -WT_TEST_RUNS -WT_TEST_RUNS_PK -NO ACTION ENABLED NOT DEFERRABLE VALIDATED USER NAME null null -29-JUN-2018 15:21:12 +25-NOV-2018 19:55:40 null null null null -WT_TESTCASE_STATS_NN1 +HOOKS_CK2 Check -"TEST_RUN_ID" IS NOT NULL +seq > 0 null null null @@ -217,16 +167,36 @@ USER NAME null null -29-JUN-2018 15:21:12 +25-NOV-2018 19:55:40 null null null null -WT_TESTCASE_STATS_NN2 +HOOKS_PK +Primary_Key +null +null +null +null +null +ENABLED +NOT DEFERRABLE +VALIDATED +USER NAME +null +null +25-NOV-2018 19:55:40 +null +HOOKS_PK +null +null + + +WT_HOOKS_NN1 Check -"TESTCASE" IS NOT NULL +"HOOK_NAME" IS NOT NULL null null null @@ -237,17 +207,37 @@ USER NAME null null -29-JUN-2018 15:21:12 +25-NOV-2018 19:55:40 null null null null - -WT_TESTCASE_STATS_PK -Primary_Key + +WT_HOOKS_NN2 +Check +"SEQ" IS NOT NULL +null +null +null +null +ENABLED +NOT DEFERRABLE +VALIDATED +USER NAME null null +25-NOV-2018 19:55:40 +null +null +null +null + + +WT_HOOKS_NN3 +Check +"RUN_STRING" IS NOT NULL +null null null null @@ -257,9 +247,9 @@ USER NAME null null -29-JUN-2018 15:21:12 +25-NOV-2018 19:55:40 +null null -WT_TESTCASE_STATS_PK null null @@ -282,8 +272,8 @@ COLUMN_POSITION -TEST_RUN_ID -1 +HOOK_NAME +null
    @@ -295,7 +285,7 @@ COLUMN_POSITION -TEST_RUN_ID +SEQ null @@ -308,8 +298,12 @@ COLUMN_POSITION -TESTCASE -null +HOOK_NAME +1 + + +SEQ +2
    @@ -321,12 +315,34 @@ COLUMN_POSITION -TEST_RUN_ID -1 +HOOK_NAME +null - -TESTCASE -2 + +
    +
    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    SEQnull
    +
    +
    +
    +
    + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    RUN_STRINGnull
    @@ -336,7 +352,7 @@
    - +
    @@ -344,52 +360,38 @@ - - - - - - - - - - - - - -
    PRIVILEGE GRANTEEGRANTOR OBJECT_NAME
    DELETEPUBLICNOWTPWT_TESTCASE_STATS
    SELECTPUBLICNOWTPWT_TESTCASE_STATS
    - +
    - + - + - + - + - + - +
    NAME VALUE
    NUM_ROWSnull3
    BLOCKSnull5
    AVG_ROW_LENnull58
    SAMPLE_SIZEnull3
    LAST_ANALYZEDnull25-NOV-2018 20:04:09
    LAST_ANALYZED_SINCEnull25-NOV-2018 20:04:09

    @@ -408,7 +410,7 @@
    - +
    @@ -434,7 +436,7 @@
    -
    TRIGGER_NAME TRIGGER_TYPE
    +
    @@ -443,12 +445,12 @@ - + - + - +
    OWNER NAMEREFERENCED_NAME REFERENCED_TYPE
    WTPWT_TEST_RUN_STATHOOK PACKAGE BODY WTPWT_TESTCASE_STATSHOOKS TABLE
    @@ -464,7 +466,7 @@
    -
    +
    @@ -481,17 +483,17 @@
    -
    OWNER NAME
    +
    - + - + @@ -499,7 +501,7 @@ - + @@ -519,7 +521,7 @@ - + @@ -571,35 +573,35 @@ - + - + - + - + - + - + - + - + @@ -619,11 +621,11 @@ - + - + @@ -667,7 +669,7 @@ - + @@ -707,14 +709,14 @@ - +
    NAME VALUE
    CREATED29-JUN-2018 15:21:1225-NOV-2018 19:55:40
    LAST_DDL_TIME29-JUN-2018 15:21:1225-NOV-2018 19:55:40
    OWNER
    TABLE_NAMEWT_TESTCASE_STATSHOOKS
    TABLESPACE_NAME
    PCT_FREE010
    PCT_USED
    NUM_ROWSnull3
    BLOCKSnull5
    EMPTY_BLOCKSnull0
    AVG_SPACEnull0
    CHAIN_CNTnull0
    AVG_ROW_LENnull58
    AVG_SPACE_FREELIST_BLOCKSnull0
    NUM_FREELIST_BLOCKSnull0
    DEGREE
    SAMPLE_SIZEnull3
    LAST_ANALYZEDnull25-NOV-2018 20:04:09
    PARTITIONED
    GLOBAL_STATSNOYES
    USER_STATS
    COMMENTSTest Run data statistics for each testcase in the execution of the WTPLSQL_RUN procedure.wtPLSQL Hooks.
    - +
    @@ -740,7 +742,7 @@
    -
    PARTITION_NAME LAST_ANALYZED
    +
    @@ -753,9 +755,9 @@ - + - + @@ -763,7 +765,7 @@ - +
    INDEX_OWNER INDEX_NAMEJOIN_INDEX COLUMNS
    WTPWT_TESTCASE_STATS_PKHOOKS_PK UNIQUE VALID NORMALNO null NOTEST_RUN_ID, TESTCASEHOOK_NAME, SEQ

    @@ -778,7 +780,7 @@
    -
    +
    @@ -791,27 +793,27 @@ - + - + - - + + - - + + - + - + - - + + - - + + diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/headerBg.jpg b/docs/core/DBDocs/table/HOOKS/headerBg.jpg similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_DATA/headerBg.jpg rename to docs/core/DBDocs/table/HOOKS/headerBg.jpg diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/report.css b/docs/core/DBDocs/table/HOOKS/report.css similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_DATA/report.css rename to docs/core/DBDocs/table/HOOKS/report.css diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/report.js b/docs/core/DBDocs/table/HOOKS/report.js similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_DATA/report.js rename to docs/core/DBDocs/table/HOOKS/report.js diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topDimTabBg.gif b/docs/core/DBDocs/table/HOOKS/topDimTabBg.gif similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topDimTabBg.gif rename to docs/core/DBDocs/table/HOOKS/topDimTabBg.gif diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topDimTabL.gif b/docs/core/DBDocs/table/HOOKS/topDimTabL.gif similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topDimTabL.gif rename to docs/core/DBDocs/table/HOOKS/topDimTabL.gif diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topDimTabR.gif b/docs/core/DBDocs/table/HOOKS/topDimTabR.gif similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topDimTabR.gif rename to docs/core/DBDocs/table/HOOKS/topDimTabR.gif diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topTabBg.gif b/docs/core/DBDocs/table/HOOKS/topTabBg.gif similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topTabBg.gif rename to docs/core/DBDocs/table/HOOKS/topTabBg.gif diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topTabL.gif b/docs/core/DBDocs/table/HOOKS/topTabL.gif similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topTabL.gif rename to docs/core/DBDocs/table/HOOKS/topTabL.gif diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topTabR.gif b/docs/core/DBDocs/table/HOOKS/topTabR.gif similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topTabR.gif rename to docs/core/DBDocs/table/HOOKS/topTabR.gif diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA.html b/docs/core/DBDocs/table/PLSQL_PROFILER_DATA.html deleted file mode 100644 index 78343f9..0000000 --- a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA.html +++ /dev/null @@ -1,799 +0,0 @@ - - - - - - - -
    INDEX_OWNER INDEX_NAMEDESCEND COLUMN_EXPRESSION
    WTPWT_TESTCASE_STATS_PKHOOKS_PK WTPWT_TESTCASE_STATSTEST_RUN_IDHOOKSHOOK_NAME 12202020 ASC null
    WTPWT_TESTCASE_STATS_PKHOOKS_PK WTPWT_TESTCASE_STATSTESTCASEHOOKSSEQ 25050220 ASC null
    - -
    -
    -
    -
    -

    Columns

    -
    -
    -
    -
    -

    Constraints

    -
    -
    -
    -
    -

    Grants

    -
    -
    -
    -
    -

    Statistics

    -
    -
    -
    -
    -

    Triggers

    -
    -
    -
    -
    -

    Dependencies

    -
    -
    -
    -
    -

    Details

    -
    -
    -
    -
    -

    Partitions

    -
    -
    -
    -
    -

    Indexes

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    COLUMN_NAMEDATA_TYPENULLABLEDATA_DEFAULTCOLUMN_IDCOMMENTS
    RUNIDNUMBERNonull1Primary key, unique (generated) run identifier
    UNIT_NUMBERNUMBERNonull2Primary key, internally generated library unit number
    LINE#NUMBERNonull3Primary key, not null, line number in unit
    TOTAL_OCCURNUMBERYesnull4Number of times line was executed
    TOTAL_TIMENUMBERYesnull5Total time spent executing line in nanoseconds
    MIN_TIMENUMBERYesnull6Minimum execution time for this line in nanoseconds
    MAX_TIMENUMBERYesnull7Maximum execution time for this line in nanoseconds
    SPARE1NUMBERYesnull8Unused
    SPARE2NUMBERYesnull9Unused
    SPARE3NUMBERYesnull10Unused
    SPARE4NUMBERYesnull11Unused
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CONSTRAINT_NAMECONSTRAINT_TYPESEARCH_CONDITIONR_OWNERR_TABLE_NAMER_CONSTRAINT_NAMEDELETE_RULESTATUSDEFERRABLEVALIDATEDGENERATEDBADRELYLAST_CHANGEINDEX_OWNERINDEX_NAMEINVALIDVIEW_RELATED
    SYS_C0020887Check"LINE#" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDGENERATED NAMEnullnull29-JUN-2018 15:09:11nullnullnullnull
    SYS_C0020888Primary_KeynullnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDGENERATED NAMEnullnull29-JUN-2018 15:09:11nullSYS_C0020888nullnull
    SYS_C0020889Foreign_KeynullWTPPLSQL_PROFILER_UNITSSYS_C0020885NO ACTIONENABLEDNOT DEFERRABLEVALIDATEDGENERATED NAMEnullnull29-JUN-2018 15:09:11nullnullnullnull
    -
    -
    -
    -
    -
    -

    Columns

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    LINE#null
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    RUNID1
    UNIT_NUMBER2
    LINE#3
    -
    -
    -
    -
    - - - - - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    RUNID1
    UNIT_NUMBER2
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - -
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NAMEVALUE
    NUM_ROWSnull
    BLOCKSnull
    AVG_ROW_LENnull
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    LAST_ANALYZED_SINCEnull
    -
    -
    -
    -
    -
    -

    Column Statistics

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - -
    TRIGGER_NAMETRIGGER_TYPETRIGGER_OWNERTRIGGERING_EVENTSTATUSTABLE_NAME
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    WTPWT_PROFILERPACKAGE BODYWTPPLSQL_PROFILER_DATATABLE
    -
    -
    -
    -
    -
    -

    References

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NAMEVALUE
    CREATED29-JUN-2018 15:09:11
    LAST_DDL_TIME29-JUN-2018 15:21:12
    OWNERWTP
    TABLE_NAMEPLSQL_PROFILER_DATA
    TABLESPACE_NAMEUSERS
    CLUSTER_NAMEnull
    IOT_NAMEnull
    STATUSVALID
    PCT_FREE10
    PCT_USEDnull
    INI_TRANS1
    MAX_TRANS255
    INITIAL_EXTENT65536
    NEXT_EXTENT1048576
    MIN_EXTENTS1
    MAX_EXTENTS2147483645
    PCT_INCREASEnull
    FREELISTSnull
    FREELIST_GROUPSnull
    LOGGINGYES
    BACKED_UPN
    NUM_ROWSnull
    BLOCKSnull
    EMPTY_BLOCKSnull
    AVG_SPACEnull
    CHAIN_CNTnull
    AVG_ROW_LENnull
    AVG_SPACE_FREELIST_BLOCKSnull
    NUM_FREELIST_BLOCKSnull
    DEGREE1
    INSTANCES1
    CACHEN
    TABLE_LOCKENABLED
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    PARTITIONEDNO
    IOT_TYPEnull
    OBJECT_ID_TYPEnull
    TABLE_TYPE_OWNERnull
    TABLE_TYPEnull
    TEMPORARYN
    SECONDARYN
    NESTEDNO
    BUFFER_POOLDEFAULT
    ROW_MOVEMENTDISABLED
    GLOBAL_STATSNO
    USER_STATSNO
    DURATIONnull
    SKIP_CORRUPTDISABLED
    MONITORINGYES
    CLUSTER_OWNERnull
    DEPENDENCIESDISABLED
    COMPRESSIONDISABLED
    COMPRESS_FORnull
    DROPPEDNO
    COMMENTSTable of program units for DBMS_PROFILER
    -
    -
    -
    -
    - - - - - - - - - -
    PARTITION_NAMELAST_ANALYZEDNUM_ROWSBLOCKSSAMPLE_SIZEHIGH_VALUE
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - -
    INDEX_OWNERINDEX_NAMEUNIQUENESSSTATUSINDEX_TYPETEMPORARYPARTITIONEDFUNCIDX_STATUSJOIN_INDEXCOLUMNS
    WTPSYS_C0020888UNIQUEVALIDNORMALNNOnullNORUNID, UNIT_NUMBER, LINE#
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONCOLUMN_LENGTHCHAR_LENGTHDESCENDCOLUMN_EXPRESSION
    WTPSYS_C0020888WTPPLSQL_PROFILER_DATARUNID1220ASCnull
    WTPSYS_C0020888WTPPLSQL_PROFILER_DATAUNIT_NUMBER2220ASCnull
    WTPSYS_C0020888WTPPLSQL_PROFILER_DATALINE#3220ASCnull
    -
    -
    -
    -
    -
    -
    - - diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS.html b/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS.html deleted file mode 100644 index 1f817ae..0000000 --- a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS.html +++ /dev/null @@ -1,722 +0,0 @@ - - - - - - - - -
    -
    -
    -

    Columns

    -
    -
    -
    -
    -

    Constraints

    -
    -
    -
    -
    -

    Grants

    -
    -
    -
    -
    -

    Statistics

    -
    -
    -
    -
    -

    Triggers

    -
    -
    -
    -
    -

    Dependencies

    -
    -
    -
    -
    -

    Details

    -
    -
    -
    -
    -

    Partitions

    -
    -
    -
    -
    -

    Indexes

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    COLUMN_NAMEDATA_TYPENULLABLEDATA_DEFAULTCOLUMN_IDCOMMENTS
    RUNIDNUMBERNonull1(PRIMARY KEY) Unique run identifier from plsql_profiler_runnumber
    RELATED_RUNNUMBERYesnull2Runid of related run (for client/server correlation)
    RUN_OWNERVARCHAR2(32 BYTE)Yesnull3User who started run
    RUN_DATEDATEYesnull4Start time of run
    RUN_COMMENTVARCHAR2(2047 BYTE)Yesnull5User provided comment for this run
    RUN_TOTAL_TIMENUMBERYesnull6Elapsed time for this run in nanoseconds
    RUN_SYSTEM_INFOVARCHAR2(2047 BYTE)Yesnull7Currently unused
    RUN_COMMENT1VARCHAR2(2047 BYTE)Yesnull8Additional comment
    SPARE1VARCHAR2(256 BYTE)Yesnull9Unused
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CONSTRAINT_NAMECONSTRAINT_TYPESEARCH_CONDITIONR_OWNERR_TABLE_NAMER_CONSTRAINT_NAMEDELETE_RULESTATUSDEFERRABLEVALIDATEDGENERATEDBADRELYLAST_CHANGEINDEX_OWNERINDEX_NAMEINVALIDVIEW_RELATED
    SYS_C0020883Primary_KeynullnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDGENERATED NAMEnullnull29-JUN-2018 15:09:11nullSYS_C0020883nullnull
    -
    -
    -
    -
    -
    -

    Columns

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    RUNID1
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - -
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NAMEVALUE
    NUM_ROWSnull
    BLOCKSnull
    AVG_ROW_LENnull
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    LAST_ANALYZED_SINCEnull
    -
    -
    -
    -
    -
    -

    Column Statistics

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - -
    TRIGGER_NAMETRIGGER_TYPETRIGGER_OWNERTRIGGERING_EVENTSTATUSTABLE_NAME
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    WTPWT_PROFILERPACKAGE BODYWTPPLSQL_PROFILER_RUNSTABLE
    -
    -
    -
    -
    -
    -

    References

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NAMEVALUE
    CREATED29-JUN-2018 15:09:11
    LAST_DDL_TIME29-JUN-2018 15:21:12
    OWNERWTP
    TABLE_NAMEPLSQL_PROFILER_RUNS
    TABLESPACE_NAMEUSERS
    CLUSTER_NAMEnull
    IOT_NAMEnull
    STATUSVALID
    PCT_FREE10
    PCT_USEDnull
    INI_TRANS1
    MAX_TRANS255
    INITIAL_EXTENT65536
    NEXT_EXTENT1048576
    MIN_EXTENTS1
    MAX_EXTENTS2147483645
    PCT_INCREASEnull
    FREELISTSnull
    FREELIST_GROUPSnull
    LOGGINGYES
    BACKED_UPN
    NUM_ROWSnull
    BLOCKSnull
    EMPTY_BLOCKSnull
    AVG_SPACEnull
    CHAIN_CNTnull
    AVG_ROW_LENnull
    AVG_SPACE_FREELIST_BLOCKSnull
    NUM_FREELIST_BLOCKSnull
    DEGREE1
    INSTANCES1
    CACHEN
    TABLE_LOCKENABLED
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    PARTITIONEDNO
    IOT_TYPEnull
    OBJECT_ID_TYPEnull
    TABLE_TYPE_OWNERnull
    TABLE_TYPEnull
    TEMPORARYN
    SECONDARYN
    NESTEDNO
    BUFFER_POOLDEFAULT
    ROW_MOVEMENTDISABLED
    GLOBAL_STATSNO
    USER_STATSNO
    DURATIONnull
    SKIP_CORRUPTDISABLED
    MONITORINGYES
    CLUSTER_OWNERnull
    DEPENDENCIESDISABLED
    COMPRESSIONDISABLED
    COMPRESS_FORnull
    DROPPEDNO
    COMMENTSTable of profiler runs for DBMS_PROFILER
    -
    -
    -
    -
    - - - - - - - - - -
    PARTITION_NAMELAST_ANALYZEDNUM_ROWSBLOCKSSAMPLE_SIZEHIGH_VALUE
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    INDEX_OWNERINDEX_NAMEUNIQUENESSSTATUSINDEX_TYPETEMPORARYPARTITIONEDFUNCIDX_STATUSJOIN_INDEXCOLUMNS
    WTPSYS_C0020883UNIQUEVALIDNORMALNNOnullNORUNID
    WTPPLSQL_PROFILER_RUNS_IDX1NONUNIQUEVALIDNORMALNNOnullNORUN_DATE
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONCOLUMN_LENGTHCHAR_LENGTHDESCENDCOLUMN_EXPRESSION
    WTPSYS_C0020883WTPPLSQL_PROFILER_RUNSRUNID1220ASCnull
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONCOLUMN_LENGTHCHAR_LENGTHDESCENDCOLUMN_EXPRESSION
    WTPPLSQL_PROFILER_RUNS_IDX1WTPPLSQL_PROFILER_RUNSRUN_DATE170ASCnull
    -
    -
    -
    -
    -
    -
    - - diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS.html b/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS.html deleted file mode 100644 index e49a296..0000000 --- a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS.html +++ /dev/null @@ -1,763 +0,0 @@ - - - - - - - - -
    -
    -
    -

    Columns

    -
    -
    -
    -
    -

    Constraints

    -
    -
    -
    -
    -

    Grants

    -
    -
    -
    -
    -

    Statistics

    -
    -
    -
    -
    -

    Triggers

    -
    -
    -
    -
    -

    Dependencies

    -
    -
    -
    -
    -

    Details

    -
    -
    -
    -
    -

    Partitions

    -
    -
    -
    -
    -

    Indexes

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    COLUMN_NAMEDATA_TYPENULLABLEDATA_DEFAULTCOLUMN_IDCOMMENTS
    RUNIDNUMBERNonull1(Primary key) References plsql_profiler_runs
    UNIT_NUMBERNUMBERNonull2(Primary key) Internally generated library unit #
    UNIT_TYPEVARCHAR2(32 BYTE)Yesnull3Library unit type
    UNIT_OWNERVARCHAR2(32 BYTE)Yesnull4Library unit owner name
    UNIT_NAMEVARCHAR2(32 BYTE)Yesnull5Library unit name timestamp on library unit
    UNIT_TIMESTAMPDATEYesnull6In the future will be used to detect changes to unit between runs
    TOTAL_TIMENUMBERNo7Total time spent in this unit in nanoseconds. The profiler does not set this field, but it is provided for the convenience of analysis tools
    SPARE1NUMBERYesnull8Unused
    SPARE2NUMBERYesnull9Unused
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CONSTRAINT_NAMECONSTRAINT_TYPESEARCH_CONDITIONR_OWNERR_TABLE_NAMER_CONSTRAINT_NAMEDELETE_RULESTATUSDEFERRABLEVALIDATEDGENERATEDBADRELYLAST_CHANGEINDEX_OWNERINDEX_NAMEINVALIDVIEW_RELATED
    SYS_C0020884Check"TOTAL_TIME" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDGENERATED NAMEnullnull29-JUN-2018 15:09:11nullnullnullnull
    SYS_C0020885Primary_KeynullnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDGENERATED NAMEnullnull29-JUN-2018 15:09:11nullSYS_C0020885nullnull
    SYS_C0020886Foreign_KeynullWTPPLSQL_PROFILER_RUNSSYS_C0020883NO ACTIONENABLEDNOT DEFERRABLEVALIDATEDGENERATED NAMEnullnull29-JUN-2018 15:09:11nullnullnullnull
    -
    -
    -
    -
    -
    -

    Columns

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    TOTAL_TIMEnull
    -
    -
    -
    -
    - - - - - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    RUNID1
    UNIT_NUMBER2
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    RUNID1
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - -
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NAMEVALUE
    NUM_ROWSnull
    BLOCKSnull
    AVG_ROW_LENnull
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    LAST_ANALYZED_SINCEnull
    -
    -
    -
    -
    -
    -

    Column Statistics

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - -
    TRIGGER_NAMETRIGGER_TYPETRIGGER_OWNERTRIGGERING_EVENTSTATUSTABLE_NAME
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    WTPWT_PROFILERPACKAGE BODYWTPPLSQL_PROFILER_UNITSTABLE
    -
    -
    -
    -
    -
    -

    References

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NAMEVALUE
    CREATED29-JUN-2018 15:09:11
    LAST_DDL_TIME29-JUN-2018 15:21:12
    OWNERWTP
    TABLE_NAMEPLSQL_PROFILER_UNITS
    TABLESPACE_NAMEUSERS
    CLUSTER_NAMEnull
    IOT_NAMEnull
    STATUSVALID
    PCT_FREE10
    PCT_USEDnull
    INI_TRANS1
    MAX_TRANS255
    INITIAL_EXTENT65536
    NEXT_EXTENT1048576
    MIN_EXTENTS1
    MAX_EXTENTS2147483645
    PCT_INCREASEnull
    FREELISTSnull
    FREELIST_GROUPSnull
    LOGGINGYES
    BACKED_UPN
    NUM_ROWSnull
    BLOCKSnull
    EMPTY_BLOCKSnull
    AVG_SPACEnull
    CHAIN_CNTnull
    AVG_ROW_LENnull
    AVG_SPACE_FREELIST_BLOCKSnull
    NUM_FREELIST_BLOCKSnull
    DEGREE1
    INSTANCES1
    CACHEN
    TABLE_LOCKENABLED
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    PARTITIONEDNO
    IOT_TYPEnull
    OBJECT_ID_TYPEnull
    TABLE_TYPE_OWNERnull
    TABLE_TYPEnull
    TEMPORARYN
    SECONDARYN
    NESTEDNO
    BUFFER_POOLDEFAULT
    ROW_MOVEMENTDISABLED
    GLOBAL_STATSNO
    USER_STATSNO
    DURATIONnull
    SKIP_CORRUPTDISABLED
    MONITORINGYES
    CLUSTER_OWNERnull
    DEPENDENCIESDISABLED
    COMPRESSIONDISABLED
    COMPRESS_FORnull
    DROPPEDNO
    COMMENTSTable of program units for DBMS_PROFILER
    -
    -
    -
    -
    - - - - - - - - - -
    PARTITION_NAMELAST_ANALYZEDNUM_ROWSBLOCKSSAMPLE_SIZEHIGH_VALUE
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - -
    INDEX_OWNERINDEX_NAMEUNIQUENESSSTATUSINDEX_TYPETEMPORARYPARTITIONEDFUNCIDX_STATUSJOIN_INDEXCOLUMNS
    WTPSYS_C0020885UNIQUEVALIDNORMALNNOnullNORUNID, UNIT_NUMBER
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONCOLUMN_LENGTHCHAR_LENGTHDESCENDCOLUMN_EXPRESSION
    WTPSYS_C0020885WTPPLSQL_PROFILER_UNITSRUNID1220ASCnull
    WTPSYS_C0020885WTPPLSQL_PROFILER_UNITSUNIT_NUMBER2220ASCnull
    -
    -
    -
    -
    -
    -
    - - diff --git a/docs/core/DBDocs/table/WT_DBOUT_PROFILES.html b/docs/core/DBDocs/table/WT_DBOUT_PROFILES.html deleted file mode 100644 index 1b2ce9e..0000000 --- a/docs/core/DBDocs/table/WT_DBOUT_PROFILES.html +++ /dev/null @@ -1,1096 +0,0 @@ - - - - - - - - -
    -
    -
    -

    Columns

    -
    -
    -
    -
    -

    Constraints

    -
    -
    -
    -
    -

    Grants

    -
    -
    -
    -
    -

    Statistics

    -
    -
    -
    -
    -

    Triggers

    -
    -
    -
    -
    -

    Dependencies

    -
    -
    -
    -
    -

    Details

    -
    -
    -
    -
    -

    Partitions

    -
    -
    -
    -
    -

    Indexes

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    COLUMN_NAMEDATA_TYPENULLABLEDATA_DEFAULTCOLUMN_IDCOMMENTS
    TEST_RUN_IDNUMBER(38,0)Nonull1Foreign Key for the Test Run, Primary Key part 1.
    LINENUMBER(6,0)Nonull2Source code line number, Primary Key part 2.
    STATUSVARCHAR2(4 BYTE)Nonull3Executed/NotExecuted/Excluded/Ignored/Unknown Status from the Profiler
    TOTAL_OCCURNUMBER(9,0)Nonull4Number of times this line was executed.
    TOTAL_USECSNUMBER(9,0)Nonull5Total time in microseconds spent executing this line.
    MIN_USECSNUMBER(9,0)Nonull6Minimum execution time in microseconds for this line.
    MAX_USECSNUMBER(9,0)Nonull7Maximum execution time in microseconds for this line.
    TEXTVARCHAR2(4000 BYTE)Nonull8Source code text for this line number.
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CONSTRAINT_NAMECONSTRAINT_TYPESEARCH_CONDITIONR_OWNERR_TABLE_NAMER_CONSTRAINT_NAMEDELETE_RULESTATUSDEFERRABLEVALIDATEDGENERATEDBADRELYLAST_CHANGEINDEX_OWNERINDEX_NAMEINVALIDVIEW_RELATED
    WT_DBOUT_PROFILES_CK1Checkstatus in ('EXEC','NOTX','EXCL','IGNR','UNKN')nullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:21:14nullnullnullnull
    WT_DBOUT_PROFILES_FK1Foreign_KeynullWTPWT_TEST_RUNSWT_TEST_RUNS_PKNO ACTIONENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:13nullnullnullnull
    WT_DBOUT_PROFILES_NN1Check"TEST_RUN_ID" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:13nullnullnullnull
    WT_DBOUT_PROFILES_NN2Check"LINE" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:13nullnullnullnull
    WT_DBOUT_PROFILES_NN3Check"STATUS" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:13nullnullnullnull
    WT_DBOUT_PROFILES_NN4Check"TOTAL_OCCUR" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:13nullnullnullnull
    WT_DBOUT_PROFILES_NN5Check"TOTAL_USECS" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:13nullnullnullnull
    WT_DBOUT_PROFILES_NN6Check"MIN_USECS" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:13nullnullnullnull
    WT_DBOUT_PROFILES_NN7Check"MAX_USECS" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:13nullnullnullnull
    WT_DBOUT_PROFILES_NN8Check"TEXT" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:13nullnullnullnull
    WT_DBOUT_PROFILES_PKPrimary_KeynullnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:13nullWT_DBOUT_PROFILES_PKnullnull
    -
    -
    -
    -
    -
    -

    Columns

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    STATUSnull
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    TEST_RUN_ID1
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    TEST_RUN_IDnull
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    LINEnull
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    STATUSnull
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    TOTAL_OCCURnull
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    TOTAL_USECSnull
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    MIN_USECSnull
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    MAX_USECSnull
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    TEXTnull
    -
    -
    -
    -
    - - - - - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    TEST_RUN_ID1
    LINE2
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    DELETEPUBLICNOWTPWT_DBOUT_PROFILES
    SELECTPUBLICNOWTPWT_DBOUT_PROFILES
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NAMEVALUE
    NUM_ROWSnull
    BLOCKSnull
    AVG_ROW_LENnull
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    LAST_ANALYZED_SINCEnull
    -
    -
    -
    -
    -
    -

    Column Statistics

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - -
    TRIGGER_NAMETRIGGER_TYPETRIGGER_OWNERTRIGGERING_EVENTSTATUSTABLE_NAME
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    WTPWT_PROFILERPACKAGE BODYWTPWT_DBOUT_PROFILESTABLE
    WTPWT_TEST_RUN_STATPACKAGE BODYWTPWT_DBOUT_PROFILESTABLE
    WTPWT_TEXT_REPORTPACKAGE BODYWTPWT_DBOUT_PROFILESTABLE
    WTPWT_TEST_RUN_STATPACKAGEWTPWT_DBOUT_PROFILESTABLE
    -
    -
    -
    -
    -
    -

    References

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NAMEVALUE
    CREATED29-JUN-2018 15:09:13
    LAST_DDL_TIME29-JUN-2018 15:21:14
    OWNERWTP
    TABLE_NAMEWT_DBOUT_PROFILES
    TABLESPACE_NAMEUSERS
    CLUSTER_NAMEnull
    IOT_NAMEnull
    STATUSVALID
    PCT_FREE0
    PCT_USEDnull
    INI_TRANS1
    MAX_TRANS255
    INITIAL_EXTENT65536
    NEXT_EXTENT1048576
    MIN_EXTENTS1
    MAX_EXTENTS2147483645
    PCT_INCREASEnull
    FREELISTSnull
    FREELIST_GROUPSnull
    LOGGINGYES
    BACKED_UPN
    NUM_ROWSnull
    BLOCKSnull
    EMPTY_BLOCKSnull
    AVG_SPACEnull
    CHAIN_CNTnull
    AVG_ROW_LENnull
    AVG_SPACE_FREELIST_BLOCKSnull
    NUM_FREELIST_BLOCKSnull
    DEGREE1
    INSTANCES1
    CACHEN
    TABLE_LOCKENABLED
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    PARTITIONEDNO
    IOT_TYPEnull
    OBJECT_ID_TYPEnull
    TABLE_TYPE_OWNERnull
    TABLE_TYPEnull
    TEMPORARYN
    SECONDARYN
    NESTEDNO
    BUFFER_POOLDEFAULT
    ROW_MOVEMENTDISABLED
    GLOBAL_STATSNO
    USER_STATSNO
    DURATIONnull
    SKIP_CORRUPTDISABLED
    MONITORINGYES
    CLUSTER_OWNERnull
    DEPENDENCIESDISABLED
    COMPRESSIONDISABLED
    COMPRESS_FORnull
    DROPPEDNO
    COMMENTSPL/SQL Profiler data for Database Object Under Test (DBOUT).
    -
    -
    -
    -
    - - - - - - - - - -
    PARTITION_NAMELAST_ANALYZEDNUM_ROWSBLOCKSSAMPLE_SIZEHIGH_VALUE
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - -
    INDEX_OWNERINDEX_NAMEUNIQUENESSSTATUSINDEX_TYPETEMPORARYPARTITIONEDFUNCIDX_STATUSJOIN_INDEXCOLUMNS
    WTPWT_DBOUT_PROFILES_PKUNIQUEVALIDNORMALNNOnullNOTEST_RUN_ID, LINE
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONCOLUMN_LENGTHCHAR_LENGTHDESCENDCOLUMN_EXPRESSION
    WTPWT_DBOUT_PROFILES_PKWTPWT_DBOUT_PROFILESTEST_RUN_ID1220ASCnull
    WTPWT_DBOUT_PROFILES_PKWTPWT_DBOUT_PROFILESLINE2220ASCnull
    -
    -
    -
    -
    -
    -
    - - diff --git a/docs/core/DBDocs/table/WT_DBOUT_PROFILES/headerBg.jpg b/docs/core/DBDocs/table/WT_DBOUT_PROFILES/headerBg.jpg deleted file mode 100644 index 69df3af4d8445b259f94c4f787e913f812704db6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13911 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 diff --git a/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topDimTabR.gif b/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topDimTabR.gif deleted file mode 100644 index 3233a6e58473a5d8b6c9c273d2cdc563cfdb0382..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht diff --git a/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topTabBg.gif b/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topTabBg.gif deleted file mode 100644 index f8b692b7a181cddb49590c86d7e6e99d3f549b6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} diff --git a/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topTabR.gif b/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topTabR.gif deleted file mode 100644 index d24e5eb9739ea67df271b693d03d235e861222b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue - - - - - - - -
    -
    -
    -

    Columns

    -
    -
    -
    -
    -

    Constraints

    -
    -
    -
    -
    -

    Grants

    -
    -
    -
    -
    -

    Statistics

    -
    -
    -
    -
    -

    Triggers

    -
    -
    -
    -
    -

    Dependencies

    -
    -
    -
    -
    -

    Details

    -
    -
    -
    -
    -

    Partitions

    -
    -
    -
    -
    -

    Indexes

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    COLUMN_NAMEDATA_TYPENULLABLEDATA_DEFAULTCOLUMN_IDCOMMENTS
    TEST_RUN_IDNUMBER(38,0)Nonull1Foreign Key for the Test Run, Primary Key part 1.
    RESULT_SEQNUMBER(8,0)Nonull2Sequence number for this Result, Primary Key part 2.
    EXECUTED_DTMTIMESTAMP(6)Nonull3Date/Time (with Fractional Seconds) this Result was captured
    INTERVAL_MSECSNUMBER(10,3)Nonull4Interval time in milliseonds since the previous Result or start ot the Test Run.
    ASSERTIONVARCHAR2(15 BYTE)Nonull5Name of the Assertion Test performed
    STATUSVARCHAR2(4 BYTE)Nonull6Passed/Failed Status from the Assertion
    DETAILSVARCHAR2(4000 BYTE)Nonull7Assertion Details, i.e. Expected Value and Actual Value
    TESTCASEVARCHAR2(50 BYTE)Yesnull8Optional Test Case name.
    MESSAGEVARCHAR2(200 BYTE)Yesnull9Optional test identifier that helps connect an Assertion to the Test Runner.
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CONSTRAINT_NAMECONSTRAINT_TYPESEARCH_CONDITIONR_OWNERR_TABLE_NAMER_CONSTRAINT_NAMEDELETE_RULESTATUSDEFERRABLEVALIDATEDGENERATEDBADRELYLAST_CHANGEINDEX_OWNERINDEX_NAMEINVALIDVIEW_RELATED
    WT_RESULTS_CK1Checkstatus in ('PASS','FAIL')nullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_RESULTS_FK1Foreign_KeynullWTPWT_TEST_RUNSWT_TEST_RUNS_PKNO ACTIONENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_RESULTS_NN2Check"TEST_RUN_ID" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_RESULTS_NN3Check"RESULT_SEQ" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_RESULTS_NN4Check"EXECUTED_DTM" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_RESULTS_NN5Check"INTERVAL_MSECS" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_RESULTS_NN6Check"ASSERTION" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_RESULTS_NN7Check"STATUS" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_RESULTS_NN8Check"DETAILS" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_RESULTS_PKPrimary_KeynullnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullWT_RESULTS_PKnullnull
    -
    -
    -
    -
    -
    -

    Columns

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    STATUSnull
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    TEST_RUN_ID1
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    TEST_RUN_IDnull
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    RESULT_SEQnull
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    EXECUTED_DTMnull
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    INTERVAL_MSECSnull
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    ASSERTIONnull
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    STATUSnull
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    DETAILSnull
    -
    -
    -
    -
    - - - - - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    TEST_RUN_ID1
    RESULT_SEQ2
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    DELETEPUBLICNOWTPWT_RESULTS
    SELECTPUBLICNOWTPWT_RESULTS
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NAMEVALUE
    NUM_ROWSnull
    BLOCKSnull
    AVG_ROW_LENnull
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    LAST_ANALYZED_SINCEnull
    -
    -
    -
    -
    -
    -

    Column Statistics

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - -
    TRIGGER_NAMETRIGGER_TYPETRIGGER_OWNERTRIGGERING_EVENTSTATUSTABLE_NAME
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    WTPWT_RESULTPACKAGE BODYWTPWT_RESULTSTABLE
    WTPWT_ASSERTPACKAGE BODYWTPWT_RESULTSTABLE
    WTPWT_TEST_RUN_STATPACKAGE BODYWTPWT_RESULTSTABLE
    WTPWT_TEXT_REPORTPACKAGE BODYWTPWT_RESULTSTABLE
    WTPWT_ASSERTPACKAGEWTPWT_RESULTSTABLE
    WTPWT_TEST_RUN_STATPACKAGEWTPWT_RESULTSTABLE
    WTPWT_TEXT_REPORTPACKAGEWTPWT_RESULTSTABLE
    WTPWT_RESULTPACKAGEWTPWT_RESULTSTABLE
    -
    -
    -
    -
    -
    -

    References

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NAMEVALUE
    CREATED29-JUN-2018 15:09:12
    LAST_DDL_TIME29-JUN-2018 15:21:14
    OWNERWTP
    TABLE_NAMEWT_RESULTS
    TABLESPACE_NAMEUSERS
    CLUSTER_NAMEnull
    IOT_NAMEnull
    STATUSVALID
    PCT_FREE0
    PCT_USEDnull
    INI_TRANS1
    MAX_TRANS255
    INITIAL_EXTENT65536
    NEXT_EXTENT1048576
    MIN_EXTENTS1
    MAX_EXTENTS2147483645
    PCT_INCREASEnull
    FREELISTSnull
    FREELIST_GROUPSnull
    LOGGINGYES
    BACKED_UPN
    NUM_ROWSnull
    BLOCKSnull
    EMPTY_BLOCKSnull
    AVG_SPACEnull
    CHAIN_CNTnull
    AVG_ROW_LENnull
    AVG_SPACE_FREELIST_BLOCKSnull
    NUM_FREELIST_BLOCKSnull
    DEGREE1
    INSTANCES1
    CACHEN
    TABLE_LOCKENABLED
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    PARTITIONEDNO
    IOT_TYPEnull
    OBJECT_ID_TYPEnull
    TABLE_TYPE_OWNERnull
    TABLE_TYPEnull
    TEMPORARYN
    SECONDARYN
    NESTEDNO
    BUFFER_POOLDEFAULT
    ROW_MOVEMENTDISABLED
    GLOBAL_STATSNO
    USER_STATSNO
    DURATIONnull
    SKIP_CORRUPTDISABLED
    MONITORINGYES
    CLUSTER_OWNERnull
    DEPENDENCIESDISABLED
    COMPRESSIONDISABLED
    COMPRESS_FORnull
    DROPPEDNO
    COMMENTSResults data from Test Runs.
    -
    -
    -
    -
    - - - - - - - - - -
    PARTITION_NAMELAST_ANALYZEDNUM_ROWSBLOCKSSAMPLE_SIZEHIGH_VALUE
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - -
    INDEX_OWNERINDEX_NAMEUNIQUENESSSTATUSINDEX_TYPETEMPORARYPARTITIONEDFUNCIDX_STATUSJOIN_INDEXCOLUMNS
    WTPWT_RESULTS_PKUNIQUEVALIDNORMALNNOnullNOTEST_RUN_ID, RESULT_SEQ
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONCOLUMN_LENGTHCHAR_LENGTHDESCENDCOLUMN_EXPRESSION
    WTPWT_RESULTS_PKWTPWT_RESULTSTEST_RUN_ID1220ASCnull
    WTPWT_RESULTS_PKWTPWT_RESULTSRESULT_SEQ2220ASCnull
    -
    -
    -
    -
    -
    -
    - - diff --git a/docs/core/DBDocs/table/WT_RESULTS/headerBg.jpg b/docs/core/DBDocs/table/WT_RESULTS/headerBg.jpg deleted file mode 100644 index 69df3af4d8445b259f94c4f787e913f812704db6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13911 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
    nZDH?O8gS~#y@TeK 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 diff --git a/docs/core/DBDocs/table/WT_RESULTS/topDimTabR.gif b/docs/core/DBDocs/table/WT_RESULTS/topDimTabR.gif deleted file mode 100644 index 3233a6e58473a5d8b6c9c273d2cdc563cfdb0382..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht diff --git a/docs/core/DBDocs/table/WT_RESULTS/topTabBg.gif b/docs/core/DBDocs/table/WT_RESULTS/topTabBg.gif deleted file mode 100644 index f8b692b7a181cddb49590c86d7e6e99d3f549b6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} diff --git a/docs/core/DBDocs/table/WT_RESULTS/topTabR.gif b/docs/core/DBDocs/table/WT_RESULTS/topTabR.gif deleted file mode 100644 index d24e5eb9739ea67df271b693d03d235e861222b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wueUSER NAME null null -29-JUN-2018 15:21:13 +25-NOV-2018 19:55:40 null WT_SELF_TEST_PK null @@ -204,27 +204,27 @@ NUM_ROWS -null +2 BLOCKS -null +5 AVG_ROW_LEN -null +179 SAMPLE_SIZE -null +2 LAST_ANALYZED -null +25-NOV-2018 20:04:09 LAST_ANALYZED_SINCE -null +25-NOV-2018 20:04:09
    @@ -281,8 +281,7 @@ l_junk number; begin l_junk := 1; -end; -
    +end;
    @@ -301,16 +300,16 @@ WTP -WT_ASSERT -PACKAGE BODY +WT_SELF_TEST$TEST +TRIGGER WTP WT_SELF_TEST TABLE WTP -WT_SELF_TEST$TEST -TRIGGER +WT_ASSERT +PACKAGE BODY WTP WT_SELF_TEST TABLE @@ -412,11 +411,11 @@ CREATED -29-JUN-2018 15:21:13 +25-NOV-2018 19:55:40 LAST_DDL_TIME -29-JUN-2018 15:21:13 +25-NOV-2018 19:55:40 OWNER @@ -496,35 +495,35 @@ NUM_ROWS -null +2 BLOCKS -null +5 EMPTY_BLOCKS -null +0 AVG_SPACE -null +0 CHAIN_CNT -null +0 AVG_ROW_LEN -null +179 AVG_SPACE_FREELIST_BLOCKS -null +0 NUM_FREELIST_BLOCKS -null +0 DEGREE @@ -544,11 +543,11 @@ SAMPLE_SIZE -null +2 LAST_ANALYZED -null +25-NOV-2018 20:04:09 PARTITIONED @@ -592,7 +591,7 @@ GLOBAL_STATS -NO +YES USER_STATS diff --git a/docs/core/DBDocs/table/WT_TESTCASE_STATS/headerBg.jpg b/docs/core/DBDocs/table/WT_TESTCASE_STATS/headerBg.jpg deleted file mode 100644 index 69df3af4d8445b259f94c4f787e913f812704db6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13911 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 diff --git a/docs/core/DBDocs/table/WT_TESTCASE_STATS/topDimTabR.gif b/docs/core/DBDocs/table/WT_TESTCASE_STATS/topDimTabR.gif deleted file mode 100644 index 3233a6e58473a5d8b6c9c273d2cdc563cfdb0382..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht diff --git a/docs/core/DBDocs/table/WT_TESTCASE_STATS/topTabBg.gif b/docs/core/DBDocs/table/WT_TESTCASE_STATS/topTabBg.gif deleted file mode 100644 index f8b692b7a181cddb49590c86d7e6e99d3f549b6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} diff --git a/docs/core/DBDocs/table/WT_TESTCASE_STATS/topTabR.gif b/docs/core/DBDocs/table/WT_TESTCASE_STATS/topTabR.gif deleted file mode 100644 index d24e5eb9739ea67df271b693d03d235e861222b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue - - - - - - - -
    -
    -
    -

    Columns

    -
    -
    -
    -
    -

    Constraints

    -
    -
    -
    -
    -

    Grants

    -
    -
    -
    -
    -

    Statistics

    -
    -
    -
    -
    -

    Triggers

    -
    -
    -
    -
    -

    Dependencies

    -
    -
    -
    -
    -

    Details

    -
    -
    -
    -
    -

    Partitions

    -
    -
    -
    -
    -

    Indexes

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    COLUMN_NAMEDATA_TYPENULLABLEDATA_DEFAULTCOLUMN_IDCOMMENTS
    IDNUMBER(38,0)Nonull1Primary (Surrogate) Key for each Test Run
    START_DTMTIMESTAMP(6)Nonull2Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 1
    RUNNER_NAMEVARCHAR2(128 BYTE)Nonull3Name of the package with the WTPLSQL_RUN procedure. Natural Key 1 part 2
    RUNNER_OWNERVARCHAR2(128 BYTE)Nonull4Owner of the package with the WTPLSQL_RUN procedure. Natural Key 2 part 3
    DBOUT_OWNERVARCHAR2(128 BYTE)Yesnull5Optional Owner of the Database Object Under Test (DBOUT).
    DBOUT_NAMEVARCHAR2(128 BYTE)Yesnull6Optional Name of the Database Object Under Test (DBOUT).
    DBOUT_TYPEVARCHAR2(20 BYTE)Yesnull7Optional Type of the Database Object Under Test (DBOUT).
    TRIGGER_OFFSETNUMBERYesnull8Optional calculated offset from start of Trigger Source to start of Trigger PL/SQL Block.
    PROFILER_RUNIDNUMBERYesnull9Optional DBMS_PROFILER unique run identifier from plsql_profiler_runnumber sequence
    END_DTMTIMESTAMP(6)Yesnull10Date/time (and fractional seconds) this Test Run ended.
    ERROR_MESSAGEVARCHAR2(4000 BYTE)Yesnull11Optional Last error messages from this Test Run.
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CONSTRAINT_NAMECONSTRAINT_TYPESEARCH_CONDITIONR_OWNERR_TABLE_NAMER_CONSTRAINT_NAMEDELETE_RULESTATUSDEFERRABLEVALIDATEDGENERATEDBADRELYLAST_CHANGEINDEX_OWNERINDEX_NAMEINVALIDVIEW_RELATED
    WT_TEST_RUNS_FK1Foreign_KeynullWTPPLSQL_PROFILER_RUNSSYS_C0020883NO ACTIONDISABLEDNOT DEFERRABLENOT VALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_TEST_RUNS_NK1UniquenullnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullWT_TEST_RUNS_NK1nullnull
    WT_TEST_RUNS_NN1Check"ID" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_TEST_RUNS_NN2Check"START_DTM" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_TEST_RUNS_NN3Check"RUNNER_NAME" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_TEST_RUNS_NN4Check"RUNNER_OWNER" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullnullnullnull
    WT_TEST_RUNS_PKPrimary_KeynullnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:09:12nullWT_TEST_RUNS_PKnullnull
    -
    -
    -
    -
    -
    -

    Columns

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    PROFILER_RUNID1
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    START_DTM1
    RUNNER_NAME2
    RUNNER_OWNER3
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    IDnull
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    START_DTMnull
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    RUNNER_NAMEnull
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    RUNNER_OWNERnull
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    ID1
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    DELETEPUBLICNOWTPWT_TEST_RUNS
    INSERTPUBLICNOWTPWT_TEST_RUNS
    SELECTPUBLICNOWTPWT_TEST_RUNS
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NAMEVALUE
    NUM_ROWSnull
    BLOCKSnull
    AVG_ROW_LENnull
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    LAST_ANALYZED_SINCEnull
    -
    -
    -
    -
    -
    -

    Column Statistics

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - -
    TRIGGER_NAMETRIGGER_TYPETRIGGER_OWNERTRIGGERING_EVENTSTATUSTABLE_NAME
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    WTPWT_RESULTPACKAGE BODYWTPWT_TEST_RUNSTABLE
    WTPWT_PROFILERPACKAGE BODYWTPWT_TEST_RUNSTABLE
    WTPWT_TEXT_REPORTPACKAGE BODYWTPWT_TEST_RUNSTABLE
    PUBLICWT_TEST_RUNSSYNONYMWTPWT_TEST_RUNSTABLE
    WTPWTPLSQLPACKAGE BODYWTPWT_TEST_RUNSTABLE
    WTPWT_RESULTPACKAGEWTPWT_TEST_RUNSTABLE
    WTPWT_TEXT_REPORTPACKAGEWTPWT_TEST_RUNSTABLE
    -
    -
    -
    -
    -
    -

    References

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NAMEVALUE
    CREATED29-JUN-2018 15:09:12
    LAST_DDL_TIME29-JUN-2018 15:09:12
    OWNERWTP
    TABLE_NAMEWT_TEST_RUNS
    TABLESPACE_NAMEUSERS
    CLUSTER_NAMEnull
    IOT_NAMEnull
    STATUSVALID
    PCT_FREE0
    PCT_USEDnull
    INI_TRANS1
    MAX_TRANS255
    INITIAL_EXTENT65536
    NEXT_EXTENT1048576
    MIN_EXTENTS1
    MAX_EXTENTS2147483645
    PCT_INCREASEnull
    FREELISTSnull
    FREELIST_GROUPSnull
    LOGGINGYES
    BACKED_UPN
    NUM_ROWSnull
    BLOCKSnull
    EMPTY_BLOCKSnull
    AVG_SPACEnull
    CHAIN_CNTnull
    AVG_ROW_LENnull
    AVG_SPACE_FREELIST_BLOCKSnull
    NUM_FREELIST_BLOCKSnull
    DEGREE1
    INSTANCES1
    CACHEN
    TABLE_LOCKENABLED
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    PARTITIONEDNO
    IOT_TYPEnull
    OBJECT_ID_TYPEnull
    TABLE_TYPE_OWNERnull
    TABLE_TYPEnull
    TEMPORARYN
    SECONDARYN
    NESTEDNO
    BUFFER_POOLDEFAULT
    ROW_MOVEMENTDISABLED
    GLOBAL_STATSNO
    USER_STATSNO
    DURATIONnull
    SKIP_CORRUPTDISABLED
    MONITORINGYES
    CLUSTER_OWNERnull
    DEPENDENCIESDISABLED
    COMPRESSIONDISABLED
    COMPRESS_FORnull
    DROPPEDNO
    COMMENTSTest Run data for each execution of the WTPLSQL_RUN procedure.
    -
    -
    -
    -
    - - - - - - - - - -
    PARTITION_NAMELAST_ANALYZEDNUM_ROWSBLOCKSSAMPLE_SIZEHIGH_VALUE
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    INDEX_OWNERINDEX_NAMEUNIQUENESSSTATUSINDEX_TYPETEMPORARYPARTITIONEDFUNCIDX_STATUSJOIN_INDEXCOLUMNS
    WTPWT_TEST_RUNS_PKUNIQUEVALIDNORMALNNOnullNOID
    WTPWT_TEST_RUNS_NK1UNIQUEVALIDNORMALNNOnullNOSTART_DTM, RUNNER_NAME, RUNNER_OWNER
    WTPWT_TEST_RUNS_IDX1NONUNIQUEVALIDNORMALNNOnullNOSTART_DTM
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONCOLUMN_LENGTHCHAR_LENGTHDESCENDCOLUMN_EXPRESSION
    WTPWT_TEST_RUNS_PKWTPWT_TEST_RUNSID1220ASCnull
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONCOLUMN_LENGTHCHAR_LENGTHDESCENDCOLUMN_EXPRESSION
    WTPWT_TEST_RUNS_NK1WTPWT_TEST_RUNSSTART_DTM1110ASCnull
    WTPWT_TEST_RUNS_NK1WTPWT_TEST_RUNSRUNNER_NAME2128128ASCnull
    WTPWT_TEST_RUNS_NK1WTPWT_TEST_RUNSRUNNER_OWNER3128128ASCnull
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONCOLUMN_LENGTHCHAR_LENGTHDESCENDCOLUMN_EXPRESSION
    WTPWT_TEST_RUNS_IDX1WTPWT_TEST_RUNSSTART_DTM1110ASCnull
    -
    -
    -
    -
    -
    -
    - - diff --git a/docs/core/DBDocs/table/WT_TEST_RUNS/headerBg.jpg b/docs/core/DBDocs/table/WT_TEST_RUNS/headerBg.jpg deleted file mode 100644 index 69df3af4d8445b259f94c4f787e913f812704db6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13911 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
    nZDH?O8gS~#y@TeK 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 diff --git a/docs/core/DBDocs/table/WT_TEST_RUNS/topDimTabR.gif b/docs/core/DBDocs/table/WT_TEST_RUNS/topDimTabR.gif deleted file mode 100644 index 3233a6e58473a5d8b6c9c273d2cdc563cfdb0382..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht diff --git a/docs/core/DBDocs/table/WT_TEST_RUNS/topTabBg.gif b/docs/core/DBDocs/table/WT_TEST_RUNS/topTabBg.gif deleted file mode 100644 index f8b692b7a181cddb49590c86d7e6e99d3f549b6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} diff --git a/docs/core/DBDocs/table/WT_TEST_RUNS/topTabR.gif b/docs/core/DBDocs/table/WT_TEST_RUNS/topTabR.gif deleted file mode 100644 index d24e5eb9739ea67df271b693d03d235e861222b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue - - - - - - - -
    -
    -
    -

    Columns

    -
    -
    -
    -
    -

    Constraints

    -
    -
    -
    -
    -

    Grants

    -
    -
    -
    -
    -

    Statistics

    -
    -
    -
    -
    -

    Triggers

    -
    -
    -
    -
    -

    Dependencies

    -
    -
    -
    -
    -

    Details

    -
    -
    -
    -
    -

    Partitions

    -
    -
    -
    -
    -

    Indexes

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    COLUMN_NAMEDATA_TYPENULLABLEDATA_DEFAULTCOLUMN_IDCOMMENTS
    TEST_RUN_IDNUMBER(38,0)Nonull1Primary (Surrogate) Key for each Test Run. Also the Test Runs foreign key.
    TEST_YIELDNUMBERYesnull2Ratio of successful assertions to total assertions.
    ASSERTSNUMBERYesnull3Total number of assetions.
    PASSESNUMBERYesnull4Number of passed assertions.
    FAILURESNUMBERYesnull5Number of failed assertions.
    ERRORSNUMBERYesnull6Number of errored assertions.
    TESTCASESNUMBERYesnull7Total number of test cases.
    MIN_INTERVAL_MSECSNUMBERYesnull8Minimum interval time between assertions in milliseconds
    AVG_INTERVAL_MSECSNUMBERYesnull9Average interval time between assertions in milliseconds
    MAX_INTERVAL_MSECSNUMBERYesnull10Maximum interval time between assertions in milliseconds
    TOT_INTERVAL_MSECSNUMBERYesnull11Total (Sum) of interval times between assertions in milliseconds
    CODE_COVERAGENUMBERYesnull12Ratio of execute source lines to valid executable source lines.
    PROFILED_LINESNUMBERYesnull13Total number of source lines as counted by DBMS_PROFILER
    EXECUTED_LINESNUMBERYesnull14Number of source lines executed
    IGNORED_LINESNUMBERYesnull15Number of source lines ignored as uncountable
    EXCLUDED_LINESNUMBERYesnull16Number of source lines excluded due to unexplained DBMS_PROFILER metrics
    NOTEXEC_LINESNUMBERYesnull17Number of source lines not execute
    UNKNOWN_LINESNUMBERYesnull18Number of source lines that have unexplained DBMS_PROFILER metrics
    MIN_EXECUTED_USECSNUMBERYesnull19Minumum execution time for a line of source in microseconds
    AVG_EXECUTED_USECSNUMBERYesnull20Average execution time for a line of source in microseconds
    MAX_EXECUTED_USECSNUMBERYesnull21Maximum execution time for a line of source in microseconds
    TOT_EXECUTED_USECSNUMBERYesnull22Total (Sum) of execution times for a line of source in microseconds
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CONSTRAINT_NAMECONSTRAINT_TYPESEARCH_CONDITIONR_OWNERR_TABLE_NAMER_CONSTRAINT_NAMEDELETE_RULESTATUSDEFERRABLEVALIDATEDGENERATEDBADRELYLAST_CHANGEINDEX_OWNERINDEX_NAMEINVALIDVIEW_RELATED
    WT_TEST_RUN_STATS_FK1Foreign_KeynullWTPWT_TEST_RUNSWT_TEST_RUNS_PKNO ACTIONENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:21:12nullnullnullnull
    WT_TEST_RUN_STATS_NN1Check"TEST_RUN_ID" IS NOT NULLnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:21:12nullnullnullnull
    WT_TEST_RUN_STATS_PKPrimary_KeynullnullnullnullnullENABLEDNOT DEFERRABLEVALIDATEDUSER NAMEnullnull29-JUN-2018 15:21:12nullWT_TEST_RUN_STATS_PKnullnull
    -
    -
    -
    -
    -
    -

    Columns

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    TEST_RUN_ID1
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    TEST_RUN_IDnull
    -
    -
    -
    -
    - - - - - - - - -
    COLUMN_NAMECOLUMN_POSITION
    TEST_RUN_ID1
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    DELETEPUBLICNOWTPWT_TEST_RUN_STATS
    SELECTPUBLICNOWTPWT_TEST_RUN_STATS
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NAMEVALUE
    NUM_ROWSnull
    BLOCKSnull
    AVG_ROW_LENnull
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    LAST_ANALYZED_SINCEnull
    -
    -
    -
    -
    -
    -

    Column Statistics

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - -
    TRIGGER_NAMETRIGGER_TYPETRIGGER_OWNERTRIGGERING_EVENTSTATUSTABLE_NAME
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    WTPWT_TEST_RUN_STATPACKAGE BODYWTPWT_TEST_RUN_STATSTABLE
    WTPWT_TEXT_REPORTPACKAGE BODYWTPWT_TEST_RUN_STATSTABLE
    -
    -
    -
    -
    -
    -

    References

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NAMEVALUE
    CREATED29-JUN-2018 15:21:12
    LAST_DDL_TIME29-JUN-2018 15:21:13
    OWNERWTP
    TABLE_NAMEWT_TEST_RUN_STATS
    TABLESPACE_NAMEUSERS
    CLUSTER_NAMEnull
    IOT_NAMEnull
    STATUSVALID
    PCT_FREE0
    PCT_USEDnull
    INI_TRANS1
    MAX_TRANS255
    INITIAL_EXTENT65536
    NEXT_EXTENT1048576
    MIN_EXTENTS1
    MAX_EXTENTS2147483645
    PCT_INCREASEnull
    FREELISTSnull
    FREELIST_GROUPSnull
    LOGGINGYES
    BACKED_UPN
    NUM_ROWSnull
    BLOCKSnull
    EMPTY_BLOCKSnull
    AVG_SPACEnull
    CHAIN_CNTnull
    AVG_ROW_LENnull
    AVG_SPACE_FREELIST_BLOCKSnull
    NUM_FREELIST_BLOCKSnull
    DEGREE1
    INSTANCES1
    CACHEN
    TABLE_LOCKENABLED
    SAMPLE_SIZEnull
    LAST_ANALYZEDnull
    PARTITIONEDNO
    IOT_TYPEnull
    OBJECT_ID_TYPEnull
    TABLE_TYPE_OWNERnull
    TABLE_TYPEnull
    TEMPORARYN
    SECONDARYN
    NESTEDNO
    BUFFER_POOLDEFAULT
    ROW_MOVEMENTDISABLED
    GLOBAL_STATSNO
    USER_STATSNO
    DURATIONnull
    SKIP_CORRUPTDISABLED
    MONITORINGYES
    CLUSTER_OWNERnull
    DEPENDENCIESDISABLED
    COMPRESSIONDISABLED
    COMPRESS_FORnull
    DROPPEDNO
    COMMENTSTest Run data statistics for each execution of the WTPLSQL_RUN procedure.
    -
    -
    -
    -
    - - - - - - - - - -
    PARTITION_NAMELAST_ANALYZEDNUM_ROWSBLOCKSSAMPLE_SIZEHIGH_VALUE
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - -
    INDEX_OWNERINDEX_NAMEUNIQUENESSSTATUSINDEX_TYPETEMPORARYPARTITIONEDFUNCIDX_STATUSJOIN_INDEXCOLUMNS
    WTPWT_TEST_RUN_STATS_PKUNIQUEVALIDNORMALNNOnullNOTEST_RUN_ID
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONCOLUMN_LENGTHCHAR_LENGTHDESCENDCOLUMN_EXPRESSION
    WTPWT_TEST_RUN_STATS_PKWTPWT_TEST_RUN_STATSTEST_RUN_ID1220ASCnull
    -
    -
    -
    -
    -
    -
    - - diff --git a/docs/core/DBDocs/table/WT_TEST_RUN_STATS/headerBg.jpg b/docs/core/DBDocs/table/WT_TEST_RUN_STATS/headerBg.jpg deleted file mode 100644 index 69df3af4d8445b259f94c4f787e913f812704db6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13911 zcma)jbzD>7_wZ;XMHtPH76ua1g5-vb5*RhQq(x$s3P?#KF_4mm(IFry-Q7q@juc4= ziFba#@B91x`=0x`_c=S~-ltAH=ZW3T-K_u~z@REn01hqyV2!;1cl!WJC8U+34*&;% z4*&q5SkeK2T;AHn(gtANhNa-#EdYW6_;~*S`@|>2$KFH)`1k}w_Xr7z2np{I-@A{6 zd&I<~{{Z_WBO@iH{0G$k1335u1ow#UQ4kYTP?M9B{}28D8@X!(P~HPr6BOg&Py%o% zaquW{?z#Xm0017&KfqS>zkq{_2f!yFB*OVG;VR_Xde zAL&6%ZF)n-z$l5H!VINx&MA|zHh=<;3pVE@~Dm^gZuW6af!^|kW2K@`6{lsK%V zH*IFtn5!t9=4+MRBAi`kW7z~xIRTtAd5HAsrQZH4C5+TbxEZ?rcF-l9V%Bih>gK`h z#(mc6$u{s1V|+D#Q5mNbq1jM>W?9yDHMCG?{7P85XS-jdj=(M=ZJ@@i! zcw0%Y)}a3!o3>xNG&Y3$lUSH+K6-mO^yPkO?$zbs9e z{}*#jVJvGkvgTlB%^=AqBKh3%ed3KPGbU&pTpR9upqfN{pY zb$*U5X7ANN>7m9kD=M0w&MmkP?73HaPruC`=lKZiUW9Gw|8Z$9aHCCVRReFe(Cd7Z zHS?d)-qJK|b=x9;`&0kAP+*9ob;EDJ;e_Y+xpp$9%)ej2)A-Uq-`2k|>JA{4MAFZ# z2G(&_TkdoF)|Fc|{tn=pccD3{a=d#7NR7Syb5e0uI4kCO2N;!Amo2H7_y1dN zRKAeRa|h_(Fgta>inuNLOLSQ%ldt;KfG?l*4q!%g&64@Y`$X~%Fx=M=d$nxgvwlY9 zEA4Uu5{UCEJgQCZO2-oXBEXBScYvIAkE_kUec%1HSbk_!xXHG--~2w0dv}}TU!7sP z!FdPp^=r!f&2@RB^fUh^!>r}z$JIfStgtLg-rv1HE)6Y^8^c+FHOu}h&F`(w=i()I z08jq|>`&0uP3)4X>g_(tf2xyv+jsBW(5=GX&5^uR*e`O{tnP2gbjL>JLH8#tNBN+< z;*#@r>+gSGR6KBTbTd1!NH~@GC*Xf_KNmcagdG(BC!|L(76SKU7=>=60yz9INM5x0F7uU!ORS9>{u1hgIK> zo`3Zp<#RMPG^ETR-Wo?Sgu5 z%GpnK3DYlsuf1Jmqe8-~oxbGH)WVcv_Tf_XeYfH3B$izdfx}|r)0t=a2Up2_5KIfX zESod$2x7J2_Gr-^$%nPno#4%bek-Ki5=u746lJ~stU$-Dz5l#Bkgwc+E^1Hj=7)Rn zgNC-qUNaq)vqFB?(c>NN3&!(T2|EJEGw*qyuDh{)byF>|NY~XYb6GM(3F z512Y_?FaHcu|C$i&U zJ4fKSK^6y`y35-@>Gdq!n|LLbg7M2nGRn#wvBuWT?mnjoj2?AmL1nw+vu=*R#u%*N z(MFHl=751w%XsRM3hRATkDoF49j;Y)6CQB)!7qR!UWBjU`) z;aRov*WR^-x=H^C#a@c{^QWvLXnuEtoseJmYco;VUJYW&DBa}^dmoWk41OBr&Eex4 zx;^}Kd9V2Sq#D#!#wEec%ZkP;<(op~tiFzt>`jZ2x*^Bkig??ju43dv^|eJqqA`$; zo)fl6ydj|vm;*e#A>m{4LzehwjU>7o-=Vi`(>@}u)+Mxo+)yd!9A^!w>`-e&8cozr z9Kj~Ubt_W4I&c6fTdWFM_fr`LOhO{A zzYDp_`P0nT6aDuI#%s6dh9;Qpt3j#S9iR&JTR&Pf-#6hGsxWE-$@M4Ig}V=7z`Nm4 zRk-u1rgB*g2$CxNgl(`Lx)QfX|Jj-8#&%W4)E(drsf!>fi>Q$16d_&{ITQSH}1{c5q_k1cax1VV* zRFzc3#_m{IpgXh6S7^MqL213*Wz4ttJ9AZ9KiRMkLfr9-Md@#1=;qV$wR_Da8=A~Y zqx}g6I93+MFg|;Pwt@1Kpb7WIwH{U8WGT2$^A~)^f+^=`Wj=c#Zh?@x8s4+=pPAzu zCf__4I@DiAvVTkCeYjy3+0FAVyt(IVjJ@BPzcj-sEy`bWHv(he{kpK|xxK$W3>=qy z*e?sk`o~UvbUayDM-7>@LztDM;6vO51lHqZ0Gd;bVS$&KTYdsF6_DiWS#zReZKrsb=U4N-O76=ip7-JLD?qpV~gM1nEY% zlMF;`$y4z5?640UHWFaH%Yj@PGi8IE2AHv*b&WUfd!UjoYDfC9B)zT`*NK(IRPBpe zm;RT^59SF$naWv}eZoyjSKp3c|B+x}sd|*aTvI@61l{&>Vgx#ES z!>lD0)^xZUpOK*Z_l~@?h76Ir>cRtoaP{y!^%{~-P3@-gi*kP285^OqnQ1ZST&dwd zPA;XtD+@@=?_7Tu5WWNO)^>q1N7q)G-dB1Zow$u`%1@8-Na7h1&pigr;SFy5%rgOT zIdgdH+wcs>IhI2%uI(3*uj8gu-3`wdV{K#a%}2AL8#5kCylremiINzuqI#z?G?SH{ z2=i;AR>h!6{P)H9`Sks$6`=Gg7{IPtyi^i?dSIGgAUtXb$BnXogScbugeAdYtO3V( zCxJe0(c)wD2CqWTF)-xA#myn(Yf!@n^Mm)0{805XZdi)S872AFl+r?` zRuuNFP{Q*mMI!6~M84%31#V8t@+SF|luKvmwpQEaZTjM}##`v3a3vlys!#~j!6Y_( z^UZS}?RQ^O?r)s-N*ztNf6fEj-z<6cHHASlF$&cSOTN(mV$tl50=iQuS2O&i!cwTR$iMVR%16^Jcm1Irm^T``P z=Rn*IQx5Dd=+TGuKfB1;xjNxd3m2&3uDqWw$HQUk#a$wY-#u%)e5E5cMbp3&E<<~t z53eBuBZvM?F2pGGAvp24$St>hmSBgD-syh6q?h$vfvRp`Xpz{ zU_1CtmanbaK9}SV$Aq|E509RL=08P~-57(M_mv*vn7!Q8!v?XZVCH6zlh;PQOtqZT z;4hvzCsc;h3hxY>^;pZeCldB|qWnbKd|Q9H05AMWH@;inK0d=nUO1bZilkgMV}?Xu zc+7+y=@TdXD_syga%6j~o=w=aFEqG! zMIBDPq-3i;rDVg!>j1Unv~ZmjLdBH0JE=8#a9vF~O+}Jvfay=^P4%OGzO=O*FzKZ? zK)Qd&>tTkli_bP_JYSvKmDt>6bk8U56@R(wq$gCB*h<5EziST3cOMd%_WDCesA2PC z4Xz9UR}Kb`_ipq_ zquMERdA4RRJGyiAQ>ZPA1+@8}N^%BRbSl8Xlk)!V$_5KORscKo@7vPp!_LqwO#j@7%`d z_P}{tJ`wd6C*~;OH6{59;UXK5Lxnh1f%UlfUfNJVCG+Mi4hV096KxLO$Z7-m*nJEr z-|US)XW9TZrS`KG@}?(g?q*iyt-43(gMI4;4~tGXDikEyw#c~q>D@pfBaE8q&L>HV z*NXj&-8@z=&mWz!)&0_P_7}RELQdv9h#1ST^_7YkC($a@QX$c?Ux|PJqLv1YZjlMA z%_zliphju+LqzCb{`?{{Mk7+LPjDn>z>8_EI0tmP{FbL7{z50+W8i!>Q|5=l?R4oR zirvR;Urs1DZNM=v@|_hF`uWlJuk4#adUc0eHaarQ9pI%!%s$IYGM<9NGLdpi9-Kib zTVq1=t<=jfb4h_^cC1%`;(1ogQQ&zt;;g*J3E0$}dfKD;fS6|$7WgK53;GnC+y9{} z?CmRth$6&n6Yt*))cS8Im4w!-_G>r(* zp#hUvffy^eMwSQ9&mb`AtQA9%llBf8!!1A-C%j2bWV2iB;m8ZWk7aiNqC3DD=Y_3a zW2DX5P)o2w=y_JZhx}my$+$tFIHj>H@XyCqoMr!LP^Q589?1X|I z8)hh@oHto51x89hN~YTAql~pOawVO7R}gn+0aM~x2@MmbYzv+{WY9nY-s6n~hQW?~ zr583=q%?po$^Df!x+GH-Kow0qb+S$9mj(dVL}aIie5S5uZ&`ck1+ zUzS^DMBmMIe6+jYJ;6k2Z+&B}$uGwf8(wH^8f2s&C!pj@gPmvt2;1neo`jsUr~hTI zsLUT1GGT+%5rZoipp5#X42sypGKl@a__uJH3jL5ujS@P&&xG9S>!bqefoI&LW5HOR zC&r)uRcleG|G8LnlF{BbWnv~it8(qFkvA&hzG$K!UlG27TC@Fwi~+r@31#VnZ`)k) z+#5(7Yh*lDTw;Cf-cADfcBzHFO&GN%l9B^i)%9TpL85o#%6wB8kfB&b|5oLn=_=#)cNq|MAbYG15pUOX6? zEKrrXFV+Qdxh8-n^Lo$|godhpkyw2|rY9(3RK#1MDaSw-i6^TEC~m;16IdzM0HIa{DR^gE z+D>_Ifp|opdxD&x<1XX@Fw&Z`u~#NCa;Nd~g*-xXWiX#V1WFvlU^-KDeVdSt`Ql$T5f!9af z?^X!ZGYh}hVeY9@t!fqhj>e0WekoX=VTADlPm+Is-DEtnx)XBQxH{Moy%IWb+$<@f zogG%C+*dqG9uz0Z#8iTcgjQ~Nr>%-wkd8Zw4G#cJ$_=)QSduJIxQydb?{upEs_?abrr68 zs%v!_{5+fc${{k7qJ)z6bjElyc8x~<27a{lB;Q)|Y{Y7f+$5)S#3k| z$a(a7#3(a$miwck%8`fr9pGukt&RR?v$P!l5fwl4pC{&!%i67#sD|2dF0YTuvefy5 z<$0ziOxJPA9GU!=m+as(c4nr-#Bwop7fJPML?2mL8(DxLA)t*8XHlmEOrFgiS-i~u zkSDVMmHNmy@38rCcuzuZZ_FW>;FsN;VwdmpX&~ftf2l8tnc7+P`y7+;FeEiNC z5LNkwM|c6azvM#~bcG)Pfn&v{@2u zB=U^c%HISZ@ct1?7t0hev55!MVuY)gML_KrQkAtz%OCUE9l$N5zwKL!7#*`SN`KqF zG$F|M)q(~>w&&tA>}9H4*e+AKF%3+`hf;-4Ld^5V*ru~V1)g7P;g#%{Hg@K8B8<3T z4;tLM>Gv%?YM;%S6iFbjc9P{fCOt{HW&xk zK1CRbypalUTBcYe3~}4WX*G2+z+>Y1Vkg+X@kOyc-?EdC&iv2{C$`?)uF7KCgW<)F z>ADOU_%Yu*6cn%Sci64Oahh$AXJe*BoEW`A2(7h}(Qw@sg#{<^r5m${Z3s({4y@sb zJ6UUjm_HUU0%*+%=h&EYibQl2rsj~6td7ryq+d6pc0lkDOc7M}MY908Qd0g%$}+Rq zWvrg8TH~eEuamdQQWmrQvo0x%4U;6t9*T*ZMeYUS7^81q+~IDCs~c_^M!mS3*wwSa z`Xyg}GER>X<6~Vid$!kX(=|E>!i)%Kh(-b`qnWN&TVG~DmP%?N+<2t_%eVN1&N)#- z#SZMWG&uuMIsP@mMrm%h)>0#!;drprqc`ddGDDN%YBc$v%kCx==#bT*lZ>++TruFb z^1`6Vo`oQA)$IN$=*xs^=*)+bq}(S`CJ<-G2bs)l{LXyphTUV44mXP6hZj^ePI_Y2 zL0V2aosXvWU8s9=Epi?FLSSi@W8d6)zxTvf)$!%J^QJ<@>A?-WiJ5KMe{?U#tPV#9 zQoAN-S9F@P4boWGpEYj4A#u9TYTyF&KY&5ar%#}IZaa15{dWM8EWzEry^y9k^KREs z-_3>B)4ickPh|lU$aG2ENS?LrF8xA7ni-Ded!JZC+aO@j6qF+#mDB_d*y5i(V`BnRobBFNgYtHem#v;Qe`u1P4#7xTH+2wD z3aq8Z51-eU+ECvyRdkHY*vX6N7#L32Uea3~r)o?`cKp;)p(=JF)u@~2Qx4Ke75Q{_ zzc|r1IA?EHeN#K{7fMnuZk{C}gSJZ#^exgMWL7q}PV)X?t_&AGT^Uh~=GxRY3ec>M`y^b~3IW zmm-};PGeskJqh0N75>1v10lwJ&uFRmsisyp+fU6n8>qMUgVwT}E4|Q}gBUQ;Sehgsq@wN{N+MrjvFfN5OJc|m2`Mmp z9w4H<6X`fdq7G9f6D;m2b3A%51Iz6gzdWa*iQ(7U%mAFFdJM#7nJ2pD`xT#(+211pmeArS z4fFB>i~(&na772GN4&!TTWuK0rE9_NciT&>#ZjJM}N^waW zUu8dMs)3X0|7j@f$`JC9kIYnN9ubvFu=1Hq+KiA6tNJEVJg)pV0&o z)`BiAerOtEpxY-{p{%E`MnvhWE%ufHD&tw>J*UgIPToY@)5$A*COc>Lt=z6GXx=3@ zpE&U*qB3Fd;TdhMRgb2^rj1|BXIJ)k#nX-(6VG~*!W`hQ;n^QQZI90ooJVXo#u+zD zf9?PRfd&FP;4?Smc{%!!6`0&WyJKKhTk!4$|NV@q(K6U(NY<9)Rt;x&aaY5F;VI16 zCfY+_LFH8bXhz*!zu^0LCcO^d$6t9@+W>ZEGSu^(rpIW#DzN-eDep@PDm6K#-{Q9+9MFBN#fV8P?Xzzstm(!Nnl(ry;ggv{1c59`W=SZ`=r$rCqpTHVI6 zz=i!2kTh~kKL;DegR^OJCnClfGNDH~szyDm1xHyOr_Z!OG)eAJx}v;qiiX{dzc0Cp zrHgL`CnQ!02${9#5@YZt#%t%IZG26|`fYu+1+zsNoa^t^Fxe60FNET?=Q%!L&=VMeQ`wUjVs5m1Xhdx)JS zl!^So$;r*4iHP*(JiPQ9|#i~}Eb_e0UhvB1BcL?J^6Z!8P+HP!?w z!ZSq}Iwr#}h&NFm3X0M-ut4O*B0?=r6W54&!G+nlg3J)(|I9`tq+ zFO_-SVrmF>H6AsnRJY=kDB7CK%CD1wBG>Uw8HEZfM`6EKKb_i3I}yf4XOp?GXhTzs z_IcCP*G=y6Q?OW&@qRNQe06l6uM8mV^amd+c>%c2GZVdEH8R-UBwG1BS^Oqv(LfQ@ zb5nh;VP1Q%hUvSt$?lhvh>l6hoz*pza#490hw0a1jv(##5djDl1H&jfu3-BTR(I)XSG;g3(+1`Z*^q$7fE~@$gfTDBqZT8!0iJFQ}s?;Z2UMp6!o? zMc<`V1x`TG;C0bx-cY~zWR}X)EseL$b|OFJW)d1te3(3{Xc~QXwwCIuR47fDPPdNg z4%J3x8ohrcXG@tTN7qzZ&qq!~JVs< z>>n+z_(h!c)ksbwCkv*7C(vfOndM8K^{wGr=Agx!_n?q3&w0io7h)@N$7(GEObfgU zX-yil@tdkWD{Iao3=+@-!CU&F5NI{4SdwIo{dH{|y-MxXfFql>3g7O)beE0k`phRD znxoDsy)QA{F#VP8T%CAWy+Bwh4AXc5rz-i#*{g;#J(#rrDI;B(V?!Nz!Zgbf2b>;q zAF}+)zg5A!C{n&%|BoD9<(*C?xgwW8J2UrWdBzFQpTwAMJZ7MJ zySAP+$)sg@X3`|%Q+m*ZG*$g?#MUmOJS|e$c=m(fiKBp{jO}HqSMcytLwOG4kR5tO zCgS!TZk)9iyt;rJ+8$0{iU+X}Lu*8tRCP%lO$j_Y55iExC!S4R>pchiObIPvM8shY zZH^`~fGPjYACZU&Cq=!lAum^Ev~pfR%Ib=9^7CCe9NeN`;%`z0O5BTB=?wm4WtkH;QBdop@$&l7BdjJ*b87l)#q-%;H&Qyt&>JZ*@Zu+> znUgUWy`n>)2FGFwzJ{isI3{he>V>CiroHx7_9&MIkv8{ah6#PukKyA7&mYz#5qef* zeSr!Ux&=(fhNMAfeU2-9Nr`yIfW+UHSiK4rNz;9bljkb`F
    nZDH?O8gS~#y@TeK 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 diff --git a/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topDimTabR.gif b/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topDimTabR.gif deleted file mode 100644 index 3233a6e58473a5d8b6c9c273d2cdc563cfdb0382..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht diff --git a/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topTabBg.gif b/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topTabBg.gif deleted file mode 100644 index f8b692b7a181cddb49590c86d7e6e99d3f549b6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} diff --git a/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topTabR.gif b/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topTabR.gif deleted file mode 100644 index d24e5eb9739ea67df271b693d03d235e861222b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue7_wZ;XMHtPH76ua1g5-vb5*RhQq(x$s3P?#KF_4mm(IFry-Q7q@juc4= ziFba#@B91x`=0x`_c=S~-ltAH=ZW3T-K_u~z@REn01hqyV2!;1cl!WJC8U+34*&;% z4*&q5SkeK2T;AHn(gtANhNa-#EdYW6_;~*S`@|>2$KFH)`1k}w_Xr7z2np{I-@A{6 zd&I<~{{Z_WBO@iH{0G$k1335u1ow#UQ4kYTP?M9B{}28D8@X!(P~HPr6BOg&Py%o% zaquW{?z#Xm0017&KfqS>zkq{_2f!yFB*OVG;VR_Xde zAL&6%ZF)n-z$l5H!VINx&MA|zHh=<;3pVE@~Dm^gZuW6af!^|kW2K@`6{lsK%V zH*IFtn5!t9=4+MRBAi`kW7z~xIRTtAd5HAsrQZH4C5+TbxEZ?rcF-l9V%Bih>gK`h z#(mc6$u{s1V|+D#Q5mNbq1jM>W?9yDHMCG?{7P85XS-jdj=(M=ZJ@@i! zcw0%Y)}a3!o3>xNG&Y3$lUSH+K6-mO^yPkO?$zbs9e z{}*#jVJvGkvgTlB%^=AqBKh3%ed3KPGbU&pTpR9upqfN{pY zb$*U5X7ANN>7m9kD=M0w&MmkP?73HaPruC`=lKZiUW9Gw|8Z$9aHCCVRReFe(Cd7Z zHS?d)-qJK|b=x9;`&0kAP+*9ob;EDJ;e_Y+xpp$9%)ej2)A-Uq-`2k|>JA{4MAFZ# z2G(&_TkdoF)|Fc|{tn=pccD3{a=d#7NR7Syb5e0uI4kCO2N;!Amo2H7_y1dN zRKAeRa|h_(Fgta>inuNLOLSQ%ldt;KfG?l*4q!%g&64@Y`$X~%Fx=M=d$nxgvwlY9 zEA4Uu5{UCEJgQCZO2-oXBEXBScYvIAkE_kUec%1HSbk_!xXHG--~2w0dv}}TU!7sP z!FdPp^=r!f&2@RB^fUh^!>r}z$JIfStgtLg-rv1HE)6Y^8^c+FHOu}h&F`(w=i()I z08jq|>`&0uP3)4X>g_(tf2xyv+jsBW(5=GX&5^uR*e`O{tnP2gbjL>JLH8#tNBN+< z;*#@r>+gSGR6KBTbTd1!NH~@GC*Xf_KNmcagdG(BC!|L(76SKU7=>=60yz9INM5x0F7uU!ORS9>{u1hgIK> zo`3Zp<#RMPG^ETR-Wo?Sgu5 z%GpnK3DYlsuf1Jmqe8-~oxbGH)WVcv_Tf_XeYfH3B$izdfx}|r)0t=a2Up2_5KIfX zESod$2x7J2_Gr-^$%nPno#4%bek-Ki5=u746lJ~stU$-Dz5l#Bkgwc+E^1Hj=7)Rn zgNC-qUNaq)vqFB?(c>NN3&!(T2|EJEGw*qyuDh{)byF>|NY~XYb6GM(3F z512Y_?FaHcu|C$i&U zJ4fKSK^6y`y35-@>Gdq!n|LLbg7M2nGRn#wvBuWT?mnjoj2?AmL1nw+vu=*R#u%*N z(MFHl=751w%XsRM3hRATkDoF49j;Y)6CQB)!7qR!UWBjU`) z;aRov*WR^-x=H^C#a@c{^QWvLXnuEtoseJmYco;VUJYW&DBa}^dmoWk41OBr&Eex4 zx;^}Kd9V2Sq#D#!#wEec%ZkP;<(op~tiFzt>`jZ2x*^Bkig??ju43dv^|eJqqA`$; zo)fl6ydj|vm;*e#A>m{4LzehwjU>7o-=Vi`(>@}u)+Mxo+)yd!9A^!w>`-e&8cozr z9Kj~Ubt_W4I&c6fTdWFM_fr`LOhO{A zzYDp_`P0nT6aDuI#%s6dh9;Qpt3j#S9iR&JTR&Pf-#6hGsxWE-$@M4Ig}V=7z`Nm4 zRk-u1rgB*g2$CxNgl(`Lx)QfX|Jj-8#&%W4)E(drsf!>fi>Q$16d_&{ITQSH}1{c5q_k1cax1VV* zRFzc3#_m{IpgXh6S7^MqL213*Wz4ttJ9AZ9KiRMkLfr9-Md@#1=;qV$wR_Da8=A~Y zqx}g6I93+MFg|;Pwt@1Kpb7WIwH{U8WGT2$^A~)^f+^=`Wj=c#Zh?@x8s4+=pPAzu zCf__4I@DiAvVTkCeYjy3+0FAVyt(IVjJ@BPzcj-sEy`bWHv(he{kpK|xxK$W3>=qy z*e?sk`o~UvbUayDM-7>@LztDM;6vO51lHqZ0Gd;bVS$&KTYdsF6_DiWS#zReZKrsb=U4N-O76=ip7-JLD?qpV~gM1nEY% zlMF;`$y4z5?640UHWFaH%Yj@PGi8IE2AHv*b&WUfd!UjoYDfC9B)zT`*NK(IRPBpe zm;RT^59SF$naWv}eZoyjSKp3c|B+x}sd|*aTvI@61l{&>Vgx#ES z!>lD0)^xZUpOK*Z_l~@?h76Ir>cRtoaP{y!^%{~-P3@-gi*kP285^OqnQ1ZST&dwd zPA;XtD+@@=?_7Tu5WWNO)^>q1N7q)G-dB1Zow$u`%1@8-Na7h1&pigr;SFy5%rgOT zIdgdH+wcs>IhI2%uI(3*uj8gu-3`wdV{K#a%}2AL8#5kCylremiINzuqI#z?G?SH{ z2=i;AR>h!6{P)H9`Sks$6`=Gg7{IPtyi^i?dSIGgAUtXb$BnXogScbugeAdYtO3V( zCxJe0(c)wD2CqWTF)-xA#myn(Yf!@n^Mm)0{805XZdi)S872AFl+r?` zRuuNFP{Q*mMI!6~M84%31#V8t@+SF|luKvmwpQEaZTjM}##`v3a3vlys!#~j!6Y_( z^UZS}?RQ^O?r)s-N*ztNf6fEj-z<6cHHASlF$&cSOTN(mV$tl50=iQuS2O&i!cwTR$iMVR%16^Jcm1Irm^T``P z=Rn*IQx5Dd=+TGuKfB1;xjNxd3m2&3uDqWw$HQUk#a$wY-#u%)e5E5cMbp3&E<<~t z53eBuBZvM?F2pGGAvp24$St>hmSBgD-syh6q?h$vfvRp`Xpz{ zU_1CtmanbaK9}SV$Aq|E509RL=08P~-57(M_mv*vn7!Q8!v?XZVCH6zlh;PQOtqZT z;4hvzCsc;h3hxY>^;pZeCldB|qWnbKd|Q9H05AMWH@;inK0d=nUO1bZilkgMV}?Xu zc+7+y=@TdXD_syga%6j~o=w=aFEqG! zMIBDPq-3i;rDVg!>j1Unv~ZmjLdBH0JE=8#a9vF~O+}Jvfay=^P4%OGzO=O*FzKZ? zK)Qd&>tTkli_bP_JYSvKmDt>6bk8U56@R(wq$gCB*h<5EziST3cOMd%_WDCesA2PC z4Xz9UR}Kb`_ipq_ zquMERdA4RRJGyiAQ>ZPA1+@8}N^%BRbSl8Xlk)!V$_5KORscKo@7vPp!_LqwO#j@7%`d z_P}{tJ`wd6C*~;OH6{59;UXK5Lxnh1f%UlfUfNJVCG+Mi4hV096KxLO$Z7-m*nJEr z-|US)XW9TZrS`KG@}?(g?q*iyt-43(gMI4;4~tGXDikEyw#c~q>D@pfBaE8q&L>HV z*NXj&-8@z=&mWz!)&0_P_7}RELQdv9h#1ST^_7YkC($a@QX$c?Ux|PJqLv1YZjlMA z%_zliphju+LqzCb{`?{{Mk7+LPjDn>z>8_EI0tmP{FbL7{z50+W8i!>Q|5=l?R4oR zirvR;Urs1DZNM=v@|_hF`uWlJuk4#adUc0eHaarQ9pI%!%s$IYGM<9NGLdpi9-Kib zTVq1=t<=jfb4h_^cC1%`;(1ogQQ&zt;;g*J3E0$}dfKD;fS6|$7WgK53;GnC+y9{} z?CmRth$6&n6Yt*))cS8Im4w!-_G>r(* zp#hUvffy^eMwSQ9&mb`AtQA9%llBf8!!1A-C%j2bWV2iB;m8ZWk7aiNqC3DD=Y_3a zW2DX5P)o2w=y_JZhx}my$+$tFIHj>H@XyCqoMr!LP^Q589?1X|I z8)hh@oHto51x89hN~YTAql~pOawVO7R}gn+0aM~x2@MmbYzv+{WY9nY-s6n~hQW?~ zr583=q%?po$^Df!x+GH-Kow0qb+S$9mj(dVL}aIie5S5uZ&`ck1+ zUzS^DMBmMIe6+jYJ;6k2Z+&B}$uGwf8(wH^8f2s&C!pj@gPmvt2;1neo`jsUr~hTI zsLUT1GGT+%5rZoipp5#X42sypGKl@a__uJH3jL5ujS@P&&xG9S>!bqefoI&LW5HOR zC&r)uRcleG|G8LnlF{BbWnv~it8(qFkvA&hzG$K!UlG27TC@Fwi~+r@31#VnZ`)k) z+#5(7Yh*lDTw;Cf-cADfcBzHFO&GN%l9B^i)%9TpL85o#%6wB8kfB&b|5oLn=_=#)cNq|MAbYG15pUOX6? zEKrrXFV+Qdxh8-n^Lo$|godhpkyw2|rY9(3RK#1MDaSw-i6^TEC~m;16IdzM0HIa{DR^gE z+D>_Ifp|opdxD&x<1XX@Fw&Z`u~#NCa;Nd~g*-xXWiX#V1WFvlU^-KDeVdSt`Ql$T5f!9af z?^X!ZGYh}hVeY9@t!fqhj>e0WekoX=VTADlPm+Is-DEtnx)XBQxH{Moy%IWb+$<@f zogG%C+*dqG9uz0Z#8iTcgjQ~Nr>%-wkd8Zw4G#cJ$_=)QSduJIxQydb?{upEs_?abrr68 zs%v!_{5+fc${{k7qJ)z6bjElyc8x~<27a{lB;Q)|Y{Y7f+$5)S#3k| z$a(a7#3(a$miwck%8`fr9pGukt&RR?v$P!l5fwl4pC{&!%i67#sD|2dF0YTuvefy5 z<$0ziOxJPA9GU!=m+as(c4nr-#Bwop7fJPML?2mL8(DxLA)t*8XHlmEOrFgiS-i~u zkSDVMmHNmy@38rCcuzuZZ_FW>;FsN;VwdmpX&~ftf2l8tnc7+P`y7+;FeEiNC z5LNkwM|c6azvM#~bcG)Pfn&v{@2u zB=U^c%HISZ@ct1?7t0hev55!MVuY)gML_KrQkAtz%OCUE9l$N5zwKL!7#*`SN`KqF zG$F|M)q(~>w&&tA>}9H4*e+AKF%3+`hf;-4Ld^5V*ru~V1)g7P;g#%{Hg@K8B8<3T z4;tLM>Gv%?YM;%S6iFbjc9P{fCOt{HW&xk zK1CRbypalUTBcYe3~}4WX*G2+z+>Y1Vkg+X@kOyc-?EdC&iv2{C$`?)uF7KCgW<)F z>ADOU_%Yu*6cn%Sci64Oahh$AXJe*BoEW`A2(7h}(Qw@sg#{<^r5m${Z3s({4y@sb zJ6UUjm_HUU0%*+%=h&EYibQl2rsj~6td7ryq+d6pc0lkDOc7M}MY908Qd0g%$}+Rq zWvrg8TH~eEuamdQQWmrQvo0x%4U;6t9*T*ZMeYUS7^81q+~IDCs~c_^M!mS3*wwSa z`Xyg}GER>X<6~Vid$!kX(=|E>!i)%Kh(-b`qnWN&TVG~DmP%?N+<2t_%eVN1&N)#- z#SZMWG&uuMIsP@mMrm%h)>0#!;drprqc`ddGDDN%YBc$v%kCx==#bT*lZ>++TruFb z^1`6Vo`oQA)$IN$=*xs^=*)+bq}(S`CJ<-G2bs)l{LXyphTUV44mXP6hZj^ePI_Y2 zL0V2aosXvWU8s9=Epi?FLSSi@W8d6)zxTvf)$!%J^QJ<@>A?-WiJ5KMe{?U#tPV#9 zQoAN-S9F@P4boWGpEYj4A#u9TYTyF&KY&5ar%#}IZaa15{dWM8EWzEry^y9k^KREs z-_3>B)4ickPh|lU$aG2ENS?LrF8xA7ni-Ded!JZC+aO@j6qF+#mDB_d*y5i(V`BnRobBFNgYtHem#v;Qe`u1P4#7xTH+2wD z3aq8Z51-eU+ECvyRdkHY*vX6N7#L32Uea3~r)o?`cKp;)p(=JF)u@~2Qx4Ke75Q{_ zzc|r1IA?EHeN#K{7fMnuZk{C}gSJZ#^exgMWL7q}PV)X?t_&AGT^Uh~=GxRY3ec>M`y^b~3IW zmm-};PGeskJqh0N75>1v10lwJ&uFRmsisyp+fU6n8>qMUgVwT}E4|Q}gBUQ;Sehgsq@wN{N+MrjvFfN5OJc|m2`Mmp z9w4H<6X`fdq7G9f6D;m2b3A%51Iz6gzdWa*iQ(7U%mAFFdJM#7nJ2pD`xT#(+211pmeArS z4fFB>i~(&na772GN4&!TTWuK0rE9_NciT&>#ZjJM}N^waW zUu8dMs)3X0|7j@f$`JC9kIYnN9ubvFu=1Hq+KiA6tNJEVJg)pV0&o z)`BiAerOtEpxY-{p{%E`MnvhWE%ufHD&tw>J*UgIPToY@)5$A*COc>Lt=z6GXx=3@ zpE&U*qB3Fd;TdhMRgb2^rj1|BXIJ)k#nX-(6VG~*!W`hQ;n^QQZI90ooJVXo#u+zD zf9?PRfd&FP;4?Smc{%!!6`0&WyJKKhTk!4$|NV@q(K6U(NY<9)Rt;x&aaY5F;VI16 zCfY+_LFH8bXhz*!zu^0LCcO^d$6t9@+W>ZEGSu^(rpIW#DzN-eDep@PDm6K#-{Q9+9MFBN#fV8P?Xzzstm(!Nnl(ry;ggv{1c59`W=SZ`=r$rCqpTHVI6 zz=i!2kTh~kKL;DegR^OJCnClfGNDH~szyDm1xHyOr_Z!OG)eAJx}v;qiiX{dzc0Cp zrHgL`CnQ!02${9#5@YZt#%t%IZG26|`fYu+1+zsNoa^t^Fxe60FNET?=Q%!L&=VMeQ`wUjVs5m1Xhdx)JS zl!^So$;r*4iHP*(JiPQ9|#i~}Eb_e0UhvB1BcL?J^6Z!8P+HP!?w z!ZSq}Iwr#}h&NFm3X0M-ut4O*B0?=r6W54&!G+nlg3J)(|I9`tq+ zFO_-SVrmF>H6AsnRJY=kDB7CK%CD1wBG>Uw8HEZfM`6EKKb_i3I}yf4XOp?GXhTzs z_IcCP*G=y6Q?OW&@qRNQe06l6uM8mV^amd+c>%c2GZVdEH8R-UBwG1BS^Oqv(LfQ@ zb5nh;VP1Q%hUvSt$?lhvh>l6hoz*pza#490hw0a1jv(##5djDl1H&jfu3-BTR(I)XSG;g3(+1`Z*^q$7fE~@$gfTDBqZT8!0iJFQ}s?;Z2UMp6!o? zMc<`V1x`TG;C0bx-cY~zWR}X)EseL$b|OFJW)d1te3(3{Xc~QXwwCIuR47fDPPdNg z4%J3x8ohrcXG@tTN7qzZ&qq!~JVs< z>>n+z_(h!c)ksbwCkv*7C(vfOndM8K^{wGr=Agx!_n?q3&w0io7h)@N$7(GEObfgU zX-yil@tdkWD{Iao3=+@-!CU&F5NI{4SdwIo{dH{|y-MxXfFql>3g7O)beE0k`phRD znxoDsy)QA{F#VP8T%CAWy+Bwh4AXc5rz-i#*{g;#J(#rrDI;B(V?!Nz!Zgbf2b>;q zAF}+)zg5A!C{n&%|BoD9<(*C?xgwW8J2UrWdBzFQpTwAMJZ7MJ zySAP+$)sg@X3`|%Q+m*ZG*$g?#MUmOJS|e$c=m(fiKBp{jO}HqSMcytLwOG4kR5tO zCgS!TZk)9iyt;rJ+8$0{iU+X}Lu*8tRCP%lO$j_Y55iExC!S4R>pchiObIPvM8shY zZH^`~fGPjYACZU&Cq=!lAum^Ev~pfR%Ib=9^7CCe9NeN`;%`z0O5BTB=?wm4WtkH;QBdop@$&l7BdjJ*b87l)#q-%;H&Qyt&>JZ*@Zu+> znUgUWy`n>)2FGFwzJ{isI3{he>V>CiroHx7_9&MIkv8{ah6#PukKyA7&mYz#5qef* zeSr!Ux&=(fhNMAfeU2-9Nr`yIfW+UHSiK4rNz;9bljkb`FnZDH?O8gS~#y@TeK zm&cj6p}s!}m9l`%&Jm9#T~ zo*^73Dddwv2UczXr=F8)0gldUgmu%pCpg*P<`fM(Plv1&o!thqe92`_9!%8lKK*yk zXiX7jKqgvnq!>+jvh2p*6x&f~y>XN;k#FCU|5Et4idWk?3k;j=vyv~*@>K@t<*gi* z%SX%5T8&c>#`Lh}zj;_w4)6;yADx6P)8Y7XM^A~IzH=h{79KCMET&>tVhL96&Wapo zchH0qpCau~AHJtYAlpf?<6WkF&S^7$)Hf5sk4|z)Q8aWo_+=Ql^5&LXnfc+XPq3qg z2lmbMr7pwnYt<0G@npDgmA9JHRU{Mw71fm{?3uR-i_ys|T1*O3!sjJx#xLU6;$+f$ zui_%n&EKz21E-OBB0a0~0<$Z_=q!RZN=6s!=8TouD0enk1vof^t7|~HFMj<2#j3!D z@{ZfYC|(;i8(J9?p8=o8K8v&9ouxF*kp6S>q-Wlvb3@(Z#4$#LXGejt;{fr{msf$| zIm}u;_}L!1GMYX=4aC;SKT@A%F=GGd_2iYG-iPA+KbvKo|O_6qk*YYZ<&)-|(=3mn(^) zNUKn2WOsYqIh$j+IrTwol7e$$nJ^$ty z^w}uMINL;z`+26jC2U%y{5=aL$XP%8Xl&-)VM}PICf-;NVM5U9_BS%JLcZS`eab8| zdO|I{C?ZMaY)3u#=JT*=)%KzRkuy@s7i+;SWPzRIM+pT36Hja1G7wMUg?grRRCd$3 zHXdx_#XUbV7)qVv5%0tAIZ8w$hFSaEP&sSa3=F4_(NAq2mIYh>jeezQBa!(N!yqspvHb1yZpIpc8S~jpJ?j(J#bG& z3hbn#HN2>Ss#{xS++y`E?#!ND+glsE>zJ*#n7!PC3SGqRUFTIgT$NI@7^WItq#yj zf$+`lXwDIoW+hoNEcgaY>Ja0I^71i=+{i#h>%#2D%q`}F^JZ+YHg3X4rawF+VzBv+iyFyiEP@CzAq+lNaIDf z)i4>5u?K)qoew4_>IsYCTV&88okY3Q7<$rECSC?k_Bu+_uvI-7Nktn%zYm>R_B)=< zZ^&f8k=yKJZ=5J5op8!3MeOScqn(4JfjBfVXvH-49h{*kBHz0pyh)_r136-}>h^LV;gev-AIjOdtw&qE$gKUZoQ z8Z`DP&v{yRCA?%S60%a+?m^`v7?ayxT4_UM2J*0}+SMap534AeL^zJIQYoRbujc- zS4p^7Q~hSI+vbbfh0(`#3r}mu**PG^qL1anx&H5b7aIZp=)pfT791eqjzby6t2(8N zsx5p$cFwNI8jefY`Z~ZX2)5y>ho({4`vXIu44O5GG!sg{Zc7TSzE9{j@vsrfg8pgf zLMZMu`TP}SA%Q%l!|73I;?rD>EL;2C2$`@N`ze+2Vh%JUYdMgV5KqvlfgD&pdv9SF zL&EP~1nobkBv6w3Apvp1RS)3w12Af8+c7lX%i{@P2y=v6RDq&}m39#Cp5xX^N!*tb zZ4*o_B3FQJaV<3uOJ447jm(lQJLT=*6=r_%fAYoe>2=n1GV`m!Yt7YfYyO0Kj?vFK zmQ&8gryHqCU0{#nBjGP1q9x+J!xAHM)TkW7l&k}4PW$iGJQm7#6y#?IKn0nD>EU=@ z7BBP%`QBy&^56K}9*+5PejMU)B$1n3B&-!I+>s|^){)P1K#qyL5;pB1lV^O1lkR6O zxBl@LWss_TXwE1GAP87$>)S+>r$z-f;#2~hpaUqtdszc2@moB6$^d$!KX@<`7+gae z?-8RExdND3SjIP8K46F$0Q|6H0172F5N%b$QxZJYelUK9JCkF{;N2r2>}=1WYZR-% zZ;xR{gw>jIvOJ{840{e#!y7kCr=S}1OSrMBMo{S7yn?C9Zy%|pHxd>OGgR%^K+h01 z15rLqXlacYd*w9OmlGl=)(W-Hr?qxMIkS*&V|KOU#LZvHY#X6O)DOn$SkC)}Gdh|(1$QXXk0f8~9D=iT05{k(r^>OuH)*iasU+Ly+JA}RbY z%cP<*G9amLyx7K5=i==8#uBtOO?3;HQ7zJNIXU_}dSpgFe-&T7)J3(sbX;PfjIlUn z4Zexm*gf%pCL~@+rId5^Eb0DL4#L^E34O!R&eue&6W%PN0@qMo6YUU%=mtzbNIV*8 zttn#Y({CvL7BH2#37KQpuu9s<=lg=^aU|63>l)&)%kOzKT!B5E!Y)!xHF0^p_%tmp zqe3x8FtG?#mIr+3tcBJHr3^^?U)x#Oh$@?nqljfQgJ%gt9V@5{UV|T81?Q``d zvhCNZ6k8rv1wC!S>lUHP)#LP44+{4cv|E-UjB?;&5GvZ&_#80_1O?CAYOzfUE4@TA zy(qAb+Q}4{dm&a!8S&s1p?=((fy2`$yp+|mtc;eXMB3S_j>_t|?a}pumC<7c@TL?A z$ouX9g5dkaNihbLa#Kp+dYVcyhOj8M@rTItc*Rej8iqm|r_4qvjvh10c1aZI6F#|wy$snQddWs^iPxkt(oAlOFWF(1E)PM=v| zM`NTmG5;U=oEa@|M|5a3_zFq$Y2x$Shz~h1RGFMz`9INHRZ#(X1* z4m(~WDp)Lthd+qwK0ezeoHosndx{*wLw4OSUg#sO1w4$8C}H}*EiSOAXKuYr!96BO zo+HsA<}WBFN1^)u-w!WW@i{EMR4X7s;N@5KVVgl8VaBXbaFHTIz}iR z+49w6#Zi_5ihjPzpN|FRR2rEd77n=%O!m{}c7ol=G=tFnWFT;H7gJg}aTLFDq{*8F zpb~NV3T*QYlOVc3fE);z0_=RH+3qf?fKAMY&mhhC35t6DMgV!tZ#piLi8}_)p~hCT zkH0Hw((2e@eh0h@KH(YmadmsbV@V?rc68|?2JvO#M!A(uee~iPLq!whjph98DDQhuOGCiiXAG{cFt%b92*=Yq(!N)9=dQ=Sx;VYKb$^38=^yNuDwp%XfT7mmmgI z_$G#wDeL2h6K7LTE@>x<6}_%6yssnAoZ)&cF3H24TpK6CwcAI1&O)`#mPqdoX$ug5 z@!#s|e>YC>esMRgXiBUVt$9E_zWv$%oo&4L_k}_={Vfrh;;}-JwtUh!PNxFgTAe8R-qR--_|PL+bV6V;z;z0+O=vbw zORb`>y_PNI!E8vk_9IGRSHfJKI)NJYI``4r@JC(nH0FDGwg@WiLChnG02{3bYxpkR z$M+%(T?(k5SoG3z9~52KE9S;NiOtMBJ}$&8-C&p9Ggp_MUW1mN<4<|)L_45u4W`)} zKT{e`vzvCs+jbN(MLTy{NKR{R*RmOft44$9V-CyvP;n_UY3EWZPU z0Q_VpB400xAC%`{&w1wD0c2M!R!e?<&)u87Xn*hjQN6XMWT53(cy9sJQr>LvE1%S# z5BuGx_eJXXkR&je%pC*6;@%4Qo#BbVBnk5)jmf?sxYo6}5V}^l#Z1wOZYd?E?& zX=P*16i@L)b*?Ek#q&PQ?MbvQ_#%@1xVX1I&P2>J`lIie#CKT?5z(w^St}3-{)@l5 zXYz6ZQj@xsD;-D;Gpe~r9kLf1mHC@e+Vhp(Wg?Ry)sK9w?tGT4<^pwLJ0s32t(QeVpGuuxw4G&t Z)c7KwGBZY(1aSI)mi`~3m%aP(e*k-(rCIY?@*TKQ>gA5^r(j*Ea z-wy;q=%(FF7)4?RiA_RuO|vb_vTa@01K($iwOj3fTCU?5hG|=N%2JH6lSR{%u+(a| zf*{Dwvy>rGWGs~=eB^nWrfa$`@5@RSqbAoWlsP0~;r0upT7a$V<8Rrh5%Nod@OC5$Ph-jRnT+=*kyb$#Dg6eW&h zRaHIDlV$nim+!q^5Bwj_$29n2liIsOSa@#$^74tMw7<@2{5KF-6z*})q_LwDfR z^O>hpGZ$g)YVC9F3EaB2^>ywM1RMv>eS>#%!^6wD9IX6Ut1MOEmEz@*+apDI`qaH& z^9yjYurfMYn1s_4H(#tyOvCD*>c*ui>@&}fy&Qwr`9+=|7=Ys^JLNNFxV^cZE4?Yb f1|PWfJf1K0{p9%jh2{6NYkRxJ3ky5_JXrb*T&4?) diff --git a/docs/core/DBDocs/table/WT_VERSION/topDimTabR.gif b/docs/core/DBDocs/table/WT_VERSION/topDimTabR.gif deleted file mode 100644 index 3233a6e58473a5d8b6c9c273d2cdc563cfdb0382..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 580 zcmd7P$!^m?90u@7NJICgft08V&awJKdr?QOqJdaYH>bkP6s4X?+JPN~>s!9kst|KC37zU-(FpaF3khW!;W1v<@dUHgJ9(^Y~~Ht diff --git a/docs/core/DBDocs/table/WT_VERSION/topTabBg.gif b/docs/core/DBDocs/table/WT_VERSION/topTabBg.gif deleted file mode 100644 index f8b692b7a181cddb49590c86d7e6e99d3f549b6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95 zcmZ?wbhEHbWMmL!*v!Ci+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DWqunR9MBeEBDq=$?#Giu6hgsVeqb>zfstJ!xr@QMb=AP7fwV z=fee_CL*1!Ngr3`Xf!*fEf8G6!lca4uViAv-rlCjBFv&9AR(ZwY9PKwX`4Aua|9I!C} diff --git a/docs/core/DBDocs/table/WT_VERSION/topTabR.gif b/docs/core/DBDocs/table/WT_VERSION/topTabR.gif deleted file mode 100644 index d24e5eb9739ea67df271b693d03d235e861222b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 332 zcmZ?wbhEHb+;`>qsavlPU3cp+ryDmIGdF%DQD=&^*e|g}_ixr1%pSlfH{Nnh{*T-+ZI(_H$=9BjiUVVA&#;Xm- z?;X4OYRk#{doDd&b@@BoWA{L*M(G`(P56;|q^Z);U25dm_ zCkrD3g9U>QND|~H2DVIx*##Yk@Ai4j7M$s_Y1Wy=x>`%`EepvBIlbj%iddwMsmPHeH@EA2SrUqBq$|*B3X)#Hen6P)WD+x#lsIUmLDDtsRl{Zk;HkCD< ZXR07)%wue - - + +
    @@ -72,7 +72,7 @@ INSTALL_DTM DATE -Yes +No null 1 Date/Time the version that was installed/upgraded @@ -119,6 +119,26 @@ INVALID VIEW_RELATED + +WT_VERSIONS_PK +Primary_Key +null +null +null +null +null +ENABLED +NOT DEFERRABLE +VALIDATED +USER NAME +null +null +25-NOV-2018 19:55:40 +null +WT_VERSIONS_PK +null +null +

    @@ -131,12 +151,25 @@

    +
    +
    + + + + + + + + +
    COLUMN_NAMECOLUMN_POSITION
    INSTALL_DTM1
    +
    +
    - +
    @@ -144,45 +177,45 @@ - + - +
    PRIVILEGE GRANTEEGRANTOR OBJECT_NAME
    SELECT PUBLIC NO WTPWT_VERSIONWT_VERSIONS
    - +
    - + - + - + - + - + - +
    NAME VALUE
    NUM_ROWSnull1
    BLOCKSnull5
    AVG_ROW_LENnull22
    SAMPLE_SIZEnull1
    LAST_ANALYZEDnull25-NOV-2018 20:04:09
    LAST_ANALYZED_SINCEnull25-NOV-2018 20:04:09

    @@ -201,7 +234,7 @@
    - +
    @@ -227,7 +260,7 @@
    -
    TRIGGER_NAME TRIGGER_TYPE
    +
    @@ -236,22 +269,14 @@ - + - + - - - - - - - -
    OWNER NAMEREFERENCED_NAME REFERENCED_TYPE
    PUBLIC WT_VERSION SYNONYM WTPWT_VERSIONWT_VERSIONS TABLE
    WTPWTPLSQLPACKAGE BODYWTPWT_VERSIONTABLE


    @@ -265,20 +290,7 @@
    -
    - - - - - - - - -
    OWNERNAMETYPEREFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    -
    -
    -
    -
    +
    @@ -301,11 +313,11 @@ - + - + @@ -313,7 +325,7 @@ - + @@ -385,35 +397,35 @@ - + - + - + - + - + - + - + - + @@ -433,11 +445,11 @@ - + - + @@ -481,7 +493,7 @@ - + @@ -567,6 +579,18 @@ + + + + + + + + + + + +
    OWNER NAME
    CREATED29-JUN-2018 15:12:2125-NOV-2018 19:55:40
    LAST_DDL_TIME29-JUN-2018 15:21:1225-NOV-2018 19:55:40
    OWNER
    TABLE_NAMEWT_VERSIONWT_VERSIONS
    TABLESPACE_NAME
    NUM_ROWSnull1
    BLOCKSnull5
    EMPTY_BLOCKSnull0
    AVG_SPACEnull0
    CHAIN_CNTnull0
    AVG_ROW_LENnull22
    AVG_SPACE_FREELIST_BLOCKSnull0
    NUM_FREELIST_BLOCKSnull0
    DEGREE
    SAMPLE_SIZEnull1
    LAST_ANALYZEDnull25-NOV-2018 20:04:09
    PARTITIONED
    GLOBAL_STATSNOYES
    USER_STATSJOIN_INDEX COLUMNS
    WTPWT_VERSIONS_PKUNIQUEVALIDNORMALNNOnullNOINSTALL_DTM


    @@ -579,6 +603,35 @@

    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    INDEX_OWNERINDEX_NAMETABLE_OWNERTABLE_NAMECOLUMN_NAMECOLUMN_POSITIONCOLUMN_LENGTHCHAR_LENGTHDESCENDCOLUMN_EXPRESSION
    WTPWT_VERSIONS_PKWTPWT_VERSIONSINSTALL_DTM170ASCnull
    +
    +
    diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/headerBg.jpg b/docs/core/DBDocs/table/WT_VERSIONS/headerBg.jpg similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/headerBg.jpg rename to docs/core/DBDocs/table/WT_VERSIONS/headerBg.jpg diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/report.css b/docs/core/DBDocs/table/WT_VERSIONS/report.css similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/report.css rename to docs/core/DBDocs/table/WT_VERSIONS/report.css diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/report.js b/docs/core/DBDocs/table/WT_VERSIONS/report.js similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/report.js rename to docs/core/DBDocs/table/WT_VERSIONS/report.js diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topDimTabBg.gif b/docs/core/DBDocs/table/WT_VERSIONS/topDimTabBg.gif similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topDimTabBg.gif rename to docs/core/DBDocs/table/WT_VERSIONS/topDimTabBg.gif diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topDimTabL.gif b/docs/core/DBDocs/table/WT_VERSIONS/topDimTabL.gif similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topDimTabL.gif rename to docs/core/DBDocs/table/WT_VERSIONS/topDimTabL.gif diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topDimTabR.gif b/docs/core/DBDocs/table/WT_VERSIONS/topDimTabR.gif similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topDimTabR.gif rename to docs/core/DBDocs/table/WT_VERSIONS/topDimTabR.gif diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topTabBg.gif b/docs/core/DBDocs/table/WT_VERSIONS/topTabBg.gif similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topTabBg.gif rename to docs/core/DBDocs/table/WT_VERSIONS/topTabBg.gif diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topTabL.gif b/docs/core/DBDocs/table/WT_VERSIONS/topTabL.gif similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topTabL.gif rename to docs/core/DBDocs/table/WT_VERSIONS/topTabL.gif diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topTabR.gif b/docs/core/DBDocs/table/WT_VERSIONS/topTabR.gif similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topTabR.gif rename to docs/core/DBDocs/table/WT_VERSIONS/topTabR.gif diff --git a/docs/core/DBDocs/table/index.html b/docs/core/DBDocs/table/index.html index 2ab8e9d..b452733 100644 --- a/docs/core/DBDocs/table/index.html +++ b/docs/core/DBDocs/table/index.html @@ -6,15 +6,8 @@

    Tables -

    PLSQL_PROFILER_DATA -PLSQL_PROFILER_RUNS -PLSQL_PROFILER_UNITS -WT_DBOUT_PROFILES -WT_RESULTS + \ No newline at end of file diff --git a/docs/core/DBDocs/trigger/WT_SELF_TEST%24TEST.html b/docs/core/DBDocs/trigger/WT_SELF_TEST%24TEST.html new file mode 100644 index 0000000..fcb1461 --- /dev/null +++ b/docs/core/DBDocs/trigger/WT_SELF_TEST%24TEST.html @@ -0,0 +1,166 @@ + + + + + + + + +
    +
    +
    +

    Details

    +
    +
    +
    +
    +

    Grants

    +
    +
    +
    +
    +

    References

    +
    +
    +
    +
    +

    Dependencies

    +
    +
    +
    +
    +

    Code

    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAMEVALUE
    OWNERWTP
    OBJECT_NAMEWT_SELF_TEST$TEST
    SUBOBJECT_NAMEnull
    OBJECT_ID42803
    DATA_OBJECT_IDnull
    OBJECT_TYPETRIGGER
    CREATED25-NOV-2018 19:55:40
    LAST_DDL_TIME25-NOV-2018 19:55:40
    TIMESTAMP2018-11-25:19:55:40
    STATUSVALID
    TEMPORARYN
    GENERATEDN
    SECONDARYN
    NAMESPACE3
    EDITION_NAMEnull
    +
    +
    +
    +
    + + + + + + + + +
    PRIVILEGEGRANTEEGRANTABLEGRANTOROBJECT_NAME
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    + + + + + + + + + +
    NAMEOWNERTYPEOBJECT_IDSTATUSTYPE_LINK
    +
    +
    +
    +
    +
    +trigger wt_self_test$test
    +   before insert on wt_self_test
    +   for each row
    +declare
    +   l_junk  number;
    +begin
    +   l_junk := 1;
    +end;
    +
    +
    +
    + + diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/headerBg.jpg b/docs/core/DBDocs/trigger/WT_SELF_TEST%24TEST/headerBg.jpg similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/headerBg.jpg rename to docs/core/DBDocs/trigger/WT_SELF_TEST%24TEST/headerBg.jpg diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/report.css b/docs/core/DBDocs/trigger/WT_SELF_TEST%24TEST/report.css similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/report.css rename to docs/core/DBDocs/trigger/WT_SELF_TEST%24TEST/report.css diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/report.js b/docs/core/DBDocs/trigger/WT_SELF_TEST%24TEST/report.js similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/report.js rename to docs/core/DBDocs/trigger/WT_SELF_TEST%24TEST/report.js diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topDimTabBg.gif b/docs/core/DBDocs/trigger/WT_SELF_TEST%24TEST/topDimTabBg.gif similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topDimTabBg.gif rename to docs/core/DBDocs/trigger/WT_SELF_TEST%24TEST/topDimTabBg.gif diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topDimTabL.gif b/docs/core/DBDocs/trigger/WT_SELF_TEST%24TEST/topDimTabL.gif similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topDimTabL.gif rename to docs/core/DBDocs/trigger/WT_SELF_TEST%24TEST/topDimTabL.gif diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topDimTabR.gif b/docs/core/DBDocs/trigger/WT_SELF_TEST%24TEST/topDimTabR.gif similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topDimTabR.gif rename to docs/core/DBDocs/trigger/WT_SELF_TEST%24TEST/topDimTabR.gif diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topTabBg.gif b/docs/core/DBDocs/trigger/WT_SELF_TEST%24TEST/topTabBg.gif similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topTabBg.gif rename to docs/core/DBDocs/trigger/WT_SELF_TEST%24TEST/topTabBg.gif diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topTabL.gif b/docs/core/DBDocs/trigger/WT_SELF_TEST%24TEST/topTabL.gif similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topTabL.gif rename to docs/core/DBDocs/trigger/WT_SELF_TEST%24TEST/topTabL.gif diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topTabR.gif b/docs/core/DBDocs/trigger/WT_SELF_TEST%24TEST/topTabR.gif similarity index 100% rename from docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topTabR.gif rename to docs/core/DBDocs/trigger/WT_SELF_TEST%24TEST/topTabR.gif diff --git a/docs/core/DBDocs/trigger/index.html b/docs/core/DBDocs/trigger/index.html new file mode 100644 index 0000000..16edc82 --- /dev/null +++ b/docs/core/DBDocs/trigger/index.html @@ -0,0 +1,11 @@ + + + + + + + +

    Triggers +

    \ No newline at end of file diff --git a/docs/core/README.md b/docs/core/README.md index 2e981ae..0bdc47e 100644 --- a/docs/core/README.md +++ b/docs/core/README.md @@ -1,6 +1,8 @@ + # wtPLSQL Whitebox Testing Framework for Oracle's PL/SQL Language + ### Files and Directories File Name | Description @@ -9,3 +11,12 @@ DBDocs | SQL Developer DBDocs Files Call_Tree_Diagrams.odg | LibreOffice Draw File for Process Call Trees Call_Tree_Diagrams.pdf | Process Call Tree (Graph) Diagrams ER_Diagrams.pdf | Entity-Relationship Diagrams + + +### DB Docs Notes +* Tables +* Indexes +* Triggers +* Packages +* Package Bodies +* Procedures diff --git a/src/core/releases/V1.1.0/downgrade_to_V1.0.0/README.txt b/src/persist/releases/V1.1.0/downgrade_to_V1.0.0/README.txt similarity index 100% rename from src/core/releases/V1.1.0/downgrade_to_V1.0.0/README.txt rename to src/persist/releases/V1.1.0/downgrade_to_V1.0.0/README.txt diff --git a/src/core/releases/V1.1.0/upgrade_from_V1.0.0/README.txt b/src/persist/releases/V1.1.0/upgrade_from_V1.0.0/README.txt similarity index 100% rename from src/core/releases/V1.1.0/upgrade_from_V1.0.0/README.txt rename to src/persist/releases/V1.1.0/upgrade_from_V1.0.0/README.txt diff --git a/src/core/releases/V1.1.0/upgrade_from_V1.0.0/RELEASE_NOTES.txt b/src/persist/releases/V1.1.0/upgrade_from_V1.0.0/RELEASE_NOTES.txt similarity index 100% rename from src/core/releases/V1.1.0/upgrade_from_V1.0.0/RELEASE_NOTES.txt rename to src/persist/releases/V1.1.0/upgrade_from_V1.0.0/RELEASE_NOTES.txt diff --git a/src/core/releases/V1.1.0/upgrade_from_V1.0.0/update_all_stats.sql b/src/persist/releases/V1.1.0/upgrade_from_V1.0.0/update_all_stats.sql similarity index 100% rename from src/core/releases/V1.1.0/upgrade_from_V1.0.0/update_all_stats.sql rename to src/persist/releases/V1.1.0/upgrade_from_V1.0.0/update_all_stats.sql diff --git a/src/core/releases/V1.1.0/upgrade_from_V1.0.0/upgrade.sql b/src/persist/releases/V1.1.0/upgrade_from_V1.0.0/upgrade.sql similarity index 100% rename from src/core/releases/V1.1.0/upgrade_from_V1.0.0/upgrade.sql rename to src/persist/releases/V1.1.0/upgrade_from_V1.0.0/upgrade.sql diff --git a/src/core/releases/V1.1.0/upgrade_from_V1.0.0/upgradeO.LST b/src/persist/releases/V1.1.0/upgrade_from_V1.0.0/upgradeO.LST similarity index 100% rename from src/core/releases/V1.1.0/upgrade_from_V1.0.0/upgradeO.LST rename to src/persist/releases/V1.1.0/upgrade_from_V1.0.0/upgradeO.LST diff --git a/src/core/releases/V1.2.0/upgrade_from_V1.1.0/README.txt b/src/persist/releases/V1.2.0/upgrade_from_V1.1.0/README.txt similarity index 100% rename from src/core/releases/V1.2.0/upgrade_from_V1.1.0/README.txt rename to src/persist/releases/V1.2.0/upgrade_from_V1.1.0/README.txt diff --git a/src/core/releases/V1.2.0/upgrade_from_V1.1.0/RELEASE_NOTES.txt b/src/persist/releases/V1.2.0/upgrade_from_V1.1.0/RELEASE_NOTES.txt similarity index 100% rename from src/core/releases/V1.2.0/upgrade_from_V1.1.0/RELEASE_NOTES.txt rename to src/persist/releases/V1.2.0/upgrade_from_V1.1.0/RELEASE_NOTES.txt From 54a800286ddf3a9996ec0820fceb809f26d11fc5 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Fri, 7 Dec 2018 06:29:23 -0600 Subject: [PATCH 045/141] Adding Multi-Schema Execution --- docs/Reference.md | 10 +---- docs/persist/Reference.md | 15 +++++++ src/core/core_data.pkb | 2 +- src/core/hook.pkb | 4 +- src/core/wt_assert.pkb | 2 +- src/{gui => core}/wt_scheduler_jobs.vw | 0 src/core/wtplsql.pkb | 54 +++++++++++++++++++++++--- src/core/wtplsql.pks | 28 +++++++++++++ 8 files changed, 97 insertions(+), 18 deletions(-) create mode 100644 docs/persist/Reference.md rename src/{gui => core}/wt_scheduler_jobs.vw (100%) diff --git a/docs/Reference.md b/docs/Reference.md index e44e95f..b6ca5f9 100644 --- a/docs/Reference.md +++ b/docs/Reference.md @@ -28,14 +28,8 @@ An obvious drawback of this approach is running assertions when NLS settings mus ## Custom Error Codes * ORA-20001 - WTPLSQL Package: RUNNER_NAME is NULL * ORA-20002 - WTPLSQL Package: RUNNER_NAME (name) is not valid -* ORA-20003 - WT_ASSERT Package: User Test Result is FAIL (g_raise_exception is TRUE) -* ORA-20004 - WT_PROFILER Package: in_test_run_id is NULL -* ORA-20005 - WT_PROFILER Package: dbms_profiler.INTERNAL_VERSION_CHECK returned (error) -* ORA-20006 - WT_PROFILER Package: dbms_profiler.START_PROFILER returned (error) -* ORA-20009 - WT_RESULT Package: "in_test_run_id" cannot be NULL -* ORA-20010 - WT_TEST_RUN_STAT Package: Unknown Result status -* ORA-20011 - WT_TEST_RUN_STAT Package: Unknown Profile status -* ORA-20012 - HOOK Package: Unknown HOOK_NAME Case +* ORA-20003 - HOOK Package: Unknown HOOK_NAME Case +* ORA-20004 - WT_ASSERT Package: User Test Result is FAIL (g_raise_exception is TRUE) ## WT_TEXT_REPORT Detail Levels * **Less than 10 (including null)** - No Detail diff --git a/docs/persist/Reference.md b/docs/persist/Reference.md new file mode 100644 index 0000000..ecbe8c0 --- /dev/null +++ b/docs/persist/Reference.md @@ -0,0 +1,15 @@ +[Website Home Page](../README.md) + +# Reference + +--- +## Custom Error Codes +* ORA-20009 ORA-20011 - WT_RESULT Package: "in_test_run_id" cannot be NULL +* ORA-20004 ORA-20012 - WT_PROFILER Package: in_test_run_id is NULL +* ORA-20005 ORA-20013 - WT_PROFILER Package: dbms_profiler.INTERNAL_VERSION_CHECK returned (error) +* ORA-20006 ORA-20014 - WT_PROFILER Package: dbms_profiler.START_PROFILER returned (error) +* ORA-20010 ORA-20015 - WT_TEST_RUN_STAT Package: Unknown Result status +* ORA-20011 ORA-20016 - WT_TEST_RUN_STAT Package: Unknown Profile status + +--- +[Website Home Page](README.md) diff --git a/src/core/core_data.pkb b/src/core/core_data.pkb index 99d6966..02e6d31 100644 --- a/src/core/core_data.pkb +++ b/src/core/core_data.pkb @@ -246,7 +246,7 @@ begin then g_run_rec.asrt_min_msec := l_results_rec.interval_msecs; end if; - if l_results_rec.interval_msecs > nvl(g_run_rec.asrt_max_msec,0) + if l_results_rec.interval_msecs > nvl(g_run_rec.asrt_max_msec,-1) then g_run_rec.asrt_max_msec := l_results_rec.interval_msecs; end if; diff --git a/src/core/hook.pkb b/src/core/hook.pkb index 77585cb..c391b40 100644 --- a/src/core/hook.pkb +++ b/src/core/hook.pkb @@ -139,7 +139,7 @@ begin when 'after_test_run' then after_test_run_active := TRUE; when 'after_test_all' then after_test_all_active := TRUE; when 'ad_hoc_report' then ad_hoc_report_active := TRUE; - else raise_application_error(-20012, 'Unknown HOOK_NAME Case' || buff.hook_name); + else raise_application_error(-20003, 'Unknown HOOK_NAME Case' || buff.hook_name); end case; end if; end loop; @@ -244,7 +244,7 @@ $THEN ,check_query_in => 'select count(*) from hooks' ,against_value_in => num_recs); g_run_assert_hook := TRUE; - end; + end WTPLSQL_RUN; $END ----------------%WTPLSQL_end_ignore_lines%---------------- --==============================================================-- diff --git a/src/core/wt_assert.pkb b/src/core/wt_assert.pkb index 4a0ab66..463e5dc 100644 --- a/src/core/wt_assert.pkb +++ b/src/core/wt_assert.pkb @@ -106,7 +106,7 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- if g_rec.raise_exception and not g_rec.last_pass then - raise_application_error(-20003, g_rec.last_msg || CHR(10) || + raise_application_error(-20004, g_rec.last_msg || CHR(10) || ' Assertion ' || g_rec.last_assert || ' Failed.' || CHR(10) || ' Testcase: ' || g_testcase || CHR(10) || ' ' || g_rec.last_details ); diff --git a/src/gui/wt_scheduler_jobs.vw b/src/core/wt_scheduler_jobs.vw similarity index 100% rename from src/gui/wt_scheduler_jobs.vw rename to src/core/wt_scheduler_jobs.vw diff --git a/src/core/wtplsql.pkb b/src/core/wtplsql.pkb index 5ba21a5..f13937c 100644 --- a/src/core/wtplsql.pkb +++ b/src/core/wtplsql.pkb @@ -424,7 +424,6 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- procedure test_run (in_package_name in varchar2) is - pragma AUTONOMOUS_TRANSACTION; -- Required if called as Remote Procedure Call (RPC) l_error_stack varchar2(32000); begin $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ @@ -433,8 +432,6 @@ begin return; -- Avoid running the TEST_RUN procedure for some self-tests end if; $END ----------------%WTPLSQL_end_ignore_lines%---------------- - -- Start a new Transaction - COMMIT; -- Initialize core_data.init1(in_package_name); g_DBOUT := ''; @@ -457,12 +454,9 @@ begin ,check_this_in => substr(core_data.g_run_rec.error_message,1,60)); end; -- Finalize - rollback; -- Discard any pending transactions. core_data.finalize; find_dbout; hook.after_test_run; - -- Required if called as Remote Procedure Call (RPC) - COMMIT; --exception -- when OTHERS -- then Allow WTPLSQL exception (Unhandled) @@ -476,6 +470,22 @@ end test_run; --==============================================================-- +------------------------------------------------------------ +procedure test_run_schema + (in_schema_name in varchar2 + ,in_package_name in varchar2) +is +begin + dbms_scheduler.create_job + (job_name => 'WT_RUN_SCHEMA_' || + substr(in_schema_name,1,100) + ,job_type => 'PLSQL Block' + ,job_action => 'begin wtplsql.test_run(' || + in_package_name || '); end;' + ,credential_name => in_schema_name); +end test_run_schema; + + ------------------------------------------------------------ procedure test_all is @@ -526,6 +536,38 @@ $THEN $END ----------------%WTPLSQL_end_ignore_lines%---------------- +------------------------------------------------------------ +procedure test_all_schema + (in_schema_name in varchar2) +is +begin + null; +end test_all_schema; + +------------------------------------------------------------ +procedure test_all_schema_parallel +is +begin + null; +end test_all_schema_parallel; + +------------------------------------------------------------ +procedure test_all_schema_sequential +is +begin + null; +end test_all_schema_sequential; + +------------------------------------------------------------ +procedure wait_for_all_schema + (in_timeout_seconds in number default null + ,in_check_interval_seconds in number default 60) +is +begin + null; +end wait_for_all_schema; + + --==============================================================-- $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN diff --git a/src/core/wtplsql.pks b/src/core/wtplsql.pks index 9dae630..b849fcb 100644 --- a/src/core/wtplsql.pks +++ b/src/core/wtplsql.pks @@ -16,11 +16,39 @@ as -- Modify as required g_DBOUT varchar2(128); + -- Run a single test runner in the current schema + -- Returns after test runner is complete procedure test_run (in_package_name in varchar2); + -- Run a single test runner in a different schema + -- Returns before test runner is complete + procedure test_run_schema + (in_schema_name in varchar2 + ,in_package_name in varchar2); + + -- Run all test runners in the current schema + -- Returns after all test runners are complete procedure test_all; + -- Run all test runners in a different schema + -- Returns before all test runners are complete + procedure test_all_schema + (in_schema_name in varchar2); + + -- Run all test runners in all schema in sequence + -- Returns before all test runners are complete + procedure test_all_schema_sequential; + + -- Run all test runners in all schema in parallel + -- Returns before all test runners are complete + procedure test_all_schema_parallel; + + -- Waits for all test runners to complete + procedure wait_for_all_schema + (in_timeout_seconds in number default null + ,in_check_interval_seconds in number default 60); + -- WtPLSQL Self Test Procedures -- -- alter system set PLSQL_CCFLAGS = From 789808cc6710f0780197136dd699d2cd47293dd3 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Sun, 9 Dec 2018 23:25:18 -0600 Subject: [PATCH 046/141] Finish Core Testing, Update Documetation --- docs/core/Call_Tree_Diagrams.odg | Bin 25165 -> 27279 bytes src/core/core_data.pkb | 128 ++++++++++++++------- src/core/core_data.pks | 4 +- src/core/hook.pkb | 17 ++- src/core/install.sql | 16 ++- src/core/test_all.sql | 1 - src/core/test_allO.LST | 37 +++--- src/core/wt_assert.pkb | 22 ++++ src/core/wt_assert.pks | 2 +- src/core/wt_execute_test_runner.prc | 3 +- src/core/wtplsql.pkb | 127 +++++++++----------- src/core/wtplsql.pks | 24 ---- src/persist/wt_job.pkb | 79 +++++++++++++ src/persist/wt_job.pks | 39 +++++++ src/persist/wt_results.tab | 6 +- src/{core => persist}/wt_scheduler_jobs.vw | 0 16 files changed, 330 insertions(+), 175 deletions(-) create mode 100644 src/persist/wt_job.pkb create mode 100644 src/persist/wt_job.pks rename src/{core => persist}/wt_scheduler_jobs.vw (100%) diff --git a/docs/core/Call_Tree_Diagrams.odg b/docs/core/Call_Tree_Diagrams.odg index ad4e13a0500e37303a07444bc1c666a16ad33c71..6e4ab977966a15e91281dc6ad878f762347bfee0 100644 GIT binary patch delta 24706 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%0A`rS@xAM>M%~ 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 x+E6k5ef+T{|ijmCxrk2 delta 22580 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 0 @@ -465,19 +462,28 @@ begin l_testcase := g_tcases_aa.NEXT(l_testcase); end loop; end if; - g_run_rec.end_dtm := systimestamp; - l_interval_buff := g_run_rec.end_dtm - g_run_rec.start_dtm; - g_run_rec.runner_sec := (extract(second from l_interval_buff) + - 60 * ( extract(minute from l_interval_buff) + - 60 * ( extract(hour from l_interval_buff) + - 24 * ( extract(day from l_interval_buff) - ) ) ) ); + -- + if g_results_nt.COUNT > 1 + then + -- Need at least 2 elements because the last element is NULL. + g_run_rec.fst_assrt_dtm := g_results_nt(1).executed_dtm; + g_run_rec.lst_assrt_dtm := g_results_nt(g_results_nt.COUNT-1).executed_dtm; + end if; + -- Remove the Last (Empty) Array Element g_results_nt.delete(g_results_nt.COUNT); -end finalize; + -- Update Test Run Data + g_run_rec.end_dtm := systimestamp; + l_interval_buff := g_run_rec.end_dtm - g_run_rec.start_dtm; + g_run_rec.runner_sec := (extract(second from l_interval_buff) + + 60 * ( extract(minute from l_interval_buff) + + 60 * ( extract(hour from l_interval_buff) + + 24 * ( extract(day from l_interval_buff) + ) ) ) ); +end final1; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN - procedure t_finalize + procedure t_final1 is l_run_recSAVE run_rec_type; l_tcases_aaSAVE tcases_aa_type; @@ -487,11 +493,11 @@ $THEN l_results_ntTEST results_nt_type; begin -------------------------------------- WTPLSQL Testing -- - wt_assert.g_testcase := 'Finalize Happy Path'; + wt_assert.g_testcase := 'FINAL "One" Happy Path'; l_run_recSAVE := g_run_rec; l_tcases_aaSAVE := g_tcases_aa; l_results_ntSAVE := g_results_nt; - finalize; + final1; l_run_recTEST := g_run_rec; l_tcases_aaTEST := g_tcases_aa; l_results_ntTEST := g_results_nt; @@ -499,18 +505,55 @@ $THEN g_tcases_aa := l_tcases_aaSAVE; g_results_nt := l_results_ntSAVE; -------------------------------------- WTPLSQL Testing -- + -- Update Test Case Data + wt_assert.isnotnull + (msg_in => 'l_run_recTEST.tc_cnt' + ,check_this_in => l_run_recTEST.tc_cnt); + wt_assert.this + (msg_in => 'l_run_recTEST.tc_cnt > 0' + ,check_this_in => l_run_recTEST.tc_cnt > 0); + wt_assert.isnotnull + (msg_in => 'l_run_recTEST.tc_fail' + ,check_this_in => l_run_recTEST.tc_fail); + wt_assert.this + (msg_in => 'l_run_recTEST.tc_fail >= 0' + ,check_this_in => l_run_recTEST.tc_fail >= 0); + -------------------------------------- WTPLSQL Testing -- + -- Need at least 2 elements because the last element is NULL. wt_assert.isnull - (msg_in => 'l_run_recSAVE.end_dtm' - ,check_this_in => l_run_recSAVE.end_dtm); + (msg_in => 'l_run_recSAVE.fst_assrt_dtm' + ,check_this_in => l_run_recSAVE.fst_assrt_dtm); wt_assert.isnotnull - (msg_in => 'l_run_recTEST.end_dtm' - ,check_this_in => l_run_recTEST.end_dtm); + (msg_in => 'l_run_recTEST.fst_assrt_dtm' + ,check_this_in => l_run_recTEST.fst_assrt_dtm); + wt_assert.isnull + (msg_in => 'l_run_recSAVE.lst_assrt_dtm' + ,check_this_in => l_run_recSAVE.lst_assrt_dtm); + wt_assert.isnotnull + (msg_in => 'l_run_recTEST.lst_assrt_dtm' + ,check_this_in => l_run_recTEST.lst_assrt_dtm); + -------------------------------------- WTPLSQL Testing -- + -- Remove the Last (Empty) Array Element wt_assert.eq (msg_in => 'l_results_ntTEST.COUNT = ' || 'l_results_ntSAVE.COUNT - 1' ,check_this_in => l_results_ntTEST.COUNT ,against_this_in => l_results_ntSAVE.COUNT - 1); - end t_finalize; + -------------------------------------- WTPLSQL Testing -- + -- Update Test Run Data + wt_assert.isnull + (msg_in => 'l_run_recSAVE.end_dtm' + ,check_this_in => l_run_recSAVE.end_dtm); + wt_assert.isnotnull + (msg_in => 'l_run_recTEST.end_dtm' + ,check_this_in => l_run_recTEST.end_dtm); + wt_assert.isnotnull + (msg_in => 'l_run_recTEST.runner_sec' + ,check_this_in => l_run_recTEST.runner_sec); + wt_assert.this + (msg_in => 'l_run_recTEST.runner_sec >= l_run_recSAVE.runner_sec' + ,check_this_in => l_run_recTEST.runner_sec >= l_run_recSAVE.runner_sec); + end t_final1; $END ----------------%WTPLSQL_end_ignore_lines%---------------- @@ -605,7 +648,8 @@ $THEN t_init1; t_init2; t_add; - t_finalize; + t_final1; + --t_final2; t_run_error; end; $END ----------------%WTPLSQL_end_ignore_lines%---------------- diff --git a/src/core/core_data.pks b/src/core/core_data.pks index e859cbc..223e38f 100644 --- a/src/core/core_data.pks +++ b/src/core/core_data.pks @@ -12,6 +12,8 @@ is ,dbout_type varchar2(20) -- Type of the Database Object Under Test ,start_dtm timestamp(3) with time zone -- Test Runner Start Date/Time ,end_dtm timestamp(3) with time zone -- Test Runner End Date/Time + ,fst_assrt_dtm timestamp(3) with time zone -- Date/Time of First Assertion + ,lst_assrt_dtm timestamp(3) with time zone -- Date/Time of Last Assertion ,error_message varchar2(4000) -- Error Message ,runner_sec number(6,1) default 0 -- Total Runtime for Test Runner in Seconds ,tc_cnt number(7) default 0 -- Number of Test Cases @@ -61,7 +63,7 @@ is ,in_details in varchar2 ,in_message in varchar2); - procedure finalize; + procedure final1; procedure run_error (in_error_message in varchar2); diff --git a/src/core/hook.pkb b/src/core/hook.pkb index c391b40..ce55c14 100644 --- a/src/core/hook.pkb +++ b/src/core/hook.pkb @@ -11,10 +11,25 @@ as procedure run_hooks (in_hook_name in varchar2) is + l_error_stack varchar2(32000); begin for i in 1 .. g_run_aa(in_hook_name).COUNT loop - execute immediate g_run_aa(in_hook_name)(i); + begin + execute immediate g_run_aa(in_hook_name)(i); + exception + when OTHERS + then + l_error_stack := 'Hook Error in ' || in_hook_name || + '(' || i || ')' || CHR(10) || + dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace; + core_data.run_error(l_error_stack); + wt_assert.isnull + (msg_in => 'Un-handled Exception in ' || + in_hook_name || ' Hook' + ,check_this_in => l_error_stack); + end; end loop; end run_hooks; diff --git a/src/core/install.sql b/src/core/install.sql index fa125e2..eb80d68 100644 --- a/src/core/install.sql +++ b/src/core/install.sql @@ -45,13 +45,13 @@ grant create job to &schema_owner.; grant create public synonym to &schema_owner.; -- For DBOUT Check. -grant select on dba_objects to &schema_owner.; +grant select on dba_objects to &schema_owner. with grant option; -- For Qualified Test Runners View -grant select on dba_procedures to &schema_owner.; +grant select on dba_procedures to &schema_owner. with grant option; -- For Profiler -grant select on dba_source to &schema_owner.; +grant select on dba_source to &schema_owner. with grant option; -- For GUI -grant select on sys.gv_$parameter to &schema_owner.; +grant select on sys.gv_$parameter to &schema_owner. with grant option; begin for buff in (select p.value PLSQL_CCFLAGS @@ -175,6 +175,13 @@ create or replace public synonym wt_execute_test_runner for wt_execute_test_runn @wt_text_report.pkb / +-- Views +@wt_qual_test_runners_vw.vw +/ + +@wt_scheduler_jobs_vw.vw +/ + -- Configuration Data -- This is the default test runner execution procedure @@ -191,6 +198,5 @@ insert into hooks (hook_name, seq, run_string) commit; - set showmode on spool off diff --git a/src/core/test_all.sql b/src/core/test_all.sql index f7b516f..ed698f9 100644 --- a/src/core/test_all.sql +++ b/src/core/test_all.sql @@ -29,7 +29,6 @@ end; begin wtplsql.test_all; - wt_text_report.dbms_out(in_detail_level => 30); end; / diff --git a/src/core/test_allO.LST b/src/core/test_allO.LST index 993c552..3aace6c 100644 --- a/src/core/test_allO.LST +++ b/src/core/test_allO.LST @@ -1,59 +1,56 @@ - wtPLSQL 1.2.0 - Start Date/Time: 25-Nov-2018 07:58:12 PM + wtPLSQL 1.2.0 - Start Date/Time: 09-Dec-2018 08:21:47 PM Test Results for WTP.CORE_DATA Database Object Under Test is PACKAGE BODY WTP.CORE_DATA ---------------------------------------- - Minimum Elapsed msec: 0 Total Assertions: 54 + Minimum Elapsed msec: 0 Total Assertions: 64 Average Elapsed msec: 0 Total Testcases: 8 - Maximum Elapsed msec: 1 Failed Testcases: 0 - Total Run Time (sec): 0.0 Testcase Yield: 100% + Maximum Elapsed msec: 3 Failed Testcases: 0 + Total Run Time (sec): 0.2 Testcase Yield: 100% WTP.CORE_DATA Test Runner Details: ---------------------------------------- - wtPLSQL 1.2.0 - Start Date/Time: 25-Nov-2018 07:58:12 PM + wtPLSQL 1.2.0 - Start Date/Time: 09-Dec-2018 08:21:47 PM Test Results for WTP.HOOK Database Object Under Test is PACKAGE BODY WTP.HOOK ---------------------------------------- Minimum Elapsed msec: 0 Total Assertions: 18 - Average Elapsed msec: 2 Total Testcases: 4 - Maximum Elapsed msec: 12 Failed Testcases: 0 - Total Run Time (sec): 0.0 Testcase Yield: 100% + Average Elapsed msec: 1 Total Testcases: 4 + Maximum Elapsed msec: 4 Failed Testcases: 0 + Total Run Time (sec): 0.1 Testcase Yield: 100% WTP.HOOK Test Runner Details: ---------------------------------------- - wtPLSQL 1.2.0 - Start Date/Time: 25-Nov-2018 07:58:12 PM + wtPLSQL 1.2.0 - Start Date/Time: 09-Dec-2018 08:21:47 PM Test Results for WTP.WTPLSQL ---------------------------------------- Minimum Elapsed msec: 0 Total Assertions: 26 - Average Elapsed msec: 15 Total Testcases: 11 - Maximum Elapsed msec: 125 Failed Testcases: 0 - Total Run Time (sec): 0.4 Testcase Yield: 100% + Average Elapsed msec: 18 Total Testcases: 11 + Maximum Elapsed msec: 173 Failed Testcases: 0 + Total Run Time (sec): 0.5 Testcase Yield: 100% WTP.WTPLSQL Test Runner Details: ---------------------------------------- - wtPLSQL 1.2.0 - Start Date/Time: 25-Nov-2018 07:58:12 PM + wtPLSQL 1.2.0 - Start Date/Time: 09-Dec-2018 08:21:48 PM Test Results for WTP.WT_ASSERT Database Object Under Test is PACKAGE BODY WTP.WT_ASSERT ---------------------------------------- - Minimum Elapsed msec: 0 Total Assertions: 404 - Average Elapsed msec: 6 Total Testcases: 150 - Maximum Elapsed msec: 449 Failed Testcases: 0 - Total Run Time (sec): 2.6 Testcase Yield: 100% + Minimum Elapsed msec: 0 Total Assertions: 405 + Average Elapsed msec: 3 Total Testcases: 151 + Maximum Elapsed msec: 111 Failed Testcases: 0 + Total Run Time (sec): 1.4 Testcase Yield: 100% WTP.WT_ASSERT Test Runner Details: ---------------------------------------- - -PL/SQL procedure successfully completed. - diff --git a/src/core/wt_assert.pkb b/src/core/wt_assert.pkb index 463e5dc..99b5948 100644 --- a/src/core/wt_assert.pkb +++ b/src/core/wt_assert.pkb @@ -117,7 +117,9 @@ $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN procedure t_process_assertion is + l_msg varchar2(100) := 'Check Exception Processing'; begin + wt_assert.g_testcase := 'Test Process Assertion'; -------------------------------------- WTPLSQL Testing -- g_testcase := 'PROCESS_ASSERTION'; g_rec.last_assert := 'THIS'; @@ -127,11 +129,31 @@ $THEN g_rec.raise_exception := TRUE; wtplsql_skip_save := TRUE; process_assertion; -- Should throw exception + -------------------------------------- WTPLSQL Testing -- wtplsql_skip_save := FALSE; + wt_assert.isnull + (msg_in => l_msg + ,check_this_in => 'Exception missing, should not have arrived here'); -------------------------------------- WTPLSQL Testing -- exception when ASSERT_FAILURE_EXCEPTION then wtplsql_skip_save := FALSE; + wt_assert.eq + (msg_in => l_msg + ,check_this_in => SQLERRM + ,against_this_in => +'ORA-20004: Process Assertion Forced Failure + Assertion THIS Failed. + Testcase: PROCESS_ASSERTION + Expected "PASS" and got "FAIL"'); + when OTHERS then + wtplsql_skip_save := FALSE; + wt_assert.isnull + (msg_in => l_msg + ,check_this_in => 'Incorrect Exception Thrown: ' || + substr(dbms_utility.format_error_stack || + dbms_utility.format_error_backtrace + ,1,3950) ); end t_process_assertion; $END ----------------%WTPLSQL_end_ignore_lines%---------------- diff --git a/src/core/wt_assert.pks b/src/core/wt_assert.pks index 4a31ee9..7488d66 100644 --- a/src/core/wt_assert.pks +++ b/src/core/wt_assert.pks @@ -4,7 +4,7 @@ is -- AUTHID CURRENT_USER is required for dynamic PL/SQL execution. ASSERT_FAILURE_EXCEPTION exception; - PRAGMA EXCEPTION_INIT(ASSERT_FAILURE_EXCEPTION, -20003); + PRAGMA EXCEPTION_INIT(ASSERT_FAILURE_EXCEPTION, -20004); -- See RESET_GLOBALS procedure for default global values diff --git a/src/core/wt_execute_test_runner.prc b/src/core/wt_execute_test_runner.prc index 0fc6157..9443809 100644 --- a/src/core/wt_execute_test_runner.prc +++ b/src/core/wt_execute_test_runner.prc @@ -5,8 +5,7 @@ create or replace procedure wt_execute_test_runner is sql_txt varchar2(4000); begin - sql_txt := 'begin "' || core_data.g_run_rec.runner_owner || - '"."' || core_data.g_run_rec.runner_name || + sql_txt := 'begin "' || core_data.g_run_rec.runner_name || '".' || wtplsql.C_RUNNER_ENTRY_POINT || '; end;'; --dbms_output.put_line(sql_txt); execute immediate sql_txt; diff --git a/src/core/wtplsql.pkb b/src/core/wtplsql.pkb index f13937c..7bb5bc9 100644 --- a/src/core/wtplsql.pkb +++ b/src/core/wtplsql.pkb @@ -28,14 +28,13 @@ begin end if; -- Check for Valid Runner Name select count(*) into l_package_check - from user_procedures - where procedure_name = C_RUNNER_ENTRY_POINT - and object_name = core_data.g_run_rec.runner_name - and object_type = 'PACKAGE'; + from wt_qual_test_runners_vw + where owner = core_data.g_run_rec.runner_owner + and package_name = core_data.g_run_rec.runner_name; if l_package_check = 0 then raise_application_error (-20002, 'RUNNER_NAME Procedure "' || - core_data.g_run_rec.runner_name || + core_data.g_run_rec.runner_name || '.' || C_RUNNER_ENTRY_POINT || '" is not valid' ); end if; @@ -206,6 +205,13 @@ begin core_data.run_error('Found too many database objects "' || g_DBOUT || '".' ); return; + when OTHERS + then + core_data.g_run_rec.dbout_owner := ''; + core_data.g_run_rec.dbout_name := ''; + core_data.g_run_rec.dbout_type := ''; + core_data.run_error('Error finding database object: ' || SQLERRM); + return; end; -- end find_dbout; @@ -424,42 +430,51 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- procedure test_run (in_package_name in varchar2) is - l_error_stack varchar2(32000); begin + -- $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ if wtplsql_skip_test then test_all_aa(in_package_name) := 'X'; return; -- Avoid running the TEST_RUN procedure for some self-tests end if; $END ----------------%WTPLSQL_end_ignore_lines%---------------- - -- Initialize + -- + -- Primary Initialize core_data.init1(in_package_name); g_DBOUT := ''; wt_assert.reset_globals; -- Reset the Test Runs Record before checking anything check_runner; + -- + $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ + if NOT wtplsql_skip_test then + -- This will avoid running the hook for some self-tests + -- hook.before_test_run; + -- + end if; + $END ----------------%WTPLSQL_end_ignore_lines%---------------- + -- + -- Secondary Initialize core_data.init2; - -- Call the Test Runner - begin - hook.execute_test_runner; - exception - when OTHERS - then - l_error_stack := dbms_utility.format_error_stack || - dbms_utility.format_error_backtrace ; - core_data.run_error(l_error_stack); - wt_assert.isnull - (msg_in => 'Un-handled Exception from Test Runner' - ,check_this_in => substr(core_data.g_run_rec.error_message,1,60)); - end; - -- Finalize - core_data.finalize; + g_DBOUT := ''; + -- + hook.execute_test_runner; + -- + -- Primary Finalize find_dbout; + core_data.final1; + g_DBOUT := ''; + -- + $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ + if NOT wtplsql_skip_test then + -- This will avoid running the hook for some self-tests + -- hook.after_test_run; ---exception --- when OTHERS --- then Allow WTPLSQL exception (Unhandled) + -- + end if; + $END ----------------%WTPLSQL_end_ignore_lines%---------------- + -- end test_run; @@ -470,33 +485,22 @@ end test_run; --==============================================================-- ------------------------------------------------------------- -procedure test_run_schema - (in_schema_name in varchar2 - ,in_package_name in varchar2) -is -begin - dbms_scheduler.create_job - (job_name => 'WT_RUN_SCHEMA_' || - substr(in_schema_name,1,100) - ,job_type => 'PLSQL Block' - ,job_action => 'begin wtplsql.test_run(' || - in_package_name || '); end;' - ,credential_name => in_schema_name); -end test_run_schema; - - ------------------------------------------------------------ procedure test_all is TYPE runners_nt_type is table of varchar2(128); l_runners_nt runners_nt_type; begin + -- $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ if NOT wtplsql_skip_test then - hook.before_test_all; -- Avoid running the hook for some self-tests + -- This will avoid running the hook for some self-tests + -- + hook.before_test_all; + -- end if; $END ----------------%WTPLSQL_end_ignore_lines%---------------- + -- select object_name bulk collect into l_runners_nt from user_procedures t1 @@ -508,11 +512,16 @@ begin loop test_run(l_runners_nt(i)); end loop; + -- $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ if NOT wtplsql_skip_test then - hook.after_test_all; -- Avoid running the hook for some self-tests + -- This will avoid running the hook for some self-tests + -- + hook.after_test_all; + -- end if; $END ----------------%WTPLSQL_end_ignore_lines%---------------- + -- end test_all; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ @@ -536,38 +545,6 @@ $THEN $END ----------------%WTPLSQL_end_ignore_lines%---------------- ------------------------------------------------------------- -procedure test_all_schema - (in_schema_name in varchar2) -is -begin - null; -end test_all_schema; - ------------------------------------------------------------- -procedure test_all_schema_parallel -is -begin - null; -end test_all_schema_parallel; - ------------------------------------------------------------- -procedure test_all_schema_sequential -is -begin - null; -end test_all_schema_sequential; - ------------------------------------------------------------- -procedure wait_for_all_schema - (in_timeout_seconds in number default null - ,in_check_interval_seconds in number default 60) -is -begin - null; -end wait_for_all_schema; - - --==============================================================-- $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN diff --git a/src/core/wtplsql.pks b/src/core/wtplsql.pks index b849fcb..5bf1bbf 100644 --- a/src/core/wtplsql.pks +++ b/src/core/wtplsql.pks @@ -21,34 +21,10 @@ as procedure test_run (in_package_name in varchar2); - -- Run a single test runner in a different schema - -- Returns before test runner is complete - procedure test_run_schema - (in_schema_name in varchar2 - ,in_package_name in varchar2); - -- Run all test runners in the current schema -- Returns after all test runners are complete procedure test_all; - -- Run all test runners in a different schema - -- Returns before all test runners are complete - procedure test_all_schema - (in_schema_name in varchar2); - - -- Run all test runners in all schema in sequence - -- Returns before all test runners are complete - procedure test_all_schema_sequential; - - -- Run all test runners in all schema in parallel - -- Returns before all test runners are complete - procedure test_all_schema_parallel; - - -- Waits for all test runners to complete - procedure wait_for_all_schema - (in_timeout_seconds in number default null - ,in_check_interval_seconds in number default 60); - -- WtPLSQL Self Test Procedures -- -- alter system set PLSQL_CCFLAGS = diff --git a/src/persist/wt_job.pkb b/src/persist/wt_job.pkb new file mode 100644 index 0000000..3053ee4 --- /dev/null +++ b/src/persist/wt_job.pkb @@ -0,0 +1,79 @@ +create or replace package body wt_job +as + + +---------------------- +-- Private Procedures +---------------------- + + +--------------------- +-- Public Procedures +--------------------- + + +------------------------------------------------------------ +procedure test_run_schema + (in_schema_name in varchar2 + ,in_package_name in varchar2) +is +begin + dbms_scheduler.create_job + (job_name => 'WT_RUN_SCHEMA_' || + substr(in_schema_name,1,100) + ,job_type => 'PLSQL_BLOCK' + ,job_action => 'begin wtplsql.test_run(' || + in_package_name || '); end;' + ,credential_name => in_schema_name); +end test_run_schema; + + +------------------------------------------------------------ +procedure test_all_schema + (in_schema_name in varchar2) +is +begin + null; +end test_all_schema; + + +------------------------------------------------------------ +procedure test_all_schema_parallel +is +begin + null; +end test_all_schema_parallel; + + +------------------------------------------------------------ +procedure test_all_schema_sequential +is +begin + null; +end test_all_schema_sequential; + + +------------------------------------------------------------ +procedure wait_for_all_schema + (in_timeout_seconds in number default null + ,in_check_interval_seconds in number default 60) +is +begin + null; +end wait_for_all_schema; + + +--==============================================================-- +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure WTPLSQL_RUN + is + begin + -------------------------------------- WTPLSQL Testing -- + null; + end; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- +--==============================================================-- + + +end wtplsql; diff --git a/src/persist/wt_job.pks b/src/persist/wt_job.pks new file mode 100644 index 0000000..a4a3d1a --- /dev/null +++ b/src/persist/wt_job.pks @@ -0,0 +1,39 @@ +create or replace package wt_job + authid definer +as + + -- Run all test runners in a different schema + -- Returns before all test runners are complete + procedure test_all_schema + (in_schema_name in varchar2); + + -- Run all test runners in all schema in sequence + -- Returns before all test runners are complete + procedure test_all_schema_sequential; + + -- Run all test runners in all schema in parallel + -- Returns before all test runners are complete + procedure test_all_schema_parallel; + + -- Waits for all test runners to complete + procedure wait_for_all_schema + (in_timeout_seconds in number default null + ,in_check_interval_seconds in number default 60); + + -- WtPLSQL Self Test Procedures + -- + -- alter system set PLSQL_CCFLAGS = + -- 'WTPLSQL_ENABLE:TRUE, WTPLSQL_SELFTEST:TRUE' + -- scope=BOTH; + -- + -- begin + -- dbms_utility.compile_schema('WTP',TRUE,FALSE); + -- end; + -- / + -- + $IF $$WTPLSQL_SELFTEST + $THEN + procedure WTPLSQL_RUN; + $END + +end wt_job; diff --git a/src/persist/wt_results.tab b/src/persist/wt_results.tab index d6757ae..07a01de 100644 --- a/src/persist/wt_results.tab +++ b/src/persist/wt_results.tab @@ -7,7 +7,7 @@ create table wt_results (test_run_id number(38) constraint wt_results_nn1 not null ,result_seq number(8) constraint wt_results_nn2 not null ,testcase_id number(38) constraint wt_results_nn3 not null - ,executed_dtm timestamp(6) constraint wt_results_nn4 not null + -- ,executed_dtm timestamp(6) constraint wt_results_nn4 not null ,interval_msecs number(10,3) constraint wt_results_nn5 not null ,assertion varchar2(15) constraint wt_results_nn6 not null ,status varchar2(4) constraint wt_results_nn7 not null @@ -28,8 +28,8 @@ comment on table wt_results is 'Results data from Test Runs.'; comment on column wt_results.test_run_id is 'Foreign Key for the Test Run, Primary Key part 1.'; comment on column wt_results.result_seq is 'Sequence number for this Result, Primary Key part 2.'; comment on column wt_results.testcase_id is 'Foreign Key for the Test Case.'; -comment on column wt_results.executed_dtm is 'Date/Time (with Fractional Seconds) this Result was captured'; -comment on column wt_results.interval_msecs is 'Interval time in milliseonds since the previous Result or start ot the Test Run.'; +--comment on column wt_results.executed_dtm is 'Date/Time (with Fractional Seconds) this Result was captured'; +comment on column wt_results.interval_msecs is 'Interval time in milliseonds since the previous Result or start of the Test Run.'; comment on column wt_results.assertion is 'Name of the Assertion Test performed'; comment on column wt_results.status is 'PASS/FAIL Status from the Assertion'; comment on column wt_results.details is 'Assertion Details, i.e. Expected Value and Actual Value'; diff --git a/src/core/wt_scheduler_jobs.vw b/src/persist/wt_scheduler_jobs.vw similarity index 100% rename from src/core/wt_scheduler_jobs.vw rename to src/persist/wt_scheduler_jobs.vw From a9bade452b0990078767a52bc15294c02a94f889 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Wed, 26 Dec 2018 06:18:43 -0600 Subject: [PATCH 047/141] Minor Updates and Documentation Updates --- docs/core/Call_Tree_Diagrams.odg | Bin 27279 -> 26952 bytes docs/core/Call_Tree_Diagrams.pdf | Bin 364558 -> 300051 bytes src/core/hook.pkb | 9 ++-- src/core/wt_assert.pkb | 14 +++--- src/core/wt_text_report.pkb | 71 ++++++++++++++----------------- src/core/wt_text_report.pks | 21 ++++----- src/core/wtplsql.pkb | 24 +++++------ 7 files changed, 63 insertions(+), 76 deletions(-) diff --git a/docs/core/Call_Tree_Diagrams.odg b/docs/core/Call_Tree_Diagrams.odg index 6e4ab977966a15e91281dc6ad878f762347bfee0..04fc66bba582f45792a0ebb489267d9a85f2e4a7 100644 GIT binary patch delta 23044 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 delta 23352 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 V9v$OPJMq(!^Tb&CZ2#xze*k?ckoN!p diff --git a/docs/core/Call_Tree_Diagrams.pdf b/docs/core/Call_Tree_Diagrams.pdf index f3ebd38b5858daaf03d716e5f69b6812b5802a95..5614d7be9ec8f64dbace1b0736e20b3fa28b2448 100644 GIT binary patch literal 300051 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�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

    4|+r^Wsc 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
    xiP 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%0AbY;58D&Z9FVNAMpNfK2RwE`$FnX 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

    `@UlYBw*hOfBKhnRhAa)Gk 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 delta 229790 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 pgJ@{TBGpth)DbF-|7j3u 'TEST_ALL_PAR': group by proc.owner'|| order by proc.owner )'|| - - -Gui Demo - - 1) Demo Installation - 2) Demo Review ??? - 3) GUI Installation - 4) Setup DB Link and Job Queue Process Parameter - 5) Run Demo Test (w/ Test Case, No DBOUT) - 6) Review Test Run - 7) Review Test Case - 8) Run Demo Test (w/ DBOUT) - 9) Review Test Run -10) Search DBOUT -11) Run Test All -10) Dashboard - -A Relational Alternative to JUnit Testing -White Box Testing for PLSQL diff --git a/src/gui/README.md b/src/gui/README.md new file mode 100644 index 0000000..2e606db --- /dev/null +++ b/src/gui/README.md @@ -0,0 +1,38 @@ +# Application Express Scripts + + +File Name | Description +------------------|------------ +f700.sql | APEX Application for wtPLSQL +install.sql | Main Installation Script +WTP_workspace.sql | APEX Workspace for wtPLSQL + + +** Note: Requires installation of Persist Add-on. + + +### Install Procedure + +1) sqlplus SYS/password as SYSDBA @install +2) exit +3) Compare install.LST to install.LST + + +### Un-install Procedure + + + +### Gui Demo + + 1) Demo Installation + 2) Demo Review ??? + 3) GUI Installation + 4) Setup DB Link and Job Queue Process Parameter + 5) Run Demo Test (w/ Test Case, No DBOUT) + 6) Review Test Run + 7) Review Test Case + 8) Run Demo Test (w/ DBOUT) + 9) Review Test Run +10) Search DBOUT +11) Run Test All +10) Dashboard diff --git a/src/junit/README.md b/src/junit/README.md new file mode 100644 index 0000000..2cd8543 --- /dev/null +++ b/src/junit/README.md @@ -0,0 +1,24 @@ +# JUnit XML Report Scripts + + +File Name | Description +--------------------------|------------ +junit_core_install.sql | Install JUnit XML (from CORE_DATA) +junit_core_report.pkb | Package for creating JUnit XML from CORE_DATA +junit_core_report.pks | Package Body for creating JUnit XML from CORE_DATA +junit_core_uninstall.sql | Un-Install JUnit XML (from CORE_DATA) +junit_persist_report.pks | Package Body for creating JUnit XML from Tables + + +### JUnit Core Install Procedure + +1) Review ../common_setup.sql +2) Review junit_core_install.sql +3) Run junit_core_install.sql using SQL*Plus + + +### JUnit Core Un-Install Procedure + +1) Review ../common_setup.sql +2) Review junit_core_uninstall.sql +3) Run junit_core_uninstall.sql using SQL*Plus diff --git a/src/junit/README.txt b/src/junit/README.txt deleted file mode 100644 index f1072cf..0000000 --- a/src/junit/README.txt +++ /dev/null @@ -1,24 +0,0 @@ - - White Box PL/SQL Testing - src/junit/README.txt - -FILE DESCRIPTION ------------------------- ----------------------- -junit_core_install.sql Install JUnit XML (from CORE_DATA) -junit_core_report.pkb Package for creating JUnit XML from CORE_DATA -junit_core_report.pks Package Body for creating JUnit XML from CORE_DATA -junit_core_uninstall.sql Un-Install JUnit XML (from CORE_DATA) -junit_persist_report.pks Package Body for creating JUnit XML from Tables - - -JUnit Core Install Procedure: ------------------------------ -1) Review ../common_setup.sql -2) Review junit_core_install.sql -3) Run junit_core_install.sql using SQL*Plus - -JUnit Core Un-Install Procedure: --------------------------------- -1) Review ../common_setup.sql -2) Review junit_core_uninstall.sql -3) Run junit_core_uninstall.sql using SQL*Plus diff --git a/src/persist/README.md b/src/persist/README.md new file mode 100644 index 0000000..8e794b1 --- /dev/null +++ b/src/persist/README.md @@ -0,0 +1,15 @@ +# Persist Add-on Scripts + + +File Name | Description +--------------------------|------------ + + +### Install Procedure + +1) + + +### Un-Install Procedure + +1) diff --git a/src/persist/releases/V1.1.0/upgrade_from_V1.0.0/README.txt b/src/persist/releases/V1.1.0/upgrade_from_V1.0.0/README.txt deleted file mode 100644 index 43fbb79..0000000 --- a/src/persist/releases/V1.1.0/upgrade_from_V1.0.0/README.txt +++ /dev/null @@ -1,16 +0,0 @@ - - White Box PL/SQL Testing - V1.0.0 to V1.1.0 ReadMe - -FILE DESCRIPTION ----------------------- ----------------------- -update_all_stats.sql Populate the new STATS tables -upgrade.sql Main upgrade script -upgradeO.LST Example of successful results from Demo Installation - - -Install Procedure: ------------------- -1) sqlplus SYS/password as SYSDBA @upgrade -2) exit -3) Compare upgrade.LST to upgradeO.LST diff --git a/src/persist/releases/V1.2.0/upgrade_from_V1.1.0/README.txt b/src/persist/releases/V1.2.0/upgrade_from_V1.1.0/README.txt deleted file mode 100644 index 08d9e6e..0000000 --- a/src/persist/releases/V1.2.0/upgrade_from_V1.1.0/README.txt +++ /dev/null @@ -1,15 +0,0 @@ - - White Box PL/SQL Testing - V1.1.0 to Current ReadMe - -FILE DESCRIPTION ----------------------- ----------------------- -upgrade.sql Main upgrade script -upgradeO.LST Example of successful results from Demo Installation - - -Install Procedure: ------------------- -1) sqlplus SYS/password as SYSDBA @upgrade -2) exit -3) Compare upgrade.LST to upgradeO.LST From f72a76b789b125764c890478585a480adc1fb164 Mon Sep 17 00:00:00 2001 From: Duane Dieterich Date: Mon, 31 Dec 2018 16:52:53 -0600 Subject: [PATCH 049/141] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9769555..9f1a281 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Welcome to the wtPLSQL repository on GitHub. This site is for contributors. -[wtPLSQL website (on GitHub.io)](https://ddieterich.github.io/wtPLSQL/) +[wtPLSQL website (on GitHub.io)](https://wtPLSQL.org) The wtPLSQL website has more information about how to use wtPLSQL and why it is different. It also includes wtPLSQL features, definitions, and best practices. From 20e34972219f22281fa24b27e0c0745549dcabab Mon Sep 17 00:00:00 2001 From: Duane Dieterich Date: Mon, 31 Dec 2018 16:55:57 -0600 Subject: [PATCH 050/141] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9f1a281..a1b8f2d 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Welcome to the wtPLSQL repository on GitHub. This site is for contributors. -[wtPLSQL website (on GitHub.io)](https://wtPLSQL.org) +[wtPLSQL website](https://wtPLSQL.org) (Hosted on GitHub.io using a custom domain.) The wtPLSQL website has more information about how to use wtPLSQL and why it is different. It also includes wtPLSQL features, definitions, and best practices. From 23ad7e6e3d9ae515eda9cf860927f291025fdfb8 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Wed, 2 Jan 2019 19:35:33 -0600 Subject: [PATCH 051/141] Messed-up from Master Checkout? --- README.md | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index b0073d9..95298c8 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,23 @@ -# wtPLSQL - PL/SQL Whitebox Testing +# wtPLSQL - Whitebox Testing for PLSQL -Welcome to the wtPLSQL repository on GitHub. This site is for contributors. +Welcome to the wtPLSQL source code repository on GitHub. -[wtPLSQL website](https://wtPLSQL.org) (Hosted on GitHub.io using a custom domain.) - -The wtPLSQL website has more information about how to use wtPLSQL and why it is different. It also includes wtPLSQL features, definitions, and best practices. +The [wtPLSQL website](https://wtPLSQL.org) has more information about how to use wtPLSQL and why it is different. It also includes wtPLSQL features, definitions, and best practices. (The wtPLSQL website is hosted on GitHub.io using a custom domain.) [Get the latest release here.](https://github.com/DDieterich/wtPLSQL/releases) [wtPLSQL compatability wiki page.](https://github.com/DDieterich/wtPLSQL/wiki/Compatibility) +### Participation + +See the "To Do" column in one of the [Projects](https://github.com/DDieterich/wtPLSQL/projects) for cards/issues that are ready to work. + +The [repository wiki](https://github.com/DDieterich/wtPLSQL/wiki) includes helpful procedures and discussions. + +[DBDocs (like JavaDocs)](https://wtplsql.org/core/DBDocs/index.html) + +[E-R Diagram](https://wtplsql.org/core/ER_Diagrams.pdf) + ### Files and Directories File Name | Description @@ -20,16 +28,6 @@ src | Directory for source code. LICENSE | Open Source Terms and Conditions. README.md | Top level Markdown file for the wtPLSQL repository on GitHub -### Participation - -See the "To Do" column in one of the [Projects](https://github.com/DDieterich/wtPLSQL/projects) for cards/issues that are ready to work. - -The [repository wiki](https://github.com/DDieterich/wtPLSQL/wiki) includes helpful procedures and discussions. - -[DBDocs (like JavaDocs) on GitHub.io](https://ddieterich.github.io/wtPLSQL/core/DBDocs/index.html) - -[E-R Diagram on GitHub.io](https://ddieterich.github.io/wtPLSQL/core/ER_Diagrams.pdf) - --- _Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners._ From c9954d25b3878d487c24375c4e947b537e100f64 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Sun, 6 Jan 2019 17:30:06 -0600 Subject: [PATCH 052/141] Major documentation updates --- README.md | 12 +- docs/About-wtPLSQL.md | 93 +++++-------- docs/Core-Features.md | 16 +-- docs/OO-Style-Unit-Testing.md | 71 ++++++++++ docs/README.md | 129 ++++++++++++------ docs/README.txt | 25 ---- docs/core/README.md | 3 +- docs/demo/README.md | 26 ++-- docs/demo/Table-Test.md | 2 +- docs/demo/Test-Runner.md | 4 +- docs/demo/Trigger-Test.md | 2 +- docs/demo/Type-Test.md | 2 +- docs/demo/ut_betwnstr.md | 2 +- docs/demo/ut_calc_secs_between.md | 2 +- docs/demo/ut_str.md | 2 +- docs/demo/ut_truncit.md | 2 +- docs/gui/README.md | 2 +- docs/gui/README.txt | 25 ---- docs/persist/README.md | 2 +- docs/utPLSQL-V2-Comparison.md | 36 +++-- docs/utPLSQL-V3-Comparison.md | 48 ++----- .../upgrade_from_V1.0.0/update_all_stats.sql | 2 +- src/README.md | 1 - src/core/install.sql | 2 +- src/core/test_all.sql | 2 +- src/core/wt_version.tab | 23 ---- src/core/wt_versions.tab | 29 ++++ src/core/wtplsql.pkb | 29 ++-- src/demo/Table-Test.sql | 2 +- src/demo/Test-Runner.sql | 4 +- src/demo/Trigger-Test.sql | 2 +- src/demo/Type-Test.sql | 2 +- src/demo/install.sql | 2 +- src/demo/uninstall.sql | 2 +- src/demo/ut_betwnstr.sql | 2 +- src/demo/ut_calc_secs_between.sql | 2 +- src/demo/ut_str.sql | 2 +- src/demo/ut_truncit.sql | 2 +- src/gui/f700.sql | 2 +- src/persist/wt_profile.pkb | 2 +- 40 files changed, 326 insertions(+), 294 deletions(-) create mode 100644 docs/OO-Style-Unit-Testing.md delete mode 100644 docs/README.txt delete mode 100644 docs/gui/README.txt delete mode 100644 src/core/wt_version.tab create mode 100644 src/core/wt_versions.tab diff --git a/README.md b/README.md index 95298c8..15ab3d6 100644 --- a/README.md +++ b/README.md @@ -2,21 +2,21 @@ Welcome to the wtPLSQL source code repository on GitHub. -The [wtPLSQL website](https://wtPLSQL.org) has more information about how to use wtPLSQL and why it is different. It also includes wtPLSQL features, definitions, and best practices. (The wtPLSQL website is hosted on GitHub.io using a custom domain.) +The http://wtPLSQL.org website has more information about how to use wtPLSQL and why it is different. It also includes wtPLSQL features, definitions, and best practices. (The wtPLSQL website is hosted on GitHub.io using a custom domain.) -[Get the latest release here.](https://github.com/DDieterich/wtPLSQL/releases) +[Click here](https://github.com/DDieterich/wtPLSQL/releases/latest) for the latest release. + +[Click here](https://github.com/DDieterich/wtPLSQL/wiki/Compatibility) for the compatibility wiki page. -[wtPLSQL compatability wiki page.](https://github.com/DDieterich/wtPLSQL/wiki/Compatibility) ### Participation See the "To Do" column in one of the [Projects](https://github.com/DDieterich/wtPLSQL/projects) for cards/issues that are ready to work. -The [repository wiki](https://github.com/DDieterich/wtPLSQL/wiki) includes helpful procedures and discussions. +The [repository wiki](https://github.com/DDieterich/wtPLSQL/wiki) includes helpful procedures and discussions for code development and repository maintenance. -[DBDocs (like JavaDocs)](https://wtplsql.org/core/DBDocs/index.html) +All software documentation is on the http://wtPLSQL.org website. The document repository is in the "docs" directory (see table below). -[E-R Diagram](https://wtplsql.org/core/ER_Diagrams.pdf) ### Files and Directories diff --git a/docs/About-wtPLSQL.md b/docs/About-wtPLSQL.md index bcd9974..afe3055 100644 --- a/docs/About-wtPLSQL.md +++ b/docs/About-wtPLSQL.md @@ -3,18 +3,7 @@ # About wtPLSQL --- -## History -Following are some links regarding the history of utPLSQL. - -[Steven Feuerstein Designed and Developed utPLSQL (V1)](http://archive.oreilly.com/pub/a/oreilly/oracle/utplsql/) - -[Steven Feuerstein's Recommendations for Unit Testing PL/SQL Programs](http://stevenfeuersteinonplsql.blogspot.com/2015/03/recommendations-for-unit-testing-plsql.html) - -[utPLSQL V2 Documentation](https://utplsql.org/utPLSQL/v2.3.1/) - -[utPLSQL V3 Website](https://utplsql.org/) - -## Background +## From utPLSQL to wtPLSQL Because of his reputation with Oracle's PL/SQL, Steven Feuerstein's utPLSQL has been widely adopted. However, maintenance of the utPLSQL source code became a problem with the latest utPLSQL V2 releases. Inspection of the utPLSQL V2 source code revealed some very complex code pathways. Much of this resulted from the layering of the V1 API on top of the V2 implementation. There is no documentation on how the V1 layering was intended to work. There is no documentation on the overall design of the V2 implementation. There is no documentation on how to use the V2 API. (Kudos to [@PaulWalkerUK](https://github.com/PaulWalkerUK) for an amazing job of maintaining the V2 code set.) As a result, most all unit tests written with utPLSQL V2 use the V1 APIs. The utPLSQL V3 project was started with a "clean sheet" approach. The project took a distinctly object oriented direction. This is apropos, given that Steven Feuerstein subtitles utPLSQL as "JUnit for PLSQL". The V3 project has also adopted other aspects of JUnit testing like annotations. It is a clever and useful approach and will be familiar to Java developers. [@jgebal](https://github.com/jgebal) was part of the utPLSQL V3 development from the beginning and continues to provide excellent contributions and information for that project. @@ -23,47 +12,59 @@ Before the "clean sheet" approach was adopted, the V3 team reviewed what has bee The wtPLSQL project is a continuation of the utPLSQL_Lite project. +## What is wtPLSQL (Whitebox Testing PL/SQL)? + +wtPLSQL helps with white-box testing of Oracle database objects. It is particularly well suited for unit testing and simple integration testing. It is written in PL/SQL. It contains a self-test which makes it easier to support and customize. + +wtPLSQL provides a set of assertion tests that can be used to determine how well an Oracle database object is performing. These assertions record the outcome (success or failure) of each test. These assertions also record the time between calls. A test runner (PL/SQL package) must be created with these assertion tests included. + +wtPLSQL implements the basic/core functionality of utPLSQL V2 while preserving the programming investment in the assertion API (utAssert.eq, utAssert.isnotnull, etc.). The additional functionality of utPLSQL V2 that is not included in the wtPLSQL core component will be achieved through add-ons. + ## Goals -This project focuses on providing a **simple**, yet **robust**, framework for **dynamic**, **white box** testing of **Oracle Database Objects**. +This project focuses on providing a **simple**, yet **robust**, server for **dynamic**, **white box** testing of **Oracle Database Objects**. -### Simple Framework +### Simple Server [Kent wants people to control their own environment, so he liked to have each team build the framework themselves](https://martinfowler.com/bliki/Xunit.html) -The wtPLSQL project is an attempt to allow PL/SQL developers to be PL/SQL developers. The test runners are entirely user-written in PL/SQL. The framework supplies resources for collecting and reporting information from those test runners. Through its simplified architecture and open source approach, extensions of the functionality are relatively easy. +The wtPLSQL project is an attempt to allow PL/SQL developers to be PL/SQL developers. The test runners are entirely user-written in PL/SQL. The server supplies resources for collecting and reporting information from those test runners. Through its simplified architecture, configurable hooks, and open source approach, extensions of the functionality are relatively easy. -### Robust Framework +### Robust Server [Robustness is the ability of a computer system to cope with errors during execution](https://en.wikipedia.org/wiki/Robustness_(computer_science)) -The wtPLSQL framework includes provisions for the following errors during execution: -* Un-handled test runner exceptions -* Storage errors from too many old test result sets. +The wtPLSQL server includes provisions for the following errors during execution: +* Un-handled test runner exceptions. * Isolation of different test runner results during concurrent test runs. * Missing or non-existent test runners. -* Incorrect/incompatable DBMS_PROFILER version +* Storage errors from too many old test result sets (persist add-on). +* Incorrect/incompatibly DBMS_PROFILER version (persist add-on). ### Dynamic Testing [Testing that takes place when the program itself is run.](https://en.wikipedia.org/wiki/Software_testing#Static_vs._dynamic_testing) -The wtPLSQL framework supports testing of source code during its execution. That is, the source code is executed during testing. It is not a static code analyzer or a guide for review meetings. +The wtPLSQL server supports testing of source code during its execution. That is, the source code is executed during testing. It is not a static code analyzer or a guide for review meetings. ### White Box Testing [Tests internal structures or workings of a program](https://en.wikipedia.org/wiki/Software_testing#White-box_testing) -The [essence of white box testing](https://en.wikipedia.org/wiki/White-box_testing#Overview) is the careful testing of the application at the source code level to prevent any hidden errors later on. A key measure of completeness for this kind of testing is the [code coverage](https://en.wikipedia.org/wiki/Code_coverage) of the test. A complete white box test will achieve 100% code coverage. This does not guarantee all aspects of the code have been tested, but it does ensure that all code pathways have been tested. +The [essence of white box testing](https://en.wikipedia.org/wiki/White-box_testing#Overview) is the careful testing of the application at the source code level to prevent any hidden errors later on. A key measure of completeness for this kind of testing is the [code coverage](https://en.wikipedia.org/wiki/Code_coverage) of the test. A complete white box test will achieve 100% code coverage (*if the needed line feeds are in the PL/SQL source*). This does not guarantee all aspects of the code have been tested but it does ensure that all code pathways have been tested (*if the needed line feeds are in the PL/SQL source*). + +An important part of establishing code coverage is identifying what code is being tested. The Persist add-on uses a DBOUT (DataBase Object Under Test) to identify the code being tested. Upon identifying the DBOUT, code coverage information can be gathered and reported. -An important part of establishing code coverage is identifying what code is being tested. The wtPLSQL framework uses a DBOUT (DataBase Object Under Test) to identify the code being tested. Upon identifying the DBOUT, the framework can gather and report information regarding code coverage. +### Support for various Testing Levels + +[Broadly speaking, there are at least three levels of testing: unit testing, integration testing, and system testing.](https://en.wikipedia.org/wiki/Software_testing#Testing_levels) + +wtPLSQL is useful for all levels of testing. White box testing is especially useful for testing at the unit level. The flexibility of a Test Runner package is useful for testing at the integration and system levels. ### Oracle Database Objects [Some of the (database) objects that schemas can contain are Packages, Procedures, Functions, Triggers, and Views.](https://docs.oracle.com/database/122/CNCPT/tables-and-table-clusters.htm#GUID-7567BE77-AFC0-446C-832A-FCC1337DEED8) -Many kinds of database objects need to be tested, not just packages. Triggers containing PL/SQL need to be tested. With the addition of [inline functions in SQL](https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/SELECT.html#GUID-CFA006CA-6FF1-4972-821E-6996142A51C6__BABJFIDC), views can contain PL/SQL as well. [Oracle Type Bodies](https://docs.oracle.com/database/122/ADOBJ/object-methods.htm#ADOBJ00202) also include PL/SQL procedures and functions. All of these database objects can be tested with wtPSQL. - -In the wtPLSQL framework, the DBOUT can be any of the following PL/SQL objects: +With the wtPLSQL server, Test Runner code coverage can be tracked on any of the following PL/SQL objects: +* Functions * Packages -* Procedures (standalone) -* Functions (standalone) +* Procedures * Triggers -* Views (Not yet implemented) +* Type Bodies ### Embedded Selftest @@ -73,38 +74,16 @@ With utPLSQL V1/V2, packages can include an embedded self-test. The required cal wtPLSQL continues this capability. However, with wtPLSQL, the addition of an embedded selftest requires only 1 additional procedure call in the package specification (WTPLSQL_RUN). -## Unit Testing -As mentioned above, white box testing can occur at various levels of development, including: -* **unit testing** -* integration testing -* regression testing. - -The wtPLSQL project focuses on white box testing instead of **unit testing** in order to avoid some controversial aspects of unit testing, namely Test Isolation and Test Transience. - -### Test Isolation -A unit test should [usually not go outside of its own class boundary](https://en.wikipedia.org/wiki/Unit_testing#Description) - -In OO (object oriented) programming, object data is transient. This is due to the nature of object instantiation. Persistence of object data beyond the instance of an object is banished to non-OO components. Since the unit test movement gained its largest following in OO, the idea of testing persisted object data is, unfortunately, a distraction. This has evolved into the idea that testing a database interface should always involve the use of a [fake or mock](https://en.wikipedia.org/wiki/Test-driven_development#Fakes.2C_mocks_and_integration_tests) to **isolate** the unit under test from the influence of these non-OO components. - -Transactional data (ACID compliance) introduces a complexity to the persistence of object data. Attempting to fake this complexity is very difficult. Particularly difficult is the determination of how much functionality to include in the fake, especially when the storage of the data is the main purpose for the system. Focusing on white box testing, instead of unit testing, allows the wtPLSQL framework to test integrated functionality from other system components. - -### Test Transience -A unit test should set up a known good state before the tests and [return to the original state after the tests](https://en.wikipedia.org/wiki/XUnit#Test_fixtures) - -There are many arguments to be made regarding the idea of a known good state in a database. The only sure way to achieve a known good state is to leave the the database unchanged after a unit test. Ideally, changes made by a test process would be **transient**, that is the process would setup (insert) and tear down (delete) data in the database. However, many Oracle database implementations include additional functionality that can make this difficult. -* Complex data setup -* Additional processing that is unknown or poorly defined -* Built-in auditing - -In the wtPLSQL framework, integration testing of multiple database objects (no mocks or fakes) is allowed (i.e. not bound by the **transience** aspect). Artifacts from multiple test runs can remain in the database after the testing is complete. Additionally, artifacts that remain after testing can help identify other problems in the database. +## History of utPLSQL +Following are some links regarding the history of utPLSQL. -### Test Fixtures and Test Suites +[Steven Feuerstein Designed and Developed utPLSQL (V1)](http://archive.oreilly.com/pub/a/oreilly/oracle/utplsql/) -[A test fixture ... is the set of preconditions or state needed to run a test](https://en.wikipedia.org/wiki/XUnit#Test_fixtures) +[Steven Feuerstein's Recommendations for Unit Testing PL/SQL Programs](http://stevenfeuersteinonplsql.blogspot.com/2015/03/recommendations-for-unit-testing-plsql.html) -[A test suite is a set of tests that all share the same fixture.](https://en.wikipedia.org/wiki/XUnit#Test_suites) +[utPLSQL V2 Documentation](https://utplsql.org/utPLSQL/v2.3.1/) -Test fixtures and test suites are a part of the xUnit testing framework. At the core, wtPLSQL does not include test fixtures or test suites. If needed, these can be easily defined and implemented in a test runner package. +[utPLSQL V3 Website](https://utplsql.org/) --- [Website Home Page](README.md) diff --git a/docs/Core-Features.md b/docs/Core-Features.md index 681cb8f..58cdaa0 100644 --- a/docs/Core-Features.md +++ b/docs/Core-Features.md @@ -12,18 +12,10 @@ Because the test runner packages are user written, they can be used to test anyt - Table Constraints and Triggers - Types and Type Bodies -## Built-in Code Coverage -The Database Object Under Test, or DBOUT, is a database object that is the target of the test runner package. An annotation is used to identify the DBOUT in a test runner package. If the DBOUT annotation is missing from a test runner package, no code coverage data is collected. If more than one annotation occurs in a test runner package, the first occurrence in the source code is used. +## Plug-in Code Coverage +The Database Object Under Test, or DBOUT, is a database object that is the target of the test runner package. A global variable "g_DBOUT" in the "wtplsql" package is used to identify the DBOUT. If the not set by the test runner package, no code coverage data is collected. If more than one value of "g_DBOUT" is set by a test runner package, the last setting is used. -**Regular Expression:** -``` - --% WTPLSQL SET DBOUT "[[:alnum:]._$#]+" %-- -``` -**Example:** -``` - --% WTPLSQL SET DBOUT "SCHEMA.TEST_ME" %-- -``` -"Ignore" annotations are used to indicate source code lines to ignore when calculating code coverage metrics. +"Ignore" annotations are used to indicate which source code lines will be ignored when calculating code coverage metrics. **Regular Expression:** ``` @@ -36,7 +28,7 @@ The Database Object Under Test, or DBOUT, is a database object that is the targe Occasionally, DBMS_PROFILER does not capture the execution of some PL/SQL source. Examples PL/SQL source that are reported incorrectly include "end if", "select", and "return". wtPLSQL excludes some of these source lines when calculating code coverage metrics. Use the "Ignore" annotations to ignore other lines of PL/SQL when calculating code coverage metrics. ## Built-in Schema-wide Testing -wtPLSQL will locate and execute all test runner packages in a schema. This is done by finding all packages with a WTPLSQL_RUN procedure that has no parameters. There is no requirement to pre-define the test runners in a schema. +wtPLSQL will locate and execute all test runner packages in a schema. This is done by finding all packages with a WTPLSQL_RUN procedure that has no parameters. There is no other requirement to predefine test runners in a schema. ## Test Result Capture Test results from assertions executed in a test runner package are automatically captured in WTPLSQL database tables. Results are stored by test runner execution. If specified in the test runner, test results are stored by test case. If a DBOUT is specified in the test runner, code coverage data is also stored. All captured data is automatically deleted except for the last 20 runs of any test runner. diff --git a/docs/OO-Style-Unit-Testing.md b/docs/OO-Style-Unit-Testing.md new file mode 100644 index 0000000..d4140f1 --- /dev/null +++ b/docs/OO-Style-Unit-Testing.md @@ -0,0 +1,71 @@ +[Website Home Page](README.md) + +# OO Style Unit Testing + +--- + +The wtPLSQL project focuses on white box testing instead of OO style unit testing. This is done to avoid some aspects of OO style unit testing that are not database friendly: +* Test Isolation +* Test Transience +* Test Fixtures +* Test Suites + +### Test Isolation + +A unit test should [usually not go outside of its own class boundary](https://en.wikipedia.org/wiki/Unit_testing#Description) + +In OO (object oriented) programming, object data is transient. This is due to the nature of object instantiation. Persistence of object data beyond the instance of an object is banished to non-OO components. Since the unit test movement gained its largest following in OO, the idea of testing persisted object data is, unfortunately, a distraction. This has evolved into the idea that testing a database interface should always involve the use of a [fake or mock](https://en.wikipedia.org/wiki/Test-driven_development#Fakes.2C_mocks_and_integration_tests) to **isolate** the unit under test from the influence of these non-OO components. + +Transactional data (ACID compliance) introduces a complexity to the persistence of object data. Attempting to fake this complexity is very difficult. Particularly difficult is the determination of how much functionality to include in the fake, especially when the storage of the data is the main purpose for the system. Focusing on white box testing, instead of unit testing, allows Test Runners that use the wtPLSQL server to test integrated functionality from other system components. + +### Test Transience + +A unit test should set up a known good state before the tests and [return to the original state after the tests](https://en.wikipedia.org/wiki/XUnit#Test_fixtures) + +There are many arguments to be made regarding the idea of a known good state in a database. The only sure way to achieve a known good state is to leave the the database unchanged after a unit test. Ideally, changes made by a test process would be **transient**, that is the process would setup (insert) and tear down (delete) data in the database. However, many Oracle database implementations include additional functionality that can make this difficult. +* Complex data setup +* Additional processing that is unknown or poorly defined +* Built-in auditing + +With the wtPLSQL server, Test Runners are allow to perform integration testing of multiple database objects (no mocks or fakes). That is, the Test Runners are not bounded by the **transience** aspect of unit testing. Artifacts from multiple test runs can remain in the database after the testing is complete. Additionally, artifacts that remain after testing can help identify other problems in the database. + +### Test Fixtures + +[A test fixture ... is the set of preconditions or state needed to run a test](https://en.wikipedia.org/wiki/XUnit#Test_fixtures) + +An Oracle database loaded with test data is a fixture. In OO terms, it is a persistent store that is pre-loaded with data. If the test data is pre-loaded, there is no need to setup test fixtures. wtPLSQL does not require test fixtures. They are optional. + +### Test Suites + +[A test suite is a set of tests that all share the same fixture.](https://en.wikipedia.org/wiki/XUnit#Test_suites) + +wtPLSQL does not require test suites. If needed, test suites can be defined and implemented in Test Runner packages. The "test_all" functionality of wtPLSQL creates a form of test suite at the database schema level. + +## Testing Methodologies + +Fundamentally, the Oracle database is a relational database. The relational database is based on transaction processing. Data is stored and shared in a precise manner between processes. + +JUnit testing is OO (Object Oriented programming) based. Encapsulation is a core part of OO. Data sharing is done through APIs (Application Programmatic Interfaces), i.e. no fundamental data persistence. + +The principle of "store and share" is the opposite of data encapsulation. As a result, OO testing approaches are inappropriate for relational databases. + +Here are several differences in testing methodologies between relational databases and Object Oriented. + +### Testing Persistence of Data +* Object Oriented - Use fakes or mocks to avoid any data persistence. +* Relational Database - Testing of data persistence is fundamental. + +### Isolation of Tests +* Object Oriented - Use fakes or mocks to avoid any "integration" testing. +* Relational Database - Isolating PL/SQL code from database CRUD (Create, Retrieve, Update, Delete) defeats the purpose of most PL/SQL testing. + +### Test Transience +* Object Oriented - Return object to original state. +* Relational Database - Integrity constraints on complex persisted data and/or complex data operations make simple test transience more difficult. An alternative is to add new data during each test and/or reset the database to a known test data set before testing. + +### Non-Sequenced Testing +* Object Oriented - All unit tests should be able to run in any order. +* Relational Database - Testing with integrity constraints on complex persisted data and/or complex data operations can be simpler with test sequencing. + +--- +[Website Home Page](README.md) diff --git a/docs/README.md b/docs/README.md index 3260cac..3813edd 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,72 +1,98 @@ # wtPLSQL Home Page --- -To install/upgrade, download the [latest Release](https://github.com/DDieterich/wtPLSQL/releases) +wtPLSQL is a test automation server that uses an Oracle database to provide the following services for Test Runner packages written in PL/SQL. +* Execution of one or groups of Test Runners +* Assertion Results including Timing Between Assertions +* Capture and Reporting of Assertion Results -Also see the [compatibility page](https://github.com/DDieterich/wtPLSQL/wiki/Compatibility) in the wtPLSQL repository wiki. +wtPLSQL includes add-ons that provide these additional services. +* Storage and Reporting of Assertion Results +* Source Code Coverage of Test Runner +* Web Based Graphical User Interface +* Trend Analysis + +wtPLSQL includes components that provide the following services. +* JUnit XML Reporting +* utPLSQL V2 Conversion + +[Click here](https://github.com/DDieterich/wtPLSQL/releases/latest) for the latest release on GitHub. + +[Click here](https://github.com/DDieterich/wtPLSQL/wiki/Compatibility) for the compatibility wiki page on GitHub. Use [GitHub "issues"](https://github.com/DDieterich/wtPLSQL/issues) for support. A (free) GitHub account will be required to create a new issue. Issues can be searched without an account. -## Example wtPLSQL Test Results +### wtPLSQL Components and Add-ons -This is the summary from the WT_ASSERT package self-test. It was created with the default DBMS_OUTPUT reporting package. Because test results and code coverage is stored in Oracle tables, other report formats are simple to create. +wtPLSQL functionality is contained in one or more components and add-ons. Various combinations can be installed to achieve the desired results. -Sample DBMS_OUTPUT from wtPLSQL +Component | Description +--------------------------------|------------ +[core](core/README) | Required for all wtPLSQL functionality. Can be run stand-alone +[conversion](conversion/README) | Used to convert Test Runner packages from utPLSQL to wtPLSQL -To view the complete test results from the wtPLSQL self-test, go to the [test_allO.LST](https://github.com/DDieterich/wtPLSQL/blob/master/src/core/test_allO.LST) file in GitHub. The [Demonstrations and Examples Page](demo/README.md) has more examples. +
    -## What is wtPLSQL? +Add-on | Description +-----------------------------|------------ +[persist](persist/README.md) | Adds storage in tables and code coverage. +[gui](gui/README.md) | Adds Oracle APEX screens and reports. Requires persist add-on. +[junit](junit/README.md) | Adds JUnit XML reporting. -wtPLSQL helps with white-box testing of Oracle database objects. It is particularly well suited for unit testing and simple integration testing. It is written in PL/SQL. It contains a self-test which makes it easier to support and customize. +To determine which components and add-ons have been installed, run this query: -Like utPLSQL, wtPLSQL provides a set of assertion tests that can be used to determine how well an Oracle database object is performing. These assertions record the outcome (success or failure) of each test. These assertions also record the time between calls. A test runner (PL/SQL package) must be created with these assertion tests included. The [Core Features page](Core-Features.md) introduces the main functionality of wtPLSQL. +``` +select wtplsql.show_version from dual; +``` -A simple text based reporting package called "WT_TEXT_REPORT" is included with the core installation. Custom reports are easy to create because the assertion outcomes and interval time between assertions are stored in the Oracle database. A set of DBDocs and E-R diagrams are provided to assist with any reporting customization. +### Core Component Example Test Results -Because all testing with wtPLSQL is for driven by custom PL/SQL packages, a [Best Practices page](Best-Practices.md) has some guidance for creating test runner packages. +Here is an example result summary from the core component. Only core is needed to produce this result. -The [About wtPLSQL page](About-wtPLSQL.md) has more information about the history and testing methodology of wtPLSQL. +Sample DBMS_OUTPUT from wtPLSQL core -The [Definitions page](Definitions.md) includes definitions from many sources to help define the terms used in various software testing methodologies. +To view the complete test results from the wtPLSQL core self-test, go to the "[src/core/test_allO.LST](https://github.com/DDieterich/wtPLSQL/blob/master/src/core/test_allO.LST)" file in GitHub. -## How does wtPLSQL compare to utPLSQL V3? +### Persist Add-on Example Test Results -utPLSQL V3 is an excellent choice for unit testing. It is well supported and includes extensive functionality. +Here is the summary from the WT_ASSERT package self-test. It was created with the default DBMS_OUTPUT reporting package. Because test results and code coverage are stored in Oracle tables, other report formats are simple to create. -wtPLSQL has a different focus than utPLSQL V3. More information is available [in this link](utPLSQL-V3-Comparison.md). +Sample DBMS_OUTPUT from wtPLSQL Persist -## How does wtPLSQL compare to utPLSQL V1 or utPLSQL V2? +To view the complete test results from the wtPLSQL persist self-test, go to the "[src/persist/test_allO.LST](https://github.com/DDieterich/wtPLSQL/blob/master/src/persist/test_allO.LST)" file in GitHub. -utPLSQL V2 is an extension of utPLSQL V1. Since utPSQL V2 is being replaced by utPLSQL V3, neither utPLSQL V2 or utPLSQL V1 are good choices for starting a new software testing implementation. +### GUI Add-on Example Test Results -The goal of wtPLSQL has been to implement the basic/core functionality of utPLSQL V2 while preserving the the programming investment in the assertion API (utAssert.eq, utAssert.isnotnull, etc.). The additional functionality of utPLSQL V2 that is not included in the wtPLSQL core will be added through optionally installed modules (also known as add-ons). +The GUI module uses the Oracle APEX to enhance the UI experience. Many useful reports are available with the GUI module. This is an example of ??? -More information is available [in this link](utPLSQL-V2-Comparison.md). +Sample Graphical from wtPLSQL GUI -### Site Links +### More Examples and Demonstrations +* [Click here](demo/README.md) for more examples and demonstrations. -User Help -* [Demonstrations and Examples Page](demo/README.md) - * [Package Test](demo/Package-Test.md) - * [Table Constraints Test](demo/Table-Test.md) - * [Trigger Test](demo/Trigger-Test.md) - * [Type Test](demo/Type-Test.md) - * [ut_betwnstr](demo/ut_betwnstr.md) - Choose a program to test - * [ut_calc_secs_between](demo/ut_calc_secs_between.md) - Test a Simple Procedure - * [ut_truncit](demo/ut_truncit.md) - Test a Table Modification Procedure - * [ut_str](demo/ut_str.md) - Test a Simple Function -* [Reference](Reference.md) -* [Best Practices](Best-Practices.md) -* [DB Docs from SQL*Developer](core/DBDocs/index.html) -* [ER Diagram PDF](core/ER_Diagrams.pdf) -* [Call Tree Diagrams PDF](core/Call_Tree_Diagrams.pdf) +### General Documentation -Background -* [Definitions](Definitions.md) * [About wtPLSQL](About-wtPLSQL.md) -* [Core Features](Core-Features.md) -* [utPLSQL V3 Comparison](utPLSQL-V3-Comparison.md) +* [Definitions](Definitions.md) +* [Best Practices](Best-Practices.md) +* [Reference](Reference.md) * [utPLSQL V1/V2 Comparison](utPLSQL-V2-Comparison.md) +* [utPLSQL V3 Comparison](utPLSQL-V3-Comparison.md) +* [OO Style Unit Testing is not for Databases](OO-Style-Unit-Testing.md) + +*Note: See the* **"wtPLSQL Components and Add-ons"** *above for documentation on individual components and add-ons.* + +### wtPLSQL Internals + +DB Docs | E-R Diagrams | Call Tree Diags +------------------------------------------|-----------------------------------------|---------------- +[core docs](core/DBDocs/index.html) | [core ERDs](core/ER_Diagrams.pdf) | [core trees](core/Call_Tree_Diagrams.pdf) +[persist docs](persist/DBDocs/index.html) | [persist ERDs](persist/ER_Diagrams.pdf) | [persist trees](persist/Call_Tree_Diagrams.pdf) +[gui docs](gui/DBDocs/index.html) | [gui ERDs](gui/ER_Diagrams.pdf) | [gui trees](gui/Call_Tree_Diagrams.pdf) + +* **DB Docs** has web pages similar to JavaDocs created by Oracle's SQL*Developer. +* **E-R Diagrams** show relationships between tables (entities). +* **Call Tree Diagrams** show the PL/SQL programs, tables, and common (global) memory structures called by all PL/SQL programs. ## Contribute @@ -74,4 +100,27 @@ Help us improve by joining us at the [wtPLSQL repository](https://github.com/DDi --- +*The following applies to files and directories at this location in the documentation repository.* + +### Files and Directories + +File Name | Description +--------------|------------ +core | Core Documentation Directory +demo | Demonstration Documentation Directory +images | Image Files referenced by MD and HTML +_config.yml | YAML Configuration File for this Website +*.md | Markdown files for "github.io" +*.htm | HTML files for local documentation +md-to-htm.bat | MS-Dos Batch File to convert MD to HTML +md-to-htm.lua | Lua script used by Pandoc for MD to HTML + +To view documentation use the URL "file://README.htm" or Double-click on the README.htm file. + +NOTE: All HTML files are sourced from Markdown files. + Modify the Markdown files, then build HTML from the + Markdown files using "md-to-htm.bat". + +--- + _Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners._ diff --git a/docs/README.txt b/docs/README.txt deleted file mode 100644 index f3f41aa..0000000 --- a/docs/README.txt +++ /dev/null @@ -1,25 +0,0 @@ - -Files and Directories - - -File Name Description ------------ ------------ -core Core Documentation Directory -demo Demonstration Documentation Directory -images Image Files referenced by MD and HTML -_config.yml YAML Configuration File for this Website -*.md Markdown files for "github.io" -*.htm HTML files for local documentation -md-to-htm.bat MS-Dos Batch File to convert MD to HTML -md-to-htm.lua Lua script used by Pandoc for MD to HTML - - -Local Documentation URL ------------------------ -file://README.htm -(or Double-click on the README.htm file) - - -NOTE: All HTML files are sourced from Markdown files. - Modify the Markdown files, then build HTML from the - Markdown files using "md-to-htm.bat". diff --git a/docs/core/README.md b/docs/core/README.md index 694c90d..500e2b1 100644 --- a/docs/core/README.md +++ b/docs/core/README.md @@ -1,7 +1,6 @@ # wtPLSQL -Whitebox Testing Framework for Oracle's PL/SQL Language - +Whitebox Test Server for Oracle's PL/SQL Language File Name | Description -----------------------|------------ diff --git a/docs/demo/README.md b/docs/demo/README.md index 6437538..d47c9d6 100644 --- a/docs/demo/README.md +++ b/docs/demo/README.md @@ -8,7 +8,7 @@ Demonstrations and examples assume successful connection to an [Oracle database] Test results from assertions can be queried from a set of wtPLSQL tables. The examples here will use the default reporting package called WT_TEXT_REPORT. This package displays test results using DBMS_OUTPUT. -## The Basics +## User Setup A login, or database session, is required to interact with the Oracle database. The SQL below will create a user that can run these examples. If you already have a database login, this is not necessary. @@ -27,7 +27,9 @@ grant create view to wtp_demo; grant create procedure to wtp_demo; ``` -The simplest check for a wtPLSQL installation is to select the "version from dual". +## Confirm the Installation + +The simplest check for a wtPLSQL installation is to select the "version from dual". If wtPSQL is installed, it will show which add-ons have been installed if any. Run this: @@ -35,22 +37,16 @@ Run this: select wtplsql.show_version from dual; ``` -And get this: +If the result is "Core 1.2, Persist 1.2", wtPSQL is installed with the Persist add-on. If the result is "Core 1.2", the Persist add-on has not been installed. In each exercise, there will be an indication if the results are different without the Persist add-on. -``` -SHOW_VERSION ------------------------------------------------------------ -1.1.0 -``` +### Another simple test -This shows the wtPLSQL version as 1.1.0. - -Another simple test is an ad-hoc assertion. This test requires DBMS_OUTPUT. The results of this test are not recorded. +Another simple test is an ad-hoc assertion. The ad-hoc assertion requires DBMS_OUTPUT. The results of the ad-hoc assertions are not recorded by wtPLSQL. Run this: ``` -set serveroutput on size unlimited format word_wrapped +set serveroutput on size unlimited format truncated begin wt_assert.eq(msg_in => 'Ad-Hoc Test' @@ -76,7 +72,11 @@ Note: This ad-hoc test also demonstrates implicit data type conversion. ## Create a Test Runner Package -A test runner package is central to running tests in wtPLSQL. The [Test Runner](Test-Runner.md) page covers all the basics of creating a test runner package. +Creating a Test Runner package is central to using the wtPLSQL server. The Test Runner package contains all the assertion API calls used for testing. The package can also changes wtPSQL settings, like the name of the Database Object Under Test (DBOUT). + +The web page link below includes an exercise that shows how create a Test Runner package. The web page covers all the basics of creating a Test Runner package. + +[Create Test Runner Package](Test-Runner.md) ## Database Object Tests More interesting examples actually test database objects. Here are some examples. diff --git a/docs/demo/Table-Test.md b/docs/demo/Table-Test.md index ff5e933..388c9be 100644 --- a/docs/demo/Table-Test.md +++ b/docs/demo/Table-Test.md @@ -94,7 +94,7 @@ end table_test_pkg; Run this: ``` -set serveroutput on size unlimited format word_wrapped +set serveroutput on size unlimited format truncated begin wtplsql.test_run('TABLE_TEST_PKG'); diff --git a/docs/demo/Test-Runner.md b/docs/demo/Test-Runner.md index a3b1b28..db43228 100644 --- a/docs/demo/Test-Runner.md +++ b/docs/demo/Test-Runner.md @@ -47,7 +47,7 @@ There are no test results because the test results were not sent to DBMS_OUTPUT. To view the results, run this: ``` -set serveroutput on size unlimited format word_wrapped +set serveroutput on size unlimited format truncated begin wt_text_report.dbms_out(USER,'SIMPLE_TEST_RUNNER'); @@ -77,7 +77,7 @@ This example shows all result details for the SIMPLE_TEST_RUNNER only. Run this: ``` -set serveroutput on size unlimited format word_wrapped +set serveroutput on size unlimited format truncated begin wt_text_report.dbms_out(in_runner_name => 'SIMPLE_TEST_RUNNER' diff --git a/docs/demo/Trigger-Test.md b/docs/demo/Trigger-Test.md index bd482fe..472c835 100644 --- a/docs/demo/Trigger-Test.md +++ b/docs/demo/Trigger-Test.md @@ -162,7 +162,7 @@ end trigger_test_pkg; Run this: ``` -set serveroutput on size unlimited format word_wrapped +set serveroutput on size unlimited format truncated begin wtplsql.test_run('TRIGGER_TEST_PKG'); diff --git a/docs/demo/Type-Test.md b/docs/demo/Type-Test.md index 610d934..b96e422 100644 --- a/docs/demo/Type-Test.md +++ b/docs/demo/Type-Test.md @@ -115,7 +115,7 @@ end test_simple_object; Run this: ``` -set serveroutput on size unlimited format word_wrapped +set serveroutput on size unlimited format truncated begin wtplsql.test_run('TEST_SIMPLE_OBJECT'); diff --git a/docs/demo/ut_betwnstr.md b/docs/demo/ut_betwnstr.md index d02db89..a109c0f 100644 --- a/docs/demo/ut_betwnstr.md +++ b/docs/demo/ut_betwnstr.md @@ -115,7 +115,7 @@ It is not necessary to keep the ut_setup and ut_teardown procedures. These were Run this: ``` -set serveroutput on size unlimited format word_wrapped +set serveroutput on size unlimited format truncated begin wtplsql.test_run('UT_BETWNSTR'); diff --git a/docs/demo/ut_calc_secs_between.md b/docs/demo/ut_calc_secs_between.md index ac1f708..0f8f89b 100644 --- a/docs/demo/ut_calc_secs_between.md +++ b/docs/demo/ut_calc_secs_between.md @@ -101,7 +101,7 @@ It is not necessary to keep the ut_setup and ut_teardown procedures. These were Run this: ``` -set serveroutput on size unlimited format word_wrapped +set serveroutput on size unlimited format truncated begin wtplsql.test_run('UT_CALC_SECS_BETWEEN'); diff --git a/docs/demo/ut_str.md b/docs/demo/ut_str.md index 87de66b..132aa16 100644 --- a/docs/demo/ut_str.md +++ b/docs/demo/ut_str.md @@ -155,7 +155,7 @@ Mid-way down the package body is the annotation "WTPLSQL_begin_ignore_lines". T Run this: ``` -set serveroutput on size unlimited format word_wrapped +set serveroutput on size unlimited format truncated begin wtplsql.test_run('STR'); diff --git a/docs/demo/ut_truncit.md b/docs/demo/ut_truncit.md index e4a0d35..15b1d48 100644 --- a/docs/demo/ut_truncit.md +++ b/docs/demo/ut_truncit.md @@ -85,7 +85,7 @@ The SET DBOUT annotation was also added to gather code coverage data. Run this: ``` -set serveroutput on size unlimited format word_wrapped +set serveroutput on size unlimited format truncated begin wtplsql.test_run('UT_TRUNCIT'); diff --git a/docs/gui/README.md b/docs/gui/README.md index b6aa088..2b6b539 100644 --- a/docs/gui/README.md +++ b/docs/gui/README.md @@ -1,6 +1,6 @@ [Website Home Page](../README.md) -# wtPLSQL GUI +# wtPLSQL Graphical User Interface --- diff --git a/docs/gui/README.txt b/docs/gui/README.txt deleted file mode 100644 index f3f41aa..0000000 --- a/docs/gui/README.txt +++ /dev/null @@ -1,25 +0,0 @@ - -Files and Directories - - -File Name Description ------------ ------------ -core Core Documentation Directory -demo Demonstration Documentation Directory -images Image Files referenced by MD and HTML -_config.yml YAML Configuration File for this Website -*.md Markdown files for "github.io" -*.htm HTML files for local documentation -md-to-htm.bat MS-Dos Batch File to convert MD to HTML -md-to-htm.lua Lua script used by Pandoc for MD to HTML - - -Local Documentation URL ------------------------ -file://README.htm -(or Double-click on the README.htm file) - - -NOTE: All HTML files are sourced from Markdown files. - Modify the Markdown files, then build HTML from the - Markdown files using "md-to-htm.bat". diff --git a/docs/persist/README.md b/docs/persist/README.md index 004f15b..d32695c 100644 --- a/docs/persist/README.md +++ b/docs/persist/README.md @@ -1,5 +1,5 @@ # wtPLSQL -Whitebox Testing Framework for Oracle's PL/SQL Language +Whitebox Test Server for Oracle's PL/SQL Language File Name | Description diff --git a/docs/utPLSQL-V2-Comparison.md b/docs/utPLSQL-V2-Comparison.md index 2f368e7..d155acd 100644 --- a/docs/utPLSQL-V2-Comparison.md +++ b/docs/utPLSQL-V2-Comparison.md @@ -21,30 +21,40 @@ Much of the utPLSQL V2 functionality was centered on the UTL_FILE package. UTL_F The configuration of UTL_FILE was one of the difficult parts of installing utPLSQL V2. Removing UTL_FILE from wtPLSQL core allows for a much simpler installation. Also, much of the functionality performed by UTL_FILE can be done easier with modern reporting and development tools. Comparing Files ### Record Comparison -In utPLSQL V2, the "utRecEq" package is used to to generate functions to compare record types. This package has not been included in the wtPSQL core to avoid problems. Generating the functions needed to make the comparison require special database permissions. Separating this package into a separate installation allows these special database permissions to be addressed directly. +In utPLSQL V2, the "utRecEq" package is used to to generate functions to compare record types. To avoid problems, this functionality has not been included in the wtPSQL core. Generating the functions needed to make the comparison require special database permissions. Separating this package into a separate add-on allows these special database permissions to be addressed only if needed. ### Test Procedure Prefixes -From the utPLSQL V2 documentation: "The unit test prefix is very important in utPLSQL; the utility uses the prefix to associate source code to be tested with the test package. The prefix also allows utPLSQL to automatically identify the programs within a test package that are to be executed as unit tests." In wtPLSQL, these prefixes are not required. The lack of these prefixes greatly simplifies the setup of test runners. However, the prefixes can be used with wtPLSQL by building them into test runner packages. +From the utPLSQL V2 documentation: "The unit test prefix is very important in utPLSQL; the utility uses the prefix to associate source code to be tested with the test package. The prefix also allows utPLSQL to automatically identify the programs within a test package that are to be executed as unit tests." + +In wtPLSQL, these prefixes are not required. The lack of these prefixes greatly simplifies the setup of test runners. However, the prefixes can be used with wtPLSQL by building them into test runner packages. ### utPLSQL Trace -utPLSQL V2 has a trace facility that could be turned on and off. Because the test runner in wtPLSQL is in control of testing and because the test runner is user written, any desired tracing can be added to the test runner as needed. Additionally, the simplicity of wtPLSQL execution eliminates the need for tracing. +utPLSQL V2 has a trace facility that can be turned on and off. Because the test runner in wtPLSQL is in control of testing and because the test runner is user written, any desired tracing can be added to the test runner. ### utConfig The utConfig package is no longer used in wtPLSQL. There are 29 settings in the utConfig package in utPLSQL V2. The only remaining settings are in the following packages. -* WT_ASSERT Settings - * g_testcase - Name of the current test case - * set_NLS_DATE_FORMAT - Default format for date data type - * set_NLS_TIMESTAMP_FORMAT - Default format for timestamp data type - * set_NLS_TIMESTAMP_TZ_FORMAT - Default format for timestamp with time zone data type -* WT_TEXT_REPORT Settings - * g_single_line_output - Remove/replace new line characters in test result output. - * g_date_format - Default format for date data type + +WT_ASSERT Setting | Description +----------------------------|------------ +g_testcase | Name of the current test case +set_NLS_DATE_FORMAT | Default format for date data type +set_NLS_TIMESTAMP_FORMAT | Default format for timestamp data type +set_NLS_TIMESTAMP_TZ_FORMAT | Default format for timestamp with time zone data type + +
    + +WT_TEXT_REPORT Setting | Description +-----------------------|------------ +g_single_line_output | Remove/replace new line characters in test result output +g_date_format | Default format for date data type ### utOutput -utOutput in utPLSQL V2 has been replaced by WT_TEXT_REPORT in wtPLSQL. Unlike utOutput, WT_TEXT_REPORT is not called automatically, if assertions are executed as part of a test runner package. Alternatively, WT_TEST_RPEORT is used to automatically produce output for as-hoc assertions that are executed outside of a test runner package. +utOutput in utPLSQL V2 has been replaced by WT_TEXT_REPORT in wtPLSQL. Like utPLSQL V2, wtPLSQL calls WT_TEXT_REPORT (using a hook) after each Test Runner is complete. Unlike utPLSQL V2, WT_TEXT_REPORT is not called automatically when the Persist add-on is installed. However, a hook can be created to restore this functionality, if needed. + +WT_TEXT_REPORT is used to format the results of an ad-hoc assertion that is not part of a Test Runner call tree (call graph). The results of ad-hoc assertions are always sent to DBMS_OUTPUT. ### Custom Reporter -There is no custom reporter. The definition of the wtPLSQL tables is defined so reporting tools can be used to create custom reports. +wtPLSQL has no custom reporter. An alternative to the WT_TEXT_REPORTER is a user written PL/SQL program. If the Persist add-on is installed, all test results are available in database tables. Reporting tools can be used to create custom reports from database tables. ### Links * [utPLSQL V2.3.1 Website](https://utplsql.org/moving/2016/07/07/version-2-3-1-released.html) diff --git a/docs/utPLSQL-V3-Comparison.md b/docs/utPLSQL-V3-Comparison.md index 157718d..cb85c4f 100644 --- a/docs/utPLSQL-V3-Comparison.md +++ b/docs/utPLSQL-V3-Comparison.md @@ -3,55 +3,23 @@ # utPLSQL V3 Comparison --- -Under Construction -Abbreviations: -* "ut3" - utPLSQL V3 -* "wt" - wtPLSQL +utPLSQL V3 is an excellent choice for unit testing. It is well supported and includes extensive functionality. wtPLSQL has a different focus than utPLSQL V3. -## The Basics -"ut3" is a comprehensive project. Its capabilities are a large and diverse. It is supported by many people around the world. If your development environment includes a wide variety of platforms and technologies, this is the best project for you. +## utPLSQL V3 -"wt" is an Oracle database focused project. It is built entirely with PL/SQL and Application Express. All testing and reporting is done in the database. +utPLSQL V3 is a comprehensive project. Its capabilities are large and diverse. It incorporates a wide variety of technologies and platforms. It also has a large and diverse set of capabilities that will reduce the need for customization. It is supported by many people around the world. -## Goals -The "ut3" project ["follows industry standards and best patterns of modern Unit Testing frameworks like JUnit and RSpec"](https://github.com/utPLSQL/utPLSQL). +If your development environment includes a wide variety of platforms and technologies, you should consider using utPLSQL V3. -The "wt" project avoids "unit testing" by adopting practices for "white box testing". +## wtPLSQL -## Customization -The "ut3" project incorporates a wide variety of technologies and platforms. It also has a large and diverse set of capabilities that will reduce the need for customization. +wtPLSQL is Oracle database focused. It is built entirely with PL/SQL and Application Express. All testing and reporting is done in the database. Because it is centered on the Oracle database, it is a very simple implementation. With hooks and add-ons, it easy to customize. -The "wt" project is centered on one platform with a very simple implementation. It is easier to customize smaller, simpler systems. +If your development environment is heavily invested in PL/SQL and the Oracle database, wtPLSQL is built for you. -## Testing Methodologies -There is a longer discussion about unit testing methodologies in the [About wtPSQL Page](About-wtPLSQL.md) +## Links -Fundamentally, the Oracle database is a relational database. The relational database is based on transaction processing. Data is stored and shared in a precise manner between processes. - -JUnit testing is OO (Object Oriented programming) based. Encapsulation is a core part of OO. Data sharing is done through APIs (Application Programmatic Interfaces), i.e. no fundamental data persistence. - -The principle of "store and share" is the opposite of data encapsulation. As a result, OO testing approaches are inappropriate for relational databases. - -Here are several differences in testing methodologies between relational databases and Object Oriented. - -### Testing Persistence of Data -* Object Oriented - Use fakes or mocks to avoid any data persistence. -* Relational Database - Testing of data persistence is fundamental. - -### Isolation of Tests -* Object Oriented - Use fakes or mocks to avoid any "integration" testing. -* Relational Database - Isolating PL/SQL code from database CRUD (Create, Retrieve, Update, Delete) defeats the purpose of most PL/SQL testing. - -### Test Transience -* Object Oriented - Return object to original state. -* Relational Database - Integrity constraints on complex persisted data and/or complex data operations make simple test transience more difficult. An alternative is to add new data during each test and/or reset the database to a known test data set before testing. - -### Non-Sequenced Testing -* Object Oriented - All unit tests should be able to run in any order. -* Relational Database - Testing with integrity constraints on complex persisted data and/or complex data operations can be simpler with test sequencing. - -### Links * [utPLSQL V3 Website](https://utplsql.org) * [utPLSQL V3 Documentation](http://utplsql.org/documentation/) diff --git a/releases/V1.1.0/upgrade_from_V1.0.0/update_all_stats.sql b/releases/V1.1.0/upgrade_from_V1.0.0/update_all_stats.sql index 6846aa9..616ec3b 100644 --- a/releases/V1.1.0/upgrade_from_V1.0.0/update_all_stats.sql +++ b/releases/V1.1.0/upgrade_from_V1.0.0/update_all_stats.sql @@ -5,7 +5,7 @@ -- Compute and Add statistics to V1.1.0 "stats" tables -- -set serveroutput on size unlimited format wrapped +set serveroutput on size unlimited format truncated set linesize 1000 set trimspool on diff --git a/src/README.md b/src/README.md index c05a02d..532a431 100644 --- a/src/README.md +++ b/src/README.md @@ -1,6 +1,5 @@ # wtPLSQL Source Code - File Name | Description ------------|------------ conversion | Directory of wtPLSQL Conversion Scripts diff --git a/src/core/install.sql b/src/core/install.sql index eb80d68..9436947 100644 --- a/src/core/install.sql +++ b/src/core/install.sql @@ -122,7 +122,7 @@ WHENEVER SQLERROR continue -- Core Tables @hooks.tab -@wt_version.tab +@wt_versions.tab @wt_self_test.tab diff --git a/src/core/test_all.sql b/src/core/test_all.sql index ed698f9..725a146 100644 --- a/src/core/test_all.sql +++ b/src/core/test_all.sql @@ -1,6 +1,6 @@ spool test_all -set serveroutput on size unlimited format wrapped +set serveroutput on size unlimited format truncated set linesize 1000 set trimspool on diff --git a/src/core/wt_version.tab b/src/core/wt_version.tab deleted file mode 100644 index 64265d8..0000000 --- a/src/core/wt_version.tab +++ /dev/null @@ -1,23 +0,0 @@ - --- --- Version Table Installation --- - -create table wt_versions - (install_dtm date - ,action varchar2(15) - ,text varchar2(15) - ,constraint wt_versions_pk primary key (install_dtm) - ) pctfree 0; - -comment on table wt_versions is 'Records the installed and upgraded versions.'; -comment on column wt_versions.install_dtm is 'Date/Time the version that was installed/upgraded'; -comment on column wt_versions.text is 'Name of the version that was installed/upgraded'; - -grant select on wt_versions to public; - -create or replace public synonym wt_version for &schema_owner..wt_versions; - -insert into wt_versions (install_dtm, action, text) - values (sysdate, 'INSTALL', '1.2.0'); -commit; diff --git a/src/core/wt_versions.tab b/src/core/wt_versions.tab new file mode 100644 index 0000000..94255ca --- /dev/null +++ b/src/core/wt_versions.tab @@ -0,0 +1,29 @@ + +-- +-- Version Table Installation +-- + +create table wt_versions + (install_dtm date constraint wt_vesions_nn1 not null + ,action varchar2(15) constraint wt_vesions_nn2 not null + ,component varchar2(15) constraint wt_vesions_nn3 not null + ,version number constraint wt_vesions_nn4 not null + ,notes varchar2(100) + ,constraint wt_versions_pk primary key (install_dtm) + ,constraint wt_versions_ck1 check (action in ('INSTALL','UPDATE','REMOVE') + ) pctfree 0; + +comment on table wt_versions is 'Records the installed and upgraded versions.'; +comment on column wt_versions.install_dtm is '(Required) Date/Time the action was taken'; +comment on column wt_versions.action is '(Required) One of INSTALL, UPDATE, or REMOVE'; +comment on column wt_versions.component is '(Required) Component or Add-on name'; +comment on column wt_versions.version is '(Required) Version number of the Component or Add-on'; +comment on column wt_versions.notes is 'Additional notes for the action taken'; + +grant select on wt_versions to public; + +create or replace public synonym wt_version for &schema_owner..wt_versions; + +insert into wt_versions (install_dtm, action, component, version) + values (sysdate, 'INSTALL', 'Core', 1.2); +commit; diff --git a/src/core/wtplsql.pkb b/src/core/wtplsql.pkb index 6b5dedf..1e877b4 100644 --- a/src/core/wtplsql.pkb +++ b/src/core/wtplsql.pkb @@ -387,11 +387,18 @@ function show_version is ret_str wt_version.text%TYPE; begin - select max(t1.text) into ret_str - from wt_version t1 - where t1.install_dtm = (select max(t2.install_dtm) - from wt_version t2); - return ret_str; + for buff in ( + select component, version + from wt_version t1 + where t1.install_dtm = (select max(t2.install_dtm) + from wt_version t2 + where t2.component = t2.component) + and t1.action != 'REMOVE' + order by install_dtm ) + loop + ret_str := ret_str || component || ' ' || version || ', '; + end loop; + return substr(ret_str, 1, length(ret_str)-2); exception when NO_DATA_FOUND then return ''; @@ -410,12 +417,14 @@ $THEN msg_in => 'Test Existing Version', check_this_in => existing_version); -------------------------------------- WTPLSQL Testing -- - insert into wt_version (install_dtm, action, text) - values (to_date('31-DEC-4000','DD-MON-YYYY'), 'TESTING', 'TESTING'); - wt_assert.eq ( + insert into wt_version (install_dtm, action, component, version) + values (to_date('31-DEC-4000','DD-MON-YYYY'), 'INSTALL', 'TESTING', 999); + wt_assert.isnotnull ( + msg_in => 'Show New Version', + check_this_in => show_version); + wt_assert.this ( msg_in => 'Test New Version', - check_this_in => show_version, - against_this_in => 'TESTING'); + check_this_in => regexp_like(show_version, 'TESTING.*999')); -------------------------------------- WTPLSQL Testing -- rollback; wt_assert.eq ( diff --git a/src/demo/Table-Test.sql b/src/demo/Table-Test.sql index 223bdaa..78be3a7 100644 --- a/src/demo/Table-Test.sql +++ b/src/demo/Table-Test.sql @@ -50,7 +50,7 @@ as end table_test_pkg; / -set serveroutput on size unlimited format word_wrapped +set serveroutput on size unlimited format truncated begin wtplsql.test_run('TABLE_TEST_PKG'); diff --git a/src/demo/Test-Runner.sql b/src/demo/Test-Runner.sql index 3d4568e..38cf33c 100644 --- a/src/demo/Test-Runner.sql +++ b/src/demo/Test-Runner.sql @@ -20,14 +20,14 @@ begin end; / -set serveroutput on size unlimited format word_wrapped +set serveroutput on size unlimited format truncated begin wt_text_report.dbms_out(USER,'SIMPLE_TEST_RUNNER'); end; / -set serveroutput on size unlimited format word_wrapped +set serveroutput on size unlimited format truncated begin wt_text_report.dbms_out(in_runner_name => 'SIMPLE_TEST_RUNNER' diff --git a/src/demo/Trigger-Test.sql b/src/demo/Trigger-Test.sql index 57d0799..cda4c95 100644 --- a/src/demo/Trigger-Test.sql +++ b/src/demo/Trigger-Test.sql @@ -62,7 +62,7 @@ as end trigger_test_pkg; / -set serveroutput on size unlimited format word_wrapped +set serveroutput on size unlimited format truncated begin wtplsql.test_run('TRIGGER_TEST_PKG'); diff --git a/src/demo/Type-Test.sql b/src/demo/Type-Test.sql index c5ad540..9152d96 100644 --- a/src/demo/Type-Test.sql +++ b/src/demo/Type-Test.sql @@ -64,7 +64,7 @@ as end test_simple_object; / -set serveroutput on size unlimited format word_wrapped +set serveroutput on size unlimited format truncated begin wtplsql.test_run('TEST_SIMPLE_OBJECT'); diff --git a/src/demo/install.sql b/src/demo/install.sql index e1ddf6b..c9a7371 100644 --- a/src/demo/install.sql +++ b/src/demo/install.sql @@ -73,7 +73,7 @@ end; WHENEVER SQLERROR continue -set serveroutput on size unlimited format word_wrapped +set serveroutput on size unlimited format truncated select wtplsql.show_version from dual; diff --git a/src/demo/uninstall.sql b/src/demo/uninstall.sql index 990938d..6ded718 100644 --- a/src/demo/uninstall.sql +++ b/src/demo/uninstall.sql @@ -1,6 +1,6 @@ spool uninstall -set serveroutput on size unlimited format wrapped +set serveroutput on size unlimited format truncated @common_setup.sql diff --git a/src/demo/ut_betwnstr.sql b/src/demo/ut_betwnstr.sql index a838ddf..a7e6518 100644 --- a/src/demo/ut_betwnstr.sql +++ b/src/demo/ut_betwnstr.sql @@ -102,7 +102,7 @@ IS END ut_betwnstr; / -set serveroutput on size unlimited format word_wrapped +set serveroutput on size unlimited format truncated begin wtplsql.test_run('UT_BETWNSTR'); diff --git a/src/demo/ut_calc_secs_between.sql b/src/demo/ut_calc_secs_between.sql index e98a414..32ec94c 100644 --- a/src/demo/ut_calc_secs_between.sql +++ b/src/demo/ut_calc_secs_between.sql @@ -84,7 +84,7 @@ IS END ut_calc_secs_between; / -set serveroutput on size unlimited format word_wrapped +set serveroutput on size unlimited format truncated begin wtplsql.test_run('UT_CALC_SECS_BETWEEN'); diff --git a/src/demo/ut_str.sql b/src/demo/ut_str.sql index 317564b..2b0dba1 100644 --- a/src/demo/ut_str.sql +++ b/src/demo/ut_str.sql @@ -124,7 +124,7 @@ IS END str; / -set serveroutput on size unlimited format word_wrapped +set serveroutput on size unlimited format truncated begin wtplsql.test_run('STR'); diff --git a/src/demo/ut_truncit.sql b/src/demo/ut_truncit.sql index 7addb6e..06ac7e0 100644 --- a/src/demo/ut_truncit.sql +++ b/src/demo/ut_truncit.sql @@ -84,7 +84,7 @@ IS END ut_truncit; / -set serveroutput on size unlimited format word_wrapped +set serveroutput on size unlimited format truncated begin wtplsql.test_run('UT_TRUNCIT'); diff --git a/src/gui/f700.sql b/src/gui/f700.sql index 6f1a322..fc5b33c 100644 --- a/src/gui/f700.sql +++ b/src/gui/f700.sql @@ -160,7 +160,7 @@ wwv_flow_api.create_flow( p_login_url=> '', p_logout_url=> 'wwv_flow_custom_auth_std.logout?p_this_flow=&APP_ID.&p_next_flow_page_sess=&APP_ID.:1', p_application_tab_set=> 1, - p_logo_image => 'TEXT:wtPLSQL - White Box Testing Framework', + p_logo_image => 'TEXT:wtPLSQL - White Box Test Server for PL/SQL', p_public_url_prefix => '', p_public_user=> 'APEX_PUBLIC_USER', p_dbauth_url_prefix => '', diff --git a/src/persist/wt_profile.pkb b/src/persist/wt_profile.pkb index 4cd4eee..1c2253a 100644 --- a/src/persist/wt_profile.pkb +++ b/src/persist/wt_profile.pkb @@ -349,7 +349,7 @@ begin if c_readable%NOTFOUND then if core_data.g_run_rec.dbout_type in ('FUNCTION', 'PROCEDURE', 'PACKAGE BODY', - 'TYPE BODY', 'TRIGGER') + 'TRIGGER', 'TYPE BODY') then -- These object types should have PL/SQL source code available --%WTPLSQL_begin_ignore_lines%-- Untestable: From e46c6925d6e536bbf864811441151c17d3eef4cc Mon Sep 17 00:00:00 2001 From: DDieterich Date: Sun, 6 Jan 2019 23:43:47 -0600 Subject: [PATCH 053/141] Demo Documentation Updates --- README.md | 2 +- docs/Best-Practices.md | 41 +++++----- docs/README.md | 60 ++++++-------- docs/core/README.md | 127 +++++++++++++++++++++++++++--- docs/demo/Package-Test.md | 24 +++--- docs/demo/Table-Test.md | 4 +- docs/demo/Test-Runner.md | 28 ++++--- docs/demo/Trigger-Test.md | 6 +- docs/demo/Type-Test.md | 6 +- docs/demo/ut_betwnstr.md | 6 +- docs/demo/ut_calc_secs_between.md | 6 +- docs/demo/ut_str.md | 4 +- docs/demo/ut_truncit.md | 3 + docs/persist/README.md | 2 +- 14 files changed, 219 insertions(+), 100 deletions(-) diff --git a/README.md b/README.md index 15ab3d6..3421bff 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Welcome to the wtPLSQL source code repository on GitHub. -The http://wtPLSQL.org website has more information about how to use wtPLSQL and why it is different. It also includes wtPLSQL features, definitions, and best practices. (The wtPLSQL website is hosted on GitHub.io using a custom domain.) +The http://wtPLSQL.org website (hosted on GitHub.io) has more information about how to use wtPLSQL and why it is different. [Click here](https://github.com/DDieterich/wtPLSQL/releases/latest) for the latest release. diff --git a/docs/Best-Practices.md b/docs/Best-Practices.md index 7979017..be6026b 100644 --- a/docs/Best-Practices.md +++ b/docs/Best-Practices.md @@ -3,19 +3,14 @@ # Best Practices --- -Place the **"WTPLSQL_RUN" procedure at the end of the package body.** This allows the procedure call any procedure/function in the package. +Place the **"WTPLSQL_RUN" procedure at the end** of the package body. This allows the WTPLSQL_RUN procedure to call any procedure/function in the package. -Place the **"--% WTPLSQL SET DBOUT" annotation next to the WTPLSQL_RUN procedure** definition in the package body. +Set the package variable **"wtplsql.g_DBOUT" at the top** of the WTPLSQL_RUN procedure definition in the package body. This is a common location for all Test Runner packages. -``` - procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "MY_PACKAGE" %-- - is -``` - -**Separate "setup" and "teardown" steps** into their own Test Cases.** +**Separate "setup" and "teardown"** subroutines into their own Test Cases. -**Use words consistently in Test Case names.** -* Use the word "Setup" in Test Case names perform setup operations. +**Name Test Cases Consistently** +* Use the word "Setup" in Test Case names that perform setup operations. * Use the word "Teardown" in Test Case names that perform tear-down operations. * Use the words "Happy Path" in Test Case names that perform "happy path" tests. * Use the words "Sad Path" in Test Case names that perform "sad path" tests. @@ -27,7 +22,7 @@ Place the **"--% WTPLSQL SET DBOUT" annotation next to the WTPLSQL_RUN procedure * Longest and shortest values * All combinations of default and non-default values -**Create test procedures for each procedure/function** in a DBOUT PACKAGE BODY. +Create **individual test procedures for each procedure/function** in a DBOUT package. * Call all test procedures from the WTPLSQL_RUN procedure. * Embed the test procedure just after the procedure/function it tests. * Use a consistent prefix on all test procedure names, like "t_". @@ -36,24 +31,32 @@ Place the **"--% WTPLSQL SET DBOUT" annotation next to the WTPLSQL_RUN procedure * "WTPLSQL_ENABLE:TRUE" will enable test code. * "WTPLSQL_ENABLE:FALSE" will disable test code. -**Use consistent begin and end test code markers** for embedded tests. These examples will setup conditional compiling and annotate lines of code to be excluded from code coverage calculations. +**Use consistent begin and end test markers** for embedded tests. These examples will setup conditional compiling and annotate lines of code to be excluded from code coverage calculations. + +Here is an example "begin test marker". ``` -$IF $$WTPLSQL_ENABLE -------%WTPLSQL_begin_ignore_lines%------- -$THEN - ... -$END ----------------%WTPLSQL_end_ignore_lines%---------------- + $IF $$WTPLSQL_ENABLE -------%WTPLSQL_begin_ignore_lines%------- + $THEN ``` -**Keep embedded test code indented** between the test code markers +Here is an example "end test marker". + +``` + $END ----------------%WTPLSQL_end_ignore_lines%---------------- +``` + +**Indent embedded test code** between the test code markers + +**Add test markers** every 10 lines or less. This helps identify a long embedded test procedure while scrolling through source code. When in doubt, add more of these. -**Add WTPLSQL markers every 10 lines or less** in an embedded procedure. This helps identify a long embedded test procedure while scrolling through source code. When in doubt, add more of these. +Here is an example test marker. ``` -------------------------------------- WTPLSQL Testing -- ``` -**Check and/or set NLS settings before testing.** Many data types are implicitly converted to VARCHAR2 before comparison. The "wtplsql" package includes functions to check and set NLS settings. Note: Modifying these settings always includes a COMMIT. +**Check and/or set NLS settings** before testing. Many data types are implicitly converted to VARCHAR2 before comparison. The "wtplsql" package includes functions to check and set NLS settings. Note: Modifying these settings always includes a COMMIT. --- [Website Home Page](README.md) diff --git a/docs/README.md b/docs/README.md index 3813edd..539368c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,41 +1,40 @@ # wtPLSQL Home Page --- -wtPLSQL is a test automation server that uses an Oracle database to provide the following services for Test Runner packages written in PL/SQL. -* Execution of one or groups of Test Runners -* Assertion Results including Timing Between Assertions -* Capture and Reporting of Assertion Results - -wtPLSQL includes add-ons that provide these additional services. -* Storage and Reporting of Assertion Results -* Source Code Coverage of Test Runner -* Web Based Graphical User Interface -* Trend Analysis - -wtPLSQL includes components that provide the following services. -* JUnit XML Reporting -* utPLSQL V2 Conversion - [Click here](https://github.com/DDieterich/wtPLSQL/releases/latest) for the latest release on GitHub. [Click here](https://github.com/DDieterich/wtPLSQL/wiki/Compatibility) for the compatibility wiki page on GitHub. Use [GitHub "issues"](https://github.com/DDieterich/wtPLSQL/issues) for support. A (free) GitHub account will be required to create a new issue. Issues can be searched without an account. -### wtPLSQL Components and Add-ons +wtPLSQL is a test automation server that uses an Oracle database to provide the following services for Test Runner packages written in PL/SQL. +* Execution of One or More Test Runners +* Assertion Results including Timing Between Assertions +* Capture/Storage/Reporting of Assertion Results +* Source Code Coverage of Test Runner +* Web Based Graphical User Interface (APEX) + +### General Documentation -wtPLSQL functionality is contained in one or more components and add-ons. Various combinations can be installed to achieve the desired results. +* [About wtPLSQL](About-wtPLSQL.md) +* [Examples and Documentation](demo/README.md) +* [Definitions](Definitions.md) +* [Best Practices](Best-Practices.md) +* [Reference](Reference.md) +* [utPLSQL V1/V2 Comparison](utPLSQL-V2-Comparison.md) +* [utPLSQL V3 Comparison](utPLSQL-V3-Comparison.md) +* [OO Style Unit Testing is not for Databases](OO-Style-Unit-Testing.md) Component | Description --------------------------------|------------ -[core](core/README) | Required for all wtPLSQL functionality. Can be run stand-alone -[conversion](conversion/README) | Used to convert Test Runner packages from utPLSQL to wtPLSQL +[core](core/README) | Required for all wtPLSQL functionality. Small and Fast. +[conversion](conversion/README) | Convert Test Runner packages from utPLSQL V1/V2 to wtPLSQL
    Add-on | Description -----------------------------|------------ -[persist](persist/README.md) | Adds storage in tables and code coverage. +[persist](persist/README.md) | Adds storage in tables. Adds code coverage. [gui](gui/README.md) | Adds Oracle APEX screens and reports. Requires persist add-on. [junit](junit/README.md) | Adds JUnit XML reporting. @@ -67,22 +66,11 @@ The GUI module uses the Oracle APEX to enhance the UI experience. Many useful r Sample Graphical from wtPLSQL GUI -### More Examples and Demonstrations -* [Click here](demo/README.md) for more examples and demonstrations. - -### General Documentation - -* [About wtPLSQL](About-wtPLSQL.md) -* [Definitions](Definitions.md) -* [Best Practices](Best-Practices.md) -* [Reference](Reference.md) -* [utPLSQL V1/V2 Comparison](utPLSQL-V2-Comparison.md) -* [utPLSQL V3 Comparison](utPLSQL-V3-Comparison.md) -* [OO Style Unit Testing is not for Databases](OO-Style-Unit-Testing.md) +### wtPLSQL Internals -*Note: See the* **"wtPLSQL Components and Add-ons"** *above for documentation on individual components and add-ons.* +The web pages in this website contain information about the wtPLSQL software. Documentation on design and usage are included here. This website is version specific. Each release includes its own version of this website. The "master" branch (latest release) is always displayed at Github.io. Un-released updates are not displayed here. -### wtPLSQL Internals +For project information, see the [wtPLSQL wiki](https://github.com/DDieterich/wtPLSQL/wiki). Documentation on procedures and compatibility are included in the wiki. The wiki includes information for all releases of wtPLSQL. Any updates are immediately displayed. DB Docs | E-R Diagrams | Call Tree Diags ------------------------------------------|-----------------------------------------|---------------- @@ -108,8 +96,10 @@ File Name | Description --------------|------------ core | Core Documentation Directory demo | Demonstration Documentation Directory +gui | Graphical User Interface Documentation images | Image Files referenced by MD and HTML -_config.yml | YAML Configuration File for this Website +persist | Persist Documentation Directory +_config.yml | YAML Configuration File for Markdown *.md | Markdown files for "github.io" *.htm | HTML files for local documentation md-to-htm.bat | MS-Dos Batch File to convert MD to HTML diff --git a/docs/core/README.md b/docs/core/README.md index 500e2b1..0101e00 100644 --- a/docs/core/README.md +++ b/docs/core/README.md @@ -1,19 +1,128 @@ -# wtPLSQL -Whitebox Test Server for Oracle's PL/SQL Language +# wtPLSQL Software Documentation + +--- +wtPLSQL is a test automation server that uses an Oracle database to provide the following services for Test Runner packages written in PL/SQL. +* Execution of one or groups of Test Runners +* Assertion Results including Timing Between Assertions +* Capture and Reporting of Assertion Results + +wtPLSQL includes add-ons that provide these additional services. +* Storage and Reporting of Assertion Results +* Source Code Coverage of Test Runner +* Web Based Graphical User Interface +* Trend Analysis + +wtPLSQL includes components that provide the following services. +* JUnit XML Reporting +* utPLSQL V2 Conversion + +[Click here](https://github.com/DDieterich/wtPLSQL/releases/latest) for the latest release on GitHub. + +[Click here](https://github.com/DDieterich/wtPLSQL/wiki/Compatibility) for the compatibility wiki page on GitHub. + +Use [GitHub "issues"](https://github.com/DDieterich/wtPLSQL/issues) for support. A (free) GitHub account will be required to create a new issue. Issues can be searched without an account. + +### wtPLSQL Components and Add-ons + +wtPLSQL functionality is contained in one or more components and add-ons. Various combinations can be installed to achieve the desired results. + +Component | Description +--------------------------------|------------ +[core](core/README) | Required for all wtPLSQL functionality. Can be run stand-alone +[conversion](conversion/README) | Used to convert Test Runner packages from utPLSQL to wtPLSQL + +
    + +Add-on | Description +-----------------------------|------------ +[persist](persist/README.md) | Adds storage in tables and code coverage. +[gui](gui/README.md) | Adds Oracle APEX screens and reports. Requires persist add-on. +[junit](junit/README.md) | Adds JUnit XML reporting. + +To determine which components and add-ons have been installed, run this query: + +``` +select wtplsql.show_version from dual; +``` + +### Core Component Example Test Results + +Here is an example result summary from the core component. Only core is needed to produce this result. + +Sample DBMS_OUTPUT from wtPLSQL core + +To view the complete test results from the wtPLSQL core self-test, go to the "[src/core/test_allO.LST](https://github.com/DDieterich/wtPLSQL/blob/master/src/core/test_allO.LST)" file in GitHub. + +### Persist Add-on Example Test Results + +Here is the summary from the WT_ASSERT package self-test. It was created with the default DBMS_OUTPUT reporting package. Because test results and code coverage are stored in Oracle tables, other report formats are simple to create. + +Sample DBMS_OUTPUT from wtPLSQL Persist + +To view the complete test results from the wtPLSQL persist self-test, go to the "[src/persist/test_allO.LST](https://github.com/DDieterich/wtPLSQL/blob/master/src/persist/test_allO.LST)" file in GitHub. + +### GUI Add-on Example Test Results + +The GUI module uses the Oracle APEX to enhance the UI experience. Many useful reports are available with the GUI module. This is an example of ??? + +Sample Graphical from wtPLSQL GUI + +### More Examples and Demonstrations +* [Click here](demo/README.md) for more examples and demonstrations. + +### General Documentation + +* [About wtPLSQL](About-wtPLSQL.md) +* [Definitions](Definitions.md) +* [Best Practices](Best-Practices.md) +* [Reference](Reference.md) +* [utPLSQL V1/V2 Comparison](utPLSQL-V2-Comparison.md) +* [utPLSQL V3 Comparison](utPLSQL-V3-Comparison.md) +* [OO Style Unit Testing is not for Databases](OO-Style-Unit-Testing.md) + +*Note: See the* **"wtPLSQL Components and Add-ons"** *above for documentation on individual components and add-ons.* + +### wtPLSQL Internals + +DB Docs | E-R Diagrams | Call Tree Diags +------------------------------------------|-----------------------------------------|---------------- +[core docs](core/DBDocs/index.html) | [core ERDs](core/ER_Diagrams.pdf) | [core trees](core/Call_Tree_Diagrams.pdf) +[persist docs](persist/DBDocs/index.html) | [persist ERDs](persist/ER_Diagrams.pdf) | [persist trees](persist/Call_Tree_Diagrams.pdf) +[gui docs](gui/DBDocs/index.html) | [gui ERDs](gui/ER_Diagrams.pdf) | [gui trees](gui/Call_Tree_Diagrams.pdf) + +* **DB Docs** has web pages similar to JavaDocs created by Oracle's SQL*Developer. +* **E-R Diagrams** show relationships between tables (entities). +* **Call Tree Diagrams** show the PL/SQL programs, tables, and common (global) memory structures called by all PL/SQL programs. + +## Contribute + +Help us improve by joining us at the [wtPLSQL repository](https://github.com/DDieterich/wtPLSQL). + +--- + +*The following applies to files and directories at this location in the documentation repository.* + +### Files and Directories File Name | Description -----------------------|------------ DBDocs | SQL Developer DBDocs Files +_config.yml | YAML Configuration File for Markdown +*.md | Markdown files for "github.io" +*.htm | HTML files for local documentation Call_Tree_Diagrams.odg | LibreOffice Draw File for Process Call Trees Call_Tree_Diagrams.pdf | Process Call Tree (Graph) Diagrams ER_Diagrams.pdf | Entity-Relationship Diagrams +md-to-htm.bat | MS-Dos Batch File to convert MD to HTML +md-to-htm.lua | Lua script used by Pandoc for MD to HTML + +To view documentation use the URL "file://README.htm" or Double-click on the README.htm file. + +NOTE: All HTML files are sourced from Markdown files. + Modify the Markdown files, then build HTML from the + Markdown files using "md-to-htm.bat". +--- -### DB Docs Notes -* Tables -* Indexes -* Triggers -* Packages -* Package Bodies -* Procedures +_Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners._ diff --git a/docs/demo/Package-Test.md b/docs/demo/Package-Test.md index 6f40c47..835469f 100644 --- a/docs/demo/Package-Test.md +++ b/docs/demo/Package-Test.md @@ -4,11 +4,11 @@ --- -A majority of wtPLSQL testing is done with the test runner packages. In this example, a test runner package will be created to test the DBMS_OUTPUT package. For brevity, only PUT_LINE and GET_LINE will be tested. +A majority of wtPLSQL testing is done with a Test Runner package. In this example, we will create a Test Runner package that will test the DBMS_OUTPUT package. The DBMS_OUTPUT package is a part of every Oracle database. For brevity, only PUT_LINE and GET_LINE will be tested in the DBMS_OUTPUT package. ## Test Runner Package Specification -The specification for a test runner package is brutally simple. It only needs one procedure. +The specification for a Test Runner package is brutally simple. It only needs one procedure. Here, we create a package specification for the Test Runner. Run this: @@ -24,6 +24,8 @@ end test_dbms_output; Create a package body with the needed procedure. Add a call to enable DBMS_OUTPUT for testing. Setup and teardown will be handled later. +Run this: + ``` create or replace package body test_dbms_output as @@ -36,8 +38,6 @@ end test_dbms_output; / ``` -Procedures will be added to this package body. These procedures will run the assertions that will test the DBMS_OUTPUT package. - ## Testing Put Line and Get Line The new TEST_PUT_GET_LINE procedure will test the PUT_LINE and GET_LINE procedures together. Also, the TEST_PUT_GET_LINE procedure call is added to the WTPLSQL_RUN procedure. @@ -67,7 +67,7 @@ end test_dbms_output; / ``` -Run this: +Then, run this: ``` begin @@ -83,9 +83,9 @@ And get this: A successful test. Notice that the value of the C_TEST1 constant is displayed in the test result details. -## Leaving Something Behind +## Catching an Exception -In the previous example, everything worked correctly. If a problem occurs during testing, things can be left behind. Here is an example of GET_LINE not working, leaving the value of C_TEST1 in the DBMS_OUTPUT buffer. For testing purposes, an exception will be thrown between the PUT_LINE and GET_LINE call. +In the previous example, everything worked correctly. Here is an example of GET_LINE not working. For testing purposes, an exception will be thrown between the PUT_LINE and GET_LINE call. Run this: @@ -122,12 +122,14 @@ end; / ``` -And get this: +You might get this: ``` Test 1 ``` +Your results should include the above results, if DBMS_OUTPUT is enabled. There may be addition results due to a different wtPSQL configuration. + Notice there was no exception raised. wtPLSQL captured the exception and logged it. Also, the value of C_TEST1 shows in the output. It was left behind in the DBMS_OUTPUT buffer. Run this: @@ -211,7 +213,7 @@ end test_dbms_output; / ``` -The test runner package is quite large now. To review, the test runner will +The Test Runner package is quite large now. To review, the Test Runner will * Capture the current DBMS_OUPUT buffer. * Run a procedure that adds to the DBMS_OUPUT buffer. * Catch an exception raised by the procedure. @@ -219,7 +221,7 @@ The test runner package is quite large now. To review, the test runner will * Clear the current DBMS_OUPUT buffer. * Restore the original DBMS_OUPUT buffer. -In order to ensure it is restoring the original DBMS_OUPUT buffer, the message "This should be preserved." is added to the buffer. That message should be available after the test runner completes. +In order to ensure it is restoring the original DBMS_OUPUT buffer, the message "This should be preserved." is added to the buffer. That message should be available after the Test Runner completes. Run this: @@ -253,7 +255,7 @@ And get this: The exception handler preserved the error stack before calling teardown. Also, there is an extra "ORA-20000:" at the front of the error stack displayed, but all the error information is preserved. -These are all the basic tools needed to successfully create and run test runner packages in wtPLSQL. +These are all the basic tools needed to successfully create and run Test Runner packages in wtPLSQL. --- [Demos and Examples](README.md) diff --git a/docs/demo/Table-Test.md b/docs/demo/Table-Test.md index 388c9be..00736d5 100644 --- a/docs/demo/Table-Test.md +++ b/docs/demo/Table-Test.md @@ -12,7 +12,7 @@ The syntax diagram in Oracle's "Database SQL Language Reference" (11.2) gives th * References (Foreign Key) * Check -Typical unit testing (or white box testing) does not include the testing of constraints. In large part, these constraints are assumed to work without testing. Confirmation of continued function of these constraints is a reason to test them. +Typical, these constraints are assumed to work without testing. Here we create a Test Runner to test the constraints on a table. ## Table with Constraints @@ -126,7 +126,7 @@ And Get This: This is report level 30, the most detailed level of reporting. Starting from the top, we find the test runner executed 1 test case and 2 assertions. All tests passed for a 100% yield. There is no code coverage for the constraints. -This is not a complete test. More test cases are needed to confirm other constraints and sad path . +This is not a complete test. More test cases are needed to confirm other constraints and sad path testing. --- [Demos and Examples](README.md) diff --git a/docs/demo/Test-Runner.md b/docs/demo/Test-Runner.md index db43228..89eb5da 100644 --- a/docs/demo/Test-Runner.md +++ b/docs/demo/Test-Runner.md @@ -3,7 +3,7 @@ # Create a Simple Test Runner Package --- -Most all wtPLSQL tests are executed by a test runner package. Test runner packages are written by the tester. Below are examples of very simple test runner packages. +Most all wtPLSQL tests are executed by a Test Runner package. Test runner packages are written by the tester. Below are examples of very simple Test Runner packages. Run this: @@ -29,11 +29,11 @@ end simple_test_runner; / ``` -SIMPLE_TEST_RUNNER is a minimal test runner. It is a package that contains the (public) WTPLSQL_RUN procedure and 1 assertion. It does the same assertion as the ad-hoc assertion in the [Demos and Examples](README.md) page. +SIMPLE_TEST_RUNNER is a minimal Test Runner. It is a package that contains the (public) WTPLSQL_RUN procedure and 1 assertion. It does the same assertion as the ad-hoc assertion in the [Demos and Examples](README.md) page. ## Execute and Display -To execute the test runner package, run this: +To execute the Test Runner package, run this: ``` begin @@ -42,7 +42,7 @@ end; / ``` -There are no test results because the test results were not sent to DBMS_OUTPUT. The test results were saved in the wtPLSQL tables. +There may be no test results, depending on how wtPLSQL is configured. To view the results, run this: @@ -68,7 +68,7 @@ And get this: Total Run Time (sec): 0.2 ``` -This is the test result summary from the last execution of the SIMPLE_TEST_RUNNER package. The interval time shown here is the elapsed time from starting the test runner package until the first assertion was executed. The total run time is the elapsed time from start to finish for the test runner package. The report confirms that one assertion was executed for SIMPLE_TEST_RUNNER and it passed. All tests passed, so the test yield is 100%. +This is the test result summary from the last execution of the SIMPLE_TEST_RUNNER package. The interval time shown here is the elapsed time from starting the Test Runner package until the first assertion was executed. The total run time is the elapsed time from start to finish for the Test Runner package. The report confirms that one assertion was executed for SIMPLE_TEST_RUNNER and it passed. All tests passed, so the test yield is 100%. ## WT_TEXT_REPORT Display Levels @@ -103,13 +103,13 @@ And get this: PASS 56ms Ad-Hoc Test. EQ - Expected "1" and got "1" ``` -This shows the latest test result summary with test results details. A detail level of 30 shows summary and detailed test results for a test runner package. In this case, the summary and the detailed results of the EQ assertion are shown. These detail levels are explained in the [Reference Page](../Reference.md#wt_text_report-detail-levels). +This shows the latest test result summary with test results details. A detail level of 30 shows summary and detailed test results for a Test Runner package. In this case, the summary and the detailed results of the EQ assertion are shown. These detail levels are explained in the [Reference Page](../Reference.md#wt_text_report-detail-levels). -The detailed results shown are the same as the ad-hoc result, with a "56ms" added. The 56 in the detailed results shows the elapsed time between assertions, or elapsed time from test runner package startup to the first assertion. +The detailed results shown are the same as the ad-hoc result, with a "56ms" added. The 56 in the detailed results shows the elapsed time between assertions, or elapsed time from Test Runner package startup to the first assertion. ## Test Cases -For wtPLSQL, a test case is a collection of assertions. Assertion results can be grouped by test case. There can be zero or more test cases in a test runner package. +For wtPLSQL, a test case is a collection of assertions. Assertion results can be grouped by test case. There can be zero or more test cases in a Test Runner package. Run this: @@ -136,7 +136,7 @@ end simple_test_runner; / ``` -Setting a value for WT_ASSERT.G_TESTCASE in the SIMPLE_TEST_RUNNER package sets a test case for all following assertions. This value can be set multiple times within a test runner package. The results summary will show the number of test cases. The test results details will group assertions by test case. +Setting a value for WT_ASSERT.G_TESTCASE in the SIMPLE_TEST_RUNNER package sets a test case for all following assertions. This value can be set multiple times within a Test Runner package. The results summary will show the number of test cases. The test results details will group assertions by test case. Run this: @@ -149,7 +149,7 @@ end; / ``` -And get this: +You may get this: ``` wtPLSQL 1.1.0 - Run ID 43: 16-Jun-2018 07:43:50 AM @@ -171,6 +171,8 @@ And get this: PASS 0ms Ad-Hoc Test2. EQ - Expected "5" and got "5" ``` +If the Persist add-on is not installed, the code coverage results will not be displayed. + The Test Results summary shows 2 test cases were found. The Test Results Details show the assertion results grouped by test case. The details also show a failed assertion. It also shows "Ad-Hoc Test2" in "My Test Case B" passed because the TO_NUMBER was used to remove the space character from " 5". ## DBOUT Annotation @@ -225,11 +227,11 @@ And get this: Trigger Source Offset: 0 ``` -This shows the latest test result summary and code coverage summary for the SIMPLE_TEST_RUNNER test runner. DBMS_PROFILER found 4 lines of significance in the source code. 3 of those lines were executed. 1 line is unknown or undefined by DBMS_PROFILER. Unknown lines consume execution time, but were not executed. +This shows the latest test result summary and code coverage summary for the SIMPLE_TEST_RUNNER Test Runner. DBMS_PROFILER found 4 lines of significance in the source code. 3 of those lines were executed. 1 line is unknown or undefined by DBMS_PROFILER. Unknown lines consume execution time, but were not executed. ## Ignore Annotation -In the previous example, the SIMPLE_TEST_RUNNER package is both the test runner and the Database Object Under Test (DBOUT). In practice, this is a self testing package. Because DBMS_OUTPUT includes all the source lines, there is a need to segregate "testing" source lines from "tested" source lines. The ignore annotation is used to segregate these lines. +In the previous example, the SIMPLE_TEST_RUNNER package is both the Test Runner and the Database Object Under Test (DBOUT). In practice, this is a self testing package. Because DBMS_OUTPUT includes all the source lines, there is a need to segregate "testing" source lines from "tested" source lines. The ignore annotation is used to segregate these lines. The function "add2" represents some code that needs to be tested. It is also a private function. Self testing packages can test the private functions in the package. @@ -308,7 +310,7 @@ Source TotTime MinTime MaxTime 15 IGNR 1 0 0 0 end wtplsql_run; --%WTPLSQL_end_ignore_lines%-- ``` -This is a very large report from the WT_TEXT_REPORT package. The detail level of 30 displays the full detail of the test runner execution with code coverage. +This is a very large report from the WT_TEXT_REPORT package. The detail level of 30 displays the full detail of the Test Runner execution with code coverage. Close to the middle of the output, is the "Code Coverage Details" title for the final section. This section contains results from DBMS_PROFILER. Each line of source code is matched with that output. Some interesting points. diff --git a/docs/demo/Trigger-Test.md b/docs/demo/Trigger-Test.md index 472c835..c6328db 100644 --- a/docs/demo/Trigger-Test.md +++ b/docs/demo/Trigger-Test.md @@ -105,7 +105,7 @@ end; ## Create a Simple Test Runner -All test runners are written as a PL/SQL package. A simple package is created first. A DBOUT is also identified. +All Test Runners are written as a PL/SQL package. A simple package is created first. A DBOUT is also identified. Run this: @@ -209,7 +209,9 @@ Source TotTime MinTime MaxTime 10 EXEC 1 2 2 2 end; ``` -This is report level 30, the most detailed level of reporting. Starting from the top, we find the test runner executed 1 test case and 3 assertions. All tests passed for a 100% yield. The code coverage for the trigger shows 5 profiles, 4 executed, and a code coverage of 100%. Notice the trigger offset of 3 which aligns the source code with the profiled lines. +If the Persist add-on is not installed, the code coverage results will not be displayed. + +This is report level 30, the most detailed level of reporting. Starting from the top, we find the Test Runner executed 1 test case and 3 assertions. All tests passed for a 100% yield. The code coverage for the trigger shows 5 profiles, 4 executed, and a code coverage of 100%. Notice the trigger offset of 3 which aligns the source code with the profiled lines. This is not a complete test. More test cases are needed to confirm various values are handled correctly when inserted. diff --git a/docs/demo/Type-Test.md b/docs/demo/Type-Test.md index b96e422..0322e94 100644 --- a/docs/demo/Type-Test.md +++ b/docs/demo/Type-Test.md @@ -67,7 +67,7 @@ end; ## Create a Simple Test Runner -All test runners are written as a PL/SQL package. A simple package is created first. A DBOUT is also identified. +All Test Runners are written as a PL/SQL package. A simple package is created first. A DBOUT is also identified. Run this: @@ -166,7 +166,9 @@ Source TotTime MinTime MaxTime 20 EXCL 0 0 0 0 end add_observation; ``` -This is report level 30, the most detailed level of reporting. Starting from the top, we find the test runner executed 1 test case, 2 assertions, and no failed assertions, which resulted in 100% yield (all tests passed). The next section shows the type body tested had 10 lines profiled, 4 were executed, and 4 were not executed, which resulted in a code coverage of 50%. Additional testing is required to achieve 100% code coverage. For brevity, this additional testing will not be included. +If the Persist add-on is not installed, the code coverage results will not be displayed. + +This is report level 30, the most detailed level of reporting. Starting from the top, we find the Test Runner executed 1 test case, 2 assertions, and no failed assertions, which resulted in 100% yield (all tests passed). The next section shows the type body tested had 10 lines profiled, 4 were executed, and 4 were not executed, which resulted in a code coverage of 50%. Additional testing is required to achieve 100% code coverage. For brevity, this additional testing will not be included. ## Testing Private Object Methods and Self-Testing diff --git a/docs/demo/ut_betwnstr.md b/docs/demo/ut_betwnstr.md index a109c0f..1c955cb 100644 --- a/docs/demo/ut_betwnstr.md +++ b/docs/demo/ut_betwnstr.md @@ -10,7 +10,7 @@ The [original "ut_betwnstr" example](https://utplsql.org/utPLSQL/v2.3.1/fourstep ## Test Package Conversion -Conversion of this test package into a test runner package requires the addition of the "wtPLSQL_run" procedure in the package specification. +Conversion of this test package into a Test Runner package requires the addition of the "wtPLSQL_run" procedure in the package specification. Run this: @@ -107,7 +107,7 @@ END ut_betwnstr; / ``` -It is not necessary to keep the ut_setup and ut_teardown procedures. These were kept to indicate how to incorporate those procedures into a test runner package. The SET DBOUT annotation was also added to gather code coverage data. +It is not necessary to keep the ut_setup and ut_teardown procedures. These were kept to indicate how to incorporate those procedures into a Test Runner package. The SET DBOUT annotation was also added to gather code coverage data. ## Check the Results @@ -152,5 +152,7 @@ Source TotTime MinTime MaxTime 15 EXEC 5 1 0 1 end; ``` +If the Persist add-on is not installed, the code coverage results will not be displayed. + --- [Demos and Examples](README.md) diff --git a/docs/demo/ut_calc_secs_between.md b/docs/demo/ut_calc_secs_between.md index 0f8f89b..4314ddf 100644 --- a/docs/demo/ut_calc_secs_between.md +++ b/docs/demo/ut_calc_secs_between.md @@ -10,7 +10,7 @@ The [original "ut_ut_calc_secs_between" example](https://utplsql.org/utPLSQL/v2. ## Test Package Conversion -Conversion of this test package into a test runner package requires the addition of the "wtPLSQL_run" procedure in the package specification. +Conversion of this test package into a Test Runner package requires the addition of the "wtPLSQL_run" procedure in the package specification. Run this: @@ -93,7 +93,7 @@ END ut_calc_secs_between; / ``` -It is not necessary to keep the ut_setup and ut_teardown procedures. These were kept to indicate how to incorporate those procedures into a test runner package. The SET DBOUT annotation was also added to gather code coverage data. +It is not necessary to keep the ut_setup and ut_teardown procedures. These were kept to indicate how to incorporate those procedures into a Test Runner package. The SET DBOUT annotation was also added to gather code coverage data. ## Check the Results @@ -136,5 +136,7 @@ Source TotTime MinTime MaxTime 11 EXEC 2 1 1 1 END; ``` +If the Persist add-on is not installed, the code coverage results will not be displayed. + --- [Demos and Examples](README.md) diff --git a/docs/demo/ut_str.md b/docs/demo/ut_str.md index 132aa16..bf44573 100644 --- a/docs/demo/ut_str.md +++ b/docs/demo/ut_str.md @@ -10,7 +10,7 @@ The [original "ut_str" example](https://utplsql.org/utPLSQL/v2.3.1/testfunc.html ## Test Package Conversion -Conversion of this test package into a test runner package requires the addition of the "wtPLSQL_run" procedure in the package specification. +Conversion of this test package into a Test Runner package requires the addition of the "wtPLSQL_run" procedure in the package specification. Run this: @@ -225,5 +225,7 @@ Source TotTime MinTime MaxTime 93 IGNR 1 0 0 0 END wtplsql_run; ``` +If the Persist add-on is not installed, the code coverage results will not be displayed. + --- [Demos and Examples](README.md) diff --git a/docs/demo/ut_truncit.md b/docs/demo/ut_truncit.md index 15b1d48..263c328 100644 --- a/docs/demo/ut_truncit.md +++ b/docs/demo/ut_truncit.md @@ -128,5 +128,8 @@ Source TotTime MinTime MaxTime 8 EXEC 1 2 2 2 END; ``` +If the Persist add-on is not installed, the code coverage results will not be displayed. + + --- [Demos and Examples](README.md) diff --git a/docs/persist/README.md b/docs/persist/README.md index d32695c..8d61ece 100644 --- a/docs/persist/README.md +++ b/docs/persist/README.md @@ -1,5 +1,5 @@ # wtPLSQL -Whitebox Test Server for Oracle's PL/SQL Language +Whitebox Testing for PL/SQL File Name | Description From 300fe8943503c1f02f5cf854dfef4f1da89e116d Mon Sep 17 00:00:00 2001 From: DDieterich Date: Tue, 8 Jan 2019 01:08:45 -0600 Subject: [PATCH 054/141] More Documentation Updates --- docs/README.md | 70 +++++++-------- docs/Reference.md | 10 ++- docs/conversion-component.md | 10 +++ docs/core-component.md | 14 +++ docs/core/README.md | 119 -------------------------- docs/demo/README.md | 19 ++++ docs/{gui/README.md => gui-add-on.md} | 8 +- docs/gui/_config.yml | 1 - docs/gui/md-to-htm.bat | 9 -- docs/gui/md-to-htm.lua | 7 -- docs/junit-add-on.md | 11 +++ docs/persist-add-on.md | 11 +++ docs/persist/README.md | 3 +- docs/persist/Reference.md | 15 ---- 14 files changed, 116 insertions(+), 191 deletions(-) create mode 100644 docs/conversion-component.md create mode 100644 docs/core-component.md rename docs/{gui/README.md => gui-add-on.md} (61%) delete mode 100644 docs/gui/_config.yml delete mode 100644 docs/gui/md-to-htm.bat delete mode 100644 docs/gui/md-to-htm.lua create mode 100644 docs/junit-add-on.md create mode 100644 docs/persist-add-on.md delete mode 100644 docs/persist/Reference.md diff --git a/docs/README.md b/docs/README.md index 539368c..67dfbf9 100644 --- a/docs/README.md +++ b/docs/README.md @@ -7,43 +7,15 @@ Use [GitHub "issues"](https://github.com/DDieterich/wtPLSQL/issues) for support. A (free) GitHub account will be required to create a new issue. Issues can be searched without an account. -wtPLSQL is a test automation server that uses an Oracle database to provide the following services for Test Runner packages written in PL/SQL. +### Overview + +wtPLSQL is a test automation server that runs in an Oracle database to provide the following services for Test Runner packages written in PL/SQL. * Execution of One or More Test Runners * Assertion Results including Timing Between Assertions * Capture/Storage/Reporting of Assertion Results * Source Code Coverage of Test Runner * Web Based Graphical User Interface (APEX) -### General Documentation - -* [About wtPLSQL](About-wtPLSQL.md) -* [Examples and Documentation](demo/README.md) -* [Definitions](Definitions.md) -* [Best Practices](Best-Practices.md) -* [Reference](Reference.md) -* [utPLSQL V1/V2 Comparison](utPLSQL-V2-Comparison.md) -* [utPLSQL V3 Comparison](utPLSQL-V3-Comparison.md) -* [OO Style Unit Testing is not for Databases](OO-Style-Unit-Testing.md) - -Component | Description ---------------------------------|------------ -[core](core/README) | Required for all wtPLSQL functionality. Small and Fast. -[conversion](conversion/README) | Convert Test Runner packages from utPLSQL V1/V2 to wtPLSQL - -
    - -Add-on | Description ------------------------------|------------ -[persist](persist/README.md) | Adds storage in tables. Adds code coverage. -[gui](gui/README.md) | Adds Oracle APEX screens and reports. Requires persist add-on. -[junit](junit/README.md) | Adds JUnit XML reporting. - -To determine which components and add-ons have been installed, run this query: - -``` -select wtplsql.show_version from dual; -``` - ### Core Component Example Test Results Here is an example result summary from the core component. Only core is needed to produce this result. @@ -66,11 +38,31 @@ The GUI module uses the Oracle APEX to enhance the UI experience. Many useful r Sample Graphical from wtPLSQL GUI -### wtPLSQL Internals +### General Documentation -The web pages in this website contain information about the wtPLSQL software. Documentation on design and usage are included here. This website is version specific. Each release includes its own version of this website. The "master" branch (latest release) is always displayed at Github.io. Un-released updates are not displayed here. +* [About wtPLSQL](About-wtPLSQL.md) +* [Examples and Documentation](demo/README.md) +* [Definitions](Definitions.md) +* [Best Practices](Best-Practices.md) +* [Reference](Reference.md) +* [utPLSQL V1/V2 Comparison](utPLSQL-V2-Comparison.md) +* [utPLSQL V3 Comparison](utPLSQL-V3-Comparison.md) +* [OO Style Unit Testing is not for Databases](OO-Style-Unit-Testing.md) -For project information, see the [wtPLSQL wiki](https://github.com/DDieterich/wtPLSQL/wiki). Documentation on procedures and compatibility are included in the wiki. The wiki includes information for all releases of wtPLSQL. Any updates are immediately displayed. +Component | Description +--------------------------------------|------------ +[core](core-component.md) | Required for all wtPLSQL functionality. Small and Fast. +[conversion](conversion-component.md) | Convert Test Runner packages from utPLSQL V1/V2 to wtPLSQL + +
    + +Add-on | Description +-----------------------------|------------ +[persist](persist-add-on.md) | Adds storage in tables. Adds code coverage. +[gui](gui-add-on.md) | Adds Oracle APEX screens and reports. Requires persist add-on. +[junit](junit-add-on.md) | Adds JUnit XML reporting. + +
    DB Docs | E-R Diagrams | Call Tree Diags ------------------------------------------|-----------------------------------------|---------------- @@ -82,10 +74,20 @@ DB Docs | E-R Diagrams * **E-R Diagrams** show relationships between tables (entities). * **Call Tree Diagrams** show the PL/SQL programs, tables, and common (global) memory structures called by all PL/SQL programs. +To determine which components and add-ons have been installed, run this query: + +``` +select wtplsql.show_version from dual; +``` + ## Contribute Help us improve by joining us at the [wtPLSQL repository](https://github.com/DDieterich/wtPLSQL). +The web pages in this website contain information about the wtPLSQL software. Documentation on design and usage are included here. This website is version specific. Each release includes its own version of this website. The "master" branch (latest release) is always displayed at Github.io. Un-released updates are not displayed here. + +For project information, see the [wtPLSQL wiki](https://github.com/DDieterich/wtPLSQL/wiki). Documentation on procedures and compatibility are included in the wiki. The wiki includes information for all releases of wtPLSQL. Any updates are immediately displayed. + --- *The following applies to files and directories at this location in the documentation repository.* diff --git a/docs/Reference.md b/docs/Reference.md index b6ca5f9..5aa9e24 100644 --- a/docs/Reference.md +++ b/docs/Reference.md @@ -25,12 +25,20 @@ There is a balance to strike between simplicity and localization. Many data type An obvious drawback of this approach is running assertions when NLS settings must be set to something other than the setting that is needed for comparison. In this case, an explicit conversion can be made in the Test Runnner using the needed format. -## Custom Error Codes +## Core Error Codes * ORA-20001 - WTPLSQL Package: RUNNER_NAME is NULL * ORA-20002 - WTPLSQL Package: RUNNER_NAME (name) is not valid * ORA-20003 - HOOK Package: Unknown HOOK_NAME Case * ORA-20004 - WT_ASSERT Package: User Test Result is FAIL (g_raise_exception is TRUE) +## Persist Error Codes +* ORA-20009 ORA-20011 - WT_RESULT Package: "in_test_run_id" cannot be NULL +* ORA-20004 ORA-20012 - WT_PROFILER Package: in_test_run_id is NULL +* ORA-20005 ORA-20013 - WT_PROFILER Package: dbms_profiler.INTERNAL_VERSION_CHECK returned (error) +* ORA-20006 ORA-20014 - WT_PROFILER Package: dbms_profiler.START_PROFILER returned (error) +* ORA-20010 ORA-20015 - WT_TEST_RUN_STAT Package: Unknown Result status +* ORA-20011 ORA-20016 - WT_TEST_RUN_STAT Package: Unknown Profile status + ## WT_TEXT_REPORT Detail Levels * **Less than 10 (including null)** - No Detail * Assertion results summary. diff --git a/docs/conversion-component.md b/docs/conversion-component.md new file mode 100644 index 0000000..4e5160b --- /dev/null +++ b/docs/conversion-component.md @@ -0,0 +1,10 @@ +[Website Home Page](README.md) + +# wtPLSQL Conversion Component + +--- + +See the README.md file in the src/conversion directory for installation instructions. + +--- +[Website Home Page](README.md) \ No newline at end of file diff --git a/docs/core-component.md b/docs/core-component.md new file mode 100644 index 0000000..bc89086 --- /dev/null +++ b/docs/core-component.md @@ -0,0 +1,14 @@ +[Website Home Page](README.md) + +# wtPLSQL Core Component + +--- +Required for all wtPLSQL functionality. Can be run stand-alone + +### Important Note: +No Test Runner will be executed if there is no "execute_test_runner" hook in the hooks table. + +See the README.md file in the src/core directory for installation instructions. + +--- +[Website Home Page](README.md) \ No newline at end of file diff --git a/docs/core/README.md b/docs/core/README.md index 0101e00..570cb82 100644 --- a/docs/core/README.md +++ b/docs/core/README.md @@ -1,128 +1,9 @@ -# wtPLSQL Software Documentation - ---- -wtPLSQL is a test automation server that uses an Oracle database to provide the following services for Test Runner packages written in PL/SQL. -* Execution of one or groups of Test Runners -* Assertion Results including Timing Between Assertions -* Capture and Reporting of Assertion Results - -wtPLSQL includes add-ons that provide these additional services. -* Storage and Reporting of Assertion Results -* Source Code Coverage of Test Runner -* Web Based Graphical User Interface -* Trend Analysis - -wtPLSQL includes components that provide the following services. -* JUnit XML Reporting -* utPLSQL V2 Conversion - -[Click here](https://github.com/DDieterich/wtPLSQL/releases/latest) for the latest release on GitHub. - -[Click here](https://github.com/DDieterich/wtPLSQL/wiki/Compatibility) for the compatibility wiki page on GitHub. - -Use [GitHub "issues"](https://github.com/DDieterich/wtPLSQL/issues) for support. A (free) GitHub account will be required to create a new issue. Issues can be searched without an account. - -### wtPLSQL Components and Add-ons - -wtPLSQL functionality is contained in one or more components and add-ons. Various combinations can be installed to achieve the desired results. - -Component | Description ---------------------------------|------------ -[core](core/README) | Required for all wtPLSQL functionality. Can be run stand-alone -[conversion](conversion/README) | Used to convert Test Runner packages from utPLSQL to wtPLSQL - -
    - -Add-on | Description ------------------------------|------------ -[persist](persist/README.md) | Adds storage in tables and code coverage. -[gui](gui/README.md) | Adds Oracle APEX screens and reports. Requires persist add-on. -[junit](junit/README.md) | Adds JUnit XML reporting. - -To determine which components and add-ons have been installed, run this query: - -``` -select wtplsql.show_version from dual; -``` - -### Core Component Example Test Results - -Here is an example result summary from the core component. Only core is needed to produce this result. - -Sample DBMS_OUTPUT from wtPLSQL core - -To view the complete test results from the wtPLSQL core self-test, go to the "[src/core/test_allO.LST](https://github.com/DDieterich/wtPLSQL/blob/master/src/core/test_allO.LST)" file in GitHub. - -### Persist Add-on Example Test Results - -Here is the summary from the WT_ASSERT package self-test. It was created with the default DBMS_OUTPUT reporting package. Because test results and code coverage are stored in Oracle tables, other report formats are simple to create. - -Sample DBMS_OUTPUT from wtPLSQL Persist - -To view the complete test results from the wtPLSQL persist self-test, go to the "[src/persist/test_allO.LST](https://github.com/DDieterich/wtPLSQL/blob/master/src/persist/test_allO.LST)" file in GitHub. - -### GUI Add-on Example Test Results - -The GUI module uses the Oracle APEX to enhance the UI experience. Many useful reports are available with the GUI module. This is an example of ??? - -Sample Graphical from wtPLSQL GUI - -### More Examples and Demonstrations -* [Click here](demo/README.md) for more examples and demonstrations. - -### General Documentation - -* [About wtPLSQL](About-wtPLSQL.md) -* [Definitions](Definitions.md) -* [Best Practices](Best-Practices.md) -* [Reference](Reference.md) -* [utPLSQL V1/V2 Comparison](utPLSQL-V2-Comparison.md) -* [utPLSQL V3 Comparison](utPLSQL-V3-Comparison.md) -* [OO Style Unit Testing is not for Databases](OO-Style-Unit-Testing.md) - -*Note: See the* **"wtPLSQL Components and Add-ons"** *above for documentation on individual components and add-ons.* - -### wtPLSQL Internals - -DB Docs | E-R Diagrams | Call Tree Diags -------------------------------------------|-----------------------------------------|---------------- -[core docs](core/DBDocs/index.html) | [core ERDs](core/ER_Diagrams.pdf) | [core trees](core/Call_Tree_Diagrams.pdf) -[persist docs](persist/DBDocs/index.html) | [persist ERDs](persist/ER_Diagrams.pdf) | [persist trees](persist/Call_Tree_Diagrams.pdf) -[gui docs](gui/DBDocs/index.html) | [gui ERDs](gui/ER_Diagrams.pdf) | [gui trees](gui/Call_Tree_Diagrams.pdf) - -* **DB Docs** has web pages similar to JavaDocs created by Oracle's SQL*Developer. -* **E-R Diagrams** show relationships between tables (entities). -* **Call Tree Diagrams** show the PL/SQL programs, tables, and common (global) memory structures called by all PL/SQL programs. - -## Contribute - -Help us improve by joining us at the [wtPLSQL repository](https://github.com/DDieterich/wtPLSQL). - ---- - -*The following applies to files and directories at this location in the documentation repository.* - ### Files and Directories File Name | Description -----------------------|------------ DBDocs | SQL Developer DBDocs Files -_config.yml | YAML Configuration File for Markdown -*.md | Markdown files for "github.io" -*.htm | HTML files for local documentation Call_Tree_Diagrams.odg | LibreOffice Draw File for Process Call Trees Call_Tree_Diagrams.pdf | Process Call Tree (Graph) Diagrams ER_Diagrams.pdf | Entity-Relationship Diagrams -md-to-htm.bat | MS-Dos Batch File to convert MD to HTML -md-to-htm.lua | Lua script used by Pandoc for MD to HTML - -To view documentation use the URL "file://README.htm" or Double-click on the README.htm file. - -NOTE: All HTML files are sourced from Markdown files. - Modify the Markdown files, then build HTML from the - Markdown files using "md-to-htm.bat". - ---- - -_Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners._ diff --git a/docs/demo/README.md b/docs/demo/README.md index d47c9d6..c5b7f02 100644 --- a/docs/demo/README.md +++ b/docs/demo/README.md @@ -119,5 +119,24 @@ To un-install: To confirm a successful un-install, review the "uninstall.LST" log file against the "uninstallO.LST" example log file. +--- + +*The following applies to files and directories at this location in the documentation repository.* + +File Name | Description +--------------|------------ +DBDocs | SQL Developer DBDocs Files +*.md | Markdown files for "github.io" +*.htm | HTML files for local documentation +images | Image Files referenced by MD and HTML +md-to-htm.bat | MS-Dos Batch File to convert MD to HTML +md-to-htm.lua | Lua script used by Pandoc for MD to HTML + +To view documentation use the URL "file://README.htm" or Double-click on the README.htm file. + +NOTE: All HTML files are sourced from Markdown files. + Modify the Markdown files, then build HTML from the + Markdown files using "md-to-htm.bat". + --- [Website Home Page](../README.md) \ No newline at end of file diff --git a/docs/gui/README.md b/docs/gui-add-on.md similarity index 61% rename from docs/gui/README.md rename to docs/gui-add-on.md index 2b6b539..608d483 100644 --- a/docs/gui/README.md +++ b/docs/gui-add-on.md @@ -1,6 +1,6 @@ -[Website Home Page](../README.md) +[Website Home Page](README.md) -# wtPLSQL Graphical User Interface +# wtPLSQL Graphical User Interface Add-on --- @@ -8,5 +8,7 @@ PL/SQL development in the database is different from other All examples shown here use the WTP_DEMO demonstration as described in [Demonstrations and Examples Page](../demo/README.md). Use the "Demo Installer" at the bottom of the page to create a fresh install in a different schema. +See the README.md file in the src/core directory for installation instructions. + --- -[Website Home Page](../README.md) \ No newline at end of file +[Website Home Page](README.md) \ No newline at end of file diff --git a/docs/gui/_config.yml b/docs/gui/_config.yml deleted file mode 100644 index b849713..0000000 --- a/docs/gui/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-leap-day \ No newline at end of file diff --git a/docs/gui/md-to-htm.bat b/docs/gui/md-to-htm.bat deleted file mode 100644 index 5fc1093..0000000 --- a/docs/gui/md-to-htm.bat +++ /dev/null @@ -1,9 +0,0 @@ - -REM pandoc -f gfm -t html --lua-filter=md-to-htm.lua -o %1.htm %1.md - -for %%f in (*.md) do ( - REM echo %%~nf.htm - pandoc -f gfm -t html --lua-filter=md-to-htm.lua -o %%~nf.htm %%~nf.md - ) - -pause diff --git a/docs/gui/md-to-htm.lua b/docs/gui/md-to-htm.lua deleted file mode 100644 index dbaa04e..0000000 --- a/docs/gui/md-to-htm.lua +++ /dev/null @@ -1,7 +0,0 @@ -# md-to-htm.lua --- Adapted from answer by JW https://stackoverflow.com/users/4321/jw --- at https://stackoverflow.com/questions/40993488 -function Link(el) - el.target = string.gsub(el.target, "%.md", ".htm") - return el -end \ No newline at end of file diff --git a/docs/junit-add-on.md b/docs/junit-add-on.md new file mode 100644 index 0000000..7278c67 --- /dev/null +++ b/docs/junit-add-on.md @@ -0,0 +1,11 @@ +[Website Home Page](README.md) + +# wtPLSQL JUnit Add-on + +--- + +See the README.md file in the src/junit directory for installation instructions. + + +--- +[Website Home Page](README.md) \ No newline at end of file diff --git a/docs/persist-add-on.md b/docs/persist-add-on.md new file mode 100644 index 0000000..53094ef --- /dev/null +++ b/docs/persist-add-on.md @@ -0,0 +1,11 @@ +[Website Home Page](README.md) + +# wtPLSQL Core Component + +--- +Must install core first. + +See the README.md file in the src/core directory for installation instructions. + +--- +[Website Home Page](README.md) \ No newline at end of file diff --git a/docs/persist/README.md b/docs/persist/README.md index 8d61ece..570cb82 100644 --- a/docs/persist/README.md +++ b/docs/persist/README.md @@ -1,6 +1,5 @@ -# wtPLSQL -Whitebox Testing for PL/SQL +### Files and Directories File Name | Description -----------------------|------------ diff --git a/docs/persist/Reference.md b/docs/persist/Reference.md deleted file mode 100644 index ecbe8c0..0000000 --- a/docs/persist/Reference.md +++ /dev/null @@ -1,15 +0,0 @@ -[Website Home Page](../README.md) - -# Reference - ---- -## Custom Error Codes -* ORA-20009 ORA-20011 - WT_RESULT Package: "in_test_run_id" cannot be NULL -* ORA-20004 ORA-20012 - WT_PROFILER Package: in_test_run_id is NULL -* ORA-20005 ORA-20013 - WT_PROFILER Package: dbms_profiler.INTERNAL_VERSION_CHECK returned (error) -* ORA-20006 ORA-20014 - WT_PROFILER Package: dbms_profiler.START_PROFILER returned (error) -* ORA-20010 ORA-20015 - WT_TEST_RUN_STAT Package: Unknown Result status -* ORA-20011 ORA-20016 - WT_TEST_RUN_STAT Package: Unknown Profile status - ---- -[Website Home Page](README.md) From 3749f773b9084aa290bc86f528a29940bed60154 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Thu, 10 Jan 2019 20:15:26 -0600 Subject: [PATCH 055/141] Add Core Component Doc --- docs/core-component.md | 61 +++++++++++++++++++++++++++++++- src/core/wtplsql.pks | 2 -- src/junit/junit_core_install.sql | 6 ++++ 3 files changed, 66 insertions(+), 3 deletions(-) diff --git a/docs/core-component.md b/docs/core-component.md index bc89086..706edd4 100644 --- a/docs/core-component.md +++ b/docs/core-component.md @@ -3,11 +3,70 @@ # wtPLSQL Core Component --- -Required for all wtPLSQL functionality. Can be run stand-alone +### Overview +The Core component is built to be very small and very fast. It has 5 packages and 1 procedure. During execution of a Test Runner, it stores all assertion results in memory. It can be run without any add-ons. It is the backbone of the wtPLSQL whitebox testing server. + +### Assertion Storage +The core component stores all assertion results in the CORE_DATA package. All assertion results are cleared before the execution of a Test Runner. The average assertion record is about 256 bytes. 4,000 assertion results will consume about a Megabyte of memory. Detailed results from the last assertion are alos published as global variables in the CORE_DATA package. + +### Assertions +The WT_ASSERT package contains the assertion API. It contains 10 basic assertions. Each assertion works with most all possible Oracle database data types. + * eq + * isnotnull + * isnull + * raises + * eqqueryvalue + * eqquery + * eqtable + * eqtabcount + * objexists + * objnotexists + +The WT_ASSERT package includes an internal self-test. The following data types are tested in this self-test. + * varchar2 + * nvarchar2 + * clob + * nclob + * number + * pls_integer + * boolean + * date + * timestamp + * timestamp with local time zone + * timestamp with time zone + * interval day to second + * interval year to month + * xmltype + * long + * raw + * long raw + * blob + * rowid + +### Assertion Reporting +The WT_TEST_REPORT package is provided for reporting assertion results from a Test Runner. The package has several settings to vary the levels of detail. All output goes to DBMS_OUTPUT. See the WT_TEST_REPORT package specification for details. + +Without any add-ons, the Core package automatically writes test results to the DBMS_OUTPUT buffer. This behavior can be changed by modifying the records in the HOOKS table. The Persist add-on removes this behavior during installation. + +Ad-hoc assertions (executed outside a Test Runner) always report results to DBMS_OUTPUT. + +### Hooks +The HOOKS table provides a mechanism for add-ons and customization. The table makes various execution points available via unnamed PL/SQL blocks. The following locations are available for hooks. + * Before test_all + * Before test_run + * Execute Test Runner + * After assertion + * After test_run + * After test_all + * Ad hoc report ### Important Note: No Test Runner will be executed if there is no "execute_test_runner" hook in the hooks table. +hook_name | run_string +--------------------|----------- +execute_test_runner | begin wt_execute_test_runner; end; + See the README.md file in the src/core directory for installation instructions. --- diff --git a/src/core/wtplsql.pks b/src/core/wtplsql.pks index 5bf1bbf..a6fccf0 100644 --- a/src/core/wtplsql.pks +++ b/src/core/wtplsql.pks @@ -10,8 +10,6 @@ as function show_version return varchar2; - g_keep_num_recs number := 10; - -- Database Object Under Test. -- Modify as required g_DBOUT varchar2(128); diff --git a/src/junit/junit_core_install.sql b/src/junit/junit_core_install.sql index 754724b..f2fb58a 100644 --- a/src/junit/junit_core_install.sql +++ b/src/junit/junit_core_install.sql @@ -3,6 +3,12 @@ -- JUnit Core Report Installation -- +-- +-- NOTE: Must be run using "wtPLSQL.test_all". +-- "wtPLSQL.test_run" will not provide +-- a complete JUnit XML document. +-- + -- Capture output spool junit_core_install From 91b652ef2d8bd6b359730e703795b425ce0df36f Mon Sep 17 00:00:00 2001 From: DDieterich Date: Sun, 13 Jan 2019 00:30:24 -0600 Subject: [PATCH 056/141] Documentation Changes --- docs/README.md | 2 +- docs/core-component.md | 14 +-- releases/V1.1.0/RELEASE_NOTES.md | 88 ++++++++++++++++++ .../upgrade_from_V1.0.0/RELEASE_NOTES.txt | 90 ------------------- releases/V1.2.0/RELEASE_NOTES.md | 25 ++++++ .../upgrade_from_V1.1.0/RELEASE_NOTES.txt | 14 --- ...{APEX Notes.txt => APEX Scratch Notes.txt} | 12 +++ src/gui/Notes.txt | 11 --- 8 files changed, 133 insertions(+), 123 deletions(-) create mode 100644 releases/V1.1.0/RELEASE_NOTES.md delete mode 100644 releases/V1.1.0/upgrade_from_V1.0.0/RELEASE_NOTES.txt create mode 100644 releases/V1.2.0/RELEASE_NOTES.md delete mode 100644 releases/V1.2.0/upgrade_from_V1.1.0/RELEASE_NOTES.txt rename src/gui/{APEX Notes.txt => APEX Scratch Notes.txt} (87%) delete mode 100644 src/gui/Notes.txt diff --git a/docs/README.md b/docs/README.md index 67dfbf9..650af55 100644 --- a/docs/README.md +++ b/docs/README.md @@ -51,7 +51,7 @@ The GUI module uses the Oracle APEX to enhance the UI experience. Many useful r Component | Description --------------------------------------|------------ -[core](core-component.md) | Required for all wtPLSQL functionality. Small and Fast. +[core](core-component.md) | Required for all wtPLSQL functionality. Small, fast, and maintenance free. [conversion](conversion-component.md) | Convert Test Runner packages from utPLSQL V1/V2 to wtPLSQL
    diff --git a/docs/core-component.md b/docs/core-component.md index 706edd4..2ee1eb3 100644 --- a/docs/core-component.md +++ b/docs/core-component.md @@ -4,13 +4,13 @@ --- ### Overview -The Core component is built to be very small and very fast. It has 5 packages and 1 procedure. During execution of a Test Runner, it stores all assertion results in memory. It can be run without any add-ons. It is the backbone of the wtPLSQL whitebox testing server. +The Core component is built to be very small and very fast. It has 5 packages, 3 tables, 1 view, and 1 procedure. During execution of a Test Runner, it stores all assertion results in memory. It can be run without any add-ons. It is the backbone of the wtPLSQL whitebox testing server. ### Assertion Storage -The core component stores all assertion results in the CORE_DATA package. All assertion results are cleared before the execution of a Test Runner. The average assertion record is about 256 bytes. 4,000 assertion results will consume about a Megabyte of memory. Detailed results from the last assertion are alos published as global variables in the CORE_DATA package. +The core component stores all assertion results in the CORE_DATA package. Previous assertion results are erased before the execution of the next Test Runner. The average assertion record is about 256 bytes. 4,000 assertion results will require about a Megabyte of memory. Detailed results from the last assertion are also available as global variables in the CORE_DATA package. ### Assertions -The WT_ASSERT package contains the assertion API. It contains 10 basic assertions. Each assertion works with most all possible Oracle database data types. +The WT_ASSERT package contains the assertion API. There are 10 basic assertions. * eq * isnotnull * isnull @@ -51,17 +51,17 @@ Without any add-ons, the Core package automatically writes test results to the D Ad-hoc assertions (executed outside a Test Runner) always report results to DBMS_OUTPUT. ### Hooks -The HOOKS table provides a mechanism for add-ons and customization. The table makes various execution points available via unnamed PL/SQL blocks. The following locations are available for hooks. +The HOOKS table provides a mechanism for add-ons and customization. The table makes various execution points available via unnamed PL/SQL blocks. The following execution points are available in HOOKS. * Before test_all * Before test_run * Execute Test Runner - * After assertion + * After Assertion * After test_run * After test_all - * Ad hoc report + * Ad Hoc Report ### Important Note: -No Test Runner will be executed if there is no "execute_test_runner" hook in the hooks table. +No Test Runner will be executed if there is no "execute_test_runner" hook in the HOOKS table. hook_name | run_string --------------------|----------- diff --git a/releases/V1.1.0/RELEASE_NOTES.md b/releases/V1.1.0/RELEASE_NOTES.md new file mode 100644 index 0000000..1a4b210 --- /dev/null +++ b/releases/V1.1.0/RELEASE_NOTES.md @@ -0,0 +1,88 @@ + +wtPLSQL 1.1.0 Release Notes: + +### New Features +* Added THROWS assertion. +* Fully implemented the utPLSQL V1 UT_ASSERT API for implemented assertions. +* Exceptions from "query" assertions are now handled. +* Streamlined WT_TEXT_REPORT output. +* Added WT_TEST_RUN_STATS and WT_TESTCASE_STATS summary tables. +* Added comments to DBMS_PROFILER tables. +* Changed ANNO annotation to IGNR in WT_DBOUT_PROFILES table. +* Added units to time columns in WT_DBOUT_PROFILES table. +* Improved robustness of WT_PROFILER package. +* Corrected problems with wtPLSQL non-owner testing. + +### Detailed Changes +* Permission Changes + * revoke connect, resource from &schema_owner.; + * revoke select, insert, delete on plsql_profiler_runs from public; + * revoke select, insert, delete on plsql_profiler_units from public; + * revoke select, insert, delete on plsql_profiler_data from public; + * revoke insert on wt_results from public; + * revoke insert on wt_dbout_profiles from public; + * revoke update on wt_dbout_profiles from public; + * alter user &schema_owner. quota unlimited on USERS; + * grant create session to &schema_owner.; + * grant create type to &schema_owner.; + * grant create sequence to &schema_owner.; + * grant create table to &schema_owner.; + * grant create trigger to &schema_owner.; + * grant create view to &schema_owner.; + * grant create procedure to &schema_owner.; + * grant select on dba_source to &schema_owner.; + * grant select on dba_objects to &schema_owner.; + * grant select on wt_test_runs_seq to public; + * grant execute on wtplsql to public; + * grant execute on wt_assert to public; + * grant execute on wt_text_report to public; +* Public Synonym Changes + * drop public synonym wt_not_executable; + * drop public synonym plsql_profiler_runs; + * drop public synonym plsql_profiler_units; + * drop public synonym plsql_profiler_data; + * drop public synonym wt_profiler; + * drop public synonym wt_result; + * create or replace public synonym utassert for &schema_owner..wt_assert; + * create or replace public synonym wt_version for &schema_owner..wt_version; + * create or replace public synonym wt_test_runs_seq for &schema_owner..wt_test_runs_seq; + * create or replace public synonym wt_test_run_stats for &schema_owner..wt_test_run_stats; + * create or replace public synonym wt_testcase_stats for &schema_owner..wt_testcase_stats; + * create or replace public synonym wt_self_test for &schema_owner..wt_self_test; + * grant select on plsql_profiler_runnumber to public; +* Add Profile Table Comments + * @proftab_comments.sql +* Table Changes + * drop table wt_test_data; + * wt_version.tab + * wt_testcase_stats.tab + * wt_test_run_stats.tab + * wt_self_test.tab + * wt_test_runs.tab + * @wt_results.tab + * alter table wt_results rename column elapsed_msecs to interval_msecs; + * comment on column wt_results.interval_msecs + * alter table wt_dbout_profiles rename column total_time to total_usecs; + * alter table wt_dbout_profiles rename column min_time to min_usecs; + * alter table wt_dbout_profiles rename column max_time to max_usecs; + * comment on column wt_dbout_profiles.status + * comment on column wt_dbout_profiles.total_usecs + * comment on column wt_dbout_profiles.min_usecs + * comment on column wt_dbout_profiles.max_usecs + * alter table wt_dbout_profiles drop constraint wt_dbout_profiles_ck1; + * update wt_dbout_profiles set status = 'IGNR' where status = 'ANNO'; + * alter table wt_dbout_profiles add constraint wt_dbout_profiles_ck1 check (status in ('EXEC','NOTX','EXCL','IGNR','UNKN')); + * update_all_stats.sql +* Packages + * wtplsql.pks + * wtplsql.pkb + * wt_result.pks + * wt_result.pkb + * wt_assert.pks + * wt_assert.pkb + * wt_profiler.pks + * wt_profiler.pkb + * wt_test_run_stat.pks + * wt_test_run_stat.pkb + * wt_text_report.pks + * wt_text_report.pkb diff --git a/releases/V1.1.0/upgrade_from_V1.0.0/RELEASE_NOTES.txt b/releases/V1.1.0/upgrade_from_V1.0.0/RELEASE_NOTES.txt deleted file mode 100644 index c326ffd..0000000 --- a/releases/V1.1.0/upgrade_from_V1.0.0/RELEASE_NOTES.txt +++ /dev/null @@ -1,90 +0,0 @@ - -wtPLSQL 1.1.0 Release Notes: - -New Features: -------------- - -) Added THROWS assertion. - -) Fully implemented the utPLSQL V1 UT_ASSERT API for implemented assertions. - -) Exceptions from "query" assertions are now handled. - -) Streamlined WT_TEXT_REPORT output. - -) Added WT_TEST_RUN_STATS and WT_TESTCASE_STATS summary tables. - -) Added comments to DBMS_PROFILER tables. - -) Changed ANNO annotation to IGNR in WT_DBOUT_PROFILES table. - -) Added units to time columns in WT_DBOUT_PROFILES table. - -) Improved robustness of WT_PROFILER package. - -) Corrected problems with wtPLSQL non-owner testing. - -Detailed Changes: ------------------ -Permission Changes: - revoke connect, resource from &schema_owner.; - revoke select, insert, delete on plsql_profiler_runs from public; - revoke select, insert, delete on plsql_profiler_units from public; - revoke select, insert, delete on plsql_profiler_data from public; - revoke insert on wt_results from public; - revoke insert on wt_dbout_profiles from public; - revoke update on wt_dbout_profiles from public; - alter user &schema_owner. quota unlimited on USERS; - grant create session to &schema_owner.; - grant create type to &schema_owner.; - grant create sequence to &schema_owner.; - grant create table to &schema_owner.; - grant create trigger to &schema_owner.; - grant create view to &schema_owner.; - grant create procedure to &schema_owner.; - grant select on dba_source to &schema_owner.; - grant select on dba_objects to &schema_owner.; - grant select on wt_test_runs_seq to public; - grant execute on wtplsql to public; - grant execute on wt_assert to public; - grant execute on wt_text_report to public; -Public Synonym Changes: - drop public synonym wt_not_executable; - drop public synonym plsql_profiler_runs; - drop public synonym plsql_profiler_units; - drop public synonym plsql_profiler_data; - drop public synonym wt_profiler; - drop public synonym wt_result; - create or replace public synonym utassert for &schema_owner..wt_assert; - create or replace public synonym wt_version for &schema_owner..wt_version; - create or replace public synonym wt_test_runs_seq for &schema_owner..wt_test_runs_seq; - create or replace public synonym wt_test_run_stats for &schema_owner..wt_test_run_stats; - create or replace public synonym wt_testcase_stats for &schema_owner..wt_testcase_stats; - create or replace public synonym wt_self_test for &schema_owner..wt_self_test; - grant select on plsql_profiler_runnumber to public; -Add Profile Table Comments - @proftab_comments.sql -Table Changes: - drop table wt_test_data; - wt_version.tab - wt_testcase_stats.tab - wt_test_run_stats.tab - wt_self_test.tab - wt_test_runs.tab - @wt_results.tab - alter table wt_results rename column elapsed_msecs to interval_msecs; - comment on column wt_results.interval_msecs - alter table wt_dbout_profiles rename column total_time to total_usecs; - alter table wt_dbout_profiles rename column min_time to min_usecs; - alter table wt_dbout_profiles rename column max_time to max_usecs; - comment on column wt_dbout_profiles.status - comment on column wt_dbout_profiles.total_usecs - comment on column wt_dbout_profiles.min_usecs - comment on column wt_dbout_profiles.max_usecs - alter table wt_dbout_profiles drop constraint wt_dbout_profiles_ck1; - update wt_dbout_profiles set status = 'IGNR' where status = 'ANNO'; - alter table wt_dbout_profiles add constraint wt_dbout_profiles_ck1 check (status in ('EXEC','NOTX','EXCL','IGNR','UNKN')); - update_all_stats.sql -Packages: - wtplsql.pks - wtplsql.pkb - wt_result.pks - wt_result.pkb - wt_assert.pks - wt_assert.pkb - wt_profiler.pks - wt_profiler.pkb - wt_test_run_stat.pks - wt_test_run_stat.pkb - wt_text_report.pks - wt_text_report.pkb diff --git a/releases/V1.2.0/RELEASE_NOTES.md b/releases/V1.2.0/RELEASE_NOTES.md new file mode 100644 index 0000000..bda50a7 --- /dev/null +++ b/releases/V1.2.0/RELEASE_NOTES.md @@ -0,0 +1,25 @@ + +wtPLSQL 1.2 Release Notes: + +### Overview +* Assertion results are recorded in memory arrays by Core. +* Assertion results are stored in tables by Persist. +* Code coverage is included in Persist. +* There are 2 versions of JUnit XML reports, one each for Core and Persist. +* There are 2 versions of WT_TEXT_OUTPUT package, one each for Core and Persist. +* The GUI only works with Persist. Demo works with Core and Persist. +* Major Website Updates (docs directory) + +### New Features +* Add-ons have been implemented. The V1.2 source is now split into multiple directories. +* The HOOKS table can be used to implement add-ons. +* A comprehensive GUI has been implemented using Application Express. +* A utPLSQL conversion tool is available. +* The WT_VERIONS table has more detail for add-ons. +* New WT_QUAL_TEST_RUNNERS_VW to list packages that qualify as Test Runners. +* New WT_JOB package and WT_SCHEDULER_JOBS view for executing Test Runners in parallel. +* New TEST_RUNNERS table in Persist for increased normalization. +* Test yield from WT_TEXT_OUTPUT and GUI reports based on test cases instead of assertions. + +### Detailed Changes +* Too numerous to list diff --git a/releases/V1.2.0/upgrade_from_V1.1.0/RELEASE_NOTES.txt b/releases/V1.2.0/upgrade_from_V1.1.0/RELEASE_NOTES.txt deleted file mode 100644 index 87d4d49..0000000 --- a/releases/V1.2.0/upgrade_from_V1.1.0/RELEASE_NOTES.txt +++ /dev/null @@ -1,14 +0,0 @@ - -wtPLSQL 1.2.0 Release Notes: - -New Features: -------------- - -) Modified indexes on WT_TEST_RUNS - -) Modified indexes on WT_RESULTS - -) Added APEX GUI Add-on. - -) Added reporting views. - -Detailed Changes: ------------------ -View Changes: - view_all_stats.vw diff --git a/src/gui/APEX Notes.txt b/src/gui/APEX Scratch Notes.txt similarity index 87% rename from src/gui/APEX Notes.txt rename to src/gui/APEX Scratch Notes.txt index 3aad9ff..5f56317 100644 --- a/src/gui/APEX Notes.txt +++ b/src/gui/APEX Scratch Notes.txt @@ -1,4 +1,16 @@ +P2_NEW_DB_LINK_HOST: +select '//localhost:1521/' || global_name from global_name; + +Page 2, p_process_name=> 'TEST_ALL_SEQ': +on dbl.db_link || ''.'' like proc.owner || ''.%'''|| +and dbl.db_link || ''.'' like dbl.username || ''.%'''|| + +Page 2, p_process_name=> 'TEST_ALL_PAR': +group by proc.owner'|| +order by proc.owner )'|| + + create or replace view wt_test_runners as select owner, object_name PACKAGE_NAME from dba_procedures diff --git a/src/gui/Notes.txt b/src/gui/Notes.txt deleted file mode 100644 index 0ef7697..0000000 --- a/src/gui/Notes.txt +++ /dev/null @@ -1,11 +0,0 @@ - -P2_NEW_DB_LINK_HOST: -select '//localhost:1521/' || global_name from global_name; - -Page 2, p_process_name=> 'TEST_ALL_SEQ': -on dbl.db_link || ''.'' like proc.owner || ''.%'''|| -and dbl.db_link || ''.'' like dbl.username || ''.%'''|| - -Page 2, p_process_name=> 'TEST_ALL_PAR': -group by proc.owner'|| -order by proc.owner )'|| From d66420e4b0da822a907af13845ab15988edd58b7 Mon Sep 17 00:00:00 2001 From: Duane Dieterich Date: Sun, 13 Jan 2019 22:23:40 -0600 Subject: [PATCH 057/141] Correct Name Case --- docs/{conversion-component.md => Conversion-Component.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename docs/{conversion-component.md => Conversion-Component.md} (83%) diff --git a/docs/conversion-component.md b/docs/Conversion-Component.md similarity index 83% rename from docs/conversion-component.md rename to docs/Conversion-Component.md index 4e5160b..fdf8907 100644 --- a/docs/conversion-component.md +++ b/docs/Conversion-Component.md @@ -7,4 +7,4 @@ See the README.md file in the src/conversion directory for installation instructions. --- -[Website Home Page](README.md) \ No newline at end of file +[Website Home Page](README.md) From 8bece55af6ab0a79bfe2694ee997e480dd7338e9 Mon Sep 17 00:00:00 2001 From: Duane Dieterich Date: Sun, 13 Jan 2019 22:24:27 -0600 Subject: [PATCH 058/141] Correct Name Case --- docs/{core-component.md => Core-Component.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename docs/{core-component.md => Core-Component.md} (98%) diff --git a/docs/core-component.md b/docs/Core-Component.md similarity index 98% rename from docs/core-component.md rename to docs/Core-Component.md index 2ee1eb3..a4ed65d 100644 --- a/docs/core-component.md +++ b/docs/Core-Component.md @@ -70,4 +70,4 @@ execute_test_runner | begin wt_execute_test_runner; end; See the README.md file in the src/core directory for installation instructions. --- -[Website Home Page](README.md) \ No newline at end of file +[Website Home Page](README.md) From 09cfcb8a89e75912daba2961ff97855a04f97a02 Mon Sep 17 00:00:00 2001 From: Duane Dieterich Date: Sun, 13 Jan 2019 22:25:27 -0600 Subject: [PATCH 059/141] Correct Name Case --- docs/{gui-add-on.md => Gui-Add-On.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename docs/{gui-add-on.md => Gui-Add-On.md} (93%) diff --git a/docs/gui-add-on.md b/docs/Gui-Add-On.md similarity index 93% rename from docs/gui-add-on.md rename to docs/Gui-Add-On.md index 608d483..12d2042 100644 --- a/docs/gui-add-on.md +++ b/docs/Gui-Add-On.md @@ -11,4 +11,4 @@ All examples shown here use the WTP_DEMO demonstration as described in [Demonstr See the README.md file in the src/core directory for installation instructions. --- -[Website Home Page](README.md) \ No newline at end of file +[Website Home Page](README.md) From 8b86ce508c4e7323dfbbedd2148a50c28ef9ea5e Mon Sep 17 00:00:00 2001 From: Duane Dieterich Date: Sun, 13 Jan 2019 22:25:53 -0600 Subject: [PATCH 060/141] Correct Name Case --- docs/{junit-add-on.md => Junit-Add-On.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename docs/{junit-add-on.md => Junit-Add-On.md} (82%) diff --git a/docs/junit-add-on.md b/docs/Junit-Add-On.md similarity index 82% rename from docs/junit-add-on.md rename to docs/Junit-Add-On.md index 7278c67..c184abc 100644 --- a/docs/junit-add-on.md +++ b/docs/Junit-Add-On.md @@ -8,4 +8,4 @@ See the README.md file in the src/junit directory for installation instructions. --- -[Website Home Page](README.md) \ No newline at end of file +[Website Home Page](README.md) From c91a258202979215db457ccbc18e74dec08fb174 Mon Sep 17 00:00:00 2001 From: Duane Dieterich Date: Sun, 13 Jan 2019 22:26:25 -0600 Subject: [PATCH 061/141] Correct Name Case --- docs/{persist-add-on.md => Persist-Add-On.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename docs/{persist-add-on.md => Persist-Add-On.md} (84%) diff --git a/docs/persist-add-on.md b/docs/Persist-Add-On.md similarity index 84% rename from docs/persist-add-on.md rename to docs/Persist-Add-On.md index 53094ef..46fcb92 100644 --- a/docs/persist-add-on.md +++ b/docs/Persist-Add-On.md @@ -8,4 +8,4 @@ Must install core first. See the README.md file in the src/core directory for installation instructions. --- -[Website Home Page](README.md) \ No newline at end of file +[Website Home Page](README.md) From d2f31961f6545cfd420c62768de9edec503bb4ea Mon Sep 17 00:00:00 2001 From: DDieterich Date: Tue, 15 Jan 2019 06:18:10 -0600 Subject: [PATCH 062/141] Incomplete Work on Persist --- README.md | 6 ++ src/common_setup.sql | 10 +- src/core/core_data.pks | 8 +- src/core/install.sql | 23 ++-- src/junit/junit_core_install.sql | 7 +- src/junit/junit_core_uninstall.sql | 5 +- src/persist/install.sql | 163 +++++++---------------------- src/persist/wt_results.tab | 4 +- src/persist/wt_test_runs.tab | 104 +++++++++--------- 9 files changed, 120 insertions(+), 210 deletions(-) diff --git a/README.md b/README.md index 3421bff..4afc6c3 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,12 @@ The http://wtPLSQL.org website (hosted on GitHub.io) has more information about [Click here](https://github.com/DDieterich/wtPLSQL/wiki/Compatibility) for the compatibility wiki page. +### Versions + +* The "master" branch contains this website, other documentation, and source code for the latest release +* The default "V1.2" branch contains the website, other documentation, and source code that is under development for the next release. + + ### Participation See the "To Do" column in one of the [Projects](https://github.com/DDieterich/wtPLSQL/projects) for cards/issues that are ready to work. diff --git a/src/common_setup.sql b/src/common_setup.sql index f78e3c7..140477e 100644 --- a/src/common_setup.sql +++ b/src/common_setup.sql @@ -1,11 +1,15 @@ -- --- Core Installation +-- Common Setup -- --- Enable SQL*Plus Variables +prompt . +set echo on +-- Running Common Setup set define "&" set concat "." - define schema_owner="wtp" define connect_string="" +-- Common Setup Done. +set echo off +prompt . diff --git a/src/core/core_data.pks b/src/core/core_data.pks index 223e38f..c5880b4 100644 --- a/src/core/core_data.pks +++ b/src/core/core_data.pks @@ -7,14 +7,10 @@ is TYPE run_rec_type is record (runner_owner long_name -- Owner of the Test Runner ,runner_name long_name -- Name of the Test Runner - ,dbout_owner long_name -- Owner of the Database Object Under Test - ,dbout_name long_name -- Name of the Database Object Under Test - ,dbout_type varchar2(20) -- Type of the Database Object Under Test ,start_dtm timestamp(3) with time zone -- Test Runner Start Date/Time ,end_dtm timestamp(3) with time zone -- Test Runner End Date/Time ,fst_assrt_dtm timestamp(3) with time zone -- Date/Time of First Assertion ,lst_assrt_dtm timestamp(3) with time zone -- Date/Time of Last Assertion - ,error_message varchar2(4000) -- Error Message ,runner_sec number(6,1) default 0 -- Total Runtime for Test Runner in Seconds ,tc_cnt number(7) default 0 -- Number of Test Cases ,tc_fail number(7) default 0 -- Number of Failed Test Cases @@ -24,6 +20,10 @@ is ,asrt_max_msec number(10) -- Maximum Assertion Interval in Milliseconds across all Test Cases ,asrt_tot_msec number(10) default 0 -- Total Assertion Intervals in Milliseconds across all Test Cases ,asrt_sos_msec number(20) default 0 -- Sum of Squares of Assertion Interval in Milliseconds across all Test Cases + ,dbout_owner long_name -- Owner of the Database Object Under Test + ,dbout_name long_name -- Name of the Database Object Under Test + ,dbout_type varchar2(20) -- Type of the Database Object Under Test + ,error_message varchar2(4000) -- Error Message ); g_run_rec run_rec_type; diff --git a/src/core/install.sql b/src/core/install.sql index 9436947..0747e1a 100644 --- a/src/core/install.sql +++ b/src/core/install.sql @@ -119,14 +119,6 @@ end; WHENEVER SQLERROR continue --- Core Tables -@hooks.tab - -@wt_versions.tab - -@wt_self_test.tab - - -- Package Specifications @core_data.pks / @@ -152,6 +144,14 @@ grant execute on wt_text_report to public; create or replace public synonym wt_text_report for wt_text_report; +-- Core Tables +@hooks.tab + +@wt_versions.tab + +@wt_self_test.tab + + -- Procedures @wt_execute_test_runner.prc / @@ -182,19 +182,20 @@ create or replace public synonym wt_execute_test_runner for wt_execute_test_runn @wt_scheduler_jobs_vw.vw / + -- Configuration Data -- This is the default test runner execution procedure insert into hooks (hook_name, seq, run_string) - values ('execute_test_runner', 1, 'begin wt_execute_test_runner; end;'); + values ('execute_test_runner', 20, 'begin wt_execute_test_runner; end;'); -- Run this report after testing because this is no storage insert into hooks (hook_name, seq, run_string) - values ('after_test_run', 1, 'begin wt_text_report.dbms_out(10); end;'); + values ('after_test_run', 20, 'begin wt_text_report.dbms_out(10); end;'); -- This is the default ad-hoc result report insert into hooks (hook_name, seq, run_string) - values ('ad_hoc_report', 1, 'begin wt_text_report.ad_hoc_result; end;'); + values ('ad_hoc_report', 20, 'begin wt_text_report.ad_hoc_result; end;'); commit; diff --git a/src/junit/junit_core_install.sql b/src/junit/junit_core_install.sql index f2fb58a..a1574d5 100644 --- a/src/junit/junit_core_install.sql +++ b/src/junit/junit_core_install.sql @@ -25,11 +25,12 @@ set serveroutput on size unlimited format truncated -- Install Hooks insert into hooks (hook_name, seq, run_string) - values ('before_test_all', 1, 'begin junit_core_report.before_test_all; end;'); + values ('before_test_all', 20, 'begin junit_core_report.before_test_all; end;'); update hooks set run_string = 'begin junit_core_report.show_current; end;' - where hook_name = 'after_test_run' and seq = 1; + where hook_name = 'after_test_run' + and run_string = 'begin wt_text_report.dbms_out(10); end;'; insert into hooks (hook_name, seq, run_string) - values ('after_test_all', 1, 'begin junit_core_report.after_test_all; end;'); + values ('after_test_all', 20, 'begin junit_core_report.after_test_all; end;'); commit; begin hook.init; diff --git a/src/junit/junit_core_uninstall.sql b/src/junit/junit_core_uninstall.sql index 5b3ece2..3b5e2c9 100644 --- a/src/junit/junit_core_uninstall.sql +++ b/src/junit/junit_core_uninstall.sql @@ -16,13 +16,12 @@ set serveroutput on size unlimited format truncated -- Un-Install Hooks delete from hooks where hook_name = 'before_test_all' - and seq = 1 and run_string = 'begin junit_core_report.before_test_all; end;'; update hooks set run_string = 'begin wt_text_report.dbms_out(10); end;' - where hook_name = 'after_test_run' and seq = 1; + where hook_name = 'after_test_run' + and run_string = 'begin junit_core_report.show_current; end;'; delete from hooks where hook_name = 'after_test_all' - and seq = 1 and run_string = 'begin junit_core_report.after_test_all; end;'; commit; begin diff --git a/src/persist/install.sql b/src/persist/install.sql index eaf5c66..d83d39c 100644 --- a/src/persist/install.sql +++ b/src/persist/install.sql @@ -13,107 +13,6 @@ set serveroutput on size unlimited format truncated -- Shared Setup Script @common_setup.sql -WHENEVER SQLERROR exit SQL.SQLCODE - -begin - if USER not in ('SYS') - then - raise_application_error (-20000, - 'Not logged in as SYS'); - end if; -end; -/ - -WHENEVER SQLERROR continue - --- Create the schema owner. - -create user &schema_owner. identified by &schema_owner. - default tablespace users - quota unlimited on users - temporary tablespace temp; - -grant create session to &schema_owner.; -grant create type to &schema_owner.; -grant create sequence to &schema_owner.; -grant create table to &schema_owner.; -grant create trigger to &schema_owner.; -grant create view to &schema_owner.; -grant create procedure to &schema_owner.; -grant create database link to &schema_owner.; -grant create job to &schema_owner.; - --- This MUST be run by SYS. -grant select on dba_objects to &schema_owner.; -grant select on dba_source to &schema_owner.; -grant select on dba_procedures to &schema_owner.; -grant select on sys.gv_$parameter to &schema_owner.; - -begin - for buff in (select p.value PLSQL_CCFLAGS - from dual d - left join v$parameter p - on p.name in 'plsql_ccflags') - loop - dbms_output.put_line('PLSQL_CCFLAGS Before: ' || buff.PLSQL_CCFLAGS); - end loop; -end; -/ - --- This block is IDEMPOTENT. It can run more than once and give --- the same result. -declare - C_FLAG CONSTANT varchar2(100) := 'WTPLSQL_ENABLE:'; - parm_value v$parameter.value%TYPE; - procedure set_plsql_ccflags (in_value in varchar2) is begin - execute immediate 'alter system set PLSQL_CCFLAGS = ''' || - in_value || ''' scope=BOTH'; - end set_plsql_ccflags; -begin - select value into parm_value - from v$parameter - where name in 'plsql_ccflags'; - if nvl(length(parm_value),0) = 0 - then - -- No Flags have been set - set_plsql_ccflags(C_FLAG || 'TRUE'); - elsif instr(parm_value, C_FLAG) = 0 - then - -- C_FLAG is not already present - set_plsql_ccflags(C_FLAG || 'TRUE, ' || parm_value); - end if; -end; -/ - -begin - for buff in (select p.value PLSQL_CCFLAGS - from dual d - left join v$parameter p - on p.name in 'plsql_ccflags') - loop - dbms_output.put_line('PLSQL_CCFLAGS After: ' || buff.PLSQL_CCFLAGS); - end loop; -end; -/ - --- Public Synonyms - -create or replace public synonym wt_version for &schema_owner..wt_version; -create or replace public synonym wt_test_runs_seq for &schema_owner..wt_test_runs_seq; -create or replace public synonym wt_test_runs for &schema_owner..wt_test_runs; -create or replace public synonym wt_results for &schema_owner..wt_results; -create or replace public synonym wt_dbout_profiles for &schema_owner..wt_dbout_profiles; -create or replace public synonym wt_test_run_stats for &schema_owner..wt_test_run_stats; -create or replace public synonym wt_testcase_stats for &schema_owner..wt_testcase_stats; -create or replace public synonym wt_self_test for &schema_owner..wt_self_test; - -create or replace public synonym utassert for &schema_owner..wt_assert; -create or replace public synonym wt_assert for &schema_owner..wt_assert; -create or replace public synonym wt_text_report for &schema_owner..wt_text_report; -create or replace public synonym wt_wtplsql for &schema_owner..wtplsql; -create or replace public synonym wtplsql for &schema_owner..wtplsql; - - WHENEVER SQLERROR exit SQL.SQLCODE -- Connect as SCHEMA_OWNER @@ -142,51 +41,61 @@ WHENEVER SQLERROR continue create index plsql_profiler_runs_idx1 on plsql_profiler_runs (run_date); --- Core Tables -@wt_version.tab -@wt_test_runs.tab -@wt_results.tab -@wt_dbout_profiles.tab -@wt_test_run_stats.tab -@wt_testcase_stats.tab -@wt_self_test.tab - --- Install Views -@wt_scheduler_jobs.vw - -- Package Specifications -@wtplsql.pks +@wtdbout.pks / -@wt_result.pks +@wtjob.pks +/ +@wt_profile.pks / -@wt_assert.pks +@wt_result.pks / -@wt_profiler.pks +@wt_test_run.pks / @wt_test_run_stat.pks / +@wt_test_runner.pks +/ +@wt_testcase.pks +/ @wt_text_report.pks / -grant execute on wtplsql to public; -grant execute on wt_assert to public; -grant execute on wt_text_report to public; +-- Core Tables +-- Must be ordered for foreign keys +@wt_test_runners.tab +@wt_testcases.tab +@wt_dbouts.tab +@wt_test_runs.tab +@wt_results.tab +@wt_profiles.tab +@wt_testcase_stats.tab --- Procedures -@clear_last_run.prc -/ +-- Install Views +@wt_dbout_runs_vw.vw +@wt_profiles_vw.vw +@wt_results_vw.vw +@wt_scheduler_jobs.vw +@wt_test_runs_vw.vw +@wt_testcase_runs_vw.vw -- Package Bodies -@wtplsql.pkb +@wtdbout.pkb / -@wt_result.pkb +@wtjob.pkb / -@wt_assert.pkb +@wt_profile.pkb / -@wt_profiler.pkb +@wt_result.pkb +/ +@wt_test_run.pkb / @wt_test_run_stat.pkb / +@wt_test_runner.pkb +/ +@wt_testcase.pkb +/ @wt_text_report.pkb / diff --git a/src/persist/wt_results.tab b/src/persist/wt_results.tab index 07a01de..34fd5be 100644 --- a/src/persist/wt_results.tab +++ b/src/persist/wt_results.tab @@ -7,7 +7,7 @@ create table wt_results (test_run_id number(38) constraint wt_results_nn1 not null ,result_seq number(8) constraint wt_results_nn2 not null ,testcase_id number(38) constraint wt_results_nn3 not null - -- ,executed_dtm timestamp(6) constraint wt_results_nn4 not null + ,executed_dtm timestamp(6) constraint wt_results_nn4 not null ,interval_msecs number(10,3) constraint wt_results_nn5 not null ,assertion varchar2(15) constraint wt_results_nn6 not null ,status varchar2(4) constraint wt_results_nn7 not null @@ -28,7 +28,7 @@ comment on table wt_results is 'Results data from Test Runs.'; comment on column wt_results.test_run_id is 'Foreign Key for the Test Run, Primary Key part 1.'; comment on column wt_results.result_seq is 'Sequence number for this Result, Primary Key part 2.'; comment on column wt_results.testcase_id is 'Foreign Key for the Test Case.'; ---comment on column wt_results.executed_dtm is 'Date/Time (with Fractional Seconds) this Result was captured'; +comment on column wt_results.executed_dtm is 'Date/Time (with Fractional Seconds) this Result was captured'; comment on column wt_results.interval_msecs is 'Interval time in milliseonds since the previous Result or start of the Test Run.'; comment on column wt_results.assertion is 'Name of the Assertion Test performed'; comment on column wt_results.status is 'PASS/FAIL Status from the Assertion'; diff --git a/src/persist/wt_test_runs.tab b/src/persist/wt_test_runs.tab index 3396f55..8259b2d 100644 --- a/src/persist/wt_test_runs.tab +++ b/src/persist/wt_test_runs.tab @@ -8,21 +8,26 @@ create sequence wt_test_runs_seq order; grant select on wt_test_runs_seq to public; create table wt_test_runs - (id number(38) constraint wt_test_runs_nn1 not null - ,test_runner_id number(38) constraint wt_test_runs_nn2 not null - ,start_dtm timestamp constraint wt_test_runs_nn3 not null - ,end_dtm timestamp constraint wt_test_runs_nn4 not null - ,yield_pct number(3) constraint wt_test_runs_nn5 not null - ,testcases number(7) constraint wt_test_runs_nn6 not null - ,failures number(7) constraint wt_test_runs_nn7 not null - ,assertions number(7) constraint wt_test_runs_nn8 not null - ,min_interval_msecs number(10) constraint wt_test_runs_nn9 not null - ,avg_interval_msecs number(10) constraint wt_test_runs_nn10 not null - ,max_interval_msecs number(10) constraint wt_test_runs_nn11 not null - ,tot_interval_msecs number(10) constraint wt_test_runs_nn12 not null + (id number(38) + ,test_runner_id number(38) + ,start_dtm timestamp(3) with time zone + ,end_dtm timestamp(3) with time zone + ,fst_assrt_dtm timestamp(3) with time zone + ,lst_assrt_dtm timestamp(3) with time zone + ,runner_sec number(6,1) + ,tc_cnt number(7) + ,tc_fail number(7) + ,tc_yield_pct number(4,1) + ,asrt_cnt number(7) + ,asrt_fail number(7) + ,asrt_yield_pct number(4,1) + ,asrt_min_msec number(10) + ,asrt_max_msec number(10) + ,asrt_tot_msec number(10) + ,asrt_sos_msec number(20) ,dbout_id number(38) ,trigger_offset number(6) - ,profiler_runid number + ,profiler_runid number(38) ,coverage_pct number(3) ,profiled_lines number(6) ,executed_lines number(6) @@ -44,26 +49,6 @@ create table wt_test_runs references wt_dbouts (id) ,constraint wt_test_runs_fk3 foreign key (profiler_runid) references plsql_profiler_runs (runid) disable - ,constraint wt_test_runs_ck1 check (yield_pct = trunc(100*passes/testcases)) - ,constraint wt_test_runs_ck2 check (testcases = passes + failures) - ,constraint wt_test_runs_ck3 check (passes >= 0) - ,constraint wt_test_runs_ck4 check (failures >= 0) - ,constraint wt_test_runs_ck5 check (min_interval_msecs >= 0) - ,constraint wt_test_runs_ck6 check (avg_interval_msecs >= min_interval_msecs) - ,constraint wt_test_runs_ck7 check (max_interval_msecs >= avg_interval_msecs) - ,constraint wt_test_runs_ck8 check (tot_interval_msecs >= max_interval_msecs) - ,constraint wt_test_runs_ck1 check (trigger_offset >= 0) - ,constraint wt_profiler_ck2 check (coverage_pct between 0 and 100) - ,constraint wt_profiler_ck3 check (profiled_lines >= 0) - ,constraint wt_profiler_ck4 check (executed_lines >= 0) - ,constraint wt_profiler_ck5 check (ignored_lines >= 0) - ,constraint wt_profiler_ck6 check (excluded_lines >= 0) - ,constraint wt_profiler_ck7 check (notexec_lines >= 0) - ,constraint wt_profiler_ck8 check (unknown_lines >= 0) - ,constraint wt_profiler_ck9 check (min_executed_usecs >= 0) - ,constraint wt_profiler_ck10 check (avg_executed_usecs >= min_executed_usecs) - ,constraint wt_profiler_ck11 check (max_executed_usecs >= avg_executed_usecs) - ,constraint wt_profiler_ck11 check (tot_executed_usecs >= max_executed_usecs) ,constraint wt_test_runs_ck2 check (is_last_run = 'Y') ) pctfree 0; @@ -78,30 +63,35 @@ comment on column wt_test_runs.id is 'Primary (Surrogate) Key for each Test Run' comment on column wt_test_runs.test_runner_id is 'Surrogate Key the Test Runner package. Natural Key 1 part 1'; comment on column wt_test_runs.start_dtm is 'Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 2'; comment on column wt_test_runs.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; -comment on column wt_test_runs.yield_pct is 'Percentage of successful test cases to total Test Cases.'; -comment on column wt_test_runs.testcases is 'Total number of Test Cases.'; -comment on column wt_test_runs.failures is 'Number of failed Test Cases.'; -comment on column wt_test_runs.passes is 'Number of Test Assertions.'; -comment on column wt_test_runs.min_interval_msecs is 'Minimum tot_interval_msecs between assertions across all Test Cases'; -comment on column wt_test_runs.avg_interval_msecs is 'Average tot_interval_msecs between assertions across all Test Cases'; -comment on column wt_test_runs.max_interval_msecs is 'Maximum tot_interval_msecs between assertions across all Test Cases'; -comment on column wt_test_runs.tot_interval_msecs is 'Total (sum) of tot_interval_msecs between assertions across all Test Cases'; -comment on column wt_test_runs.dbout_id is 'Optional Surrogate Key to the Database Object Under Test (DBOUT).'; -comment on column wt_test_runs.trigger_offset is 'Optional calculated offset from start of Trigger Source to start of Trigger PL/SQL Block.'; -comment on column wt_test_runs.profiler_runid is 'Optional DBMS_PROFILER unique run identifier from plsql_profiler_runnumber sequence'; -comment on column wt_profiler.coverage_pct is 'Percentage of executed source lines to valid executable source lines.'; -comment on column wt_profiler.profiled_lines is 'Total number of source lines as counted by DBMS_PROFILER'; -comment on column wt_profiler.executed_lines is 'Number of source lines executed'; -comment on column wt_profiler.ignored_lines is 'Number of source lines ignored as uncountable'; -comment on column wt_profiler.excluded_lines is 'Number of source lines excluded due to unexplained DBMS_PROFILER metrics'; -comment on column wt_profiler.notexec_lines is 'Number of source lines not executed'; -comment on column wt_profiler.unknown_lines is 'Number of source lines that have unexplained DBMS_PROFILER metrics'; -comment on column wt_profiler.min_executed_usecs is 'Minumum execution time for a line of source in microseconds'; -comment on column wt_profiler.avg_executed_usecs is 'Average execution time for a line of source in microseconds'; -comment on column wt_profiler.max_executed_usecs is 'Maximum execution time for a line of source in microseconds'; -comment on column wt_profiler.tot_executed_usecs is 'Total (Sum) of execution times for a line of source in microseconds'; -comment on column wt_test_runs.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; -comment on column wt_test_runs.error_message is 'Optional Error messages from this Test Run.'; +comment on column wt_test_runs.fst_assrt_dtm is 'Date/Time of First Assertion'; +comment on column wt_test_runs.lst_assrt_dtm is 'Date/Time of Last Assertion'; +comment on column wt_test_runs.runner_sec is 'Total Runtime for Test Runner in Seconds' +comment on column wt_test_runs.tc_cnt is 'Number of Test Cases' +comment on column wt_test_runs.tc_fail is 'Number of Failed Test Cases' +comment on column wt_test_runs.tc_yield_pct is 'Percentage of successful test cases to total Test Cases.'; +comment on column wt_test_runs.asrt_cnt is 'Number of Assertions across all Test Cases' +comment on column wt_test_runs.asrt_fail is 'Number of Assertion Failures across all Test Cases' +comment on column wt_test_runs.asrt_yield_pct is 'Percentage of successful assertions to total assertions.'; +comment on column wt_test_runs.asrt_min_msec is 'Minumum Assertion Interval in Milliseconds across all Test Cases' +comment on column wt_test_runs.asrt_max_msec is 'Maximum Assertion Interval in Milliseconds across all Test Cases' +comment on column wt_test_runs.asrt_tot_msec is 'Total Assertion Intervals in Milliseconds across all Test Cases' +comment on column wt_test_runs.asrt_sos_msec is 'Sum of Squares of Assertion Interval in Milliseconds across all Test Cases' +comment on column wt_test_runs.dbout_id is 'Surrogate Key to the Database Object Under Test (DBOUT).'; +comment on column wt_test_runs.trigger_offset is 'Calculated offset from start of Trigger Source to start of Trigger PL/SQL Block.'; +comment on column wt_test_runs.profiler_runid is 'DBMS_PROFILER unique run identifier from plsql_profiler_runnumber sequence'; +comment on column wt_test_runs.coverage_pct is 'Percentage of executed lines to non-ignored, non-excluded lines'; +comment on column wt_test_runs.profiled_lines is 'Total number of source lines as counted by DBMS_PROFILER'; +comment on column wt_test_runs.executed_lines is 'Number of source lines executed'; +comment on column wt_test_runs.ignored_lines is 'Number of source lines ignored as uncountable'; +comment on column wt_test_runs.excluded_lines is 'Number of declaration source lines (non-executable) excluded'; +comment on column wt_test_runs.notexec_lines is 'Number of source lines not executed'; +comment on column wt_test_runs.unknown_lines is 'Number of source lines with unknown DBMS_PROFILER metrics'; +comment on column wt_test_runs.exec_min_usecs is 'Minumum execution time for a line of source in microseconds'; +comment on column wt_test_runs.exec_avg_usecs is 'Average execution time for a line of source in microseconds'; +comment on column wt_test_runs.exec_max_usecs is 'Maximum execution time for a line of source in microseconds'; +comment on column wt_test_runs.exec_tot_usecs is 'Total (Sum) of execution times for a line of source in microseconds'; +comment on column wt_test_runs.is_last_run is 'Flag "Y" to indicate this is the most recent run for this package owner/name'; +comment on column wt_test_runs.error_message is 'Error messages from this Test Run.'; grant select on wt_test_runs to public; grant insert on wt_test_runs to public; From 88f4529e7bdef6e7643fcf2e63a3c2f66670c47d Mon Sep 17 00:00:00 2001 From: DDieterich Date: Mon, 21 Jan 2019 08:18:54 -0600 Subject: [PATCH 063/141] Complete Core, Started Persist --- docs/Persist-Add-On.md | 2 + docs/Reference.md | 10 + docs/demo/README.md | 4 +- src/common_setup.sql | 1 + src/core/README.md | 4 +- src/core/core_data.pkb | 20 +- src/core/core_data.pks | 66 +- src/core/hook.pkb | 17 +- src/core/install.sql | 65 +- src/core/installO.LST | 130 +++- src/core/test_allO.LST | 44 +- src/core/uninstallO.LST | 9 + ...{wt_text_report.pkb => wt_core_report.pkb} | 55 +- ...{wt_text_report.pks => wt_core_report.pks} | 6 +- src/core/wt_qual_test_runners_vw.vw | 4 +- src/core/wt_self_test.tab | 1 + src/core/wt_versions.tab | 2 +- src/core/wtplsql.pkb | 18 +- src/demo/Package-Test.sql | 11 + src/demo/Table-Test.sql | 2 + src/demo/Test-Runner.sql | 5 + src/demo/Trigger-Test.sql | 3 + src/demo/Type-Test.sql | 4 + src/demo/common_setup.sql | 15 - src/demo/gilded_rose.sql | 2 + src/demo/install.sql | 51 +- src/demo/installO.LST | 687 ------------------ src/demo/uninstall.sql | 4 +- src/demo/uninstallO.LST | 5 - src/demo/ut_betwnstr.sql | 3 + src/demo/ut_calc_secs_between.sql | 3 + src/demo/ut_str.sql | 2 + src/demo/ut_truncit.sql | 4 + src/persist/install.sql | 95 ++- src/persist/wt_dbout.pkb | 6 +- src/persist/wt_dbout_runs_vw.vw | 83 ++- src/persist/wt_profile.pks | 8 +- src/persist/wt_profiles.tab | 20 +- src/persist/wt_profiles_vw.vw | 64 +- src/persist/wt_results.tab | 19 +- src/persist/wt_results_vw.vw | 2 +- src/persist/wt_scheduler_jobs.vw | 2 +- src/persist/wt_test_run.pks | 2 +- src/persist/wt_test_runner.pkb | 129 +++- src/persist/wt_test_runner.pks | 9 +- src/persist/wt_test_runs.tab | 79 +- src/persist/wt_test_runs_vw.vw | 68 +- src/persist/wt_testcase_runs_vw.vw | 78 +- src/persist/wt_testcase_stats.tab | 48 +- src/persist/wt_text_report.pkb | 36 +- src/persist/wt_text_report.pks | 27 +- src/typical_install.bat | 16 + src/typical_uninstall.bat | 12 + 53 files changed, 846 insertions(+), 1216 deletions(-) rename src/core/{wt_text_report.pkb => wt_core_report.pkb} (79%) rename src/core/{wt_text_report.pks => wt_core_report.pks} (90%) delete mode 100644 src/demo/common_setup.sql delete mode 100644 src/demo/installO.LST delete mode 100644 src/demo/uninstallO.LST create mode 100644 src/typical_install.bat create mode 100644 src/typical_uninstall.bat diff --git a/docs/Persist-Add-On.md b/docs/Persist-Add-On.md index 46fcb92..2c58c8a 100644 --- a/docs/Persist-Add-On.md +++ b/docs/Persist-Add-On.md @@ -7,5 +7,7 @@ Must install core first. See the README.md file in the src/core directory for installation instructions. +Doubles the memory usage of core (1 Mb) by duplicating all results in memory before inserting to tables. + --- [Website Home Page](README.md) diff --git a/docs/Reference.md b/docs/Reference.md index 5aa9e24..849b52b 100644 --- a/docs/Reference.md +++ b/docs/Reference.md @@ -39,6 +39,16 @@ An obvious drawback of this approach is running assertions when NLS settings mus * ORA-20010 ORA-20015 - WT_TEST_RUN_STAT Package: Unknown Result status * ORA-20011 ORA-20016 - WT_TEST_RUN_STAT Package: Unknown Profile status +## WT_CORE_REPORT Detail Levels +* **Less than 10 (including null)** - No Detail + * Assertion results summary. +* **10 to 19** - Minimal Detail + * Assertion results summary. + * Failed assertion result details. +* **20 or more** - Full Detail + * Assertion results summary. + * All assertion result details. + ## WT_TEXT_REPORT Detail Levels * **Less than 10 (including null)** - No Detail * Assertion results summary. diff --git a/docs/demo/README.md b/docs/demo/README.md index c5b7f02..43b7a9d 100644 --- a/docs/demo/README.md +++ b/docs/demo/README.md @@ -6,7 +6,7 @@ Demonstrations and examples assume successful connection to an [Oracle database](http://www.oracle.com/technetwork/database/database-technologies/express-edition/overview/index.html) with wtPLSQL installed. wtPLSQL Installation instructions are available on the [wtPLSQL Releases page](https://github.com/DDieterich/wtPLSQL/releases). -Test results from assertions can be queried from a set of wtPLSQL tables. The examples here will use the default reporting package called WT_TEXT_REPORT. This package displays test results using DBMS_OUTPUT. +Demonstrations and examples requires the Persist add-on. Test results from assertions can be queried from a set of wtPLSQL tables. The examples here will use the default reporting package called WT_TEXT_REPORT. This package displays test results using DBMS_OUTPUT. ## User Setup @@ -37,7 +37,7 @@ Run this: select wtplsql.show_version from dual; ``` -If the result is "Core 1.2, Persist 1.2", wtPSQL is installed with the Persist add-on. If the result is "Core 1.2", the Persist add-on has not been installed. In each exercise, there will be an indication if the results are different without the Persist add-on. +If the result is something like "Core 1.2, Persist 1.2", wtPSQL is installed with the Persist add-on. If the result is "Core 1.2", the Persist add-on has not been installed. For simplicity, the adjustments required to make the demonstrations and exercises work without the Persist add-on are not included. ### Another simple test diff --git a/src/common_setup.sql b/src/common_setup.sql index 140477e..172c9f7 100644 --- a/src/common_setup.sql +++ b/src/common_setup.sql @@ -9,6 +9,7 @@ set echo on set define "&" set concat "." define schema_owner="wtp" +define demo_owner="wtp_demo" define connect_string="" -- Common Setup Done. set echo off diff --git a/src/core/README.md b/src/core/README.md index 2be5bce..3bcfe71 100644 --- a/src/core/README.md +++ b/src/core/README.md @@ -17,6 +17,8 @@ uninstall.sql | Uninstall script. Run as SYSTEM. uninstallO.LST | Example of a successfull uninstall. wt_assert.pkb | WT_ASSERT package body. wt_assert.pks | WT_ASSERT package specification. +wt_core_report.pkb | WT_CORE_REPORT package body. +wt_core_report.pks | WT_CORE_REPORT package specification. wt_dbout_profiles.tab | WT_DBOUT_PROFILES table. wt_profiler.pkb | WT_PROFILER package body. wt_profiler.pks | WT_PROFILER package specification. @@ -29,8 +31,6 @@ wt_test_run_stat.pks | WT_TEST_RUN_STAT package specification. wt_test_run_stats.tab | WT_TEST_RUN_STATS table. wt_test_runs.tab | WT_TEST_RUNS table. wt_testcase_stats.tab | WT_TESTCASE_STATS table. -wt_text_report.pkb | WT_TEXT_REPORT package body. -wt_text_report.pks | WT_TEXT_REPORT package specification. wt_version.tab | WT_VERSION table. wtplsql.pkb | WTPLSQL package body. wtplsql.pks | WTPLSQL package specification. diff --git a/src/core/core_data.pkb b/src/core/core_data.pkb index fadf52b..14e31f4 100644 --- a/src/core/core_data.pkb +++ b/src/core/core_data.pkb @@ -466,8 +466,8 @@ begin if g_results_nt.COUNT > 1 then -- Need at least 2 elements because the last element is NULL. - g_run_rec.fst_assrt_dtm := g_results_nt(1).executed_dtm; - g_run_rec.lst_assrt_dtm := g_results_nt(g_results_nt.COUNT-1).executed_dtm; + g_run_rec.asrt_fst_dtm := g_results_nt(1).executed_dtm; + g_run_rec.asrt_lst_dtm := g_results_nt(g_results_nt.COUNT-1).executed_dtm; end if; -- Remove the Last (Empty) Array Element g_results_nt.delete(g_results_nt.COUNT); @@ -521,17 +521,17 @@ $THEN -------------------------------------- WTPLSQL Testing -- -- Need at least 2 elements because the last element is NULL. wt_assert.isnull - (msg_in => 'l_run_recSAVE.fst_assrt_dtm' - ,check_this_in => l_run_recSAVE.fst_assrt_dtm); + (msg_in => 'l_run_recSAVE.asrt_fst_dtm' + ,check_this_in => l_run_recSAVE.asrt_fst_dtm); wt_assert.isnotnull - (msg_in => 'l_run_recTEST.fst_assrt_dtm' - ,check_this_in => l_run_recTEST.fst_assrt_dtm); + (msg_in => 'l_run_recTEST.asrt_fst_dtm' + ,check_this_in => l_run_recTEST.asrt_fst_dtm); wt_assert.isnull - (msg_in => 'l_run_recSAVE.lst_assrt_dtm' - ,check_this_in => l_run_recSAVE.lst_assrt_dtm); + (msg_in => 'l_run_recSAVE.asrt_lst_dtm' + ,check_this_in => l_run_recSAVE.asrt_lst_dtm); wt_assert.isnotnull - (msg_in => 'l_run_recTEST.lst_assrt_dtm' - ,check_this_in => l_run_recTEST.lst_assrt_dtm); + (msg_in => 'l_run_recTEST.asrt_lst_dtm' + ,check_this_in => l_run_recTEST.asrt_lst_dtm); -------------------------------------- WTPLSQL Testing -- -- Remove the Last (Empty) Array Element wt_assert.eq diff --git a/src/core/core_data.pks b/src/core/core_data.pks index c5880b4..56c4a7c 100644 --- a/src/core/core_data.pks +++ b/src/core/core_data.pks @@ -5,48 +5,48 @@ is SUBTYPE long_name is varchar2(128); TYPE run_rec_type is record - (runner_owner long_name -- Owner of the Test Runner - ,runner_name long_name -- Name of the Test Runner - ,start_dtm timestamp(3) with time zone -- Test Runner Start Date/Time - ,end_dtm timestamp(3) with time zone -- Test Runner End Date/Time - ,fst_assrt_dtm timestamp(3) with time zone -- Date/Time of First Assertion - ,lst_assrt_dtm timestamp(3) with time zone -- Date/Time of Last Assertion - ,runner_sec number(6,1) default 0 -- Total Runtime for Test Runner in Seconds - ,tc_cnt number(7) default 0 -- Number of Test Cases - ,tc_fail number(7) default 0 -- Number of Failed Test Cases - ,asrt_cnt number(7) default 0 -- Number of Assertions across all Test Cases - ,asrt_fail number(7) default 0 -- Number of Assertion Failures across all Test Cases - ,asrt_min_msec number(10) -- Minumum Assertion Interval in Milliseconds across all Test Cases - ,asrt_max_msec number(10) -- Maximum Assertion Interval in Milliseconds across all Test Cases - ,asrt_tot_msec number(10) default 0 -- Total Assertion Intervals in Milliseconds across all Test Cases - ,asrt_sos_msec number(20) default 0 -- Sum of Squares of Assertion Interval in Milliseconds across all Test Cases - ,dbout_owner long_name -- Owner of the Database Object Under Test - ,dbout_name long_name -- Name of the Database Object Under Test - ,dbout_type varchar2(20) -- Type of the Database Object Under Test - ,error_message varchar2(4000) -- Error Message + (runner_owner long_name -- Owner of the Test Runner + ,runner_name long_name -- Name of the Test Runner + ,start_dtm timestamp(3) with local time zone -- Test Runner Start Date/Time + ,end_dtm timestamp(3) with local time zone -- Test Runner End Date/Time + ,runner_sec number(6,1) default 0 -- Total Runtime for Test Runner in Seconds + ,error_message varchar2(4000) -- Error Message + ,tc_cnt number(7) default 0 -- Number of Test Cases + ,tc_fail number(7) default 0 -- Number of Failed Test Cases + ,asrt_fst_dtm timestamp(3) with local time zone -- Date/Time of First Assertion + ,asrt_lst_dtm timestamp(3) with local time zone -- Date/Time of Last Assertion + ,asrt_cnt number(7) default 0 -- Number of Assertions across all Test Cases + ,asrt_fail number(7) default 0 -- Number of Assertion Failures across all Test Cases + ,asrt_min_msec number(10) -- Minumum Assertion Interval in Milliseconds across all Test Cases + ,asrt_max_msec number(10) -- Maximum Assertion Interval in Milliseconds across all Test Cases + ,asrt_tot_msec number(10) default 0 -- Total Assertion Intervals in Milliseconds across all Test Cases + ,asrt_sos_msec number(20) default 0 -- Sum of Squares of Assertion Interval in Milliseconds across all Test Cases + ,dbout_owner long_name -- Owner of the Database Object Under Test + ,dbout_name long_name -- Name of the Database Object Under Test + ,dbout_type varchar2(20) -- Type of the Database Object Under Test ); g_run_rec run_rec_type; TYPE tcases_rec_type is record - (asrt_cnt number(7) default 0 -- Number of Assertions in this Test Case - ,asrt_fail number(7) default 0 -- Number of Failed Assertsion in this Test Case - ,asrt_min_msec number(10) -- Minumum Assertion Interval in Milliseconds in this Test Cases - ,asrt_max_msec number(10) -- Maximum Assertion Interval in Milliseconds in this Test Cases - ,asrt_tot_msec number(10) default 0 -- Total Assertion Interval in Milliseconds in this Test Cases - ,asrt_sos_msec number(20) default 0 -- Sum of Squares Assertion Interval in Milliseconds in this Test Cases + (asrt_cnt number(7) default 0 -- Number of Assertions in this Test Case + ,asrt_fail number(7) default 0 -- Number of Failed Assertsion in this Test Case + ,asrt_min_msec number(10) -- Minumum Assertion Interval in Milliseconds in this Test Cases + ,asrt_max_msec number(10) -- Maximum Assertion Interval in Milliseconds in this Test Cases + ,asrt_tot_msec number(10) default 0 -- Total Assertion Interval in Milliseconds in this Test Cases + ,asrt_sos_msec number(20) default 0 -- Sum of Squares Assertion Interval in Milliseconds in this Test Cases ); TYPE tcases_aa_type is table of tcases_rec_type index by long_name; g_tcases_aa tcases_aa_type; TYPE results_rec_type is record - (result_seq number(8) default 0 -- Sequence Number of the Assertion - ,executed_dtm timestamp(6) with time zone -- Execution Date/Time of the Assertion - ,interval_msecs number(10,3) -- Interval from Previous Assertion in Milliseconds - ,testcase long_name -- Test Case Name of the Assertion - ,assertion varchar2(15) -- Name of the Assertion - ,pass boolean -- Did the Assertion Pass? (TRUE/FALSE) - ,details varchar2(4000) -- Test Details of the Assertion - ,message varchar2(200) -- Identifcation Message of the Assertion + (result_seq number(8) default 0 -- Sequence Number of the Assertion + ,testcase long_name -- Test Case Name of the Assertion + ,executed_dtm timestamp(6) with local time zone -- Execution Date/Time of the Assertion + ,interval_msecs number(10,3) -- Interval from Previous Assertion in Milliseconds + ,assertion varchar2(15) -- Name of the Assertion + ,pass boolean -- Did the Assertion Pass? (TRUE/FALSE) + ,message varchar2(200) -- Identifcation Message of the Assertion + ,details varchar2(4000) -- Test Details of the Assertion ); TYPE results_nt_type is table of results_rec_type; g_results_nt results_nt_type; diff --git a/src/core/hook.pkb b/src/core/hook.pkb index 1fe143d..a136cf2 100644 --- a/src/core/hook.pkb +++ b/src/core/hook.pkb @@ -20,8 +20,8 @@ begin exception when OTHERS then - l_error_stack := 'Hook Error in ' || in_hook_name || - '(' || i || ')' || CHR(10) || + l_error_stack := 'Hook Error in "' || in_hook_name || + '", index ' || i || '.' || CHR(10) || dbms_utility.format_error_stack || dbms_utility.format_error_backtrace; core_data.run_error(l_error_stack); @@ -63,8 +63,10 @@ end before_test_run; procedure execute_test_runner is begin - -- At least 1 "execute_test_runner" must be loaded into the "g_run_aa" array. - run_hooks('execute_test_runner'); + if execute_test_runner_active + then + run_hooks('execute_test_runner'); + end if; end execute_test_runner; ------------------------------------------------------------ @@ -127,6 +129,7 @@ is begin before_test_all_active := FALSE; before_test_run_active := FALSE; + execute_test_runner_active := FALSE; after_assertion_active := FALSE; after_test_run_active := FALSE; after_test_all_active := FALSE; @@ -146,7 +149,7 @@ begin case buff.hook_name when 'before_test_all' then before_test_all_active := TRUE; when 'before_test_run' then before_test_run_active := TRUE; - when 'execute_test_runner' then NULL; + when 'execute_test_runner' then execute_test_runner_active := TRUE; when 'after_assertion' then after_assertion_active := TRUE; when 'after_test_run' then after_test_run_active := TRUE; when 'after_test_all' then after_test_all_active := TRUE; @@ -215,9 +218,9 @@ $THEN ,against_value_in => l_hname_nt.COUNT); -------------------------------------- WTPLSQL Testing -- wt_assert.g_testcase := 'All Hooks On'; - g_test_hook_msg := ''; for i in 1 .. l_hname_nt.COUNT loop + g_test_hook_msg := ''; g_run_assert_hook := TRUE; execute immediate 'begin hook.' || l_hname_nt(i) || '; end;'; g_run_assert_hook := FALSE; @@ -236,9 +239,9 @@ $THEN ,check_query_in => 'select count(*) from hooks' ,against_value_in => 0); -------------------------------------- WTPLSQL Testing -- - g_test_hook_msg := ''; for i in 1 .. l_hname_nt.COUNT loop + g_test_hook_msg := ''; execute immediate 'begin hook.' || l_hname_nt(i) || '; end;'; wt_assert.isnull (msg_in => l_hname_nt(i) || ' is not active' diff --git a/src/core/install.sql b/src/core/install.sql index 0747e1a..5303d8e 100644 --- a/src/core/install.sql +++ b/src/core/install.sql @@ -5,7 +5,9 @@ -- Run as SYS -- --- Capture output +prompt +prompt Capture output + spool install set showmode off set serveroutput on size unlimited format truncated @@ -26,7 +28,9 @@ end; WHENEVER SQLERROR continue --- Create the schema owner. + +prompt +prompt Create the schema owner. create user &schema_owner. identified by &schema_owner. default tablespace users @@ -53,6 +57,10 @@ grant select on dba_source to &schema_owner. with grant option; -- For GUI grant select on sys.gv_$parameter to &schema_owner. with grant option; + +prompt +prompt Checking PLSQL_CCFLAGS + begin for buff in (select p.value PLSQL_CCFLAGS from dual d @@ -101,9 +109,11 @@ end; / +prompt +prompt Connect as SCHEMA_OWNER + WHENEVER SQLERROR exit SQL.SQLCODE --- Connect as SCHEMA_OWNER connect &schema_owner./&schema_owner.&connect_string. set serveroutput on size unlimited format truncated @@ -119,32 +129,41 @@ end; WHENEVER SQLERROR continue --- Package Specifications +prompt +prompt Install Package Specifications + @core_data.pks / +show errors @hook.pks / +show errors @wtplsql.pks / +show errors grant execute on wtplsql to public; create or replace public synonym wtplsql for wtplsql; create or replace public synonym wt_wtplsql for wtplsql; @wt_assert.pks / +show errors grant execute on wt_assert to public; create or replace public synonym wt_assert for wt_assert; create or replace public synonym utassert for wt_assert; @wt_text_report.pks / +show errors grant execute on wt_text_report to public; create or replace public synonym wt_text_report for wt_text_report; --- Core Tables +prompt +prompt Install Tables + @hooks.tab @wt_versions.tab @@ -152,50 +171,60 @@ create or replace public synonym wt_text_report for wt_text_report; @wt_self_test.tab --- Procedures +prompt +prompt Install Views +@wt_qual_test_runners_vw.vw +/ + + +prompt +prompt Install Procedures + @wt_execute_test_runner.prc / +show errors grant execute on wt_execute_test_runner to public; create or replace public synonym wt_execute_test_runner for wt_execute_test_runner; --- Package Bodies +prompt +prompt Install Package Bodies + @core_data.pkb / +show errors @hook.pkb / +show errors @wtplsql.pkb / +show errors @wt_assert.pkb / +show errors @wt_text_report.pkb / - --- Views -@wt_qual_test_runners_vw.vw -/ - -@wt_scheduler_jobs_vw.vw -/ +show errors --- Configuration Data +prompt +prompt Configuration Data -- This is the default test runner execution procedure insert into hooks (hook_name, seq, run_string) values ('execute_test_runner', 20, 'begin wt_execute_test_runner; end;'); --- Run this report after testing because this is no storage +-- Run this report after testing because there is no storage insert into hooks (hook_name, seq, run_string) - values ('after_test_run', 20, 'begin wt_text_report.dbms_out(10); end;'); + values ('after_test_run', 20, 'begin wt_core_report.dbms_out(10); end;'); -- This is the default ad-hoc result report insert into hooks (hook_name, seq, run_string) - values ('ad_hoc_report', 20, 'begin wt_text_report.ad_hoc_result; end;'); + values ('ad_hoc_report', 20, 'begin wt_core_report.ad_hoc_result; end;'); commit; diff --git a/src/core/installO.LST b/src/core/installO.LST index 0290ef2..5c4f6c9 100644 --- a/src/core/installO.LST +++ b/src/core/installO.LST @@ -2,6 +2,18 @@ old: showmode BOTH PL/SQL procedure successfully completed. +. +SQL> -- Running Common Setup +SQL> set define "&" +SQL> set concat "." +SQL> define schema_owner="wtp" +SQL> define demo_owner="wtp_demo" +SQL> define connect_string="" +SQL> -- Common Setup Done. +SQL> set echo off +. + +Create the schema owner. old 1: create user &schema_owner. identified by &schema_owner. new 1: create user wtp identified by wtp @@ -57,26 +69,28 @@ new 1: grant create public synonym to wtp Grant succeeded. -old 1: grant select on dba_objects to &schema_owner. -new 1: grant select on dba_objects to wtp +old 1: grant select on dba_objects to &schema_owner. with grant option +new 1: grant select on dba_objects to wtp with grant option Grant succeeded. -old 1: grant select on dba_procedures to &schema_owner. -new 1: grant select on dba_procedures to wtp +old 1: grant select on dba_procedures to &schema_owner. with grant option +new 1: grant select on dba_procedures to wtp with grant option Grant succeeded. -old 1: grant select on dba_source to &schema_owner. -new 1: grant select on dba_source to wtp +old 1: grant select on dba_source to &schema_owner. with grant option +new 1: grant select on dba_source to wtp with grant option Grant succeeded. -old 1: grant select on sys.gv_$parameter to &schema_owner. -new 1: grant select on sys.gv_$parameter to wtp +old 1: grant select on sys.gv_$parameter to &schema_owner. with grant option +new 1: grant select on sys.gv_$parameter to wtp with grant option Grant succeeded. + +Checking PLSQL_CCFLAGS PLSQL_CCFLAGS Before: WTPLSQL_ENABLE:TRUE, WTPLSQL_SELFTEST:TRUE PL/SQL procedure successfully completed. @@ -88,6 +102,8 @@ PLSQL_CCFLAGS After: WTPLSQL_ENABLE:TRUE, WTPLSQL_SELFTEST:TRUE PL/SQL procedure successfully completed. + +Connect as SCHEMA_OWNER Connected. old 2: if USER != upper('&schema_owner') new 2: if USER != upper('wtp') @@ -97,6 +113,54 @@ new 5: 'Not logged in as wtp'); PL/SQL procedure successfully completed. +Install Package Specifications + +Package created. + +No errors. + +Package created. + +No errors. + +Package created. + +No errors. + +Grant succeeded. + + +Synonym created. + + +Synonym created. + + +Package created. + +No errors. + +Grant succeeded. + + +Synonym created. + + +Synonym created. + + +Package created. + +No errors. + +Grant succeeded. + + +Synonym created. + + +Install Tables + Table created. @@ -127,6 +191,15 @@ Comment created. Comment created. +Comment created. + + +Comment created. + + +Comment created. + + Grant succeeded. old 1: create or replace public synonym wt_version for &schema_owner..wt_versions @@ -164,6 +237,7 @@ Comment created. Trigger created. +No errors. PL/SQL procedure successfully completed. @@ -171,50 +245,35 @@ PL/SQL procedure successfully completed. Commit complete. -Package created. - - -Package created. - - -Package created. - +Install Views -Grant succeeded. +View created. +No errors. -Synonym created. +Comment created. -Synonym created. +Comment created. -Package created. +Comment created. Grant succeeded. -Synonym created. - - -Synonym created. - - -Package created. - - Grant succeeded. -Synonym created. - +Install Procedures Procedure created. Procedure created. +No errors. Grant succeeded. @@ -222,20 +281,29 @@ Grant succeeded. Synonym created. +Install Package Bodies + Package body created. +No errors. Package body created. +No errors. Package body created. +No errors. Package body created. +No errors. Package body created. +No errors. + +Configuration Data 1 row created. diff --git a/src/core/test_allO.LST b/src/core/test_allO.LST index 3aace6c..520875b 100644 --- a/src/core/test_allO.LST +++ b/src/core/test_allO.LST @@ -1,56 +1,48 @@ - wtPLSQL 1.2.0 - Start Date/Time: 09-Dec-2018 08:21:47 PM + wtPLSQL Core 1.2 + Start Date/Time: 20-Jan-2019 09:25:49 PM Test Results for WTP.CORE_DATA Database Object Under Test is PACKAGE BODY WTP.CORE_DATA ---------------------------------------- Minimum Elapsed msec: 0 Total Assertions: 64 Average Elapsed msec: 0 Total Testcases: 8 - Maximum Elapsed msec: 3 Failed Testcases: 0 + Maximum Elapsed msec: 4 Failed Testcases: 0 Total Run Time (sec): 0.2 Testcase Yield: 100% -WTP.CORE_DATA Test Runner Details: ----------------------------------------- - - wtPLSQL 1.2.0 - Start Date/Time: 09-Dec-2018 08:21:47 PM + wtPLSQL Core 1.2 + Start Date/Time: 20-Jan-2019 09:25:50 PM Test Results for WTP.HOOK Database Object Under Test is PACKAGE BODY WTP.HOOK ---------------------------------------- Minimum Elapsed msec: 0 Total Assertions: 18 - Average Elapsed msec: 1 Total Testcases: 4 - Maximum Elapsed msec: 4 Failed Testcases: 0 + Average Elapsed msec: 4 Total Testcases: 4 + Maximum Elapsed msec: 23 Failed Testcases: 0 Total Run Time (sec): 0.1 Testcase Yield: 100% -WTP.HOOK Test Runner Details: ----------------------------------------- - - wtPLSQL 1.2.0 - Start Date/Time: 09-Dec-2018 08:21:47 PM + wtPLSQL Core 1.2 + Start Date/Time: 20-Jan-2019 09:25:50 PM Test Results for WTP.WTPLSQL ---------------------------------------- - Minimum Elapsed msec: 0 Total Assertions: 26 - Average Elapsed msec: 18 Total Testcases: 11 - Maximum Elapsed msec: 173 Failed Testcases: 0 - Total Run Time (sec): 0.5 Testcase Yield: 100% - -WTP.WTPLSQL Test Runner Details: ----------------------------------------- + Minimum Elapsed msec: 0 Total Assertions: 27 + Average Elapsed msec: 14 Total Testcases: 11 + Maximum Elapsed msec: 87 Failed Testcases: 0 + Total Run Time (sec): 0.4 Testcase Yield: 100% - wtPLSQL 1.2.0 - Start Date/Time: 09-Dec-2018 08:21:48 PM + wtPLSQL Core 1.2 + Start Date/Time: 20-Jan-2019 09:25:50 PM Test Results for WTP.WT_ASSERT Database Object Under Test is PACKAGE BODY WTP.WT_ASSERT ---------------------------------------- Minimum Elapsed msec: 0 Total Assertions: 405 - Average Elapsed msec: 3 Total Testcases: 151 - Maximum Elapsed msec: 111 Failed Testcases: 0 - Total Run Time (sec): 1.4 Testcase Yield: 100% - -WTP.WT_ASSERT Test Runner Details: ----------------------------------------- + Average Elapsed msec: 10 Total Testcases: 151 + Maximum Elapsed msec: 495 Failed Testcases: 0 + Total Run Time (sec): 4.1 Testcase Yield: 100% diff --git a/src/core/uninstallO.LST b/src/core/uninstallO.LST index bb47a21..2a06efc 100644 --- a/src/core/uninstallO.LST +++ b/src/core/uninstallO.LST @@ -1,3 +1,12 @@ +. +SQL> -- Running Common Setup +SQL> set define "&" +SQL> set concat "." +SQL> define schema_owner="wtp" +SQL> define connect_string="" +SQL> -- Common Setup Done. +SQL> set echo off +. old 1: drop user &schema_owner. cascade new 1: drop user wtp cascade diff --git a/src/core/wt_text_report.pkb b/src/core/wt_core_report.pkb similarity index 79% rename from src/core/wt_text_report.pkb rename to src/core/wt_core_report.pkb index 1629763..f33e510 100644 --- a/src/core/wt_text_report.pkb +++ b/src/core/wt_core_report.pkb @@ -1,4 +1,4 @@ -create or replace package body wt_text_report +create or replace package body wt_core_report as @@ -30,9 +30,10 @@ is begin p(''); -- - p(' wtPLSQL ' || wtplsql.show_version || ' - Start Date/Time: ' || - to_char(core_data.g_run_rec.start_dtm, g_date_format) || - CHR(10)); + p(' wtPLSQL ' || wtplsql.show_version); + p(' Start Date/Time: ' || + to_char(core_data.g_run_rec.start_dtm, g_date_format)); + p(''); p('Test Results for ' || core_data.g_run_rec.runner_owner || '.' || core_data.g_run_rec.runner_name ); ---------------------------------------- @@ -83,27 +84,36 @@ end summary_out; procedure results_out (in_show_pass in boolean) is - l_rec core_data.results_rec_type; + l_rec core_data.results_rec_type; + old_testcase core_data.long_name; + show_header boolean := TRUE; begin - -- - p(''); - p( core_data.g_run_rec.runner_owner || - '.' || core_data.g_run_rec.runner_name || - ' Test Runner Details:' ); - p('----------------------------------------'); - -- + -- Loop through all results for i in 1 .. core_data.g_results_nt.COUNT loop + -- Determine if this should be displayed if in_show_pass OR NOT core_data.g_results_nt(i).pass then - if core_data.g_results_nt(i).testcase = l_rec.testcase + l_rec := core_data.g_results_nt(i); + -- Remove Consecutive Testcases + if core_data.g_results_nt(i).testcase = old_testcase then - l_rec := core_data.g_results_nt(i); l_rec.testcase := ''; else - l_rec := core_data.g_results_nt(i); + old_testcase := l_rec.testcase; end if; + -- Display header if needed + if show_header + then + p(''); + p( core_data.g_run_rec.runner_owner || + '.' || core_data.g_run_rec.runner_name || + ' Test Runner Details:' ); + p('----------------------------------------'); + show_header := FALSE; + end if; + -- Display the result p(format_test_result(l_rec)); end if; end loop; @@ -145,14 +155,17 @@ end dbms_out; procedure ad_hoc_result is begin - p(wt_assert.g_rec.last_msg || CHR(10) || - ' Assertion ' || wt_assert.g_rec.last_assert || + p(wt_assert.g_rec.last_msg); + p(' Assertion ' || wt_assert.g_rec.last_assert || case wt_assert.last_pass when TRUE then ' PASSED.' else ' FAILED.' - end || CHR(10) || - ' Testcase: ' || wt_assert.g_testcase || CHR(10) || - ' ' || wt_assert.g_rec.last_details ); + end); + if wt_assert.g_testcase is not null + then + p(' Testcase: ' || wt_assert.g_testcase); + end if; + p( ' ' || wt_assert.g_rec.last_details); end ad_hoc_result; @@ -196,4 +209,4 @@ begin end format_test_result; -end wt_text_report; \ No newline at end of file +end wt_core_report; \ No newline at end of file diff --git a/src/core/wt_text_report.pks b/src/core/wt_core_report.pks similarity index 90% rename from src/core/wt_text_report.pks rename to src/core/wt_core_report.pks index dd3952c..2f8bedf 100644 --- a/src/core/wt_text_report.pks +++ b/src/core/wt_core_report.pks @@ -1,10 +1,10 @@ -create or replace package wt_text_report +create or replace package wt_core_report authid definer as -- To report the latest result details: -- begin - -- wt_text_report.dbms_out(30, TRUE); + -- wt_core_report.dbms_out(30, TRUE); -- end; -- / @@ -33,4 +33,4 @@ as (in_rec in core_data.results_rec_type) return varchar2; -end wt_text_report; \ No newline at end of file +end wt_core_report; \ No newline at end of file diff --git a/src/core/wt_qual_test_runners_vw.vw b/src/core/wt_qual_test_runners_vw.vw index 9fac46c..ce05cf1 100644 --- a/src/core/wt_qual_test_runners_vw.vw +++ b/src/core/wt_qual_test_runners_vw.vw @@ -3,13 +3,15 @@ -- Current Test Runners View Installation -- -create view wt_qual_test_runners_vw as +create or replace force view wt_qual_test_runners_vw as select owner ,object_name PACKAGE_NAME from dba_procedures where procedure_name = wtplsql.get_runner_entry_point and object_type = 'PACKAGE'; +show errors + comment on table wt_qual_test_runners_vw is 'All PL/SQL Packages with the required Test Runner Entry Point.'; comment on column wt_qual_test_runners_vw.owner is 'Owner of the Qualified Test Runner Package'; comment on column wt_qual_test_runners_vw.package_name is 'Name of the Qualified Test Runner Package'; diff --git a/src/core/wt_self_test.tab b/src/core/wt_self_test.tab index bd78946..bd28a36 100644 --- a/src/core/wt_self_test.tab +++ b/src/core/wt_self_test.tab @@ -28,6 +28,7 @@ begin l_junk := 1; end; / +show errors set define off diff --git a/src/core/wt_versions.tab b/src/core/wt_versions.tab index 94255ca..ec0aef9 100644 --- a/src/core/wt_versions.tab +++ b/src/core/wt_versions.tab @@ -10,7 +10,7 @@ create table wt_versions ,version number constraint wt_vesions_nn4 not null ,notes varchar2(100) ,constraint wt_versions_pk primary key (install_dtm) - ,constraint wt_versions_ck1 check (action in ('INSTALL','UPDATE','REMOVE') + ,constraint wt_versions_ck1 check (action in ('INSTALL','UPDATE','REMOVE')) ) pctfree 0; comment on table wt_versions is 'Records the installed and upgraded versions.'; diff --git a/src/core/wtplsql.pkb b/src/core/wtplsql.pkb index 1e877b4..c249935 100644 --- a/src/core/wtplsql.pkb +++ b/src/core/wtplsql.pkb @@ -385,18 +385,20 @@ end get_runner_entry_point; function show_version return varchar2 is - ret_str wt_version.text%TYPE; + ret_str varchar2(4000); begin for buff in ( select component, version from wt_version t1 - where t1.install_dtm = (select max(t2.install_dtm) - from wt_version t2 - where t2.component = t2.component) - and t1.action != 'REMOVE' + where (component, install_dtm) in ( + select t2.component, max(t2.install_dtm) + from wt_version t2 + group by t2.component) + and action != 'REMOVE' order by install_dtm ) loop - ret_str := ret_str || component || ' ' || version || ', '; + ret_str := ret_str || buff.component || ' ' || + buff.version || ', '; end loop; return substr(ret_str, 1, length(ret_str)-2); exception when NO_DATA_FOUND @@ -408,7 +410,7 @@ $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN procedure t_show_version is - existing_version wt_version.text%TYPE; + existing_version varchar2(4000); begin -------------------------------------- WTPLSQL Testing -- wt_assert.g_testcase := 'Show Version Happy Path'; @@ -570,4 +572,4 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- --==============================================================-- -end wtplsql; +end wtplsql; \ No newline at end of file diff --git a/src/demo/Package-Test.sql b/src/demo/Package-Test.sql index 4cc35eb..6e68faa 100644 --- a/src/demo/Package-Test.sql +++ b/src/demo/Package-Test.sql @@ -4,6 +4,7 @@ as procedure wtplsql_run; end test_dbms_output; / +show errors create or replace package body test_dbms_output as @@ -14,6 +15,7 @@ as end wtplsql_run; end test_dbms_output; / +show errors create or replace package body test_dbms_output as @@ -35,12 +37,14 @@ as end wtplsql_run; end test_dbms_output; / +show errors begin wtplsql.test_run('TEST_DBMS_OUTPUT'); wt_text_report.dbms_out(USER,'TEST_DBMS_OUTPUT',30); end; / +show errors create or replace package body test_dbms_output as @@ -63,16 +67,20 @@ as end wtplsql_run; end test_dbms_output; / +show errors begin wtplsql.test_run('TEST_DBMS_OUTPUT'); end; / +show errors begin wt_text_report.dbms_out(USER,'TEST_DBMS_OUTPUT',30); + end if; end; / +show errors create or replace package body test_dbms_output as @@ -131,13 +139,16 @@ as -- end test_dbms_output; / +show errors begin wtplsql.test_run('TEST_DBMS_OUTPUT'); end; / +show errors begin wt_text_report.dbms_out(USER,'TEST_DBMS_OUTPUT',30); end; / +show errors diff --git a/src/demo/Table-Test.sql b/src/demo/Table-Test.sql index 78be3a7..35a6149 100644 --- a/src/demo/Table-Test.sql +++ b/src/demo/Table-Test.sql @@ -14,6 +14,7 @@ as procedure wtplsql_run; end table_test_pkg; / +show errors create or replace package body table_test_pkg as @@ -49,6 +50,7 @@ as end wtplsql_run; end table_test_pkg; / +show errors set serveroutput on size unlimited format truncated diff --git a/src/demo/Test-Runner.sql b/src/demo/Test-Runner.sql index 38cf33c..1360ed7 100644 --- a/src/demo/Test-Runner.sql +++ b/src/demo/Test-Runner.sql @@ -4,6 +4,7 @@ as procedure wtplsql_run; end simple_test_runner; / +show errors create or replace package body simple_test_runner as @@ -14,6 +15,7 @@ as end wtplsql_run; end simple_test_runner; / +show errors begin wtplsql.test_run('SIMPLE_TEST_RUNNER'); @@ -55,6 +57,7 @@ as end wtplsql_run; end simple_test_runner; / +show errors begin wtplsql.test_run('SIMPLE_TEST_RUNNER'); @@ -73,6 +76,7 @@ as end wtplsql_run; end simple_test_runner; / +show errors begin wtplsql.test_run('SIMPLE_TEST_RUNNER'); @@ -97,6 +101,7 @@ as end wtplsql_run; --%WTPLSQL_end_ignore_lines%-- end simple_test_runner; / +show errors begin wtplsql.test_run('SIMPLE_TEST_RUNNER'); diff --git a/src/demo/Trigger-Test.sql b/src/demo/Trigger-Test.sql index cda4c95..70d2529 100644 --- a/src/demo/Trigger-Test.sql +++ b/src/demo/Trigger-Test.sql @@ -24,12 +24,14 @@ begin :new.created_dtm := sysdate; end; / +show errors create or replace package trigger_test_pkg authid definer as procedure wtplsql_run; end trigger_test_pkg; / +show errors create or replace package body trigger_test_pkg as @@ -61,6 +63,7 @@ as end wtplsql_run; end trigger_test_pkg; / +show errors set serveroutput on size unlimited format truncated diff --git a/src/demo/Type-Test.sql b/src/demo/Type-Test.sql index 9152d96..3211c6c 100644 --- a/src/demo/Type-Test.sql +++ b/src/demo/Type-Test.sql @@ -11,6 +11,7 @@ create or replace type simple_test_obj_type authid definer ,in_observation number) ); / +show errors create or replace type body simple_test_obj_type is CONSTRUCTOR FUNCTION simple_test_obj_type @@ -34,12 +35,14 @@ create or replace type body simple_test_obj_type is end add_observation; end; / +show errors create or replace package test_simple_object authid definer as procedure wtplsql_run; end test_simple_object; / +show errors create or replace package body test_simple_object as @@ -63,6 +66,7 @@ as end wtplsql_run; end test_simple_object; / +show errors set serveroutput on size unlimited format truncated diff --git a/src/demo/common_setup.sql b/src/demo/common_setup.sql deleted file mode 100644 index 876d52a..0000000 --- a/src/demo/common_setup.sql +++ /dev/null @@ -1,15 +0,0 @@ - --- --- Core Installation --- - --- Enable SQL*Plus Variables -set define "&" -set concat "." - -accept schema_owner CHAR default 'wtp_demo' - -prompt 'Enter Schema Name (WTP_DEMO): ' - -prompt 'Connect String must be empty or start with @' -accept connect_string CHAR default 'wtp' - -prompt 'Enter Connect String (): ' diff --git a/src/demo/gilded_rose.sql b/src/demo/gilded_rose.sql index 278e88b..fd94a8d 100644 --- a/src/demo/gilded_rose.sql +++ b/src/demo/gilded_rose.sql @@ -45,6 +45,7 @@ as end gilded_rose; / +show errors create or replace package body gilded_rose @@ -132,3 +133,4 @@ $END end gilded_rose; / +show errors diff --git a/src/demo/install.sql b/src/demo/install.sql index c9a7371..17a9ce1 100644 --- a/src/demo/install.sql +++ b/src/demo/install.sql @@ -3,17 +3,10 @@ -- Demo Installation -- ----------------------------------------- --- Setup ----------------------------------------- - -- Capture output spool install set serveroutput on size unlimited format truncated --- Shared Setup Script -@common_setup.sql - WHENEVER SQLERROR exit SQL.SQLCODE begin @@ -25,24 +18,28 @@ begin end; / +prompt +prompt Shared Setup Script +@../common_setup.sql + WHENEVER SQLERROR continue ----------------------------------------- --- Create the schema owner. ----------------------------------------- -create user &schema_owner. identified by &schema_owner. +prompt +prompt Create Demo owner + +create user &demo_owner. identified by &demo_owner. default tablespace users quota 1M on users temporary tablespace temp; -grant create session to &schema_owner.; -grant create type to &schema_owner.; -grant create sequence to &schema_owner.; -grant create table to &schema_owner.; -grant create trigger to &schema_owner.; -grant create view to &schema_owner.; -grant create procedure to &schema_owner.; +grant create session to &demo_owner.; +grant create type to &demo_owner.; +grant create sequence to &demo_owner.; +grant create table to &demo_owner.; +grant create trigger to &demo_owner.; +grant create view to &demo_owner.; +grant create procedure to &demo_owner.; begin $IF $$WTPLSQL_ENABLE @@ -55,18 +52,18 @@ end; WHENEVER SQLERROR exit SQL.SQLCODE ----------------------------------------- --- Connect as SCHEMA_OWNER ----------------------------------------- -connect &schema_owner./&schema_owner.&connect_string. +prompt +prompt Connect as DEMO_OWNER + +connect &demo_owner./&demo_owner.&connect_string. set serveroutput on size unlimited format truncated begin - if USER != upper('&schema_owner') + if USER != upper('&demo_owner') then raise_application_error (-20000, - 'Not logged in as &schema_owner'); + 'Not logged in as &demo_owner'); end if; end; / @@ -84,9 +81,9 @@ begin end; / ----------------------------------------- --- Test Installation ----------------------------------------- + +prompt +prompt Test Installation prompt Install Package Test @Package-Test.sql diff --git a/src/demo/installO.LST b/src/demo/installO.LST deleted file mode 100644 index 459659e..0000000 --- a/src/demo/installO.LST +++ /dev/null @@ -1,687 +0,0 @@ - -PL/SQL procedure successfully completed. - -old:create user &schema_owner. identified by &schema_owner. - default tablespace users - quota 1M on users - temporary tablespace temp -new:create user wtp_demo identified by wtp_demo - default tablespace users - quota 1M on users - temporary tablespace temp - -User WTP_DEMO created. - -old:grant create session to &schema_owner. -new:grant create session to wtp_demo - -Grant succeeded. - -old:grant create type to &schema_owner. -new:grant create type to wtp_demo - -Grant succeeded. - -old:grant create sequence to &schema_owner. -new:grant create sequence to wtp_demo - -Grant succeeded. - -old:grant create table to &schema_owner. -new:grant create table to wtp_demo - -Grant succeeded. - -old:grant create trigger to &schema_owner. -new:grant create trigger to wtp_demo - -Grant succeeded. - -old:grant create view to &schema_owner. -new:grant create view to wtp_demo - -Grant succeeded. - -old:grant create procedure to &schema_owner. -new:grant create procedure to wtp_demo - -Grant succeeded. - -WTPLSQL_ENABLE is TRUE -Check WTPLSQL_ENABLE is Done. - - -PL/SQL procedure successfully completed. - -Connected. -old:begin - if USER != upper('&schema_owner') - then - raise_application_error (-20000, - 'Not logged in as &schema_owner'); - end if; -end; - -new:begin - if USER != upper('wtp_demo') - then - raise_application_error (-20000, - 'Not logged in as wtp_demo'); - end if; -end; - -PL/SQL procedure successfully completed. - - -SHOW_VERSION ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -1.1.0 - -PASS Ad-Hoc Test. EQ - Expected "1" and got "1" - - -PL/SQL procedure successfully completed. - -Install Package Test - -Package TEST_DBMS_OUTPUT compiled - - -Package Body TEST_DBMS_OUTPUT compiled - - -Package Body TEST_DBMS_OUTPUT compiled - - - wtPLSQL 1.1.0 - Run ID 29: 29-Jun-2018 01:04:14 PM - - Test Results for WTP_DEMO.TEST_DBMS_OUTPUT - Total Test Cases: 0 Total Assertions: 1 - Minimum Interval msec: 10 Failed Assertions: 0 - Average Interval msec: 10 Error Assertions: 0 - Maximum Interval msec: 10 Test Yield: 100.00% - Total Run Time (sec): 0.1 - - - WTP_DEMO.TEST_DBMS_OUTPUT Test Result Details (Test Run ID 29) ------------------------------------------------------------ - PASS 10ms Test 1. EQ - Expected "Test 1" and got "Test 1" - - - -PL/SQL procedure successfully completed. - - -Package Body TEST_DBMS_OUTPUT compiled - -Test 1 - - -PL/SQL procedure successfully completed. - - - wtPLSQL 1.1.0 - Run ID 30: 29-Jun-2018 01:04:15 PM - - Test Results for WTP_DEMO.TEST_DBMS_OUTPUT - Total Test Cases: 0 Total Assertions: 0 - Minimum Interval msec: 0 Failed Assertions: 0 - Average Interval msec: 0 Error Assertions: 0 - Maximum Interval msec: 0 Test Yield: % - Total Run Time (sec): 0.0 - - *** Test Runner Error *** -ORA-20000: Fault insertion exception -ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 10 -ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 18 -ORA-06512: at line 1 -ORA-06512: at "WTP.WTPLSQL", line 311 - - - - -PL/SQL procedure successfully completed. - - -Package Body TEST_DBMS_OUTPUT compiled - -This should be preserved. - - -PL/SQL procedure successfully completed. - - - wtPLSQL 1.1.0 - Run ID 31: 29-Jun-2018 01:04:15 PM - - Test Results for WTP_DEMO.TEST_DBMS_OUTPUT - Total Test Cases: 0 Total Assertions: 0 - Minimum Interval msec: 0 Failed Assertions: 0 - Average Interval msec: 0 Error Assertions: 0 - Maximum Interval msec: 0 Test Yield: % - Total Run Time (sec): 0.0 - - *** Test Runner Error *** -ORA-20000: ORA-20000: Fault insertion exception -ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 21 -ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 47 -ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 53 -ORA-06512: at line 1 -ORA-06512: at "WTP.WTPLSQL", line 311 - - - - -PL/SQL procedure successfully completed. - -Install Table Test - -Error starting at line : 2 File @ C:\Users\Duane\Documents\GitHub\wtPLSQL\src\demo\Table-Test.sql -In command - -drop table table_test_tab -Error report - -ORA-00942: table or view does not exist -00942. 00000 - "table or view does not exist" -*Cause: -*Action: - -Table TABLE_TEST_TAB created. - - -Package TABLE_TEST_PKG compiled - - -Package Body TABLE_TEST_PKG compiled - - - wtPLSQL 1.1.0 - Run ID 32: 29-Jun-2018 01:04:15 PM - - Test Results for WTP_DEMO.TABLE_TEST_PKG - Total Test Cases: 1 Total Assertions: 2 - Minimum Interval msec: 2 Failed Assertions: 0 - Average Interval msec: 5 Error Assertions: 0 - Maximum Interval msec: 8 Test Yield: 100.00% - Total Run Time (sec): 0.0 - - - WTP_DEMO.TABLE_TEST_PKG Test Result Details (Test Run ID 32) ------------------------------------------------------------ - ---- Test Case: Happy Path 1 - PASS 8ms Successful Insert. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into table_test_tab (id, name) values (1, 'TEST1')". - PASS 2ms Confirm l_rec.name. EQ - Expected "TEST1" and got "TEST1" - - - -PL/SQL procedure successfully completed. - -Install Test Runner - -Package SIMPLE_TEST_RUNNER compiled - - -Package Body SIMPLE_TEST_RUNNER compiled - - -PL/SQL procedure successfully completed. - - - wtPLSQL 1.1.0 - Run ID 33: 29-Jun-2018 01:04:16 PM - - Test Results for WTP_DEMO.SIMPLE_TEST_RUNNER - Total Test Cases: 0 Total Assertions: 1 - Minimum Interval msec: 4 Failed Assertions: 0 - Average Interval msec: 4 Error Assertions: 0 - Maximum Interval msec: 4 Test Yield: 100.00% - Total Run Time (sec): 0.0 - - - -PL/SQL procedure successfully completed. - - - wtPLSQL 1.1.0 - Run ID 33: 29-Jun-2018 01:04:16 PM - - Test Results for WTP_DEMO.SIMPLE_TEST_RUNNER - Total Test Cases: 0 Total Assertions: 1 - Minimum Interval msec: 4 Failed Assertions: 0 - Average Interval msec: 4 Error Assertions: 0 - Maximum Interval msec: 4 Test Yield: 100.00% - Total Run Time (sec): 0.0 - - - WTP_DEMO.SIMPLE_TEST_RUNNER Test Result Details (Test Run ID 33) ------------------------------------------------------------ - PASS 4ms Ad-Hoc Test. EQ - Expected "1" and got "1" - - - -PL/SQL procedure successfully completed. - - -Package Body SIMPLE_TEST_RUNNER compiled - - - wtPLSQL 1.1.0 - Run ID 34: 29-Jun-2018 01:04:16 PM - - Test Results for WTP_DEMO.SIMPLE_TEST_RUNNER - Total Test Cases: 2 Total Assertions: 4 - Minimum Interval msec: 0 Failed Assertions: 1 - Average Interval msec: 0 Error Assertions: 0 - Maximum Interval msec: 1 Test Yield: 75.00% - Total Run Time (sec): 0.0 - - - WTP_DEMO.SIMPLE_TEST_RUNNER Test Result Details (Test Run ID 34) ------------------------------------------------------------ - ---- Test Case: My Test Case A - PASS 1ms Ad-Hoc Test1. EQ - Expected "1" and got "1" - PASS 0ms Ad-Hoc Test2. EQ - Expected "2" and got "2" - ---- Test Case: My Test Case B -#FAIL# 0ms Ad-Hoc Test1. EQ - Expected " 4" and got "4" - PASS 0ms Ad-Hoc Test2. EQ - Expected "5" and got "5" - - - -PL/SQL procedure successfully completed. - - -Package Body SIMPLE_TEST_RUNNER compiled - - - wtPLSQL 1.1.0 - Run ID 35: 29-Jun-2018 01:04:16 PM - - Test Results for WTP_DEMO.SIMPLE_TEST_RUNNER - Total Test Cases: 0 Total Assertions: 1 - Minimum Interval msec: 230 Failed Assertions: 0 - Average Interval msec: 230 Error Assertions: 0 - Maximum Interval msec: 230 Test Yield: 100.00% - Total Run Time (sec): 0.2 - - Code Coverage for PACKAGE BODY WTP_DEMO.SIMPLE_TEST_RUNNER - Ignored Lines: 0 Total Profiled Lines: 3 - Excluded Lines: 0 Total Executed Lines: 2 - Minimum LineExec usec: 0 Not Executed Lines: 0 - Average LineExec usec: 21 Unknown Lines: 1 - Maximum LineExec usec: 41 Code Coverage: 100.00% - Trigger Source Offset: 0 - - - -PL/SQL procedure successfully completed. - - -Package Body SIMPLE_TEST_RUNNER compiled - - - wtPLSQL 1.1.0 - Run ID 36: 29-Jun-2018 01:04:17 PM - - Test Results for WTP_DEMO.SIMPLE_TEST_RUNNER - Total Test Cases: 1 Total Assertions: 1 - Minimum Interval msec: 285 Failed Assertions: 0 - Average Interval msec: 285 Error Assertions: 0 - Maximum Interval msec: 285 Test Yield: 100.00% - Total Run Time (sec): 0.3 - - Code Coverage for PACKAGE BODY WTP_DEMO.SIMPLE_TEST_RUNNER - Ignored Lines: 4 Total Profiled Lines: 8 - Excluded Lines: 0 Total Executed Lines: 3 - Minimum LineExec usec: 0 Not Executed Lines: 0 - Average LineExec usec: 1 Unknown Lines: 1 - Maximum LineExec usec: 2 Code Coverage: 100.00% - Trigger Source Offset: 0 - - - WTP_DEMO.SIMPLE_TEST_RUNNER Test Result Details (Test Run ID 36) ------------------------------------------------------------ - ---- Test Case: My Test Case - PASS 285ms Ad-Hoc Test. EQ - Expected "5" and got "5" - - - WTP_DEMO.SIMPLE_TEST_RUNNER PACKAGE BODY Code Coverage Details (Test Run ID 36) -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 4 UNKN 0 1 1 1 function add2 (in_val1 number, in_val2 number) return number is - 7 EXEC 1 2 2 2 l_result := in_val1 + in_val2; - 8 EXEC 1 0 0 0 return l_result; - 9 EXEC 1 2 2 2 end add2; - 10 IGNR 0 3 3 3 procedure wtplsql_run is begin --%WTPLSQL_begin_ignore_lines%-- - 11 IGNR 2 45 2 43 wt_assert.g_testcase := 'My Test Case'; - 12 IGNR 1 105 1 104 wt_assert.eq(msg_in => 'Ad-Hoc Test' - 15 IGNR 1 1 1 1 end wtplsql_run; --%WTPLSQL_end_ignore_lines%-- - - - -PL/SQL procedure successfully completed. - -Install Trigger Test - -Error starting at line : 2 File @ C:\Users\Duane\Documents\GitHub\wtPLSQL\src\demo\Trigger-Test.sql -In command - -drop table trigger_test_tab -Error report - -ORA-00942: table or view does not exist -00942. 00000 - "table or view does not exist" -*Cause: -*Action: - -Error starting at line : 4 File @ C:\Users\Duane\Documents\GitHub\wtPLSQL\src\demo\Trigger-Test.sql -In command - -drop sequence trigger_test_seq -Error report - -ORA-02289: sequence does not exist -02289. 00000 - "sequence does not exist" -*Cause: The specified sequence does not exist, or the user does - not have the required privilege to perform this operation. -*Action: Make sure the sequence name is correct, and that you have - the right to perform the desired operation on this sequence. - -Sequence TRIGGER_TEST_SEQ created. - - -Table TRIGGER_TEST_TAB created. - - -Trigger TRIGGER_TEST_BIR compiled - - -Package TRIGGER_TEST_PKG compiled - - -Package Body TRIGGER_TEST_PKG compiled - - - wtPLSQL 1.1.0 - Run ID 37: 29-Jun-2018 01:04:18 PM - - Test Results for WTP_DEMO.TRIGGER_TEST_PKG - Total Test Cases: 1 Total Assertions: 3 - Minimum Interval msec: 0 Failed Assertions: 0 - Average Interval msec: 196 Error Assertions: 0 - Maximum Interval msec: 585 Test Yield: 100.00% - Total Run Time (sec): 0.6 - - Code Coverage for TRIGGER WTP_DEMO.TRIGGER_TEST_BIR - Ignored Lines: 0 Total Profiled Lines: 5 - Excluded Lines: 0 Total Executed Lines: 4 - Minimum LineExec usec: 2 Not Executed Lines: 0 - Average LineExec usec: 1355 Unknown Lines: 1 - Maximum LineExec usec: 5387 Code Coverage: 100.00% - Trigger Source Offset: 3 - - - WTP_DEMO.TRIGGER_TEST_PKG Test Result Details (Test Run ID 37) ------------------------------------------------------------ - ---- Test Case: Constructor Happy Path 1 - PASS 585ms l_rec.id. ISNOTNULL - Expected NOT NULL and got "1" - PASS 4ms l_rec.name. EQ - Expected "Test1" and got "Test1" - PASS 0ms l_rec.created_dtm. ISNOTNULL - Expected NOT NULL and got "29-JUN-18" - - - WTP_DEMO.TRIGGER_TEST_BIR TRIGGER Code Coverage Details (Test Run ID 37) -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 4 UNKN 0 5 5 5 begin - 5 EXEC 1 5 5 5 if :new.id is null - 7 EXEC 1 5387 5387 5387 :new.id := trigger_test_seq.nextval; - 9 EXEC 1 25 2 23 :new.created_dtm := sysdate; - 10 EXEC 1 3 3 3 end; - - - -PL/SQL procedure successfully completed. - -Install Type Test - -Type SIMPLE_TEST_OBJ_TYPE compiled - - -Type Body SIMPLE_TEST_OBJ_TYPE compiled - - -Package TEST_SIMPLE_OBJECT compiled - - -Package Body TEST_SIMPLE_OBJECT compiled - - - wtPLSQL 1.1.0 - Run ID 38: 29-Jun-2018 01:04:19 PM - - Test Results for WTP_DEMO.TEST_SIMPLE_OBJECT - Total Test Cases: 1 Total Assertions: 2 - Minimum Interval msec: 0 Failed Assertions: 0 - Average Interval msec: 202 Error Assertions: 0 - Maximum Interval msec: 404 Test Yield: 100.00% - Total Run Time (sec): 0.4 - - Code Coverage for TYPE BODY WTP_DEMO.SIMPLE_TEST_OBJ_TYPE - Ignored Lines: 0 Total Profiled Lines: 10 - Excluded Lines: 1 Total Executed Lines: 4 - Minimum LineExec usec: 1 Not Executed Lines: 4 - Average LineExec usec: 1 Unknown Lines: 1 - Maximum LineExec usec: 4 Code Coverage: 50.00% - Trigger Source Offset: 0 - - - WTP_DEMO.TEST_SIMPLE_OBJECT Test Result Details (Test Run ID 38) ------------------------------------------------------------ - ---- Test Case: Constructor Happy Path 1 - PASS 404ms Object MINIMUM_VALUE. ISNULL - Expected NULL and got "" - PASS 0ms Object OBSERVATIONS. EQ - Expected "0" and got "0" - - - WTP_DEMO.SIMPLE_TEST_OBJ_TYPE TYPE BODY Code Coverage Details (Test Run ID 38) -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 2 UNKN 0 3 3 3 CONSTRUCTOR FUNCTION simple_test_obj_type - 7 EXEC 1 1 1 1 minimum_value := null; - 8 EXEC 1 1 1 1 observations := 0; - 9 EXEC 1 3 3 3 return; - 10 EXEC 1 4 4 4 end simple_test_obj_type; - 11#NOTX# 0 0 0 0 member procedure add_observation - 16#NOTX# 0 0 0 0 If minimum_value is null then minimum_value := in_observation; - 17#NOTX# 0 0 0 0 else minimum_value := least(minimum_value, in_observation); - 19#NOTX# 0 0 0 0 observations := observations + 1; - 20 EXCL 0 0 0 0 end add_observation; - - - -PL/SQL procedure successfully completed. - -utPLSQL 2.3 ut_betwnstr Example - -Function BETWNSTR compiled - - -Package UT_BETWNSTR compiled - - -Package Body UT_BETWNSTR compiled - - - wtPLSQL 1.1.0 - Run ID 39: 29-Jun-2018 01:04:20 PM - - Test Results for WTP_DEMO.UT_BETWNSTR - Total Test Cases: 0 Total Assertions: 5 - Minimum Interval msec: 0 Failed Assertions: 0 - Average Interval msec: 54 Error Assertions: 0 - Maximum Interval msec: 272 Test Yield: 100.00% - Total Run Time (sec): 0.3 - - Code Coverage for FUNCTION WTP_DEMO.BETWNSTR - Ignored Lines: 0 Total Profiled Lines: 3 - Excluded Lines: 0 Total Executed Lines: 2 - Minimum LineExec usec: 1 Not Executed Lines: 0 - Average LineExec usec: 3 Unknown Lines: 1 - Maximum LineExec usec: 20 Code Coverage: 100.00% - Trigger Source Offset: 0 - - - WTP_DEMO.UT_BETWNSTR Test Result Details (Test Run ID 39) ------------------------------------------------------------ - PASS 272ms Typical valid usage. EQ - Expected "cde" and got "cde" - PASS 0ms NULL start. ISNULL - Expected NULL and got "" - PASS 0ms NULL end. ISNULL - Expected NULL and got "" - PASS 0ms End smaller than start. ISNULL - Expected NULL and got "" - PASS 0ms End larger than string length. EQ - Expected "cdefg" and got "cdefg" - - - WTP_DEMO.BETWNSTR FUNCTION Code Coverage Details (Test Run ID 39) -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1 UNKN 0 9 1 3 FUNCTION betwnStr ( - 9 EXEC 5 31 1 20 RETURN ( - 16 EXEC 5 1 1 1 END; - - - -PL/SQL procedure successfully completed. - -utPLSQL 2.3 ut_calc_secs_between Example - -Procedure CALC_SECS_BETWEEN compiled - - -Package UT_CALC_SECS_BETWEEN compiled - - -Package Body UT_CALC_SECS_BETWEEN compiled - - - wtPLSQL 1.1.0 - Run ID 40: 29-Jun-2018 01:04:20 PM - - Test Results for WTP_DEMO.UT_CALC_SECS_BETWEEN - Total Test Cases: 0 Total Assertions: 2 - Minimum Interval msec: 0 Failed Assertions: 0 - Average Interval msec: 137 Error Assertions: 0 - Maximum Interval msec: 274 Test Yield: 100.00% - Total Run Time (sec): 0.3 - - Code Coverage for PROCEDURE WTP_DEMO.CALC_SECS_BETWEEN - Ignored Lines: 0 Total Profiled Lines: 3 - Excluded Lines: 0 Total Executed Lines: 2 - Minimum LineExec usec: 0 Not Executed Lines: 0 - Average LineExec usec: 3 Unknown Lines: 1 - Maximum LineExec usec: 9 Code Coverage: 100.00% - Trigger Source Offset: 0 - - - WTP_DEMO.UT_CALC_SECS_BETWEEN Test Result Details (Test Run ID 40) ------------------------------------------------------------ - PASS 274ms Same dates. EQ - Expected "0" and got "0" - PASS 0ms Exactly one day. EQ - Expected "86400" and got "86400" - - - WTP_DEMO.CALC_SECS_BETWEEN PROCEDURE Code Coverage Details (Test Run ID 40) -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1 UNKN 0 3 1 2 PROCEDURE calc_secs_between ( - 10 EXEC 2 12 3 9 secs := (date2 - date1) * 24 * 60 * 60; - 11 EXEC 2 1 0 1 END; - - - -PL/SQL procedure successfully completed. - -utPLSQL 2.3 ut_str Example - -Package STR compiled - - -Package Body STR compiled - - - wtPLSQL 1.1.0 - Run ID 41: 29-Jun-2018 01:04:21 PM - - Test Results for WTP_DEMO.STR - Total Test Cases: 0 Total Assertions: 3 - Minimum Interval msec: 0 Failed Assertions: 0 - Average Interval msec: 102 Error Assertions: 0 - Maximum Interval msec: 305 Test Yield: 100.00% - Total Run Time (sec): 0.3 - - Code Coverage for PACKAGE BODY WTP_DEMO.STR - Ignored Lines: 14 Total Profiled Lines: 25 - Excluded Lines: 1 Total Executed Lines: 4 - Minimum LineExec usec: 0 Not Executed Lines: 5 - Average LineExec usec: 1 Unknown Lines: 1 - Maximum LineExec usec: 9 Code Coverage: 44.40% - Trigger Source Offset: 0 - - - WTP_DEMO.STR Test Result Details (Test Run ID 41) ------------------------------------------------------------ - PASS 305ms Typical Valid Usage. EQ - Expected "is is" and got "is is" - PASS 1ms Test Negative Start. EQ - Expected "ing" and got "ing" - PASS 0ms Start bigger than end. ISNULL - Expected NULL and got "" - - - WTP_DEMO.STR PACKAGE BODY Code Coverage Details (Test Run ID 41) -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 3 UNKN 0 4 1 2 FUNCTION betwn ( - 10 EXEC 3 2 0 1 l_start PLS_INTEGER := start_in; - 12 EXEC 3 1 0 1 IF l_start = 0 - 14#NOTX# 0 0 0 0 l_start := 1; - 17 EXEC 3 12 1 9 RETURN (SUBSTR ( - 25 EXEC 3 0 0 0 END; - 27 EXCL 0 0 0 0 FUNCTION betwn2 ( - 36#NOTX# 0 0 0 0 IF end_in < 0 - 38#NOTX# 0 0 0 0 RETURN betwn (string_in, start_in, end_in); - 40#NOTX# 0 0 0 0 RETURN (SUBSTR ( - 51#NOTX# 0 0 0 0 END; - 55 IGNR 0 1 1 1 PROCEDURE ut_setup - 58 IGNR 1 2 2 2 NULL; - 61 IGNR 0 0 0 0 PROCEDURE ut_teardown - 64 IGNR 1 0 0 0 NULL; - 68 IGNR 0 5 5 5 PROCEDURE ut_betwn - 71 IGNR 1 37 1 36 utassert.eq ( - 76 IGNR 1 2 1 1 utassert.eq ( - 81 IGNR 1 3 1 2 utassert.isnull ( - 85 IGNR 1 0 0 0 END; - 88 IGNR 0 2 2 2 PROCEDURE wtplsql_run IS - 90 IGNR 1 1 1 1 ut_setup; - 91 IGNR 1 1 1 1 ut_betwn; - 92 IGNR 1 0 0 0 ut_teardown; -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 93 IGNR 1 1 1 1 END wtplsql_run; - - - -PL/SQL procedure successfully completed. - -utPLSQL 2.3 ut_truncit Example - -Procedure TRUNCIT compiled - - -Function TABCOUNT compiled - - -Package UT_TRUNCIT compiled - - -Package Body UT_TRUNCIT compiled - - - wtPLSQL 1.1.0 - Run ID 42: 29-Jun-2018 01:04:22 PM - - Test Results for WTP_DEMO.UT_TRUNCIT - Total Test Cases: 0 Total Assertions: 1 - Minimum Interval msec: 363 Failed Assertions: 0 - Average Interval msec: 363 Error Assertions: 0 - Maximum Interval msec: 363 Test Yield: 100.00% - Total Run Time (sec): 0.4 - - Code Coverage for PROCEDURE WTP_DEMO.TRUNCIT - Ignored Lines: 0 Total Profiled Lines: 3 - Excluded Lines: 0 Total Executed Lines: 2 - Minimum LineExec usec: 3 Not Executed Lines: 0 - Average LineExec usec: 7432 Unknown Lines: 1 - Maximum LineExec usec: 14854 Code Coverage: 100.00% - Trigger Source Offset: 0 - - - WTP_DEMO.UT_TRUNCIT Test Result Details (Test Run ID 42) ------------------------------------------------------------ - PASS 363ms Test of TRUNCIT. EQ - Expected "0" and got "0" - - - WTP_DEMO.TRUNCIT PROCEDURE Code Coverage Details (Test Run ID 42) -Source TotTime MinTime MaxTime - Line Stat Occurs (usec) (usec) (usec) Text ------- ---- ------ --------- ------- --------- ------------ - 1 UNKN 0 5 5 5 PROCEDURE truncit ( - 7 EXEC 1 14861 7 14854 EXECUTE IMMEDIATE 'truncate table ' || NVL (sch, USER) || '.' || tab; - 8 EXEC 1 3 3 3 END; - - - -PL/SQL procedure successfully completed. - diff --git a/src/demo/uninstall.sql b/src/demo/uninstall.sql index 6ded718..11c1334 100644 --- a/src/demo/uninstall.sql +++ b/src/demo/uninstall.sql @@ -2,8 +2,8 @@ spool uninstall set serveroutput on size unlimited format truncated -@common_setup.sql +@../common_setup.sql -drop user &schema_owner. cascade; +drop user &demo_owner. cascade; spool off diff --git a/src/demo/uninstallO.LST b/src/demo/uninstallO.LST deleted file mode 100644 index 52c0641..0000000 --- a/src/demo/uninstallO.LST +++ /dev/null @@ -1,5 +0,0 @@ -old:drop user &schema_owner. cascade -new:drop user wtp_demo cascade - -User WTP_DEMO dropped. - diff --git a/src/demo/ut_betwnstr.sql b/src/demo/ut_betwnstr.sql index a7e6518..bdbc58a 100644 --- a/src/demo/ut_betwnstr.sql +++ b/src/demo/ut_betwnstr.sql @@ -16,6 +16,7 @@ BEGIN ); END; / +show errors CREATE OR REPLACE PACKAGE ut_betwnstr IS @@ -26,6 +27,7 @@ IS PROCEDURE wtplsql_run; END ut_betwnstr; / +show errors CREATE OR REPLACE PACKAGE BODY ut_betwnstr IS @@ -101,6 +103,7 @@ IS END ut_betwnstr; / +show errors set serveroutput on size unlimited format truncated diff --git a/src/demo/ut_calc_secs_between.sql b/src/demo/ut_calc_secs_between.sql index 32ec94c..3e802b4 100644 --- a/src/demo/ut_calc_secs_between.sql +++ b/src/demo/ut_calc_secs_between.sql @@ -12,6 +12,7 @@ BEGIN secs := (date2 - date1) * 24 * 60 * 60; END; / +show errors CREATE OR REPLACE PACKAGE ut_calc_secs_between IS @@ -23,6 +24,7 @@ IS PROCEDURE wtplsql_run; END ut_calc_secs_between; / +show errors CREATE OR REPLACE PACKAGE BODY ut_calc_secs_between IS @@ -83,6 +85,7 @@ IS END ut_calc_secs_between; / +show errors set serveroutput on size unlimited format truncated diff --git a/src/demo/ut_str.sql b/src/demo/ut_str.sql index 2b0dba1..7fedb8b 100644 --- a/src/demo/ut_str.sql +++ b/src/demo/ut_str.sql @@ -25,6 +25,7 @@ IS PROCEDURE wtplsql_run; END str; / +show errors /* Formatted on 2001/11/19 15:15 (Formatter Plus v4.5.2) */ CREATE OR REPLACE PACKAGE BODY str @@ -123,6 +124,7 @@ IS END str; / +show errors set serveroutput on size unlimited format truncated diff --git a/src/demo/ut_truncit.sql b/src/demo/ut_truncit.sql index 06ac7e0..257b544 100644 --- a/src/demo/ut_truncit.sql +++ b/src/demo/ut_truncit.sql @@ -9,6 +9,7 @@ BEGIN EXECUTE IMMEDIATE 'truncate table ' || NVL (sch, USER) || '.' || tab; END; / +show errors /*file tabcount.sf */ CREATE OR REPLACE FUNCTION tabcount ( @@ -28,6 +29,7 @@ EXCEPTION RETURN NULL; END; / +show errors CREATE OR REPLACE PACKAGE ut_truncit IS @@ -39,6 +41,7 @@ IS PROCEDURE wtplsql_run; END ut_truncit; / +show errors /*file ut_truncit.pkb */ CREATE OR REPLACE PACKAGE BODY ut_truncit @@ -83,6 +86,7 @@ IS END wtplsql_run; END ut_truncit; / +show errors set serveroutput on size unlimited format truncated diff --git a/src/persist/install.sql b/src/persist/install.sql index d83d39c..ccb58a3 100644 --- a/src/persist/install.sql +++ b/src/persist/install.sql @@ -5,17 +5,22 @@ -- Run as SYS -- --- Capture output + +prompt +prompt Capture output + spool install set showmode off set serveroutput on size unlimited format truncated -- Shared Setup Script -@common_setup.sql +@../common_setup.sql WHENEVER SQLERROR exit SQL.SQLCODE --- Connect as SCHEMA_OWNER +prompt +prompt Connect as SCHEMA_OWNER + connect &schema_owner./&schema_owner.&connect_string. set serveroutput on size unlimited format truncated @@ -30,39 +35,62 @@ end; WHENEVER SQLERROR continue --- --- Run Oracle's Profiler Table Installation --- Note1: Tables converted to Global Temporary --- Note2: Includes "Drop Table" and "Drop Sequence" statements --- + +prompt +prompt Run Oracle's Profiler Table Installation +prompt Note1: Tables converted to Global Temporary +prompt Note2: Includes "Drop Table" and "Drop Sequence" statements + @proftab.sql @proftab_comments.sql --- + create index plsql_profiler_runs_idx1 on plsql_profiler_runs (run_date); --- Package Specifications -@wtdbout.pks + +prompt +prompt Install Package Specifications + +@wt_dbout.pks / -@wtjob.pks +show errors + +@wt_job.pks / +show errors + @wt_profile.pks / +show errors + @wt_result.pks / +show errors + @wt_test_run.pks / +show errors + @wt_test_run_stat.pks / +show errors + @wt_test_runner.pks / +show errors + @wt_testcase.pks / +show errors + @wt_text_report.pks / +show errors + + +prompt +prompt Install Tables - Must be ordered for foreign keys --- Core Tables --- Must be ordered for foreign keys @wt_test_runners.tab @wt_testcases.tab @wt_dbouts.tab @@ -71,7 +99,10 @@ create index plsql_profiler_runs_idx1 @wt_profiles.tab @wt_testcase_stats.tab --- Install Views + +prompt +prompt Install Views + @wt_dbout_runs_vw.vw @wt_profiles_vw.vw @wt_results_vw.vw @@ -79,25 +110,57 @@ create index plsql_profiler_runs_idx1 @wt_test_runs_vw.vw @wt_testcase_runs_vw.vw --- Package Bodies + +prompt +prompt Install Package Bodies + @wtdbout.pkb / +show errors + @wtjob.pkb / +show errors + @wt_profile.pkb / +show errors + @wt_result.pkb / +show errors + @wt_test_run.pkb / +show errors + @wt_test_run_stat.pkb / +show errors + @wt_test_runner.pkb / +show errors + @wt_testcase.pkb / +show errors + @wt_text_report.pkb / +show errors + + +prompt +prompt Configuration Data + +-- Remove this report after testing because there is storage +delete from hooks + where hook_name = 'after_test_run' + and run_string = 'begin wt_core_report.dbms_out(10); end;'; + +commit; + set showmode on spool off diff --git a/src/persist/wt_dbout.pkb b/src/persist/wt_dbout.pkb index eabff54..92f3765 100644 --- a/src/persist/wt_dbout.pkb +++ b/src/persist/wt_dbout.pkb @@ -17,7 +17,7 @@ function get_id is l_id number; begin - select id into rec.id from wt_testcases + select id into rec.id from wt_dbouts where owner = in_owner and name = in_name and type = in_type; @@ -25,7 +25,7 @@ begin exception when NO_DATA_FOUND then - return l_id; + return NULL; end get_id; ------------------------------------------------------------ @@ -35,6 +35,7 @@ function dim_id ,in_type in varchar2) return number is + PRAGMA AUTONOMOUS_TRANSACTION rec wt_dbouts%ROWTYPE; begin rec.id := get_id (in_owner, in_name, in_type); @@ -45,6 +46,7 @@ begin rec.name := in_name; rec.type := in_type; insert into wt_dbouts values rec; + commit; end if; return rec.id; end get_id; diff --git a/src/persist/wt_dbout_runs_vw.vw b/src/persist/wt_dbout_runs_vw.vw index 4eb6986..384f46d 100644 --- a/src/persist/wt_dbout_runs_vw.vw +++ b/src/persist/wt_dbout_runs_vw.vw @@ -3,37 +3,41 @@ -- Database Object Under Test Runs Table View Installation -- -create view wt_dbout_runs_vw as -select tr.dbout_id +create or replace force view wt_dbout_runs_vw as +select run.id TEST_RUN_ID + ,run.dbout_id ,db.owner DBOUT_OWNER ,db.name DBOUT_NAME ,db.type DBOUT_TYPE - ,tr.test_runner_id - ,tnr.owner TEST_RUNNER_OWNER - ,tnr.name TEST_RUNNER_NAME - ,tr.id TEST_RUN_ID - ,tr.is_last_run - ,tr.trigger_offset - ,tr.profiler_runid - ,tr.error_message - ,coverage_pct number(3) - ,profiled_lines number(6) - ,executed_lines number(6) - ,ignored_lines number(6) - ,excluded_lines number(6) - ,notexec_lines number(6) - ,unknown_lines number(6) - ,min_executed_usecs number(11) - ,avg_executed_usecs number(11) - ,max_executed_usecs number(11) - ,tot_executed_usecs number(11) - from wt_test_runs tr + ,run.test_runner_id + ,tr.owner TEST_RUNNER_OWNER + ,tr.name TEST_RUNNER_NAME + ,run.start_dtm + ,run.end_dtm + ,run.is_last_run + ,run.error_message + ,run.profiler_runid + ,run.trigger_offset + ,run.coverage_pct + ,run.profiled_lines + ,run.execute_lines + ,run.ignored_lines + ,run.excluded_lines + ,run.notexec_lines + ,run.unknown_lines + ,run.exec_tot_usecs + ,run.exec_min_usecs + ,run.exec_max_usecs + ,run.exec_avg_usecs + from wt_test_runs run join wt_dbouts db - on db.id = tr.dbout_id - join wt_test_runners tnr - on tnr.id = tr.test_runner_id; + on db.id = run.dbout_id + join wt_test_runners tr + on tr.id = run.test_runner_id + where run.dbout_id is not null; comment on table wt_dbout_runs_vw is 'Test Run data for each execution of a Test Runner.'; +comment on column wt_dbout_runs_vw.test_run_id is 'Primary (Surrogate) Key for each Test Run'; comment on column wt_dbout_runs_vw.dbout_id is 'Surrogate Key to the Database Object Under Test (DBOUT).'; comment on column wt_dbout_runs_vw.dbout_owner is 'Owner of the Database Object Under Test (DBOUT).'; comment on column wt_dbout_runs_vw.dbout_name is 'Name of the Database Object Under Test (DBOUT).'; @@ -41,21 +45,22 @@ comment on column wt_dbout_runs_vw.dbout_type is 'Type of the Database Object Un comment on column wt_dbout_runs_vw.test_runner_id is 'Surrogate Key the Test Runner package.'; comment on column wt_dbout_runs_vw.test_runner_owner is 'Owner of the Test Runner package.'; comment on column wt_dbout_runs_vw.test_runner_name is 'Name of the Test Runner package.'; -comment on column wt_dbout_runs_vw.test_run_id is 'Primary (Surrogate) Key for each Test Run'; +comment on column wt_dbout_runs_vw.start_dtm is 'Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 2'; +comment on column wt_dbout_runs_vw.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; comment on column wt_dbout_runs_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; -comment on column wt_dbout_runs_vw.trigger_offset is 'Calculated offset from start of Trigger Source to start of Trigger PL/SQL Block.'; -comment on column wt_dbout_runs_vw.profiler_runid is 'DBMS_PROFILER unique run identifier from plsql_profiler_runnumber sequence'; comment on column wt_dbout_runs_vw.error_message is 'Optional Error messages from this Test Run.'; -comment on column wt_profiler.coverage_pct is 'Percentage of executed source lines to valid executable source lines.'; -comment on column wt_profiler.profiled_lines is 'Total number of source lines as counted by DBMS_PROFILER'; -comment on column wt_profiler.executed_lines is 'Number of source lines executed'; -comment on column wt_profiler.ignored_lines is 'Number of source lines ignored as uncountable'; -comment on column wt_profiler.excluded_lines is 'Number of source lines excluded due to unexplained DBMS_PROFILER metrics'; -comment on column wt_profiler.notexec_lines is 'Number of source lines not executed'; -comment on column wt_profiler.unknown_lines is 'Number of source lines that have unexplained DBMS_PROFILER metrics'; -comment on column wt_profiler.min_executed_usecs is 'Minumum execution time for a line of source in microseconds'; -comment on column wt_profiler.avg_executed_usecs is 'Average execution time for a line of source in microseconds'; -comment on column wt_profiler.max_executed_usecs is 'Maximum execution time for a line of source in microseconds'; -comment on column wt_profiler.tot_executed_usecs is 'Total (Sum) of execution times for a line of source in microseconds'; +comment on column wt_dbout_runs_vw.profiler_runid is 'DBMS_PROFILER unique run identifier from plsql_profiler_runnumber sequence'; +comment on column wt_dbout_runs_vw.trigger_offset is 'Calculated offset from start of Trigger Source to start of Trigger PL/SQL Block.'; +comment on column wt_dbout_runs_vw.coverage_pct is 'Percentage of executed source lines to valid executable source lines.'; +comment on column wt_dbout_runs_vw.profiled_lines is 'Total number of source lines as counted by DBMS_PROFILER'; +comment on column wt_dbout_runs_vw.executed_lines is 'Number of source lines executed'; +comment on column wt_dbout_runs_vw.ignored_lines is 'Number of source lines ignored as uncountable'; +comment on column wt_dbout_runs_vw.excluded_lines is 'Number of source lines excluded due to unexplained DBMS_PROFILER metrics'; +comment on column wt_dbout_runs_vw.notexec_lines is 'Number of source lines not executed'; +comment on column wt_dbout_runs_vw.unknown_lines is 'Number of source lines that have unexplained DBMS_PROFILER metrics'; +comment on column wt_dbout_runs_vw.exec_tot_usecs is 'Total (Sum) of execution times for a line of source in microseconds'; +comment on column wt_dbout_runs_vw.exec_min_usecs is 'Minumum execution time for a line of source in microseconds'; +comment on column wt_dbout_runs_vw.exec_max_usecs is 'Maximum execution time for a line of source in microseconds'; +comment on column wt_dbout_runs_vw.exec_avg_usecs is 'Average execution time for a line of source in microseconds'; grant select on wt_dbout_runs_vw to public; diff --git a/src/persist/wt_profile.pks b/src/persist/wt_profile.pks index c2aeb37..21927eb 100644 --- a/src/persist/wt_profile.pks +++ b/src/persist/wt_profile.pks @@ -3,10 +3,10 @@ create or replace package wt_profile as TYPE rec_type is record - (test_run_id wt_test_runs.id%TYPE - ,dbout_owner wt_test_runs.dbout_owner%TYPE - ,dbout_name wt_test_runs.dbout_name%TYPE - ,dbout_type wt_test_runs.dbout_type%TYPE + (test_run_id number + ,dbout_owner varchar2 + ,dbout_name varchar2 + ,dbout_type varchar2 ,prof_runid binary_integer ,trigger_offset binary_integer ,error_message varchar2(4000)); diff --git a/src/persist/wt_profiles.tab b/src/persist/wt_profiles.tab index 6f86c91..c63d839 100644 --- a/src/persist/wt_profiles.tab +++ b/src/persist/wt_profiles.tab @@ -4,14 +4,14 @@ -- create table wt_profiles - (test_run_id number(38) constraint wt_profiles_nn1 not null - ,line number(6) constraint wt_profiles_nn2 not null - ,status varchar2(4) constraint wt_profiles_nn3 not null - ,total_occur number(9) constraint wt_profiles_nn4 not null - ,total_usecs number constraint wt_profiles_nn5 not null - ,min_usecs number constraint wt_profiles_nn6 not null - ,max_usecs number constraint wt_profiles_nn7 not null - ,text varchar2(4000) constraint wt_profiles_nn8 not null + (test_run_id number(38) + ,line number(6) + ,status varchar2(4) + ,tot_execs number(9) + ,tot_usecs number + ,min_usecs number + ,max_usecs number + ,text varchar2(4000) ,constraint wt_profiles_pk primary key (test_run_id, line) ,constraint wt_profiles_fk1 foreign key (test_run_id) references wt_test_runs (id) @@ -22,8 +22,8 @@ comment on table wt_profiles is 'PL/SQL Profiler data for Database Object Under comment on column wt_profiles.test_run_id is 'Foreign Key for the Test Run, Primary Key part 1.'; comment on column wt_profiles.line is 'Source code line number, Primary Key part 2.'; comment on column wt_profiles.status is 'Executed/NotExecuted/Excluded/Ignored/Unknown Status from the Profiler'; -comment on column wt_profiles.total_occur is 'Number of times this line was executed.'; -comment on column wt_profiles.total_usecs is 'Total time in microseconds spent executing this line.'; +comment on column wt_profiles.tot_execs is 'Number of times this line was executed.'; +comment on column wt_profiles.tot_usecs is 'Total time in microseconds spent executing this line.'; comment on column wt_profiles.min_usecs is 'Minimum execution time in microseconds for this line.'; comment on column wt_profiles.max_usecs is 'Maximum execution time in microseconds for this line.'; comment on column wt_profiles.text is 'Source code text for this line number.'; diff --git a/src/persist/wt_profiles_vw.vw b/src/persist/wt_profiles_vw.vw index 8417e98..1a8d4aa 100644 --- a/src/persist/wt_profiles_vw.vw +++ b/src/persist/wt_profiles_vw.vw @@ -3,53 +3,45 @@ -- Test Run Profiles View Installation -- -create view wt_profiles_vw as +create or replace force view wt_profiles_vw as select run.id TEST_RUN_ID + ,run.dbout_id + ,db.owner DBOUT_OWNER + ,db.name DBOUT_NAME + ,db.type DBOUT_TYPE ,run.test_runner_id ,tr.owner RUNNER_OWNER ,tr.name RUNNER_NAME - ,run.dbout_id - ,dbo.owner DBOUT_OWNER - ,dbo.name DBOUT_NAME - ,dbo.type DBOUT_TYPE - ,run.start_dtm - ,run.end_dtm - ,run.trigger_offset - ,run.profiler_runid - ,run.is_last_run - ,run.error_message - ,dbo.line - ,dbo.status - ,dbo.total_occur - ,dbo.total_usecs - ,dbo.min_usecs - ,dbo.max_usecs - ,dbo.text - from wt_profiles dbo - join wt_test_runs run - on run.dbout_id = dbo.id + ,pf.line + ,pf.status + ,pf.tot_execs + ,pf.tot_usecs + ,pf.min_usecs + ,pf.max_usecs + ,pf.text + from wt_test_runs run + join wt_dbouts db + on db.id = run.dbout_id join wt_test_runners tr on tr.id = run.test_runner_id; + join wt_profiles pf + on pf.id = run.dbout_id comment on table wt_profiles_vw is 'Test Run profile statistics for each execution of a Test Runner.'; comment on column wt_profiles_vw.test_run_id is 'Primary (Surrogate) Key for each Test Run'; -comment on column wt_profiles_vw.test_runner_id is 'Primary (Surrogate) Key for each Test Runner'; -comment on column wt_profiles_vw.runner_owner is 'Owner of the Test Runner package. Natural Key 1 part 1'; -comment on column wt_profiles_vw.runner_name is 'Name of the Test Runner package. Natural Key 1 part 2'; -comment on column wt_profiles_vw.id is 'Primary (Surrogate) Key for each Database Objects Under Test (DBOUT)'; +comment on column wt_profiles_vw.dbout_id is 'Primary (Surrogate) Key for each Database Objects Under Test (DBOUT)'; comment on column wt_profiles_vw.dbout_owner is 'Owner of the Database Object Under Test (DBOUT).'; comment on column wt_profiles_vw.dbout_name is 'Name of the Database Object Under Test (DBOUT).'; comment on column wt_profiles_vw.dbout_type is 'Type of the Database Object Under Test (DBOUT).'; -comment on column wt_profiles_vw.start_dtm is 'Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 2'; -comment on column wt_profiles_vw.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; -comment on column wt_profiles_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; -comment on column wt_profiles_vw.error_message is 'Optional Error messages from this Test Run.'; -comment on column wt_profiles.line is 'Source code line number, Primary Key part 2.'; -comment on column wt_profiles.status is 'Executed/NotExecuted/Excluded/Ignored/Unknown Status from the Profiler'; -comment on column wt_profiles.total_occur is 'Number of times this line was executed.'; -comment on column wt_profiles.total_usecs is 'Total time in microseconds spent executing this line.'; -comment on column wt_profiles.min_usecs is 'Minimum execution time in microseconds for this line.'; -comment on column wt_profiles.max_usecs is 'Maximum execution time in microseconds for this line.'; -comment on column wt_profiles.text is 'Source code text for this line number.'; +comment on column wt_profiles_vw.test_runner_id is 'Primary (Surrogate) Key for each Test Runner'; +comment on column wt_profiles_vw.runner_owner is 'Owner of the Test Runner package. Natural Key 1 part 1'; +comment on column wt_profiles_vw.runner_name is 'Name of the Test Runner package. Natural Key 1 part 2'; +comment on column wt_profiles_vw.line is 'Source code line number, Primary Key part 2.'; +comment on column wt_profiles_vw.status is 'Executed/NotExecuted/Excluded/Ignored/Unknown Status from the Profiler'; +comment on column wt_profiles_vw.tot_execs is 'Number of times this line was executed.'; +comment on column wt_profiles_vw.tot_usecs is 'Total time in microseconds spent executing this line.'; +comment on column wt_profiles_vw.min_usecs is 'Minimum execution time in microseconds for this line.'; +comment on column wt_profiles_vw.max_usecs is 'Maximum execution time in microseconds for this line.'; +comment on column wt_profiles_vw.text is 'Source code text for this line number.'; grant select on wt_profiles_vw to public; diff --git a/src/persist/wt_results.tab b/src/persist/wt_results.tab index 34fd5be..ca12632 100644 --- a/src/persist/wt_results.tab +++ b/src/persist/wt_results.tab @@ -4,13 +4,13 @@ -- create table wt_results - (test_run_id number(38) constraint wt_results_nn1 not null - ,result_seq number(8) constraint wt_results_nn2 not null - ,testcase_id number(38) constraint wt_results_nn3 not null - ,executed_dtm timestamp(6) constraint wt_results_nn4 not null - ,interval_msecs number(10,3) constraint wt_results_nn5 not null - ,assertion varchar2(15) constraint wt_results_nn6 not null - ,status varchar2(4) constraint wt_results_nn7 not null + (test_run_id number(38) + ,result_seq number(8) + ,testcase_id number(38) + ,executed_dtm timestamp(6) + ,interval_msecs number(10,3) + ,assertion varchar2(15) + ,status varchar2(4) ,message varchar2(200) ,details varchar2(4000) ,constraint wt_results_pk primary key (test_run_id, result_seq) @@ -18,7 +18,6 @@ create table wt_results references wt_test_runs (id) ,constraint wt_results_fk2 foreign key (testcase_id) references wt_testcases (id) - ,constraint wt_results_ck1 check (status in ('PASS','FAIL')) ) pctfree 0; create index wt_results_ix1 @@ -29,11 +28,11 @@ comment on column wt_results.test_run_id is 'Foreign Key for the Test Run, Prima comment on column wt_results.result_seq is 'Sequence number for this Result, Primary Key part 2.'; comment on column wt_results.testcase_id is 'Foreign Key for the Test Case.'; comment on column wt_results.executed_dtm is 'Date/Time (with Fractional Seconds) this Result was captured'; -comment on column wt_results.interval_msecs is 'Interval time in milliseonds since the previous Result or start of the Test Run.'; +comment on column wt_results.interval_msecs is 'Interval time in milliseconds since the previous Result or start of the Test Run.'; comment on column wt_results.assertion is 'Name of the Assertion Test performed'; comment on column wt_results.status is 'PASS/FAIL Status from the Assertion'; -comment on column wt_results.details is 'Assertion Details, i.e. Expected Value and Actual Value'; comment on column wt_results.message is 'Optional test identifier that helps connect an Assertion to the Test Runner.'; +comment on column wt_results.details is 'Assertion Details, i.e. Expected Value and Actual Value'; grant select on wt_results to public; grant delete on wt_results to public; diff --git a/src/persist/wt_results_vw.vw b/src/persist/wt_results_vw.vw index 3db8447..6710674 100644 --- a/src/persist/wt_results_vw.vw +++ b/src/persist/wt_results_vw.vw @@ -3,7 +3,7 @@ -- Results View Installation -- -create view wt_results_vw as +create or replace force view wt_results_vw as select tr.test_runner_id ,tr.test_runner_owner ,tr.test_runner_name diff --git a/src/persist/wt_scheduler_jobs.vw b/src/persist/wt_scheduler_jobs.vw index bc91e10..dfcefef 100644 --- a/src/persist/wt_scheduler_jobs.vw +++ b/src/persist/wt_scheduler_jobs.vw @@ -3,7 +3,7 @@ -- User Scheduler Jobs View Installation -- -create view wt_scheduler_jobs_vw as +create or replace force view wt_scheduler_jobs_vw as select round(log_id) LOG_ID ,systimestamp - elapsed_time START_DATE ,job_name diff --git a/src/persist/wt_test_run.pks b/src/persist/wt_test_run.pks index 077770b..c08ab61 100644 --- a/src/persist/wt_test_run.pks +++ b/src/persist/wt_test_run.pks @@ -26,4 +26,4 @@ as procedure WTPLSQL_RUN; $END -end wt_testcase; +end wt_test_run; diff --git a/src/persist/wt_test_runner.pkb b/src/persist/wt_test_runner.pkb index eb6bae9..7b880a9 100644 --- a/src/persist/wt_test_runner.pkb +++ b/src/persist/wt_test_runner.pkb @@ -29,39 +29,60 @@ begin and name = in_name; return l_id; exception when NO_DATA_FOUND then - return null; + return NULL; end get_id; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN procedure t_get_id is - l_id number; + l_id number; begin - wt_assert.g_testcase := 't_get_id Happy Path 1'; -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 't_get_id Setup'; delete from wt_test_runners where owner = C_OWNER and name = C_NAME; + wt_assert.isnotnull + (msg_in => 'Number of Rows deleted' + ,check_query_in => SQL%ROWCOUNT); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eqqueryvalue + (msg_in => 'Number of Rows should be 0' + ,check_query_in => 'select count(*) from wt_test_runners' || + ' where owner = ' || C_OWNER || + ' and name = ' || C_NAME + ,against_value_in => 0); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 't_get_id Happy Path 1'; wt_assert.isnull (msg_in => 'Check for Null return' ,check_this_in => get_id(C_OWNER, C_NAME)); -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 't_get_id Happy Path 2'; insert into wt_test_runners (id, owner, name) values (wt_test_runners_seq.nextval, C_OWNER, C_NAME) returning id into l_id; wt_assert.eq - (msg_in => 'Check for Not Null return' + (msg_in => 'Check ID return' ,check_this_in => get_id(C_OWNER, C_NAME) ,against_this_in => l_id); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 't_get_id Teardown'; delete from wt_test_runners - where id = l_id; + where owner = C_OWNER + and name = C_NAME; + wt_assert.eq + (msg_in => 'Number of Rows deleted' + ,check_query_in => SQL%ROWCOUNT + ,against_this_in => 1); + commit; end t_get_id; $END ----------------%WTPLSQL_end_ignore_lines%---------------- ------------------------------------------------------------ -function load_dim +function dim_id (in_owner in varchar2 ,in_name in varchar2) return number @@ -78,32 +99,51 @@ begin insert into wt_dbouts values rec; end if; return rec.id; -end load_dim; +end dim_id; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN procedure t_dim_id is - l_id number; + l_id number; begin - wt_assert.g_testcase := 't_get_id Happy Path 1'; -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 't_dim_id Setup'; delete from wt_test_runners where owner = C_OWNER and name = C_NAME; - wt_assert.isnull - (msg_in => 'Check for Null return' - ,check_this_in => get_id(C_OWNER, C_NAME)); + wt_assert.isnotnull + (msg_in => 'Number of Rows deleted' + ,check_query_in => SQL%ROWCOUNT); -------------------------------------- WTPLSQL Testing -- - insert into wt_test_runners (id, owner, name) - values (wt_test_runners_seq.nextval, C_OWNER, C_NAME) - returning id into l_id; + wt_assert.eqqueryvalue + (msg_in => 'Number of Rows should be 0' + ,check_query_in => 'select count(*) from wt_test_runners' || + ' where owner = ' || C_OWNER || + ' and name = ' || C_NAME + ,against_value_in => 0); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 't_dim_id Happy Path 1'; + l_id := dim_id(C_OWNER, C_NAME); + wt_assert.isnotnull + (msg_in => 'Check ID return 1' + ,check_this_in => l_id); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 't_dim_id Happy Path 2'; wt_assert.eq - (msg_in => 'Check for Not Null return' - ,check_this_in => get_id(C_OWNER, C_NAME) - ,against_this_in => l_id); + (msg_in => 'Check ID return 2' + ,check_this_in => dim_id(C_OWNER, C_NAME) + ,against_this_in => l_id); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 't_dim_id Teardown'; delete from wt_test_runners - where id = l_id; + where owner = C_OWNER + and name = C_NAME; + wt_assert.eq + (msg_in => 'Number of Rows deleted' + ,check_query_in => SQL%ROWCOUNT + ,against_this_in => 1); + commit; end t_dim_id; $END ----------------%WTPLSQL_end_ignore_lines%---------------- @@ -117,6 +157,55 @@ begin where id = in_test_runner_id; end delete_records; +$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ +$THEN + procedure t_delete_records + is + l_id number; + begin + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 't_delete_records Setup'; + delete from wt_test_runners + where owner = C_OWNER + and name = C_NAME; + wt_assert.isnotnull + (msg_in => 'Number of Rows deleted' + ,check_query_in => SQL%ROWCOUNT); + -------------------------------------- WTPLSQL Testing -- + insert into wt_test_runners (id, owner, name) + values (wt_test_runners_seq.nextval, C_OWNER, C_NAME) + returning id into l_id; + wt_assert.isnotnull + (msg_in => 'Check for ID' + ,check_this_in => l_id); + -------------------------------------- WTPLSQL Testing -- + wt_assert.eqqueryvalue + (msg_in => 'Number of Rows should be 1' + ,check_query_in => 'select count(*) from wt_test_runners' || + ' where owner = ' || C_OWNER || + ' and name = ' || C_NAME + ,against_value_in => 1); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 't_delete_records Happy Path 1'; + delete_records(l_id); + wt_assert.eqqueryvalue + (msg_in => 'Number of Rows should be 0' + ,check_query_in => 'select count(*) from wt_test_runners' || + ' where owner = ' || C_OWNER || + ' and name = ' || C_NAME + ,against_value_in => 0); + -------------------------------------- WTPLSQL Testing -- + wt_assert.g_testcase := 't_delete_records Happy Path 2'; + delete_records(l_id); + wt_assert.eqqueryvalue + (msg_in => 'Number of Rows should still be 0' + ,check_query_in => 'select count(*) from wt_test_runners' || + ' where owner = ' || C_OWNER || + ' and name = ' || C_NAME + ,against_value_in => 0); + commit; + end t_dim_id; +$END ----------------%WTPLSQL_end_ignore_lines%---------------- --==============================================================-- @@ -128,7 +217,7 @@ $THEN -------------------------------------- WTPLSQL Testing -- t_get_id; t_dim_id; - delete_records; + t_delete_records; end; $END ----------------%WTPLSQL_end_ignore_lines%---------------- --==============================================================-- diff --git a/src/persist/wt_test_runner.pks b/src/persist/wt_test_runner.pks index a4717a7..f42f16a 100644 --- a/src/persist/wt_test_runner.pks +++ b/src/persist/wt_test_runner.pks @@ -2,18 +2,23 @@ create or replace package wt_test_runner authid definer as + -- Return a Test Runner Surrogate Key. + -- Return NULL is the Test Runner does not exist. function get_id (in_owner in varchar2 ,in_name in varchar2) return number; - function load_dim + -- Return a Test Runner Surrogate Key. + -- Add the Test Runner if it does not exist. + function dim_id (in_owner in varchar2 ,in_name in varchar2) return number; + -- Delete all records for this Test Runner procedure delete_records - (in_id in number); + (in_test_runner_id in number); -- WtPLSQL Self Test Procedures -- diff --git a/src/persist/wt_test_runs.tab b/src/persist/wt_test_runs.tab index 8259b2d..8ae14cd 100644 --- a/src/persist/wt_test_runs.tab +++ b/src/persist/wt_test_runs.tab @@ -8,39 +8,41 @@ create sequence wt_test_runs_seq order; grant select on wt_test_runs_seq to public; create table wt_test_runs - (id number(38) - ,test_runner_id number(38) - ,start_dtm timestamp(3) with time zone - ,end_dtm timestamp(3) with time zone - ,fst_assrt_dtm timestamp(3) with time zone - ,lst_assrt_dtm timestamp(3) with time zone - ,runner_sec number(6,1) - ,tc_cnt number(7) - ,tc_fail number(7) - ,tc_yield_pct number(4,1) - ,asrt_cnt number(7) - ,asrt_fail number(7) - ,asrt_yield_pct number(4,1) - ,asrt_min_msec number(10) - ,asrt_max_msec number(10) - ,asrt_tot_msec number(10) - ,asrt_sos_msec number(20) - ,dbout_id number(38) - ,trigger_offset number(6) - ,profiler_runid number(38) - ,coverage_pct number(3) - ,profiled_lines number(6) - ,executed_lines number(6) - ,ignored_lines number(6) - ,excluded_lines number(6) - ,notexec_lines number(6) - ,unknown_lines number(6) - ,min_executed_usecs number(11) - ,avg_executed_usecs number(11) - ,max_executed_usecs number(11) - ,tot_executed_usecs number(11) - ,is_last_run varchar2(1) - ,error_message varchar2(4000) + (id number(38) + ,test_runner_id number(38) + ,start_dtm timestamp(3) with local time zone + ,end_dtm timestamp(3) with local time zone + ,runner_sec number(6,1) + ,is_last_run varchar2(1) + ,error_message varchar2(4000) + ,tc_cnt number(7) + ,tc_fail number(7) + ,tc_yield_pct number(4,1) + ,asrt_fst_dtm timestamp(3) with local time zone + ,asrt_lst_dtm timestamp(3) with local time zone + ,asrt_cnt number(7) + ,asrt_fail number(7) + ,asrt_yield_pct number(4,1) + ,asrt_min_msec number(10) + ,asrt_max_msec number(10) + ,asrt_avg_msec number(10) + ,asrt_tot_msec number(10) + ,asrt_sos_msec number(20) + ,asrt_std_msec number(20) + ,dbout_id number(38) + ,trigger_offset number(6) + ,profiler_runid number(38) + ,coverage_pct number(3) + ,profiled_lines number(6) + ,executed_lines number(6) + ,ignored_lines number(6) + ,excluded_lines number(6) + ,notexec_lines number(6) + ,unknown_lines number(6) + ,exec_min_usecs number(11) + ,exec_avg_usecs number(11) + ,exec_max_usecs number(11) + ,exec_tot_usecs number(11) ,constraint wt_test_runs_pk primary key (id) ,constraint wt_test_runs_nk1 unique (test_runner_id, start_dtm) ,constraint wt_test_runs_fk1 foreign key (test_runner_id) @@ -49,7 +51,6 @@ create table wt_test_runs references wt_dbouts (id) ,constraint wt_test_runs_fk3 foreign key (profiler_runid) references plsql_profiler_runs (runid) disable - ,constraint wt_test_runs_ck2 check (is_last_run = 'Y') ) pctfree 0; create index wt_test_runs_ix1 @@ -63,18 +64,22 @@ comment on column wt_test_runs.id is 'Primary (Surrogate) Key for each Test Run' comment on column wt_test_runs.test_runner_id is 'Surrogate Key the Test Runner package. Natural Key 1 part 1'; comment on column wt_test_runs.start_dtm is 'Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 2'; comment on column wt_test_runs.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; -comment on column wt_test_runs.fst_assrt_dtm is 'Date/Time of First Assertion'; -comment on column wt_test_runs.lst_assrt_dtm is 'Date/Time of Last Assertion'; comment on column wt_test_runs.runner_sec is 'Total Runtime for Test Runner in Seconds' +comment on column wt_test_runs.is_last_run is 'Flag "Y" to indicate this is the most recent run for this package owner/name'; +comment on column wt_test_runs.error_message is 'Error messages from this Test Run.'; comment on column wt_test_runs.tc_cnt is 'Number of Test Cases' comment on column wt_test_runs.tc_fail is 'Number of Failed Test Cases' comment on column wt_test_runs.tc_yield_pct is 'Percentage of successful test cases to total Test Cases.'; +comment on column wt_test_runs.asrt_fst_dtm is 'Date/Time of First Assertion'; +comment on column wt_test_runs.asrt_lst_dtm is 'Date/Time of Last Assertion'; comment on column wt_test_runs.asrt_cnt is 'Number of Assertions across all Test Cases' comment on column wt_test_runs.asrt_fail is 'Number of Assertion Failures across all Test Cases' comment on column wt_test_runs.asrt_yield_pct is 'Percentage of successful assertions to total assertions.'; comment on column wt_test_runs.asrt_min_msec is 'Minumum Assertion Interval in Milliseconds across all Test Cases' +comment on column wt_test_runs.asrt_avg_msec is 'Average Assertion Interval in Milliseconds across all Test Cases' comment on column wt_test_runs.asrt_max_msec is 'Maximum Assertion Interval in Milliseconds across all Test Cases' comment on column wt_test_runs.asrt_tot_msec is 'Total Assertion Intervals in Milliseconds across all Test Cases' +comment on column wt_test_runs.asrt_std_msec is 'Standard Deviation of Assertion Interval in Milliseconds across all Test Cases' comment on column wt_test_runs.asrt_sos_msec is 'Sum of Squares of Assertion Interval in Milliseconds across all Test Cases' comment on column wt_test_runs.dbout_id is 'Surrogate Key to the Database Object Under Test (DBOUT).'; comment on column wt_test_runs.trigger_offset is 'Calculated offset from start of Trigger Source to start of Trigger PL/SQL Block.'; @@ -90,8 +95,6 @@ comment on column wt_test_runs.exec_min_usecs is 'Minumum execution time for a l comment on column wt_test_runs.exec_avg_usecs is 'Average execution time for a line of source in microseconds'; comment on column wt_test_runs.exec_max_usecs is 'Maximum execution time for a line of source in microseconds'; comment on column wt_test_runs.exec_tot_usecs is 'Total (Sum) of execution times for a line of source in microseconds'; -comment on column wt_test_runs.is_last_run is 'Flag "Y" to indicate this is the most recent run for this package owner/name'; -comment on column wt_test_runs.error_message is 'Error messages from this Test Run.'; grant select on wt_test_runs to public; grant insert on wt_test_runs to public; diff --git a/src/persist/wt_test_runs_vw.vw b/src/persist/wt_test_runs_vw.vw index be92d10..d2205b5 100644 --- a/src/persist/wt_test_runs_vw.vw +++ b/src/persist/wt_test_runs_vw.vw @@ -3,43 +3,53 @@ -- Test Runs Table View Installation -- -create view wt_test_runs_vw as -select tr.id TEST_RUN_ID - ,tr.test_runner_id - ,tnr.owner TEST_RUNNER_OWNER - ,tnr.name TEST_RUNNER_NAME - ,tr.is_last_run - ,tr.start_dtm - ,tr.end_dtm - ,tr.error_message - ,stat.yield_pct - ,stat.testcases - ,stat.passes - ,stat.failures - ,stat.min_interval_msecs - ,stat.avg_interval_msecs - ,stat.max_interval_msecs - ,stat.tot_interval_msecs - from wt_test_runs tr - join wt_test_runners tnr - on tnr.id = tr.test_runner_id; +create or replace force view wt_test_runs_vw as +select run.id TEST_RUN_ID + ,run.test_runner_id + ,tr.owner TEST_RUNNER_OWNER + ,tr.name TEST_RUNNER_NAME + ,run.start_dtm + ,run.end_dtm + ,run.runner_sec + ,run.is_last_run + ,run.error_message + ,run.tc_cnt + ,run.tc_fail + ,run.tc_yield_pct + ,run.asrt_fst_dtm + ,run.asrt_lst_dtm + ,run.asrt_cnt + ,run.asrt_fail + ,run.asrt_yield_pct + ,run.asrt_min_msec + ,run.asrt_max_msec + ,run.asrt_tot_msec + ,run.asrt_sos_msec + from wt_test_runs run + join wt_test_runners tr + on tr.id = run.test_runner_id; comment on table wt_test_runs_vw is 'Test Run data for each execution of a Test Runner.'; comment on column wt_test_runs_vw.test_run_id is 'Primary (Surrogate) Key for each Test Run'; comment on column wt_test_runs_vw.test_runner_id is 'Surrogate Key the Test Runner package.'; comment on column wt_test_runs_vw.test_runner_owner is 'Owner of the Test Runner package.'; comment on column wt_test_runs_vw.test_runner_name is 'Name of the Test Runner package.'; -comment on column wt_test_runs_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; comment on column wt_test_runs_vw.start_dtm is 'Date/time (and fractional seconds) this Test Run started.'; comment on column wt_test_runs_vw.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; +comment on column wt_test_runs_vw.runner_sec is 'Total Runtime for Test Runner in Seconds' +comment on column wt_test_runs_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; comment on column wt_test_runs_vw.error_message is 'Optional Error messages from this Test Run.'; -comment on column wt_test_run_stats_vw.yield_pct is 'Percentage of successful test cases to total Test Cases.'; -comment on column wt_test_run_stats_vw.testcases is 'Total number of Test Cases.'; -comment on column wt_test_run_stats_vw.passes is 'Number of passed Test Cases.'; -comment on column wt_test_run_stats_vw.failures is 'Number of failed Test Cases.'; -comment on column wt_test_run_stats_vw.min_interval_msecs is 'Minimum tot_interval_msecs between assertions across all Test Cases'; -comment on column wt_test_run_stats_vw.avg_interval_msecs is 'Average tot_interval_msecs between assertions across all Test Cases'; -comment on column wt_test_run_stats_vw.max_interval_msecs is 'Maximum tot_interval_msecs between assertions across all Test Cases'; -comment on column wt_test_run_stats_vw.tot_interval_msecs is 'Total (sum) of tot_interval_msecs between assertions across all Test Cases'; +comment on column wt_test_runs_vw.tc_cnt is 'Number of Test Cases' +comment on column wt_test_runs_vw.tc_fail is 'Number of Failed Test Cases' +comment on column wt_test_runs_vw.tc_yield_pct is 'Percentage of successful test cases to total Test Cases.'; +comment on column wt_test_runs_vw.asrt_fst_dtm is 'Date/Time of First Assertion'; +comment on column wt_test_runs_vw.asrt_lst_dtm is 'Date/Time of Last Assertion'; +comment on column wt_test_runs_vw.asrt_cnt is 'Number of Assertions across all Test Cases' +comment on column wt_test_runs_vw.asrt_fail is 'Number of Assertion Failures across all Test Cases' +comment on column wt_test_runs_vw.asrt_yield_pct is 'Percentage of successful assertions to total assertions.'; +comment on column wt_test_runs_vw.asrt_min_msec is 'Minumum Assertion Interval in Milliseconds across all Test Cases' +comment on column wt_test_runs_vw.asrt_max_msec is 'Maximum Assertion Interval in Milliseconds across all Test Cases' +comment on column wt_test_runs_vw.asrt_tot_msec is 'Total Assertion Intervals in Milliseconds across all Test Cases' +comment on column wt_test_runs_vw.asrt_sos_msec is 'Sum of Squares of Assertion Interval in Milliseconds across all Test Cases' grant select on wt_test_runs_vw to public; diff --git a/src/persist/wt_testcase_runs_vw.vw b/src/persist/wt_testcase_runs_vw.vw index 56fb679..dc2f4fe 100644 --- a/src/persist/wt_testcase_runs_vw.vw +++ b/src/persist/wt_testcase_runs_vw.vw @@ -3,51 +3,51 @@ -- Test Cases Statistics View Installation -- -create view wt_testcase_runs_vw as -select stat.test_run_id +create or replace force view wt_testcase_runs_vw as +select run.id TEST_RUN_ID + ,run.testcase_id + ,tc.testcase ,run.test_runner_id ,tr.runner_owner ,tr.runner_name - ,stat.testcase_id - ,tc.testcase - ,run.start_dtm - ,run.end_dtm ,run.is_last_run ,run.error_message - ,stat.yield_pct - ,stat.asserts - ,stat.passes - ,stat.failures - ,stat.min_interval_msecs - ,stat.avg_interval_msecs - ,stat.max_interval_msecs - ,stat.tot_interval_msecs - from wt_testcase_stats stat - join wt_test_runs run - on run.id = stat.test_run_id - join wt_test_runners tr - on tr.id = run.test_runner_id + ,asrt_yield_pct + ,asrt_cnt + ,asrt_fail + ,asrt_pass + ,asrt_min_msecs + ,asrt_avg_msecs + ,asrt_max_msecs + ,asrt_tot_msecs + ,asrt_std_msecs + ,asrt_sos_msecs + from wt_test_runs run join wt_testcases tc on tc.id = stat.testcase_id; + join wt_test_runners tr + on tr.id = run.test_runner_id + join wt_testcase_stats stat + on stat.test_run_id = run.id; -comment on table wt_testcase_stats_vw is 'Test Run data statistics for each testcase in the execution of a Test Runner.'; -comment on column wt_testcase_stats_vw.test_run_id is 'Primary (Surrogate) Key for each Test Run'; -comment on column wt_testcase_stats_vw.test_runner_id is 'Primary (Surrogate) Key for each Test Runner'; -comment on column wt_testcase_stats_vw.runner_owner is 'Owner of the Test Runner package. Natural Key 1 part 1'; -comment on column wt_testcase_stats_vw.runner_name is 'Name of the Test Runner package. Natural Key 1 part 2'; -comment on column wt_testcases.testcase_id is 'Primary (Surrogate) Key for each Test Case'; -comment on column wt_testcases.testcase is 'The Test Case name'; -comment on column wt_testcase_stats_vw.start_dtm is 'Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 2'; -comment on column wt_testcase_stats_vw.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.'; -comment on column wt_testcase_stats_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; -comment on column wt_testcase_stats_vw.error_message is 'Optional Error messages from this Test Run.'; -comment on column wt_testcase_stats_vw.yield_pct is 'Percentage of successful assertions to total assertions.'; -comment on column wt_testcase_stats_vw.asserts is 'Total number of assetions for the Test Case.'; -comment on column wt_testcase_stats_vw.passes is 'Number of passed assertions for the Test Case.'; -comment on column wt_testcase_stats_vw.failures is 'Number of failed assertions for the Test Case.'; -comment on column wt_testcase_stats_vw.min_interval_msecs is 'Minimum interval time between assertions in milliseconds for the Test Case'; -comment on column wt_testcase_stats_vw.avg_interval_msecs is 'Average interval time between assertions in milliseconds for the Test Case'; -comment on column wt_testcase_stats_vw.max_interval_msecs is 'Maximum interval time between assertions in milliseconds for the Test Case'; -comment on column wt_testcase_stats_vw.tot_interval_msecs is 'Total (sum) of interval times between assertions in milliseconds for the Test Case'; +comment on table wt_testcase_runs_vw is 'Test Run data statistics for each testcase in the execution of a Test Runner.'; +comment on column wt_testcase_runs_vw.test_run_id is 'Primary (Surrogate) Key for each Test Run'; +comment on column wt_testcase_runs_vw.testcase_id is 'Primary (Surrogate) Key for each Test Case'; +comment on column wt_testcase_runs_vw.testcase is 'The Test Case name'; +comment on column wt_testcase_runs_vw.test_runner_id is 'Primary (Surrogate) Key for each Test Runner'; +comment on column wt_testcase_runs_vw.runner_owner is 'Owner of the Test Runner package. Natural Key 1 part 1'; +comment on column wt_testcase_runs_vw.runner_name is 'Name of the Test Runner package. Natural Key 1 part 2'; +comment on column wt_testcase_runs_vw.is_last_run is 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name'; +comment on column wt_testcase_runs_vw.error_message is 'Optional Error messages from this Test Run.'; +comment on column wt_testcase_runs_vw.asrt_yield_pct is 'Percentage of successful assertions to total assertions.'; +comment on column wt_testcase_runs_vw.asrt_cnt is 'Total number of assetions for the Test Case.'; +comment on column wt_testcase_runs_vw.asrt_fail is 'Number of failed assertions for the Test Case.'; +comment on column wt_testcase_runs_vw.asrt_pass is 'Number of passed assertions for the Test Case.'; +comment on column wt_testcase_runs_vw.asrt_min_msecs is 'Minimum interval time between assertions in milliseconds for the Test Case'; +comment on column wt_testcase_runs_vw.asrt_avg_msecs is 'Average interval time between assertions in milliseconds for the Test Case'; +comment on column wt_testcase_runs_vw.asrt_max_msecs is 'Maximum interval time between assertions in milliseconds for the Test Case'; +comment on column wt_testcase_runs_vw.asrt_tot_msecs is 'Total (sum) of interval times between assertions in milliseconds for the Test Case'; +comment on column wt_testcase_runs_vw.asrt_std_msecs is 'Standard Deviation of the interval time between assertions in milliseconds for the Test Case'; +comment on column wt_testcase_runs_vw.asrt_sos_msecs is 'Sum of squares interval time between assertions in milliseconds for the Test Case'; -grant select on wt_testcase_stats_vw to public; +grant select on wt_testcase_runs_vw to public; diff --git a/src/persist/wt_testcase_stats.tab b/src/persist/wt_testcase_stats.tab index 507ad24..e10139d 100644 --- a/src/persist/wt_testcase_stats.tab +++ b/src/persist/wt_testcase_stats.tab @@ -4,43 +4,39 @@ -- create table wt_testcase_runs - (test_run_id number(38) constraint wt_testcase_stats_nn1 not null - ,testcase_id number(38) constraint wt_testcase_stats_nn2 not null - ,yield_pct number(3) constraint wt_testcase_stats_nn3 not null - ,asserts number(7) constraint wt_testcase_stats_nn4 not null - ,passes number(7) constraint wt_testcase_stats_nn5 not null - ,failures number(7) constraint wt_testcase_stats_nn6 not null - ,min_interval_msecs number(10) constraint wt_testcase_stats_nn7 not null - ,avg_interval_msecs number(10) constraint wt_testcase_stats_nn8 not null - ,max_interval_msecs number(10) constraint wt_testcase_stats_nn9 not null - ,tot_interval_msecs number(10) constraint wt_testcase_stats_nn10 not null + (test_run_id number(38) + ,testcase_id number(38) + ,asrt_yield_pct number(3) + ,asrt_cnt number(7) + ,asrt_fail number(7) + ,asrt_pass number(7) + ,asrt_min_msecs number(10) + ,asrt_avg_msecs number(10) + ,asrt_max_msecs number(10) + ,asrt_tot_msecs number(10) + ,asrt_std_msecs number(10) + ,asrt_sos_msecs number(10) ,constraint wt_testcase_stats_pk primary key (testcase_id) ,constraint wt_testcase_stats_nk1 unique (test_run_id, testcase) ,constraint wt_testcase_stats_fk1 foreign key (test_run_id) references wt_test_runs (id) ,constraint wt_testcase_stats_fk2 foreign key (testcase_id) references wt_testcases (id) - ,constraint wt_testcase_stats_ck1 check (yield_pct between 0 and 100) - ,constraint wt_testcase_stats_ck2 check (asserts = passes + failures) - ,constraint wt_testcase_stats_ck3 check (passes >= 0) - ,constraint wt_testcase_stats_ck4 check (failures >= 0) - ,constraint wt_testcase_stats_ck5 check (min_interval_msecs >= 0) - ,constraint wt_testcase_stats_ck6 check (avg_interval_msecs >= min_interval_msecs) - ,constraint wt_testcase_stats_ck7 check (max_interval_msecs >= avg_interval_msecs) - ,constraint wt_testcase_stats_ck8 check (tot_interval_msecs >= max_interval_msecs) ) pctfree 0; comment on table wt_testcase_stats is 'Test Run data statistics for each testcase in the execution of a Test Runner.'; comment on column wt_testcase_stats.test_run_id is 'Primary Key for each Test Run. Also the Test Runs Foreign Key.'; comment on column wt_testcase_stats.testcase_id is 'Primary Key (part 2) for each Test Case. Also the Test Cases Foreign Key.'; -comment on column wt_testcase_stats.yield_pct is 'Percentage of successful assertions to total assertions.'; -comment on column wt_testcase_stats.asserts is 'Total number of assetions for the Test Case.'; -comment on column wt_testcase_stats.passes is 'Number of passed assertions for the Test Case.'; -comment on column wt_testcase_stats.failures is 'Number of failed assertions for the Test Case.'; -comment on column wt_testcase_stats.min_interval_msecs is 'Minimum interval time between assertions in milliseconds for the Test Case'; -comment on column wt_testcase_stats.avg_interval_msecs is 'Average interval time between assertions in milliseconds for the Test Case'; -comment on column wt_testcase_stats.max_interval_msecs is 'Maximum interval time between assertions in milliseconds for the Test Case'; -comment on column wt_testcase_stats.tot_interval_msecs is 'Total (sum) of interval times between assertions in milliseconds for the Test Case'; +comment on column wt_testcase_stats.asrt_yield_pct is 'Percentage of successful assertions to total assertions.'; +comment on column wt_testcase_stats.asrt_cnt is 'Total number of assetions for the Test Case.'; +comment on column wt_testcase_stats.asrt_fail is 'Number of failed assertions for the Test Case.'; +comment on column wt_testcase_stats.asrt_pass is 'Number of passed assertions for the Test Case.'; +comment on column wt_testcase_stats.asrt_min_msecs is 'Minimum interval time between assertions in milliseconds for the Test Case'; +comment on column wt_testcase_stats.asrt_avg_msecs is 'Average interval time between assertions in milliseconds for the Test Case'; +comment on column wt_testcase_stats.asrt_max_msecs is 'Maximum interval time between assertions in milliseconds for the Test Case'; +comment on column wt_testcase_stats.asrt_tot_msecs is 'Total (sum) of interval times between assertions in milliseconds for the Test Case'; +comment on column wt_testcase_stats.asrt_std_msecs is 'Standard Deviation of the interval time between assertions in milliseconds for the Test Case'; +comment on column wt_testcase_stats.asrt_sos_msecs is 'Sum of squares interval time between assertions in milliseconds for the Test Case'; grant select on wt_testcase_stats to public; grant delete on wt_testcase_stats to public; diff --git a/src/persist/wt_text_report.pkb b/src/persist/wt_text_report.pkb index 5651327..78f4892 100644 --- a/src/persist/wt_text_report.pkb +++ b/src/persist/wt_text_report.pkb @@ -231,12 +231,12 @@ end profile_out; ------------------------------------------------------------ function format_test_result - (in_assertion in wt_results.assertion%TYPE - ,in_status in wt_results.status%TYPE - ,in_details in wt_results.details%TYPE - ,in_testcase in wt_results.testcase%TYPE - ,in_message in wt_results.message%TYPE - ,in_interval_msecs in wt_results.interval_msecs%TYPE DEFAULT NULL) + (in_assertion in varchar2 + ,in_status in varchar2 + ,in_details in varchar2 + ,in_testcase in varchar2 + ,in_message in varchar2 + ,in_interval_msecs in number DEFAULT NULL) return varchar2 is l_out_str varchar2(32000) := ''; @@ -269,29 +269,13 @@ begin return l_out_str; end format_test_result; ------------------------------------------------------------- -procedure ad_hoc_result - (in_assertion in wt_results.assertion%TYPE - ,in_status in wt_results.status%TYPE - ,in_details in wt_results.details%TYPE - ,in_testcase in wt_results.testcase%TYPE - ,in_message in wt_results.message%TYPE) -is -begin - p(format_test_result - (in_assertion => in_assertion - ,in_status => in_status - ,in_details => in_details - ,in_testcase => in_testcase - ,in_message => in_message)); -end ad_hoc_result; ------------------------------------------------------------ procedure dbms_out - (in_runner_owner in wt_test_runs.runner_owner%TYPE default USER - ,in_runner_name in wt_test_runs.runner_name%TYPE default null - ,in_detail_level in number default 0 - ,in_summary_last in boolean default FALSE) + (in_runner_owner in varchar2 default USER + ,in_runner_name in varchar2 default null + ,in_detail_level in number default 0 + ,in_summary_last in boolean default FALSE) is cursor c_main(in_test_run_id in number) is diff --git a/src/persist/wt_text_report.pks b/src/persist/wt_text_report.pks index 893076b..632fb76 100644 --- a/src/persist/wt_text_report.pks +++ b/src/persist/wt_text_report.pks @@ -14,21 +14,14 @@ as g_date_format varchar2(100) := 'DD-Mon-YYYY HH:MI:SS PM'; function format_test_result - (in_assertion in wt_results.assertion%TYPE - ,in_status in wt_results.status%TYPE - ,in_details in wt_results.details%TYPE - ,in_testcase_name in wt_testcases.name%TYPE - ,in_message in wt_results.message%TYPE - ,in_interval_msecs in wt_results.interval_msecs%TYPE DEFAULT NULL) + (in_assertion in varchar2 + ,in_status in varchar2 + ,in_details in varchar2 + ,in_testcase_name in varchar2 + ,in_message in varchar2 + ,in_interval_msecs in number) return varchar2; - procedure ad_hoc_result - (in_assertion in wt_results.assertion%TYPE - ,in_status in wt_results.status%TYPE - ,in_details in wt_results.details%TYPE - ,in_testcase_name in wt_testcases.name%TYPE - ,in_message in wt_results.message%TYPE); - -- "in_detail_level" settings for DBMS_OUT procedure: -- * Less than 10 (including null) - No Detail -- * Assertion results summary. @@ -50,9 +43,9 @@ as -- * All profiled source lines. procedure dbms_out - (in_runner_owner in wt_test_runners.owner%TYPE default USER - ,in_runner_name in wt_test_runners.name%TYPE default null - ,in_detail_level in number default 0 - ,in_summary_last in boolean default FALSE); + (in_runner_owner in varchar2 default USER + ,in_runner_name in varchar2 default null + ,in_detail_level in number default 0 + ,in_summary_last in boolean default FALSE); end wt_text_report; diff --git a/src/typical_install.bat b/src/typical_install.bat new file mode 100644 index 0000000..f48b917 --- /dev/null +++ b/src/typical_install.bat @@ -0,0 +1,16 @@ + +cd core +sqlplus / as sysdba @install +cd .. + +cd persist +sqlplus / as sysdba @install +cd .. + +REM cd gui +REM sqlplus / as sysdba @install +REM cd .. + +REM cd demo +REM sqlplus / as sysdba @install +REM cd .. diff --git a/src/typical_uninstall.bat b/src/typical_uninstall.bat new file mode 100644 index 0000000..4d5b815 --- /dev/null +++ b/src/typical_uninstall.bat @@ -0,0 +1,12 @@ + +REM cd demo +REM sqlplus / as sysdba @uninstall +REM cd .. + +REM cd gui +REM sqlplus / as sysdba @uninstall +REM cd .. + +cd core +sqlplus / as sysdba @uninstall +cd .. From 366712efab08ceeaac911ff40790084d3514831c Mon Sep 17 00:00:00 2001 From: DDieterich Date: Tue, 22 Jan 2019 07:42:12 -0600 Subject: [PATCH 064/141] Lots of Renaming --- docs/Core-Features.htm | 2 +- docs/Core-Features.md | 2 +- docs/Reference.md | 2 +- docs/demo/Package-Test.md | 6 +- docs/demo/README.md | 2 +- docs/demo/Table-Test.md | 2 +- docs/demo/Test-Runner.md | 16 +- docs/demo/Trigger-Test.md | 2 +- docs/demo/Type-Test.md | 2 +- docs/demo/ut_betwnstr.md | 2 +- docs/demo/ut_calc_secs_between.md | 4 +- docs/demo/ut_str.md | 4 +- docs/demo/ut_truncit.md | 4 +- docs/utPLSQL-V2-Comparison.md | 13 +- src/core/README.md | 2 +- src/core/core_data.pkb | 26 +- src/core/core_data.pks | 38 +- src/core/install.sql | 8 +- src/core/installO.LST | 1 - src/core/uninstallO.LST | 1 + src/core/wt_assert.pkb | 2 +- src/core/wt_core_report.pkb | 8 +- src/core/wt_execute_test_runner.prc | 4 +- src/core/wtplsql.pkb | 34 +- src/demo/Package-Test.sql | 6 +- src/demo/Table-Test.sql | 2 +- src/demo/Test-Runner.sql | 10 +- src/demo/Trigger-Test.sql | 2 +- src/demo/Type-Test.sql | 2 +- src/demo/ut_betwnstr.sql | 2 +- src/demo/ut_calc_secs_between.sql | 4 +- src/demo/ut_str.sql | 4 +- src/demo/ut_truncit.sql | 4 +- src/gui/f700.sql | 32 +- src/junit/junit_core_install.sql | 2 +- src/junit/junit_core_report.pkb | 8 +- src/junit/junit_core_uninstall.sql | 2 +- src/junit/junit_persist_report.prc | 2 +- src/persist/install.sql | 18 +- src/persist/wt_dbout_runs_vw.vw | 2 +- ..._text_report.pkb => wt_persist_report.pkb} | 4 +- ..._text_report.pks => wt_persist_report.pks} | 8 +- src/persist/wt_profile.pks | 24 +- src/persist/wt_profiles_vw.vw | 12 +- src/persist/wt_result.pkb | 40 +- src/persist/wt_result.pks | 2 +- src/persist/wt_results_vw.vw | 32 +- src/persist/wt_test_run.pkb | 2 +- src/persist/wt_test_run.pks | 4 +- src/persist/wt_test_run_stat.pkb | 982 ------------------ src/persist/wt_test_run_stat.pks | 28 - src/persist/wt_test_runs.tab | 22 +- src/persist/wt_test_runs_vw.vw | 18 +- src/persist/wt_testcase_runs.tab | 42 + src/persist/wt_testcase_runs_vw.vw | 44 +- src/persist/wt_testcase_stats.tab | 42 - 56 files changed, 293 insertions(+), 1302 deletions(-) rename src/persist/{wt_text_report.pkb => wt_persist_report.pkb} (99%) rename src/persist/{wt_text_report.pks => wt_persist_report.pks} (89%) delete mode 100644 src/persist/wt_test_run_stat.pkb delete mode 100644 src/persist/wt_test_run_stat.pks create mode 100644 src/persist/wt_testcase_runs.tab delete mode 100644 src/persist/wt_testcase_stats.tab diff --git a/docs/Core-Features.htm b/docs/Core-Features.htm index 20c044e..c5e824e 100644 --- a/docs/Core-Features.htm +++ b/docs/Core-Features.htm @@ -33,7 +33,7 @@

    Test Result Capture

    Test Result Reporting

    Reporting of the assertion test results is not a included with the execution of the test runner package(s). Some other mechanism, like the reporting package, must be used to display the assertion test results. This allows the following choices during test execution:

    Ao2(6r>!5F*eGgv6%?UfnOH@ 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�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�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%0Dx6 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 G!T&#hr#v_S diff --git a/src/core/hook.pkb b/src/core/hook.pkb index ce55c14..1fe143d 100644 --- a/src/core/hook.pkb +++ b/src/core/hook.pkb @@ -63,10 +63,8 @@ end before_test_run; procedure execute_test_runner is begin - if execute_test_runner_active - then - run_hooks('execute_test_runner'); - end if; + -- At least 1 "execute_test_runner" must be loaded into the "g_run_aa" array. + run_hooks('execute_test_runner'); end execute_test_runner; ------------------------------------------------------------ @@ -129,7 +127,6 @@ is begin before_test_all_active := FALSE; before_test_run_active := FALSE; - execute_test_runner_active := FALSE; after_assertion_active := FALSE; after_test_run_active := FALSE; after_test_all_active := FALSE; @@ -149,7 +146,7 @@ begin case buff.hook_name when 'before_test_all' then before_test_all_active := TRUE; when 'before_test_run' then before_test_run_active := TRUE; - when 'execute_test_runner' then execute_test_runner_active := TRUE; + when 'execute_test_runner' then NULL; when 'after_assertion' then after_assertion_active := TRUE; when 'after_test_run' then after_test_run_active := TRUE; when 'after_test_all' then after_test_all_active := TRUE; diff --git a/src/core/wt_assert.pkb b/src/core/wt_assert.pkb index 99b5948..7bc0c98 100644 --- a/src/core/wt_assert.pkb +++ b/src/core/wt_assert.pkb @@ -91,14 +91,14 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- if core_data.g_run_rec.runner_name is null then hook.ad_hoc_report; - else - core_data.add - (in_testcase => g_testcase - ,in_assertion => g_rec.last_assert - ,in_pass => g_rec.last_pass - ,in_details => g_rec.last_details - ,in_message => g_rec.last_msg); + return; end if; + core_data.add + (in_testcase => g_testcase + ,in_assertion => g_rec.last_assert + ,in_pass => g_rec.last_pass + ,in_details => g_rec.last_details + ,in_message => g_rec.last_msg); $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------ end if; $END ----------------%WTPLSQL_end_ignore_lines%---------------- diff --git a/src/core/wt_text_report.pkb b/src/core/wt_text_report.pkb index 2d5450d..1629763 100644 --- a/src/core/wt_text_report.pkb +++ b/src/core/wt_text_report.pkb @@ -16,7 +16,7 @@ begin end p; ------------------------------------------------------------ -procedure result_summary +procedure summary_out is asrt_cnt number; run_sec number; @@ -28,6 +28,22 @@ is avg_msec number; l_yield_txt varchar2(50); begin + p(''); + -- + p(' wtPLSQL ' || wtplsql.show_version || ' - Start Date/Time: ' || + to_char(core_data.g_run_rec.start_dtm, g_date_format) || + CHR(10)); + p('Test Results for ' || core_data.g_run_rec.runner_owner || + '.' || core_data.g_run_rec.runner_name ); + ---------------------------------------- + if core_data.g_run_rec.dbout_name is not null + then + p('Database Object Under Test is ' || core_data.g_run_rec.dbout_type || + ' ' || core_data.g_run_rec.dbout_owner || + '.' || core_data.g_run_rec.dbout_name ); + end if; + p('----------------------------------------'); + -- asrt_cnt := core_data.g_run_rec.asrt_cnt; run_sec := core_data.g_run_rec.runner_sec; tc_cnt := core_data.g_run_rec.tc_cnt; @@ -44,6 +60,7 @@ begin else l_yield_txt := to_char(100 * ( 1 - (tc_fail/tc_cnt) ) ,'9999999') || '%'; end case; + -- p(' Minimum Elapsed msec: ' || to_char(min_msec ,'9999999') || ' Total Assertions: ' || to_char(asrt_cnt ,'9999999') ); p(' Average Elapsed msec: ' || to_char(avg_msec ,'9999999') || @@ -52,59 +69,45 @@ begin ' Failed Testcases: ' || to_char(tc_fail ,'9999999') ); p(' Total Run Time (sec): ' || to_char(run_sec ,'99990.9') || ' Testcase Yield: ' || l_yield_txt ); -end result_summary; - ------------------------------------------------------------- -procedure summary_out -is -begin - p(''); - p(' wtPLSQL ' || wtplsql.show_version || ' - Start Date/Time: ' || - to_char(core_data.g_run_rec.start_dtm, g_date_format) || - CHR(10)); - p('Test Results for ' || core_data.g_run_rec.runner_owner || - '.' || core_data.g_run_rec.runner_name ); - ---------------------------------------- - if core_data.g_run_rec.dbout_name is not null - then - p('Database Object Under Test is ' || core_data.g_run_rec.dbout_type || - ' ' || core_data.g_run_rec.dbout_owner || - '.' || core_data.g_run_rec.dbout_name ); - end if; - p('----------------------------------------'); - result_summary; + -- if core_data.g_run_rec.error_message is not null then p(''); p(' *** Test Runner Error ***'); p(core_data.g_run_rec.error_message); end if; + -- end summary_out; ------------------------------------------------------------ procedure results_out (in_show_pass in boolean) is - l_rec core_data.results_rec_type; - l_last_testcase core_data.long_name; + l_rec core_data.results_rec_type; begin - show_result_header; + -- + p(''); + p( core_data.g_run_rec.runner_owner || + '.' || core_data.g_run_rec.runner_name || + ' Test Runner Details:' ); + p('----------------------------------------'); + -- for i in 1 .. core_data.g_results_nt.COUNT loop if in_show_pass OR NOT core_data.g_results_nt(i).pass then - if core_data.g_results_nt(i).testcase = l_last_testcase + if core_data.g_results_nt(i).testcase = l_rec.testcase then l_rec := core_data.g_results_nt(i); l_rec.testcase := ''; - p(format_test_result(l_rec)); else - p(format_test_result(core_data.g_results_nt(i))); - l_last_testcase := core_data.g_results_nt(i).testcase; + l_rec := core_data.g_results_nt(i); end if; + p(format_test_result(l_rec)); end if; end loop; + -- end results_out; @@ -153,16 +156,6 @@ begin end ad_hoc_result; ------------------------------------------------------------- -procedure show_result_header is begin - p(''); - p( core_data.g_run_rec.runner_owner || - '.' || core_data.g_run_rec.runner_name || - ' Test Runner Details:' ); - p('----------------------------------------'); -end show_result_header; - - ------------------------------------------------------------ function format_test_result (in_rec in core_data.results_rec_type) diff --git a/src/core/wt_text_report.pks b/src/core/wt_text_report.pks index 37b4583..dd3952c 100644 --- a/src/core/wt_text_report.pks +++ b/src/core/wt_text_report.pks @@ -17,21 +17,18 @@ as procedure dbms_out (in_detail_level in number default 0 ,in_summary_last in boolean default FALSE); + -- "in_detail_level" settings for DBMS_OUT procedure: + -- * Less than 10 (including null) - No Detail + -- * Assertion results summary. + -- * 10 to 19 - Minimal Detail + -- * Assertion results summary. + -- * Failed assertion result details. + -- * 20 or more - Full Detail + -- * Assertion results summary. + -- * All assertion result details. procedure ad_hoc_result; - procedure show_result_header; - --- "in_detail_level" settings for DBMS_OUT procedure: --- * Less than 10 (including null) - No Detail --- * Assertion results summary. --- * 10 to 19 - Minimal Detail --- * Assertion results summary. --- * Failed assertion result details. --- * 20 or more - Full Detail --- * Assertion results summary. --- * All assertion result details. - function format_test_result (in_rec in core_data.results_rec_type) return varchar2; diff --git a/src/core/wtplsql.pkb b/src/core/wtplsql.pkb index 7bb5bc9..6b5dedf 100644 --- a/src/core/wtplsql.pkb +++ b/src/core/wtplsql.pkb @@ -103,7 +103,7 @@ $END ----------------%WTPLSQL_end_ignore_lines%---------------- ------------------------------------------------------------ -procedure find_dbout +procedure check_dbout is -- -- https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements008.htm#SQLRF51129 @@ -214,11 +214,11 @@ begin return; end; -- -end find_dbout; +end check_dbout; $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------ $THEN - procedure t_find_dbout + procedure t_check_dbout is l_run_recSAVE core_data.run_rec_type; l_run_recTEST core_data.run_rec_type; @@ -234,7 +234,7 @@ $THEN l_run_recSAVE := core_data.g_run_rec; clear_run_rec; g_DBOUT := ''; - find_dbout; + check_dbout; l_run_recTEST := core_data.g_run_rec; core_data.g_run_rec := l_run_recSAVE; -------------------------------------- WTPLSQL Testing -- @@ -252,7 +252,7 @@ $THEN l_run_recSAVE := core_data.g_run_rec; clear_run_rec; g_DBOUT := 'SYS.DUAL'; - find_dbout; + check_dbout; l_run_recTEST := core_data.g_run_rec; core_data.g_run_rec := l_run_recSAVE; -------------------------------------- WTPLSQL Testing -- @@ -273,7 +273,7 @@ $THEN l_run_recSAVE := core_data.g_run_rec; clear_run_rec; g_DBOUT := 'WTPLSQL:PACKAGE BODY'; - find_dbout; + check_dbout; l_run_recTEST := core_data.g_run_rec; core_data.g_run_rec := l_run_recSAVE; -------------------------------------- WTPLSQL Testing -- @@ -294,7 +294,7 @@ $THEN l_run_recSAVE := core_data.g_run_rec; clear_run_rec; g_DBOUT := 'WT_EXECUTE_TEST_RUNNER'; - find_dbout; + check_dbout; l_run_recTEST := core_data.g_run_rec; core_data.g_run_rec := l_run_recSAVE; -------------------------------------- WTPLSQL Testing -- @@ -315,7 +315,7 @@ $THEN l_run_recSAVE := core_data.g_run_rec; clear_run_rec; g_DBOUT := 'someone.bogus:thingy'; - find_dbout; + check_dbout; l_run_recTEST := core_data.g_run_rec; core_data.g_run_rec := l_run_recSAVE; -------------------------------------- WTPLSQL Testing -- @@ -343,7 +343,7 @@ $THEN l_run_recSAVE := core_data.g_run_rec; clear_run_rec; g_DBOUT := 'WTPLSQL'; - find_dbout; + check_dbout; g_DBOUT := ''; l_run_recTEST := core_data.g_run_rec; core_data.g_run_rec := l_run_recSAVE; @@ -364,7 +364,7 @@ $THEN ''' like ''%Found too many database objects "' || g_DBOUT || '".%''', against_value_in => 1); - end t_find_dbout; + end t_check_dbout; $END ----------------%WTPLSQL_end_ignore_lines%---------------- @@ -462,7 +462,7 @@ begin hook.execute_test_runner; -- -- Primary Finalize - find_dbout; + check_dbout; core_data.final1; g_DBOUT := ''; -- @@ -553,7 +553,7 @@ $THEN begin -------------------------------------- WTPLSQL Testing -- t_check_runner; - t_find_dbout; + t_check_dbout; t_show_version; t_test_all; end; From 3bb54324f5894baa3af4b0af54aa6ed6c41bbfa9 Mon Sep 17 00:00:00 2001 From: DDieterich Date: Mon, 31 Dec 2018 16:14:16 -0600 Subject: [PATCH 048/141] Synchronize for Branch Changes --- README.md | 2 +- docs/core/Call_Tree_Diagrams.odg | Bin 26952 -> 29847 bytes docs/core/Call_Tree_Diagrams.pdf | Bin 300051 -> 300187 bytes docs/core/README.md | 2 - docs/persist/README.md | 1 - releases/README.md | 11 ++++ .../V1.1.0/downgrade_to_V1.0.0/README.md | 1 + releases/V1.1.0/upgrade_from_V1.0.0/README.md | 14 +++++ .../upgrade_from_V1.0.0/RELEASE_NOTES.txt | 0 .../upgrade_from_V1.0.0/update_all_stats.sql | 0 .../V1.1.0/upgrade_from_V1.0.0/upgrade.sql | 0 .../V1.1.0/upgrade_from_V1.0.0/upgradeO.LST | 0 releases/V1.2.0/downgrade_to_V1.1.0/README.md | 11 ++++ releases/V1.2.0/upgrade_from_V1.1.0/README.md | 11 ++++ .../upgrade_from_V1.1.0/RELEASE_NOTES.txt | 0 src/README.md | 11 ++++ src/conversion/README.md | 14 +++++ src/conversion/README.txt | 20 ------- src/core/README.md | 53 +++++++++++++++++ src/core/README.txt | 54 ------------------ src/demo/README.md | 34 +++++++++++ src/demo/README.txt | 33 ----------- src/gui/Notes.txt | 19 ------ src/gui/README.md | 38 ++++++++++++ src/junit/README.md | 24 ++++++++ src/junit/README.txt | 24 -------- src/persist/README.md | 15 +++++ .../V1.1.0/upgrade_from_V1.0.0/README.txt | 16 ------ .../V1.2.0/upgrade_from_V1.1.0/README.txt | 15 ----- 29 files changed, 238 insertions(+), 185 deletions(-) create mode 100644 releases/README.md rename src/persist/releases/V1.1.0/downgrade_to_V1.0.0/README.txt => releases/V1.1.0/downgrade_to_V1.0.0/README.md (61%) create mode 100644 releases/V1.1.0/upgrade_from_V1.0.0/README.md rename {src/persist/releases => releases}/V1.1.0/upgrade_from_V1.0.0/RELEASE_NOTES.txt (100%) rename {src/persist/releases => releases}/V1.1.0/upgrade_from_V1.0.0/update_all_stats.sql (100%) rename {src/persist/releases => releases}/V1.1.0/upgrade_from_V1.0.0/upgrade.sql (100%) rename {src/persist/releases => releases}/V1.1.0/upgrade_from_V1.0.0/upgradeO.LST (100%) create mode 100644 releases/V1.2.0/downgrade_to_V1.1.0/README.md create mode 100644 releases/V1.2.0/upgrade_from_V1.1.0/README.md rename {src/persist/releases => releases}/V1.2.0/upgrade_from_V1.1.0/RELEASE_NOTES.txt (100%) create mode 100644 src/README.md create mode 100644 src/conversion/README.md delete mode 100644 src/conversion/README.txt create mode 100644 src/core/README.md delete mode 100644 src/core/README.txt create mode 100644 src/demo/README.md delete mode 100644 src/demo/README.txt create mode 100644 src/gui/README.md create mode 100644 src/junit/README.md delete mode 100644 src/junit/README.txt create mode 100644 src/persist/README.md delete mode 100644 src/persist/releases/V1.1.0/upgrade_from_V1.0.0/README.txt delete mode 100644 src/persist/releases/V1.2.0/upgrade_from_V1.1.0/README.txt diff --git a/README.md b/README.md index 9769555..c97967a 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The wtPLSQL website has more information about how to use wtPLSQL and why it is File Name | Description ---------------------|------------ docs | Directory for documentation. Also contains wtPLSQL website (GitHub.io) source. -releases | Directory for current and previous releases (zip files). +releases | Directory for release notes, upgrades, and downgrades. src | Directory for source code. LICENSE | Open Source Terms and Conditions. README.md | Top level Markdown file for the wtPLSQL repository on GitHub diff --git a/docs/core/Call_Tree_Diagrams.odg b/docs/core/Call_Tree_Diagrams.odg index 04fc66bba582f45792a0ebb489267d9a85f2e4a7..16ec9a9931e817473134eb874be639b7da348a08 100644 GIT binary patch delta 28016 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 delta 25126 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 a7y4i5ke)Uc_TNde`y=<>W3JQRv;PAR3Bn@) diff --git a/docs/core/Call_Tree_Diagrams.pdf b/docs/core/Call_Tree_Diagrams.pdf index 5614d7be9ec8f64dbace1b0736e20b3fa28b2448..e3ba5363dad8847571fa0ebc51197b693233560d 100644 GIT binary patch delta 233207 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�J`$NTl0oDs$8e{Bv`5DoMtP7NxY9Lp?JKiw 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