summaryrefslogblamecommitdiff
path: root/main/test/src/eval/TaskTests.scala
blob: 8449a62f422d40cf8624665dce668a6f2f7595b3 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11


                 
 
             
 




                                                       

                                                                       






















                                          


                                                       


                                       


                                                       









                                     
                   

                                                                                  
                                          









                                                        
                       
                                                                  
                                          








                                                          
                   
                        
                                          










                                                                   
package mill.eval

import utest._

import mill.T

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
        os.makeDir.all(T.ctx().dest)
        os.write.append(T.ctx().dest/'count, "hello\n")
        os.read.lines(T.ctx().dest/'count).length
      }
      def nonPersistent = T{
        input() // force re-computation
        os.makeDir.all(T.ctx().dest)
        os.write.append(T.ctx().dest/'count, "hello\n")
        os.read.lines(T.ctx().dest/'count).length
      }

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

    test("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)

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

    test("persistent"){
      // Persistent tasks keep the working dir around between runs
      val check = new TestEvaluator(build)
      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)
    }

    test("worker"){
      // Persistent task
      def check = new TestEvaluator(build)

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