;;; test-custom-text-enclose-unwrap.el --- Tests for cj/--unwrap -*- lexical-binding: t; -*-
;;; Commentary:
;; Tests for the cj/--unwrap function from custom-text-enclose.el
;;
;; This function removes surrounding delimiters from text.
;; It checks if text starts with opening and ends with closing,
;; and if so, removes them.
;;
;; Examples:
;; Input: "(text)", opening: "(", closing: ")"
;; Output: "text"
;;
;; Input: "
content
", opening: "", closing: "
"
;; Output: "content"
;;
;; We test the NON-INTERACTIVE implementation (cj/--unwrap) to avoid
;; mocking user input. This follows our testing best practice of
;; separating business logic from UI interaction.
;;; Code:
(require 'ert)
(require 'testutil-general)
;; Add modules directory to load path
(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
;; Stub dependencies before loading the module
(defvar cj/custom-keymap (make-sparse-keymap)
"Stub keymap for testing.")
;; Now load the actual production module
(require 'custom-text-enclose)
;;; Test Helpers
(defun test-unwrap (text opening closing)
"Test cj/--unwrap on TEXT with OPENING and CLOSING.
Returns the transformed string."
(cj/--unwrap text opening closing))
;;; Normal Cases - Common Bracket Types
(ert-deftest test-unwrap-parentheses ()
"Should unwrap text with parentheses."
(let ((result (test-unwrap "(text)" "(" ")")))
(should (string= result "text"))))
(ert-deftest test-unwrap-square-brackets ()
"Should unwrap text with square brackets."
(let ((result (test-unwrap "[item]" "[" "]")))
(should (string= result "item"))))
(ert-deftest test-unwrap-curly-braces ()
"Should unwrap text with curly braces."
(let ((result (test-unwrap "{code}" "{" "}")))
(should (string= result "code"))))
(ert-deftest test-unwrap-angle-brackets ()
"Should unwrap text with angle brackets."
(let ((result (test-unwrap "" "<" ">")))
(should (string= result "tag"))))
;;; Normal Cases - HTML/XML Tags
(ert-deftest test-unwrap-html-div ()
"Should unwrap HTML div tags."
(let ((result (test-unwrap "content
" "" "
")))
(should (string= result "content"))))
(ert-deftest test-unwrap-html-span ()
"Should unwrap HTML span tags."
(let ((result (test-unwrap "text" "" "")))
(should (string= result "text"))))
(ert-deftest test-unwrap-xml-tag ()
"Should unwrap XML tags."
(let ((result (test-unwrap "- data
" "- " "
")))
(should (string= result "data"))))
(ert-deftest test-unwrap-html-with-attributes ()
"Should unwrap HTML tag containing attributes."
(let ((result (test-unwrap "link" "" "")))
(should (string= result "link"))))
;;; Normal Cases - Markdown Syntax
(ert-deftest test-unwrap-markdown-bold ()
"Should unwrap markdown bold syntax."
(let ((result (test-unwrap "**bold**" "**" "**")))
(should (string= result "bold"))))
(ert-deftest test-unwrap-markdown-italic ()
"Should unwrap markdown italic syntax."
(let ((result (test-unwrap "*italic*" "*" "*")))
(should (string= result "italic"))))
(ert-deftest test-unwrap-markdown-code ()
"Should unwrap markdown code syntax."
(let ((result (test-unwrap "`code`" "`" "`")))
(should (string= result "code"))))
(ert-deftest test-unwrap-quotes ()
"Should unwrap double quotes."
(let ((result (test-unwrap "\"text\"" "\"" "\"")))
(should (string= result "text"))))
;;; Normal Cases - Various Content
(ert-deftest test-unwrap-single-word ()
"Should unwrap single word."
(let ((result (test-unwrap "(word)" "(" ")")))
(should (string= result "word"))))
(ert-deftest test-unwrap-multiple-words ()
"Should unwrap multiple words."
(let ((result (test-unwrap "(hello world)" "(" ")")))
(should (string= result "hello world"))))
(ert-deftest test-unwrap-sentence ()
"Should unwrap full sentence."
(let ((result (test-unwrap "(This is a sentence.)" "(" ")")))
(should (string= result "This is a sentence."))))
(ert-deftest test-unwrap-with-numbers ()
"Should unwrap text with numbers."
(let ((result (test-unwrap "[123]" "[" "]")))
(should (string= result "123"))))
(ert-deftest test-unwrap-with-special-chars ()
"Should unwrap text with special characters."
(let ((result (test-unwrap "" "<" ">")))
(should (string= result "hello@world.com"))))
;;; Normal Cases - Multiline Text
(ert-deftest test-unwrap-multiline ()
"Should unwrap multiline text."
(let ((result (test-unwrap "line1\nline2\nline3
" "" "
")))
(should (string= result "line1\nline2\nline3"))))
(ert-deftest test-unwrap-text-with-newlines ()
"Should unwrap text containing newlines."
(let ((result (test-unwrap "(first\nsecond)" "(" ")")))
(should (string= result "first\nsecond"))))
;;; Boundary Cases - No Match
(ert-deftest test-unwrap-no-opening ()
"Should not unwrap when opening is missing."
(let ((result (test-unwrap "text)" "(" ")")))
(should (string= result "text)"))))
(ert-deftest test-unwrap-no-closing ()
"Should not unwrap when closing is missing."
(let ((result (test-unwrap "(text" "(" ")")))
(should (string= result "(text"))))
(ert-deftest test-unwrap-neither-delimiter ()
"Should not unwrap when neither delimiter is present."
(let ((result (test-unwrap "text" "(" ")")))
(should (string= result "text"))))
(ert-deftest test-unwrap-wrong-opening ()
"Should not unwrap with wrong opening delimiter."
(let ((result (test-unwrap "[text)" "(" ")")))
(should (string= result "[text)"))))
(ert-deftest test-unwrap-wrong-closing ()
"Should not unwrap with wrong closing delimiter."
(let ((result (test-unwrap "(text]" "(" ")")))
(should (string= result "(text]"))))
;;; Boundary Cases - Empty
(ert-deftest test-unwrap-empty-content ()
"Should unwrap to empty string."
(let ((result (test-unwrap "()" "(" ")")))
(should (string= result ""))))
(ert-deftest test-unwrap-just-delimiters ()
"Should unwrap when only delimiters present."
(let ((result (test-unwrap "[]" "[" "]")))
(should (string= result ""))))
(ert-deftest test-unwrap-empty-string ()
"Should return empty string unchanged."
(let ((result (test-unwrap "" "(" ")")))
(should (string= result ""))))
(ert-deftest test-unwrap-too-short ()
"Should not unwrap when text is shorter than delimiters."
(let ((result (test-unwrap "x" "" "
")))
(should (string= result "x"))))
;;; Boundary Cases - Nested/Multiple
(ert-deftest test-unwrap-nested-same ()
"Should unwrap only outer layer of nested delimiters."
(let ((result (test-unwrap "((text))" "(" ")")))
(should (string= result "(text)"))))
(ert-deftest test-unwrap-nested-different ()
"Should unwrap outer layer with different inner delimiters."
(let ((result (test-unwrap "([text])" "(" ")")))
(should (string= result "[text]"))))
(ert-deftest test-unwrap-multiple-in-content ()
"Should not unwrap when delimiters appear in content."
(let ((result (test-unwrap "(a)b(c)" "(" ")")))
(should (string= result "a)b(c"))))
;;; Edge Cases - Special Delimiters
(ert-deftest test-unwrap-asymmetric-length ()
"Should unwrap with different length delimiters."
(let ((result (test-unwrap "<>>" "<<" ">>>")))
(should (string= result "text"))))
(ert-deftest test-unwrap-multi-char-delimiters ()
"Should unwrap with multi-character delimiters."
(let ((result (test-unwrap "BEGINdataEND" "BEGIN" "END")))
(should (string= result "data"))))
(ert-deftest test-unwrap-space-delimiters ()
"Should unwrap with space delimiters."
(let ((result (test-unwrap " text " " " " ")))
(should (string= result "text"))))
(ert-deftest test-unwrap-newline-delimiters ()
"Should unwrap with newline delimiters."
(let ((result (test-unwrap "\ntext\n" "\n" "\n")))
(should (string= result "text"))))
;;; Edge Cases - Same Opening and Closing
(ert-deftest test-unwrap-same-delimiters ()
"Should unwrap when opening and closing are the same."
(let ((result (test-unwrap "*text*" "*" "*")))
(should (string= result "text"))))
(ert-deftest test-unwrap-same-multi-char ()
"Should unwrap same multi-char delimiters."
(let ((result (test-unwrap "***text***" "***" "***")))
(should (string= result "text"))))
;;; Edge Cases - Empty Delimiters
(ert-deftest test-unwrap-empty-opening ()
"Should handle empty opening delimiter."
(let ((result (test-unwrap "text)" "" ")")))
(should (string= result "text"))))
(ert-deftest test-unwrap-empty-closing ()
"Should handle empty closing delimiter."
(let ((result (test-unwrap "(text" "(" "")))
(should (string= result "text"))))
(ert-deftest test-unwrap-both-delimiters-empty ()
"Should return text unchanged when both delimiters empty."
(let ((result (test-unwrap "text" "" "")))
(should (string= result "text"))))
(provide 'test-custom-text-enclose-unwrap)
;;; test-custom-text-enclose-unwrap.el ends here