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, List(0)) } ++ allWaccFiles("wacc-examples/invalid/syntaxErr").map { p => (p.toString, List(100)) } ++ allWaccFiles("wacc-examples/invalid/semanticErr").map { p => (p.toString, List(200)) } ++ allWaccFiles("wacc-examples/invalid/whack").map { p => (p.toString, List(0, 100, 200)) } // 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.contains(x)) 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( // format: off // disable formatting to avoid binPack "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" // format: on ).find(filename.contains).isDefined }