summaryrefslogtreecommitdiff
path: root/tests/test-org-roam-config-slug.el
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test-org-roam-config-slug.el')
-rw-r--r--tests/test-org-roam-config-slug.el223
1 files changed, 223 insertions, 0 deletions
diff --git a/tests/test-org-roam-config-slug.el b/tests/test-org-roam-config-slug.el
new file mode 100644
index 00000000..eb3149dd
--- /dev/null
+++ b/tests/test-org-roam-config-slug.el
@@ -0,0 +1,223 @@
+;;; test-org-roam-config-slug.el --- Tests for cj/--generate-roam-slug -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; Tests for the cj/--generate-roam-slug function from org-roam-config.el
+;;
+;; This function converts a title to a filename-safe slug by:
+;; 1. Converting to lowercase
+;; 2. Replacing non-alphanumeric characters with hyphens
+;; 3. Removing leading and trailing hyphens
+;;
+;; Examples:
+;; Input: "My Project Name"
+;; Output: "my-project-name"
+;;
+;; Input: "Hello, World!"
+;; Output: "hello-world"
+
+;;; Code:
+
+(require 'ert)
+(require 'testutil-general)
+
+;; Add modules directory to load path
+(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
+
+;; Now load the actual production module
+(require 'org-roam-config)
+
+;;; Test Helpers
+
+(defun test-slug (title)
+ "Test cj/--generate-roam-slug on TITLE.
+Returns the slugified string."
+ (cj/--generate-roam-slug title))
+
+;;; Normal Cases - Simple Titles
+
+(ert-deftest test-slug-simple-word ()
+ "Should return lowercase simple word."
+ (let ((result (test-slug "Hello")))
+ (should (string= result "hello"))))
+
+(ert-deftest test-slug-multiple-words ()
+ "Should replace spaces with hyphens."
+ (let ((result (test-slug "My Project Name")))
+ (should (string= result "my-project-name"))))
+
+(ert-deftest test-slug-already-lowercase ()
+ "Should handle already lowercase text."
+ (let ((result (test-slug "simple")))
+ (should (string= result "simple"))))
+
+(ert-deftest test-slug-mixed-case ()
+ "Should convert mixed case to lowercase."
+ (let ((result (test-slug "MixedCaseTitle")))
+ (should (string= result "mixedcasetitle"))))
+
+;;; Normal Cases - Punctuation
+
+(ert-deftest test-slug-with-comma ()
+ "Should remove commas."
+ (let ((result (test-slug "Hello, World")))
+ (should (string= result "hello-world"))))
+
+(ert-deftest test-slug-with-period ()
+ "Should remove periods."
+ (let ((result (test-slug "Version 2.0")))
+ (should (string= result "version-2-0"))))
+
+(ert-deftest test-slug-with-exclamation ()
+ "Should remove exclamation marks."
+ (let ((result (test-slug "Hello World!")))
+ (should (string= result "hello-world"))))
+
+(ert-deftest test-slug-with-question ()
+ "Should remove question marks."
+ (let ((result (test-slug "What Is This?")))
+ (should (string= result "what-is-this"))))
+
+(ert-deftest test-slug-with-colon ()
+ "Should remove colons."
+ (let ((result (test-slug "Note: Important")))
+ (should (string= result "note-important"))))
+
+(ert-deftest test-slug-with-parentheses ()
+ "Should remove parentheses."
+ (let ((result (test-slug "Item (copy)")))
+ (should (string= result "item-copy"))))
+
+;;; Normal Cases - Numbers
+
+(ert-deftest test-slug-with-numbers ()
+ "Should preserve numbers."
+ (let ((result (test-slug "Chapter 42")))
+ (should (string= result "chapter-42"))))
+
+(ert-deftest test-slug-only-numbers ()
+ "Should handle titles with only numbers."
+ (let ((result (test-slug "123")))
+ (should (string= result "123"))))
+
+(ert-deftest test-slug-mixed-alphanumeric ()
+ "Should preserve alphanumeric characters."
+ (let ((result (test-slug "Test123ABC")))
+ (should (string= result "test123abc"))))
+
+;;; Boundary Cases - Multiple Consecutive Special Chars
+
+(ert-deftest test-slug-multiple-spaces ()
+ "Should collapse multiple spaces into single hyphen."
+ (let ((result (test-slug "Hello World")))
+ (should (string= result "hello-world"))))
+
+(ert-deftest test-slug-mixed-punctuation ()
+ "Should collapse mixed punctuation into single hyphen."
+ (let ((result (test-slug "Hello, ... World!")))
+ (should (string= result "hello-world"))))
+
+(ert-deftest test-slug-consecutive-hyphens ()
+ "Should collapse consecutive hyphens."
+ (let ((result (test-slug "Hello---World")))
+ (should (string= result "hello-world"))))
+
+;;; Boundary Cases - Leading/Trailing Special Chars
+
+(ert-deftest test-slug-leading-space ()
+ "Should remove leading hyphen from leading space."
+ (let ((result (test-slug " Hello")))
+ (should (string= result "hello"))))
+
+(ert-deftest test-slug-trailing-space ()
+ "Should remove trailing hyphen from trailing space."
+ (let ((result (test-slug "Hello ")))
+ (should (string= result "hello"))))
+
+(ert-deftest test-slug-leading-punctuation ()
+ "Should remove leading hyphen from leading punctuation."
+ (let ((result (test-slug "...Hello")))
+ (should (string= result "hello"))))
+
+(ert-deftest test-slug-trailing-punctuation ()
+ "Should remove trailing hyphen from trailing punctuation."
+ (let ((result (test-slug "Hello!!!")))
+ (should (string= result "hello"))))
+
+(ert-deftest test-slug-leading-and-trailing ()
+ "Should remove both leading and trailing hyphens."
+ (let ((result (test-slug " Hello World ")))
+ (should (string= result "hello-world"))))
+
+;;; Boundary Cases - Empty and Short
+
+(ert-deftest test-slug-empty-string ()
+ "Should return empty string for empty input."
+ (let ((result (test-slug "")))
+ (should (string= result ""))))
+
+(ert-deftest test-slug-only-punctuation ()
+ "Should return empty string for only punctuation."
+ (let ((result (test-slug "!!!")))
+ (should (string= result ""))))
+
+(ert-deftest test-slug-only-spaces ()
+ "Should return empty string for only spaces."
+ (let ((result (test-slug " ")))
+ (should (string= result ""))))
+
+(ert-deftest test-slug-single-char ()
+ "Should handle single character."
+ (let ((result (test-slug "A")))
+ (should (string= result "a"))))
+
+;;; Edge Cases - Special Characters
+
+(ert-deftest test-slug-with-underscore ()
+ "Should replace underscores with hyphens."
+ (let ((result (test-slug "my_variable_name")))
+ (should (string= result "my-variable-name"))))
+
+(ert-deftest test-slug-with-slash ()
+ "Should remove slashes."
+ (let ((result (test-slug "path/to/file")))
+ (should (string= result "path-to-file"))))
+
+(ert-deftest test-slug-with-at-sign ()
+ "Should remove at signs."
+ (let ((result (test-slug "user@example")))
+ (should (string= result "user-example"))))
+
+(ert-deftest test-slug-with-hash ()
+ "Should remove hash symbols."
+ (let ((result (test-slug "#hashtag")))
+ (should (string= result "hashtag"))))
+
+(ert-deftest test-slug-with-dollar ()
+ "Should remove dollar signs."
+ (let ((result (test-slug "$price")))
+ (should (string= result "price"))))
+
+;;; Edge Cases - Unicode (if supported)
+
+(ert-deftest test-slug-with-unicode ()
+ "Should remove unicode characters."
+ (let ((result (test-slug "Café")))
+ (should (string= result "caf"))))
+
+(ert-deftest test-slug-with-emoji ()
+ "Should remove emoji."
+ (let ((result (test-slug "Hello 😀 World")))
+ (should (string= result "hello-world"))))
+
+;;; Edge Cases - Long Titles
+
+(ert-deftest test-slug-very-long-title ()
+ "Should handle very long titles."
+ (let* ((long-title (mapconcat #'identity (make-list 20 "word") " "))
+ (result (test-slug long-title)))
+ (should (string-prefix-p "word-" result))
+ (should (string-suffix-p "-word" result))
+ (should (not (string-match-p " " result)))))
+
+(provide 'test-org-roam-config-slug)
+;;; test-org-roam-config-slug.el ends here