using System.Collections.Generic; using System.Linq; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using ZoneCodeGenerator.Parsing; using ZoneCodeGenerator.Parsing.C_Header; using ZoneCodeGenerator.Parsing.C_Header.Blocks; using ZoneCodeGenerator.Parsing.C_Header.Tests; using ZoneCodeGenerator.Parsing.Testing; namespace ZoneCodeGeneratorTests.Parsing.C_Header.Tests { [TestClass] public class TestCloseBlockTest { private Mock parserStateMock; private Mock topBlock; private Mock topBlockNameAssignable; private Mock lexerMock; private int tokenOffset; private List tokens; [TestInitialize] public void Setup() { parserStateMock = new Mock(); topBlock = new Mock(parserStateMock.Object, BlockType.None); topBlockNameAssignable = topBlock.As(); parserStateMock.SetupGet(state => state.CurrentBlock).Returns(() => topBlock.Object); tokenOffset = 0; tokens = new List(); lexerMock = new Mock(); lexerMock.Setup(lexer => lexer.PeekToken(It.IsAny())) .Returns((int index) => tokens.ElementAtOrDefault(index + tokenOffset)); lexerMock.Setup(lexer => lexer.NextToken()) .Returns(() => tokens.ElementAtOrDefault(tokenOffset++)); lexerMock.Setup(lexer => lexer.SkipTokens(It.IsAny())) .Callback((int count) => tokenOffset += count); } [TestMethod] public void EnsureRecognizesSimpleCurlyBrackets() { tokens.AddRange(new List { "}", "struct", "test", "{" }); var test = new TestCloseBlock(false); Assert.AreEqual(TokenTestResult.Match, test.PerformTest(parserStateMock.Object, lexerMock.Object, true)); // Be sure there was no name assigned topBlockNameAssignable.Verify(assignable => assignable.AssignName(It.IsAny()), Times.Never()); // Be sure the top block was popped parserStateMock.Verify(state => state.PopBlock()); Assert.AreEqual(1, test.ConsumedTokenCount); } [TestMethod] public void EnsureRecognizesCurlyBracketsWithSemicolon() { tokens.AddRange(new List { "}", ";", "struct", "test", "{" }); var test = new TestCloseBlock(true); Assert.AreEqual(TokenTestResult.Match, test.PerformTest(parserStateMock.Object, lexerMock.Object)); // Be sure there was no name assigned topBlockNameAssignable.Verify(assignable => assignable.AssignName(It.IsAny()), Times.Never()); // Be sure the top block was popped parserStateMock.Verify(state => state.PopBlock()); Assert.AreEqual(2, test.ConsumedTokenCount); } [TestMethod] public void EnsureFailsWithoutSemicolonIfRequired() { tokens.AddRange(new List { "}", "struct", "test", "{" }); var test = new TestCloseBlock(true); Assert.ThrowsException(() => test.PerformTest(parserStateMock.Object, lexerMock.Object)); // Be sure there was no name assigned topBlockNameAssignable.Verify(assignable => assignable.AssignName(It.IsAny()), Times.Never()); parserStateMock.Verify(state => state.PopBlock(), Times.Never()); } [TestMethod] public void EnsureAssignsName() { tokens.AddRange(new List { "}", "closing_name", ";", "struct", "test", "{" }); var test = new TestCloseBlock(true); Assert.AreEqual(TokenTestResult.Match, test.PerformTest(parserStateMock.Object, lexerMock.Object)); topBlockNameAssignable.Verify(assignable => assignable.AssignName("closing_name")); topBlockNameAssignable.VerifyNoOtherCalls(); // Be sure the top block was popped parserStateMock.Verify(state => state.PopBlock()); Assert.AreEqual(3, test.ConsumedTokenCount); } [TestMethod] public void EnsureFailsIfCannotAssignName() { tokens.AddRange(new List { "}", "closing_name", ";", "struct", "test", "{" }); // No INameAssignable interface implemented topBlock = new Mock(parserStateMock.Object, BlockType.None); var test = new TestCloseBlock(true); Assert.ThrowsException(() => test.PerformTest(parserStateMock.Object, lexerMock.Object)); parserStateMock.Verify(state => state.PopBlock(), Times.Never()); } [TestMethod] public void EnsureDoesNotMatchIfNoCurlyBracket() { tokens.AddRange(new List { "{", "}", "struct", "test", "{" }); var test = new TestCloseBlock(false); Assert.AreEqual(TokenTestResult.NoMatch, test.PerformTest(parserStateMock.Object, lexerMock.Object)); parserStateMock.Verify(state => state.PopBlock(), Times.Never()); Assert.AreEqual(0, test.ConsumedTokenCount); } } }