diff --git a/src/circuit/floor_planner/single_pass.rs b/src/circuit/floor_planner/single_pass.rs index cc1875e1..5b955290 100644 --- a/src/circuit/floor_planner/single_pass.rs +++ b/src/circuit/floor_planner/single_pass.rs @@ -305,3 +305,58 @@ impl<'r, 'a, F: Field, CS: Assignment + 'a> RegionLayouter Ok(()) } } + +#[cfg(test)] +mod tests { + use pasta_curves::vesta; + + use super::SimpleFloorPlanner; + use crate::{ + dev::MockProver, + plonk::{Advice, Circuit, Column, Error}, + }; + + #[test] + fn not_enough_columns_for_constants() { + struct MyCircuit {} + + impl Circuit for MyCircuit { + type Config = Column; + type FloorPlanner = SimpleFloorPlanner; + + fn without_witnesses(&self) -> Self { + MyCircuit {} + } + + fn configure(meta: &mut crate::plonk::ConstraintSystem) -> Self::Config { + meta.advice_column() + } + + fn synthesize( + &self, + config: Self::Config, + mut layouter: impl crate::circuit::Layouter, + ) -> Result<(), crate::plonk::Error> { + layouter.assign_region( + || "assign constant", + |mut region| { + region.assign_advice_from_constant( + || "one", + config, + 0, + vesta::Scalar::one(), + ) + }, + )?; + + Ok(()) + } + } + + let circuit = MyCircuit {}; + assert_eq!( + MockProver::run(3, &circuit, vec![]).unwrap_err(), + Error::NotEnoughColumnsForConstants, + ); + } +} diff --git a/src/circuit/floor_planner/v1.rs b/src/circuit/floor_planner/v1.rs index 6225b1e0..17adeedd 100644 --- a/src/circuit/floor_planner/v1.rs +++ b/src/circuit/floor_planner/v1.rs @@ -414,3 +414,57 @@ impl<'r, 'a, F: Field, CS: Assignment + 'a> RegionLayouter for V1Region<'r Ok(()) } } + +#[cfg(test)] +mod tests { + use pasta_curves::vesta; + + use crate::{ + dev::MockProver, + plonk::{Advice, Circuit, Column, Error}, + }; + + #[test] + fn not_enough_columns_for_constants() { + struct MyCircuit {} + + impl Circuit for MyCircuit { + type Config = Column; + type FloorPlanner = super::V1; + + fn without_witnesses(&self) -> Self { + MyCircuit {} + } + + fn configure(meta: &mut crate::plonk::ConstraintSystem) -> Self::Config { + meta.advice_column() + } + + fn synthesize( + &self, + config: Self::Config, + mut layouter: impl crate::circuit::Layouter, + ) -> Result<(), crate::plonk::Error> { + layouter.assign_region( + || "assign constant", + |mut region| { + region.assign_advice_from_constant( + || "one", + config, + 0, + vesta::Scalar::one(), + ) + }, + )?; + + Ok(()) + } + } + + let circuit = MyCircuit {}; + assert_eq!( + MockProver::run(3, &circuit, vec![]).unwrap_err(), + Error::NotEnoughColumnsForConstants, + ); + } +} diff --git a/src/plonk.rs b/src/plonk.rs index 2a44e26a..830dce77 100644 --- a/src/plonk.rs +++ b/src/plonk.rs @@ -134,7 +134,7 @@ pub struct ProvingKey { /// This is an error that could occur during proving or circuit synthesis. // TODO: these errors need to be cleaned up -#[derive(Debug)] +#[derive(Debug, PartialEq)] pub enum Error { /// This is an error that can occur during synthesis of the circuit, for /// example, when the witness is not present.