aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/tests/dependency_resolver/rule_set_test.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/tests/dependency_resolver/rule_set_test.rs')
-rw-r--r--crates/shirabe/tests/dependency_resolver/rule_set_test.rs154
1 files changed, 154 insertions, 0 deletions
diff --git a/crates/shirabe/tests/dependency_resolver/rule_set_test.rs b/crates/shirabe/tests/dependency_resolver/rule_set_test.rs
index c78bd03..9d6e88c 100644
--- a/crates/shirabe/tests/dependency_resolver/rule_set_test.rs
+++ b/crates/shirabe/tests/dependency_resolver/rule_set_test.rs
@@ -1 +1,155 @@
//! ref: composer/tests/Composer/Test/DependencyResolver/RuleSetTest.php
+
+use std::cell::RefCell;
+use std::rc::Rc;
+
+use shirabe::dependency_resolver::{
+ GenericRule, RULE_LEARNED, RULE_ROOT_REQUIRE, ReasonData, Rule, RuleSet,
+};
+use shirabe_semver::constraint::MatchAllConstraint;
+
+fn root_require_reason() -> ReasonData {
+ ReasonData::RootRequire {
+ package_name: String::new(),
+ constraint: MatchAllConstraint::new(None).into(),
+ }
+}
+
+fn rule(literals: Vec<i64>) -> Rc<RefCell<Rule>> {
+ Rc::new(RefCell::new(Rule::Generic(GenericRule::new(
+ literals,
+ RULE_ROOT_REQUIRE,
+ root_require_reason(),
+ ))))
+}
+
+fn learned_rule() -> Rc<RefCell<Rule>> {
+ Rc::new(RefCell::new(Rule::Generic(GenericRule::new(
+ vec![],
+ RULE_LEARNED,
+ ReasonData::Int(1),
+ ))))
+}
+
+fn iterator_count(mut iterator: shirabe::dependency_resolver::RuleSetIterator) -> i64 {
+ let mut count = 0;
+ while iterator.valid() {
+ count += 1;
+ iterator.next();
+ }
+ count
+}
+
+#[test]
+#[ignore = "RuleSet::add computes Rule::get_hash, which reaches hash_raw (todo!()) in the php-shim"]
+fn test_add() {
+ let request0 = rule(vec![1]);
+ let request1 = rule(vec![2]);
+ let learned0 = learned_rule();
+
+ let mut rule_set = RuleSet::new();
+ rule_set.add(request0.clone(), RuleSet::TYPE_REQUEST).unwrap();
+ rule_set.add(learned0.clone(), RuleSet::TYPE_LEARNED).unwrap();
+ rule_set.add(request1.clone(), RuleSet::TYPE_REQUEST).unwrap();
+
+ let rules = rule_set.get_rules();
+ assert!(rules.get(&RuleSet::TYPE_PACKAGE).is_none_or(|v| v.is_empty()));
+ let request = &rules[&RuleSet::TYPE_REQUEST];
+ assert_eq!(2, request.len());
+ assert!(Rc::ptr_eq(&request[0], &request0));
+ assert!(Rc::ptr_eq(&request[1], &request1));
+ let learned = &rules[&RuleSet::TYPE_LEARNED];
+ assert_eq!(1, learned.len());
+ assert!(Rc::ptr_eq(&learned[0], &learned0));
+}
+
+#[test]
+#[ignore = "RuleSet::add computes Rule::get_hash, which reaches hash_raw (todo!()) in the php-shim"]
+fn test_add_ignores_duplicates() {
+ let mut rule_set = RuleSet::new();
+ rule_set.add(rule(vec![]), RuleSet::TYPE_REQUEST).unwrap();
+ rule_set.add(rule(vec![]), RuleSet::TYPE_REQUEST).unwrap();
+ rule_set.add(rule(vec![]), RuleSet::TYPE_REQUEST).unwrap();
+
+ assert_eq!(
+ 1,
+ iterator_count(rule_set.get_iterator_for(vec![RuleSet::TYPE_REQUEST]))
+ );
+}
+
+#[test]
+fn test_add_when_type_is_not_recognized() {
+ let mut rule_set = RuleSet::new();
+
+ // The unknown-type check happens before the hash is computed.
+ assert!(rule_set.add(rule(vec![]), 7).is_err());
+}
+
+#[test]
+#[ignore = "RuleSet::add computes Rule::get_hash, which reaches hash_raw (todo!()) in the php-shim"]
+fn test_count() {
+ let mut rule_set = RuleSet::new();
+ rule_set.add(rule(vec![1]), RuleSet::TYPE_REQUEST).unwrap();
+ rule_set.add(rule(vec![2]), RuleSet::TYPE_REQUEST).unwrap();
+
+ assert_eq!(2, rule_set.count());
+}
+
+#[test]
+#[ignore = "RuleSet::add computes Rule::get_hash, which reaches hash_raw (todo!()) in the php-shim"]
+fn test_rule_by_id() {
+ let mut rule_set = RuleSet::new();
+ let rule = rule(vec![]);
+ rule_set.add(rule.clone(), RuleSet::TYPE_REQUEST).unwrap();
+
+ assert!(Rc::ptr_eq(&rule_set.rule_by_id[&0], &rule));
+}
+
+#[test]
+#[ignore = "RuleSet::add computes Rule::get_hash, which reaches hash_raw (todo!()) in the php-shim"]
+fn test_get_iterator() {
+ let mut rule_set = RuleSet::new();
+ let rule1 = rule(vec![1]);
+ let rule2 = rule(vec![2]);
+ rule_set.add(rule1.clone(), RuleSet::TYPE_REQUEST).unwrap();
+ rule_set.add(rule2.clone(), RuleSet::TYPE_LEARNED).unwrap();
+
+ let mut iterator = rule_set.get_iterator();
+ assert!(Rc::ptr_eq(&iterator.current(), &rule1));
+ iterator.next();
+ assert!(Rc::ptr_eq(&iterator.current(), &rule2));
+}
+
+#[test]
+#[ignore = "RuleSet::add computes Rule::get_hash, which reaches hash_raw (todo!()) in the php-shim"]
+fn test_get_iterator_for() {
+ let mut rule_set = RuleSet::new();
+ let rule1 = rule(vec![1]);
+ let rule2 = rule(vec![2]);
+ rule_set.add(rule1, RuleSet::TYPE_REQUEST).unwrap();
+ rule_set.add(rule2.clone(), RuleSet::TYPE_LEARNED).unwrap();
+
+ let iterator = rule_set.get_iterator_for(vec![RuleSet::TYPE_LEARNED]);
+ assert!(Rc::ptr_eq(&iterator.current(), &rule2));
+}
+
+#[test]
+#[ignore = "RuleSet::add computes Rule::get_hash, which reaches hash_raw (todo!()) in the php-shim"]
+fn test_get_iterator_without() {
+ let mut rule_set = RuleSet::new();
+ let rule1 = rule(vec![1]);
+ let rule2 = rule(vec![2]);
+ rule_set.add(rule1, RuleSet::TYPE_REQUEST).unwrap();
+ rule_set.add(rule2.clone(), RuleSet::TYPE_LEARNED).unwrap();
+
+ let iterator = rule_set.get_iterator_without(vec![RuleSet::TYPE_REQUEST]);
+ assert!(Rc::ptr_eq(&iterator.current(), &rule2));
+}
+
+// In PHP this mocks RepositorySet and Request to build the pretty string. The mocked
+// collaborators cannot be reproduced here, and add() also reaches hash_raw (todo!()).
+#[test]
+#[ignore = "getPrettyString needs mocked RepositorySet/Request, and add() reaches hash_raw (todo!())"]
+fn test_pretty_string() {
+ todo!()
+}