use mni::{Minifier, MinifyOptions};
#[test]
fn test_swc_collapse_vars_bug() {
let code = r#"
function updateToggleIcon(theme) {
const toggleButton = document.getElementById('theme-toggle');
if (!toggleButton) return;
const icon = toggleButton.querySelector('#theme-icon') || toggleButton;
icon.textContent = theme === 'dark' ? '☀️' : '🌙';
}
"#;
let options = MinifyOptions::default();
let minifier = Minifier::new(options);
let result = minifier.minify_js(code).unwrap();
assert!(result.code.contains("textContent"));
let minifier2 = Minifier::new(MinifyOptions::default());
let reparse = minifier2.minify_js(&result.code);
assert!(
reparse.is_ok(),
"Minified output should be valid JavaScript that can be re-parsed"
);
let broken_pattern = "||t.textContent=";
assert!(
!result.code.contains(broken_pattern),
"Should not produce invalid assignment to logical OR expression"
);
}
#[test]
fn test_compression_quality() {
let code = r#"
function fibonacci(n) {
if (n <= 1) {
return n;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
function add(a, b) {
return a + b;
}
const result = add(1, 2);
const x = 5 + 10;
const y = 20 * 2;
const numbers = [1, 2, 3, 4, 5];
"#;
let options = MinifyOptions::default();
let minifier = Minifier::new(options);
let result = minifier.minify_js(code).unwrap();
assert!(
result.stats.compression_ratio > 0.30,
"Should achieve at least 30% compression, got {:.1}%",
result.stats.compression_ratio * 100.0
);
let reparse = minifier.minify_js(&result.code);
assert!(
reparse.is_ok(),
"Compressed output should be valid JavaScript"
);
}
#[test]
fn test_mangle_with_safe_compression() {
let code = r#"
function calculateTotal(items) {
let total = 0;
for (let item of items) {
total += item.price;
}
return total;
}
"#;
let options = MinifyOptions::default();
let minifier = Minifier::new(options);
let result = minifier.minify_js(code).unwrap();
assert!(result.stats.minified_size < result.stats.original_size);
let reparse = minifier.minify_js(&result.code);
assert!(reparse.is_ok());
}
#[test]
fn test_conditional_assignment_produces_valid_js() {
let code = r#"let a = true; let b = 2.5; var c; if (a) c = b;"#;
let options = MinifyOptions::default();
let minifier = Minifier::new(options);
let result = minifier.minify_js(code).unwrap();
let reparse = minifier.minify_js(&result.code);
assert!(
reparse.is_ok(),
"Minified output should be valid JS, got: {}",
result.code
);
assert!(
!result.code.contains("&&c=b"),
"Should not produce bare assignment after &&, got: {}",
result.code
);
}
#[test]
fn test_conditional_or_assignment_produces_valid_js() {
let code = r#"let a = false; let b = 2.5; var c; if (!a) c = b;"#;
let options = MinifyOptions::default();
let minifier = Minifier::new(options);
let result = minifier.minify_js(code).unwrap();
let reparse = minifier.minify_js(&result.code);
assert!(
reparse.is_ok(),
"Minified output should be valid JS, got: {}",
result.code
);
}
#[test]
fn test_conditional_optimization_safe() {
let code = r#"
function check(value) {
if (value === true) {
return "yes";
}
if (value === false) {
return "no";
}
return "maybe";
}
"#;
let options = MinifyOptions::default();
let minifier = Minifier::new(options);
let result = minifier.minify_js(code).unwrap();
assert!(result.stats.compression_ratio > 0.0);
let reparse = minifier.minify_js(&result.code);
assert!(reparse.is_ok());
}