summaryrefslogtreecommitdiff
path: root/gnosis-test.el
diff options
context:
space:
mode:
Diffstat (limited to 'gnosis-test.el')
-rw-r--r--gnosis-test.el134
1 files changed, 134 insertions, 0 deletions
diff --git a/gnosis-test.el b/gnosis-test.el
new file mode 100644
index 0000000..854cb50
--- /dev/null
+++ b/gnosis-test.el
@@ -0,0 +1,134 @@
+;;; gnosis-algorithm.el --- Gnosis development tools -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 Thanos Apollo
+
+;; Author: Thanos Apollo <[email protected]>
+;; Keywords: extensions
+;; URL: https://git.thanosapollo.org/gnosis
+;; Version: 0.0.1
+
+;; Package-Requires: ((emacs "27.2") (compat "29.1.4.2"))
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Development module for gnosis, to make development of gnosis.el
+;; easier by creating a testing environment with random inputs.
+
+;;; Code:
+
+(require 'gnosis)
+
+(defvar gnosis-dev-tags '("anatomy" "thoracic" "serratus-anterior"
+ "biochemistry" "informatics" "amino-acids"
+ "microbiology" "gram-positive" "gram-negative"
+ "fungi" "parasites"))
+
+(defun gnosis-dev-random-items (list x)
+ "Select X random items from LIST."
+ (let ((shuffled-list (copy-sequence list))
+ selected-items)
+ (dotimes (_ x)
+ (let* ((index (random (length shuffled-list)))
+ (item (nth index shuffled-list)))
+ (setq selected-items (cons item selected-items))
+ (setq shuffled-list (append (butlast shuffled-list index) (nthcdr (1+ index) shuffled-list)))))
+ selected-items))
+
+(defun gnosis-dev-add-fields (&optional num deck)
+ "Add random inputs to test.
+
+NUM: Number of random inputs to add.
+DECK: Deck to add the inputs to."
+ (let ((num (or num (string-to-number (read-string "Number of random inputs: "))))
+ (testing-deck (or deck "testing")))
+ (unless (gnosis-get 'name 'decks `(= name ,testing-deck))
+ (gnosis-add-deck testing-deck))
+ (when (y-or-n-p "Add MCQ type?")
+ (dotimes (_ num)
+ (gnosis-add-note--mcq :deck testing-deck
+ :question "A 37-year-old man is admitted to the
+emergency department after a severe car crash. After examining the
+patient the emergency medicine physician concludes that the serratus
+anterior muscle is damaged. Which of the following nerves innervates
+the serratus anterior muscle?"
+ :choices '("Long thoracic" "Axillary" "Spinal accessory" "Dorsal scapular" "Thoracodorsal")
+ :correct-answer 1
+ :extra "The long thoracic is the only nerve that
+innervates the serratus anterior. The axillary nerve innervates the
+deltoid, the spinal accessory nerve innervates the sternocleidomastoid
+and trapezius, the dorsal scapular nerve supplies the rhomboid muscles
+and levator scapulae, and the latissimus dorsi is the muscle supplied
+by the thoracodorsal nerve."
+ :tags (gnosis-dev-random-items gnosis-dev-tags 2))))
+ (when (y-or-n-p "Add Basic type questions?")
+ (dotimes (_ num)
+ (gnosis-add-note--basic :deck testing-deck
+ :question "A question"
+ :hint "hint"
+ :answer "answer"
+ :extra "extra"
+ :tags (gnosis-dev-random-items gnosis-dev-tags 2))))
+ (when (y-or-n-p "Add single cloze type?")
+ (dotimes (_ num)
+ (gnosis-add-note--cloze :deck testing-deck
+ :note "this is a {c1:note}"
+ :hint "note"
+ :tags (gnosis-dev-random-items gnosis-dev-tags 2)
+ :extra "extra")))
+ (when (y-or-n-p "Add note with multiple clozes?")
+ (dotimes (_ num)
+ (gnosis-add-note--cloze :deck testing-deck
+ :note "this is a {c1:note} with multiple {c1:clozes}"
+ :hint "note"
+ :tags (gnosis-dev-random-items gnosis-dev-tags 2)
+ :extra "extra")))
+ (when (y-or-n-p "Add note type y-or-n?")
+ (dotimes (_ num)
+ (gnosis-add-note--y-or-n :deck testing-deck
+ :question "Is Codeine recommended in breastfeeding mothers?"
+ :hint "hint"
+ :answer 110
+ :extra "extra"
+ :tags (gnosis-dev-random-items gnosis-dev-tags 2))))))
+
+(defun gnosis-dev-test ()
+ "Begin/End testing env.
+
+If ask nil, leave development env"
+ (interactive)
+ (let ((ask (y-or-n-p "Start development env (n for exit)?"))
+ (testing-dir (expand-file-name gnosis-dir "testing")))
+ (if ask
+ (progn
+ (unless (file-exists-p testing-dir)
+ (make-directory testing-dir))
+ (setf gnosis-db (emacsql-sqlite-open (expand-file-name "testing.db" testing-dir)))
+ (setf gnosis-testing t)
+ (dolist (table '(notes decks review review-log extras))
+ (condition-case nil
+ (gnosis--drop-table table)
+ (error (message "No %s table to drop." table))))
+ (gnosis-db-init)
+ (gnosis-dev-add-fields)
+ (message "Adding testing values...")
+ (message "Development env is ready for testing."))
+ (setf gnosis-db (emacsql-sqlite-open (expand-file-name "gnosis.db" gnosis-dir)))
+ (setf gnosis-testing nil)
+ (message "Exited development env."))))
+
+
+(provide 'gnosis-dev)
+;;; gnosis-dev.el ends here