A game about forced loneliness, made by TACStudios
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}