about summary refs log tree commit diff
path: root/tests.nix
diff options
context:
space:
mode:
authorVincent Ambo <tazjin@google.com>2019-08-28T13·53+0100
committerVincent Ambo <tazjin@google.com>2019-08-28T13·55+0100
commit6468845255e5516d4567f9bef48d815549b20910 (patch)
tree156fdde8c89b19a099983698f84973972d3cc774 /tests.nix
parent34a591798179c87b84692712398359609a18c513 (diff)
chore: Change file layout to match repository instead of gist
Diffstat (limited to 'tests.nix')
-rw-r--r--tests.nix90
1 files changed, 90 insertions, 0 deletions
diff --git a/tests.nix b/tests.nix
new file mode 100644
index 000000000000..344f2c1f5934
--- /dev/null
+++ b/tests.nix
@@ -0,0 +1,90 @@
+with builtins;
+with (import ./default.nix {});
+
+# Note: Derivations are not included in the tests below as they cause
+# issues with deepSeq.
+
+deepSeq rec {
+  # Test that all primitive types match
+  primitives = [
+    (int 15)
+    (bool false)
+    (float 13.37)
+    (string "Hello!")
+    (function (x: x * 2))
+  ];
+
+  # Test that polymorphic types work as intended
+  poly = [
+    (option int null)
+    (list string [ "foo" "bar" ])
+    (either int float 42)
+  ];
+
+  # Test that structures work as planned.
+  person = struct "person" {
+    name = string;
+    age  = int;
+
+    contact = option (struct {
+      email = string;
+      phone = option string;
+    });
+  };
+
+  testPerson = person {
+    name = "Brynhjulf";
+    age  = 42;
+    contact.email = "brynhjulf@yants.nix";
+  };
+
+  # Test enum definitions & matching
+  colour = enum "colour" [ "red" "blue" "green" ];
+  testMatch = colour.match "red" {
+    red = "It is in fact red!";
+    blue = throw "It should not be blue!";
+    green = throw "It should not be green!";
+  };
+
+  # Test sum type definitions
+  creature = sum "creature" {
+    human = struct {
+      name = string;
+      age = option int;
+    };
+
+    pet = enum "pet" [ "dog" "lizard" "cat" ];
+  };
+
+  testSum = creature {
+    human = {
+      name = "Brynhjulf";
+      age = 42;
+    };
+  };
+
+  testSumMatch = creature.match testSum {
+    human = v: "It's a human named ${v.name}";
+    pet = v: throw "It's not supposed to be a pet!";
+  };
+
+  # Test curried function definitions
+  func = defun [ string int string ]
+  (name: age: "${name} is ${toString age} years old");
+
+  testFunc = func "Brynhjulf" 42;
+
+  # Test that all types are types.
+  testTypes = map type [
+    any bool drv float int string
+
+    (attrs int)
+    (either int string)
+    (enum [ "foo" "bar" ])
+    (list string)
+    (option int)
+    (option (list string))
+    (struct { a = int; b = option string; })
+    (sum { a = int; b = option string; })
+  ];
+} "All tests passed!\n"