Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
5ad20c7
test: support full-null relationship coverage (#154)
elpete Aug 22, 2026
8c55a8f
test: avoid literal member syntax on older Adobe CF
elpete Aug 22, 2026
d37ca1b
test: run all engines with full null support
elpete Aug 22, 2026
ba92c6a
fix: preserve omitted arguments with full null support
elpete Aug 22, 2026
6f73cfa
fix: support native BoxLang test coverage
elpete Aug 22, 2026
f3e7a68
test: stabilize the complete engine matrix
elpete Aug 22, 2026
0a3f3d9
test: use supported full-null engine pairings
elpete Aug 23, 2026
adc9f9e
test: guard deprecated ColdBox interception data
elpete Aug 23, 2026
38fb352
test: harden ColdBox full-null lazy guards
elpete Aug 23, 2026
ce8d7be
test: guard optional CacheBox full-null settings
elpete Aug 23, 2026
a81ce31
test: complete ColdBox 7 full-null guards
elpete Aug 23, 2026
b5ee3c3
test: patch cbjavaloader for full null support
elpete Aug 23, 2026
4d4130c
test: update to TestBox 7
elpete Aug 23, 2026
e70e481
fix: initialize optional callbacks with full null support
elpete Aug 23, 2026
c3cb528
test: patch mementifier for full null support
elpete Aug 23, 2026
a8a0b3d
test: use public struct checks for entity mementos
elpete Aug 23, 2026
4542e14
fix: guard optional state with full null support
elpete Aug 23, 2026
7654c6c
fix: preserve relationship keys with full null support
elpete Aug 23, 2026
ee3749d
fix: detect omitted null check values
elpete Aug 23, 2026
4d1dbc1
fix: distinguish omitted null check values
elpete Aug 23, 2026
9f4639e
test: install MySQL support for BoxLang BE
elpete Aug 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 105 additions & 0 deletions .github/patches/coldbox-full-null.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
diff --git a/tests/resources/app/coldbox/system/testing/VirtualApp.cfc b/tests/resources/app/coldbox/system/testing/VirtualApp.cfc
--- a/tests/resources/app/coldbox/system/testing/VirtualApp.cfc
+++ b/tests/resources/app/coldbox/system/testing/VirtualApp.cfc
@@ -94 +94 @@
- return !isNull( application.cbController );
+ return application.keyExists( "cbController" ) && !isNull( application.cbController );
@@ -112 +112 @@
- if ( !isNull( application.cbController ) ) {
+ if ( application.keyExists( "cbController" ) && !isNull( application.cbController ) ) {
diff --git a/tests/resources/app/coldbox/system/logging/config/LogBoxConfig.cfc b/tests/resources/app/coldbox/system/logging/config/LogBoxConfig.cfc
--- a/tests/resources/app/coldbox/system/logging/config/LogBoxConfig.cfc
+++ b/tests/resources/app/coldbox/system/logging/config/LogBoxConfig.cfc
@@ -64 +64 @@
- if ( isNull( variables.utility ) ) {
+ if ( !variables.keyExists( "utility" ) || isNull( variables.utility ) ) {
diff --git a/tests/resources/app/coldbox/system/core/util/Util.cfc b/tests/resources/app/coldbox/system/core/util/Util.cfc
--- a/tests/resources/app/coldbox/system/core/util/Util.cfc
+++ b/tests/resources/app/coldbox/system/core/util/Util.cfc
@@ -296 +296 @@
- if ( isNull( variables.mixerUtil ) ) {
+ if ( !variables.keyExists( "mixerUtil" ) || isNull( variables.mixerUtil ) ) {
diff --git a/tests/resources/app/coldbox/system/logging/Logger.cfc b/tests/resources/app/coldbox/system/logging/Logger.cfc
--- a/tests/resources/app/coldbox/system/logging/Logger.cfc
+++ b/tests/resources/app/coldbox/system/logging/Logger.cfc
@@ -399 +399 @@
- if ( isNull( local.logEvent ) ) {
+ if ( !local.keyExists( "logEvent" ) || isNull( local.logEvent ) ) {
diff --git a/tests/resources/app/coldbox/system/core/delegates/Env.cfc b/tests/resources/app/coldbox/system/core/delegates/Env.cfc
--- a/tests/resources/app/coldbox/system/core/delegates/Env.cfc
+++ b/tests/resources/app/coldbox/system/core/delegates/Env.cfc
@@ -87 +87 @@
- if ( isNull( variables.javaSystem ) ) {
+ if ( !variables.keyExists( "javaSystem" ) || isNull( variables.javaSystem ) ) {
diff --git a/tests/resources/app/coldbox/system/web/services/InterceptorService.cfc b/tests/resources/app/coldbox/system/web/services/InterceptorService.cfc
--- a/tests/resources/app/coldbox/system/web/services/InterceptorService.cfc
+++ b/tests/resources/app/coldbox/system/web/services/InterceptorService.cfc
@@ -194 +194 @@
- if ( !isNull( arguments.interceptData ) ) {
+ if ( arguments.keyExists( "interceptData" ) && !isNull( arguments.interceptData ) ) {
diff --git a/tests/resources/app/coldbox/system/testing/BaseTestCase.cfc b/tests/resources/app/coldbox/system/testing/BaseTestCase.cfc
--- a/tests/resources/app/coldbox/system/testing/BaseTestCase.cfc
+++ b/tests/resources/app/coldbox/system/testing/BaseTestCase.cfc
@@ -162 +162 @@
- if ( isNull( variables._ranBeforeAll ) ) {
+ if ( !variables.keyExists( "_ranBeforeAll" ) || isNull( variables._ranBeforeAll ) ) {
@@ -172 +172 @@
- if ( isNull( variables._ranAfterAll ) ) {
+ if ( !variables.keyExists( "_ranAfterAll" ) || isNull( variables._ranAfterAll ) ) {
@@ -784 +784 @@
- if ( !isNull( arguments.interceptData ) ) {
+ if ( arguments.keyExists( "interceptData" ) && !isNull( arguments.interceptData ) ) {
@@ -847 +847 @@
- if ( isNull( variables.cbUtil ) ) {
+ if ( !variables.keyExists( "cbUtil" ) || isNull( variables.cbUtil ) ) {
@@ -859 +859 @@
- if ( isNull( variables.env ) ) {
+ if ( !variables.keyExists( "env" ) || isNull( variables.env ) ) {
diff --git a/tests/resources/app/coldbox/system/ioc/Builder.cfc b/tests/resources/app/coldbox/system/ioc/Builder.cfc
--- a/tests/resources/app/coldbox/system/ioc/Builder.cfc
+++ b/tests/resources/app/coldbox/system/ioc/Builder.cfc
@@ -82 +82 @@
- if ( isNull( variables.coldboxDSL ) ) {
+ if ( !variables.keyExists( "coldboxDSL" ) || isNull( variables.coldboxDSL ) ) {
@@ -94 +94 @@
- if ( isNull( variables.cacheBoxDSL ) ) {
+ if ( !variables.keyExists( "cacheBoxDSL" ) || isNull( variables.cacheBoxDSL ) ) {
@@ -106 +106 @@
- if ( isNull( variables.logBoxDSL ) ) {
+ if ( !variables.keyExists( "logBoxDSL" ) || isNull( variables.logBoxDSL ) ) {
diff --git a/tests/resources/app/coldbox/system/cache/store/ConcurrentStore.cfc b/tests/resources/app/coldbox/system/cache/store/ConcurrentStore.cfc
--- a/tests/resources/app/coldbox/system/cache/store/ConcurrentStore.cfc
+++ b/tests/resources/app/coldbox/system/cache/store/ConcurrentStore.cfc
@@ -261 +261 @@
- if ( isNull( variables.collections ) ) {
+ if ( !variables.keyExists( "collections" ) || isNull( variables.collections ) ) {
diff --git a/tests/resources/app/coldbox/system/FrameworkSupertype.cfc b/tests/resources/app/coldbox/system/FrameworkSupertype.cfc
--- a/tests/resources/app/coldbox/system/FrameworkSupertype.cfc
+++ b/tests/resources/app/coldbox/system/FrameworkSupertype.cfc
@@ -621 +621 @@
- if ( isNull( variables.asyncManager ) ) {
+ if ( !variables.keyExists( "asyncManager" ) || isNull( variables.asyncManager ) ) {
@@ -755 +755 @@
- if ( isNull( variables.cbDateTimeHelper ) ) {
+ if ( !variables.keyExists( "cbDateTimeHelper" ) || isNull( variables.cbDateTimeHelper ) ) {
diff --git a/tests/resources/app/coldbox/system/core/util/Util.cfc b/tests/resources/app/coldbox/system/core/util/Util.cfc
--- a/tests/resources/app/coldbox/system/core/util/Util.cfc
+++ b/tests/resources/app/coldbox/system/core/util/Util.cfc
@@ -124 +124 @@
- if ( isNull( variables.inetAddress ) ) {
+ if ( !variables.keyExists( "inetAddress" ) || isNull( variables.inetAddress ) ) {
diff --git a/tests/resources/app/coldbox/system/cache/config/CacheBoxConfig.cfc b/tests/resources/app/coldbox/system/cache/config/CacheBoxConfig.cfc
--- a/tests/resources/app/coldbox/system/cache/config/CacheBoxConfig.cfc
+++ b/tests/resources/app/coldbox/system/cache/config/CacheBoxConfig.cfc
@@ -107 +107 @@
- if ( !isNull( cacheBoxDSL.logBoxConfig ) ) {
+ if ( structKeyExists( cacheBoxDSL, "logBoxConfig" ) && !isNull( cacheBoxDSL.logBoxConfig ) ) {
@@ -112 +112 @@
- if ( !isNull( cacheBoxDSL.scopeRegistration ) ) {
+ if ( structKeyExists( cacheBoxDSL, "scopeRegistration" ) && !isNull( cacheBoxDSL.scopeRegistration ) ) {
@@ -117 +117 @@
- if ( !isNull( cacheBoxDSL.caches ) ) {
+ if ( structKeyExists( cacheBoxDSL, "caches" ) && !isNull( cacheBoxDSL.caches ) ) {
@@ -125 +125 @@
- if ( !isNull( cacheBoxDSL.listeners ) ) {
+ if ( structKeyExists( cacheBoxDSL, "listeners" ) && !isNull( cacheBoxDSL.listeners ) ) {
51 changes: 51 additions & 0 deletions .github/patches/coldbox7-full-null.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
diff --git a/tests/resources/app/coldbox/system/core/util/Util.cfc b/tests/resources/app/coldbox/system/core/util/Util.cfc
--- a/tests/resources/app/coldbox/system/core/util/Util.cfc
+++ b/tests/resources/app/coldbox/system/core/util/Util.cfc
@@ -12 +12 @@
- if ( isNull( variables.engineMappingHelper ) ) {
+ if ( !variables.keyExists( "engineMappingHelper" ) || isNull( variables.engineMappingHelper ) ) {
diff --git a/tests/resources/app/coldbox/system/logging/LogEvent.cfc b/tests/resources/app/coldbox/system/logging/LogEvent.cfc
--- a/tests/resources/app/coldbox/system/logging/LogEvent.cfc
+++ b/tests/resources/app/coldbox/system/logging/LogEvent.cfc
@@ -61 +61 @@
- if ( isNull( variables.xmlConverter ) ) {
+ if ( !variables.keyExists( "xmlConverter" ) || isNull( variables.xmlConverter ) ) {
@@ -68 +68 @@
- if ( isNull( variables.util ) ) {
+ if ( !variables.keyExists( "util" ) || isNull( variables.util ) ) {
diff --git a/tests/resources/app/coldbox/system/cache/AbstractCacheBoxProvider.cfc b/tests/resources/app/coldbox/system/cache/AbstractCacheBoxProvider.cfc
--- a/tests/resources/app/coldbox/system/cache/AbstractCacheBoxProvider.cfc
+++ b/tests/resources/app/coldbox/system/cache/AbstractCacheBoxProvider.cfc
@@ -115 +115 @@
- if ( isNull( variables.utility ) ) {
+ if ( !variables.keyExists( "utility" ) || isNull( variables.utility ) ) {
@@ -428 +428 @@
- if ( isNull( variables.uuidHelper ) ) {
+ if ( !variables.keyExists( "uuidHelper" ) || isNull( variables.uuidHelper ) ) {
diff --git a/tests/resources/app/coldbox/system/cache/CacheFactory.cfc b/tests/resources/app/coldbox/system/cache/CacheFactory.cfc
--- a/tests/resources/app/coldbox/system/cache/CacheFactory.cfc
+++ b/tests/resources/app/coldbox/system/cache/CacheFactory.cfc
@@ -484 +484 @@
- if ( isNull( variables.config ) ) {
+ if ( !variables.keyExists( "config" ) || isNull( variables.config ) ) {
diff --git a/tests/resources/app/coldbox/system/remote/ColdboxProxy.cfc b/tests/resources/app/coldbox/system/remote/ColdboxProxy.cfc
--- a/tests/resources/app/coldbox/system/remote/ColdboxProxy.cfc
+++ b/tests/resources/app/coldbox/system/remote/ColdboxProxy.cfc
@@ -342 +342 @@
- if ( isNull( variables.util ) ) {
+ if ( !variables.keyExists( "util" ) || isNull( variables.util ) ) {
@@ -354 +354 @@
- if ( isNull( variables.remotingUtil ) ) {
+ if ( !variables.keyExists( "remotingUtil" ) || isNull( variables.remotingUtil ) ) {
diff --git a/tests/resources/app/coldbox/system/web/context/RequestContext.cfc b/tests/resources/app/coldbox/system/web/context/RequestContext.cfc
--- a/tests/resources/app/coldbox/system/web/context/RequestContext.cfc
+++ b/tests/resources/app/coldbox/system/web/context/RequestContext.cfc
@@ -1576 +1576 @@
- if ( isNull( variables.privateContext.response ) ) {
+ if ( !variables.privateContext.keyExists( "response" ) || isNull( variables.privateContext.response ) ) {
diff --git a/modules/str/modules/cbjavaloader/models/javaloader/JavaLoader.cfc b/modules/str/modules/cbjavaloader/models/javaloader/JavaLoader.cfc
--- a/modules/str/modules/cbjavaloader/models/javaloader/JavaLoader.cfc
+++ b/modules/str/modules/cbjavaloader/models/javaloader/JavaLoader.cfc
@@ -570 +570 @@
- returntype="string"
+ returntype="void"
34 changes: 34 additions & 0 deletions .github/patches/mementifier-full-null.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
diff --git a/modules/mementifier/interceptors/Mementifier.cfc b/modules/mementifier/interceptors/Mementifier.cfc
--- a/modules/mementifier/interceptors/Mementifier.cfc
+++ b/modules/mementifier/interceptors/Mementifier.cfc
@@ -89,2 +89,3 @@
- var dateMask = isNull( this.memento.dateMask ) ? variables.settings.dateMask : this.memento.dateMask;
- var timeMask = isNull( this.memento.timeMask ) ? variables.settings.timeMask : this.memento.timeMask;
+ var entityMemento = structKeyExists( arguments.entity, "memento" ) ? arguments.entity.memento : {};
+ var dateMask = !entityMemento.keyExists( "dateMask" ) || isNull( entityMemento.dateMask ) ? variables.settings.dateMask : entityMemento.dateMask;
+ var timeMask = !entityMemento.keyExists( "timeMask" ) || isNull( entityMemento.timeMask ) ? variables.settings.timeMask : entityMemento.timeMask;
@@ -150,12 +151,12 @@
- "autoCastBooleans" : isNull( this.memento.autoCastBooleans ) ? variables.$mementifierSettings.autoCastBooleans : this.memento.autoCastBooleans,
- "dateMask" : isNull( this.memento.dateMask ) ? variables.$mementifierSettings.dateMask : this.memento.dateMask,
- "defaults" : isNull( this.memento.defaults ) ? {} : this.memento.defaults,
- "defaultIncludes" : isNull( this.memento.defaultIncludes ) ? [] : this.memento.defaultIncludes,
- "defaultExcludes" : isNull( this.memento.defaultExcludes ) ? [] : this.memento.defaultExcludes,
- "iso8601Format" : isNull( this.memento.iso8601Format ) ? variables.$mementifierSettings.iso8601Format : this.memento.iso8601Format,
- "mappers" : isNull( this.memento.mappers ) ? {} : this.memento.mappers,
- "neverInclude" : isNull( this.memento.neverInclude ) ? [] : this.memento.neverInclude,
- "ormAutoIncludes" : isNull( this.memento.ormAutoIncludes ) ? variables.$mementifierSettings.ormAutoIncludes : this.memento.ormAutoIncludes,
- "profiles" : isNull( this.memento.profiles ) ? {} : this.memento.profiles,
- "timeMask" : isNull( this.memento.timeMask ) ? variables.$mementifierSettings.timeMask : this.memento.timeMask,
- "trustedGetters" : isNull( this.memento.trustedGetters ) ? variables.$mementifierSettings.trustedGetters : this.memento.trustedGetters
+ "autoCastBooleans" : !this.memento.keyExists( "autoCastBooleans" ) || isNull( this.memento.autoCastBooleans ) ? variables.$mementifierSettings.autoCastBooleans : this.memento.autoCastBooleans,
+ "dateMask" : !this.memento.keyExists( "dateMask" ) || isNull( this.memento.dateMask ) ? variables.$mementifierSettings.dateMask : this.memento.dateMask,
+ "defaults" : !this.memento.keyExists( "defaults" ) || isNull( this.memento.defaults ) ? {} : this.memento.defaults,
+ "defaultIncludes" : !this.memento.keyExists( "defaultIncludes" ) || isNull( this.memento.defaultIncludes ) ? [] : this.memento.defaultIncludes,
+ "defaultExcludes" : !this.memento.keyExists( "defaultExcludes" ) || isNull( this.memento.defaultExcludes ) ? [] : this.memento.defaultExcludes,
+ "iso8601Format" : !this.memento.keyExists( "iso8601Format" ) || isNull( this.memento.iso8601Format ) ? variables.$mementifierSettings.iso8601Format : this.memento.iso8601Format,
+ "mappers" : !this.memento.keyExists( "mappers" ) || isNull( this.memento.mappers ) ? {} : this.memento.mappers,
+ "neverInclude" : !this.memento.keyExists( "neverInclude" ) || isNull( this.memento.neverInclude ) ? [] : this.memento.neverInclude,
+ "ormAutoIncludes" : !this.memento.keyExists( "ormAutoIncludes" ) || isNull( this.memento.ormAutoIncludes ) ? variables.$mementifierSettings.ormAutoIncludes : this.memento.ormAutoIncludes,
+ "profiles" : !this.memento.keyExists( "profiles" ) || isNull( this.memento.profiles ) ? {} : this.memento.profiles,
+ "timeMask" : !this.memento.keyExists( "timeMask" ) || isNull( this.memento.timeMask ) ? variables.$mementifierSettings.timeMask : this.memento.timeMask,
+ "trustedGetters" : !this.memento.keyExists( "trustedGetters" ) || isNull( this.memento.trustedGetters ) ? variables.$mementifierSettings.trustedGetters : this.memento.trustedGetters
63 changes: 63 additions & 0 deletions .github/patches/testbox-full-null.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
diff --git a/testbox/system/coverage/CoverageService.cfc b/testbox/system/coverage/CoverageService.cfc
--- a/testbox/system/coverage/CoverageService.cfc
+++ b/testbox/system/coverage/CoverageService.cfc
@@ -175 +175 @@
- if ( isNull( opts.coverageTresholds ) ) {
+ if ( !structKeyExists( opts, "coverageTresholds" ) || isNull( opts.coverageTresholds ) ) {
@@ -178 +178 @@
- if ( isNull( opts.coverageTresholds.good ) ) {
+ if ( !structKeyExists( opts.coverageTresholds, "good" ) || isNull( opts.coverageTresholds.good ) ) {
@@ -181 +181 @@
- if ( isNull( opts.coverageTresholds.bad ) ) {
+ if ( !structKeyExists( opts.coverageTresholds, "bad" ) || isNull( opts.coverageTresholds.bad ) ) {
diff --git a/testbox/system/TestBox.cfc b/testbox/system/TestBox.cfc
--- a/testbox/system/TestBox.cfc
+++ b/testbox/system/TestBox.cfc
@@ -408 +408 @@
- if ( !isNull( url.testBundles ) ) {
+ if ( structKeyExists( url, "testBundles" ) && !isNull( url.testBundles ) ) {
@@ -411 +411 @@
- if ( !isNull( url.testSuites ) ) {
+ if ( structKeyExists( url, "testSuites" ) && !isNull( url.testSuites ) ) {
@@ -414 +414 @@
- if ( !isNull( url.testSpecs ) ) {
+ if ( structKeyExists( url, "testSpecs" ) && !isNull( url.testSpecs ) ) {
@@ -417 +417 @@
- if ( !isNull( url.testMethod ) ) {
+ if ( structKeyExists( url, "testMethod" ) && !isNull( url.testMethod ) ) {
@@ -259 +259 @@
- if ( isNull( variables.env ) ) {
+ if ( !structKeyExists( variables, "env" ) || isNull( variables.env ) ) {
diff --git a/testbox/system/util/Util.cfc b/testbox/system/util/Util.cfc
--- a/testbox/system/util/Util.cfc
+++ b/testbox/system/util/Util.cfc
@@ -203 +203 @@
- if ( isNull( variables.engineMappingHelper ) ) {
+ if ( !structKeyExists( variables, "engineMappingHelper" ) || isNull( variables.engineMappingHelper ) ) {
diff --git a/testbox/system/util/Env.cfc b/testbox/system/util/Env.cfc
--- a/testbox/system/util/Env.cfc
+++ b/testbox/system/util/Env.cfc
@@ -87 +87 @@
- if ( isNull( variables.javaSystem ) ) {
+ if ( !structKeyExists( variables, "javaSystem" ) || isNull( variables.javaSystem ) ) {
diff --git a/testbox/system/BaseSpec.cfc b/testbox/system/BaseSpec.cfc
--- a/testbox/system/BaseSpec.cfc
+++ b/testbox/system/BaseSpec.cfc
@@ -1627 +1627 @@
- if ( isNull( variables.$cbMockData ) ) {
+ if ( !structKeyExists( variables, "$cbMockData" ) || isNull( variables.$cbMockData ) ) {
@@ -1640 +1640 @@
- if ( isNull( variables.$utility ) ) {
+ if ( !structKeyExists( variables, "$utility" ) || isNull( variables.$utility ) ) {
@@ -1653 +1653 @@
- if ( isNull( variables.$env ) ) {
+ if ( !structKeyExists( variables, "$env" ) || isNull( variables.$env ) ) {
@@ -1668 +1668 @@
- if ( isNull( this.$mockbox ) ) {
+ if ( !structKeyExists( this, "$mockbox" ) || isNull( this.$mockbox ) ) {
diff --git a/testbox/system/runners/BDDRunner.cfc b/testbox/system/runners/BDDRunner.cfc
--- a/testbox/system/runners/BDDRunner.cfc
+++ b/testbox/system/runners/BDDRunner.cfc
@@ -159 +159 @@
- isNull( thisSuite ) ? {} : thisSuite
+ !structKeyExists( local, "thisSuite" ) || isNull( local.thisSuite ) ? {} : local.thisSuite
Loading
Loading