Skip to content

Commit 0bb41be

Browse files
committed
Add more unit tests for Markdown code blocks' extraction
1 parent faa2ab1 commit 0bb41be

File tree

4 files changed

+143
-27
lines changed

4 files changed

+143
-27
lines changed

modules/build/src/main/scala/scala/build/internal/markdown/MarkdownOpenFence.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ case class MarkdownOpenFence(
3939
val bodyLines: Array[String] = lines.slice(start, tickEndLine)
4040
MarkdownCodeBlock(
4141
info.split("\\s+").toList, // strip info by whitespaces
42-
bodyLines.tail.foldLeft(bodyLines.head)((body, line) => body.:++("\n" + line)),
42+
bodyLines.mkString("\n"),
4343
start, // snippet has to begin in the new line
4444
tickEndLine - 1 // ending backticks have to be placed below the snippet
4545
)

modules/build/src/test/scala/scala/build/tests/markdown/MarkdownCodeBlockTests.scala

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import scala.build.Position
66
import scala.build.errors.{BuildException, MarkdownUnclosedBackticksError}
77
import scala.build.internal.markdown.MarkdownCodeBlock
88
import scala.build.preprocessing.MarkdownCodeBlockProcessor
9+
import scala.build.tests.markdown.MarkdownTestUtil.*
910

1011
class MarkdownCodeBlockTests extends munit.FunSuite {
1112
test("no code blocks are extracted from markdown if none are present") {
@@ -35,7 +36,7 @@ class MarkdownCodeBlockTests extends munit.FunSuite {
3536
|""".stripMargin
3637
val expectedResult =
3738
MarkdownCodeBlock(
38-
info = Seq("scala"),
39+
info = PlainScalaInfo,
3940
body = code,
4041
startLine = 3,
4142
endLine = 3
@@ -58,7 +59,7 @@ class MarkdownCodeBlockTests extends munit.FunSuite {
5859
|""".stripMargin
5960
val expectedResult =
6061
MarkdownCodeBlock(
61-
info = Seq("scala", "raw"),
62+
info = RawScalaInfo,
6263
body = code,
6364
startLine = 3,
6465
endLine = 5
@@ -83,7 +84,7 @@ class MarkdownCodeBlockTests extends munit.FunSuite {
8384
|""".stripMargin
8485
val expectedResult =
8586
MarkdownCodeBlock(
86-
info = Seq("scala", "test"),
87+
info = TestScalaInfo,
8788
body = code,
8889
startLine = 3,
8990
endLine = 6
@@ -148,7 +149,7 @@ class MarkdownCodeBlockTests extends munit.FunSuite {
148149
MarkdownCodeBlock.findCodeBlocks(subPath, markdown, maybeRecoverOnError = recoveryFunction)
149150
val expectedResult =
150151
MarkdownCodeBlock(
151-
info = Seq("scala"),
152+
info = PlainScalaInfo,
152153
body = code,
153154
startLine = 2,
154155
endLine = 2

modules/build/src/test/scala/scala/build/tests/markdown/MarkdownCodeWrapperTests.scala

Lines changed: 129 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import scala.build.preprocessing.{
1313
PreprocessedMarkdown,
1414
PreprocessedMarkdownCodeBlocks
1515
}
16+
import scala.build.tests.markdown.MarkdownTestUtil.*
1617

1718
class MarkdownCodeWrapperTests extends munit.FunSuite {
1819

@@ -23,15 +24,75 @@ class MarkdownCodeWrapperTests extends munit.FunSuite {
2324

2425
test("a simple Scala code block is wrapped correctly") {
2526
val snippet = """println("Hello")"""
26-
val codeBlock = MarkdownCodeBlock(Seq("scala"), snippet, 3, 3)
27+
val codeBlock = MarkdownCodeBlock(PlainScalaInfo, snippet, 3, 3)
2728
val preprocessedCodeBlocks = PreprocessedMarkdownCodeBlocks(Seq(codeBlock))
2829
val markdown = PreprocessedMarkdown(scriptCodeBlocks = preprocessedCodeBlocks)
2930
val expectedScala = MarkdownCodeWrapper.WrappedMarkdownCode(
30-
"""object Example_md { @annotation.nowarn("msg=pure expression does nothing") def main(args: Array[String]): Unit = { Scope; }
31-
|
32-
|object Scope {
33-
|println("Hello")
34-
|}}""".stripMargin
31+
s"""object Example_md { @annotation.nowarn("msg=pure expression does nothing") def main(args: Array[String]): Unit = { Scope; }
32+
|
33+
|object Scope {
34+
|$snippet
35+
|}}""".stripMargin
36+
)
37+
val result = MarkdownCodeWrapper(os.sub / "Example.md", markdown)
38+
expect(result == (Some(expectedScala), None, None))
39+
}
40+
41+
test("multiple plain Scala code blocks are wrapped correctly") {
42+
val snippet1 = """println("Hello")"""
43+
val codeBlock1 = MarkdownCodeBlock(PlainScalaInfo, snippet1, 3, 3)
44+
val snippet2 = """println("world")"""
45+
val codeBlock2 = MarkdownCodeBlock(PlainScalaInfo, snippet2, 8, 8)
46+
val snippet3 = """println("!")"""
47+
val codeBlock3 = MarkdownCodeBlock(PlainScalaInfo, snippet3, 12, 12)
48+
val preprocessedCodeBlocks =
49+
PreprocessedMarkdownCodeBlocks(Seq(codeBlock1, codeBlock2, codeBlock3))
50+
val markdown = PreprocessedMarkdown(scriptCodeBlocks = preprocessedCodeBlocks)
51+
val expectedScala = MarkdownCodeWrapper.WrappedMarkdownCode(
52+
s"""object Example_md { @annotation.nowarn("msg=pure expression does nothing") def main(args: Array[String]): Unit = { Scope; }
53+
|
54+
|object Scope {
55+
|$snippet1
56+
|
57+
|
58+
|
59+
|
60+
|$snippet2
61+
|
62+
|
63+
|
64+
|$snippet3
65+
|}}""".stripMargin
66+
)
67+
val result = MarkdownCodeWrapper(os.sub / "Example.md", markdown)
68+
expect(result == (Some(expectedScala), None, None))
69+
}
70+
71+
test("multiple plain Scala code blocks with different scopes are wrapped correctly") {
72+
val snippet1 = """println("Hello")"""
73+
val codeBlock1 = MarkdownCodeBlock(PlainScalaInfo, snippet1, 3, 3)
74+
val snippet2 = """println("world")"""
75+
val codeBlock2 = MarkdownCodeBlock(ResetScalaInfo, snippet2, 8, 8)
76+
val snippet3 = """println("!")"""
77+
val codeBlock3 = MarkdownCodeBlock(PlainScalaInfo, snippet3, 12, 12)
78+
val preprocessedCodeBlocks =
79+
PreprocessedMarkdownCodeBlocks(Seq(codeBlock1, codeBlock2, codeBlock3))
80+
val markdown = PreprocessedMarkdown(scriptCodeBlocks = preprocessedCodeBlocks)
81+
val expectedScala = MarkdownCodeWrapper.WrappedMarkdownCode(
82+
s"""object Example_md { @annotation.nowarn("msg=pure expression does nothing") def main(args: Array[String]): Unit = { Scope; Scope1; }
83+
|
84+
|object Scope {
85+
|$snippet1
86+
|
87+
|
88+
|
89+
|}; object Scope1 {
90+
|$snippet2
91+
|
92+
|
93+
|
94+
|$snippet3
95+
|}}""".stripMargin
3596
)
3697
val result = MarkdownCodeWrapper(os.sub / "Example.md", markdown)
3798
expect(result == (Some(expectedScala), None, None))
@@ -42,17 +103,39 @@ class MarkdownCodeWrapperTests extends munit.FunSuite {
42103
"""object Main extends App {
43104
| println("Hello")
44105
|}""".stripMargin
45-
val codeBlock = MarkdownCodeBlock(Seq("scala", "raw"), snippet, 3, 5)
106+
val codeBlock = MarkdownCodeBlock(RawScalaInfo, snippet, 3, 5)
46107
val preprocessedCodeBlocks = PreprocessedMarkdownCodeBlocks(Seq(codeBlock))
47108
val markdown = PreprocessedMarkdown(rawCodeBlocks = preprocessedCodeBlocks)
48109
val expectedScala = MarkdownCodeWrapper.WrappedMarkdownCode(
49-
"""
50-
|
51-
|
52-
|object Main extends App {
53-
| println("Hello")
54-
|}
55-
|""".stripMargin
110+
s"""
111+
|
112+
|
113+
|$snippet
114+
|""".stripMargin
115+
)
116+
val result = MarkdownCodeWrapper(os.sub / "Example.md", markdown)
117+
expect(result == (None, Some(expectedScala), None))
118+
}
119+
120+
test("multiple raw Scala code blocks are glued together correctly") {
121+
val snippet1 =
122+
"""case class Message(value: String)""".stripMargin
123+
val codeBlock1 = MarkdownCodeBlock(RawScalaInfo, snippet1, 3, 3)
124+
val snippet2 =
125+
"""object Main extends App {
126+
| println(Message("Hello").value)
127+
|}""".stripMargin
128+
val codeBlock2 = MarkdownCodeBlock(RawScalaInfo, snippet2, 5, 7)
129+
val preprocessedCodeBlocks = PreprocessedMarkdownCodeBlocks(Seq(codeBlock1, codeBlock2))
130+
val markdown = PreprocessedMarkdown(rawCodeBlocks = preprocessedCodeBlocks)
131+
val expectedScala = MarkdownCodeWrapper.WrappedMarkdownCode(
132+
s"""
133+
|
134+
|
135+
|$snippet1
136+
|
137+
|$snippet2
138+
|""".stripMargin
56139
)
57140
val result = MarkdownCodeWrapper(os.sub / "Example.md", markdown)
58141
expect(result == (None, Some(expectedScala), None))
@@ -64,18 +147,42 @@ class MarkdownCodeWrapperTests extends munit.FunSuite {
64147
|class Test extends munit.FunSuite {
65148
| assert(true)
66149
|}""".stripMargin
67-
val codeBlock = MarkdownCodeBlock(Seq("scala", "test"), snippet, 3, 6)
150+
val codeBlock = MarkdownCodeBlock(TestScalaInfo, snippet, 3, 6)
68151
val preprocessedCodeBlocks = PreprocessedMarkdownCodeBlocks(Seq(codeBlock))
69152
val markdown = PreprocessedMarkdown(testCodeBlocks = preprocessedCodeBlocks)
70153
val expectedScala = MarkdownCodeWrapper.WrappedMarkdownCode(
71-
"""
72-
|
73-
|
74-
|//> using lib "org.scalameta::munit:0.7.29"
75-
|class Test extends munit.FunSuite {
154+
s"""
155+
|
156+
|
157+
|$snippet
158+
|""".stripMargin
159+
)
160+
val result = MarkdownCodeWrapper(os.sub / "Example.md", markdown)
161+
expect(result == (None, None, Some(expectedScala)))
162+
}
163+
164+
test("multiple test Scala snippets are glued together correctly") {
165+
val snippet1 =
166+
"""//> using lib "org.scalameta::munit:0.7.29"
167+
|class Test1 extends munit.FunSuite {
168+
| assert(true)
169+
|}""".stripMargin
170+
val codeBlock1 = MarkdownCodeBlock(TestScalaInfo, snippet1, 3, 6)
171+
val snippet2 =
172+
"""class Test2 extends munit.FunSuite {
76173
| assert(true)
77-
|}
78-
|""".stripMargin
174+
|}""".stripMargin
175+
val codeBlock2 = MarkdownCodeBlock(TestScalaInfo, snippet2, 8, 10)
176+
val preprocessedCodeBlocks = PreprocessedMarkdownCodeBlocks(Seq(codeBlock1, codeBlock2))
177+
val markdown = PreprocessedMarkdown(testCodeBlocks = preprocessedCodeBlocks)
178+
val expectedScala = MarkdownCodeWrapper.WrappedMarkdownCode(
179+
s"""
180+
|
181+
|
182+
|$snippet1
183+
|
184+
|$snippet2
185+
|""".stripMargin
79186
)
80187
val result = MarkdownCodeWrapper(os.sub / "Example.md", markdown)
81188
expect(result == (None, None, Some(expectedScala)))
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package scala.build.tests.markdown
2+
3+
object MarkdownTestUtil {
4+
val PlainScalaInfo = Seq("scala")
5+
val RawScalaInfo = Seq("scala", "raw")
6+
val TestScalaInfo = Seq("scala", "test")
7+
val ResetScalaInfo = Seq("scala", "reset")
8+
}

0 commit comments

Comments
 (0)