 
       spyOn(services.myService, "provideData").andCallThrough()
 
+      tools = {
+        testTool: (arg1, arg2) -> return {_1: arg1, _2: arg2};
+      }
+
       actions = 
         incrementServiceData: 
           paramDefs:
             service: "" 
           update: -> 
-            expect(@params.service.a).toBe(1)
+            expect(tools.testTool(@params.service.a, 2)._1).toBe(1)
             @params.service.a++
 
       layout = 

          service: "@service:myService"

      # parameters: node, modelData, assets, actions, tools, services, log, inputServiceData = null, outputServiceData = null
      modelPatches = GE.stepLoop(layout, {}, {}, actions, {}, services)

      expect(services.myService.provideData).toHaveBeenCalledWith({})
      expect(services.myService.establishData).toHaveBeenCalledWith({ a: 2 }, {})

      expect(services.myService.establishData).toHaveBeenCalledWith({ a: 2 }, {})
      expect(modelPatches).toBeEmpty()

    it "gathers service input data, visits nodes, uses tools, and gives output to services", ->
      services = 
        myService:
          provideData: -> return { a: 1 }
