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