using System; using System.Security.Cryptography; using System.Text; using NUnit.Framework; namespace ShrinkDataSaver.Tests { [TestFixture] public class SaveEncryptorTests { [Test] public void Encrypt_Decrypt_RoundTrip() { var original = Encoding.UTF8.GetBytes("Hello, ShrinkDataSaver!"); var password = "TestPassword123"; var encrypted = SaveEncryptor.Encrypt(original, password); var decrypted = SaveEncryptor.Decrypt(encrypted, password); Assert.AreEqual(original, decrypted); } [Test] public void Encrypt_Decrypt_LargeData() { var original = new byte[10000]; new System.Random(42).NextBytes(original); var password = "LargeDataKey"; var encrypted = SaveEncryptor.Encrypt(original, password); var decrypted = SaveEncryptor.Decrypt(encrypted, password); Assert.AreEqual(original, decrypted); } [Test] public void Decrypt_WrongPassword_Throws() { var original = Encoding.UTF8.GetBytes("secret data"); var encrypted = SaveEncryptor.Encrypt(original, "correct"); Assert.Throws(() => SaveEncryptor.Decrypt(encrypted, "wrong")); } [Test] public void Encrypt_ProducesDifferentOutput_EachTime() { var data = Encoding.UTF8.GetBytes("same data"); var enc1 = SaveEncryptor.Encrypt(data, "key"); var enc2 = SaveEncryptor.Encrypt(data, "key"); // 因为随机 salt/IV,两次加密结果不同 Assert.AreNotEqual(enc1, enc2); // 但两次都能正确解密 Assert.AreEqual(data, SaveEncryptor.Decrypt(enc1, "key")); Assert.AreEqual(data, SaveEncryptor.Decrypt(enc2, "key")); } [Test] public void Encrypt_NullData_Throws() { Assert.Throws(() => SaveEncryptor.Encrypt(null, "key")); } [Test] public void Encrypt_EmptyPassword_Throws() { Assert.Throws(() => SaveEncryptor.Encrypt(new byte[] { 1, 2, 3 }, "")); } [Test] public void Decrypt_NullData_Throws() { Assert.Throws(() => SaveEncryptor.Decrypt(null, "key")); } [Test] public void Decrypt_DataTooShort_Throws() { Assert.Throws(() => SaveEncryptor.Decrypt(new byte[] { 1, 2, 3 }, "key")); } } }