1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
use crate::{
config::CargoCompeteConfigTestProfile,
project::{MetadataExt as _, PackageExt as _},
shell::ColorChoice,
};
use human_size::Size;
use std::path::PathBuf;
use structopt::StructOpt;
use strum::VariantNames as _;
#[derive(StructOpt, Debug)]
#[structopt(usage(
r"cargo compete test [OPTIONS] <index>
cargo compete test [OPTIONS] --src <PATH>",
))]
pub struct OptCompeteTest {
#[structopt(
long,
value_name("PATH"),
required_unless("index"),
conflicts_with("index")
)]
pub src: Option<PathBuf>,
#[structopt(long, value_name("NAME"))]
pub testcases: Option<Vec<String>>,
#[structopt(long, value_name("SIZE"), default_value("4KiB"))]
pub display_limit: Size,
#[structopt(short, long, value_name("SPEC"))]
pub package: Option<String>,
#[structopt(long, conflicts_with("release"))]
pub debug: bool,
#[structopt(long)]
pub release: bool,
#[structopt(long, value_name("PATH"))]
pub manifest_path: Option<PathBuf>,
#[structopt(
long,
value_name("WHEN"),
possible_values(ColorChoice::VARIANTS),
default_value("auto")
)]
pub color: ColorChoice,
#[structopt(required_unless("src"))]
pub index: Option<String>,
}
pub(crate) fn run(opt: OptCompeteTest, ctx: crate::Context<'_>) -> anyhow::Result<()> {
let OptCompeteTest {
src,
testcases,
display_limit,
package,
debug,
release,
manifest_path,
color,
index,
} = opt;
let crate::Context {
cwd,
cookies_path: _,
shell,
} = ctx;
shell.set_color_choice(color);
let manifest_path = manifest_path
.map(|p| Ok(cwd.join(p.strip_prefix(".").unwrap_or(&p))))
.unwrap_or_else(|| crate::project::locate_project(&cwd))?;
let metadata = crate::project::cargo_metadata(&manifest_path, &cwd)?;
let member = metadata.query_for_member(package.as_deref())?;
let package_metadata = member.read_package_metadata(shell)?;
let cargo_compete_config =
crate::config::load_from_rel_path(&member.manifest_path, &package_metadata.config, shell)?;
let (bin, bin_alias, problem_url) = if let Some(src) = src {
let src = cwd.join(src.strip_prefix(".").unwrap_or(&src));
let bin = member.bin_target_by_src_path(src)?;
let (bin_alias, pkg_md) = &package_metadata.bin_by_bin_name(&bin.name)?;
(bin, *bin_alias, &pkg_md.problem)
} else if let Some(index) = &index {
let package_metadata_bin = package_metadata.bin_by_bin_index(index)?;
let bin = member.bin_target_by_name(&package_metadata_bin.name)?;
(bin, &**index, &package_metadata_bin.problem)
} else {
unreachable!()
};
crate::testing::test(crate::testing::Args {
metadata: &metadata,
member,
bin,
bin_alias,
cargo_compete_config_test_suite: &cargo_compete_config.test_suite,
problem_url,
release: if debug {
false
} else if release {
true
} else {
cargo_compete_config.test.profile == CargoCompeteConfigTestProfile::Release
},
test_case_names: testcases.map(|ss| ss.into_iter().collect()),
display_limit,
shell,
})
}