use crate::domain::{OracleKind, OracleStrength};
use super::patterns::{
is_broad_error_assertion, is_clear_exact_custom_assertion_helper, is_custom_assertion_helper,
is_duplicative_equality_assertion, is_exact_error_variant_assertion, is_exact_value_assertion,
is_mock_expectation_line, is_side_effect_observer_assertion, is_snapshot_assertion,
is_whole_object_equality_assertion,
};
#[derive(Clone, Debug, PartialEq, Eq)]
pub(crate) struct OracleClassification {
pub(crate) kind: OracleKind,
pub(crate) strength: OracleStrength,
}
pub(crate) fn classify_assertion(line: &str) -> OracleClassification {
if is_exact_error_variant_assertion(line) {
OracleClassification {
kind: OracleKind::ExactErrorVariant,
strength: OracleStrength::Strong,
}
} else if is_broad_error_assertion(line) {
OracleClassification {
kind: OracleKind::BroadError,
strength: OracleStrength::Weak,
}
} else if is_duplicative_equality_assertion(line) {
OracleClassification {
kind: OracleKind::RelationalCheck,
strength: OracleStrength::Weak,
}
} else if is_whole_object_equality_assertion(line) {
OracleClassification {
kind: OracleKind::WholeObjectEquality,
strength: OracleStrength::Strong,
}
} else if is_exact_value_assertion(line) {
OracleClassification {
kind: OracleKind::ExactValue,
strength: OracleStrength::Strong,
}
} else if is_snapshot_assertion(line) {
OracleClassification {
kind: OracleKind::Snapshot,
strength: OracleStrength::Medium,
}
} else if line.contains(".unwrap(")
|| line.contains(".expect(")
|| line.contains("is_ok")
|| line.contains("is_some")
|| line.contains("is_none")
{
OracleClassification {
kind: OracleKind::SmokeOnly,
strength: OracleStrength::Smoke,
}
} else if is_mock_expectation_line(line) || is_side_effect_observer_assertion(line) {
OracleClassification {
kind: OracleKind::MockExpectation,
strength: OracleStrength::Medium,
}
} else if is_clear_exact_custom_assertion_helper(line) {
OracleClassification {
kind: OracleKind::ExactValue,
strength: OracleStrength::Strong,
}
} else if is_custom_assertion_helper(line) {
OracleClassification {
kind: OracleKind::Unknown,
strength: OracleStrength::Unknown,
}
} else if line.contains("> 0")
|| line.contains('<')
|| line.contains('>')
|| line.contains("is_empty")
|| line.contains("contains")
|| line.contains("assert!")
{
OracleClassification {
kind: OracleKind::RelationalCheck,
strength: OracleStrength::Weak,
}
} else {
OracleClassification {
kind: OracleKind::Unknown,
strength: OracleStrength::Unknown,
}
}
}