using System; using System.IO; using finskaybank; using NUnit.Framework; namespace BankAccountTests { [TestFixture] public class BankAccountOperationsTests { private account[] _accounts; private StringReader _inputSimulator; private StringWriter _outputCapture; [SetUp] public void InitializeTestEnvironment() { _accounts = new account[100]; _outputCapture = new StringWriter(); Console.SetOut(_outputCapture); } [TearDown] public void CleanupTestEnvironment() { _outputCapture?.Dispose(); _inputSimulator?.Dispose(); } [Test] public void otk_ValidInput_SetsCorrectProperties() { _inputSimulator = new StringReader("fio\n1500\n"); Console.SetIn(_inputSimulator); _accounts[0] = new account(); _accounts[0].otk(); Assert.That(_accounts[0].GetName(), Is.EqualTo("fio")); Assert.That(_accounts[0].GetSum(), Is.EqualTo(1500.00)); Assert.That(_accounts[0].GetNum(), Is.Not.Empty); } [Test] public void otk_InsufficientDeposit_PrintsRetryMessage() { _inputSimulator = new StringReader("fio\n500\nfio1\n2000\n"); Console.SetIn(_inputSimulator); _accounts[0] = new account(); _accounts[0].otk(); string consoleOutput = _outputCapture.ToString(); Assert.That(consoleOutput, Does.Contain("Сумма слишком мала, попробуйте ещё раз!")); } [Test] public void otk_NumericNameInput_StoresNameCorrectly() { _inputSimulator = new StringReader("12345\n2500\n"); Console.SetIn(_inputSimulator); _accounts[0] = new account(); _accounts[0].otk(); Assert.That(_accounts[0].GetName(), Is.EqualTo("12345")); } [Test] public void otk_InvalidDepositInput_ThrowsFormatException() { _inputSimulator = new StringReader("fio\ninvalidAmount\n"); Console.SetIn(_inputSimulator); _accounts[0] = new account(); Assert.Throws(() => _accounts[0].otk()); } [Test] public void num_gen_GeneratesTwentyDigitNumber() { _accounts[0] = new account(); _accounts[0].num_gen(); Assert.That(_accounts[0].GetNum().Length, Is.EqualTo(20)); } [Test] public void otk_AfterCreation_AccountFileContainsCorrectInfo() { _inputSimulator = new StringReader("fio\n3000\n"); Console.SetIn(_inputSimulator); _accounts[0] = new account(); _accounts[0].otk(); string accountFile = $"{_accounts[0].GetNum()}.txt"; Assert.That(File.Exists(accountFile), Is.True); string fileContents = File.ReadAllText(accountFile); Assert.That(fileContents, Does.Contain(_accounts[0].GetNum())); Assert.That(fileContents, Does.Contain(_accounts[0].GetName())); Assert.That(fileContents, Does.Contain(_accounts[0].GetSum().ToString())); } [Test] public void top_up_PositiveAmount_IncreasesBalance() { _inputSimulator = new StringReader("fio\n1000\n750\n"); Console.SetIn(_inputSimulator); _accounts[0] = new account(); _accounts[0].otk(); float expected = _accounts[0].GetSum() + 750; _accounts[0].top_up(); Assert.That(_accounts[0].GetSum(), Is.EqualTo(expected)); } [Test] public void top_up_NegativeAmount_DecreasesBalance() { _inputSimulator = new StringReader("fio\n2000\n-500\n"); Console.SetIn(_inputSimulator); _accounts[0] = new account(); _accounts[0].otk(); float expected = _accounts[0].GetSum() - 500; _accounts[0].top_up(); Assert.That(_accounts[0].GetSum(), Is.EqualTo(expected)); } [Test] public void top_up_ZeroAmount_LeavesBalanceUnchanged() { _inputSimulator = new StringReader("fio\n1500\n0\n"); Console.SetIn(_inputSimulator); _accounts[0] = new account(); _accounts[0].otk(); float original = _accounts[0].GetSum(); _accounts[0].top_up(); Assert.That(_accounts[0].GetSum(), Is.EqualTo(original)); } [Test] public void top_up_InvalidInput_ThrowsFormatException() { _inputSimulator = new StringReader("fio\n1000\nnotANumber\n"); Console.SetIn(_inputSimulator); _accounts[0] = new account(); _accounts[0].otk(); Assert.Throws(() => _accounts[0].top_up()); } [Test] public void umen_PositiveAmount_DecreasesBalance() { _inputSimulator = new StringReader("fio\n3000\n1000\n"); Console.SetIn(_inputSimulator); _accounts[0] = new account(); _accounts[0].otk(); float expected = _accounts[0].GetSum() - 1000; _accounts[0].umen(); Assert.That(_accounts[0].GetSum(), Is.EqualTo(expected)); } [Test] public void umen_NegativeAmount_IncreasesBalance() { _inputSimulator = new StringReader("fio\n4000\n-1000\n"); Console.SetIn(_inputSimulator); _accounts[0] = new account(); _accounts[0].otk(); float expected = _accounts[0].GetSum() + 1000; _accounts[0].umen(); Assert.That(_accounts[0].GetSum(), Is.EqualTo(expected)); } [Test] public void umen_ZeroAmount_LeavesBalanceUnchanged() { _inputSimulator = new StringReader("fio\n2500\n0\n"); Console.SetIn(_inputSimulator); _accounts[0] = new account(); _accounts[0].otk(); float original = _accounts[0].GetSum(); _accounts[0].umen(); Assert.That(_accounts[0].GetSum(), Is.EqualTo(original)); } [Test] public void umen_InvalidInput_ThrowsFormatException() { _inputSimulator = new StringReader("fio\n2000\nabc\n"); Console.SetIn(_inputSimulator); _accounts[0] = new account(); _accounts[0].otk(); Assert.Throws(() => _accounts[0].umen()); } [Test] public void obnul_ClearsBalanceToZero() { _inputSimulator = new StringReader("fio\n5000\n"); Console.SetIn(_inputSimulator); _accounts[0] = new account(); _accounts[0].otk(); _accounts[0].obnul(); Assert.That(_accounts[0].GetSum(), Is.EqualTo(0.00)); } [Test] public void perevod_SufficientFunds_TransfersAmountCorrectly() { _inputSimulator = new StringReader("fio\n5000\nfio1\n3000\n2000\n1\n"); Console.SetIn(_inputSimulator); _accounts[0] = new account(); _accounts[0].otk(); _accounts[1] = new account(); _accounts[1].otk(); float senderExpected = _accounts[0].GetSum() - 2000; float recipientExpected = _accounts[1].GetSum() + 2000; _accounts[0].perevod(); _accounts[1].sum += 2000; Assert.That(_accounts[0].GetSum(), Is.EqualTo(senderExpected)); Assert.That(_accounts[1].GetSum(), Is.EqualTo(recipientExpected)); } [Test] public void perevod_InsufficientFunds_PrintsErrorMessage() { _inputSimulator = new StringReader("fio\n1000\nfio1\n5000\n2000\n1\n"); Console.SetIn(_inputSimulator); _accounts[0] = new account(); _accounts[0].otk(); _accounts[1] = new account(); _accounts[1].otk(); _accounts[0].perevod(); string output = _outputCapture.ToString(); Assert.That(output, Does.Contain("На счету недостаточно средств!")); } [Test] public void perevod_InvalidAmount_ThrowsFormatException() { _inputSimulator = new StringReader("fio\n3000\nfio1\n5000\ninvalid\n1\n"); Console.SetIn(_inputSimulator); _accounts[0] = new account(); _accounts[0].otk(); _accounts[1] = new account(); _accounts[1].otk(); Assert.Throws(() => _accounts[0].perevod()); } } }