summaryrefslogtreecommitdiff
path: root/main/test/src/define/MacroErrorTests.scala
diff options
context:
space:
mode:
Diffstat (limited to 'main/test/src/define/MacroErrorTests.scala')
-rw-r--r--main/test/src/define/MacroErrorTests.scala145
1 files changed, 145 insertions, 0 deletions
diff --git a/main/test/src/define/MacroErrorTests.scala b/main/test/src/define/MacroErrorTests.scala
new file mode 100644
index 00000000..c8b140fa
--- /dev/null
+++ b/main/test/src/define/MacroErrorTests.scala
@@ -0,0 +1,145 @@
+package mill.define
+
+import utest._
+import mill.{T, Module}
+import mill.util.TestUtil
+object MacroErrorTests extends TestSuite{
+
+ val tests = Tests{
+
+ 'errors{
+ val expectedMsg =
+ "T{} members must be defs defined in a Cacher class/trait/object body"
+
+ val err = compileError("object Foo extends TestUtil.BaseModule{ val x = T{1} }")
+ assert(err.msg == expectedMsg)
+ }
+
+ 'badParameterSets - {
+ 'command - {
+ val e = compileError("""
+ object foo extends mill.util.TestUtil.BaseModule{
+ def w = T.command{1}
+ }
+ mill.define.Discover[foo.type]
+ """)
+ assert(
+ e.msg.contains("`T.command` definitions must have 1 parameter list"),
+ e.pos.contains("def w = ")
+ )
+ }
+ 'target - {
+ val e = compileError("""
+ object foo extends mill.util.TestUtil.BaseModule{
+ def x() = T{1}
+ }
+ mill.define.Discover[foo.type]
+ """)
+ assert(
+ e.msg.contains("`T{...}` definitions must have 0 parameter lists"),
+ e.pos.contains("def x() = ")
+ )
+ }
+ 'input - {
+ val e = compileError("""
+ object foo extends mill.util.TestUtil.BaseModule{
+ def y() = T.input{1}
+ }
+ mill.define.Discover[foo.type]
+ """)
+ assert(
+ e.msg.contains("`T.input` definitions must have 0 parameter lists"),
+ e.pos.contains("def y() = ")
+ )
+ }
+ 'sources - {
+ val e = compileError("""
+ object foo extends mill.util.TestUtil.BaseModule{
+ def z() = T.sources{ammonite.ops.pwd}
+ }
+ mill.define.Discover[foo.type]
+ """)
+ assert(
+ e.msg.contains("`T.sources` definitions must have 0 parameter lists"),
+ e.pos.contains("def z() = ")
+ )
+ }
+ 'persistent - {
+ val e = compileError("""
+ object foo extends mill.util.TestUtil.BaseModule{
+ def a() = T.persistent{1}
+ }
+ mill.define.Discover[foo.type]
+ """)
+ assert(
+ e.msg.contains("`T.persistent` definitions must have 0 parameter lists"),
+ e.pos.contains("def a() = ")
+ )
+ }
+ }
+ 'badTmacro - {
+ // Make sure we can reference values from outside the T{...} block as part
+ // of our `Target#apply()` calls, but we cannot reference any values that
+ // come from inside the T{...} block
+ 'pos - {
+ val e = compileError("""
+ val a = T{ 1 }
+ val arr = Array(a)
+ val b = {
+ val c = 0
+ T{
+ arr(c)()
+ }
+ }
+ """)
+ assert(e.msg.contains(
+ "Modules, Targets and Commands can only be defined within a mill Module")
+ )
+ }
+ 'neg - {
+
+ val expectedMsg =
+ "Target#apply() call cannot use `value n` defined within the T{...} block"
+ val err = compileError("""new Module{
+ def a = T{ 1 }
+ val arr = Array(a)
+ def b = {
+ T{
+ val n = 0
+ arr(n)()
+ }
+ }
+ }""")
+ assert(err.msg == expectedMsg)
+ }
+ 'neg2 - {
+
+ val expectedMsg =
+ "Target#apply() call cannot use `value x` defined within the T{...} block"
+ val err = compileError("""new Module{
+ def a = T{ 1 }
+ val arr = Array(a)
+ def b = {
+ T{
+ arr.map{x => x()}
+ }
+ }
+ }""")
+ assert(err.msg == expectedMsg)
+ }
+ 'neg3{
+ val borkedCachedDiamond1 = utest.compileError("""
+ object borkedCachedDiamond1 {
+ def up = T{ TestUtil.test() }
+ def left = T{ TestUtil.test(up) }
+ def right = T{ TestUtil.test(up) }
+ def down = T{ TestUtil.test(left, right) }
+ }
+ """)
+ assert(borkedCachedDiamond1.msg.contains(
+ "Modules, Targets and Commands can only be defined within a mill Module")
+ )
+ }
+ }
+ }
+}