@ -1,18 +1,26 @@
{ depot , lib , pkgs , . . . }:
{
depot ,
lib ,
pkgs ,
. . .
} :
let
inherit ( lib ) partition optionalAttrs any ;
inherit ( builtins ) tryEval ;
it = msg : asserts :
it =
msg : asserts :
let
results = partition ( a : a . ok ) asserts ;
in
{
_it = msg ;
} // optionalAttrs ( results . right != [ ] ) {
}
// optionalAttrs ( results . right != [ ] ) {
passes = map ( result : result . test ) results . right ;
} // optionalAttrs ( results . wrong != [ ] ) {
}
// optionalAttrs ( results . wrong != [ ] ) {
fails = map ( result : result . test ) results . wrong ;
} ;
@ -21,16 +29,18 @@ let
ok = a = = b ;
} ;
assertThrows = test : value :
assertThrows =
test : value :
let
value' = tryEval value ;
in
{
inherit test ;
ok = ! value' . success ;
ok = ! value' . success ;
} ;
runTestsuite = name : its :
runTestsuite =
name : its :
let
fails = any ( it' : it' ? fails ) its ;
in
@ -42,11 +52,14 @@ let
inherit its ;
}
(
if fails then ''
jq ' . its' < . attrs . json
'' e l s e ''
jq ' . its' < . attrs . json > $ out
''
if fails then
''
jq ' . its' < . attrs . json
''
else
''
jq ' . its' < . attrs . json > $ out
''
) ;
tree-ex = depot . nix . readTree {
@ -55,25 +68,14 @@ let
} ;
example = it " c o r r e s p o n d s t o t h e R E A D M E e x a m p l e " [
( assertEq " t h i r d _ p a r t y a t t r s e t "
( lib . isAttrs tree-ex . third_party
&& ( ! lib . isDerivation tree-ex . third_party ) )
true )
( assertEq " t h i r d _ p a r t y a t t r s e t o t h e r a t t r i b u t e "
tree-ex . third_party . favouriteColour
" o r a n g e " )
( assertEq " r u s t p k g s a t t r s e t a h o - c o r a s i c k "
tree-ex . third_party . rustpkgs . aho-corasick
" a h o - c o r a s i c k " )
( assertEq " r u s t p k g s a t t r s e t s e r d e "
tree-ex . third_party . rustpkgs . serde
" s e r d e " )
( assertEq " t o o l s c h e d d e a r "
" c h e d d a r "
tree-ex . tools . cheddar )
( assertEq " t o o l s r o q u e f o r t "
tree-ex . tools . roquefort
" r o q u e f o r t " )
( assertEq " t h i r d _ p a r t y a t t r s e t " (
lib . isAttrs tree-ex . third_party && ( ! lib . isDerivation tree-ex . third_party )
) true )
( assertEq " t h i r d _ p a r t y a t t r s e t o t h e r a t t r i b u t e " tree-ex . third_party . favouriteColour " o r a n g e " )
( assertEq " r u s t p k g s a t t r s e t a h o - c o r a s i c k " tree-ex . third_party . rustpkgs . aho-corasick " a h o - c o r a s i c k " )
( assertEq " r u s t p k g s a t t r s e t s e r d e " tree-ex . third_party . rustpkgs . serde " s e r d e " )
( assertEq " t o o l s c h e d d e a r " " c h e d d a r " tree-ex . tools . cheddar )
( assertEq " t o o l s r o q u e f o r t " tree-ex . tools . roquefort " r o q u e f o r t " )
] ;
tree-tl = depot . nix . readTree {
@ -82,65 +84,64 @@ let
} ;
traversal-logic = it " c o r r e s p o n d s t o t h e t r a v e r s a l l o g i c i n t h e R E A D M E " [
( assertEq " s k i p - t r e e / a i s r e a d "
tree-tl . skip-tree . a
" a i s r e a d n o r m a l l y " )
( assertEq " s k i p - t r e e d o e s n o t c o n t a i n b "
( builtins . attrNames tree-tl . skip-tree )
[ " _ _ r e a d T r e e " " _ _ r e a d T r e e C h i l d r e n " " a " ] )
( assertEq " s k i p - t r e e c h i l d r e n l i s t d o e s n o t c o n t a i n b "
tree-tl . skip-tree . __readTreeChildren
[ " a " ] )
( assertEq " s k i p - t r e e / a i s r e a d " tree-tl . skip-tree . a " a i s r e a d n o r m a l l y " )
( assertEq " s k i p - t r e e d o e s n o t c o n t a i n b " ( builtins . attrNames tree-tl . skip-tree ) [
" _ _ r e a d T r e e "
" _ _ r e a d T r e e C h i l d r e n "
" a "
] )
( assertEq " s k i p - t r e e c h i l d r e n l i s t d o e s n o t c o n t a i n b " tree-tl . skip-tree . __readTreeChildren [ " a " ] )
( assertEq " s k i p s u b t r e e d e f a u l t . n i x i s r e a d "
tree-tl . skip-subtree . but
" t h e d e f a u l t . n i x i s s t i l l r e a d " )
( assertEq " s k i p s u b t r e e a / d e f a u l t . n i x i s s k i p p e d "
( tree-tl . skip-subtree ? a )
false )
( assertEq " s k i p s u b t r e e b / c . n i x i s s k i p p e d "
( tree-tl . skip-subtree ? b )
false )
( assertEq " s k i p s u b t r e e d e f a u l t . n i x i s r e a d " tree-tl . skip-subtree . but
" t h e d e f a u l t . n i x i s s t i l l r e a d "
)
( assertEq " s k i p s u b t r e e a / d e f a u l t . n i x i s s k i p p e d " ( tree-tl . skip-subtree ? a ) false )
( assertEq " s k i p s u b t r e e b / c . n i x i s s k i p p e d " ( tree-tl . skip-subtree ? b ) false )
( assertEq " s k i p s u b t r e e a / d e f a u l t . n i x w o u l d b e r e a d w i t h o u t . s k i p - s u b t r e e "
( tree-tl . no-skip-subtree . a )
" a m I s u b t r e e y e t ? " )
( assertEq " s k i p s u b t r e e b / c . n i x w o u l d b e r e a d w i t h o u t . s k i p - s u b t r e e "
( tree-tl . no-skip-subtree . b . c )
" c o o l " )
" a m I s u b t r e e y e t ? "
)
( assertEq " s k i p s u b t r e e b / c . n i x w o u l d b e r e a d w i t h o u t . s k i p - s u b t r e e " ( tree-tl . no-skip-subtree . b . c
) " c o o l " )
( assertEq " d e f a u l t . n i x a t t r s e t i s m e r g e d w i t h s i b l i n g s "
tree-tl . default-nix . no
" s i b l i n g s s h o u l d b e r e a d " )
( assertEq " d e f a u l t . n i x m e a n s s i b l i n g i s n ’ t r e a d "
( tree-tl . default-nix ? sibling )
false )
( assertEq " d e f a u l t . n i x a t t r s e t i s m e r g e d w i t h s i b l i n g s " tree-tl . default-nix . no
" s i b l i n g s s h o u l d b e r e a d "
)
( assertEq " d e f a u l t . n i x m e a n s s i b l i n g i s n ’ t r e a d " ( tree-tl . default-nix ? sibling ) false )
( assertEq " d e f a u l t . n i x m e a n s s u b d i r s a r e s t i l l r e a d a n d m e r g e d i n t o d e f a u l t . n i x "
( tree-tl . default-nix . subdir . a )
" b u t I ’ m p i c k e d u p " )
" b u t I ’ m p i c k e d u p "
)
( assertEq " d e f a u l t . n i x c a n b e n o t a n a t t r s e t "
tree-tl . default-nix . no-merge
" I ’ m n o t m e r g e d w i t h a n y c h i l d r e n " )
( assertEq " d e f a u l t . n i x i s n o t a n a t t r s e t - > c h i l d r e n a r e n o t m e r g e d "
( tree-tl . default-nix . no-merge ? subdir )
false )
( assertEq " d e f a u l t . n i x c a n b e n o t a n a t t r s e t " tree-tl . default-nix . no-merge
" I ’ m n o t m e r g e d w i t h a n y c h i l d r e n "
)
( assertEq " d e f a u l t . n i x i s n o t a n a t t r s e t - > c h i l d r e n a r e n o t m e r g e d " (
tree-tl . default-nix . no-merge ? subdir
) false )
( assertEq " d e f a u l t . n i x c a n c o n t a i n a d e r i v a t i o n "
( lib . isDerivation tree-tl . default-nix . can-be-drv )
true )
( assertEq " d e f a u l t . n i x c a n c o n t a i n a d e r i v a t i o n " ( lib . isDerivation tree-tl . default-nix . can-be-drv )
true
)
( assertEq " E v e n i f d e f a u l t . n i x i s a d e r i v a t i o n , c h i l d r e n a r e t r a v e r s e d a n d m e r g e d "
tree-tl . default-nix . can-be-drv . subdir . a
" P i c k e d u p t h r o u g h t h e d r v " )
( assertEq " d e f a u l t . n i x d r v i s n o t c h a n g e d b y r e a d T r e e "
tree-tl . default-nix . can-be-drv
( import ./test-tree-traversal/default-nix/can-be-drv/default.nix { } ) )
" P i c k e d u p t h r o u g h t h e d r v "
)
( assertEq " d e f a u l t . n i x d r v i s n o t c h a n g e d b y r e a d T r e e " tree-tl . default-nix . can-be-drv (
import ./test-tree-traversal/default-nix/can-be-drv/default.nix { }
) )
( assertEq " ` h e r e ` a r g u m e n t r e p r e s e n t s t h e a t t r s e t a g i v e n f i l e i s p a r t o f "
( builtins . removeAttrs tree-tl . here-arg [ " _ _ r e a d T r e e " " _ _ r e a d T r e e C h i l d r e n " " s u b d i r " ] )
( builtins . removeAttrs tree-tl . here-arg [
" _ _ r e a d T r e e "
" _ _ r e a d T r e e C h i l d r e n "
" s u b d i r "
] )
{
attr1 = " f o o " ;
attr2 = " f o o " ;
attr3 = " s i b l 1 " ;
} )
}
)
] ;
# these each call readTree themselves because the throws have to happen inside assertThrows
@ -149,7 +150,8 @@ let
( depot . nix . readTree {
path = ./test-wrong-not-a-function ;
args = { } ;
} ) . not-a-function )
} ) . not-a-function
)
# can’ t test for that, assertThrows can’ t catch this error
# (assertThrows "this file is a function but doesn’ t have dots"
# (depot.nix.readTree {} ./test-wrong-no-dots).no-dots-in-function)
@ -160,22 +162,36 @@ let
args = { } ;
} ;
assertMarkerByPath = path :
assertMarkerByPath =
path :
assertEq " ${ lib . concatStringsSep " . " path } i s m a r k e d c o r r e c t l y "
( lib . getAttrFromPath path read-markers ) . __readTree
path ;
markers = it " m a r k s n o d e s c o r r e c t l y " [
( assertMarkerByPath [ " d i r e c t o r y - m a r k e d " ] )
( assertMarkerByPath [ " d i r e c t o r y - m a r k e d " " n e s t e d " ] )
( assertMarkerByPath [ " f i l e - c h i l d r e n " " o n e " ] )
( assertMarkerByPath [ " f i l e - c h i l d r e n " " t w o " ] )
( assertEq " n i x f i l e c h i l d r e n a r e m a r k e d c o r r e c t l y "
read-markers . file-children . __readTreeChildren [ " o n e " " t w o " ] )
( assertEq " d i r e c t o r y c h i l d r e n a r e m a r k e d c o r r e c t l y "
read-markers . directory-marked . __readTreeChildren [ " n e s t e d " ] )
( assertEq " a b s e n c e o f c h i l d r e n i s m a r k e d "
read-markers . directory-marked . nested . __readTreeChildren [ ] )
( assertMarkerByPath [
" d i r e c t o r y - m a r k e d "
" n e s t e d "
] )
( assertMarkerByPath [
" f i l e - c h i l d r e n "
" o n e "
] )
( assertMarkerByPath [
" f i l e - c h i l d r e n "
" t w o "
] )
( assertEq " n i x f i l e c h i l d r e n a r e m a r k e d c o r r e c t l y " read-markers . file-children . __readTreeChildren [
" o n e "
" t w o "
] )
( assertEq " d i r e c t o r y c h i l d r e n a r e m a r k e d c o r r e c t l y " read-markers . directory-marked . __readTreeChildren
[ " n e s t e d " ]
)
( assertEq " a b s e n c e o f c h i l d r e n i s m a r k e d " read-markers . directory-marked . nested . __readTreeChildren
[ ]
)
] ;
in