Replace sampler

This commit is contained in:
Rico Riedel 2022-08-01 11:46:07 +02:00
parent 8d75146744
commit f5730be835
No known key found for this signature in database
GPG Key ID: 75AC868575DE7B18
3 changed files with 78 additions and 144 deletions

View File

@ -1,10 +1,9 @@
pub mod convert;
pub mod error; pub mod error;
pub mod pattern; pub mod pattern;
pub mod printer; pub mod printer;
pub mod convert;
pub mod term; pub mod term;
mod vec; mod vec;
mod sampler;
fn main() -> Result<(), error::Error> { fn main() -> Result<(), error::Error> {
Ok(()) Ok(())

View File

@ -21,3 +21,80 @@ pub trait PatternFactory {
pub trait Pattern { pub trait Pattern {
fn sample(&self, pos: Vector) -> f32; fn sample(&self, pos: Vector) -> f32;
} }
pub trait SamplerFactory {
fn create(&self, config: &Config) -> Box<dyn Sampler>;
}
#[cfg_attr(test, mockall::automock)]
pub trait Sampler {
fn char(&self, pos: Vector) -> f32;
fn color(&self, pos: Vector) -> f32;
}
#[derive(derive_more::Constructor)]
pub struct SamplerFactoryImpl {
char: Box<dyn PatternFactory>,
color: Box<dyn PatternFactory>,
}
#[derive(derive_more::Constructor)]
pub struct SamplerImpl {
char: Box<dyn Pattern>,
color: Box<dyn Pattern>,
}
impl SamplerFactory for SamplerFactoryImpl {
fn create(&self, config: &Config) -> Box<dyn Sampler> {
Box::new(SamplerImpl::new(
self.char.create(config),
self.color.create(config),
))
}
}
impl Sampler for SamplerImpl {
fn char(&self, pos: Vector) -> f32 {
self.char.sample(pos)
}
fn color(&self, pos: Vector) -> f32 {
self.color.sample(pos)
}
}
#[cfg(test)]
mod test {
use super::*;
use mockall::predicate::eq;
#[test]
fn char() {
let mut char = MockPattern::new();
let color = MockPattern::new();
char.expect_sample()
.with(eq(Vector::new(2.0, 5.0)))
.return_const(2.5);
let sampler = SamplerImpl::new(Box::new(char), Box::new(color));
assert_eq!(2.5, sampler.char(Vector::new(2.0, 5.0)));
}
#[test]
fn color() {
let char = MockPattern::new();
let mut color = MockPattern::new();
color
.expect_sample()
.with(eq(Vector::new(4.0, 2.0)))
.return_const(3.2);
let sampler = SamplerImpl::new(Box::new(char), Box::new(color));
assert_eq!(3.2, sampler.color(Vector::new(4.0, 2.0)));
}
}

View File

@ -1,142 +0,0 @@
use crate::convert::char::CharSample;
use crate::convert::Converter;
use crate::pattern::{Config, Pattern, PatternFactory};
use crate::vec::Vector;
use crossterm::style::Color;
use std::rc::Rc;
#[derive(Copy, Clone, PartialEq, Debug)]
pub enum Sample {
Keep,
Draw { char: char, color: Color },
Clear,
}
pub trait SamplerFactory {
fn create(&self, config: &Config) -> Box<dyn Sampler>;
}
pub trait Sampler {
fn sample(&self, pos: Vector) -> Sample;
}
#[derive(derive_more::Constructor)]
pub struct SamplerFactoryImpl<T> {
char: Box<dyn PatternFactory>,
color: Box<dyn PatternFactory>,
converter: Rc<T>,
}
#[derive(derive_more::Constructor)]
pub struct SamplerImpl<T> {
char: Box<dyn Pattern>,
color: Box<dyn Pattern>,
converter: Rc<T>,
}
impl<T: Converter + 'static> SamplerFactory for SamplerFactoryImpl<T> {
fn create(&self, config: &Config) -> Box<dyn Sampler> {
Box::new(SamplerImpl::new(
self.char.create(config),
self.color.create(config),
self.converter.clone(),
))
}
}
impl<T: Converter> Sampler for SamplerImpl<T> {
fn sample(&self, pos: Vector) -> Sample {
match self.converter.char(self.char.sample(pos)) {
CharSample::Keep => Sample::Keep,
CharSample::Draw(char) => Sample::Draw {
char,
color: self.converter.color(self.color.sample(pos)),
},
CharSample::Clear => Sample::Clear,
}
}
}
#[cfg(test)]
mod test {
use super::*;
use crate::convert::MockConverter;
use crate::pattern::MockPattern;
use mockall::predicate::eq;
#[test]
fn sample_keep() {
let color = MockPattern::new();
let mut char = MockPattern::new();
let mut converter = MockConverter::new();
char.expect_sample().return_const(3.0);
converter.expect_char().return_const(CharSample::Keep);
let sampler = SamplerImpl::new(Box::new(char), Box::new(color), Rc::new(converter));
assert_eq!(Sample::Keep, sampler.sample(Vector::default()));
}
#[test]
fn sample_draw() {
let mut char = MockPattern::new();
let mut color = MockPattern::new();
let mut converter = MockConverter::new();
char.expect_sample().return_const(3.0);
color.expect_sample().return_const(2.0);
converter.expect_char().return_const(CharSample::Draw('M'));
converter.expect_color().return_const(Color::Red);
let sampler = SamplerImpl::new(Box::new(char), Box::new(color), Rc::new(converter));
assert_eq!(
Sample::Draw {
char: 'M',
color: Color::Red
},
sampler.sample(Vector::default())
);
}
#[test]
fn sample_clear() {
let color = MockPattern::new();
let mut char = MockPattern::new();
let mut converter = MockConverter::new();
char.expect_sample().return_const(3.0);
converter.expect_char().return_const(CharSample::Clear);
let sampler = SamplerImpl::new(Box::new(char), Box::new(color), Rc::new(converter));
assert_eq!(Sample::Clear, sampler.sample(Vector::default()));
}
#[test]
fn sample_args_correct() {
let mut char = MockPattern::new();
let mut color = MockPattern::new();
let mut converter = MockConverter::new();
char.expect_sample()
.with(eq(Vector::new(4.0, 2.0)))
.return_const(6.0);
color
.expect_sample()
.with(eq(Vector::new(4.0, 2.0)))
.return_const(7.0);
converter
.expect_char()
.with(eq(6.0))
.return_const(CharSample::Draw('A'));
converter
.expect_color()
.with(eq(7.0))
.return_const(Color::Reset);
SamplerImpl::new(Box::new(char), Box::new(color), Rc::new(converter))
.sample(Vector::new(4.0, 2.0));
}
}