Add test
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2022-04-02 21:58:23 +02:00
parent 63f4dce705
commit 4fd34f973f
20 changed files with 987 additions and 133 deletions

View File

@@ -0,0 +1,33 @@
use std::sync::{Arc, Mutex};
use crate::interaction::Interaction;
pub struct Buffer {
int_buffer: Arc<Mutex<Vec<String>>>,
out_buffer: Arc<Mutex<Vec<String>>>,
}
impl Buffer {
pub fn new(int_buffer: Arc<Mutex<Vec<String>>>, out_buffer: Arc<Mutex<Vec<String>>>) -> Self {
Self {
int_buffer,
out_buffer,
}
}
}
impl Interaction for Buffer {
fn input(&self) -> Result<String, String> {
let mut int_buffer = self.int_buffer.lock().unwrap();
if let Some(input_string) = int_buffer.pop() {
Ok(input_string)
} else {
Err(String::from("internal_buffer is empty"))
}
}
fn output(&self, output: String) {
let mut out_buffer = self.out_buffer.lock().unwrap();
out_buffer.push(output)
}
}

View File

@@ -0,0 +1,26 @@
use crate::interaction::Interaction;
use std::io::Write;
pub struct CommandLine {}
impl CommandLine {
pub fn new() -> Self {
Self {}
}
}
impl Interaction for CommandLine {
fn input(&self) -> Result<String, String> {
let buffer: &mut String = &mut String::new();
if let Ok(_) = std::io::stdin().read_line(buffer) {
return Ok(buffer.to_string());
} else {
return Err(String::from("could not read input buffer"));
}
}
fn output(&self, output: String) {
let _ = std::io::stdout().write(output.as_bytes());
let _ = std::io::stdout().flush();
}
}

View File

@@ -0,0 +1,7 @@
pub mod buffer;
pub mod command_line;
pub trait Interaction {
fn input(&self) -> Result<String, String>;
fn output(&self, output: String);
}