diff options
| -rw-r--r-- | lambda-calcul/rust/README.md | 1 | ||||
| -rw-r--r-- | lambda-calcul/rust/src/ast.rs | 22 |
2 files changed, 21 insertions, 2 deletions
diff --git a/lambda-calcul/rust/README.md b/lambda-calcul/rust/README.md index 89c81d2..0b13e5c 100644 --- a/lambda-calcul/rust/README.md +++ b/lambda-calcul/rust/README.md @@ -73,6 +73,7 @@ There are `--port` and `--host` arguments should one want to change the default * [ ] propose to send JSON or S-Exp * [ ] persist user state to avoid losing connections * [ ] deploy automatically server on punkachien.net with radicle CI +* [ ] better JSON representation for AST than raw serde stuff * [ ] ask people to implement something * [ ] prepare starter kit to overcome diff --git a/lambda-calcul/rust/src/ast.rs b/lambda-calcul/rust/src/ast.rs index d0f1d6f..0aaeab4 100644 --- a/lambda-calcul/rust/src/ast.rs +++ b/lambda-calcul/rust/src/ast.rs @@ -102,7 +102,6 @@ mod ast_tests { use proptest::prelude::*; proptest! { - #[test] fn display_multiple_applications_as_a_sequence(atoms in vec("[a-z]".prop_map(Sym), 2..10)) { let init = atoms.first().unwrap().clone(); @@ -112,6 +111,25 @@ mod ast_tests { assert_eq!(value.to_string(), format!("({})", atoms.iter().map(|v| v.to_string()).collect::<Vec<String>>().join(" "))); - } + } + + #[test] + fn can_serialize_and_deserialize(value in any::<Value>()) { + let serialized = serde_json::to_string(&value).unwrap(); + let deserialized: Value = serde_json::from_str(&serialized).unwrap(); + assert_eq!(value, deserialized); + } + } + + #[test] + fn can_represent_let_expression_in_json() { + let let_expr = Let( + "x".to_string(), + Box::new(Num(42)), + Box::new(Sym("x".to_string())), + ); + let serialized = serde_json::to_string(&let_expr).unwrap(); + let expected = r#"{"Let":["x",{"Num":42},{"Sym":"x"}]}"#; + assert_eq!(serialized, expected); } } |
