about summary refs log tree commit diff
path: root/tvix
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2023-01-01T12·32+0300
committertazjin <tazjin@tvl.su>2023-01-03T13·37+0000
commit00dab6142ed30a5de93ab0c549916b10fa60036a (patch)
treea3e5a06bdd3cce5f040d31f99147c79e363af42b /tvix
parent4350be34d1a826312b799f6d509aed02e363de14 (diff)
test(tvix/serde): add initial set of deserialisation tests r/5576
Change-Id: I0a9779edf0296c25d37fb5f75f8fc5852fe00121
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7715
Tested-by: BuildkiteCI
Autosubmit: tazjin <tazjin@tvl.su>
Reviewed-by: flokli <flokli@flokli.de>
Diffstat (limited to 'tvix')
-rw-r--r--tvix/Cargo.nix1
-rw-r--r--tvix/serde/Cargo.toml2
-rw-r--r--tvix/serde/src/de_tests.rs82
-rw-r--r--tvix/serde/src/lib.rs3
4 files changed, 87 insertions, 1 deletions
diff --git a/tvix/Cargo.nix b/tvix/Cargo.nix
index d96632e053..3511c5e742 100644
--- a/tvix/Cargo.nix
+++ b/tvix/Cargo.nix
@@ -6633,6 +6633,7 @@ rec {
           {
             name = "serde";
             packageId = "serde";
+            features = [ "derive" ];
           }
           {
             name = "tvix-eval";
diff --git a/tvix/serde/Cargo.toml b/tvix/serde/Cargo.toml
index 37a0597e04..8ffc11a4eb 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 0000000000..1b9bc04d23
--- /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 b3052be596..41ad23b185 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;