diff --git a/benches/brainfuck.rs b/benches/brainfuck.rs index a84a131..66377f5 100644 --- a/benches/brainfuck.rs +++ b/benches/brainfuck.rs @@ -3,27 +3,17 @@ extern crate rustijvm; extern crate test; use std::fs::File; -use std::rc::Rc; -use std::sync::Mutex; -use std::io::{Cursor, Seek, SeekFrom, Read}; +use std::sync::{Arc, Mutex}; +use std::io::Cursor; use test::Bencher; -fn run_bfi(file: &str) -> String { +fn run_bfi(file: &str) { let file = File::open(file).expect("Missing bf file"); - let rc = Rc::new(Mutex::new(Cursor::new(Vec::new()))); + let rc = Arc::new(Mutex::new(Cursor::new(Vec::new()))); let mut machine = rustijvm::Machine::new_from_file("files/bonus/bfi.ijvm").unwrap(); - machine.set_output(rc.clone()); + machine.set_output(rc); machine.set_input(Box::new(file)); - machine.run().unwrap(); - - let mut out = rc.lock().unwrap(); - let mut string = String::new(); - - out.seek(SeekFrom::Start(0)).unwrap(); - out.read_to_string(&mut string).unwrap(); - - string } #[bench] diff --git a/benches/recurse.rs b/benches/recurse.rs new file mode 100644 index 0000000..1225115 --- /dev/null +++ b/benches/recurse.rs @@ -0,0 +1,35 @@ +#![feature(test)] +extern crate rustijvm; +extern crate test; + +use std::sync::{Arc, Mutex}; +use std::io::Cursor; +use test::Bencher; + +fn run_calc(input: &'static str) { + let rc = Arc::new(Mutex::new(Cursor::new(Vec::new()))); + let mut machine = rustijvm::Machine::new_from_file("files/advanced/SimpleCalc.ijvm").unwrap(); + machine.set_output(rc); + machine.set_input(Box::new(input.as_bytes())); + machine.run().unwrap(); +} + +#[bench] +fn factorial_2(b: &mut Bencher) { + b.iter(|| run_calc("2!?.")); +} + +#[bench] +fn factorial_5(b: &mut Bencher) { + b.iter(|| run_calc("5!?.")); +} + +#[bench] +fn factorial_7(b: &mut Bencher) { + b.iter(|| run_calc("7!?.")); +} + +#[bench] +fn factorial_10(b: &mut Bencher) { + b.iter(|| run_calc("10!?.")); +} diff --git a/tests/advanced5.rs b/tests/advanced5.rs new file mode 100644 index 0000000..1dcc73a --- /dev/null +++ b/tests/advanced5.rs @@ -0,0 +1,40 @@ +extern crate rustijvm; + +use std::sync::{Arc, Mutex}; +use std::io::{Cursor, Seek, SeekFrom, Read}; + +fn run_calc(input: &'static str, expected: &str) { + let rc = Arc::new(Mutex::new(Cursor::new(Vec::new()))); + let mut machine = rustijvm::Machine::new_from_file("files/advanced/SimpleCalc.ijvm").unwrap(); + machine.set_input(Box::new(input.as_bytes())); + machine.set_output(rc.clone()); + machine.run().unwrap(); + + let mut out = rc.lock().unwrap(); + let mut output = String::new(); + + out.seek(SeekFrom::Start(0)).unwrap(); + out.read_to_string(&mut output).unwrap(); + + assert_eq!(output, expected); +} + +#[test] +fn advanced5_level1() { + run_calc("0 0 + ? .", "0\n"); + run_calc("0 9 + ? .", "9\n"); + run_calc("9 0 + ? .", "9\n"); + run_calc("9 9 - ? .", "0\n"); +} + +#[test] +fn advanced5_level2() { + run_calc(" 5 4 -?.", "1\n"); + run_calc(" 8 8 8 - + ?.", "8\n"); +} + +#[test] +fn advanced5_level3() { + run_calc("1 1 + 1 1 + 1 1 + 1 1 + 1 1 + +-++?.", "2\n"); + run_calc("9 8 -9 7-9 6-9 5-9 4-9 3-9 2-9 1-9 0- -+-+-+-+?.", "1\n"); +} diff --git a/tests/advanced6.rs b/tests/advanced6.rs new file mode 100644 index 0000000..8e1426a --- /dev/null +++ b/tests/advanced6.rs @@ -0,0 +1,35 @@ +extern crate rustijvm; + +use std::sync::{Arc, Mutex}; +use std::io::{Cursor, Seek, SeekFrom, Read}; + +fn run_calc(input: &'static str, expected: &str) { + let rc = Arc::new(Mutex::new(Cursor::new(Vec::new()))); + let mut machine = rustijvm::Machine::new_from_file("files/advanced/SimpleCalc.ijvm").unwrap(); + machine.set_input(Box::new(input.as_bytes())); + machine.set_output(rc.clone()); + machine.run().unwrap(); + + let mut out = rc.lock().unwrap(); + let mut output = String::new(); + + out.seek(SeekFrom::Start(0)).unwrap(); + out.read_to_string(&mut output).unwrap(); + + assert_eq!(output, expected); +} + +#[test] +fn advanced6_recurse1() { + run_calc("2!?.", "2\n"); +} + +#[test] +fn advanced6_recurse2() { + run_calc("7!?.", "5040\n"); +} + +#[test] +fn advanced6_recurse3() { + run_calc("8!?.", "40320\n"); +}