1 //
2 // Copyright (c) 2010-2018 Antmicro
3 // Copyright (c) 2011-2015 Realtime Embedded
4 //
5 // This file is licensed under the MIT License.
6 // Full license text is available in 'licenses/MIT.txt'.
7 //
8 using NUnit.Framework;
9 using System.IO;
10 
11 namespace Antmicro.Renode.CoresSourceParser
12 {
13     [TestFixture]
14     public class RegisterEnumParserTests
15     {
16         [Test]
ShouldParseEnumWithSimpleValue()17         public void ShouldParseEnumWithSimpleValue()
18         {
19             var stream = GetStreamWitString(@"typedef enum {
20                 A_32 = 0
21             } Registers;");
22 
23             var parser = new RegistersEnumParser(stream);
24             Assert.AreEqual(1, parser.Registers.Length);
25             Assert.AreEqual(0, parser.RegisterGroups.Length);
26 
27             Assert.AreEqual("A", parser.Registers[0].Name);
28             Assert.AreEqual(32, parser.Registers[0].Width);
29             Assert.AreEqual(0, parser.Registers[0].Value);
30         }
31 
32         [Test]
ShouldParseEnumWithMultipleValues()33         public void ShouldParseEnumWithMultipleValues()
34         {
35             var stream = GetStreamWitString(@"typedef enum {
36                 A_32 = 0,
37                 B_64 = 1,
38                 C_128 = 2
39             } Registers;");
40 
41             var parser = new RegistersEnumParser(stream);
42             Assert.AreEqual(3, parser.Registers.Length);
43             Assert.AreEqual(0, parser.RegisterGroups.Length);
44 
45             Assert.AreEqual("A", parser.Registers[0].Name);
46             Assert.AreEqual(32, parser.Registers[0].Width);
47             Assert.AreEqual(0, parser.Registers[0].Value);
48 
49             Assert.AreEqual("B", parser.Registers[1].Name);
50             Assert.AreEqual(64, parser.Registers[1].Width);
51             Assert.AreEqual(1, parser.Registers[1].Value);
52 
53             Assert.AreEqual("C", parser.Registers[2].Name);
54             Assert.AreEqual(128, parser.Registers[2].Width);
55             Assert.AreEqual(2, parser.Registers[2].Value);
56         }
57 
58         [Test]
ShouldParseEnumWithUndefinedIfdef()59         public void ShouldParseEnumWithUndefinedIfdef()
60         {
61             var stream = GetStreamWitString(@"typedef enum {
62                 A_32 = 0,
63                 #ifdef XYZ
64                 B_64 = 1,
65                 #endif
66                 C_128 = 2
67             } Registers;");
68 
69             var parser = new RegistersEnumParser(stream);
70             Assert.AreEqual(2, parser.Registers.Length);
71             Assert.AreEqual(0, parser.RegisterGroups.Length);
72 
73             Assert.AreEqual("A", parser.Registers[0].Name);
74             Assert.AreEqual(32, parser.Registers[0].Width);
75             Assert.AreEqual(0, parser.Registers[0].Value);
76 
77             Assert.AreEqual("C", parser.Registers[1].Name);
78             Assert.AreEqual(128, parser.Registers[1].Width);
79             Assert.AreEqual(2, parser.Registers[1].Value);
80         }
81 
82         [Test]
ShouldParseEnumWithDefinedIfdef()83         public void ShouldParseEnumWithDefinedIfdef()
84         {
85             var stream = GetStreamWitString(@"typedef enum {
86                 A_32 = 0,
87                 #ifdef XYZ
88                 B_64 = 1,
89                 #endif
90                 C_128 = 2
91             } Registers;");
92 
93             var parser = new RegistersEnumParser(stream, new [] { "XYZ" });
94             Assert.AreEqual(3, parser.Registers.Length);
95             Assert.AreEqual(0, parser.RegisterGroups.Length);
96 
97             Assert.AreEqual("A", parser.Registers[0].Name);
98             Assert.AreEqual(32, parser.Registers[0].Width);
99             Assert.AreEqual(0, parser.Registers[0].Value);
100 
101             Assert.AreEqual("B", parser.Registers[1].Name);
102             Assert.AreEqual(64, parser.Registers[1].Width);
103             Assert.AreEqual(1, parser.Registers[1].Value);
104 
105             Assert.AreEqual("C", parser.Registers[2].Name);
106             Assert.AreEqual(128, parser.Registers[2].Width);
107             Assert.AreEqual(2, parser.Registers[2].Value);
108         }
109 
110         [Test]
ShouldParseEnumWithMultipleValuesWithIndices()111         public void ShouldParseEnumWithMultipleValuesWithIndices()
112         {
113             var stream = GetStreamWitString(@"typedef enum {
114                 A_1_32 = 15,
115                 A_2_32 = 16,
116                 A_3_32 = 17
117             } Registers;");
118 
119             var parser = new RegistersEnumParser(stream);
120             Assert.AreEqual(0, parser.Registers.Length);
121             Assert.AreEqual(1, parser.RegisterGroups.Length);
122 
123             Assert.AreEqual("A", parser.RegisterGroups[0].Name);
124             Assert.AreEqual(32, parser.RegisterGroups[0].Width);
125             Assert.AreEqual(3, parser.RegisterGroups[0].IndexValueMap.Count);
126             Assert.AreEqual(15, parser.RegisterGroups[0].IndexValueMap[1]);
127             Assert.AreEqual(16, parser.RegisterGroups[0].IndexValueMap[2]);
128             Assert.AreEqual(17, parser.RegisterGroups[0].IndexValueMap[3]);
129         }
130 
131         [Test]
ShouldParseEnumWithCommentOrEmptyLines()132         public void ShouldParseEnumWithCommentOrEmptyLines()
133         {
134             var stream = GetStreamWitString(@"typedef enum {
135 
136                 // Some comment
137                 A_1_32 = 15,
138 
139                 A_2_32 = 16,
140                 //Another comment
141                 A_3_32 = 17
142             } Registers;");
143 
144             var parser = new RegistersEnumParser(stream);
145             Assert.AreEqual(0, parser.Registers.Length);
146             Assert.AreEqual(1, parser.RegisterGroups.Length);
147         }
148 
GetStreamWitString(string text)149         private static Stream GetStreamWitString(string text)
150         {
151             var result = new MemoryStream();
152             var writer = new StreamWriter(result);
153             writer.WriteLine(text);
154             writer.Flush();
155             result.Seek(0, SeekOrigin.Begin);
156 
157             return result;
158         }
159     }
160 }
161 
162