@@ -35,9 +35,14 @@ def sgfParsingTests : TestSuite :=
3535 |>.addTest "upper and lowercase property" (do
3636 return assertEqual (.error "property must be in uppercase" ) (SgfParsing.parse "(;Aa[b])" ))
3737 |>.addTest "two nodes" (do
38- return assertEqual (.ok ⟨.ofArray #[("A" , #["B" ])], #[⟨.ofArray #[("B" , #["C" ])], #[]⟩]⟩) (SgfParsing.parse "(;A[B];B[C])" ))
38+ return assertEqual (.ok ⟨.ofArray #[("A" , #["B" ])], #[
39+ ⟨.ofArray #[("B" , #["C" ])], #[]⟩
40+ ]⟩) (SgfParsing.parse "(;A[B];B[C])" ))
3941 |>.addTest "two child trees" (do
40- return assertEqual (.ok ⟨.ofArray #[("A" , #["B" ])], #[⟨.ofArray #[("B" , #["C" ])], #[]⟩, ⟨.ofArray #[("C" , #["D" ])], #[]⟩]⟩) (SgfParsing.parse "(;A[B](;B[C])(;C[D]))" ))
42+ return assertEqual (.ok ⟨.ofArray #[("A" , #["B" ])], #[
43+ ⟨.ofArray #[("B" , #["C" ])], #[]⟩,
44+ ⟨.ofArray #[("C" , #["D" ])], #[]⟩
45+ ]⟩) (SgfParsing.parse "(;A[B](;B[C])(;C[D]))" ))
4146 |>.addTest "multiple property values" (do
4247 return assertEqual (.ok ⟨.ofArray #[("A" , #["b" , "c" , "d" ])], #[]⟩) (SgfParsing.parse "(;A[b][c][d])" ))
4348 |>.addTest "within property values, whitespace characters such as tab are converted to spaces" (do
@@ -49,11 +54,17 @@ def sgfParsingTests : TestSuite :=
4954 |>.addTest "escaped backslash in property value becomes just a backslash" (do
5055 return assertEqual (.ok ⟨.ofArray #[("A" , #["\\ " ])], #[]⟩) (SgfParsing.parse "(;A[\\\\ ])" ))
5156 |>.addTest "opening bracket within property value doesn't need to be escaped" (do
52- return assertEqual (.ok ⟨.ofArray #[("A" , #["x[y]z" , "foo" ]), ("B" , #["bar" ])], #[⟨.ofArray #[("C" , #["baz" ])], #[]⟩]⟩) (SgfParsing.parse "(;A[x[y\\ ]z][foo]B[bar];C[baz])" ))
57+ return assertEqual (.ok ⟨.ofArray #[("A" , #["x[y]z" , "foo" ]), ("B" , #["bar" ])], #[
58+ ⟨.ofArray #[("C" , #["baz" ])], #[]⟩
59+ ]⟩) (SgfParsing.parse "(;A[x[y\\ ]z][foo]B[bar];C[baz])" ))
5360 |>.addTest "semicolon in property value doesn't need to be escaped" (do
54- return assertEqual (.ok ⟨.ofArray #[("A" , #["a;b" , "foo" ]), ("B" , #["bar" ])], #[⟨.ofArray #[("C" , #["baz" ])], #[]⟩]⟩) (SgfParsing.parse "(;A[a;b][foo]B[bar];C[baz])" ))
61+ return assertEqual (.ok ⟨.ofArray #[("A" , #["a;b" , "foo" ]), ("B" , #["bar" ])], #[
62+ ⟨.ofArray #[("C" , #["baz" ])], #[]⟩
63+ ]⟩) (SgfParsing.parse "(;A[a;b][foo]B[bar];C[baz])" ))
5564 |>.addTest "parentheses in property value don't need to be escaped" (do
56- return assertEqual (.ok ⟨.ofArray #[("A" , #["x(y)z" , "foo" ]), ("B" , #["bar" ])], #[⟨.ofArray #[("C" , #["baz" ])], #[]⟩]⟩) (SgfParsing.parse "(;A[x(y)z][foo]B[bar];C[baz])" ))
65+ return assertEqual (.ok ⟨.ofArray #[("A" , #["x(y)z" , "foo" ]), ("B" , #["bar" ])], #[
66+ ⟨.ofArray #[("C" , #["baz" ])], #[]⟩
67+ ]⟩) (SgfParsing.parse "(;A[x(y)z][foo]B[bar];C[baz])" ))
5768 |>.addTest "escaped tab in property value is converted to space" (do
5869 return assertEqual (.ok ⟨.ofArray #[("A" , #["hello world" ])], #[]⟩) (SgfParsing.parse "(;A[hello\\\u0009 world])" ))
5970 |>.addTest "escaped newline in property value is converted to nothing at all" (do
@@ -63,7 +74,14 @@ def sgfParsingTests : TestSuite :=
6374 |>.addTest "mixing various kinds of whitespace and escaped characters in property value" (do
6475 return assertEqual (.ok ⟨.ofArray #[("A" , #["]b\n cd e\\ ]" ])], #[]⟩) (SgfParsing.parse "(;A[\\ ]b\n c\\\n d\u0009\u0009 e\\\\ \\\n\\ ]])" ))
6576 |>.addTest "complex child trees" (do
66- return assertEqual (.ok ⟨.ofArray #[("FF" , #["4" ])], #[⟨.ofArray #[("B" , #["aa" ])], #[⟨.ofArray #[("W" , #["ab" ])], #[]⟩]⟩, ⟨.ofArray #[("B" , #["dd" ])], #[⟨.ofArray #[("W" , #["ee" ])], #[]⟩]⟩]⟩) (SgfParsing.parse "(;FF[4](;B[aa];W[ab])(;B[dd];W[ee]))" ))
77+ return assertEqual (.ok ⟨.ofArray #[("FF" , #["4" ])], #[
78+ ⟨.ofArray #[("B" , #["aa" ])], #[
79+ ⟨.ofArray #[("W" , #["ab" ])], #[]⟩
80+ ]⟩,
81+ ⟨.ofArray #[("B" , #["dd" ])], #[
82+ ⟨.ofArray #[("W" , #["ee" ])], #[]⟩
83+ ]⟩
84+ ]⟩) (SgfParsing.parse "(;FF[4](;B[aa];W[ab])(;B[dd];W[ee]))" ))
6785
6886def main : IO UInt32 := do
6987 runTestSuitesWithExitCode [sgfParsingTests]
0 commit comments