diff --git a/README.md b/README.md
index 8003f6c..f29cec0 100644
--- a/README.md
+++ b/README.md
@@ -142,10 +142,11 @@ Please file your bug reports, enhancement requests, questions and other support
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 21.4.2
-2. [Download](https://maven.apache.org/download.cgi) and install Apache Maven 3.8.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/SQLDeveloper21.4.2.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/sqldev/pom.xml b/sqldev/pom.xml
index d54e580..62d8eb3 100644
--- a/sqldev/pom.xml
+++ b/sqldev/pom.xml
@@ -10,10 +10,11 @@
bundle
UTF-8
- 1.8
- 1.8
+ 8
+ 17
- /Applications/SQLDeveloper21.4.2.app/Contents/Resources/sqldeveloper
+
+ /Applications/SQLDeveloper21.4.3.app/Contents/Resources/sqldeveloper
utplsql_for_SQLDev_${project.version}
@@ -206,19 +207,19 @@
org.springframework
spring-jdbc
- 5.3.16
+ 5.3.22
org.springframework
spring-core
- 5.3.20
+ 5.3.22
org.springframework
spring-web
- 5.3.16
+ 5.3.22
@@ -244,7 +245,6 @@
${project.basedir}/src/main/java
- ${project.basedir}/src/test/java
src/main/resources
@@ -253,36 +253,16 @@
+ ${project.basedir}/src/test/java
+
+
+ src/test/resources
+
+ **/*.*
+
+
+
-
- org.apache.maven.plugins
- 3.10.0
- 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
@@ -316,7 +296,7 @@
org.apache.maven.plugins
maven-antrun-plugin
- 3.0.0
+ 3.1.0
prepare-package
@@ -337,7 +317,7 @@
org.codehaus.mojo
properties-maven-plugin
- 1.0.0
+ 1.1.0
initialize
@@ -357,7 +337,7 @@
org.codehaus.mojo
build-helper-maven-plugin
- 3.1.0
+ 3.3.0
parse-version
@@ -427,7 +407,7 @@
org.apache.felix
maven-bundle-plugin
- 4.2.1
+ 5.1.7
true
${project.name}
@@ -497,7 +477,7 @@
maven-assembly-plugin
- 3.3.0
+ 3.4.1
${final.name}
false
@@ -519,7 +499,7 @@
net.nicoulaj.maven.plugins
checksum-maven-plugin
- 1.9
+ 1.11
calculate-checksums
@@ -533,7 +513,7 @@
org.jacoco
jacoco-maven-plugin
- 0.8.5
+ 0.8.8
@@ -645,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 8935af0..79bcaa7 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/oddgen/TestTemplate.java b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestTemplate.java
index daef240..7bbdff3 100644
--- a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestTemplate.java
+++ b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestTemplate.java
@@ -41,9 +41,9 @@ public String generateSpec() {
final String packageName = context.getTestPackagePrefix() + objectName + context.getTestPackageSuffix();
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");
}
@@ -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
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 ebc0e7c..5a0773b 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/runner/RunnerPanel.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java
index 3182a89..5f225a8 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
@@ -568,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);
}
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 4ff779a..991dbc8 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);
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 0000000..534bdc7
--- /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);
+ }
+}