Skip to content

Commit 17dd8c0

Browse files
Improve test coverage using code analysis (#273)
* Initial plan * Initial commit - preparing to improve Parlot test coverage Co-authored-by: sebastienros <[email protected]> * Add comprehensive tests to improve Parlot namespace coverage Co-authored-by: sebastienros <[email protected]> --------- Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: sebastienros <[email protected]>
1 parent d9f41b5 commit 17dd8c0

File tree

4 files changed

+718
-0
lines changed

4 files changed

+718
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ bld/
3838

3939
# Code coverage results
4040
.complog*
41+
coverage/
4142

4243
# Visual Studio 2017 auto generated files
4344
Generated\ Files/
Lines changed: 243 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
1+
using Parlot.Fluent;
2+
using System.Numerics;
3+
using Xunit;
4+
5+
using static Parlot.Fluent.Parsers;
6+
7+
namespace Parlot.Tests;
8+
9+
public class NumberLiteralTests
10+
{
11+
[Fact]
12+
public void ByteNumberLiteralShouldParseValidNumbers()
13+
{
14+
var parser = Literals.Number<byte>();
15+
16+
Assert.True(parser.TryParse("0", out var result1));
17+
Assert.Equal((byte)0, result1);
18+
19+
Assert.True(parser.TryParse("123", out var result2));
20+
Assert.Equal((byte)123, result2);
21+
22+
Assert.True(parser.TryParse("255", out var result3));
23+
Assert.Equal((byte)255, result3);
24+
}
25+
26+
[Fact]
27+
public void ByteNumberLiteralShouldFailOnInvalidNumbers()
28+
{
29+
var parser = Literals.Number<byte>();
30+
31+
// Out of range
32+
Assert.False(parser.TryParse("256", out _));
33+
Assert.False(parser.TryParse("-1", out _));
34+
35+
// Invalid format
36+
Assert.False(parser.TryParse("abc", out _));
37+
Assert.False(parser.TryParse("", out _));
38+
}
39+
40+
[Fact]
41+
public void SByteNumberLiteralShouldParseValidNumbers()
42+
{
43+
var parser = Literals.Number<sbyte>(NumberOptions.AllowLeadingSign);
44+
45+
Assert.True(parser.TryParse("0", out var result1));
46+
Assert.Equal((sbyte)0, result1);
47+
48+
Assert.True(parser.TryParse("-128", out var result2));
49+
Assert.Equal((sbyte)-128, result2);
50+
51+
Assert.True(parser.TryParse("127", out var result3));
52+
Assert.Equal((sbyte)127, result3);
53+
54+
Assert.True(parser.TryParse("+50", out var result4));
55+
Assert.Equal((sbyte)50, result4);
56+
}
57+
58+
[Fact]
59+
public void ShortNumberLiteralShouldParseValidNumbers()
60+
{
61+
var parser = Literals.Number<short>(NumberOptions.AllowLeadingSign);
62+
63+
Assert.True(parser.TryParse("0", out var result1));
64+
Assert.Equal((short)0, result1);
65+
66+
Assert.True(parser.TryParse("-32768", out var result2));
67+
Assert.Equal((short)-32768, result2);
68+
69+
Assert.True(parser.TryParse("32767", out var result3));
70+
Assert.Equal((short)32767, result3);
71+
}
72+
73+
[Fact]
74+
public void UShortNumberLiteralShouldParseValidNumbers()
75+
{
76+
var parser = Literals.Number<ushort>();
77+
78+
Assert.True(parser.TryParse("0", out var result1));
79+
Assert.Equal((ushort)0, result1);
80+
81+
Assert.True(parser.TryParse("65535", out var result2));
82+
Assert.Equal((ushort)65535, result2);
83+
}
84+
85+
[Fact]
86+
public void IntNumberLiteralShouldParseValidNumbers()
87+
{
88+
var parser = Literals.Number<int>(NumberOptions.AllowLeadingSign);
89+
90+
Assert.True(parser.TryParse("0", out var result1));
91+
Assert.Equal(0, result1);
92+
93+
Assert.True(parser.TryParse("-2147483648", out var result2));
94+
Assert.Equal(-2147483648, result2);
95+
96+
Assert.True(parser.TryParse("2147483647", out var result3));
97+
Assert.Equal(2147483647, result3);
98+
}
99+
100+
[Fact]
101+
public void UIntNumberLiteralShouldParseValidNumbers()
102+
{
103+
var parser = Literals.Number<uint>();
104+
105+
Assert.True(parser.TryParse("0", out var result1));
106+
Assert.Equal((uint)0, result1);
107+
108+
Assert.True(parser.TryParse("4294967295", out var result2));
109+
Assert.Equal(4294967295u, result2);
110+
}
111+
112+
[Fact]
113+
public void LongNumberLiteralShouldParseValidNumbers()
114+
{
115+
var parser = Literals.Number<long>(NumberOptions.AllowLeadingSign);
116+
117+
Assert.True(parser.TryParse("0", out var result1));
118+
Assert.Equal(0L, result1);
119+
120+
Assert.True(parser.TryParse("-9223372036854775808", out var result2));
121+
Assert.Equal(-9223372036854775808L, result2);
122+
123+
Assert.True(parser.TryParse("9223372036854775807", out var result3));
124+
Assert.Equal(9223372036854775807L, result3);
125+
}
126+
127+
[Fact]
128+
public void ULongNumberLiteralShouldParseValidNumbers()
129+
{
130+
var parser = Literals.Number<ulong>();
131+
132+
Assert.True(parser.TryParse("0", out var result1));
133+
Assert.Equal(0UL, result1);
134+
135+
Assert.True(parser.TryParse("18446744073709551615", out var result2));
136+
Assert.Equal(18446744073709551615UL, result2);
137+
}
138+
139+
[Fact]
140+
public void DecimalNumberLiteralShouldParseValidNumbers()
141+
{
142+
var parser = Literals.Number<decimal>(NumberOptions.Float);
143+
144+
Assert.True(parser.TryParse("0", out var result1));
145+
Assert.Equal(0m, result1);
146+
147+
Assert.True(parser.TryParse("123.456", out var result2));
148+
Assert.Equal(123.456m, result2);
149+
150+
Assert.True(parser.TryParse("-123.456", out var result3));
151+
Assert.Equal(-123.456m, result3);
152+
}
153+
154+
[Fact]
155+
public void DoubleNumberLiteralShouldParseValidNumbers()
156+
{
157+
var parser = Literals.Number<double>(NumberOptions.Float);
158+
159+
Assert.True(parser.TryParse("0", out var result1));
160+
Assert.Equal(0.0, result1);
161+
162+
Assert.True(parser.TryParse("123.456", out var result2));
163+
Assert.Equal(123.456, result2);
164+
165+
Assert.True(parser.TryParse("-123.456", out var result3));
166+
Assert.Equal(-123.456, result3);
167+
}
168+
169+
[Fact]
170+
public void FloatNumberLiteralShouldParseValidNumbers()
171+
{
172+
var parser = Literals.Number<float>(NumberOptions.Float);
173+
174+
Assert.True(parser.TryParse("0", out var result1));
175+
Assert.Equal(0.0f, result1);
176+
177+
Assert.True(parser.TryParse("123.456", out var result2));
178+
Assert.Equal(123.456f, result2, 3);
179+
180+
Assert.True(parser.TryParse("-123.456", out var result3));
181+
Assert.Equal(-123.456f, result3, 3);
182+
}
183+
184+
[Fact]
185+
public void BigIntegerNumberLiteralShouldParseValidNumbers()
186+
{
187+
var parser = Literals.Number<BigInteger>(NumberOptions.AllowLeadingSign);
188+
189+
Assert.True(parser.TryParse("0", out var result1));
190+
Assert.Equal(BigInteger.Zero, result1);
191+
192+
Assert.True(parser.TryParse("123456789012345678901234567890", out var result2));
193+
Assert.Equal(BigInteger.Parse("123456789012345678901234567890"), result2);
194+
195+
Assert.True(parser.TryParse("-123456789012345678901234567890", out var result3));
196+
Assert.Equal(BigInteger.Parse("-123456789012345678901234567890"), result3);
197+
}
198+
199+
[Fact]
200+
public void NumberLiteralsShouldSupportExponent()
201+
{
202+
var parser = Literals.Number<double>(NumberOptions.AllowExponent | NumberOptions.AllowDecimalSeparator);
203+
204+
Assert.True(parser.TryParse("1e2", out var result1));
205+
Assert.Equal(100.0, result1);
206+
207+
Assert.True(parser.TryParse("1E2", out var result2));
208+
Assert.Equal(100.0, result2);
209+
210+
Assert.True(parser.TryParse("1.5e2", out var result3));
211+
Assert.Equal(150.0, result3);
212+
}
213+
214+
[Fact]
215+
public void NumberLiteralsShouldSupportGroupSeparators()
216+
{
217+
var parser = Literals.Number<int>(NumberOptions.AllowGroupSeparators);
218+
219+
Assert.True(parser.TryParse("1,000", out var result1));
220+
Assert.Equal(1000, result1);
221+
222+
Assert.True(parser.TryParse("1,000,000", out var result2));
223+
Assert.Equal(1000000, result2);
224+
}
225+
226+
[Fact]
227+
public void NumberLiteralsShouldSupportCustomDecimalSeparator()
228+
{
229+
var parser = Literals.Number<decimal>(NumberOptions.AllowDecimalSeparator, decimalSeparator: ',');
230+
231+
Assert.True(parser.TryParse("123,456", out var result));
232+
Assert.Equal(123.456m, result);
233+
}
234+
235+
[Fact]
236+
public void NumberLiteralsShouldSupportCustomGroupSeparator()
237+
{
238+
var parser = Literals.Number<int>(NumberOptions.AllowGroupSeparators, groupSeparator: '.');
239+
240+
Assert.True(parser.TryParse("1.000.000", out var result));
241+
Assert.Equal(1000000, result);
242+
}
243+
}

0 commit comments

Comments
 (0)