@@ -294,6 +294,194 @@ impl DirtyContainerCount {
294
294
}
295
295
}
296
296
297
+ #[ cfg( test) ]
298
+ mod dirty_container_count_tests {
299
+ use turbo_tasks:: SessionId ;
300
+
301
+ use super :: * ;
302
+
303
+ const SESSION_1 : SessionId = unsafe { SessionId :: new_unchecked ( 1 ) } ;
304
+ const SESSION_2 : SessionId = unsafe { SessionId :: new_unchecked ( 2 ) } ;
305
+ const SESSION_3 : SessionId = unsafe { SessionId :: new_unchecked ( 3 ) } ;
306
+
307
+ #[ test]
308
+ fn test_update ( ) {
309
+ let mut count = DirtyContainerCount :: default ( ) ;
310
+ assert ! ( count. is_zero( ) ) ;
311
+
312
+ let diff = count. update ( 1 ) ;
313
+ assert ! ( !count. is_zero( ) ) ;
314
+ assert_eq ! ( count. get( SESSION_1 ) , 1 ) ;
315
+ assert_eq ! ( diff. get( SESSION_1 ) , 1 ) ;
316
+ assert_eq ! ( count. get( SESSION_2 ) , 1 ) ;
317
+ assert_eq ! ( diff. get( SESSION_2 ) , 1 ) ;
318
+
319
+ let diff = count. update ( -1 ) ;
320
+ assert ! ( count. is_zero( ) ) ;
321
+ assert_eq ! ( count. get( SESSION_1 ) , 0 ) ;
322
+ assert_eq ! ( diff. get( SESSION_1 ) , -1 ) ;
323
+ assert_eq ! ( count. get( SESSION_2 ) , 0 ) ;
324
+ assert_eq ! ( diff. get( SESSION_2 ) , -1 ) ;
325
+
326
+ let diff = count. update ( 2 ) ;
327
+ assert ! ( !count. is_zero( ) ) ;
328
+ assert_eq ! ( count. get( SESSION_1 ) , 2 ) ;
329
+ assert_eq ! ( diff. get( SESSION_1 ) , 1 ) ;
330
+ assert_eq ! ( count. get( SESSION_2 ) , 2 ) ;
331
+ assert_eq ! ( diff. get( SESSION_2 ) , 1 ) ;
332
+
333
+ let diff = count. update ( -1 ) ;
334
+ assert ! ( !count. is_zero( ) ) ;
335
+ assert_eq ! ( count. get( SESSION_1 ) , 1 ) ;
336
+ assert_eq ! ( diff. get( SESSION_1 ) , 0 ) ;
337
+ assert_eq ! ( count. get( SESSION_2 ) , 1 ) ;
338
+ assert_eq ! ( diff. get( SESSION_2 ) , 0 ) ;
339
+
340
+ let diff = count. update ( -1 ) ;
341
+ assert ! ( count. is_zero( ) ) ;
342
+ assert_eq ! ( count. get( SESSION_1 ) , 0 ) ;
343
+ assert_eq ! ( diff. get( SESSION_1 ) , -1 ) ;
344
+ assert_eq ! ( count. get( SESSION_2 ) , 0 ) ;
345
+ assert_eq ! ( diff. get( SESSION_2 ) , -1 ) ;
346
+
347
+ let diff = count. update ( -1 ) ;
348
+ assert ! ( !count. is_zero( ) ) ;
349
+ assert_eq ! ( count. get( SESSION_1 ) , -1 ) ;
350
+ assert_eq ! ( diff. get( SESSION_1 ) , 0 ) ;
351
+ assert_eq ! ( count. get( SESSION_2 ) , -1 ) ;
352
+ assert_eq ! ( diff. get( SESSION_2 ) , 0 ) ;
353
+
354
+ let diff = count. update ( 2 ) ;
355
+ assert ! ( !count. is_zero( ) ) ;
356
+ assert_eq ! ( count. get( SESSION_1 ) , 1 ) ;
357
+ assert_eq ! ( diff. get( SESSION_1 ) , 1 ) ;
358
+ assert_eq ! ( count. get( SESSION_2 ) , 1 ) ;
359
+ assert_eq ! ( diff. get( SESSION_2 ) , 1 ) ;
360
+
361
+ let diff = count. update ( -2 ) ;
362
+ assert ! ( !count. is_zero( ) ) ;
363
+ assert_eq ! ( count. get( SESSION_1 ) , -1 ) ;
364
+ assert_eq ! ( diff. get( SESSION_1 ) , -1 ) ;
365
+ assert_eq ! ( count. get( SESSION_2 ) , -1 ) ;
366
+ assert_eq ! ( diff. get( SESSION_2 ) , -1 ) ;
367
+
368
+ let diff = count. update ( 1 ) ;
369
+ assert ! ( count. is_zero( ) ) ;
370
+ assert_eq ! ( count. get( SESSION_1 ) , 0 ) ;
371
+ assert_eq ! ( diff. get( SESSION_1 ) , 0 ) ;
372
+ assert_eq ! ( count. get( SESSION_2 ) , 0 ) ;
373
+ assert_eq ! ( diff. get( SESSION_2 ) , 0 ) ;
374
+ }
375
+
376
+ #[ test]
377
+ fn test_session_dependent ( ) {
378
+ let mut count = DirtyContainerCount :: default ( ) ;
379
+ assert ! ( count. is_zero( ) ) ;
380
+
381
+ let diff = count. update_session_dependent ( SESSION_1 , 1 ) ;
382
+ assert ! ( !count. is_zero( ) ) ;
383
+ assert_eq ! ( count. get( SESSION_1 ) , 0 ) ;
384
+ assert_eq ! ( diff. get( SESSION_1 ) , 0 ) ;
385
+ assert_eq ! ( count. get( SESSION_2 ) , 1 ) ;
386
+ assert_eq ! ( diff. get( SESSION_2 ) , 1 ) ;
387
+
388
+ let diff = count. update_session_dependent ( SESSION_1 , -1 ) ;
389
+ assert ! ( count. is_zero( ) ) ;
390
+ assert_eq ! ( count. get( SESSION_1 ) , 0 ) ;
391
+ assert_eq ! ( diff. get( SESSION_1 ) , 0 ) ;
392
+ assert_eq ! ( count. get( SESSION_2 ) , 0 ) ;
393
+ assert_eq ! ( diff. get( SESSION_2 ) , -1 ) ;
394
+
395
+ let diff = count. update_session_dependent ( SESSION_1 , 2 ) ;
396
+ assert ! ( !count. is_zero( ) ) ;
397
+ assert_eq ! ( count. get( SESSION_1 ) , 0 ) ;
398
+ assert_eq ! ( diff. get( SESSION_1 ) , 0 ) ;
399
+ assert_eq ! ( count. get( SESSION_2 ) , 2 ) ;
400
+ assert_eq ! ( diff. get( SESSION_2 ) , 1 ) ;
401
+
402
+ let diff = count. update_session_dependent ( SESSION_2 , -2 ) ;
403
+ assert ! ( !count. is_zero( ) ) ;
404
+ assert_eq ! ( count. get( SESSION_1 ) , 0 ) ;
405
+ assert_eq ! ( diff. get( SESSION_1 ) , -1 ) ;
406
+ assert_eq ! ( count. get( SESSION_2 ) , 2 ) ;
407
+ assert_eq ! ( diff. get( SESSION_2 ) , 0 ) ;
408
+ assert_eq ! ( count. get( SESSION_3 ) , 0 ) ;
409
+ assert_eq ! ( diff. get( SESSION_3 ) , -1 ) ;
410
+ }
411
+
412
+ #[ test]
413
+ fn test_update_with_dirty_state ( ) {
414
+ let mut count = DirtyContainerCount :: default ( ) ;
415
+ let dirty = DirtyState {
416
+ clean_in_session : None ,
417
+ } ;
418
+ let diff = count. update_with_dirty_state ( & dirty) ;
419
+ assert ! ( !count. is_zero( ) ) ;
420
+ assert_eq ! ( count. get( SESSION_1 ) , 1 ) ;
421
+ assert_eq ! ( diff. get( SESSION_1 ) , 1 ) ;
422
+ assert_eq ! ( count. get( SESSION_2 ) , 1 ) ;
423
+ assert_eq ! ( diff. get( SESSION_2 ) , 1 ) ;
424
+
425
+ let diff = count. undo_update_with_dirty_state ( & dirty) ;
426
+ assert ! ( count. is_zero( ) ) ;
427
+ assert_eq ! ( count. get( SESSION_1 ) , 0 ) ;
428
+ assert_eq ! ( diff. get( SESSION_1 ) , -1 ) ;
429
+ assert_eq ! ( count. get( SESSION_2 ) , 0 ) ;
430
+ assert_eq ! ( diff. get( SESSION_2 ) , -1 ) ;
431
+
432
+ let mut count = DirtyContainerCount :: default ( ) ;
433
+ let dirty = DirtyState {
434
+ clean_in_session : Some ( SESSION_1 ) ,
435
+ } ;
436
+ let diff = count. update_with_dirty_state ( & dirty) ;
437
+ assert ! ( !count. is_zero( ) ) ;
438
+ assert_eq ! ( count. get( SESSION_1 ) , 0 ) ;
439
+ assert_eq ! ( diff. get( SESSION_1 ) , 0 ) ;
440
+ assert_eq ! ( count. get( SESSION_2 ) , 1 ) ;
441
+ assert_eq ! ( diff. get( SESSION_2 ) , 1 ) ;
442
+
443
+ let diff = count. undo_update_with_dirty_state ( & dirty) ;
444
+ assert ! ( count. is_zero( ) ) ;
445
+ assert_eq ! ( count. get( SESSION_1 ) , 0 ) ;
446
+ assert_eq ! ( diff. get( SESSION_1 ) , 0 ) ;
447
+ assert_eq ! ( count. get( SESSION_2 ) , 0 ) ;
448
+ assert_eq ! ( diff. get( SESSION_2 ) , -1 ) ;
449
+ }
450
+
451
+ #[ test]
452
+ fn test_replace_dirty_state ( ) {
453
+ let mut count = DirtyContainerCount :: default ( ) ;
454
+ let old = DirtyState {
455
+ clean_in_session : None ,
456
+ } ;
457
+ let new = DirtyState {
458
+ clean_in_session : Some ( SESSION_1 ) ,
459
+ } ;
460
+ count. update_with_dirty_state ( & old) ;
461
+ let diff = count. replace_dirty_state ( & old, & new) ;
462
+ assert ! ( !count. is_zero( ) ) ;
463
+ assert_eq ! ( count. get( SESSION_1 ) , 0 ) ;
464
+ assert_eq ! ( diff. get( SESSION_1 ) , -1 ) ;
465
+ assert_eq ! ( count. get( SESSION_2 ) , 1 ) ;
466
+ assert_eq ! ( diff. get( SESSION_2 ) , 0 ) ;
467
+
468
+ let mut count = DirtyContainerCount :: default ( ) ;
469
+ let old = DirtyState {
470
+ clean_in_session : Some ( SESSION_1 ) ,
471
+ } ;
472
+ let new = DirtyState {
473
+ clean_in_session : None ,
474
+ } ;
475
+ count. update_with_dirty_state ( & old) ;
476
+ let diff = count. replace_dirty_state ( & old, & new) ;
477
+ assert ! ( !count. is_zero( ) ) ;
478
+ assert_eq ! ( count. get( SESSION_1 ) , 1 ) ;
479
+ assert_eq ! ( diff. get( SESSION_1 ) , 1 ) ;
480
+ assert_eq ! ( count. get( SESSION_2 ) , 1 ) ;
481
+ assert_eq ! ( diff. get( SESSION_2 ) , 0 ) ;
482
+ }
483
+ }
484
+
297
485
#[ derive( Debug , Clone , Copy ) ]
298
486
pub enum RootType {
299
487
RootTask ,
0 commit comments