Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
126 changes: 126 additions & 0 deletions Advanced.Tests/Tasks/LanguagePatternsTasksTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
using Advanced.Tasks.LanguagePatterns;
using Xunit;

namespace Advanced.Tests.Tasks;

public class LanguagePatternsTasksTests
{
private readonly LanguagePatternsTasks _sut = new();

[Fact]
public void GetObjectTypeNull_ReturnsNull()
{
var result = _sut.GetObjectType(null);
Assert.Equal("Null", result);
}

[Fact]
public void GetObjectTypeString_ReturnsString()
{
var result = _sut.GetObjectType("hello");
Assert.Equal("String", result);
}

[Fact]
public void GetObjectTypeInteger_ReturnsInteger()
{
var result = _sut.GetObjectType(42);
Assert.Equal("Integer", result);
}

[Fact]
public void GetObjectTypeBoolean_ReturnsBoolean()
{
var result = _sut.GetObjectType(true);
Assert.Equal("Boolean", result);
}

[Fact]
public void GetObjectTypeDouble_ReturnsDouble()
{
var result = _sut.GetObjectType(3.14);
Assert.Equal("Double", result);
}

[Fact]
public void GetObjectTypeFloat_ReturnsFloat()
{
var result = _sut.GetObjectType(2.5f);
Assert.Equal("Float", result);
}

[Fact]
public void GetObjectTypeUnknownType_ReturnsUnknown()
{
var result = _sut.GetObjectType(new object());
Assert.Equal("Unknown", result);
}

[Fact]
public void CalculateShippingCostStandard_ReturnsFixedCost()
{
var result = _sut.CalculateShippingCost("standard", 10m);
Assert.Equal(10m, result);
}

[Fact]
public void CalculateShippingCostExpress_ReturnsWeightBasedCost()
{
var result = _sut.CalculateShippingCost("express", 4m);
Assert.Equal(20.0m + 4m * 0.5m, result);
}

[Fact]
public void CalculateShippingCostUnknownType_ReturnsZero()
{
var result = _sut.CalculateShippingCost("rocket", 1m);
Assert.Equal(0.0m, result);
}

[Fact]
public void CalculateShippingCostNullType_ReturnsZero()
{
var result = _sut.CalculateShippingCost(null, 1m);
Assert.Equal(0.0m, result);
}


[Fact]
public void GetProductStatusNullProduct_ReturnsInvalidMessage()
{
var result = _sut.GetProductStatus(null);
Assert.Equal("Недопустимый товар", result);
}

[Fact]
public void GetProductStatusPriceOver1000_ReturnsExpensive()
{
var product = new Product { Name = "TV", Price = 1500m, Stock = 5 };
var result = _sut.GetProductStatus(product);
Assert.Equal("Дорогой товар", result);
}

[Fact]
public void GetProductStatusZeroStock_ReturnsOutOfStock()
{
var product = new Product { Name = "Phone", Price = 800m, Stock = 0 };
var result = _sut.GetProductStatus(product);
Assert.Equal("Нет в наличии", result);
}

[Fact]
public void GetProductStatusNonPositivePrice_ReturnsInvalidPrice()
{
var product = new Product { Name = "Gift", Price = -10m, Stock = 10 };
var result = _sut.GetProductStatus(product);
Assert.Equal("Некорректная цена", result);
}

[Fact]
public void GetProductStatusValidProduct_ReturnsAvailable()
{
var product = new Product { Name = "Book", Price = 200m, Stock = 3 };
var result = _sut.GetProductStatus(product);
Assert.Equal("В наличии", result);
}
}
48 changes: 38 additions & 10 deletions Advanced/Tasks/AsyncTasks.cs
Original file line number Diff line number Diff line change
@@ -1,47 +1,75 @@
namespace Advanced.Tasks;

using System.Threading;

public class AsyncTasks
{
/// <summary>
/// Задание 2.1: Напишите асинхронный метод, который имитирует загрузку данных.
/// Используйте Task.Delay для имитации задержки.
/// </summary>
public Task<string> LoadDataAsync()
public async Task<string> LoadDataAsync()
{
throw new NotImplementedException();
await Task.Delay(1000);

return "Load data async...";
}

/// <summary>
/// Задание 2.2: Напишите асинхронный метод, который загружает данные с тайм-аутом.
/// Если операция превышает timeout, бросает TimeoutException.
/// </summary>
public Task<string> LoadDataWithTimeoutAsync(TimeSpan timeout)
public async Task<string> LoadDataWithTimeoutAsync(TimeSpan timeout)
{
throw new NotImplementedException();
using var cts = new CancellationTokenSource(timeout);

try
{
return await LoadDataWithCancellationAsync(cts.Token);
}
catch (OperationCanceledException) when (cts.Token.IsCancellationRequested)
{
throw new TimeoutException("Operation timeout");
}
}

/// <summary>
/// Задание 2.3: Напишите метод, который выполняет несколько асинхронных операций параллельно
/// и возвращает результат, когда все завершатся.
/// </summary>
public Task<string[]> ExecuteParallelAsync(IEnumerable<Task<string>> tasks)
public async Task<string[]> ExecuteParallelAsync(IEnumerable<Task<string>> tasks)
{
throw new NotImplementedException();
var taskList = tasks.ToList();

if (taskList.Count == 0)
{
return Array.Empty<string>();
}

await Task.WhenAll(taskList);

return taskList.Select(t => t.Result).ToArray();
}

/// <summary>
/// Задание 2.4: Напишите метод, который поддерживает отмену операции через CancellationToken.
/// </summary>
public Task<string> LoadDataWithCancellationAsync(CancellationToken cancellationToken)
public async Task<string> LoadDataWithCancellationAsync(CancellationToken cancellationToken)
{
throw new NotImplementedException();
await Task.Delay(1000, cancellationToken);

cancellationToken.ThrowIfCancellationRequested();

return "Data loaded...";
}

/// <summary>
/// Задание 2.5: Напишите метод, который использует ConfigureAwait(false) для избежания deadlock.
/// </summary>
public Task<string> LoadDataConfigureAwaitAsync()
public async Task<string> LoadDataConfigureAwaitAsync()
{
throw new NotImplementedException();
await Task.Delay(1000).ConfigureAwait(false);

return "Data loaded...";
}
}
32 changes: 27 additions & 5 deletions Advanced/Tasks/GenericsTasks.cs
Original file line number Diff line number Diff line change
@@ -1,31 +1,53 @@
namespace Advanced.Tasks;

using System.Collections.Generic;

public class GenericsTasks
{
/// <summary>
/// Задание 1.1: Напишите generic метод, который возвращает первый элемент коллекции.
/// Если коллекция пустая, возвращает default значение типа.
/// В каждом задании используйте async/await.
/// </summary>
public T GetFirstElement<T>(IEnumerable<T> collection)
public T? GetFirstElement<T>(IEnumerable<T>? collection)
{
throw new NotImplementedException();
if (collection == null)
{
return default(T);
}

foreach (var item in collection)
{
return item;
}

return default(T);
}

/// <summary>
/// Задание 1.2: Напишите generic метод, который фильтрует коллекцию по предикату.
/// </summary>
public IEnumerable<T> Filter<T>(IEnumerable<T> collection, Func<T, bool> predicate)
public IEnumerable<T> Filter<T>(IEnumerable<T>? collection, Func<T, bool>? predicate)
{
throw new NotImplementedException();
if (collection == null)
{
return Enumerable.Empty<T>();
}

if (predicate == null)
{
return collection;
}

return collection.Where(predicate);
}

/// <summary>
/// Задание 1.3: Напишите generic метод для обмена значений двух переменных.
/// </summary>
public void Swap<T>(ref T a, ref T b)
{
throw new NotImplementedException();
(a, b) = (b, a);
}

/// <summary>
Expand Down
10 changes: 10 additions & 0 deletions Advanced/Tasks/LanguagePatterns/DemonstrateDeconstruction.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace Advanced.Tasks.LanguagePatterns;

public class DemonstrateDeconstruction
{
public void Example()
{
var name = new FullName("Евгений", "Березин");
var (first, last) = name;
}
}
3 changes: 3 additions & 0 deletions Advanced/Tasks/LanguagePatterns/FullName.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
namespace Advanced.Tasks.LanguagePatterns;

public record FullName(string FirstName, string LastName);
6 changes: 6 additions & 0 deletions Advanced/Tasks/LanguagePatterns/IComparable.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace Advanced.Tasks.LanguagePatterns;

public interface IComparable<T>
{
int CompareTo(T compare);
}
39 changes: 27 additions & 12 deletions Advanced/Tasks/LanguagePatterns/LanguagePatternsTasks.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,39 +8,54 @@ public class LanguagePatternsTasks
/// <summary>
/// Задание 4.1: Создайте record Person с свойствами Name и Age.
/// </summary>


/// <summary>
/// Задание 4.2: Создайте класс Product с init-only свойствами.
/// </summary>


/// <summary>
/// Задание 4.3: Используйте pattern matching для определения типа объекта.
/// </summary>
public string GetObjectType(object obj)
public string GetObjectType(object? obj)
{
throw new NotImplementedException();
return obj switch
{
null => "Null",
string => "String",
int => "Integer",
bool => "Boolean",
double => "Double",
float => "Float",
_ => "Unknown"
};
}

/// <summary>
/// Задание 4.4: Используйте switch expression для вычисления стоимости доставки.
/// </summary>
public decimal CalculateShippingCost(string shippingType, decimal weight)
public decimal CalculateShippingCost(string? shippingType, decimal weight)
{
throw new NotImplementedException();
return shippingType?.ToLowerInvariant() switch
{
"standard" => 10m,
"express" => 20.0m + weight * 0.5m,
_ => 0.0m
};
}

/// <summary>
/// Задание 4.5: Создайте record и напишите код (в отдельном классе DemonstrateDeconstruction) использования деконструкции.
/// </summary>


/// <summary>
/// Задание 4.6: Используйте property patterns класса Product для проверки условий.
/// </summary>
public string GetProductStatus(Product product)
public string GetProductStatus(Product? product)
{
throw new NotImplementedException();
return product switch
{
null => "Недопустимый товар",
{ Price: > 1000 } => "Дорогой товар",
{ Stock: 0 } => "Нет в наличии",
{ Price: <= 0 } => "Некорректная цена",
_ => "В наличии"
};
}
}
6 changes: 6 additions & 0 deletions Advanced/Tasks/LanguagePatterns/Person.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace Advanced.Tasks.LanguagePatterns;

/// <summary>
/// Задание 4.1: record Person с Name и Age.
/// </summary>
public record Person(string Name, int Age);
11 changes: 11 additions & 0 deletions Advanced/Tasks/LanguagePatterns/Product.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace Advanced.Tasks.LanguagePatterns;

/// <summary>
/// Задание 4.2: Класс Product с init-only свойствами.
/// </summary>
public class Product
{
public string? Name { get; init; }
public decimal Price { get; init; }
public int Stock { get; init; }
}
Loading