public string PeekWithBufferingUntil_PeeksAllCharactersUntilAnyGivenCharWithoutConsuming(string text, char[] breakingCharactersArray)
        {
            //Arrange
            _stringReader = new StringReader(text);
            _peekableStringReaderAdapter = new PeekableStringReaderAdapter(_stringReader);

            //Act
            var peekedCharacters = _peekableStringReaderAdapter.PeekWithBufferingUntil(breakingCharactersArray);

            //Assert
            Assert.AreEqual(peekedCharacters[0], (char)_peekableStringReaderAdapter.Peek());
            return(peekedCharacters);
        }
        public void ConsumeBuffer_ClearsBuffer()
        {
            // Arrange
            string testText = "#consumed part/not consumed part";

            _stringReader = new StringReader(testText);
            _peekableStringReaderAdapter = new PeekableStringReaderAdapter(_stringReader);

            var peekedPart = _peekableStringReaderAdapter.PeekWithBufferingUntil('/');

            Assert.AreEqual(peekedPart[0], _peekableStringReaderAdapter.Peek());

            //Act
            _peekableStringReaderAdapter.ConsumeBuffer();

            //Assert
            Assert.AreNotEqual(peekedPart[0], _peekableStringReaderAdapter.Peek());
        }
        public void ReadPeekRead_ReturnsProperCharacters()
        {
            //Arrange
            string testText = "abcdefg";

            _stringReader = new StringReader(testText);
            _peekableStringReaderAdapter = new PeekableStringReaderAdapter(_stringReader);

            //Act/Assert
            var readChar = (char)_peekableStringReaderAdapter.Read();

            Assert.AreEqual('a', readChar);
            var peekedChar = (char)_peekableStringReaderAdapter.Peek();

            Assert.AreEqual(peekedChar, (char)_peekableStringReaderAdapter.Peek());
            readChar = (char)_peekableStringReaderAdapter.Read();
            Assert.AreEqual(peekedChar, readChar);
        }
        public void PeekWithBuffering_PeeksProperly()
        {
            //Arrange
            string testText = "abcdefg";

            _stringReader = new StringReader(testText);
            _peekableStringReaderAdapter = new PeekableStringReaderAdapter(_stringReader);

            //Act/Assert
            var peekedChar = (char)_peekableStringReaderAdapter.PeekWithBuffering();

            Assert.AreEqual('a', peekedChar);
            peekedChar = (char)_peekableStringReaderAdapter.PeekWithBuffering();
            Assert.AreEqual('b', peekedChar);
            peekedChar = (char)_peekableStringReaderAdapter.PeekWithBuffering();
            Assert.AreEqual('c', peekedChar);
            peekedChar = (char)_peekableStringReaderAdapter.Peek();
            Assert.AreEqual('a', peekedChar);
            var readChar = (char)_peekableStringReaderAdapter.Read();

            Assert.AreEqual(peekedChar, readChar);
        }
예제 #5
0
        public virtual JObject Parse(string data)
        {
            using (var reader = new PeekableStringReaderAdapter(new StringReader(data)))
            {
                JToken currentObject = new JObject();

                int currentIndentCount, lastIndentCount = 0;

                while (true)
                {
                    var line = reader.ReadLine();

                    if (line == null)
                    {
                        break;
                    }

                    if (line.StartsWith("GPU"))
                    {
                        line = line.Replace(":", "_");
                    }

                    var separatorIndex = line.IndexOf(":");
                    var isPropertyLine = line.IndexOf(" : ") >= 0;
                    var trimmedLine    = line.Trim();

                    //empty lines
                    if (trimmedLine.Length == 0)
                    {
                        continue;
                    }

                    //comment lines
                    if (trimmedLine.StartsWith("="))
                    {
                        continue;
                    }

                    currentIndentCount = GetIndentCount(line);

                    //a property with an object structure
                    if (!isPropertyLine)
                    {
                        //this is a child property deeper in the hierarchy, as the object name is at the same indentation as the last property
                        if (currentIndentCount == lastIndentCount)
                        {
                            currentObject[trimmedLine] = new JObject();
                            currentObject   = currentObject[trimmedLine] as JObject;
                            lastIndentCount = currentIndentCount;
                            continue;
                        }

                        //we have moved back up the property list
                        if (currentIndentCount < lastIndentCount)
                        {
                            //for every indent we're moving back we need to iterate the parent twice.
                            //this is because the first parent is a property and we need to find the \
                            //object containing it which will always be the second parent
                            for (int x = 0; x < (lastIndentCount - currentIndentCount) * 2; x++)
                            {
                                currentObject = currentObject.Parent;
                            }

                            currentObject[trimmedLine] = new JObject();
                            currentObject   = currentObject[trimmedLine] as JObject;
                            lastIndentCount = currentIndentCount;
                            continue;
                        }

                        currentObject   = currentObject[trimmedLine] = new JObject();
                        lastIndentCount = currentIndentCount;
                        continue;
                    }

                    var propertyName  = line.Substring(0, separatorIndex).Trim();
                    var propertyValue = line.Substring(separatorIndex + 1).Trim();

                    string nextLine        = null;
                    int    nextIndentCount = 0;

                    //moving out of the last object
                    if (currentIndentCount < lastIndentCount)
                    {
                        //for every indent we're moving back we need to iterate the parent twice.
                        //this is because the first parent is a property and we need to find the \
                        //object containing it which will always be the second parent
                        for (int x = 0; x < (lastIndentCount - currentIndentCount) * 2; x++)
                        {
                            currentObject = currentObject.Parent;
                        }
                    }
                    else if (currentIndentCount > lastIndentCount)
                    {
                        if (currentObject.Count() == 0)
                        {
                            nextLine        = reader.PeekLine();
                            nextIndentCount = nextLine == null ? 0 : GetIndentCount(nextLine);

                            if (nextLine != null && nextIndentCount > currentIndentCount)
                            {
                                propertyName    = propertyName + "_" + propertyValue;
                                currentObject   = currentObject[propertyName] = new JObject();
                                lastIndentCount = nextIndentCount;
                            }
                            else
                            {
                                currentObject[propertyName] = propertyValue;
                                lastIndentCount             = currentIndentCount;
                            }

                            continue;
                        }
                    }
                    nextLine        = reader.PeekLine();
                    nextIndentCount = nextLine == null ? 0 : GetIndentCount(nextLine);

                    if (nextLine != null && nextIndentCount > currentIndentCount)
                    {
                        propertyName    = propertyName + "_" + propertyValue;
                        currentObject   = currentObject[propertyName] = new JObject();
                        lastIndentCount = nextIndentCount;
                    }
                    else
                    {
                        currentObject[propertyName] = propertyValue;
                        lastIndentCount             = currentIndentCount;
                    }
                }

                while (currentObject.Parent != null)
                {
                    currentObject = currentObject.Parent;
                }

                return(currentObject as JObject);
            }
        }
예제 #6
0
        public void Initialize(string text)
        {
            StringReader underlyingReader = new StringReader(text);

            _reader = new PeekableStringReaderAdapter(underlyingReader);
        }