use anyhow::Result;
use serde::{Serialize, de::DeserializeOwned};
use std::{
collections::{HashMap, HashSet},
fmt::{Debug, Display},
hash::Hash,
path::{Path, PathBuf},
};
use crate::{
coverage::{
Tag,
commit_coverage_data::{CommitCoverageData, CoverageIdentifier},
full_coverage_data::FullCoverageData,
},
errors::RunTestsErrors,
scm::{Scm, ScmCommit},
};
pub mod dotnet;
mod dotnet_cobertura;
pub mod golang;
pub mod javascript;
pub mod rust;
mod rust_llvm;
mod util;
pub trait TestIdentifier: Eq + Hash + Clone + Debug + Serialize + TestIdentifierCore {}
pub trait TestIdentifierCore: Debug + Send + Sync + Display {
fn lightly_unique_name(&self) -> String;
}
pub trait ConcreteTestIdentifier<TI: TestIdentifier>: Eq + Hash + Clone + Debug {
fn test_identifier(&self) -> &TI;
}
pub trait TestDiscovery<CTI: ConcreteTestIdentifier<TI>, TI: TestIdentifier> {
fn all_test_cases(&self) -> &HashSet<CTI>;
fn map_ti_to_cti(&self, test_identifier: TI) -> Option<CTI>;
}
#[derive(Debug, Clone, Hash, PartialEq, Eq)]
pub enum TestReason<CI: CoverageIdentifier> {
NoCoverageMap,
NewTest,
FileChanged(PathBuf),
CoverageIdentifier(CI),
NetworkPolicy(String),
SideEffect(Box<TestReason<CI>>, Box<TestReason<CI>>),
}
pub struct PlatformSpecificRelevantTestCaseData<TI: TestIdentifier, CI: CoverageIdentifier> {
pub additional_test_cases: HashMap<TI, HashSet<TestReason<CI>>>,
pub external_dependencies_changed: Option<usize>,
}
#[allow(async_fn_in_trait)] pub trait TestPlatform {
type TI: TestIdentifier + Serialize + DeserializeOwned + 'static;
type CI: CoverageIdentifier + Serialize + DeserializeOwned + 'static;
type TD: TestDiscovery<Self::CTI, Self::TI>;
type CTI: ConcreteTestIdentifier<Self::TI>;
fn platform_identifier() -> &'static str;
fn project_name(project_dir: &Path) -> Result<String>;
async fn discover_tests(project_dir: &Path) -> Result<Self::TD>;
fn platform_tags() -> Vec<Tag>;
async fn run_tests<'a, I>(
test_discovery: &Self::TD,
project_dir: &Path,
test_cases: I,
jobs: u16,
) -> Result<CommitCoverageData<Self::TI, Self::CI>, RunTestsErrors>
where
I: IntoIterator<Item = &'a Self::CTI>,
Self::CTI: 'a;
fn platform_specific_relevant_test_cases<Commit: ScmCommit, MyScm: Scm<Commit>>(
eval_target_test_cases: &HashSet<Self::TI>,
eval_target_changed_files: &HashSet<PathBuf>,
scm: &MyScm,
ancestor_commit: &Commit,
coverage_data: &FullCoverageData<Self::TI, Self::CI>,
) -> Result<PlatformSpecificRelevantTestCaseData<Self::TI, Self::CI>>;
fn analyze_changed_files(
project_dir: &Path,
changed_files: &HashSet<PathBuf>,
coverage_data: &mut CommitCoverageData<Self::TI, Self::CI>,
) -> Result<()>;
}