Skip to content

Commit

Permalink
Merge pull request #18 from Yesser-Studios/more-test-coverage
Browse files Browse the repository at this point in the history
Improve test coverage to 99%
  • Loading branch information
yesseruser authored Feb 17, 2024
2 parents 61d8610 + 1d9e111 commit eefa122
Show file tree
Hide file tree
Showing 6 changed files with 116 additions and 37 deletions.
86 changes: 77 additions & 9 deletions yTools.Tests/SerializationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,34 +2,38 @@
{
[TestClass]
public class SerializationTests
{
{
private readonly char _sep = General.PathSeparator;

[TestCleanup]
public void Cleanup()
{
const string testDirectory = @"yTools";
const string testDirectory = "yTools";

var fullDir = $"{Environment.GetFolderPath(
Environment.SpecialFolder.LocalApplicationData
)}\\{testDirectory}";
)}{_sep}{testDirectory}";
if (Directory.Exists(fullDir))
Directory.Delete(fullDir, true);
}

[TestMethod]
public void CheckObjectsBinarySerialized()
{
Console.WriteLine(_sep);

TestSerializationObject testObject1 = new("Hi!", 5, 465.5);
TestSerializationObject testObject2 = new("Good Morning.", -8485, -6498.948);

BinarySerializer serializer = new();

const string directory = @"yTools\Tests\Serialization";
var directory = $"yTools{_sep}Tests{_sep}Serialization";
serializer.SetSerializationDirectoryInLocalAppData(directory);

Assert.IsTrue(Directory.Exists(
$"{Environment.GetFolderPath(
Environment.SpecialFolder.LocalApplicationData
)}\\{directory}"));
)}{_sep}{directory}"));

var serialized = serializer.SerializeInDefault("testObject1.bin", testObject1, out Exception? exception, out _);
if (!serialized && exception != null) throw exception;
Expand All @@ -55,13 +59,13 @@ public void CheckObjectsJsonSerialized()

JsonSerializer serializer = new();

const string directory = @"yTools\Tests\Serialization";
var directory = $"yTools{_sep}Tests{_sep}Serialization";
serializer.SetSerializationDirectoryInLocalAppData(directory);

Assert.IsTrue(Directory.Exists(
$"{Environment.GetFolderPath(
Environment.SpecialFolder.LocalApplicationData
)}\\{directory}"));
)}{_sep}{directory}"));

bool serialized = serializer.SerializeInDefault("testObject1.json", testObject1, out Exception? exception, out _);
if (!serialized && exception != null) throw exception;
Expand All @@ -87,13 +91,13 @@ public void CheckObjectsXmlSerialized()

XmlSerializer serializer = new();

const string directory = @"yTools\Tests\Serialization";
var directory = $"yTools{_sep}Tests{_sep}Serialization";
serializer.SetSerializationDirectoryInLocalAppData(directory);

Assert.IsTrue(Directory.Exists(
$"{Environment.GetFolderPath(
Environment.SpecialFolder.LocalApplicationData
)}\\{directory}"));
)}{_sep}{directory}"));

bool serialized = serializer.SerializeInDefault("testObject1.xml", testObject1, out Exception? exception, out _);
if (!serialized && exception != null) throw exception;
Expand All @@ -110,5 +114,69 @@ public void CheckObjectsXmlSerialized()

Assert.IsTrue(deserialized1.Equals(testObject1) && deserialized2.Equals(testObject2));
}

[TestMethod]
public void CheckSerializationDirCreated()
{
var baseDir = $"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}{_sep}yTools";
var testObj = new TestSerializationObject("FooBar", 0, 0.5);

var jsonSerializer = new JsonSerializer();
var xmlSerializer = new XmlSerializer();
var binSerializer = new BinarySerializer();

jsonSerializer.Serialize(testObj, "json.json", $@"{baseDir}{_sep}json", out _, out _);
Assert.IsTrue(Directory.Exists($"{baseDir}{_sep}json"));

xmlSerializer.Serialize(testObj, "xml.xml", $@"{baseDir}{_sep}xml", out _, out _);
Assert.IsTrue(Directory.Exists($"{baseDir}{_sep}xml"));

binSerializer.Serialize(testObj, "bin.bin", $@"{baseDir}{_sep}bin", out _, out _);
Assert.IsTrue(Directory.Exists($"{baseDir}{_sep}bin"));
}

[TestMethod]
public void CheckDeserializeException()
{
var jsonSerializer = new JsonSerializer();
var xmlSerializer = new XmlSerializer();
var binSerializer = new BinarySerializer();

jsonSerializer.Deserialize<TestSerializationObject>("hello", @"C:\whatever", out var jsonEx, out _);
xmlSerializer.Deserialize<TestSerializationObject>("hello", @"C:\whatever", out var xmlEx, out _);
binSerializer.Deserialize<TestSerializationObject>("hello", @"C:\whatever", out var binEx, out _);

Assert.IsNotNull(jsonEx);
Assert.IsNotNull(xmlEx);
Assert.IsNotNull(binEx);
}

[TestMethod]
public void CheckSerializeException()
{
TestSerializationObject testObj = new("69", 48, 5.2);
var jsonSerializer = new JsonSerializer();
var xmlSerializer = new XmlSerializer();
var binSerializer = new BinarySerializer();
var path = $"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}{_sep}yTools{_sep}\0{_sep}whatever.ser"; // Invalid path

var jsonSerialized = jsonSerializer.Serialize(
path, testObj, out var ex, out _);
Assert.IsFalse(jsonSerialized);
Assert.IsNotNull(ex);
Console.WriteLine($"Type of Json exception: {ex.GetType()}");

var xmlSerialized = xmlSerializer.Serialize(
path, testObj, out ex, out _);
Assert.IsFalse(xmlSerialized);
Assert.IsNotNull(ex);
Console.WriteLine($"Type of XML exception: {ex.GetType()}");

var binSerialized = binSerializer.Serialize(
path, testObj, out ex, out _);
Assert.IsFalse(binSerialized);
Assert.IsNotNull(ex);
Console.WriteLine($"Type of binary exception: {ex.GetType()}");
}
}
}
2 changes: 2 additions & 0 deletions yTools.sln.DotSettings
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/Environment/Filtering/ExcludeCoverageFilters/=yTools_003B_002A_003ByTools_002EDoubles_003B_002Ecctor/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
6 changes: 6 additions & 0 deletions yTools/General.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.IO;

namespace yTools
{
Expand All @@ -9,6 +10,11 @@ public static class General
/// </summary>
public static T GetInput<T>(T input) => input;

/// <summary>
/// The path separator for your current platform.
/// </summary>
public static readonly char PathSeparator = Path.DirectorySeparatorChar;

/// <summary>
/// Closes your app with an exit code. The default exit code is 0.
/// </summary>
Expand Down
19 changes: 10 additions & 9 deletions yTools/Serialization/BinarySerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ public class BinarySerializer
{
#region DefaultFolder

string defaultFolder = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\.cached";
string defaultFolder =
$"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}{General.PathSeparator}.cached";

/// <summary>
/// Sets the default serialization directory to a nested directory in <c>AppData\Local</c>.<br/>
Expand All @@ -18,9 +19,9 @@ public class BinarySerializer
/// <param name="directory">The directory inside AppData\Local to store serialized objects. Use '\' to nest directories.</param>
public void SetSerializationDirectoryInLocalAppData(string directory)
{
SetSerializationDirectory(directory[0] == '\\'
SetSerializationDirectory(directory[0] == '\\' || directory[0] == '/'
? Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + directory
: Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\" + directory);
: Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + General.PathSeparator + directory);
}

/// <summary>
Expand Down Expand Up @@ -53,14 +54,14 @@ public bool Serialize<T>(string filepath, T obj, out Exception? exception, out T
{
string? parentDir = Path.GetDirectoryName(filepath);

if (parentDir == null || !Directory.Exists(parentDir))
Directory.CreateDirectory(parentDir);

exception = null;
exceptionType = null;

try
{
if (parentDir == null || !Directory.Exists(parentDir))
Directory.CreateDirectory(parentDir);

using var stream = new FileStream(filepath, FileMode.Create);
var formatter = new BinaryFormatter();
formatter.Serialize(stream, obj);
Expand All @@ -85,7 +86,7 @@ public bool Serialize<T>(string filepath, T obj, out Exception? exception, out T
/// <returns>True if serialization succeeded without exception.; false if an exception was raised.</returns>
public bool Serialize<T>(T obj, string filename, string directory, out Exception? exception, out Type? exceptionType)
{
return Serialize(directory + @"\" + filename, obj, out exception, out exceptionType);
return Serialize(directory + General.PathSeparator + filename, obj, out exception, out exceptionType);
}

/// <summary>
Expand Down Expand Up @@ -143,7 +144,7 @@ public bool SerializeInDefault<T>(string filename, T obj, out Exception? excepti
/// <returns>True if deserialization succeeded without exception; false if an exception was raised.</returns>
public object? Deserialize<T>(string filename, string directory, out Exception? exception, out Type? exceptionType)
{
return Deserialize<T>(directory + @"\" + filename, out exception, out exceptionType);
return Deserialize<T>(directory + General.PathSeparator + filename, out exception, out exceptionType);
}

/// <summary>
Expand All @@ -156,7 +157,7 @@ public bool SerializeInDefault<T>(string filename, T obj, out Exception? excepti
/// <returns>True if deserialization succeeded without exception; false if an exception was raised.</returns>
public object? DeserializeFromDefault<T>(string filename, out Exception? exception, out Type? exceptionType)
{
return Deserialize<T>(defaultFolder + @"\" + filename, out exception, out exceptionType);
return Deserialize<T>(defaultFolder + General.PathSeparator + filename, out exception, out exceptionType);
}

#endregion
Expand Down
21 changes: 11 additions & 10 deletions yTools/Serialization/JsonSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ public class JsonSerializer
{
#region DefaultFolder

string defaultDirectory = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\.cached";
string defaultDirectory =
$"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}{General.PathSeparator}.cached";

/// <summary>
/// Sets the default serialization directory to a nested directory in <c>AppData\Local</c>.<br/>
Expand All @@ -17,9 +18,9 @@ public class JsonSerializer
/// <param name="directory">The directory inside AppData\Local to store serialized objects. Use '\' to nest directories.</param>
public void SetSerializationDirectoryInLocalAppData(string directory)
{
SetSerializationDirectory(directory[0] == '\\'
SetSerializationDirectory(directory[0] == '\\' || directory[0] == '/'
? Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + directory
: Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\" + directory);
: Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + General.PathSeparator + directory);
}

/// <summary>
Expand Down Expand Up @@ -51,15 +52,15 @@ public void SetSerializationDirectory(string directory)
public bool Serialize<T>(string filepath, T obj, out Exception? exception, out Type? exceptionType)
{
string? parentDir = Path.GetDirectoryName(filepath);

if (parentDir == null || !Directory.Exists(parentDir))
Directory.CreateDirectory(parentDir);


exception = null;
exceptionType = null;

try
{
if (parentDir == null || !Directory.Exists(parentDir))
Directory.CreateDirectory(parentDir);

using var writer = new StreamWriter(new FileStream(filepath, FileMode.Create));
var serializer = new Newtonsoft.Json.JsonSerializer();
serializer.Serialize(writer, obj);
Expand All @@ -84,7 +85,7 @@ public bool Serialize<T>(string filepath, T obj, out Exception? exception, out T
/// <returns>True if serialization succeeded without exception.; false if an exception was raised.</returns>
public bool Serialize<T>(T obj, string filename, string directory, out Exception? exception, out Type? exceptionType)
{
return Serialize(directory + @"\" + filename, obj, out exception, out exceptionType);
return Serialize(directory + General.PathSeparator + filename, obj, out exception, out exceptionType);
}

/// <summary>
Expand Down Expand Up @@ -142,7 +143,7 @@ public bool SerializeInDefault<T>(string filename, T obj, out Exception? excepti
/// <returns>True if deserialization succeeded without exception; false if an exception was raised.</returns>
public object? Deserialize<T>(string filename, string directory, out Exception? exception, out Type? exceptionType)
{
return Deserialize<T>(directory + @"\" + filename, out exception, out exceptionType);
return Deserialize<T>(directory + General.PathSeparator + filename, out exception, out exceptionType);
}

/// <summary>
Expand All @@ -155,7 +156,7 @@ public bool SerializeInDefault<T>(string filename, T obj, out Exception? excepti
/// <returns>True if deserialization succeeded without exception; false if an exception was raised.</returns>
public object? DeserializeFromDefault<T>(string filename, out Exception? exception, out Type? exceptionType)
{
return Deserialize<T>(defaultDirectory + @"\" + filename, out exception, out exceptionType);
return Deserialize<T>(defaultDirectory + General.PathSeparator + filename, out exception, out exceptionType);
}

#endregion
Expand Down
19 changes: 10 additions & 9 deletions yTools/Serialization/XmlSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ public class XmlSerializer
{
#region DefaultFolder

string defaultFolder = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\.cached";
string defaultFolder =
$"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}{General.PathSeparator}.cached";

/// <summary>
/// Sets the default serialization directory to a nested directory in <c>AppData\Local</c>.<br/>
Expand All @@ -17,9 +18,9 @@ public class XmlSerializer
/// <param name="directory">The directory inside AppData\Local to store serialized objects. Use '\' to nest directories.</param>
public void SetSerializationDirectoryInLocalAppData(string directory)
{
SetSerializationDirectory(directory[0] == '\\'
SetSerializationDirectory(directory[0] == '\\' || directory[0] == '/'
? Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + directory
: Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\" + directory);
: $"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}{General.PathSeparator}{directory}");
}

/// <summary>
Expand Down Expand Up @@ -52,14 +53,14 @@ public bool Serialize<T>(string filepath, T obj, out Exception? exception, out T
{
string? parentDir = Path.GetDirectoryName(filepath);

if (parentDir == null || !Directory.Exists(parentDir))
Directory.CreateDirectory(parentDir);

exception = null;
exceptionType = null;

try
{
if (parentDir == null || !Directory.Exists(parentDir))
Directory.CreateDirectory(parentDir);

using var stream = new FileStream(filepath, FileMode.Create);
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(T));
serializer.Serialize(stream, obj);
Expand All @@ -84,7 +85,7 @@ public bool Serialize<T>(string filepath, T obj, out Exception? exception, out T
/// <returns>True if serialization succeeded without exception.; false if an exception was raised.</returns>
public bool Serialize<T>(T obj, string filename, string directory, out Exception? exception, out Type? exceptionType)
{
return Serialize(directory + @"\" + filename, obj, out exception, out exceptionType);
return Serialize(directory + General.PathSeparator + filename, obj, out exception, out exceptionType);
}

/// <summary>
Expand Down Expand Up @@ -142,7 +143,7 @@ public bool SerializeInDefault<T>(string filename, T obj, out Exception? excepti
/// <returns>True if deserialization succeeded without exception; false if an exception was raised.</returns>
public object? Deserialize<T>(string filename, string directory, out Exception? exception, out Type? exceptionType)
{
return Deserialize<T>(directory + @"\" + filename, out exception, out exceptionType);
return Deserialize<T>(directory + General.PathSeparator + filename, out exception, out exceptionType);
}

/// <summary>
Expand All @@ -155,7 +156,7 @@ public bool SerializeInDefault<T>(string filename, T obj, out Exception? excepti
/// <returns>True if deserialization succeeded without exception; false if an exception was raised.</returns>
public object? DeserializeFromDefault<T>(string filename, out Exception? exception, out Type? exceptionType)
{
return Deserialize<T>(defaultFolder + @"\" + filename, out exception, out exceptionType);
return Deserialize<T>(defaultFolder + General.PathSeparator + filename, out exception, out exceptionType);
}

#endregion
Expand Down

0 comments on commit eefa122

Please sign in to comment.