From 558e213ab496ccb7949dab36aeb60149d3137d99 Mon Sep 17 00:00:00 2001 From: John Turner Date: Fri, 28 Nov 2025 17:13:47 +0000 Subject: add porthole tests to meson --- tests/meson.build | 19 ++++++++- tests/porthole.rs | 95 --------------------------------------------- tests/porthole/meson.build | 5 +++ tests/porthole/porthole.rs | 95 +++++++++++++++++++++++++++++++++++++++++++++ tests/porthole/porthole.txt | 19 +++++++++ 5 files changed, 137 insertions(+), 96 deletions(-) delete mode 100644 tests/porthole.rs create mode 100644 tests/porthole/meson.build create mode 100644 tests/porthole/porthole.rs create mode 100644 tests/porthole/porthole.txt (limited to 'tests') diff --git a/tests/meson.build b/tests/meson.build index 69052cd..e99c9c7 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -1 +1,18 @@ -subdir('fuzz') +tests = {} + +subdir('porthole') + +foreach test, test_args : tests + name = fs.name(test) + + test( + f'test_@name@', + executable( + f'test_@name@', + test, + dependencies: [mon, itertools], + link_with: [gentoo_utils], + ), + args: test_args, + ) +endforeach diff --git a/tests/porthole.rs b/tests/porthole.rs deleted file mode 100644 index 3efbffe..0000000 --- a/tests/porthole.rs +++ /dev/null @@ -1,95 +0,0 @@ -use std::cmp::Ordering; - -use gentoo_utils::{ - Parseable, - atom::{Atom, Cpv}, -}; -use mon::{Parser, input::InputIter, tag}; - -static PORTHOLE_TXT: &'static str = include_str!(concat!( - env!("CARGO_MANIFEST_DIR"), - "/testdata/porthole.txt" -)); - -enum Operator { - Comment, - Yes, - No, - Eq, - Gt, - Lt, -} - -fn parse_operator<'a>() -> impl Parser<&'a str, Output = Operator> { - let comment = tag("***").map(|_| Operator::Comment); - let yes = tag("+").map(|_| Operator::Yes); - let no = tag("-").map(|_| Operator::No); - let eq = tag("=").map(|_| Operator::Eq); - let gt = tag(">").map(|_| Operator::Gt); - let lt = tag("<").map(|_| Operator::Lt); - - comment.or(yes).or(no).or(eq).or(gt).or(lt) -} - -#[test] -fn test_porthole() { - for line in PORTHOLE_TXT.lines() { - if line.is_empty() { - continue; - } - - let operator = parse_operator() - .parse_finished(InputIter::new( - line.split_ascii_whitespace().nth(0).unwrap(), - )) - .unwrap(); - - match &operator { - Operator::Comment => continue, - Operator::Yes => { - let a = Atom::parser() - .parse_finished(InputIter::new( - line.split_ascii_whitespace().nth(1).unwrap(), - )) - .unwrap(); - - assert_eq!( - line.split_ascii_whitespace().nth(1).unwrap(), - &a.to_string() - ); - } - Operator::No => { - assert!( - Atom::parser() - .parse_finished(InputIter::new( - line.split_ascii_whitespace().nth(1).unwrap() - )) - .is_err() - ); - } - Operator::Eq | Operator::Gt | Operator::Lt => { - let a = Cpv::parser() - .parse_finished(InputIter::new( - line.split_ascii_whitespace().nth(1).unwrap(), - )) - .unwrap(); - - let b = Cpv::parser() - .parse_finished(InputIter::new( - line.split_ascii_whitespace().nth(2).unwrap(), - )) - .unwrap(); - - assert_eq!( - a.partial_cmp(&b).unwrap(), - match &operator { - Operator::Eq => Ordering::Equal, - Operator::Gt => Ordering::Greater, - Operator::Lt => Ordering::Less, - _ => unreachable!(), - } - ); - } - } - } -} diff --git a/tests/porthole/meson.build b/tests/porthole/meson.build new file mode 100644 index 0000000..68f68fa --- /dev/null +++ b/tests/porthole/meson.build @@ -0,0 +1,5 @@ +tests += { + meson.current_source_dir() / 'porthole.rs': [ + meson.current_source_dir() / 'porthole.txt', + ], +} diff --git a/tests/porthole/porthole.rs b/tests/porthole/porthole.rs new file mode 100644 index 0000000..4ff8d49 --- /dev/null +++ b/tests/porthole/porthole.rs @@ -0,0 +1,95 @@ +use std::{cmp::Ordering, env, fs}; + +use gentoo_utils::{ + Parseable, + atom::{Atom, Cpv}, +}; +use mon::{Parser, input::InputIter, tag}; + +enum Operator { + Comment, + Yes, + No, + Eq, + Gt, + Lt, +} + +fn parse_operator<'a>() -> impl Parser<&'a str, Output = Operator> { + let comment = tag("***").map(|_| Operator::Comment); + let yes = tag("+").map(|_| Operator::Yes); + let no = tag("-").map(|_| Operator::No); + let eq = tag("=").map(|_| Operator::Eq); + let gt = tag(">").map(|_| Operator::Gt); + let lt = tag("<").map(|_| Operator::Lt); + + comment.or(yes).or(no).or(eq).or(gt).or(lt) +} + +fn main() { + let path = env::args() + .nth(1) + .expect("pass path to porthole.txt as first parameter"); + + let porthole_txt = fs::read_to_string(&path).expect("failed to open porthole.txt"); + + for line in porthole_txt.lines() { + if line.is_empty() { + continue; + } + + let operator = parse_operator() + .parse_finished(InputIter::new( + line.split_ascii_whitespace().next().unwrap(), + )) + .unwrap(); + + match &operator { + Operator::Comment => continue, + Operator::Yes => { + let a = Atom::parser() + .parse_finished(InputIter::new( + line.split_ascii_whitespace().nth(1).unwrap(), + )) + .unwrap(); + + assert_eq!( + line.split_ascii_whitespace().nth(1).unwrap(), + &a.to_string() + ); + } + Operator::No => { + assert!( + Atom::parser() + .parse_finished(InputIter::new( + line.split_ascii_whitespace().nth(1).unwrap() + )) + .is_err() + ); + } + Operator::Eq | Operator::Gt | Operator::Lt => { + let a = Cpv::parser() + .parse_finished(InputIter::new( + line.split_ascii_whitespace().nth(1).unwrap(), + )) + .unwrap(); + + let b = Cpv::parser() + .parse_finished(InputIter::new( + line.split_ascii_whitespace().nth(2).unwrap(), + )) + .unwrap(); + + assert_eq!( + a.partial_cmp(&b).unwrap(), + match &operator { + Operator::Eq => Ordering::Equal, + Operator::Gt => Ordering::Greater, + Operator::Lt => Ordering::Less, + _ => unreachable!(), + } + ); + } + } + } +} diff --git a/tests/porthole/porthole.txt b/tests/porthole/porthole.txt new file mode 100644 index 0000000..99abf89 --- /dev/null +++ b/tests/porthole/porthole.txt @@ -0,0 +1,19 @@ ++ something/package ++ something/package +- some#thing/package ++ =cat/package-1.0:0/2.0 +- something/pac?kage +- =something/+package-1.0:3.0 +- a b c + ++ >=media-video/knob-goblin-1.0_alpha-r4 ++ media-video/knobgoblin:4 + +- /hello +- group/-1.0 +- >=/ +- >=media-video/revised-knob-3.0aaaaaaaaa-r15 + +*** sanity check +> cat/test-2.0 cat/test-1.0 +< cat/test-1.0 cat/test-2.0 -- cgit v1.2.3