program test_herestring use ast_types_enhanced use lexer_simple use parser_enhanced use evaluator_simple_real use shell_types implicit none type(lexer_simple_t) :: lex type(parser_enhanced_t) :: pars type(script_node_t) :: ast type(shell_state_t) :: shell type(evaluator_simple_real_t) :: eval character(:), allocatable :: input integer :: exit_code ! Initialize shell state shell%username = "testuser" shell%hostname = "testhost" shell%num_functions = 0 shell%num_positional = 0 shell%num_variables = 0 print *, "=== Test 1: Simple here string ===" input = 'cat <<< "Hello from here string"' call lex%init(input) call lex%tokenize() call pars%init(lex%tokens, lex%token_count) ast = pars%parse() call eval%init(shell) exit_code = eval%eval(ast) print *, "" print *, "=== Test 2: Here string with variable ===" input = 'MYVAR=World' call lex%init(input) call lex%tokenize() call pars%init(lex%tokens, lex%token_count) ast = pars%parse() exit_code = eval%eval(ast) input = 'cat <<< "Hello $MYVAR"' call lex%init(input) call lex%tokenize() call pars%init(lex%tokens, lex%token_count) ast = pars%parse() exit_code = eval%eval(ast) print *, "" print *, "=== Test 3: Here string with word (no quotes) ===" input = 'cat <<< HelloWorld' call lex%init(input) call lex%tokenize() call pars%init(lex%tokens, lex%token_count) ast = pars%parse() exit_code = eval%eval(ast) print *, "" print *, "=== Test 4: Here string piped to grep ===" input = 'cat <<< "apple banana cherry" | grep banana' call lex%init(input) call lex%tokenize() call pars%init(lex%tokens, lex%token_count) ast = pars%parse() exit_code = eval%eval(ast) print *, "" call lex%destroy() call pars%destroy() call eval%destroy() print *, "=== Here string tests completed ===" end program test_herestring