aboutsummaryrefslogtreecommitdiff
path: root/tests/unit/directives.bats
diff options
context:
space:
mode:
Diffstat (limited to 'tests/unit/directives.bats')
-rw-r--r--tests/unit/directives.bats235
1 files changed, 235 insertions, 0 deletions
diff --git a/tests/unit/directives.bats b/tests/unit/directives.bats
new file mode 100644
index 0000000..3a57951
--- /dev/null
+++ b/tests/unit/directives.bats
@@ -0,0 +1,235 @@
+#!/usr/bin/env bats
+# tests/unit/directives.bats
+# Verifies that chunk directive parsing (the awk one-liners used in the chunk
+# loop of trbldoc.sh) correctly reads @name, @exec, @file, and @ref, and that
+# the sed strip pass removes directives from chunk bodies without touching
+# non-directive body lines.
+
+load "../helpers/common.bash"
+
+FIXTURES="$BATS_TEST_DIRNAME/../fixtures"
+
+setup() {
+ setup_workspace
+ CACHE=".trblcache"
+ mkdir -p "$CACHE/chunks"
+}
+
+teardown() {
+ teardown_workspace
+}
+
+# ── helpers used in this file ───────────────────────────────────────────────
+
+# Write a chunk file directly (bypassing extraction) so directive tests
+# are independent of extraction correctness.
+make_chunk() {
+ local path="$1"
+ shift
+ mkdir -p "$(dirname "$path")"
+ printf '%s\n' "$@" > "$path"
+}
+
+# Read @name from a chunk file (mirrors trbldoc.sh logic).
+parse_name() {
+ awk '/@name .+/ {print $2}' "$1"
+}
+
+# Read @exec from a chunk file.
+parse_exec() {
+ awk '/@exec .+/ {$1=""; print}' "$1" | sed 's/^ //'
+}
+
+# Read @file from a chunk file.
+parse_file() {
+ awk '/@file .+/ {print $2}' "$1"
+}
+
+# Read @ref from a chunk file.
+parse_ref() {
+ awk '/@ref .+/ {print $2}' "$1"
+}
+# Parse chunk metadata using the same awk program as trbldoc.sh's
+# parse_chunk_metadata() helper.
+parse_chunk_metadata_record() {
+ awk '
+BEGIN {
+ us = sprintf("%c", 31)
+ from_p = ""
+ namespace_p = ""
+ priority_p = ""
+ program_p = ""
+ ref_p = ""
+}
+/^[ \t]*@file / && from_p == "" {
+ from_p = $0
+ sub(/^[ \t]*@file /, "", from_p)
+}
+/^[ \t]*@name / && namespace_p == "" {
+ namespace_p = $2
+}
+/^[ \t]*@priority / && priority_p == "" {
+ priority_p = $2
+}
+/^[ \t]*@exec / && program_p == "" {
+ program_p = $0
+ sub(/^[ \t]*@exec /, "", program_p)
+}
+/^[ \t]*@ref / && ref_p == "" {
+ ref_p = $2
+}
+END {
+ printf "%s%s%s%s%s%s%s%s%s\n", from_p, us, namespace_p, us, priority_p, us, program_p, us, ref_p
+}
+' "$1"
+}
+
+# Apply the directive strip (mirrors trbldoc.sh line 231).
+strip_directives() {
+ sed -i "s/^@.*//g" "$1"
+}
+
+# ── @name ───────────────────────────────────────────────────────────────────
+
+@test "@name: parsed correctly from chunk" {
+ local chunk="$CACHE/chunks/test_name"
+ make_chunk "$chunk" "@file src.c:1" "@exec md" "@name my/namespace" "body text"
+ local result
+ result="$(parse_name "$chunk")"
+ assert_equal "$result" "my/namespace"
+}
+
+@test "@name: absent when directive is missing" {
+ local chunk="$CACHE/chunks/test_no_name"
+ make_chunk "$chunk" "@file src.c:1" "@exec md" "body text"
+ local result
+ result="$(parse_name "$chunk")"
+ assert_equal "$result" ""
+}
+
+@test "@name: only the first token after @name is captured" {
+ local chunk="$CACHE/chunks/test_name_token"
+ make_chunk "$chunk" "@name some/path extra ignored"
+ local result
+ result="$(parse_name "$chunk")"
+ assert_equal "$result" "some/path"
+}
+
+# ── @exec ───────────────────────────────────────────────────────────────────
+
+@test "@exec: renderer name parsed correctly" {
+ local chunk="$CACHE/chunks/test_exec"
+ make_chunk "$chunk" "@file src.c:1" "@exec md2html --github" "@name ns"
+ local result
+ result="$(parse_exec "$chunk")"
+ assert_equal "$result" "md2html --github"
+}
+
+@test "@exec: absent when directive is missing" {
+ local chunk="$CACHE/chunks/test_no_exec"
+ make_chunk "$chunk" "@file src.c:1" "@name ns" "body"
+ local result
+ result="$(parse_exec "$chunk")"
+ assert_equal "$result" ""
+}
+
+# ── @file ───────────────────────────────────────────────────────────────────
+
+@test "@file: source path parsed correctly" {
+ local chunk="$CACHE/chunks/test_file"
+ make_chunk "$chunk" "@file src/lib.c:42" "@exec md" "@name ns"
+ local result
+ result="$(parse_file "$chunk")"
+ assert_equal "$result" "src/lib.c:42"
+}
+
+# ── @ref ────────────────────────────────────────────────────────────────────
+
+@test "@ref: reference name parsed correctly" {
+ local chunk="$CACHE/chunks/test_ref"
+ make_chunk "$chunk" "@file src.c:1" "@exec md" "@name ns" "@ref my/ref-name"
+ local result
+ result="$(parse_ref "$chunk")"
+ assert_equal "$result" "my/ref-name"
+}
+
+@test "@ref: absent when directive is missing" {
+ local chunk="$CACHE/chunks/test_no_ref"
+ make_chunk "$chunk" "@file src.c:1" "@exec md" "@name ns"
+ local result
+ result="$(parse_ref "$chunk")"
+ assert_equal "$result" ""
+}
+
+@test "metadata parser: directives with leading spaces or tabs are parsed" {
+ local chunk="$CACHE/chunks/test_directive_leading_whitespace"
+ local sep expected result
+ make_chunk \
+ "$chunk" \
+ " @file src/lib.c:42" \
+ $'\t@name docs/indented' \
+ " @priority 99" \
+ $' \t@exec md2html --github' \
+ " @ref refs/anchor"
+ sep="$(printf '\037')"
+ expected="src/lib.c:42${sep}docs/indented${sep}99${sep}md2html --github${sep}refs/anchor"
+ result="$(parse_chunk_metadata_record "$chunk")"
+ assert_equal "$result" "$expected"
+}
+
+# ── directive stripping (sed pass) ──────────────────────────────────────────
+
+@test "strip: @name line is removed from chunk body" {
+ local chunk="$CACHE/chunks/test_strip_name"
+ make_chunk "$chunk" "@file src.c:1" "@name my/ns" "real body content"
+ strip_directives "$chunk"
+ assert_not_contains "$chunk" "^@name"
+}
+
+@test "strip: @exec line is removed from chunk body" {
+ local chunk="$CACHE/chunks/test_strip_exec"
+ make_chunk "$chunk" "@exec md" "real body content"
+ strip_directives "$chunk"
+ assert_not_contains "$chunk" "^@exec"
+}
+
+@test "strip: @file line is removed from chunk body" {
+ local chunk="$CACHE/chunks/test_strip_file"
+ make_chunk "$chunk" "@file src.c:1" "real body content"
+ strip_directives "$chunk"
+ assert_not_contains "$chunk" "^@file"
+}
+
+@test "strip: @ref line is removed from chunk body" {
+ local chunk="$CACHE/chunks/test_strip_ref"
+ make_chunk "$chunk" "@ref some/ref" "real body content"
+ strip_directives "$chunk"
+ assert_not_contains "$chunk" "^@ref"
+}
+
+@test "strip: non-directive body lines are preserved after stripping" {
+ local chunk="$CACHE/chunks/test_strip_body"
+ make_chunk "$chunk" "@name ns" "@exec md" "keep this line" "and this one"
+ strip_directives "$chunk"
+ assert_contains "$chunk" "keep this line"
+ assert_contains "$chunk" "and this one"
+}
+
+@test "strip: directives from all-directives fixture are present before strip" {
+ local prog
+ prog="$(awk_prog_c "$CACHE")"
+ run_extraction "$FIXTURES/c/directives.c" "$prog" "$CACHE"
+ # Before stripping, @ref should be present
+ chunk_contains "$CACHE" "@ref"
+}
+
+@test "strip: body content from all-directives fixture survives strip" {
+ local prog
+ prog="$(awk_prog_c "$CACHE")"
+ run_extraction "$FIXTURES/c/directives.c" "$prog" "$CACHE"
+ # Strip all chunks
+ for f in "$CACHE/chunks/"*; do
+ strip_directives "$f"
+ done
+ chunk_contains "$CACHE" "Directive test body content"
+}