view API/Factories/Xml/SingleXmlObjectLoader.cs @ 155:3725fd449c77

Re #353: Handle unloaded units being referenced outside factory * Add mock factory and use it in tests All tests now pass (including tests that started failing because of unit loading order - triggered by requirement changes)
author IBBoard <dev@ibboard.co.uk>
date Mon, 04 Jul 2011 20:03:47 +0000
parents b2517bb113d0
children ae2f1db8290c
line wrap: on
line source

// This file (SingleXmlObjectLoader.cs) is a part of the IBBoard.WarFoundry.API.Tests project and is copyright 2009 IBBoard
// 
// The file and the library/program it is in are licensed and distributed, without warranty, under the GNU Affero GPL license, either version 3 of the License or (at your option) any later version. Please see COPYING for more information and the full license.

using System;
using System.IO;
using System.Xml;
using IBBoard.WarFoundry.API.Objects;

namespace IBBoard.WarFoundry.API.Factories.Xml
{

	/// <summary>
	/// A helper class that loads a known XML file to the known type to centralise common testing code in one method
	/// </summary>
	public class SingleXmlObjectLoader
	{
		public static Race LoadRaceFromXML(WarFoundryXmlFactory factory, FileInfo file)
		{
			Stream stream = file.OpenRead();
			
			try
			{
				return factory.GetRaceFactory().CreateRaceFromElement(CreateDocumentElementFromStream(stream));
			}
			finally
			{
				if (stream != null)
				{
					stream.Close();
				}
			}
		}
		
		public static XmlElement CreateDocumentElementFromFile(string filePath)
		{
			return CreateDocumentElementFromFile(new FileInfo(filePath));
		}
		
		public static XmlElement CreateDocumentElementFromFile(FileInfo file)
		{
			return CreateDocumentElementFromStream(file.OpenRead());
		}
		
		private static XmlElement CreateDocumentElementFromStream(Stream stream)
		{
			return WarFoundryXmlFactoryUtils.CreateXmlDocumentFromStream(stream).DocumentElement;
		}
		
		public static GameSystem LoadGameSystemFromXML(WarFoundryXmlFactory factory, FileInfo file)
		{
			Stream stream = file.OpenRead();
			
			try
			{
				return factory.GetSystemFactory().CreateSystemFromElement(null, CreateDocumentElementFromStream(stream));
			}
			finally 
			{
				if (stream !=null)
				{
					stream.Close();
				}
			}
		}
	}
}