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..f29cec04 100644 --- a/README.md +++ b/README.md @@ -138,14 +138,15 @@ 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 ## 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 +1. [Download](http://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html) and install SQL Developer 21.4.3 +2. [Download](https://maven.apache.org/download.cgi) and install Apache Maven 3.8.6 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 @@ -154,7 +155,7 @@ Please file your bug reports, enhancement requests, questions and other support 6. 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/SQLDeveloper21.4.3.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 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 1eb3c9d3..770a9312 100644 --- a/sqldev/pom.xml +++ b/sqldev/pom.xml @@ -6,14 +6,15 @@ org.utplsql org.utplsql.sqldev - 1.3.1 + 1.4.2-SNAPSHOT bundle UTF-8 - 1.8 - 1.8 + 8 + 17 - /Applications/SQLDeveloper20.2.0.app/Contents/Resources/sqldeveloper + + /Applications/SQLDeveloper21.4.3.app/Contents/Resources/sqldeveloper utplsql_for_SQLDev_${project.version} @@ -21,13 +22,13 @@ - + - + oracle idert - 13.0.0 + 12.2.1 system ${sqldev.basedir}/ide/lib/idert.jar @@ -41,147 +42,161 @@ oracle javatools - 13.0.0 + 12.2.1 system ${sqldev.basedir}/ide/lib/javatools.jar oracle oracle.ide.ceditor - 13.0.0 + 12.2.1 system ${sqldev.basedir}/ide/extensions/oracle.ide.ceditor.jar oracle oracle.ide - 13.0.0 + 12.2.1 system ${sqldev.basedir}/ide/extensions/oracle.ide.jar oracle uic - 13.0.0 + 12.2.1 system ${sqldev.basedir}/ide/lib/uic.jar oracle oracle.ide.navigator - 13.0.0 + 12.2.1 system ${sqldev.basedir}/ide/extensions/oracle.ide.navigator.jar oracle javax-ide - 13.0.0 + 12.2.1 system ${sqldev.basedir}/ide/lib/javax-ide.jar oracle oracle.dbtools-common - 19.4.0 + 21.4.1 system ${sqldev.basedir}/sqldeveloper/lib/dbtools-common.jar oracle oracle.sqldeveloper - 19.3.0 + 21.4.2 system ${sqldev.basedir}/sqldeveloper/extensions/oracle.sqldeveloper.jar oracle oracle.sqldeveloper.utils - 19.3.0 + 21.4.2 system ${sqldev.basedir}/sqldeveloper/extensions/oracle.sqldeveloper.utils.jar oracle oracle.sqldeveloper.worksheet - 19.3.0 + 21.4.2 system ${sqldev.basedir}/sqldeveloper/extensions/oracle.sqldeveloper.worksheet.jar oracle oracle.sqldeveloper.schemabrowser - 19.3.0 + 21.4.2 system ${sqldev.basedir}/sqldeveloper/extensions/oracle.sqldeveloper.schemabrowser.jar oracle ojdbc8 - 19.3.0 + 21.4.0 system ${sqldev.basedir}/jdbc/lib/ojdbc8.jar oracle dbapi - 19.3.0 + 21.4.2 system ${sqldev.basedir}/ide/lib/dbapi.jar oracle oracle.ide.db - 19.3.0 + 21.4.2 system ${sqldev.basedir}/ide/extensions/oracle.ide.db.jar oracle oracle.jdeveloper.db.connection - 19.3.0 + 21.4.2 system ${sqldev.basedir}/jdev/extensions/oracle.jdeveloper.db.connection.jar oracle oracle.jdeveloper.java.core.jar - 13.0.0 + 12.2.1 system ${sqldev.basedir}/jdev/extensions/oracle.jdeveloper.java.core.jar oracle oracle.jdeveloper.runner.jar - 13.0.0 + 12.2.1 system ${sqldev.basedir}/jdev/extensions/oracle.jdeveloper.runner.jar oracle oracle.ide.runner - 19.3.0 + 12.2.1 system ${sqldev.basedir}/ide/extensions/oracle.ide.runner.jar + + + oracle + javatools-nodeps + 12.2.1 + system + ${sqldev.basedir}/modules/oracle.javatools/javatools-nodeps.jar + oracle jewt4.jar - 13.0.0 + 12.2.1 system ${sqldev.basedir}/modules/oracle.bali.jewt/jewt4.jar oracle share.jar - 13.0.0 + 12.2.1 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 @@ -192,19 +207,19 @@ org.springframework spring-jdbc - 5.3.2 + 5.3.22 org.springframework spring-core - 5.3.2 + 5.3.22 org.springframework spring-web - 5.3.2 + 5.3.22 @@ -216,13 +231,13 @@ junit junit - 4.13.1 + 4.13.2 test org.jetbrains annotations - 20.1.0 + 23.0.0 compile @@ -230,7 +245,6 @@ ${project.basedir}/src/main/java - ${project.basedir}/src/test/java src/main/resources @@ -239,36 +253,16 @@ + ${project.basedir}/src/test/java + + + src/test/resources + + **/*.* + + + - - org.apache.maven.plugins - 3.8.1 - maven-compiler-plugin - - ${jdk.version} - ${jdk.version} - - ${jdk.version.test} - ${jdk.version.test} - - **/*.java - - - - - - test-compile - process-test-sources - - testCompile - - - ${jdk.version.test} - ${jdk.version.test} - - - - org.apache.maven.plugins maven-surefire-plugin @@ -302,7 +296,7 @@ org.apache.maven.plugins maven-antrun-plugin - 3.0.0 + 3.1.0 prepare-package @@ -323,7 +317,7 @@ org.codehaus.mojo properties-maven-plugin - 1.0.0 + 1.1.0 initialize @@ -343,7 +337,7 @@ org.codehaus.mojo build-helper-maven-plugin - 3.1.0 + 3.3.0 parse-version @@ -413,7 +407,7 @@ org.apache.felix maven-bundle-plugin - 4.2.1 + 5.1.7 true ${project.name} @@ -458,6 +452,7 @@ org.springframework.core.style, org.springframework.lang + <_noee>true oracle.javatools, oracle.javatools-nodeps, @@ -482,7 +477,7 @@ maven-assembly-plugin - 3.3.0 + 3.4.1 ${final.name} false @@ -504,7 +499,7 @@ net.nicoulaj.maven.plugins checksum-maven-plugin - 1.9 + 1.11 calculate-checksums @@ -518,7 +513,7 @@ org.jacoco jacoco-maven-plugin - 0.8.5 + 0.8.8 @@ -584,7 +579,7 @@ org.codehaus.mojo buildnumber-maven-plugin - 1.4 + 3.0.0 @@ -630,4 +625,54 @@ master https://github.com/utPLSQL/utPLSQL-SQLDeveloper + + + + + + default + + true + + + + + org.apache.maven.plugins + 3.10.1 + maven-compiler-plugin + + + + ${jdk.version} + ${jdk.test.version} + + + + + + + idea + + false + + idea.maven.embedder.version + + + + + + org.apache.maven.plugins + 3.10.1 + maven-compiler-plugin + + + + ${jdk.test.version} + ${jdk.test.version} + + + + + + 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/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..911a6dfe 100644 --- a/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources.properties +++ b/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources.properties @@ -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..7691dcb7 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... 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/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..9c71960d 100644 --- a/sqldev/src/test/resources/test.properties +++ b/sqldev/src/test/resources/test.properties @@ -1,5 +1,5 @@ # properties to connect to Oracle Database using JDBC thin driver -host=localhost +host=fillmore port=1521 service=odb.docker