From cb89bb54b675fdf576af3ff49f36643e8f523520 Mon Sep 17 00:00:00 2001 From: Gleb Koval Date: Mon, 27 Jan 2025 19:23:35 +0000 Subject: [PATCH] test: test against wacc-examples repo --- .gitignore | 1 + .gitlab-ci.yml | 10 +++- src/test/wacc/examples.scala | 92 ++++++++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 src/test/wacc/examples.scala diff --git a/.gitignore b/.gitignore index c3923f1..64ecf6a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .bsp/ .scala-build/ .vscode/ +wacc-examples/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ce35a58..760b3d3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -12,7 +12,7 @@ check_format: before_script: - cs install scalafmt script: - - scalafmt --check . || echo "Run 'scala format' to fix formatting issues." + - scalafmt --check . check_commits: stage: check @@ -37,6 +37,12 @@ compile_jvm: test_jvm: stage: test - needs: [ compile_jvm ] + # Use our own runner (not cloud VM or shared) to ensure we have multiple cores. + tags: [ large ] + # This is expensive, so do use `dependencies` instead of `needs` to + # ensure all previous stages pass. + dependencies: [ compile_jvm ] + before_script: + - git clone https://$EXAMPLES_AUTH@gitlab.doc.ic.ac.uk/lab2425_spring/wacc-examples.git script: - scala test --platform jvm . diff --git a/src/test/wacc/examples.scala b/src/test/wacc/examples.scala new file mode 100644 index 0000000..6400646 --- /dev/null +++ b/src/test/wacc/examples.scala @@ -0,0 +1,92 @@ +package wacc + +import org.scalatest.{ParallelTestExecution, BeforeAndAfterAll} +import org.scalatest.flatspec.AnyFlatSpec +import org.scalatest.Inspectors.forEvery +import parsley.{Success, Failure} + +class ParallelExamplesSpec + extends AnyFlatSpec + with BeforeAndAfterAll + with ParallelTestExecution { + val files = + allWaccFiles("wacc-examples/valid").map { p => + (p.toString, (_: Int) == 0) + } ++ + allWaccFiles("wacc-examples/invalid/syntaxErr").map { p => + (p.toString, (_: Int) == 100) + } ++ + allWaccFiles("wacc-examples/invalid/semanticErr").map { p => + (p.toString, (_: Int) == 200) + } ++ + allWaccFiles("wacc-examples/invalid/whack").map { p => + (p.toString, List(0, 100, 200).contains) + } + + // tests go here + forEvery(files.filter { (filename, _) => + !fileIsDissallowed(filename) + }) { (filename, expectedResult) => + s"$filename" should "be parsed with correct result" in { + val contents = os.read(os.Path(filename)) + parser.parse(contents) match { + case Success(x) => assert(expectedResult(x.toInt)) + case Failure(msg) => fail(msg) + } + } + } + + def allWaccFiles(dir: String): IndexedSeq[os.Path] = + val d = java.io.File(dir) + os.walk(os.Path(d.getAbsolutePath)).filter { _.ext == "wacc" } + + def fileIsDissallowed(filename: String): Boolean = + Seq( + "wacc-examples/valid/advanced", + "wacc-examples/valid/array", + "wacc-examples/valid/basic/exit", + "wacc-examples/valid/basic/skip", + "wacc-examples/valid/expressions", + "wacc-examples/valid/function/nested_functions", + "wacc-examples/valid/function/simple_functions", + "wacc-examples/valid/if", + "wacc-examples/valid/IO/print", + "wacc-examples/valid/IO/read", + "wacc-examples/valid/IO/IOLoop.wacc", + "wacc-examples/valid/IO/IOSequence.wacc", + "wacc-examples/valid/pairs", + "wacc-examples/valid/runtimeErr", + "wacc-examples/valid/scope", + "wacc-examples/valid/sequence", + "wacc-examples/valid/variables", + "wacc-examples/valid/while", + // invalid (syntax) + "wacc-examples/invalid/syntaxErr/array", + "wacc-examples/invalid/syntaxErr/basic", + "wacc-examples/invalid/syntaxErr/expressions", + "wacc-examples/invalid/syntaxErr/function", + "wacc-examples/invalid/syntaxErr/if", + "wacc-examples/invalid/syntaxErr/literals", + "wacc-examples/invalid/syntaxErr/pairs", + "wacc-examples/invalid/syntaxErr/print", + "wacc-examples/invalid/syntaxErr/sequence", + "wacc-examples/invalid/syntaxErr/variables", + "wacc-examples/invalid/syntaxErr/while", + // invalid (semantic) + "wacc-examples/invalid/semanticErr/array", + "wacc-examples/invalid/semanticErr/exit", + "wacc-examples/invalid/semanticErr/expressions", + "wacc-examples/invalid/semanticErr/function", + "wacc-examples/invalid/semanticErr/if", + "wacc-examples/invalid/semanticErr/IO", + "wacc-examples/invalid/semanticErr/multiple", + "wacc-examples/invalid/semanticErr/pairs", + "wacc-examples/invalid/semanticErr/print", + "wacc-examples/invalid/semanticErr/read", + "wacc-examples/invalid/semanticErr/scope", + "wacc-examples/invalid/semanticErr/variables", + "wacc-examples/invalid/semanticErr/while", + // invalid (whack) + "wacc-examples/invalid/whack" + ).find(filename.contains).isDefined +}