use std::collections::HashSet;
use pretty_assertions::assert_eq;
use crate::{
Pass, Passes,
support::{compile_valid, optimize, read_compilation_test_cases}
};
#[test]
fn test_common_subexpression_elimination()
{
let mut seen = HashSet::new();
for (index, (source, expected)) in read_compilation_test_cases(
include_str!("../../tests/test_common_subexpression_elimination.txt")
)
.iter()
.enumerate()
{
assert!(seen.insert(source), "duplicate test case: {}", source);
let function = compile_valid(source);
let optimized = optimize(
function.clone(),
Pass::CommonSubexpressionElimination.into()
);
let actual = format!("{}", optimized);
assert_eq!(
actual.trim(),
*expected,
"case {}: {}\nunoptimized:\n{}",
index + 1,
source,
function
);
}
}
#[test]
fn test_constant_commuting()
{
let mut seen = HashSet::new();
for (index, (source, expected)) in read_compilation_test_cases(
include_str!("../../tests/test_constant_commuting.txt")
)
.iter()
.enumerate()
{
assert!(seen.insert(source), "duplicate test case: {}", source);
let function = compile_valid(source);
let optimized =
optimize(function.clone(), Pass::ConstantCommuting.into());
let actual = format!("{}", optimized);
assert_eq!(
actual.trim(),
*expected,
"case {}: {}\nunoptimized:\n{}",
index + 1,
source,
function
);
}
}
#[test]
fn test_constant_folding()
{
let mut seen = HashSet::new();
for (index, (source, expected)) in read_compilation_test_cases(
include_str!("../../tests/test_constant_folding.txt")
)
.iter()
.enumerate()
{
assert!(seen.insert(source), "duplicate test case: {}", source);
let function = compile_valid(source);
let optimized =
optimize(function.clone(), Pass::ConstantFolding.into());
let actual = format!("{}", optimized);
assert_eq!(
actual.trim(),
*expected,
"case {}: {}\nunoptimized:\n{}",
index + 1,
source,
function
);
}
}
#[test]
fn test_strength_reduction()
{
let mut seen = HashSet::new();
for (index, (source, expected)) in read_compilation_test_cases(
include_str!("../../tests/test_strength_reduction.txt")
)
.iter()
.enumerate()
{
assert!(seen.insert(source), "duplicate test case: {}", source);
let function = compile_valid(source);
let optimized =
optimize(function.clone(), Pass::StrengthReduction.into());
let actual = format!("{}", optimized);
assert_eq!(
actual.trim(),
*expected,
"case {}: {}\nunoptimized:\n{}",
index + 1,
source,
function
);
}
}
#[test]
fn test_register_coalescence()
{
let mut seen = HashSet::new();
for (index, (source, expected)) in read_compilation_test_cases(
include_str!("../../tests/test_register_coalescence.txt")
)
.iter()
.enumerate()
{
assert!(seen.insert(source), "duplicate test case: {}", source);
let function = compile_valid(source);
let optimized =
optimize(function.clone(), Pass::RegisterCoalescing.into());
let actual = format!("{}", optimized);
assert_eq!(
actual.trim(),
*expected,
"case {}: {}\nunoptimized:\n{}",
index + 1,
source,
function
);
}
}
#[test]
fn test_full_optimization()
{
let mut seen = HashSet::new();
for (index, (source, expected)) in read_compilation_test_cases(
include_str!("../../tests/test_full_optimization.txt")
)
.iter()
.enumerate()
{
assert!(seen.insert(source), "duplicate test case: {}", source);
let function = compile_valid(source);
let optimized = optimize(function.clone(), Passes::all());
let actual = format!("{}", optimized);
assert_eq!(
actual.trim(),
*expected,
"case {}: {}\nunoptimized:\n{}",
index + 1,
source,
function
);
}
}