From e5445bb341fb395ac9298392996b7e288bfd62bc Mon Sep 17 00:00:00 2001
From: ilya-krivtsov <180809461+ilya-krivtsov@users.noreply.github.com>
Date: Mon, 26 May 2025 09:06:37 +0300
Subject: [PATCH 1/6] Homework 8 - Calc
---
Calc/Calc.Tests/Calc.Tests.csproj | 28 ++++
Calc/Calc.Tests/CalcTests.cs | 96 +++++++++++++
Calc/Calc.Tests/GlobalSuppressions.cs | 11 ++
Calc/Calc.UI/App.axaml | 10 ++
Calc/Calc.UI/App.axaml.cs | 27 ++++
Calc/Calc.UI/Calc.UI.csproj | 21 +++
Calc/Calc.UI/GlobalSuppressions.cs | 16 +++
Calc/Calc.UI/MainWindow.axaml | 47 ++++++
Calc/Calc.UI/MainWindow.axaml.cs | 72 ++++++++++
Calc/Calc.UI/Program.cs | 25 ++++
Calc/Calc.UI/app.manifest | 18 +++
Calc/Calc.sln | 34 +++++
Calc/Calc/ArithmeticOperation.cs | 31 ++++
Calc/Calc/Calc.cs | 198 ++++++++++++++++++++++++++
Calc/Calc/Calc.csproj | 10 ++
15 files changed, 644 insertions(+)
create mode 100644 Calc/Calc.Tests/Calc.Tests.csproj
create mode 100644 Calc/Calc.Tests/CalcTests.cs
create mode 100644 Calc/Calc.Tests/GlobalSuppressions.cs
create mode 100644 Calc/Calc.UI/App.axaml
create mode 100644 Calc/Calc.UI/App.axaml.cs
create mode 100644 Calc/Calc.UI/Calc.UI.csproj
create mode 100644 Calc/Calc.UI/GlobalSuppressions.cs
create mode 100644 Calc/Calc.UI/MainWindow.axaml
create mode 100644 Calc/Calc.UI/MainWindow.axaml.cs
create mode 100644 Calc/Calc.UI/Program.cs
create mode 100644 Calc/Calc.UI/app.manifest
create mode 100644 Calc/Calc.sln
create mode 100644 Calc/Calc/ArithmeticOperation.cs
create mode 100644 Calc/Calc/Calc.cs
create mode 100644 Calc/Calc/Calc.csproj
diff --git a/Calc/Calc.Tests/Calc.Tests.csproj b/Calc/Calc.Tests/Calc.Tests.csproj
new file mode 100644
index 0000000..28890f6
--- /dev/null
+++ b/Calc/Calc.Tests/Calc.Tests.csproj
@@ -0,0 +1,28 @@
+
+
+
+ net9.0
+ latest
+ enable
+ enable
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Calc/Calc.Tests/CalcTests.cs b/Calc/Calc.Tests/CalcTests.cs
new file mode 100644
index 0000000..57c8136
--- /dev/null
+++ b/Calc/Calc.Tests/CalcTests.cs
@@ -0,0 +1,96 @@
+//
+// Copyright (c) Ilya Krivtsov. All rights reserved.
+//
+
+namespace Calc.Tests;
+
+public class CalcTests
+{
+ private Calc calc;
+
+ [SetUp]
+ public void Setup()
+ {
+ calc = new();
+ }
+
+ [Test]
+ public void Test_2_Plus_3_Equals_5()
+ {
+ calc.EnterDigit(2);
+ Assert.That(calc.DisplayResult, Is.EqualTo("2"));
+
+ calc.OperatorPressed(ArithmeticOperation.Addition);
+ Assert.That(calc.DisplayResult, Is.EqualTo("2"));
+
+ calc.EnterDigit(3);
+ Assert.That(calc.DisplayResult, Is.EqualTo("3"));
+
+ calc.EqualsPressed();
+ Assert.That(calc.DisplayResult, Is.EqualTo("5"));
+ }
+
+ [Test]
+ public void Test_2_Plus_3_Minus_10_Equals_Minus_5()
+ {
+ calc.EnterDigit(2);
+ Assert.That(calc.DisplayResult, Is.EqualTo("2"));
+
+ calc.OperatorPressed(ArithmeticOperation.Addition);
+ Assert.That(calc.DisplayResult, Is.EqualTo("2"));
+
+ calc.EnterDigit(3);
+ Assert.That(calc.DisplayResult, Is.EqualTo("3"));
+
+ calc.OperatorPressed(ArithmeticOperation.Subtraction);
+ Assert.That(calc.DisplayResult, Is.EqualTo("5"));
+
+ calc.EnterDigit(1);
+ Assert.That(calc.DisplayResult, Is.EqualTo("1"));
+ calc.EnterDigit(0);
+ Assert.That(calc.DisplayResult, Is.EqualTo("10"));
+
+ calc.EqualsPressed();
+ Assert.That(calc.DisplayResult, Is.EqualTo("-5"));
+ }
+
+ [Test]
+ public void Test_0_Point_1_Plus_0_Point_2_Equals_0_Point_3()
+ {
+ calc.EnterDigit(0);
+ Assert.That(calc.DisplayResult, Is.EqualTo("0"));
+ calc.EnterDecimalPoint();
+ Assert.That(calc.DisplayResult, Is.EqualTo("0."));
+ calc.EnterDigit(1);
+ Assert.That(calc.DisplayResult, Is.EqualTo("0.1"));
+
+ calc.OperatorPressed(ArithmeticOperation.Addition);
+ Assert.That(calc.DisplayResult, Is.EqualTo("0.1"));
+
+ calc.EnterDigit(0);
+ Assert.That(calc.DisplayResult, Is.EqualTo("0"));
+ calc.EnterDecimalPoint();
+ Assert.That(calc.DisplayResult, Is.EqualTo("0."));
+ calc.EnterDigit(2);
+ Assert.That(calc.DisplayResult, Is.EqualTo("0.2"));
+
+ calc.EqualsPressed();
+ Assert.That(calc.DisplayResult, Is.EqualTo("0.3"));
+ }
+
+ [Test]
+ public void Test_0_Divide_0_Gives_Error()
+ {
+ calc.EnterDigit(0);
+ Assert.That(calc.DisplayResult, Is.EqualTo("0"));
+
+ calc.OperatorPressed(ArithmeticOperation.Division);
+ Assert.That(calc.DisplayResult, Is.EqualTo("0"));
+
+ calc.EnterDigit(0);
+ Assert.That(calc.DisplayResult, Is.EqualTo("0"));
+
+ calc.EqualsPressed();
+ Assert.That(calc.DisplayResult, Is.EqualTo("Error"));
+ }
+}
diff --git a/Calc/Calc.Tests/GlobalSuppressions.cs b/Calc/Calc.Tests/GlobalSuppressions.cs
new file mode 100644
index 0000000..909e036
--- /dev/null
+++ b/Calc/Calc.Tests/GlobalSuppressions.cs
@@ -0,0 +1,11 @@
+//
+// Copyright (c) Ilya Krivtsov. All rights reserved.
+//
+
+// This file is used by Code Analysis to maintain SuppressMessage
+// attributes that are applied to this project.
+// Project-level suppressions either have no target or are given
+// a specific target and scoped to a namespace, type, member, etc.
+using System.Diagnostics.CodeAnalysis;
+
+[assembly: SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1600:Elements should be documented", Justification = "This is tests project")]
diff --git a/Calc/Calc.UI/App.axaml b/Calc/Calc.UI/App.axaml
new file mode 100644
index 0000000..9775fbe
--- /dev/null
+++ b/Calc/Calc.UI/App.axaml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/Calc/Calc.UI/App.axaml.cs b/Calc/Calc.UI/App.axaml.cs
new file mode 100644
index 0000000..61be4d6
--- /dev/null
+++ b/Calc/Calc.UI/App.axaml.cs
@@ -0,0 +1,27 @@
+//
+// Copyright (c) Ilya Krivtsov. All rights reserved.
+//
+
+namespace Calc.UI;
+
+using Avalonia;
+using Avalonia.Controls.ApplicationLifetimes;
+using Avalonia.Markup.Xaml;
+
+public partial class App : Application
+{
+ public override void Initialize()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+
+ public override void OnFrameworkInitializationCompleted()
+ {
+ if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
+ {
+ desktop.MainWindow = new MainWindow();
+ }
+
+ base.OnFrameworkInitializationCompleted();
+ }
+}
diff --git a/Calc/Calc.UI/Calc.UI.csproj b/Calc/Calc.UI/Calc.UI.csproj
new file mode 100644
index 0000000..a0be288
--- /dev/null
+++ b/Calc/Calc.UI/Calc.UI.csproj
@@ -0,0 +1,21 @@
+
+
+ WinExe
+ net9.0
+ enable
+ true
+ app.manifest
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Calc/Calc.UI/GlobalSuppressions.cs b/Calc/Calc.UI/GlobalSuppressions.cs
new file mode 100644
index 0000000..a500690
--- /dev/null
+++ b/Calc/Calc.UI/GlobalSuppressions.cs
@@ -0,0 +1,16 @@
+//
+// Copyright (c) Ilya Krivtsov. All rights reserved.
+//
+
+// This file is used by Code Analysis to maintain SuppressMessage
+// attributes that are applied to this project.
+// Project-level suppressions either have no target or are given
+// a specific target and scoped to a namespace, type, member, etc.
+using System.Diagnostics.CodeAnalysis;
+
+[assembly: SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1600:Elements should be documented", Justification = "Entry point", Scope = "type", Target = "~T:Calc.UI.Program")]
+
+[assembly: SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1601:Partial elements should be documented", Justification = "Application class", Scope = "type", Target = "~T:Calc.UI.App")]
+[assembly: SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1601:Partial elements should be documented", Justification = "Window class", Scope = "type", Target = "~T:Calc.UI.MainWindow")]
+[assembly: SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1600:Elements should be documented", Justification = "Application class", Scope = "type", Target = "~T:Calc.UI.App")]
+[assembly: SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1600:Elements should be documented", Justification = "Window class", Scope = "type", Target = "~T:Calc.UI.MainWindow")]
diff --git a/Calc/Calc.UI/MainWindow.axaml b/Calc/Calc.UI/MainWindow.axaml
new file mode 100644
index 0000000..64c2bcf
--- /dev/null
+++ b/Calc/Calc.UI/MainWindow.axaml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Calc/Calc.UI/MainWindow.axaml.cs b/Calc/Calc.UI/MainWindow.axaml.cs
new file mode 100644
index 0000000..c006181
--- /dev/null
+++ b/Calc/Calc.UI/MainWindow.axaml.cs
@@ -0,0 +1,72 @@
+//
+// Copyright (c) Ilya Krivtsov. All rights reserved.
+//
+
+namespace Calc.UI;
+
+using System;
+using Avalonia.Controls;
+using Avalonia.Data;
+using Avalonia.Interactivity;
+
+public partial class MainWindow : Window
+{
+ private readonly Calc calc;
+
+ public MainWindow()
+ {
+ InitializeComponent();
+
+ calc = new();
+
+ for (int i = 0; i < 3; i++)
+ {
+ for (int j = 0; j < 3; j++)
+ {
+ int digit = ((2 - i) * 3) + j + 1;
+
+ var button = new Button
+ {
+ HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Stretch,
+ VerticalAlignment = Avalonia.Layout.VerticalAlignment.Stretch,
+ HorizontalContentAlignment = Avalonia.Layout.HorizontalAlignment.Center,
+ VerticalContentAlignment = Avalonia.Layout.VerticalAlignment.Center,
+ FontSize = 48,
+ Margin = new(4),
+ Content = digit,
+ };
+
+ button.Click += (_, _) => calc.EnterDigit(digit);
+
+ Grid.SetRow(button, i + 2);
+ Grid.SetColumn(button, j);
+
+ buttonsGrid.Children.Add(button);
+ }
+ }
+
+ var binding = new Binding
+ {
+ Source = calc,
+ Path = nameof(calc.DisplayResult),
+ };
+
+ resultText.Bind(ContentProperty, binding);
+ }
+
+ private void OnClear(object sender, RoutedEventArgs e) => calc.Clear();
+
+ private void OnEquals(object sender, RoutedEventArgs e) => calc.EqualsPressed();
+
+ private void OnZero(object sender, RoutedEventArgs e) => calc.EnterDigit(0);
+
+ private void OnDecimal(object sender, RoutedEventArgs e) => calc.EnterDecimalPoint();
+
+ private void OnOperator(object sender, RoutedEventArgs e)
+ {
+ if (sender is Button b && b.Tag is string tag && Enum.TryParse(tag, out var op))
+ {
+ calc.OperatorPressed(op);
+ }
+ }
+}
diff --git a/Calc/Calc.UI/Program.cs b/Calc/Calc.UI/Program.cs
new file mode 100644
index 0000000..2875348
--- /dev/null
+++ b/Calc/Calc.UI/Program.cs
@@ -0,0 +1,25 @@
+//
+// Copyright (c) Ilya Krivtsov. All rights reserved.
+//
+
+namespace Calc.UI;
+
+using System;
+using Avalonia;
+
+public class Program
+{
+ // Initialization code. Don't use any Avalonia, third-party APIs or any
+ // SynchronizationContext-reliant code before AppMain is called: things aren't initialized
+ // yet and stuff might break.
+ [STAThread]
+ public static void Main(string[] args) => BuildAvaloniaApp()
+ .StartWithClassicDesktopLifetime(args);
+
+ // Avalonia configuration, don't remove; also used by visual designer.
+ public static AppBuilder BuildAvaloniaApp()
+ => AppBuilder.Configure()
+ .UsePlatformDetect()
+ .WithInterFont()
+ .LogToTrace();
+}
diff --git a/Calc/Calc.UI/app.manifest b/Calc/Calc.UI/app.manifest
new file mode 100644
index 0000000..aeb1614
--- /dev/null
+++ b/Calc/Calc.UI/app.manifest
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Calc/Calc.sln b/Calc/Calc.sln
new file mode 100644
index 0000000..37c0739
--- /dev/null
+++ b/Calc/Calc.sln
@@ -0,0 +1,34 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.0.31903.59
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Calc", "Calc\Calc.csproj", "{7CDA538D-C236-4FF3-8374-B908FE2ED392}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Calc.Tests", "Calc.Tests\Calc.Tests.csproj", "{88C5C219-4CFC-43B5-8F35-7843550A2AED}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Calc.UI", "Calc.UI\Calc.UI.csproj", "{80216A13-DE7B-49F6-8668-D560EF4D3FA5}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {7CDA538D-C236-4FF3-8374-B908FE2ED392}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7CDA538D-C236-4FF3-8374-B908FE2ED392}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7CDA538D-C236-4FF3-8374-B908FE2ED392}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7CDA538D-C236-4FF3-8374-B908FE2ED392}.Release|Any CPU.Build.0 = Release|Any CPU
+ {88C5C219-4CFC-43B5-8F35-7843550A2AED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {88C5C219-4CFC-43B5-8F35-7843550A2AED}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {88C5C219-4CFC-43B5-8F35-7843550A2AED}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {88C5C219-4CFC-43B5-8F35-7843550A2AED}.Release|Any CPU.Build.0 = Release|Any CPU
+ {80216A13-DE7B-49F6-8668-D560EF4D3FA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {80216A13-DE7B-49F6-8668-D560EF4D3FA5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {80216A13-DE7B-49F6-8668-D560EF4D3FA5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {80216A13-DE7B-49F6-8668-D560EF4D3FA5}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+EndGlobal
diff --git a/Calc/Calc/ArithmeticOperation.cs b/Calc/Calc/ArithmeticOperation.cs
new file mode 100644
index 0000000..eb956f6
--- /dev/null
+++ b/Calc/Calc/ArithmeticOperation.cs
@@ -0,0 +1,31 @@
+//
+// Copyright (c) Ilya Krivtsov. All rights reserved.
+//
+
+namespace Calc;
+
+///
+/// Arithmetic operation that can be performed in .
+///
+public enum ArithmeticOperation
+{
+ ///
+ /// Addition operation.
+ ///
+ Addition,
+
+ ///
+ /// Subtraction operation.
+ ///
+ Subtraction,
+
+ ///
+ /// Multiplication operation.
+ ///
+ Multiplication,
+
+ ///
+ /// Division operation.
+ ///
+ Division,
+}
diff --git a/Calc/Calc/Calc.cs b/Calc/Calc/Calc.cs
new file mode 100644
index 0000000..3642d76
--- /dev/null
+++ b/Calc/Calc/Calc.cs
@@ -0,0 +1,198 @@
+//
+// Copyright (c) Ilya Krivtsov. All rights reserved.
+//
+
+namespace Calc;
+
+using System.ComponentModel;
+using System.Globalization;
+
+///
+/// Simple calc that can be used as backend for GUI calc.
+///
+public class Calc : INotifyPropertyChanged
+{
+ private decimal leftOperand = 0;
+ private decimal rightOperand = 0;
+ private ArithmeticOperation operation;
+ private bool decimalPointPressed = false;
+ private decimal decimalMultiplier = 1;
+ private State state = State.EnteringFirstOperand;
+ private string displayResult = "0";
+
+ ///
+ public event PropertyChangedEventHandler? PropertyChanged;
+
+ private enum State
+ {
+ EnteringFirstOperand,
+ EnteringNewOperand,
+ PressedFirstOperator,
+ PressedOperator,
+ PressedEquals,
+ Error,
+ }
+
+ ///
+ /// Gets the result of calculations that can be displayed.
+ ///
+ public string DisplayResult
+ {
+ get => displayResult;
+ private set
+ {
+ displayResult = value;
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(DisplayResult)));
+ }
+ }
+
+ ///
+ /// Enter a digit.
+ ///
+ /// Digit to enter.
+ public void EnterDigit(int digit)
+ {
+ ArgumentOutOfRangeException.ThrowIfNegative(digit, nameof(digit));
+ ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(digit, 10, nameof(digit));
+
+ if (state == State.Error)
+ {
+ return;
+ }
+
+ if (state == State.PressedEquals)
+ {
+ leftOperand = 0;
+ }
+
+ state = state switch
+ {
+ State.EnteringFirstOperand => State.EnteringFirstOperand,
+ State.EnteringNewOperand => State.EnteringNewOperand,
+ State.PressedFirstOperator => State.EnteringNewOperand,
+ State.PressedOperator => State.EnteringNewOperand,
+ State.PressedEquals => State.EnteringFirstOperand,
+ _ => State.EnteringNewOperand,
+ };
+
+ ref var operand = ref state == State.EnteringFirstOperand ? ref leftOperand : ref rightOperand;
+
+ if (!decimalPointPressed)
+ {
+ operand = (operand * 10) + digit;
+ }
+ else
+ {
+ decimalMultiplier /= 10;
+ operand += decimalMultiplier * digit;
+ }
+
+ DisplayResult = operand.ToString(CultureInfo.InvariantCulture);
+ }
+
+ ///
+ /// Add decimal point to the number being entered.
+ ///
+ public void EnterDecimalPoint()
+ {
+ if (state == State.Error)
+ {
+ return;
+ }
+
+ if (state is State.EnteringFirstOperand or State.EnteringNewOperand)
+ {
+ decimalPointPressed = true;
+ DisplayResult += '.';
+ }
+ }
+
+ ///
+ /// Perform an arithmetic operation.
+ ///
+ /// Operation to perform.
+ public void OperatorPressed(ArithmeticOperation operation)
+ {
+ if (state == State.Error)
+ {
+ return;
+ }
+
+ if (decimalPointPressed)
+ {
+ decimalMultiplier = 1;
+ decimalPointPressed = false;
+ }
+
+ if (state == State.EnteringNewOperand)
+ {
+ PerformOperation();
+ }
+
+ state = state switch
+ {
+ State.EnteringFirstOperand => State.PressedFirstOperator,
+ State.EnteringNewOperand => State.PressedOperator,
+ State.PressedFirstOperator => State.PressedFirstOperator,
+ State.PressedOperator => State.PressedOperator,
+ State.PressedEquals => State.PressedOperator,
+ _ => State.PressedOperator,
+ };
+
+ this.operation = operation;
+ }
+
+ ///
+ /// Sets to the latest calculated value.
+ ///
+ public void EqualsPressed()
+ {
+ if (state == State.Error)
+ {
+ return;
+ }
+
+ if (state is State.EnteringNewOperand or State.PressedOperator)
+ {
+ PerformOperation();
+ if (state != State.Error)
+ {
+ state = State.PressedEquals;
+ }
+ }
+ }
+
+ ///
+ /// Clears all calculations.
+ ///
+ public void Clear()
+ {
+ leftOperand = 0;
+ rightOperand = 0;
+ decimalMultiplier = 1;
+ decimalPointPressed = false;
+ state = State.EnteringFirstOperand;
+ DisplayResult = "0";
+ }
+
+ private void PerformOperation()
+ {
+ if (operation == ArithmeticOperation.Division && rightOperand == 0)
+ {
+ DisplayResult = "Error";
+ state = State.Error;
+ return;
+ }
+
+ leftOperand = operation switch
+ {
+ ArithmeticOperation.Addition => leftOperand + rightOperand,
+ ArithmeticOperation.Subtraction => leftOperand - rightOperand,
+ ArithmeticOperation.Multiplication => leftOperand * rightOperand,
+ ArithmeticOperation.Division => leftOperand / rightOperand,
+ _ => leftOperand,
+ };
+ rightOperand = 0;
+ DisplayResult = leftOperand.ToString(CultureInfo.InvariantCulture);
+ }
+}
diff --git a/Calc/Calc/Calc.csproj b/Calc/Calc/Calc.csproj
new file mode 100644
index 0000000..bf05b58
--- /dev/null
+++ b/Calc/Calc/Calc.csproj
@@ -0,0 +1,10 @@
+
+
+
+ Library
+ net9.0
+ enable
+ enable
+
+
+
From 7a1a9b27e9216f78edfddeff70654164c4357337 Mon Sep 17 00:00:00 2001
From: ilya-krivtsov <180809461+ilya-krivtsov@users.noreply.github.com>
Date: Mon, 26 May 2025 09:08:39 +0300
Subject: [PATCH 2/6] Typo fix (hw8 - calc)
---
Calc/Calc.UI/MainWindow.axaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Calc/Calc.UI/MainWindow.axaml b/Calc/Calc.UI/MainWindow.axaml
index 64c2bcf..0adb7b0 100644
--- a/Calc/Calc.UI/MainWindow.axaml
+++ b/Calc/Calc.UI/MainWindow.axaml
@@ -22,7 +22,7 @@
-