Skip to content

Commit

Permalink
fix tests
Browse files Browse the repository at this point in the history
  • Loading branch information
azizkayumov committed Nov 11, 2023
1 parent fe385c1 commit 2d7aec9
Show file tree
Hide file tree
Showing 4 changed files with 138 additions and 121 deletions.
48 changes: 48 additions & 0 deletions tests/test_base.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
use lctree::LinkCutTree;

#[test]
pub fn basic_usage() {
// We form a link-cut tree for the following forest:
// (the numbers in parentheses are the weights of the nodes):
// a(9)
// / \
// b(1) e(2)
// / \ \
// c(8) d(10) f(4)
let mut lctree = LinkCutTree::default();
let a = lctree.make_tree(9.);
let b = lctree.make_tree(1.);
let c = lctree.make_tree(8.);
let d = lctree.make_tree(10.);
let e = lctree.make_tree(2.);
let f = lctree.make_tree(4.);

lctree.link(b, a);
lctree.link(c, b);
lctree.link(d, b);
lctree.link(e, a);
lctree.link(f, e);

// Checking connectivity:
assert!(lctree.connected(c, f)); // connected

// Path aggregation:
// We find the node with max weight on the path between c to f,
// where a has the maximum weight of 9.0:
let heaviest_node = lctree.path(c, f);
assert_eq!(heaviest_node.idx, a);
assert_eq!(heaviest_node.weight, 9.0);

// We cut node e from its parent a:
lctree.cut(e, a);

// The forest should now look like this:
// a(9)
// /
// b(1) e(2)
// / \ \
// c(8) d(10) f(4)

// We check connectivity again:
assert!(!lctree.connected(c, f)); // not connected anymore
}
46 changes: 46 additions & 0 deletions tests/test_path_aggr.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
use lctree::{FindSum, LinkCutTree, Path};

#[test]
pub fn path_aggregation() {
// We form a link-cut tree from the following rooted tree
// (the numbers in parentheses are the weights of the nodes):
// a(9)
// / \
// b(1) e(2)
// / \ \
// c(8) d(10) f(4)

// Use FindMax, FindMin or FindSum, depending on your usage:
let mut lctree: LinkCutTree<FindSum> = lctree::LinkCutTree::new();
let a = lctree.make_tree(9.);
let b = lctree.make_tree(1.);
let c = lctree.make_tree(8.);
let d = lctree.make_tree(10.);
let e = lctree.make_tree(2.);
let f = lctree.make_tree(4.);

lctree.link(b, a);
lctree.link(c, b);
lctree.link(d, b);
lctree.link(e, a);
lctree.link(f, e);

// We find the sum of the weights on the path between c to f,
let result = lctree.path(c, f);
assert_eq!(result.sum, 8. + 1. + 9. + 2. + 4.);
}

#[derive(Copy, Clone)]
pub struct FindXor {
pub xor: u64,
}

impl Path for FindXor {
fn default(weight: f64, _: usize) -> Self {
FindXor { xor: weight as u64 }
}

fn aggregate(&mut self, other: Self) {
self.xor ^= other.xor;
}
}
44 changes: 44 additions & 0 deletions tests/test_path_custom.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
use lctree::{LinkCutTree, Path};

#[derive(Copy, Clone)]
pub struct FindXor {
pub xor: u64,
}

impl Path for FindXor {
fn default(weight: f64, _: usize) -> Self {
FindXor { xor: weight as u64 }
}

fn aggregate(&mut self, other: Self) {
self.xor ^= other.xor;
}
}

#[test]
pub fn custom_path_aggregation() {
// We form a link-cut tree from the following rooted tree
// (the numbers in parentheses are the weights of the nodes):
// a(9)
// / \
// b(1) e(2)
// / \ \
// c(8) d(10) f(4)
let mut lctree: LinkCutTree<FindXor> = LinkCutTree::new();
let a = lctree.make_tree(9.);
let b = lctree.make_tree(1.);
let c = lctree.make_tree(8.);
let d = lctree.make_tree(10.);
let e = lctree.make_tree(2.);
let f = lctree.make_tree(4.);

lctree.link(b, a);
lctree.link(c, b);
lctree.link(d, b);
lctree.link(e, a);
lctree.link(f, e);

// We find the xor of the weights on the path between c to f,
let result = lctree.path(c, f);
assert_eq!(result.xor, 8 ^ 1 ^ 9 ^ 2 ^ 4);
}
121 changes: 0 additions & 121 deletions tests/test_usage.rs

This file was deleted.

0 comments on commit 2d7aec9

Please sign in to comment.