From 9de72fe21e35b0e200017bc830e6de909939a2eb Mon Sep 17 00:00:00 2001 From: schaeff Date: Fri, 4 Jan 2019 15:31:05 +0100 Subject: [PATCH] add tests, fix order of outputs in test runner --- zokrates_cli/examples/arrays/if_eq.code | 2 +- zokrates_core/src/flatten/mod.rs | 36 +++++++++++++++++++++++++ zokrates_core/src/ir/interpreter.rs | 12 +++++---- zokrates_core/tests/bench/array_if.code | 2 ++ zokrates_core/tests/bench/array_if.json | 24 +++++++++++++++++ zokrates_core/tests/integration.rs | 2 ++ zokrates_core/tests/utils/mod.rs | 7 ++--- 7 files changed, 76 insertions(+), 9 deletions(-) create mode 100644 zokrates_core/tests/bench/array_if.code create mode 100644 zokrates_core/tests/bench/array_if.json diff --git a/zokrates_cli/examples/arrays/if_eq.code b/zokrates_cli/examples/arrays/if_eq.code index c81783fd..cd1c8a56 100644 --- a/zokrates_cli/examples/arrays/if_eq.code +++ b/zokrates_cli/examples/arrays/if_eq.code @@ -1,2 +1,2 @@ def main(field[2] a, field[2] b, field condition) -> (field[2]): - return if condition == 1 then a else [2, 3] fi \ No newline at end of file + return if condition == 1 then a else b fi \ No newline at end of file diff --git a/zokrates_core/src/flatten/mod.rs b/zokrates_core/src/flatten/mod.rs index ef092086..3a004ef6 100644 --- a/zokrates_core/src/flatten/mod.rs +++ b/zokrates_core/src/flatten/mod.rs @@ -2365,6 +2365,42 @@ mod tests { ); } + #[test] + fn array_if() { + // if 1 == 1 then [1] else [3] fi + + let mut flattener = Flattener::new(FieldPrime::get_required_bits()); + let mut functions_flattened = vec![]; + flattener.load_corelib(&mut functions_flattened); + let arguments_flattened = vec![]; + let mut statements_flattened = vec![]; + + let e = FieldElementArrayExpression::IfElse( + box BooleanExpression::Eq( + box FieldElementExpression::Number(FieldPrime::from(1)), + box FieldElementExpression::Number(FieldPrime::from(1)), + ), + box FieldElementArrayExpression::Value( + 1, + vec![FieldElementExpression::Number(FieldPrime::from(1))], + ), + box FieldElementArrayExpression::Value( + 1, + vec![FieldElementExpression::Number(FieldPrime::from(3))], + ), + ); + + println!( + "{:?}", + flattener.flatten_field_array_expression( + &mut functions_flattened, + &arguments_flattened, + &mut statements_flattened, + e, + ) + ); + } + #[test] fn next_variable() { let mut flattener = Flattener::new(FieldPrime::get_required_bits()); diff --git a/zokrates_core/src/ir/interpreter.rs b/zokrates_core/src/ir/interpreter.rs index f7b346b8..a42e9910 100644 --- a/zokrates_core/src/ir/interpreter.rs +++ b/zokrates_core/src/ir/interpreter.rs @@ -8,12 +8,14 @@ pub type ExecutionResult = Result, Error>; pub struct Witness(BTreeMap); impl Witness { - pub fn return_values(&self) -> Vec { - self.0 - .clone() - .into_iter() + pub fn return_values(&self) -> Vec<&T> { + let out = self + .0 + .iter() .filter(|(k, _)| k.is_output()) - .map(|(_, v)| v) + .collect::>(); + (0..out.len()) + .map(|i| *out.get(&FlatVariable::public(i)).unwrap()) .collect() } diff --git a/zokrates_core/tests/bench/array_if.code b/zokrates_core/tests/bench/array_if.code new file mode 100644 index 00000000..cd1c8a56 --- /dev/null +++ b/zokrates_core/tests/bench/array_if.code @@ -0,0 +1,2 @@ +def main(field[2] a, field[2] b, field condition) -> (field[2]): + return if condition == 1 then a else b fi \ No newline at end of file diff --git a/zokrates_core/tests/bench/array_if.json b/zokrates_core/tests/bench/array_if.json new file mode 100644 index 00000000..2351274a --- /dev/null +++ b/zokrates_core/tests/bench/array_if.json @@ -0,0 +1,24 @@ +{ + "tests": [ + { + "input": { + "values": ["1", "2", "3", "4", "1"] + }, + "output": { + "Ok": { + "values": ["1", "2"] + } + } + }, + { + "input": { + "values": ["1", "2", "3", "4", "2"] + }, + "output": { + "Ok": { + "values": ["3", "4"] + } + } + } + ] +} \ No newline at end of file diff --git a/zokrates_core/tests/integration.rs b/zokrates_core/tests/integration.rs index af824ffc..bfbd11fa 100644 --- a/zokrates_core/tests/integration.rs +++ b/zokrates_core/tests/integration.rs @@ -1,5 +1,6 @@ extern crate serde_json; extern crate zokrates_core; +extern crate zokrates_field; #[macro_use] extern crate serde_derive; @@ -9,4 +10,5 @@ mod utils; zokrates_test! { add, assert_one, + array_if, } diff --git a/zokrates_core/tests/utils/mod.rs b/zokrates_core/tests/utils/mod.rs index b66ce26d..442d4442 100644 --- a/zokrates_core/tests/utils/mod.rs +++ b/zokrates_core/tests/utils/mod.rs @@ -1,9 +1,10 @@ extern crate serde_json; +extern crate zokrates_field; use std::io; use zokrates_core::compile::{compile as generic_compile, CompileError}; -use zokrates_core::field::{Field, FieldPrime}; use zokrates_core::ir; +use zokrates_field::field::{Field, FieldPrime}; #[derive(Serialize, Deserialize)] pub struct Tests { @@ -35,7 +36,7 @@ type Val = String; impl From> for ComparableResult { fn from(r: ir::ExecutionResult) -> ComparableResult { - ComparableResult(r.map(|v| v.return_values())) + ComparableResult(r.map(|v| v.return_values().iter().map(|&x| x.clone()).collect())) } } @@ -90,7 +91,7 @@ macro_rules! zokrates_test { #[test] fn $name() { - use zokrates_core::field::{FieldPrime, Field}; + use zokrates_field::field::{FieldPrime, Field}; let code_string = $crate::utils::read_file(&format!("./{}.code", stringify!($name))); let test_string = $crate::utils::read_file(&format!("./{}.json", stringify!($name)));