ci: check format, commits, compilation and tests
Merge request lab2425_spring/WACC_37!1
This commit is contained in:
commit
c1fc1c2fc3
1
.commitlintrc.yml
Normal file
1
.commitlintrc.yml
Normal file
@ -0,0 +1 @@
|
|||||||
|
extends: "@commitlint/config-conventional"
|
12
.editorconfig
Normal file
12
.editorconfig
Normal 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
1
.gitignore
vendored
@ -2,3 +2,4 @@
|
|||||||
.bsp/
|
.bsp/
|
||||||
.scala-build/
|
.scala-build/
|
||||||
.vscode/
|
.vscode/
|
||||||
|
wacc-examples/
|
||||||
|
48
.gitlab-ci.yml
Normal file
48
.gitlab-ci.yml
Normal 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
2
.scalafmt.conf
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
version = 3.8.6
|
||||||
|
runner.dialect = scala36
|
@ -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.
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
92
src/test/wacc/examples.scala
Normal file
92
src/test/wacc/examples.scala
Normal 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
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user