diff --git a/modules/parser/src/test/resources/test-source-1.ava b/modules/parser/src/test/resources/test-source-1.ava new file mode 100644 index 0000000..a1b8fa7 --- /dev/null +++ b/modules/parser/src/test/resources/test-source-1.ava @@ -0,0 +1,11 @@ +namespace tests + +given A +class Semigroup + defn combine: A -> A -> A +end class + +given A :: Semigroup +class Monoid + defn empty: A +end class diff --git a/modules/parser/src/test/scala/ava/parser/CharacterReaderTests.scala b/modules/parser/src/test/scala/ava/parser/CharacterReaderTests.scala new file mode 100644 index 0000000..edfd93e --- /dev/null +++ b/modules/parser/src/test/scala/ava/parser/CharacterReaderTests.scala @@ -0,0 +1,39 @@ +package ava.parser + +import cats.effect.IO +import cats.effect.unsafe.IORuntime +import java.io.InputStream +import scala.io.Source + +class CharacterReaderTests extends munit.FunSuite: + import CharacterReaderTests.* + + implicit val runtime: IORuntime = cats.effect.unsafe.IORuntime.global + + test("should read a file end to end") { + val file = Files.TestSource1 + val expected = loadFileToString(file) + val reader = CharacterReader.forInputStream(loadFileToStream(file)) + + val output = fs2.Stream + .repeatEval(IO(reader.consume())) + .takeWhile(_.isDefined) + .compile + .toList + .map(_.flatten) + .map(_.mkString) + .unsafeRunSync() + + assertEquals(output, expected) + } + + private def loadFileToString(name: String): String = + Source.fromResource(name).mkString + + private def loadFileToStream(name: String): InputStream = + getClass().getClassLoader().getResourceAsStream(name) + +object CharacterReaderTests: + + object Files: + val TestSource1: String = "test-source-1.ava"