You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

58 lines
1.6 KiB
Rust

use chronofold::{Chronofold, LogIndex, Op, Timestamp, Version};
#[test]
fn partial_order() {
assert!(v(vec![]) == v(vec![]));
assert!(v(vec![]) < v(vec![t(0, 0)]));
assert!(v(vec![t(0, 0)]) > v(vec![]));
assert!(v(vec![t(0, 1)]) < v(vec![t(1, 1)]));
assert!(v(vec![t(1, 1)]) > v(vec![t(0, 1)]));
assert_eq!(v(vec![t(0, 1)]).partial_cmp(&v(vec![t(0, 2)])), None);
}
#[test]
fn iter_newer_ops() {
let mut cfold = Chronofold::<u8, char>::default();
cfold.session(1).extend("foo".chars());
let v1 = cfold.version().clone();
cfold.session(1).push_back('!');
cfold.session(2).push_back('?');
assert_eq!(
vec![
Op::insert(t(4, 1), Some(t(3, 1)), &'!'),
Op::insert(t(5, 2), Some(t(4, 1)), &'?')
],
cfold.iter_newer_ops(&v1).collect::<Vec<_>>()
);
let mut v2 = Version::new();
v2.inc(&Timestamp(LogIndex(1), 3));
assert_eq!(
vec![
Op::root(t(0, 0)),
Op::insert(t(1, 1), Some(t(0, 0)), &'f'),
Op::insert(t(2, 1), Some(t(1, 1)), &'o'),
Op::insert(t(3, 1), Some(t(2, 1)), &'o'),
Op::insert(t(4, 1), Some(t(3, 1)), &'!'),
Op::insert(t(5, 2), Some(t(4, 1)), &'?')
],
cfold.iter_newer_ops(&v2).collect::<Vec<_>>()
);
}
fn t(log_index: usize, author: u8) -> Timestamp<u8> {
Timestamp(LogIndex(log_index), author)
}
fn v(timestamps: Vec<Timestamp<u8>>) -> Version<u8> {
let mut version = Version::<u8>::new();
for t in timestamps.iter() {
version.inc(t);
}
version
}