# `CMDCTest`
[🔗](https://github.com/tupleyun/cmdc_test/blob/v0.1.0/lib/cmdc_test.ex#L1)

CMDC Test — 集成方 / 第三方 plugin 作者 / cmdc 子库测试 helpers 一站式包。

cmdc 主库自身的 `test/support/` 目录在 hex 发布时不会打包，导致 Studio /
Hive 等集成方写 contract test 时各自重写 mock provider / plugin runner /
事件断言族。本子库把这些常见测试基础设施统一发布到 hex.pm，**4 大模块**：

| 模块 | 用途 |
|---|---|
| `CMDCTest.MockProvider` | Builder 式 mock LLM provider，配合 `CMDC.Config.provider_fn` 注入 |
| `CMDCTest.Plugin` | `run_hook/4` 单元测 Plugin；`with_mock_plugin/3` macro 集成路径测试 |
| `CMDCTest.EventCapture` | EventBus 订阅 + 收集 |
| `CMDCTest.Assertions` | `assert_event_emitted` / `assert_event_count` / `refute_event_emitted` |

## Quick Start

    # mix.exs
    defp deps do
      [
        {:cmdc, "~> 0.5"},
        {:cmdc_test, "~> 0.1", only: :test}
      ]
    end

    # test/my_agent_test.exs
    defmodule MyAgentTest do
      use ExUnit.Case, async: true
      import CMDCTest.Assertions

      test "Agent 调用 shell 工具触发 SecurityGuard block_tool" do
        provider =
          CMDCTest.MockProvider.new()
          |> CMDCTest.MockProvider.respond_tool_call("shell", %{"cmd" => "rm -rf /"})

        {:ok, session} =
          CMDC.create_agent(
            model: "mock:test",
            config: %{provider_fn: CMDCTest.MockProvider.to_provider_fn(provider)},
            plugins: [CMDC.Plugin.Builtin.SecurityGuard]
          )

        CMDCTest.EventCapture.start_capture(session)
        CMDC.prompt(session, "请删根目录")

        assert_event_emitted(session, :block_tool, timeout: 500)
      end
    end

详见各子模块 moduledoc。

# `version`

```elixir
@spec version() :: String.t()
```

返回 cmdc_test 当前版本号。

---

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