aboutsummaryrefslogtreecommitdiff
path: root/tests/test-org-drill-statistics-quality-histogram.el
blob: 7a663149b015fca9ced0d45ba42391c4a6e0f8f4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
;;; test-org-drill-statistics-quality-histogram.el --- Tests for quality-histogram statistics  -*- lexical-binding: t; -*-

;;; Commentary:
;; ERT tests for the org-drill statistics dashboard quality-histogram block.

;;; Code:

(require 'ert)
(require 'org-drill)
(require 'cl-lib)
(require 'org)

(defun test-org-drill-statistics--make-record (qualities)
  "Build a minimal `org-drill-session-record' carrying QUALITIES.
QUALITIES is a vector of ints.  Other slots are filled with inert
defaults so the histogram tests stay focused on the qualities slot."
  (make-org-drill-session-record
   :start-time 0.0
   :end-time 0.0
   :scope nil
   :algorithm 'sm5
   :qualities qualities
   :pass-percent 0
   :new-count 0
   :mature-count 0
   :failed-count 0
   :cram-mode nil))

;; Normal cases.

(ert-deftest test-org-drill-statistics-quality-histogram-single-record ()
  "A single record's qualities are tallied into the right buckets."
  (let* ((record (test-org-drill-statistics--make-record [0 3 3 5 3]))
         (result (org-drill-statistics--quality-histogram (list record))))
    (should (equal result [1 0 0 3 0 1]))))

(ert-deftest test-org-drill-statistics-quality-histogram-multiple-records ()
  "Counts sum across every record in the log."
  (let* ((r1 (test-org-drill-statistics--make-record [0 1 2]))
         (r2 (test-org-drill-statistics--make-record [3 4 5]))
         (r3 (test-org-drill-statistics--make-record [0 5 5]))
         (result (org-drill-statistics--quality-histogram (list r1 r2 r3))))
    (should (equal result [2 1 1 1 1 3]))))

(ert-deftest test-org-drill-statistics-quality-histogram-all-same-quality ()
  "A record with every entry the same quality concentrates in one bucket."
  (let* ((record (test-org-drill-statistics--make-record [4 4 4 4]))
         (result (org-drill-statistics--quality-histogram (list record))))
    (should (equal result [0 0 0 0 4 0]))))

;; Boundary cases.

(ert-deftest test-org-drill-statistics-quality-histogram-empty-log ()
  "An empty log yields an all-zero histogram, never nil."
  (let ((result (org-drill-statistics--quality-histogram '())))
    (should (equal result [0 0 0 0 0 0]))))

(ert-deftest test-org-drill-statistics-quality-histogram-empty-qualities ()
  "A record with an empty qualities vector contributes nothing."
  (let* ((record (test-org-drill-statistics--make-record []))
         (result (org-drill-statistics--quality-histogram (list record))))
    (should (equal result [0 0 0 0 0 0]))))

(ert-deftest test-org-drill-statistics-quality-histogram-nil-qualities ()
  "A record whose qualities slot is nil is skipped without error."
  (let* ((r1 (test-org-drill-statistics--make-record nil))
         (r2 (test-org-drill-statistics--make-record [2 2]))
         (result (org-drill-statistics--quality-histogram (list r1 r2))))
    (should (equal result [0 0 2 0 0 0]))))

(ert-deftest test-org-drill-statistics-quality-histogram-extreme-buckets ()
  "Quality 0 and quality 5, the range endpoints, both land correctly."
  (let* ((record (test-org-drill-statistics--make-record [0 0 5 5 5]))
         (result (org-drill-statistics--quality-histogram (list record))))
    (should (equal result [2 0 0 0 0 3]))))

;; Error cases.

(ert-deftest test-org-drill-statistics-quality-histogram-out-of-range-ignored ()
  "Qualities outside 0..5 are dropped, valid ones still counted."
  (let* ((record (test-org-drill-statistics--make-record [-1 6 3 99 2]))
         (result (org-drill-statistics--quality-histogram (list record))))
    (should (equal result [0 0 1 1 0 0]))))

(ert-deftest test-org-drill-statistics-quality-histogram-non-integer-ignored ()
  "Non-integer quality entries are ignored rather than signalling."
  (let* ((record (test-org-drill-statistics--make-record [2 nil 2.5 3]))
         (result (org-drill-statistics--quality-histogram (list record))))
    (should (equal result [0 0 1 1 0 0]))))

(ert-deftest test-org-drill-statistics-quality-histogram-does-not-mutate-input ()
  "The qualities vectors are read, never written."
  (let* ((qualities (vector 1 2 3))
         (record (test-org-drill-statistics--make-record qualities)))
    (org-drill-statistics--quality-histogram (list record))
    (should (equal qualities [1 2 3]))))

(provide 'test-org-drill-statistics-quality-histogram)

;;; test-org-drill-statistics-quality-histogram.el ends here