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 a40b7c98..770a9312 100644 --- a/sqldev/pom.xml +++ b/sqldev/pom.xml @@ -6,14 +6,15 @@ org.utplsql org.utplsql.sqldev - 1.3.0 + 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/URLTools.java b/sqldev/src/main/java/org/utplsql/sqldev/model/URLTools.java index de225bcf..26190df3 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/URLTools.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/URLTools.java @@ -43,7 +43,9 @@ public static String getConnectionName(final URL url) { final Pattern p = Pattern.compile("(sqldev.nav:)([^/]+)(//)?"); final Matcher m = p.matcher(url.toString()); if (m.find()) { - return replaceHexChars(m.group(2).replace("IdeConnections%2523", "IdeConnections%23")); + return replaceHexChars(m.group(2) + .replace("IdeConnections%2523", "IdeConnections%23")) // remove connection prefix + .replace("+", " "); // spaces are encoded als plus signs, fix that, see #118 } else { return ""; } diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/XMLTools.java b/sqldev/src/main/java/org/utplsql/sqldev/model/XMLTools.java index 8756b9ab..090cf8d6 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/XMLTools.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/XMLTools.java @@ -130,13 +130,13 @@ public Node getElementNode(final Node node, final String tagName) { Node resultNode = null; if (node instanceof Element) { NodeList list = ((Element) node).getElementsByTagName(tagName); - if (list != null && list.getLength() > 0) { + if (list != null && list.getLength() > 0 && list.item(0).getParentNode() == node) { resultNode = list.item(0); } } return resultNode; } - + public DocumentBuilder createDocumentBuilder() { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try { 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/UtplsqlRunner.java b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java index 5f7c783d..6222c2e0 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java @@ -469,4 +469,10 @@ public Thread getProducerThread() { public Thread getConsumerThread() { return consumerThread; } + + // for testing purposes only + public Run getRun() { + return run; + } + } 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 145dde29..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(); } @@ -405,6 +411,19 @@ public boolean include(final RowFilter.Entry"); @@ -1296,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()); @@ -1396,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()))); @@ -1412,7 +1465,19 @@ public Component getTableCellRendererComponent(final JTable table, final Object testOverviewCodeCoverageMenuItem.setEnabled(true); } }); - + testOverviewTreeTable.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(final MouseEvent e) { + if (e.getClickCount() == 2) { + if (failuresTable.getSelectedRowCount() == 1) { + // open failure only if a Test node is selected + openSelectedFailure(); + } else { + openSelectedTest(); + } + } + } + }); final JTree overviewTreeTableName = testOverviewTreeTable.getTree(); overviewTreeTableName.setCellRenderer(new DefaultTreeCellRenderer() { private static final long serialVersionUID = 580783625740405285L; @@ -1515,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); @@ -1651,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 @@ -1670,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 @@ -1682,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 @@ -1694,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 @@ -1703,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 @@ -1881,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/java/org/utplsql/sqldev/ui/runner/SmartTime.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/SmartTime.java index fc4b2812..69ea1500 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/SmartTime.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/SmartTime.java @@ -16,7 +16,6 @@ package org.utplsql.sqldev.ui.runner; import java.text.DecimalFormat; -import java.util.Locale; public class SmartTime { private Double seconds; @@ -46,7 +45,6 @@ public Double getSeconds() { @Override public String toString() { - Locale.setDefault(new Locale("en", "US")); String ret; if (seconds == null) { ret = null; diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTreeTableModel.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTreeTableModel.java index c1562d2c..1676c3a1 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTreeTableModel.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTreeTableModel.java @@ -483,12 +483,6 @@ public Object getValueAt(Object node, int col) { switch (col) { case 0: if (showDescription && itemNode.getDescription() != null) { - if (itemNode.getUserObject() instanceof Suite) { - if (!itemNode.getName().contains("context_#")) { - // description of suites might be bewildering, hence use it for contexts only - return itemNode.getName(); - } - } return itemNode.getDescription(); } else { return itemNode.getName(); 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/SmartTimeTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/SmartTimeTest.java index 297a33f1..0f9662c0 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/SmartTimeTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/SmartTimeTest.java @@ -15,11 +15,19 @@ */ package org.utplsql.sqldev.test.runner; +import java.util.Locale; + import org.junit.Assert; +import org.junit.Before; import org.junit.Test; import org.utplsql.sqldev.ui.runner.SmartTime; public class SmartTimeTest { + + @Before + public void setup() { + Locale.setDefault(new Locale("en", "US")); + } @Test public void null_default() { diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerAggregationTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerAggregationTest.java new file mode 100644 index 00000000..798da672 --- /dev/null +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerAggregationTest.java @@ -0,0 +1,108 @@ +/* + * Copyright 2021 Philipp Salvisberg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.utplsql.sqldev.test.runner; + +import java.sql.Connection; +import java.util.Collections; +import java.util.LinkedHashMap; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.springframework.jdbc.datasource.SingleConnectionDataSource; +import org.utplsql.sqldev.model.DatabaseTools; +import org.utplsql.sqldev.model.SystemTools; +import org.utplsql.sqldev.model.runner.ItemNode; +import org.utplsql.sqldev.runner.UtplsqlRunner; +import org.utplsql.sqldev.test.AbstractJdbcTest; + +public class UtplsqlRunnerAggregationTest extends AbstractJdbcTest { + static final int SHOW_GUI_AFTER_RUN_COMPLETION_IN_SECONDS = 0; + + @Before + public void setup() { + // based on https://github.com/utPLSQL/utPLSQL-SQLDeveloper/issues/126 + jdbcTemplate.execute( + "create or replace package x is\n" + + "\n" + + " --%suite(suite x)\n" + + " --%suitepath(foo.bar)\n" + + "\n" + + " --%test(feature a)\n" + + " --%disabled\n" + + " procedure test_a;\n" + + "\n" + + " --%test(feature b)\n" + + " --%disabled\n" + + " procedure test_b;\n" + + "\n" + + "end;"); + jdbcTemplate.execute( + "create or replace package y is\n" + + "\n" + + " --%suite(suite y)\n" + + " --%suitepath(foo.bar)\n" + + "\n" + + " --%test(feature c)\n" + + " --%disabled\n" + + " procedure test_c;\n" + + "\n" + + " --%test(feature d)\n" + + " --%disabled\n" + + " procedure test_d;\n" + + "\n" + + "end;"); + } + + @After + public void teardown() { + executeAndIgnore(jdbcTemplate, "DROP PACKAGE x"); + executeAndIgnore(jdbcTemplate, "DROP PACKAGE y"); + } + + private Connection getNewConnection() { + final SingleConnectionDataSource ds = new SingleConnectionDataSource(); + ds.setDriverClassName("oracle.jdbc.OracleDriver"); + ds.setUrl(dataSource.getUrl()); + ds.setUsername(dataSource.getUsername()); + ds.setPassword(dataSource.getPassword()); + return DatabaseTools.getConnection(ds); + } + + @Test + public void aggregateDescription() { + UtplsqlRunner runner = new UtplsqlRunner(Collections.singletonList(":foo"), getNewConnection(), getNewConnection()); + runner.runTestAsync(); + SystemTools.waitForThread(runner.getProducerThread(), 10000); + SystemTools.waitForThread(runner.getConsumerThread(), 10000); + Assert.assertNotNull(runner); + LinkedHashMap nodes = runner.getRun().getItemNodes(); + Assert.assertEquals(9, nodes.size()); // 8 + 1 for the run node + Assert.assertNotNull(nodes.get(runner.getRun().getReporterId())); + Assert.assertNull(nodes.get("foo").getDescription()); + Assert.assertNull(nodes.get("foo.bar").getDescription()); + Assert.assertEquals("suite y", nodes.get("foo.bar.y").getDescription()); + Assert.assertEquals("suite x", nodes.get("foo.bar.x").getDescription()); + Assert.assertEquals("feature c", nodes.get("foo.bar.y.test_c").getDescription()); + Assert.assertEquals("feature d", nodes.get("foo.bar.y.test_d").getDescription()); + Assert.assertEquals("feature a", nodes.get("foo.bar.x.test_a").getDescription()); + Assert.assertEquals("feature b", nodes.get("foo.bar.x.test_b").getDescription()); + SystemTools.sleep(SHOW_GUI_AFTER_RUN_COMPLETION_IN_SECONDS * 1000); + runner.dispose(); + } + +} 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 d64d1302..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,12 +46,18 @@ 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); preferences.setShowWarningIndicator(false); preferences.setShowInfoIndicator(false); + preferences.setShowTestDescription(true); } } @@ -183,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