// // Copyright (c) 2010-2018 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.PlatformDescription; using NUnit.Framework; namespace Antmicro.Renode.UnitTests.PlatformDescription { [TestFixture] public class PreLexerTests { [Test] public void ShouldProcessEmptyFile() { var result = PreLexer.Process(string.Empty); CollectionAssert.AreEquivalent(string.Empty, result.First()); } [Test] public void ShouldProcessSimpleFile() { var source = @"first line second line first indented second indented third line"; var result = PreLexer.Process(source); var expectedResult = SplitUsingNewline(@"first line; second line{ first indented; second indented}; third line"); CollectionAssert.AreEquivalent(expectedResult, result); } [Test] public void ShouldProcessDoubleDedent() { var source = @"first line second line first indented second indented third line"; var result = PreLexer.Process(source); var expectedResult = SplitUsingNewline(@"first line; second line{ first indented; second indented}; third line"); CollectionAssert.AreEquivalent(expectedResult, result); } [Test] public void ShouldProcessDoubleDedentAtTheEndOfFile() { var source = @"first line second line first indented"; var result = PreLexer.Process(source); var expectedResult = SplitUsingNewline(@"first line; second line{ first indented}"); CollectionAssert.AreEquivalent(expectedResult, result); } [Test] public void ShouldProcessTwoLinesWithNoIndent() { var source = @" line1 line2"; var result = PreLexer.Process(source); var expectedResult = SplitUsingNewline(@" line1; line2"); CollectionAssert.AreEquivalent(expectedResult, result); } [Test] public void ShouldProcessTwoLinesWithNoIndentAndSeparation() { var source = @" line1 line2"; var result = PreLexer.Process(source); var expectedResult = SplitUsingNewline(@" line1; line2"); CollectionAssert.AreEquivalent(expectedResult, result); } [Test] public void ShouldHandleEmptyLinesAtTheEndOfSource() { var source = @" line1 line2 "; var result = PreLexer.Process(source); var expectedResult = SplitUsingNewline(@" line1; line2 "); CollectionAssert.AreEquivalent(expectedResult, result); } [Test] public void ShouldNotProcessIndentInBraces() { var source = @" line1 { line2 }"; var result = PreLexer.Process(source); var expectedResult = SplitUsingNewline(@" line1 { line2 }"); CollectionAssert.AreEqual(expectedResult, result); } [Test] public void ShouldHandleCorrectLineComments() { var source = @" line1 { // something line2 }"; var result = PreLexer.Process(source); var expectedResult = SplitUsingNewline(@" line1 { line2 }"); CollectionAssert.AreEqual(expectedResult, result); } [Test] public void ShouldHandleUncorrectLineComments() { var source = @" line1 {// something line2 }"; var result = PreLexer.Process(source); var expectedResult = SplitUsingNewline(@" line1 {// something line2 }"); CollectionAssert.AreEqual(expectedResult, result); } [Test] public void ShouldHandleBeginningLineComment() { var source = @" // something line1 { line2 }"; var result = PreLexer.Process(source); var expectedResult = SplitUsingNewline(@" line1 { line2 }"); CollectionAssert.AreEqual(expectedResult, result); } [Test] public void ShouldHandleLineCommentsAndStrings() { var source = @" line1 ""something with //"" ""another // pseudo comment"" { // and here goes real comment line2 }"; var result = PreLexer.Process(source); var expectedResult = SplitUsingNewline(@" line1 ""something with //"" ""another // pseudo comment"" { line2 }"); CollectionAssert.AreEqual(expectedResult, result); } [Test] public void ShouldFailOnUnterminatedString() { var source = @" line1 ""i'm unterminated"; var result = PreLexer.Process(source); var exception = Assert.Throws(() => result.ToArray()); Assert.AreEqual(ParsingError.SyntaxError, exception.Error); } [Test] public void ShouldHandleMultilineCommentsInOneLine() { var source = @" line1 used as a ruler1234 123456789 1234 line 2/* first comment*/ ""string with /*"" /* second comment */ something"; var result = PreLexer.Process(source); var expectedResult = SplitUsingNewline(@" line1 used as a ruler1234 123456789 1234; line 2 ""string with /*"" something"); CollectionAssert.AreEqual(expectedResult, result); } [Test] public void ShouldHandleMultilineComments() { var source = @" line1/* here we begin here it goes more more here we finish*/ line2"; var result = PreLexer.Process(source); var expectedResult = SplitUsingNewline(@" line1; line2"); CollectionAssert.AreEqual(expectedResult, result); } [Test] public void ShouldHandleMultilineCommentsWithinBraces() { var source = @" line1 { /* here we begin here it goes here the comment ends*/ x: 5 } line2"; var result = PreLexer.Process(source); var expectedResult = SplitUsingNewline(@" line1 { x: 5 }; line2"); CollectionAssert.AreEqual(expectedResult, result); } [Test] public void ShouldFailIfTheMultilineCommentFinishesBeforeEndOfLine() { var source = @" line1 /* here we begin here it goes here the comment ends*/ x: 5 line2"; var result = PreLexer.Process(source); var exception = Assert.Throws(() => result.ToArray()); Assert.AreEqual(ParsingError.SyntaxError, exception.Error); } [Test] public void ShouldProcessBraceInString() { var source = @" line1 ""{ \"" {"" line2"; var result = PreLexer.Process(source); var expectedResult = SplitUsingNewline(@" line1 ""{ \"" {""; line2"); CollectionAssert.AreEqual(expectedResult, result); } [Test] public void ShouldHandleTextOnTheFirstLine() { var source = @"onlyLine"; var result = PreLexer.Process(source).ToArray(); var expectedResult = SplitUsingNewline(@"onlyLine"); CollectionAssert.AreEqual(expectedResult, result); } [Test] public void ShouldHandleInitialIndent() { var source = @" first line second line first indented second indented third line"; var result = PreLexer.Process(source); var exception = Assert.Throws(() => result.ToArray()); Assert.AreEqual(ParsingError.WrongIndent, exception.Error); } [Test] public void ShouldFailOnSingleLineMultilineComment() { var source = @" first line /*something*/ second line"; var result = PreLexer.Process(source); var exception = Assert.Throws(() => result.ToArray()); Assert.AreEqual(ParsingError.SyntaxError, exception.Error); } private static string[] SplitUsingNewline(string source) { return source.Replace("\r", string.Empty).Split(new[] { '\n' }, StringSplitOptions.None); } } }