diff options
Diffstat (limited to 'tests/unit/directives.bats')
| -rw-r--r-- | tests/unit/directives.bats | 235 |
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" +} |
