// // PacketStringEnumeratorTests.cs // // Copyright (c) František Boháček. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System; using System.Linq; using NosSmooth.Packets.Errors; using Xunit; namespace NosSmooth.Packets.Tests; /// /// Test for . /// public class PacketStringEnumeratorTests { /// /// Test that array of complex types can be parsed. /// [Fact] public void EnumeratorListComplexStringGivesCorrectResult() { var stringEnumerator = new PacketStringEnumerator("in 1 11.12.13|14.15.16|17.18.19"); var headerTokenResult = stringEnumerator.GetNextToken(); Assert.True(headerTokenResult.IsSuccess); Assert.False(headerTokenResult.Entity.PacketEndReached); Assert.NotNull(headerTokenResult.Entity.IsLast); Assert.NotNull(headerTokenResult.Entity.EncounteredUpperLevel); Assert.False(headerTokenResult.Entity.IsLast); Assert.False(headerTokenResult.Entity.EncounteredUpperLevel); Assert.Matches("in", headerTokenResult.Entity.Token); var firstToken = stringEnumerator.GetNextToken(); Assert.True(firstToken.IsSuccess); Assert.False(firstToken.Entity.PacketEndReached); Assert.NotNull(firstToken.Entity.IsLast); Assert.NotNull(firstToken.Entity.EncounteredUpperLevel); Assert.False(firstToken.Entity.IsLast); Assert.False(firstToken.Entity.EncounteredUpperLevel); Assert.Matches("1", firstToken.Entity.Token); var listEnumerator = stringEnumerator.CreateLevel('|'); listEnumerator.PrepareLevel('.'); for (int i = 0; i < 3; i++) { var preparedLevel = listEnumerator.CreatePreparedLevel(); Assert.NotNull(preparedLevel); for (int j = 0; j < 3; j++) { string currentNum = (j + (i * 3) + 1 + 10).ToString(); var currentToken = preparedLevel!.Value.GetNextToken(); Assert.True(currentToken.IsSuccess); Assert.False(currentToken.Entity.PacketEndReached); Assert.NotNull(currentToken.Entity.IsLast); Assert.NotNull(currentToken.Entity.EncounteredUpperLevel); if (j == 2 && i == 2) { Assert.True(currentToken.Entity.EncounteredUpperLevel); } else { Assert.False(currentToken.Entity.EncounteredUpperLevel); } if (j != 2) { Assert.False(currentToken.Entity.IsLast); } else { Assert.True(currentToken.Entity.IsLast); } Assert.Matches(currentNum, currentToken.Entity.Token); } Assert.True(preparedLevel!.Value.IsOnLastToken()); } Assert.True(stringEnumerator.IsOnLastToken()); } /// /// Test that over reaching the end is not allowed. /// [Fact] public void EnumeratorDoesNotAllowOvereachingPacketEnd() { var stringEnumerator = new PacketStringEnumerator("in 1 2 3 4"); var tokenResult = stringEnumerator.GetNextToken(); Assert.True(tokenResult.IsSuccess); // in tokenResult = stringEnumerator.GetNextToken(); Assert.True(tokenResult.IsSuccess); // 1 tokenResult = stringEnumerator.GetNextToken(); Assert.True(tokenResult.IsSuccess); // 2 tokenResult = stringEnumerator.GetNextToken(); Assert.True(tokenResult.IsSuccess); // 3 tokenResult = stringEnumerator.GetNextToken(); Assert.True(tokenResult.IsSuccess); // 4 tokenResult = stringEnumerator.GetNextToken(); Assert.False(tokenResult.IsSuccess); Assert.IsType(tokenResult.Error); } /// /// Test that over reaching the end of a list is not allowed. /// [Fact] public void EnumeratorDoesNotAllowOvereachingListComplexTypeEnd() { var stringEnumerator = new PacketStringEnumerator("in 1|2.2|3.3|4.4|5"); var tokenResult = stringEnumerator.GetNextToken(); Assert.True(tokenResult.IsSuccess); // in var listEnumerator = stringEnumerator.CreateLevel('.'); var itemEnumerator = listEnumerator.CreateLevel('|'); tokenResult = itemEnumerator.GetNextToken(); Assert.True(tokenResult.IsSuccess); // 1 tokenResult = itemEnumerator.GetNextToken(); Assert.True(tokenResult.IsSuccess); // 2 Assert.True(tokenResult.Entity.IsLast); tokenResult = itemEnumerator.GetNextToken(); Assert.False(tokenResult.IsSuccess); Assert.IsType(tokenResult.Error); Assert.True(((PacketEndReachedError)tokenResult.Error!).LevelEnd); } /// /// Test that over reaching the length of a list is not allowed. /// [Fact] public void EnumeratorDoesNotAllowOvereachingListLength() { var stringEnumerator = new PacketStringEnumerator("in 1|2.2|3.3|4.4|5"); var tokenResult = stringEnumerator.GetNextToken(); Assert.True(tokenResult.IsSuccess); // in var listEnumerator = stringEnumerator.CreateLevel('.', 2); var itemEnumerator = listEnumerator.CreateLevel('|'); // first item tokenResult = itemEnumerator.GetNextToken(); Assert.True(tokenResult.IsSuccess); tokenResult = itemEnumerator.GetNextToken(); Assert.True(tokenResult.IsSuccess); Assert.True(tokenResult.Entity.IsLast); // second item itemEnumerator = listEnumerator.CreateLevel('|'); tokenResult = itemEnumerator.GetNextToken(); Assert.True(tokenResult.IsSuccess); tokenResult = itemEnumerator.GetNextToken(); Assert.True(tokenResult.IsSuccess); Assert.True(tokenResult.Entity.IsLast); // cannot reach third item Assert.True(listEnumerator.IsOnLastToken()); itemEnumerator = listEnumerator.CreateLevel('|'); tokenResult = itemEnumerator.GetNextToken(); Assert.False(tokenResult.IsSuccess); Assert.IsType(tokenResult.Error); Assert.True(((PacketEndReachedError)tokenResult.Error!).LevelEnd); } /// /// Test that EncounteredUpperLevel is returned if appropriate. /// [Fact] public void EnumeratorReturnsEncounteredUpperLevel() { var stringEnumerator = new PacketStringEnumerator("in 1|2 1"); var tokenResult = stringEnumerator.GetNextToken(); Assert.True(tokenResult.IsSuccess); // in var listEnumerator = stringEnumerator.CreateLevel('.'); var itemEnumerator = listEnumerator.CreateLevel('|'); tokenResult = itemEnumerator.GetNextToken(); Assert.True(tokenResult.IsSuccess); tokenResult = itemEnumerator.GetNextToken(); Assert.True(tokenResult.IsSuccess); Assert.True(tokenResult.Entity.IsLast); Assert.True(tokenResult.Entity.EncounteredUpperLevel); } }