diff --git a/README.md b/README.md index 2f7b1a0..14383ce 100644 --- a/README.md +++ b/README.md @@ -8,13 +8,13 @@ Per Fault-Injection-Audit-Convention (2026-05-16): | Function | Assertion-Count | Coverage | |---|---|---| -| `parse_lua_surface` | 15 | Happy-path (2 public + 1 private), empty-source edge, sugar-form (`function M.foo`), mixed-form (sugar + explicit) | -| `parse_readme_api` | 4 | Standard H3-pattern, no-API-section edge | +| `parse_lua_surface` | 19 | Happy-path (2 public + 1 private), empty-source edge, sugar-form (`function M.foo`), mixed-form (sugar + explicit), comment-stripping (commented stubs, inline-comment after code) | +| `parse_readme_api` | 9 | Standard H3-pattern, no-API-section edge, namespace-less function (e.g. `run_tests`), mixed namespaced + namespace-less | | `diff_surface` | 5 | Equal (no diff), surface-superset (missing), doc-superset (stale) | | `grep_engine_calls` | 5 | 3 unique calls, no-calls edge | | `generate_topology_block` | 6 | Lib-with-deps+engine, asset-lib (no deps, no engine) | | `validate_readme_structure` | 8 | Complete core, missing-API core, missing-Topology, missing-Badges, community-tier-no-enforcement | -| **TOTAL** | **43** | | +| **TOTAL** | **52** | | ### Tested-Surface - All 6 public functions of `lib-core.api-discovery` v0.1.0. diff --git a/init.lua b/init.lua index 1265317..99a33ad 100644 --- a/init.lua +++ b/init.lua @@ -58,6 +58,28 @@ return M for _, n in ipairs(mixed_surface.public) do mixed_set[n] = true end engine.test.assert(mixed_set["gamma"], "parse_lua_surface: mixed-form gamma present") engine.test.assert(mixed_set["delta"], "parse_lua_surface: mixed-form delta present") + + -- Comment-stripping: commented stubs should NOT appear + local commented_src = [[ +local M = {} +function M.real_func() end +-- function M.commented_stub() end +-- M.also_commented = function() end +return M +]] + local commented_surface = api.parse_lua_surface(commented_src) + engine.test.equals(#commented_surface.public, 1, "parse_lua_surface: comment-stripping leaves 1 public") + engine.test.equals(commented_surface.public[1], "real_func", "parse_lua_surface: only real_func survives") + + -- Inline comment after code: code-line should still be matched + local inline_src = [[ +local M = {} +function M.with_inline() end -- this is a comment +return M +]] + local inline_surface = api.parse_lua_surface(inline_src) + engine.test.equals(#inline_surface.public, 1, "parse_lua_surface: inline-comment doesn't break code-match") + engine.test.equals(inline_surface.public[1], "with_inline", "parse_lua_surface: with_inline detected") end -- ===== parse_readme_api ===== @@ -86,6 +108,42 @@ Stuff. -- Edge: no API section local no_api = api.parse_readme_api("# Just abstract\nNothing else.") engine.test.equals(#no_api.documented, 0, "parse_readme_api: no API-section = empty") + + -- Namespace-less function (e.g., run_tests for test-libs) + local no_ns_md = [[ +# test-lib + +## API + +### `run_tests(ctx)` +**Syntax:** `M.run_tests(ctx)` + +## References +]] + local no_ns = api.parse_readme_api(no_ns_md) + engine.test.equals(#no_ns.documented, 1, "parse_readme_api: namespace-less 1 documented") + engine.test.equals(no_ns.documented[1], "run_tests", "parse_readme_api: namespace-less captures run_tests") + + -- Mixed: namespace + namespace-less in same section + local mixed_md = [[ +# foo + +## API + +### `foo.bar()` +text + +### `helper()` +text + +## References +]] + local mixed = api.parse_readme_api(mixed_md) + local set = {} + for _, n in ipairs(mixed.documented) do set[n] = true end + engine.test.assert(set["bar"], "parse_readme_api: mixed captures namespaced 'bar'") + engine.test.assert(set["helper"], "parse_readme_api: mixed captures namespace-less 'helper'") + engine.test.equals(#mixed.documented, 2, "parse_readme_api: mixed total 2 (no dup)") end -- ===== diff_surface =====