summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnaud Bailly <arnaud@pankzsoft.com>2024-10-09 15:55:14 +0200
committerArnaud Bailly <arnaud@pankzsoft.com>2024-10-09 15:55:14 +0200
commitc8d286239ef0d14a985cdcc26e0eda57098a5db1 (patch)
treed1f9d4cd73e43b60000901ed5ccbc9b1a3922fb5
parent318f2008e708ea8fc2fde69525fd8ef530e68cc7 (diff)
downloadlambda-nantes-c8d286239ef0d14a985cdcc26e0eda57098a5db1.tar.gz
Generate multiple expressions
-rw-r--r--rust/src/lambda.rs12
-rw-r--r--rust/src/web.rs42
2 files changed, 48 insertions, 6 deletions
diff --git a/rust/src/lambda.rs b/rust/src/lambda.rs
index 8ac3e46..4027a62 100644
--- a/rust/src/lambda.rs
+++ b/rust/src/lambda.rs
@@ -117,15 +117,23 @@ pub fn generate_expr(size: u32, runner: &mut TestRunner) -> Value {
6 => simple_lambda().new_tree(runner).unwrap().current(),
7 => app_to_lambda().new_tree(runner).unwrap().current(),
8 => multi_app().new_tree(runner).unwrap().current(),
- 9 => any::<u32>()
+ _ => any::<u32>()
.prop_flat_map(gen_terms)
.new_tree(runner)
.unwrap()
.current(),
- _ => todo!(),
}
}
+pub fn generate_exprs(size: u32, runner: &mut TestRunner) -> Vec<Value> {
+ let sz = (0..size).new_tree(runner).unwrap().current();
+ (0..sz)
+ .collect::<Vec<_>>()
+ .into_iter()
+ .map(|_| generate_expr(size, runner))
+ .collect()
+}
+
fn simple_app() -> impl Strategy<Value = Value> {
let leaf = prop_oneof![any_num(), any_sym()];
(leaf.clone(), leaf.clone()).prop_map(|(l, r)| Value::App(Box::new(l), Box::new(r)))
diff --git a/rust/src/web.rs b/rust/src/web.rs
index 6bba34e..3b9fc9e 100644
--- a/rust/src/web.rs
+++ b/rust/src/web.rs
@@ -10,7 +10,7 @@ use std::{collections::HashMap, sync::Arc};
use tokio::task;
use uuid::Uuid;
-use lambda::lambda::{eval_all, eval_whnf, generate_expr, Environment};
+use lambda::lambda::{eval_all, eval_whnf, generate_expr, generate_exprs, Environment};
use lambda::parser::parse;
#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)]
@@ -67,9 +67,31 @@ impl Client {
}
fn generate_expr(&mut self) -> (String, String) {
- let input = generate_expr(self.grade.into(), &mut self.runner);
- let expected = eval_whnf(&input, &mut Environment::new());
- (input.to_string(), expected.to_string())
+ if self.grade >= 10 {
+ self.generate_exprs()
+ } else {
+ let input = generate_expr(self.grade.into(), &mut self.runner);
+ let expected = eval_whnf(&input, &mut Environment::new());
+ (input.to_string(), expected.to_string())
+ }
+ }
+
+ fn generate_exprs(&mut self) -> (String, String) {
+ let exprs = generate_exprs(self.grade.into(), &mut self.runner);
+ let input = exprs
+ .iter()
+ .map(|v| format!("{}", v))
+ .collect::<Vec<_>>()
+ .join("\n");
+ let expected = eval_all(&exprs);
+ (
+ input,
+ expected
+ .iter()
+ .map(|v| format!("{}", v))
+ .collect::<Vec<_>>()
+ .join("\n"),
+ )
}
fn check_result(
@@ -505,6 +527,18 @@ mod app_tests {
}
#[test]
+ async fn client_generates_multiple_terms_at_level_10() {
+ let mut client = client();
+ client.grade = 10;
+
+ let (input, _) = client.generate_expr();
+
+ let parsed = parse(&input);
+
+ assert!(parsed.len() > 1);
+ }
+
+ #[test]
async fn client_increases_grade_on_successful_test() {
let mut client = client();
let expected = "1".to_string();