feat: add source hyperlinks + remove thin from-source.md
Every source reference now links to elixir-lang/elixir at commit f4e1b34. 122 hyperlinks across 11 topic files. Added PATTERN_COMPLETE sentinels. Removed from-source.md (326 lines, shallow) — covered by existing files.
This commit is contained in:
+22
-20
@@ -6,7 +6,7 @@ Patterns extracted from the Elixir standard library source code — how the core
|
||||
|
||||
## 1. Module-Level Async Declaration
|
||||
|
||||
**Source:** `lib/elixir/test/elixir/gen_server_test.exs:9`, `lib/elixir/test/elixir/enum_test.exs:8`, nearly all test files
|
||||
**Source:** [lib/elixir/test/elixir/gen_server_test.exs#L9](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/elixir/test/elixir/gen_server_test.exs#L9), [lib/elixir/test/elixir/enum_test.exs#L8](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/elixir/test/elixir/enum_test.exs#L8), nearly all test files
|
||||
|
||||
**What it does:** Every test module declares `async: true` or `async: false` at the module level, making concurrency intent explicit.
|
||||
|
||||
@@ -101,7 +101,7 @@ end
|
||||
|
||||
## 2. Parameterized Tests
|
||||
|
||||
**Source:** `lib/elixir/test/elixir/registry_test.exs:12-22`
|
||||
**Source:** [lib/elixir/test/elixir/registry_test.exs#L12](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/elixir/test/elixir/registry_test.exs#L12)
|
||||
|
||||
**What it does:** Runs the same test suite against multiple configurations using the `:parameterize` option (since v1.18).
|
||||
|
||||
@@ -214,7 +214,7 @@ end
|
||||
|
||||
## 3. Setup with `start_supervised/2`
|
||||
|
||||
**Source:** `lib/ex_unit/lib/ex_unit/callbacks.ex:277-340`, `lib/elixir/test/elixir/registry_test.exs:31`
|
||||
**Source:** [lib/ex_unit/lib/ex_unit/callbacks.ex#L277](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/ex_unit/lib/ex_unit/callbacks.ex#L277), [lib/elixir/test/elixir/registry_test.exs#L31](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/elixir/test/elixir/registry_test.exs#L31)
|
||||
|
||||
**What it does:** Starts processes under a test supervisor that guarantees cleanup before the next test.
|
||||
|
||||
@@ -293,7 +293,7 @@ end
|
||||
|
||||
## 4. Named Setup Functions (Composable Pipelines)
|
||||
|
||||
**Source:** `lib/ex_unit/lib/ex_unit/callbacks.ex:100-120` (docs)
|
||||
**Source:** [lib/ex_unit/lib/ex_unit/callbacks.ex#L100](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/ex_unit/lib/ex_unit/callbacks.ex#L100) (docs)
|
||||
|
||||
**What it does:** Defines setup as a list of named functions rather than anonymous blocks.
|
||||
|
||||
@@ -364,7 +364,7 @@ end
|
||||
|
||||
## 5. `on_exit` for Reversing Global Side Effects
|
||||
|
||||
**Source:** `lib/elixir/test/elixir/task_test.exs:1128-1131`, `lib/logger/test/logger_test.exs:12-17`
|
||||
**Source:** [lib/elixir/test/elixir/task_test.exs#L1128](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/elixir/test/elixir/task_test.exs#L1128), [lib/logger/test/logger_test.exs#L12](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/logger/test/logger_test.exs#L12)
|
||||
|
||||
**What it does:** Registers cleanup callbacks that always run, even if the test fails.
|
||||
|
||||
@@ -437,7 +437,7 @@ end
|
||||
|
||||
## 6. Pattern Match Assertions
|
||||
|
||||
**Source:** `lib/ex_unit/lib/ex_unit/assertions.ex:145-175`
|
||||
**Source:** [lib/ex_unit/lib/ex_unit/assertions.ex#L145](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/ex_unit/lib/ex_unit/assertions.ex#L145)
|
||||
|
||||
**What it does:** Uses `assert` with `=` for structural pattern matching in assertions.
|
||||
|
||||
@@ -506,7 +506,7 @@ assert create_user("alice") == {:ok, %User{name: "alice", active: true}}
|
||||
|
||||
## 7. `assert_receive` / `refute_receive` for Process Communication
|
||||
|
||||
**Source:** `lib/ex_unit/lib/ex_unit/assertions.ex:466-526`, `lib/elixir/test/elixir/process_test.exs:90-100`
|
||||
**Source:** [lib/ex_unit/lib/ex_unit/assertions.ex#L466](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/ex_unit/lib/ex_unit/assertions.ex#L466), [lib/elixir/test/elixir/process_test.exs#L90](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/elixir/test/elixir/process_test.exs#L90)
|
||||
|
||||
**What it does:** Waits for messages matching a pattern within a timeout (default 100ms).
|
||||
|
||||
@@ -590,7 +590,7 @@ end
|
||||
|
||||
## 8. Testing GenServers via Public API (No Internal State Inspection)
|
||||
|
||||
**Source:** `lib/elixir/test/elixir/gen_server_test.exs:87-106`
|
||||
**Source:** [lib/elixir/test/elixir/gen_server_test.exs#L87](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/elixir/test/elixir/gen_server_test.exs#L87)
|
||||
|
||||
**What it does:** Tests GenServer behavior exclusively through `GenServer.call/cast/stop` — never peeks at internal state.
|
||||
|
||||
@@ -670,7 +670,7 @@ end
|
||||
|
||||
## 9. `catch_exit` for Testing Process Failures
|
||||
|
||||
**Source:** `lib/ex_unit/lib/ex_unit/assertions.ex:950-960`, `lib/elixir/test/elixir/gen_server_test.exs:118-137`
|
||||
**Source:** [lib/ex_unit/lib/ex_unit/assertions.ex#L950](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/ex_unit/lib/ex_unit/assertions.ex#L950), [lib/elixir/test/elixir/gen_server_test.exs#L118](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/elixir/test/elixir/gen_server_test.exs#L118)
|
||||
|
||||
**What it does:** Catches exit signals from linked processes for assertion, or uses `Process.flag(:trap_exit, true)` + `assert_receive {:EXIT, ...}`.
|
||||
|
||||
@@ -747,7 +747,7 @@ end
|
||||
|
||||
## 10. `@tag capture_log: true` for Suppressing Expected Log Output
|
||||
|
||||
**Source:** `lib/elixir/test/elixir/gen_server_test.exs:114`, `lib/elixir/test/elixir/task_test.exs:10`
|
||||
**Source:** [lib/elixir/test/elixir/gen_server_test.exs#L114](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/elixir/test/elixir/gen_server_test.exs#L114), [lib/elixir/test/elixir/task_test.exs#L10](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/elixir/test/elixir/task_test.exs#L10)
|
||||
|
||||
**What it does:** Captures log output during the test, only printing it if the test fails.
|
||||
|
||||
@@ -833,7 +833,7 @@ end
|
||||
|
||||
## 11. `capture_log` / `capture_io` for Content Assertions
|
||||
|
||||
**Source:** `lib/ex_unit/lib/ex_unit/capture_log.ex:1-50`, `lib/elixir/test/elixir/task_test.exs:1138-1150`
|
||||
**Source:** [lib/ex_unit/lib/ex_unit/capture_log.ex#L1](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/ex_unit/lib/ex_unit/capture_log.ex#L1), [lib/elixir/test/elixir/task_test.exs#L1138](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/elixir/test/elixir/task_test.exs#L1138)
|
||||
|
||||
**What it does:** Captures log/IO output and returns it as a string for assertion.
|
||||
|
||||
@@ -918,7 +918,7 @@ end
|
||||
|
||||
## 12. `describe` Blocks for Logical Grouping
|
||||
|
||||
**Source:** `lib/elixir/test/elixir/task_test.exs:218,272,365`, `lib/elixir/test/elixir/process_test.exs:146`
|
||||
**Source:** `lib/elixir/test/elixir/task_test.exs:218,272,365`, [lib/elixir/test/elixir/process_test.exs#L146](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/elixir/test/elixir/process_test.exs#L146)
|
||||
|
||||
**What it does:** Groups related tests under a named describe block. Setup inside describe only applies to that group.
|
||||
|
||||
@@ -1000,7 +1000,7 @@ end
|
||||
|
||||
## 13. `ExUnit.CaseTemplate` for Shared Test Infrastructure
|
||||
|
||||
**Source:** `lib/mix/test/test_helper.exs:79-140`, `lib/logger/test/test_helper.exs:24-65`
|
||||
**Source:** [lib/mix/test/test_helper.exs#L79](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/mix/test/test_helper.exs#L79), [lib/logger/test/test_helper.exs#L24](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/logger/test/test_helper.exs#L24)
|
||||
|
||||
**What it does:** Defines reusable test case templates with shared setup, helpers, and imports.
|
||||
|
||||
@@ -1124,7 +1124,7 @@ defmodule MyApp.ChannelCase do ... end # WebSocket tests
|
||||
|
||||
## 14. `doctest` Integration
|
||||
|
||||
**Source:** `lib/ex_unit/lib/ex_unit/doc_test.ex:1-80`, `lib/elixir/test/elixir/agent_test.exs:9`
|
||||
**Source:** [lib/ex_unit/lib/ex_unit/doc_test.ex#L1](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/ex_unit/lib/ex_unit/doc_test.ex#L1), [lib/elixir/test/elixir/agent_test.exs#L9](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/elixir/test/elixir/agent_test.exs#L9)
|
||||
|
||||
**What it does:** Generates tests from `@doc` and `@moduledoc` code examples.
|
||||
|
||||
@@ -1209,7 +1209,7 @@ Creates a user.
|
||||
|
||||
## 15. `Process.sleep(:infinity)` as a Process Parking Pattern
|
||||
|
||||
**Source:** `lib/elixir/test/elixir/task_test.exs:417`, `lib/elixir/test/elixir/registry_test.exs:71`
|
||||
**Source:** [lib/elixir/test/elixir/task_test.exs#L417](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/elixir/test/elixir/task_test.exs#L417), [lib/elixir/test/elixir/registry_test.exs#L71](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/elixir/test/elixir/registry_test.exs#L71)
|
||||
|
||||
**What it does:** Spawns processes that block forever, used as test subjects that need to exist until explicitly killed.
|
||||
|
||||
@@ -1297,7 +1297,7 @@ end
|
||||
|
||||
## 16. Helper Functions for Test-Specific Behavior
|
||||
|
||||
**Source:** `lib/elixir/test/elixir/task_test.exs:12-36`, `lib/elixir/test/elixir/supervisor_test.exs:278-285`
|
||||
**Source:** [lib/elixir/test/elixir/task_test.exs#L12](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/elixir/test/elixir/task_test.exs#L12), [lib/elixir/test/elixir/supervisor_test.exs#L278](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/elixir/test/elixir/supervisor_test.exs#L278)
|
||||
|
||||
**What it does:** Defines private helper functions within test modules for common test operations.
|
||||
|
||||
@@ -1409,7 +1409,7 @@ end
|
||||
|
||||
## 17. `@tag :tmp_dir` for Filesystem Tests
|
||||
|
||||
**Source:** `lib/ex_unit/lib/ex_unit/case.ex:281-304`, `lib/elixir/test/elixir/path_test.exs:12`
|
||||
**Source:** [lib/ex_unit/lib/ex_unit/case.ex#L281](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/ex_unit/lib/ex_unit/case.ex#L281), [lib/elixir/test/elixir/path_test.exs#L12](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/elixir/test/elixir/path_test.exs#L12)
|
||||
|
||||
**What it does:** ExUnit automatically creates a unique temporary directory and passes its path via the test context.
|
||||
|
||||
@@ -1482,7 +1482,7 @@ end
|
||||
|
||||
## 18. `assert_raise` with Message Matching
|
||||
|
||||
**Source:** `lib/ex_unit/lib/ex_unit/assertions.ex:815-885`
|
||||
**Source:** [lib/ex_unit/lib/ex_unit/assertions.ex#L815](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/ex_unit/lib/ex_unit/assertions.ex#L815)
|
||||
|
||||
**What it does:** Asserts both the exception type AND the message content (string or regex).
|
||||
|
||||
@@ -1564,7 +1564,7 @@ end
|
||||
|
||||
## 19. `@moduletag` / `@describetag` for Cross-Cutting Configuration
|
||||
|
||||
**Source:** `lib/elixir/test/elixir/system_test.exs:104,163`, `lib/elixir/test/elixir/task_test.exs:10`
|
||||
**Source:** `lib/elixir/test/elixir/system_test.exs:104,163`, [lib/elixir/test/elixir/task_test.exs#L10](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/elixir/test/elixir/task_test.exs#L10)
|
||||
|
||||
**What it does:** Sets tags that apply to all tests in a module or describe block, used for filtering and configuration.
|
||||
|
||||
@@ -1651,7 +1651,7 @@ ExUnit.configure(exclude: [:unix], include: [])
|
||||
|
||||
## 20. Context Pattern Matching in Test Signatures
|
||||
|
||||
**Source:** `lib/ex_unit/lib/ex_unit/case.ex:57-80`, `lib/elixir/test/elixir/gen_server_test.exs:166`
|
||||
**Source:** [lib/ex_unit/lib/ex_unit/case.ex#L57](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/ex_unit/lib/ex_unit/case.ex#L57), [lib/elixir/test/elixir/gen_server_test.exs#L166](https://github.com/elixir-lang/elixir/blob/f4e1b34617ef92052b65781f18eae5b88a490098/lib/elixir/test/elixir/gen_server_test.exs#L166)
|
||||
|
||||
**What it does:** Destructures the test context directly in the test function signature.
|
||||
|
||||
@@ -1724,3 +1724,5 @@ end
|
||||
```
|
||||
|
||||
**Why:** Context destructuring signals "this test depends on external setup." If the test is self-contained, the pattern match is misleading — readers will look for setup that doesn't exist or isn't needed.
|
||||
|
||||
<!-- PATTERN_COMPLETE -->
|
||||
|
||||
Reference in New Issue
Block a user