Skip to content

Commit 25bcfc5

Browse files
committed
Initial commit
0 parents  commit 25bcfc5

32 files changed

+1638
-0
lines changed

.github/workflows/ci.yml

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
branches: [main]
8+
9+
jobs:
10+
build-and-test:
11+
runs-on: ubuntu-latest
12+
13+
strategy:
14+
matrix:
15+
dotnet-version: [8.0]
16+
17+
steps:
18+
- uses: actions/checkout@v4
19+
20+
- name: Use .NET ${{ matrix.dotnet-version }}
21+
uses: actions/setup-dotnet@v3
22+
with:
23+
dotnet-version: ${{ matrix.dotnet-version }}
24+
25+
- name: Restore dependencies
26+
run: dotnet restore json-vb.sln
27+
28+
- name: Build
29+
run: dotnet build json-vb.sln --configuration Release --no-restore
30+
31+
- name: Test
32+
run: dotnet test JsonParser.Tests/JsonParser.Tests.vbproj --configuration Release --no-build --verbosity normal --collect:"XPlat Code Coverage"
33+
34+
- name: Upload coverage reports
35+
uses: actions/upload-artifact@v4
36+
with:
37+
name: coverage-report-net-${{ matrix.dotnet-version }}
38+
path: ./JsonParser.Tests/TestResults/*/coverage.cobertura.xml
39+
if-no-files-found: ignore

.gitignore

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# .NET
2+
bin/
3+
obj/
4+
*.user
5+
*.suo
6+
.vs/
7+
packages/
8+
*.nupkg
9+
*.snupkg
10+
*.log
11+
*.tmp
12+
*.cache
13+
*.pdb
14+
*.exe
15+
*.dll
16+
*.dll.config
17+
*.vshost.exe
18+
*.vshost.exe.config
19+
20+
# Build results
21+
[Dd]ebug/
22+
[Rr]elease/
23+
x64/
24+
x86/
25+
26+
# NuGet packages
27+
project.lock.json
28+
project.fragment.lock.json
29+
artifacts/
30+
31+
# IDE
32+
.idea/
33+
*.swp
34+
*.swo
35+
36+
# OS
37+
.DS_Store
38+
Thumbs.db
39+
40+
# Test results
41+
TestResults/
42+
*.trx
43+
44+
# Coverage
45+
*.coverage
46+
*.coveragexml
47+
48+
# Logs
49+
logs/
50+
*.log
51+
52+
# Temporary files
53+
*.tmp
54+
*.temp

CLI/CLI.vbproj

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<RootNamespace>CLI</RootNamespace>
6+
<TargetFramework>net8.0</TargetFramework>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<ProjectReference Include="..\JsonParser\JsonParser.vbproj" />
11+
</ItemGroup>
12+
13+
</Project>

CLI/Program.vb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
Imports JsonParser
2+
Imports System.IO
3+
4+
Module Program
5+
Sub Main(args As String())
6+
Try
7+
' Read all input from standard input
8+
Dim input As String
9+
Using reader As New StreamReader(Console.OpenStandardInput())
10+
input = reader.ReadToEnd()
11+
End Using
12+
13+
' Parse input using JsonParser JSON parser
14+
Dim parsed = JSON.Parse(input)
15+
16+
' Output pretty-printed result
17+
Console.WriteLine(parsed.ToString())
18+
Catch ex As Exception
19+
Console.Error.WriteLine("Error parsing JSON: " & ex.Message)
20+
Environment.Exit(1)
21+
End Try
22+
End Sub
23+
End Module
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<RootNamespace></RootNamespace>
5+
<TargetFramework>net8.0</TargetFramework>
6+
<IsPackable>false</IsPackable>
7+
<IsTestProject>true</IsTestProject>
8+
</PropertyGroup>
9+
10+
<ItemGroup>
11+
<PackageReference Include="xunit" Version="2.6.6" />
12+
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.6" />
13+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0" />
14+
<PackageReference Include="coverlet.collector" Version="6.0.0" />
15+
</ItemGroup>
16+
17+
<ItemGroup>
18+
<ProjectReference Include="..\JsonParser\JsonParser.vbproj" />
19+
</ItemGroup>
20+
21+
</Project>
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
Imports JsonParser.Models
2+
Imports JsonParser.Parsers
3+
Imports Xunit
4+
5+
Namespace JsonParser.Tests.Parsers
6+
7+
Public Class ArrayParserTests
8+
9+
<Fact>
10+
Public Sub Parse_EmptyArray_ReturnsArrayTokenWithNoElements()
11+
Dim token = ArrayParser.Parse("[]")
12+
Assert.NotNull(token)
13+
Assert.Equal(0, token.Elements.Count())
14+
Assert.Equal(2, token.Skip)
15+
End Sub
16+
17+
<Fact>
18+
Public Sub Parse_ArrayOfNumbers_ReturnsArrayTokenWithCorrectElements()
19+
Dim token = ArrayParser.Parse("[1,2,3]")
20+
Assert.NotNull(token)
21+
Assert.Equal(3, token.Elements.Count())
22+
For Each e In token.Elements
23+
Assert.IsType(Of NumberToken)(e)
24+
Next
25+
Assert.Equal(7, token.Skip)
26+
End Sub
27+
28+
<Fact>
29+
Public Sub Parse_ArrayOfStrings_ReturnsArrayTokenWithCorrectElements()
30+
Dim token = ArrayParser.Parse("[""a"",""b""]")
31+
Assert.NotNull(token)
32+
Assert.Equal(2, token.Elements.Count())
33+
For Each e In token.Elements
34+
Assert.IsType(Of StringToken)(e)
35+
Next
36+
Assert.Equal(9, token.Skip)
37+
End Sub
38+
39+
<Fact>
40+
Public Sub Parse_MixedArray_ReturnsArrayTokenWithMixedTypes()
41+
Dim token = ArrayParser.Parse("[1,""a"",true]")
42+
Assert.NotNull(token)
43+
Assert.Equal(3, token.Elements.Count())
44+
Assert.IsType(Of NumberToken)(token.Elements.ElementAt(0))
45+
Assert.IsType(Of StringToken)(token.Elements.ElementAt(1))
46+
Assert.IsType(Of TrueToken)(token.Elements.ElementAt(2))
47+
Assert.Equal(12, token.Skip)
48+
End Sub
49+
50+
<Fact>
51+
Public Sub Parse_NestedArray_ReturnsArrayTokenWithArrayElement()
52+
Dim token = ArrayParser.Parse("[[1],2]")
53+
Assert.NotNull(token)
54+
Assert.Equal(2, token.Elements.Count())
55+
Assert.IsType(Of ArrayToken)(token.Elements.ElementAt(0))
56+
Assert.IsType(Of NumberToken)(token.Elements.ElementAt(1))
57+
Assert.Equal(7, token.Skip)
58+
End Sub
59+
60+
<Fact>
61+
Public Sub Parse_InvalidArray_ThrowsException()
62+
Assert.Throws(Of System.Exception)(Sub() ArrayParser.Parse("[1,]"))
63+
End Sub
64+
65+
End Class
66+
67+
End Namespace
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
Imports System.Text.RegularExpressions
2+
Imports JsonParser.Models
3+
Imports JsonParser.Parsers
4+
Imports Xunit
5+
6+
Namespace JsonParser.Tests.Parsers
7+
8+
Public Class NumberParserTests
9+
10+
<Fact>
11+
Public Sub Parse_Integer_ReturnsNumberToken()
12+
Dim token = JsonParser.Parsers.NumberParser.Parse("123")
13+
Assert.NotNull(token)
14+
Assert.IsType(Of NumberToken)(token)
15+
Assert.Equal(123D, token.Value)
16+
Assert.Equal(3, token.Skip)
17+
End Sub
18+
19+
<Fact>
20+
Public Sub Parse_NegativeInteger_ReturnsNumberToken()
21+
Dim token = JsonParser.Parsers.NumberParser.Parse("-456")
22+
Assert.NotNull(token)
23+
Assert.IsType(Of NumberToken)(token)
24+
Assert.Equal(-456D, token.Value)
25+
Assert.Equal(4, token.Skip)
26+
End Sub
27+
28+
<Fact>
29+
Public Sub Parse_Decimal_ReturnsNumberToken()
30+
Dim token = JsonParser.Parsers.NumberParser.Parse("3.14")
31+
Assert.NotNull(token)
32+
Assert.IsType(Of NumberToken)(token)
33+
Assert.Equal(3.14D, token.Value)
34+
Assert.Equal(4, token.Skip)
35+
End Sub
36+
37+
<Fact>
38+
Public Sub Parse_Zero_ReturnsNumberToken()
39+
Dim token = JsonParser.Parsers.NumberParser.Parse("0")
40+
Assert.NotNull(token)
41+
Assert.IsType(Of NumberToken)(token)
42+
Assert.Equal(0D, token.Value)
43+
Assert.Equal(1, token.Skip)
44+
End Sub
45+
46+
<Fact>
47+
Public Sub Parse_LargeNumber_ReturnsNumberToken()
48+
Dim token = JsonParser.Parsers.NumberParser.Parse("1234567890")
49+
Assert.NotNull(token)
50+
Assert.IsType(Of NumberToken)(token)
51+
Assert.Equal(1234567890D, token.Value)
52+
Assert.Equal(10, token.Skip)
53+
End Sub
54+
55+
<Fact>
56+
Public Sub Parse_InvalidNumber_ThrowsException()
57+
Assert.Throws(Of System.Exception)(Sub() JsonParser.Parsers.NumberParser.Parse("abc"))
58+
End Sub
59+
60+
<Fact>
61+
Public Sub Parse_NumberWithExponent_ReturnsNumberToken()
62+
Dim token = JsonParser.Parsers.NumberParser.Parse("1e3")
63+
Assert.NotNull(token)
64+
Assert.IsType(Of NumberToken)(token)
65+
Assert.Equal(1000D, token.Value)
66+
Assert.Equal(3, token.Skip)
67+
68+
token = JsonParser.Parsers.NumberParser.Parse("-2.5E-2")
69+
Assert.NotNull(token)
70+
Assert.IsType(Of NumberToken)(token)
71+
Assert.Equal(-0.025D, token.Value)
72+
Assert.Equal(7, token.Skip)
73+
End Sub
74+
75+
<Fact>
76+
Public Sub Parse_NumberWithTrailingSpace_ReturnsNumberToken()
77+
Dim token = JsonParser.Parsers.NumberParser.Parse("42 ")
78+
Assert.NotNull(token)
79+
Assert.IsType(Of NumberToken)(token)
80+
Assert.Equal(42D, token.Value)
81+
Assert.Equal(3, token.Skip)
82+
End Sub
83+
84+
<Fact>
85+
Public Sub Parse_NumberWithTrailingTab_ReturnsNumberToken()
86+
Dim token = JsonParser.Parsers.NumberParser.Parse("123" & vbTab)
87+
Assert.NotNull(token)
88+
Assert.IsType(Of NumberToken)(token)
89+
Assert.Equal(123D, token.Value)
90+
Assert.Equal(4, token.Skip)
91+
End Sub
92+
93+
<Fact>
94+
Public Sub Parse_DecimalWithTrailingNewline_ReturnsNumberToken()
95+
Dim token = JsonParser.Parsers.NumberParser.Parse("3.14" & vbLf)
96+
Assert.NotNull(token)
97+
Assert.IsType(Of NumberToken)(token)
98+
Assert.Equal(3.14D, token.Value)
99+
Assert.Equal(5, token.Skip)
100+
End Sub
101+
102+
<Fact>
103+
Public Sub Parse_ExponentWithTrailingCarriageReturn_ReturnsNumberToken()
104+
Dim token = JsonParser.Parsers.NumberParser.Parse("8.9e2" & vbCr)
105+
Assert.NotNull(token)
106+
Assert.IsType(Of NumberToken)(token)
107+
Assert.Equal(890D, token.Value)
108+
Assert.Equal(6, token.Skip)
109+
End Sub
110+
111+
<Fact>
112+
Public Sub Parse_ExponentWithTrailingSpaces_ReturnsNumberToken()
113+
Dim token = JsonParser.Parsers.NumberParser.Parse("-0.5E-1 ")
114+
Assert.NotNull(token)
115+
Assert.IsType(Of NumberToken)(token)
116+
Assert.Equal(-0.05D, token.Value)
117+
Assert.Equal(9, token.Skip)
118+
End Sub
119+
120+
<Fact>
121+
Public Sub Parse_NumberWithDelimiter_ReturnsNumberToken()
122+
Dim token = JsonParser.Parsers.NumberParser.Parse("77,", New Regex(","))
123+
Assert.NotNull(token)
124+
Assert.IsType(Of NumberToken)(token)
125+
Assert.Equal(77D, token.Value)
126+
Assert.Equal(2, token.Skip)
127+
End Sub
128+
129+
End Class
130+
131+
End Namespace

0 commit comments

Comments
 (0)