#!/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" }