#!/usr/bin/env bash # Text color variables RED='\033[0;31m' GREEN='\033[0;32m' NC='\033[0m' # No Color (reset) # Ensure a script is provided if [ -z "$1" ]; then echo "Usage: $0 <markdown_parser_script>" exit 1 fi PARSER="$1" # Check if the parser script exists if [ ! -f "$PARSER" ]; then echo "Error: $PARSER not found!" exit 1 fi # Determine if it's AWK or Shell (optional second argument) PARSER_TYPE="bash" # Default to bash script if [ -n "$2" ]; then PARSER_TYPE="$2" fi # Define test cases as an array of markdown inputs and expected outputs declare -a tests=( "Header 1" "# Header 1" "<h1>Header 1</h1>" "Header 2" "## Header 2" "<h2>Header 2</h2>" "Header 3" "### Header 3" "<h3>Header 3</h3>" "Header 4" "#### Header 4" "<h4>Header 4</h4>" "Header 5" "##### Header 5" "<h5>Header 5</h5>" "Header 6" "###### Header 6" "<h6>Header 6</h6>" "Multiple headers 1" $'# Header 1\n## Header 2' "<h1>Header 1</h1><h2>Header 2</h2>" "Multiple headers 2" $'### Header 3\n\n## Header 2\n\n# Header 1' "<h3>Header 3</h3><h2>Header 2</h2><h1>Header 1</h1>" "Unordered List" $'- item\n* item' "<ul><li>item</li><li>item</li></ul>" "Ordered List" $'1. item1\n1. item1\n3. item3' "<ol><li>item1</li><li>item1</li><li>item3</li></ol>" "Blockquote 1" "> test of blockquote" "<blockquote>test of blockquote</blockquote>" "Blockquote 2" $'> line1\n> line2' "<blockquote>line1line2</blockquote>" "Blockquote 2" $'> line1\nline2' "<blockquote>line1line2</blockquote>" "Code Block 1" $' code1' "<pre><code>code1</code></pre>" "Code Block 2" $'\tcode1' "<pre><code>code1</code></pre>" "Paragraph 1" "paragraph 1" "<p>paragraph 1</p>" "Paragraph 2" "paragraph *emphasis* and **strong**" "<p>paragraph <em>emphasis</em> and <strong>strong</strong></p>" "Paragraph 3" "paragraph with *one* emphasis and *two* emphasis" "<p>paragraph with <em>one</em> emphasis and <em>two</em> emphasis</p>" "Mix Code blocks and paragraphs 1" $'First paragraph\n\n code block' "<p>First paragraph</p><pre><code>code block</code></pre>" "Mix Code blocks and paragraphs 2" $'First paragraph\n\n code1\n code2\n\nSecond paragraph' "<p>First paragraph</p><pre><code>code1code2</code></pre><p>Second paragraph</p>" "Link 1" "This is a [link](https://www.google.com) to google" $'<p>This is a <a href=\"https://www.google.com\">link</a> to google</p>' "Link 2" "A link to [wikipedia](https://www.wikipedia.org)" "<p>A link to <a href=\"https://www.wikipedia.org\">wikipedia</a></p>" # You can add more test cases following the same format... ) input="# test" expected="<h1>test</h1>" # Function to run a single test case run_test() { local input="$1" local expected="$2" local actual="" # Get the actual output from the parser if [ "$PARSER_TYPE" == "awk" ]; then # Run AWK script with the input actual=$(echo "$input" | awk -f "$PARSER" | tr -d '\n') else # Assume it's a shell script, run it actual=$(echo "$input" | bash "$PARSER" | tr -d '\n') fi # Compare the actual output with the expected output if [ "$actual" == "$expected" ]; then echo -e "${GREEN}Test Passed!${NC}" return 0 else echo -e "${RED}Test Failed!${NC}" echo "Input:" echo "$input" echo "Expected:" echo "$expected" echo "Got:" echo "$actual" return 1 fi } STATUS=0 # Main loop to run all test cases num_tests=$((${#tests[@]} / 3)) # Divide by 2 because each test has input/output pair for ((i = 0; i < num_tests; i++)); do input="${tests[i * 3 + 1]}" expected="${tests[i * 3 + 2]}" echo "Test $((i + 1)):" ${tests[i * 3]} run_test "$input" "$expected" STATUS_i=$? STATUS=$((STATUS+STATUS_i)) done exit $STATUS