summaryrefslogblamecommitdiff
path: root/core/test/src/mill/eval/TaskTests.scala
blob: 538b0c12c326f5254a37a7a4e12d069f70185973 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11




                     
                           




                                                       

                                                                       














































                                                                                  
                             
















                                                                  
                             















                                                                 
                             













                                                                   
package mill.eval

import utest._
import ammonite.ops._
import mill.T
import mill.define.Discover
import mill.util.TestEvaluator
object TaskTests extends TestSuite{
  val tests = Tests{
    object build extends mill.util.TestUtil.BaseModule{
      var count = 0
      // Explicitly instantiate `Function1` objects to make sure we get
      // different instances each time
      def staticWorker = T.worker{
        new Function1[Int, Int] {
          def apply(v1: Int) = v1 + 1
        }
      }
      def noisyWorker = T.worker{
        new Function1[Int, Int] {
          def apply(v1: Int) = input() + 1
        }
      }
      def input = T.input{
        count += 1
        count
      }
      def task = T.task{
        count += 1
        count
      }
      def taskInput = T{ input() }
      def taskNoInput = T{ task() }

      def persistent = T.persistent{
        input() // force re-computation
        mkdir(T.ctx().dest)
        write.append(T.ctx().dest/'count, "hello\n")
        read.lines(T.ctx().dest/'count).length
      }
      def nonPersistent = T{
        input() // force re-computation
        mkdir(T.ctx().dest)
        write.append(T.ctx().dest/'count, "hello\n")
        read.lines(T.ctx().dest/'count).length
      }

      def staticWorkerDownstream = T{
        staticWorker().apply(1)
      }
      def noisyWorkerDownstream = T{
        noisyWorker().apply(1)
      }
    }

    'inputs - {
      // Inputs always re-evaluate, including forcing downstream cached Targets
      // to re-evaluate, but normal Tasks behind a Target run once then are cached
      val check = new TestEvaluator(
        build,
        Discover[build.type],
        pwd / 'target / 'workspace / "task-tests" / "inputs",
        pwd
      )

      val Right((1, 1)) = check.apply(build.taskInput)
      val Right((2, 1)) = check.apply(build.taskInput)
      val Right((3, 1)) = check.apply(build.taskInput)

      val Right((4, 1)) = check.apply(build.taskNoInput)
      val Right((4, 0)) = check.apply(build.taskNoInput)
      val Right((4, 0)) = check.apply(build.taskNoInput)
    }

    'persistent - {
      // Persistent tasks keep the working dir around between runs
      val check = new TestEvaluator(
        build,
        Discover[build.type],
        pwd / 'target / 'workspace / "task-tests" / "persistent",
        pwd
      )
      val Right((1, 1)) = check.apply(build.persistent)
      val Right((2, 1)) = check.apply(build.persistent)
      val Right((3, 1)) = check.apply(build.persistent)

      val Right((1, 1)) = check.apply(build.nonPersistent)
      val Right((1, 1)) = check.apply(build.nonPersistent)
      val Right((1, 1)) = check.apply(build.nonPersistent)
    }

    'worker - {
      // Persistent task
      def check = new TestEvaluator(
        build,
        Discover[build.type],
        pwd / 'target / 'workspace / "task-tests" / "worker",
        pwd
      )

      val Right((2, 1)) = check.apply(build.noisyWorkerDownstream)
      val Right((3, 1)) = check.apply(build.noisyWorkerDownstream)
      val Right((4, 1)) = check.apply(build.noisyWorkerDownstream)

      val Right((2, 1)) = check.apply(build.staticWorkerDownstream)
      val Right((2, 0)) = check.apply(build.staticWorkerDownstream)
      val Right((2, 0)) = check.apply(build.staticWorkerDownstream)
    }
  }
}