using System.Collections.Generic; using System.Linq; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using ZoneCodeGenerator.Domain; using ZoneCodeGenerator.Parsing; using ZoneCodeGenerator.Parsing.C_Header; using ZoneCodeGenerator.Parsing.C_Header.Tests; using ZoneCodeGenerator.Parsing.Testing; namespace ZoneCodeGeneratorTests.Parsing.C_Header.Tests { [TestClass] public class TestForwardDeclTest { private Mock parserStateMock; private ForwardDeclaration addedForwardDeclaration; private Mock lexerMock; private int tokenOffset; private List tokens; private Namespace currentNamespace; [TestInitialize] public void Setup() { currentNamespace = new Namespace(); parserStateMock = new Mock(); parserStateMock.SetupGet(state => state.CurrentNamespace).Returns(() => currentNamespace); parserStateMock.Setup(state => state.AddForwardDeclaration(It.IsAny())) .Callback((ForwardDeclaration forwardDeclaration) => addedForwardDeclaration = forwardDeclaration); 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 EnsureAcceptsForwardDeclarationForEnums() { tokens.AddRange(new List { "enum", "test_enum", ";" }); var test = new TestForwardDecl(); Assert.AreEqual(TokenTestResult.Match, test.PerformTest(parserStateMock.Object, lexerMock.Object)); Assert.AreEqual(3, test.ConsumedTokenCount); parserStateMock.Verify(state => state.AddForwardDeclaration(It.IsAny()), Times.Once()); Assert.AreEqual("", addedForwardDeclaration.Namespace); Assert.AreEqual("test_enum", addedForwardDeclaration.Name); Assert.AreEqual(DataTypeType.Enum, addedForwardDeclaration.Type); } [TestMethod] public void EnsureAcceptsForwardDeclarationForStructs() { tokens.AddRange(new List { "struct", "test_struct", ";" }); var test = new TestForwardDecl(); Assert.AreEqual(TokenTestResult.Match, test.PerformTest(parserStateMock.Object, lexerMock.Object)); Assert.AreEqual(3, test.ConsumedTokenCount); parserStateMock.Verify(state => state.AddForwardDeclaration(It.IsAny()), Times.Once()); Assert.AreEqual("", addedForwardDeclaration.Namespace); Assert.AreEqual("test_struct", addedForwardDeclaration.Name); Assert.AreEqual(DataTypeType.Struct, addedForwardDeclaration.Type); } [TestMethod] public void EnsureAcceptsForwardDeclarationForUnions() { tokens.AddRange(new List { "union", "test_union", ";" }); var test = new TestForwardDecl(); Assert.AreEqual(TokenTestResult.Match, test.PerformTest(parserStateMock.Object, lexerMock.Object)); Assert.AreEqual(3, test.ConsumedTokenCount); parserStateMock.Verify(state => state.AddForwardDeclaration(It.IsAny()), Times.Once()); Assert.AreEqual("", addedForwardDeclaration.Namespace); Assert.AreEqual("test_union", addedForwardDeclaration.Name); Assert.AreEqual(DataTypeType.Union, addedForwardDeclaration.Type); } [TestMethod] public void EnsureRejectsForwardDeclarationForNamespaces() { tokens.AddRange(new List { "namespace", "test_union", ";" }); var test = new TestForwardDecl(); Assert.AreEqual(TokenTestResult.NoMatch, test.PerformTest(parserStateMock.Object, lexerMock.Object)); Assert.AreEqual(0, test.ConsumedTokenCount); } } }