- add: Unit tests

This commit is contained in:
2025-07-03 12:17:15 +03:00
parent 517fadaab8
commit ae17ff2d89
15 changed files with 467 additions and 12 deletions

View File

@@ -40,6 +40,7 @@ config-export-logs = Export logs
config-open-data = Open data path
config-reset = Reset to default
config-save = Save changes
config-remove-content-all = Remove all content
filter-roleplay = Roleplay
filter-language = Language

View File

@@ -40,6 +40,7 @@ config-export-logs = Экспортировать логи
config-open-data = Открыть путь данных
config-reset = Сбросить к значениям по умолчанию
config-save = Сохранить изменения
config-remove-content-all = Удалить весь контент
filter-roleplay = Ролевая игра
filter-language = Язык

View File

@@ -32,16 +32,16 @@ public partial class ConfigurationViewModel : ViewModelBase
[GenerateProperty] private FileService FileService { get; set; } = default!;
[GenerateProperty] private ContentService ContentService { get; set; } = default!;
[GenerateProperty] private CancellationService CancellationService { get; set; } = default!;
[GenerateProperty] private ViewHelperService ViewHelperService { get; set; } = default!;
public List<(object, Type)> ConVarList = new();
private readonly List<(object, Type)> _conVarList = new();
public void AddCvarConf<T>(ConVar<T> cvar)
{
ConfigurationVerbose.Add(
ConfigControlHelper.GetConfigControl(cvar.Name, ConfigurationService.GetConfigValue(cvar)!));
ConVarList.Add((cvar, cvar.Type));
_conVarList.Add((cvar, cvar.Type));
}
public void InvokeUpdateConfiguration()
@@ -52,7 +52,7 @@ public partial class ConfigurationViewModel : ViewModelBase
if(!conVarControl.Dirty)
continue;
var conVar = ConVarList[i];
var conVar = _conVarList[i];
var methodInfo = ConfigurationService.GetType().GetMethod("SetConfigValue")!.MakeGenericMethod(conVar.Item2);
methodInfo.Invoke(ConfigurationService, [conVar.Item1, conVarControl.GetValue()]);
}
@@ -60,13 +60,13 @@ public partial class ConfigurationViewModel : ViewModelBase
public void ResetConfig()
{
foreach (var conVar in ConVarList)
foreach (var conVar in _conVarList)
{
var methodInfo = ConfigurationService.GetType().GetMethod("SetConfigValue")!.MakeGenericMethod(conVar.Item2);
methodInfo.Invoke(ConfigurationService, [conVar.Item1, null]);
}
ConVarList.Clear();
_conVarList.Clear();
ConfigurationVerbose.Clear();
InitConfiguration();

View File

@@ -112,7 +112,7 @@ public class ConfigurationService
return false;
}
public void SetConfigValue<T>(ConVar<T> conVar, T value)
public void SetConfigValue<T>(ConVar<T> conVar, T? value)
{
if (value == null)
{

View File

@@ -1,5 +1,4 @@
using System.IO.Compression;
using System.Runtime.InteropServices;
using Nebula.Shared.FileApis;
using Nebula.Shared.FileApis.Interfaces;
using Nebula.Shared.Models;
@@ -11,7 +10,7 @@ namespace Nebula.Shared.Services;
[ServiceRegister]
public class FileService
{
public static readonly string RootPath = Path.Join(Environment.GetFolderPath(
public static string RootPath = Path.Join(Environment.GetFolderPath(
Environment.SpecialFolder.ApplicationData), "Datum");
private readonly ILogger _logger;

View File

@@ -11,7 +11,7 @@ namespace Nebula.Shared.Services;
[ServiceRegister]
public class RestService
{
private readonly HttpClient _client = new();
private readonly HttpClient _client;
private readonly ILogger _logger;
private readonly JsonSerializerOptions _serializerOptions = new()
@@ -20,8 +20,9 @@ public class RestService
WriteIndented = true
};
public RestService(DebugService debug)
public RestService(DebugService debug, HttpClient? client = null)
{
_client = client ?? new HttpClient();
_logger = debug.GetLogger(this);
}

View File

@@ -0,0 +1,31 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.0"/>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.6" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0"/>
<PackageReference Include="Moq" Version="4.20.72" />
<PackageReference Include="NUnit" Version="3.14.0"/>
<PackageReference Include="NUnit.Analyzers" Version="3.9.0"/>
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0"/>
</ItemGroup>
<ItemGroup>
<Using Include="NUnit.Framework"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Nebula.Packager\Nebula.Packager.csproj" />
<ProjectReference Include="..\Nebula.Shared\Nebula.Shared.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,16 @@
using Microsoft.Extensions.DependencyInjection;
namespace Nebula.UnitTest.NebulaSharedTests;
public abstract class BaseSharedTest
{
protected SharedUnit _sharedUnit = default!;
public abstract void BeforeServiceBuild(IServiceCollection services);
public virtual void Setup()
{
_sharedUnit = TestServiceHelper.GetSharedUnit(BeforeServiceBuild);
}
}

View File

@@ -0,0 +1,90 @@
using Microsoft.Extensions.DependencyInjection;
using Nebula.Shared.Services;
namespace Nebula.UnitTest.NebulaSharedTests;
[TestFixture]
[TestOf(typeof(ConfigurationService))]
public sealed class ConfigurationServiceTests: BaseSharedTest
{
private ConfigurationService _conVarService;
public override void BeforeServiceBuild(IServiceCollection services)
{
TestServiceHelper.InitFileServiceTest();
}
[SetUp]
public override void Setup()
{
base.Setup();
_conVarService = _sharedUnit.GetService<ConfigurationService>();
}
[Test]
public void GetDefaultConVarTest()
{
var value = _conVarService.GetConfigValue(TestConVar.SimpleConvar);
Assert.NotNull(value);
Assert.That(value, Is.EqualTo(TestConVar.SimpleConvar.DefaultValue));
}
[Test]
public void GetNullConVarTest()
{
var value = _conVarService.GetConfigValue(TestConVar.NullConvar);
Assert.Null(value);
}
[Test]
public void WriteConVarTest()
{
var value = _conVarService.GetConfigValue(TestConVar.SimpleConvar);
Assert.That(value, Is.EqualTo(TestConVar.SimpleConvar.DefaultValue));
_conVarService.SetConfigValue(TestConVar.SimpleConvar, "notdefault");
value = _conVarService.GetConfigValue(TestConVar.SimpleConvar);
Assert.That(value, Is.Not.EqualTo(TestConVar.SimpleConvar.DefaultValue));
Assert.That(value, Is.EqualTo("notdefault"));
_conVarService.SetConfigValue(TestConVar.SimpleConvar, null);
value = _conVarService.GetConfigValue(TestConVar.SimpleConvar);
Assert.That(value, Is.EqualTo(TestConVar.SimpleConvar.DefaultValue));
}
[Test]
public void WriteComplexConvarTest()
{
var testVar = new TestVarObject("Alex", 2);
_conVarService.SetConfigValue(TestConVar.TestVarObject, testVar);
var value = _conVarService.GetConfigValue(TestConVar.TestVarObject);
Assert.That(value, Is.EqualTo(testVar));
_conVarService.SetConfigValue(TestConVar.TestVarObject, default);
}
[Test]
public void WriteArrayConvarTest()
{
var testVarArr = new[] { new TestVarObject("Alex", 2), new TestVarObject("Vitya", 3) };
_conVarService.SetConfigValue(TestConVar.TestVarArray, testVarArr);
var value = _conVarService.GetConfigValue(TestConVar.TestVarArray);
Assert.NotNull(value);
Assert.That(testVarArr.SequenceEqual(value));
_conVarService.SetConfigValue(TestConVar.TestVarArray, null);
}
}
public static class TestConVar
{
public static ConVar<string> SimpleConvar = ConVarBuilder.Build("test.convarsimple", "test");
public static ConVar<string?> NullConvar = ConVarBuilder.Build<string?>("test.convarsimplenull");
public static ConVar<TestVarObject> TestVarObject = ConVarBuilder.Build<TestVarObject>("test.convarobject", default);
public static ConVar<TestVarObject[]> TestVarArray = ConVarBuilder.Build<TestVarObject[]>("test.convarobject.array");
}
public record struct TestVarObject(string Name, int Count);

View File

@@ -0,0 +1,123 @@
using System.IO.Compression;
using Microsoft.Extensions.DependencyInjection;
using Moq;
using Nebula.Shared.Models;
using Nebula.Shared.Services;
using Robust.LoaderApi;
namespace Nebula.UnitTest.NebulaSharedTests;
[TestFixture]
[TestOf(typeof(FileService))]
public class FileServiceTests : BaseSharedTest
{
private FileService _fileService = default!;
public override void BeforeServiceBuild(IServiceCollection services)
{
TestServiceHelper.InitFileServiceTest();
}
[SetUp]
public override void Setup()
{
base.Setup();
_fileService = _sharedUnit.GetService<FileService>();
}
[Test]
public void CreateFileApi_CreatesCorrectPath()
{
var subPath = "test-folder";
var fileApi = _fileService.CreateFileApi(subPath);
using (var stream = new MemoryStream("test"u8.ToArray()))
{
fileApi.Save("test.txt", stream);
}
var expectedPath = Path.Combine(FileService.RootPath, subPath);
Assert.That(Directory.Exists(expectedPath), Is.True, $"Expected path to be created: {expectedPath}");
}
[Test]
public void EnsureTempDir_CreatesDirectoryAndReturnsApi()
{
var api = _fileService.EnsureTempDir(out var path);
Assert.That(Directory.Exists(path), Is.True);
Assert.That(api, Is.Not.Null);
}
[Test]
public void OpenZip_ReturnsZipFileApi_WhenValid()
{
var testZipPath = Path.Combine(FileService.RootPath, "test.zip");
using (var archive = ZipFile.Open(testZipPath, ZipArchiveMode.Create))
{
var entry = archive.CreateEntry("test.txt");
using var streamWriter = new StreamWriter(entry.Open());
streamWriter.Write(testZipPath);
streamWriter.Flush();
}
IDisposable? streamDisposable = null;
var mockFileApi = new Mock<IFileApi>();
mockFileApi
.Setup(x => x.TryOpen(testZipPath, out It.Ref<Stream>.IsAny))
.Returns((string _, out Stream stream) =>
{
stream = File.OpenRead(testZipPath);
streamDisposable = stream;
return true;
});
var zipApi = _fileService.OpenZip(testZipPath, mockFileApi.Object);
Assert.That(zipApi, Is.Not.Null);
Assert.That(zipApi.TryOpen("test.txt", out var textStream), Is.True);
using (var reader = new StreamReader(textStream!))
{
Assert.That(reader.ReadToEnd(), Is.EqualTo(testZipPath));
}
textStream!.Dispose();
streamDisposable?.Dispose();
File.Delete(testZipPath);
}
[Test]
public void RemoveAllFiles_DeletesAllFilesAndDirectories()
{
var testDir = Path.Combine(FileService.RootPath, "cleanup-test");
Directory.CreateDirectory(testDir);
File.WriteAllText(Path.Combine(testDir, "test1.txt"), "data");
Directory.CreateDirectory(Path.Combine(testDir, "subdir"));
var mockHandler = new Mock<ILoadingHandler>();
mockHandler.Setup(x => x.AppendJob(It.IsAny<int>())).Verifiable();
mockHandler.Setup(x => x.AppendResolvedJob(It.IsAny<int>())).Verifiable();
_fileService.RemoveAllFiles("cleanup-test", mockHandler.Object, CancellationToken.None);
Assert.That(Directory.Exists(testDir), Is.True);
Assert.That(Directory.GetFiles(testDir).Length, Is.EqualTo(0));
Assert.That(Directory.GetDirectories(testDir).Length, Is.EqualTo(0));
}
[Test]
public void OpenZip_ThrowsException_WhenFileApiFails()
{
var mockFileApi = new Mock<IFileApi>();
mockFileApi.Setup(x => x.TryOpen(It.IsAny<string>(), out It.Ref<Stream>.IsAny))
.Returns(false);
var result = _fileService.OpenZip("invalid.zip", mockFileApi.Object);
Assert.That(result, Is.Null);
}
}

View File

@@ -0,0 +1,42 @@
using Microsoft.Extensions.DependencyInjection;
using Nebula.Shared.Services;
namespace Nebula.UnitTest.NebulaSharedTests;
[TestFixture]
[TestOf(nameof(PopupMessageService))]
public class PopupMessageServiceTests : BaseSharedTest
{
public override void BeforeServiceBuild(IServiceCollection services)
{
}
[SetUp]
public override void Setup()
{
base.Setup();
var popupService = _sharedUnit.GetService<PopupMessageService>();
popupService.OnCloseRequired = (popup) => ((IDisposable)popup).Dispose();
}
[Test]
public void DisposeTest()
{
var popup = new TestPopup();
var popupService = _sharedUnit.GetService<PopupMessageService>();
popupService.ClosePopup(popup);
Assert.That(popup.Disposed, Is.True);
}
private sealed class TestPopup : IDisposable
{
public bool Disposed { get; private set; }
public void Dispose()
{
Disposed = true;
}
}
}

View File

@@ -0,0 +1,77 @@
using System.Net;
using System.Text;
using System.Text.Json;
using Microsoft.Extensions.DependencyInjection;
using Moq;
using Moq.Protected;
using Nebula.Shared.Services;
namespace Nebula.UnitTest.NebulaSharedTests;
[TestFixture]
[TestOf(typeof(RestService))]
public class RestServiceTests : BaseSharedTest
{
public static readonly TestDto ExpectedObject = new()
{
Id = 1,
Name = "Test",
};
public static string ObjectString => JsonSerializer.Serialize(ExpectedObject, SerializerOptions);
public static readonly JsonSerializerOptions SerializerOptions = new() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
public override void BeforeServiceBuild(IServiceCollection services)
{
var mockHandler = new Mock<HttpMessageHandler>();
mockHandler
.Protected()
.Setup<Task<HttpResponseMessage>>("SendAsync",
ItExpr.IsAny<HttpRequestMessage>(),
ItExpr.IsAny<CancellationToken>())
.ReturnsAsync(new HttpResponseMessage
{
StatusCode = HttpStatusCode.OK,
Content = new StringContent(ObjectString, Encoding.UTF8, "application/json")
});
var client = new HttpClient(mockHandler.Object);
services.AddSingleton(client);
}
[SetUp]
public override void Setup()
{
base.Setup();
}
[Test]
public async Task GetTest()
{
var restService = _sharedUnit.GetService<RestService>();
var result = await restService.GetAsync<TestDto>(new Uri("http://localhost/test"), CancellationToken.None);
Assert.NotNull(result);
Assert.That(result.Id, Is.EqualTo(ExpectedObject.Id));
Assert.That(result.Name, Is.EqualTo(ExpectedObject.Name));
}
[Test]
public async Task PostTest()
{
var restService = _sharedUnit.GetService<RestService>();
var result = await restService.PostAsync<TestDto, TestDto>(ExpectedObject,new Uri("http://localhost/test"), CancellationToken.None);
Assert.NotNull(result);
Assert.That(result.Id, Is.EqualTo(ExpectedObject.Id));
Assert.That(result.Name, Is.EqualTo(ExpectedObject.Name));
}
public class TestDto
{
public int Id { get; set; }
public string Name { get; set; }
}
}

View File

@@ -0,0 +1,46 @@
using Microsoft.Extensions.DependencyInjection;
using Nebula.Shared;
using Nebula.Shared.Services;
namespace Nebula.UnitTest;
public static class TestServiceHelper
{
public static SharedUnit GetSharedUnit(Action<IServiceCollection> beforeServiceBuild)
{
var services = new ServiceCollection();
beforeServiceBuild.Invoke(services);
services.AddServices();
var serviceProvider = services.BuildServiceProvider();
return new SharedUnit(serviceProvider);
}
public static void InitFileServiceTest()
{
var path = Path.Combine(Path.GetTempPath(), "tempThink"+Path.GetRandomFileName());
Directory.CreateDirectory(path);
FileService.RootPath = path;
Console.WriteLine("Change root path for file api: " + FileService.RootPath);
}
}
public sealed class LauncherUnit : SharedUnit
{
public LauncherUnit(IServiceProvider serviceProvider) : base(serviceProvider)
{
}
}
public class SharedUnit
{
public SharedUnit(IServiceProvider serviceProvider)
{
ServiceProvider = serviceProvider;
}
public IServiceProvider ServiceProvider { get; }
public T GetService<T>() where T : notnull => ServiceProvider.GetRequiredService<T>();
}

View File

@@ -14,6 +14,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nebula.UpdateResolver", "Ne
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nebula.Packager", "Nebula.Packager\Nebula.Packager.csproj", "{D444A5F9-4549-467F-9398-97DD6DB1E263}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nebula.UnitTest", "Nebula.UnitTest\Nebula.UnitTest.csproj", "{735691F8-949C-4476-B9E4-5DF6FF8D3D0B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -48,5 +50,9 @@ Global
{D444A5F9-4549-467F-9398-97DD6DB1E263}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D444A5F9-4549-467F-9398-97DD6DB1E263}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D444A5F9-4549-467F-9398-97DD6DB1E263}.Release|Any CPU.Build.0 = Release|Any CPU
{735691F8-949C-4476-B9E4-5DF6FF8D3D0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{735691F8-949C-4476-B9E4-5DF6FF8D3D0B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{735691F8-949C-4476-B9E4-5DF6FF8D3D0B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{735691F8-949C-4476-B9E4-5DF6FF8D3D0B}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal

View File

@@ -12,6 +12,7 @@
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AControl_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FUsers_003FCinka_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F57361bc4e5442f644ff63ec7e745da2eb4bbb6c769d1fb683bab5f6f952b1ab_003FControl_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADecorator_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FUsers_003FCinka_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Feecfe7fcb95caaf3978fdce4ae36e346b34986d1d844b0dce2fcb67e5952c_003FDecorator_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADesign_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FUsers_003FCinka_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F9a2912aa19f1b0ab2229159cec21d718356660fc49cd8e5257a66b584b69b_003FDesign_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADictionary_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FUsers_003FCinka_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fe5d623ea960f2c3c9fda144954d339f8d4cd3dad6dd8bd4ab96093a010ab_003FDictionary_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADispatcher_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FUsers_003FCinka_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fe6d04341b5ca8c55e2be617e1b6fc5a12cc8647f7272d94f614ae7fb1c0e8d_003FDispatcher_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADrawingContext_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FUsers_003FCinka_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F7f67edd2b798d6c80b015913cde68b729bfe416b62cf075ea3953ffeff639c_003FDrawingContext_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AEnumerable_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FUsers_003FCinka_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fcae7ff14a5884c649c9045d4ef4f987ea0928_003Fa6_003F6011c781_003FEnumerable_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
@@ -23,6 +24,7 @@
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AHttpContent_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FUsers_003FCinka_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F9657cc383c70851dc2bdcf91eff27f21196844abfe552fc9c3243ff36974cd_003FHttpContent_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AHttpListener_002EWindows_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FUsers_003FCinka_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Ffb21cfde6c1ffa9b6be622d15d56f666ad94ada7dd7d81451418d807b98f2_003FHttpListener_002EWindows_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AHttpMessageHandler_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FUsers_003FCinka_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Ffcc079c54e9940c5ac59f0141dda9ad01b4928_003Fa7_003F885f5fd9_003FHttpMessageHandler_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AHttpMessageHandler_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FUsers_003FCinka_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F5ec756ee3c4a8815819863993a738eedef67396d5517846a3eed524729bb9_003FHttpMessageHandler_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AHttpMessageInvoker_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FUsers_003FCinka_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Ffcc079c54e9940c5ac59f0141dda9ad01b4928_003Fb5_003F70346b10_003FHttpMessageInvoker_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AHttpResponseMessage_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FUsers_003FCinka_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F4cfeb8b377bc81e1fbb5f7d7a02492cb6ac23e88c8c9d7155944f0716f3d4b_003FHttpResponseMessage_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIDispatcherImpl_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FUsers_003FCinka_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F22d92db124764b1ab49745245c66f01b1e1a00_003F0f_003F01061787_003FIDispatcherImpl_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
@@ -41,6 +43,7 @@
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003APanel_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FUsers_003FCinka_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F9b699722324e3615b57977447b25bf953fccb2d6e912ae584f16b7e691ad9d3_003FPanel_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AParallel_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FUsers_003FCinka_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F36fd1a9641998bb3afbf2091e26eafa6aaafabcb494bc746c0ba7471db513143_003FParallel_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AParallel_002EForEachAsync_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FUsers_003FCinka_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fc1d1ed6be2d5d4de542b4af5b36e82f6d1d1a389a35a4e4f9748d137d1c651_003FParallel_002EForEachAsync_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003APath_002EWindows_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FUsers_003FCinka_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F8bfc57955751d07e3fad13bb97d5f66af412d7a34486ec29ad916547ec8ce6b_003FPath_002EWindows_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003APerfCounterCollector_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FUsers_003FCinka_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb07ddb833489431aae882d295a4e94797e00_003F4f_003F4c0b90e8_003FPerfCounterCollector_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AProcessStartInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FUsers_003FCinka_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fc5ffb8c166be164bc221db4c64e826a1e8ff54f2f1c9ee8e7f9cfabce707fa4_003FProcessStartInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003APropertyInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FUsers_003FCinka_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F408236be4b0703755f3ed96daaae245919a792d65ce5eaa672d9fa945b1f_003FPropertyInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
@@ -66,4 +69,23 @@
&lt;Assembly Path="C:\Users\Cinka\.nuget\packages\prometheus-net\0.0.2\lib\net40\prometheus-net.dll" /&gt;&#xD;
&lt;Assembly Path="C:\Users\Cinka\.nuget\packages\microsoft.extensions.objectpool\7.0.0\lib\net7.0\Microsoft.Extensions.ObjectPool.dll" /&gt;&#xD;
&lt;Assembly Path="C:\Users\Cinka\.nuget\packages\netstandard.library\2.0.3\build\netstandard2.0\ref\netstandard.dll" /&gt;&#xD;
&lt;/AssemblyExplorer&gt;</s:String></wpf:ResourceDictionary>
&lt;/AssemblyExplorer&gt;</s:String>
<s:String x:Key="/Default/Environment/UnitTesting/CreateUnitTestDialog/TestProjectMapping/=47519EA2_002D03C0_002D49D8_002D86CA_002D418F6B7267A4/@EntryIndexedValue">735691F8-949C-4476-B9E4-5DF6FF8D3D0B</s:String>
<s:String x:Key="/Default/Environment/UnitTesting/CreateUnitTestDialog/TestTemplateMapping/=NUnit3x/@EntryIndexedValue">db4927dd-2e12-48a7-9a84-2b7e3e31b9c8</s:String>
<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=d7603912_002D51de_002D4bca_002D9082_002D886ee6d4c2f5/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" IsActive="True" Name="RestServiceTests" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;&#xD;
&lt;TestAncestor&gt;&#xD;
&lt;TestId&gt;NUnit3x::735691F8-949C-4476-B9E4-5DF6FF8D3D0B::net9.0::Nebula.UnitTest.NebulaSharedTests.RestServiceTests&lt;/TestId&gt;&#xD;
&lt;TestId&gt;NUnit3x::735691F8-949C-4476-B9E4-5DF6FF8D3D0B::net9.0::Nebula.UnitTest.NebulaSharedTests.PopupMessageServiceTests.PopupMessageServiceTest&lt;/TestId&gt;&#xD;
&lt;TestId&gt;NUnit3x::735691F8-949C-4476-B9E4-5DF6FF8D3D0B::net9.0::Nebula.UnitTest.NebulaSharedTests.PopupMessageServiceTests.DisposeTest&lt;/TestId&gt;&#xD;
&lt;TestId&gt;NUnit3x::735691F8-949C-4476-B9E4-5DF6FF8D3D0B::net9.0::Nebula.UnitTest.NebulaSharedTests.FileServiceTests.CreateFileApi_CreatesCorrectPath&lt;/TestId&gt;&#xD;
&lt;TestId&gt;NUnit3x::735691F8-949C-4476-B9E4-5DF6FF8D3D0B::net9.0::Nebula.UnitTest.NebulaSharedTests.FileServiceTests.EnsureTempDir_CreatesDirectoryAndReturnsApi&lt;/TestId&gt;&#xD;
&lt;TestId&gt;NUnit3x::735691F8-949C-4476-B9E4-5DF6FF8D3D0B::net9.0::Nebula.UnitTest.NebulaSharedTests.FileServiceTests.OpenZip_ReturnsZipFileApi_WhenValid&lt;/TestId&gt;&#xD;
&lt;TestId&gt;NUnit3x::735691F8-949C-4476-B9E4-5DF6FF8D3D0B::net9.0::Nebula.UnitTest.NebulaSharedTests.FileServiceTests.RemoveAllFiles_DeletesAllFilesAndDirectories&lt;/TestId&gt;&#xD;
&lt;TestId&gt;NUnit3x::735691F8-949C-4476-B9E4-5DF6FF8D3D0B::net9.0::Nebula.UnitTest.NebulaSharedTests.FileServiceTests.OpenZip_ThrowsException_WhenFileApiFails&lt;/TestId&gt;&#xD;
&lt;TestId&gt;NUnit3x::735691F8-949C-4476-B9E4-5DF6FF8D3D0B::net9.0::Nebula.UnitTest.NebulaSharedTests.EngineServiceTests.GetVersionInfo_ReturnsCorrectBuildInfo&lt;/TestId&gt;&#xD;
&lt;TestId&gt;NUnit3x::735691F8-949C-4476-B9E4-5DF6FF8D3D0B::net9.0::Nebula.UnitTest.NebulaSharedTests.EngineServiceTests.TryGetVersionInfo_ReturnsTrue&lt;/TestId&gt;&#xD;
&lt;TestId&gt;NUnit3x::735691F8-949C-4476-B9E4-5DF6FF8D3D0B::net9.0::Nebula.UnitTest.NebulaSharedTests.ConfigurationServiceTests.WriteConVarTest&lt;/TestId&gt;&#xD;
&lt;TestId&gt;NUnit3x::735691F8-949C-4476-B9E4-5DF6FF8D3D0B::net9.0::Nebula.UnitTest.NebulaSharedTests.ConfigurationServiceTests.WriteArrayConvarTest&lt;/TestId&gt;&#xD;
&lt;TestId&gt;NUnit3x::735691F8-949C-4476-B9E4-5DF6FF8D3D0B::net9.0::Nebula.UnitTest.NebulaSharedTests.ConfigurationServiceTests&lt;/TestId&gt;&#xD;
&lt;/TestAncestor&gt;&#xD;
&lt;/SessionState&gt;</s:String></wpf:ResourceDictionary>