mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2026-01-16 15:03:50 -08:00
Change to file-scoped namespaces
This commit is contained in:
@@ -13,154 +13,153 @@ using FourNumbers = System.ValueTuple<float, float, float, float>;
|
||||
using static System.Environment;
|
||||
using static Games.Common.IO.Strings;
|
||||
|
||||
namespace Games.Common.IO.TextIOTests
|
||||
namespace Games.Common.IO.TextIOTests;
|
||||
|
||||
public class ReadMethodTests
|
||||
{
|
||||
public class ReadMethodTests
|
||||
[Theory]
|
||||
[MemberData(nameof(ReadStringTestCases))]
|
||||
[MemberData(nameof(Read2StringsTestCases))]
|
||||
[MemberData(nameof(ReadNumberTestCases))]
|
||||
[MemberData(nameof(Read2NumbersTestCases))]
|
||||
[MemberData(nameof(Read3NumbersTestCases))]
|
||||
[MemberData(nameof(Read4NumbersTestCases))]
|
||||
[MemberData(nameof(ReadNumbersTestCases))]
|
||||
public void ReadingValuesHasExpectedPromptsAndResults<T>(
|
||||
Func<IReadWrite, T> read,
|
||||
string input,
|
||||
string expectedOutput,
|
||||
T expectedResult)
|
||||
{
|
||||
[Theory]
|
||||
[MemberData(nameof(ReadStringTestCases))]
|
||||
[MemberData(nameof(Read2StringsTestCases))]
|
||||
[MemberData(nameof(ReadNumberTestCases))]
|
||||
[MemberData(nameof(Read2NumbersTestCases))]
|
||||
[MemberData(nameof(Read3NumbersTestCases))]
|
||||
[MemberData(nameof(Read4NumbersTestCases))]
|
||||
[MemberData(nameof(ReadNumbersTestCases))]
|
||||
public void ReadingValuesHasExpectedPromptsAndResults<T>(
|
||||
Func<IReadWrite, T> read,
|
||||
string input,
|
||||
string expectedOutput,
|
||||
T expectedResult)
|
||||
{
|
||||
var inputReader = new StringReader(input + Environment.NewLine);
|
||||
var outputWriter = new StringWriter();
|
||||
var io = new TextIO(inputReader, outputWriter);
|
||||
var inputReader = new StringReader(input + Environment.NewLine);
|
||||
var outputWriter = new StringWriter();
|
||||
var io = new TextIO(inputReader, outputWriter);
|
||||
|
||||
var result = read.Invoke(io);
|
||||
var output = outputWriter.ToString();
|
||||
var result = read.Invoke(io);
|
||||
var output = outputWriter.ToString();
|
||||
|
||||
using var _ = new AssertionScope();
|
||||
output.Should().Be(expectedOutput);
|
||||
result.Should().BeEquivalentTo(expectedResult);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ReadNumbers_ArrayEmpty_ThrowsArgumentException()
|
||||
{
|
||||
var io = new TextIO(new StringReader(""), new StringWriter());
|
||||
|
||||
Action readNumbers = () => io.ReadNumbers("foo", Array.Empty<float>());
|
||||
|
||||
readNumbers.Should().Throw<ArgumentException>()
|
||||
.WithMessage("'values' must have a non-zero length.*")
|
||||
.WithParameterName("values");
|
||||
}
|
||||
|
||||
public static TheoryData<Func<IReadWrite, string>, string, string, string> ReadStringTestCases()
|
||||
{
|
||||
static Func<IReadWrite, string> ReadString(string prompt) => io => io.ReadString(prompt);
|
||||
|
||||
return new()
|
||||
{
|
||||
{ ReadString("Name"), "", "Name? ", "" },
|
||||
{ ReadString("prompt"), " foo ,bar", $"prompt? {ExtraInput}{NewLine}", "foo" }
|
||||
};
|
||||
}
|
||||
|
||||
public static TheoryData<Func<IReadWrite, TwoStrings>, string, string, TwoStrings> Read2StringsTestCases()
|
||||
{
|
||||
static Func<IReadWrite, TwoStrings> Read2Strings(string prompt) => io => io.Read2Strings(prompt);
|
||||
|
||||
return new()
|
||||
{
|
||||
{ Read2Strings("2 strings"), ",", "2 strings? ", ("", "") },
|
||||
{
|
||||
Read2Strings("Input please"),
|
||||
$"{NewLine}x,y",
|
||||
$"Input please? ?? {ExtraInput}{NewLine}",
|
||||
("", "x")
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static TheoryData<Func<IReadWrite, float>, string, string, float> ReadNumberTestCases()
|
||||
{
|
||||
static Func<IReadWrite, float> ReadNumber(string prompt) => io => io.ReadNumber(prompt);
|
||||
|
||||
return new()
|
||||
{
|
||||
{ ReadNumber("Age"), $"{NewLine}42,", $"Age? {NumberExpected}{NewLine}? {ExtraInput}{NewLine}", 42 },
|
||||
{ ReadNumber("Guess"), "3,4,5", $"Guess? {ExtraInput}{NewLine}", 3 }
|
||||
};
|
||||
}
|
||||
|
||||
public static TheoryData<Func<IReadWrite, TwoNumbers>, string, string, TwoNumbers> Read2NumbersTestCases()
|
||||
{
|
||||
static Func<IReadWrite, TwoNumbers> Read2Numbers(string prompt) => io => io.Read2Numbers(prompt);
|
||||
|
||||
return new()
|
||||
{
|
||||
{ Read2Numbers("Point"), "3,4,5", $"Point? {ExtraInput}{NewLine}", (3, 4) },
|
||||
{
|
||||
Read2Numbers("Foo"),
|
||||
$"x,4,5{NewLine}4,5,x",
|
||||
$"Foo? {NumberExpected}{NewLine}? {ExtraInput}{NewLine}",
|
||||
(4, 5)
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static TheoryData<Func<IReadWrite, ThreeNumbers>, string, string, ThreeNumbers> Read3NumbersTestCases()
|
||||
{
|
||||
static Func<IReadWrite, ThreeNumbers> Read3Numbers(string prompt) => io => io.Read3Numbers(prompt);
|
||||
|
||||
return new()
|
||||
{
|
||||
{ Read3Numbers("Point"), "3.2, 4.3, 5.4, 6.5", $"Point? {ExtraInput}{NewLine}", (3.2F, 4.3F, 5.4F) },
|
||||
{
|
||||
Read3Numbers("Bar"),
|
||||
$"x,4,5{NewLine}4,5,x{NewLine}6,7,8,y",
|
||||
$"Bar? {NumberExpected}{NewLine}? {NumberExpected}{NewLine}? {ExtraInput}{NewLine}",
|
||||
(6, 7, 8)
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static TheoryData<Func<IReadWrite, FourNumbers>, string, string, FourNumbers> Read4NumbersTestCases()
|
||||
{
|
||||
static Func<IReadWrite, FourNumbers> Read4Numbers(string prompt) => io => io.Read4Numbers(prompt);
|
||||
|
||||
return new()
|
||||
{
|
||||
{ Read4Numbers("Point"), "3,4,5,6,7", $"Point? {ExtraInput}{NewLine}", (3, 4, 5, 6) },
|
||||
{
|
||||
Read4Numbers("Baz"),
|
||||
$"x,4,5,6{NewLine} 4, 5 , 6,7 ,x",
|
||||
$"Baz? {NumberExpected}{NewLine}? {ExtraInput}{NewLine}",
|
||||
(4, 5, 6, 7)
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static TheoryData<Func<IReadWrite, IReadOnlyList<float>>, string, string, float[]> ReadNumbersTestCases()
|
||||
{
|
||||
static Func<IReadWrite, IReadOnlyList<float>> ReadNumbers(string prompt) =>
|
||||
io =>
|
||||
{
|
||||
var numbers = new float[6];
|
||||
io.ReadNumbers(prompt, numbers);
|
||||
return numbers;
|
||||
};
|
||||
|
||||
return new()
|
||||
{
|
||||
{ ReadNumbers("Primes"), "2, 3, 5, 7, 11, 13", $"Primes? ", new float[] { 2, 3, 5, 7, 11, 13 } },
|
||||
{
|
||||
ReadNumbers("Qux"),
|
||||
$"42{NewLine}3.141, 2.718{NewLine}3.0e8, 6.02e23{NewLine}9.11E-28",
|
||||
$"Qux? ?? ?? ?? ",
|
||||
new[] { 42, 3.141F, 2.718F, 3.0e8F, 6.02e23F, 9.11E-28F }
|
||||
}
|
||||
};
|
||||
}
|
||||
using var _ = new AssertionScope();
|
||||
output.Should().Be(expectedOutput);
|
||||
result.Should().BeEquivalentTo(expectedResult);
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ReadNumbers_ArrayEmpty_ThrowsArgumentException()
|
||||
{
|
||||
var io = new TextIO(new StringReader(""), new StringWriter());
|
||||
|
||||
Action readNumbers = () => io.ReadNumbers("foo", Array.Empty<float>());
|
||||
|
||||
readNumbers.Should().Throw<ArgumentException>()
|
||||
.WithMessage("'values' must have a non-zero length.*")
|
||||
.WithParameterName("values");
|
||||
}
|
||||
|
||||
public static TheoryData<Func<IReadWrite, string>, string, string, string> ReadStringTestCases()
|
||||
{
|
||||
static Func<IReadWrite, string> ReadString(string prompt) => io => io.ReadString(prompt);
|
||||
|
||||
return new()
|
||||
{
|
||||
{ ReadString("Name"), "", "Name? ", "" },
|
||||
{ ReadString("prompt"), " foo ,bar", $"prompt? {ExtraInput}{NewLine}", "foo" }
|
||||
};
|
||||
}
|
||||
|
||||
public static TheoryData<Func<IReadWrite, TwoStrings>, string, string, TwoStrings> Read2StringsTestCases()
|
||||
{
|
||||
static Func<IReadWrite, TwoStrings> Read2Strings(string prompt) => io => io.Read2Strings(prompt);
|
||||
|
||||
return new()
|
||||
{
|
||||
{ Read2Strings("2 strings"), ",", "2 strings? ", ("", "") },
|
||||
{
|
||||
Read2Strings("Input please"),
|
||||
$"{NewLine}x,y",
|
||||
$"Input please? ?? {ExtraInput}{NewLine}",
|
||||
("", "x")
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static TheoryData<Func<IReadWrite, float>, string, string, float> ReadNumberTestCases()
|
||||
{
|
||||
static Func<IReadWrite, float> ReadNumber(string prompt) => io => io.ReadNumber(prompt);
|
||||
|
||||
return new()
|
||||
{
|
||||
{ ReadNumber("Age"), $"{NewLine}42,", $"Age? {NumberExpected}{NewLine}? {ExtraInput}{NewLine}", 42 },
|
||||
{ ReadNumber("Guess"), "3,4,5", $"Guess? {ExtraInput}{NewLine}", 3 }
|
||||
};
|
||||
}
|
||||
|
||||
public static TheoryData<Func<IReadWrite, TwoNumbers>, string, string, TwoNumbers> Read2NumbersTestCases()
|
||||
{
|
||||
static Func<IReadWrite, TwoNumbers> Read2Numbers(string prompt) => io => io.Read2Numbers(prompt);
|
||||
|
||||
return new()
|
||||
{
|
||||
{ Read2Numbers("Point"), "3,4,5", $"Point? {ExtraInput}{NewLine}", (3, 4) },
|
||||
{
|
||||
Read2Numbers("Foo"),
|
||||
$"x,4,5{NewLine}4,5,x",
|
||||
$"Foo? {NumberExpected}{NewLine}? {ExtraInput}{NewLine}",
|
||||
(4, 5)
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static TheoryData<Func<IReadWrite, ThreeNumbers>, string, string, ThreeNumbers> Read3NumbersTestCases()
|
||||
{
|
||||
static Func<IReadWrite, ThreeNumbers> Read3Numbers(string prompt) => io => io.Read3Numbers(prompt);
|
||||
|
||||
return new()
|
||||
{
|
||||
{ Read3Numbers("Point"), "3.2, 4.3, 5.4, 6.5", $"Point? {ExtraInput}{NewLine}", (3.2F, 4.3F, 5.4F) },
|
||||
{
|
||||
Read3Numbers("Bar"),
|
||||
$"x,4,5{NewLine}4,5,x{NewLine}6,7,8,y",
|
||||
$"Bar? {NumberExpected}{NewLine}? {NumberExpected}{NewLine}? {ExtraInput}{NewLine}",
|
||||
(6, 7, 8)
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static TheoryData<Func<IReadWrite, FourNumbers>, string, string, FourNumbers> Read4NumbersTestCases()
|
||||
{
|
||||
static Func<IReadWrite, FourNumbers> Read4Numbers(string prompt) => io => io.Read4Numbers(prompt);
|
||||
|
||||
return new()
|
||||
{
|
||||
{ Read4Numbers("Point"), "3,4,5,6,7", $"Point? {ExtraInput}{NewLine}", (3, 4, 5, 6) },
|
||||
{
|
||||
Read4Numbers("Baz"),
|
||||
$"x,4,5,6{NewLine} 4, 5 , 6,7 ,x",
|
||||
$"Baz? {NumberExpected}{NewLine}? {ExtraInput}{NewLine}",
|
||||
(4, 5, 6, 7)
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static TheoryData<Func<IReadWrite, IReadOnlyList<float>>, string, string, float[]> ReadNumbersTestCases()
|
||||
{
|
||||
static Func<IReadWrite, IReadOnlyList<float>> ReadNumbers(string prompt) =>
|
||||
io =>
|
||||
{
|
||||
var numbers = new float[6];
|
||||
io.ReadNumbers(prompt, numbers);
|
||||
return numbers;
|
||||
};
|
||||
|
||||
return new()
|
||||
{
|
||||
{ ReadNumbers("Primes"), "2, 3, 5, 7, 11, 13", $"Primes? ", new float[] { 2, 3, 5, 7, 11, 13 } },
|
||||
{
|
||||
ReadNumbers("Qux"),
|
||||
$"42{NewLine}3.141, 2.718{NewLine}3.0e8, 6.02e23{NewLine}9.11E-28",
|
||||
$"Qux? ?? ?? ?? ",
|
||||
new[] { 42, 3.141F, 2.718F, 3.0e8F, 6.02e23F, 9.11E-28F }
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,100 +8,99 @@ using Xunit;
|
||||
using static System.Environment;
|
||||
using static Games.Common.IO.Strings;
|
||||
|
||||
namespace Games.Common.IO
|
||||
namespace Games.Common.IO;
|
||||
|
||||
public class TokenReaderTests
|
||||
{
|
||||
public class TokenReaderTests
|
||||
private readonly StringWriter _outputWriter;
|
||||
|
||||
public TokenReaderTests()
|
||||
{
|
||||
private readonly StringWriter _outputWriter;
|
||||
|
||||
public TokenReaderTests()
|
||||
{
|
||||
_outputWriter = new StringWriter();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ReadTokens_QuantityNeededZero_ThrowsArgumentException()
|
||||
{
|
||||
var sut = TokenReader.ForStrings(new TextIO(new StringReader(""), _outputWriter));
|
||||
|
||||
Action readTokens = () => sut.ReadTokens("", 0);
|
||||
|
||||
readTokens.Should().Throw<ArgumentOutOfRangeException>()
|
||||
.WithMessage("'quantityNeeded' must be greater than zero.*")
|
||||
.WithParameterName("quantityNeeded");
|
||||
}
|
||||
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(ReadTokensTestCases))]
|
||||
public void ReadTokens_ReadingValuesHasExpectedPromptsAndResults(
|
||||
string prompt,
|
||||
uint tokenCount,
|
||||
string input,
|
||||
string expectedOutput,
|
||||
string[] expectedResult)
|
||||
{
|
||||
var sut = TokenReader.ForStrings(new TextIO(new StringReader(input + NewLine), _outputWriter));
|
||||
|
||||
var result = sut.ReadTokens(prompt, tokenCount);
|
||||
var output = _outputWriter.ToString();
|
||||
|
||||
using var _ = new AssertionScope();
|
||||
output.Should().Be(expectedOutput);
|
||||
result.Select(t => t.String).Should().BeEquivalentTo(expectedResult);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(ReadNumericTokensTestCases))]
|
||||
public void ReadTokens_Numeric_ReadingValuesHasExpectedPromptsAndResults(
|
||||
string prompt,
|
||||
uint tokenCount,
|
||||
string input,
|
||||
string expectedOutput,
|
||||
float[] expectedResult)
|
||||
{
|
||||
var sut = TokenReader.ForNumbers(new TextIO(new StringReader(input + NewLine), _outputWriter));
|
||||
|
||||
var result = sut.ReadTokens(prompt, tokenCount);
|
||||
var output = _outputWriter.ToString();
|
||||
|
||||
using var _ = new AssertionScope();
|
||||
output.Should().Be(expectedOutput);
|
||||
result.Select(t => t.Number).Should().BeEquivalentTo(expectedResult);
|
||||
}
|
||||
|
||||
public static TheoryData<string, uint, string, string, string[]> ReadTokensTestCases()
|
||||
{
|
||||
return new()
|
||||
{
|
||||
{ "Name", 1, "Bill", "Name? ", new[] { "Bill" } },
|
||||
{ "Names", 2, " Bill , Bloggs ", "Names? ", new[] { "Bill", "Bloggs" } },
|
||||
{ "Names", 2, $" Bill{NewLine}Bloggs ", "Names? ?? ", new[] { "Bill", "Bloggs" } },
|
||||
{
|
||||
"Foo",
|
||||
6,
|
||||
$"1,2{NewLine}\" a,b \"{NewLine},\"\"c,d{NewLine}d\"x,e,f",
|
||||
$"Foo? ?? ?? ?? {ExtraInput}{NewLine}",
|
||||
new[] { "1", "2", " a,b ", "", "", "d\"x" }
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static TheoryData<string, uint, string, string, float[]> ReadNumericTokensTestCases()
|
||||
{
|
||||
return new()
|
||||
{
|
||||
{ "Age", 1, "23", "Age? ", new[] { 23F } },
|
||||
{ "Constants", 2, " 3.141 , 2.71 ", "Constants? ", new[] { 3.141F, 2.71F } },
|
||||
{ "Answer", 1, $"Forty-two{NewLine}42 ", $"Answer? {NumberExpected}{NewLine}? ", new[] { 42F } },
|
||||
{
|
||||
"Foo",
|
||||
6,
|
||||
$"1,2{NewLine}\" a,b \"{NewLine}3, 4 {NewLine}5.6,7,a, b",
|
||||
$"Foo? ?? {NumberExpected}{NewLine}? ?? {ExtraInput}{NewLine}",
|
||||
new[] { 1, 2, 3, 4, 5.6F, 7 }
|
||||
}
|
||||
};
|
||||
}
|
||||
_outputWriter = new StringWriter();
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ReadTokens_QuantityNeededZero_ThrowsArgumentException()
|
||||
{
|
||||
var sut = TokenReader.ForStrings(new TextIO(new StringReader(""), _outputWriter));
|
||||
|
||||
Action readTokens = () => sut.ReadTokens("", 0);
|
||||
|
||||
readTokens.Should().Throw<ArgumentOutOfRangeException>()
|
||||
.WithMessage("'quantityNeeded' must be greater than zero.*")
|
||||
.WithParameterName("quantityNeeded");
|
||||
}
|
||||
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(ReadTokensTestCases))]
|
||||
public void ReadTokens_ReadingValuesHasExpectedPromptsAndResults(
|
||||
string prompt,
|
||||
uint tokenCount,
|
||||
string input,
|
||||
string expectedOutput,
|
||||
string[] expectedResult)
|
||||
{
|
||||
var sut = TokenReader.ForStrings(new TextIO(new StringReader(input + NewLine), _outputWriter));
|
||||
|
||||
var result = sut.ReadTokens(prompt, tokenCount);
|
||||
var output = _outputWriter.ToString();
|
||||
|
||||
using var _ = new AssertionScope();
|
||||
output.Should().Be(expectedOutput);
|
||||
result.Select(t => t.String).Should().BeEquivalentTo(expectedResult);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(ReadNumericTokensTestCases))]
|
||||
public void ReadTokens_Numeric_ReadingValuesHasExpectedPromptsAndResults(
|
||||
string prompt,
|
||||
uint tokenCount,
|
||||
string input,
|
||||
string expectedOutput,
|
||||
float[] expectedResult)
|
||||
{
|
||||
var sut = TokenReader.ForNumbers(new TextIO(new StringReader(input + NewLine), _outputWriter));
|
||||
|
||||
var result = sut.ReadTokens(prompt, tokenCount);
|
||||
var output = _outputWriter.ToString();
|
||||
|
||||
using var _ = new AssertionScope();
|
||||
output.Should().Be(expectedOutput);
|
||||
result.Select(t => t.Number).Should().BeEquivalentTo(expectedResult);
|
||||
}
|
||||
|
||||
public static TheoryData<string, uint, string, string, string[]> ReadTokensTestCases()
|
||||
{
|
||||
return new()
|
||||
{
|
||||
{ "Name", 1, "Bill", "Name? ", new[] { "Bill" } },
|
||||
{ "Names", 2, " Bill , Bloggs ", "Names? ", new[] { "Bill", "Bloggs" } },
|
||||
{ "Names", 2, $" Bill{NewLine}Bloggs ", "Names? ?? ", new[] { "Bill", "Bloggs" } },
|
||||
{
|
||||
"Foo",
|
||||
6,
|
||||
$"1,2{NewLine}\" a,b \"{NewLine},\"\"c,d{NewLine}d\"x,e,f",
|
||||
$"Foo? ?? ?? ?? {ExtraInput}{NewLine}",
|
||||
new[] { "1", "2", " a,b ", "", "", "d\"x" }
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static TheoryData<string, uint, string, string, float[]> ReadNumericTokensTestCases()
|
||||
{
|
||||
return new()
|
||||
{
|
||||
{ "Age", 1, "23", "Age? ", new[] { 23F } },
|
||||
{ "Constants", 2, " 3.141 , 2.71 ", "Constants? ", new[] { 3.141F, 2.71F } },
|
||||
{ "Answer", 1, $"Forty-two{NewLine}42 ", $"Answer? {NumberExpected}{NewLine}? ", new[] { 42F } },
|
||||
{
|
||||
"Foo",
|
||||
6,
|
||||
$"1,2{NewLine}\" a,b \"{NewLine}3, 4 {NewLine}5.6,7,a, b",
|
||||
$"Foo? ?? {NumberExpected}{NewLine}? ?? {ExtraInput}{NewLine}",
|
||||
new[] { 1, 2, 3, 4, 5.6F, 7 }
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,43 +1,42 @@
|
||||
using FluentAssertions;
|
||||
using Xunit;
|
||||
|
||||
namespace Games.Common.IO
|
||||
namespace Games.Common.IO;
|
||||
|
||||
public class TokenTests
|
||||
{
|
||||
public class TokenTests
|
||||
[Theory]
|
||||
[MemberData(nameof(TokenTestCases))]
|
||||
public void Ctor_PopulatesProperties(string value, bool isNumber, float number)
|
||||
{
|
||||
[Theory]
|
||||
[MemberData(nameof(TokenTestCases))]
|
||||
public void Ctor_PopulatesProperties(string value, bool isNumber, float number)
|
||||
{
|
||||
var expected = new { String = value, IsNumber = isNumber, Number = number };
|
||||
var expected = new { String = value, IsNumber = isNumber, Number = number };
|
||||
|
||||
var token = new Token(value);
|
||||
var token = new Token(value);
|
||||
|
||||
token.Should().BeEquivalentTo(expected);
|
||||
}
|
||||
|
||||
public static TheoryData<string, bool, float> TokenTestCases() => new()
|
||||
{
|
||||
{ "", false, float.NaN },
|
||||
{ "abcde", false, float.NaN },
|
||||
{ "123 ", true, 123 },
|
||||
{ "+42 ", true, 42 },
|
||||
{ "-42 ", true, -42 },
|
||||
{ "+3.14159 ", true, 3.14159F },
|
||||
{ "-3.14159 ", true, -3.14159F },
|
||||
{ " 123", false, float.NaN },
|
||||
{ "1.2e4", true, 12000 },
|
||||
{ "2.3e-5", true, 0.000023F },
|
||||
{ "1e100", true, float.MaxValue },
|
||||
{ "-1E100", true, float.MinValue },
|
||||
{ "1E-100", true, 0 },
|
||||
{ "-1e-100", true, 0 },
|
||||
{ "100abc", true, 100 },
|
||||
{ "1,2,3", true, 1 },
|
||||
{ "42,a,b", true, 42 },
|
||||
{ "1.2.3", true, 1.2F },
|
||||
{ "12e.5", false, float.NaN },
|
||||
{ "12e0.5", true, 12 }
|
||||
};
|
||||
token.Should().BeEquivalentTo(expected);
|
||||
}
|
||||
}
|
||||
|
||||
public static TheoryData<string, bool, float> TokenTestCases() => new()
|
||||
{
|
||||
{ "", false, float.NaN },
|
||||
{ "abcde", false, float.NaN },
|
||||
{ "123 ", true, 123 },
|
||||
{ "+42 ", true, 42 },
|
||||
{ "-42 ", true, -42 },
|
||||
{ "+3.14159 ", true, 3.14159F },
|
||||
{ "-3.14159 ", true, -3.14159F },
|
||||
{ " 123", false, float.NaN },
|
||||
{ "1.2e4", true, 12000 },
|
||||
{ "2.3e-5", true, 0.000023F },
|
||||
{ "1e100", true, float.MaxValue },
|
||||
{ "-1E100", true, float.MinValue },
|
||||
{ "1E-100", true, 0 },
|
||||
{ "-1e-100", true, 0 },
|
||||
{ "100abc", true, 100 },
|
||||
{ "1,2,3", true, 1 },
|
||||
{ "42,a,b", true, 42 },
|
||||
{ "1.2.3", true, 1.2F },
|
||||
{ "12e.5", false, float.NaN },
|
||||
{ "12e0.5", true, 12 }
|
||||
};
|
||||
}
|
||||
|
||||
@@ -2,33 +2,32 @@ using System.Linq;
|
||||
using FluentAssertions;
|
||||
using Xunit;
|
||||
|
||||
namespace Games.Common.IO
|
||||
namespace Games.Common.IO;
|
||||
|
||||
public class TokenizerTests
|
||||
{
|
||||
public class TokenizerTests
|
||||
[Theory]
|
||||
[MemberData(nameof(TokenizerTestCases))]
|
||||
public void ParseTokens_SplitsStringIntoExpectedTokens(string input, string[] expected)
|
||||
{
|
||||
[Theory]
|
||||
[MemberData(nameof(TokenizerTestCases))]
|
||||
public void ParseTokens_SplitsStringIntoExpectedTokens(string input, string[] expected)
|
||||
{
|
||||
var result = Tokenizer.ParseTokens(input);
|
||||
var result = Tokenizer.ParseTokens(input);
|
||||
|
||||
result.Select(t => t.ToString()).Should().BeEquivalentTo(expected);
|
||||
}
|
||||
|
||||
public static TheoryData<string, string[]> TokenizerTestCases() => new()
|
||||
{
|
||||
{ "", new[] { "" } },
|
||||
{ "aBc", new[] { "aBc" } },
|
||||
{ " Foo ", new[] { "Foo" } },
|
||||
{ " \" Foo \" ", new[] { " Foo " } },
|
||||
{ " \" Foo ", new[] { " Foo " } },
|
||||
{ "\"\"abc", new[] { "" } },
|
||||
{ "a\"\"bc", new[] { "a\"\"bc" } },
|
||||
{ "\"\"", new[] { "" } },
|
||||
{ ",", new[] { "", "" } },
|
||||
{ " foo ,bar", new[] { "foo", "bar" } },
|
||||
{ "\"a\"bc,de", new[] { "a" } },
|
||||
{ "a\"b,\" c,d\", f ,,g", new[] { "a\"b", " c,d", "f", "", "g" } }
|
||||
};
|
||||
result.Select(t => t.ToString()).Should().BeEquivalentTo(expected);
|
||||
}
|
||||
}
|
||||
|
||||
public static TheoryData<string, string[]> TokenizerTestCases() => new()
|
||||
{
|
||||
{ "", new[] { "" } },
|
||||
{ "aBc", new[] { "aBc" } },
|
||||
{ " Foo ", new[] { "Foo" } },
|
||||
{ " \" Foo \" ", new[] { " Foo " } },
|
||||
{ " \" Foo ", new[] { " Foo " } },
|
||||
{ "\"\"abc", new[] { "" } },
|
||||
{ "a\"\"bc", new[] { "a\"\"bc" } },
|
||||
{ "\"\"", new[] { "" } },
|
||||
{ ",", new[] { "", "" } },
|
||||
{ " foo ,bar", new[] { "foo", "bar" } },
|
||||
{ "\"a\"bc,de", new[] { "a" } },
|
||||
{ "a\"b,\" c,d\", f ,,g", new[] { "a\"b", " c,d", "f", "", "g" } }
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user