;;; test-custom-text-enclose-wrap.el --- Tests for cj/--wrap -*- lexical-binding: t; -*-
;;; Commentary:
;; Tests for the cj/--wrap function from custom-text-enclose.el
;;
;; This function wraps text with different opening and closing strings.
;; Unlike surround which uses the same string on both sides, wrap allows
;; asymmetric delimiters.
;;
;; Examples:
;; Input: "content", opening: "
", closing: "
"
;; Output: "content
"
;;
;; Input: "text", opening: "(", closing: ")"
;; Output: "(text)"
;;
;; We test the NON-INTERACTIVE implementation (cj/--wrap) 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-wrap (text opening closing)
"Test cj/--wrap on TEXT with OPENING and CLOSING.
Returns the transformed string."
(cj/--wrap text opening closing))
;;; Normal Cases - Common Bracket Types
(ert-deftest test-wrap-parentheses ()
"Should wrap text with parentheses."
(let ((result (test-wrap "text" "(" ")")))
(should (string= result "(text)"))))
(ert-deftest test-wrap-square-brackets ()
"Should wrap text with square brackets."
(let ((result (test-wrap "item" "[" "]")))
(should (string= result "[item]"))))
(ert-deftest test-wrap-curly-braces ()
"Should wrap text with curly braces."
(let ((result (test-wrap "code" "{" "}")))
(should (string= result "{code}"))))
(ert-deftest test-wrap-angle-brackets ()
"Should wrap text with angle brackets."
(let ((result (test-wrap "tag" "<" ">")))
(should (string= result ""))))
;;; Normal Cases - HTML/XML Tags
(ert-deftest test-wrap-html-div ()
"Should wrap text with HTML div tags."
(let ((result (test-wrap "content" "" "
")))
(should (string= result "content
"))))
(ert-deftest test-wrap-html-span ()
"Should wrap text with HTML span tags."
(let ((result (test-wrap "text" "" "")))
(should (string= result "text"))))
(ert-deftest test-wrap-xml-tag ()
"Should wrap text with XML tags."
(let ((result (test-wrap "data" "- " "
")))
(should (string= result "- data
"))))
(ert-deftest test-wrap-html-with-attributes ()
"Should wrap text with HTML tag containing attributes."
(let ((result (test-wrap "link" "" "")))
(should (string= result "link"))))
;;; Normal Cases - Markdown Syntax
(ert-deftest test-wrap-markdown-bold ()
"Should wrap text with markdown bold syntax."
(let ((result (test-wrap "bold" "**" "**")))
(should (string= result "**bold**"))))
(ert-deftest test-wrap-markdown-italic ()
"Should wrap text with markdown italic syntax."
(let ((result (test-wrap "italic" "*" "*")))
(should (string= result "*italic*"))))
(ert-deftest test-wrap-markdown-code ()
"Should wrap text with markdown code syntax."
(let ((result (test-wrap "code" "`" "`")))
(should (string= result "`code`"))))
(ert-deftest test-wrap-markdown-link ()
"Should wrap text with markdown link syntax."
(let ((result (test-wrap "text" "[" "](url)")))
(should (string= result "[text](url)"))))
;;; Normal Cases - Various Content
(ert-deftest test-wrap-single-word ()
"Should wrap single word."
(let ((result (test-wrap "word" "(" ")")))
(should (string= result "(word)"))))
(ert-deftest test-wrap-multiple-words ()
"Should wrap multiple words."
(let ((result (test-wrap "hello world" "(" ")")))
(should (string= result "(hello world)"))))
(ert-deftest test-wrap-sentence ()
"Should wrap full sentence."
(let ((result (test-wrap "This is a sentence." "(" ")")))
(should (string= result "(This is a sentence.)"))))
(ert-deftest test-wrap-with-numbers ()
"Should wrap text with numbers."
(let ((result (test-wrap "123" "[" "]")))
(should (string= result "[123]"))))
(ert-deftest test-wrap-with-special-chars ()
"Should wrap text with special characters."
(let ((result (test-wrap "hello@world.com" "<" ">")))
(should (string= result ""))))
;;; Normal Cases - Multiline Text
(ert-deftest test-wrap-multiline ()
"Should wrap multiline text."
(let ((result (test-wrap "line1\nline2\nline3" "" "
")))
(should (string= result "line1\nline2\nline3
"))))
(ert-deftest test-wrap-text-with-newlines ()
"Should wrap text containing newlines."
(let ((result (test-wrap "first\nsecond" "(" ")")))
(should (string= result "(first\nsecond)"))))
;;; Boundary Cases
(ert-deftest test-wrap-empty-string ()
"Should wrap empty string."
(let ((result (test-wrap "" "(" ")")))
(should (string= result "()"))))
(ert-deftest test-wrap-single-character ()
"Should wrap single character."
(let ((result (test-wrap "x" "[" "]")))
(should (string= result "[x]"))))
(ert-deftest test-wrap-empty-opening ()
"Should handle empty opening delimiter."
(let ((result (test-wrap "text" "" ")")))
(should (string= result "text)"))))
(ert-deftest test-wrap-empty-closing ()
"Should handle empty closing delimiter."
(let ((result (test-wrap "text" "(" "")))
(should (string= result "(text"))))
(ert-deftest test-wrap-both-empty ()
"Should handle both delimiters empty."
(let ((result (test-wrap "text" "" "")))
(should (string= result "text"))))
(ert-deftest test-wrap-very-long-text ()
"Should wrap very long text."
(let* ((long-text (make-string 1000 ?a))
(result (test-wrap long-text "(" ")")))
(should (string-prefix-p "(" result))
(should (string-suffix-p ")" result))
(should (= (length result) 1002))))
(ert-deftest test-wrap-whitespace-only ()
"Should wrap whitespace-only text."
(let ((result (test-wrap " " "(" ")")))
(should (string= result "( )"))))
(ert-deftest test-wrap-tabs ()
"Should wrap text with tabs."
(let ((result (test-wrap "\t\ttext\t\t" "[" "]")))
(should (string= result "[\t\ttext\t\t]"))))
;;; Edge Cases - Already Wrapped
(ert-deftest test-wrap-already-wrapped ()
"Should wrap text that is already wrapped."
(let ((result (test-wrap "(hello)" "[" "]")))
(should (string= result "[(hello)]"))))
(ert-deftest test-wrap-nested ()
"Should wrap text creating nested delimiters."
(let ((result (test-wrap "[inner]" "(" ")")))
(should (string= result "([inner])"))))
;;; Edge Cases - Special Delimiters
(ert-deftest test-wrap-asymmetric-length ()
"Should wrap with different length delimiters."
(let ((result (test-wrap "text" "<<" ">>>")))
(should (string= result "<>>"))))
(ert-deftest test-wrap-multi-char-delimiters ()
"Should wrap with multi-character delimiters."
(let ((result (test-wrap "data" "BEGIN" "END")))
(should (string= result "BEGINdataEND"))))
(ert-deftest test-wrap-space-delimiters ()
"Should wrap with space delimiters."
(let ((result (test-wrap "text" " " " ")))
(should (string= result " text "))))
(ert-deftest test-wrap-newline-delimiters ()
"Should wrap with newline delimiters."
(let ((result (test-wrap "text" "\n" "\n")))
(should (string= result "\ntext\n"))))
(ert-deftest test-wrap-quote-delimiters ()
"Should wrap with quote delimiters."
(let ((result (test-wrap "text" "\"" "\"")))
(should (string= result "\"text\""))))
;;; Edge Cases - Same Opening and Closing
(ert-deftest test-wrap-same-delimiters ()
"Should work like surround when delimiters are the same."
(let ((result (test-wrap "text" "*" "*")))
(should (string= result "*text*"))))
(provide 'test-custom-text-enclose-wrap)
;;; test-custom-text-enclose-wrap.el ends here