/*
  utPLSQL - Version 3
  Copyright 2016 - 2026 utPLSQL Project

  Licensed under the Apache License, Version 2.0 (the "License"):
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/

@@define_ut3_owner_param.sql

spool install.log

prompt &&line_separator
prompt Installing utPLSQL v3 framework into &&ut3_owner schema
prompt &&line_separator

whenever sqlerror exit failure rollback
whenever oserror exit failure rollback

prompt Switching current schema to &&ut3_owner
prompt &&line_separator
alter session set current_schema = &&ut3_owner;

@@check_object_grants.sql
@@check_sys_grants.sql "'CREATE TYPE','CREATE VIEW','CREATE SYNONYM','CREATE SEQUENCE','CREATE PROCEDURE','CREATE TABLE', 'CREATE CONTEXT'"
--set define off

create or replace context &&ut3_owner._info using &&ut3_owner..ut_session_context;

--dbms_output buffer cache table
@@install_component.sql 'core/ut_dbms_output_cache.sql'

--common utilities
@@install_component.sql 'core/types/ut_varchar2_list.tps'
@@install_component.sql 'core/types/ut_varchar2_rows.tps'
@@install_component.sql 'core/types/ut_integer_list.tps'
@@install_component.sql 'core/types/ut_object_name.tps'
@@install_component.sql 'core/types/ut_object_name.tpb'
@@install_component.sql 'core/types/ut_object_names.tps'
@@install_component.sql 'core/types/ut_key_value_pair.tps'
@@install_component.sql 'core/types/ut_key_value_pairs.tps'
@@install_component.sql 'core/types/ut_reporter_info.tps'
@@install_component.sql 'core/types/ut_reporters_info.tps'
@@install_component.sql 'core/types/ut_stack.tps'
@@install_component.sql 'core/types/ut_stack.tpb'
@@install_component.sql 'core/ut_utils.pks'
@@install_component.sql 'core/ut_metadata.pks'
@@install_component.sql 'core/ut_savepoint_seq.sql'
@@install_component.sql 'core/ut_utils.pkb'
@@install_component.sql 'core/ut_metadata.pkb'
@@install_component.sql 'reporters/ut_ansiconsole_helper.pks'
@@install_component.sql 'reporters/ut_ansiconsole_helper.pkb'

@@install_component.sql 'api/ut_suite_item_info.tps'
@@install_component.sql 'api/ut_suite_item_info.tpb'
@@install_component.sql 'api/ut_suite_items_info.tps'

--event manager objects
@@install_component.sql 'core/events/ut_event_item.tps'
@@install_component.sql 'core/events/ut_event_listener.tps'
@@install_component.sql 'core/events/ut_event_manager.pks'
@@install_component.sql 'core/events/ut_event_manager.pkb'

--core types
@@install_component.sql 'core/types/ut_run_info.tps'
@@install_component.sql 'core/types/ut_run_info.tpb'
@@install_component.sql 'core/types/ut_expectation_result.tps'
@@install_component.sql 'core/types/ut_expectation_results.tps'
@@install_component.sql 'core/types/ut_results_counter.tps'
@@install_component.sql 'core/types/ut_suite_item.tps'
@@install_component.sql 'core/types/ut_suite_items.tps'
@@install_component.sql 'core/types/ut_executable.tps'
@@install_component.sql 'core/types/ut_executables.tps'
@@install_component.sql 'core/types/ut_executable_test.tps'
@@install_component.sql 'core/types/ut_test.tps'
@@install_component.sql 'core/types/ut_logical_suite.tps'
@@install_component.sql 'core/types/ut_suite.tps'
@@install_component.sql 'core/types/ut_suite_context.tps'
@@install_component.sql 'core/types/ut_file_mapping.tps'
@@install_component.sql 'core/types/ut_file_mappings.tps'
@@install_component.sql 'core/types/ut_coverage_options.tps'
@@install_component.sql 'core/types/ut_run.tps'
@@install_component.sql 'core/types/ut_reporter_base.tps'
@@install_component.sql 'core/types/ut_reporters.tps'
@@install_component.sql 'core/types/ut_path_item.tps'
@@install_component.sql 'core/types/ut_path_items.tps'

@@install_component.sql 'expectations/json_objects_specs.sql'
@@install_component.sql 'expectations/matchers/ut_matcher_options_items.tps'
@@install_component.sql 'expectations/matchers/ut_matcher_options.tps'
@@install_component.sql 'expectations/data_values/ut_data_value.tps'
@@install_component.sql 'expectations/data_values/ut_key_anyval_pair.tps'
@@install_component.sql 'expectations/data_values/ut_key_anyval_pairs.tps'
@@install_component.sql 'expectations/data_values/ut_key_anyvalues.tps'

--session_context
@@install_component.sql  'core/session_context/ut_session_context.pks'
@@install_component.sql  'core/session_context/ut_session_context.pkb'
@@install_component.sql  'core/session_context/ut_session_info.tps'
@@install_component.sql  'core/session_context/ut_session_info.tpb'

--output buffer table
@@install_component.sql 'core/output_buffers/ut_output_buffer_info_tmp.sql'
@@install_component.sql 'core/output_buffers/ut_output_buffer_tmp.sql'
@@install_component.sql 'core/output_buffers/ut_output_clob_buffer_tmp.sql'
--output buffer base api
@@install_component.sql 'core/output_buffers/ut_output_data_row.tps'
@@install_component.sql 'core/output_buffers/ut_output_data_rows.tps'
@@install_component.sql 'core/output_buffers/ut_output_buffer_base.tps'
@@install_component.sql 'core/output_buffers/ut_output_buffer_base.tpb'
--output buffer table api
@@install_component.sql 'core/output_buffers/ut_output_table_buffer.tps'
@@install_component.sql 'core/output_buffers/ut_output_table_buffer.tpb'
@@install_component.sql 'core/output_buffers/ut_output_clob_table_buffer.tps'
@@install_component.sql 'core/output_buffers/ut_output_clob_table_buffer.tpb'
@@install_component.sql 'core/output_buffers/ut_output_bulk_buffer.tps'
@@install_component.sql 'core/output_buffers/ut_output_bulk_buffer.tpb'

@@install_component.sql 'core/types/ut_output_reporter_base.tps'

--annotations
@@install_component.sql 'core/annotations/ut_trigger_check.pks'
@@install_component.sql 'core/annotations/ut_trigger_check.pkb'
@@install_component.sql 'core/annotations/ut_annotation.tps'
@@install_component.sql 'core/annotations/ut_annotations.tps'
@@install_component.sql 'core/annotations/ut_annotated_object.tps'
@@install_component.sql 'core/annotations/ut_annotated_objects.tps'
@@install_component.sql 'core/annotations/ut_annotation_obj_cache_info.tps'
@@install_component.sql 'core/annotations/ut_annotation_objs_cache_info.tps'
@@install_component.sql 'core/annotations/ut_annotation_cache_seq.sql'
@@install_component.sql 'core/annotations/ut_annotation_cache_schema.sql'
@@install_component.sql 'core/annotations/ut_annotation_cache_info.sql'
@@install_component.sql 'core/annotations/ut_annotation_cache.sql'
@@install_component.sql 'core/annotations/ut_annotation_cache_manager.pks'
@@install_component.sql 'core/annotations/ut_annotation_cache_manager.pkb'
@@install_component.sql 'core/annotations/ut_annotation_parser.pks'
@@install_component.sql 'core/annotations/ut_annotation_parser.pkb'
@@install_component.sql 'core/annotations/ut_annotation_manager.pks'
@@install_component.sql 'core/annotations/ut_annotation_manager.pkb'

--suite builder
@@install_component.sql 'core/types/ut_suite_cache_row.tps'
@@install_component.sql 'core/types/ut_suite_cache_rows.tps'
@@install_component.sql 'core/ut_suite_cache_schema.sql'
@@install_component.sql 'core/ut_suite_cache_package.sql'
@@install_component.sql 'core/ut_suite_cache_seq.sql'
@@install_component.sql 'core/ut_suite_cache.sql'

@@install_component.sql 'core/ut_suite_tag_filter.pks'
@@install_component.sql 'core/ut_suite_tag_filter.pkb'
@@install_component.sql 'core/ut_suite_cache_manager.pks'
@@install_component.sql 'core/ut_suite_cache_manager.pkb'
@@install_component.sql 'core/ut_suite_builder.pks'
@@install_component.sql 'core/ut_suite_builder.pkb'
--suite manager
@@install_component.sql 'core/ut_suite_manager.pks'
@@install_component.sql 'core/ut_suite_manager.pkb'

--expectations execution state interface
@@install_component.sql 'core/ut_expectation_processor.pks'
@@install_component.sql 'core/ut_expectation_processor.pkb'

prompt Installing PLSQL profiler objects into &&ut3_owner schema
@@core/coverage/proftab.sql

prompt Installing DBMSPLSQL Tables objects into &&ut3_owner schema
@@core/coverage/dbms_plssqlcode.sql

@@install_component.sql 'core/ut_file_mapper.pks'
@@install_component.sql 'core/ut_file_mapper.pkb'


--gathering coverage
@@install_component.sql 'core/coverage/ut_coverage_sources_tmp.sql'
@@install_component.sql 'core/coverage/ut_coverage_runs.sql'
@@install_component.sql 'core/coverage/ut_coverage_helper.pks'
@@install_component.sql 'core/coverage/ut_coverage_helper_block.pks'
@@install_component.sql 'core/coverage/ut_coverage_helper_profiler.pks'
@@install_component.sql 'core/coverage/ut_coverage.pks'
@@install_component.sql 'core/coverage/ut_coverage_block.pks'
@@install_component.sql 'core/coverage/ut_coverage_profiler.pks'
@@install_component.sql 'core/coverage/ut_coverage_reporter_base.tps'
@@install_component.sql 'core/coverage/ut_coverage_helper.pkb'
@@install_component.sql 'core/coverage/ut_coverage_helper_block.pkb'
@@install_component.sql 'core/coverage/ut_coverage_helper_profiler.pkb'
@@install_component.sql 'core/coverage/ut_coverage.pkb'
@@install_component.sql 'core/coverage/ut_coverage_block.pkb'
@@install_component.sql 'core/coverage/ut_coverage_profiler.pkb'
@@install_component.sql 'core/coverage/ut_coverage_reporter_base.tpb'

--core type bodies
@@install_component.sql 'core/types/ut_results_counter.tpb'
@@install_component.sql 'core/types/ut_suite_item.tpb'
@@install_component.sql 'core/types/ut_test.tpb'
@@install_component.sql 'core/types/ut_logical_suite.tpb'
@@install_component.sql 'core/types/ut_suite.tpb'
@@install_component.sql 'core/types/ut_suite_context.tpb'
@@install_component.sql 'core/types/ut_coverage_options.tpb'
@@install_component.sql 'core/types/ut_run.tpb'
@@install_component.sql 'core/types/ut_expectation_result.tpb'
@@install_component.sql 'core/types/ut_reporter_base.tpb'
@@install_component.sql 'core/types/ut_output_reporter_base.tpb'
@@install_component.sql 'core/types/ut_file_mapping.tpb'
@@install_component.sql 'core/types/ut_executable.tpb'
@@install_component.sql 'core/types/ut_executable_test.tpb'
@@install_component.sql 'core/types/ut_console_reporter_base.tps'
@@install_component.sql 'core/types/ut_console_reporter_base.tpb'
@@install_component.sql 'core/types/ut_path_item.tpb'

--expectations and matchers
@@install_component.sql 'expectations/data_values/ut_compound_data_tmp.sql'
@@install_component.sql 'expectations/data_values/ut_compound_data_diff_tmp.sql'
@@install_component.sql 'expectations/data_values/ut_json_data_diff_tmp.sql'
@@install_component.sql 'expectations/data_values/ut_compound_data_value.tps'
@@install_component.sql 'expectations/data_values/ut_json_leaf.tps'
@@install_component.sql 'expectations/data_values/ut_json_leaf_tab.tps'
@@install_component.sql 'expectations/data_values/ut_json_tree_details.tps'
@@install_component.sql 'expectations/data_values/ut_cursor_column.tps'
@@install_component.sql 'expectations/data_values/ut_cursor_column_tab.tps'
@@install_component.sql 'expectations/data_values/ut_cursor_details.tps'
@@install_component.sql 'expectations/data_values/ut_data_value_blob.tps'
@@install_component.sql 'expectations/data_values/ut_data_value_boolean.tps'
@@install_component.sql 'expectations/data_values/ut_data_value_clob.tps'
@@install_component.sql 'expectations/data_values/ut_data_value_date.tps'
@@install_component.sql 'expectations/data_values/ut_data_value_dsinterval.tps'
@@install_component.sql 'expectations/data_values/ut_data_value_number.tps'
@@install_component.sql 'expectations/data_values/ut_data_value_refcursor.tps'
@@install_component.sql 'expectations/data_values/ut_data_value_anydata.tps'
@@install_component.sql 'expectations/data_values/ut_data_value_timestamp.tps'
@@install_component.sql 'expectations/data_values/ut_data_value_timestamp_tz.tps'
@@install_component.sql 'expectations/data_values/ut_data_value_timestamp_ltz.tps'
@@install_component.sql 'expectations/data_values/ut_data_value_varchar2.tps'
@@install_component.sql 'expectations/data_values/ut_data_value_yminterval.tps'
@@install_component.sql 'expectations/data_values/ut_data_value_xmltype.tps'
@@install_component.sql 'expectations/data_values/ut_compound_data_helper.pks'
@@install_component.sql 'expectations/data_values/ut_data_value_json.tps'
@@install_component.sql 'expectations/matchers/ut_matcher_base.tps'
@@install_component.sql 'expectations/ut_expectation_base.tps'
@@install_component.sql 'expectations/matchers/ut_matcher.tps'
@@install_component.sql 'expectations/matchers/ut_comparison_matcher.tps'
@@install_component.sql 'expectations/matchers/ut_be_within_pct.tps'
@@install_component.sql 'expectations/matchers/ut_be_within.tps'
@@install_component.sql 'expectations/matchers/ut_be_within_helper.pks'
@@install_component.sql 'expectations/ut_expectation.tps'
@@install_component.sql 'expectations/matchers/ut_be_false.tps'
@@install_component.sql 'expectations/matchers/ut_be_greater_or_equal.tps'
@@install_component.sql 'expectations/matchers/ut_be_greater_than.tps'
@@install_component.sql 'expectations/matchers/ut_be_less_or_equal.tps'
@@install_component.sql 'expectations/matchers/ut_be_less_than.tps'
@@install_component.sql 'expectations/matchers/ut_be_like.tps'
@@install_component.sql 'expectations/matchers/ut_be_not_null.tps'
@@install_component.sql 'expectations/matchers/ut_be_null.tps'
@@install_component.sql 'expectations/matchers/ut_be_true.tps'
@@install_component.sql 'expectations/matchers/ut_equal.tps'
@@install_component.sql 'expectations/matchers/ut_contain.tps'
@@install_component.sql 'expectations/matchers/ut_have_count.tps'
@@install_component.sql 'expectations/matchers/ut_be_between.tps'
@@install_component.sql 'expectations/matchers/ut_be_empty.tps'
@@install_component.sql 'expectations/matchers/ut_match.tps'
@@install_component.sql 'expectations/data_values/ut_json_leaf.tpb'
@@install_component.sql 'expectations/data_values/ut_json_tree_details.tpb'
@@install_component.sql 'expectations/data_values/ut_cursor_column.tpb'
@@install_component.sql 'expectations/data_values/ut_cursor_details.tpb'
@@install_component.sql 'expectations/ut_expectation_compound.tps'
@@install_component.sql 'expectations/ut_expectation_json.tps'

@@install_component.sql 'expectations/matchers/ut_matcher_options_items.tpb'
@@install_component.sql 'expectations/matchers/ut_matcher_options.tpb'
@@install_component.sql 'expectations/data_values/ut_data_value.tpb'
@@install_component.sql 'expectations/data_values/ut_compound_data_value.tpb'
@@install_component.sql 'expectations/data_values/ut_compound_data_helper.pkb'
@@install_component.sql 'expectations/data_values/ut_data_value_blob.tpb'
@@install_component.sql 'expectations/data_values/ut_data_value_boolean.tpb'
@@install_component.sql 'expectations/data_values/ut_data_value_clob.tpb'
@@install_component.sql 'expectations/data_values/ut_data_value_date.tpb'
@@install_component.sql 'expectations/data_values/ut_data_value_dsinterval.tpb'
@@install_component.sql 'expectations/data_values/ut_data_value_number.tpb'
@@install_component.sql 'expectations/data_values/ut_data_value_refcursor.tpb'
@@install_component.sql 'expectations/data_values/ut_data_value_anydata.tpb'
@@install_component.sql 'expectations/data_values/ut_data_value_timestamp.tpb'
@@install_component.sql 'expectations/data_values/ut_data_value_timestamp_tz.tpb'
@@install_component.sql 'expectations/data_values/ut_data_value_timestamp_ltz.tpb'
@@install_component.sql 'expectations/data_values/ut_data_value_varchar2.tpb'
@@install_component.sql 'expectations/data_values/ut_data_value_yminterval.tpb'
@@install_component.sql 'expectations/data_values/ut_data_value_xmltype.tpb'
@@install_component.sql 'expectations/data_values/ut_data_value_json.tpb'
@@install_component.sql 'expectations/matchers/ut_matcher.tpb'
@@install_component.sql 'expectations/matchers/ut_comparison_matcher.tpb'
@@install_component.sql 'expectations/matchers/ut_be_false.tpb'
@@install_component.sql 'expectations/matchers/ut_be_greater_or_equal.tpb'
@@install_component.sql 'expectations/matchers/ut_be_greater_than.tpb'
@@install_component.sql 'expectations/matchers/ut_be_less_or_equal.tpb'
@@install_component.sql 'expectations/matchers/ut_be_less_than.tpb'
@@install_component.sql 'expectations/matchers/ut_be_like.tpb'
@@install_component.sql 'expectations/matchers/ut_be_not_null.tpb'
@@install_component.sql 'expectations/matchers/ut_be_null.tpb'
@@install_component.sql 'expectations/matchers/ut_be_true.tpb'
@@install_component.sql 'expectations/matchers/ut_equal.tpb'
@@install_component.sql 'expectations/matchers/ut_be_within_pct.tpb'
@@install_component.sql 'expectations/matchers/ut_be_within.tpb'
@@install_component.sql 'expectations/matchers/ut_be_within_helper.pkb'
@@install_component.sql 'expectations/matchers/ut_contain.tpb'
@@install_component.sql 'expectations/matchers/ut_have_count.tpb'
@@install_component.sql 'expectations/matchers/ut_be_between.tpb'
@@install_component.sql 'expectations/matchers/ut_be_empty.tpb'
@@install_component.sql 'expectations/matchers/ut_match.tpb'
@@install_component.sql 'expectations/ut_expectation_base.tpb'
@@install_component.sql 'expectations/ut_expectation.tpb'
@@install_component.sql 'expectations/ut_expectation_compound.tpb'
@@install_component.sql 'expectations/ut_expectation_json.tpb'
@@install_component.sql 'expectations/data_values/ut_key_anyvalues.tpb'

--core reporter
@@install_component.sql 'reporters/ut_documentation_reporter.tps'
@@install_component.sql 'reporters/ut_documentation_reporter.tpb'

--plugin interface API for running utPLSQL
@@install_component.sql 'api/ut_runner.pks'
@@install_component.sql 'api/ut_runner.pkb'

--developer interface for expectations and running utPLSQL
@@install_component.sql 'api/ut.pks'
@@install_component.sql 'api/ut.pkb'

--additional reporters
@@install_component.sql 'reporters/ut_debug_reporter.tps'
@@install_component.sql 'reporters/ut_debug_reporter.tpb'
@@install_component.sql 'reporters/ut_teamcity_reporter.tps'
@@install_component.sql 'reporters/ut_teamcity_reporter_helper.pks'
@@install_component.sql 'reporters/ut_teamcity_reporter_helper.pkb'
@@install_component.sql 'reporters/ut_teamcity_reporter.tpb'
@@install_component.sql 'reporters/ut_junit_reporter.tps'
@@install_component.sql 'reporters/ut_junit_reporter.tpb'
@@install_component.sql 'reporters/ut_tfs_junit_reporter.tps'
@@install_component.sql 'reporters/ut_tfs_junit_reporter.tpb'
@@install_component.sql 'reporters/ut_xunit_reporter.tps'
@@install_component.sql 'reporters/ut_xunit_reporter.tpb'
@@install_component.sql 'reporters/ut_sonar_test_reporter.tps'
@@install_component.sql 'reporters/ut_sonar_test_reporter.tpb'
@@install_component.sql 'reporters/ut_tap_reporter.tps'
@@install_component.sql 'reporters/ut_tap_reporter.tpb'

@@install_component.sql 'reporters/ut_coverage_html_reporter.tps'
@@install_component.sql 'reporters/ut_coverage_report_html_helper.pks'
@@install_component.sql 'reporters/ut_coverage_report_html_helper.pkb'
@@install_component.sql 'reporters/ut_coverage_html_reporter.tpb'
@@install_component.sql 'reporters/ut_coverage_sonar_reporter.tps'
@@install_component.sql 'reporters/ut_coverage_sonar_reporter.tpb'
@@install_component.sql 'reporters/ut_coverage_cobertura_reporter.tps'
@@install_component.sql 'reporters/ut_coverage_cobertura_reporter.tpb'
@@install_component.sql 'reporters/ut_realtime_reporter.tps'
@@install_component.sql 'reporters/ut_realtime_reporter.tpb'

@@install_component.sql 'api/be_between.syn'
@@install_component.sql 'api/be_empty.syn'
@@install_component.sql 'api/be_false.syn'
@@install_component.sql 'api/be_greater_or_equal.syn'
@@install_component.sql 'api/be_greater_than.syn'
@@install_component.sql 'api/be_less_or_equal.syn'
@@install_component.sql 'api/be_less_than.syn'
@@install_component.sql 'api/be_like.syn'
@@install_component.sql 'api/be_not_null.syn'
@@install_component.sql 'api/be_null.syn'
@@install_component.sql 'api/be_true.syn'
@@install_component.sql 'api/be_within_pct.syn'
@@install_component.sql 'api/be_within.syn'
@@install_component.sql 'api/equal.syn'
@@install_component.sql 'api/have_count.syn'
@@install_component.sql 'api/match.syn'
@@install_component.sql 'api/contain.syn'

set linesize 200
set define on
column text format a100
column error_count noprint new_value error_count

prompt Validating installation
prompt &&line_separator
set heading on
select type, name, sequence, line, position, text, count(1) over() error_count
  from all_errors
 where owner = upper('&&ut3_owner')
   and name not like 'BIN$%'  --not recycled
   and (name = 'UT' or name like 'UT\_%' escape '\')
   -- errors only. ignore warnings
   and attribute = 'ERROR'
 order by name, type, sequence
/

begin
  if to_number('&&error_count') > 0 then
    raise_application_error(-20000, 'Not all sources were successfully installed.');
  else
    dbms_output.put_line('Installation completed successfully');
    dbms_output.put_line('&&line_separator');
  end if;
end;
/

spool off
