diff options
Diffstat (limited to 'nixpkgs/pkgs/build-support/writers/test.nix')
-rw-r--r-- | nixpkgs/pkgs/build-support/writers/test.nix | 419 |
1 files changed, 419 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/build-support/writers/test.nix b/nixpkgs/pkgs/build-support/writers/test.nix new file mode 100644 index 000000000000..656d127930fa --- /dev/null +++ b/nixpkgs/pkgs/build-support/writers/test.nix @@ -0,0 +1,419 @@ +{ haskellPackages +, lib +, nodePackages +, perlPackages +, python3Packages +, runCommand +, testers +, writers +, writeText +}: + +# If you are reading this, you can test these writers by running: nix-build . -A tests.writers + +let + inherit (lib) getExe recurseIntoAttrs; + + inherit (writers) + makeFSharpWriter + writeBash + writeBashBin + writeDash + writeDashBin + writeFish + writeFishBin + writeFSharp + writeHaskell + writeHaskellBin + writeJS + writeJSBin + writeJSON + writeLua + writeNu + writePerl + writePerlBin + writePyPy3 + writePython3 + writePython3Bin + writeRuby + writeRust + writeRustBin + writeText + writeTOML + writeYAML + ; + + expectSuccess = test: + runCommand "run-${test.name}" {} '' + if [[ "$(${test})" != success ]]; then + echo 'test ${test.name} failed' + exit 1 + fi + + touch $out + ''; + + expectSuccessBin = test: + runCommand "run-${test.name}" {} '' + if [[ "$(${getExe test})" != success ]]; then + echo 'test ${test.name} failed' + exit 1 + fi + + touch $out + ''; + + expectDataEqual = { file, expected }: + let + expectedFile = writeText "${file.name}-expected" expected; + in + testers.testEqualContents { expected = expectedFile; actual = file; assertion = "${file.name} matches"; }; +in +recurseIntoAttrs { + bin = recurseIntoAttrs { + bash = expectSuccessBin (writeBashBin "test-writers-bash-bin" '' + if [[ "test" == "test" ]]; then echo "success"; fi + ''); + + dash = expectSuccessBin (writeDashBin "test-writers-dash-bin" '' + test '~' = '~' && echo 'success' + ''); + + fish = expectSuccessBin (writeFishBin "test-writers-fish-bin" '' + if test "test" = "test" + echo "success" + end + ''); + + rust = expectSuccessBin (writeRustBin "test-writers-rust-bin" {} '' + fn main(){ + println!("success") + } + ''); + + haskell = expectSuccessBin (writeHaskellBin "test-writers-haskell-bin" { libraries = [ haskellPackages.acme-default ]; } '' + import Data.Default + + int :: Int + int = def + + main :: IO () + main = case int of + 18871 -> putStrLn $ id "success" + _ -> print "fail" + ''); + + js = expectSuccessBin (writeJSBin "test-writers-js-bin" { libraries = [ nodePackages.semver ]; } '' + var semver = require('semver'); + + if (semver.valid('1.2.3')) { + console.log('success') + } else { + console.log('fail') + } + ''); + + perl = expectSuccessBin (writePerlBin "test-writers-perl-bin" { libraries = [ perlPackages.boolean ]; } '' + use boolean; + print "success\n" if true; + ''); + + python3 = expectSuccessBin (writePython3Bin "test-writers-python3-bin" { libraries = [ python3Packages.pyyaml ]; } '' + import yaml + + y = yaml.safe_load(""" + - test: success + """) + print(y[0]['test']) + ''); + + # Commented out because of this issue: https://github.com/NixOS/nixpkgs/issues/39356 + + #pypy2 = expectSuccessBin (writePyPy2Bin "test-writers-pypy2-bin" { libraries = [ pypy2Packages.enum ]; } '' + # from enum import Enum + # + # class Test(Enum): + # a = "success" + # + # print Test.a + #''); + + #pypy3 = expectSuccessBin (writePyPy3Bin "test-writers-pypy3-bin" { libraries = [ pypy3Packages.pyyaml ]; } '' + # import yaml + # + # y = yaml.safe_load(""" + # - test: success + # """) + # print(y[0]['test']) + #''); + + # Could not test this because of external package issues :( + #lua = writeLuaBin "test-writers-lua-bin" { libraries = [ pkgs.luaPackages.say ]; } '' + # s = require("say") + # s:set_namespace("en") + + # s:set('money', 'I have %s dollars') + # s:set('wow', 'So much money!') + + # print(s('money', {1000})) -- I have 1000 dollars + + # s:set_namespace("fr") -- switch to french! + # s:set('wow', "Tant d'argent!") + + # print(s('wow')) -- Tant d'argent! + # s:set_namespace("en") -- switch back to english! + # print(s('wow')) -- So much money! + #''; + + #ruby = expectSuccessBin (writeRubyBin "test-writers-ruby-bin" { libraries = [ rubyPackages.rubocop ]; } '' + #puts "This should work!" + #''); + }; + + simple = recurseIntoAttrs { + bash = expectSuccess (writeBash "test-writers-bash" '' + if [[ "test" == "test" ]]; then echo "success"; fi + ''); + + dash = expectSuccess (writeDash "test-writers-dash" '' + test '~' = '~' && echo 'success' + ''); + + fish = expectSuccess (writeFish "test-writers-fish" '' + if test "test" = "test" + echo "success" + end + ''); + + nu = expectSuccess (writeNu "test-writers-nushell" '' + echo "success" + ''); + + haskell = expectSuccess (writeHaskell "test-writers-haskell" { libraries = [ haskellPackages.acme-default ]; } '' + import Data.Default + + int :: Int + int = def + + main :: IO () + main = case int of + 18871 -> putStrLn $ id "success" + _ -> print "fail" + ''); + + js = expectSuccess (writeJS "test-writers-js" { libraries = [ nodePackages.semver ]; } '' + var semver = require('semver'); + + if (semver.valid('1.2.3')) { + console.log('success') + } else { + console.log('fail') + } + ''); + + perl = expectSuccess (writePerl "test-writers-perl" { libraries = [ perlPackages.boolean ]; } '' + use boolean; + print "success\n" if true; + ''); + + python3 = expectSuccess (writePython3 "test-writers-python3" { libraries = [ python3Packages.pyyaml ]; } '' + import yaml + + y = yaml.safe_load(""" + - test: success + """) + print(y[0]['test']) + ''); + + # Commented out because of this issue: https://github.com/NixOS/nixpkgs/issues/39356 + + #pypy2 = expectSuccessBin (writePyPy2Bin "test-writers-pypy2-bin" { libraries = [ pypy2Packages.enum ]; } '' + # from enum import Enum + # + # class Test(Enum): + # a = "success" + # + # print Test.a + #''); + + #pypy3 = expectSuccessBin (writePyPy3Bin "test-writers-pypy3-bin" { libraries = [ pypy3Packages.pyyaml ]; } '' + # import yaml + # + # y = yaml.safe_load(""" + # - test: success + # """) + # print(y[0]['test']) + #''); + + fsharp = expectSuccess (makeFSharpWriter { + libraries = { fetchNuGet }: [ + (fetchNuGet { pname = "FSharp.SystemTextJson"; version = "0.17.4"; sha256 = "1bplzc9ybdqspii4q28l8gmfvzpkmgq5l1hlsiyg2h46w881lwg2"; }) + (fetchNuGet { pname = "System.Text.Json"; version = "4.6.0"; sha256 = "0ism236hwi0k6axssfq58s1d8lihplwiz058pdvl8al71hagri39"; }) + ]; + } "test-writers-fsharp" '' + + #r "nuget: FSharp.SystemTextJson, 0.17.4" + + module Json = + open System.Text.Json + open System.Text.Json.Serialization + let options = JsonSerializerOptions() + options.Converters.Add(JsonFSharpConverter()) + let serialize<'a> (o: 'a) = JsonSerializer.Serialize<'a>(o, options) + let deserialize<'a> (str: string) = JsonSerializer.Deserialize<'a>(str, options) + + type Letter = A | B + let a = {| Hello = Some "World"; Letter = A |} + if a |> Json.serialize |> Json.deserialize |> (=) a + then "success" + else "failed" + |> printfn "%s" + ''); + + #pypy2NoLibs = expectSuccess (writePyPy2 "test-writers-pypy2-no-libs" {} '' + # print("success") + #''); + + python3NoLibs = expectSuccess (writePython3 "test-writers-python3-no-libs" {} '' + print("success") + ''); + + pypy3NoLibs = expectSuccess (writePyPy3 "test-writers-pypy3-no-libs" {} '' + print("success") + ''); + + fsharpNoNugetDeps = expectSuccess (writeFSharp "test-writers-fsharp-no-nuget-deps" '' + printfn "success" + ''); + + luaNoLibs = expectSuccess (writeLua "test-writers-lua-no-libs" {} '' + print("success") + ''); + + rubyNoLibs = expectSuccess (writeRuby "test-writers-ruby-no-libs" {} '' + puts "success" + ''); + }; + + path = recurseIntoAttrs { + bash = expectSuccess (writeBash "test-writers-bash-path" (writeText "test" '' + if [[ "test" == "test" ]]; then echo "success"; fi + '')); + + haskell = expectSuccess (writeHaskell "test-writers-haskell-path" { libraries = [ haskellPackages.acme-default ]; } (writeText "test" '' + import Data.Default + + int :: Int + int = def + + main :: IO () + main = case int of + 18871 -> putStrLn $ id "success" + _ -> print "fail" + '')); + }; + + data = { + json = expectDataEqual { + file = writeJSON "data.json" { hello = "world"; }; + expected = '' + { + "hello": "world" + } + ''; + }; + + toml = expectDataEqual { + file = writeTOML "data.toml" { hello = "world"; }; + expected = '' + hello = "world" + ''; + }; + + yaml = expectDataEqual { + file = writeYAML "data.yaml" { hello = "world"; }; + expected = "hello: world\n"; + }; + }; + + wrapping = recurseIntoAttrs { + bash-bin = expectSuccessBin ( + writeBashBin "test-writers-wrapping-bash-bin" + { + makeWrapperArgs = [ + "--set" + "ThaigerSprint" + "Thailand" + ]; + } + '' + if [[ "$ThaigerSprint" == "Thailand" ]]; then + echo "success" + fi + '' + ); + + bash = expectSuccess ( + writeBash "test-writers-wrapping-bash" + { + makeWrapperArgs = [ + "--set" + "ThaigerSprint" + "Thailand" + ]; + } + '' + if [[ "$ThaigerSprint" == "Thailand" ]]; then + echo "success" + fi + '' + ); + + python = expectSuccess ( + writePython3 "test-writers-wrapping-python" + { + makeWrapperArgs = [ + "--set" + "ThaigerSprint" + "Thailand" + ]; + } + '' + import os + + if os.environ.get("ThaigerSprint") == "Thailand": + print("success") + '' + ); + + rust = expectSuccess ( + writeRust "test-writers-wrapping-rust" + { + makeWrapperArgs = [ + "--set" + "ThaigerSprint" + "Thailand" + ]; + } + '' + fn main(){ + if std::env::var("ThaigerSprint").unwrap() == "Thailand" { + println!("success") + } + } + '' + ); + + no-empty-wrapper = let + bin = writeBashBin "bin" { makeWrapperArgs = []; } ''true''; + in runCommand "run-test-writers-wrapping-no-empty-wrapper" {} '' + ls -A ${bin}/bin + if [ $(ls -A ${bin}/bin | wc -l) -eq 1 ]; then + touch $out + else + echo "Error: Empty wrapper was created" >&2 + exit 1 + fi + ''; + }; +} |