summaryrefslogtreecommitdiff
path: root/tests/porthole
diff options
context:
space:
mode:
authorJohn Turner <jturner.usa@gmail.com>2025-11-28 17:13:47 +0000
committerJohn Turner <jturner.usa@gmail.com>2025-11-28 17:13:47 +0000
commit558e213ab496ccb7949dab36aeb60149d3137d99 (patch)
treea5f7bc77e05278d54ce3ae27af57d0da4fd708e4 /tests/porthole
parentee5b3c8166be03876286508babfacde6d0a6cf54 (diff)
downloadgentoo-utils-558e213ab496ccb7949dab36aeb60149d3137d99.tar.gz
add porthole tests to meson
Diffstat (limited to 'tests/porthole')
-rw-r--r--tests/porthole/meson.build5
-rw-r--r--tests/porthole/porthole.rs95
-rw-r--r--tests/porthole/porthole.txt19
3 files changed, 119 insertions, 0 deletions
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