#![allow(dead_code)]
pub struct UvClipboard {
pub uvs: Vec<[f32; 2]>,
pub source_label: String,
}
pub fn new_uv_clipboard() -> UvClipboard {
UvClipboard {
uvs: Vec::new(),
source_label: String::new(),
}
}
pub fn copy_uvs(clipboard: &mut UvClipboard, source: &[[f32; 2]], label: &str) {
clipboard.uvs = source.to_vec();
clipboard.source_label = label.to_string();
}
pub fn paste_uvs(clipboard: &UvClipboard, destination: &mut [[f32; 2]]) -> usize {
let count = clipboard.uvs.len().min(destination.len());
destination[..count].copy_from_slice(&clipboard.uvs[..count]);
count
}
pub fn clipboard_size(clipboard: &UvClipboard) -> usize {
clipboard.uvs.len()
}
pub fn clear_clipboard(clipboard: &mut UvClipboard) {
clipboard.uvs.clear();
clipboard.source_label.clear();
}
pub fn clipboard_fits(clipboard: &UvClipboard, dest_len: usize) -> bool {
clipboard.uvs.len() == dest_len
}
pub fn paste_exact(clipboard: &UvClipboard, destination: &mut [[f32; 2]]) -> bool {
if !clipboard_fits(clipboard, destination.len()) {
return false;
}
destination.copy_from_slice(&clipboard.uvs);
true
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn new_clipboard_empty() {
let cb = new_uv_clipboard();
assert_eq!(clipboard_size(&cb), 0 );
}
#[test]
fn copy_fills_clipboard() {
let mut cb = new_uv_clipboard();
let src = vec![[0.1f32, 0.2], [0.3, 0.4]];
copy_uvs(&mut cb, &src, "mesh_a");
assert_eq!(clipboard_size(&cb), 2 );
assert_eq!(cb.source_label, "mesh_a" );
}
#[test]
fn paste_copies_uvs() {
let mut cb = new_uv_clipboard();
let src = vec![[0.5f32, 0.6], [0.7, 0.8]];
copy_uvs(&mut cb, &src, "src");
let mut dst = vec![[0.0f32, 0.0], [0.0, 0.0]];
let count = paste_uvs(&cb, &mut dst);
assert_eq!(count, 2 );
assert!((dst[0][0] - 0.5).abs() < 1e-6 );
}
#[test]
fn paste_truncates_to_destination_size() {
let mut cb = new_uv_clipboard();
let src = vec![[0.1f32, 0.1], [0.2, 0.2], [0.3, 0.3]];
copy_uvs(&mut cb, &src, "x");
let mut dst = vec![[0.0f32, 0.0]];
let count = paste_uvs(&cb, &mut dst);
assert_eq!(count, 1 );
}
#[test]
fn clear_empties_clipboard() {
let mut cb = new_uv_clipboard();
copy_uvs(&mut cb, &[[0.0, 0.0]], "y");
clear_clipboard(&mut cb);
assert_eq!(clipboard_size(&cb), 0 );
}
#[test]
fn clipboard_fits_exact() {
let mut cb = new_uv_clipboard();
copy_uvs(&mut cb, &[[0.0f32, 0.0], [1.0, 1.0]], "z");
assert!(clipboard_fits(&cb, 2) );
assert!(!clipboard_fits(&cb, 3) );
}
#[test]
fn paste_exact_success() {
let mut cb = new_uv_clipboard();
let src = vec![[0.25f32, 0.75]];
copy_uvs(&mut cb, &src, "exact");
let mut dst = vec![[0.0f32, 0.0]];
let ok = paste_exact(&cb, &mut dst);
assert!(ok );
assert!((dst[0][0] - 0.25).abs() < 1e-6 );
}
#[test]
fn paste_exact_size_mismatch() {
let mut cb = new_uv_clipboard();
copy_uvs(&mut cb, &[[0.0f32, 0.0]], "m");
let mut dst = vec![[0.0f32, 0.0], [0.0, 0.0]];
let ok = paste_exact(&cb, &mut dst);
assert!(!ok );
}
#[test]
fn copy_overwrites_previous() {
let mut cb = new_uv_clipboard();
copy_uvs(&mut cb, &[[0.0f32, 0.0]], "first");
copy_uvs(&mut cb, &[[0.1f32, 0.1], [0.2, 0.2]], "second");
assert_eq!(clipboard_size(&cb), 2 );
}
}