Skip to content

Commit 5e38162

Browse files
authored
Merge pull request #97 from linksplatform/issue-53-4d399364
Issue #53: Multiline quoted strings already supported
2 parents 279c1fc + b6b2394 commit 5e38162

File tree

6 files changed

+380
-0
lines changed

6 files changed

+380
-0
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
using System;
2+
using Xunit;
3+
4+
namespace Platform.Protocols.Lino.Tests
5+
{
6+
public static class MultilineQuotedStringTests
7+
{
8+
[Fact]
9+
public static void TestMultilineDoubleQuotedReference()
10+
{
11+
var input = @"(
12+
""long
13+
string literal representing
14+
the reference""
15+
16+
'another
17+
long string literal
18+
as another reference'
19+
)";
20+
var parser = new Parser();
21+
var result = parser.Parse(input);
22+
23+
Assert.NotEmpty(result);
24+
Assert.Single(result);
25+
26+
var link = result[0];
27+
Assert.Null(link.Id);
28+
Assert.NotNull(link.Values);
29+
Assert.Equal(2, link.Values.Count);
30+
31+
Assert.Equal(@"long
32+
string literal representing
33+
the reference", link.Values[0].Id);
34+
35+
Assert.Equal(@"another
36+
long string literal
37+
as another reference", link.Values[1].Id);
38+
}
39+
40+
[Fact]
41+
public static void TestSimpleMultilineDoubleQuoted()
42+
{
43+
var input = @"(""line1
44+
line2"")";
45+
var parser = new Parser();
46+
var result = parser.Parse(input);
47+
48+
Assert.NotEmpty(result);
49+
Assert.Single(result);
50+
51+
var link = result[0];
52+
Assert.Null(link.Id);
53+
Assert.NotNull(link.Values);
54+
Assert.Single(link.Values);
55+
Assert.Equal("line1\nline2", link.Values[0].Id);
56+
}
57+
58+
[Fact]
59+
public static void TestSimpleMultilineSingleQuoted()
60+
{
61+
var input = @"('line1
62+
line2')";
63+
var parser = new Parser();
64+
var result = parser.Parse(input);
65+
66+
Assert.NotEmpty(result);
67+
Assert.Single(result);
68+
69+
var link = result[0];
70+
Assert.Null(link.Id);
71+
Assert.NotNull(link.Values);
72+
Assert.Single(link.Values);
73+
Assert.Equal("line1\nline2", link.Values[0].Id);
74+
}
75+
76+
[Fact]
77+
public static void TestMultilineQuotedAsId()
78+
{
79+
var input = @"(""multi
80+
line
81+
id"": value1 value2)";
82+
var parser = new Parser();
83+
var result = parser.Parse(input);
84+
85+
Assert.NotEmpty(result);
86+
Assert.Single(result);
87+
88+
var link = result[0];
89+
Assert.Equal("multi\nline\nid", link.Id);
90+
Assert.NotNull(link.Values);
91+
Assert.Equal(2, link.Values.Count);
92+
}
93+
}
94+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using System;
2+
using Platform.Protocols.Lino;
3+
4+
static class Program
5+
{
6+
static void Main()
7+
{
8+
var parser = new Parser();
9+
10+
Console.WriteLine("Testing multiline quotes as described in issue #53:");
11+
Console.WriteLine();
12+
13+
var input = @"(
14+
""long
15+
string literal representing
16+
the reference""
17+
18+
'another
19+
long string literal
20+
as another reference'
21+
)";
22+
23+
Console.WriteLine("Input:");
24+
Console.WriteLine(input);
25+
Console.WriteLine();
26+
27+
try
28+
{
29+
var result = parser.Parse(input);
30+
Console.WriteLine("✓ Parsing succeeded!");
31+
Console.WriteLine($"Number of links: {result.Count}");
32+
33+
foreach (var link in result)
34+
{
35+
Console.WriteLine($"Link: {link}");
36+
}
37+
}
38+
catch (Exception ex)
39+
{
40+
Console.WriteLine($"✗ Parsing failed: {ex.Message}");
41+
Console.WriteLine($"Exception type: {ex.GetType().Name}");
42+
}
43+
}
44+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/* eslint-disable no-console */
2+
const { Parser } = require("../js/dist/index.js");
3+
4+
const parser = new Parser();
5+
6+
console.log("Testing multiline quotes as described in issue #53:");
7+
console.log();
8+
9+
const input = `(
10+
"long
11+
string literal representing
12+
the reference"
13+
14+
'another
15+
long string literal
16+
as another reference'
17+
)`;
18+
19+
console.log("Input:");
20+
console.log(input);
21+
console.log();
22+
23+
try {
24+
const result = parser.parse(input);
25+
console.log("✓ Parsing succeeded!");
26+
console.log(`Number of links: ${result.length}`);
27+
console.log("Parsed result:", JSON.stringify(result, null, 2));
28+
} catch (ex) {
29+
console.log(`✗ Parsing failed: ${ex.message}`);
30+
console.log(`Exception type: ${ex.constructor.name}`);
31+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
use lino::parse_lino;
2+
3+
fn main() {
4+
println!("Testing multiline quotes as described in issue #53:");
5+
println!();
6+
7+
let input = r#"(
8+
"long
9+
string literal representing
10+
the reference"
11+
12+
'another
13+
long string literal
14+
as another reference'
15+
)"#;
16+
17+
println!("Input:");
18+
println!("{}", input);
19+
println!();
20+
21+
match parse_lino(input) {
22+
Ok(result) => {
23+
println!("✓ Parsing succeeded!");
24+
println!("Parsed result: {:#?}", result);
25+
}
26+
Err(e) => {
27+
println!("✗ Parsing failed: {:?}", e);
28+
}
29+
}
30+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import { test, expect } from "bun:test";
2+
import { Parser } from "../src/Parser.js";
3+
4+
const parser = new Parser();
5+
6+
test("TestMultilineDoubleQuotedReference", () => {
7+
const input = `(
8+
"long
9+
string literal representing
10+
the reference"
11+
12+
'another
13+
long string literal
14+
as another reference'
15+
)`;
16+
const result = parser.parse(input);
17+
18+
expect(result.length).toBeGreaterThan(0);
19+
expect(result.length).toBe(1);
20+
21+
const link = result[0];
22+
expect(link.id).toBe(null);
23+
expect(link.values).toBeTruthy();
24+
expect(link.values.length).toBe(2);
25+
26+
expect(link.values[0].id).toBe(`long
27+
string literal representing
28+
the reference`);
29+
30+
expect(link.values[1].id).toBe(`another
31+
long string literal
32+
as another reference`);
33+
});
34+
35+
test("TestSimpleMultilineDoubleQuoted", () => {
36+
const input = `("line1
37+
line2")`;
38+
const result = parser.parse(input);
39+
40+
expect(result.length).toBeGreaterThan(0);
41+
expect(result.length).toBe(1);
42+
43+
const link = result[0];
44+
expect(link.id).toBe(null);
45+
expect(link.values).toBeTruthy();
46+
expect(link.values.length).toBe(1);
47+
expect(link.values[0].id).toBe("line1\nline2");
48+
});
49+
50+
test("TestSimpleMultilineSingleQuoted", () => {
51+
const input = `('line1
52+
line2')`;
53+
const result = parser.parse(input);
54+
55+
expect(result.length).toBeGreaterThan(0);
56+
expect(result.length).toBe(1);
57+
58+
const link = result[0];
59+
expect(link.id).toBe(null);
60+
expect(link.values).toBeTruthy();
61+
expect(link.values.length).toBe(1);
62+
expect(link.values[0].id).toBe("line1\nline2");
63+
});
64+
65+
test("TestMultilineQuotedAsId", () => {
66+
const input = `("multi
67+
line
68+
id": value1 value2)`;
69+
const result = parser.parse(input);
70+
71+
expect(result.length).toBeGreaterThan(0);
72+
expect(result.length).toBe(1);
73+
74+
const link = result[0];
75+
expect(link.id).toBe("multi\nline\nid");
76+
expect(link.values).toBeTruthy();
77+
expect(link.values.length).toBe(2);
78+
});
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
use lino::{parse_lino, LiNo};
2+
3+
#[test]
4+
fn test_multiline_double_quoted_reference() {
5+
let input = r#"(
6+
"long
7+
string literal representing
8+
the reference"
9+
10+
'another
11+
long string literal
12+
as another reference'
13+
)"#;
14+
let result = parse_lino(input).unwrap();
15+
16+
if let LiNo::Link { id: outer_id, values: outer_values } = &result {
17+
assert!(outer_id.is_none());
18+
assert_eq!(outer_values.len(), 1);
19+
20+
if let LiNo::Link { id, values } = &outer_values[0] {
21+
assert!(id.is_none());
22+
assert_eq!(values.len(), 2);
23+
24+
if let LiNo::Ref(ref first_value) = values[0] {
25+
assert_eq!(first_value, "long\nstring literal representing\nthe reference");
26+
} else {
27+
panic!("Expected first value to be a Ref");
28+
}
29+
30+
if let LiNo::Ref(ref second_value) = values[1] {
31+
assert_eq!(second_value, "another\nlong string literal\nas another reference");
32+
} else {
33+
panic!("Expected second value to be a Ref");
34+
}
35+
} else {
36+
panic!("Expected first outer value to be a Link");
37+
}
38+
} else {
39+
panic!("Expected result to be a Link");
40+
}
41+
}
42+
43+
#[test]
44+
fn test_simple_multiline_double_quoted() {
45+
let input = r#"("line1
46+
line2")"#;
47+
let result = parse_lino(input).unwrap();
48+
49+
if let LiNo::Link { id, values } = &result {
50+
assert!(id.is_none());
51+
assert_eq!(values.len(), 1);
52+
53+
if let LiNo::Ref(ref value) = values[0] {
54+
assert_eq!(value, "line1\nline2");
55+
} else {
56+
panic!("Expected value to be a Ref");
57+
}
58+
} else {
59+
panic!("Expected result to be a Link");
60+
}
61+
}
62+
63+
#[test]
64+
fn test_simple_multiline_single_quoted() {
65+
let input = r#"('line1
66+
line2')"#;
67+
let result = parse_lino(input).unwrap();
68+
69+
if let LiNo::Link { id, values } = &result {
70+
assert!(id.is_none());
71+
assert_eq!(values.len(), 1);
72+
73+
if let LiNo::Ref(ref value) = values[0] {
74+
assert_eq!(value, "line1\nline2");
75+
} else {
76+
panic!("Expected value to be a Ref");
77+
}
78+
} else {
79+
panic!("Expected result to be a Link");
80+
}
81+
}
82+
83+
#[test]
84+
fn test_multiline_quoted_as_id() {
85+
let input = r#"("multi
86+
line
87+
id": value1 value2)"#;
88+
let result = parse_lino(input).unwrap();
89+
90+
if let LiNo::Link { id: outer_id, values: outer_values } = &result {
91+
assert!(outer_id.is_none());
92+
assert_eq!(outer_values.len(), 1);
93+
94+
if let LiNo::Link { id, values } = &outer_values[0] {
95+
assert_eq!(id.as_ref().unwrap(), "multi\nline\nid");
96+
assert_eq!(values.len(), 2);
97+
} else {
98+
panic!("Expected first value to be a Link");
99+
}
100+
} else {
101+
panic!("Expected result to be a Link");
102+
}
103+
}

0 commit comments

Comments
 (0)