public void ReadingInputWithSymbolTokens_ReturnSymbolTokens(string input, params char[] expected)
        {
            PositionedChar[]      chars  = PositionedChar.GetFromString(input);
            IReadOnlyList <Token> tokens = TokenReaderHelpers.ReadTokens(chars);

            tokens = tokens.Where(x => !x.IsWhiteSpaceToken()).ToList();

            Assert.Equal(tokens.Count, expected.Length);

            for (int i = 0; i < expected.Length; i++)
            {
                char value = tokens[i].CastToSymbolToken().StringValue[0];
                Assert.Equal(expected[i], value);
            }
        }
        public void InputWithNumber_ReadsNumberTokens()
        {
            string input = " 4  4.44  .44 .4 ";

            PositionedChar[] chars = PositionedChar.GetFromString(input);

            IReadOnlyList <Token> tokens = TokenReaderHelpers.ReadTokens(chars);

            Assert.True(tokens.All(x => x.IsWhiteSpaceToken() || x.IsNumberToken()));

            List <NumberToken> numberTokens = tokens.Where(x => x.IsNumberToken()).Cast <NumberToken>().ToList();

            Assert.Equal(4, numberTokens.Count);
            Assert.Equal(4, numberTokens[0].NumberValue, 10);
            Assert.Equal(4.44, numberTokens[1].NumberValue, 10);
            Assert.Equal(0.44, numberTokens[2].NumberValue, 10);
            Assert.Equal(0.4, numberTokens[3].NumberValue, 10);
        }
        public void ReadingInputWithMixTokens_ReturnsValidTokens()
        {
            PositionedChar[] chars = PositionedChar.GetFromString(
                "123 abc22 .44 true * .test1 test2. 3 false"
                );
            IReadOnlyList <Token> tokens = TokenReaderHelpers.ReadTokens(chars);

            tokens = tokens.Where(x => !x.IsWhiteSpaceToken()).ToList();

            Assert.Equal(11, tokens.Count);

            Assert.Equal(123.0, tokens[0].CastToNumberToken().NumberValue, 10);
            Assert.Equal("abc22", tokens[1].CastToPropertyToken().StringValue);
            Assert.Equal(0.44, tokens[2].CastToNumberToken().NumberValue, 10);
            Assert.True(tokens[3].CastToBoolToken().BoolValue);
            Assert.Equal("*", tokens[4].CastToSymbolToken().StringValue);
            Assert.Equal(".", tokens[5].CastToSymbolToken().StringValue);
            Assert.Equal("test1", tokens[6].CastToPropertyToken().StringValue);
            Assert.Equal("test2", tokens[7].CastToPropertyToken().StringValue);
            Assert.Equal(".", tokens[8].CastToSymbolToken().StringValue);
            Assert.Equal(3.0, tokens[9].CastToNumberToken().NumberValue, 10);
            Assert.False(tokens[10].CastToBoolToken().BoolValue);
        }
        public void InputWithNumberAndExtraPoints_ThrowsException(string input)
        {
            PositionedChar[] chars = PositionedChar.GetFromString(input);

            Assert.Throws <UnrecognizedCharSequence>(() => TokenReaderHelpers.ReadTokens(chars));
        }
 public void ReadingInputWithUnsupportedSymbol_ThrowsException(string input)
 {
     PositionedChar[] chars = PositionedChar.GetFromString(input);
     Assert.Throws <UnrecognizedCharSequence>(() => TokenReaderHelpers.ReadTokens(chars));
 }