This CL can be used to compare the style of nixpkgs-fmt against other formatters (nixpkgs, alejandra). Change-Id: I87c6abff6bcb546b02ead15ad0405f81e01b6d9e Reviewed-on: https://cl.tvl.fyi/c/depot/+/4397 Tested-by: BuildkiteCI Reviewed-by: sterni <sternenseemann@systemli.org> Reviewed-by: lukegb <lukegb@tvl.fyi> Reviewed-by: wpcarro <wpcarro@gmail.com> Reviewed-by: Profpatsch <mail@profpatsch.de> Reviewed-by: kanepyork <rikingcoding@gmail.com> Reviewed-by: tazjin <tazjin@tvl.su> Reviewed-by: cynthia <cynthia@tvl.fyi> Reviewed-by: edef <edef@edef.eu> Reviewed-by: eta <tvl@eta.st> Reviewed-by: grfn <grfn@gws.fyi>
		
			
				
	
	
		
			158 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { depot, pkgs, ... }:
 | |
| 
 | |
| with depot.nix.yants;
 | |
| 
 | |
| # Note: Derivations are not included in the tests below as they cause
 | |
| # issues with deepSeq.
 | |
| 
 | |
| let
 | |
| 
 | |
|   inherit (depot.nix.runTestsuite)
 | |
|     runTestsuite
 | |
|     it
 | |
|     assertEq
 | |
|     assertThrows
 | |
|     assertDoesNotThrow
 | |
|     ;
 | |
| 
 | |
|   # this derivation won't throw if evaluated with deepSeq
 | |
|   # unlike most things even remotely related with nixpkgs
 | |
|   trivialDerivation = derivation {
 | |
|     name = "trivial-derivation";
 | |
|     inherit (pkgs.stdenv) system;
 | |
|     builder = "/bin/sh";
 | |
|     args = [ "-c" "echo hello > $out" ];
 | |
|   };
 | |
| 
 | |
|   testPrimitives = it "checks that all primitive types match" [
 | |
|     (assertDoesNotThrow "unit type" (unit { }))
 | |
|     (assertDoesNotThrow "int type" (int 15))
 | |
|     (assertDoesNotThrow "bool type" (bool false))
 | |
|     (assertDoesNotThrow "float type" (float 13.37))
 | |
|     (assertDoesNotThrow "string type" (string "Hello!"))
 | |
|     (assertDoesNotThrow "function type" (function (x: x * 2)))
 | |
|     (assertDoesNotThrow "path type" (path /nix))
 | |
|     (assertDoesNotThrow "derivation type" (drv trivialDerivation))
 | |
|   ];
 | |
| 
 | |
|   testPoly = it "checks that polymorphic types work as intended" [
 | |
|     (assertDoesNotThrow "option type" (option int null))
 | |
|     (assertDoesNotThrow "list type" (list string [ "foo" "bar" ]))
 | |
|     (assertDoesNotThrow "either type" (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;
 | |
|     });
 | |
|   };
 | |
| 
 | |
|   testStruct = it "checks that structures work as intended" [
 | |
|     (assertDoesNotThrow "person struct" (person {
 | |
|       name = "Brynhjulf";
 | |
|       age = 42;
 | |
|       contact.email = "brynhjulf@yants.nix";
 | |
|     }))
 | |
|   ];
 | |
| 
 | |
|   # Test enum definitions & matching
 | |
|   colour = enum "colour" [ "red" "blue" "green" ];
 | |
|   colourMatcher = {
 | |
|     red = "It is in fact red!";
 | |
|     blue = "It should not be blue!";
 | |
|     green = "It should not be green!";
 | |
|   };
 | |
| 
 | |
|   testEnum = it "checks enum definitions and matching" [
 | |
|     (assertEq "enum is matched correctly"
 | |
|       "It is in fact red!"
 | |
|       (colour.match "red" colourMatcher))
 | |
|     (assertThrows "out of bounds enum fails"
 | |
|       (colour.match "alpha" (colourMatcher // {
 | |
|         alpha = "This should never happen";
 | |
|       }))
 | |
|     )
 | |
|   ];
 | |
| 
 | |
|   # Test sum type definitions
 | |
|   creature = sum "creature" {
 | |
|     human = struct {
 | |
|       name = string;
 | |
|       age = option int;
 | |
|     };
 | |
| 
 | |
|     pet = enum "pet" [ "dog" "lizard" "cat" ];
 | |
|   };
 | |
|   some-human = creature {
 | |
|     human = {
 | |
|       name = "Brynhjulf";
 | |
|       age = 42;
 | |
|     };
 | |
|   };
 | |
| 
 | |
|   testSum = it "checks sum types definitions and matching" [
 | |
|     (assertDoesNotThrow "creature sum type" some-human)
 | |
|     (assertEq "sum type is matched correctly"
 | |
|       "It's a human named Brynhjulf"
 | |
|       (creature.match some-human {
 | |
|         human = v: "It's a human named ${v.name}";
 | |
|         pet = v: "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");
 | |
| 
 | |
|   testFunctions = it "checks function definitions" [
 | |
|     (assertDoesNotThrow "function application" (func "Brynhjulf" 42))
 | |
|   ];
 | |
| 
 | |
|   # Test that all types are types.
 | |
|   assertIsType = name: t:
 | |
|     assertDoesNotThrow "${name} is a type" (type t);
 | |
|   testTypes = it "checks that all types are types" [
 | |
|     (assertIsType "any" any)
 | |
|     (assertIsType "bool" bool)
 | |
|     (assertIsType "drv" drv)
 | |
|     (assertIsType "float" float)
 | |
|     (assertIsType "int" int)
 | |
|     (assertIsType "string" string)
 | |
|     (assertIsType "path" path)
 | |
| 
 | |
|     (assertIsType "attrs int" (attrs int))
 | |
|     (assertIsType "eitherN [ ... ]" (eitherN [ int string bool ]))
 | |
|     (assertIsType "either int string" (either int string))
 | |
|     (assertIsType "enum [ ... ]" (enum [ "foo" "bar" ]))
 | |
|     (assertIsType "list string" (list string))
 | |
|     (assertIsType "option int" (option int))
 | |
|     (assertIsType "option (list string)" (option (list string)))
 | |
|     (assertIsType "struct { ... }" (struct { a = int; b = option string; }))
 | |
|     (assertIsType "sum { ... }" (sum { a = int; b = option string; }))
 | |
|   ];
 | |
| 
 | |
|   testRestrict = it "checks restrict types" [
 | |
|     (assertDoesNotThrow "< 42" ((restrict "< 42" (i: i < 42) int) 25))
 | |
|     (assertDoesNotThrow "list length < 3"
 | |
|       ((restrict "not too long" (l: builtins.length l < 3) (list int)) [ 1 2 ]))
 | |
|     (assertDoesNotThrow "list eq 5"
 | |
|       (list (restrict "eq 5" (v: v == 5) any) [ 5 5 5 ]))
 | |
|   ];
 | |
| 
 | |
| in
 | |
| runTestsuite "yants" [
 | |
|   testPrimitives
 | |
|   testPoly
 | |
|   testStruct
 | |
|   testEnum
 | |
|   testSum
 | |
|   testFunctions
 | |
|   testTypes
 | |
|   testRestrict
 | |
| ]
 |