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 using System; 8 using System.Linq; 9 using Antmicro.Renode.Core; 10 using Antmicro.Renode.PlatformDescription; 11 using Antmicro.Renode.PlatformDescription.Syntax; 12 using NUnit.Framework; 13 using Sprache; 14 15 using Range = Antmicro.Renode.Core.Range; 16 17 namespace Antmicro.Renode.UnitTests.PlatformDescription 18 { 19 [TestFixture] 20 public class ParserPrimitivesTest 21 { 22 [Test] ShouldParseHexadecimalLong([Values(R, R, R)] string number)23 public void ShouldParseHexadecimalLong([Values("0x1000", "0x12AB", "0x0ff")] string number) 24 { 25 var input = new Input(number); 26 var result = Grammar.HexadecimalUnsignedLong(input); 27 Assert.IsTrue(result.WasSuccessful, result.Message); 28 Assert.AreEqual(long.Parse(number.Substring(2), System.Globalization.NumberStyles.HexNumber), result.Value); 29 } 30 31 [Test] ShouldParseDecimalRange()32 public void ShouldParseDecimalRange() 33 { 34 var source = "<100, 200>"; 35 var result = Grammar.Range(new Input(source)); 36 Assert.IsTrue(result.WasSuccessful, result.Message); 37 Assert.AreEqual(new Range(100, 100), result.Value.ToRange()); 38 } 39 40 [Test] ShouldParseHexadecimalRange()41 public void ShouldParseHexadecimalRange() 42 { 43 var source = "<0x0, 0x1000>"; 44 var result = Grammar.Range(new Input(source)); 45 Assert.IsTrue(result.WasSuccessful, result.Message); 46 Assert.AreEqual(new Range(0, 0x1000), result.Value.ToRange()); 47 } 48 49 [Test] ShouldParseMixedRangeWithPlus()50 public void ShouldParseMixedRangeWithPlus() 51 { 52 var source = "<100, +0x100>"; 53 var result = Grammar.Range(new Input(source)); 54 Assert.IsTrue(result.WasSuccessful, result.Message); 55 Assert.AreEqual(new Range(100, 0x100), result.Value.ToRange()); 56 } 57 58 [Test] ShouldParseHexadecimalRangeWithPlus()59 public void ShouldParseHexadecimalRangeWithPlus() 60 { 61 var source = "<0x1000, +0x1000>"; 62 var result = Grammar.Range(new Input(source)); 63 Assert.IsTrue(result.WasSuccessful, result.Message); 64 Assert.AreEqual(new Range(0x1000, 0x1000), result.Value.ToRange()); 65 } 66 67 [Test] ShouldNotParseNegativeRange()68 public void ShouldNotParseNegativeRange() 69 { 70 var source = "<0x1000, 0x100>"; 71 var result = Grammar.Range(new Input(source)); 72 Assert.IsFalse(result.WasSuccessful); 73 } 74 75 [Test] ShouldParseNumber( [Values(R, R, R, R, R, R, R, R)] string number)76 public void ShouldParseNumber( 77 [Values("0x1234", "-0x123", "- 0x36", "22", "-13", "- 45", "1.0", "-3.45")] 78 string number) 79 { 80 var source = new Input(number); 81 var result = Grammar.Number.End()(source); 82 Assert.IsTrue(result.WasSuccessful, result.Message); 83 Assert.AreEqual(number.Replace(" ", string.Empty), result.Value); 84 } 85 86 [Test] ShouldNotParseNumber( [Values(R, R, R, R)] string number)87 public void ShouldNotParseNumber( 88 [Values("0xghi", "12 .34", ".45", "345-")] 89 string number) 90 { 91 var source = new Input(number); 92 var result = Grammar.Number.End()(source); 93 Assert.IsFalse(result.WasSuccessful); 94 } 95 96 [Test] ShouldParsePositiveIrqRange()97 public void ShouldParsePositiveIrqRange() 98 { 99 var source = new Input("3 - 5"); 100 var result = Grammar.IrqRange.End()(source); 101 Assert.IsTrue(result.WasSuccessful, result.Message); 102 103 CollectionAssert.AreEquivalent(new[] { 3, 4, 5 }, result.Value); 104 } 105 106 [Test] ShouldParseNegativeIrqRange()107 public void ShouldParseNegativeIrqRange() 108 { 109 var source = new Input("7 - 4"); 110 var result = Grammar.IrqRange.End()(source); 111 Assert.IsTrue(result.WasSuccessful, result.Message); 112 113 CollectionAssert.AreEquivalent(new[] { 7, 6, 5, 4 }, result.Value); 114 } 115 116 [Test] ShouldParseIrqSources()117 public void ShouldParseIrqSources() 118 { 119 var source = new Input("[1,2, 4-6, IRQ]"); 120 var result = Grammar.GetIrqEnds(true).End()(source); 121 Assert.IsTrue(result.WasSuccessful, result.Message); 122 123 var flattenedIrqSources = result.Value.SelectMany(x => x.Ends).ToArray(); 124 Assert.AreEqual(1, flattenedIrqSources[0].Number); 125 Assert.AreEqual(2, flattenedIrqSources[1].Number); 126 Assert.AreEqual(4, flattenedIrqSources[2].Number); 127 Assert.AreEqual(5, flattenedIrqSources[3].Number); 128 Assert.AreEqual(6, flattenedIrqSources[4].Number); 129 Assert.AreEqual("IRQ", flattenedIrqSources[5].PropertyName); 130 } 131 132 [Test] ShouldParseQuotedString()133 public void ShouldParseQuotedString() 134 { 135 var source = new Input("\"some text\""); 136 var result = Grammar.SingleLineQuotedString(source); 137 Assert.IsTrue(result.WasSuccessful, result.Message); 138 139 Assert.AreEqual("some text", result.Value); 140 } 141 142 [Test] ShouldParseQuotedStringWithASemicolon()143 public void ShouldParseQuotedStringWithASemicolon() 144 { 145 var source = new Input ("\"some;text\""); 146 var result = Grammar.SingleLineQuotedString(source); 147 Assert.IsTrue(result.WasSuccessful, result.Message); 148 149 Assert.AreEqual("some;text", result.Value); 150 } 151 } 152 } 153