// Synthetic acceptance checks for the source-built ZstdNet/native pair.
using System.Diagnostics;
using System.Security.Cryptography;
using ZstdNet;

var expectedNativeHash = args.Single();
var samples = new[] {
    Array.Empty<byte>(), new byte[] { 42 },
    System.Text.Encoding.UTF8.GetBytes(string.Concat(Enumerable.Repeat("source-built zstd\0", 16384))),
    Enumerable.Range(0, 4096).SelectMany(i => SHA256.HashData(BitConverter.GetBytes(i))).ToArray()
};
int count = 0;
foreach (var data in samples)
{
    foreach (int level in new[] { 1, 3, 9 })
    {
        using var options = new CompressionOptions(level);
        using var compressor = new Compressor(options);
        using var decompressor = new Decompressor();
        var compressed = compressor.Wrap(data);
        if (!decompressor.Unwrap(compressed).SequenceEqual(data))
            throw new Exception("Managed one-shot roundtrip failed");
        count++;
    }
    using var encoded = new MemoryStream();
    using (var encoder = new CompressionStream(encoded))
        encoder.Write(data, 0, data.Length);
    using var decoder = new DecompressionStream(new MemoryStream(encoded.ToArray()));
    using var restored = new MemoryStream();
    decoder.CopyTo(restored);
    if (!restored.ToArray().SequenceEqual(data))
        throw new Exception("Managed streaming roundtrip failed");
    count++;
}
// Exercise the compiled Windows threading path, not only one-shot defaults.
using (var options = new CompressionOptions(null,
    new Dictionary<ZSTD_cParameter, int> { [ZSTD_cParameter.ZSTD_c_nbWorkers] = 2 }))
using (var compressor = new Compressor(options))
using (var decompressor = new Decompressor())
{
    var data = Enumerable.Range(0, 16).SelectMany(_ => samples[2]).ToArray();
    if (!decompressor.Unwrap(compressor.Wrap(data)).SequenceEqual(data))
        throw new Exception("Managed multi-worker roundtrip failed");
    count++;
}
var modules = Process.GetCurrentProcess().Modules.Cast<ProcessModule>()
    .Where(m => string.Equals(m.ModuleName, "libzstd.dll", StringComparison.OrdinalIgnoreCase)).ToArray();
if (modules.Length != 1 || Convert.ToHexString(SHA256.HashData(File.ReadAllBytes(modules[0].FileName)))
    .ToLowerInvariant() != expectedNativeHash)
    throw new Exception("Smoke did not load the recorded source-built native DLL");
Console.WriteLine($"ZstdNet source-build smoke passed: {count} cases; native {expectedNativeHash}");
