using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using RainmeterStudio.Core.Model;
namespace RainmeterStudio.Tests.Model
{
///
/// Tests the reference class
///
[TestClass]
public class ReferenceTest
{
///
/// Tests the constructors of the reference class
///
[TestMethod]
public void ReferenceConstructorTest()
{
Reference root = new Reference("root", "D:\\Data\\Project", Reference.ReferenceTargetKind.Directory);
Reference file = new Reference("f ile__asdf.txt", Reference.ReferenceTargetKind.File);
// Test root
Assert.AreEqual("root", root.Name);
Assert.IsNull(root.Parent);
Assert.AreEqual("root", root.QualifiedName);
Assert.AreEqual("D:\\Data\\Project", root.StoragePath);
Assert.IsTrue(Enumerable.Repeat("root", 1).SequenceEqual(root.QualifiedParts));
// Test file
Assert.AreEqual("f ile__asdf.txt", file.Name);
Assert.IsNull(file.Parent);
Assert.AreEqual("f ile__asdf.txt", file.QualifiedName);
Assert.IsNull(file.StoragePath);
Assert.IsTrue(Enumerable.Repeat("f ile__asdf.txt", 1).SequenceEqual(file.QualifiedParts));
}
///
/// Tests parenting in the reference class
///
[TestMethod]
public void ReferenceParentingTest()
{
Reference root = new Reference(String.Empty, "D:\\Data\\Project");
Reference folder1 = new Reference("folder1", Reference.ReferenceTargetKind.Directory);
Reference folder2 = new Reference("folder 2", Reference.ReferenceTargetKind.Directory);
Reference file1 = new Reference("file1", Reference.ReferenceTargetKind.File);
Reference file2 = new Reference("file2.txt", Reference.ReferenceTargetKind.File);
Reference file3 = new Reference("file 3.png", Reference.ReferenceTargetKind.File);
root.Add(folder1);
root.Add(file3);
folder1.Add(file1);
folder1.Add(folder2);
folder2.Add(file2);
Assert.IsNull(root.Parent);
Assert.AreEqual(2, root.ChildrenDictionary.Count);
Assert.AreEqual(root, folder1.Parent);
Assert.AreEqual(root, file3.Parent);
Assert.AreEqual(2, folder1.ChildrenDictionary.Count);
Assert.AreEqual(folder1, folder2.Parent);
Assert.AreEqual(folder1, file1.Parent);
Assert.IsNotNull(folder2.Children.FirstOrDefault(x => x == file2));
// Unparent something
file3.Unparent();
Assert.IsNull(file3.Parent);
Assert.IsNull(root.Children.FirstOrDefault(x => x == file3));
Assert.AreEqual(1, root.ChildrenDictionary.Count);
// Remove something
root.Remove(folder1);
Assert.IsNull(folder1.Parent);
Assert.AreEqual(0, root.ChildrenDictionary.Count);
}
///
/// Tests qualified names in the reference class
///
[TestMethod]
public void ReferenceQualifiedNameTest()
{
Reference root = new Reference(String.Empty, "D:\\Data\\Project");
Reference folder1 = new Reference("folder1", Reference.ReferenceTargetKind.Directory);
Reference folder2 = new Reference("folder 2", Reference.ReferenceTargetKind.Directory);
Reference file1 = new Reference("file1", Reference.ReferenceTargetKind.File);
Reference file2 = new Reference("file2.txt", Reference.ReferenceTargetKind.File);
Reference file3 = new Reference("file 3.png", Reference.ReferenceTargetKind.File);
root.Add(folder1);
root.Add(file3);
folder1.Add(file1);
folder1.Add(folder2);
folder2.Add(file2);
// Test qualified names
Assert.AreEqual(String.Empty, root.QualifiedName);
Assert.AreEqual("/folder1", folder1.QualifiedName);
Assert.AreEqual("/folder1/folder 2", folder2.QualifiedName);
Assert.AreEqual("/folder1/file1", file1.QualifiedName);
Assert.AreEqual("/folder1/folder 2/file2.txt", file2.QualifiedName);
Assert.AreEqual("/file 3.png", file3.QualifiedName);
// Test qualified parts
Assert.IsTrue(new[] { String.Empty }
.SequenceEqual(root.QualifiedParts));
Assert.IsTrue(new[] { String.Empty, "folder1" }
.SequenceEqual(folder1.QualifiedParts));
Assert.IsTrue(new[] { String.Empty, "folder1", "folder 2" }
.SequenceEqual(folder2.QualifiedParts));
Assert.IsTrue(new[] { String.Empty, "folder1", "file1" }
.SequenceEqual(file1.QualifiedParts));
Assert.IsTrue(new[] { String.Empty, "folder1", "folder 2", "file2.txt" }
.SequenceEqual(file2.QualifiedParts));
Assert.IsTrue(new[] { String.Empty, "file 3.png" }
.SequenceEqual(file3.QualifiedParts));
}
///
/// Tests the 'get reference' extension methods
///
[TestMethod]
public void ReferenceGetReferenceTest()
{
Reference root = new Reference(String.Empty, "D:\\Data\\Project");
Reference folder1 = new Reference("folder1", Reference.ReferenceTargetKind.Directory);
Reference folder2 = new Reference("folder 2", Reference.ReferenceTargetKind.Directory);
Reference file1 = new Reference("file1", Reference.ReferenceTargetKind.File);
Reference file2 = new Reference("file2.txt", Reference.ReferenceTargetKind.File);
Reference file3 = new Reference("file 3.png", Reference.ReferenceTargetKind.File);
root.Add(folder1);
root.Add(file3);
folder1.Add(file1);
folder1.Add(folder2);
folder2.Add(file2);
// Test 'get reference' method
Assert.AreEqual(root, root.GetReference(""));
Assert.AreEqual(folder2, root.GetReference("/folder1/folder 2"));
Assert.AreEqual(file3, file2.GetReference("/file 3.png"));
Assert.AreEqual(file2, file2.GetReference("/folder1/folder 2/file2.txt"));
Assert.AreEqual(file2, file3.GetReference("/folder1/folder 2/file2.txt"));
try
{
file3.GetReference("/file 3.png/some nonexistant file");
Assert.Fail();
}
catch (ArgumentException)
{
}
// Test 'try get reference' method
Reference res;
Assert.IsTrue(root.TryGetReference("", out res));
Assert.AreEqual(root, res);
Assert.IsTrue(root.TryGetReference("/folder1/folder 2", out res));
Assert.AreEqual(folder2, res);
Assert.IsTrue(file2.TryGetReference("/file 3.png", out res));
Assert.AreEqual(file3, res);
Assert.IsTrue(file2.TryGetReference("/folder1/folder 2/file2.txt", out res));
Assert.AreEqual(file2, res);
Assert.IsTrue(file3.TryGetReference("/folder1/folder 2/file2.txt", out res));
Assert.AreEqual(file2, res);
}
}
}