Build Logs

dylemma/xml-spac • 3.8.0-RC2:2025-11-28

Errors

61

Warnings

38

Total Lines

1132

1##################################
2Clonning https://github.com/dylemma/xml-spac.git into /build/repo using revision 0.12.1
3##################################
4Note: switching to 'df7f456141cc532d3941f0741103b2962b93818d'.
5
6You are in 'detached HEAD' state. You can look around, make experimental
7changes and commit them, and you can discard any commits you make in this
8state without impacting any branches by switching back to a branch.
9
10If you want to create a new branch to retain commits you create, you may
11do so (now or later) by using -c with the switch command. Example:
12
13 git switch -c <new-branch-name>
14
15Or undo this operation with:
16
17 git switch -
18
19Turn off this advice by setting config variable advice.detachedHead to false
20
21----
22Preparing build for 3.8.0-RC2
23Scala binary version found: 3.8
24Implicitly using source version 3.8
25Scala binary version found: 3.8
26Implicitly using source version 3.8
27Would try to apply common scalacOption (best-effort, sbt/mill only):
28Append: ,REQUIRE:-source:3.8
29Remove: ,-deprecation,-feature,-Xfatal-warnings,-Werror,MATCH:.*-Wconf.*any:e
30----
31Starting build for 3.8.0-RC2
32Execute tests: true
33sbt project found:
34Sbt version 1.9.6 is not supported, minimal supported version is 1.11.5
35Enforcing usage of sbt in version 1.11.5
36No prepare script found for project dylemma/xml-spac
37##################################
38Scala version: 3.8.0-RC2
39Targets: io.dylemma%json-spac io.dylemma%json-spac-fs2-data io.dylemma%json-spac-jackson io.dylemma%spac-core io.dylemma%spac-interop-fs2 io.dylemma%xml-spac io.dylemma%xml-spac-fs2-data io.dylemma%xml-spac-javax
40Project projectConfig: {"projects":{"exclude":[],"overrides":{}},"java":{"version":"17"},"sbt":{"commands":[],"options":[]},"mill":{"options":[]},"tests":"full","migrationVersions":[],"sourcePatches":[]}
41##################################
42Using extra scalacOptions: ,REQUIRE:-source:3.8
43Filtering out scalacOptions: ,-deprecation,-feature,-Xfatal-warnings,-Werror,MATCH:.*-Wconf.*any:e
44[sbt_options] declare -a sbt_options=()
45[process_args] java_version = '17'
46[copyRt] java9_rt = '/root/.sbt/1.0/java9-rt-ext-eclipse_adoptium_17_0_8/rt.jar'
47# Executing command line:
48java
49-Dfile.encoding=UTF-8
50-Dcommunitybuild.scala=3.8.0-RC2
51-Dcommunitybuild.project.dependencies.add=
52-Xmx7G
53-Xms4G
54-Xss8M
55-Dsbt.script=/root/.sdkman/candidates/sbt/current/bin/sbt
56-Dscala.ext.dirs=/root/.sbt/1.0/java9-rt-ext-eclipse_adoptium_17_0_8
57-jar
58/root/.sdkman/candidates/sbt/1.11.5/bin/sbt-launch.jar
59"setCrossScalaVersions 3.8.0-RC2"
60"++3.8.0-RC2 -v"
61"mapScalacOptions ",REQUIRE:-source:3.8,-Wconf:msg=can be rewritten automatically under:s" ",-deprecation,-feature,-Xfatal-warnings,-Werror,MATCH:.*-Wconf.*any:e""
62"set every credentials := Nil"
63"excludeLibraryDependency com.github.ghik:zerowaste_{scalaVersion} com.olegpy:better-monadic-for_3 org.polyvariant:better-tostring_{scalaVersion} org.wartremover:wartremover_{scalaVersion}"
64"removeScalacOptionsStartingWith -P:wartremover"
65
66moduleMappings
67"runBuild 3.8.0-RC2 """{"projects":{"exclude":[],"overrides":{}},"java":{"version":"17"},"sbt":{"commands":[],"options":[]},"mill":{"options":[]},"tests":"full","migrationVersions":[],"sourcePatches":[]}""" io.dylemma%json-spac io.dylemma%json-spac-fs2-data io.dylemma%json-spac-jackson io.dylemma%spac-core io.dylemma%spac-interop-fs2 io.dylemma%xml-spac io.dylemma%xml-spac-fs2-data io.dylemma%xml-spac-javax"
68
69[info] welcome to sbt 1.11.5 (Eclipse Adoptium Java 17.0.8)
70[info] loading settings for project repo-build from akka.sbt, plugins.sbt...
71[info] loading project definition from /build/repo/project
72[info] loading settings for project root from build.sbt...
73[info] set current project to root (in build file:/build/repo/)
74Execute setCrossScalaVersions: 3.8.0-RC2
75OpenCB::Changing crossVersion 3.3.1 -> 3.8.0-RC2 in core/crossScalaVersions
76OpenCB::Changing crossVersion 3.3.1 -> 3.8.0-RC2 in xml/crossScalaVersions
77OpenCB::Changing crossVersion 3.3.1 -> 3.8.0-RC2 in jsonJackson/crossScalaVersions
78OpenCB::Changing crossVersion 3.3.1 -> 3.8.0-RC2 in xmlFs2Data/crossScalaVersions
79OpenCB::Changing crossVersion 3.3.1 -> 3.8.0-RC2 in coreFs2/crossScalaVersions
80OpenCB::Changing crossVersion 3.3.1 -> 3.8.0-RC2 in jsonFs2Data/crossScalaVersions
81OpenCB::Changing crossVersion 3.3.1 -> 3.8.0-RC2 in examples/crossScalaVersions
82OpenCB::Changing crossVersion 3.3.1 -> 3.8.0-RC2 in json/crossScalaVersions
83OpenCB::Changing crossVersion 3.3.1 -> 3.8.0-RC2 in root/crossScalaVersions
84OpenCB::Changing crossVersion 3.3.1 -> 3.8.0-RC2 in xmlJavax/crossScalaVersions
85[info] set current project to root (in build file:/build/repo/)
86[info] Setting Scala version to 3.8.0-RC2 on 10 projects.
87[info] Switching Scala version on:
88[info] coreFs2 (2.12.18, 2.13.12, 3.8.0-RC2)
89[info] examples (2.12.18, 2.13.12, 3.8.0-RC2)
90[info] * root (2.12.18, 2.13.12, 3.8.0-RC2)
91[info] json (2.12.18, 2.13.12, 3.8.0-RC2)
92[info] jsonFs2Data (2.12.18, 2.13.12, 3.8.0-RC2)
93[info] xmlFs2Data (2.12.18, 2.13.12, 3.8.0-RC2)
94[info] jsonJackson (2.12.18, 2.13.12, 3.8.0-RC2)
95[info] xmlJavax (2.12.18, 2.13.12, 3.8.0-RC2)
96[info] xml (2.12.18, 2.13.12, 3.8.0-RC2)
97[info] core (2.12.18, 2.13.12, 3.8.0-RC2)
98[info] Excluding projects:
99[info] Reapplying settings...
100[info] set current project to root (in build file:/build/repo/)
101Execute mapScalacOptions: ,REQUIRE:-source:3.8,-Wconf:msg=can be rewritten automatically under:s ,-deprecation,-feature,-Xfatal-warnings,-Werror,MATCH:.*-Wconf.*any:e
102[info] Reapplying settings...
103[info] set current project to root (in build file:/build/repo/)
104[info] Defining Global / credentials, core / credentials and 8 others.
105[info] The new values will be used by Global / pgpSelectPassphrase, Global / pgpSigningKey and 49 others.
106[info] Run `last` for details.
107[info] Reapplying settings...
108[info] set current project to root (in build file:/build/repo/)
109Execute excludeLibraryDependency: com.github.ghik:zerowaste_{scalaVersion} com.olegpy:better-monadic-for_3 org.polyvariant:better-tostring_{scalaVersion} org.wartremover:wartremover_{scalaVersion}
110[info] Reapplying settings...
111OpenCB::Failed to reapply settings in excludeLibraryDependency: Reference to undefined setting:
112
113 Global / allExcludeDependencies from Global / allExcludeDependencies (CommunityBuildPlugin.scala:331)
114 Did you mean allExcludeDependencies ?
115 , retry without global scopes
116[info] Reapplying settings...
117[info] set current project to root (in build file:/build/repo/)
118Execute removeScalacOptionsStartingWith: -P:wartremover
119[info] Reapplying settings...
120[info] set current project to root (in build file:/build/repo/)
121[success] Total time: 0 s, completed Nov 28, 2025, 1:10:20 PM
122Build config: {"projects":{"exclude":[],"overrides":{}},"java":{"version":"17"},"sbt":{"commands":[],"options":[]},"mill":{"options":[]},"tests":"full","migrationVersions":[],"sourcePatches":[]}
123Parsed config: Success(ProjectBuildConfig(ProjectsConfig(List(),Map()),Full,List()))
124Starting build...
125Projects: Set(coreFs2, json, jsonFs2Data, xmlFs2Data, jsonJackson, xmlJavax, xml, core)
126Starting build for ProjectRef(file:/build/repo/,xml) (xml-spac)... [0/8]
127OpenCB::Exclude Scala3 specific scalacOption `REQUIRE:-source:3.8` in Scala 2.12.20 module Global
128OpenCB::Exclude Scala3 specific scalacOption `REQUIRE:-source:3.8` in Scala 2.13.12 module Scope(Select(BuildRef(file:/build/repo/)), Zero, Zero, Zero)
129OpenCB::Filter out '-deprecation', matches setting pattern '^-?-deprecation'
130OpenCB::Filter out '-feature', matches setting pattern '^-?-feature'
131Compile scalacOptions: -unchecked, -language:higherKinds, -Wconf:msg=can be rewritten automatically under:s, -source:3.8
132[info] compiling 68 Scala sources to /build/repo/core/target/scala-3.8.0-RC2/classes ...
133[warn] -- [E092] Pattern Match Unchecked Warning: /build/repo/core/src/main/scala/io/dylemma/spac/Parser.scala:639:9
134[warn] 639 | case OffsetGet(n, g) => new OffsetGet(n + offset, g)
135[warn] | ^
136[warn] |the type test for OffsetGet cannot be checked at runtime because it's a local class
137[warn] |
138[warn] | longer explanation available when compiling with `-explain`
139[warn] one warning found
140[info] done compiling
141[info] compiling 6 Scala sources to /build/repo/xml/target/scala-3.8.0-RC2/classes ...
142[info] done compiling
143[info] compiling 3 Scala sources to /build/repo/core-fs2/target/scala-3.8.0-RC2/classes ...
144[info] compiling 12 Scala sources to /build/repo/core/target/scala-3.8.0-RC2/test-classes ...
145[info] done compiling
146[info] done compiling
147[info] compiling 4 Scala sources to /build/repo/xml/target/scala-3.8.0-RC2/test-classes ...
148[warn] -- [E092] Pattern Match Unchecked Warning: /build/repo/xml/src/test/scala/io/dylemma/spac/xml/XmlParserBehaviors.scala:192:10
149[warn] 192 | case A(1) :: A(2) :: B(3) :: A(4) :: B(5) :: Nil =>
150[warn] | ^
151[warn] |the type test for A cannot be checked at runtime because it's a local class
152[warn] |
153[warn] | longer explanation available when compiling with `-explain`
154[warn] -- [E092] Pattern Match Unchecked Warning: /build/repo/xml/src/test/scala/io/dylemma/spac/xml/XmlParserBehaviors.scala:192:18
155[warn] 192 | case A(1) :: A(2) :: B(3) :: A(4) :: B(5) :: Nil =>
156[warn] | ^
157[warn] |the type test for A cannot be checked at runtime because it's a local class
158[warn] |
159[warn] | longer explanation available when compiling with `-explain`
160[warn] -- [E092] Pattern Match Unchecked Warning: /build/repo/xml/src/test/scala/io/dylemma/spac/xml/XmlParserBehaviors.scala:192:26
161[warn] 192 | case A(1) :: A(2) :: B(3) :: A(4) :: B(5) :: Nil =>
162[warn] | ^
163[warn] |the type test for B cannot be checked at runtime because it's a local class
164[warn] |
165[warn] | longer explanation available when compiling with `-explain`
166[warn] -- [E092] Pattern Match Unchecked Warning: /build/repo/xml/src/test/scala/io/dylemma/spac/xml/XmlParserBehaviors.scala:192:34
167[warn] 192 | case A(1) :: A(2) :: B(3) :: A(4) :: B(5) :: Nil =>
168[warn] | ^
169[warn] |the type test for A cannot be checked at runtime because it's a local class
170[warn] |
171[warn] | longer explanation available when compiling with `-explain`
172[warn] -- [E092] Pattern Match Unchecked Warning: /build/repo/xml/src/test/scala/io/dylemma/spac/xml/XmlParserBehaviors.scala:192:42
173[warn] 192 | case A(1) :: A(2) :: B(3) :: A(4) :: B(5) :: Nil =>
174[warn] | ^
175[warn] |the type test for B cannot be checked at runtime because it's a local class
176[warn] |
177[warn] | longer explanation available when compiling with `-explain`
178[warn] 5 warnings found
179[info] done compiling
180[info] ContextMatcherTests:
181[info] single-element name matcher
182[info] - should succeed when the first element of the stack has the correct name
183[info] - should fail when the first element of the stack is not the correct value
184[info] - should fail when the given length is 0
185[info] - should start matching from the specified offset
186[info] - should fail even if a matching element was further in the stack
187[info] single-element attr matcher
188[info] - should succeed when the first element of the stack has the correct attribute
189[info] - should return the value of the attribute when the attribute is present
190[info] - should fail when the first element of the stack does not contain the correct attribute
191[info] - should still function properly when created with a QName
192[info] - should fail if the stack is empty
193[info] attrOpt matcher
194[info] - should succeed with None if the first element of the stack is missing the requested attribute
195[info] - should capture the requested attribute from the first element in the stack
196[info] - should fail if the stack is empty
197[info] - should combine with other single-element matchers
198[info] - should chain with other matchers
199[info] single-element `or` matcher
200[info] - should succeed when at least one of the combined matchers would succeed
201[info] - should return the match from the leftmost succeeding matcher
202[info] single-element `and` matcher
203[info] - should succeed IFF both combined matchers succeed
204[info] - should combine match results according to the TypeReduce rule: Unit + Unit = Unit
205[info] - should combine match results according to the TypeReduce rule: T + Unit = T, and its converse, Unit + T = T
206[info] - should combine match results according to the TypeReduce rule: S + T = (S, T)
207[info] chained matchers
208[info] - should apply a chain of two single-element matchers to the first two elements of the stack
209[info] - should not apply matchers to a later position in the stack
210[info] - should work with longer chains
211[info] - should combine extracted match values according to the TypeReduce rule: Unit + Unit = Unit
212[info] - should combine extracted match values according to the TypeReduce rule: Unit + T = T
213[info] - should combine extracted match values according to the TypeReduce rule: S + T = (S, T)
214[info] - should combine extracted match results such that S + T + U = (S + T) + U = ((S, T), U)
215[info] - should be able to combine two chains
216[info] the `*` matcher
217[info] - should match any single element
218[info] - should fail on an empty stack
219[info] - should take up a single element when combined in a chain
220[info] the `**` matcher
221[info] - should consume any number of elements to make the next matcher succeed
222[info] - should succeed even if the first greedy match would cause it to fail
223[info] - should work as expected while in the middle of a chain
224[info] - should succeed even if the entire stack doesn't need to be consumed to form the match
225[info] - should match the remainder of the stack if used at the end of the chain
226Starting build for ProjectRef(file:/build/repo/,jsonFs2Data) (json-spac-fs2-data)... [1/8]
227Compile scalacOptions: -unchecked, -language:higherKinds, -Wconf:msg=can be rewritten automatically under:s, -source:3.8
228[info] compiling 6 Scala sources to /build/repo/json/target/scala-3.8.0-RC2/classes ...
229[info] done compiling
230[info] compiling 1 Scala source to /build/repo/json-fs2-data/target/scala-3.8.0-RC2/classes ...
231[info] done compiling
232[info] compiling 2 Scala sources to /build/repo/json/target/scala-3.8.0-RC2/test-classes ...
233[info] done compiling
234[info] compiling 1 Scala source to /build/repo/json-fs2-data/target/scala-3.8.0-RC2/test-classes ...
235[info] done compiling
236[info] Fs2JsonInteropTests:
237[info] JSON with fs2-data support
238[info] Basic JSON Parsing
239[info] JsonParser[Int]
240[info] - should succeed on a long input
241[info] - should fail on a double input
242[info] - should fail on a string input
243[info] - should fail on a array input
244[info] - should fail on a object input
245[info] - should fail on a null input
246[info] - should fail on a bool input
247[info] JsonParser[Long]
248[info] - should succeed on a long input
249[info] - should fail on a double input
250[info] - should fail on a string input
251[info] - should fail on a array input
252[info] - should fail on a object input
253[info] - should fail on a null input
254[info] - should fail on a bool input
255[info] JsonParser[Float]
256[info] - should succeed on a double input
257[info] - should fail on a long input
258[info] - should fail on a string input
259[info] - should fail on a array input
260[info] - should fail on a object input
261[info] - should fail on a null input
262[info] - should fail on a bool input
263[info] JsonParser[Double]
264[info] - should succeed on a double input
265[info] - should fail on a long input
266[info] - should fail on a string input
267[info] - should fail on a array input
268[info] - should fail on a object input
269[info] - should fail on a null input
270[info] - should fail on a bool input
271[info] JsonParser[String]
272[info] - should succeed on a string input
273[info] - should fail on a long input
274[info] - should fail on a double input
275[info] - should fail on a array input
276[info] - should fail on a object input
277[info] - should fail on a null input
278[info] - should fail on a bool input
279[info] JsonParser[Boolean]
280[info] - should succeed on a bool input
281[info] - should fail on a long input
282[info] - should fail on a double input
283[info] - should fail on a string input
284[info] - should fail on a array input
285[info] - should fail on a object input
286[info] - should fail on a null input
287[info] JsonParser.forNull
288[info] - should succeed on a null input
289[info] - should fail on a long input
290[info] - should fail on a double input
291[info] - should fail on a string input
292[info] - should fail on a array input
293[info] - should fail on a object input
294[info] - should fail on a bool input
295[info] JsonParser.listOf
296[info] - should succeed on a array input
297[info] - should fail on a long input
298[info] - should fail on a double input
299[info] - should fail on a string input
300[info] - should fail on a object input
301[info] - should fail on a null input
302[info] - should fail on a bool input
303[info] - should succeed when given an array as input
304[info] JsonParser.fieldOf
305[info] - should extract a value from the requested field
306[info] - should still succeed if the requested field is not the first field in the object
307[info] - should fail if the requested field is not present in the object
308[info] - should fail if the requested field contains the wrong type of value
309[info] - should fail if the requested field contains a null
310[info] - should fail if the input is not an object
311[info] JsonParser.nullableFieldOf
312[info] - should extract a value from the requested field
313[info] - should still succeed if the requested field is not the first field in the object
314[info] - should succeed with `None` as the result if the requested field is not present in the object
315[info] - should fail if the requested field contains the wrong type of value
316[info] - should succeed with `None` if the requested field contains a null
317[info] - should fail if the input is not an object
318[info] JsonParser.objectOf
319[info] - should succeed on a object input
320[info] - should fail on a long input
321[info] - should fail on a double input
322[info] - should fail on a string input
323[info] - should fail on a array input
324[info] - should fail on a null input
325[info] - should fail on a bool input
326[info] - should work properly when the inner parser is complex
327[info] JsonParser.objectOfNullable
328[info] - should succeed on a object input
329[info] - should fail on a long input
330[info] - should fail on a double input
331[info] - should fail on a string input
332[info] - should fail on a array input
333[info] - should fail on a null input
334[info] - should fail on a bool input
335[info] - should work properly when the inner parser is complex
336[info] JsonParser.oneOf
337[info] - should succeed if the input causes one of the parsers to succeed
338[info] - should fail if the input causes all of the parsers to fail
339[info] JsonSplitter(<object field>)
340[info] - should apply the attached parser to the inputs in the field's scope
341[info] - should not match nested contexts that would have matched at the same level
342[info] - should identify matching contexts even if that context was matched before
343[info] JsonSplitter(anyField)
344[info] - should extract values regardless of the field name
345[info] - should extract field names
346[info] JsonSplitter(<array index>)
347[info] - should extract values only from matching indexes
348[info] - should extract array indexes
349[info] Combining parsers to create a complex object parser
350[info] - should succeed when an expected input is sent
351[info] JsonSplitter#firstNotNull
352[info] JsonSplitter#firstNotNull (pending)
353[info] Exception 'spac' trace handling (but with no line numbers for inputs)
354[info] control case
355[info] .parse
356[info] - should successfully parse the control input
357[info] .toPipe
358[info] - should successfully parse the control input
359[info] .parseF
360[info] - should successfully parse the control input
361[info] wrong 'id' case
362[info] .parse
363[info] - should include 'spac trace' information for the unexpected input exception
364[info] .toPipe
365[info] - should include 'spac trace' information for the unexpected input exception
366[info] .parseF
367[info] - should include 'spac trace' information for the unexpected input exception
368[info] missing field case
369[info] .parse
370[info] - should include 'spac trace' information for the unexpected input exception
371[info] .toPipe
372[info] - should include 'spac trace' information for the unexpected input exception
373[info] .parseF
374[info] - should include 'spac trace' information for the unexpected input exception
375[info] inner parser that throws errors
376[info] .parse
377[info] - should capture the thrown exception and add 'spac trace' information
378[info] .toPipe
379[info] - should capture the thrown exception and add 'spac trace' information
380[info] .parseF
381[info] - should capture the thrown exception and add 'spac trace' information
382[info] running an exception-throwing transformer
383[info] - as an iterator should provide 'spac trace' information
384[info] - as an fs2.Pipe should provide 'spac trace' information
385Starting build for ProjectRef(file:/build/repo/,coreFs2) (spac-interop-fs2)... [2/8]
386Compile scalacOptions: -unchecked, -language:higherKinds, -Wconf:msg=can be rewritten automatically under:s, -source:3.8
387Starting build for ProjectRef(file:/build/repo/,core) (spac-core)... [3/8]
388Compile scalacOptions: -unchecked, -language:higherKinds, -Wconf:msg=can be rewritten automatically under:s, -source:3.8
389[info] SplitterTests:
390[info] Splitter.splitOnMatch
391[info] - should create a new substream when an input matches the predicate
392[info] - should ignore prefix inputs if a substream hasn't started
393[info] - should ignore all inputs if the predicate never matches
394[info] - should handle an immediate EOF without starting any substreams
395[info] Splitter.consecutiveMatches
396[info] - should create a substream for each sequence of consecutive matches
397[info] - should use the first match in each substream as the context
398[info] ParserDisjunctionTests:
399[info] Parser # or
400[info] - should create a disjunction that succeeds if either parser succeeds
401[info] - should combine parsers associatively
402[info] - should eagerly return true if an inner parser returns true
403[info] - should finish any unfinished parsers at the end of the input
404[info] TransformerTests:
405[info] Transformer # through
406[info] - should emit nothing when composing opposing filters
407[info] - should pass outputs from 'this' as inputs to 'next'
408[info] - should respect an early-abort from either member
409[info] Transformer # into
410[info] - should pipe the inner transformer's outputs to the given parser
411[info] - should exit early if the parser yields a result
412[info] - should finish the parser if the transformer finishes early
413[info] - should finish the parser when the input ends
414[info] Transformer # merge / mergeEither
415[info] - should emit outputs according to the structural order of the merge
416[info] - should not end until both members end
417[info] Transformer # scan
418[info] - should emit the new scan state for every input
419[info] Transformer # upcast
420[info] - should not throw exceptions when casting
421[info] TransformerCompanionTests:
422[info] Transformer.identity
423[info] Transformer.identity[In]
424[info] - should emit each input
425[info] - should be stateless
426[info] - should emit nothing in response to the end of the input
427[info] Transformer[In].identity
428[info] - should emit each input
429[info] - should be stateless
430[info] - should emit nothing in response to the end of the input
431[info] Transformer.mapFlatten
432[info] Transformer.mapFlatten[In, Out]
433[info] - should transform the input via the provided function, and be stateless
434[info] - should be stateless
435[info] - should emit nothing in reaction to the end of the input
436[info] Transformer[In].mapFlatten[Out]
437[info] - should transform the input via the provided function, and be stateless
438[info] - should be stateless
439[info] - should emit nothing in reaction to the end of the input
440[info] Transformer.map
441[info] Transformer.map[In, Out]
442[info] - should transform the inputs via the provided function
443[info] - should be stateless
444[info] - should emit nothing in reaction to the end of the input
445[info] Transformer[In].map[Out]
446[info] - should transform the inputs via the provided function
447[info] - should be stateless
448[info] - should emit nothing in reaction to the end of the input
449[info] Transformer.filter
450[info] Transformer.filter[In]
451[info] - should pass through only the inputs for which the filter function returns true
452[info] - should be stateless
453[info] - should emit nothing in reaction to the end of the input
454[info] Transformer[In].filter
455[info] - should pass through only the inputs for which the filter function returns true
456[info] - should be stateless
457[info] - should emit nothing in reaction to the end of the input
458[info] Transformer.drop
459[info] Transformer[In].drop
460[info] - should emit outputs corresponding to List.drop(n)
461[info] - should not end on its own
462[info] - should emit nothing in response to the EOF
463[info] Transformer.drop[In]
464[info] - should emit outputs corresponding to List.drop(n)
465[info] - should not end on its own
466[info] - should emit nothing in response to the EOF
467[info] Transformer.dropWhile
468[info] Transformer[In].dropWhile
469[info] - should emit outputs corresponding to List.dropWhile(n)
470[info] - should not end on its own
471[info] - should emit nothing in response to the EOF
472[info] Transformer.dropWhile[In]
473[info] - should emit outputs corresponding to List.dropWhile(n)
474[info] - should not end on its own
475[info] - should emit nothing in response to the EOF
476[info] Transformer.take
477[info] Transformer.take[In]
478[info] - should emit outputs corresponding to List.take(n)
479[info] - should end upon encountering the 1st input, if N=0
480[info] - should end after emitting Nth input, if N>0
481[info] - should not end before encountering N inputs
482[info] - should emit nothing in reaction to the end of the input
483[info] Transformer[In].take
484[info] - should emit outputs corresponding to List.take(n)
485[info] - should end upon encountering the 1st input, if N=0
486[info] - should end after emitting Nth input, if N>0
487[info] - should not end before encountering N inputs
488[info] - should emit nothing in reaction to the end of the input
489[info] Transformer.takeWhile
490[info] Transformer.takeWhile[In]
491[info] - should emit outputs corresponding to List.takeWhile(f)
492[info] - should discard the first predicate-failing input and terminate as a result
493[info] - should not end if no inputs fail the predicate
494[info] - should be stateless
495[info] - should emit nothing in response to the end of the input
496[info] Transformer[In].takeWhile
497[info] - should emit outputs corresponding to List.takeWhile(f)
498[info] - should discard the first predicate-failing input and terminate as a result
499[info] - should not end if no inputs fail the predicate
500[info] - should be stateless
501[info] - should emit nothing in response to the end of the input
502[info] Transformer.tap
503[info] Transformer.tap[In]
504[info] - should emit every input as output
505[info] - should run the side-effect for each input
506[info] - should noop in response to the EOF
507[info] Transformer[Int].tap
508[info] - should emit every input as output
509[info] - should run the side-effect for each input
510[info] - should noop in response to the EOF
511[info] ParserConjunctionTests:
512[info] Parser # and
513[info] - should create a disjunction that fails if either parser fails
514[info] - should combine parsers associatively
515[info] - should eagerly return false if an inner parser returns false
516[info] - should return true at the end if none of the inner parsers return by then
517[info] ParserTests:
518[info] Parser # map
519[info] - should return a result equivalent to running the mapping function on the base parser's result
520[info] - should pull the same number of inputs from the source as the base parser would have
521[info] with a mapping function that throws exceptions
522[info] - should bubble up exceptions thrown by the mapping function
523[info] - should not throw the exception until the base parser has yielded a result
524[info] Parser # orElse
525[info] - should return the result from the earliest underlying parser that succeeds
526[info] - should return the result whichever successful parser was earliest in the orElse chain
527[info] - should discard errors from underlying parsers as long as at least one succeeds
528[info] - should raise a NoSuccessfulParsersException if all of the underlying parsers fail
529[info] - should allow many parsers to be composed together into a single fallback chain
530[info] Parser # attempt
531[info] - should wrap a successful parser's result in a `Right`
532[info] - should catch an exception thrown by a failed parser if the Err type is Throwable
533[info] Parser # unwrapSafe
534[info] - should unwrap a Success result as a plain result instead
535[info] - should treat a successful `Failure` result as an error in the effect context instead
536[info] Parser # expectInputs
537[info] - should not interrupt the underlying parser if all of the inputs match the expectations
538[info] - should raise an UnfulfilledInputsException which lists the remaining expected inputs, upon encountering an early EOF
539[info] - should raise an UnexpectedInputException which lists the current and remaining expected inputs, upon encountering an input that doesn't match the predicate
540[info] Parser # interruptedBy
541[info] - should proceed normally if the interrupter never yields a result
542[info] - should stop parsing when the interrupter yields a result, not sending the input that triggered the interruption
543[info] - should bubble up exceptions thrown by the interrupter
544[info] - should raise an error if the base parser raises an error
545[info] Parser # beforeContext
546[info] - should delegate to `interruptedBy`
547[info] - should not interrupt the main parser if the `matcher` never causes a ContextPush
548[info] - should interrupt the main parser immediately when the `matcher` causes a ContextPush
549[info] Parser # followedBy / followedByStream
550[info] - should start the follow-up parser as soon as the base parser returns a result
551[info] - should feed the stack-accumulating events to the follow-up parser before continuing
552[info] - should properly accumulate the stack for replaying to the follow-up
553[info] - should be able to end the follow-up parser if that parser would finish during the stack replay
554[info] - should `finish` the follow-up parser immediately if the base parser consumes the whole input and there is no stack
555[info] - should allow chaining of the followedBy relationship
556[info] ParserCompanionTests:
557[info] Parser.firstOpt
558[info] Parser.firstOpt[A]
559[info] - should return the first element of the source stream
560[info] - should return None if the source stream is empty
561[info] - `.parse` should consume exactly one element from the source sequence
562[info] - `.parse` should consume exactly one element from the source stream
563[info] Parser[A].firstOpt
564[info] - should return the first element of the source stream
565[info] - should return None if the source stream is empty
566[info] - `.parse` should consume exactly one element from the source sequence
567[info] - `.parse` should consume exactly one element from the source stream
568[info] Parser.first
569[info] Parser.first[In]
570[info] - should return the first element of a non-empty source
571[info] - should throw a MissingFirstException when parsing an empty sequence
572[info] - `.parse` should consume exactly one element from the source sequence
573[info] - `.parse` should consume exactly one element from the source stream
574[info] Parser[In].first
575[info] - should return the first element of a non-empty source
576[info] - should throw a MissingFirstException when parsing an empty sequence
577[info] - `.parse` should consume exactly one element from the source sequence
578[info] - `.parse` should consume exactly one element from the source stream
579[info] Parser.find
580[info] Parser.find[In]
581[info] - should return None when parsing an empty list
582[info] - should return Some when parsing a list which contains a matching value
583[info] - should return None when parsing a list which does not contain any matching value
584[info] .parse
585[info] - should not pull values past the point where a matching value is found
586[info] - should pull the entire input if no matching value is found
587[info] with an exception-throwing predicate
588[info] - should capture thrown exceptions in the effect context
589[info] - should stop pulling values from the source when an exception is thrown
590[info] Parser[In].find
591[info] - should return None when parsing an empty list
592[info] - should return Some when parsing a list which contains a matching value
593[info] - should return None when parsing a list which does not contain any matching value
594[info] .parse
595[info] - should not pull values past the point where a matching value is found
596[info] - should pull the entire input if no matching value is found
597[info] with an exception-throwing predicate
598[info] - should capture thrown exceptions in the effect context
599[info] - should stop pulling values from the source when an exception is thrown
600[info] Parser.fold
601[info] Parser.fold[In, Out]
602[info] - should return the initial value when parsing an empty list
603[info] - should aggregate the inputs in the order they are encountered
604[info] with an exception-throwing aggregator function
605[info] - should capture thrown exceptions in the effect context
606[info] - should stop consuming inputs after an exception is thrown
607[info] - `.parse` should pull all inputs
608[info] Parser[In].fold[Out]
609[info] - should return the initial value when parsing an empty list
610[info] - should aggregate the inputs in the order they are encountered
611[info] with an exception-throwing aggregator function
612[info] - should capture thrown exceptions in the effect context
613[info] - should stop consuming inputs after an exception is thrown
614[info] - `.parse` should pull all inputs
615[info] Parser.pure
616[info] Parser.pure[Out]
617[info] - should return the value and ignore the inputs from the source
618[info] - should return the wrapped value even if the source is empty
619[info] - `.parse` should pull only input
620[info] - `.parse` should pull only 1 input
621[info] Parser[In].pure[Out]
622[info] - should return the value and ignore the inputs from the source
623[info] - should return the wrapped value even if the source is empty
624[info] - `.parse` should pull only input
625[info] - `.parse` should pull only 1 input
626[info] Parser.defer
627[info] Parser.defer[In, Out]
628[info] - should return the same value that the eval-returned parser would
629[info] - should only pull as many values from the source as the eval-returned parser would
630[info] - should bubble up exceptions thrown by the parser constructor when asked create a handler
631[info] Parser[In].defer[Out]
632[info] - should return the same value that the eval-returned parser would
633[info] - should only pull as many values from the source as the eval-returned parser would
634[info] - should bubble up exceptions thrown by the parser constructor when asked create a handler
635[info] Parser.delay
636[info] Parser.delay[Out]
637[info] - should not call the construction function until a constructed handler is asked to step or finish
638[info] - should bubble up exceptions thrown by the parser constructor when asked to step or finish
639[info] Parser[In].delay[Out]
640[info] - should not call the construction function until a constructed handler is asked to step or finish
641[info] - should bubble up exceptions thrown by the parser constructor when asked to step or finish
642[info] Parser.toChain / Parser.toList
643[info] Parser.toList[In]
644[info] - should collect all inputs from the source into a List
645[info] - should always pull all inputs from the source
646[info] - should be reusable
647[info] Parser[In].toList
648[info] - should collect all inputs from the source into a List
649[info] - should always pull all inputs from the source
650[info] - should be reusable
651[info] Parser.toChain[In]
652[info] - should collect all inputs from the source into a Chain
653[info] - should always pull all inputs from the source
654[info] - should be reusable
655[info] Parser[In].toChain
656[info] - should collect all inputs from the source into a Chain
657[info] - should always pull all inputs from the source
658[info] - should be reusable
659[info] Parser.fromBuilder
660[info] Parser.fromBuilder[In, Out]
661[info] - should add each input from the source to the builder, returning the result at the end of the stream
662[info] - should construct a new builder when it is asked to parse a source, to avoid sharing builders
663[info] when constructed with a shared builder reference
664[info] - re-running the parser will continue to accumulate values in the builder
665[info] Parser[In].impureBuild[Out]
666[info] - should add each input from the source to the builder, returning the result at the end of the stream
667[info] - should construct a new builder when it is asked to parse a source, to avoid sharing builders
668[info] when constructed with a shared builder reference
669[info] - re-running the parser will continue to accumulate values in the builder
670[info] Applicative[Parser]
671[info] .product
672[info] - should result in a ParserCompoundN with two underlying parsers
673[info] - should combine the output from the underlying parsers
674[info] - should only pull each event from the source once
675[info] - should catch and raise errors from the underlying parsers
676[info] - should abort execution upon encountering an error from an underlying parser
677[info] SemigroupalOps.tupled
678[info] (p1, p2)
679[info] - should create a ParserCompositeN with underlying parsers in a similar order
680[info] - should yield the same product of results as if the underlying parsers were run separately and then combined
681[info] (pErr, p3)
682[info] - should create a ParserCompositeN with underlying parsers in a similar order
683[info] - should yield the same product of results as if the underlying parsers were run separately and then combined
684[info] (p1, p2, p3)
685[info] - should create a ParserCompositeN with underlying parsers in a similar order
686[info] - should yield the same product of results as if the underlying parsers were run separately and then combined
687[info] ((p1, p2), p3)
688[info] - should create a ParserCompositeN with underlying parsers in a similar order
689[info] - should yield the same product of results as if the underlying parsers were run separately and then combined
690[info] (p1, (p2, p3))
691[info] - should create a ParserCompositeN with underlying parsers in a similar order
692[info] - should yield the same product of results as if the underlying parsers were run separately and then combined
693[info] (p1, p2, p3, p4)
694[info] - should create a ParserCompositeN with underlying parsers in a similar order
695[info] - should yield the same product of results as if the underlying parsers were run separately and then combined
696[info] (p1, (p2, p3, p4))
697[info] - should create a ParserCompositeN with underlying parsers in a similar order
698[info] - should yield the same product of results as if the underlying parsers were run separately and then combined
699[info] ((p1, p2, p3), p4)
700[info] - should create a ParserCompositeN with underlying parsers in a similar order
701[info] - should yield the same product of results as if the underlying parsers were run separately and then combined
702[info] ((p1, p2), (p3, p4))
703[info] - should create a ParserCompositeN with underlying parsers in a similar order
704[info] - should yield the same product of results as if the underlying parsers were run separately and then combined
705[info] (p1, (p2, p3), p4)
706[info] - should create a ParserCompositeN with underlying parsers in a similar order
707[info] - should yield the same product of results as if the underlying parsers were run separately and then combined
708[info] - should be able to combine parsers with varying (but common) input types
709Starting build for ProjectRef(file:/build/repo/,xmlFs2Data) (xml-spac-fs2-data)... [4/8]
710Compile scalacOptions: -unchecked, -language:higherKinds, -Wconf:msg=can be rewritten automatically under:s, -source:3.8
711[info] compiling 2 Scala sources to /build/repo/xml-fs2-data/target/scala-3.8.0-RC2/classes ...
712[info] done compiling
713[info] compiling 1 Scala source to /build/repo/xml-fs2-data/target/scala-3.8.0-RC2/test-classes ...
714[info] done compiling
715[info] Fs2XmlInteropTests:
716[info] XML with fs2-data support
717[info] Basic XML Parsing
718[info] Parser.forText
719[info] - should concatenate text events
720[info] - should preserve whitespace
721[info] Parser.forMandatoryAttribute
722[info] - should return the attribute from the first encountered element
723[info] - should return an error if the attribute is missing from the first encountered element
724[info] - should not return the attribute from an inner element
725[info] Parser.forOptionalAttribute
726[info] - should return the attribute from the first encountered element, in a Some
727[info] - should return None if the attribute is missing from the first encountered element
728[info] - should not return the attribute from an inner element
729[info] Invalid XML
730[info] - should cause an exception to be thrown while running a parser
731[info] Parser#map
732[info] - should produce successful mapped results for valid inputs
733[info] - should produce error results for invalid inputs
734[info] XMLSplitter
735[info] - should filter out unmached events
736[info] - should split the events into substreams
737[info] Parser.and
738[info] - should combine successful results of the combined parsers
739[info] - should result in an Error when any of the combined parsers does
740[info] - should pass the same context value to its inner parsers if it requires a context
741[info] XMLSplitter.map
742[info] - should choose the right sub-parser based on the context
743[info] Parser.followedBy
744[info] - should pass the result of the followed parser to create the resulting parser
745[info] - should provide convenient flatMap syntax that works the same way
746[info] - should not pass a result until the followed parser has finished
747[info] - should yield an error if the followed parser yields an error
748[info] Parser.followedByStream
749[info] - should pass the result of the followed parser to create the resulting transformer
750[info] - should provide convenient flatMap syntax that works the same way
751[info] - should not pass a result until the followed parser has finished
752[info] - should yield a *single* error if the followed parser yields an error
753[info] - should yield whatever errors the 'following' parser yields
754[info] Parser.beforeContext
755[info] - should allow an optional parser to fail-fast before its .followedBy
756[info] Transformer.transform
757[info] - should work with arbitrary XML transforms from splitters
758[info] Exception 'spac' trace handling (but with no line numbers for inputs)
759[info] control case
760[info] .parse
761[info] - should successfully parse the control input
762[info] .toPipe
763[info] - should successfully parse the control input
764[info] .parseF
765[info] - should successfully parse the control input
766[info] missing 'id' attribute case
767[info] .parse
768[info] - should include 'spac trace' information for the missing attribute
769[info] .toPipe
770[info] - should include 'spac trace' information for the missing attribute
771[info] .parseF
772[info] - should include 'spac trace' information for the missing attribute
773[info] missing first item inside splitter
774[info] .parse
775[info] - should include 'spac trace' information for the missing item
776[info] .toPipe
777[info] - should include 'spac trace' information for the missing item
778[info] .parseF
779[info] - should include 'spac trace' information for the missing item
780[info] inner parser that throws errors
781[info] .parse
782[info] - should capture the thrown exception and add 'spac trace' information
783[info] .toPipe
784[info] - should capture the thrown exception and add 'spac trace' information
785[info] .parseF
786[info] - should capture the thrown exception and add 'spac trace' information
787[info] running an exception-throwing transformer
788[info] - as an iterator should provide 'spac trace' information
789[info] - as an fs2.Pipe should provide 'spac trace' information
790Starting build for ProjectRef(file:/build/repo/,json) (json-spac)... [5/8]
791Compile scalacOptions: -unchecked, -language:higherKinds, -Wconf:msg=can be rewritten automatically under:s, -source:3.8
792Starting build for ProjectRef(file:/build/repo/,jsonJackson) (json-spac-jackson)... [6/8]
793Compile scalacOptions: -unchecked, -language:higherKinds, -Wconf:msg=can be rewritten automatically under:s, -source:3.8
794[info] compiling 2 Scala sources to /build/repo/json-jackson/target/scala-3.8.0-RC2/classes ...
795[info] done compiling
796[info] compiling 2 Scala sources to /build/repo/json-jackson/target/scala-3.8.0-RC2/test-classes ...
797[info] done compiling
798[info] JacksonSourceTests:
799[info] JacksonSource
800[info] .fromInputStream
801[info] - should not attempt to close the stream
802[info] .fromReader
803[info] - should not attempt to close the reader
804[info] JacksonInteropTests:
805[info] JSON support via Jackson
806[info] base behavior
807[info] JsonParser[Int]
808[info] - should succeed on a long input
809[info] - should fail on a double input
810[info] - should fail on a string input
811[info] - should fail on a array input
812[info] - should fail on a object input
813[info] - should fail on a null input
814[info] - should fail on a bool input
815[info] JsonParser[Long]
816[info] - should succeed on a long input
817[info] - should fail on a double input
818[info] - should fail on a string input
819[info] - should fail on a array input
820[info] - should fail on a object input
821[info] - should fail on a null input
822[info] - should fail on a bool input
823[info] JsonParser[Float]
824[info] - should succeed on a double input
825[info] - should fail on a long input
826[info] - should fail on a string input
827[info] - should fail on a array input
828[info] - should fail on a object input
829[info] - should fail on a null input
830[info] - should fail on a bool input
831[info] JsonParser[Double]
832[info] - should succeed on a double input
833[info] - should fail on a long input
834[info] - should fail on a string input
835[info] - should fail on a array input
836[info] - should fail on a object input
837[info] - should fail on a null input
838[info] - should fail on a bool input
839[info] JsonParser[String]
840[info] - should succeed on a string input
841[info] - should fail on a long input
842[info] - should fail on a double input
843[info] - should fail on a array input
844[info] - should fail on a object input
845[info] - should fail on a null input
846[info] - should fail on a bool input
847[info] JsonParser[Boolean]
848[info] - should succeed on a bool input
849[info] - should fail on a long input
850[info] - should fail on a double input
851[info] - should fail on a string input
852[info] - should fail on a array input
853[info] - should fail on a object input
854[info] - should fail on a null input
855[info] JsonParser.forNull
856[info] - should succeed on a null input
857[info] - should fail on a long input
858[info] - should fail on a double input
859[info] - should fail on a string input
860[info] - should fail on a array input
861[info] - should fail on a object input
862[info] - should fail on a bool input
863[info] JsonParser.listOf
864[info] - should succeed on a array input
865[info] - should fail on a long input
866[info] - should fail on a double input
867[info] - should fail on a string input
868[info] - should fail on a object input
869[info] - should fail on a null input
870[info] - should fail on a bool input
871[info] - should succeed when given an array as input
872[info] JsonParser.fieldOf
873[info] - should extract a value from the requested field
874[info] - should still succeed if the requested field is not the first field in the object
875[info] - should fail if the requested field is not present in the object
876[info] - should fail if the requested field contains the wrong type of value
877[info] - should fail if the requested field contains a null
878[info] - should fail if the input is not an object
879[info] JsonParser.nullableFieldOf
880[info] - should extract a value from the requested field
881[info] - should still succeed if the requested field is not the first field in the object
882[info] - should succeed with `None` as the result if the requested field is not present in the object
883[info] - should fail if the requested field contains the wrong type of value
884[info] - should succeed with `None` if the requested field contains a null
885[info] - should fail if the input is not an object
886[info] JsonParser.objectOf
887[info] - should succeed on a object input
888[info] - should fail on a long input
889[info] - should fail on a double input
890[info] - should fail on a string input
891[info] - should fail on a array input
892[info] - should fail on a null input
893[info] - should fail on a bool input
894[info] - should work properly when the inner parser is complex
895[info] JsonParser.objectOfNullable
896[info] - should succeed on a object input
897[info] - should fail on a long input
898[info] - should fail on a double input
899[info] - should fail on a string input
900[info] - should fail on a array input
901[info] - should fail on a null input
902[info] - should fail on a bool input
903[info] - should work properly when the inner parser is complex
904[info] JsonParser.oneOf
905[info] - should succeed if the input causes one of the parsers to succeed
906[info] - should fail if the input causes all of the parsers to fail
907[info] JsonSplitter(<object field>)
908[info] - should apply the attached parser to the inputs in the field's scope
909[info] - should not match nested contexts that would have matched at the same level
910[info] - should identify matching contexts even if that context was matched before
911[info] JsonSplitter(anyField)
912[info] - should extract values regardless of the field name
913[info] - should extract field names
914[info] JsonSplitter(<array index>)
915[info] - should extract values only from matching indexes
916[info] - should extract array indexes
917[info] Combining parsers to create a complex object parser
918[info] - should succeed when an expected input is sent
919[info] JsonSplitter#firstNotNull
920[info] JsonSplitter#firstNotNull (pending)
921[info] Exception 'spac' trace handling
922[info] control case
923[info] .parse
924[info] - should successfully parse the control input
925[info] .toPipe
926[info] - should successfully parse the control input
927[info] .parseF
928[info] - should successfully parse the control input
929[info] wrong 'id' case
930[info] .parse
931[info] - should include 'spac trace' information for the unexpected input exception
932[info] .toPipe
933[info] - should include 'spac trace' information for the unexpected input exception
934[info] .parseF
935[info] - should include 'spac trace' information for the unexpected input exception
936[info] missing field case
937[info] .parse
938[info] - should include 'spac trace' information for the unexpected input exception
939[info] .toPipe
940[info] - should include 'spac trace' information for the unexpected input exception
941[info] .parseF
942[info] - should include 'spac trace' information for the unexpected input exception
943[info] inner parser that throws errors
944[info] .parse
945[info] - should capture the thrown exception and add 'spac trace' information
946[info] .toPipe
947[info] - should capture the thrown exception and add 'spac trace' information
948[info] .parseF
949[info] - should capture the thrown exception and add 'spac trace' information
950[info] running an exception-throwing transformer
951[info] - as an iterator should provide 'spac trace' information
952[info] - as an fs2.Pipe should provide 'spac trace' information
953Starting build for ProjectRef(file:/build/repo/,xmlJavax) (xml-spac-javax)... [7/8]
954Compile scalacOptions: -unchecked, -language:higherKinds, -Wconf:msg=can be rewritten automatically under:s, -source:3.8
955[info] compiling 3 Scala sources to /build/repo/xml-javax/target/scala-3.8.0-RC2/classes ...
956[info] done compiling
957[info] compiling 1 Scala source to /build/repo/xml-javax/target/scala-3.8.0-RC2/test-classes ...
958[info] done compiling
959[info] JavaxSourceTests:
960[info] JavaxSource
961[info] Basic XML Parsing
962[info] Parser.forText
963[info] - should concatenate text events
964[info] - should preserve whitespace
965[info] Parser.forMandatoryAttribute
966[info] - should return the attribute from the first encountered element
967[info] - should return an error if the attribute is missing from the first encountered element
968[info] - should not return the attribute from an inner element
969[info] Parser.forOptionalAttribute
970[info] - should return the attribute from the first encountered element, in a Some
971[info] - should return None if the attribute is missing from the first encountered element
972[info] - should not return the attribute from an inner element
973[info] Invalid XML
974[info] - should cause an exception to be thrown while running a parser
975[info] Parser#map
976[info] - should produce successful mapped results for valid inputs
977[info] - should produce error results for invalid inputs
978[info] XMLSplitter
979[info] - should filter out unmached events
980[info] - should split the events into substreams
981[info] Parser.and
982[info] - should combine successful results of the combined parsers
983[info] - should result in an Error when any of the combined parsers does
984[info] - should pass the same context value to its inner parsers if it requires a context
985[info] XMLSplitter.map
986[info] - should choose the right sub-parser based on the context
987[info] Parser.followedBy
988[info] - should pass the result of the followed parser to create the resulting parser
989[info] - should provide convenient flatMap syntax that works the same way
990[info] - should not pass a result until the followed parser has finished
991[info] - should yield an error if the followed parser yields an error
992[info] Parser.followedByStream
993[info] - should pass the result of the followed parser to create the resulting transformer
994[info] - should provide convenient flatMap syntax that works the same way
995[info] - should not pass a result until the followed parser has finished
996[info] - should yield a *single* error if the followed parser yields an error
997[info] - should yield whatever errors the 'following' parser yields
998[info] Parser.beforeContext
999[info] - should allow an optional parser to fail-fast before its .followedBy
1000[info] Transformer.transform
1001[info] - should work with arbitrary XML transforms from splitters
1002[info] Exception 'spac' trace handling
1003[info] control case
1004[info] .parse
1005[info] - should successfully parse the control input
1006[info] .toPipe
1007[info] - should successfully parse the control input
1008[info] .parseF
1009[info] - should successfully parse the control input
1010[info] missing 'id' attribute case
1011[info] .parse
1012[info] - should include 'spac trace' information for the missing attribute
1013[info] .toPipe
1014[info] - should include 'spac trace' information for the missing attribute
1015[info] .parseF
1016[info] - should include 'spac trace' information for the missing attribute
1017[info] missing first item inside splitter
1018[info] .parse
1019[info] - should include 'spac trace' information for the missing item
1020[info] .toPipe
1021[info] - should include 'spac trace' information for the missing item
1022[info] .parseF
1023[info] - should include 'spac trace' information for the missing item
1024[info] inner parser that throws errors
1025[info] .parse
1026[info] - should capture the thrown exception and add 'spac trace' information
1027[info] .toPipe
1028[info] - should capture the thrown exception and add 'spac trace' information
1029[info] .parseF
1030[info] - should capture the thrown exception and add 'spac trace' information
1031[info] running an exception-throwing transformer
1032[info] - as an iterator should provide 'spac trace' information
1033[info] - as an fs2.Pipe should provide 'spac trace' information
1034[info] resource closing behavior
1035[info] .fromReader
1036[info] - should not close the underlying stream
1037[info] - should throw upon attempted re-iteration
1038[info] .fromInputStream
1039[info] - should not close the underlying stream
1040[info] - should throw upon attempted re-iteration
1041
1042************************
1043Build summary:
1044[{
1045 "module": "xml-spac",
1046 "compile": {"status": "ok", "tookMs": 17262, "warnings": 0, "errors": 0, "sourceVersion": "3.8"},
1047 "doc": {"status": "skipped", "tookMs": 0, "files": 0, "totalSizeKb": 0},
1048 "test-compile": {"status": "ok", "tookMs": 14493, "warnings": 5, "errors": 0, "sourceVersion": "3.8"},
1049 "test": {"status": "ok", "tookMs": 966, "passed": 37, "failed": 0, "ignored": 0, "skipped": 0, "total": 37, "byFramework": [{"framework": "unknown", "stats": {"passed": 37, "failed": 0, "ignored": 0, "skipped": 0, "total": 37}}]},
1050 "publish": {"status": "skipped", "tookMs": 0},
1051 "metadata": {
1052 "crossScalaVersions": ["2.12.18", "2.13.12", "3.3.1"]
1053}
1054},{
1055 "module": "json-spac-fs2-data",
1056 "compile": {"status": "ok", "tookMs": 1860, "warnings": 0, "errors": 0, "sourceVersion": "3.8"},
1057 "doc": {"status": "skipped", "tookMs": 0, "files": 0, "totalSizeKb": 0},
1058 "test-compile": {"status": "ok", "tookMs": 3264, "warnings": 0, "errors": 0, "sourceVersion": "3.8"},
1059 "test": {"status": "ok", "tookMs": 1175, "passed": 109, "failed": 0, "ignored": 0, "skipped": 0, "total": 109, "byFramework": [{"framework": "unknown", "stats": {"passed": 109, "failed": 0, "ignored": 0, "skipped": 0, "total": 109}}]},
1060 "publish": {"status": "skipped", "tookMs": 0},
1061 "metadata": {
1062 "crossScalaVersions": ["2.12.18", "2.13.12", "3.3.1"]
1063}
1064},{
1065 "module": "spac-interop-fs2",
1066 "compile": {"status": "ok", "tookMs": 100, "warnings": 0, "errors": 0, "sourceVersion": "3.8"},
1067 "doc": {"status": "skipped", "tookMs": 0, "files": 0, "totalSizeKb": 0},
1068 "test-compile": {"status": "ok", "tookMs": 163, "warnings": 0, "errors": 0, "sourceVersion": "3.8"},
1069 "test": {"status": "ok", "tookMs": 146, "passed": 0, "failed": 0, "ignored": 0, "skipped": 0, "total": 0, "byFramework": []},
1070 "publish": {"status": "skipped", "tookMs": 0},
1071 "metadata": {
1072 "crossScalaVersions": ["2.12.18", "2.13.12", "3.3.1"]
1073}
1074},{
1075 "module": "spac-core",
1076 "compile": {"status": "ok", "tookMs": 64, "warnings": 1, "errors": 0, "sourceVersion": "3.8"},
1077 "doc": {"status": "skipped", "tookMs": 0, "files": 0, "totalSizeKb": 0},
1078 "test-compile": {"status": "ok", "tookMs": 126, "warnings": 0, "errors": 0, "sourceVersion": "3.8"},
1079 "test": {"status": "ok", "tookMs": 921, "passed": 218, "failed": 0, "ignored": 0, "skipped": 0, "total": 218, "byFramework": [{"framework": "unknown", "stats": {"passed": 218, "failed": 0, "ignored": 0, "skipped": 0, "total": 218}}]},
1080 "publish": {"status": "skipped", "tookMs": 0},
1081 "metadata": {
1082 "crossScalaVersions": ["2.12.18", "2.13.12", "3.3.1"]
1083}
1084},{
1085 "module": "xml-spac-fs2-data",
1086 "compile": {"status": "ok", "tookMs": 1078, "warnings": 0, "errors": 0, "sourceVersion": "3.8"},
1087 "doc": {"status": "skipped", "tookMs": 0, "files": 0, "totalSizeKb": 0},
1088 "test-compile": {"status": "ok", "tookMs": 1144, "warnings": 0, "errors": 0, "sourceVersion": "3.8"},
1089 "test": {"status": "ok", "tookMs": 1163, "passed": 42, "failed": 0, "ignored": 0, "skipped": 0, "total": 42, "byFramework": [{"framework": "unknown", "stats": {"passed": 42, "failed": 0, "ignored": 0, "skipped": 0, "total": 42}}]},
1090 "publish": {"status": "skipped", "tookMs": 0},
1091 "metadata": {
1092 "crossScalaVersions": ["2.12.18", "2.13.12", "3.3.1"]
1093}
1094},{
1095 "module": "json-spac",
1096 "compile": {"status": "ok", "tookMs": 114, "warnings": 0, "errors": 0, "sourceVersion": "3.8"},
1097 "doc": {"status": "skipped", "tookMs": 0, "files": 0, "totalSizeKb": 0},
1098 "test-compile": {"status": "ok", "tookMs": 196, "warnings": 0, "errors": 0, "sourceVersion": "3.8"},
1099 "test": {"status": "ok", "tookMs": 209, "passed": 0, "failed": 0, "ignored": 0, "skipped": 0, "total": 0, "byFramework": []},
1100 "publish": {"status": "skipped", "tookMs": 0},
1101 "metadata": {
1102 "crossScalaVersions": ["2.12.18", "2.13.12", "3.3.1"]
1103}
1104},{
1105 "module": "json-spac-jackson",
1106 "compile": {"status": "ok", "tookMs": 656, "warnings": 0, "errors": 0, "sourceVersion": "3.8"},
1107 "doc": {"status": "skipped", "tookMs": 0, "files": 0, "totalSizeKb": 0},
1108 "test-compile": {"status": "ok", "tookMs": 1328, "warnings": 0, "errors": 0, "sourceVersion": "3.8"},
1109 "test": {"status": "ok", "tookMs": 1103, "passed": 111, "failed": 0, "ignored": 0, "skipped": 0, "total": 111, "byFramework": [{"framework": "unknown", "stats": {"passed": 111, "failed": 0, "ignored": 0, "skipped": 0, "total": 111}}]},
1110 "publish": {"status": "skipped", "tookMs": 0},
1111 "metadata": {
1112 "crossScalaVersions": ["2.12.18", "2.13.12", "3.3.1"]
1113}
1114},{
1115 "module": "xml-spac-javax",
1116 "compile": {"status": "ok", "tookMs": 765, "warnings": 0, "errors": 0, "sourceVersion": "3.8"},
1117 "doc": {"status": "skipped", "tookMs": 0, "files": 0, "totalSizeKb": 0},
1118 "test-compile": {"status": "ok", "tookMs": 973, "warnings": 0, "errors": 0, "sourceVersion": "3.8"},
1119 "test": {"status": "ok", "tookMs": 984, "passed": 46, "failed": 0, "ignored": 0, "skipped": 0, "total": 46, "byFramework": [{"framework": "unknown", "stats": {"passed": 46, "failed": 0, "ignored": 0, "skipped": 0, "total": 46}}]},
1120 "publish": {"status": "skipped", "tookMs": 0},
1121 "metadata": {
1122 "crossScalaVersions": ["2.12.18", "2.13.12", "3.3.1"]
1123}
1124}]
1125************************
1126[success] Total time: 79 s (0:01:19.0), completed Nov 28, 2025, 1:11:39 PM
1127[0JChecking patch project/plugins.sbt...
1128Checking patch project/build.properties...
1129Checking patch build.sbt...
1130Applied patch project/plugins.sbt cleanly.
1131Applied patch project/build.properties cleanly.
1132Applied patch build.sbt cleanly.