{ lib
, dotnet-sdk
, buildPackages # buildDotnetModule
, testers
, runCommand
}:
let
  # Note: without structured attributes, we canâ€™t use derivation arguments that
  # contain spaces unambiguously because arguments are passed as space-separated
  # environment variables.
  copyrightString = "Public domain ğŸ…®";

  inherit (buildPackages) buildDotnetModule;

  app = buildDotnetModule {
    name = "structured-attrs-test-application";
    src = ./src;
    nugetDeps = ./nuget-deps.nix;
    dotnetFlags = [ "--property:Copyright=${copyrightString}" ];
    env.TargetFramework = "net${lib.versions.majorMinor (lib.getVersion dotnet-sdk)}";
    __structuredAttrs = true;
  };
in
{
  no-structured-attrs = testers.testBuildFailure (app.overrideAttrs {
    __structuredAttrs = false;
  });

  check-output = testers.testEqualContents {
    assertion = "buildDotnetModule sets AssemblyCopyrightAttribute with structured attributes";
    expected = builtins.toFile "expected-copyright.txt" copyrightString;
    actual = runCommand "dotnet-structured-attrs-test" { } ''
      ${app}/bin/Application >"$out"
    '';
  };
}
