leo/compiler/tests/mod.rs

124 lines
3.8 KiB
Rust
Raw Normal View History

2021-02-02 07:26:56 +03:00
// Copyright (C) 2019-2021 Aleo Systems Inc.
2020-08-18 13:50:26 +03:00
// This file is part of the Leo library.
// The Leo library is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// The Leo library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with the Leo library. If not, see <https://www.gnu.org/licenses/>.
// allow the use of EdwardsTestCompiler::parse_program_from_string for tests
#![allow(deprecated)]
2021-05-12 20:47:03 +03:00
pub mod canonicalization;
2021-04-13 18:52:01 +03:00
pub mod type_inference;
use leo_asg::{new_alloc_context, new_context, AsgContext};
use leo_compiler::{
compiler::Compiler,
errors::CompilerError,
group::targets::edwards_bls12::EdwardsGroupType,
ConstrainedValue,
OutputBytes,
};
2020-12-30 19:40:45 +03:00
use snarkvm_curves::edwards_bls12::Fq;
2021-03-04 21:45:37 +03:00
use snarkvm_r1cs::TestConstraintSystem;
use std::path::PathBuf;
2020-08-01 07:15:33 +03:00
pub const TEST_OUTPUT_DIRECTORY: &str = "/output/";
const EMPTY_FILE: &str = "";
2021-02-11 19:38:08 +03:00
pub type EdwardsTestCompiler = Compiler<'static, Fq, EdwardsGroupType>;
pub type EdwardsConstrainedValue = ConstrainedValue<'static, Fq, EdwardsGroupType>;
//convenience function for tests, leaks memory
pub(crate) fn make_test_context() -> AsgContext<'static> {
2021-02-25 18:40:47 +03:00
let allocator = Box::leak(Box::new(new_alloc_context()));
new_context(allocator)
2021-02-11 19:38:08 +03:00
}
2020-05-30 03:34:31 +03:00
2020-07-31 04:17:55 +03:00
fn new_compiler() -> EdwardsTestCompiler {
let program_name = "test".to_string();
let path = PathBuf::from("/test/src/main.leo");
2020-08-01 07:15:33 +03:00
let output_dir = PathBuf::from(TEST_OUTPUT_DIRECTORY);
2020-07-31 04:17:55 +03:00
EdwardsTestCompiler::new(program_name, path, output_dir, make_test_context(), None)
2020-07-31 04:17:55 +03:00
}
pub(crate) fn parse_program(program_string: &str) -> Result<EdwardsTestCompiler, CompilerError> {
2020-07-31 04:17:55 +03:00
let mut compiler = new_compiler();
2020-12-04 23:34:51 +03:00
compiler.parse_program_from_string(program_string)?;
2020-07-31 04:17:55 +03:00
Ok(compiler)
}
pub fn parse_program_with_input(
program_string: &str,
input_string: &str,
) -> Result<EdwardsTestCompiler, CompilerError> {
let mut compiler = new_compiler();
2020-09-03 09:23:50 +03:00
let path = PathBuf::new();
compiler.parse_input(input_string, &path, EMPTY_FILE, &path)?;
compiler.parse_program_from_string(program_string)?;
Ok(compiler)
2020-06-09 04:39:10 +03:00
}
pub fn parse_program_with_state(
2020-12-04 20:51:39 +03:00
program_string: &str,
state_string: &str,
2020-07-31 04:17:55 +03:00
) -> Result<EdwardsTestCompiler, CompilerError> {
let mut compiler = new_compiler();
2020-09-03 09:23:50 +03:00
let path = PathBuf::new();
2020-07-31 04:17:55 +03:00
2020-12-04 20:51:39 +03:00
compiler.parse_input(EMPTY_FILE, &path, state_string, &path)?;
compiler.parse_program_from_string(program_string)?;
2020-06-09 03:28:09 +03:00
Ok(compiler)
}
2020-08-01 05:39:30 +03:00
pub fn parse_program_with_input_and_state(
2020-12-04 20:57:08 +03:00
program_string: &str,
input_string: &str,
state_string: &str,
2020-07-31 04:17:55 +03:00
) -> Result<EdwardsTestCompiler, CompilerError> {
2020-07-31 03:19:10 +03:00
let mut compiler = new_compiler();
2020-09-03 09:23:50 +03:00
let path = PathBuf::new();
2020-07-31 04:17:55 +03:00
2020-12-04 20:57:08 +03:00
compiler.parse_input(input_string, &path, state_string, &path)?;
2020-08-03 03:24:31 +03:00
compiler.parse_program_from_string(&program_string)?;
2020-07-31 03:19:10 +03:00
Ok(compiler)
}
2020-08-01 07:15:33 +03:00
pub(crate) fn get_output(program: EdwardsTestCompiler) -> OutputBytes {
// synthesize the circuit on the test constraint system
let mut cs = TestConstraintSystem::<Fq>::new();
2021-02-05 04:26:29 +03:00
let output = program.compile_constraints(&mut cs).unwrap();
// assert the constraint system is satisfied
assert!(cs.is_satisfied());
2021-05-12 19:39:27 +03:00
output.into()
}
pub(crate) fn assert_satisfied(program: EdwardsTestCompiler) {
2020-08-01 07:15:33 +03:00
let empty_output_bytes = include_bytes!("compiler_output/empty.out");
let res = get_output(program);
// assert that the output is empty
assert_eq!(empty_output_bytes, res.bytes().as_slice());
}