| // |
| // Copyright (c) 2010-2023 Antmicro |
| // |
| // This file is licensed under the MIT License. |
| // Full license text is available in 'licenses/MIT.txt'. |
| // |
| using System; |
| using System.Linq; |
| using Antmicro.Renode.Core; |
| using Antmicro.Renode.PlatformDescription; |
| using Antmicro.Renode.PlatformDescription.Syntax; |
| using NUnit.Framework; |
| using Sprache; |
| |
| using Range = Antmicro.Renode.Core.Range; |
| |
| namespace Antmicro.Renode.UnitTests.PlatformDescription |
| { |
| [TestFixture] |
| public class ParserPrimitivesTest |
| { |
| [Test] |
| public void ShouldParseHexadecimalLong([Values("0x1000", "0x12AB", "0x0ff")] string number) |
| { |
| var input = new Input(number); |
| var result = Grammar.HexadecimalUnsignedLong(input); |
| Assert.IsTrue(result.WasSuccessful, result.Message); |
| Assert.AreEqual(long.Parse(number.Substring(2), System.Globalization.NumberStyles.HexNumber), result.Value); |
| } |
| |
| [Test] |
| public void ShouldParseDecimalRange() |
| { |
| var source = "<100, 200>"; |
| var result = Grammar.Range(new Input(source)); |
| Assert.IsTrue(result.WasSuccessful, result.Message); |
| Assert.AreEqual(new Range(100, 100), result.Value.ToRange()); |
| } |
| |
| [Test] |
| public void ShouldParseHexadecimalRange() |
| { |
| var source = "<0x0, 0x1000>"; |
| var result = Grammar.Range(new Input(source)); |
| Assert.IsTrue(result.WasSuccessful, result.Message); |
| Assert.AreEqual(new Range(0, 0x1000), result.Value.ToRange()); |
| } |
| |
| [Test] |
| public void ShouldParseMixedRangeWithPlus() |
| { |
| var source = "<100, +0x100>"; |
| var result = Grammar.Range(new Input(source)); |
| Assert.IsTrue(result.WasSuccessful, result.Message); |
| Assert.AreEqual(new Range(100, 0x100), result.Value.ToRange()); |
| } |
| |
| [Test] |
| public void ShouldParseHexadecimalRangeWithPlus() |
| { |
| var source = "<0x1000, +0x1000>"; |
| var result = Grammar.Range(new Input(source)); |
| Assert.IsTrue(result.WasSuccessful, result.Message); |
| Assert.AreEqual(new Range(0x1000, 0x1000), result.Value.ToRange()); |
| } |
| |
| [Test] |
| public void ShouldNotParseNegativeRange() |
| { |
| var source = "<0x1000, 0x100>"; |
| var result = Grammar.Range(new Input(source)); |
| Assert.IsFalse(result.WasSuccessful); |
| } |
| |
| [Test] |
| public void ShouldParseNumber( |
| [Values("0x1234", "-0x123", "- 0x36", "22", "-13", "- 45", "1.0", "-3.45")] |
| string number) |
| { |
| var source = new Input(number); |
| var result = Grammar.Number.End()(source); |
| Assert.IsTrue(result.WasSuccessful, result.Message); |
| Assert.AreEqual(number.Replace(" ", string.Empty), result.Value); |
| } |
| |
| [Test] |
| public void ShouldNotParseNumber( |
| [Values("0xghi", "12 .34", ".45", "345-")] |
| string number) |
| { |
| var source = new Input(number); |
| var result = Grammar.Number.End()(source); |
| Assert.IsFalse(result.WasSuccessful); |
| } |
| |
| [Test] |
| public void ShouldParsePositiveIrqRange() |
| { |
| var source = new Input("3 - 5"); |
| var result = Grammar.IrqRange.End()(source); |
| Assert.IsTrue(result.WasSuccessful, result.Message); |
| |
| CollectionAssert.AreEquivalent(new[] { 3, 4, 5 }, result.Value); |
| } |
| |
| [Test] |
| public void ShouldParseNegativeIrqRange() |
| { |
| var source = new Input("7 - 4"); |
| var result = Grammar.IrqRange.End()(source); |
| Assert.IsTrue(result.WasSuccessful, result.Message); |
| |
| CollectionAssert.AreEquivalent(new[] { 7, 6, 5, 4 }, result.Value); |
| } |
| |
| [Test] |
| public void ShouldParseIrqSources() |
| { |
| var source = new Input("[1,2, 4-6, IRQ]"); |
| var result = Grammar.GetIrqEnds(true).End()(source); |
| Assert.IsTrue(result.WasSuccessful, result.Message); |
| |
| var flattenedIrqSources = result.Value.SelectMany(x => x.Ends).ToArray(); |
| Assert.AreEqual(1, flattenedIrqSources[0].Number); |
| Assert.AreEqual(2, flattenedIrqSources[1].Number); |
| Assert.AreEqual(4, flattenedIrqSources[2].Number); |
| Assert.AreEqual(5, flattenedIrqSources[3].Number); |
| Assert.AreEqual(6, flattenedIrqSources[4].Number); |
| Assert.AreEqual("IRQ", flattenedIrqSources[5].PropertyName); |
| } |
| |
| [Test] |
| public void ShouldParseQuotedString() |
| { |
| var source = new Input("\"some text\""); |
| var result = Grammar.SingleLineQuotedString(source); |
| Assert.IsTrue(result.WasSuccessful, result.Message); |
| |
| Assert.AreEqual("some text", result.Value); |
| } |
| |
| [Test] |
| public void ShouldParseQuotedStringWithASemicolon() |
| { |
| var source = new Input ("\"some;text\""); |
| var result = Grammar.SingleLineQuotedString(source); |
| Assert.IsTrue(result.WasSuccessful, result.Message); |
| |
| Assert.AreEqual("some;text", result.Value); |
| } |
| } |
| } |