1 //
2 // Copyright (c) 2010-2023 Antmicro
3 //
4 // This file is licensed under the MIT License.
5 // Full license text is available in 'licenses/MIT.txt'.
6 //
7 
8 using NUnit.Framework;
9 
10 namespace Antmicro.Renode.Utilities
11 {
12     [TestFixture]
13     public class BitHelperTests
14     {
15         [Test]
ShouldReverseBitsByByte()16         public void ShouldReverseBitsByByte()
17         {
18             Assert.AreEqual(0x00, BitHelper.ReverseBits((byte)0x00));
19             Assert.AreEqual(0x00, BitHelper.ReverseBitsByByte(0x00));
20             Assert.AreEqual(0x4D, BitHelper.ReverseBits((byte)0xB2));
21             Assert.AreEqual(0x1A2B3C4D, BitHelper.ReverseBitsByByte(0x58D43CB2));
22         }
23 
24         [Test]
ShouldReverseBitsByWord()25         public void ShouldReverseBitsByWord()
26         {
27             Assert.AreEqual(0x00, BitHelper.ReverseBits((ushort)0x00));
28             Assert.AreEqual(0x00, BitHelper.ReverseBitsByWord(0x00));
29             Assert.AreEqual(0x3C4D, BitHelper.ReverseBits((ushort)0xB23C));
30             Assert.AreEqual(0x1A2B3C4D, BitHelper.ReverseBitsByWord(0xD458B23C));
31         }
32 
33         [Test]
ShouldReverseDoubleWordBits()34         public void ShouldReverseDoubleWordBits()
35         {
36             Assert.AreEqual(0x00, BitHelper.ReverseBits((uint)0x00));
37             Assert.AreEqual(0x1A2B3C4D, BitHelper.ReverseBits((uint)0xB23CD458));
38         }
39 
40         [Test]
ShouldReverseQuadrupleWordBits()41         public void ShouldReverseQuadrupleWordBits()
42         {
43             Assert.AreEqual(0x00, BitHelper.ReverseBits((ulong)0x00));
44             Assert.AreEqual(0x1A2B3C4D5E6F7A8B, BitHelper.ReverseBits((ulong)0xD15EF67AB23CD458));
45         }
46 
47         [Test]
ShouldCalculateDoubleWordMask()48         public void ShouldCalculateDoubleWordMask()
49         {
50             Assert.AreEqual(0x00, BitHelper.CalculateMask(0, 0));
51             Assert.AreEqual(0xFFFFFFFF, BitHelper.CalculateMask(32, 0));
52             Assert.AreEqual(0xFFFFFFF8, BitHelper.CalculateMask(29, 3));
53             Assert.AreEqual(0x7FFFFFFE, BitHelper.CalculateMask(30, 1));
54             Assert.AreEqual(0x00, BitHelper.CalculateMask(32, 32));
55         }
56 
57         [Test]
ShouldCalculateQuadWordMask()58         public void ShouldCalculateQuadWordMask()
59         {
60             Assert.AreEqual(0x00, BitHelper.CalculateQuadWordMask(0, 0));
61             Assert.AreEqual(0xFFFFFFFFFFFFFFFF, BitHelper.CalculateQuadWordMask(64, 0));
62             Assert.AreEqual(0xFFFFFFFFFFFFFFF8, BitHelper.CalculateQuadWordMask(61, 3));
63             Assert.AreEqual(0x7FFFFFFFFFFFFFFE, BitHelper.CalculateQuadWordMask(62, 1));
64             Assert.AreEqual(0x00, BitHelper.CalculateQuadWordMask(64, 64));
65         }
66 
67         [Test]
ShouldGetDoubleWordMaskedValue()68         public void ShouldGetDoubleWordMaskedValue()
69         {
70             Assert.AreEqual(0x00, BitHelper.GetMaskedValue(0, 0, 0));
71             Assert.AreEqual(0x00, BitHelper.GetMaskedValue(0x1234, 32, 0));
72             Assert.AreEqual(0x1234, BitHelper.GetMaskedValue(0x1234, 0, 13));
73             Assert.AreEqual(0xFFFFFFFF, BitHelper.GetMaskedValue(0xFFFFFFFF, 0, 32));
74             Assert.AreEqual(0x10, BitHelper.GetMaskedValue(0x38, 4, 1));
75         }
76 
77         [Test]
ShouldGetQuadWordMaskedValue()78         public void ShouldGetQuadWordMaskedValue()
79         {
80             Assert.AreEqual(0x00, BitHelper.GetMaskedValue(0L, 0, 0));
81             Assert.AreEqual(0x00, BitHelper.GetMaskedValue(0x1234L, 32, 0));
82             Assert.AreEqual(0x1234, BitHelper.GetMaskedValue(0x1234L, 0, 13));
83             Assert.AreEqual(0xFFFFFFFFFFFFFF, BitHelper.GetMaskedValue(0xFFFFFFFFFFFFFFL, 0, 64));
84             Assert.AreEqual(0x10, BitHelper.GetMaskedValue(0x38L, 4, 1));
85         }
86 
87         [Test]
ShouldSetDoubleWordMaskedValue()88         public void ShouldSetDoubleWordMaskedValue()
89         {
90             uint value = 0x00;
91             BitHelper.SetMaskedValue(ref value, 0, 0, 0);
92             Assert.AreEqual(0x00, value);
93             BitHelper.SetMaskedValue(ref value, 0x1234, 32, 0);
94             Assert.AreEqual(0x00, value);
95             BitHelper.SetMaskedValue(ref value, 0x1234, 0, 13);
96             Assert.AreEqual(0x1234, value);
97             BitHelper.SetMaskedValue(ref value, 0xFFFFFFFF, 0, 32);
98             Assert.AreEqual(0xFFFFFFFF, value);
99             BitHelper.SetMaskedValue(ref value, 0x28, 4, 1);
100             Assert.AreEqual(0xFFFFFFEF, value);
101         }
102 
103         [Test]
ShouldSetQuadWordMaskedValue()104         public void ShouldSetQuadWordMaskedValue()
105         {
106             ulong value = 0x00;
107             BitHelper.SetMaskedValue(ref value, 0, 0, 0);
108             Assert.AreEqual(0x00, value);
109             BitHelper.SetMaskedValue(ref value, 0x1234, 32, 0);
110             Assert.AreEqual(0x00, value);
111             BitHelper.SetMaskedValue(ref value, 0x1234, 0, 13);
112             Assert.AreEqual(0x1234, value);
113             BitHelper.SetMaskedValue(ref value, 0xFFFFFFFFFFFFFFF, 0, 64);
114             Assert.AreEqual(0xFFFFFFFFFFFFFFF, value);
115             BitHelper.SetMaskedValue(ref value, 0x28, 4, 1);
116             Assert.AreEqual(0xFFFFFFFFFFFFFEF, value);
117         }
118     }
119 }
120