Require subr-x in card-games-net; skip SVG tests without SVG
card-games-net.el calls string-empty-p, which lives in subr-x before Emacs 29; without the require a fresh Emacs 27 reported a void function in every networked test. The SVG smoke and region tests now skip when the Emacs has no SVG support, so the suite reads 145 expected, 20 skipped there instead of 25 failures. * card-games-net.el: Require subr-x. * test/card-games-tests.el: Skip the SVG tests unless SVG is available. * NEWS: Note both. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U2Fb1SzFi8UuJdUm96qx83
This commit is contained in:
parent
1a5d23d39e
commit
e78fe38381
3 changed files with 26 additions and 0 deletions
5
NEWS
5
NEWS
|
|
@ -4,6 +4,11 @@ card-games NEWS -- user-visible changes
|
||||||
* Version 1.0.92 (pretest3: MELPA review)
|
* Version 1.0.92 (pretest3: MELPA review)
|
||||||
|
|
||||||
** Packaging and internals
|
** Packaging and internals
|
||||||
|
- card-games-net requires subr-x. It calls ~string-empty-p~, which
|
||||||
|
lives in subr-x before Emacs 29, so a fresh Emacs 27 failed every
|
||||||
|
networked test with a void function; the header promises 26.1.
|
||||||
|
- The SVG smoke and region tests skip, rather than fail, in an Emacs
|
||||||
|
built without SVG support. An Emacs with SVG runs them as before.
|
||||||
- The networked 500 client no longer patches game commands with
|
- The networked 500 client no longer patches game commands with
|
||||||
advice. Player commands submit their action through the new
|
advice. Player commands submit their action through the new
|
||||||
~card-games-bid-submit~ generic; a joining Emacs plays a
|
~card-games-bid-submit~ generic; a joining Emacs plays a
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@
|
||||||
|
|
||||||
;;; Code:
|
;;; Code:
|
||||||
|
|
||||||
|
(require 'subr-x)
|
||||||
(require 'card-games-core)
|
(require 'card-games-core)
|
||||||
|
|
||||||
(defgroup card-games-net nil
|
(defgroup card-games-net nil
|
||||||
|
|
|
||||||
|
|
@ -470,6 +470,7 @@ the unseeded shuffle keeps its system-random behaviour. Opening #4."
|
||||||
geom))))))
|
geom))))))
|
||||||
|
|
||||||
(ert-deftest cgt-classic-folds-controls ()
|
(ert-deftest cgt-classic-folds-controls ()
|
||||||
|
(skip-unless (image-type-available-p 'svg))
|
||||||
;; graphical classic UI: one action-button row, no textual key-help
|
;; graphical classic UI: one action-button row, no textual key-help
|
||||||
(with-temp-buffer
|
(with-temp-buffer
|
||||||
(card-games-bid-mode)
|
(card-games-bid-mode)
|
||||||
|
|
@ -1029,12 +1030,14 @@ left a 15-card hand in play."
|
||||||
(should (member '(2 . 5) (card-games-crap--reserve g 0))))) ; loaded onto you
|
(should (member '(2 . 5) (card-games-crap--reserve g 0))))) ; loaded onto you
|
||||||
|
|
||||||
(ert-deftest cgt-svg-logo-smoke ()
|
(ert-deftest cgt-svg-logo-smoke ()
|
||||||
|
(skip-unless (image-type-available-p 'svg))
|
||||||
(dolist (choice '(modern classic gnu splash drawn none nonexistent))
|
(dolist (choice '(modern classic gnu splash drawn none nonexistent))
|
||||||
(let ((card-games-svg-emacs-logo choice) (svg (svg-create 200 120)))
|
(let ((card-games-svg-emacs-logo choice) (svg (svg-create 200 120)))
|
||||||
(card-games-svg-draw-logo svg 100 60 1.0)
|
(card-games-svg-draw-logo svg 100 60 1.0)
|
||||||
(should (imagep (svg-image svg))))))
|
(should (imagep (svg-image svg))))))
|
||||||
|
|
||||||
(ert-deftest cgt-svg-card-back-smoke ()
|
(ert-deftest cgt-svg-card-back-smoke ()
|
||||||
|
(skip-unless (image-type-available-p 'svg))
|
||||||
(dolist (b '(dots rings solid lattice waves diamond
|
(dolist (b '(dots rings solid lattice waves diamond
|
||||||
emacs emacs-classic gnu splash random))
|
emacs emacs-classic gnu splash random))
|
||||||
(let ((card-games-svg-card-back b) (svg (svg-create 80 100)))
|
(let ((card-games-svg-card-back b) (svg (svg-create 80 100)))
|
||||||
|
|
@ -1105,6 +1108,7 @@ left a 15-card hand in play."
|
||||||
(should (= 1 (length (card-games-crap--house g 1))))))
|
(should (= 1 (length (card-games-crap--house g 1))))))
|
||||||
|
|
||||||
(ert-deftest cgt-crap-svg-smoke ()
|
(ert-deftest cgt-crap-svg-smoke ()
|
||||||
|
(skip-unless (image-type-available-p 'svg))
|
||||||
(let ((g (card-games-crap--deal (card-games-crapette-game))))
|
(let ((g (card-games-crap--deal (card-games-crapette-game))))
|
||||||
(aset (card-games-get g :houses) 0 (list '(2 . 8) '(0 . 7) '(3 . 6))) ; a run to draw
|
(aset (card-games-get g :houses) 0 (list '(2 . 8) '(0 . 7) '(3 . 6))) ; a run to draw
|
||||||
(aset (card-games-get g :reserve) 0 (list '(3 . 0))) ; a forced foundation
|
(aset (card-games-get g :reserve) 0 (list '(3 . 0))) ; a forced foundation
|
||||||
|
|
@ -1118,6 +1122,7 @@ left a 15-card hand in play."
|
||||||
(should (rassoc '(house . 0) (cdr res))))))
|
(should (rassoc '(house . 0) (cdr res))))))
|
||||||
|
|
||||||
(ert-deftest cgt-trick-svg-smoke ()
|
(ert-deftest cgt-trick-svg-smoke ()
|
||||||
|
(skip-unless (image-type-available-p 'svg))
|
||||||
(let ((g (card-games-hearts-game)))
|
(let ((g (card-games-hearts-game)))
|
||||||
(card-games-trick--deal g)
|
(card-games-trick--deal g)
|
||||||
(card-games-put g :cursor 0) (card-games-put g :phase 'play) (card-games-put g :turn 0) (card-games-put g :message "x")
|
(card-games-put g :cursor 0) (card-games-put g :phase 'play) (card-games-put g :turn 0) (card-games-put g :message "x")
|
||||||
|
|
@ -1132,6 +1137,7 @@ left a 15-card hand in play."
|
||||||
(should (cl-every (lambda (r) (= 4 (length (car r)))) regs))))))
|
(should (cl-every (lambda (r) (= 4 (length (car r)))) regs))))))
|
||||||
|
|
||||||
(ert-deftest cgt-trick-svg-bidding ()
|
(ert-deftest cgt-trick-svg-bidding ()
|
||||||
|
(skip-unless (image-type-available-p 'svg))
|
||||||
(let ((g (card-games-spades-game)))
|
(let ((g (card-games-spades-game)))
|
||||||
(card-games-trick--deal g)
|
(card-games-trick--deal g)
|
||||||
(card-games-put g :cursor 2) (card-games-put g :phase 'bid) (card-games-put g :turn 0) (card-games-put g :message "bid")
|
(card-games-put g :cursor 2) (card-games-put g :phase 'bid) (card-games-put g :turn 0) (card-games-put g :message "bid")
|
||||||
|
|
@ -1139,6 +1145,7 @@ left a 15-card hand in play."
|
||||||
(should (stringp (card-games-trick--svg g)))))
|
(should (stringp (card-games-trick--svg g)))))
|
||||||
|
|
||||||
(ert-deftest cgt-gin-svg-smoke ()
|
(ert-deftest cgt-gin-svg-smoke ()
|
||||||
|
(skip-unless (image-type-available-p 'svg))
|
||||||
(let ((g (card-games-gin-game)))
|
(let ((g (card-games-gin-game)))
|
||||||
(card-games-gin--deal g)
|
(card-games-gin--deal g)
|
||||||
(card-games-put g :cursor 0) (card-games-put g :message "x") (card-games-put g :scores (vector 0 0))
|
(card-games-put g :cursor 0) (card-games-put g :message "x") (card-games-put g :scores (vector 0 0))
|
||||||
|
|
@ -1148,6 +1155,7 @@ left a 15-card hand in play."
|
||||||
(should (rassoc '(hand . 0) (get-text-property 0 'card-games-regions sres))))))
|
(should (rassoc '(hand . 0) (get-text-property 0 'card-games-regions sres))))))
|
||||||
|
|
||||||
(ert-deftest cgt-tm-svg-smoke ()
|
(ert-deftest cgt-tm-svg-smoke ()
|
||||||
|
(skip-unless (image-type-available-p 'svg))
|
||||||
(let ((g (card-games-rum500-game)))
|
(let ((g (card-games-rum500-game)))
|
||||||
(card-games-tm--deal g)
|
(card-games-tm--deal g)
|
||||||
(card-games-put g :cursor 1) (card-games-put g :message "x")
|
(card-games-put g :cursor 1) (card-games-put g :message "x")
|
||||||
|
|
@ -1160,6 +1168,7 @@ left a 15-card hand in play."
|
||||||
(should (cl-every (lambda (r) (= 4 (length (car r)))) regs)))))
|
(should (cl-every (lambda (r) (= 4 (length (car r)))) regs)))))
|
||||||
|
|
||||||
(ert-deftest cgt-hf-svg-smoke ()
|
(ert-deftest cgt-hf-svg-smoke ()
|
||||||
|
(skip-unless (image-type-available-p 'svg))
|
||||||
(let ((g (card-games-handfoot-game)))
|
(let ((g (card-games-handfoot-game)))
|
||||||
(card-games-put g :nplayers 4) (card-games-put g :nteams 2) (card-games-put g :scores (make-vector 2 0))
|
(card-games-put g :nplayers 4) (card-games-put g :nteams 2) (card-games-put g :scores (make-vector 2 0))
|
||||||
(card-games-hf--deal g)
|
(card-games-hf--deal g)
|
||||||
|
|
@ -1170,6 +1179,7 @@ left a 15-card hand in play."
|
||||||
(should (cl-every (lambda (r) (= 4 (length (car r)))) regs)))))
|
(should (cl-every (lambda (r) (= 4 (length (car r)))) regs)))))
|
||||||
|
|
||||||
(ert-deftest cgt-fish-svg-smoke ()
|
(ert-deftest cgt-fish-svg-smoke ()
|
||||||
|
(skip-unless (image-type-available-p 'svg))
|
||||||
(let ((g (card-games-scopa-game)))
|
(let ((g (card-games-scopa-game)))
|
||||||
(card-games-fish--deal-round g)
|
(card-games-fish--deal-round g)
|
||||||
(card-games-put g :cursor 0) (card-games-put g :message "x")
|
(card-games-put g :cursor 0) (card-games-put g :message "x")
|
||||||
|
|
@ -1178,6 +1188,7 @@ left a 15-card hand in play."
|
||||||
(get-text-property 0 'card-games-regions (card-games-fish--svg g))))))
|
(get-text-property 0 'card-games-regions (card-games-fish--svg g))))))
|
||||||
|
|
||||||
(ert-deftest cgt-eights-svg-smoke ()
|
(ert-deftest cgt-eights-svg-smoke ()
|
||||||
|
(skip-unless (image-type-available-p 'svg))
|
||||||
(let ((g (card-games-eights-game)))
|
(let ((g (card-games-eights-game)))
|
||||||
(card-games-put g :nplayers 3) (card-games-put g :scores (make-vector 3 0))
|
(card-games-put g :nplayers 3) (card-games-put g :scores (make-vector 3 0))
|
||||||
(card-games-eights--deal g) (card-games-put g :cursor 0) (card-games-put g :message "x")
|
(card-games-eights--deal g) (card-games-put g :cursor 0) (card-games-put g :message "x")
|
||||||
|
|
@ -1187,6 +1198,7 @@ left a 15-card hand in play."
|
||||||
(should (cl-every (lambda (r) (= 4 (length (car r)))) regs)))))
|
(should (cl-every (lambda (r) (= 4 (length (car r)))) regs)))))
|
||||||
|
|
||||||
(ert-deftest cgt-spite-svg-smoke ()
|
(ert-deftest cgt-spite-svg-smoke ()
|
||||||
|
(skip-unless (image-type-available-p 'svg))
|
||||||
(let ((g (card-games-spite-game)))
|
(let ((g (card-games-spite-game)))
|
||||||
(card-games-put g :nplayers 2) (card-games-put g :scores (make-vector 2 0))
|
(card-games-put g :nplayers 2) (card-games-put g :scores (make-vector 2 0))
|
||||||
(card-games-spite--deal g) (card-games-put g :cursor 0) (card-games-put g :message "x")
|
(card-games-spite--deal g) (card-games-put g :cursor 0) (card-games-put g :message "x")
|
||||||
|
|
@ -1196,6 +1208,7 @@ left a 15-card hand in play."
|
||||||
(get-text-property 0 'card-games-regions (card-games-spite--board-svg g))))))
|
(get-text-property 0 'card-games-regions (card-games-spite--board-svg g))))))
|
||||||
|
|
||||||
(ert-deftest cgt-om-svg-smoke ()
|
(ert-deftest cgt-om-svg-smoke ()
|
||||||
|
(skip-unless (image-type-available-p 'svg))
|
||||||
(let ((g (card-games-old-maid-game)))
|
(let ((g (card-games-old-maid-game)))
|
||||||
(card-games-om--deal g)
|
(card-games-om--deal g)
|
||||||
(card-games-put g :phase 'play) (card-games-put g :turn 0) (card-games-put g :message "x")
|
(card-games-put g :phase 'play) (card-games-put g :turn 0) (card-games-put g :message "x")
|
||||||
|
|
@ -1203,6 +1216,7 @@ left a 15-card hand in play."
|
||||||
(should (stringp (card-games-om--svg g)))))
|
(should (stringp (card-games-om--svg g)))))
|
||||||
|
|
||||||
(ert-deftest cgt-crib-svg-smoke ()
|
(ert-deftest cgt-crib-svg-smoke ()
|
||||||
|
(skip-unless (image-type-available-p 'svg))
|
||||||
(let ((g (card-games-cribbage-game)))
|
(let ((g (card-games-cribbage-game)))
|
||||||
(card-games-put g :scores (make-vector 2 0))
|
(card-games-put g :scores (make-vector 2 0))
|
||||||
(card-games-crib--deal g)
|
(card-games-crib--deal g)
|
||||||
|
|
@ -1220,6 +1234,7 @@ left a 15-card hand in play."
|
||||||
(should (stringp (card-games-crib--svg g)))))
|
(should (stringp (card-games-crib--svg g)))))
|
||||||
|
|
||||||
(ert-deftest cgt-bridge-svg-smoke ()
|
(ert-deftest cgt-bridge-svg-smoke ()
|
||||||
|
(skip-unless (image-type-available-p 'svg))
|
||||||
(let ((g (card-games-bridge-game)))
|
(let ((g (card-games-bridge-game)))
|
||||||
(card-games-bridge--deal g)
|
(card-games-bridge--deal g)
|
||||||
(card-games-put g :cursor 0) (card-games-put g :turn 0) (card-games-put g :bid-level 1) (card-games-put g :bid-strain 0)
|
(card-games-put g :cursor 0) (card-games-put g :turn 0) (card-games-put g :bid-level 1) (card-games-put g :bid-strain 0)
|
||||||
|
|
@ -1555,6 +1570,7 @@ left a 15-card hand in play."
|
||||||
(setq s (+ s (card-games-bris--points (cons su r)))))) s))))
|
(setq s (+ s (card-games-bris--points (cons su r)))))) s))))
|
||||||
|
|
||||||
(ert-deftest cgt-trick-ext-full ()
|
(ert-deftest cgt-trick-ext-full ()
|
||||||
|
(skip-unless (image-type-available-p 'svg))
|
||||||
(dolist (class '(card-games-briscola-game card-games-pitch-game card-games-euchre-game))
|
(dolist (class '(card-games-briscola-game card-games-pitch-game card-games-euchre-game))
|
||||||
(let ((g (make-instance class)) (guard 0))
|
(let ((g (make-instance class)) (guard 0))
|
||||||
(card-games-trick--new g)
|
(card-games-trick--new g)
|
||||||
|
|
@ -1602,6 +1618,7 @@ left a 15-card hand in play."
|
||||||
'((0 . (0 . 12)) (1 . (3 . 0)) (2 . (0 . 2)) (3 . (0 . 5))) 3))))
|
'((0 . (0 . 12)) (1 . (3 . 0)) (2 . (0 . 2)) (3 . (0 . 5))) 3))))
|
||||||
|
|
||||||
(ert-deftest cgt-bridge-full ()
|
(ert-deftest cgt-bridge-full ()
|
||||||
|
(skip-unless (image-type-available-p 'svg))
|
||||||
(let ((scored 0) (passed 0))
|
(let ((scored 0) (passed 0))
|
||||||
(dotimes (i 12)
|
(dotimes (i 12)
|
||||||
(let ((g (card-games-bridge-game)) (guard 0))
|
(let ((g (card-games-bridge-game)) (guard 0))
|
||||||
|
|
@ -1627,6 +1644,7 @@ left a 15-card hand in play."
|
||||||
;;;; Renderer registry / region keystone
|
;;;; Renderer registry / region keystone
|
||||||
|
|
||||||
(ert-deftest cgt-keystone-regions ()
|
(ert-deftest cgt-keystone-regions ()
|
||||||
|
(skip-unless (image-type-available-p 'svg))
|
||||||
(let* ((g (card-games-sol--deal (make-instance 'card-games-klondike-game)))
|
(let* ((g (card-games-sol--deal (make-instance 'card-games-klondike-game)))
|
||||||
(res (card-games-render-svg g)))
|
(res (card-games-render-svg g)))
|
||||||
(should (stringp (car res)))
|
(should (stringp (car res)))
|
||||||
|
|
@ -1649,6 +1667,7 @@ left a 15-card hand in play."
|
||||||
;;;; Hand-cluster click regions + card-size slider
|
;;;; Hand-cluster click regions + card-size slider
|
||||||
|
|
||||||
(ert-deftest cgt-hand-regions ()
|
(ert-deftest cgt-hand-regions ()
|
||||||
|
(skip-unless (image-type-available-p 'svg))
|
||||||
(let* ((cards '((0 . 0) (0 . 1) (1 . 5)))
|
(let* ((cards '((0 . 0) (0 . 1) (1 . 5)))
|
||||||
(str (card-games-rummy--svg-row cards 0 nil nil 'hand))
|
(str (card-games-rummy--svg-row cards 0 nil nil 'hand))
|
||||||
(regs (get-text-property 0 'card-games-regions str)))
|
(regs (get-text-property 0 'card-games-regions str)))
|
||||||
|
|
@ -1731,6 +1750,7 @@ left a 15-card hand in play."
|
||||||
|
|
||||||
(ert-deftest cgt-mouse-regions ()
|
(ert-deftest cgt-mouse-regions ()
|
||||||
"The newly clickable games attach a `card-games-regions' map to their SVG."
|
"The newly clickable games attach a `card-games-regions' map to their SVG."
|
||||||
|
(skip-unless (image-type-available-p 'svg))
|
||||||
(let* ((g (card-games-pat--deal (card-games-golf-game)))
|
(let* ((g (card-games-pat--deal (card-games-golf-game)))
|
||||||
(regs (get-text-property 0 'card-games-regions (card-games-pat--svg g))))
|
(regs (get-text-property 0 'card-games-regions (card-games-pat--svg g))))
|
||||||
(should regs)
|
(should regs)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue