using System; using System.Collections.Generic; using System.Linq; using System.Text; using NUnit.Framework; using System.Xml.Linq; using Chefbook.DataObjects; using Chefbook.DataObjects.XmlSerialization; using Chefbook.HelperMethods; using UnitTests.Properties; namespace UnitTests.DataObjectsTests.XmlSerializationTests { [TestFixture] public class XmlSerializerFixture { private XDocument categoryDoc; private XDocument recipeDoc; private List roots; [SetUp] public void Init() { categoryDoc = XDocument.Load(Resources.CategoryXmlPath); recipeDoc = XDocument.Load(Resources.RecipeXmlPath); roots = new List(); Category tasties = new Category(null) { Name = "Tasties" }; Category pasta = new Category(tasties) { Name = "Pasta" }; Category chicken = new Category(pasta) { Name = "Chicken" }; Recipe chickenShrimpScampi = new Recipe(chicken) { Name = "Chicken and Shrimp Scampi", Description = "A delicious combination of shrimp and chicken", Directions = "Take some chicken, and shrimp and cut them up and cook", CookTime = TimeSpan.FromMinutes(30), PrepTime = TimeSpan.FromMinutes(45), }; chickenShrimpScampi.AddIngredient(new Ingredient() { Name = "Chicken breasts, sliced", Amount = 1, Units = "Lbs" }); chickenShrimpScampi.AddIngredient(new Ingredient() { Name = "Jumbo Shrimp", Amount = 10, Units = "" }); chickenShrimpScampi.AddIngredient(new Ingredient() { Name = "Salted Butter", Amount = 3, Units = "tbsp" }); Recipe chickenFettuciniAlfredo = new Recipe(chicken) { Name = "Chicken Fettuccini Alfredo", Description = "A creamy chicken alfredo", Directions = "Boil up the pasta", CookTime = TimeSpan.FromMinutes(75), PrepTime = TimeSpan.FromMinutes(25), }; chickenFettuciniAlfredo.AddIngredient(new Ingredient() { Name = "Chicken breasts, sliced", Amount = 1, Units = "Lbs" }); chickenFettuciniAlfredo.AddIngredient(new Ingredient() { Name = "Fettuccini", Amount = 1, Units = "Box" }); chickenFettuciniAlfredo.AddIngredient(new Ingredient() { Name = "Alfredo Sauce", Amount = 2, Units = "Jars" }); Category beef = new Category(pasta) { Name = "Beef" }; Recipe spaghettiAndMeatballs = new Recipe(beef) { Name = "Spaghetti and Meatballs", Description = "Plain old spaghetti and meatballs", Directions = "Boil up the pasta and ball up the meat", CookTime = TimeSpan.FromMinutes(23), PrepTime = TimeSpan.FromMinutes(12), }; spaghettiAndMeatballs.AddIngredient(new Ingredient() { Name = "Ground Beef", Amount = 1, Units = "Lbs" }); spaghettiAndMeatballs.AddIngredient(new Ingredient() { Name = "Spaghetti", Amount = 1, Units = "Box" }); spaghettiAndMeatballs.AddIngredient(new Ingredient() { Name = "Spaghetti Sauce", Amount = 2, Units = "Jars" }); Recipe lasagna = new Recipe(beef) { Name = "Lasagna" }; Category pork = new Category(pasta) { Name = "Pork" }; pork.AddRecipe(lasagna); Category seafood = new Category(pasta) { Name = "Seafood" }; seafood.AddRecipe(chickenShrimpScampi); roots.Add(tasties); } [Test] public void TestReadingCategoryXml() { var expected = roots.ToList(); var actual = XmlSerializer.DeserializeCategories(categoryDoc, recipeDoc).ToList(); Assert.AreEqual(expected.Count, actual.Count); for (int i = 0; i < expected.Count; i++) { Assert.True(expected[i].ValueEquals( actual[i])); } } private static void AssertRecursivelyEquals(List expected, List actual) { foreach (var item in expected.Zip(actual, (a, b) => new { First = a, Second = b })) { Assert.True(item.First.ValueEquals(item.Second)); } } [Test] public void TestWritingCategoryXml() { XDocument actualCategories; XDocument actualRecipes; XmlSerializer.SerializeCategories(roots, out actualCategories, out actualRecipes); Assert.AreEqual(categoryDoc.ToString(), actualCategories.ToString()); Assert.AreEqual(recipeDoc.ToString(), actualRecipes.ToString()); } } }