# `ClaudeWrapper.DuplexSession.Adapter.Test`
[🔗](https://github.com/genagent/claude_wrapper_ex/blob/main/lib/claude_wrapper/duplex_session/adapter/test.ex#L1)

In-process test double for `ClaudeWrapper.DuplexSession.Adapter`.

Instead of a `claude` subprocess, the transport is a lightweight
controller process the test drives directly. The controller is created
per session and passed in via `:controller` in the session's
`:adapter_opts`; because nothing is shared between sessions, concurrent
(`async: true`) tests cannot collide -- no global registry, no extra
dependency.

Drive it through `ClaudeWrapper.Test` rather than calling this module
directly.

## Protocol

The controller accepts:

  * `{:emit, lines}` -- send each line to the session as a
    `{handle, {:data, line}}` message (NDJSON the session parses)
  * `{:set_reply, lines}` -- queue a one-shot canned reply emitted on
    the next outbound `command/2` (a faked turn response)
  * `{:exit_status, code}` -- send the session `{handle, {:exit_status,
    code}}` (simulate the subprocess exiting)
  * `:close` -- stop

and, on `open/1`, is told its `:owner` (the session pid) and linked to
it so a session crash tears the controller down and vice versa.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
