8a76469bcb
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
43 lines
1.9 KiB
Common Lisp
43 lines
1.9 KiB
Common Lisp
;;; A CFFI smoke test: load libzset_ffi, add weights, query, hit the overflow code, free.
|
|
;;; Run: sbcl --non-interactive --load ~/quicklisp/setup.lisp \
|
|
;;; --eval '(defvar cl-user::*zset-lib* "target/release/libzset_ffi.dylib")' \
|
|
;;; --load crates/zset-ffi/tests/smoke.lisp
|
|
;;; Not a CI gate: sbcl and cffi are not in the dev shell. See context/code/zset-ffi.md.
|
|
(ql:quickload :cffi :silent t)
|
|
(defpackage :zset-smoke (:use :cl :cffi))
|
|
(in-package :zset-smoke)
|
|
|
|
(load-foreign-library cl-user::*zset-lib*)
|
|
|
|
(defcfun "zs_abi_version" :uint32)
|
|
(defcfun "zs_last_error" :string)
|
|
(defcfun "zs_zset_new" :int32 (out :pointer))
|
|
(defcfun "zs_zset_free" :void (z :pointer))
|
|
(defcfun "zs_zset_insert" :int32 (z :pointer) (key :pointer) (len :size) (weight :int64))
|
|
(defcfun "zs_zset_weight" :int32 (z :pointer) (key :pointer) (len :size) (out :pointer))
|
|
(defcfun "zs_zset_len" :int32 (z :pointer) (out :pointer))
|
|
|
|
(defconstant +overflow+ 2)
|
|
|
|
(defun check (what got want)
|
|
(unless (equal got want) (error "~a: got ~s, wanted ~s" what got want))
|
|
(format t "ok ~a~%" what))
|
|
|
|
(defun key-call (fn z key &rest more)
|
|
"Calls FN with Z, a foreign copy of the string KEY's UTF-8 bytes, its length, MORE."
|
|
(with-foreign-string ((ptr len) key :null-terminated-p nil)
|
|
(apply fn z ptr len more)))
|
|
|
|
(with-foreign-object (out :pointer)
|
|
(check "new" (zs-zset-new out) 0)
|
|
(let ((z (mem-ref out :pointer)))
|
|
(check "insert" (key-call #'zs-zset-insert z "k" 40) 0)
|
|
(check "insert again" (key-call #'zs-zset-insert z "k" 2) 0)
|
|
(with-foreign-object (w :int64)
|
|
(check "weight" (progn (key-call #'zs-zset-weight z "k" w) (mem-ref w :int64)) 42)
|
|
(check "overflow code" (key-call #'zs-zset-insert z "k" (1- (expt 2 63))) +overflow+)
|
|
(check "error text" (and (search "overflow" (zs-last-error)) t) t)
|
|
(check "unchanged" (progn (key-call #'zs-zset-weight z "k" w) (mem-ref w :int64)) 42))
|
|
(zs-zset-free z)))
|
|
(format t "zset smoke: all ok~%")
|