browserslist/queries/
node_bounded_range.rs1use super::{Distrib, QueryResult};
2use crate::semver::loose_compare;
3use browserslist_data::node;
4use std::cmp::Ordering;
5
6pub(super) fn node_bounded_range(from: &str, to: &str) -> QueryResult {
7 let distribs = node::versions()
8 .iter()
9 .filter(|version| {
10 matches!(
11 loose_compare(version, from),
12 Ordering::Greater | Ordering::Equal
13 ) && matches!(loose_compare(version, to), Ordering::Less | Ordering::Equal)
14 })
15 .map(|version| Distrib::new("node", *version))
16 .collect();
17 Ok(distribs)
18}
19
20#[cfg(test)]
21mod tests {
22 use crate::{
23 error::Error,
24 opts::Opts,
25 test::{run_compare, should_failed},
26 };
27 use test_case::test_case;
28
29 #[test_case("node 4-6"; "semver major only")]
30 #[test_case("node 4-6.0.0"; "different semver formats")]
31 #[test_case("node 6.5-7.5"; "with semver minor")]
32 #[test_case("node 6.6.4-7.7.5"; "with semver patch")]
33 #[test_case("Node 4 - 6"; "more spaces 1")]
34 #[test_case("node 6.5 - 7.5"; "more spaces 2")]
35 #[test_case("node 6.6.4 - 7.7.5"; "more spaces 3")]
36 #[test_case("node 8.8.8.8-9.9.9.9"; "malformed version")]
37 fn valid(query: &str) {
38 run_compare(query, &Opts::default(), None);
39 }
40
41 #[test_case(
42 "node 6-8.a", Error::Nom(String::from("a"));
43 "malformed version"
44 )]
45 fn invalid(query: &str, error: Error) {
46 assert_eq!(should_failed(query, &Opts::default()), error);
47 }
48}