You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
373 lines
11 KiB
373 lines
11 KiB
5 years ago
|
// This code is part of the Fungus library (https://github.com/snozbot/fungus)
|
||
|
// It is released for free under the MIT open source license (https://github.com/snozbot/fungus/blob/master/LICENSE)
|
||
|
|
||
|
using NUnit.Framework;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Linq;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace Fungus.Tests
|
||
|
{
|
||
|
[TestFixture]
|
||
|
/// <summary>
|
||
|
/// It should be no surprise that all of these work, but it is worth confirming there isn't
|
||
|
/// a silly mistake somewhere
|
||
|
/// </summary>
|
||
|
public class CollectionTests
|
||
|
{
|
||
|
private Fungus.GameObjectCollection goCol;
|
||
|
private Fungus.IntCollection intColA, intColB;
|
||
|
|
||
|
[Test]
|
||
|
public void AddRemove()
|
||
|
{
|
||
|
Assert.NotNull(intColA);
|
||
|
Assert.NotNull(intColB);
|
||
|
|
||
|
const int Items = 10;
|
||
|
const int ItemIndexToRemove = 3;
|
||
|
const int ValueToRemove = 1;
|
||
|
const int ValueToAddUnique = ValueToRemove;
|
||
|
const int ValueToAddDups = ValueToAddUnique;
|
||
|
const int MinBVal = 7;
|
||
|
const int SizeAAfterBRem = Items - (Items - MinBVal);
|
||
|
|
||
|
//add items ensure indicies match
|
||
|
for (int i = 0; i < Items; i++)
|
||
|
{
|
||
|
//added at expected index
|
||
|
Assert.AreEqual(i, intColA.Add(i));
|
||
|
//value at index matches expected value
|
||
|
Assert.AreEqual(i, intColA.Get(i));
|
||
|
}
|
||
|
|
||
|
//ensure count matches items added
|
||
|
Assert.AreEqual(Items, intColA.Count);
|
||
|
|
||
|
var valAtRemoveIndex = intColA.GetSafe(ItemIndexToRemove);
|
||
|
intColA.RemoveAt(ItemIndexToRemove);
|
||
|
Assert.AreEqual(Items - 1, intColA.Count);
|
||
|
|
||
|
intColA.Insert(ItemIndexToRemove, valAtRemoveIndex);
|
||
|
Assert.AreEqual(valAtRemoveIndex, intColA.GetSafe(ItemIndexToRemove));
|
||
|
|
||
|
intColA.Remove(ValueToRemove);
|
||
|
Assert.AreEqual(Items - 1, intColA.Count);
|
||
|
|
||
|
//multiple calls to add unique to get back the value we removed and ensure unique works
|
||
|
for (int i = 0; i < Items; i++)
|
||
|
{
|
||
|
intColA.AddUnique(ValueToAddUnique);
|
||
|
}
|
||
|
Assert.AreEqual(Items, intColA.Count);
|
||
|
|
||
|
//now add a bunch of dups, so we can remove all of them
|
||
|
for (int i = 0; i < Items; i++)
|
||
|
{
|
||
|
intColA.Add(ValueToAddDups);
|
||
|
}
|
||
|
intColA.RemoveAll(ValueToAddDups);
|
||
|
Assert.AreEqual(Items - 1, intColA.Count);
|
||
|
|
||
|
//put it back
|
||
|
intColA.Add(ValueToAddDups);
|
||
|
|
||
|
//now add a bunch of items to the colB and remove all of them from colA
|
||
|
for (int i = MinBVal; i < Items; i++)
|
||
|
{
|
||
|
intColB.Add(i);
|
||
|
}
|
||
|
intColA.RemoveAll(intColB);
|
||
|
Assert.AreEqual(intColA.Count, SizeAAfterBRem);// all of b should be gone
|
||
|
|
||
|
intColA.Add(intColB.Get(0));
|
||
|
intColA.AddUnique(intColB);//ensure intColB[0] doesn't double
|
||
|
Assert.AreEqual(intColA.Count, Items);// all of b should be back in there now
|
||
|
|
||
|
intColA.Add(intColB);
|
||
|
intColA.Unique();
|
||
|
Assert.IsTrue(intColA.Count == Items);
|
||
|
|
||
|
intColA.RemoveAll(intColA);//should be equiv to clear
|
||
|
intColB.Clear();
|
||
|
Assert.AreEqual(intColA.Count, 0);
|
||
|
Assert.AreEqual(intColB.Count, 0);
|
||
|
|
||
|
intColA.Clear();
|
||
|
intColB.Clear();
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void Compat()
|
||
|
{
|
||
|
Assert.IsTrue(intColA.IsElementCompatible(7));
|
||
|
Assert.IsTrue(intColA.IsCollectionCompatible(intColB));
|
||
|
Assert.IsTrue(intColA.IsCollectionCompatible(new int[] { 1 }));
|
||
|
Assert.IsTrue(intColA.IsCollectionCompatible(new List<int>()));
|
||
|
Assert.IsTrue(intColA.IsCollectionCompatible(new List<Fungus.IntegerVariable>()));
|
||
|
|
||
|
Assert.IsFalse(intColA.IsElementCompatible(Vector3.up));
|
||
|
Assert.IsFalse(intColA.IsCollectionCompatible(goCol));
|
||
|
Assert.IsFalse(intColA.IsCollectionCompatible(new Color[] { Color.white }));
|
||
|
Assert.IsFalse(intColA.IsCollectionCompatible(new List<Material>()));
|
||
|
Assert.IsFalse(intColA.IsCollectionCompatible(new List<Fungus.StringVariable>()));
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void Copy()
|
||
|
{
|
||
|
const int Items = 10;
|
||
|
|
||
|
for (int i = 0; i < Items; i++)
|
||
|
{
|
||
|
intColA.Add(i);
|
||
|
}
|
||
|
|
||
|
intColB.CopyFrom(intColA);
|
||
|
|
||
|
for (int i = 0; i < intColA.Count; i++)
|
||
|
{
|
||
|
Assert.AreEqual(intColA[i], intColB[i]);
|
||
|
}
|
||
|
|
||
|
//test enumerator
|
||
|
var enumer = intColA.GetEnumerator();
|
||
|
var index = 0;
|
||
|
while (enumer.MoveNext())
|
||
|
{
|
||
|
Assert.AreEqual(enumer.Current, intColB[index++]);
|
||
|
}
|
||
|
|
||
|
intColB.Clear();
|
||
|
intColB.Add(intColA);
|
||
|
|
||
|
for (int i = 0; i < intColA.Count; i++)
|
||
|
{
|
||
|
Assert.AreEqual(intColA[i], intColB[i]);
|
||
|
}
|
||
|
|
||
|
intColB.Clear();
|
||
|
int[] copyDest = new int[intColA.Count];
|
||
|
intColA.CopyTo(copyDest, 0);
|
||
|
|
||
|
for (int i = 0; i < intColA.Count; i++)
|
||
|
{
|
||
|
Assert.AreEqual(intColA[i], copyDest[i]);
|
||
|
}
|
||
|
|
||
|
//now back again
|
||
|
intColA.Clear();
|
||
|
intColA.CopyFrom(copyDest);
|
||
|
for (int i = 0; i < intColA.Count; i++)
|
||
|
{
|
||
|
Assert.AreEqual(intColA[i], copyDest[i]);
|
||
|
}
|
||
|
|
||
|
//now lists
|
||
|
intColA.Clear();
|
||
|
intColA.CopyFrom(copyDest.ToList());
|
||
|
for (int i = 0; i < intColA.Count; i++)
|
||
|
{
|
||
|
Assert.AreEqual(intColA[i], copyDest[i]);
|
||
|
}
|
||
|
|
||
|
intColA.Clear();
|
||
|
intColB.Clear();
|
||
|
}
|
||
|
|
||
|
[OneTimeTearDown]
|
||
|
public void DestroyTestObjects()
|
||
|
{
|
||
|
Object.DestroyImmediate(intColA.gameObject);
|
||
|
Object.DestroyImmediate(intColB.gameObject);
|
||
|
Object.DestroyImmediate(goCol.gameObject);
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void Exclusive()
|
||
|
{
|
||
|
const int Items = 10;
|
||
|
const int Step = 5;
|
||
|
|
||
|
for (int i = 0; i < Items; i++)
|
||
|
{
|
||
|
intColA.Add(i);
|
||
|
intColB.Add(i + Step);
|
||
|
}
|
||
|
|
||
|
intColA.Exclusive(intColB);
|
||
|
|
||
|
for (int i = 0; i < intColA.Count; i++)
|
||
|
{
|
||
|
Assert.IsTrue(intColA.GetSafe(i) < Step || intColA.GetSafe(i) >= Items);
|
||
|
}
|
||
|
|
||
|
Assert.AreEqual(intColA.Count, Items);
|
||
|
|
||
|
intColA.Clear();
|
||
|
intColB.Clear();
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void Finds()
|
||
|
{
|
||
|
const int Items = 10;
|
||
|
const int TargetItemValue = 5;
|
||
|
const int TargetItemIndex = 5;
|
||
|
const int BItems = 3;
|
||
|
|
||
|
for (int i = 0; i < Items; i++)
|
||
|
{
|
||
|
intColA.Add(i);
|
||
|
}
|
||
|
|
||
|
//add a dup, test first and last, remove dup
|
||
|
intColA.Add(TargetItemValue);
|
||
|
Assert.AreEqual(intColA.IndexOf(TargetItemValue), TargetItemIndex);
|
||
|
Assert.IsTrue(intColA.Contains(TargetItemValue));
|
||
|
Assert.AreEqual(intColA.Occurrences(TargetItemValue), 2);
|
||
|
Assert.AreEqual(intColA.LastIndexOf(TargetItemValue), intColA.Count - 1);
|
||
|
intColA.RemoveAt(intColA.Count - 1);
|
||
|
|
||
|
//any of, put some in colb
|
||
|
for (int i = 0; i < BItems; i++)
|
||
|
{
|
||
|
intColB.Add(i);
|
||
|
}
|
||
|
Assert.IsTrue(intColA.ContainsAnyOf(intColB));
|
||
|
|
||
|
//clear be, put all of in col b
|
||
|
intColB.Clear();
|
||
|
intColB.Add(intColA);
|
||
|
|
||
|
//contain ordered
|
||
|
Assert.IsTrue(intColA.ContainsAllOfOrdered(intColB));
|
||
|
|
||
|
//shuffle
|
||
|
EnsureShuffledDifferent(intColB);
|
||
|
|
||
|
//contain ordered must fail
|
||
|
Assert.IsFalse(intColA.ContainsAllOfOrdered(intColB));
|
||
|
//contain all of must true
|
||
|
Assert.IsTrue(intColA.ContainsAllOf(intColB));
|
||
|
|
||
|
intColA.Clear();
|
||
|
intColB.Clear();
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void GetSet()
|
||
|
{
|
||
|
const int ValueA = 1, ValueB = 2;
|
||
|
intColA.Add(ValueA);
|
||
|
Assert.AreEqual(ValueA, intColA[0]);
|
||
|
Assert.AreEqual(ValueA, intColA.Get(0));
|
||
|
Assert.AreEqual(ValueA, intColA.GetSafe(0));
|
||
|
|
||
|
intColA.Set(0, ValueB);
|
||
|
Assert.AreEqual(ValueB, intColA[0]);
|
||
|
intColA[0] = ValueA;
|
||
|
Assert.AreEqual(ValueA, intColA[0]);
|
||
|
|
||
|
intColA.Clear();
|
||
|
intColB.Clear();
|
||
|
}
|
||
|
|
||
|
[OneTimeSetUp]
|
||
|
public void InitTestObjects()
|
||
|
{
|
||
|
intColA = new GameObject().AddComponent<Fungus.IntCollection>();
|
||
|
intColB = new GameObject().AddComponent<Fungus.IntCollection>();
|
||
|
goCol = new GameObject().AddComponent<Fungus.GameObjectCollection>();
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void Intersection()
|
||
|
{
|
||
|
const int Items = 10;
|
||
|
const int Step = 5;
|
||
|
|
||
|
for (int i = 0; i < Items; i++)
|
||
|
{
|
||
|
intColA.Add(i);
|
||
|
intColB.Add(i + Step);
|
||
|
}
|
||
|
|
||
|
intColA.Intersection(intColB);
|
||
|
|
||
|
for (int i = 0; i < intColA.Count; i++)
|
||
|
{
|
||
|
Assert.IsTrue(intColA.GetSafe(i) >= Step || intColA.GetSafe(i) < Items);
|
||
|
}
|
||
|
|
||
|
Assert.AreEqual(intColA.Count, Step);
|
||
|
|
||
|
intColA.Clear();
|
||
|
intColB.Clear();
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void Size()
|
||
|
{
|
||
|
intColA.Capacity = 10;
|
||
|
|
||
|
var startCap = intColA.Capacity;
|
||
|
var startCount = intColA.Count;
|
||
|
|
||
|
intColA.Capacity *= 10;
|
||
|
Assert.Greater(intColA.Capacity, startCap);
|
||
|
startCap = intColA.Capacity;
|
||
|
Assert.AreEqual(startCount, intColA.Count);
|
||
|
intColA.Reserve(intColA.Capacity * 10);
|
||
|
Assert.Greater(intColA.Capacity, startCap);
|
||
|
|
||
|
intColA.Resize(startCount + 10);
|
||
|
Assert.AreEqual(startCount + 10, intColA.Count);
|
||
|
|
||
|
intColA.Clear();
|
||
|
intColB.Clear();
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void Sort()
|
||
|
{
|
||
|
const int Items = 10;
|
||
|
|
||
|
for (int i = 0; i < Items; i++)
|
||
|
{
|
||
|
intColA.Add(i);
|
||
|
}
|
||
|
|
||
|
//other tests ensure that all actually works
|
||
|
EnsureShuffledDifferent(intColA);
|
||
|
intColA.Sort();
|
||
|
|
||
|
for (int i = 0; i < Items; i++)
|
||
|
{
|
||
|
Assert.AreEqual(i, intColA[i]);
|
||
|
}
|
||
|
|
||
|
//are they now mirrored
|
||
|
intColA.Reverse();
|
||
|
for (int i = 0; i < Items; i++)
|
||
|
{
|
||
|
Assert.AreEqual(i, intColA[Items - i - 1]);
|
||
|
}
|
||
|
|
||
|
intColA.Clear();
|
||
|
intColB.Clear();
|
||
|
}
|
||
|
|
||
|
private void EnsureShuffledDifferent(Fungus.IntCollection col)
|
||
|
{
|
||
|
var startval = col.GetSafe(0);
|
||
|
col.Shuffle();
|
||
|
//don't let shuffle result in the same seq
|
||
|
if (col.GetSafe(0) == startval)
|
||
|
{
|
||
|
col[0] = col[col.Count - 1];
|
||
|
col[col.Count - 1] = startval;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|