// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.IO;
using Xunit;
namespace Microsoft.AspNetCore.Razor.Language.Legacy
{
public class TextReaderExtensionsTest
{
[Fact]
public void ReadUntilWithCharReadsAllTextUpToSpecifiedCharacterButNotPast()
{
RunReaderTest("foo bar baz @biz", "foo bar baz ", '@', r => r.ReadUntil('@'));
}
[Fact]
public void ReadUntilWithCharWithInclusiveFlagReadsAllTextUpToSpecifiedCharacterButNotPastIfInclusiveFalse()
{
RunReaderTest("foo bar baz @biz", "foo bar baz ", '@', r => r.ReadUntil('@', inclusive: false));
}
[Fact]
public void ReadUntilWithCharWithInclusiveFlagReadsAllTextUpToAndIncludingSpecifiedCharacterIfInclusiveTrue()
{
RunReaderTest("foo bar baz @biz", "foo bar baz @", 'b', r => r.ReadUntil('@', inclusive: true));
}
[Fact]
public void ReadUntilWithCharReadsToEndIfSpecifiedCharacterNotFound()
{
RunReaderTest("foo bar baz", "foo bar baz", -1, r => r.ReadUntil('@'));
}
[Fact]
public void ReadUntilWithMultipleTerminatorsReadsUntilAnyTerminatorIsFound()
{
RunReaderTest("", " r.ReadUntil('/', '>'));
}
[Fact]
public void ReadUntilWithMultipleTerminatorsHonorsInclusiveFlagWhenFalse()
{
// NOTE: Using named parameters would be difficult here, hence the inline comment
RunReaderTest("", " r.ReadUntil(/* inclusive */ false, '/', '>'));
}
[Fact]
public void ReadUntilWithMultipleTerminatorsHonorsInclusiveFlagWhenTrue()
{
// NOTE: Using named parameters would be difficult here, hence the inline comment
RunReaderTest("", "', r => r.ReadUntil(/* inclusive */ true, '/', '>'));
}
[Fact]
public void ReadUntilWithPredicateStopsWhenPredicateIsTrue()
{
RunReaderTest("foo bar baz 0 zoop zork zoink", "foo bar baz ", '0', r => r.ReadUntil(c => Char.IsDigit(c)));
}
[Fact]
public void ReadUntilWithPredicateHonorsInclusiveFlagWhenFalse()
{
RunReaderTest("foo bar baz 0 zoop zork zoink", "foo bar baz ", '0', r => r.ReadUntil(c => Char.IsDigit(c), inclusive: false));
}
[Fact]
public void ReadUntilWithPredicateHonorsInclusiveFlagWhenTrue()
{
RunReaderTest("foo bar baz 0 zoop zork zoink", "foo bar baz 0", ' ', r => r.ReadUntil(c => Char.IsDigit(c), inclusive: true));
}
[Fact]
public void ReadWhileWithPredicateStopsWhenPredicateIsFalse()
{
RunReaderTest("012345a67890", "012345", 'a', r => r.ReadWhile(c => Char.IsDigit(c)));
}
[Fact]
public void ReadWhileWithPredicateHonorsInclusiveFlagWhenFalse()
{
RunReaderTest("012345a67890", "012345", 'a', r => r.ReadWhile(c => Char.IsDigit(c), inclusive: false));
}
[Fact]
public void ReadWhileWithPredicateHonorsInclusiveFlagWhenTrue()
{
RunReaderTest("012345a67890", "012345a", '6', r => r.ReadWhile(c => Char.IsDigit(c), inclusive: true));
}
private static void RunReaderTest(string testString, string expectedOutput, int expectedPeek, Func action)
{
// Arrange
var reader = new StringReader(testString);
// Act
var read = action(reader);
// Assert
Assert.Equal(expectedOutput, read);
if (expectedPeek == -1)
{
Assert.True(reader.Peek() == -1, "Expected that the reader would be positioned at the end of the input stream");
}
else
{
Assert.Equal((char)expectedPeek, (char)reader.Peek());
}
}
}
}