branch: elpa/gnosis
commit 9b4faa66a5bf4e3dd67d5b3fe69b32dc95b9c081
Author: Thanos Apollo <[email protected]>
Commit: Thanos Apollo <[email protected]>

    test: Update for algorithm changes.
---
 tests/gnosis-test-algorithm.el | 299 +++++++++++++++++++++++++++++++++++++++--
 1 file changed, 289 insertions(+), 10 deletions(-)

diff --git a/tests/gnosis-test-algorithm.el b/tests/gnosis-test-algorithm.el
index 9734a226d0..02e09b870a 100644
--- a/tests/gnosis-test-algorithm.el
+++ b/tests/gnosis-test-algorithm.el
@@ -40,6 +40,7 @@
 
 (ert-deftest gnosis-test-algorithm-next-interval-proto ()
   "Test next interval for proto values."
+  (let ((gnosis-algorithm-interval-fuzz 0))
   (should (equal (gnosis-algorithm-next-interval :last-interval 0
                                                 :gnosis-synolon 1.3
                                                 :success t
@@ -93,9 +94,10 @@
                                                 :proto '(1 2 3 70)
                                                 :c-fails 0
                                                 :lethe 3)
-                (gnosis-algorithm-date 3))))
+                (gnosis-algorithm-date 3)))))
 
 (ert-deftest gnosis-test-algorithm-next-interval-lethe ()
+  (let ((gnosis-algorithm-interval-fuzz 0))
   (should (equal (gnosis-algorithm-next-interval :last-interval 0
                                                 :gnosis-synolon 1.3
                                                 :success nil
@@ -131,10 +133,11 @@
                                                 :proto '(1 2 3)
                                                 :c-fails 5
                                                 :lethe 4)
-                (gnosis-algorithm-date))))
+                (gnosis-algorithm-date)))))
 
 (ert-deftest gnosis-test-algorithm-next-interval-success ()
   "Test next interval for successful non-proto recalls."
+  (let ((gnosis-algorithm-interval-fuzz 0))
   (should (equal (gnosis-algorithm-next-interval :last-interval 10
                                                 :gnosis-synolon 2.0
                                                 :success t
@@ -152,10 +155,11 @@
                                                 :proto '(1 2 3)
                                                 :c-fails 300
                                                 :lethe 4)
-                (gnosis-algorithm-date 4))))
+                (gnosis-algorithm-date 4)))))
 
 (ert-deftest gnosis-test-algorithm-next-interval-amnesia ()
   "Test next interval for failed non-proto recalls."
+  (let ((gnosis-algorithm-interval-fuzz 0))
   (should (equal (gnosis-algorithm-next-interval :last-interval 10
                                                 :gnosis-synolon 1.3
                                                 :success nil
@@ -209,7 +213,7 @@
                                                 :proto '(1 2 3)
                                                 :c-fails 3
                                                 :lethe 4)
-                (gnosis-algorithm-date))))
+                (gnosis-algorithm-date)))))
 
 (ert-deftest gnosis-test-algorithm-next-gnosis-synolon ()
   "Test algorithm for gnosis synolon (totalis)."
@@ -252,33 +256,34 @@
 
 (ert-deftest gnosis-test-algorithm-test-epignosis ()
   "Test epignosis during anagnosis events."
+  (let ((gnosis-algorithm-synolon-max 3.0))
   (should (equal (gnosis-algorithm-next-gnosis
-                 :gnosis '(0.45 0.30 3.5)
+                 :gnosis '(0.45 0.30 2.5)
                  :success t
                  :epignosis 0.3
                  :agnoia 0.2
                  :anagnosis 3
                  :c-successes 3
                  :c-failures 0)
-                '(0.75 0.30 3.95)))
+                '(0.75 0.30 2.95)))
   (should (equal (gnosis-algorithm-next-gnosis
-                 :gnosis '(0.45 0.30 3.5)
+                 :gnosis '(0.45 0.30 2.5)
                  :success t
                  :epignosis 0.2
                  :agnoia 0.2
                  :anagnosis 3
                  :c-successes 3
                  :c-failures 0)
-                '(0.65 0.30 3.95)))
+                '(0.65 0.30 2.95)))
   (should (equal (gnosis-algorithm-next-gnosis
-                 :gnosis '(0.45 0.30 3.5)
+                 :gnosis '(0.45 0.30 2.5)
                  :success t
                  :epignosis 0.2
                  :agnoia 0.2
                  :anagnosis 4
                  :c-successes 3
                  :c-failures 0)
-                '(0.45 0.30 3.95))))
+                '(0.45 0.30 2.95)))))
 
 (ert-deftest gnosis-test-algorithm-test-agnoia ()
   "Test epignosis during anagnosis events."
@@ -402,4 +407,278 @@
     (should (equal (gnosis-get-thema-lethe nil "deck2" '("tag1" "tag2") 
test-values) 2))))
 
 
+(ert-deftest gnosis-test-algorithm-synolon-cap ()
+  "Test that gnosis-synolon is capped at `gnosis-algorithm-synolon-max'."
+  (let ((gnosis-algorithm-synolon-max 3.0))
+    ;; Success exceeding cap: 2.8 + 0.5 = 3.3 → capped to 3.0
+    (should (equal (gnosis-algorithm-next-gnosis
+                   :gnosis '(0.5 0.30 2.8)
+                   :success t
+                   :epignosis 0.1
+                   :agnoia 0.2
+                   :anagnosis 3
+                   :c-successes 1
+                   :c-failures 0)
+                  '(0.5 0.30 3.0)))
+    ;; Success under cap: 1.3 + 0.35 = 1.65
+    (should (equal (gnosis-algorithm-next-gnosis
+                   :gnosis '(0.35 0.30 1.3)
+                   :success t
+                   :epignosis 0.1
+                   :agnoia 0.2
+                   :anagnosis 3
+                   :c-successes 1
+                   :c-failures 0)
+                  '(0.35 0.30 1.65)))
+    ;; Failure path is not capped: 3.5 - 0.30 = 3.2
+    (should (equal (gnosis-algorithm-next-gnosis
+                   :gnosis '(0.45 0.30 3.5)
+                   :success nil
+                   :epignosis 0.1
+                   :agnoia 0.2
+                   :anagnosis 3
+                   :c-successes 0
+                   :c-failures 1)
+                  '(0.45 0.30 3.2)))))
+
+(ert-deftest gnosis-test-algorithm-lethe-gnosis ()
+  "Test that lethe events reduce gnosis-plus."
+  ;; Lethe triggers (c-failures >= lethe): gnosis-plus reduced by epignosis
+  ;; Also anagnosis triggers: gnosis-minus increased by agnoia
+  (should (equal (gnosis-algorithm-next-gnosis
+                 :gnosis '(0.45 0.30 2.0)
+                 :success nil
+                 :epignosis 0.1
+                 :agnoia 0.2
+                 :anagnosis 3
+                 :c-successes 0
+                 :c-failures 3
+                 :lethe 3)
+                '(0.35 0.5 1.7)))
+  ;; Lethe triggers but anagnosis does not (c-failures=4, anagnosis=3)
+  (should (equal (gnosis-algorithm-next-gnosis
+                 :gnosis '(0.45 0.30 2.0)
+                 :success nil
+                 :epignosis 0.1
+                 :agnoia 0.2
+                 :anagnosis 3
+                 :c-successes 0
+                 :c-failures 4
+                 :lethe 4)
+                '(0.35 0.30 1.7)))
+  ;; Lethe does not trigger (c-failures < lethe): gnosis-plus unchanged
+  (should (equal (gnosis-algorithm-next-gnosis
+                 :gnosis '(0.45 0.30 2.0)
+                 :success nil
+                 :epignosis 0.1
+                 :agnoia 0.2
+                 :anagnosis 3
+                 :c-successes 0
+                 :c-failures 2
+                 :lethe 3)
+                '(0.45 0.30 1.7)))
+  ;; Lethe with gnosis-plus floor: 0.15 - 0.1 = 0.05 → floored to 0.1
+  (should (equal (gnosis-algorithm-next-gnosis
+                 :gnosis '(0.15 0.30 2.0)
+                 :success nil
+                 :epignosis 0.1
+                 :agnoia 0.2
+                 :anagnosis 3
+                 :c-successes 0
+                 :c-failures 3
+                 :lethe 3)
+                '(0.1 0.5 1.7)))
+  ;; No lethe param (backward compat): gnosis-plus unchanged
+  (should (equal (gnosis-algorithm-next-gnosis
+                 :gnosis '(0.45 0.30 2.0)
+                 :success nil
+                 :epignosis 0.1
+                 :agnoia 0.2
+                 :anagnosis 3
+                 :c-successes 0
+                 :c-failures 5)
+                '(0.45 0.30 1.7))))
+
+(ert-deftest gnosis-test-algorithm-interval-fuzz ()
+  "Test interval fuzzing behavior."
+  ;; With fuzz disabled, result is exact
+  (let ((gnosis-algorithm-interval-fuzz 0))
+    (should (equal (gnosis-algorithm-next-interval :last-interval 10
+                                                  :gnosis-synolon 2.0
+                                                  :success t
+                                                  :successful-reviews 5
+                                                  :amnesia 0.5
+                                                  :proto '(1 2 3)
+                                                  :c-fails 0
+                                                  :lethe 3)
+                  (gnosis-algorithm-date 20))))
+  ;; Intervals <= 2 are never fuzzed regardless of setting
+  (let ((gnosis-algorithm-interval-fuzz 0.5))
+    (should (= (gnosis-algorithm-fuzz-interval 1) 1))
+    (should (= (gnosis-algorithm-fuzz-interval 2) 2))
+    (should (= (gnosis-algorithm-fuzz-interval 0) 0)))
+  ;; With fuzz enabled, result stays within expected range
+  (let ((gnosis-algorithm-interval-fuzz 0.1)
+       (results (cl-loop repeat 100
+                         collect (gnosis-algorithm-fuzz-interval 20.0))))
+    (should (cl-every (lambda (r) (and (>= r 18.0) (<= r 22.0))) results))
+    ;; Not all identical (randomness works)
+    (should (> (length (cl-remove-duplicates results)) 1))))
+
+(ert-deftest gnosis-test-algorithm-proto-unaffected-by-events ()
+  "Test that proto intervals are not affected by lethe, anagnosis, or fuzz."
+  (let ((gnosis-algorithm-interval-fuzz 0))
+    ;; Proto interval used even during lethe event (c-fails >= lethe)
+    (should (equal (gnosis-algorithm-next-interval :last-interval 0
+                                                  :gnosis-synolon 1.3
+                                                  :success t
+                                                  :successful-reviews 0
+                                                  :amnesia 0.5
+                                                  :proto '(1 2 3)
+                                                  :c-fails 10
+                                                  :lethe 3)
+                  (gnosis-algorithm-date 1)))
+    ;; Proto interval used even with high synolon
+    (should (equal (gnosis-algorithm-next-interval :last-interval 0
+                                                  :gnosis-synolon 100.0
+                                                  :success t
+                                                  :successful-reviews 1
+                                                  :amnesia 0.5
+                                                  :proto '(1 2 3)
+                                                  :c-fails 0
+                                                  :lethe 3)
+                  (gnosis-algorithm-date 2)))
+    ;; Failed during proto still gives interval 0 (not amnesia-based)
+    (should (equal (gnosis-algorithm-next-interval :last-interval 5
+                                                  :gnosis-synolon 2.0
+                                                  :success nil
+                                                  :successful-reviews 1
+                                                  :amnesia 0.5
+                                                  :proto '(1 2 3)
+                                                  :c-fails 1
+                                                  :lethe 3)
+                  (gnosis-algorithm-date 2)))
+    ;; Proto intervals not fuzzed even with high fuzz
+    (let ((gnosis-algorithm-interval-fuzz 0.5))
+      (should (equal (gnosis-algorithm-next-interval :last-interval 0
+                                                    :gnosis-synolon 1.3
+                                                    :success t
+                                                    :successful-reviews 0
+                                                    :amnesia 0.5
+                                                    :proto '(1 2 3)
+                                                    :c-fails 0
+                                                    :lethe 3)
+                    (gnosis-algorithm-date 1)))
+      (should (equal (gnosis-algorithm-next-interval :last-interval 0
+                                                    :gnosis-synolon 1.3
+                                                    :success t
+                                                    :successful-reviews 1
+                                                    :amnesia 0.5
+                                                    :proto '(1 2 3)
+                                                    :c-fails 0
+                                                    :lethe 3)
+                    (gnosis-algorithm-date 2))))))
+
+(ert-deftest gnosis-test-algorithm-synolon-floor ()
+  "Test that gnosis-synolon never drops below 1.3 on repeated failures."
+  ;; Single failure near floor: 1.5 - 0.30 = 1.2 → floored to 1.3
+  (should (equal (gnosis-algorithm-next-gnosis
+                 :gnosis '(0.35 0.30 1.5)
+                 :success nil
+                 :epignosis 0.1
+                 :agnoia 0.2
+                 :anagnosis 3
+                 :c-successes 0
+                 :c-failures 1)
+                '(0.35 0.30 1.3)))
+  ;; Already at floor: 1.3 - 0.30 = 1.0 → floored to 1.3
+  (should (equal (gnosis-algorithm-next-gnosis
+                 :gnosis '(0.35 0.30 1.3)
+                 :success nil
+                 :epignosis 0.1
+                 :agnoia 0.2
+                 :anagnosis 3
+                 :c-successes 0
+                 :c-failures 1)
+                '(0.35 0.30 1.3)))
+  ;; Large gnosis-minus still respects floor: 1.4 - 0.8 = 0.6 → 1.3
+  (should (equal (gnosis-algorithm-next-gnosis
+                 :gnosis '(0.35 0.80 1.4)
+                 :success nil
+                 :epignosis 0.1
+                 :agnoia 0.2
+                 :anagnosis 3
+                 :c-successes 0
+                 :c-failures 1)
+                '(0.35 0.80 1.3)))
+  ;; Repeated failures with anagnosis increasing gnosis-minus still floors
+  (should (equal (gnosis-algorithm-next-gnosis
+                 :gnosis '(0.35 0.50 1.4)
+                 :success nil
+                 :epignosis 0.1
+                 :agnoia 0.2
+                 :anagnosis 3
+                 :c-successes 0
+                 :c-failures 3)
+                '(0.35 0.7 1.3))))
+
+(ert-deftest gnosis-test-algorithm-lethe-anagnosis-interaction ()
+  "Test combined lethe and anagnosis events on gnosis score."
+  ;; Both lethe and anagnosis trigger simultaneously (c-failures=3, lethe=3, 
anagnosis=3):
+  ;; anagnosis increases gnosis-minus, lethe decreases gnosis-plus
+  (should (equal (gnosis-algorithm-next-gnosis
+                 :gnosis '(0.45 0.30 2.0)
+                 :success nil
+                 :epignosis 0.1
+                 :agnoia 0.2
+                 :anagnosis 3
+                 :c-successes 0
+                 :c-failures 3
+                 :lethe 3)
+                '(0.35 0.5 1.7)))
+  ;; Lethe at 6, anagnosis at 3: at c-failures=6 both trigger
+  (should (equal (gnosis-algorithm-next-gnosis
+                 :gnosis '(0.45 0.30 2.0)
+                 :success nil
+                 :epignosis 0.1
+                 :agnoia 0.2
+                 :anagnosis 3
+                 :c-successes 0
+                 :c-failures 6
+                 :lethe 6)
+                '(0.35 0.5 1.7)))
+  ;; Lethe triggers but anagnosis doesn't: only gnosis-plus reduced
+  (should (equal (gnosis-algorithm-next-gnosis
+                 :gnosis '(0.45 0.30 2.0)
+                 :success nil
+                 :epignosis 0.1
+                 :agnoia 0.2
+                 :anagnosis 3
+                 :c-successes 0
+                 :c-failures 5
+                 :lethe 5)
+                '(0.35 0.30 1.7)))
+  ;; Anagnosis triggers but lethe doesn't: only gnosis-minus increased
+  (should (equal (gnosis-algorithm-next-gnosis
+                 :gnosis '(0.45 0.30 2.0)
+                 :success nil
+                 :epignosis 0.1
+                 :agnoia 0.2
+                 :anagnosis 3
+                 :c-successes 0
+                 :c-failures 3
+                 :lethe 5)
+                '(0.45 0.5 1.7)))
+  ;; Both trigger with gnosis-plus near floor: floor applies
+  (should (equal (gnosis-algorithm-next-gnosis
+                 :gnosis '(0.15 0.30 2.0)
+                 :success nil
+                 :epignosis 0.1
+                 :agnoia 0.2
+                 :anagnosis 3
+                 :c-successes 0
+                 :c-failures 3
+                 :lethe 3)
+                '(0.1 0.5 1.7))))
+
 (ert-run-tests-batch-and-exit)

Reply via email to