OSDN Git Service

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