Reference: Examples: How to write the examples that prove a rule, the one-line form and its limits, and what archangel test checks. # Examples > How to write the examples that prove a rule, the one-line form and its limits, and what archangel test checks. An example is code that a rule must accept or must reject. `archangel test` checks each example. A rule that cannot reject its example is wrong, for example because a path in it has a typing error. For why, read [Examples prove rules](/archangel/concepts/examples/). ```ts rule('no-react-in-shared', { files: 'shared', mayNotImport: { packages: ['react'] }, examples: { accepted: ['src/shared/price.ts imports src/shared/money.ts'], rejected: ['src/shared/price.ts imports react'], }, }) ``` | Key | Type | What it holds | | ---------- | ---------------- | ------------------------------ | | `accepted` | list of examples | code that the rule must accept | | `rejected` | list of examples | code that the rule must reject | An example is one line, or an object of files. ## Each rule needs a rejected example `archangel test` fails for a rule that has no rejected example, with [`rule-unproven`](/archangel/reference/diagnostics/rule-unproven/). Only a rejected example shows that the rule can find a problem. A table row needs no written example. `archangel rules` shows what each row judged, and a table that finds no file is the error `table-empty`. The rule `.every-file-has-a-kind` needs no example either. ## One line Write an example on one line. Archangel makes the files for you. | One line | The files that archangel makes | | ---------------------------------------------- | ----------------------------------------- | | `'src/a.ts imports src/b.ts'` | Two files. `src/a.ts` imports `src/b.ts`. | | `'src/a.ts imports react'` | One file, which imports the package. | | `'src/a.ts imports src/b.ts imports src/a.ts'` | Two files that import each other. | | `'src/app/ui.ts'` | One empty file. | Each file holds one runtime import with a relative specifier for each `imports` after its path, and nothing else. A target is a file when it has a `/`, ends in `.ts`, `.tsx`, `.mts`, `.cts`, `.js`, `.jsx`, `.mjs` or `.cjs`, and does not start with `@` or `node:`. Each other target is a package. So `chart.js` is a package. Write a file in the config folder as `./b.ts`. A package path such as `lodash/fp.js` needs an object of files. The package of an example must be installed, because archangel resolves the import as usual. An example that imports a package that is not installed fails, and the message says that it proves nothing. ### Where one line is refused A file made from one line holds only runtime imports. So archangel refuses one line when the text of the file decides the result: * a rule with `names`, `specifier`, `dependency` or `imports: 'types'`; * a rule whose files, other side or `stopAt` select files by directive; * an export condition: `mustExport`, `mayNotExport`, `mustOnlyReExport`; * a plugin condition. The message names the rule and tells you to write the files. ## An object of files Write each file with its path and its text: ```ts isolate('feature', { examples: { accepted: [{ 'src/features/login/a.ts': "import './b';", 'src/features/login/b.ts': '' }], rejected: [{ 'src/features/login/a.ts': "import '../signup/c';", 'src/features/signup/c.ts': '' }], }, }) ``` * A path starts at the config folder. * A `package.json` among the files, outside `node_modules`, is a package manifest for that example. It replaces the manifest of the repository at the same path. Use it to prove a rule with `dependency`. * An example cannot add a workspace package. * A file of an example that does not parse makes the example fail with `parse-failed`. ## Examples run on top of your repository Archangel puts the files of an example into a check in memory. It does not write a file. The example sees the files of your repository too: * A file of an example can import a file of the repository. * A file of an example at the path of a repository file replaces that file, for that example only. * Other repository files stay. So a folder of an example can already hold files of the repository. For example, a rule says that each folder in `src/features/*` must contain `index.ts`. A rejected example `'src/features/cart/ui/cart.view.tsx'` fails when your repository already has `src/features/cart/index.ts`, because the folder then has its `index.ts`. Use a folder that does not exist, such as `src/features/search/ui/search.view.tsx`. ## When an example passes | Example | It passes when | | -------- | ----------------------------------------------------------------------------------------------------- | | rejected | its own rule gives a problem that involves a file of the example | | accepted | its own rule gives no problem that involves a file of the example, and its rule looked at one of them | * When only other rules reject a rejected example, it fails, and the message names those rules: [`example-failed`](/archangel/reference/diagnostics/example-failed/). * An accepted example that its rule never looked at proves nothing: [`example-proves-nothing`](/archangel/reference/diagnostics/example-proves-nothing/). An import rule looks at imports. A rule about files looks at files. A folder rule looks at folders. * A `mustNotExist` rule rejects each file that it looks at, so it can have only rejected examples. ## Examples of a table A table row needs no example, but you can write examples for a table. They run against all its rows. A rejected example passes when one row refuses one of its imports. An accepted example passes only when a row judged one of its imports. ## Examples of a preset Archangel checks the examples of a preset in your repository, under the preset’s `root`, with your tsconfig. ## The output `archangel test` prints one line for each example, and a summary: Terminal ```ansi $ npx archangel test pass no-react-in-shared rejected #1 src/shared/money.ts 1 examples, none failed; 0 rules without a rejected example 2 table rows need no written example; `archangel rules` shows what each covers ``` It exits with 0 only when each example passes and each rule has a rejected example.