{
  system ? builtins.currentSystem,
  config ? { },
  pkgs ? import ../../.. { inherit system config; },
  # Test current default (LTS) and latest kernel
  kernelVersionsToTest ? [
    (pkgs.lib.versions.majorMinor pkgs.linuxPackages.kernel.version)
    "latest"
  ],
}:

with pkgs.lib;

let
  tests =
    let
      callTest = p: args: import p ({ inherit system pkgs; } // args);
    in
    {
      basic = callTest ./basic.nix;
      amneziawg = callTest ./amneziawg.nix;
      namespaces = callTest ./namespaces.nix;
      networkd = callTest ./networkd.nix;
      wg-quick = callTest ./wg-quick.nix;
      wg-quick-nftables = args: callTest ./wg-quick.nix ({ nftables = true; } // args);
      amneziawg-quick = callTest ./amneziawg-quick.nix;
      generated = callTest ./generated.nix;
      dynamic-refresh = callTest ./dynamic-refresh.nix;
      dynamic-refresh-networkd = args: callTest ./dynamic-refresh.nix ({ useNetworkd = true; } // args);
    };
in

listToAttrs (
  flip concatMap kernelVersionsToTest (
    version:
    let
      v' = replaceStrings [ "." ] [ "_" ] version;
    in
    flip mapAttrsToList tests (
      name: test:
      nameValuePair "wireguard-${name}-linux-${v'}" (test {
        kernelPackages = pkgs."linuxPackages_${v'}";
      })
    )
  )
)
