Advertisement
Stanislav_Petrov1983

Hell.Tests

Apr 19th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.05 KB | None | 0 0
  1. using NUnit.Framework;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Reflection;
  6.  
  7. [TestFixture]
  8. class Tests
  9. {
  10.     private const int itemStrengthBonus = 1;
  11.     private const int itemAgilityBonus = 2;
  12.     private const int itemIntelligenceBonus = 3;
  13.     private const int itemHitPointsBonus = 4;
  14.     private const int itemDamageBonus = 5;
  15.  
  16.     private IInventory inventory;
  17.  
  18.     [SetUp]
  19.     public void Start()
  20.     {
  21.         this.inventory = new HeroInventory();
  22.     }
  23.  
  24.     [Test]
  25.     public void AddCommonItem()
  26.     {
  27.         IItem item = new CommonItem("commonItem", itemStrengthBonus, itemAgilityBonus, itemIntelligenceBonus, itemHitPointsBonus, itemDamageBonus);
  28.  
  29.         int initualCommonItemCount = this.TakeCommonItemsCount();
  30.         int initualRecipeItemCount = this.TakeRecipeItemsCount();
  31.         Assert.AreEqual(0, initualCommonItemCount);
  32.         Assert.AreEqual(0, initualRecipeItemCount);
  33.  
  34.         this.inventory.AddCommonItem(item);
  35.  
  36.         int currentCommonItemCount = this.TakeCommonItemsCount();
  37.         int currentRecipeItemCount = this.TakeRecipeItemsCount();
  38.  
  39.         Assert.AreEqual(currentCommonItemCount, 1);
  40.         Assert.AreEqual(0, currentRecipeItemCount);
  41.  
  42.         IItem commonItem = this.TakeFirstCommonItem();
  43.  
  44.         bool areEqual = this.CompareTwoCommonItems(item, commonItem);
  45.  
  46.         Assert.True(areEqual);
  47.     }
  48.  
  49.     private bool CompareTwoCommonItems(IItem item, IItem commonItem)
  50.     {
  51.         int cmp = item.Name.CompareTo(commonItem.Name);
  52.  
  53.         if (cmp == 0)
  54.         {
  55.             cmp = item.StrengthBonus.CompareTo(commonItem.StrengthBonus);
  56.  
  57.             if (cmp == 0)
  58.             {
  59.                 cmp = item.AgilityBonus.CompareTo(commonItem.AgilityBonus);
  60.  
  61.                 if (cmp == 0)
  62.                 {
  63.                     cmp = item.IntelligenceBonus.CompareTo(commonItem.IntelligenceBonus);
  64.  
  65.                     if (cmp == 0)
  66.                     {
  67.                         cmp = item.HitPointsBonus.CompareTo(commonItem.HitPointsBonus);
  68.  
  69.                         if (cmp == 0)
  70.                         {
  71.                             cmp = item.DamageBonus.CompareTo(commonItem.DamageBonus);
  72.                         }
  73.                     }
  74.                 }
  75.             }
  76.         }
  77.  
  78.         return cmp == 0;
  79.     }
  80.  
  81.     private IItem TakeFirstCommonItem()
  82.     {
  83.         Type type = this.inventory.GetType();
  84.  
  85.         FieldInfo fieldsToInject = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic).Where(f => f.CustomAttributes.Any(a => a.AttributeType == typeof(ItemAttribute))).First();
  86.  
  87.         var itemCollection = (IDictionary<string, IItem>)fieldsToInject.GetValue(this.inventory);
  88.  
  89.         var items = itemCollection.Values.ToList();
  90.  
  91.         var item = items.First();
  92.  
  93.         return item;
  94.     }
  95.  
  96.     [Test]
  97.     public void AddRecipeItem()
  98.     {
  99.         IRecipe item = new RecipeItem("recipeItem", itemStrengthBonus, itemAgilityBonus, itemIntelligenceBonus, itemHitPointsBonus, itemDamageBonus, new List<string>() { "no existing" });
  100.  
  101.         int initualCommonItemCount = this.TakeCommonItemsCount();
  102.         int initualRecipeItemCount = this.TakeRecipeItemsCount();
  103.         Assert.AreEqual(0, initualCommonItemCount);
  104.         Assert.AreEqual(0, initualRecipeItemCount);
  105.  
  106.         this.inventory.AddRecipeItem(item);
  107.  
  108.         int currentCommonItemCount = this.TakeCommonItemsCount();
  109.         int currentRecipeItemCount = this.TakeRecipeItemsCount();
  110.  
  111.         Assert.AreEqual(0, currentCommonItemCount);
  112.         Assert.AreEqual(1, currentRecipeItemCount);
  113.  
  114.         IRecipe recipeItem = this.TakeFirstRecipeItem();
  115.  
  116.         bool areEqual = this.CompareTwoRecipeItems(item, recipeItem);
  117.  
  118.         Assert.True(areEqual);
  119.     }
  120.  
  121.     private bool CompareTwoRecipeItems(IRecipe item, IRecipe recipeItem)
  122.     {
  123.         bool commonCompare = this.CompareTwoCommonItems(item, recipeItem);
  124.  
  125.         if (!commonCompare) return commonCompare;
  126.  
  127.         var itemRequiredItems = item.RequiredItems;
  128.  
  129.         var recipeRequiredItems = recipeItem.RequiredItems;
  130.  
  131.         int cmp = itemRequiredItems.Count.CompareTo(recipeRequiredItems.Count);
  132.  
  133.         if (cmp == 0)
  134.         {
  135.             for (int i = 0; i < itemRequiredItems.Count; i++)
  136.             {
  137.                 cmp = itemRequiredItems[i].CompareTo(recipeRequiredItems[i]);
  138.  
  139.                 if (cmp != 0) break;
  140.             }
  141.         }
  142.  
  143.         return cmp == 0;
  144.     }
  145.  
  146.     private IRecipe TakeFirstRecipeItem()
  147.     {
  148.         Type type = this.inventory.GetType();
  149.  
  150.         FieldInfo fieldsToInject = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic).Where(f => f.CustomAttributes.All(a => a.AttributeType != typeof(ItemAttribute))).First();
  151.  
  152.         var itemCollection = (IDictionary<string, IRecipe>)fieldsToInject.GetValue(this.inventory);
  153.  
  154.         var items = itemCollection.Values.ToList();
  155.  
  156.         var item = items.First();
  157.  
  158.         return item;
  159.     }
  160.  
  161.     [Test]
  162.     public void AddRecipeItemWithEmptyListMustChangeCommonItemsCount()
  163.     {
  164.         IRecipe item = new RecipeItem("recipeItem", itemStrengthBonus, itemAgilityBonus, itemIntelligenceBonus, itemHitPointsBonus, itemDamageBonus, new List<string>() { });
  165.  
  166.         int initualCommonItemCount = this.TakeCommonItemsCount();
  167.         int initualRecipeItemCount = this.TakeRecipeItemsCount();
  168.         Assert.AreEqual(0, initualCommonItemCount);
  169.         Assert.AreEqual(0, initualRecipeItemCount);
  170.  
  171.         this.inventory.AddRecipeItem(item);
  172.  
  173.         int currentCommonItemCount = this.TakeCommonItemsCount();
  174.         int currentRecipeItemCount = this.TakeRecipeItemsCount();
  175.  
  176.         Assert.AreEqual(1, currentCommonItemCount);
  177.         Assert.AreEqual(1, currentRecipeItemCount);
  178.     }
  179.  
  180.     [Test]
  181.     [TestCase(5)]
  182.     [TestCase(10)]
  183.     [TestCase(33)]
  184.     public void AddRecipeItemMustReduceCommonItemsCount(int count)
  185.     {
  186.         this.CreateCommonSomeItems(count);
  187.  
  188.         int initualCommonItemCount = this.TakeCommonItemsCount();
  189.         int initualRecipeItemCount = this.TakeRecipeItemsCount();
  190.         Assert.AreEqual(count, initualCommonItemCount);
  191.         Assert.AreEqual(0, initualRecipeItemCount);
  192.  
  193.         IRecipe item = this.CreateRecipe(count / 2);
  194.  
  195.         this.inventory.AddRecipeItem(item);
  196.  
  197.         int currentCommonItemsCount = this.TakeCommonItemsCount();
  198.         int currentRecipeCount = this.TakeRecipeItemsCount();
  199.  
  200.         int requiredItemsCount = count / 2;
  201.  
  202.         Assert.AreEqual(initualCommonItemCount - requiredItemsCount + 1, currentCommonItemsCount);
  203.         Assert.AreEqual(1, currentRecipeCount);
  204.  
  205.         IRecipe secondItem = new RecipeItem("", itemStrengthBonus, itemAgilityBonus, itemIntelligenceBonus, itemHitPointsBonus, itemDamageBonus, item.RequiredItems.ToList());
  206.  
  207.         this.inventory.AddRecipeItem(secondItem);
  208.  
  209.         int secondCommonItemsCount = this.TakeCommonItemsCount();
  210.         int secondRecipeCount = this.TakeRecipeItemsCount();
  211.  
  212.         Assert.AreEqual(currentCommonItemsCount, secondCommonItemsCount);
  213.         Assert.AreEqual(2, secondRecipeCount);
  214.     }
  215.  
  216.     private IDictionary<string, IItem> GetCommonItems()
  217.     {
  218.         Type type = this.inventory.GetType();
  219.  
  220.         FieldInfo fieldsToInject = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic).Where(f => f.CustomAttributes.Any(a => a.AttributeType == typeof(ItemAttribute))).First();
  221.  
  222.         var itemCollection = (IDictionary<string, IItem>)fieldsToInject.GetValue(this.inventory);
  223.         return itemCollection;
  224.     }
  225.  
  226.     private int TakeRecipeItemsCount()
  227.     {
  228.         Type type = this.inventory.GetType();
  229.  
  230.         FieldInfo fieldsToInject = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic).Where(f => f.CustomAttributes.All(a => a.AttributeType != typeof(ItemAttribute))).First();
  231.  
  232.         var itemCollection = (IDictionary<string, IRecipe>)fieldsToInject.GetValue(this.inventory);
  233.  
  234.         var items = itemCollection.Values.ToList();
  235.  
  236.         int itemsCount = items.Count;
  237.  
  238.         return itemsCount;
  239.     }
  240.  
  241.     private int TakeCommonItemsCount()
  242.     {
  243.         Type type = this.inventory.GetType();
  244.  
  245.         FieldInfo fieldsToInject = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic).Where(f => f.CustomAttributes.Any(a => a.AttributeType == typeof(ItemAttribute))).First();
  246.  
  247.         var itemCollection = (IDictionary<string, IItem>)fieldsToInject.GetValue(this.inventory);
  248.  
  249.         var items = itemCollection.Values.ToList();
  250.  
  251.         int itemsCount = items.Count;
  252.  
  253.         return itemsCount;
  254.     }
  255.  
  256.     private IRecipe CreateRecipe(int count)
  257.     {
  258.         List<string> args = new List<string>();
  259.  
  260.         for (int i = 0; i < count; i++)
  261.         {
  262.             args.Add(i.ToString());
  263.         }
  264.  
  265.         return new RecipeItem("recipeItem", itemStrengthBonus, itemAgilityBonus, itemIntelligenceBonus, itemHitPointsBonus, itemDamageBonus, args);
  266.     }
  267.  
  268.     private void CreateCommonSomeItems(int count)
  269.     {
  270.         for (int i = 0; i < count; i++)
  271.         {
  272.             IItem item = new CommonItem($"{i}", itemStrengthBonus, itemAgilityBonus, itemIntelligenceBonus, itemHitPointsBonus, itemDamageBonus);
  273.  
  274.             this.inventory.AddCommonItem(item);
  275.         }
  276.     }
  277.  
  278.     [Test]
  279.     [TestCase(0)]
  280.     [TestCase(5)]
  281.     [TestCase(10)]
  282.     [TestCase(33)]
  283.     public void TotalBonuses(int count)
  284.     {
  285.         this.CreateCommonSomeItems(count);
  286.  
  287.         IRecipe recipe = new RecipeItem("recipeItem", itemStrengthBonus, itemAgilityBonus, itemIntelligenceBonus, itemHitPointsBonus, itemDamageBonus, new List<string>() { "no existing" });
  288.  
  289.         this.inventory.AddRecipeItem(recipe);
  290.  
  291.         IDictionary<string, IItem> itemCollection = this.GetCommonItems();
  292.  
  293.         long strengthBonus = 0L;
  294.         long agilityBonus = 0L;
  295.         long intelligenceBonus = 0L;
  296.         long hitPointsBonus = 0L;
  297.         long damageBonus = 0L;
  298.  
  299.         foreach (var item in itemCollection.Values)
  300.         {
  301.             strengthBonus += item.StrengthBonus;
  302.             agilityBonus += item.AgilityBonus;
  303.             intelligenceBonus += item.IntelligenceBonus;
  304.             hitPointsBonus += item.HitPointsBonus;
  305.             damageBonus += item.DamageBonus;
  306.         }
  307.  
  308.         Assert.AreEqual(this.inventory.TotalStrengthBonus, strengthBonus);
  309.  
  310.         Assert.AreEqual(this.inventory.TotalAgilityBonus, agilityBonus);
  311.  
  312.         Assert.AreEqual(this.inventory.TotalIntelligenceBonus, intelligenceBonus);
  313.  
  314.         Assert.AreEqual(this.inventory.TotalHitPointsBonus, hitPointsBonus);
  315.  
  316.         Assert.AreEqual(this.inventory.TotalDamageBonus, damageBonus);
  317.  
  318.         Assert.AreEqual(this.inventory.TotalStrengthBonus, (long)count * itemStrengthBonus);
  319.  
  320.         Assert.AreEqual(this.inventory.TotalAgilityBonus, (long)count * itemAgilityBonus);
  321.  
  322.         Assert.AreEqual(this.inventory.TotalIntelligenceBonus, (long)count * itemIntelligenceBonus);
  323.  
  324.         Assert.AreEqual(this.inventory.TotalHitPointsBonus, (long)count * itemHitPointsBonus);
  325.  
  326.         Assert.AreEqual(this.inventory.TotalDamageBonus, (long)count * itemDamageBonus);
  327.     }
  328. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement