A game about forced loneliness, made by TACStudios
at master 160 lines 8.3 kB view raw
1using NUnit.Framework; 2using System.Collections.Generic; 3using System.Linq; 4using UnityEngine.Rendering; 5 6namespace UnityEngine.Rendering.Tests 7{ 8 class BitArrayTests 9 { 10 BitArray8[] ba8; 11 BitArray16[] ba16; 12 BitArray32[] ba32; 13 BitArray64[] ba64; 14 BitArray128[] ba128; 15 BitArray256[] ba256; 16 17 static readonly uint[] aIndexes = new uint[] { 300, 200, 198, 100, 98, 60, 58, 30, 28, 10, 8, 4, 2, 0, 0 }; //double 0 entry to test double entry 18 static readonly uint[] bIndexes = new uint[] { 300, 200, 199, 100, 99, 60, 59, 30, 29, 10, 9, 8, 5, 1, 0 }; 19 static readonly uint[] getSetTestedIndexes = new uint[] { 201, 200, 101, 100, 61, 60, 31, 30, 11, 10, 1, 0 }; // on a, odd value are false, even true 20 const string aHumanized = "00000000.00000000.00000000.00000000.00000000.00000000.00000001.01000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00010100.00000000.00000000.00000000.00000000.00010100.00000000.00000000.00000000.01010000.00000000.00000101.00010101"; 21 const string bHumanized = "00000000.00000000.00000000.00000000.00000000.00000000.00000001.10000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00011000.00000000.00000000.00000000.00000000.00011000.00000000.00000000.00000000.01100000.00000000.00000111.00100011"; 22 const string aAndBHumanized = "00000000.00000000.00000000.00000000.00000000.00000000.00000001.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00010000.00000000.00000000.00000000.00000000.00010000.00000000.00000000.00000000.01000000.00000000.00000101.00000001"; 23 const string aOrBHumanized = "00000000.00000000.00000000.00000000.00000000.00000000.00000001.11000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00011100.00000000.00000000.00000000.00000000.00011100.00000000.00000000.00000000.01110000.00000000.00000111.00110111"; 24 const string notAHumanized = "11111111.11111111.11111111.11111111.11111111.11111111.11111110.10111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11101011.11111111.11111111.11111111.11111111.11101011.11111111.11111111.11111111.10101111.11111111.11111010.11101010"; 25 const string zeroHumanized = "00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000"; 26 const string maxHumanized = "11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111.11111111"; 27 28 [SetUp] 29 public void SetUpBitArray() 30 { 31 ba8 = new[] { new BitArray8(), new BitArray8(aIndexes), new BitArray8(bIndexes), new BitArray8(byte.MaxValue) }; 32 ba16 = new[] { new BitArray16(), new BitArray16(aIndexes), new BitArray16(bIndexes), new BitArray16(ushort.MaxValue) }; 33 ba32 = new[] { new BitArray32(), new BitArray32(aIndexes), new BitArray32(bIndexes), new BitArray32(uint.MaxValue) }; 34 ba64 = new[] { new BitArray64(), new BitArray64(aIndexes), new BitArray64(bIndexes), new BitArray64(ulong.MaxValue) }; 35 ba128 = new[] { new BitArray128(), new BitArray128(aIndexes), new BitArray128(bIndexes), new BitArray128(ulong.MaxValue, ulong.MaxValue) }; 36 ba256 = new[] { new BitArray256(), new BitArray256(aIndexes), new BitArray256(bIndexes), new BitArray256(ulong.MaxValue, ulong.MaxValue, ulong.MaxValue, ulong.MaxValue) }; 37 } 38 39 //[TearDown] 40 //nothing to do as they are non static struct 41 42 string GetLastHumanizedBits(string a, uint bitNumber) => a.Substring(a.Length - ((int)bitNumber + ((int)bitNumber - 1) / 8)); //handle '.' separators 43 44 void TestBitArrayMethods<T>(T[] ba, uint capacity) 45 where T : IBitArray 46 { 47 Assert.AreEqual(capacity, ba[0].capacity); 48 Assert.AreEqual(true, ba[0].allFalse); 49 Assert.AreEqual(false, ba[0].allTrue); 50 var trimmedZeroHumanized = GetLastHumanizedBits(zeroHumanized, capacity); 51 var humanized = ba[0].humanizedData; 52 Assert.AreEqual(trimmedZeroHumanized, humanized); 53 54 Assert.AreEqual(capacity, ba[1].capacity); 55 Assert.AreEqual(false, ba[1].allFalse); 56 Assert.AreEqual(false, ba[1].allTrue); 57 var trimmedAHumanized = GetLastHumanizedBits(aHumanized, capacity); 58 humanized = ba[1].humanizedData; 59 Assert.AreEqual(trimmedAHumanized, humanized); 60 61 Assert.AreEqual(capacity, ba[2].capacity); 62 Assert.AreEqual(false, ba[2].allFalse); 63 Assert.AreEqual(false, ba[2].allTrue); 64 var trimmedBHumanized = GetLastHumanizedBits(bHumanized, capacity); 65 humanized = ba[2].humanizedData; 66 Assert.AreEqual(trimmedBHumanized, humanized); 67 68 Assert.AreEqual(capacity, ba[3].capacity); 69 Assert.AreEqual(false, ba[3].allFalse); 70 Assert.AreEqual(true, ba[3].allTrue); 71 var trimmedMaxHumnized = GetLastHumanizedBits(maxHumanized, capacity); 72 humanized = ba[3].humanizedData; 73 Assert.AreEqual(trimmedMaxHumnized, humanized); 74 } 75 76 void TestBitArrayOperator<T>(T[] ba) 77 where T : IBitArray 78 { 79 //ensure we keep value type when refactoring 80 var ba_4 = ba[1]; 81 Assert.AreEqual(ba_4, ba[1]); 82 Assert.AreNotSame(ba_4, ba[1]); 83 ba_4 = ba[2]; 84 Assert.AreNotEqual(ba_4, ba[1]); 85 86 //test and 87 var bAndA = ba[2].BitAnd(ba[1]); 88 var aAndB = ba[1].BitAnd(ba[2]); 89 Assert.AreEqual(bAndA, aAndB); 90 Assert.AreEqual(bAndA.humanizedData, GetLastHumanizedBits(aAndBHumanized, ba[0].capacity)); 91 92 //test or 93 var bOrA = ba[2].BitOr(ba[1]); 94 var aOrB = ba[1].BitOr(ba[2]); 95 Assert.AreEqual(bOrA, aOrB); 96 Assert.AreEqual(bOrA.humanizedData, GetLastHumanizedBits(aOrBHumanized, ba[0].capacity)); 97 98 //test not 99 var notA = ba[1].BitNot(); 100 Assert.AreEqual(notA.humanizedData, GetLastHumanizedBits(notAHumanized, ba[0].capacity)); 101 102 //test indexer 103 foreach (uint index in getSetTestedIndexes.Where(i => i < ba[0].capacity)) 104 { 105 //test get 106 Assert.AreEqual(ba[1][index], (index & 1) == 0); //on a, odd value are false and even true 107 108 //test set 109 var bai = ba[1]; 110 bai[index] = ba[1][index]; 111 Assert.AreEqual(ba[1], bai); 112 bai[index] = !ba[1][index]; 113 Assert.AreNotEqual(ba[1], bai); 114 Assert.AreEqual(bai[index], !ba[1][index]); 115 } 116 } 117 118 [Test] 119 public void TestBitArray8() 120 { 121 TestBitArrayMethods(ba8, 8u); 122 TestBitArrayOperator(ba8); 123 } 124 125 [Test] 126 public void TestBitArray16() 127 { 128 TestBitArrayMethods(ba16, 16u); 129 TestBitArrayOperator(ba16); 130 } 131 132 [Test] 133 public void TestBitArray32() 134 { 135 TestBitArrayMethods(ba32, 32u); 136 TestBitArrayOperator(ba32); 137 } 138 139 [Test] 140 public void TestBitArray64() 141 { 142 TestBitArrayMethods(ba64, 64u); 143 TestBitArrayOperator(ba64); 144 } 145 146 [Test] 147 public void TestBitArray128() 148 { 149 TestBitArrayMethods(ba128, 128u); 150 TestBitArrayOperator(ba128); 151 } 152 153 [Test] 154 public void TestBitArray256() 155 { 156 TestBitArrayMethods(ba256, 256u); 157 TestBitArrayOperator(ba256); 158 } 159 } 160}