ТиМП Лабораторная работа 4
.pdf
Рисунок 1.11 – Тестирование функции ответа на звонок
Рисунок 1.12 – Тестирование функции завершения звонка
Результат модульного тестирования представлен на рисунке 1.13.
Рисунок 1.13 – Результат тестирования
Листинг программы, использованной для проведения тестов, представлен в приложении А. Листинг модульных тестов представлен в приложении Б.
11
Заключение
Входе выполнения лабораторной работы было проведено тестирование
всоответствии с вариантом №6, а также выполнены все обязательные задания.
12
Приложение А
(обязательное) Программа по варианту
using System.Text.RegularExpressions;
class Phone
{
public string Number { get; set; } public decimal Balance { get; set; } public PhoneState State { get; set; }
public Phone(string number, string balance)
{
this.SetPhoneNumber(number);
this.SetBalance(balance); this.State = new WaitingState();
}
public void SetPhoneNumber(string number)
{
string pattern = @"^(\+7 |8 )?\d{3} \d{3} \d{2} \d{2}$"; try
{
if (number == null)
{
throw new ArgumentNullException();
}
else if (!Regex.IsMatch(number, pattern))
{
throw new FormatException();
}
}
catch (ArgumentNullException)
{
Console.WriteLine($"Введите номер телефона"); return;
}
catch (FormatException)
{
Console.WriteLine("Неверный формат номера телефона.\n" +
"Пример: +7 000 000 00 00 или 8 000 000 00 00"); return;
}
13
catch
{
Console.WriteLine("Неизвестная ошибка"); return;
}
this.Number = number;
}
public void SetBalance(string balance)
{
string pattern = @"^\d+\,\d{2}$"; try
{
if (Regex.IsMatch(balance, pattern))
{
decimal sum = decimal.Parse(balance); if (sum <= 0)
{
throw new ArgumentOutOfRangeException();
}
}
else
{
throw new FormatException();
}
}
catch (OverflowException)
{
Console.WriteLine("Слишком большое число.\n" +
"Пример: 100,99"); return;
}
catch (ArgumentNullException)
{
Console.WriteLine("Сумма баланса должна быть не пустым значением.\n" +
"Пример: 100,99"); return;
}
catch (FormatException)
{
Console.WriteLine("Неверный формат баланса. После точки только 2
цифры\n" +
"Пример: 100,99");
return;
14
}
catch (ArgumentOutOfRangeException)
{
Console.WriteLine("Баланс пополняется только на неотрицательную сумму"); return;
}
catch
{
Console.WriteLine("Неизвестная ошибка"); return;
}
this.Balance = decimal.Parse(balance);
}
public string GetBalance()
{
return $"Ваш баланс: {this.Balance}";
}
public string GetNumber()
{
return $"Ваш номер телефона: {this.Number}";
}
public void Call()
{
this.State.Call(this);
}
public void ReceiveCall()
{
this.State.ReceiveCall(this);
}
public void Answer()
{
this.State.Answer(this);
}
public void EndCall()
{
this.State.EndCall(this);
}
public void TopUpBalance(string deposit)
{
string pattern = @"^\d+\,\d{2}$"; try
{
if (!Regex.IsMatch(deposit, pattern))
15
{
throw new FormatException();
}
decimal sum = decimal.Parse(deposit); if (sum <= 0)
{
throw new ArgumentOutOfRangeException();
}
}
catch (ArgumentNullException)
{
Console.WriteLine("Сумма для пополнения должна быть не пустым значением\n" +
"Пример: 100,99"); return;
}
catch (FormatException)
{
Console.WriteLine("Сумма пополнения имеет неверный формат\n" + "Пример: 100,99");
return;
}
catch (StackOverflowException)
{
Console.WriteLine("Слишком большое число, пополните баланс на меньшую
сумму");
return;
}
catch (ArgumentOutOfRangeException)
{
Console.WriteLine("Сумма пополнения должна являться числом большим
нуля");
return;
}
catch
{
Console.WriteLine("Неизвестня ошибка"); return;
}
try
{
decimal sum = decimal.Parse(deposit) + this.Balance;
}
16
catch
{
Console.WriteLine("Слишком большое число, пополните баланс на меньшую
сумму");
return;
}
this.Balance += decimal.Parse(deposit);
}
}
interface PhoneState
{
public void Call(Phone phone) { } public void ReceiveCall(Phone phone) { } public void Answer(Phone phone) { } public void EndCall(Phone phone) { }
}
class WaitingState : PhoneState
{
public void Call(Phone phone)
{
if (phone.Balance < decimal.Parse("2,5"))
{
Console.WriteLine($"Недостаточно средств, на счете {phone.Balance}"); return;
}
Console.WriteLine($"Исходящий звонок с {phone.Number}"); phone.Balance -= decimal.Parse("2,5");
phone.State = new InCallState();
}
public void ReceiveCall(Phone phone)
{
Console.WriteLine($"Входящий звонок на {phone.Number}"); phone.State = new IncomingCallState();
}
public void Answer(Phone phone)
{
Console.WriteLine($"Нет входящего звонка на {phone.Number}");
}
public void EndCall(Phone phone)
{
Console.WriteLine($"Нет активного звонка для {phone.Number}");
}
17
}
class IncomingCallState : PhoneState
{
public void Call(Phone phone)
{
Console.WriteLine($"Нельзя совершить зваонок - уже есть вызов");
}
public void ReceiveCall(Phone phone)
{
Console.WriteLine($"Уже получаете вызов");
}
public void Answer(Phone phone)
{
Console.WriteLine($"Ответели на звонок. Разговор начат");
}
public void EndCall(Phone phone)
{
Console.WriteLine($"Вызов отклонен");
}
}
class InCallState : PhoneState
{
public void Call(Phone phone)
{
Console.WriteLine($"Уже в разговоре");
}
public void ReceiveCall(Phone phone)
{
Console.WriteLine($"Нельзя принять второй звонок во время разговора");
}
public void Answer(Phone phone)
{
Console.WriteLine($"Уже в разговоре");
}
public void EndCall(Phone phone)
{
Console.WriteLine($"Разговор завершен");
}
}
18
Приложение Б
(обязательное) Модульные тесты
using System.Text;
namespace laba4test
{
[TestClass]
public class PhoneTest
{
private StringBuilder _consoleOutput; private StringWriter _stringWriter;
Phone testPhone = new Phone("8 999 999 99 99", "100,00");
//Для чтения строк выводимых в консоль
[TestInitialize]
public void ConsoleReader()
{
_consoleOutput = new StringBuilder(); _stringWriter = new StringWriter(_consoleOutput); Console.SetOut(_stringWriter);
}
//Проверка пополнения баланса
[TestMethod]
public void TopUpBalance_199_10199returned_Test()
{
testPhone.TopUpBalance("1,99");
string expectedBalance = "Ваш баланс: 101,99"; string actualBalance = testPhone.GetBalance();
Assert.AreEqual(expectedBalance, actualBalance);
}
//Проверка функции "позвонить" [TestMethod]
public void InCallTest()
{
string expectedCallState = "Исходящий звонок с 8 999 999 99 99"; testPhone.Call();
Assert.AreEqual(expectedCallState, _consoleOutput.ToString().Trim());
}
//Проверка функции "входящий звонок" [TestMethod]
public void ReceiveCallTest()
{
string expectedCallState = "Входящий звонок на 8 999 999 99 99"; testPhone.ReceiveCall();
Assert.AreEqual(expectedCallState, _consoleOutput.ToString().Trim());
}
//Проверка функции "ответить на звонок" [TestMethod]
public void AnswerCallTest()
19
{
string expectedCallState = "Ответели на звонок. Разговор начат"; testPhone.ReceiveCall(); _stringWriter.GetStringBuilder().Clear();
testPhone.Answer();
Assert.AreEqual(expectedCallState, _consoleOutput.ToString().Trim());
}
//Проверка функции "завершить звонок" [TestMethod]
public void EndCallTest()
{
string expectedCallState = "Разговор завершен"; testPhone.Call(); _stringWriter.GetStringBuilder().Clear(); testPhone.EndCall();
Assert.AreEqual(expectedCallState, _consoleOutput.ToString().Trim());
}
}
}
20
