{
  lib,
  ruby,
  defaultGemConfig,
  test,
  should,
}:
let
  testConfigs = {
    inherit lib;
    gemConfig = defaultGemConfig;
  };
  functions = (import ./functions.nix testConfigs);
in
builtins.concatLists [
  (test.run "All set, no gemdir"
    (functions.bundlerFiles {
      gemfile = test/Gemfile;
      lockfile = test/Gemfile.lock;
      gemset = test/gemset.nix;
    })
    {
      gemfile = should.equal test/Gemfile;
      lockfile = should.equal test/Gemfile.lock;
      gemset = should.equal test/gemset.nix;
    }
  )

  (test.run "Just gemdir"
    (functions.bundlerFiles {
      gemdir = test/.;
    })
    {
      gemfile = should.equal test/Gemfile;
      lockfile = should.equal test/Gemfile.lock;
      gemset = should.equal test/gemset.nix;
    }
  )

  (test.run "Gemset and dir"
    (functions.bundlerFiles {
      gemdir = test/.;
      gemset = test/extraGemset.nix;
    })
    {
      gemfile = should.equal test/Gemfile;
      lockfile = should.equal test/Gemfile.lock;
      gemset = should.equal test/extraGemset.nix;
    }
  )

  (test.run "Filter empty gemset" { } (
    set:
    functions.filterGemset {
      inherit ruby;
      groups = [ "default" ];
    } set == { }
  ))
  (
    let
      gemSet = {
        test = {
          groups = [
            "x"
            "y"
          ];
        };
      };
    in
    test.run "Filter matches a group" gemSet (
      set:
      functions.filterGemset {
        inherit ruby;
        groups = [
          "y"
          "z"
        ];
      } set == gemSet
    )
  )
  (
    let
      gemSet = {
        test = {
          platforms = [ ];
        };
      };
    in
    test.run "Filter matches empty platforms list" gemSet (
      set:
      functions.filterGemset {
        inherit ruby;
        groups = [ ];
      } set == gemSet
    )
  )
  (
    let
      gemSet = {
        test = {
          platforms = [
            {
              engine = ruby.rubyEngine;
              version = ruby.version.majMin;
            }
          ];
        };
      };
    in
    test.run "Filter matches on platform" gemSet (
      set:
      functions.filterGemset {
        inherit ruby;
        groups = [ ];
      } set == gemSet
    )
  )
  (
    let
      gemSet = {
        test = {
          groups = [
            "x"
            "y"
          ];
        };
      };
    in
    test.run "Filter excludes based on groups" gemSet (
      set:
      functions.filterGemset {
        inherit ruby;
        groups = [
          "a"
          "b"
        ];
      } set == { }
    )
  )
]