@@ -160,3 +160,95 @@ fn overlay_uncommitted_not_on_disk() {
160160 assert_eq ! ( test. read( [ 2 ; 32 ] ) , None ) ;
161161 assert_eq ! ( test. read( [ 3 ; 32 ] ) , None ) ;
162162}
163+
164+ #[ test]
165+ fn overlay_deletions ( ) {
166+ let test_db = || -> Test {
167+ let mut test = Test :: new ( "overlay_deletions" ) ;
168+ // subtree at 0000000_0/1
169+ test. write ( [ 0 ; 32 ] , Some ( vec ! [ 1 , 1 ] ) ) ;
170+ test. write ( [ 1 ; 32 ] , Some ( vec ! [ 2 , 2 ] ) ) ;
171+
172+ // subtree at 001000_00/01/10
173+ test. write ( [ 32 ; 32 ] , Some ( vec ! [ 1 , 1 ] ) ) ;
174+ test. write ( [ 33 ; 32 ] , Some ( vec ! [ 2 , 2 ] ) ) ;
175+ test. write ( [ 34 ; 32 ] , Some ( vec ! [ 3 , 3 ] ) ) ;
176+
177+ // subtree at 100000_00/01/10/11
178+ test. write ( [ 128 ; 32 ] , Some ( vec ! [ 4 , 4 ] ) ) ;
179+ test. write ( [ 129 ; 32 ] , Some ( vec ! [ 5 , 5 ] ) ) ;
180+ test. write ( [ 130 ; 32 ] , Some ( vec ! [ 6 , 6 ] ) ) ;
181+ test. write ( [ 131 ; 32 ] , Some ( vec ! [ 7 , 7 ] ) ) ;
182+
183+ test. commit ( ) ;
184+ test
185+ } ;
186+
187+ // Delete the first item for each subtree
188+ let mut test = test_db ( ) ;
189+
190+ test. write ( [ 0 ; 32 ] , None ) ;
191+ test. write ( [ 32 ; 32 ] , None ) ;
192+ test. write ( [ 128 ; 32 ] , None ) ;
193+ let overlay_a = test. update ( ) . 0 ;
194+
195+ test. start_overlay_session ( [ & overlay_a] ) ;
196+ assert_eq ! ( test. read( [ 0 ; 32 ] ) , None ) ;
197+ assert_eq ! ( test. read( [ 1 ; 32 ] ) , Some ( vec![ 2 , 2 ] ) ) ;
198+
199+ assert_eq ! ( test. read( [ 32 ; 32 ] ) , None ) ;
200+ assert_eq ! ( test. read( [ 33 ; 32 ] ) , Some ( vec![ 2 , 2 ] ) ) ;
201+ assert_eq ! ( test. read( [ 34 ; 32 ] ) , Some ( vec![ 3 , 3 ] ) ) ;
202+
203+ assert_eq ! ( test. read( [ 128 ; 32 ] ) , None ) ;
204+ assert_eq ! ( test. read( [ 129 ; 32 ] ) , Some ( vec![ 5 , 5 ] ) ) ;
205+ assert_eq ! ( test. read( [ 130 ; 32 ] ) , Some ( vec![ 6 , 6 ] ) ) ;
206+ assert_eq ! ( test. read( [ 131 ; 32 ] ) , Some ( vec![ 7 , 7 ] ) ) ;
207+
208+ let _overlay_b = test. update ( ) . 0 ;
209+
210+ // Delete the second item for each subtree
211+ let mut test = test_db ( ) ;
212+
213+ test. write ( [ 1 ; 32 ] , None ) ;
214+ test. write ( [ 33 ; 32 ] , None ) ;
215+ test. write ( [ 129 ; 32 ] , None ) ;
216+ let overlay_a = test. update ( ) . 0 ;
217+
218+ test. start_overlay_session ( [ & overlay_a] ) ;
219+ assert_eq ! ( test. read( [ 0 ; 32 ] ) , Some ( vec![ 1 , 1 ] ) ) ;
220+ assert_eq ! ( test. read( [ 1 ; 32 ] ) , None ) ;
221+
222+ assert_eq ! ( test. read( [ 32 ; 32 ] ) , Some ( vec![ 1 , 1 ] ) ) ;
223+ assert_eq ! ( test. read( [ 33 ; 32 ] ) , None ) ;
224+ assert_eq ! ( test. read( [ 34 ; 32 ] ) , Some ( vec![ 3 , 3 ] ) ) ;
225+
226+ assert_eq ! ( test. read( [ 128 ; 32 ] ) , Some ( vec![ 4 , 4 ] ) ) ;
227+ assert_eq ! ( test. read( [ 129 ; 32 ] ) , None ) ;
228+ assert_eq ! ( test. read( [ 130 ; 32 ] ) , Some ( vec![ 6 , 6 ] ) ) ;
229+ assert_eq ! ( test. read( [ 131 ; 32 ] ) , Some ( vec![ 7 , 7 ] ) ) ;
230+
231+ let _overlay_b = test. update ( ) . 0 ;
232+
233+ // Sequence of deletes
234+ let mut test = test_db ( ) ;
235+
236+ test. write ( [ 32 ; 32 ] , None ) ;
237+ test. write ( [ 33 ; 32 ] , None ) ;
238+ test. write ( [ 128 ; 32 ] , None ) ;
239+ test. write ( [ 129 ; 32 ] , None ) ;
240+ test. write ( [ 131 ; 32 ] , None ) ;
241+ let overlay_a = test. update ( ) . 0 ;
242+
243+ test. start_overlay_session ( [ & overlay_a] ) ;
244+ assert_eq ! ( test. read( [ 32 ; 32 ] ) , None ) ;
245+ assert_eq ! ( test. read( [ 33 ; 32 ] ) , None ) ;
246+ assert_eq ! ( test. read( [ 34 ; 32 ] ) , Some ( vec![ 3 , 3 ] ) ) ;
247+
248+ assert_eq ! ( test. read( [ 128 ; 32 ] ) , None ) ;
249+ assert_eq ! ( test. read( [ 129 ; 32 ] ) , None ) ;
250+ assert_eq ! ( test. read( [ 130 ; 32 ] ) , Some ( vec![ 6 , 6 ] ) ) ;
251+ assert_eq ! ( test. read( [ 131 ; 32 ] ) , None ) ;
252+
253+ let _overlay_b = test. update ( ) . 0 ;
254+ }
0 commit comments