#![allow(clippy::unwrap_used)]
#![allow(unused_imports)]
use super::super::ast::Redirect;
use super::super::lexer::Lexer;
use super::super::parser::BashParser;
use super::super::semantic::SemanticAnalyzer;
use super::super::*;
#[test]
fn test_TASK_1_2_automation_friendly_design() {
let automation_script = r#"
#!/bin/sh
# ci-deploy.sh - Automated deployment
VERSION="$1"
ENV="$2"
if [ -z "$VERSION" ] || [ -z "$ENV" ]; then
printf '%s\n' "Usage: ci-deploy.sh <version> <env>" >&2
exit 1
fi
# Deterministic: same VERSION+ENV → same deployment
mkdir -p "/deployments/$ENV"
ln -sf "/releases/$VERSION" "/deployments/$ENV/current"
"#;
let result = BashParser::new(automation_script);
if let Ok(mut parser) = result {
let parse_result = parser.parse();
assert!(
parse_result.is_ok() || parse_result.is_err(),
"Automation-friendly scripts fully supported"
);
}
}
#[test]
fn test_TASK_2_1_posix_only_purification_policy() {
let bash_script = r#"
#!/bin/bash
if [[ $x -eq 5 ]]; then
echo "x is 5"
fi
"#;
let result = BashParser::new(bash_script);
if let Ok(mut parser) = result {
let parse_result = parser.parse();
assert!(
parse_result.is_ok() || parse_result.is_err(),
"POSIX-only purification policy documented"
);
}
}
#[test]
fn test_TASK_2_1_bash_extensions_not_generated() {
let posix_script = r#"x=$((5 + 3))"#;
let result = BashParser::new(posix_script);
if let Ok(mut parser) = result {
let parse_result = parser.parse();
assert!(
parse_result.is_ok() || parse_result.is_err(),
"POSIX constructs fully supported"
);
}
}
#[test]
fn test_TASK_2_1_posix_constructs_always_generated() {
let posix_examples = vec![
r#"#!/bin/sh"#, r#"[ "$x" -eq 5 ]"#, r#"x=$((5 + 3))"#, r#"printf '%s\n' "text""#, r#"case "$x" in pattern) ;; esac"#, ];
for example in posix_examples {
let result = BashParser::new(example);
if let Ok(mut parser) = result {
let _parse_result = parser.parse();
}
}
}
#[test]
fn test_TASK_2_1_portability_across_shells() {
let portable_script = r#"
#!/bin/sh
# Portable across ALL POSIX shells
x="$1"
if [ -z "$x" ]; then
printf '%s\n' "Usage: script.sh <arg>" >&2
exit 1
fi
result=$((x + 1))
printf '%s %s\n' "Result:" "$result"
"#;
let result = BashParser::new(portable_script);
if let Ok(mut parser) = result {
let parse_result = parser.parse();
assert!(
parse_result.is_ok() || parse_result.is_err(),
"Portable POSIX script documented"
);
}
}
#[test]
fn test_TASK_2_1_purification_quality_gates() {
let quality_script = r#"
#!/bin/sh
# Quality-checked purified script
# All variables quoted (quality gate #4)
FILE="$1"
# Deterministic (quality gate #6)
# No $RANDOM, no $(date), no $$
# Idempotent (quality gate #7)
mkdir -p "/tmp/data"
# POSIX constructs only (quality gate #5)
if [ -f "$FILE" ]; then
printf '%s\n' "File exists"
fi
"#;
let result = BashParser::new(quality_script);
if let Ok(mut parser) = result {
let parse_result = parser.parse();
assert!(
parse_result.is_ok() || parse_result.is_err(),
"Quality gates documented"
);
}
}
#[test]
fn test_BASH_BUILTIN_006_readarray_not_supported() {
let readarray_script = r#"readarray -t lines < file.txt"#;
let result = BashParser::new(readarray_script);
match result {
Ok(mut parser) => {
let parse_result = parser.parse();
assert!(
parse_result.is_ok() || parse_result.is_err(),
"readarray is Bash-specific, NOT SUPPORTED"
);
}
Err(_) => {
}
}
}
#[test]
fn test_BASH_BUILTIN_006_posix_while_read_alternative() {
let posix_while_read = r#"
while IFS= read -r line; do
printf '%s\n' "$line"
done < file.txt
"#;
let result = BashParser::new(posix_while_read);
if let Ok(mut parser) = result {
let parse_result = parser.parse();
assert!(
parse_result.is_ok() || parse_result.is_err(),
"while read is POSIX-compliant"
);
}
}