diff --git a/.gitignore b/.gitignore index ba2ce844..b81a66d7 100644 --- a/.gitignore +++ b/.gitignore @@ -4,8 +4,6 @@ # Log file *.log - - # Package Files *.jar *.war @@ -31,6 +29,7 @@ hs_err_pid* .project .classpath **/.settings +.vscode # IntelliJ **/.idea diff --git a/README.md b/README.md index 030f03d5..fa77ed47 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,11 @@ ## Introduction -utPLSQL for SQL Developer extends Oracle's SQL Developer to +utPLSQL for SQL Developer extends Oracle's SQL Developer to * run utPLSQL unit tests * debug utPLSQL unit tests -* run utPLSQL code coverage reports +* run utPLSQL code coverage reports * generate utPLSQL unit tests (skeletons) * provide utPLSQL annotations and expectations as snippets @@ -18,7 +18,7 @@ In the Connections window, select a connection or one or more packages or packag ### Debug utPLSQL test -Select the tests to debug, the same way you would if you were just running them, but select `Debug utPLSQL test...` in the context menu. +Select the tests to debug, the same way you would if you were just running them, but select `Debug utPLSQL test...` in the context menu. And then the PL/SQL Debugger is called for the generated, anonymous PL/SQL block. @@ -32,11 +32,11 @@ The initialization timeout for the realtime reporter is increased to 1 hour. The In the Connections window, select a connection or one or more packages for a code coverage report. -In the dialog you can set some parameters. If you run code coverage for a few chosen packages or from the PL/SQL editor the objects to be included are determined according the object dependencies in the Oracle data dictionary. +In the dialog you can set some parameters. If you run code coverage for a few chosen packages or from the PL/SQL editor the objects to be included are determined according the object dependencies in the Oracle data dictionary. ![Code coverage dialog](images/code_coverage_dialog.png) -Press `Run` to produce the code coverage process in the background. You may minimize or close the dialog. To abort the process, press `Cancel`. +Press `Run` to produce the code coverage process in the background. You may minimize or close the dialog. To abort the process, press `Cancel`. The HTML report is shown in your default browser. @@ -89,7 +89,7 @@ utPLSQL for SQL Developer implements the [OddgenGenerator2 interface](https://ww * run existing utPLSQL test suitepaths and test suites * bulk generate new utPLSQL unit tests into dedicated files -The use of [oddgen for SQL Developer](https://www.oddgen.org/) is optional. +The use of [oddgen for SQL Developer](https://www.oddgen.org/) is optional. #### Run utPLSQL test @@ -128,6 +128,7 @@ Binary releases are published [here](https://github.com/utPLSQL/utPLSQL-SQLDevel 4. Use the ```Search Update Center``` option and select the ```salvis.com``` update center to install the lastest version of ```utPLSQL for SQL Developer```. ## Issues + Please file your bug reports, enhancement requests, questions and other support requests within [Github's issue tracker](https://help.github.com/articles/about-issues/). * [Questions](https://github.com/utPLSQL/utPLSQL-SQLDeveloper/issues?q=is%3Aissue+label%3Aquestion) @@ -138,26 +139,27 @@ Please file your bug reports, enhancement requests, questions and other support ## How to Contribute 1. Describe your idea by [submitting an issue](https://github.com/utPLSQL/utPLSQL-SQLDeveloper/issues/new) -2. [Fork the utPLSQL-SQLDeveloper respository](https://github.com/utPLSQL/utPLSQL-SQLDeveloper/fork) +2. [Fork the utPLSQL-SQLDeveloper repository](https://github.com/utPLSQL/utPLSQL-SQLDeveloper/fork) 3. [Create a branch](https://help.github.com/articles/creating-and-deleting-branches-within-your-repository/), commit and publish your changes and enhancements 4. [Create a pull request](https://help.github.com/articles/creating-a-pull-request/) ## How to Build -1. [Download](http://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html) and install SQL Developer 20.2.0 -2. [Download](https://maven.apache.org/download.cgi) and install Apache Maven 3.6.3 -3. [Download](https://git-scm.com/downloads) and install a git command line client -4. Clone the utPLSQL-SQLDeveloper repository -5. Open a terminal window in the utPLSQL-SQLDeveloper root folder and type +1. [Download](http://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html) and install SQL Developer 24.3.1 +2. Download and install a JDK 17 or newer +3. [Download](https://maven.apache.org/download.cgi) and install Apache Maven 3.9.16 +4. [Download](https://git-scm.com/downloads) and install a git command line client +5. Clone the utPLSQL-SQLDeveloper repository +6. Open a terminal window in the utPLSQL-SQLDeveloper root folder and type - cd sqldev + cd sqldev -6. Run maven build by the following command +7. Run maven build by the following command - mvn -Dsqldev.basedir=/Applications/SQLDeveloper20.2.0.app/Contents/Resources/sqldeveloper -DskipTests=true clean package + mvn -Dsqldev.basedir=/Applications/SQLDeveloper24.3.1.app/Contents/Resources/sqldeveloper -DskipTests=true clean package - Amend the parameter sqldev.basedir to match the path of your SQL Developer installation. This folder is used to reference Oracle jar files which are not available in public Maven repositories -7. The resulting file ```utplsql_for_SQLDev_x.x.x-SNAPSHOT.zip``` in the ```target``` directory can be installed within SQL Developer + Amend the parameter sqldev.basedir to match the path of your SQL Developer installation. This folder is used to reference Oracle jar files which are not available in public Maven repositories +8. The resulting file ```utplsql_for_SQLDev_x.x.x-SNAPSHOT.zip``` in the ```target``` directory can be installed within SQL Developer ## License diff --git a/images/generate_utplsql_test.png b/images/generate_utplsql_test.png index 2ba8f9c4..49f45b58 100644 Binary files a/images/generate_utplsql_test.png and b/images/generate_utplsql_test.png differ diff --git a/images/generate_utplsql_test_from_template.png b/images/generate_utplsql_test_from_template.png index 40e7fc40..af3ae0a5 100644 Binary files a/images/generate_utplsql_test_from_template.png and b/images/generate_utplsql_test_from_template.png differ diff --git a/images/oddgen_generate_utplsql_test.png b/images/oddgen_generate_utplsql_test.png index 2ffeb7c9..f9438d03 100644 Binary files a/images/oddgen_generate_utplsql_test.png and b/images/oddgen_generate_utplsql_test.png differ diff --git a/images/oddgen_run_utplsql_test.png b/images/oddgen_run_utplsql_test.png index 9643d83a..72f5a2a1 100644 Binary files a/images/oddgen_run_utplsql_test.png and b/images/oddgen_run_utplsql_test.png differ diff --git a/images/runner_model.png b/images/runner_model.png index 1ca8e819..40491d80 100644 Binary files a/images/runner_model.png and b/images/runner_model.png differ diff --git a/images/snippets_annotations.png b/images/snippets_annotations.png index 9cf8a7bf..6c7400f8 100644 Binary files a/images/snippets_annotations.png and b/images/snippets_annotations.png differ diff --git a/images/snippets_expectations.png b/images/snippets_expectations.png index af23dc17..ccbd7836 100644 Binary files a/images/snippets_expectations.png and b/images/snippets_expectations.png differ diff --git a/sqldev/pom.xml b/sqldev/pom.xml index d9eb3c07..a2340e3d 100644 --- a/sqldev/pom.xml +++ b/sqldev/pom.xml @@ -6,185 +6,203 @@ org.utplsql org.utplsql.sqldev - 1.3.2-SNAPSHOT + 2.1.0-SNAPSHOT bundle UTF-8 - 1.8 - 1.8 - - /Applications/SQLDeveloper20.4.0.app/Contents/Resources/sqldeveloper + 17 + 24.3.1 + + /Applications/SQLDeveloper${sqldev.version}.app/Contents/Resources/sqldeveloper utplsql_for_SQLDev_${project.version} - - - -noverify -Djava.util.logging.config.file=${project.basedir}/src/test/resources/logging.conf - + - + oracle idert - 13.0.0 + ${sqldev.version} system ${sqldev.basedir}/ide/lib/idert.jar oracle oracle.javatools-nodeps - 12.2.1 + ${sqldev.version} system ${sqldev.basedir}/external/oracle.javatools-nodeps.jar oracle javatools - 13.0.0 + ${sqldev.version} system ${sqldev.basedir}/ide/lib/javatools.jar oracle oracle.ide.ceditor - 13.0.0 + ${sqldev.version} system ${sqldev.basedir}/ide/extensions/oracle.ide.ceditor.jar oracle oracle.ide - 13.0.0 + ${sqldev.version} system ${sqldev.basedir}/ide/extensions/oracle.ide.jar oracle uic - 13.0.0 + ${sqldev.version} system ${sqldev.basedir}/ide/lib/uic.jar oracle oracle.ide.navigator - 13.0.0 + ${sqldev.version} system ${sqldev.basedir}/ide/extensions/oracle.ide.navigator.jar oracle javax-ide - 13.0.0 + ${sqldev.version} system ${sqldev.basedir}/ide/lib/javax-ide.jar oracle oracle.dbtools-common - 19.4.0 + ${sqldev.version} system ${sqldev.basedir}/sqldeveloper/lib/dbtools-common.jar + + oracle + oracle.dbtools-arbori + ${sqldev.version} + system + ${sqldev.basedir}/sqldeveloper/lib/dbtools-arbori.jar + oracle oracle.sqldeveloper - 19.3.0 + ${sqldev.version} system ${sqldev.basedir}/sqldeveloper/extensions/oracle.sqldeveloper.jar oracle oracle.sqldeveloper.utils - 19.3.0 + ${sqldev.version} system ${sqldev.basedir}/sqldeveloper/extensions/oracle.sqldeveloper.utils.jar oracle oracle.sqldeveloper.worksheet - 19.3.0 + ${sqldev.version} system ${sqldev.basedir}/sqldeveloper/extensions/oracle.sqldeveloper.worksheet.jar oracle oracle.sqldeveloper.schemabrowser - 19.3.0 + ${sqldev.version} system ${sqldev.basedir}/sqldeveloper/extensions/oracle.sqldeveloper.schemabrowser.jar oracle - ojdbc8 - 19.3.0 + ojdbc11 + ${sqldev.version} system - ${sqldev.basedir}/jdbc/lib/ojdbc8.jar + ${sqldev.basedir}/jdbc/lib/ojdbc11.jar oracle dbapi - 19.3.0 + ${sqldev.version} system ${sqldev.basedir}/ide/lib/dbapi.jar oracle oracle.ide.db - 19.3.0 + ${sqldev.version} system ${sqldev.basedir}/ide/extensions/oracle.ide.db.jar oracle oracle.jdeveloper.db.connection - 19.3.0 + ${sqldev.version} system ${sqldev.basedir}/jdev/extensions/oracle.jdeveloper.db.connection.jar oracle oracle.jdeveloper.java.core.jar - 13.0.0 + ${sqldev.version} system ${sqldev.basedir}/jdev/extensions/oracle.jdeveloper.java.core.jar oracle oracle.jdeveloper.runner.jar - 13.0.0 + ${sqldev.version} system ${sqldev.basedir}/jdev/extensions/oracle.jdeveloper.runner.jar oracle oracle.ide.runner - 19.3.0 + ${sqldev.version} system ${sqldev.basedir}/ide/extensions/oracle.ide.runner.jar + + + oracle + javatools-nodeps + ${sqldev.version} + system + ${sqldev.basedir}/modules/oracle.javatools/javatools-nodeps.jar + oracle jewt4.jar - 13.0.0 + ${sqldev.version} system ${sqldev.basedir}/modules/oracle.bali.jewt/jewt4.jar oracle share.jar - 13.0.0 + ${sqldev.version} system ${sqldev.basedir}/modules/oracle.bali.share/share.jar - + com.google.code.findbugs + jsr305 + 3.0.2 + provided + + + org.osgi org.osgi.core - 5.0.0 + 6.0.0 provided @@ -192,19 +210,19 @@ org.springframework spring-jdbc - 5.3.2 + 7.0.8 org.springframework spring-core - 5.3.2 + 7.0.8 org.springframework spring-web - 5.3.2 + 7.0.8 @@ -216,13 +234,13 @@ junit junit - 4.13.1 + 4.13.2 test org.jetbrains annotations - 20.1.0 + 26.1.0 compile @@ -230,7 +248,6 @@ ${project.basedir}/src/main/java - ${project.basedir}/src/test/java src/main/resources @@ -239,40 +256,43 @@ + ${project.basedir}/src/test/java + + + src/test/resources + + **/*.* + + + org.apache.maven.plugins - 3.8.1 + 3.15.0 maven-compiler-plugin - ${jdk.version} - ${jdk.version} - - ${jdk.version.test} - ${jdk.version.test} - - **/*.java - + ${jdk.version} - - - - test-compile - process-test-sources - - testCompile - - - ${jdk.version.test} - ${jdk.version.test} - - - + + + org.apache.maven.plugins + maven-resources-plugin + 3.5.0 + + + org.apache.maven.plugins + maven-install-plugin + 3.1.4 + + + org.apache.maven.plugins + maven-deploy-plugin + 3.1.4 org.apache.maven.plugins maven-surefire-plugin - 2.22.2 + 3.5.6 @@ -302,7 +322,7 @@ org.apache.maven.plugins maven-antrun-plugin - 3.0.0 + 3.1.0 prepare-package @@ -323,7 +343,7 @@ org.codehaus.mojo properties-maven-plugin - 1.0.0 + 1.1.0 initialize @@ -343,7 +363,7 @@ org.codehaus.mojo build-helper-maven-plugin - 3.1.0 + 3.3.0 parse-version @@ -413,7 +433,7 @@ org.apache.felix maven-bundle-plugin - 4.2.1 + 6.0.2 true ${project.name} @@ -456,8 +476,10 @@ org.aspectj.runtime, org.aspectj.lang.reflect, org.springframework.core.style, - org.springframework.lang + org.springframework.lang, + org.jspecify.annotations + <_noee>true oracle.javatools, oracle.javatools-nodeps, @@ -482,7 +504,7 @@ maven-assembly-plugin - 3.3.0 + 3.8.0 ${final.name} false @@ -504,7 +526,7 @@ net.nicoulaj.maven.plugins checksum-maven-plugin - 1.9 + 1.11 calculate-checksums @@ -518,7 +540,7 @@ org.jacoco jacoco-maven-plugin - 0.8.5 + 0.8.15 @@ -584,12 +606,21 @@ org.codehaus.mojo buildnumber-maven-plugin - 1.4 + 3.3.0 - + + + + + org.javassist + javassist + 3.30.2-GA + + + org.utplsql.sqldev Extension for running unit tests in SQL Developer. diff --git a/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java b/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java index 8935af08..79bcaa79 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java @@ -190,7 +190,7 @@ private void run() { PreferenceModel preferences; try { preferences = PreferenceModel.getInstance(Preferences.getPreferences()); - } catch (NoClassDefFoundError error) { + } catch (NoClassDefFoundError | ExceptionInInitializerError error) { // not running in SQL Developer (in tests) preferences = PreferenceModel.getInstance(null); } diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java index 1fea9bcb..1c7191a5 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java @@ -355,6 +355,7 @@ private void populate(final Test test, final Node node) { test.setObjectName(xmlTools.getElementValue(node, "objectName")); test.setProcedureName(xmlTools.getElementValue(node, "procedureName")); test.setDisabled("true".equals(xmlTools.getElementValue(node, "disabled"))); + test.setDisabledReason(xmlTools.getElementValue(node, "disabledReason")); test.setName(xmlTools.getElementValue(node, "name")); test.setDescription(xmlTools.getElementValue(node, "description")); test.setTestNumber(Integer.valueOf(xmlTools.getElementValue(node, "testNumber"))); diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java index 5282b469..605d376b 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java @@ -241,7 +241,8 @@ public boolean containsUtplsqlTest(final String owner, final String objectName, sb.append(" AND (item_name = upper(?) or ? IS NULL)\n"); final String sql = sb.toString(); final Object[] binds = new Object[] {owner, objectName, subobjectName, subobjectName}; - final Integer found = jdbcTemplate.queryForObject(sql, Integer.class, binds); + final int[] types = new int[] {Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR}; + final Integer found = jdbcTemplate.queryForObject(sql, binds, types, Integer.class); return found != null && found > 0; } else { // using internal API (deprecated, not accessible in latest version) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.java b/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.java index 5cba1557..13bd9794 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.java @@ -172,7 +172,7 @@ public void setNumberOfRunsInHistory(final int runs) { } public boolean isShowDisabledCounter() { - return getHashStructure().getBoolean(KEY_SHOW_DISABLED_COUNTER, false); + return getHashStructure().getBoolean(KEY_SHOW_DISABLED_COUNTER, true); } public void setShowDisabledCounter(final boolean showDisabledCounter) { @@ -180,7 +180,7 @@ public void setShowDisabledCounter(final boolean showDisabledCounter) { } public boolean isShowWarningsCounter() { - return getHashStructure().getBoolean(KEY_SHOW_WARNINGS_COUNTER, false); + return getHashStructure().getBoolean(KEY_SHOW_WARNINGS_COUNTER, true); } public void setShowWarningsCounter(final boolean showWarningCounter) { @@ -188,7 +188,7 @@ public void setShowWarningsCounter(final boolean showWarningCounter) { } public boolean isShowInfoCounter() { - return getHashStructure().getBoolean(KEY_SHOW_INFO_COUNTER, false); + return getHashStructure().getBoolean(KEY_SHOW_INFO_COUNTER, true); } public void setShowInfoCounter(final boolean showInfoCounter) { @@ -196,7 +196,7 @@ public void setShowInfoCounter(final boolean showInfoCounter) { } public boolean isShowWarningIndicator() { - return getHashStructure().getBoolean(KEY_SHOW_WARNING_INDICATOR, false); + return getHashStructure().getBoolean(KEY_SHOW_WARNING_INDICATOR, true); } public void setShowWarningIndicator(final boolean showWarningIndicator) { @@ -204,7 +204,7 @@ public void setShowWarningIndicator(final boolean showWarningIndicator) { } public boolean isShowInfoIndicator() { - return getHashStructure().getBoolean(KEY_SHOW_INFO_INDICATOR, false); + return getHashStructure().getBoolean(KEY_SHOW_INFO_INDICATOR, true); } public void setShowInfoIndicator(final boolean showInfoIndicator) { @@ -228,7 +228,7 @@ public void setShowDisabledTests(final boolean showDisabledTests) { } public boolean isShowTestDescription() { - return getHashStructure().getBoolean(KEY_SHOW_TEST_DESCRIPTION, false); + return getHashStructure().getBoolean(KEY_SHOW_TEST_DESCRIPTION, true); } public void setShowTestDescription(final boolean showTestDescription) { diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Test.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Test.java index 0df46eba..a0e893f8 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Test.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Test.java @@ -26,6 +26,7 @@ public class Test extends Item { private String objectName; private String procedureName; private Boolean disabled; + private String disabledReason; private Integer testNumber; private List failedExpectations; @@ -53,6 +54,7 @@ public String toString() { .append("objectName", objectName) .append("procedureName", procedureName) .append("disabled", disabled) + .append("disabledReason", disabledReason) .append("testNumber", testNumber) .append("failedExpectations", failedExpectations) .toString(); @@ -98,6 +100,14 @@ public void setDisabled(final Boolean disabled) { this.disabled = disabled; } + public String getDisabledReason() { + return disabledReason; + } + + public void setDisabledReason(final String disabledReason) { + this.disabledReason = disabledReason; + } + public Integer getTestNumber() { return testNumber; } diff --git a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java index ecc55269..f88331ba 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java @@ -138,25 +138,25 @@ public String generateProlog(final Connection conn, final List nodes) { final LinkedHashMap params = dedupNodes.get(0).getParams(); final StringBuilder sb = new StringBuilder(); if (YES.equals(params.get(RESET_PACKAGE))) { - sb.append("EXECUTE dbms_session.reset_package;\n"); + sb.append("execute dbms_session.reset_package;\n"); } - sb.append("SET SERVEROUTPUT ON SIZE UNLIMITED\n"); + sb.append("set serveroutput on size unlimited\n"); if (YES.equals(params.get(CLEAR_SCREEN))) { - sb.append("CLEAR SCREEN\n"); + sb.append("clear screen\n"); } if (dedupNodes.size() == 1) { - sb.append("EXECUTE ut.run('"); + sb.append("execute ut.run('"); sb.append(getPath(dedupNodes.get(0), conn)); sb.append("');\n"); } else { final List paths = dedupNodes.stream().map(node -> getPath(node, conn)).collect(Collectors.toList()); - sb.append("BEGIN\n"); + sb.append("begin\n"); sb.append("\tut.run(\n"); sb.append("\t\tut_varchar2_list(\n"); sb.append(StringTools.getCSV(paths, "\t\t\t")); sb.append("\t\t)\n"); sb.append("\t);\n"); - sb.append("END;\n"); + sb.append("end;\n"); sb.append("/\n"); } final String ret = sb.toString(); diff --git a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestGenerator.java b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestGenerator.java index 422e7e1d..f4602ea6 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestGenerator.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestGenerator.java @@ -239,9 +239,9 @@ public String generateProlog(final Connection conn, final List nodes) { if (generateFiles) { resetConsoleOutput(); saveConsoleOutput(templateTools.mkdirs(outputDirectory)); - if (deleteExistingfiles) { - saveConsoleOutput(deleteFiles(outputDirectory).toString()); - } + if (deleteExistingfiles) { + saveConsoleOutput(deleteFiles(outputDirectory).toString()); + } sb.append("--\n"); sb.append("-- install generated utPLSQL test packages\n"); sb.append("--\n"); @@ -251,8 +251,9 @@ public String generateProlog(final Connection conn, final List nodes) { context.setConn(conn); final TestTemplate testTemplate = new TestTemplate(context); if (generateFiles) { - final String packageName = context.getTestPackagePrefix() + nodeTools.toObjectName(node) - + context.getTestPackageSuffix(); + final String packageName = context.getTestPackagePrefix().toLowerCase() + + nodeTools.toObjectName(node).toLowerCase() + + context.getTestPackageSuffix().toLowerCase(); final String packagePath = outputDirectory + File.separator + packageName; saveConsoleOutput(templateTools.writeToFile(packagePath + ".pks", testTemplate.generateSpec())); saveConsoleOutput(templateTools.writeToFile(packagePath + ".pkb", testTemplate.generateBody())); diff --git a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestTemplate.java b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestTemplate.java index bc445465..7bbdff3f 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestTemplate.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestTemplate.java @@ -39,13 +39,13 @@ public String generateSpec() { final StringBuilder sb = new StringBuilder(); final String objectName = context.getObjectName().toLowerCase(); final String packageName = context.getTestPackagePrefix() + objectName + context.getTestPackageSuffix(); - sb.append("CREATE OR REPLACE PACKAGE "); + sb.append("create or replace package "); sb.append(packageName); - sb.append(" IS\n\n"); + sb.append(" is\n"); if (context.isGenerateComments()) { - sb.append("\t/* generated by utPLSQL for SQL Developer on "); + sb.append("\n\t-- generated by utPLSQL for SQL Developer on "); sb.append(today); - sb.append(" */\n\n"); + sb.append("\n\n"); } sb.append("\t--%suite("); sb.append(packageName); @@ -53,8 +53,9 @@ public String generateSpec() { if (!context.getSuitePath().isEmpty()) { sb.append("\t--%suitepath("); sb.append(context.getSuitePath()); - sb.append(")\n\n"); + sb.append(")\n"); } + sb.append("\n"); for (final String u : units) { final String unit = u.toLowerCase(); if (context.getNumberOfTestsPerUnit() > 1 @@ -68,7 +69,7 @@ public String generateSpec() { if (context.isDisableTests()) { sb.append("\t--%disabled\n"); } - sb.append("\tPROCEDURE "); + sb.append("\tprocedure "); sb.append(context.getTestUnitPrefix()); sb.append(unit); sb.append(context.getTestUnitSuffix()); @@ -82,7 +83,7 @@ public String generateSpec() { sb.append("\t--%endcontext\n\n"); } } - sb.append("END "); + sb.append("end "); sb.append(packageName); sb.append(";\n"); sb.append("/"); @@ -93,15 +94,15 @@ public String generateSpec() { public String generateBody() { StringBuilder sb = new StringBuilder(); final String objectName = context.getObjectName().toLowerCase(); - sb.append("CREATE OR REPLACE PACKAGE BODY "); + sb.append("create or replace package body "); sb.append(context.getTestPackagePrefix()); sb.append(objectName); sb.append(context.getTestPackageSuffix()); - sb.append(" IS\n\n"); + sb.append(" is\n\n"); if (context.isGenerateComments()) { - sb.append("\t/* generated by utPLSQL for SQL Developer on "); + sb.append("\t-- generated by utPLSQL for SQL Developer on "); sb.append(today); - sb.append(" */\n\n"); + sb.append("\n\n"); } for (final String u : units) { final String unit = u.toLowerCase(); @@ -116,33 +117,34 @@ public String generateBody() { sb.append(" case "); sb.append(i); sb.append(": ...\n"); + } else { + sb.append("\n"); } sb.append("\t--\n"); } - sb.append("\tPROCEDURE "); + sb.append("\tprocedure "); sb.append(procedureName); - sb.append(" IS\n"); - sb.append("\t\tl_actual INTEGER := 0;\n"); - sb.append("\t\tl_expected INTEGER := 1;\n"); - sb.append("\tBEGIN\n"); + sb.append(" is\n"); + sb.append("\t\tl_actual integer := 0;\n"); + sb.append("\t\tl_expected integer := 1;\n"); + sb.append("\tbegin\n"); if (context.isGenerateComments()) { - sb.append("\t\t-- populate actual\n"); + sb.append("\t\t-- arrange\n\n"); + sb.append("\t\t-- act\n"); sb.append("\t\t-- "); sb.append(objectName); sb.append("."); sb.append(unit); sb.append(";\n\n"); - sb.append("\t\t-- populate expected\n"); - sb.append("\t\t-- ...\n\n"); sb.append("\t\t-- assert\n"); } sb.append("\t\tut.expect(l_actual).to_equal(l_expected);\n"); - sb.append("\tEND "); + sb.append("\tend "); sb.append(procedureName); sb.append(";\n\n"); } } - sb.append("END "); + sb.append("end "); sb.append(context.getTestPackagePrefix()); sb.append(objectName); sb.append(context.getTestPackageSuffix()); diff --git a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlWorksheetRunner.java b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlWorksheetRunner.java index ebc0e7cc..5a0773b2 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlWorksheetRunner.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlWorksheetRunner.java @@ -77,30 +77,30 @@ private CharSequence getCode() { StringBuilder sb = new StringBuilder(); if (!debug) { if (preferences.isResetPackage()) { - sb.append("EXECUTE dbms_session.reset_package;\n"); + sb.append("execute dbms_session.reset_package;\n"); } - sb.append("SET SERVEROUTPUT ON SIZE UNLIMITED\n"); + sb.append("set serveroutput on size unlimited\n"); if (preferences.isClearScreen()) { - sb.append("CLEAR SCREEN\n"); + sb.append("clear screen\n"); } if (pathList.size() == 1) { - sb.append("EXECUTE ut.run('"); + sb.append("execute ut.run('"); sb.append(pathList.get(0)); sb.append("');\n"); } else { // we want a horizontal dense output because we resize the worksheet to fit the command in common cases - sb.append("EXECUTE ut.run(ut_varchar2_list("); + sb.append("execute ut.run(ut_varchar2_list("); sb.append(StringTools.getCSV(pathList, "").replace("\n", "")); sb.append("));\n"); } } else { - sb.append("BEGIN\n"); + sb.append("begin\n"); sb.append(" ut.run(\n"); sb.append(" ut_varchar2_list(\n"); sb.append(StringTools.getCSV(pathList, 9)); sb.append(" )\n"); sb.append(" );\n"); - sb.append("END;\n"); + sb.append("end;\n"); } return sb; } diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.java index d56a1176..703766ff 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.java @@ -244,11 +244,11 @@ private String trimPlusNewLine(final String input) { private CharSequence utSpecTemplate() { StringBuilder sb = new StringBuilder(); - sb.append("CREATE OR REPLACE PACKAGE "); + sb.append("create or replace package "); sb.append(testPackagePrefixTextField.getText()); sb.append("[package_name]"); sb.append(testPackageSuffixTextField.getText()); - sb.append(" IS\n\n"); + sb.append(" is\n\n"); sb.append("\t--%suite\n"); if (!suitePathTextField.getText().isEmpty()) { sb.append("\t--%suitepath("); @@ -258,7 +258,7 @@ private CharSequence utSpecTemplate() { sb.append("\n\t"); sb.append(utSpecProcTemplate().toString().trim().replace("\n", "\n\t")); sb.append("\n\n"); - sb.append("END "); + sb.append("end "); sb.append(testPackagePrefixTextField.getText()); sb.append("[package_name]"); sb.append(testPackageSuffixTextField.getText()); @@ -279,7 +279,7 @@ private CharSequence utSpecProcTemplate() { if (disableTestsCheckBox.isSelected()) { sb.append("--%disabled\n"); } - sb.append("PROCEDURE "); + sb.append("procedure "); sb.append(testUnitPrefixTextField.getText()); sb.append("[procedure_name]"); sb.append(testUnitSuffixTextField.getText()); @@ -296,14 +296,14 @@ private CharSequence utSpecProcTemplate() { private CharSequence utBodyTemplate() { StringBuilder sb = new StringBuilder(); - sb.append("CREATE OR REPLACE PACKAGE BODY "); + sb.append("create or replace package body "); sb.append(testPackagePrefixTextField.getText()); sb.append("[package_name]"); sb.append(testPackageSuffixTextField.getText()); - sb.append(" IS\n\n\t"); + sb.append(" is\n\n\t"); sb.append(utBodyProcTemplate().toString().trim().replace("\n", "\n\t")); sb.append("\n\n"); - sb.append("END "); + sb.append("end "); sb.append(testPackagePrefixTextField.getText()); sb.append("[package_name]"); sb.append(testPackageSuffixTextField.getText()); @@ -328,26 +328,24 @@ private CharSequence utBodyProcTemplate() { sb.append('\n'); sb.append("--\n"); } - sb.append("PROCEDURE "); + sb.append("procedure "); sb.append(testUnitPrefixTextField.getText()); sb.append("[procedure_name]"); sb.append(testUnitSuffixTextField.getText()); if (withContext) { sb.append(i); } - sb.append(" IS\n"); - sb.append("\tl_actual INTEGER := 0;\n"); - sb.append("\tl_expected INTEGER := 1;\n"); - sb.append("BEGIN\n"); + sb.append(" is\n"); + sb.append("\tl_actual integer := 0;\n"); + sb.append("\tl_expected integer := 1;\n"); + sb.append("begin\n"); if (generateCommentsCheckBox.isSelected()) { - sb.append("\t-- populate actual\n"); - sb.append("\t-- ...\n\n"); - sb.append("\t-- populate expected\n"); - sb.append("\t-- ...\n\n"); + sb.append("\t-- arrange\n\n"); + sb.append("\t-- act\n\n"); sb.append("\t-- assert\n"); } sb.append("\tut.expect(l_actual).to_equal(l_expected);\n"); - sb.append("END "); + sb.append("end "); sb.append(testUnitPrefixTextField.getText()); sb.append("[procedure_name]"); sb.append(testUnitSuffixTextField.getText()); diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java index fec6c0e4..5f225a84 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java @@ -142,6 +142,7 @@ public class RunnerPanel { private RunnerTextField testPackageTextField; private RunnerTextField testProcedureTextField; private RunnerTextArea testDescriptionTextArea; + private RunnerTextArea testDisabledReasonTextArea; private RunnerTextArea testIdTextArea; private RunnerTextField testStartTextField; private FailuresTableModel failuresTableModel; @@ -249,6 +250,7 @@ private void resetDerived() { testPackageTextField.setText(null); testProcedureTextField.setText(null); testDescriptionTextArea.setText(null); + testDisabledReasonTextArea.setText(null); testStartTextField.setText(null); failuresTableModel.setModel(null); failuresTableModel.fireTableDataChanged(); @@ -345,6 +347,8 @@ private void selectTestInTestOverviewTable(Test test) { private void applyShowSuites() { applyFilter(showSuccessfulTestsCheckBoxMenuItem.isSelected(), showDisabledTestsCheckBoxMenuItem.isSelected()); + final TableColumn overviewTreeTableTime = testOverviewTreeTable.getColumnModel().getColumn(3); + final TableColumn overviewTableTime = testOverviewTable.getColumnModel().getColumn(4); if (showSuitesCheckBoxMenuItem.isSelected()) { testOverviewScrollPane.setViewportView(testOverviewTreeTable); // sync in tree-table - just first selected test @@ -357,6 +361,7 @@ private void applyShowSuites() { testOverviewTreeTable.getTree().setSelectionPath(new TreePath(itemNode.getPath())); } } + overviewTreeTableTime.setPreferredWidth(overviewTableTime.getWidth()); } else { testOverviewScrollPane.setViewportView(testOverviewTable); // sync in table - just first test in selected item @@ -372,6 +377,7 @@ private void applyShowSuites() { } selectTestInTestOverviewTable(test); } + overviewTableTime.setPreferredWidth(overviewTreeTableTime.getWidth()); } showSelectedRow(); } @@ -562,7 +568,7 @@ private void syncDetailTab() { private PreferenceModel getPreferenceModel() { try { return PreferenceModel.getInstance(Preferences.getPreferences()); - } catch (NoClassDefFoundError e) { + } catch (NoClassDefFoundError | ExceptionInInitializerError e) { // running outside of SQL Developer return PreferenceModel.getInstance(null); } @@ -834,10 +840,12 @@ private void showSelectedRow() { if (!showSuitesCheckBoxMenuItem.isSelected()) { // table final int rowIndex = testOverviewTable.getSelectedRow(); - final int row = testOverviewTable.convertRowIndexToModel(rowIndex); - final Rectangle position = testOverviewTable - .getCellRect(testOverviewTable.convertRowIndexToView(row), 0, true); - testOverviewTable.scrollRectToVisible(position); + if (rowIndex != -1) { + final int row = testOverviewTable.convertRowIndexToModel(rowIndex); + final Rectangle position = testOverviewTable + .getCellRect(testOverviewTable.convertRowIndexToView(row), 0, true); + testOverviewTable.scrollRectToVisible(position); + } } else { // tree-table TreePath path = testOverviewTreeTable.getTree().getSelectionPath(); @@ -923,6 +931,13 @@ private String getLinkedAndFormattedText(final String text) { localText = localText.substring(0, start) + title + localText.substring(end); m = p3.matcher(localText); } + // replaces two consecutive spaces with two non-breaking spaces to fix #140 + // assume that consecutive spaces do not conflict with previous replacements + // using CSS "white-space: pre-wrap;" does not work within Swing, it's simply ignored. + // See https://docs.oracle.com/javase/8/docs/api/javax/swing/text/html/CSS.html + // putting text in pre tags is not an option, because this suppresses wrap. + localText = localText.replaceAll(" ", "  "); + // add paragraph for each line to preserve line breaks StringBuilder sb = new StringBuilder(); for (final String p : localText.split("\n")) { sb.append("

"); @@ -1332,6 +1347,7 @@ private void initializeGUI() { testPackageTextField.setText(test.getObjectName()); testProcedureTextField.setText(test.getProcedureName()); testDescriptionTextArea.setText(StringTools.trim(test.getDescription())); + testDisabledReasonTextArea.setText(StringTools.trim(test.getDisabledReason())); testIdTextArea.setText(test.getId()); testStartTextField.setText(StringTools.formatDateTime(test.getStartTime())); failuresTableModel.setModel(test.getFailedExpectations()); @@ -1432,11 +1448,12 @@ public Component getTableCellRendererComponent(final JTable table, final Object if (test.getFailedExpectations() != null && !test.getFailedExpectations().isEmpty()) { failuresTable.setRowSelectionInterval(0, 0); } + testDisabledReasonTextArea.setText(test.getDisabledReason()); } else { failuresTableModel.setModel(null); failuresTableModel.fireTableDataChanged(); testFailureMessageTextPane.setText(null); - + testDisabledReasonTextArea.setText(null); } testErrorStackTextPane.setText(getHtml(StringTools.trim(item.getErrorStack()))); testWarningsTextPane.setText(getHtml(StringTools.trim(item.getWarnings()))); @@ -1563,6 +1580,8 @@ public Component getTreeCellRendererComponent(JTree tree, Object value, boolean showTestDescriptionCheckBoxMenuItem.addActionListener(event -> { applyShowTestDescription(); fixCheckBoxMenuItem(showTestDescriptionCheckBoxMenuItem); + // force refresh to fix issue #131 (truncated name/description), accepting side-effect, that the selection is lost + refreshAction(); }); testOverviewPopupMenu.add(showTestDescriptionCheckBoxMenuItem); showWarningIndicatorCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SHOW_WARNING_INDICATOR_LABEL").replace("?", ""), true); @@ -1699,11 +1718,39 @@ public Component getTreeCellRendererComponent(JTree tree, Object value, boolean c.weightx = 1; c.weighty = 0; testInfoPanel.add(testDescriptionTextArea, c); + // - Disabled Reason + final JLabel testDisabledReasonLabel = new JLabel(UtplsqlResources.getString("RUNNER_DISABLED_REASON_LABEL")); + testDisabledReasonLabel.setBorder(BorderFactory.createEmptyBorder(isMacLookAndFeel() ? 5 : 3, 0, 0, 0)); + c.gridx = 0; + c.gridy = 4; + c.gridwidth = 1; + c.gridheight = 1; + c.insets = new Insets(5, 10, 0, 0); // top, left, bottom, right + c.anchor = GridBagConstraints.NORTHWEST; + c.fill = GridBagConstraints.NONE; + c.weightx = 0; + c.weighty = 0; + testInfoPanel.add(testDisabledReasonLabel, c); + testDisabledReasonTextArea = new RunnerTextArea(); + testDisabledReasonTextArea.setEditable(false); + testDisabledReasonTextArea.setEnabled(true); + testDisabledReasonTextArea.setLineWrap(true); + testDisabledReasonTextArea.setWrapStyleWord(true); + c.gridx = 1; + c.gridy = 4; + c.gridwidth = 1; + c.gridheight = 1; + c.insets = new Insets(5, 5, 0, 10); // top, left, bottom, right + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 0; + testInfoPanel.add(testDisabledReasonTextArea, c); // - Suitepath (id) final JLabel testIdLabel = new JLabel(UtplsqlResources.getString("RUNNER_TEST_ID_COLUMN")); testIdLabel.setBorder(BorderFactory.createEmptyBorder(isMacLookAndFeel() ? 5 : 3, 0, 0, 0)); c.gridx = 0; - c.gridy = 4; + c.gridy = 5; c.gridwidth = 1; c.gridheight = 1; c.insets = new Insets(5, 10, 0, 0); // top, left, bottom, right @@ -1718,7 +1765,7 @@ public Component getTreeCellRendererComponent(JTree tree, Object value, boolean testIdTextArea.setLineWrap(true); testIdTextArea.setWrapStyleWord(false); c.gridx = 1; - c.gridy = 4; + c.gridy = 5; c.gridwidth = 1; c.gridheight = 1; c.insets = new Insets(5, 5, 0, 10); // top, left, bottom, right @@ -1730,7 +1777,7 @@ public Component getTreeCellRendererComponent(JTree tree, Object value, boolean // - Start final JLabel testStartLabel = new JLabel(UtplsqlResources.getString("RUNNER_START_LABEL")); c.gridx = 0; - c.gridy = 5; + c.gridy = 6; c.gridwidth = 1; c.gridheight = 1; c.insets = new Insets(5, 10, 10, 0); // top, left, bottom, right @@ -1742,7 +1789,7 @@ public Component getTreeCellRendererComponent(JTree tree, Object value, boolean testStartTextField = new RunnerTextField(); testStartTextField.setEditable(false); c.gridx = 1; - c.gridy = 5; + c.gridy = 6; c.gridwidth = 1; c.gridheight = 1; c.insets = new Insets(5, 5, 10, 10); // top, left, bottom, right @@ -1751,8 +1798,9 @@ public Component getTreeCellRendererComponent(JTree tree, Object value, boolean c.weightx = 1; c.weighty = 0; testInfoPanel.add(testStartTextField, c); + // - Vertical filler c.gridx = 0; - c.gridy = 6; + c.gridy = 7; c.gridwidth = 1; c.gridheight = 1; c.insets = new Insets(0, 0, 0, 0); // top, left, bottom, right @@ -1929,10 +1977,12 @@ public void mouseClicked(final MouseEvent e) { BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(new Color(219, 219, 219)), BorderFactory.createEmptyBorder(1, 1, 1, 1))); testDescriptionTextArea.setBorder(border); + testDisabledReasonTextArea.setBorder(border); testIdTextArea.setBorder(border); } else { final Border referenceBorder = testOwnerTextField.getBorder(); testDescriptionTextArea.setBorder(referenceBorder); + testDisabledReasonTextArea.setBorder(referenceBorder); testIdTextArea.setBorder(referenceBorder); } } diff --git a/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources.properties b/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources.properties index 680cabc3..a2adee4d 100644 --- a/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources.properties +++ b/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources.properties @@ -6,7 +6,7 @@ EXTENSION_NAME=utPLSQL for SQL Developer EXTENSION_DESCRIPTION=Extension for running unit tests in SQL Developer. EXTENSION_OWNER=Philipp Salvisberg # suppress inspection "UnusedProperty" -MIN_SQLDEV_VERSION=12.2.0.19.0.7 +MIN_SQLDEV_VERSION=24.3.1.347.1826 # Icons UTPLSQL_ICON=/org/utplsql/sqldev/resources/images/utPLSQL.png @@ -103,6 +103,7 @@ RUNNER_TESTS_LABEL=Tests RUNNER_FAILURES_LABEL=Failures RUNNER_ERRORS_LABEL=Errors RUNNER_DISABLED_LABEL=Disabled +RUNNER_DISABLED_REASON_LABEL=Disabled Reason RUNNER_WARNINGS_LABEL=Warnings RUNNER_INFO_LABEL=Info RUNNER_INITIALIZING_TEXT=Initializing... diff --git a/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources_de.properties b/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources_de.properties index 8ba5566e..7c9661b8 100644 --- a/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources_de.properties +++ b/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources_de.properties @@ -71,6 +71,7 @@ RUNNER_TESTS_LABEL=Tests RUNNER_FAILURES_LABEL=Fehlschl\u00e4ge RUNNER_ERRORS_LABEL=Fehler RUNNER_DISABLED_LABEL=Deaktiviert +RUNNER_DISABLED_REASON_LABEL=Deaktivierungsgrund RUNNER_WARNINGS_LABEL=Warnungen RUNNER_INFO_LABEL=Info RUNNER_INITIALIZING_TEXT=Initialisierung... @@ -88,7 +89,7 @@ RUNNER_DESCRIPTION_LABEL=Beschreibung RUNNER_START_LABEL=Start RUNNER_ASSERT_DESCRIPTION_COLUMN=Assert Beschreibung (gescheiterte Zeile) RUNNER_TEST_TAB_LABEL=Test/Suite -RUNNER_FAILURES_TAB_LABEL=Misserfolge +RUNNER_FAILURES_TAB_LABEL=Fehlschl\u00e4ge RUNNER_ERRORS_TAB_LABEL=Fehler RUNNER_WARNINGS_TAB_LABEL=Warnungen RUNNER_INFO_TAB_LABEL=Info diff --git a/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlSnippets.xml b/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlSnippets.xml index 8915628f..f1a3d4e4 100644 --- a/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlSnippets.xml +++ b/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlSnippets.xml @@ -16,7 +16,7 @@ )]]> - + )]]> @@ -71,176 +71,191 @@ .].][,...])]]> - + .].][,...])]]> - + )]]> - + - + )]]> - + )]]> - + + + )]]> + + + - + - + [,...])]]> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + - + - + - + - + - + - + - + - + - + - + - + + + + + + - + - + @@ -250,7 +265,7 @@ - + diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/JsonToStringStylerTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/JsonToStringStylerTest.java index a5c548ce..606b8f9b 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/JsonToStringStylerTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/JsonToStringStylerTest.java @@ -191,6 +191,7 @@ public void runWithTests() { sb.append(" \"objectName\": null,\n"); sb.append(" \"procedureName\": null,\n"); sb.append(" \"disabled\": null,\n"); + sb.append(" \"disabledReason\": null,\n"); sb.append(" \"testNumber\": null,\n"); sb.append(" \"failedExpectations\": null\n"); sb.append(" },\n"); @@ -222,6 +223,7 @@ public void runWithTests() { sb.append(" \"objectName\": null,\n"); sb.append(" \"procedureName\": null,\n"); sb.append(" \"disabled\": null,\n"); + sb.append(" \"disabledReason\": null,\n"); sb.append(" \"testNumber\": null,\n"); sb.append(" \"failedExpectations\": null\n"); sb.append(" }\n"); diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.java index a68e4b25..7bdfab60 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.java @@ -100,7 +100,7 @@ private void delayFreeStreamingConsumtionProducer(final String reporterId) { @Test public void delayFreeStreamingConsumtion() { - final long TOLERANCE_MS = 600; + final long TOLERANCE_MS = 2000; SingleConnectionDataSource ds = new SingleConnectionDataSource(); ds.setDriverClassName("oracle.jdbc.OracleDriver"); ds.setUrl(dataSource.getUrl()); @@ -114,7 +114,7 @@ public void delayFreeStreamingConsumtion() { thread.start(); dao.consumeReport(reporterId, consumer); logger.fine(consumer.getPostTestEvents().toString()); - Assert.assertEquals(5, consumer.getPostTestEvents().entrySet().size()); + Assert.assertEquals(5, consumer.getPostTestEvents().size()); final Long test_1_0 = consumer.getPostTestEvents().get("junit_utplsql_fetch_size_pkg.test_1_0"); final Long test_2_1 = consumer.getPostTestEvents().get("junit_utplsql_fetch_size_pkg.test_2_1"); final Long test_3_2 = consumer.getPostTestEvents().get("junit_utplsql_fetch_size_pkg.test_3_2"); diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.java index 1ed23f7e..68bf9e4e 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.java @@ -32,14 +32,14 @@ public void defaultValues() { Assert.assertFalse(model.isCheckRunUtplsqlTest()); Assert.assertFalse(model.isUseSmartTimes()); Assert.assertEquals(10, model.getNumberOfRunsInHistory()); - Assert.assertFalse(model.isShowDisabledCounter()); - Assert.assertFalse(model.isShowWarningsCounter()); - Assert.assertFalse(model.isShowInfoCounter()); - Assert.assertFalse(model.isShowWarningIndicator()); - Assert.assertFalse(model.isShowInfoIndicator()); + Assert.assertTrue(model.isShowDisabledCounter()); + Assert.assertTrue(model.isShowWarningsCounter()); + Assert.assertTrue(model.isShowInfoCounter()); + Assert.assertTrue(model.isShowWarningIndicator()); + Assert.assertTrue(model.isShowInfoIndicator()); Assert.assertTrue(model.isShowSuccessfulTests()); Assert.assertTrue(model.isShowDisabledTests()); - Assert.assertFalse(model.isShowTestDescription()); + Assert.assertTrue(model.isShowTestDescription()); Assert.assertTrue(model.isSyncDetailTab()); Assert.assertTrue(model.isShowSuites()); Assert.assertEquals("test_", model.getTestPackagePrefix()); diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerTest.java index 3728b404..991dbc82 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerTest.java @@ -46,7 +46,12 @@ public void setupDefaultPreferences() { preferences = PreferenceModel.getInstance(null); // the second call will call will succeed and use preferences from user.home // this ensures that the test and the runner use the same preferences - preferences = PreferenceModel.getInstance(Preferences.getPreferences()); + try { + preferences = PreferenceModel.getInstance(Preferences.getPreferences()); + } catch (NoClassDefFoundError e2) { + // the second call also failed. no other option left (new behavior with Java17) + preferences = PreferenceModel.getInstance(null); + } } finally { // set defaults manually, since all tests are using the same preference store preferences.setShowSuccessfulTests(true); @@ -184,7 +189,7 @@ public void runTestsWithMaxTime() { } @Test - public void runTestsHidingSuccesfulRuns() { + public void runTestsHidingSuccessfulRuns() { preferences.setShowSuccessfulTests(false); preferences.setShowWarningIndicator(true); preferences.setShowInfoIndicator(true); diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/template/TemplateTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/template/TemplateTest.java new file mode 100644 index 00000000..534bdc7c --- /dev/null +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/template/TemplateTest.java @@ -0,0 +1,228 @@ +package org.utplsql.sqldev.test.template; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.utplsql.sqldev.model.oddgen.GenContext; +import org.utplsql.sqldev.oddgen.TestTemplate; +import org.utplsql.sqldev.test.AbstractJdbcTest; +import org.utplsql.sqldev.test.coverage.CodeCoverageReporterTest; + +import java.sql.SQLException; + +public class TemplateTest extends AbstractJdbcTest { + + @Before + public void setup() { + executeAndIgnore(jdbcTemplate, """ + create or replace package junit_pkg is + procedure proc; + end; + """); + } + + + @After + public void teardown() { + executeAndIgnore(jdbcTemplate, "drop package junit_pkg"); + } + + @Test + public void spec_no_comment_no_disable_no_path() throws SQLException { + // arrange + var context = new GenContext(); + context.setConn(dataSource.getConnection()); + context.setObjectType("PACKAGE"); + context.setObjectName("JUNIT_PKG"); + context.setTestPackagePrefix(""); + context.setTestPackageSuffix("_test"); + context.setTestUnitPrefix(""); + context.setTestUnitSuffix(""); + context.setNumberOfTestsPerUnit(1); + context.setGenerateComments(false); + context.setDisableTests(false); + context.setSuitePath(""); + context.setIndentSpaces(3); + + // act + var template = new TestTemplate(context); + var actual = template.generateSpec(); + + // assert + var expected = """ + create or replace package junit_pkg_test is + --%suite(junit_pkg_test) + + --%test + procedure proc; + + end junit_pkg_test; + / + """.trim(); + Assert.assertEquals(expected, actual); + } + + @Test + public void spec_no_comment_no_disable_with_path() throws SQLException { + // arrange + var context = new GenContext(); + context.setConn(dataSource.getConnection()); + context.setObjectType("PACKAGE"); + context.setObjectName("JUNIT_PKG"); + context.setTestPackagePrefix(""); + context.setTestPackageSuffix("_test"); + context.setTestUnitPrefix(""); + context.setTestUnitSuffix(""); + context.setNumberOfTestsPerUnit(1); + context.setGenerateComments(false); + context.setDisableTests(false); + context.setSuitePath("org.utplsql"); + context.setIndentSpaces(3); + + // act + var template = new TestTemplate(context); + var actual = template.generateSpec(); + + // assert + var expected = """ + create or replace package junit_pkg_test is + --%suite(junit_pkg_test) + --%suitepath(org.utplsql) + + --%test + procedure proc; + + end junit_pkg_test; + / + """.trim(); + Assert.assertEquals(expected, actual); + } + + @Test + public void spec_no_comment_disable_with_path() throws SQLException { + // arrange + var context = new GenContext(); + context.setConn(dataSource.getConnection()); + context.setObjectType("PACKAGE"); + context.setObjectName("JUNIT_PKG"); + context.setTestPackagePrefix(""); + context.setTestPackageSuffix("_test"); + context.setTestUnitPrefix(""); + context.setTestUnitSuffix(""); + context.setNumberOfTestsPerUnit(1); + context.setGenerateComments(false); + context.setDisableTests(true); + context.setSuitePath("org.utplsql"); + context.setIndentSpaces(3); + + // act + var template = new TestTemplate(context); + var actual = template.generateSpec(); + + // assert + var expected = """ + create or replace package junit_pkg_test is + --%suite(junit_pkg_test) + --%suitepath(org.utplsql) + + --%test + --%disabled + procedure proc; + + end junit_pkg_test; + / + """.trim(); + Assert.assertEquals(expected, actual); + } + + @Test + public void spec_comment_disable_with_path() throws SQLException { + // arrange + var context = new GenContext(); + context.setConn(dataSource.getConnection()); + context.setObjectType("PACKAGE"); + context.setObjectName("JUNIT_PKG"); + context.setTestPackagePrefix(""); + context.setTestPackageSuffix("_test"); + context.setTestUnitPrefix(""); + context.setTestUnitSuffix(""); + context.setNumberOfTestsPerUnit(1); + context.setGenerateComments(true); + context.setDisableTests(true); + context.setSuitePath("org.utplsql"); + context.setIndentSpaces(3); + + // act + var template = new TestTemplate(context); + var actual = template.generateSpec() + .replaceAll("[0-9]{4}-[0-9]{2}-[0-9]{2}[ ]{1}[0-9]{2}:[0-9]{2}:[0-9]{2}", "datetime"); + + // assert + var expected = """ + create or replace package junit_pkg_test is + + -- generated by utPLSQL for SQL Developer on datetime + + --%suite(junit_pkg_test) + --%suitepath(org.utplsql) + + --%test + --%disabled + procedure proc; + + end junit_pkg_test; + / + """.trim(); + Assert.assertEquals(expected, actual); + } + + @Test + public void spec_comment_disable_with_path_two_units() throws SQLException { + // arrange + var context = new GenContext(); + context.setConn(dataSource.getConnection()); + context.setObjectType("PACKAGE"); + context.setObjectName("JUNIT_PKG"); + context.setTestPackagePrefix(""); + context.setTestPackageSuffix("_test"); + context.setTestUnitPrefix(""); + context.setTestUnitSuffix(""); + context.setNumberOfTestsPerUnit(2); + context.setGenerateComments(true); + context.setDisableTests(true); + context.setSuitePath("org.utplsql"); + context.setIndentSpaces(3); + + // act + var template = new TestTemplate(context); + var actual = template.generateSpec() + .replaceAll("[0-9]{4}-[0-9]{2}-[0-9]{2}[ ]{1}[0-9]{2}:[0-9]{2}:[0-9]{2}", "datetime"); + + // assert + var expected = """ + create or replace package junit_pkg_test is + + -- generated by utPLSQL for SQL Developer on datetime + + --%suite(junit_pkg_test) + --%suitepath(org.utplsql) + + --%context(proc) + + --%test + --%disabled + procedure proc1; + + --%test + --%disabled + procedure proc2; + + --%endcontext + + end junit_pkg_test; + / + """.trim(); + Assert.assertEquals(expected, actual); + } +} diff --git a/sqldev/src/test/resources/test.properties b/sqldev/src/test/resources/test.properties index 3b8b4b51..8ddd39f8 100644 --- a/sqldev/src/test/resources/test.properties +++ b/sqldev/src/test/resources/test.properties @@ -1,7 +1,7 @@ # properties to connect to Oracle Database using JDBC thin driver -host=localhost +host=127.0.0.1 port=1521 -service=odb.docker +service=freepdb1 # oracle users scott_username=scott