mirror of
https://github.com/gitbutlerapp/gitbutler.git
synced 2024-12-24 18:12:48 +03:00
125 lines
4.4 KiB
Rust
125 lines
4.4 KiB
Rust
|
use gitbutler_changeset::Signature;
|
||
|
|
||
|
macro_rules! assert_score {
|
||
|
($sig:ident, $s:expr, $e:expr) => {
|
||
|
let score = $sig.score_str($s);
|
||
|
if (score - $e).abs() >= 0.1 {
|
||
|
panic!(
|
||
|
"expected score of {} for string {:?}, got {}",
|
||
|
$e, $s, score
|
||
|
);
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn score_signature() {
|
||
|
let sig = Signature::from("hello world");
|
||
|
|
||
|
// NOTE: The scores here are not exact, but are close enough
|
||
|
// to be useful for testing purposes, hence why some have the same
|
||
|
// "score" but different strings.
|
||
|
assert_score!(sig, "hello world", 1.0);
|
||
|
assert_score!(sig, "hello world!", 0.95);
|
||
|
assert_score!(sig, "hello world!!", 0.9);
|
||
|
assert_score!(sig, "hello world!!!", 0.85);
|
||
|
assert_score!(sig, "hello world!!!!", 0.8);
|
||
|
assert_score!(sig, "hello world!!!!!", 0.75);
|
||
|
assert_score!(sig, "hello world!!!!!!", 0.7);
|
||
|
assert_score!(sig, "hello world!!!!!!!", 0.65);
|
||
|
assert_score!(sig, "hello world!!!!!!!!", 0.62);
|
||
|
assert_score!(sig, "hello world!!!!!!!!!", 0.6);
|
||
|
assert_score!(sig, "hello world!!!!!!!!!!", 0.55);
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn score_ignores_whitespace() {
|
||
|
let sig = Signature::from("hello world");
|
||
|
|
||
|
assert_score!(sig, "hello world", 1.0);
|
||
|
assert_score!(sig, "hello world ", 1.0);
|
||
|
assert_score!(sig, "hello\nworld ", 1.0);
|
||
|
assert_score!(sig, "hello\n\tworld ", 1.0);
|
||
|
assert_score!(sig, "\t\t hel lo\n\two rld \t\t", 1.0);
|
||
|
}
|
||
|
|
||
|
const TEXT1: &str = include_str!("../fixtures/text1.txt");
|
||
|
const TEXT2: &str = include_str!("../fixtures/text2.txt");
|
||
|
const TEXT3: &str = include_str!("../fixtures/text3.txt");
|
||
|
const CODE1: &str = include_str!("../fixtures/code1.txt");
|
||
|
const CODE2: &str = include_str!("../fixtures/code2.txt");
|
||
|
const CODE3: &str = include_str!("../fixtures/code3.txt");
|
||
|
const CODE4: &str = include_str!("../fixtures/code4.txt");
|
||
|
const LARGE1: &str = include_str!("../fixtures/large1.txt");
|
||
|
const LARGE2: &str = include_str!("../fixtures/large2.txt");
|
||
|
|
||
|
macro_rules! real_test {
|
||
|
($a: ident, $b: ident, are_similar) => {
|
||
|
paste::paste! {
|
||
|
#[test]
|
||
|
#[allow(non_snake_case)]
|
||
|
fn [<$a _ $b _are_similar>]() {
|
||
|
let a = Signature::from($a);
|
||
|
let b = Signature::from($b);
|
||
|
assert!(a.score_str($b) >= 0.95);
|
||
|
assert!(b.score_str($a) >= 0.95);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
($a: ident, $b: ident, are_not_similar) => {
|
||
|
paste::paste! {
|
||
|
#[test]
|
||
|
#[allow(non_snake_case)]
|
||
|
fn [<$a _ $b _are_not_similar>]() {
|
||
|
let a = Signature::from($a);
|
||
|
let b = Signature::from($b);
|
||
|
assert!(a.score_str($b) < 0.95);
|
||
|
assert!(b.score_str($a) < 0.95);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
// Only similar pairs:
|
||
|
// - TEXT1, TEXT2
|
||
|
// - CODE1, CODE2
|
||
|
// - LARGE1, LARGE2
|
||
|
real_test!(TEXT1, TEXT2, are_similar);
|
||
|
real_test!(CODE1, CODE2, are_similar);
|
||
|
real_test!(LARGE1, LARGE2, are_similar);
|
||
|
|
||
|
// Check all other combos
|
||
|
real_test!(TEXT1, TEXT3, are_not_similar);
|
||
|
real_test!(TEXT1, CODE1, are_not_similar);
|
||
|
real_test!(TEXT1, CODE2, are_not_similar);
|
||
|
real_test!(TEXT1, CODE3, are_not_similar);
|
||
|
real_test!(TEXT1, CODE4, are_not_similar);
|
||
|
real_test!(TEXT1, LARGE1, are_not_similar);
|
||
|
real_test!(TEXT1, LARGE2, are_not_similar);
|
||
|
real_test!(TEXT2, TEXT3, are_not_similar);
|
||
|
real_test!(TEXT2, CODE1, are_not_similar);
|
||
|
real_test!(TEXT2, CODE2, are_not_similar);
|
||
|
real_test!(TEXT2, CODE3, are_not_similar);
|
||
|
real_test!(TEXT2, CODE4, are_not_similar);
|
||
|
real_test!(TEXT2, LARGE1, are_not_similar);
|
||
|
real_test!(TEXT2, LARGE2, are_not_similar);
|
||
|
real_test!(TEXT3, CODE1, are_not_similar);
|
||
|
real_test!(TEXT3, CODE2, are_not_similar);
|
||
|
real_test!(TEXT3, CODE3, are_not_similar);
|
||
|
real_test!(TEXT3, CODE4, are_not_similar);
|
||
|
real_test!(TEXT3, LARGE1, are_not_similar);
|
||
|
real_test!(TEXT3, LARGE2, are_not_similar);
|
||
|
real_test!(CODE1, CODE3, are_not_similar);
|
||
|
real_test!(CODE1, CODE4, are_not_similar);
|
||
|
real_test!(CODE1, LARGE1, are_not_similar);
|
||
|
real_test!(CODE1, LARGE2, are_not_similar);
|
||
|
real_test!(CODE2, CODE3, are_not_similar);
|
||
|
real_test!(CODE2, CODE4, are_not_similar);
|
||
|
real_test!(CODE2, LARGE1, are_not_similar);
|
||
|
real_test!(CODE2, LARGE2, are_not_similar);
|
||
|
real_test!(CODE3, CODE4, are_not_similar);
|
||
|
real_test!(CODE3, LARGE1, are_not_similar);
|
||
|
real_test!(CODE3, LARGE2, are_not_similar);
|
||
|
real_test!(CODE4, LARGE1, are_not_similar);
|
||
|
real_test!(CODE4, LARGE2, are_not_similar);
|