summaryrefslogtreecommitdiff
path: root/tests/test-wttrin--process-weather-content.el
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test-wttrin--process-weather-content.el')
-rw-r--r--tests/test-wttrin--process-weather-content.el96
1 files changed, 96 insertions, 0 deletions
diff --git a/tests/test-wttrin--process-weather-content.el b/tests/test-wttrin--process-weather-content.el
new file mode 100644
index 0000000..a372f4c
--- /dev/null
+++ b/tests/test-wttrin--process-weather-content.el
@@ -0,0 +1,96 @@
+;;; test-wttrin--process-weather-content.el --- Tests for wttrin--process-weather-content -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2024 Craig Jennings
+
+;;; Commentary:
+;; Unit tests for wttrin--process-weather-content function.
+;; Tests ANSI filtering and removal of verbose Location lines.
+
+;;; Code:
+
+(require 'ert)
+(require 'wttrin)
+(require 'xterm-color)
+
+;;; Normal Cases
+
+(ert-deftest test-wttrin--process-weather-content-normal-plain-text ()
+ "Test processing plain text without ANSI codes or Location lines."
+ (let ((input "Weather: Sunny\nTemperature: 20°C"))
+ (should (string= input (wttrin--process-weather-content input)))))
+
+(ert-deftest test-wttrin--process-weather-content-normal-removes-location-line ()
+ "Test that Location line with coordinates is removed."
+ (let ((input "Weather: Sunny\n Location: Paris [48.8566, 2.3522]\nTemperature: 20°C")
+ (expected "Weather: Sunny\nTemperature: 20°C"))
+ (should (string= expected (wttrin--process-weather-content input)))))
+
+(ert-deftest test-wttrin--process-weather-content-normal-multiple-location-lines ()
+ "Test that multiple Location lines are all removed."
+ (let ((input "Location: Paris [48.8566, 2.3522]\nWeather: Sunny\n Location: Test [0, 0]\nTemp: 20°C")
+ (expected "Weather: Sunny\nTemp: 20°C"))
+ (should (string= expected (wttrin--process-weather-content input)))))
+
+(ert-deftest test-wttrin--process-weather-content-normal-with-ansi-codes ()
+ "Test that ANSI color codes are filtered by xterm-color-filter."
+ ;; xterm-color-filter should process ANSI codes
+ ;; We'll test that the function calls xterm-color-filter by checking
+ ;; that basic ANSI codes are handled (this depends on xterm-color behavior)
+ (let* ((input-with-ansi "\x1b[31mRed Text\x1b[0m\nNormal Text")
+ (result (wttrin--process-weather-content input-with-ansi)))
+ ;; xterm-color-filter adds text properties but returns the text content
+ (should (string-match-p "Red Text" result))
+ (should (string-match-p "Normal Text" result))))
+
+;;; Boundary Cases
+
+(ert-deftest test-wttrin--process-weather-content-boundary-empty-string ()
+ "Test processing empty string."
+ (should (string= "" (wttrin--process-weather-content ""))))
+
+(ert-deftest test-wttrin--process-weather-content-boundary-only-location-line ()
+ "Test processing string with only a Location line removes it."
+ (let ((input " Location: Test [0, 0]\n")
+ (expected ""))
+ ;; Input must have newline for delete-region to work correctly
+ (should (string= expected (wttrin--process-weather-content input)))))
+
+(ert-deftest test-wttrin--process-weather-content-boundary-location-without-brackets ()
+ "Test that Location line without brackets is not removed (doesn't match pattern)."
+ (let ((input "Location: Paris\nWeather: Sunny"))
+ ;; Pattern requires [coordinates], so this line should remain
+ (should (string-match-p "Location: Paris" (wttrin--process-weather-content input)))))
+
+(ert-deftest test-wttrin--process-weather-content-boundary-location-case-insensitive ()
+ "Test that 'location' (lowercase) IS removed due to case-insensitive regex."
+ (let ((input "location: test [0, 0]\nWeather: Sunny"))
+ ;; re-search-forward uses case-fold-search (defaults to t)
+ ;; so lowercase 'location' matches 'Location' pattern
+ (should-not (string-match-p "location:" (wttrin--process-weather-content input)))))
+
+(ert-deftest test-wttrin--process-weather-content-boundary-whitespace-variations ()
+ "Test Location line with various whitespace patterns."
+ (let ((input " Location: Test [1, 2] \nWeather: Sunny")
+ (expected "Weather: Sunny"))
+ (should (string= expected (wttrin--process-weather-content input)))))
+
+(ert-deftest test-wttrin--process-weather-content-boundary-preserves-non-location-brackets ()
+ "Test that lines with brackets but not Location pattern are preserved."
+ (let ((input "Weather: [Sunny] 20°C\nWind: [Strong]"))
+ (should (string= input (wttrin--process-weather-content input)))))
+
+;;; Error Cases
+
+(ert-deftest test-wttrin--process-weather-content-error-handles-malformed-ansi ()
+ "Test that function handles malformed ANSI codes gracefully."
+ ;; xterm-color-filter should handle this, but we verify no errors occur
+ (let ((input "\x1b[9999mInvalid ANSI\nNormal text"))
+ (should (stringp (wttrin--process-weather-content input)))))
+
+(ert-deftest test-wttrin--process-weather-content-error-very-long-line ()
+ "Test processing very long line without errors."
+ (let ((long-line (make-string 10000 ?x)))
+ (should (string= long-line (wttrin--process-weather-content long-line)))))
+
+(provide 'test-wttrin--process-weather-content)
+;;; test-wttrin--process-weather-content.el ends here