ci: check format, commits, compilation and tests

Merge request lab2425_spring/WACC_37!1
This commit is contained in:
Gleb Koval 2025-01-27 21:30:36 +00:00
commit c1fc1c2fc3
10 changed files with 188 additions and 24 deletions

1
.commitlintrc.yml Normal file
View File

@ -0,0 +1 @@
extends: "@commitlint/config-conventional"

12
.editorconfig Normal file
View File

@ -0,0 +1,12 @@
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
[Makefile]
indent_style = tab
indent_size = 4

1
.gitignore vendored
View File

@ -2,3 +2,4 @@
.bsp/ .bsp/
.scala-build/ .scala-build/
.vscode/ .vscode/
wacc-examples/

48
.gitlab-ci.yml Normal file
View File

@ -0,0 +1,48 @@
stages:
- check
- compile
- test
default:
image: gumjoe/wacc-ci-scala:slim
check_format:
stage: check
needs: []
before_script:
- cs install scalafmt
script:
- scalafmt --check .
check_commits:
stage: check
needs: []
image: node:lts-alpine
before_script:
- apk add git
- npm install -g @commitlint/cli @commitlint/config-conventional
- git pull origin master
script:
- npx commitlint --from origin/master --to HEAD --verbose
compile_jvm:
stage: compile
needs: []
script:
- scala compile --platform jvm -Werror .
artifacts:
paths:
- .bsp/
- .scala-build/
test_jvm:
stage: test
# 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 .

2
.scalafmt.conf Normal file
View File

@ -0,0 +1,2 @@
version = 3.8.6
runner.dialect = scala36

View File

@ -33,3 +33,10 @@ builds your WACC compiler. Currently running 'make' will call
`wacc-compiler` `wacc-compiler`
in the root directory of the project. If this doesn't work for whatever reason, there are a few in the root directory of the project. If this doesn't work for whatever reason, there are a few
different alternatives you can try in the makefile. **Do not use the makefile as you're working, it's for labts/CI!** different alternatives you can try in the makefile. **Do not use the makefile as you're working, it's for labts/CI!**
# Contributing
- All commit messages must follow the [conventional commits spec](https://www.conventionalcommits.org/en/v1.0.0/).
- **This includes merge request titles**.
- All scala code must be formated with `scala format`.
- All scala code must compile without errors OR WARNINGS.

View File

@ -6,7 +6,8 @@ def main(args: Array[String]): Unit = {
println("hello WACC!") println("hello WACC!")
args.headOption match { args.headOption match {
case Some(expr) => parser.parse(expr) match { case Some(expr) =>
parser.parse(expr) match {
case Success(x) => println(s"$expr = $x") case Success(x) => println(s"$expr = $x")
case Failure(msg) => println(msg) case Failure(msg) => println(msg)
} }

View File

@ -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
}