1
0
Fork 0
mirror of synced 2025-09-23 12:18:44 +00:00

add tests, fix order of outputs in test runner

This commit is contained in:
schaeff 2019-01-04 15:31:05 +01:00
parent 38be2a4890
commit 9de72fe21e
7 changed files with 76 additions and 9 deletions

View file

@ -1,2 +1,2 @@
def main(field[2] a, field[2] b, field condition) -> (field[2]): def main(field[2] a, field[2] b, field condition) -> (field[2]):
return if condition == 1 then a else [2, 3] fi return if condition == 1 then a else b fi

View file

@ -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] #[test]
fn next_variable() { fn next_variable() {
let mut flattener = Flattener::new(FieldPrime::get_required_bits()); let mut flattener = Flattener::new(FieldPrime::get_required_bits());

View file

@ -8,12 +8,14 @@ pub type ExecutionResult<T> = Result<Witness<T>, Error>;
pub struct Witness<T: Field>(BTreeMap<FlatVariable, T>); pub struct Witness<T: Field>(BTreeMap<FlatVariable, T>);
impl<T: Field> Witness<T> { impl<T: Field> Witness<T> {
pub fn return_values(&self) -> Vec<T> { pub fn return_values(&self) -> Vec<&T> {
self.0 let out = self
.clone() .0
.into_iter() .iter()
.filter(|(k, _)| k.is_output()) .filter(|(k, _)| k.is_output())
.map(|(_, v)| v) .collect::<HashMap<_, _>>();
(0..out.len())
.map(|i| *out.get(&FlatVariable::public(i)).unwrap())
.collect() .collect()
} }

View file

@ -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

View file

@ -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"]
}
}
}
]
}

View file

@ -1,5 +1,6 @@
extern crate serde_json; extern crate serde_json;
extern crate zokrates_core; extern crate zokrates_core;
extern crate zokrates_field;
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
@ -9,4 +10,5 @@ mod utils;
zokrates_test! { zokrates_test! {
add, add,
assert_one, assert_one,
array_if,
} }

View file

@ -1,9 +1,10 @@
extern crate serde_json; extern crate serde_json;
extern crate zokrates_field;
use std::io; use std::io;
use zokrates_core::compile::{compile as generic_compile, CompileError}; use zokrates_core::compile::{compile as generic_compile, CompileError};
use zokrates_core::field::{Field, FieldPrime};
use zokrates_core::ir; use zokrates_core::ir;
use zokrates_field::field::{Field, FieldPrime};
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
pub struct Tests { pub struct Tests {
@ -35,7 +36,7 @@ type Val = String;
impl From<ir::ExecutionResult<FieldPrime>> for ComparableResult { impl From<ir::ExecutionResult<FieldPrime>> for ComparableResult {
fn from(r: ir::ExecutionResult<FieldPrime>) -> ComparableResult { fn from(r: ir::ExecutionResult<FieldPrime>) -> 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] #[test]
fn $name() { 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 code_string = $crate::utils::read_file(&format!("./{}.code", stringify!($name)));
let test_string = $crate::utils::read_file(&format!("./{}.json", stringify!($name))); let test_string = $crate::utils::read_file(&format!("./{}.json", stringify!($name)));