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); }
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); } }
public void Initialize(string text) { StringReader underlyingReader = new StringReader(text); _reader = new PeekableStringReaderAdapter(underlyingReader); }