# zidane-ui/terminal/testing/contract

Import: `import { … } from 'zidane-ui/terminal/testing/contract'`. Source: [ui/src/terminal/testing/contract.ts](https://github.com/Tahul/zidane/blob/main/ui/src/terminal/testing/contract.ts).

## Functions

### `describeTerminalHostContract`

Function.

Declares the shared `TerminalHost` suite for one implementation.

```ts
function describeTerminalHostContract(
  name: string,
  makeHarness: TerminalHostHarnessFactory,
  capabilities: readonly TerminalHostCapability[],
): void
```

**Parameters**

- `name` (`string`): The implementation's name, shown in the suite title.
- `makeHarness` (`TerminalHostHarnessFactory`): Builds a fresh host over a backend that holds what it is given, once per test.
- `capabilities` (`readonly TerminalHostCapability[]`): The optional members the host offers. Every other optional member must be undefined.

Source: [ui/src/terminal/testing/contract.ts:121](https://github.com/Tahul/zidane/blob/main/ui/src/terminal/testing/contract.ts#L121)

## Interfaces

### `TerminalHostContractBackend`

Interface.

What the backend behind the host holds.

```ts
interface TerminalHostContractBackend
```

**Properties**

- `drafts` (`Readonly<Record<string, readonly TerminalInfo[]>>`): The terminals per draft id (no session yet).
- `history` (`Readonly<Record<string, string>>`): What each terminal printed so far, by id.
- `sessions` (`Readonly<Record<string, readonly TerminalInfo[]>>`): The terminals per session id.

Source: [ui/src/terminal/testing/contract.ts:35](https://github.com/Tahul/zidane/blob/main/ui/src/terminal/testing/contract.ts#L35)

### `TerminalHostContractControl`

Interface.

Reads the backend and acts from outside.

```ts
interface TerminalHostContractControl
```

**Properties**

- `announce` (`(sessionId: string) => void`): The backend sends a session's full list (as after any change).
- `print` (`(terminalId: string, data: string) => void`): The terminal prints `data`: the backend sends it to the attached views, at the end of its history.
- `relink?` (`() => void`): The link to the backend drops and comes back. Absent: it never drops.
- `terminals` (`() => TerminalInfo[]`): Every terminal the backend holds now.
- `writes` (`(terminalId: string) => string[]`): The typing a terminal received, one entry per write.

Source: [ui/src/terminal/testing/contract.ts:45](https://github.com/Tahul/zidane/blob/main/ui/src/terminal/testing/contract.ts#L45)

### `TerminalHostHarness`

Interface.

A host built over a backend, the backend's control, and how to tear them down.

```ts
interface TerminalHostHarness
```

**Properties**

- `control` (`TerminalHostContractControl`): Reads and acts on the backend.
- `host` (`TerminalHost`): The host under test.
- `dispose?` (`() => void`): Closes connections and listeners after each test.

Source: [ui/src/terminal/testing/contract.ts:59](https://github.com/Tahul/zidane/blob/main/ui/src/terminal/testing/contract.ts#L59)

## Types

### `TerminalHostCapability`

Type.

An optional `TerminalHost` member.

```ts
type TerminalHostCapability =
  | 'restart'
  | 'setHidden'
  | 'adoptDraft'
  | 'releaseDraft'
  | 'layouts'
```

Source: [ui/src/terminal/testing/contract.ts:24](https://github.com/Tahul/zidane/blob/main/ui/src/terminal/testing/contract.ts#L24)

### `TerminalHostHarnessFactory`

Type.

Builds a fresh host (and its backend) for one test.

```ts
type TerminalHostHarnessFactory = (backend: TerminalHostContractBackend) => TerminalHostHarness | Promise<TerminalHostHarness>
```

Source: [ui/src/terminal/testing/contract.ts:69](https://github.com/Tahul/zidane/blob/main/ui/src/terminal/testing/contract.ts#L69)
