inputs: system:
let
  inherit (inputs.nixpkgs) lib;
  inherit (lib) head optionalAttrs elem;
  inherit (builtins) toJSON toFile tryEval;

  pkgs-compat = import inputs.nixpkgs {
    inherit system;
    overlays = [ inputs.self.overlays.default ];
  };
  inherit (pkgs-compat) latest rustChannelOf;

  pkgs = inputs.nixpkgs.legacyPackages.${system};
  rustHostPlatform = pkgs.hostPlatform.rust.rustcTarget;

  rust-bin = inputs.self.lib.mkRustBin {} pkgs;
  inherit (rust-bin) fromRustupToolchain fromRustupToolchainFile stable beta nightly;

  assertEq = lhs: rhs:
    if lhs == rhs
    then pkgs.emptyFile
    else derivation {
      inherit system;
      name = "assert-failure";
      builder = "/bin/sh";
      args = [ "-c" ''echo "LHS: $lhs"; echo "RHS: $rhs"; exit 1'' ];
      lhs = toJSON lhs;
      rhs = toJSON rhs;
    };
  assertUrl = drv: url: assertEq (head drv.src.urls) url;

  testNightly = {
    date = "2024-08-01";
    version = "1.82.0-nightly-2024-08-01";
  };
  testBeta = {
    date = "2024-07-26";
    version = "1.81.0-beta.2-2024-07-26";
  };

in
# Check only tier 1 targets.
optionalAttrs (elem system [ "aarch64-linux" "x86_64-linux" ]) {
  url-no-arch = assertUrl stable."1.48.0".rust-src "https://static.rust-lang.org/dist/2020-11-19/rust-src-1.48.0.tar.xz";
  url-kind-nightly = assertUrl nightly.${testNightly.date}.rustc "https://static.rust-lang.org/dist/${testNightly.date}/rustc-nightly-${rustHostPlatform}.tar.xz";
  url-kind-beta = assertUrl beta.${testBeta.date}.rustc "https://static.rust-lang.org/dist/${testBeta.date}/rustc-beta-${rustHostPlatform}.tar.xz";

  name-stable = assertEq stable."1.48.0".rustc.name "rustc-1.48.0-${rustHostPlatform}";
  name-beta = assertEq beta.${testBeta.date}.rustc.name "rustc-${testBeta.version}-${rustHostPlatform}";
  name-nightly = assertEq nightly.${testNightly.date}.rustc.name "rustc-${testNightly.version}-${rustHostPlatform}";
  name-stable-profile-default = assertEq stable."1.51.0".default.name "rust-default-1.51.0";
  name-stable-profile-minimal = assertEq stable."1.51.0".minimal.name "rust-minimal-1.51.0";

  url-kind-2 = assertUrl stable."1.48.0".cargo "https://static.rust-lang.org/dist/2020-11-19/cargo-1.48.0-${rustHostPlatform}.tar.xz";
  url-kind-0 = assertUrl stable."1.47.0".cargo "https://static.rust-lang.org/dist/2020-10-08/cargo-0.48.0-${rustHostPlatform}.tar.xz";
  url-kind-1 = assertUrl stable."1.34.2".llvm-tools-preview "https://static.rust-lang.org/dist/2019-05-14/llvm-tools-1.34.2%20(6c2484dc3%202019-05-13)-${rustHostPlatform}.tar.xz";

  # 1.30.0 has `rustfmt` still in preview state.
  rename-unavailable = assertEq (stable."1.30.0" ? rustfmt) false;
  rename-available = assertEq stable."1.48.0".rustfmt stable."1.48.0".rustfmt-preview;

  latest-stable-legacy = assertEq latest.rustChannels.stable.rustc stable.latest.rustc;
  latest-beta-legacy = assertEq latest.rustChannels.beta.rustc beta.latest.rustc;
  latest-nightly-legacy = assertEq latest.rustChannels.nightly.rustc nightly.latest.rustc;

  rust-channel-of-stable = assertEq (rustChannelOf { channel = "stable"; }).rustc stable.latest.rustc;
  rust-channel-of-beta = assertEq (rustChannelOf { channel = "beta"; }).rustc beta.latest.rustc;
  rust-channel-of-nightly = assertEq (rustChannelOf { channel = "nightly"; }).rustc nightly.latest.rustc;
  rust-channel-of-version = assertEq (rustChannelOf { channel = "1.48.0"; }).rustc stable."1.48.0".rustc;
  rust-channel-of-nightly-date = assertEq (rustChannelOf { channel = "nightly"; date = testNightly.date; }).rustc nightly.${testNightly.date}.rustc;
  rust-channel-of-beta-date = assertEq (rustChannelOf { channel = "beta"; date = testBeta.date; }).rustc beta.${testBeta.date}.rustc;

  rustup-toolchain-stable = assertEq (fromRustupToolchain { channel = "stable"; }) stable.latest.default;
  rustup-toolchain-beta = assertEq (fromRustupToolchain { channel = "beta"; }) beta.latest.default;
  # rustup-toolchain-nightly = assertEq (fromRustupToolchain { channel = "nightly"; }) nightly.latest.default; # Not always available
  rustup-toolchain-version = assertEq (fromRustupToolchain { channel = "1.51.0"; }) stable."1.51.0".default;
  rustup-toolchain-nightly-date = assertEq (fromRustupToolchain { channel = "nightly-${testNightly.date}"; }) nightly.${testNightly.date}.default;
  rustup-toolchain-beta-date = assertEq (fromRustupToolchain { channel = "beta-${testBeta.date}"; }) beta.${testBeta.date}.default;
  rustup-toolchain-customization = assertEq
    (fromRustupToolchain {
      channel = "1.51.0";
      components = [ "rustfmt" "rustc-dev" ];
      targets = [ "wasm32-unknown-unknown" "aarch64-unknown-linux-gnu" ];
    })
    (stable."1.51.0".default.override {
      extensions = [ "rustfmt" "rustc-dev" ];
      targets = [ "wasm32-unknown-unknown" "aarch64-unknown-linux-gnu" ];
    });

  rustup-toolchain-profile-missing = assertEq (tryEval (fromRustupToolchain { channel = "1.51.0"; profile = "non_existent"; })).success false;
  rustup-toolchain-profile-too-early = assertEq (tryEval (fromRustupToolchain { channel = "1.29.0"; profile = "minimal"; })).success false;
  rustup-toolchain-profile-fallback = assertEq (fromRustupToolchain { channel = "1.29.0"; }) stable."1.29.0".rust;

  rustup-toolchain-file-toml = assertEq
    (fromRustupToolchainFile (toFile "rust-toolchain-toml" ''
      [toolchain]
      channel = "nightly-${testNightly.date}"
      components = [ "rustfmt", "rustc-dev" ]
      targets = [ "wasm32-unknown-unknown", "aarch64-unknown-linux-gnu" ]
    ''))
    (nightly.${testNightly.date}.default.override {
      extensions = [ "rustfmt" "rustc-dev" ];
      targets = [ "wasm32-unknown-unknown" "aarch64-unknown-linux-gnu" ];
    });
  rustup-toolchain-file-legacy = assertEq
    (fromRustupToolchainFile (toFile "rust-toolchain-legacy" ''
      nightly-${testNightly.date}
    ''))
    nightly.${testNightly.date}.default;
  rustup-toolchain-file-minimal = assertEq
    (fromRustupToolchainFile (toFile "rust-toolchain-minimal" ''
      [toolchain]
      channel = "nightly-${testNightly.date}"
      profile = "minimal"
      components = [ "rustfmt", "rustc-dev" ]
      targets = [ "aarch64-unknown-linux-gnu" ]
    ''))
    (nightly.${testNightly.date}.minimal.override {
      extensions = [ "rustfmt" "rustc-dev" ];
      targets = [ "aarch64-unknown-linux-gnu" ];
    });

  latest-nightly-default = rust-bin.selectLatestNightlyWith (toolchain: toolchain.default);

# Darwin specific tests.
} // optionalAttrs (system == "aarch64-darwin") {
  url-forward = assertUrl
    nightly.${testNightly.date}.rust-docs
    "https://static.rust-lang.org/dist/${testNightly.date}/rust-docs-nightly-x86_64-apple-darwin.tar.xz";
  aarch64-darwin-use-x86-docs = rust-bin.stable."1.51.0".default.override {
    targets = [ "x86_64-apple-darwin" ];
    targetExtensions = [ "rust-docs" ];
  };
}
