From c8527d436162a7ab33ec152e1f62497eb31cc54e Mon Sep 17 00:00:00 2001 From: Mike de Geofroy Date: Tue, 7 Nov 2023 20:46:31 +0300 Subject: [PATCH 01/15] Added a basic structure, probably going to restrucure everything. --- Itmo.ObjectOrientedProgramming.sln | 7 +++++++ src/Lab2.Console/Lab2.Console.csproj | 10 ++++++++++ src/Lab2.Console/Program.cs | 1 + src/Lab3.Console/Lab3.Console.csproj | 14 ++++++++++++++ src/Lab3.Console/Program.cs | 1 + src/Lab3/Display/Display.cs | 20 ++++++++++++++++++++ src/Lab3/Display/IDisplayDriver.cs | 8 ++++++++ src/Lab3/Message/IMessage.cs | 6 ++++++ src/Lab3/Message/Message.cs | 16 ++++++++++++++++ src/Lab3/Message/Priority.cs | 8 ++++++++ src/Lab3/Messenger/IMessenger.cs | 7 +++++++ src/Lab3/Messenger/Messenger.cs | 13 +++++++++++++ src/Lab3/Recipient/GroupRecipient.cs | 22 ++++++++++++++++++++++ src/Lab3/Recipient/IRecipient.cs | 8 ++++++++ src/Lab3/Recipient/MessengerRecipient.cs | 19 +++++++++++++++++++ src/Lab3/Recipient/UserRecipient.cs | 19 +++++++++++++++++++ src/Lab3/Topic/ITopic.cs | 7 +++++++ src/Lab3/Topic/Topic.cs | 21 +++++++++++++++++++++ src/Lab3/User/IUser.cs | 7 +++++++ src/Lab3/User/InboxMessage.cs | 5 +++++ src/Lab3/User/User.cs | 20 ++++++++++++++++++++ 21 files changed, 239 insertions(+) create mode 100644 src/Lab2.Console/Lab2.Console.csproj create mode 100644 src/Lab2.Console/Program.cs create mode 100644 src/Lab3.Console/Lab3.Console.csproj create mode 100644 src/Lab3.Console/Program.cs create mode 100644 src/Lab3/Display/Display.cs create mode 100644 src/Lab3/Display/IDisplayDriver.cs create mode 100644 src/Lab3/Message/IMessage.cs create mode 100644 src/Lab3/Message/Message.cs create mode 100644 src/Lab3/Message/Priority.cs create mode 100644 src/Lab3/Messenger/IMessenger.cs create mode 100644 src/Lab3/Messenger/Messenger.cs create mode 100644 src/Lab3/Recipient/GroupRecipient.cs create mode 100644 src/Lab3/Recipient/IRecipient.cs create mode 100644 src/Lab3/Recipient/MessengerRecipient.cs create mode 100644 src/Lab3/Recipient/UserRecipient.cs create mode 100644 src/Lab3/Topic/ITopic.cs create mode 100644 src/Lab3/Topic/Topic.cs create mode 100644 src/Lab3/User/IUser.cs create mode 100644 src/Lab3/User/InboxMessage.cs create mode 100644 src/Lab3/User/User.cs diff --git a/Itmo.ObjectOrientedProgramming.sln b/Itmo.ObjectOrientedProgramming.sln index f7e1daa..a2e6daf 100644 --- a/Itmo.ObjectOrientedProgramming.sln +++ b/Itmo.ObjectOrientedProgramming.sln @@ -31,6 +31,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lab4.Tests", "tests\Lab4.Te EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lab5.Tests", "tests\Lab5.Tests\Lab5.Tests.csproj", "{FA627A62-AD7A-4A72-B15C-EC8AEFD206DB}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lab3.Console", "src\Lab3.Console\Lab3.Console.csproj", "{9654EFB5-5367-4DAD-8F18-58E113384AA0}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -47,6 +49,7 @@ Global {7E5E46DB-EF55-47E6-822A-6AE20BF2FCD9} = {792FFE57-F1A0-47A4-9E2A-80F75FF2F8DB} {17689E4A-FE4F-4893-8E28-3BA911DEC8D8} = {792FFE57-F1A0-47A4-9E2A-80F75FF2F8DB} {FA627A62-AD7A-4A72-B15C-EC8AEFD206DB} = {792FFE57-F1A0-47A4-9E2A-80F75FF2F8DB} + {9654EFB5-5367-4DAD-8F18-58E113384AA0} = {8ED774F4-D429-4B82-B768-50DCA8EFF609} EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {EABA4888-E6C1-4ACC-856E-FBD34CEA3EDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -85,5 +88,9 @@ Global {FA627A62-AD7A-4A72-B15C-EC8AEFD206DB}.Debug|Any CPU.Build.0 = Debug|Any CPU {FA627A62-AD7A-4A72-B15C-EC8AEFD206DB}.Release|Any CPU.ActiveCfg = Release|Any CPU {FA627A62-AD7A-4A72-B15C-EC8AEFD206DB}.Release|Any CPU.Build.0 = Release|Any CPU + {9654EFB5-5367-4DAD-8F18-58E113384AA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9654EFB5-5367-4DAD-8F18-58E113384AA0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9654EFB5-5367-4DAD-8F18-58E113384AA0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9654EFB5-5367-4DAD-8F18-58E113384AA0}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/src/Lab2.Console/Lab2.Console.csproj b/src/Lab2.Console/Lab2.Console.csproj new file mode 100644 index 0000000..2b14c81 --- /dev/null +++ b/src/Lab2.Console/Lab2.Console.csproj @@ -0,0 +1,10 @@ + + + + Exe + net7.0 + enable + enable + + + diff --git a/src/Lab2.Console/Program.cs b/src/Lab2.Console/Program.cs new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/src/Lab2.Console/Program.cs @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/Lab3.Console/Lab3.Console.csproj b/src/Lab3.Console/Lab3.Console.csproj new file mode 100644 index 0000000..7f95a90 --- /dev/null +++ b/src/Lab3.Console/Lab3.Console.csproj @@ -0,0 +1,14 @@ + + + + Exe + net7.0 + enable + enable + + + + + + + diff --git a/src/Lab3.Console/Program.cs b/src/Lab3.Console/Program.cs new file mode 100644 index 0000000..3a8b691 --- /dev/null +++ b/src/Lab3.Console/Program.cs @@ -0,0 +1 @@ +Console.WriteLine("Hello!"); \ No newline at end of file diff --git a/src/Lab3/Display/Display.cs b/src/Lab3/Display/Display.cs new file mode 100644 index 0000000..fe0fd33 --- /dev/null +++ b/src/Lab3/Display/Display.cs @@ -0,0 +1,20 @@ +using Itmo.ObjectOrientedProgramming.Lab3.Message; +using Itmo.ObjectOrientedProgramming.Lab3.Recipient; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Display; + +public class Display : IRecipient +{ + private readonly IDisplayDriver _displayDriver; + + public Display(IDisplayDriver displayDriver) + { + _displayDriver = displayDriver; + } + + public void HandleMessage(IMessage message) + { + _displayDriver.Clear(); + _displayDriver.Out(); + } +} \ No newline at end of file diff --git a/src/Lab3/Display/IDisplayDriver.cs b/src/Lab3/Display/IDisplayDriver.cs new file mode 100644 index 0000000..ebbb5cd --- /dev/null +++ b/src/Lab3/Display/IDisplayDriver.cs @@ -0,0 +1,8 @@ +namespace Itmo.ObjectOrientedProgramming.Lab3.Display; + +public interface IDisplayDriver +{ + public void Clear(); + public void SetColor(); + public void Out(); +} \ No newline at end of file diff --git a/src/Lab3/Message/IMessage.cs b/src/Lab3/Message/IMessage.cs new file mode 100644 index 0000000..4ca9d9a --- /dev/null +++ b/src/Lab3/Message/IMessage.cs @@ -0,0 +1,6 @@ +namespace Itmo.ObjectOrientedProgramming.Lab3.Message; + +public interface IMessage +{ + public Priority Priority { get; } +} \ No newline at end of file diff --git a/src/Lab3/Message/Message.cs b/src/Lab3/Message/Message.cs new file mode 100644 index 0000000..3e48a37 --- /dev/null +++ b/src/Lab3/Message/Message.cs @@ -0,0 +1,16 @@ +namespace Itmo.ObjectOrientedProgramming.Lab3.Message; + +public class Message : IMessage +{ + private readonly string _header; + private readonly string _body; + + public Message(string header, string body, Priority priority) + { + _header = header; + _body = body; + Priority = priority; + } + + public Priority Priority { get; } +} \ No newline at end of file diff --git a/src/Lab3/Message/Priority.cs b/src/Lab3/Message/Priority.cs new file mode 100644 index 0000000..20f16fe --- /dev/null +++ b/src/Lab3/Message/Priority.cs @@ -0,0 +1,8 @@ +namespace Itmo.ObjectOrientedProgramming.Lab3.Message; + +public enum Priority +{ + High, + Medium, + Low, +} \ No newline at end of file diff --git a/src/Lab3/Messenger/IMessenger.cs b/src/Lab3/Messenger/IMessenger.cs new file mode 100644 index 0000000..53fe5cb --- /dev/null +++ b/src/Lab3/Messenger/IMessenger.cs @@ -0,0 +1,7 @@ +using Itmo.ObjectOrientedProgramming.Lab3.Recipient; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Messenger; + +public interface IMessenger : IRecipient +{ +} \ No newline at end of file diff --git a/src/Lab3/Messenger/Messenger.cs b/src/Lab3/Messenger/Messenger.cs new file mode 100644 index 0000000..aa07d72 --- /dev/null +++ b/src/Lab3/Messenger/Messenger.cs @@ -0,0 +1,13 @@ +using System; +using Itmo.ObjectOrientedProgramming.Lab3.Message; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Messenger; + +public class Messenger : IMessenger +{ + public void HandleMessage(IMessage message) + { + message = message ?? throw new ArgumentNullException(nameof(message)); + Console.WriteLine("Messenger: \n" + message.Render()); + } +} \ No newline at end of file diff --git a/src/Lab3/Recipient/GroupRecipient.cs b/src/Lab3/Recipient/GroupRecipient.cs new file mode 100644 index 0000000..60f8bc6 --- /dev/null +++ b/src/Lab3/Recipient/GroupRecipient.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; +using Itmo.ObjectOrientedProgramming.Lab3.Message; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Recipient; + +public class GroupRecipient : IRecipient +{ + private readonly IEnumerable _recipients; + + public GroupRecipient(IEnumerable recipients) + { + _recipients = recipients; + } + + public void HandleMessage(IMessage message) + { + foreach (IRecipient recipient in _recipients) + { + recipient.HandleMessage(message); + } + } +} \ No newline at end of file diff --git a/src/Lab3/Recipient/IRecipient.cs b/src/Lab3/Recipient/IRecipient.cs new file mode 100644 index 0000000..a008f06 --- /dev/null +++ b/src/Lab3/Recipient/IRecipient.cs @@ -0,0 +1,8 @@ +using Itmo.ObjectOrientedProgramming.Lab3.Message; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Recipient; + +public interface IRecipient +{ + public void HandleMessage(IMessage message); +} \ No newline at end of file diff --git a/src/Lab3/Recipient/MessengerRecipient.cs b/src/Lab3/Recipient/MessengerRecipient.cs new file mode 100644 index 0000000..60b3a03 --- /dev/null +++ b/src/Lab3/Recipient/MessengerRecipient.cs @@ -0,0 +1,19 @@ +using Itmo.ObjectOrientedProgramming.Lab3.Message; +using Itmo.ObjectOrientedProgramming.Lab3.Messenger; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Recipient; + +public class MessengerRecipient : IRecipient +{ + private readonly IMessenger _messenger; + + public MessengerRecipient(IMessenger messenger) + { + _messenger = messenger; + } + + public void HandleMessage(IMessage message) + { + _messenger.HandleMessage(message); + } +} \ No newline at end of file diff --git a/src/Lab3/Recipient/UserRecipient.cs b/src/Lab3/Recipient/UserRecipient.cs new file mode 100644 index 0000000..f73907e --- /dev/null +++ b/src/Lab3/Recipient/UserRecipient.cs @@ -0,0 +1,19 @@ +using Itmo.ObjectOrientedProgramming.Lab3.Message; +using Itmo.ObjectOrientedProgramming.Lab3.User; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Recipient; + +public class UserRecipient : IRecipient +{ + private readonly IUser _user; + + public UserRecipient(IUser user) + { + _user = user; + } + + public void HandleMessage(IMessage message) + { + _user.HandleMessage(message); + } +} \ No newline at end of file diff --git a/src/Lab3/Topic/ITopic.cs b/src/Lab3/Topic/ITopic.cs new file mode 100644 index 0000000..9345f3f --- /dev/null +++ b/src/Lab3/Topic/ITopic.cs @@ -0,0 +1,7 @@ +using Itmo.ObjectOrientedProgramming.Lab3.Recipient; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Topic; + +public interface ITopic : IRecipient +{ +} \ No newline at end of file diff --git a/src/Lab3/Topic/Topic.cs b/src/Lab3/Topic/Topic.cs new file mode 100644 index 0000000..e446411 --- /dev/null +++ b/src/Lab3/Topic/Topic.cs @@ -0,0 +1,21 @@ +using Itmo.ObjectOrientedProgramming.Lab3.Message; +using Itmo.ObjectOrientedProgramming.Lab3.Recipient; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Topic; + +public class Topic : ITopic +{ + private readonly string _name; + private readonly IRecipient _recipient; + + public Topic(string name, IRecipient recipient) + { + _name = name; + _recipient = recipient; + } + + public void HandleMessage(IMessage message) + { + _recipient.HandleMessage(message); + } +} \ No newline at end of file diff --git a/src/Lab3/User/IUser.cs b/src/Lab3/User/IUser.cs new file mode 100644 index 0000000..0126beb --- /dev/null +++ b/src/Lab3/User/IUser.cs @@ -0,0 +1,7 @@ +using Itmo.ObjectOrientedProgramming.Lab3.Recipient; + +namespace Itmo.ObjectOrientedProgramming.Lab3.User; + +public interface IUser : IRecipient +{ +} \ No newline at end of file diff --git a/src/Lab3/User/InboxMessage.cs b/src/Lab3/User/InboxMessage.cs new file mode 100644 index 0000000..6e0cb96 --- /dev/null +++ b/src/Lab3/User/InboxMessage.cs @@ -0,0 +1,5 @@ +using Itmo.ObjectOrientedProgramming.Lab3.Message; + +namespace Itmo.ObjectOrientedProgramming.Lab3.User; + +public record InboxMessage(IMessage Message, bool Read); \ No newline at end of file diff --git a/src/Lab3/User/User.cs b/src/Lab3/User/User.cs new file mode 100644 index 0000000..205cc36 --- /dev/null +++ b/src/Lab3/User/User.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; +using System.Collections.ObjectModel; +using Itmo.ObjectOrientedProgramming.Lab3.Message; + +namespace Itmo.ObjectOrientedProgramming.Lab3.User; + +public class User : IUser +{ + private ICollection _inbox; + + public User() + { + _inbox = new Collection(); + } + + public void HandleMessage(IMessage message) + { + _inbox.Add(new InboxMessage(message, false)); + } +} \ No newline at end of file From 17e7523ade21a03a08d42d5d932c8f03d27db8c2 Mon Sep 17 00:00:00 2001 From: Mike de Geofroy Date: Wed, 8 Nov 2023 19:13:43 +0300 Subject: [PATCH 02/15] Added some proxys, restructured --- src/Lab3.Console/Program.cs | 14 ++++++- src/Lab3/Display/Display.cs | 1 - .../{Recipient => Group}/GroupRecipient.cs | 2 +- src/Lab3/{Recipient => }/IRecipient.cs | 2 +- src/Lab3/Logger/ILogger.cs | 6 +++ src/Lab3/Logger/Logger.cs | 11 ++++++ src/Lab3/Message/IMessage.cs | 1 + src/Lab3/Message/Message.cs | 5 +++ src/Lab3/Messenger/IMessenger.cs | 2 - src/Lab3/Proxies/MessageFilter.cs | 39 +++++++++++++++++++ src/Lab3/Proxies/MessageLogger.cs | 29 ++++++++++++++ src/Lab3/Recipient/MessengerRecipient.cs | 19 --------- src/Lab3/Recipient/UserRecipient.cs | 19 --------- src/Lab3/Topic/ITopic.cs | 2 - src/Lab3/Topic/Topic.cs | 1 - src/Lab3/User/IUser.cs | 5 ++- src/Lab3/User/InboxMessage.cs | 12 +++++- src/Lab3/User/User.cs | 19 +++++++-- 18 files changed, 136 insertions(+), 53 deletions(-) rename src/Lab3/{Recipient => Group}/GroupRecipient.cs (89%) rename src/Lab3/{Recipient => }/IRecipient.cs (70%) create mode 100644 src/Lab3/Logger/ILogger.cs create mode 100644 src/Lab3/Logger/Logger.cs create mode 100644 src/Lab3/Proxies/MessageFilter.cs create mode 100644 src/Lab3/Proxies/MessageLogger.cs delete mode 100644 src/Lab3/Recipient/MessengerRecipient.cs delete mode 100644 src/Lab3/Recipient/UserRecipient.cs diff --git a/src/Lab3.Console/Program.cs b/src/Lab3.Console/Program.cs index 3a8b691..8f9ca8c 100644 --- a/src/Lab3.Console/Program.cs +++ b/src/Lab3.Console/Program.cs @@ -1 +1,13 @@ -Console.WriteLine("Hello!"); \ No newline at end of file +using Itmo.ObjectOrientedProgramming.Lab3.Logger; +using Itmo.ObjectOrientedProgramming.Lab3.Message; +using Itmo.ObjectOrientedProgramming.Lab3.Proxies; +using Itmo.ObjectOrientedProgramming.Lab3.User; + +var message = new Message("Good morning!", "My body is ready.", Priority.High); +var user = new User(); + +var proxy2 = new MessageLogger(user, new Logger()); +var proxy1 = new MessageFilter(proxy2); +proxy1.SetFilter(Priority.High); + +proxy1.HandleMessage(message); \ No newline at end of file diff --git a/src/Lab3/Display/Display.cs b/src/Lab3/Display/Display.cs index fe0fd33..f28891d 100644 --- a/src/Lab3/Display/Display.cs +++ b/src/Lab3/Display/Display.cs @@ -1,5 +1,4 @@ using Itmo.ObjectOrientedProgramming.Lab3.Message; -using Itmo.ObjectOrientedProgramming.Lab3.Recipient; namespace Itmo.ObjectOrientedProgramming.Lab3.Display; diff --git a/src/Lab3/Recipient/GroupRecipient.cs b/src/Lab3/Group/GroupRecipient.cs similarity index 89% rename from src/Lab3/Recipient/GroupRecipient.cs rename to src/Lab3/Group/GroupRecipient.cs index 60f8bc6..9d45ec0 100644 --- a/src/Lab3/Recipient/GroupRecipient.cs +++ b/src/Lab3/Group/GroupRecipient.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using Itmo.ObjectOrientedProgramming.Lab3.Message; -namespace Itmo.ObjectOrientedProgramming.Lab3.Recipient; +namespace Itmo.ObjectOrientedProgramming.Lab3.Group; public class GroupRecipient : IRecipient { diff --git a/src/Lab3/Recipient/IRecipient.cs b/src/Lab3/IRecipient.cs similarity index 70% rename from src/Lab3/Recipient/IRecipient.cs rename to src/Lab3/IRecipient.cs index a008f06..5641388 100644 --- a/src/Lab3/Recipient/IRecipient.cs +++ b/src/Lab3/IRecipient.cs @@ -1,6 +1,6 @@ using Itmo.ObjectOrientedProgramming.Lab3.Message; -namespace Itmo.ObjectOrientedProgramming.Lab3.Recipient; +namespace Itmo.ObjectOrientedProgramming.Lab3; public interface IRecipient { diff --git a/src/Lab3/Logger/ILogger.cs b/src/Lab3/Logger/ILogger.cs new file mode 100644 index 0000000..43a7758 --- /dev/null +++ b/src/Lab3/Logger/ILogger.cs @@ -0,0 +1,6 @@ +namespace Itmo.ObjectOrientedProgramming.Lab3.Logger; + +public interface ILogger +{ + public void Log(string message); +} \ No newline at end of file diff --git a/src/Lab3/Logger/Logger.cs b/src/Lab3/Logger/Logger.cs new file mode 100644 index 0000000..000e8cc --- /dev/null +++ b/src/Lab3/Logger/Logger.cs @@ -0,0 +1,11 @@ +using System; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Logger; + +public class Logger : ILogger +{ + public void Log(string message) + { + Console.WriteLine(message); + } +} \ No newline at end of file diff --git a/src/Lab3/Message/IMessage.cs b/src/Lab3/Message/IMessage.cs index 4ca9d9a..1609805 100644 --- a/src/Lab3/Message/IMessage.cs +++ b/src/Lab3/Message/IMessage.cs @@ -3,4 +3,5 @@ namespace Itmo.ObjectOrientedProgramming.Lab3.Message; public interface IMessage { public Priority Priority { get; } + public string Render(); } \ No newline at end of file diff --git a/src/Lab3/Message/Message.cs b/src/Lab3/Message/Message.cs index 3e48a37..f1a6333 100644 --- a/src/Lab3/Message/Message.cs +++ b/src/Lab3/Message/Message.cs @@ -13,4 +13,9 @@ public Message(string header, string body, Priority priority) } public Priority Priority { get; } + + public string Render() + { + return _header + '\n' + _body; + } } \ No newline at end of file diff --git a/src/Lab3/Messenger/IMessenger.cs b/src/Lab3/Messenger/IMessenger.cs index 53fe5cb..3b54f0b 100644 --- a/src/Lab3/Messenger/IMessenger.cs +++ b/src/Lab3/Messenger/IMessenger.cs @@ -1,5 +1,3 @@ -using Itmo.ObjectOrientedProgramming.Lab3.Recipient; - namespace Itmo.ObjectOrientedProgramming.Lab3.Messenger; public interface IMessenger : IRecipient diff --git a/src/Lab3/Proxies/MessageFilter.cs b/src/Lab3/Proxies/MessageFilter.cs new file mode 100644 index 0000000..664cc08 --- /dev/null +++ b/src/Lab3/Proxies/MessageFilter.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Itmo.ObjectOrientedProgramming.Lab3.Message; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Proxies; + +public class MessageFilter : IRecipient +{ + private readonly IRecipient _recipient; + private IEnumerable _filter; + + public MessageFilter(IRecipient recipient) + { + _recipient = recipient; + _filter = new List() + { + Priority.High, + Priority.Medium, + Priority.Low, + }; + } + + public void HandleMessage(IMessage message) + { + message = message ?? throw new ArgumentNullException(nameof(message)); + if (Filter(message.Priority)) _recipient.HandleMessage(message); + } + + public void SetFilter(params Priority[] filter) + { + _filter = new List(filter); + } + + private bool Filter(Priority priority) + { + return _filter.Contains(priority); + } +} \ No newline at end of file diff --git a/src/Lab3/Proxies/MessageLogger.cs b/src/Lab3/Proxies/MessageLogger.cs new file mode 100644 index 0000000..a32f096 --- /dev/null +++ b/src/Lab3/Proxies/MessageLogger.cs @@ -0,0 +1,29 @@ +using System; +using Itmo.ObjectOrientedProgramming.Lab3.Logger; +using Itmo.ObjectOrientedProgramming.Lab3.Message; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Proxies; + +public class MessageLogger : IRecipient +{ + private readonly IRecipient _recipient; + private readonly ILogger _logger; + + public MessageLogger(IRecipient recipient, ILogger logger) + { + _recipient = recipient; + _logger = logger; + } + + public void HandleMessage(IMessage message) + { + message = message ?? throw new ArgumentNullException(nameof(message)); + Log(message); + _recipient.HandleMessage(message); + } + + private void Log(IMessage message) + { + _logger.Log(message.Render()); + } +} \ No newline at end of file diff --git a/src/Lab3/Recipient/MessengerRecipient.cs b/src/Lab3/Recipient/MessengerRecipient.cs deleted file mode 100644 index 60b3a03..0000000 --- a/src/Lab3/Recipient/MessengerRecipient.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Itmo.ObjectOrientedProgramming.Lab3.Message; -using Itmo.ObjectOrientedProgramming.Lab3.Messenger; - -namespace Itmo.ObjectOrientedProgramming.Lab3.Recipient; - -public class MessengerRecipient : IRecipient -{ - private readonly IMessenger _messenger; - - public MessengerRecipient(IMessenger messenger) - { - _messenger = messenger; - } - - public void HandleMessage(IMessage message) - { - _messenger.HandleMessage(message); - } -} \ No newline at end of file diff --git a/src/Lab3/Recipient/UserRecipient.cs b/src/Lab3/Recipient/UserRecipient.cs deleted file mode 100644 index f73907e..0000000 --- a/src/Lab3/Recipient/UserRecipient.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Itmo.ObjectOrientedProgramming.Lab3.Message; -using Itmo.ObjectOrientedProgramming.Lab3.User; - -namespace Itmo.ObjectOrientedProgramming.Lab3.Recipient; - -public class UserRecipient : IRecipient -{ - private readonly IUser _user; - - public UserRecipient(IUser user) - { - _user = user; - } - - public void HandleMessage(IMessage message) - { - _user.HandleMessage(message); - } -} \ No newline at end of file diff --git a/src/Lab3/Topic/ITopic.cs b/src/Lab3/Topic/ITopic.cs index 9345f3f..e999a51 100644 --- a/src/Lab3/Topic/ITopic.cs +++ b/src/Lab3/Topic/ITopic.cs @@ -1,5 +1,3 @@ -using Itmo.ObjectOrientedProgramming.Lab3.Recipient; - namespace Itmo.ObjectOrientedProgramming.Lab3.Topic; public interface ITopic : IRecipient diff --git a/src/Lab3/Topic/Topic.cs b/src/Lab3/Topic/Topic.cs index e446411..17bcd7e 100644 --- a/src/Lab3/Topic/Topic.cs +++ b/src/Lab3/Topic/Topic.cs @@ -1,5 +1,4 @@ using Itmo.ObjectOrientedProgramming.Lab3.Message; -using Itmo.ObjectOrientedProgramming.Lab3.Recipient; namespace Itmo.ObjectOrientedProgramming.Lab3.Topic; diff --git a/src/Lab3/User/IUser.cs b/src/Lab3/User/IUser.cs index 0126beb..0fcaffe 100644 --- a/src/Lab3/User/IUser.cs +++ b/src/Lab3/User/IUser.cs @@ -1,7 +1,8 @@ -using Itmo.ObjectOrientedProgramming.Lab3.Recipient; - namespace Itmo.ObjectOrientedProgramming.Lab3.User; public interface IUser : IRecipient { + public void MarkAsRead(int index); + + public InboxMessage GetMessage(int index); } \ No newline at end of file diff --git a/src/Lab3/User/InboxMessage.cs b/src/Lab3/User/InboxMessage.cs index 6e0cb96..cd60750 100644 --- a/src/Lab3/User/InboxMessage.cs +++ b/src/Lab3/User/InboxMessage.cs @@ -2,4 +2,14 @@ namespace Itmo.ObjectOrientedProgramming.Lab3.User; -public record InboxMessage(IMessage Message, bool Read); \ No newline at end of file +public class InboxMessage +{ + public InboxMessage(IMessage message, bool read) + { + Message = message; + Read = read; + } + + public IMessage Message { get; set; } + public bool Read { get; set; } +} \ No newline at end of file diff --git a/src/Lab3/User/User.cs b/src/Lab3/User/User.cs index 205cc36..d76f1ad 100644 --- a/src/Lab3/User/User.cs +++ b/src/Lab3/User/User.cs @@ -1,20 +1,33 @@ +using System; using System.Collections.Generic; -using System.Collections.ObjectModel; +using System.Linq; using Itmo.ObjectOrientedProgramming.Lab3.Message; namespace Itmo.ObjectOrientedProgramming.Lab3.User; public class User : IUser { - private ICollection _inbox; + private readonly List _inbox; public User() { - _inbox = new Collection(); + _inbox = new List(); } public void HandleMessage(IMessage message) { _inbox.Add(new InboxMessage(message, false)); } + + public void MarkAsRead(int index) + { + InboxMessage message = _inbox.ElementAt(index); + if (message.Read) throw new InvalidOperationException("The message was already read."); + message.Read = true; + } + + public InboxMessage GetMessage(int index) + { + return _inbox.ElementAt(index); + } } \ No newline at end of file From 8309bcea13274561071e45235f2c8e0d77b95c9c Mon Sep 17 00:00:00 2001 From: Mike de Geofroy Date: Fri, 10 Nov 2023 00:45:39 +0300 Subject: [PATCH 03/15] Fixed up the proxys, added Facade --- src/Lab3.Console/Program.cs | 13 ++++++++----- src/Lab3/Filter/IFilter.cs | 8 ++++++++ src/Lab3/Filter/PriorityFilter.cs | 32 +++++++++++++++++++++++++++++++ src/Lab3/IRenderable.cs | 6 ++++++ src/Lab3/Message/IMessage.cs | 3 +-- src/Lab3/MessagingService.cs | 13 +++++++++++++ src/Lab3/Proxies/MessageFilter.cs | 26 +++++-------------------- 7 files changed, 73 insertions(+), 28 deletions(-) create mode 100644 src/Lab3/Filter/IFilter.cs create mode 100644 src/Lab3/Filter/PriorityFilter.cs create mode 100644 src/Lab3/IRenderable.cs create mode 100644 src/Lab3/MessagingService.cs diff --git a/src/Lab3.Console/Program.cs b/src/Lab3.Console/Program.cs index 8f9ca8c..75ed43c 100644 --- a/src/Lab3.Console/Program.cs +++ b/src/Lab3.Console/Program.cs @@ -1,13 +1,16 @@ -using Itmo.ObjectOrientedProgramming.Lab3.Logger; +using Itmo.ObjectOrientedProgramming.Lab3.Filter; +using Itmo.ObjectOrientedProgramming.Lab3.Logger; using Itmo.ObjectOrientedProgramming.Lab3.Message; using Itmo.ObjectOrientedProgramming.Lab3.Proxies; using Itmo.ObjectOrientedProgramming.Lab3.User; -var message = new Message("Good morning!", "My body is ready.", Priority.High); +var message = new Message("Good morning!", "This is a body.", Priority.High); var user = new User(); +var logger = new Logger(); +var filter = new PriorityFilter(); +filter.SetFilter(Priority.High); -var proxy2 = new MessageLogger(user, new Logger()); -var proxy1 = new MessageFilter(proxy2); -proxy1.SetFilter(Priority.High); +var proxy2 = new MessageLogger(user, logger); +var proxy1 = new MessageFilter(proxy2, filter); proxy1.HandleMessage(message); \ No newline at end of file diff --git a/src/Lab3/Filter/IFilter.cs b/src/Lab3/Filter/IFilter.cs new file mode 100644 index 0000000..4d06535 --- /dev/null +++ b/src/Lab3/Filter/IFilter.cs @@ -0,0 +1,8 @@ +using Itmo.ObjectOrientedProgramming.Lab3.Message; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Filter; + +public interface IFilter +{ + public bool Filter(IMessage message); +} \ No newline at end of file diff --git a/src/Lab3/Filter/PriorityFilter.cs b/src/Lab3/Filter/PriorityFilter.cs new file mode 100644 index 0000000..4616c7c --- /dev/null +++ b/src/Lab3/Filter/PriorityFilter.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Itmo.ObjectOrientedProgramming.Lab3.Message; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Filter; + +public class PriorityFilter : IFilter +{ + private IEnumerable _filter; + + public PriorityFilter() + { + _filter = new List() + { + Priority.High, + Priority.Medium, + Priority.Low, + }; + } + + public void SetFilter(params Priority[] filter) + { + _filter = new List(filter); + } + + public bool Filter(IMessage message) + { + message = message ?? throw new ArgumentNullException(nameof(message)); + return _filter.Contains(message.Priority); + } +} \ No newline at end of file diff --git a/src/Lab3/IRenderable.cs b/src/Lab3/IRenderable.cs new file mode 100644 index 0000000..547133b --- /dev/null +++ b/src/Lab3/IRenderable.cs @@ -0,0 +1,6 @@ +namespace Itmo.ObjectOrientedProgramming.Lab3; + +public interface IRenderable +{ + public string Render(); +} \ No newline at end of file diff --git a/src/Lab3/Message/IMessage.cs b/src/Lab3/Message/IMessage.cs index 1609805..d5cda25 100644 --- a/src/Lab3/Message/IMessage.cs +++ b/src/Lab3/Message/IMessage.cs @@ -1,7 +1,6 @@ namespace Itmo.ObjectOrientedProgramming.Lab3.Message; -public interface IMessage +public interface IMessage : IRenderable { public Priority Priority { get; } - public string Render(); } \ No newline at end of file diff --git a/src/Lab3/MessagingService.cs b/src/Lab3/MessagingService.cs new file mode 100644 index 0000000..ccfef2a --- /dev/null +++ b/src/Lab3/MessagingService.cs @@ -0,0 +1,13 @@ +using System; +using Itmo.ObjectOrientedProgramming.Lab3.Message; + +namespace Itmo.ObjectOrientedProgramming.Lab3; + +public static class MessagingService +{ + public static void SendMessage(IRecipient recipient, IMessage message) + { + recipient = recipient ?? throw new ArgumentNullException(nameof(recipient)); + recipient.HandleMessage(message); + } +} \ No newline at end of file diff --git a/src/Lab3/Proxies/MessageFilter.cs b/src/Lab3/Proxies/MessageFilter.cs index 664cc08..ee5e266 100644 --- a/src/Lab3/Proxies/MessageFilter.cs +++ b/src/Lab3/Proxies/MessageFilter.cs @@ -1,6 +1,5 @@ using System; -using System.Collections.Generic; -using System.Linq; +using Itmo.ObjectOrientedProgramming.Lab3.Filter; using Itmo.ObjectOrientedProgramming.Lab3.Message; namespace Itmo.ObjectOrientedProgramming.Lab3.Proxies; @@ -8,32 +7,17 @@ namespace Itmo.ObjectOrientedProgramming.Lab3.Proxies; public class MessageFilter : IRecipient { private readonly IRecipient _recipient; - private IEnumerable _filter; + private readonly IFilter _filter; - public MessageFilter(IRecipient recipient) + public MessageFilter(IRecipient recipient, IFilter filter) { _recipient = recipient; - _filter = new List() - { - Priority.High, - Priority.Medium, - Priority.Low, - }; + _filter = filter; } public void HandleMessage(IMessage message) { message = message ?? throw new ArgumentNullException(nameof(message)); - if (Filter(message.Priority)) _recipient.HandleMessage(message); - } - - public void SetFilter(params Priority[] filter) - { - _filter = new List(filter); - } - - private bool Filter(Priority priority) - { - return _filter.Contains(priority); + if (_filter.Filter(message)) _recipient.HandleMessage(message); } } \ No newline at end of file From 9c9efacc61803fe628b9c7fb2084e433109444e0 Mon Sep 17 00:00:00 2001 From: Mike de Geofroy Date: Sat, 11 Nov 2023 10:39:10 +0300 Subject: [PATCH 04/15] Removed unused visibility modifiers from interfaces --- src/Lab3/Display/IDisplayDriver.cs | 6 +++--- src/Lab3/Filter/IFilter.cs | 2 +- src/Lab3/IRecipient.cs | 2 +- src/Lab3/IRenderable.cs | 2 +- src/Lab3/Logger/ILogger.cs | 2 +- src/Lab3/Message/IMessage.cs | 2 +- src/Lab3/Modifiers/IRenderableModifier.cs | 6 ++++++ src/Lab3/User/IUser.cs | 4 ++-- 8 files changed, 16 insertions(+), 10 deletions(-) create mode 100644 src/Lab3/Modifiers/IRenderableModifier.cs diff --git a/src/Lab3/Display/IDisplayDriver.cs b/src/Lab3/Display/IDisplayDriver.cs index ebbb5cd..97d1183 100644 --- a/src/Lab3/Display/IDisplayDriver.cs +++ b/src/Lab3/Display/IDisplayDriver.cs @@ -2,7 +2,7 @@ namespace Itmo.ObjectOrientedProgramming.Lab3.Display; public interface IDisplayDriver { - public void Clear(); - public void SetColor(); - public void Out(); + void Clear(); + void SetColor(); + void Out(); } \ No newline at end of file diff --git a/src/Lab3/Filter/IFilter.cs b/src/Lab3/Filter/IFilter.cs index 4d06535..4b96030 100644 --- a/src/Lab3/Filter/IFilter.cs +++ b/src/Lab3/Filter/IFilter.cs @@ -4,5 +4,5 @@ namespace Itmo.ObjectOrientedProgramming.Lab3.Filter; public interface IFilter { - public bool Filter(IMessage message); + bool Filter(IMessage message); } \ No newline at end of file diff --git a/src/Lab3/IRecipient.cs b/src/Lab3/IRecipient.cs index 5641388..cd69190 100644 --- a/src/Lab3/IRecipient.cs +++ b/src/Lab3/IRecipient.cs @@ -4,5 +4,5 @@ namespace Itmo.ObjectOrientedProgramming.Lab3; public interface IRecipient { - public void HandleMessage(IMessage message); + void HandleMessage(IMessage message); } \ No newline at end of file diff --git a/src/Lab3/IRenderable.cs b/src/Lab3/IRenderable.cs index 547133b..ef6f0b1 100644 --- a/src/Lab3/IRenderable.cs +++ b/src/Lab3/IRenderable.cs @@ -2,5 +2,5 @@ namespace Itmo.ObjectOrientedProgramming.Lab3; public interface IRenderable { - public string Render(); + string Render(); } \ No newline at end of file diff --git a/src/Lab3/Logger/ILogger.cs b/src/Lab3/Logger/ILogger.cs index 43a7758..9e1845d 100644 --- a/src/Lab3/Logger/ILogger.cs +++ b/src/Lab3/Logger/ILogger.cs @@ -2,5 +2,5 @@ namespace Itmo.ObjectOrientedProgramming.Lab3.Logger; public interface ILogger { - public void Log(string message); + void Log(string message); } \ No newline at end of file diff --git a/src/Lab3/Message/IMessage.cs b/src/Lab3/Message/IMessage.cs index d5cda25..3974baf 100644 --- a/src/Lab3/Message/IMessage.cs +++ b/src/Lab3/Message/IMessage.cs @@ -2,5 +2,5 @@ namespace Itmo.ObjectOrientedProgramming.Lab3.Message; public interface IMessage : IRenderable { - public Priority Priority { get; } + Priority Priority { get; } } \ No newline at end of file diff --git a/src/Lab3/Modifiers/IRenderableModifier.cs b/src/Lab3/Modifiers/IRenderableModifier.cs new file mode 100644 index 0000000..103f164 --- /dev/null +++ b/src/Lab3/Modifiers/IRenderableModifier.cs @@ -0,0 +1,6 @@ +namespace Itmo.ObjectOrientedProgramming.Lab3.Modifiers; + +public interface IRenderableModifier +{ + string Modify(string text); +} \ No newline at end of file diff --git a/src/Lab3/User/IUser.cs b/src/Lab3/User/IUser.cs index 0fcaffe..6d88596 100644 --- a/src/Lab3/User/IUser.cs +++ b/src/Lab3/User/IUser.cs @@ -2,7 +2,7 @@ namespace Itmo.ObjectOrientedProgramming.Lab3.User; public interface IUser : IRecipient { - public void MarkAsRead(int index); + void MarkAsRead(int index); - public InboxMessage GetMessage(int index); + InboxMessage GetMessage(int index); } \ No newline at end of file From 808debbc80ae15734161ecdbf6260c7b0fe7977f Mon Sep 17 00:00:00 2001 From: Mike de Geofroy Date: Sat, 11 Nov 2023 10:39:24 +0300 Subject: [PATCH 05/15] Resolved DIP --- src/Lab3/Proxies/MessageLogger.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Lab3/Proxies/MessageLogger.cs b/src/Lab3/Proxies/MessageLogger.cs index a32f096..c9600c4 100644 --- a/src/Lab3/Proxies/MessageLogger.cs +++ b/src/Lab3/Proxies/MessageLogger.cs @@ -22,7 +22,7 @@ public void HandleMessage(IMessage message) _recipient.HandleMessage(message); } - private void Log(IMessage message) + private void Log(IRenderable message) { _logger.Log(message.Render()); } From 6cace2f8dc768e0a167686ae626bea534e744583 Mon Sep 17 00:00:00 2001 From: Mike de Geofroy Date: Sat, 11 Nov 2023 15:06:42 +0300 Subject: [PATCH 06/15] Added display strategies --- src/Lab3/Display/Display.cs | 12 +++++++----- src/Lab3/Display/DisplayDriver.cs | 20 ++++++++++++++++++++ src/Lab3/Display/DisplayToConsole.cs | 21 +++++++++++++++++++++ src/Lab3/Display/DisplayToFile.cs | 21 +++++++++++++++++++++ src/Lab3/Display/IDisplayDriver.cs | 8 -------- src/Lab3/Display/IDisplayStrategy.cs | 10 ++++++++++ 6 files changed, 79 insertions(+), 13 deletions(-) create mode 100644 src/Lab3/Display/DisplayDriver.cs create mode 100644 src/Lab3/Display/DisplayToConsole.cs create mode 100644 src/Lab3/Display/DisplayToFile.cs delete mode 100644 src/Lab3/Display/IDisplayDriver.cs create mode 100644 src/Lab3/Display/IDisplayStrategy.cs diff --git a/src/Lab3/Display/Display.cs b/src/Lab3/Display/Display.cs index f28891d..37201a9 100644 --- a/src/Lab3/Display/Display.cs +++ b/src/Lab3/Display/Display.cs @@ -1,19 +1,21 @@ +using System.Drawing; using Itmo.ObjectOrientedProgramming.Lab3.Message; namespace Itmo.ObjectOrientedProgramming.Lab3.Display; +// TODO +// should have a display that takes in a string. public class Display : IRecipient { - private readonly IDisplayDriver _displayDriver; + private readonly DisplayDriver _displayStrategy; - public Display(IDisplayDriver displayDriver) + public Display(IDisplayStrategy displayStrategy) { - _displayDriver = displayDriver; + _displayStrategy = new DisplayDriver(displayStrategy); } public void HandleMessage(IMessage message) { - _displayDriver.Clear(); - _displayDriver.Out(); + _displayStrategy.OutputText(message.Render(), Color.Red); } } \ No newline at end of file diff --git a/src/Lab3/Display/DisplayDriver.cs b/src/Lab3/Display/DisplayDriver.cs new file mode 100644 index 0000000..f46cb40 --- /dev/null +++ b/src/Lab3/Display/DisplayDriver.cs @@ -0,0 +1,20 @@ +using System.Drawing; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Display; + +public class DisplayDriver +{ + private readonly IDisplayStrategy _strategy; + + public DisplayDriver(IDisplayStrategy strategy) + { + _strategy = strategy; + } + + public void OutputText(string text, Color color) + { + _strategy.Clear(); + _strategy.SetColor(color); + _strategy.Out(text); + } +} \ No newline at end of file diff --git a/src/Lab3/Display/DisplayToConsole.cs b/src/Lab3/Display/DisplayToConsole.cs new file mode 100644 index 0000000..40a471d --- /dev/null +++ b/src/Lab3/Display/DisplayToConsole.cs @@ -0,0 +1,21 @@ +using System.Drawing; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Display; + +public class DisplayToConsole : IDisplayStrategy +{ + public void Clear() + { + throw new System.NotImplementedException(); + } + + public void SetColor(Color color) + { + throw new System.NotImplementedException(); + } + + public void Out(string text) + { + throw new System.NotImplementedException(); + } +} \ No newline at end of file diff --git a/src/Lab3/Display/DisplayToFile.cs b/src/Lab3/Display/DisplayToFile.cs new file mode 100644 index 0000000..928a693 --- /dev/null +++ b/src/Lab3/Display/DisplayToFile.cs @@ -0,0 +1,21 @@ +using System.Drawing; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Display; + +public class DisplayToFile : IDisplayStrategy +{ + public void Clear() + { + throw new System.NotImplementedException(); + } + + public void SetColor(Color color) + { + throw new System.NotImplementedException(); + } + + public void Out(string text) + { + throw new System.NotImplementedException(); + } +} \ No newline at end of file diff --git a/src/Lab3/Display/IDisplayDriver.cs b/src/Lab3/Display/IDisplayDriver.cs deleted file mode 100644 index 97d1183..0000000 --- a/src/Lab3/Display/IDisplayDriver.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Itmo.ObjectOrientedProgramming.Lab3.Display; - -public interface IDisplayDriver -{ - void Clear(); - void SetColor(); - void Out(); -} \ No newline at end of file diff --git a/src/Lab3/Display/IDisplayStrategy.cs b/src/Lab3/Display/IDisplayStrategy.cs new file mode 100644 index 0000000..ec44411 --- /dev/null +++ b/src/Lab3/Display/IDisplayStrategy.cs @@ -0,0 +1,10 @@ +using System.Drawing; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Display; + +public interface IDisplayStrategy +{ + void Clear(); + void SetColor(Color color); + void Out(string text); +} \ No newline at end of file From 54e38b900d35c2dbc76eebd7d60f05432a7aadf2 Mon Sep 17 00:00:00 2001 From: Mike de Geofroy Date: Sat, 11 Nov 2023 15:07:19 +0300 Subject: [PATCH 07/15] Fixed null warnings --- src/Lab3/{Proxies => Decorators}/MessageFilter.cs | 4 +--- src/Lab3/{Proxies => Decorators}/MessageLogger.cs | 4 +--- src/Lab3/MessagingService.cs | 2 -- src/Lab3/Messenger/Messenger.cs | 1 - 4 files changed, 2 insertions(+), 9 deletions(-) rename src/Lab3/{Proxies => Decorators}/MessageFilter.cs (76%) rename src/Lab3/{Proxies => Decorators}/MessageLogger.cs (79%) diff --git a/src/Lab3/Proxies/MessageFilter.cs b/src/Lab3/Decorators/MessageFilter.cs similarity index 76% rename from src/Lab3/Proxies/MessageFilter.cs rename to src/Lab3/Decorators/MessageFilter.cs index ee5e266..7a82bb6 100644 --- a/src/Lab3/Proxies/MessageFilter.cs +++ b/src/Lab3/Decorators/MessageFilter.cs @@ -1,8 +1,7 @@ -using System; using Itmo.ObjectOrientedProgramming.Lab3.Filter; using Itmo.ObjectOrientedProgramming.Lab3.Message; -namespace Itmo.ObjectOrientedProgramming.Lab3.Proxies; +namespace Itmo.ObjectOrientedProgramming.Lab3.Decorators; public class MessageFilter : IRecipient { @@ -17,7 +16,6 @@ public MessageFilter(IRecipient recipient, IFilter filter) public void HandleMessage(IMessage message) { - message = message ?? throw new ArgumentNullException(nameof(message)); if (_filter.Filter(message)) _recipient.HandleMessage(message); } } \ No newline at end of file diff --git a/src/Lab3/Proxies/MessageLogger.cs b/src/Lab3/Decorators/MessageLogger.cs similarity index 79% rename from src/Lab3/Proxies/MessageLogger.cs rename to src/Lab3/Decorators/MessageLogger.cs index c9600c4..7478530 100644 --- a/src/Lab3/Proxies/MessageLogger.cs +++ b/src/Lab3/Decorators/MessageLogger.cs @@ -1,8 +1,7 @@ -using System; using Itmo.ObjectOrientedProgramming.Lab3.Logger; using Itmo.ObjectOrientedProgramming.Lab3.Message; -namespace Itmo.ObjectOrientedProgramming.Lab3.Proxies; +namespace Itmo.ObjectOrientedProgramming.Lab3.Decorators; public class MessageLogger : IRecipient { @@ -17,7 +16,6 @@ public MessageLogger(IRecipient recipient, ILogger logger) public void HandleMessage(IMessage message) { - message = message ?? throw new ArgumentNullException(nameof(message)); Log(message); _recipient.HandleMessage(message); } diff --git a/src/Lab3/MessagingService.cs b/src/Lab3/MessagingService.cs index ccfef2a..b2095e0 100644 --- a/src/Lab3/MessagingService.cs +++ b/src/Lab3/MessagingService.cs @@ -1,4 +1,3 @@ -using System; using Itmo.ObjectOrientedProgramming.Lab3.Message; namespace Itmo.ObjectOrientedProgramming.Lab3; @@ -7,7 +6,6 @@ public static class MessagingService { public static void SendMessage(IRecipient recipient, IMessage message) { - recipient = recipient ?? throw new ArgumentNullException(nameof(recipient)); recipient.HandleMessage(message); } } \ No newline at end of file diff --git a/src/Lab3/Messenger/Messenger.cs b/src/Lab3/Messenger/Messenger.cs index aa07d72..7218f47 100644 --- a/src/Lab3/Messenger/Messenger.cs +++ b/src/Lab3/Messenger/Messenger.cs @@ -7,7 +7,6 @@ public class Messenger : IMessenger { public void HandleMessage(IMessage message) { - message = message ?? throw new ArgumentNullException(nameof(message)); Console.WriteLine("Messenger: \n" + message.Render()); } } \ No newline at end of file From 1975c8a9ebc6a11bc2f2c7c17cc0d4c22f96a67c Mon Sep 17 00:00:00 2001 From: Mike de Geofroy Date: Sat, 11 Nov 2023 15:07:41 +0300 Subject: [PATCH 08/15] changed priority from enum to int --- src/Lab3.Console/Program.cs | 6 +++--- src/Lab3/Filter/PriorityFilter.cs | 23 ++++++++--------------- src/Lab3/Message/IMessage.cs | 2 +- src/Lab3/Message/Message.cs | 4 ++-- src/Lab3/Message/Priority.cs | 8 -------- 5 files changed, 14 insertions(+), 29 deletions(-) delete mode 100644 src/Lab3/Message/Priority.cs diff --git a/src/Lab3.Console/Program.cs b/src/Lab3.Console/Program.cs index 75ed43c..29e903f 100644 --- a/src/Lab3.Console/Program.cs +++ b/src/Lab3.Console/Program.cs @@ -1,14 +1,14 @@ -using Itmo.ObjectOrientedProgramming.Lab3.Filter; +using Itmo.ObjectOrientedProgramming.Lab3.Decorators; +using Itmo.ObjectOrientedProgramming.Lab3.Filter; using Itmo.ObjectOrientedProgramming.Lab3.Logger; using Itmo.ObjectOrientedProgramming.Lab3.Message; -using Itmo.ObjectOrientedProgramming.Lab3.Proxies; using Itmo.ObjectOrientedProgramming.Lab3.User; var message = new Message("Good morning!", "This is a body.", Priority.High); var user = new User(); var logger = new Logger(); var filter = new PriorityFilter(); -filter.SetFilter(Priority.High); +filter.SetFilter(3); var proxy2 = new MessageLogger(user, logger); var proxy1 = new MessageFilter(proxy2, filter); diff --git a/src/Lab3/Filter/PriorityFilter.cs b/src/Lab3/Filter/PriorityFilter.cs index 4616c7c..4949396 100644 --- a/src/Lab3/Filter/PriorityFilter.cs +++ b/src/Lab3/Filter/PriorityFilter.cs @@ -1,32 +1,25 @@ -using System; -using System.Collections.Generic; -using System.Linq; using Itmo.ObjectOrientedProgramming.Lab3.Message; namespace Itmo.ObjectOrientedProgramming.Lab3.Filter; +// TODO +// fix this shit, make priorities a number public class PriorityFilter : IFilter { - private IEnumerable _filter; + private int _priorityFilter; - public PriorityFilter() + public PriorityFilter(int priorityLevel = 0) { - _filter = new List() - { - Priority.High, - Priority.Medium, - Priority.Low, - }; + _priorityFilter = priorityLevel; } - public void SetFilter(params Priority[] filter) + public void SetFilter(int priorityLevel) { - _filter = new List(filter); + _priorityFilter = priorityLevel; } public bool Filter(IMessage message) { - message = message ?? throw new ArgumentNullException(nameof(message)); - return _filter.Contains(message.Priority); + return message.Priority >= _priorityFilter; } } \ No newline at end of file diff --git a/src/Lab3/Message/IMessage.cs b/src/Lab3/Message/IMessage.cs index 3974baf..8583f91 100644 --- a/src/Lab3/Message/IMessage.cs +++ b/src/Lab3/Message/IMessage.cs @@ -2,5 +2,5 @@ namespace Itmo.ObjectOrientedProgramming.Lab3.Message; public interface IMessage : IRenderable { - Priority Priority { get; } + int Priority { get; } } \ No newline at end of file diff --git a/src/Lab3/Message/Message.cs b/src/Lab3/Message/Message.cs index f1a6333..f3ad15b 100644 --- a/src/Lab3/Message/Message.cs +++ b/src/Lab3/Message/Message.cs @@ -5,14 +5,14 @@ public class Message : IMessage private readonly string _header; private readonly string _body; - public Message(string header, string body, Priority priority) + public Message(string header, string body, int priority) { _header = header; _body = body; Priority = priority; } - public Priority Priority { get; } + public int Priority { get; } public string Render() { diff --git a/src/Lab3/Message/Priority.cs b/src/Lab3/Message/Priority.cs deleted file mode 100644 index 20f16fe..0000000 --- a/src/Lab3/Message/Priority.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Itmo.ObjectOrientedProgramming.Lab3.Message; - -public enum Priority -{ - High, - Medium, - Low, -} \ No newline at end of file From 5c206d06e4c32c61d5501445ac8dcb0662928606 Mon Sep 17 00:00:00 2001 From: Mike de Geofroy Date: Sat, 11 Nov 2023 15:30:16 +0300 Subject: [PATCH 09/15] Fixed up some stuff --- src/Lab3.Console/Program.cs | 5 ++--- src/Lab3/Filter/PriorityFilter.cs | 2 -- src/Lab3/Messenger/IMessenger.cs | 5 ----- src/Lab3/Messenger/Messenger.cs | 12 +++++++++--- src/Lab3/Messenger/TelegramService.cs | 11 +++++++++++ tests/Lab3.Tests/MessageTests.cs | 16 ++++++++++++++++ 6 files changed, 38 insertions(+), 13 deletions(-) delete mode 100644 src/Lab3/Messenger/IMessenger.cs create mode 100644 src/Lab3/Messenger/TelegramService.cs create mode 100644 tests/Lab3.Tests/MessageTests.cs diff --git a/src/Lab3.Console/Program.cs b/src/Lab3.Console/Program.cs index 29e903f..210d5ee 100644 --- a/src/Lab3.Console/Program.cs +++ b/src/Lab3.Console/Program.cs @@ -4,11 +4,10 @@ using Itmo.ObjectOrientedProgramming.Lab3.Message; using Itmo.ObjectOrientedProgramming.Lab3.User; -var message = new Message("Good morning!", "This is a body.", Priority.High); +var message = new Message("Good morning!", "This is a body.", 2); var user = new User(); var logger = new Logger(); -var filter = new PriorityFilter(); -filter.SetFilter(3); +var filter = new PriorityFilter(3); var proxy2 = new MessageLogger(user, logger); var proxy1 = new MessageFilter(proxy2, filter); diff --git a/src/Lab3/Filter/PriorityFilter.cs b/src/Lab3/Filter/PriorityFilter.cs index 4949396..4f64050 100644 --- a/src/Lab3/Filter/PriorityFilter.cs +++ b/src/Lab3/Filter/PriorityFilter.cs @@ -2,8 +2,6 @@ namespace Itmo.ObjectOrientedProgramming.Lab3.Filter; -// TODO -// fix this shit, make priorities a number public class PriorityFilter : IFilter { private int _priorityFilter; diff --git a/src/Lab3/Messenger/IMessenger.cs b/src/Lab3/Messenger/IMessenger.cs deleted file mode 100644 index 3b54f0b..0000000 --- a/src/Lab3/Messenger/IMessenger.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace Itmo.ObjectOrientedProgramming.Lab3.Messenger; - -public interface IMessenger : IRecipient -{ -} \ No newline at end of file diff --git a/src/Lab3/Messenger/Messenger.cs b/src/Lab3/Messenger/Messenger.cs index 7218f47..c0dd335 100644 --- a/src/Lab3/Messenger/Messenger.cs +++ b/src/Lab3/Messenger/Messenger.cs @@ -1,12 +1,18 @@ -using System; using Itmo.ObjectOrientedProgramming.Lab3.Message; namespace Itmo.ObjectOrientedProgramming.Lab3.Messenger; -public class Messenger : IMessenger +public class Messenger : IRecipient { + private readonly IRecipient _adapter; + + public Messenger(IRecipient adapter) + { + _adapter = adapter; + } + public void HandleMessage(IMessage message) { - Console.WriteLine("Messenger: \n" + message.Render()); + _adapter.HandleMessage(message); } } \ No newline at end of file diff --git a/src/Lab3/Messenger/TelegramService.cs b/src/Lab3/Messenger/TelegramService.cs new file mode 100644 index 0000000..a2ee018 --- /dev/null +++ b/src/Lab3/Messenger/TelegramService.cs @@ -0,0 +1,11 @@ +using System; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Messenger; + +public class TelegramService +{ + public void SendMessage(string message, string uid) + { + Console.WriteLine(message + "sent to: " + uid); + } +} \ No newline at end of file diff --git a/tests/Lab3.Tests/MessageTests.cs b/tests/Lab3.Tests/MessageTests.cs new file mode 100644 index 0000000..63ae738 --- /dev/null +++ b/tests/Lab3.Tests/MessageTests.cs @@ -0,0 +1,16 @@ +using Xunit; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Tests; + +public class MessageTests +{ + [Fact] + public void Build_Success_WhenComputerIsCompatible() + { + // Arrange + + // Act + + // Assert + } +} \ No newline at end of file From b80b524f3fd4dc98c15cc665a3dff1f273a96592 Mon Sep 17 00:00:00 2001 From: Mike de Geofroy Date: Sat, 11 Nov 2023 15:30:23 +0300 Subject: [PATCH 10/15] Added a messanger adapter --- src/Lab3/Messenger/TelegramAdapter.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/Lab3/Messenger/TelegramAdapter.cs diff --git a/src/Lab3/Messenger/TelegramAdapter.cs b/src/Lab3/Messenger/TelegramAdapter.cs new file mode 100644 index 0000000..427ef68 --- /dev/null +++ b/src/Lab3/Messenger/TelegramAdapter.cs @@ -0,0 +1,18 @@ +using Itmo.ObjectOrientedProgramming.Lab3.Message; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Messenger; + +public class TelegramAdapter : IRecipient +{ + private readonly TelegramService _telegramService; + + public TelegramAdapter(TelegramService telegramService) + { + _telegramService = telegramService; + } + + public void HandleMessage(IMessage message) + { + _telegramService.SendMessage(message.Render(), "some uid"); + } +} \ No newline at end of file From 91f6216db6f183251bbe99b92d729a9287ab4124 Mon Sep 17 00:00:00 2001 From: Mike de Geofroy Date: Thu, 16 Nov 2023 17:00:49 +0300 Subject: [PATCH 11/15] Added some messanger adapters and DisplayStrategies for the Display recipient --- src/Lab3.Console/Program.cs | 11 +++++++++-- src/Lab3/Display/DisplayToConsole.cs | 14 +++++++++++--- src/Lab3/Display/DisplayToFile.cs | 20 +++++++++++++++++--- src/Lab3/Lab3.csproj | 4 ++++ src/Lab3/Messenger/TelegramAdapter.cs | 2 +- src/Lab3/Messenger/TelegramService.cs | 11 +++++++++-- 6 files changed, 51 insertions(+), 11 deletions(-) diff --git a/src/Lab3.Console/Program.cs b/src/Lab3.Console/Program.cs index 210d5ee..e14238c 100644 --- a/src/Lab3.Console/Program.cs +++ b/src/Lab3.Console/Program.cs @@ -1,4 +1,6 @@ -using Itmo.ObjectOrientedProgramming.Lab3.Decorators; +using System.Drawing; +using Itmo.ObjectOrientedProgramming.Lab3.Decorators; +using Itmo.ObjectOrientedProgramming.Lab3.Display; using Itmo.ObjectOrientedProgramming.Lab3.Filter; using Itmo.ObjectOrientedProgramming.Lab3.Logger; using Itmo.ObjectOrientedProgramming.Lab3.Message; @@ -12,4 +14,9 @@ var proxy2 = new MessageLogger(user, logger); var proxy1 = new MessageFilter(proxy2, filter); -proxy1.HandleMessage(message); \ No newline at end of file +proxy1.HandleMessage(message); + +var display = new DisplayToFile(); + +display.SetColor(Color.Red); +display.Out("Hello!"); \ No newline at end of file diff --git a/src/Lab3/Display/DisplayToConsole.cs b/src/Lab3/Display/DisplayToConsole.cs index 40a471d..7639f8e 100644 --- a/src/Lab3/Display/DisplayToConsole.cs +++ b/src/Lab3/Display/DisplayToConsole.cs @@ -1,21 +1,29 @@ +using System; using System.Drawing; namespace Itmo.ObjectOrientedProgramming.Lab3.Display; public class DisplayToConsole : IDisplayStrategy { + private Color _color; + + public DisplayToConsole() + { + _color = Color.White; + } + public void Clear() { - throw new System.NotImplementedException(); + Console.Clear(); } public void SetColor(Color color) { - throw new System.NotImplementedException(); + _color = color; } public void Out(string text) { - throw new System.NotImplementedException(); + Console.WriteLine(Crayon.Output.Rgb(_color.R, _color.G, _color.B).Text(text)); } } \ No newline at end of file diff --git a/src/Lab3/Display/DisplayToFile.cs b/src/Lab3/Display/DisplayToFile.cs index 928a693..9bec7d8 100644 --- a/src/Lab3/Display/DisplayToFile.cs +++ b/src/Lab3/Display/DisplayToFile.cs @@ -1,21 +1,35 @@ +using System; using System.Drawing; +using System.IO; namespace Itmo.ObjectOrientedProgramming.Lab3.Display; public class DisplayToFile : IDisplayStrategy { + private Color _color; + + public DisplayToFile() + { + _color = Color.White; + } + public void Clear() { - throw new System.NotImplementedException(); + Console.Clear(); } public void SetColor(Color color) { - throw new System.NotImplementedException(); + _color = color; } public void Out(string text) { - throw new System.NotImplementedException(); + const string path = "test.txt"; + + if (File.Exists(path)) return; + + using StreamWriter sw = File.CreateText(path); + sw.WriteLine(Crayon.Output.Rgb(_color.R, _color.G, _color.B).Text(text)); } } \ No newline at end of file diff --git a/src/Lab3/Lab3.csproj b/src/Lab3/Lab3.csproj index a325740..b48313f 100644 --- a/src/Lab3/Lab3.csproj +++ b/src/Lab3/Lab3.csproj @@ -4,4 +4,8 @@ Itmo.ObjectOrientedProgramming.Lab3 + + + + diff --git a/src/Lab3/Messenger/TelegramAdapter.cs b/src/Lab3/Messenger/TelegramAdapter.cs index 427ef68..f0964a7 100644 --- a/src/Lab3/Messenger/TelegramAdapter.cs +++ b/src/Lab3/Messenger/TelegramAdapter.cs @@ -13,6 +13,6 @@ public TelegramAdapter(TelegramService telegramService) public void HandleMessage(IMessage message) { - _telegramService.SendMessage(message.Render(), "some uid"); + _telegramService.SendMessage(message.Render()); } } \ No newline at end of file diff --git a/src/Lab3/Messenger/TelegramService.cs b/src/Lab3/Messenger/TelegramService.cs index a2ee018..b7342c7 100644 --- a/src/Lab3/Messenger/TelegramService.cs +++ b/src/Lab3/Messenger/TelegramService.cs @@ -4,8 +4,15 @@ namespace Itmo.ObjectOrientedProgramming.Lab3.Messenger; public class TelegramService { - public void SendMessage(string message, string uid) + private string _uid; + + public TelegramService(string uid) + { + _uid = uid; + } + + public void SendMessage(string message) { - Console.WriteLine(message + "sent to: " + uid); + Console.WriteLine(message + "sent to: " + _uid); } } \ No newline at end of file From cbaa1762206686ae434562c9fcb22501f393d7e7 Mon Sep 17 00:00:00 2001 From: Mike de Geofroy Date: Sat, 18 Nov 2023 14:58:50 +0300 Subject: [PATCH 12/15] Added Tests for Message, Messenger, and Logging. --- src/Lab3/MessagingService.cs | 12 +++++++ tests/Lab3.Tests/FilterTests.cs | 54 ++++++++++++++++++++++++++++++ tests/Lab3.Tests/LoggingTests.cs | 25 ++++++++++++++ tests/Lab3.Tests/MessageTests.cs | 16 --------- tests/Lab3.Tests/MessengerTests.cs | 24 +++++++++++++ 5 files changed, 115 insertions(+), 16 deletions(-) create mode 100644 tests/Lab3.Tests/FilterTests.cs create mode 100644 tests/Lab3.Tests/LoggingTests.cs delete mode 100644 tests/Lab3.Tests/MessageTests.cs create mode 100644 tests/Lab3.Tests/MessengerTests.cs diff --git a/src/Lab3/MessagingService.cs b/src/Lab3/MessagingService.cs index b2095e0..c46b298 100644 --- a/src/Lab3/MessagingService.cs +++ b/src/Lab3/MessagingService.cs @@ -1,9 +1,21 @@ +using Itmo.ObjectOrientedProgramming.Lab3.Decorators; +using Itmo.ObjectOrientedProgramming.Lab3.Filter; using Itmo.ObjectOrientedProgramming.Lab3.Message; namespace Itmo.ObjectOrientedProgramming.Lab3; public static class MessagingService { + public static IRecipient Log(IRecipient endpoint) + { + return new MessageLogger(endpoint, new Logger.Logger()); + } + + public static IRecipient Filter(IRecipient endpoint, int level) + { + return new MessageFilter(endpoint, new PriorityFilter(level)); + } + public static void SendMessage(IRecipient recipient, IMessage message) { recipient.HandleMessage(message); diff --git a/tests/Lab3.Tests/FilterTests.cs b/tests/Lab3.Tests/FilterTests.cs new file mode 100644 index 0000000..de824ec --- /dev/null +++ b/tests/Lab3.Tests/FilterTests.cs @@ -0,0 +1,54 @@ +using Itmo.ObjectOrientedProgramming.Lab3.Decorators; +using Itmo.ObjectOrientedProgramming.Lab3.Filter; +using NSubstitute; +using Xunit; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Tests; + +public class FilterTests +{ + [Fact] + public void Level2Filter_Success_WhenRecipientDidNotReceiveLevel1Message() + { + // Arrange + var message = new Message.Message("Header", "Body", 1); + IRecipient mockRecipient = Substitute.For(); + var filter = new MessageFilter(mockRecipient, new PriorityFilter(2)); + + // Act + filter.HandleMessage(message); + + // Assert + mockRecipient.DidNotReceive().HandleMessage(message); + } + + [Fact] + public void Level2Filter_Success_WhenRecipientReceivedLevel3Message() + { + // Arrange + var message = new Message.Message("Hello", "yep", 3); + IRecipient mockRecipient = Substitute.For(); + var filter = new MessageFilter(mockRecipient, new PriorityFilter(2)); + + // Act + filter.HandleMessage(message); + + // Assert + mockRecipient.Received().HandleMessage(message); + } + + [Fact] + public void Level3Filter_Success_WhenRecipientDidNotReceiveLevel2Message() + { + // Arrange + var message = new Message.Message("Hello", "yep", 1); + IRecipient mockRecipient = Substitute.For(); + var filter = new MessageFilter(mockRecipient, new PriorityFilter(3)); + + // Act + filter.HandleMessage(message); + + // Assert + mockRecipient.DidNotReceive().HandleMessage(message); + } +} \ No newline at end of file diff --git a/tests/Lab3.Tests/LoggingTests.cs b/tests/Lab3.Tests/LoggingTests.cs new file mode 100644 index 0000000..9d030be --- /dev/null +++ b/tests/Lab3.Tests/LoggingTests.cs @@ -0,0 +1,25 @@ +using Itmo.ObjectOrientedProgramming.Lab3.Decorators; +using NSubstitute; +using Xunit; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Tests; + +public class LoggingTests +{ + [Fact] + public void Logger_Success_WhenLoggedRecipientMessage() + { + // Arrange + var message = new Message.Message("Header", "Body", 1); + Logger.Logger logger = Substitute.For(); + + var recipient = new User.User(); + var messageLogger = new MessageLogger(recipient, logger); + + // Act + messageLogger.HandleMessage(message); + + // Assert + logger.Received().Log(message.Render()); + } +} \ No newline at end of file diff --git a/tests/Lab3.Tests/MessageTests.cs b/tests/Lab3.Tests/MessageTests.cs deleted file mode 100644 index 63ae738..0000000 --- a/tests/Lab3.Tests/MessageTests.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Xunit; - -namespace Itmo.ObjectOrientedProgramming.Lab3.Tests; - -public class MessageTests -{ - [Fact] - public void Build_Success_WhenComputerIsCompatible() - { - // Arrange - - // Act - - // Assert - } -} \ No newline at end of file diff --git a/tests/Lab3.Tests/MessengerTests.cs b/tests/Lab3.Tests/MessengerTests.cs new file mode 100644 index 0000000..9ca95c5 --- /dev/null +++ b/tests/Lab3.Tests/MessengerTests.cs @@ -0,0 +1,24 @@ +using Itmo.ObjectOrientedProgramming.Lab3.Messenger; +using NSubstitute; +using NSubstitute.ReceivedExtensions; +using Xunit; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Tests; + +public class MessengerTests +{ + [Fact] + public void Telegram_Success_WhenMessageSent() + { + // Arrange + var message = new Message.Message("Header", "Body", 1); + TelegramService telegram = Substitute.For("9a4e4610-8609-11ee-b9d1-0242ac120002"); + var messenger = new TelegramAdapter(telegram); + + // Act + messenger.HandleMessage(message); + + // Assert + telegram.Received().SendMessage(message.Render()); + } +} \ No newline at end of file From 70aa41e1f60d064a31ec5d6d155e48e91b245e07 Mon Sep 17 00:00:00 2001 From: Mike de Geofroy Date: Sat, 18 Nov 2023 14:58:56 +0300 Subject: [PATCH 13/15] Simplified rendering --- src/Lab3/Modifiers/IRenderableModifier.cs | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 src/Lab3/Modifiers/IRenderableModifier.cs diff --git a/src/Lab3/Modifiers/IRenderableModifier.cs b/src/Lab3/Modifiers/IRenderableModifier.cs deleted file mode 100644 index 103f164..0000000 --- a/src/Lab3/Modifiers/IRenderableModifier.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Itmo.ObjectOrientedProgramming.Lab3.Modifiers; - -public interface IRenderableModifier -{ - string Modify(string text); -} \ No newline at end of file From eed41b2b720523152416fd5e2a14f74dede937db Mon Sep 17 00:00:00 2001 From: Mike de Geofroy Date: Sat, 18 Nov 2023 15:22:11 +0300 Subject: [PATCH 14/15] Added custom MessageReadResult.cs --- src/Lab3/User/IUser.cs | 2 +- src/Lab3/User/MessageReadResult.cs | 7 ++++ src/Lab3/User/User.cs | 6 ++-- tests/Lab3.Tests/UserTests.cs | 55 ++++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 src/Lab3/User/MessageReadResult.cs create mode 100644 tests/Lab3.Tests/UserTests.cs diff --git a/src/Lab3/User/IUser.cs b/src/Lab3/User/IUser.cs index 6d88596..b079c59 100644 --- a/src/Lab3/User/IUser.cs +++ b/src/Lab3/User/IUser.cs @@ -2,7 +2,7 @@ namespace Itmo.ObjectOrientedProgramming.Lab3.User; public interface IUser : IRecipient { - void MarkAsRead(int index); + MessageReadResult MarkAsRead(int index); InboxMessage GetMessage(int index); } \ No newline at end of file diff --git a/src/Lab3/User/MessageReadResult.cs b/src/Lab3/User/MessageReadResult.cs new file mode 100644 index 0000000..70ac4fa --- /dev/null +++ b/src/Lab3/User/MessageReadResult.cs @@ -0,0 +1,7 @@ +namespace Itmo.ObjectOrientedProgramming.Lab3.User; + +public abstract record MessageReadResult +{ + public record Success(InboxMessage Message) : MessageReadResult; + public record Failed(string Reason) : MessageReadResult; +} \ No newline at end of file diff --git a/src/Lab3/User/User.cs b/src/Lab3/User/User.cs index d76f1ad..cab852c 100644 --- a/src/Lab3/User/User.cs +++ b/src/Lab3/User/User.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using System.Linq; using Itmo.ObjectOrientedProgramming.Lab3.Message; @@ -19,11 +18,12 @@ public void HandleMessage(IMessage message) _inbox.Add(new InboxMessage(message, false)); } - public void MarkAsRead(int index) + public MessageReadResult MarkAsRead(int index) { InboxMessage message = _inbox.ElementAt(index); - if (message.Read) throw new InvalidOperationException("The message was already read."); + if (message.Read) return new MessageReadResult.Failed("The message was already read."); message.Read = true; + return new MessageReadResult.Success(message); } public InboxMessage GetMessage(int index) diff --git a/tests/Lab3.Tests/UserTests.cs b/tests/Lab3.Tests/UserTests.cs new file mode 100644 index 0000000..1351b9a --- /dev/null +++ b/tests/Lab3.Tests/UserTests.cs @@ -0,0 +1,55 @@ +using Xunit; + +namespace Itmo.ObjectOrientedProgramming.Lab3.Tests; + +public class UserTests +{ + [Fact] + public void User_Success_WhenReceivedMessageIsUnread() + { + // Arrange + var message = new Message.Message("Header", "Body", 1); + var user = new User.User(); + + // Act + user.HandleMessage(message); + + // Assert + Assert.False(user.GetMessage(0).Read); + } + + [Fact] + public void User_Success_WhenReadingUnreadMessage() + { + // Arrange + var message = new Message.Message("Header", "Body", 1); + var user = new User.User(); + + // Act + user.HandleMessage(message); + user.MarkAsRead(0); + + // Assert + Assert.True(user.GetMessage(0).Read); + } + + [Fact] + public void User_Fail_WhenReceivedMessageIsRead() + { + // Arrange + var message = new Message.Message("Header", "Body", 1); + var user = new User.User(); + + // Act + user.HandleMessage(message); + user.MarkAsRead(0); + + // Assert + Assert.True(user.GetMessage(0).Read); + } + + [Fact] + public void User_Fail_WhenMessageIsAlreadyRead() + { + } +} \ No newline at end of file From 4a747613f88448f7165fcbdeced89eec338a55da Mon Sep 17 00:00:00 2001 From: Mike de Geofroy Date: Sat, 18 Nov 2023 15:27:14 +0300 Subject: [PATCH 15/15] Added user tests --- tests/Lab3.Tests/UserTests.cs | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/tests/Lab3.Tests/UserTests.cs b/tests/Lab3.Tests/UserTests.cs index 1351b9a..e1ac385 100644 --- a/tests/Lab3.Tests/UserTests.cs +++ b/tests/Lab3.Tests/UserTests.cs @@ -1,3 +1,4 @@ +using Itmo.ObjectOrientedProgramming.Lab3.User; using Xunit; namespace Itmo.ObjectOrientedProgramming.Lab3.Tests; @@ -34,7 +35,7 @@ public void User_Success_WhenReadingUnreadMessage() } [Fact] - public void User_Fail_WhenReceivedMessageIsRead() + public void User_Fail_WhenMessageIsAlreadyRead() { // Arrange var message = new Message.Message("Header", "Body", 1); @@ -45,11 +46,6 @@ public void User_Fail_WhenReceivedMessageIsRead() user.MarkAsRead(0); // Assert - Assert.True(user.GetMessage(0).Read); - } - - [Fact] - public void User_Fail_WhenMessageIsAlreadyRead() - { + Assert.True(user.MarkAsRead(0) is MessageReadResult.Failed); } } \ No newline at end of file