Click here to Skip to main content
15,889,116 members
Articles / Programming Languages / C#

A Flexible Plugin System

Rate me:
Please Sign up or sign in to vote.
4.98/5 (25 votes)
3 Sep 2008LGPL34 min read 131K   1.8K   163  
A generic plugin system used to load and manage plugins
#if DEBUG
using System;
using System.IO;
using System.Threading;
using Xunit;

namespace Fadd.Globalization.Yaml.Tests
{
    public class YamlWatcherTest
    {
        /// <summary>Test an incorrect file</summary>
        [Fact]
        public void TestIncorrectFile()
        {
            Assert.Throws(typeof(FileNotFoundException), delegate { new YamlWatcher(null, @"c:\doesnotexist"); });
        }

        [Fact]
        public void MultipleWriteSuccessTest()
        {
            const string filename = "test.yaml";
            File.WriteAllText("test.yaml", @"	1053: Swedish
		TextEntry1: En text.
		TextEntry2: En text2.
		EnSubNod: Subnoden 1
			SubNodTextEntry1: Subnodens textentry1");

            LanguageNode rootNode = new MemLanguageNode(1053, "RootNode");
            using (YamlWatcher watcher = new YamlWatcher(rootNode, filename))
            {
                Assert.Equal("En text.", rootNode["TextEntry1"]);
                Assert.Equal("Subnodens textentry1", rootNode.GetNode("EnSubNod")["SubNodTextEntry1"]);

                File.WriteAllText("test.yaml", @"	1053: Swedish
		TextEntry1: En text2.
		TextEntry2: En text1.
		EnSubNod: Subnoden 1
			SubNodTextEntry1: Subnodens textentry1");
                FileStream file = File.Open("test.yaml", FileMode.Append, FileAccess.Write);
                Thread.Sleep(1000);
                file.Close();
                Thread.Sleep(500);
                Assert.Equal("En text2.", rootNode["TextEntry1"]);
            }
        }

        [Fact]
        public void CorrectProcedureTest()
        {
            const string filename = "test.yaml";
            File.WriteAllText("test.yaml", @"	1053: Swedish
		TextEntry1: En text.
		TextEntry2: En text2.
		EnSubNod: Subnoden 1
			SubNodTextEntry1: Subnodens textentry1");

            LanguageNode rootNode = new MemLanguageNode(1053, "RootNode");
            using (YamlWatcher watcher = new YamlWatcher(rootNode, filename))
            {
                Assert.Equal("En text.", rootNode["TextEntry1"]);
                Assert.Equal("Subnodens textentry1", rootNode.GetNode("EnSubNod")["SubNodTextEntry1"]);

                Assert.Equal("[SubNodTextEntry2]", rootNode.GetNode("EnSubNod")["SubNodTextEntry2"]);
                File.AppendAllText(filename, Environment.NewLine + "			SubNodTextEntry2: Lite subnodtext.");
                Thread.Sleep(200);
                Assert.Equal("Lite subnodtext.", rootNode.GetNode("EnSubNod")["SubNodTextEntry2"]);

                Assert.Equal("[TextEntry3]", rootNode["TextEntry3"]);
                File.AppendAllText(filename, Environment.NewLine + "		TextEntry3: En text3.");
                Thread.Sleep(200);
                Assert.Equal("En text3.", rootNode["TextEntry3"]);
            }
        }

		[Fact]
		public void TestMultipleFiles()
		{
			const string filename = "test.yaml";
			File.WriteAllText("test.yaml", @"	1053: Swedish
		TextEntry1: En text.
		TextEntry1: En text2.
		EnSubNod: Subnoden 1
			SubNodTextEntry1: Subnodens textentry1
		EnSubNod: Subnoden 2
			SubNodTextEntry1: Subnodens textentry2");
			MemLanguageNode language = new MemLanguageNode(1053, "Test");
			YamlWatcher.LoadFile(filename, language);

			Assert.Equal("En text2.", language["TextEntry1"]);
			Assert.Equal("Subnodens textentry2", language.GetNode("EnSubNod")["SubNodTextEntry1"]);
		}

		[Fact]
		public void TestDoubleEntries()
		{
			const string filename = "test.yaml";
			File.WriteAllText("test.yaml", @"	1053: Swedish
		TextEntry1: En text.
		TextEntry1: En text2.
		EnSubNod: Subnoden 1
			SubNodTextEntry1: Subnodens textentry1
		EnSubNod: Subnoden 2
			SubNodTextEntry1: Subnodens textentry2");
			MemLanguageNode language = new MemLanguageNode(1053, "Test");
			YamlWatcher.LoadFile(filename, language);

			Assert.Equal("En text2.", language["TextEntry1"]);
			Assert.Equal("Subnodens textentry2", language.GetNode("EnSubNod")["SubNodTextEntry1"]);
		}
    }
}
#endif

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The GNU Lesser General Public License (LGPLv3)


Written By
Founder 1TCompany AB
Sweden Sweden

Comments and Discussions