about summary refs log tree commit diff
path: root/pkgs/development/interpreters/lua-5/tests/default.nix
blob: 6ca6b153c0b6221dd1a25255562c76f0e752a5ba (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
{ lua
, hello
, wrapLua
, lib
, pkgs
}:
let
  runTest = lua: { name, command }:
    pkgs.runCommandLocal "test-${lua.name}-${name}" ({
      nativeBuildInputs = [lua];
      meta.platforms = lua.meta.platforms;
    }) (''
      source ${./assert.sh}
    ''
    + command
    + "touch $out"
    );

  wrappedHello = hello.overrideAttrs(oa: {
    propagatedBuildInputs = [
      wrapLua
      lua.pkgs.cjson
    ];
    postFixup = ''
      wrapLuaPrograms
    '';
  });

  luaWithModule = lua.withPackages(ps: [
    ps.lua-cjson
  ]);

  golden_LUA_PATHS = {

    # Looking at lua interpreter 'setpath' code
    # for instance https://github.com/lua/lua/blob/69ea087dff1daba25a2000dfb8f1883c17545b7a/loadlib.c#L599
    # replace ";;" by ";LUA_PATH_DEFAULT;"
    "5.1" = ";./?.lua;${lua}/share/lua/5.1/?.lua;${lua}/share/lua/5.1/?/init.lua;${lua}/lib/lua/5.1/?.lua;${lua}/lib/lua/5.1/?/init.lua;";
    "5.2" = ";${lua}/share/lua/5.2/?.lua;${lua}/share/lua/5.2/?/init.lua;${lua}/lib/lua/5.2/?.lua;${lua}/lib/lua/5.2/?/init.lua;./?.lua;";
    "5.3" = ";${lua}/share/lua/5.3/?.lua;${lua}/share/lua/5.3/?/init.lua;${lua}/lib/lua/5.3/?.lua;${lua}/lib/lua/5.3/?/init.lua;./?.lua;./?/init.lua;";
    # lua5.4 seems to be smarter about it and dont add the lua separators when nothing left or right
    "5.4" = "${lua}/share/lua/5.4/?.lua;${lua}/share/lua/5.4/?/init.lua;${lua}/lib/lua/5.4/?.lua;${lua}/lib/lua/5.4/?/init.lua;./?.lua;./?/init.lua";

    # luajit versions
    "2.0" = ";./?.lua;${lua}/share/luajit-2.0/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;${lua}/share/lua/5.1/?.lua;${lua}/share/lua/5.1/?/init.lua;";
    "2.1" = ";./?.lua;${lua}/share/luajit-2.1/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;${lua}/share/lua/5.1/?.lua;${lua}/share/lua/5.1/?/init.lua;";
  };
in
  pkgs.recurseIntoAttrs ({

  checkInterpreterPatch = let
    golden_LUA_PATH = golden_LUA_PATHS.${lib.versions.majorMinor lua.version};
  in
    runTest lua {
    name = "check-default-lua-path";
    command = ''
      export LUA_PATH=";;"
      generated=$(lua -e 'print(package.path)')
      assertStringEqual "$generated" "${golden_LUA_PATH}"
      '';
  };

  checkWrapping = pkgs.runCommandLocal "test-${lua.name}-wrapping" ({
    }) (''
      grep -- 'LUA_PATH=' ${wrappedHello}/bin/hello
      touch $out
    '');

  checkRelativeImports = pkgs.runCommandLocal "test-${lua.name}-relative-imports" ({
    }) (''
      source ${./assert.sh}

      lua_vanilla_package_path="$(${lua}/bin/lua -e "print(package.path)")"
      lua_with_module_package_path="$(${luaWithModule}/bin/lua -e "print(package.path)")"

      assertStringContains "$lua_vanilla_package_path" "./?.lua"
      assertStringContains "$lua_vanilla_package_path" "./?/init.lua"

      assertStringContains "$lua_with_module_package_path" "./?.lua"
      assertStringContains "$lua_with_module_package_path" "./?/init.lua"

      touch $out
    '');
})