Skip to content

Commit 9c549d2

Browse files
committed
Refactor parser and tests to support singlet links with null IDs and single values
1 parent c4673c1 commit 9c549d2

File tree

4 files changed

+63
-39
lines changed

4 files changed

+63
-39
lines changed

csharp/Platform.Protocols.Lino.Tests/EdgeCaseParserTests.cs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,12 @@ public static void TestAllFeaturesTest()
5858
// Test singlet link
5959
input = "(singlet)";
6060
result = new Parser().Parse(input);
61-
Assert.NotEmpty(result);
61+
Assert.Single(result);
62+
Assert.Null(result[0].Id);
63+
Assert.NotNull(result[0].Values);
64+
Assert.Single(result[0].Values);
65+
Assert.Equal("singlet", result[0].Values[0].Id);
66+
Assert.Null(result[0].Values[0].Values);
6267

6368
// Test value link
6469
input = "(value1 value2 value3)";
@@ -88,8 +93,11 @@ public static void TestSingletLinks()
8893
var input = "(1)";
8994
var result = new Parser().Parse(input);
9095
Assert.Single(result);
91-
Assert.Equal("1", result[0].Id);
92-
Assert.Null(result[0].Values);
96+
Assert.Null(result[0].Id);
97+
Assert.NotNull(result[0].Values);
98+
Assert.Single(result[0].Values);
99+
Assert.Equal("1", result[0].Values[0].Id);
100+
Assert.Null(result[0].Values[0].Values);
93101

94102
// Test (1 2)
95103
input = "(1 2)";
@@ -99,7 +107,9 @@ public static void TestSingletLinks()
99107
Assert.NotNull(result[0].Values);
100108
Assert.Equal(2, result[0].Values.Count);
101109
Assert.Equal("1", result[0].Values[0].Id);
110+
Assert.Null(result[0].Values[0].Values);
102111
Assert.Equal("2", result[0].Values[1].Id);
112+
Assert.Null(result[0].Values[1].Values);
103113

104114
// Test (1 2 3)
105115
input = "(1 2 3)";
@@ -109,8 +119,11 @@ public static void TestSingletLinks()
109119
Assert.NotNull(result[0].Values);
110120
Assert.Equal(3, result[0].Values.Count);
111121
Assert.Equal("1", result[0].Values[0].Id);
122+
Assert.Null(result[0].Values[0].Values);
112123
Assert.Equal("2", result[0].Values[1].Id);
124+
Assert.Null(result[0].Values[1].Values);
113125
Assert.Equal("3", result[0].Values[2].Id);
126+
Assert.Null(result[0].Values[2].Values);
114127

115128
// Test (1 2 3 4)
116129
input = "(1 2 3 4)";
@@ -120,9 +133,13 @@ public static void TestSingletLinks()
120133
Assert.NotNull(result[0].Values);
121134
Assert.Equal(4, result[0].Values.Count);
122135
Assert.Equal("1", result[0].Values[0].Id);
136+
Assert.Null(result[0].Values[0].Values);
123137
Assert.Equal("2", result[0].Values[1].Id);
138+
Assert.Null(result[0].Values[1].Values);
124139
Assert.Equal("3", result[0].Values[2].Id);
140+
Assert.Null(result[0].Values[2].Values);
125141
Assert.Equal("4", result[0].Values[3].Id);
142+
Assert.Null(result[0].Values[3].Values);
126143
}
127144

128145
[Fact]

csharp/Platform.Protocols.Lino.Tests/NestedParserTests.cs

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -37,32 +37,32 @@ New York
3737
age
3838
20";
3939
var target = @"(users)
40-
(users user1)
41-
((users user1) id)
42-
(((users user1) id) 43)
43-
((users user1) name)
44-
(((users user1) name) first)
45-
((((users user1) name) first) John)
46-
(((users user1) name) last)
47-
((((users user1) name) last) Williams)
48-
((users user1) location)
49-
(((users user1) location) (New York))
50-
((users user1) age)
51-
(((users user1) age) 23)
52-
(users user2)
53-
((users user2) id)
54-
(((users user2) id) 56)
55-
((users user2) name)
56-
(((users user2) name) first)
57-
((((users user2) name) first) Igor)
58-
(((users user2) name) middle)
59-
((((users user2) name) middle) Petrovich)
60-
(((users user2) name) last)
61-
((((users user2) name) last) Ivanov)
62-
((users user2) location)
63-
(((users user2) location) Moscow)
64-
((users user2) age)
65-
(((users user2) age) 20)";
40+
((users) (user1))
41+
(((users) (user1)) (id))
42+
((((users) (user1)) (id)) (43))
43+
(((users) (user1)) (name))
44+
((((users) (user1)) (name)) (first))
45+
(((((users) (user1)) (name)) (first)) (John))
46+
((((users) (user1)) (name)) (last))
47+
(((((users) (user1)) (name)) (last)) (Williams))
48+
(((users) (user1)) (location))
49+
((((users) (user1)) (location)) (New York))
50+
(((users) (user1)) (age))
51+
((((users) (user1)) (age)) (23))
52+
((users) (user2))
53+
(((users) (user2)) (id))
54+
((((users) (user2)) (id)) (56))
55+
(((users) (user2)) (name))
56+
((((users) (user2)) (name)) (first))
57+
(((((users) (user2)) (name)) (first)) (Igor))
58+
((((users) (user2)) (name)) (middle))
59+
(((((users) (user2)) (name)) (middle)) (Petrovich))
60+
((((users) (user2)) (name)) (last))
61+
(((((users) (user2)) (name)) (last)) (Ivanov))
62+
(((users) (user2)) (location))
63+
((((users) (user2)) (location)) (Moscow))
64+
(((users) (user2)) (age))
65+
((((users) (user2)) (age)) (20))";
6666
var parser = new Parser();
6767
var links = parser.Parse(source);
6868
var formattedLinks = links.Format();
@@ -76,8 +76,8 @@ public static void SimpleSignificantWhitespaceTest()
7676
b
7777
c";
7878
var target = @"(a)
79-
(a b)
80-
(a c)";
79+
((a) (b))
80+
((a) (c))";
8181
var parser = new Parser();
8282
var links = parser.Parse(source);
8383
var formattedLinks = links.Format();
@@ -91,7 +91,7 @@ public static void TwoSpacesSizedWhitespaceTest()
9191
users
9292
user1";
9393
var target = @"(users)
94-
(users user1)";
94+
((users) (user1))";
9595
var parser = new Parser();
9696
var links = parser.Parse(source);
9797
var formattedLinks = links.Format();

csharp/Platform.Protocols.Lino.Tests/SingleLineParserTests.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,12 @@ public static void ParseSimpleReferenceTest()
6464
var links = parser.Parse(source);
6565
Assert.NotNull(links);
6666
Assert.Single(links);
67-
// Simple reference creates a singlet link with that ID
68-
Assert.Equal("test", links[0]!.Id);
69-
// Values should be null for singlet links
70-
Assert.Null(links[0].Values);
67+
// Simple reference creates a singlet link with null Id and one value
68+
Assert.Null(links[0].Id);
69+
Assert.NotNull(links[0].Values);
70+
Assert.Single(links[0].Values);
71+
Assert.Equal("test", links[0].Values[0].Id);
72+
Assert.Null(links[0].Values[0].Values);
7173
}
7274

7375
[Fact]
@@ -113,7 +115,12 @@ public static void TestSingletLinkTest()
113115
// Test singlet link
114116
var input = "(singlet)";
115117
var result = new Parser().Parse(input);
116-
Assert.NotEmpty(result);
118+
Assert.Single(result);
119+
Assert.Null(result[0].Id);
120+
Assert.NotNull(result[0].Values);
121+
Assert.Single(result[0].Values);
122+
Assert.Equal("singlet", result[0].Values[0].Id);
123+
Assert.Null(result[0].Values[0].Values);
117124
}
118125

119126
[Fact]

csharp/Platform.Protocols.Lino/Parser.peg

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ singleLineValueAndWhitespace <Link<string>> = __ value:referenceOrLink { value }
1616
singleLineValues <IList<Link<string>>> = list:singleLineValueAndWhitespace+ { list }
1717
singleLineLink <Link<string>> = __ id:(reference) __ ":" v:singleLineValues { new Link<string>(id, v) }
1818
multiLineLink <Link<string>> = "(" _ id:(reference) _ ":" v:multiLineValues _ ")" { new Link<string>(id, v) }
19-
singleLineValueLink <Link<string>> = v:singleLineValues { v.Count == 1 && v[0].Id != null && (v[0].Values == null || v[0].Values.Count == 0) ? new Link<string>(v[0].Id) : new Link<string>(v) }
20-
multiLineValueLink <Link<string>> = "(" v:multiLineValues _ ")" { v.Count == 1 && v[0].Id != null && (v[0].Values == null || v[0].Values.Count == 0) ? new Link<string>(v[0].Id) : new Link<string>(v) }
19+
singleLineValueLink <Link<string>> = v:singleLineValues { new Link<string>(v) }
20+
multiLineValueLink <Link<string>> = "(" v:multiLineValues _ ")" { new Link<string>(v) }
2121

2222
reference <string> = doubleQuotedReference / singleQuotedReference / simpleReference
2323
simpleReference <string> = "" referenceSymbol+

0 commit comments

Comments
 (0)