From a2220cd6ca103b636567b557d21ab345c6ab99e0 Mon Sep 17 00:00:00 2001 From: Arnaud Bailly Date: Sun, 6 Oct 2024 21:11:04 +0200 Subject: Use proptest's Strategy to generate expressions --- rust/src/web.rs | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) (limited to 'rust/src/web.rs') diff --git a/rust/src/web.rs b/rust/src/web.rs index 6bc892b..5729083 100644 --- a/rust/src/web.rs +++ b/rust/src/web.rs @@ -7,6 +7,7 @@ use futures::try_join; use futures::{future::join_all, lock::Mutex}; use lambda::ast::Value; use log::info; +use proptest::test_runner::TestRunner; use rand::rngs::SmallRng; use rand::{Rng, SeedableRng}; use serde::{Deserialize, Serialize}; @@ -38,12 +39,12 @@ enum RegistrationResult { UrlAlreadyRegistered { url: String }, } -#[derive(Debug, PartialEq, Clone)] +#[derive(Debug, Clone)] struct Client { id: Uuid, url: String, grade: u8, - rng: SmallRng, + runner: TestRunner, seed: u64, } @@ -59,7 +60,7 @@ impl Client { } fn generate_expr(&mut self) -> (String, String) { - let input = generate_expr(self.grade.into(), &mut self.rng); + let input = generate_expr(self.grade.into(), &mut self.runner); let expected = eval_whnf(&input, &mut Environment::new()); (input.to_string(), expected.to_string()) } @@ -117,7 +118,7 @@ impl AppState for State { url: registration.url.clone(), grade: 1, seed, - rng: SmallRng::seed_from_u64(seed), + runner: TestRunner::deterministic(), })); let client_s = client.clone(); self.clients.insert(registration.url.clone(), client); @@ -355,15 +356,19 @@ mod app_tests { ); } - #[test] - async fn client_generates_constant_at_level_1() { - let mut client = Client { + fn client() -> Client { + Client { id: Uuid::new_v4(), url: "http://1.2.3.4".to_string(), grade: 1, seed: 42, - rng: SmallRng::seed_from_u64(42), - }; + runner: TestRunner::deterministic(), + } + } + + #[test] + async fn client_generates_constant_at_level_1() { + let mut client = client(); let (input, _) = client.generate_expr(); @@ -375,17 +380,25 @@ mod app_tests { #[test] async fn client_generates_different_inputs_on_each_call() { - let mut client = Client { - id: Uuid::new_v4(), - url: "http://1.2.3.4".to_string(), - grade: 1, - seed: 42, - rng: SmallRng::seed_from_u64(42), - }; + let mut client = client(); let (input1, _) = client.generate_expr(); let (input2, _) = client.generate_expr(); assert_ne!(input1, input2); } + + #[test] + async fn client_generates_variables_at_level_2() { + let mut client = client(); + client.grade = 2; + + let (input, _) = client.generate_expr(); + + let parsed = parse(&input); + match parsed[..] { + [Value::Sym(_)] => (), + _ => panic!("Expected symbol, got {:?}", parsed), + } + } } -- cgit v1.2.3