+(ert-deftest gnustest-registry-pruning-test ()
+ "Check that precious entries are never pruned."
+ (let ((dbs (list
+ ;; Can prune fully without touching precious entries.
+ (gnustest-registry-make-testable-db 10 0.1)
+ ;; Pruning limited by precious entries.
+ (gnustest-registry-make-testable-db 10 0.6))))
+ (dolist (db dbs)
+ (message "Pruning")
+ (let* ((size (registry-size db))
+ (limit (- (oref db :max-size)
+ (* (oref db :max-size)
+ (oref db :prune-factor))))
+ (keepers (registry-search db :member '((extra "more data"))))
+ (expected-prune-count (min (- size (length keepers))
+ (- size limit)))
+ (actual-prune-count (registry-prune db)))
+ (ert-info
+ ((format "Expected to prune %d entries but pruned %d"
+ expected-prune-count actual-prune-count)
+ :prefix "Error: ")
+ (should (= expected-prune-count actual-prune-count)))))))
+
+(ert-deftest gnustest-registry-pruning-sort-test ()
+ "Check that entries are sorted properly before pruning."
+ (let ((db (gnustest-registry-make-testable-db 10 0.4))
+ ;; These entries have the highest 'sort-field values. Pruning
+ ;; sorts by lowest values first, then prunes from the front of
+ ;; the list, so these entries survive
+ (expected-survivors '(5 6 7 8 9 0))
+ actual-survivors disjunct)
+ (registry-prune
+ db #'gnustest-registry-sort-function)
+ (maphash (lambda (k v) (push k actual-survivors))
+ (oref db :data))
+ (setq disjunct (cl-set-exclusive-or
+ expected-survivors
+ actual-survivors))
+ (ert-info
+ ((format "Incorrect pruning: %s" disjunct)
+ :prefix "Error: ")
+ (should (null disjunct)))))
+