Something went wrong. Try again.
What happens if I push all of nixpkgs
Something went wrong. Try again.
6.0 kB · 263 lines
Nix
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264{ stdenv, runCommand, lib, pname, idris2, idris2Packages, zsh, tree,}:
let testCompileAndRun = { testName, code, want, packages ? [ ], }: let packageString = builtins.concatStringsSep " " (map (p: "--package " + p) packages); in runCommand "${pname}-${testName}" { meta.timeout = 60;
# with idris2 compiled binaries assume zsh is available on darwin, but that # is not the case with pure nix environments. Thus, we need to include zsh # when we build for darwin in tests. While this is impure, this is also what # we find in real darwin hosts. nativeBuildInputs = lib.optionals stdenv.hostPlatform.isDarwin [ zsh ]; } '' set -eo pipefail
cat > packageTest.idr <<HERE ${code} HERE
${idris2}/bin/idris2 ${packageString} -o packageTest packageTest.idr
GOT=$(./build/exec/packageTest)
if [ "$GOT" = "${want}" ]; then echo "${testName} SUCCESS: '$GOT' = '${want}'" else >&2 echo "Got '$GOT', want: '${want}'" exit 1 fi
touch $out '';
testBuildIdris = { testName, buildIdrisArgs, # function that takes result of `buildIdris` and transforms it (commonly # by calling `.executable` or `.library {}` upon it): transformBuildIdrisOutput, expectedTree, }: let idrisPkg = transformBuildIdrisOutput (idris2Packages.buildIdris buildIdrisArgs); in runCommand "${pname}-${testName}" { meta.timeout = 60;
nativeBuildInputs = [ tree ]; } '' GOT="$(tree ${idrisPkg} | tail -n +2)"
if [ "$GOT" = '${expectedTree}' ]; then echo "${testName} SUCCESS" else >&2 echo "Got: $GOT" >&2 echo 'want: ${expectedTree}' exit 1 fi
touch $out '';in{ # Simple hello world compiles, runs and outputs as expected helloWorld = testCompileAndRun { testName = "hello-world"; code = '' module Main
main : IO () main = putStrLn "Hello World!" ''; want = "Hello World!"; };
# Data.Vect.Sort is available via --package contrib useContrib = testCompileAndRun { testName = "use-contrib"; packages = [ "contrib" ]; code = '' module Main
import Data.Vect import Data.Vect.Sort -- from contrib
vect : Vect 3 Int vect = 3 :: 1 :: 5 :: Nil
main : IO () main = putStrLn $ show (sort vect) ''; want = "[1, 3, 5]"; };
buildLibrary = testBuildIdris { testName = "library-package"; buildIdrisArgs = { ipkgName = "pkg"; idrisLibraries = [ idris2Packages.idris2Api ]; src = runCommand "library-package-src" { } '' mkdir $out
cat > $out/Main.idr <<EOF module Main
import Compiler.ANF -- from Idris2Api
hello : String hello = "world" EOF
cat > $out/pkg.ipkg <<EOF package pkg modules = Main depends = idris2 EOF ''; }; transformBuildIdrisOutput = pkg: pkg.library { withSource = false; }; expectedTree = '' `-- lib `-- idris2-0.7.0 `-- pkg-0 |-- 2023090800 | |-- Main.ttc | `-- Main.ttm `-- pkg.ipkg
5 directories, 3 files''; };
buildLibraryWithSource = testBuildIdris { testName = "library-with-source-package"; buildIdrisArgs = { ipkgName = "pkg"; idrisLibraries = [ idris2Packages.idris2Api ]; src = runCommand "library-package-src" { } '' mkdir $out
cat > $out/Main.idr <<EOF module Main
import Compiler.ANF -- from Idris2Api
hello : String hello = "world" EOF
cat > $out/pkg.ipkg <<EOF package pkg modules = Main depends = idris2 EOF ''; }; transformBuildIdrisOutput = pkg: pkg.library { withSource = true; }; expectedTree = '' `-- lib `-- idris2-0.7.0 `-- pkg-0 |-- 2023090800 | |-- Main.ttc | `-- Main.ttm |-- Main.idr `-- pkg.ipkg
5 directories, 4 files''; };
buildLibraryWithSourceRetroactively = testBuildIdris { testName = "library-with-source-retro-package"; buildIdrisArgs = { ipkgName = "pkg"; idrisLibraries = [ idris2Packages.idris2Api ]; src = runCommand "library-package-src" { } '' mkdir $out
cat > $out/Main.idr <<EOF module Main
import Compiler.ANF -- from Idris2Api
hello : String hello = "world" EOF
cat > $out/pkg.ipkg <<EOF package pkg modules = Main depends = idris2 EOF ''; }; transformBuildIdrisOutput = pkg: pkg.library'.withSource; expectedTree = '' `-- lib `-- idris2-0.7.0 `-- pkg-0 |-- 2023090800 | |-- Main.ttc | `-- Main.ttm |-- Main.idr `-- pkg.ipkg
5 directories, 4 files''; };
buildExecutable = testBuildIdris { testName = "executable-package"; buildIdrisArgs = { ipkgName = "pkg"; idrisLibraries = [ ]; src = runCommand "executable-package-src" { } '' mkdir $out
cat > $out/Main.idr <<EOF module Main
main : IO () main = putStrLn "hi" EOF
cat > $out/pkg.ipkg <<EOF package pkg modules = Main main = Main executable = mypkg EOF ''; }; transformBuildIdrisOutput = pkg: pkg.executable; expectedTree = '' `-- bin `-- mypkg
2 directories, 1 file''; };}