Merge pull request #128 from AleoHQ/rename/input

Migrates Leo 'main' function to require 'input'
This commit is contained in:
Howard Wu 2020-08-02 20:26:27 -07:00 committed by GitHub
commit 0e4ea5c0bd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
239 changed files with 1276 additions and 1123 deletions

View File

@ -94,7 +94,7 @@ jobs:
uses: actions-rs/cargo@v1 uses: actions-rs/cargo@v1
with: with:
command: test command: test
args: --release --all --no-fail-fast args: --release --all --features ci_skip --no-fail-fast
codecov: codecov:
name: Code Coverage name: Code Coverage
@ -123,7 +123,7 @@ jobs:
uses: actions-rs/cargo@v1 uses: actions-rs/cargo@v1
with: with:
command: test command: test
args: --all args: --all --features ci_skip
env: env:
CARGO_NET_GIT_FETCH_WITH_CLI: true CARGO_NET_GIT_FETCH_WITH_CLI: true
CARGO_INCREMENTAL: "0" CARGO_INCREMENTAL: "0"
@ -143,7 +143,7 @@ jobs:
make install DESTDIR=../../kcov-build make install DESTDIR=../../kcov-build
cd ../.. cd ../..
rm -rf kcov-master rm -rf kcov-master
for file in target/debug/deps/*-*; do if [[ "$file" != *\.* ]]; then mkdir -p "target/cov/$(basename $file)"; ./kcov-build/usr/local/bin/kcov --exclude-pattern=/.cargo,/usr/lib --verify "target/cov/$(basename $file)" "$file"; fi done for file in target/debug/deps/*-*; do if [[ "$file" != *\.* ]]; then mkdir -p "target/cov/$(basename $file)"; ./kcov-build/usr/local/bin/kcov --exclude-pattern=/.cargo,/usr/lib --exclude-region='@kcov_skip(start):@kcov_skip(end)' --verify "target/cov/$(basename $file)" "$file"; fi done
- name: Upload coverage to Codecov - name: Upload coverage to Codecov
uses: codecov/codecov-action@v1 uses: codecov/codecov-action@v1

220
Cargo.lock generated
View File

@ -134,6 +134,24 @@ dependencies = [
"byte-tools", "byte-tools",
] ]
[[package]]
name = "bstr"
version = "0.2.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "31accafdb70df7871592c058eca3985b71104e15ac32f64706022c58867da931"
dependencies = [
"lazy_static",
"memchr",
"regex-automata",
"serde",
]
[[package]]
name = "bumpalo"
version = "3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820"
[[package]] [[package]]
name = "byte-tools" name = "byte-tools"
version = "0.3.1" version = "0.3.1"
@ -167,6 +185,15 @@ dependencies = [
"pkg-config", "pkg-config",
] ]
[[package]]
name = "cast"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0"
dependencies = [
"rustc_version",
]
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.0.58" version = "1.0.58"
@ -241,6 +268,42 @@ dependencies = [
"cfg-if", "cfg-if",
] ]
[[package]]
name = "criterion"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70daa7ceec6cf143990669a04c7df13391d55fb27bd4079d252fca774ba244d8"
dependencies = [
"atty",
"cast",
"clap",
"criterion-plot",
"csv",
"itertools 0.9.0",
"lazy_static",
"num-traits",
"oorandom",
"plotters",
"rayon",
"regex",
"serde",
"serde_cbor",
"serde_derive",
"serde_json",
"tinytemplate",
"walkdir",
]
[[package]]
name = "criterion-plot"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e022feadec601fba1649cfa83586381a4ad31c6bf3a9ab7d408118b05dd9889d"
dependencies = [
"cast",
"itertools 0.9.0",
]
[[package]] [[package]]
name = "crossbeam-deque" name = "crossbeam-deque"
version = "0.7.3" version = "0.7.3"
@ -299,6 +362,28 @@ dependencies = [
"subtle", "subtle",
] ]
[[package]]
name = "csv"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "00affe7f6ab566df61b4be3ce8cf16bc2576bca0963ceb0955e45d514bf9a279"
dependencies = [
"bstr",
"csv-core",
"itoa",
"ryu",
"serde",
]
[[package]]
name = "csv-core"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90"
dependencies = [
"memchr",
]
[[package]] [[package]]
name = "derivative" name = "derivative"
version = "2.1.1" version = "2.1.1"
@ -464,6 +549,12 @@ version = "0.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724"
[[package]]
name = "half"
version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d36fab90f82edc3c747f9d438e06cf0a491055896f2a279638bb5beed6c40177"
[[package]] [[package]]
name = "hashbrown" name = "hashbrown"
version = "0.8.1" version = "0.8.1"
@ -531,6 +622,15 @@ version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6" checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6"
[[package]]
name = "js-sys"
version = "0.3.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85a7e2c92a4804dd459b86c339278d0fe87cf93757fae222c3fa3ae75458bc73"
dependencies = [
"wasm-bindgen",
]
[[package]] [[package]]
name = "jsonrpc-core" name = "jsonrpc-core"
version = "14.2.0" version = "14.2.0"
@ -560,7 +660,7 @@ dependencies = [
"from-pest", "from-pest",
"leo-compiler", "leo-compiler",
"leo-gadgets", "leo-gadgets",
"leo-inputs", "leo-input",
"log", "log",
"rand", "rand",
"rand_core", "rand_core",
@ -583,6 +683,7 @@ dependencies = [
name = "leo-ast" name = "leo-ast"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"criterion",
"from-pest", "from-pest",
"lazy_static", "lazy_static",
"log", "log",
@ -602,7 +703,7 @@ dependencies = [
"hex", "hex",
"leo-ast", "leo-ast",
"leo-gadgets", "leo-gadgets",
"leo-inputs", "leo-input",
"leo-types", "leo-types",
"log", "log",
"num-bigint", "num-bigint",
@ -634,7 +735,7 @@ dependencies = [
] ]
[[package]] [[package]]
name = "leo-inputs" name = "leo-input"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"from-pest", "from-pest",
@ -658,7 +759,7 @@ name = "leo-types"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"leo-ast", "leo-ast",
"leo-inputs", "leo-input",
"pest", "pest",
"serde", "serde",
"serde_json", "serde_json",
@ -775,6 +876,12 @@ version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d" checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d"
[[package]]
name = "oorandom"
version = "11.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a170cebd8021a008ea92e4db85a72f80b35df514ec664b296fdcbb654eac0b2c"
[[package]] [[package]]
name = "opaque-debug" name = "opaque-debug"
version = "0.2.3" version = "0.2.3"
@ -849,6 +956,18 @@ version = "0.3.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d36492546b6af1463394d46f0c834346f31548646f6ba10849802c9c9a27ac33" checksum = "d36492546b6af1463394d46f0c834346f31548646f6ba10849802c9c9a27ac33"
[[package]]
name = "plotters"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d1685fbe7beba33de0330629da9d955ac75bd54f33d7b79f9a895590124f6bb"
dependencies = [
"js-sys",
"num-traits",
"wasm-bindgen",
"web-sys",
]
[[package]] [[package]]
name = "podio" name = "podio"
version = "0.1.7" version = "0.1.7"
@ -990,6 +1109,15 @@ dependencies = [
"thread_local", "thread_local",
] ]
[[package]]
name = "regex-automata"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4"
dependencies = [
"byteorder",
]
[[package]] [[package]]
name = "regex-syntax" name = "regex-syntax"
version = "0.6.18" version = "0.6.18"
@ -1068,6 +1196,16 @@ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]]
name = "serde_cbor"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e18acfa2f90e8b735b2836ab8d538de304cbb6729a7360729ea5a895d15a622"
dependencies = [
"half",
"serde",
]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.114" version = "1.0.114"
@ -1392,6 +1530,16 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "tinytemplate"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d3dc76004a03cec1c5932bca4cdc2e39aaa798e3f82363dd94f9adf6098c12f"
dependencies = [
"serde",
"serde_json",
]
[[package]] [[package]]
name = "toml" name = "toml"
version = "0.5.6" version = "0.5.6"
@ -1466,6 +1614,70 @@ version = "0.9.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
[[package]]
name = "wasm-bindgen"
version = "0.2.67"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0563a9a4b071746dd5aedbc3a28c6fe9be4586fb3fbadb67c400d4f53c6b16c"
dependencies = [
"cfg-if",
"wasm-bindgen-macro",
]
[[package]]
name = "wasm-bindgen-backend"
version = "0.2.67"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc71e4c5efa60fb9e74160e89b93353bc24059999c0ae0fb03affc39770310b0"
dependencies = [
"bumpalo",
"lazy_static",
"log",
"proc-macro2 1.0.19",
"quote 1.0.7",
"syn 1.0.36",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-macro"
version = "0.2.67"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97c57cefa5fa80e2ba15641578b44d36e7a64279bc5ed43c6dbaf329457a2ed2"
dependencies = [
"quote 1.0.7",
"wasm-bindgen-macro-support",
]
[[package]]
name = "wasm-bindgen-macro-support"
version = "0.2.67"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "841a6d1c35c6f596ccea1f82504a192a60378f64b3bb0261904ad8f2f5657556"
dependencies = [
"proc-macro2 1.0.19",
"quote 1.0.7",
"syn 1.0.36",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
version = "0.2.67"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93b162580e34310e5931c4b792560108b10fd14d64915d7fff8ff00180e70092"
[[package]]
name = "web-sys"
version = "0.3.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dda38f4e5ca63eda02c059d243aa25b5f35ab98451e518c51612cd0f1bd19a47"
dependencies = [
"js-sys",
"wasm-bindgen",
]
[[package]] [[package]]
name = "winapi" name = "winapi"
version = "0.3.9" version = "0.3.9"

View File

@ -13,12 +13,12 @@ name = "leo"
path = "leo/main.rs" path = "leo/main.rs"
[workspace] [workspace]
members = [ "ast", "compiler", "gadgets", "leo-inputs", "linter", "types" ] members = [ "ast", "compiler", "gadgets", "leo-input", "linter", "types" ]
[dependencies] [dependencies]
leo-compiler = { path = "compiler", version = "0.1.0" } leo-compiler = { path = "compiler", version = "0.1.0" }
leo-gadgets = { path = "gadgets", version = "0.1.0" } leo-gadgets = { path = "gadgets", version = "0.1.0" }
leo-inputs = { path = "leo-inputs", version = "0.1.0" } leo-input = { path = "leo-input", version = "0.1.0" }
snarkos-algorithms = { git = "ssh://git@github.com/AleoHQ/snarkOS.git", package = "snarkos-algorithms", default-features = false } snarkos-algorithms = { git = "ssh://git@github.com/AleoHQ/snarkOS.git", package = "snarkos-algorithms", default-features = false }
snarkos-curves = { git = "ssh://git@github.com/AleoHQ/snarkOS.git", package = "snarkos-curves", default-features = false } snarkos-curves = { git = "ssh://git@github.com/AleoHQ/snarkOS.git", package = "snarkos-curves", default-features = false }
@ -44,6 +44,10 @@ zip = { version = "0.5" }
[dev-dependencies] [dev-dependencies]
rusty-hook = { version = "0.11.2" } rusty-hook = { version = "0.11.2" }
[features]
default = []
ci_skip = ["leo-compiler/ci_skip"]
[profile.release] [profile.release]
opt-level = 3 opt-level = 3
lto = "thin" lto = "thin"

View File

@ -20,3 +20,8 @@ serde_json = { version = "1.0" }
thiserror = { version = "1.0" } thiserror = { version = "1.0" }
[dev-dependencies] [dev-dependencies]
criterion = { version = "0.3" }
[features]
default = []
ci_skip = []

View File

@ -1,6 +1,6 @@
use crate::{ use crate::{
ast::Rule, ast::Rule,
functions::{FunctionInput, Record, Registers, State, StateLeaf}, functions::{FunctionInput, InputKeyword},
}; };
use pest_ast::FromPest; use pest_ast::FromPest;
@ -9,9 +9,6 @@ use serde::Serialize;
#[derive(Clone, Debug, FromPest, PartialEq, Serialize)] #[derive(Clone, Debug, FromPest, PartialEq, Serialize)]
#[pest_ast(rule(Rule::input))] #[pest_ast(rule(Rule::input))]
pub enum Input<'ast> { pub enum Input<'ast> {
InputKeyword(InputKeyword<'ast>),
FunctionInput(FunctionInput<'ast>), FunctionInput(FunctionInput<'ast>),
Record(Record<'ast>),
Registers(Registers<'ast>),
State(State<'ast>),
StateLeaf(StateLeaf<'ast>),
} }

View File

@ -0,0 +1,18 @@
use crate::{
ast::{span_into_string, Rule},
SpanDef,
};
use pest::Span;
use pest_ast::FromPest;
use serde::Serialize;
#[derive(Clone, Debug, FromPest, PartialEq, Serialize)]
#[pest_ast(rule(Rule::input_keyword))]
pub struct InputKeyword<'ast> {
#[pest_ast(outer(with(span_into_string)))]
pub keyword: String,
#[pest_ast(outer())]
#[serde(with = "SpanDef")]
pub span: Span<'ast>,
}

View File

@ -3,3 +3,6 @@ pub use function_input::*;
pub mod input; pub mod input;
pub use input::*; pub use input::*;
pub mod input_keyword;
pub use input_keyword::*;

View File

@ -1,17 +0,0 @@
pub mod function_input;
pub use function_input::*;
pub mod input;
pub use input::*;
pub mod record;
pub use record::*;
pub mod registers;
pub use registers::*;
pub mod state;
pub use state::*;
pub mod state_leaf;
pub use state_leaf::*;

View File

@ -1,13 +0,0 @@
use crate::{ast::Rule, SpanDef};
use pest::Span;
use pest_ast::FromPest;
use serde::Serialize;
#[derive(Clone, Debug, FromPest, PartialEq, Serialize)]
#[pest_ast(rule(Rule::record))]
pub struct Record<'ast> {
#[pest_ast(outer())]
#[serde(with = "SpanDef")]
pub span: Span<'ast>,
}

View File

@ -1,13 +0,0 @@
use crate::{ast::Rule, SpanDef};
use pest::Span;
use pest_ast::FromPest;
use serde::Serialize;
#[derive(Clone, Debug, FromPest, PartialEq, Serialize)]
#[pest_ast(rule(Rule::registers))]
pub struct Registers<'ast> {
#[pest_ast(outer())]
#[serde(with = "SpanDef")]
pub span: Span<'ast>,
}

View File

@ -1,13 +0,0 @@
use crate::{ast::Rule, SpanDef};
use pest::Span;
use pest_ast::FromPest;
use serde::Serialize;
#[derive(Clone, Debug, FromPest, PartialEq, Serialize)]
#[pest_ast(rule(Rule::state))]
pub struct State<'ast> {
#[pest_ast(outer())]
#[serde(with = "SpanDef")]
pub span: Span<'ast>,
}

View File

@ -1,13 +0,0 @@
use crate::{ast::Rule, SpanDef};
use pest::Span;
use pest_ast::FromPest;
use serde::Serialize;
#[derive(Clone, Debug, FromPest, PartialEq, Serialize)]
#[pest_ast(rule(Rule::state_leaf))]
pub struct StateLeaf<'ast> {
#[pest_ast(outer())]
#[serde(with = "SpanDef")]
pub span: Span<'ast>,
}

View File

@ -1,8 +1,8 @@
pub mod function; pub mod function;
pub use function::*; pub use function::*;
pub mod inputs; pub mod input;
pub use inputs::*; pub use input::*;
pub mod test_function; pub mod test_function;
pub use test_function::*; pub use test_function::*;

View File

@ -337,27 +337,15 @@ statement_return = { "return " ~ return_}
// Declared in functions/function.rs // Declared in functions/function.rs
function_definition = { "function " ~ identifier ~ "(" ~ NEWLINE* ~ input_list ~ NEWLINE* ~ ")" ~ ("->" ~ (type_ | "(" ~ type_list ~ ")"))? ~ "{" ~ NEWLINE* ~ statement* ~ NEWLINE* ~ "}" ~ NEWLINE* } function_definition = { "function " ~ identifier ~ "(" ~ NEWLINE* ~ input_list ~ NEWLINE* ~ ")" ~ ("->" ~ (type_ | "(" ~ type_list ~ ")"))? ~ "{" ~ NEWLINE* ~ statement* ~ NEWLINE* ~ "}" ~ NEWLINE* }
// Declared in functions/inputs/function_input.rs // Declared in functions/input/function_input.rs
function_input = { mutable? ~ identifier ~ ":" ~ type_ } function_input = { mutable? ~ identifier ~ ":" ~ type_ }
// Declared in functions/inputs/record.rs // Declared in functions/input/input_keyword.rs
record = { "record" } input_keyword = { "input" }
// Declared in functions/inputs/registers.rs // Declared in functions/input/input.rs
registers = { "registers" }
// Declared in functions/inputs/state.rs
state = { "state" }
// Declared in functions/inputs/state_leaf.rs
state_leaf = { "state_leaf" }
// Declared in functions/inputs/input.rs
input = { input = {
record input_keyword
| registers
| state_leaf
| state
| function_input | function_input
} }
input_list = _{ (input ~ ("," ~ NEWLINE* ~ input)*)? } input_list = _{ (input ~ ("," ~ NEWLINE* ~ input)*)? }

View File

@ -3,7 +3,8 @@ use leo_ast::LeoAst;
use std::path::PathBuf; use std::path::PathBuf;
#[test] #[test]
fn test_serialization() { #[cfg(not(feature = "ci_skip"))]
fn test_serialize() {
let mut program_filepath = PathBuf::from(env!("CARGO_MANIFEST_DIR")); let mut program_filepath = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
program_filepath.push("tests/serialization/main.leo"); program_filepath.push("tests/serialization/main.leo");

View File

@ -7,7 +7,7 @@ edition = "2018"
[dependencies] [dependencies]
leo-ast = { path = "../ast", version = "0.1.0" } leo-ast = { path = "../ast", version = "0.1.0" }
leo-gadgets = { path = "../gadgets", version = "0.1.0" } leo-gadgets = { path = "../gadgets", version = "0.1.0" }
leo-inputs = { path = "../leo-inputs", version = "0.1.0" } leo-input = { path = "../leo-input", version = "0.1.0" }
leo-types = { path = "../types", version = "0.1.0" } leo-types = { path = "../types", version = "0.1.0" }
snarkos-curves = { git = "ssh://git@github.com/AleoHQ/snarkOS.git", package = "snarkos-curves", default-features = false } snarkos-curves = { git = "ssh://git@github.com/AleoHQ/snarkOS.git", package = "snarkos-curves", default-features = false }
@ -29,4 +29,8 @@ sha2 = { version = "0.9" }
thiserror = { version = "1.0" } thiserror = { version = "1.0" }
[dev-dependencies] [dev-dependencies]
num-bigint = { version = "0.3" } num-bigint = { version = "0.3" }
[features]
default = []
ci_skip = ["leo-ast/ci_skip", "leo-types/ci_skip"]

View File

@ -6,11 +6,11 @@ use crate::{
GroupType, GroupType,
ImportParser, ImportParser,
OutputBytes, OutputBytes,
OutputsFile, OutputFile,
}; };
use leo_ast::LeoAst; use leo_ast::LeoAst;
use leo_inputs::LeoInputsParser; use leo_input::LeoInputParser;
use leo_types::{Inputs, LeoTypedAst, MainInputs, Program}; use leo_types::{Input, LeoTypedAst, MainInput, Program};
use snarkos_errors::gadgets::SynthesisError; use snarkos_errors::gadgets::SynthesisError;
use snarkos_models::{ use snarkos_models::{
@ -25,22 +25,22 @@ use std::{fs, marker::PhantomData, path::PathBuf};
pub struct Compiler<F: Field + PrimeField, G: GroupType<F>> { pub struct Compiler<F: Field + PrimeField, G: GroupType<F>> {
package_name: String, package_name: String,
main_file_path: PathBuf, main_file_path: PathBuf,
outputs_directory: PathBuf, output_directory: PathBuf,
program: Program, program: Program,
program_inputs: Inputs, program_input: Input,
imported_programs: ImportParser, imported_programs: ImportParser,
_engine: PhantomData<F>, _engine: PhantomData<F>,
_group: PhantomData<G>, _group: PhantomData<G>,
} }
impl<F: Field + PrimeField, G: GroupType<F>> Compiler<F, G> { impl<F: Field + PrimeField, G: GroupType<F>> Compiler<F, G> {
pub fn new(package_name: String, main_file_path: PathBuf, outputs_directory: PathBuf) -> Self { pub fn new(package_name: String, main_file_path: PathBuf, output_directory: PathBuf) -> Self {
Self { Self {
package_name: package_name.clone(), package_name: package_name.clone(),
main_file_path, main_file_path,
outputs_directory, output_directory,
program: Program::new(package_name), program: Program::new(package_name),
program_inputs: Inputs::new(), program_input: Input::new(),
imported_programs: ImportParser::new(), imported_programs: ImportParser::new(),
_engine: PhantomData, _engine: PhantomData,
_group: PhantomData, _group: PhantomData,
@ -48,25 +48,25 @@ impl<F: Field + PrimeField, G: GroupType<F>> Compiler<F, G> {
} }
/// Parse the input and state files. /// Parse the input and state files.
/// Stores a typed ast of all inputs to the program. /// Stores a typed ast of all input variables to the program.
pub fn parse_inputs(&mut self, inputs_string: &str, state_string: &str) -> Result<(), CompilerError> { pub fn parse_input(&mut self, input_string: &str, state_string: &str) -> Result<(), CompilerError> {
let inputs_syntax_tree = LeoInputsParser::parse_file(&inputs_string)?; let input_syntax_tree = LeoInputParser::parse_file(&input_string)?;
let state_syntax_tree = LeoInputsParser::parse_file(&state_string)?; let state_syntax_tree = LeoInputParser::parse_file(&state_string)?;
self.program_inputs.parse_inputs(inputs_syntax_tree)?; self.program_input.parse_input(input_syntax_tree)?;
self.program_inputs.parse_state(state_syntax_tree)?; self.program_input.parse_state(state_syntax_tree)?;
Ok(()) Ok(())
} }
/// Parses program files. /// Parses program files.
/// Returns a compiler struct that stores the typed program abstract syntax trees (ast). /// Returns a compiler struct that stores the typed program abstract syntax trees (ast).
pub fn parse_program_without_inputs( pub fn parse_program_without_input(
package_name: String, package_name: String,
main_file_path: PathBuf, main_file_path: PathBuf,
outputs_directory: PathBuf, output_directory: PathBuf,
) -> Result<Self, CompilerError> { ) -> Result<Self, CompilerError> {
let mut compiler = Self::new(package_name, main_file_path, outputs_directory); let mut compiler = Self::new(package_name, main_file_path, output_directory);
compiler.parse_program()?; compiler.parse_program()?;
@ -74,24 +74,24 @@ impl<F: Field + PrimeField, G: GroupType<F>> Compiler<F, G> {
} }
/// Parses input, state, and program files. /// Parses input, state, and program files.
/// Returns a compiler struct that stores the typed inputs and typed program abstract syntax trees (ast). /// Returns a compiler struct that stores the typed input and typed program abstract syntax trees (ast).
pub fn parse_program_with_inputs( pub fn parse_program_with_input(
package_name: String, package_name: String,
main_file_path: PathBuf, main_file_path: PathBuf,
outputs_directory: PathBuf, output_directory: PathBuf,
inputs_string: &str, input_string: &str,
state_string: &str, state_string: &str,
) -> Result<Self, CompilerError> { ) -> Result<Self, CompilerError> {
let mut compiler = Self::new(package_name, main_file_path, outputs_directory); let mut compiler = Self::new(package_name, main_file_path, output_directory);
compiler.parse_inputs(inputs_string, state_string)?; compiler.parse_input(input_string, state_string)?;
compiler.parse_program()?; compiler.parse_program()?;
Ok(compiler) Ok(compiler)
} }
/// Parses the Leo program file, constructs a syntax tree, and generates a program. /// Parses the Leo program file, constructs a syntax tree, and generates a program.
pub fn parse_program(&mut self) -> Result<(), CompilerError> { pub(crate) fn parse_program(&mut self) -> Result<(), CompilerError> {
// Use the parser to construct the abstract syntax tree. // Use the parser to construct the abstract syntax tree.
let program_string = LeoAst::load_file(&self.main_file_path)?; let program_string = LeoAst::load_file(&self.main_file_path)?;
@ -119,9 +119,9 @@ impl<F: Field + PrimeField, G: GroupType<F>> Compiler<F, G> {
Ok(()) Ok(())
} }
/// Manually sets main function inputs /// Manually sets main function input
pub fn set_main_inputs(&mut self, inputs: MainInputs) { pub fn set_main_input(&mut self, input: MainInput) {
self.program_inputs.set_main_inputs(inputs); self.program_input.set_main_input(input);
} }
pub fn checksum(&self) -> Result<String, CompilerError> { pub fn checksum(&self) -> Result<String, CompilerError> {
@ -137,21 +137,21 @@ impl<F: Field + PrimeField, G: GroupType<F>> Compiler<F, G> {
Ok(hex::encode(hash)) Ok(hex::encode(hash))
} }
/// Synthesizes the circuit without program inputs to verify correctness. /// Synthesizes the circuit without program input to verify correctness.
pub fn compile_constraints<CS: ConstraintSystem<F>>(self, cs: &mut CS) -> Result<OutputBytes, CompilerError> { pub fn compile_constraints<CS: ConstraintSystem<F>>(self, cs: &mut CS) -> Result<OutputBytes, CompilerError> {
let path = self.main_file_path; let path = self.main_file_path;
let inputs = self.program_inputs.empty(); let input = self.program_input.empty();
generate_constraints::<F, G, CS>(cs, self.program, inputs, &self.imported_programs).map_err(|mut error| { generate_constraints::<F, G, CS>(cs, self.program, input, &self.imported_programs).map_err(|mut error| {
error.set_path(path); error.set_path(path);
error error
}) })
} }
/// Synthesizes the circuit for test functions with program inputs. /// Synthesizes the circuit for test functions with program input.
pub fn compile_test_constraints(self, cs: &mut TestConstraintSystem<F>) -> Result<(), CompilerError> { pub fn compile_test_constraints(self, cs: &mut TestConstraintSystem<F>) -> Result<(), CompilerError> {
generate_test_constraints::<F, G>(cs, self.program, self.program_inputs, &self.imported_programs) generate_test_constraints::<F, G>(cs, self.program, self.program_input, &self.imported_programs)
} }
/// Calls the internal generate_constraints method with arguments /// Calls the internal generate_constraints method with arguments
@ -160,7 +160,7 @@ impl<F: Field + PrimeField, G: GroupType<F>> Compiler<F, G> {
cs: &mut CS, cs: &mut CS,
) -> Result<OutputBytes, CompilerError> { ) -> Result<OutputBytes, CompilerError> {
let path = self.main_file_path; let path = self.main_file_path;
generate_constraints::<_, G, _>(cs, self.program, self.program_inputs, &self.imported_programs).map_err( generate_constraints::<_, G, _>(cs, self.program, self.program_input, &self.imported_programs).map_err(
|mut error| { |mut error| {
error.set_path(path); error.set_path(path);
error error
@ -174,14 +174,14 @@ impl<F: Field + PrimeField, G: GroupType<F>> Compiler<F, G> {
pub fn from_bytes(bytes: &[u8]) -> Result<Self, CompilerError> { pub fn from_bytes(bytes: &[u8]) -> Result<Self, CompilerError> {
let program: Program = bincode::deserialize(bytes)?; let program: Program = bincode::deserialize(bytes)?;
let program_inputs = Inputs::new(); let program_input = Input::new();
Ok(Self { Ok(Self {
package_name: program.name.clone(), package_name: program.name.clone(),
main_file_path: PathBuf::new(), main_file_path: PathBuf::new(),
outputs_directory: PathBuf::new(), output_directory: PathBuf::new(),
program, program,
program_inputs, program_input,
imported_programs: ImportParser::new(), imported_programs: ImportParser::new(),
_engine: PhantomData, _engine: PhantomData,
_group: PhantomData, _group: PhantomData,
@ -190,9 +190,9 @@ impl<F: Field + PrimeField, G: GroupType<F>> Compiler<F, G> {
} }
impl<F: Field + PrimeField, G: GroupType<F>> ConstraintSynthesizer<F> for Compiler<F, G> { impl<F: Field + PrimeField, G: GroupType<F>> ConstraintSynthesizer<F> for Compiler<F, G> {
/// Synthesizes the circuit with program inputs. /// Synthesizes the circuit with program input.
fn generate_constraints<CS: ConstraintSystem<F>>(self, cs: &mut CS) -> Result<(), SynthesisError> { fn generate_constraints<CS: ConstraintSystem<F>>(self, cs: &mut CS) -> Result<(), SynthesisError> {
let outputs_directory = self.outputs_directory.clone(); let output_directory = self.output_directory.clone();
let package_name = self.package_name.clone(); let package_name = self.package_name.clone();
let result = self.generate_constraints_helper(cs).map_err(|e| { let result = self.generate_constraints_helper(cs).map_err(|e| {
log::error!("{}", e); log::error!("{}", e);
@ -202,8 +202,8 @@ impl<F: Field + PrimeField, G: GroupType<F>> ConstraintSynthesizer<F> for Compil
log::info!("Program circuit successfully synthesized!"); log::info!("Program circuit successfully synthesized!");
// Write results to file // Write results to file
let outputs_file = OutputsFile::new(&package_name); let output_file = OutputFile::new(&package_name);
outputs_file.write(&outputs_directory, result.bytes()).unwrap(); output_file.write(&output_directory, result.bytes()).unwrap();
Ok(()) Ok(())
} }

View File

@ -9,7 +9,7 @@ use crate::{
ImportParser, ImportParser,
OutputBytes, OutputBytes,
}; };
use leo_types::{Inputs, Program}; use leo_types::{Input, Program};
use snarkos_models::{ use snarkos_models::{
curves::{Field, PrimeField}, curves::{Field, PrimeField},
@ -19,7 +19,7 @@ use snarkos_models::{
pub fn generate_constraints<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>( pub fn generate_constraints<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>(
cs: &mut CS, cs: &mut CS,
program: Program, program: Program,
inputs: Inputs, input: Input,
imported_programs: &ImportParser, imported_programs: &ImportParser,
) -> Result<OutputBytes, CompilerError> { ) -> Result<OutputBytes, CompilerError> {
let mut resolved_program = ConstrainedProgram::<F, G>::new(); let mut resolved_program = ConstrainedProgram::<F, G>::new();
@ -34,7 +34,7 @@ pub fn generate_constraints<F: Field + PrimeField, G: GroupType<F>, CS: Constrai
match main.clone() { match main.clone() {
ConstrainedValue::Function(_circuit_identifier, function) => { ConstrainedValue::Function(_circuit_identifier, function) => {
let result = resolved_program.enforce_main_function(cs, program_name, function, inputs)?; let result = resolved_program.enforce_main_function(cs, program_name, function, input)?;
Ok(result) Ok(result)
} }
_ => Err(CompilerError::NoMainFunction), _ => Err(CompilerError::NoMainFunction),
@ -44,7 +44,7 @@ pub fn generate_constraints<F: Field + PrimeField, G: GroupType<F>, CS: Constrai
pub fn generate_test_constraints<F: Field + PrimeField, G: GroupType<F>>( pub fn generate_test_constraints<F: Field + PrimeField, G: GroupType<F>>(
cs: &mut TestConstraintSystem<F>, cs: &mut TestConstraintSystem<F>,
program: Program, program: Program,
inputs: Inputs, input: Input,
imported_programs: &ImportParser, imported_programs: &ImportParser,
) -> Result<(), CompilerError> { ) -> Result<(), CompilerError> {
let mut resolved_program = ConstrainedProgram::<F, G>::new(); let mut resolved_program = ConstrainedProgram::<F, G>::new();
@ -63,7 +63,7 @@ pub fn generate_test_constraints<F: Field + PrimeField, G: GroupType<F>>(
cs, cs,
program_name.clone(), program_name.clone(),
test_function.0, test_function.0,
inputs.clone(), // pass program inputs into every test input.clone(), // pass program input into every test
); );
if result.is_ok() { if result.is_ok() {

View File

@ -1,6 +1,6 @@
use crate::errors::{FunctionError, ImportError, OutputBytesError, OutputsFileError}; use crate::errors::{FunctionError, ImportError, OutputBytesError, OutputFileError};
use leo_ast::ParserError; use leo_ast::ParserError;
use leo_inputs::InputParserError; use leo_input::InputParserError;
use bincode::Error as SerdeError; use bincode::Error as SerdeError;
use std::path::PathBuf; use std::path::PathBuf;
@ -26,7 +26,7 @@ pub enum CompilerError {
NoMainFunction, NoMainFunction,
#[error("{}", _0)] #[error("{}", _0)]
OutputError(#[from] OutputsFileError), OutputError(#[from] OutputFileError),
#[error("{}", _0)] #[error("{}", _0)]
OutputStringError(#[from] OutputBytesError), OutputStringError(#[from] OutputBytesError),

View File

@ -67,7 +67,7 @@ impl FunctionError {
} }
pub fn arguments_length(expected: usize, actual: usize, span: Span) -> Self { pub fn arguments_length(expected: usize, actual: usize, span: Span) -> Self {
let message = format!("function expected {} inputs, found {} inputs", expected, actual); let message = format!("function expected {} input variables, found {}", expected, actual);
Self::new_from_span(message, span) Self::new_from_span(message, span)
} }

View File

@ -1,7 +1,7 @@
use std::{io, path::PathBuf}; use std::{io, path::PathBuf};
#[derive(Debug, Error)] #[derive(Debug, Error)]
pub enum OutputsFileError { pub enum OutputFileError {
#[error("{}: {}", _0, _1)] #[error("{}: {}", _0, _1)]
Crate(&'static str, String), Crate(&'static str, String),
@ -15,8 +15,8 @@ pub enum OutputsFileError {
Writing(io::Error), Writing(io::Error),
} }
impl From<std::io::Error> for OutputsFileError { impl From<std::io::Error> for OutputFileError {
fn from(error: std::io::Error) -> Self { fn from(error: std::io::Error) -> Self {
OutputsFileError::Crate("std::io", format!("{}", error)) OutputFileError::Crate("std::io", format!("{}", error))
} }
} }

View File

@ -7,7 +7,7 @@ use crate::{
GroupType, GroupType,
}; };
use leo_types::{Expression, Function, Input, Span}; use leo_types::{Expression, Function, InputVariable, Span};
use snarkos_models::{ use snarkos_models::{
curves::{Field, PrimeField}, curves::{Field, PrimeField},
@ -30,19 +30,31 @@ impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
scope: String, scope: String,
caller_scope: String, caller_scope: String,
function: Function, function: Function,
inputs: Vec<Expression>, input: Vec<Expression>,
) -> Result<ConstrainedValue<F, G>, FunctionError> { ) -> Result<ConstrainedValue<F, G>, FunctionError> {
let function_name = new_scope(scope.clone(), function.get_name()); let function_name = new_scope(scope.clone(), function.get_name());
// Make sure we are given the correct number of inputs // Make sure we are given the correct number of input variables
check_arguments_length(function.inputs.len(), inputs.len(), function.span.clone())?; check_arguments_length(function.input.len(), input.len(), function.span.clone())?;
// Store input values as new variables in resolved program // Store input values as new variables in resolved program
for (input_model, input_expression) in function.inputs.clone().iter().zip(inputs.into_iter()) { for (input_model, input_expression) in function.input.clone().iter().zip(input.into_iter()) {
let (name, value) = match input_model { let (name, value) = match input_model {
Input::FunctionInput(input_model) => { InputVariable::InputKeyword(identifier) => {
let input_value = self.enforce_function_input(
cs,
scope.clone(),
caller_scope.clone(),
function_name.clone(),
vec![],
input_expression,
)?;
(identifier.name.clone(), input_value)
}
InputVariable::FunctionInput(input_model) => {
// First evaluate input expression // First evaluate input expression
let mut input_value = self.enforce_input( let mut input_value = self.enforce_function_input(
cs, cs,
scope.clone(), scope.clone(),
caller_scope.clone(), caller_scope.clone(),
@ -57,54 +69,6 @@ impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
(input_model.identifier.name.clone(), input_value) (input_model.identifier.name.clone(), input_value)
} }
Input::Registers(identifier) => {
let input_value = self.enforce_input(
cs,
scope.clone(),
caller_scope.clone(),
function_name.clone(),
vec![],
input_expression,
)?;
(identifier.name.clone(), input_value)
}
Input::Record(identifier) => {
let input_value = self.enforce_input(
cs,
scope.clone(),
caller_scope.clone(),
function_name.clone(),
vec![],
input_expression,
)?;
(identifier.name.clone(), input_value)
}
Input::State(identifier) => {
let input_value = self.enforce_input(
cs,
scope.clone(),
caller_scope.clone(),
function_name.clone(),
vec![],
input_expression,
)?;
(identifier.name.clone(), input_value)
}
Input::StateLeaf(identifier) => {
let input_value = self.enforce_input(
cs,
scope.clone(),
caller_scope.clone(),
function_name.clone(),
vec![],
input_expression,
)?;
(identifier.name.clone(), input_value)
}
}; };
// Store input as variable with {function_name}_{input_name} // Store input as variable with {function_name}_{input_name}

View File

@ -10,7 +10,7 @@ use snarkos_models::{
}; };
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
pub fn enforce_input<CS: ConstraintSystem<F>>( pub fn enforce_function_input<CS: ConstraintSystem<F>>(
&mut self, &mut self,
cs: &mut CS, cs: &mut CS,
scope: String, scope: String,

View File

@ -0,0 +1,71 @@
use crate::{errors::FunctionError, ConstrainedCircuitMember, ConstrainedProgram, ConstrainedValue, GroupType};
use leo_types::{Identifier, Input};
use snarkos_models::{
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
pub const RECORD_VARIABLE_NAME: &str = "record";
pub const REGISTERS_VARIABLE_NAME: &str = "registers";
pub const STATE_VARIABLE_NAME: &str = "state";
pub const STATE_LEAF_VARIABLE_NAME: &str = "state_leaf";
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
pub fn allocate_input_keyword<CS: ConstraintSystem<F>>(
&mut self,
cs: &mut CS,
identifier: Identifier,
input: &Input,
) -> Result<ConstrainedValue<F, G>, FunctionError> {
// Create an identifier for each input variable
let registers_name = Identifier {
name: REGISTERS_VARIABLE_NAME.to_string(),
span: identifier.span.clone(),
};
let record_name = Identifier {
name: RECORD_VARIABLE_NAME.to_string(),
span: identifier.span.clone(),
};
let state_name = Identifier {
name: STATE_VARIABLE_NAME.to_string(),
span: identifier.span.clone(),
};
let state_leaf_name = Identifier {
name: STATE_LEAF_VARIABLE_NAME.to_string(),
span: identifier.span.clone(),
};
// Fetch each input variable's definitions
let registers_values = input.get_registers().values();
let record_values = input.get_record().values();
let state_values = input.get_state().values();
let state_leaf_values = input.get_state_leaf().values();
// Allocate each input variable as a circuit expression
let mut sections = vec![];
sections.push((registers_name, registers_values));
sections.push((record_name, record_values));
sections.push((state_name, state_values));
sections.push((state_leaf_name, state_leaf_values));
let mut members = vec![];
for (name, values) in sections {
let member_name = name.clone();
let member_value = self.allocate_input_section(cs, name, values)?;
let member = ConstrainedCircuitMember(member_name, member_value);
members.push(member)
}
// Return input variable keyword as circuit expression
Ok(ConstrainedValue::CircuitExpression(identifier, members))
}
}

View File

@ -16,7 +16,8 @@ impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
) -> Result<ConstrainedValue<F, G>, FunctionError> { ) -> Result<ConstrainedValue<F, G>, FunctionError> {
let mut members = vec![]; let mut members = vec![];
// Store each section definition as a circuit member value // Allocate each section definition as a circuit member value
for (parameter, option) in section.into_iter() { for (parameter, option) in section.into_iter() {
let member_name = parameter.variable.clone(); let member_name = parameter.variable.clone();
let member_value = self.allocate_main_function_input( let member_value = self.allocate_main_function_input(
@ -32,6 +33,7 @@ impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
} }
// Return section as circuit expression // Return section as circuit expression
Ok(ConstrainedValue::CircuitExpression(identifier, members)) Ok(ConstrainedValue::CircuitExpression(identifier, members))
} }
} }

View File

@ -1,13 +1,16 @@
//! Methods to enforce function inputs in a compiled Leo program. //! Methods to enforce function input variables in a compiled Leo program.
pub mod array; pub mod array;
pub use self::array::*; pub use self::array::*;
pub mod input; pub mod function_input;
pub use self::input::*; pub use self::function_input::*;
pub mod main_input; pub mod main_function_input;
pub use self::main_input::*; pub use self::main_function_input::*;
pub mod section; pub mod input_keyword;
pub use self::section::*; pub use self::input_keyword::*;
pub mod input_section;
pub use self::input_section::*;

View File

@ -7,7 +7,7 @@ use crate::{
OutputBytes, OutputBytes,
}; };
use leo_types::{Expression, Function, Input, Inputs}; use leo_types::{Expression, Function, Input, InputVariable};
use snarkos_models::{ use snarkos_models::{
curves::{Field, PrimeField}, curves::{Field, PrimeField},
@ -20,18 +20,23 @@ impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
cs: &mut CS, cs: &mut CS,
scope: String, scope: String,
function: Function, function: Function,
inputs: Inputs, input: Input,
) -> Result<OutputBytes, FunctionError> { ) -> Result<OutputBytes, FunctionError> {
let function_name = new_scope(scope.clone(), function.get_name()); let function_name = new_scope(scope.clone(), function.get_name());
let registers = inputs.get_registers(); let registers = input.get_registers();
// Iterate over main function inputs and allocate new passed-by variable values // Iterate over main function input variables and allocate new values
let mut input_variables = vec![]; let mut input_variables = vec![];
for input_model in function.inputs.clone().into_iter() { for input_model in function.input.clone().into_iter() {
let (identifier, value) = match input_model { let (identifier, value) = match input_model {
Input::FunctionInput(input_model) => { InputVariable::InputKeyword(identifier) => {
let value = self.allocate_input_keyword(cs, identifier.clone(), &input)?;
(identifier, value)
}
InputVariable::FunctionInput(input_model) => {
let name = input_model.identifier.name.clone(); let name = input_model.identifier.name.clone();
let input_option = inputs let input_option = input
.get(&name) .get(&name)
.ok_or(FunctionError::input_not_found(name.clone(), function.span.clone()))?; .ok_or(FunctionError::input_not_found(name.clone(), function.span.clone()))?;
let input_value = self.allocate_main_function_input( let input_value = self.allocate_main_function_input(
@ -44,30 +49,6 @@ impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
(input_model.identifier, input_value) (input_model.identifier, input_value)
} }
Input::Registers(identifier) => {
let section = inputs.get_registers().values();
let value = self.allocate_input_section(cs, identifier.clone(), section)?;
(identifier, value)
}
Input::Record(identifier) => {
let section = inputs.get_record().values();
let value = self.allocate_input_section(cs, identifier.clone(), section)?;
(identifier, value)
}
Input::State(identifier) => {
let section = inputs.get_state().values();
let value = self.allocate_input_section(cs, identifier.clone(), section)?;
(identifier, value)
}
Input::StateLeaf(identifier) => {
let section = inputs.get_state_leaf().values();
let value = self.allocate_input_section(cs, identifier.clone(), section)?;
(identifier, value)
}
}; };
// Store input as variable with {function_name}_{identifier_name} // Store input as variable with {function_name}_{identifier_name}

View File

@ -1,5 +1,5 @@
use crate::{errors::OutputBytesError, ConstrainedValue, GroupType}; use crate::{errors::OutputBytesError, ConstrainedValue, GroupType, REGISTERS_VARIABLE_NAME};
use leo_types::{Parameter, Registers, Span, REGISTERS_VARIABLE_NAME}; use leo_types::{Parameter, Registers, Span};
use snarkos_models::curves::{Field, PrimeField}; use snarkos_models::curves::{Field, PrimeField};

View File

@ -1,6 +1,6 @@
//! The `program.out` file. //! The `program.out` file.
use crate::errors::OutputsFileError; use crate::errors::OutputFileError;
use std::{ use std::{
fs::{self, File}, fs::{self, File},
@ -8,14 +8,14 @@ use std::{
path::PathBuf, path::PathBuf,
}; };
pub static OUTPUTS_DIRECTORY_NAME: &str = "outputs/"; pub static OUTPUT_DIRECTORY_NAME: &str = "output/";
pub static OUTPUTS_FILE_EXTENSION: &str = ".out"; pub static OUTPUT_FILE_EXTENSION: &str = ".out";
pub struct OutputsFile { pub struct OutputFile {
pub package_name: String, pub package_name: String,
} }
impl OutputsFile { impl OutputFile {
pub fn new(package_name: &str) -> Self { pub fn new(package_name: &str) -> Self {
Self { Self {
package_name: package_name.to_string(), package_name: package_name.to_string(),
@ -27,21 +27,19 @@ impl OutputsFile {
path.exists() path.exists()
} }
/// Reads the outputs from the given file path if it exists. /// Reads the output register variables from the given file path if it exists.
pub fn read_from(&self, path: &PathBuf) -> Result<String, OutputsFileError> { pub fn read_from(&self, path: &PathBuf) -> Result<String, OutputFileError> {
let path = self.setup_file_path(path); let path = self.setup_file_path(path);
let inputs = fs::read_to_string(&path).map_err(|_| OutputsFileError::FileReadError(path.clone()))?; let output = fs::read_to_string(&path).map_err(|_| OutputFileError::FileReadError(path.clone()))?;
Ok(inputs) Ok(output)
} }
/// Writes output to a file. /// Writes output to a file.
pub fn write(&self, path: &PathBuf, bytes: &[u8]) -> Result<(), OutputsFileError> { pub fn write(&self, path: &PathBuf, bytes: &[u8]) -> Result<(), OutputFileError> {
// create output file // create output file
let path = self.setup_file_path(path); let path = self.setup_file_path(path);
println!("setup {:?}", path);
let mut file = File::create(&path)?; let mut file = File::create(&path)?;
println!("created");
log::info!("Writing to output registers..."); log::info!("Writing to output registers...");
Ok(file.write_all(bytes)?) Ok(file.write_all(bytes)?)
@ -50,13 +48,10 @@ impl OutputsFile {
fn setup_file_path(&self, path: &PathBuf) -> PathBuf { fn setup_file_path(&self, path: &PathBuf) -> PathBuf {
let mut path = path.to_owned(); let mut path = path.to_owned();
if path.is_dir() { if path.is_dir() {
if !path.ends_with(OUTPUTS_DIRECTORY_NAME) { if !path.ends_with(OUTPUT_DIRECTORY_NAME) {
path.push(PathBuf::from(OUTPUTS_DIRECTORY_NAME)); path.push(PathBuf::from(OUTPUT_DIRECTORY_NAME));
} }
path.push(PathBuf::from(format!( path.push(PathBuf::from(format!("{}{}", self.package_name, OUTPUT_FILE_EXTENSION)));
"{}{}",
self.package_name, OUTPUTS_FILE_EXTENSION
)));
} }
path path
} }

View File

@ -1,4 +1,4 @@
use crate::{assert_satisfied, expect_compiler_error, generate_main_inputs, parse_program}; use crate::{assert_satisfied, expect_compiler_error, generate_main_input, parse_program};
use leo_types::InputValue; use leo_types::InputValue;
static TEST_ADDRESS_1: &'static str = "aleo1qnr4dkkvkgfqph0vzc3y6z2eu975wnpz2925ntjccd5cfqxtyu8sta57j8"; static TEST_ADDRESS_1: &'static str = "aleo1qnr4dkkvkgfqph0vzc3y6z2eu975wnpz2925ntjccd5cfqxtyu8sta57j8";
@ -57,23 +57,23 @@ fn test_ternary() {
let bytes = include_bytes!("ternary.leo"); let bytes = include_bytes!("ternary.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("s", Some(InputValue::Boolean(true))), ("s", Some(InputValue::Boolean(true))),
("c", Some(InputValue::Address(TEST_ADDRESS_1.to_string()))), ("c", Some(InputValue::Address(TEST_ADDRESS_1.to_string()))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("s", Some(InputValue::Boolean(false))), ("s", Some(InputValue::Boolean(false))),
("c", Some(InputValue::Address(TEST_ADDRESS_2.to_string()))), ("c", Some(InputValue::Address(TEST_ADDRESS_2.to_string()))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
} }
@ -83,25 +83,25 @@ fn test_equal() {
let bytes = include_bytes!("equal.leo"); let bytes = include_bytes!("equal.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Address(TEST_ADDRESS_1.to_string()))), ("a", Some(InputValue::Address(TEST_ADDRESS_1.to_string()))),
("b", Some(InputValue::Address(TEST_ADDRESS_1.to_string()))), ("b", Some(InputValue::Address(TEST_ADDRESS_1.to_string()))),
("c", Some(InputValue::Boolean(true))), ("c", Some(InputValue::Boolean(true))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Address(TEST_ADDRESS_1.to_string()))), ("a", Some(InputValue::Address(TEST_ADDRESS_1.to_string()))),
("b", Some(InputValue::Address(TEST_ADDRESS_2.to_string()))), ("b", Some(InputValue::Address(TEST_ADDRESS_2.to_string()))),
("c", Some(InputValue::Boolean(false))), ("c", Some(InputValue::Boolean(false))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
} }

View File

@ -1,22 +1,22 @@
use crate::{ use crate::{
assert_satisfied, assert_satisfied,
expect_compiler_error, expect_compiler_error,
get_outputs, get_output,
parse_program, parse_program,
parse_program_with_inputs, parse_program_with_input,
EdwardsTestCompiler, EdwardsTestCompiler,
}; };
pub fn output_ones(program: EdwardsTestCompiler) { pub fn output_ones(program: EdwardsTestCompiler) {
let expected = include_bytes!("outputs_/registers_ones.out"); let expected = include_bytes!("output_/registers_ones.out");
let actual = get_outputs(program); let actual = get_output(program);
assert!(expected.eq(actual.bytes().as_slice())); assert!(expected.eq(actual.bytes().as_slice()));
} }
pub fn output_zeros(program: EdwardsTestCompiler) { pub fn output_zeros(program: EdwardsTestCompiler) {
let expected = include_bytes!("outputs_/registers_zeros.out"); let expected = include_bytes!("output_/registers_zeros.out");
let actual = get_outputs(program); let actual = get_output(program);
assert!(expected.eq(actual.bytes().as_slice())); assert!(expected.eq(actual.bytes().as_slice()));
} }
@ -26,16 +26,16 @@ pub fn output_zeros(program: EdwardsTestCompiler) {
#[test] #[test]
fn test_registers() { fn test_registers() {
let program_bytes = include_bytes!("registers.leo"); let program_bytes = include_bytes!("registers.leo");
let ones_input_bytes = include_bytes!("inputs/registers_ones.in"); let ones_input_bytes = include_bytes!("input/registers_ones.in");
let zeros_input_bytes = include_bytes!("inputs/registers_zeros.in"); let zeros_input_bytes = include_bytes!("input/registers_zeros.in");
// test ones input register => ones output register // test ones input register => ones output register
let program = parse_program_with_inputs(program_bytes, ones_input_bytes).unwrap(); let program = parse_program_with_input(program_bytes, ones_input_bytes).unwrap();
output_ones(program); output_ones(program);
// test zeros input register => zeros output register // test zeros input register => zeros output register
let program = parse_program_with_inputs(program_bytes, zeros_input_bytes).unwrap(); let program = parse_program_with_input(program_bytes, zeros_input_bytes).unwrap();
output_zeros(program); output_zeros(program);
} }
@ -45,8 +45,8 @@ fn test_registers() {
#[test] #[test]
fn test_inline() { fn test_inline() {
let program_bytes = include_bytes!("inline.leo"); let program_bytes = include_bytes!("inline.leo");
let input_bytes = include_bytes!("inputs/three_ones.in"); let input_bytes = include_bytes!("input/three_ones.in");
let program = parse_program_with_inputs(program_bytes, input_bytes).unwrap(); let program = parse_program_with_input(program_bytes, input_bytes).unwrap();
assert_satisfied(program); assert_satisfied(program);
} }
@ -62,8 +62,8 @@ fn test_inline_fail() {
#[test] #[test]
fn test_initializer() { fn test_initializer() {
let program_bytes = include_bytes!("initializer.leo"); let program_bytes = include_bytes!("initializer.leo");
let input_bytes = include_bytes!("inputs/three_ones.in"); let input_bytes = include_bytes!("input/three_ones.in");
let program = parse_program_with_inputs(program_bytes, input_bytes).unwrap(); let program = parse_program_with_input(program_bytes, input_bytes).unwrap();
assert_satisfied(program); assert_satisfied(program);
} }
@ -71,8 +71,8 @@ fn test_initializer() {
#[test] #[test]
fn test_spread() { fn test_spread() {
let program_bytes = include_bytes!("spread.leo"); let program_bytes = include_bytes!("spread.leo");
let input_bytes = include_bytes!("inputs/three_ones.in"); let input_bytes = include_bytes!("input/three_ones.in");
let program = parse_program_with_inputs(program_bytes, input_bytes).unwrap(); let program = parse_program_with_input(program_bytes, input_bytes).unwrap();
assert_satisfied(program); assert_satisfied(program);
} }
@ -80,8 +80,8 @@ fn test_spread() {
#[test] #[test]
fn test_slice() { fn test_slice() {
let program_bytes = include_bytes!("slice.leo"); let program_bytes = include_bytes!("slice.leo");
let input_bytes = include_bytes!("inputs/three_ones.in"); let input_bytes = include_bytes!("input/three_ones.in");
let program = parse_program_with_inputs(program_bytes, input_bytes).unwrap(); let program = parse_program_with_input(program_bytes, input_bytes).unwrap();
assert_satisfied(program); assert_satisfied(program);
} }

View File

@ -1,3 +1,3 @@
function main(registers) -> u8[3] { function main(input) -> u8[3] {
return registers.r return input.registers.r
} }

View File

@ -2,23 +2,23 @@ use crate::{
assert_satisfied, assert_satisfied,
expect_compiler_error, expect_compiler_error,
expect_synthesis_error, expect_synthesis_error,
get_outputs, get_output,
parse_program, parse_program,
parse_program_with_inputs, parse_program_with_input,
EdwardsTestCompiler, EdwardsTestCompiler,
}; };
use leo_compiler::errors::{BooleanError, CompilerError, ExpressionError, FunctionError, StatementError}; use leo_compiler::errors::{BooleanError, CompilerError, ExpressionError, FunctionError, StatementError};
pub fn output_true(program: EdwardsTestCompiler) { pub fn output_true(program: EdwardsTestCompiler) {
let expected = include_bytes!("outputs_/registers_true.out"); let expected = include_bytes!("output_/registers_true.out");
let actual = get_outputs(program); let actual = get_output(program);
assert_eq!(expected, actual.bytes().as_slice()); assert_eq!(expected, actual.bytes().as_slice());
} }
pub fn output_false(program: EdwardsTestCompiler) { pub fn output_false(program: EdwardsTestCompiler) {
let expected = include_bytes!("outputs_/registers_false.out"); let expected = include_bytes!("output_/registers_false.out");
let actual = get_outputs(program); let actual = get_output(program);
assert_eq!(expected, actual.bytes().as_slice()); assert_eq!(expected, actual.bytes().as_slice());
} }
@ -35,9 +35,9 @@ fn fail_boolean_statement(program: EdwardsTestCompiler) {
#[test] #[test]
fn test_input_pass() { fn test_input_pass() {
let program_bytes = include_bytes!("assert_eq_input.leo"); let program_bytes = include_bytes!("assert_eq_input.leo");
let input_bytes = include_bytes!("inputs/true_true.in"); let input_bytes = include_bytes!("input/true_true.in");
let program = parse_program_with_inputs(program_bytes, input_bytes).unwrap(); let program = parse_program_with_input(program_bytes, input_bytes).unwrap();
assert_satisfied(program); assert_satisfied(program);
} }
@ -45,9 +45,9 @@ fn test_input_pass() {
#[test] #[test]
fn test_input_fail() { fn test_input_fail() {
let program_bytes = include_bytes!("assert_eq_input.leo"); let program_bytes = include_bytes!("assert_eq_input.leo");
let input_bytes = include_bytes!("inputs/true_false.in"); let input_bytes = include_bytes!("input/true_false.in");
let program = parse_program_with_inputs(program_bytes, input_bytes).unwrap(); let program = parse_program_with_input(program_bytes, input_bytes).unwrap();
expect_synthesis_error(program); expect_synthesis_error(program);
} }
@ -55,16 +55,16 @@ fn test_input_fail() {
#[test] #[test]
fn test_registers() { fn test_registers() {
let program_bytes = include_bytes!("output_register.leo"); let program_bytes = include_bytes!("output_register.leo");
let true_input_bytes = include_bytes!("inputs/registers_true.in"); let true_input_bytes = include_bytes!("input/registers_true.in");
let false_input_bytes = include_bytes!("inputs/registers_false.in"); let false_input_bytes = include_bytes!("input/registers_false.in");
// test true input register => true output register // test true input register => true output register
let program = parse_program_with_inputs(program_bytes, true_input_bytes).unwrap(); let program = parse_program_with_input(program_bytes, true_input_bytes).unwrap();
output_true(program); output_true(program);
// test false input register => false output register // test false input register => false output register
let program = parse_program_with_inputs(program_bytes, false_input_bytes).unwrap(); let program = parse_program_with_input(program_bytes, false_input_bytes).unwrap();
output_false(program); output_false(program);
} }

View File

@ -1,3 +1,3 @@
function main(registers) -> bool { function main(input) -> bool {
return registers.r return input.registers.r
} }

View File

@ -1,4 +1,4 @@
use crate::{assert_satisfied, expect_synthesis_error, generate_main_inputs, parse_program}; use crate::{assert_satisfied, expect_synthesis_error, generate_main_input, parse_program};
use leo_types::InputValue; use leo_types::InputValue;
use snarkos_curves::edwards_bls12::Fq; use snarkos_curves::edwards_bls12::Fq;
@ -41,13 +41,13 @@ fn test_add() {
let bytes = include_bytes!("add.leo"); let bytes = include_bytes!("add.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Field(a_string))), ("a", Some(InputValue::Field(a_string))),
("b", Some(InputValue::Field(b_string))), ("b", Some(InputValue::Field(b_string))),
("c", Some(InputValue::Field(c_string))), ("c", Some(InputValue::Field(c_string))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program) assert_satisfied(program)
} }
@ -71,12 +71,12 @@ fn test_sub() {
let bytes = include_bytes!("sub.leo"); let bytes = include_bytes!("sub.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Field(a_string))), ("a", Some(InputValue::Field(a_string))),
("b", Some(InputValue::Field(b_string))), ("b", Some(InputValue::Field(b_string))),
("c", Some(InputValue::Field(c_string))), ("c", Some(InputValue::Field(c_string))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program) assert_satisfied(program)
} }
@ -100,12 +100,12 @@ fn test_div() {
let bytes = include_bytes!("div.leo"); let bytes = include_bytes!("div.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Field(a_string))), ("a", Some(InputValue::Field(a_string))),
("b", Some(InputValue::Field(b_string))), ("b", Some(InputValue::Field(b_string))),
("c", Some(InputValue::Field(c_string))), ("c", Some(InputValue::Field(c_string))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program) assert_satisfied(program)
} }
@ -129,13 +129,13 @@ fn test_mul() {
let bytes = include_bytes!("mul.leo"); let bytes = include_bytes!("mul.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Field(a_string))), ("a", Some(InputValue::Field(a_string))),
("b", Some(InputValue::Field(b_string))), ("b", Some(InputValue::Field(b_string))),
("c", Some(InputValue::Field(c_string))), ("c", Some(InputValue::Field(c_string))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program) assert_satisfied(program)
} }
@ -157,13 +157,13 @@ fn test_eq() {
let bytes = include_bytes!("eq.leo"); let bytes = include_bytes!("eq.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Field(a_string.clone()))), ("a", Some(InputValue::Field(a_string.clone()))),
("b", Some(InputValue::Field(a_string.clone()))), ("b", Some(InputValue::Field(a_string.clone()))),
("c", Some(InputValue::Boolean(true))), ("c", Some(InputValue::Boolean(true))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
@ -173,13 +173,13 @@ fn test_eq() {
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Field(a_string))), ("a", Some(InputValue::Field(a_string))),
("b", Some(InputValue::Field(b_string))), ("b", Some(InputValue::Field(b_string))),
("c", Some(InputValue::Boolean(c))), ("c", Some(InputValue::Boolean(c))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
} }
@ -197,12 +197,12 @@ fn test_assert_eq_pass() {
let bytes = include_bytes!("assert_eq.leo"); let bytes = include_bytes!("assert_eq.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Field(a_string.clone()))), ("a", Some(InputValue::Field(a_string.clone()))),
("b", Some(InputValue::Field(a_string))), ("b", Some(InputValue::Field(a_string))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
} }
@ -226,12 +226,12 @@ fn test_assert_eq_fail() {
let bytes = include_bytes!("assert_eq.leo"); let bytes = include_bytes!("assert_eq.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Field(a_string))), ("a", Some(InputValue::Field(a_string))),
("b", Some(InputValue::Field(b_string))), ("b", Some(InputValue::Field(b_string))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
expect_synthesis_error(program); expect_synthesis_error(program);
} }
@ -251,43 +251,43 @@ fn test_ternary() {
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
// true -> field a // true -> field a
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("s", Some(InputValue::Boolean(true))), ("s", Some(InputValue::Boolean(true))),
("a", Some(InputValue::Field(a_string.clone()))), ("a", Some(InputValue::Field(a_string.clone()))),
("b", Some(InputValue::Field(b_string.clone()))), ("b", Some(InputValue::Field(b_string.clone()))),
("c", Some(InputValue::Field(a_string.clone()))), ("c", Some(InputValue::Field(a_string.clone()))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
// false -> field b // false -> field b
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("s", Some(InputValue::Boolean(false))), ("s", Some(InputValue::Boolean(false))),
("a", Some(InputValue::Field(a_string))), ("a", Some(InputValue::Field(a_string))),
("b", Some(InputValue::Field(b_string.clone()))), ("b", Some(InputValue::Field(b_string.clone()))),
("c", Some(InputValue::Field(b_string))), ("c", Some(InputValue::Field(b_string))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
} }
// //
// pub fn output_one(program: EdwardsTestCompiler) { // pub fn output_one(program: EdwardsTestCompiler) {
// let expected = include_bytes!("outputs_/register_one.out"); // let expected = include_bytes!("output_/register_one.out");
// let actual = get_outputs(program); // let actual = get_output(program);
// //
// assert_eq!(expected, actual.bytes().as_slice()); // assert_eq!(expected, actual.bytes().as_slice());
// } // }
// //
// pub fn output_zero(program: EdwardsTestCompiler) { // pub fn output_zero(program: EdwardsTestCompiler) {
// let expected = include_bytes!("outputs_/register_zero.out"); // let expected = include_bytes!("output_/register_zero.out");
// let actual = get_outputs(program); // let actual = get_output(program);
// //
// assert_eq!(expected, actual.bytes().as_slice()); // assert_eq!(expected, actual.bytes().as_slice());
// } // }
@ -295,16 +295,16 @@ fn test_ternary() {
// #[test] // #[test]
// fn test_registers() { // fn test_registers() {
// let program_bytes = include_bytes!("output_register.leo"); // let program_bytes = include_bytes!("output_register.leo");
// let one_input_bytes = include_bytes!("inputs/register_one.in"); // let one_input_bytes = include_bytes!("input/register_one.in");
// let zero_input_bytes = include_bytes!("inputs/register_zero.in"); // let zero_input_bytes = include_bytes!("input/register_zero.in");
// //
// // test 1field input register => 1field output register // // test 1field input register => 1field output register
// let program = parse_program_with_inputs(program_bytes, one_input_bytes).unwrap(); // let program = parse_program_with_input(program_bytes, one_input_bytes).unwrap();
// //
// output_one(program); // output_one(program);
// //
// // test 0field input register => 0field output register // // test 0field input register => 0field output register
// let program = parse_program_with_inputs(program_bytes, zero_input_bytes).unwrap(); // let program = parse_program_with_input(program_bytes, zero_input_bytes).unwrap();
// //
// output_zero(program); // output_zero(program);
// } // }

View File

@ -1,9 +1,9 @@
use crate::{ use crate::{
assert_satisfied, assert_satisfied,
expect_compiler_error, expect_compiler_error,
get_outputs, get_output,
parse_program, parse_program,
parse_program_with_inputs, parse_program_with_input,
EdwardsTestCompiler, EdwardsTestCompiler,
}; };
use leo_compiler::errors::{CompilerError, ExpressionError, FunctionError, StatementError}; use leo_compiler::errors::{CompilerError, ExpressionError, FunctionError, StatementError};
@ -52,13 +52,13 @@ fn test_multiple_returns() {
#[test] #[test]
fn test_multiple_returns_main() { fn test_multiple_returns_main() {
let program_bytes = include_bytes!("multiple_main.leo"); let program_bytes = include_bytes!("multiple_main.leo");
let inputs_bytes = include_bytes!("inputs/registers.in"); let input_bytes = include_bytes!("input/registers.in");
let program = parse_program_with_inputs(program_bytes, inputs_bytes).unwrap(); let program = parse_program_with_input(program_bytes, input_bytes).unwrap();
let expected_bytes = include_bytes!("outputs_/registers.out"); let expected_bytes = include_bytes!("output_/registers.out");
let expected = std::str::from_utf8(expected_bytes).unwrap(); let expected = std::str::from_utf8(expected_bytes).unwrap();
let actual_bytes = get_outputs(program); let actual_bytes = get_output(program);
let actual = std::str::from_utf8(actual_bytes.bytes().as_slice()).unwrap(); let actual = std::str::from_utf8(actual_bytes.bytes().as_slice()).unwrap();
assert_eq!(expected, actual); assert_eq!(expected, actual);

View File

@ -1,3 +1,3 @@
function main(registers) -> (bool, bool) { function main(input) -> (bool, bool) {
return (registers.a, registers.b) return (input.registers.a, input.registers.b)
} }

View File

@ -1,4 +1,4 @@
// Functions inputs in leo are pass-by-value. // Functions input in leo are pass-by-value.
// //
// Program execution: // Program execution:
// line 15: variable `a` is defined with value `1`. // line 15: variable `a` is defined with value `1`.

View File

@ -2,9 +2,9 @@ use crate::{
assert_satisfied, assert_satisfied,
expect_synthesis_error, expect_synthesis_error,
field::field_to_decimal_string, field::field_to_decimal_string,
generate_main_inputs, generate_main_input,
parse_program, parse_program,
parse_program_with_inputs, parse_program_with_input,
}; };
use leo_types::InputValue; use leo_types::InputValue;
@ -45,16 +45,16 @@ fn test_point() {
} }
#[test] #[test]
fn test_inputs() { fn test_input() {
let program_bytes = include_bytes!("input.leo"); let program_bytes = include_bytes!("input.leo");
let input_bytes_pass = include_bytes!("inputs/one_one.in"); let input_bytes_pass = include_bytes!("input/one_one.in");
let input_bytes_fail = include_bytes!("inputs/one_zero.in"); let input_bytes_fail = include_bytes!("input/one_zero.in");
let program = parse_program_with_inputs(program_bytes, input_bytes_pass).unwrap(); let program = parse_program_with_input(program_bytes, input_bytes_pass).unwrap();
assert_satisfied(program); assert_satisfied(program);
let program = parse_program_with_inputs(program_bytes, input_bytes_fail).unwrap(); let program = parse_program_with_input(program_bytes, input_bytes_fail).unwrap();
expect_synthesis_error(program); expect_synthesis_error(program);
} }
@ -77,12 +77,12 @@ fn test_add() {
let bytes = include_bytes!("add.leo"); let bytes = include_bytes!("add.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Group(a_string))), ("a", Some(InputValue::Group(a_string))),
("b", Some(InputValue::Group(b_string))), ("b", Some(InputValue::Group(b_string))),
("c", Some(InputValue::Group(c_string))), ("c", Some(InputValue::Group(c_string))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program) assert_satisfied(program)
} }
@ -106,12 +106,12 @@ fn test_sub() {
let bytes = include_bytes!("sub.leo"); let bytes = include_bytes!("sub.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Group(a_string))), ("a", Some(InputValue::Group(a_string))),
("b", Some(InputValue::Group(b_string))), ("b", Some(InputValue::Group(b_string))),
("c", Some(InputValue::Group(c_string))), ("c", Some(InputValue::Group(c_string))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program) assert_satisfied(program)
} }
@ -129,12 +129,12 @@ fn test_assert_eq_pass() {
let bytes = include_bytes!("assert_eq.leo"); let bytes = include_bytes!("assert_eq.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Group(a_string.clone()))), ("a", Some(InputValue::Group(a_string.clone()))),
("b", Some(InputValue::Group(a_string))), ("b", Some(InputValue::Group(a_string))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
} }
@ -158,12 +158,12 @@ fn test_assert_eq_fail() {
let bytes = include_bytes!("assert_eq.leo"); let bytes = include_bytes!("assert_eq.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Group(a_string))), ("a", Some(InputValue::Group(a_string))),
("b", Some(InputValue::Group(b_string))), ("b", Some(InputValue::Group(b_string))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
expect_synthesis_error(program); expect_synthesis_error(program);
} }
@ -185,13 +185,13 @@ fn test_eq() {
let bytes = include_bytes!("eq.leo"); let bytes = include_bytes!("eq.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Group(a_string.clone()))), ("a", Some(InputValue::Group(a_string.clone()))),
("b", Some(InputValue::Group(a_string.clone()))), ("b", Some(InputValue::Group(a_string.clone()))),
("c", Some(InputValue::Boolean(true))), ("c", Some(InputValue::Boolean(true))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
@ -201,13 +201,13 @@ fn test_eq() {
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Group(a_string))), ("a", Some(InputValue::Group(a_string))),
("b", Some(InputValue::Group(b_string))), ("b", Some(InputValue::Group(b_string))),
("c", Some(InputValue::Boolean(c))), ("c", Some(InputValue::Boolean(c))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
} }
@ -227,28 +227,28 @@ fn test_ternary() {
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
// true -> field a // true -> field a
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("s", Some(InputValue::Boolean(true))), ("s", Some(InputValue::Boolean(true))),
("a", Some(InputValue::Group(a_string.clone()))), ("a", Some(InputValue::Group(a_string.clone()))),
("b", Some(InputValue::Group(b_string.clone()))), ("b", Some(InputValue::Group(b_string.clone()))),
("c", Some(InputValue::Group(a_string.clone()))), ("c", Some(InputValue::Group(a_string.clone()))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
// false -> field b // false -> field b
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("s", Some(InputValue::Boolean(false))), ("s", Some(InputValue::Boolean(false))),
("a", Some(InputValue::Group(a_string))), ("a", Some(InputValue::Group(a_string))),
("b", Some(InputValue::Group(b_string.clone()))), ("b", Some(InputValue::Group(b_string.clone()))),
("c", Some(InputValue::Group(b_string))), ("c", Some(InputValue::Group(b_string))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
} }

View File

@ -1 +1 @@
outputs/ output/

View File

@ -1 +1 @@
outputs/ output/

View File

@ -1,3 +1,3 @@
mod program_inputs; mod program_input;
mod program_inputs_and_state; mod program_input_and_program_state;
mod state; mod program_state;

View File

@ -0,0 +1,49 @@
use crate::{assert_satisfied, expect_compiler_error, parse_program_with_input, EdwardsTestCompiler};
use leo_compiler::errors::CompilerError;
fn expect_fail(program: EdwardsTestCompiler) {
match expect_compiler_error(program) {
CompilerError::FunctionError(_) => {}
err => panic!("expected input parser error, got {:?}", err),
}
}
#[test]
fn test_input_pass() {
let program_bytes = include_bytes!("main.leo");
let input_bytes = include_bytes!("input/main.in");
let program = parse_program_with_input(program_bytes, input_bytes).unwrap();
assert_satisfied(program);
}
#[test]
fn test_input_fail_name() {
let program_bytes = include_bytes!("main.leo");
let input_bytes = include_bytes!("input/main_fail_name.in");
let program = parse_program_with_input(program_bytes, input_bytes).unwrap();
expect_fail(program);
}
#[test]
fn test_input_fail_type() {
let program_bytes = include_bytes!("main.leo");
let input_bytes = include_bytes!("input/main_fail_type.in");
let program = parse_program_with_input(program_bytes, input_bytes).unwrap();
expect_fail(program);
}
#[test]
fn test_input_multiple() {
let program_bytes = include_bytes!("main_multiple.leo");
let input_bytes = include_bytes!("input/main_multiple.in");
let program = parse_program_with_input(program_bytes, input_bytes).unwrap();
assert_satisfied(program);
}

View File

@ -0,0 +1,11 @@
function main(input, data: u8[32]) {
assert_eq!(input.registers.value_balance, 0u64);
assert_eq!(input.state.leaf_index, 0u32);
assert_eq!(input.record.value, 5u64);
assert_eq!(input.state_leaf.network_id, 0u8);
assert_eq!(data, [0u8; 32]);
}

View File

@ -0,0 +1,28 @@
use crate::{assert_satisfied, parse_input_and_state, parse_program_with_input_and_state};
#[test]
fn test_basic() {
let input_bytes = include_bytes!("input/basic.in");
let state_bytes = include_bytes!("input/basic.state");
parse_input_and_state(input_bytes, state_bytes).unwrap();
}
#[test]
fn test_full() {
let input_bytes = include_bytes!("input/token_withdraw.in");
let state_bytes = include_bytes!("input/token_withdraw.state");
parse_input_and_state(input_bytes, state_bytes).unwrap();
}
#[test]
fn test_access() {
let program_bytes = include_bytes!("access.leo");
let input_bytes = include_bytes!("input/token_withdraw.in");
let state_bytes = include_bytes!("input/token_withdraw.state");
let program = parse_program_with_input_and_state(program_bytes, input_bytes, state_bytes).unwrap();
assert_satisfied(program);
}

View File

@ -1,49 +0,0 @@
use crate::{assert_satisfied, expect_compiler_error, parse_program_with_inputs, EdwardsTestCompiler};
use leo_compiler::errors::CompilerError;
fn expect_fail(program: EdwardsTestCompiler) {
match expect_compiler_error(program) {
CompilerError::FunctionError(_) => {}
err => panic!("expected input parser error, got {:?}", err),
}
}
#[test]
fn test_inputs_pass() {
let program_bytes = include_bytes!("main.leo");
let input_bytes = include_bytes!("inputs/main.in");
let program = parse_program_with_inputs(program_bytes, input_bytes).unwrap();
assert_satisfied(program);
}
#[test]
fn test_inputs_fail_name() {
let program_bytes = include_bytes!("main.leo");
let input_bytes = include_bytes!("inputs/main_fail_name.in");
let program = parse_program_with_inputs(program_bytes, input_bytes).unwrap();
expect_fail(program);
}
#[test]
fn test_inputs_fail_type() {
let program_bytes = include_bytes!("main.leo");
let input_bytes = include_bytes!("inputs/main_fail_type.in");
let program = parse_program_with_inputs(program_bytes, input_bytes).unwrap();
expect_fail(program);
}
#[test]
fn test_inputs_multiple() {
let program_bytes = include_bytes!("main_multiple.leo");
let input_bytes = include_bytes!("inputs/main_multiple.in");
let program = parse_program_with_inputs(program_bytes, input_bytes).unwrap();
assert_satisfied(program);
}

View File

@ -1,17 +0,0 @@
function main(
registers,
state,
record,
state_leaf,
data: u8[32]
) {
assert_eq!(registers.value_balance, 0u64);
assert_eq!(state.leaf_index, 0u32);
assert_eq!(record.value, 5u64);
assert_eq!(state_leaf.network_id, 0u8);
assert_eq!(data, [0u8; 32]);
}

View File

@ -1,28 +0,0 @@
use crate::{assert_satisfied, parse_inputs_and_state, parse_program_with_inputs_and_state};
#[test]
fn test_basic() {
let inputs_bytes = include_bytes!("inputs/basic.in");
let state_bytes = include_bytes!("inputs/basic.state");
parse_inputs_and_state(inputs_bytes, state_bytes).unwrap();
}
#[test]
fn test_full() {
let inputs_bytes = include_bytes!("inputs/token_withdraw.in");
let state_bytes = include_bytes!("inputs/token_withdraw.state");
parse_inputs_and_state(inputs_bytes, state_bytes).unwrap();
}
#[test]
fn test_access() {
let program_bytes = include_bytes!("access.leo");
let inputs_bytes = include_bytes!("inputs/token_withdraw.in");
let state_bytes = include_bytes!("inputs/token_withdraw.state");
let program = parse_program_with_inputs_and_state(program_bytes, inputs_bytes, state_bytes).unwrap();
assert_satisfied(program);
}

View File

@ -0,0 +1,8 @@
function main(input) {
assert_eq!(input.state.root, [0u8; 32]);
let expected: address = aleo1qnr4dkkvkgfqph0vzc3y6z2eu975wnpz2925ntjccd5cfqxtyu8sta57j8;
assert_eq!(input.record.owner, expected);
assert_eq!(input.state_leaf.network_id, 0u8);
}

View File

@ -0,0 +1,3 @@
function main(input) {
assert_eq!(input.state.root, [0u8; 32]);
}

View File

@ -2,14 +2,14 @@ use crate::{assert_satisfied, parse_program_with_state, parse_state};
#[test] #[test]
fn test_basic() { fn test_basic() {
let bytes = include_bytes!("inputs/basic.state"); let bytes = include_bytes!("input/basic.state");
parse_state(bytes).unwrap(); parse_state(bytes).unwrap();
} }
#[test] #[test]
fn test_token_withdraw() { fn test_token_withdraw() {
let bytes = include_bytes!("inputs/token_withdraw.state"); let bytes = include_bytes!("input/token_withdraw.state");
parse_state(bytes).unwrap(); parse_state(bytes).unwrap();
} }
@ -17,7 +17,7 @@ fn test_token_withdraw() {
#[test] #[test]
fn test_access_state() { fn test_access_state() {
let program_bytes = include_bytes!("access_state.leo"); let program_bytes = include_bytes!("access_state.leo");
let state_bytes = include_bytes!("inputs/token_withdraw.state"); let state_bytes = include_bytes!("input/token_withdraw.state");
let program = parse_program_with_state(program_bytes, state_bytes).unwrap(); let program = parse_program_with_state(program_bytes, state_bytes).unwrap();
@ -27,7 +27,7 @@ fn test_access_state() {
#[test] #[test]
fn test_access_all() { fn test_access_all() {
let program_bytes = include_bytes!("access_all.leo"); let program_bytes = include_bytes!("access_all.leo");
let state_bytes = include_bytes!("inputs/token_withdraw.state"); let state_bytes = include_bytes!("input/token_withdraw.state");
let program = parse_program_with_state(program_bytes, state_bytes).unwrap(); let program = parse_program_with_state(program_bytes, state_bytes).unwrap();
@ -36,7 +36,7 @@ fn test_access_all() {
#[test] #[test]
fn test_visibility_fail() { fn test_visibility_fail() {
let state_bytes = include_bytes!("inputs/visibility_fail.state"); let state_bytes = include_bytes!("input/visibility_fail.state");
let is_err = parse_state(state_bytes).is_err(); let is_err = parse_state(state_bytes).is_err();
@ -45,7 +45,7 @@ fn test_visibility_fail() {
#[test] #[test]
fn test_section_undefined() { fn test_section_undefined() {
let state_bytes = include_bytes!("inputs/section_undefined.state"); let state_bytes = include_bytes!("input/section_undefined.state");
let is_err = parse_state(state_bytes).is_err(); let is_err = parse_state(state_bytes).is_err();
@ -54,7 +54,7 @@ fn test_section_undefined() {
#[test] #[test]
fn test_section_invalid() { fn test_section_invalid() {
let state_bytes = include_bytes!("inputs/section_invalid.state"); let state_bytes = include_bytes!("input/section_invalid.state");
let is_err = parse_state(state_bytes).is_err(); let is_err = parse_state(state_bytes).is_err();

View File

@ -1,8 +0,0 @@
function main(state, record, state_leaf) {
assert_eq!(state.root, [0u8; 32]);
let expected: address = aleo1qnr4dkkvkgfqph0vzc3y6z2eu975wnpz2925ntjccd5cfqxtyu8sta57j8;
assert_eq!(record.owner, expected);
assert_eq!(state_leaf.network_id, 0u8);
}

View File

@ -1,3 +0,0 @@
function main(state) {
assert_eq!(state.root, [0u8; 32]);
}

View File

@ -1,11 +1,11 @@
use crate::{ use crate::{
assert_satisfied, assert_satisfied,
expect_synthesis_error, expect_synthesis_error,
generate_main_inputs, generate_main_input,
integers::{expect_computation_error, expect_parsing_error, IntegerTester}, integers::{expect_computation_error, expect_parsing_error, IntegerTester},
parse_program, parse_program,
}; };
use leo_inputs::types::{I128Type, IntegerType}; use leo_input::types::{I128Type, IntegerType};
use leo_types::InputValue; use leo_types::InputValue;
test_int!(Testi128, i128, IntegerType::I128Type(I128Type {}), Int128); test_int!(Testi128, i128, IntegerType::I128Type(I128Type {}), Int128);

View File

@ -1,11 +1,11 @@
use crate::{ use crate::{
assert_satisfied, assert_satisfied,
expect_synthesis_error, expect_synthesis_error,
generate_main_inputs, generate_main_input,
integers::{expect_computation_error, expect_parsing_error, IntegerTester}, integers::{expect_computation_error, expect_parsing_error, IntegerTester},
parse_program, parse_program,
}; };
use leo_inputs::types::{I16Type, IntegerType}; use leo_input::types::{I16Type, IntegerType};
use leo_types::InputValue; use leo_types::InputValue;
test_int!(Testi16, i16, IntegerType::I16Type(I16Type {}), Int16); test_int!(Testi16, i16, IntegerType::I16Type(I16Type {}), Int16);

View File

@ -1,11 +1,11 @@
use crate::{ use crate::{
assert_satisfied, assert_satisfied,
expect_synthesis_error, expect_synthesis_error,
generate_main_inputs, generate_main_input,
integers::{expect_computation_error, expect_parsing_error, IntegerTester}, integers::{expect_computation_error, expect_parsing_error, IntegerTester},
parse_program, parse_program,
}; };
use leo_inputs::types::{I32Type, IntegerType}; use leo_input::types::{I32Type, IntegerType};
use leo_types::InputValue; use leo_types::InputValue;
test_int!(Testi32, i32, IntegerType::I32Type(I32Type {}), Int32); test_int!(Testi32, i32, IntegerType::I32Type(I32Type {}), Int32);

View File

@ -1,11 +1,11 @@
use crate::{ use crate::{
assert_satisfied, assert_satisfied,
expect_synthesis_error, expect_synthesis_error,
generate_main_inputs, generate_main_input,
integers::{expect_computation_error, expect_parsing_error, IntegerTester}, integers::{expect_computation_error, expect_parsing_error, IntegerTester},
parse_program, parse_program,
}; };
use leo_inputs::types::{I64Type, IntegerType}; use leo_input::types::{I64Type, IntegerType};
use leo_types::InputValue; use leo_types::InputValue;
test_int!(Testi64, i64, IntegerType::I64Type(I64Type {}), Int64); test_int!(Testi64, i64, IntegerType::I64Type(I64Type {}), Int64);

View File

@ -1,11 +1,11 @@
use crate::{ use crate::{
assert_satisfied, assert_satisfied,
expect_synthesis_error, expect_synthesis_error,
generate_main_inputs, generate_main_input,
integers::{expect_computation_error, expect_parsing_error, IntegerTester}, integers::{expect_computation_error, expect_parsing_error, IntegerTester},
parse_program, parse_program,
}; };
use leo_inputs::types::{I8Type, IntegerType}; use leo_input::types::{I8Type, IntegerType};
use leo_types::InputValue; use leo_types::InputValue;
test_int!(Testi8, i8, IntegerType::I8Type(I8Type {}), Int8); test_int!(Testi8, i8, IntegerType::I8Type(I8Type {}), Int8);

View File

@ -44,13 +44,13 @@ macro_rules! test_int {
let bytes = include_bytes!("add.leo"); let bytes = include_bytes!("add.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Integer($integer_type, a.to_string()))), ("a", Some(InputValue::Integer($integer_type, a.to_string()))),
("b", Some(InputValue::Integer($integer_type, b.to_string()))), ("b", Some(InputValue::Integer($integer_type, b.to_string()))),
("c", Some(InputValue::Integer($integer_type, c.to_string()))), ("c", Some(InputValue::Integer($integer_type, c.to_string()))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
} }
@ -73,13 +73,13 @@ macro_rules! test_int {
let bytes = include_bytes!("sub.leo"); let bytes = include_bytes!("sub.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Integer($integer_type, a.to_string()))), ("a", Some(InputValue::Integer($integer_type, a.to_string()))),
("b", Some(InputValue::Integer($integer_type, b.to_string()))), ("b", Some(InputValue::Integer($integer_type, b.to_string()))),
("c", Some(InputValue::Integer($integer_type, c.to_string()))), ("c", Some(InputValue::Integer($integer_type, c.to_string()))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
} }
@ -98,13 +98,13 @@ macro_rules! test_int {
let bytes = include_bytes!("mul.leo"); let bytes = include_bytes!("mul.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Integer($integer_type, a.to_string()))), ("a", Some(InputValue::Integer($integer_type, a.to_string()))),
("b", Some(InputValue::Integer($integer_type, b.to_string()))), ("b", Some(InputValue::Integer($integer_type, b.to_string()))),
("c", Some(InputValue::Integer($integer_type, c.to_string()))), ("c", Some(InputValue::Integer($integer_type, c.to_string()))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
} }
@ -119,14 +119,14 @@ macro_rules! test_int {
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
// expect an error when dividing by zero // expect an error when dividing by zero
if b == 0 { if b == 0 || b == <$type_>::MIN {
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Integer($integer_type, a.to_string()))), ("a", Some(InputValue::Integer($integer_type, a.to_string()))),
("b", Some(InputValue::Integer($integer_type, b.to_string()))), ("b", Some(InputValue::Integer($integer_type, b.to_string()))),
("c", Some(InputValue::Integer($integer_type, b.to_string()))), ("c", Some(InputValue::Integer($integer_type, b.to_string()))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
expect_computation_error(program); expect_computation_error(program);
} else { } else {
@ -135,13 +135,13 @@ macro_rules! test_int {
None => continue, None => continue,
}; };
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Integer($integer_type, a.to_string()))), ("a", Some(InputValue::Integer($integer_type, a.to_string()))),
("b", Some(InputValue::Integer($integer_type, b.to_string()))), ("b", Some(InputValue::Integer($integer_type, b.to_string()))),
("c", Some(InputValue::Integer($integer_type, c.to_string()))), ("c", Some(InputValue::Integer($integer_type, c.to_string()))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
} }
@ -162,13 +162,13 @@ macro_rules! test_int {
let bytes = include_bytes!("pow.leo"); let bytes = include_bytes!("pow.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Integer($integer_type, a.to_string()))), ("a", Some(InputValue::Integer($integer_type, a.to_string()))),
("b", Some(InputValue::Integer($integer_type, b.to_string()))), ("b", Some(InputValue::Integer($integer_type, b.to_string()))),
("c", Some(InputValue::Integer($integer_type, c.to_string()))), ("c", Some(InputValue::Integer($integer_type, c.to_string()))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
} }
@ -184,13 +184,13 @@ macro_rules! test_int {
let bytes = include_bytes!("eq.leo"); let bytes = include_bytes!("eq.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Integer($integer_type, a.to_string()))), ("a", Some(InputValue::Integer($integer_type, a.to_string()))),
("b", Some(InputValue::Integer($integer_type, a.to_string()))), ("b", Some(InputValue::Integer($integer_type, a.to_string()))),
("c", Some(InputValue::Boolean(true))), ("c", Some(InputValue::Boolean(true))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
@ -200,13 +200,13 @@ macro_rules! test_int {
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Integer($integer_type, a.to_string()))), ("a", Some(InputValue::Integer($integer_type, a.to_string()))),
("b", Some(InputValue::Integer($integer_type, b.to_string()))), ("b", Some(InputValue::Integer($integer_type, b.to_string()))),
("c", Some(InputValue::Boolean(c))), ("c", Some(InputValue::Boolean(c))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
} }
@ -222,13 +222,13 @@ macro_rules! test_int {
let bytes = include_bytes!("ge.leo"); let bytes = include_bytes!("ge.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Integer($integer_type, a.to_string()))), ("a", Some(InputValue::Integer($integer_type, a.to_string()))),
("b", Some(InputValue::Integer($integer_type, a.to_string()))), ("b", Some(InputValue::Integer($integer_type, a.to_string()))),
("c", Some(InputValue::Boolean(true))), ("c", Some(InputValue::Boolean(true))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
@ -238,13 +238,13 @@ macro_rules! test_int {
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Integer($integer_type, a.to_string()))), ("a", Some(InputValue::Integer($integer_type, a.to_string()))),
("b", Some(InputValue::Integer($integer_type, b.to_string()))), ("b", Some(InputValue::Integer($integer_type, b.to_string()))),
("c", Some(InputValue::Boolean(c))), ("c", Some(InputValue::Boolean(c))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
} }
@ -260,13 +260,13 @@ macro_rules! test_int {
let bytes = include_bytes!("gt.leo"); let bytes = include_bytes!("gt.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Integer($integer_type, a.to_string()))), ("a", Some(InputValue::Integer($integer_type, a.to_string()))),
("b", Some(InputValue::Integer($integer_type, a.to_string()))), ("b", Some(InputValue::Integer($integer_type, a.to_string()))),
("c", Some(InputValue::Boolean(false))), ("c", Some(InputValue::Boolean(false))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
@ -276,13 +276,13 @@ macro_rules! test_int {
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Integer($integer_type, a.to_string()))), ("a", Some(InputValue::Integer($integer_type, a.to_string()))),
("b", Some(InputValue::Integer($integer_type, b.to_string()))), ("b", Some(InputValue::Integer($integer_type, b.to_string()))),
("c", Some(InputValue::Boolean(c))), ("c", Some(InputValue::Boolean(c))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
} }
@ -298,13 +298,13 @@ macro_rules! test_int {
let bytes = include_bytes!("le.leo"); let bytes = include_bytes!("le.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Integer($integer_type, a.to_string()))), ("a", Some(InputValue::Integer($integer_type, a.to_string()))),
("b", Some(InputValue::Integer($integer_type, a.to_string()))), ("b", Some(InputValue::Integer($integer_type, a.to_string()))),
("c", Some(InputValue::Boolean(true))), ("c", Some(InputValue::Boolean(true))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
@ -314,13 +314,13 @@ macro_rules! test_int {
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Integer($integer_type, a.to_string()))), ("a", Some(InputValue::Integer($integer_type, a.to_string()))),
("b", Some(InputValue::Integer($integer_type, b.to_string()))), ("b", Some(InputValue::Integer($integer_type, b.to_string()))),
("c", Some(InputValue::Boolean(c))), ("c", Some(InputValue::Boolean(c))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
} }
@ -336,13 +336,13 @@ macro_rules! test_int {
let bytes = include_bytes!("lt.leo"); let bytes = include_bytes!("lt.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Integer($integer_type, a.to_string()))), ("a", Some(InputValue::Integer($integer_type, a.to_string()))),
("b", Some(InputValue::Integer($integer_type, a.to_string()))), ("b", Some(InputValue::Integer($integer_type, a.to_string()))),
("c", Some(InputValue::Boolean(false))), ("c", Some(InputValue::Boolean(false))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
@ -352,13 +352,13 @@ macro_rules! test_int {
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Integer($integer_type, a.to_string()))), ("a", Some(InputValue::Integer($integer_type, a.to_string()))),
("b", Some(InputValue::Integer($integer_type, b.to_string()))), ("b", Some(InputValue::Integer($integer_type, b.to_string()))),
("c", Some(InputValue::Boolean(c))), ("c", Some(InputValue::Boolean(c))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
} }
@ -372,12 +372,12 @@ macro_rules! test_int {
let bytes = include_bytes!("assert_eq.leo"); let bytes = include_bytes!("assert_eq.leo");
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Integer($integer_type, a.to_string()))), ("a", Some(InputValue::Integer($integer_type, a.to_string()))),
("b", Some(InputValue::Integer($integer_type, a.to_string()))), ("b", Some(InputValue::Integer($integer_type, a.to_string()))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
@ -390,12 +390,12 @@ macro_rules! test_int {
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("a", Some(InputValue::Integer($integer_type, a.to_string()))), ("a", Some(InputValue::Integer($integer_type, a.to_string()))),
("b", Some(InputValue::Integer($integer_type, b.to_string()))), ("b", Some(InputValue::Integer($integer_type, b.to_string()))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
expect_synthesis_error(program); expect_synthesis_error(program);
} }
@ -409,28 +409,28 @@ macro_rules! test_int {
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
// true -> field 1 // true -> field 1
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("s", Some(InputValue::Boolean(true))), ("s", Some(InputValue::Boolean(true))),
("a", Some(InputValue::Integer($integer_type, a.to_string()))), ("a", Some(InputValue::Integer($integer_type, a.to_string()))),
("b", Some(InputValue::Integer($integer_type, b.to_string()))), ("b", Some(InputValue::Integer($integer_type, b.to_string()))),
("c", Some(InputValue::Integer($integer_type, a.to_string()))), ("c", Some(InputValue::Integer($integer_type, a.to_string()))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
// false -> field 2 // false -> field 2
let mut program = parse_program(bytes).unwrap(); let mut program = parse_program(bytes).unwrap();
let main_inputs = generate_main_inputs(vec![ let main_input = generate_main_input(vec![
("s", Some(InputValue::Boolean(false))), ("s", Some(InputValue::Boolean(false))),
("a", Some(InputValue::Integer($integer_type, a.to_string()))), ("a", Some(InputValue::Integer($integer_type, a.to_string()))),
("b", Some(InputValue::Integer($integer_type, b.to_string()))), ("b", Some(InputValue::Integer($integer_type, b.to_string()))),
("c", Some(InputValue::Integer($integer_type, b.to_string()))), ("c", Some(InputValue::Integer($integer_type, b.to_string()))),
]); ]);
program.set_main_inputs(main_inputs); program.set_main_input(main_input);
assert_satisfied(program); assert_satisfied(program);
} }

View File

@ -1,11 +1,11 @@
use crate::{ use crate::{
assert_satisfied, assert_satisfied,
expect_synthesis_error, expect_synthesis_error,
generate_main_inputs, generate_main_input,
integers::{expect_parsing_error, IntegerTester}, integers::{expect_parsing_error, IntegerTester},
parse_program, parse_program,
}; };
use leo_inputs::types::{IntegerType, U128Type}; use leo_input::types::{IntegerType, U128Type};
use leo_types::InputValue; use leo_types::InputValue;
test_uint!(TestU128, u128, IntegerType::U128Type(U128Type {}), UInt128); test_uint!(TestU128, u128, IntegerType::U128Type(U128Type {}), UInt128);

View File

@ -1,11 +1,11 @@
use crate::{ use crate::{
assert_satisfied, assert_satisfied,
expect_synthesis_error, expect_synthesis_error,
generate_main_inputs, generate_main_input,
integers::{expect_parsing_error, IntegerTester}, integers::{expect_parsing_error, IntegerTester},
parse_program, parse_program,
}; };
use leo_inputs::types::{IntegerType, U16Type}; use leo_input::types::{IntegerType, U16Type};
use leo_types::InputValue; use leo_types::InputValue;
test_uint!(TestU16, u16, IntegerType::U16Type(U16Type {}), UInt16); test_uint!(TestU16, u16, IntegerType::U16Type(U16Type {}), UInt16);

Some files were not shown because too many files have changed in this diff Show More