@@ -119,6 +119,26 @@ public function testOperatorUnsetOrMatches(): void
119
119
$ this ->assertResult (false , $ c , ['x ' => ['y ' => 1 , 'z ' => 2 ]], 'value does not match (embedded) ' );
120
120
}
121
121
122
+ public function testOperatorUnsetOrMatchesWithNestedOperator (): void
123
+ {
124
+ // Nested $$unsetOrMatches is redundant, but should behave the same as if it was omitted
125
+ $ c = new Matches (['x ' => ['$$unsetOrMatches ' => ['$$unsetOrMatches ' => ['y ' => 1 ]]]]);
126
+ $ this ->assertResult (true , $ c , new stdClass (), 'missing value is considered unset (embedded) ' );
127
+ $ this ->assertResult (false , $ c , ['x ' => null ], 'null value is not considered unset (embedded) ' );
128
+ $ this ->assertResult (true , $ c , ['x ' => ['y ' => 1 ]], 'value matches (embedded) ' );
129
+ $ this ->assertResult (false , $ c , ['x ' => ['y ' => 1 , 'z ' => 2 ]], 'value does not match (embedded) ' );
130
+
131
+ $ c = new Matches (['x ' => ['$$unsetOrMatches ' => ['$$exists ' => true ]]]);
132
+ $ this ->assertResult (true , $ c , new stdClass (), 'missing value is considered unset (embedded) ' );
133
+ $ this ->assertResult (true , $ c , ['x ' => null ], 'null value is not considered unset (embedded) ' );
134
+ $ this ->assertResult (true , $ c , ['x ' => ['y ' => 1 ]], 'non-null value is not considered unset (embedded) ' );
135
+
136
+ $ c = new Matches (['x ' => ['$$unsetOrMatches ' => ['$$exists ' => false ]]]);
137
+ $ this ->assertResult (true , $ c , new stdClass (), 'missing value is considered unset (embedded) ' );
138
+ $ this ->assertResult (false , $ c , ['x ' => null ], 'null value is not considered unset (embedded) ' );
139
+ $ this ->assertResult (false , $ c , ['x ' => ['y ' => 1 ]], 'non-null value is not considered unset (embedded) ' );
140
+ }
141
+
122
142
public function testOperatorSessionLsid (): void
123
143
{
124
144
$ session = $ this ->manager ->startSession ();
0 commit comments