1
0
Fork 0
mirror of synced 2024-05-17 19:03:08 +12:00
This commit is contained in:
Rafał Mikrut 2023-06-09 19:40:19 +02:00
parent f5b33dc185
commit 18955b3aee

View file

@ -1304,10 +1304,12 @@ fn debug_check_for_duplicated_things(
#[cfg(test)]
mod tests {
use crate::common_directory::Directories;
use crate::similar_images::{FileEntry, SimilarImages};
use bk_tree::BKTree;
use std::path::PathBuf;
use crate::common_directory::Directories;
use crate::similar_images::{FileEntry, Hamming, SimilarImages};
#[test]
fn test_compare_no_images() {
let mut similar_images = SimilarImages::default();
@ -1438,12 +1440,92 @@ mod tests {
let fe1 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "/home/rr/abc.txt");
let fe2 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "/home/rr/abc2.txt");
let fe3 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "/home/kk/bcd.txt");
let fe4 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "/home/kk/bcd2.txt");
similar_images.image_hashes.insert(fe1.hash.clone(), vec![fe1, fe2, fe3]);
similar_images.image_hashes.insert(fe1.hash.clone(), vec![fe1, fe2, fe3, fe4]);
similar_images.find_similar_hashes(None, None);
assert_eq!(similar_images.get_similar_images_referenced().len(), 1);
assert_eq!(similar_images.get_similar_images_referenced()[0].1.len(), 1);
let res = similar_images.get_similar_images_referenced();
assert_eq!(res.len(), 1);
assert_eq!(res[0].1.len(), 2);
assert!(res[0].1.iter().all(|e| e.path.starts_with("/home/kk/")));
}
#[test]
fn test_simple_normal_too_small_similarity() {
for _ in 0..50 {
let mut similar_images = SimilarImages {
similarity: 1,
use_reference_folders: false,
..Default::default()
};
let fe1 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b00001], "abc.txt");
let fe2 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b00100], "bcd.txt");
let fe3 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b10000], "rrd.txt");
similar_images.image_hashes.insert(fe1.hash.clone(), vec![fe1]);
similar_images.image_hashes.insert(fe2.hash.clone(), vec![fe2]);
similar_images.image_hashes.insert(fe3.hash.clone(), vec![fe3]);
similar_images.find_similar_hashes(None, None);
let res = similar_images.get_similar_images();
// dbg!(&res);
assert!(res.is_empty());
}
}
#[test]
fn test_simple_normal_union_of_similarity() {
for _ in 0..100 {
let mut similar_images = SimilarImages {
similarity: 4,
use_reference_folders: false,
..Default::default()
};
let fe1 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b0000_0001], "abc.txt");
let fe2 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b0000_1111], "bcd.txt");
let fe3 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b0111_1111], "rrd.txt");
similar_images.image_hashes.insert(fe1.hash.clone(), vec![fe1]);
similar_images.image_hashes.insert(fe2.hash.clone(), vec![fe2]);
similar_images.image_hashes.insert(fe3.hash.clone(), vec![fe3]);
similar_images.find_similar_hashes(None, None);
let res = similar_images.get_similar_images();
assert_eq!(res.len(), 1);
let mut path = res[0].iter().map(|e| e.path.to_string_lossy().to_string()).collect::<Vec<_>>();
path.sort();
if res[0].len() == 3 {
assert_eq!(path, vec!["abc.txt".to_string(), "bcd.txt".to_string(), "rrd.txt".to_string()]);
} else if res[0].len() == 2 {
assert!(path == vec!["abc.txt".to_string(), "bcd.txt".to_string()] || path == vec!["bcd.txt".to_string(), "rrd.txt".to_string()]);
} else {
panic!("Invalid number of items");
}
}
}
#[test]
fn test_tolerance() {
// This test not really tests anything, but shows that current hamming distance works
// in bits instead of bytes
// I tried to make it work in bytes, but it was terrible, so Hamming should be really Ok
let fe1 = vec![1, 1, 1, 1, 1, 1, 1, 1];
let fe2 = vec![1, 1, 1, 1, 1, 1, 1, 2];
let mut bktree = BKTree::new(Hamming);
bktree.add(fe1);
let (similarity, _hash) = bktree.find(&fe2, 100).next().unwrap();
assert_eq!(similarity, 2);
let fe1 = vec![1, 1, 1, 1, 1, 1, 1, 1];
let fe2 = vec![1, 1, 1, 1, 1, 1, 1, 3];
let mut bktree = BKTree::new(Hamming);
bktree.add(fe1);
let (similarity, _hash) = bktree.find(&fe2, 100).next().unwrap();
assert_eq!(similarity, 1);
}
fn create_random_file_entry(hash: Vec<u8>, name: &str) -> FileEntry {