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