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 TestNamespaceTest { private Mock parserStateMock; private Block pushedBlock; private Mock lexerMock; private int tokenOffset; private List tokens; [TestInitialize] public void Setup() { parserStateMock = new Mock(); pushedBlock = null; parserStateMock.Setup(state => state.PushBlock(It.IsAny())) .Callback((Block block) => pushedBlock = block); 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 EnsureAcceptsNamespaceDeclaration() { tokens.AddRange(new List { "namespace", "some_namespace", "{" }); var test = new TestNamespace(); Assert.AreEqual(TokenTestResult.Match, test.PerformTest(parserStateMock.Object, lexerMock.Object)); Assert.AreEqual(3, test.ConsumedTokenCount); parserStateMock.Verify(state => state.PushBlock(It.IsAny())); parserStateMock.VerifyNoOtherCalls(); if (pushedBlock is BlockNamespace namespaceBlock) { Assert.AreEqual("some_namespace", namespaceBlock.Name); } else Assert.Fail("Pushed block is supposed to be a namespace"); } [TestMethod] public void EnsureAcceptsNamespacesWithSpecialCharacters() { tokens.AddRange(new List { "namespace", "$omeW3irdN4m3sp4c3", "{" }); var test = new TestNamespace(); Assert.AreEqual(TokenTestResult.Match, test.PerformTest(parserStateMock.Object, lexerMock.Object)); Assert.AreEqual(3, test.ConsumedTokenCount); parserStateMock.Verify(state => state.PushBlock(It.IsAny())); parserStateMock.VerifyNoOtherCalls(); if (pushedBlock is BlockNamespace namespaceBlock) { Assert.AreEqual("$omeW3irdN4m3sp4c3", namespaceBlock.Name); } else Assert.Fail("Pushed block is supposed to be a namespace"); } [TestMethod] public void EnsureCanOnlyHaveOneNamespaceName() { tokens.AddRange(new List { "namespace", "namespace_name", "another_namespace_name", "{" }); var test = new TestNamespace(); Assert.AreEqual(TokenTestResult.NoMatch, test.PerformTest(parserStateMock.Object, lexerMock.Object)); Assert.AreEqual(0, test.ConsumedTokenCount); parserStateMock.VerifyNoOtherCalls(); } [TestMethod] public void EnsureNeedsOpeningCurlyBrackets() { tokens.AddRange(new List { "namespace", "namespace_name", "" }); var test = new TestNamespace(); Assert.AreEqual(TokenTestResult.NoMatch, test.PerformTest(parserStateMock.Object, lexerMock.Object)); Assert.AreEqual(0, test.ConsumedTokenCount); parserStateMock.VerifyNoOtherCalls(); } [TestMethod] public void EnsureRejectsNameWithDigitAsFirstCharacter() { tokens.AddRange(new List { "namespace", "1ns", "{" }); var test = new TestNamespace(); Assert.AreEqual(TokenTestResult.NoMatch, test.PerformTest(parserStateMock.Object, lexerMock.Object)); Assert.AreEqual(0, test.ConsumedTokenCount); parserStateMock.VerifyNoOtherCalls(); } } }