luv

Workshop wiki

tests.lisp

application-agent/tests.lisp

system luv/application-agent/test · 19 definitions · on GitHub

in-package#:luv.application-agent.tests
clim:define-command-tableapplication-agent-test-commands
clim:define-command
com-test-adjust:command-tableapplication-agent-test-commands:name"Test Adjust"
count'integer:prompt"count"
mode'
member:fast:slow
:prompt"mode"
&key
label'string:prompt"label":default"ordinary"
"Adjust a probe with a count, mode, and optional label."
defclasstest-application
frame:initform
clim:make-application-frame'application-agent-test-frame
:readertest-application-frame
dispatch-count:initform0:accessortest-application-dispatch-count
defmethodagent:application-command-frame
applicationtest-application
test-application-frameapplication
defmethodagent:call-in-application-frame
incf
test-application-dispatch-countapplication
funcallfunction
defuntest-response
&optional
text"done"
make-instance'openai:agent-response:texttext:reasoning"":id"test":usagenil
defunmake-test-agent
&keyturn-functionclose-functionclose-failure-function
make-instance'agent:application-agent:application
make-instance'test-application
:model"test":socketnil:turn-function
orturn-function
lambda
agentprompt
declare
ignoreagentprompt
:close-function
orclose-function
lambda
agent
declare
ignoreagent
:close-failure-function
orclose-failure-function
lambda
failure
declare
ignorefailure
:observer-failure-function
lambda
failure
declare
ignorefailure
defunjoin-test-turn
turn&optional
timeout1.0
or:timeout
deftestask-returns-before-provider-turn-completes
let
started
sb-thread:make-semaphore:count0
finish
sb-thread:make-semaphore:count0
unwind-protect
progn
setfapplication-agent
make-test-agent:turn-function
lambda
agentprompt
declare
ignoreagentprompt
sb-thread:signal-semaphorestarted
sb-thread:wait-on-semaphorefinish
test-response"unblocked"
let*
before
get-internal-real-time
elapsed
/
-
get-internal-real-time
before
floatinternal-time-units-per-second1.0
ok
<elapsed0.1
"ASK only creates a worker"
ok
sb-thread:wait-on-semaphorestarted:timeout1.0
ok
member
agent:turn-statusturn
'
:thinking:working
sb-thread:signal-semaphorefinish
ok
eq:done
agent:turn-statusturn
ok
string="unblocked"
agent:turn-textturn
deftestasks-reach-the-provider-in-publication-order
let
started
sb-thread:make-semaphore:count0
finish
sb-thread:make-semaphore:count0
received'
received-lock
sb-thread:make-mutex:name"ordered test turns"
unwind-protect
progn
setfapplication-agent
make-test-agent:turn-function
lambda
agentprompt
declare
ignoreagent
when
string=prompt"first"
sb-thread:signal-semaphorestarted
sb-thread:wait-on-semaphorefinish
sb-thread:with-mutex
received-lock
setfreceived
nconcreceived
listprompt
let
first
ok
sb-thread:wait-on-semaphorestarted:timeout1.0
let
ok
eq
agent:turn-threadfirst
agent:turn-threadsecond
ok
eq
agent:turn-threadsecond
agent:turn-threadthird
sb-thread:signal-semaphorefinish
ok
agent:wait-for-turnfirst:timeout1.0
ok
agent:wait-for-turnthird:timeout1.0
ok
equal'
"first""second""third"
received
sb-thread:signal-semaphorefinish
deftestrelease-prompts-close-and-unblocks-an-active-turn
let
started
sb-thread:make-semaphore:count0
provider-closed
sb-thread:make-semaphore:count0
events'
events-lock
sb-thread:make-mutex:name"release order test"
close-count0
unwind-protect
progn
setfapplication-agent
make-test-agent:turn-function
lambda
agentprompt
declare
ignoreagentprompt
sb-thread:signal-semaphorestarted

Model NEXT-AGENT-EVENT: only the provider close path, not the test or release caller, wakes this active turn.

sb-thread:wait-on-semaphoreprovider-closed
sb-thread:with-mutex
events-lock
push:turnevents
:close-function
lambda
agent
declare
ignoreagent
sb-thread:with-mutex
events-lock
incfclose-count
push:closeevents
sb-thread:signal-semaphoreprovider-closed
let
active
ok
sb-thread:wait-on-semaphorestarted:timeout1.0
let*
queued
before
get-internal-real-time
elapsed
/
-
get-internal-real-time
before
floatinternal-time-units-per-second1.0
okreleased
ok
<elapsed0.1
"release only publishes terminal work"
ok
agent:wait-for-turnactive:timeout1.0
ok
agent:wait-for-turnqueued:timeout1.0
ok
eq:done
agent:turn-statusactive
ok
eq:failed
agent:turn-statusqueued
ok
typep
agent:turn-errorqueued
'agent:application-agent-released
ok
equal'
:close:turn
nreverseevents
ok
=1close-count
sb-thread:signal-semaphoreprovider-closed
deftestone-failing-observer-does-not-suppress-the-others
let
unwind-protect
progn
agent:add-agent-observerapplication-agent
lambda
agentkindobject
declare
ignoreagentobject
pushkindevents
agent:add-agent-observerapplication-agent
lambda
agentkindobject
declare
ignoreagentkindobject
error"broken observer"
handler-bind
ok
member:turn-startedevents
ok
member:turn-finishedevents
deftestcommand-schema-and-parser-share-clim-argument-semantics
let*
tool
agent:make-command-tool'com-test-adjust
arguments
agent:command-tool-argument-specificationstool
parameters
openai:tool-parameterstool
properties
cdr
assoc"properties"parameters:test#'string=
required
cdr
assoc"required"parameters:test#'string=
ok
equal'
"count""mode""label"
mapcar#'agent:command-argument-json-namearguments
ok
equal'
ttnil
mapcar#'agent:command-argument-required-parguments
ok
equal'
nilnilt
mapcar#'agent:command-argument-keyword-parguments
ok
equal'
"count""mode"
coercerequired'list
ok
string="integer"
cdr
assoc"type"
cdr
assoc"count"properties:test#'string=
:test#'string=
ok
equal'
"fast""slow"
cdr
assoc"enum"
cdr
assoc"mode"properties:test#'string=
:test#'string=
ok
equal'
com-test-adjust7:fast:label"named probe"
agent:command-tool-parsetool'
"count".7
"mode"."fast"
"label"."named probe"
ok
equal'
com-test-adjust8:slow
agent:command-tool-parsetool'
"count".8
"mode"."slow"
ok
signals
agent:command-tool-parsetool'
"count".1
"mode"."fast"
"bogus".2
'agent:tool-argument-error
deftestcommand-effects-cross-the-application-frame-boundary-once
let*
unwind-protect
let
output
openai:call-tooltool'
"count".12
"mode"."slow"
"label"."canvas"
application-agent
ok
=1
test-application-dispatch-countapplication
ok
equal'
12:slow"canvas"
*test-command-result*
ok
search"CANVAS"output:test#'char-equal
deftestrelease-is-terminal-idempotent-and-concurrent-safe
let
close-count0
close-lock
sb-thread:make-mutex:name"test agent close"
setfapplication-agent
make-test-agent:close-function
lambda
agent
declare
ignoreagent
sb-thread:with-mutex
close-lock
incfclose-count
let
threads
looprepeat8collect
dolist
threadthreads
sb-thread:join-threadthread
ok
=1close-count
ok
signals
agent:intern-handle
make-instance'standard-object
agent:application-agent-handlesapplication-agent
'agent:handle-table-released