about summary refs log tree commit diff
path: root/tvix/serde
diff options
context:
space:
mode:
Diffstat (limited to 'tvix/serde')
-rw-r--r--tvix/serde/Cargo.toml2
-rw-r--r--tvix/serde/src/de_tests.rs82
-rw-r--r--tvix/serde/src/lib.rs3
3 files changed, 86 insertions, 1 deletions
diff --git a/tvix/serde/Cargo.toml b/tvix/serde/Cargo.toml
index 37a0597e0451..8ffc11a4eb6e 100644
--- a/tvix/serde/Cargo.toml
+++ b/tvix/serde/Cargo.toml
@@ -5,4 +5,4 @@ edition = "2021"
 
 [dependencies]
 tvix-eval = { path = "../eval" }
-serde = "1.0"
+serde = { version = "1.0", features = ["derive"] }
diff --git a/tvix/serde/src/de_tests.rs b/tvix/serde/src/de_tests.rs
new file mode 100644
index 000000000000..1b9bc04d2362
--- /dev/null
+++ b/tvix/serde/src/de_tests.rs
@@ -0,0 +1,82 @@
+use serde::Deserialize;
+use std::collections::HashMap;
+
+use crate::de::from_str;
+
+#[test]
+fn deserialize_none() {
+    let result: Option<usize> = from_str("null").expect("should deserialize");
+    assert_eq!(None, result);
+}
+
+#[test]
+fn deserialize_some() {
+    let result: Option<usize> = from_str("40 + 2").expect("should deserialize");
+    assert_eq!(Some(42), result);
+}
+
+#[test]
+fn deserialize_string() {
+    let result: String = from_str(
+        r#"
+      let greeter = name: "Hello ${name}!";
+      in greeter "Slartibartfast"
+    "#,
+    )
+    .expect("should deserialize");
+
+    assert_eq!(result, "Hello Slartibartfast!");
+}
+
+#[test]
+fn deserialize_empty_list() {
+    let result: Vec<usize> = from_str("[ ]").expect("should deserialize");
+    assert!(result.is_empty())
+}
+
+#[test]
+fn deserialize_integer_list() {
+    let result: Vec<usize> =
+        from_str("builtins.map (n: n + 2) [ 21 40 67 ]").expect("should deserialize");
+    assert_eq!(result, vec![23, 42, 69]);
+}
+
+#[test]
+fn deserialize_empty_map() {
+    let result: HashMap<String, usize> = from_str("{ }").expect("should deserialize");
+    assert!(result.is_empty());
+}
+
+#[test]
+fn deserialize_integer_map() {
+    let result: HashMap<String, usize> = from_str("{ age = 40 + 2; }").expect("should deserialize");
+    assert_eq!(result.len(), 1);
+    assert_eq!(*result.get("age").unwrap(), 42);
+}
+
+#[test]
+fn deserialize_struct() {
+    #[derive(Debug, Deserialize, PartialEq)]
+    struct Person {
+        name: String,
+        age: usize,
+    }
+
+    let result: Person = from_str(
+        r#"
+    {
+      name = "Slartibartfast";
+      age = 42;
+    }
+    "#,
+    )
+    .expect("should deserialize");
+
+    assert_eq!(
+        result,
+        Person {
+            name: "Slartibartfast".into(),
+            age: 42,
+        }
+    );
+}
diff --git a/tvix/serde/src/lib.rs b/tvix/serde/src/lib.rs
index b3052be596f7..41ad23b18587 100644
--- a/tvix/serde/src/lib.rs
+++ b/tvix/serde/src/lib.rs
@@ -6,3 +6,6 @@ mod de;
 mod error;
 
 pub use de::from_str;
+
+#[cfg(test)]
+mod de_tests;