Giter Club home page Giter Club logo

tortoise's Introduction

Tortoise

info: https://github.com/NetLogo/NetLogo/wiki/NetLogo-Web

engine/compiler issues: https://github.com/NetLogo/Tortoise/issues

web server and client code and issues: https://github.com/NetLogo/Galapagos

Libraries

The following lists the libraries used by Tortoise and the licenses that they are released under:

Compiling

There are several sbt builds within the Tortoise project.

  • compilerJVM builds the JVM compiler project, used for running some tests.
  • compilerJS builds the Scala.js compiler project, which creates tortoise-compiler.js that can turn NetLogo models and code into javascript.
  • engine builds the combination CoffeeScript and Scala.js engine project, creating tortoise-engine.js, which is required to actually run the result of compiling a NetLogo model to javascript.
  • netLogoWeb contains a JVM project which runs an end-to-end tests against the artifacts of compilerJS and engine, using the Graal JS javascript runtime. It also contains the task to publish the finished javascript as a package.
  • macrosJS/JVM contain macros used by Tortoise in widget serialization/deserialization.

For more information see the Tortoise architecture wiki page

Hosted By: Cloudsmith

Package repository hosting is graciously provided by Cloudsmith.

tortoise's People

Contributors

alizenart avatar civitas-john avatar diparthshah avatar djperlovsky avatar ewouth avatar iloveivyxuan avatar isaacnoel avatar jjang4001 avatar lacuneta avatar loafie avatar mrerrormessage avatar qiemem avatar sethtisue avatar thebizzle avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tortoise's Issues

Floating point error in fd

Not sure why, but the following test fails:

    test("turtle motion 1") { implicit fixture => import fixture._
      declare("", WorldDimensions.square(8))
      testCommand("cro 8 ask turtles [fd 6]")
    }

The coords appear to not match up due to some floating point error.

Equality of empty list is wrong

I have this NetLogo code:

to-report my-length [l]
  if-else (l != []) [
    report 1 + my-length but-first l
  ]
  [
    report 0
  ]
end

that compiles to this JavaScript:

function MY_LENGTH (L) {
  if ((L !== [])) {
    return (1 + MY_LENGTH(Prims.butfirst(L)));
  } else {
    return 0;
  }
};

The NetLogo code works correctly when given an empty list, but the JavaScript version does not. The problem stems from the fact that L !== [] evaluates to true, even when L is empty.

recompilation of CoffeeScript sources is excessively slow

on my laptop, recompiling engine.coffee takes about ~25 seconds. this is really hurting my turnaround time on engine changes

meanwhile on the command line it takes just half a second:

% coffee --version               
CoffeeScript version 1.6.3
% time coffee -c -b engine.coffee
0.51s user 0.03s system 100% cpu 0.545 total

I guess the culprit is probably Rhino.

Make agent variables referenced by name instead of number

Former title: Why are globals being referenced by integer instead of name?

I realize that's how NetLogo does it, but it does seem a little silly. Referencing by name would making debugging and javascript-based interaction significantly easier.

Add mouse primitives

There needs to be some facility to hook them up with the front-end's mouse support. Maybe that involves taking in some callbacks or something.

Anyway, see NetLogo/Galapagos#107 for the corresponding issue in Galapagos.

Get language tests working with existing features

TortoiseFixture marks many of the language tests that ought to already be passing as "freebies" that are, for currently-unknown reason, not yet passing.

The tests listed as "to be investigated" ought to be investigated and classified. Any test that is ultimately not marked "obscure" or given some other low-priority classification ought to get taken care of within the near future.

model docking tests intermittently take forever

this might be the cause of the repeated timeouts we've been seeing on Travis lately. finally saw it on my Mac; here's a thread dump:

^\2013-10-01 18:57:44
Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.0-b56 mixed mode):

"JobThread" prio=5 tid=0x00007f908a497800 nid=0x17107 in Object.wait() [0x000000019bb3d000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00000001864480a8> (a java.lang.Object)
    at org.nlogo.job.JobThread$$anonfun$run$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(JobThread.scala:89)
    at org.nlogo.job.JobThread$$anonfun$run$1$$anonfun$apply$mcV$sp$1.apply(JobThread.scala:89)
    at org.nlogo.job.JobThread$$anonfun$run$1$$anonfun$apply$mcV$sp$1.apply(JobThread.scala:89)
    at scala.util.control.Exception$Catch.apply(Exception.scala:102)
    at org.nlogo.util.Exceptions$.ignoring(Exceptions.scala:38)
    at org.nlogo.job.JobThread$$anonfun$run$1.apply$mcV$sp(JobThread.scala:86)
    - locked <0x00000001864480a8> (a java.lang.Object)
    at org.nlogo.job.JobThread$$anonfun$run$1.apply(JobThread.scala:78)
    at org.nlogo.job.JobThread$$anonfun$run$1.apply(JobThread.scala:78)
    at scala.util.control.Exception$Catch.apply(Exception.scala:102)
    at org.nlogo.util.Exceptions$.handling(Exceptions.scala:41)
    at org.nlogo.job.JobThread.run(JobThread.scala:77)

"JobThread" prio=5 tid=0x00007f90912a7000 nid=0x16a07 in Object.wait() [0x0000000199b35000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x0000000135744bd8> (a java.lang.Object)
    at org.nlogo.job.JobThread$$anonfun$run$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(JobThread.scala:89)
    at org.nlogo.job.JobThread$$anonfun$run$1$$anonfun$apply$mcV$sp$1.apply(JobThread.scala:89)
    at org.nlogo.job.JobThread$$anonfun$run$1$$anonfun$apply$mcV$sp$1.apply(JobThread.scala:89)
    at scala.util.control.Exception$Catch.apply(Exception.scala:102)
    at org.nlogo.util.Exceptions$.ignoring(Exceptions.scala:38)
    at org.nlogo.job.JobThread$$anonfun$run$1.apply$mcV$sp(JobThread.scala:86)
    - locked <0x0000000135744bd8> (a java.lang.Object)
    at org.nlogo.job.JobThread$$anonfun$run$1.apply(JobThread.scala:78)
    at org.nlogo.job.JobThread$$anonfun$run$1.apply(JobThread.scala:78)
    at scala.util.control.Exception$Catch.apply(Exception.scala:102)
    at org.nlogo.util.Exceptions$.handling(Exceptions.scala:41)
    at org.nlogo.job.JobThread.run(JobThread.scala:77)

"Timer-0" daemon prio=5 tid=0x00007f909230c800 nid=0x16203 in Object.wait() [0x000000019bd40000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00000001356883f0> (a java.util.TaskQueue)
    at java.lang.Object.wait(Object.java:503)
    at java.util.TimerThread.mainLoop(Timer.java:526)
    - locked <0x00000001356883f0> (a java.util.TaskQueue)
    at java.util.TimerThread.run(Timer.java:505)

"JobThread" prio=5 tid=0x00007f908a313000 nid=0x13203 in Object.wait() [0x000000019d59e000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x0000000134432650> (a java.lang.Object)
    at org.nlogo.job.JobThread$$anonfun$run$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(JobThread.scala:89)
    at org.nlogo.job.JobThread$$anonfun$run$1$$anonfun$apply$mcV$sp$1.apply(JobThread.scala:89)
    at org.nlogo.job.JobThread$$anonfun$run$1$$anonfun$apply$mcV$sp$1.apply(JobThread.scala:89)
    at scala.util.control.Exception$Catch.apply(Exception.scala:102)
    at org.nlogo.util.Exceptions$.ignoring(Exceptions.scala:38)
    at org.nlogo.job.JobThread$$anonfun$run$1.apply$mcV$sp(JobThread.scala:86)
    - locked <0x0000000134432650> (a java.lang.Object)
    at org.nlogo.job.JobThread$$anonfun$run$1.apply(JobThread.scala:78)
    at org.nlogo.job.JobThread$$anonfun$run$1.apply(JobThread.scala:78)
    at scala.util.control.Exception$Catch.apply(Exception.scala:102)
    at org.nlogo.util.Exceptions$.handling(Exceptions.scala:41)
    at org.nlogo.job.JobThread.run(JobThread.scala:77)

"JobThread" prio=5 tid=0x00007f90896ba800 nid=0x13003 in Object.wait() [0x000000019cd9b000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x000000013444cb20> (a java.lang.Object)
    at org.nlogo.job.JobThread$$anonfun$run$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(JobThread.scala:89)
    at org.nlogo.job.JobThread$$anonfun$run$1$$anonfun$apply$mcV$sp$1.apply(JobThread.scala:89)
    at org.nlogo.job.JobThread$$anonfun$run$1$$anonfun$apply$mcV$sp$1.apply(JobThread.scala:89)
    at scala.util.control.Exception$Catch.apply(Exception.scala:102)
    at org.nlogo.util.Exceptions$.ignoring(Exceptions.scala:38)
    at org.nlogo.job.JobThread$$anonfun$run$1.apply$mcV$sp(JobThread.scala:86)
    - locked <0x000000013444cb20> (a java.lang.Object)
    at org.nlogo.job.JobThread$$anonfun$run$1.apply(JobThread.scala:78)
    at org.nlogo.job.JobThread$$anonfun$run$1.apply(JobThread.scala:78)
    at scala.util.control.Exception$Catch.apply(Exception.scala:102)
    at org.nlogo.util.Exceptions$.handling(Exceptions.scala:41)
    at org.nlogo.job.JobThread.run(JobThread.scala:77)

"JobThread" prio=5 tid=0x00007f90916e5800 nid=0x12803 in Object.wait() [0x000000019ad8f000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00000001344ccbd0> (a java.lang.Object)
    at org.nlogo.job.JobThread$$anonfun$run$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(JobThread.scala:89)
    at org.nlogo.job.JobThread$$anonfun$run$1$$anonfun$apply$mcV$sp$1.apply(JobThread.scala:89)
    at org.nlogo.job.JobThread$$anonfun$run$1$$anonfun$apply$mcV$sp$1.apply(JobThread.scala:89)
    at scala.util.control.Exception$Catch.apply(Exception.scala:102)
    at org.nlogo.util.Exceptions$.ignoring(Exceptions.scala:38)
    at org.nlogo.job.JobThread$$anonfun$run$1.apply$mcV$sp(JobThread.scala:86)
    - locked <0x00000001344ccbd0> (a java.lang.Object)
    at org.nlogo.job.JobThread$$anonfun$run$1.apply(JobThread.scala:78)
    at org.nlogo.job.JobThread$$anonfun$run$1.apply(JobThread.scala:78)
    at scala.util.control.Exception$Catch.apply(Exception.scala:102)
    at org.nlogo.util.Exceptions$.handling(Exceptions.scala:41)
    at org.nlogo.job.JobThread.run(JobThread.scala:77)

"ScalaTest-running-TestAgents" prio=5 tid=0x00007f90924ef000 nid=0x12203 runnable [0x0000000199330000]
   java.lang.Thread.State: RUNNABLE
    at java.util.WeakHashMap.get(WeakHashMap.java:471)
    at scala.collection.convert.Wrappers$JMapWrapperLike$class.get(Wrappers.scala:240)
    at scala.collection.convert.Wrappers$JMapWrapper.get(Wrappers.scala:275)
    at scala.collection.mutable.MapLike$class.getOrElseUpdate(MapLike.scala:187)
    at scala.collection.mutable.AbstractMap.getOrElseUpdate(Map.scala:91)
    at org.nlogo.mirror.Mirrorables$.getAgentKey(Mirrorables.scala:28)
    at org.nlogo.mirror.Mirrorables$MirrorableAgent.agentKey(Mirrorables.scala:31)
    at org.nlogo.mirror.Mirroring$$anonfun$diffs$1.apply(Mirroring.scala:40)
    at org.nlogo.mirror.Mirroring$$anonfun$diffs$1.apply(Mirroring.scala:39)
    at scala.collection.immutable.List.foreach(List.scala:318)
    at org.nlogo.mirror.Mirroring$.diffs(Mirroring.scala:39)
    at org.nlogo.tortoise.dock.DockingFixture.runCommand(DockingFixture.scala:85)
    at org.nlogo.tortoise.dock.DockingFixture.declare(DockingFixture.scala:140)
    at org.nlogo.tortoise.dock.TestAgents$$anonfun$17.apply(TestAgents.scala:101)
    at org.nlogo.tortoise.dock.TestAgents$$anonfun$17.apply(TestAgents.scala:100)
    at org.scalatest.fixture.Suite$TestFunAndConfigMap$$anonfun$apply$1.apply(Suite.scala:155)
    at org.scalatest.fixture.Suite$TestFunAndConfigMap$$anonfun$apply$1.apply(Suite.scala:155)
    at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
    at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
    at org.scalatest.fixture.Suite$TestFunAndConfigMap.apply(Suite.scala:155)
    at org.scalatest.fixture.Suite$OneArgTest$$anon$1.apply(Suite.scala:105)
    at org.scalatest.Suite$class.withFixture(Suite.scala:1121)
    at org.scalatest.fixture.FunSuite.withFixture(FunSuite.scala:228)
    at org.nlogo.tortoise.dock.DockingSuite$class.withFixture(DockingFixture.scala:16)
    at org.nlogo.tortoise.dock.TestAgents.withFixture(TestAgents.scala:8)
    at org.scalatest.fixture.FunSuiteLike$class.invokeWithFixture$1(FunSuiteLike.scala:143)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$runTest$1.apply(FunSuiteLike.scala:154)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$runTest$1.apply(FunSuiteLike.scala:154)
    at org.scalatest.SuperEngine.runTestImpl(Engine.scala:306)
    at org.scalatest.fixture.FunSuiteLike$class.runTest(FunSuiteLike.scala:154)
    at org.scalatest.fixture.FunSuite.runTest(FunSuite.scala:228)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$runTests$1.apply(FunSuiteLike.scala:214)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$runTests$1.apply(FunSuiteLike.scala:214)
    at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:413)
    at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:401)
    at scala.collection.immutable.List.foreach(List.scala:318)
    at org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:401)
    at org.scalatest.SuperEngine.org$scalatest$SuperEngine$$runTestsInBranch(Engine.scala:396)
    at org.scalatest.SuperEngine.runTestsImpl(Engine.scala:483)
    at org.scalatest.fixture.FunSuiteLike$class.runTests(FunSuiteLike.scala:214)
    at org.scalatest.fixture.FunSuite.runTests(FunSuite.scala:228)
    at org.scalatest.Suite$class.run(Suite.scala:1437)
    at org.scalatest.fixture.FunSuite.org$scalatest$fixture$FunSuiteLike$$super$run(FunSuite.scala:228)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$run$1.apply(FunSuiteLike.scala:218)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$run$1.apply(FunSuiteLike.scala:218)
    at org.scalatest.SuperEngine.runImpl(Engine.scala:545)
    at org.scalatest.fixture.FunSuiteLike$class.run(FunSuiteLike.scala:218)
    at org.scalatest.fixture.FunSuite.run(FunSuite.scala:228)
    at org.scalatest.tools.Framework.org$scalatest$tools$Framework$$runSuite(Framework.scala:268)
    at org.scalatest.tools.Framework$ScalaTestTask.execute(Framework.scala:475)
    at sbt.TestRunner.runTest$1(TestFramework.scala:84)
    at sbt.TestRunner.run(TestFramework.scala:94)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:224)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:224)
    at sbt.TestFramework$.sbt$TestFramework$$withContextLoader(TestFramework.scala:212)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:224)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:224)
    at sbt.TestFunction.apply(TestFramework.scala:229)
    at sbt.Tests$$anonfun$7.apply(Tests.scala:196)
    at sbt.Tests$$anonfun$7.apply(Tests.scala:196)
    at sbt.std.Transform$$anon$3$$anonfun$apply$2.apply(System.scala:45)
    at sbt.std.Transform$$anon$3$$anonfun$apply$2.apply(System.scala:45)
    at sbt.std.Transform$$anon$4.work(System.scala:64)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
    at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:18)
    at sbt.Execute.work(Execute.scala:244)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
    at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:160)
    at sbt.CompletionService$$anon$2.call(CompletionService.scala:30)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)

"ScalaTest-running-TestClimateModel" prio=5 tid=0x00007f908a221800 nid=0x12003 runnable [0x000000019912d000]
   java.lang.Thread.State: RUNNABLE
    at java.util.WeakHashMap.get(WeakHashMap.java:471)
    at scala.collection.convert.Wrappers$JMapWrapperLike$class.get(Wrappers.scala:240)
    at scala.collection.convert.Wrappers$JMapWrapper.get(Wrappers.scala:275)
    at scala.collection.mutable.MapLike$class.getOrElseUpdate(MapLike.scala:187)
    at scala.collection.mutable.AbstractMap.getOrElseUpdate(Map.scala:91)
    at org.nlogo.mirror.Mirrorables$.getAgentKey(Mirrorables.scala:28)
    at org.nlogo.mirror.Mirrorables$MirrorableAgent.agentKey(Mirrorables.scala:31)
    at org.nlogo.mirror.Mirroring$$anonfun$diffs$1.apply(Mirroring.scala:40)
    at org.nlogo.mirror.Mirroring$$anonfun$diffs$1.apply(Mirroring.scala:39)
    at scala.collection.immutable.List.foreach(List.scala:318)
    at org.nlogo.mirror.Mirroring$.diffs(Mirroring.scala:39)
    at org.nlogo.tortoise.dock.DockingFixture.runCommand(DockingFixture.scala:85)
    at org.nlogo.headless.lang.Fixture.testCommand(Fixture.scala:165)
    at org.nlogo.tortoise.dock.TestClimateModel$$anonfun$1.apply(TestClimateModel.scala:309)
    at org.nlogo.tortoise.dock.TestClimateModel$$anonfun$1.apply(TestClimateModel.scala:32)
    at org.scalatest.fixture.Suite$TestFunAndConfigMap$$anonfun$apply$1.apply(Suite.scala:155)
    at org.scalatest.fixture.Suite$TestFunAndConfigMap$$anonfun$apply$1.apply(Suite.scala:155)
    at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
    at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
    at org.scalatest.fixture.Suite$TestFunAndConfigMap.apply(Suite.scala:155)
    at org.scalatest.fixture.Suite$OneArgTest$$anon$1.apply(Suite.scala:105)
    at org.scalatest.Suite$class.withFixture(Suite.scala:1121)
    at org.scalatest.fixture.FunSuite.withFixture(FunSuite.scala:228)
    at org.nlogo.tortoise.dock.DockingSuite$class.withFixture(DockingFixture.scala:16)
    at org.nlogo.tortoise.dock.TestClimateModel.withFixture(TestClimateModel.scala:8)
    at org.scalatest.fixture.FunSuiteLike$class.invokeWithFixture$1(FunSuiteLike.scala:143)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$runTest$1.apply(FunSuiteLike.scala:154)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$runTest$1.apply(FunSuiteLike.scala:154)
    at org.scalatest.SuperEngine.runTestImpl(Engine.scala:306)
    at org.scalatest.fixture.FunSuiteLike$class.runTest(FunSuiteLike.scala:154)
    at org.scalatest.fixture.FunSuite.runTest(FunSuite.scala:228)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$runTests$1.apply(FunSuiteLike.scala:214)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$runTests$1.apply(FunSuiteLike.scala:214)
    at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:413)
    at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:401)
    at scala.collection.immutable.List.foreach(List.scala:318)
    at org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:401)
    at org.scalatest.SuperEngine.org$scalatest$SuperEngine$$runTestsInBranch(Engine.scala:396)
    at org.scalatest.SuperEngine.runTestsImpl(Engine.scala:483)
    at org.scalatest.fixture.FunSuiteLike$class.runTests(FunSuiteLike.scala:214)
    at org.scalatest.fixture.FunSuite.runTests(FunSuite.scala:228)
    at org.scalatest.Suite$class.run(Suite.scala:1437)
    at org.scalatest.fixture.FunSuite.org$scalatest$fixture$FunSuiteLike$$super$run(FunSuite.scala:228)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$run$1.apply(FunSuiteLike.scala:218)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$run$1.apply(FunSuiteLike.scala:218)
    at org.scalatest.SuperEngine.runImpl(Engine.scala:545)
    at org.scalatest.fixture.FunSuiteLike$class.run(FunSuiteLike.scala:218)
    at org.scalatest.fixture.FunSuite.run(FunSuite.scala:228)
    at org.scalatest.tools.Framework.org$scalatest$tools$Framework$$runSuite(Framework.scala:268)
    at org.scalatest.tools.Framework$ScalaTestTask.execute(Framework.scala:475)
    at sbt.TestRunner.runTest$1(TestFramework.scala:84)
    at sbt.TestRunner.run(TestFramework.scala:94)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:224)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:224)
    at sbt.TestFramework$.sbt$TestFramework$$withContextLoader(TestFramework.scala:212)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:224)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:224)
    at sbt.TestFunction.apply(TestFramework.scala:229)
    at sbt.Tests$$anonfun$7.apply(Tests.scala:196)
    at sbt.Tests$$anonfun$7.apply(Tests.scala:196)
    at sbt.std.Transform$$anon$3$$anonfun$apply$2.apply(System.scala:45)
    at sbt.std.Transform$$anon$3$$anonfun$apply$2.apply(System.scala:45)
    at sbt.std.Transform$$anon$4.work(System.scala:64)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
    at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:18)
    at sbt.Execute.work(Execute.scala:244)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
    at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:160)
    at sbt.CompletionService$$anon$2.call(CompletionService.scala:30)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)

"ScalaTest-running-TestBasics" prio=5 tid=0x00007f908b11b000 nid=0x11e03 runnable [0x0000000198f2a000]
   java.lang.Thread.State: RUNNABLE
    at java.util.WeakHashMap.get(WeakHashMap.java:471)
    at scala.collection.convert.Wrappers$JMapWrapperLike$class.get(Wrappers.scala:240)
    at scala.collection.convert.Wrappers$JMapWrapper.get(Wrappers.scala:275)
    at scala.collection.mutable.MapLike$class.getOrElseUpdate(MapLike.scala:187)
    at scala.collection.mutable.AbstractMap.getOrElseUpdate(Map.scala:91)
    at org.nlogo.mirror.Mirrorables$.getAgentKey(Mirrorables.scala:28)
    at org.nlogo.mirror.Mirrorables$MirrorableAgent.agentKey(Mirrorables.scala:31)
    at org.nlogo.mirror.Mirroring$$anonfun$diffs$1.apply(Mirroring.scala:40)
    at org.nlogo.mirror.Mirroring$$anonfun$diffs$1.apply(Mirroring.scala:39)
    at scala.collection.immutable.List.foreach(List.scala:318)
    at org.nlogo.mirror.Mirroring$.diffs(Mirroring.scala:39)
    at org.nlogo.tortoise.dock.DockingFixture.runCommand(DockingFixture.scala:85)
    at org.nlogo.headless.lang.Fixture.testCommand(Fixture.scala:165)
    at org.nlogo.tortoise.dock.TestBasics$$anonfun$18.apply(TestBasics.scala:126)
    at org.nlogo.tortoise.dock.TestBasics$$anonfun$18.apply(TestBasics.scala:123)
    at org.scalatest.fixture.Suite$TestFunAndConfigMap$$anonfun$apply$1.apply(Suite.scala:155)
    at org.scalatest.fixture.Suite$TestFunAndConfigMap$$anonfun$apply$1.apply(Suite.scala:155)
    at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
    at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
    at org.scalatest.fixture.Suite$TestFunAndConfigMap.apply(Suite.scala:155)
    at org.scalatest.fixture.Suite$OneArgTest$$anon$1.apply(Suite.scala:105)
    at org.scalatest.Suite$class.withFixture(Suite.scala:1121)
    at org.scalatest.fixture.FunSuite.withFixture(FunSuite.scala:228)
    at org.nlogo.tortoise.dock.DockingSuite$class.withFixture(DockingFixture.scala:16)
    at org.nlogo.tortoise.dock.TestBasics.withFixture(TestBasics.scala:6)
    at org.scalatest.fixture.FunSuiteLike$class.invokeWithFixture$1(FunSuiteLike.scala:143)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$runTest$1.apply(FunSuiteLike.scala:154)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$runTest$1.apply(FunSuiteLike.scala:154)
    at org.scalatest.SuperEngine.runTestImpl(Engine.scala:306)
    at org.scalatest.fixture.FunSuiteLike$class.runTest(FunSuiteLike.scala:154)
    at org.scalatest.fixture.FunSuite.runTest(FunSuite.scala:228)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$runTests$1.apply(FunSuiteLike.scala:214)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$runTests$1.apply(FunSuiteLike.scala:214)
    at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:413)
    at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:401)
    at scala.collection.immutable.List.foreach(List.scala:318)
    at org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:401)
    at org.scalatest.SuperEngine.org$scalatest$SuperEngine$$runTestsInBranch(Engine.scala:396)
    at org.scalatest.SuperEngine.runTestsImpl(Engine.scala:483)
    at org.scalatest.fixture.FunSuiteLike$class.runTests(FunSuiteLike.scala:214)
    at org.scalatest.fixture.FunSuite.runTests(FunSuite.scala:228)
    at org.scalatest.Suite$class.run(Suite.scala:1437)
    at org.scalatest.fixture.FunSuite.org$scalatest$fixture$FunSuiteLike$$super$run(FunSuite.scala:228)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$run$1.apply(FunSuiteLike.scala:218)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$run$1.apply(FunSuiteLike.scala:218)
    at org.scalatest.SuperEngine.runImpl(Engine.scala:545)
    at org.scalatest.fixture.FunSuiteLike$class.run(FunSuiteLike.scala:218)
    at org.scalatest.fixture.FunSuite.run(FunSuite.scala:228)
    at org.scalatest.tools.Framework.org$scalatest$tools$Framework$$runSuite(Framework.scala:268)
    at org.scalatest.tools.Framework$ScalaTestTask.execute(Framework.scala:475)
    at sbt.TestRunner.runTest$1(TestFramework.scala:84)
    at sbt.TestRunner.run(TestFramework.scala:94)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:224)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:224)
    at sbt.TestFramework$.sbt$TestFramework$$withContextLoader(TestFramework.scala:212)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:224)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:224)
    at sbt.TestFunction.apply(TestFramework.scala:229)
    at sbt.Tests$$anonfun$7.apply(Tests.scala:196)
    at sbt.Tests$$anonfun$7.apply(Tests.scala:196)
    at sbt.std.Transform$$anon$3$$anonfun$apply$2.apply(System.scala:45)
    at sbt.std.Transform$$anon$3$$anonfun$apply$2.apply(System.scala:45)
    at sbt.std.Transform$$anon$4.work(System.scala:64)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
    at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:18)
    at sbt.Execute.work(Execute.scala:244)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
    at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:160)
    at sbt.CompletionService$$anon$2.call(CompletionService.scala:30)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)

"ScalaTest-dispatcher" prio=5 tid=0x00007f9091ed8000 nid=0x11c03 waiting on condition [0x00000001988d7000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000001342f1740> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at org.scalatest.DispatchReporter$Propagator.run(DispatchReporter.scala:157)
    at java.lang.Thread.run(Thread.java:724)

"ScalaTest-running-TestTermitesModel" prio=5 tid=0x00007f9091ff3800 nid=0x11a03 runnable [0x0000000198587000]
   java.lang.Thread.State: RUNNABLE
    at java.util.WeakHashMap.get(WeakHashMap.java:471)
    at scala.collection.convert.Wrappers$JMapWrapperLike$class.get(Wrappers.scala:240)
    at scala.collection.convert.Wrappers$JMapWrapper.get(Wrappers.scala:275)
    at scala.collection.mutable.MapLike$class.getOrElseUpdate(MapLike.scala:187)
    at scala.collection.mutable.AbstractMap.getOrElseUpdate(Map.scala:91)
    at org.nlogo.mirror.Mirrorables$.getAgentKey(Mirrorables.scala:28)
    at org.nlogo.mirror.Mirrorables$MirrorableAgent.agentKey(Mirrorables.scala:31)
    at org.nlogo.mirror.Mirroring$$anonfun$diffs$1.apply(Mirroring.scala:40)
    at org.nlogo.mirror.Mirroring$$anonfun$diffs$1.apply(Mirroring.scala:39)
    at scala.collection.immutable.List.foreach(List.scala:318)
    at org.nlogo.mirror.Mirroring$.diffs(Mirroring.scala:39)
    at org.nlogo.tortoise.dock.DockingFixture.runCommand(DockingFixture.scala:85)
    at org.nlogo.headless.lang.Fixture.testCommand(Fixture.scala:165)
    at org.nlogo.tortoise.dock.TestTermitesModel$$anonfun$1.apply(TestTermitesModel.scala:81)
    at org.nlogo.tortoise.dock.TestTermitesModel$$anonfun$1.apply(TestTermitesModel.scala:10)
    at org.scalatest.fixture.Suite$TestFunAndConfigMap$$anonfun$apply$1.apply(Suite.scala:155)
    at org.scalatest.fixture.Suite$TestFunAndConfigMap$$anonfun$apply$1.apply(Suite.scala:155)
    at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
    at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
    at org.scalatest.fixture.Suite$TestFunAndConfigMap.apply(Suite.scala:155)
    at org.scalatest.fixture.Suite$OneArgTest$$anon$1.apply(Suite.scala:105)
    at org.scalatest.Suite$class.withFixture(Suite.scala:1121)
    at org.scalatest.fixture.FunSuite.withFixture(FunSuite.scala:228)
    at org.nlogo.tortoise.dock.DockingSuite$class.withFixture(DockingFixture.scala:16)
    at org.nlogo.tortoise.dock.TestTermitesModel.withFixture(TestTermitesModel.scala:8)
    at org.scalatest.fixture.FunSuiteLike$class.invokeWithFixture$1(FunSuiteLike.scala:143)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$runTest$1.apply(FunSuiteLike.scala:154)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$runTest$1.apply(FunSuiteLike.scala:154)
    at org.scalatest.SuperEngine.runTestImpl(Engine.scala:306)
    at org.scalatest.fixture.FunSuiteLike$class.runTest(FunSuiteLike.scala:154)
    at org.scalatest.fixture.FunSuite.runTest(FunSuite.scala:228)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$runTests$1.apply(FunSuiteLike.scala:214)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$runTests$1.apply(FunSuiteLike.scala:214)
    at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:413)
    at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:401)
    at scala.collection.immutable.List.foreach(List.scala:318)
    at org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:401)
    at org.scalatest.SuperEngine.org$scalatest$SuperEngine$$runTestsInBranch(Engine.scala:396)
    at org.scalatest.SuperEngine.runTestsImpl(Engine.scala:483)
    at org.scalatest.fixture.FunSuiteLike$class.runTests(FunSuiteLike.scala:214)
    at org.scalatest.fixture.FunSuite.runTests(FunSuite.scala:228)
    at org.scalatest.Suite$class.run(Suite.scala:1437)
    at org.scalatest.fixture.FunSuite.org$scalatest$fixture$FunSuiteLike$$super$run(FunSuite.scala:228)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$run$1.apply(FunSuiteLike.scala:218)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$run$1.apply(FunSuiteLike.scala:218)
    at org.scalatest.SuperEngine.runImpl(Engine.scala:545)
    at org.scalatest.fixture.FunSuiteLike$class.run(FunSuiteLike.scala:218)
    at org.scalatest.fixture.FunSuite.run(FunSuite.scala:228)
    at org.scalatest.tools.Framework.org$scalatest$tools$Framework$$runSuite(Framework.scala:268)
    at org.scalatest.tools.Framework$ScalaTestTask.execute(Framework.scala:475)
    at sbt.TestRunner.runTest$1(TestFramework.scala:84)
    at sbt.TestRunner.run(TestFramework.scala:94)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:224)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:224)
    at sbt.TestFramework$.sbt$TestFramework$$withContextLoader(TestFramework.scala:212)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:224)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:224)
    at sbt.TestFunction.apply(TestFramework.scala:229)
    at sbt.Tests$$anonfun$7.apply(Tests.scala:196)
    at sbt.Tests$$anonfun$7.apply(Tests.scala:196)
    at sbt.std.Transform$$anon$3$$anonfun$apply$2.apply(System.scala:45)
    at sbt.std.Transform$$anon$3$$anonfun$apply$2.apply(System.scala:45)
    at sbt.std.Transform$$anon$4.work(System.scala:64)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
    at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:18)
    at sbt.Execute.work(Execute.scala:244)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
    at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:160)
    at sbt.CompletionService$$anon$2.call(CompletionService.scala:30)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)

"ScalaTest-running-TestWolfModel" prio=5 tid=0x00007f90910cb000 nid=0x10f07 runnable [0x0000000197a23000]
   java.lang.Thread.State: RUNNABLE
    at java.util.WeakHashMap.get(WeakHashMap.java:471)
    at scala.collection.convert.Wrappers$JMapWrapperLike$class.get(Wrappers.scala:240)
    at scala.collection.convert.Wrappers$JMapWrapper.get(Wrappers.scala:275)
    at scala.collection.mutable.MapLike$class.getOrElseUpdate(MapLike.scala:187)
    at scala.collection.mutable.AbstractMap.getOrElseUpdate(Map.scala:91)
    at org.nlogo.mirror.Mirrorables$.getAgentKey(Mirrorables.scala:28)
    at org.nlogo.mirror.Mirrorables$MirrorableAgent.agentKey(Mirrorables.scala:31)
    at org.nlogo.mirror.Mirroring$$anonfun$diffs$1.apply(Mirroring.scala:40)
    at org.nlogo.mirror.Mirroring$$anonfun$diffs$1.apply(Mirroring.scala:39)
    at scala.collection.immutable.List.foreach(List.scala:318)
    at org.nlogo.mirror.Mirroring$.diffs(Mirroring.scala:39)
    at org.nlogo.tortoise.dock.DockingFixture.runCommand(DockingFixture.scala:85)
    at org.nlogo.tortoise.dock.DockingFixture.declare(DockingFixture.scala:140)
    at org.nlogo.tortoise.dock.TestWolfModel$$anonfun$1.apply(TestWolfModel.scala:170)
    at org.nlogo.tortoise.dock.TestWolfModel$$anonfun$1.apply(TestWolfModel.scala:10)
    at org.scalatest.fixture.Suite$TestFunAndConfigMap$$anonfun$apply$1.apply(Suite.scala:155)
    at org.scalatest.fixture.Suite$TestFunAndConfigMap$$anonfun$apply$1.apply(Suite.scala:155)
    at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
    at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
    at org.scalatest.fixture.Suite$TestFunAndConfigMap.apply(Suite.scala:155)
    at org.scalatest.fixture.Suite$OneArgTest$$anon$1.apply(Suite.scala:105)
    at org.scalatest.Suite$class.withFixture(Suite.scala:1121)
    at org.scalatest.fixture.FunSuite.withFixture(FunSuite.scala:228)
    at org.nlogo.tortoise.dock.DockingSuite$class.withFixture(DockingFixture.scala:16)
    at org.nlogo.tortoise.dock.TestWolfModel.withFixture(TestWolfModel.scala:8)
    at org.scalatest.fixture.FunSuiteLike$class.invokeWithFixture$1(FunSuiteLike.scala:143)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$runTest$1.apply(FunSuiteLike.scala:154)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$runTest$1.apply(FunSuiteLike.scala:154)
    at org.scalatest.SuperEngine.runTestImpl(Engine.scala:306)
    at org.scalatest.fixture.FunSuiteLike$class.runTest(FunSuiteLike.scala:154)
    at org.scalatest.fixture.FunSuite.runTest(FunSuite.scala:228)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$runTests$1.apply(FunSuiteLike.scala:214)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$runTests$1.apply(FunSuiteLike.scala:214)
    at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:413)
    at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:401)
    at scala.collection.immutable.List.foreach(List.scala:318)
    at org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:401)
    at org.scalatest.SuperEngine.org$scalatest$SuperEngine$$runTestsInBranch(Engine.scala:396)
    at org.scalatest.SuperEngine.runTestsImpl(Engine.scala:483)
    at org.scalatest.fixture.FunSuiteLike$class.runTests(FunSuiteLike.scala:214)
    at org.scalatest.fixture.FunSuite.runTests(FunSuite.scala:228)
    at org.scalatest.Suite$class.run(Suite.scala:1437)
    at org.scalatest.fixture.FunSuite.org$scalatest$fixture$FunSuiteLike$$super$run(FunSuite.scala:228)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$run$1.apply(FunSuiteLike.scala:218)
    at org.scalatest.fixture.FunSuiteLike$$anonfun$run$1.apply(FunSuiteLike.scala:218)
    at org.scalatest.SuperEngine.runImpl(Engine.scala:545)
    at org.scalatest.fixture.FunSuiteLike$class.run(FunSuiteLike.scala:218)
    at org.scalatest.fixture.FunSuite.run(FunSuite.scala:228)
    at org.scalatest.tools.Framework.org$scalatest$tools$Framework$$runSuite(Framework.scala:268)
    at org.scalatest.tools.Framework$ScalaTestTask.execute(Framework.scala:475)
    at sbt.TestRunner.runTest$1(TestFramework.scala:84)
    at sbt.TestRunner.run(TestFramework.scala:94)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:224)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:224)
    at sbt.TestFramework$.sbt$TestFramework$$withContextLoader(TestFramework.scala:212)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:224)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:224)
    at sbt.TestFunction.apply(TestFramework.scala:229)
    at sbt.Tests$$anonfun$7.apply(Tests.scala:196)
    at sbt.Tests$$anonfun$7.apply(Tests.scala:196)
    at sbt.std.Transform$$anon$3$$anonfun$apply$2.apply(System.scala:45)
    at sbt.std.Transform$$anon$3$$anonfun$apply$2.apply(System.scala:45)
    at sbt.std.Transform$$anon$4.work(System.scala:64)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
    at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:18)
    at sbt.Execute.work(Execute.scala:244)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
    at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:160)
    at sbt.CompletionService$$anon$2.call(CompletionService.scala:30)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)

"AWT-AppKit" daemon prio=5 tid=0x00007f908aa32800 nid=0x707 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Service Thread" daemon prio=5 tid=0x00007f9089078000 nid=0x6403 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" daemon prio=5 tid=0x00007f9089077000 nid=0x6203 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" daemon prio=5 tid=0x00007f9089075800 nid=0x6003 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=5 tid=0x00007f908906e800 nid=0x5e03 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=5 tid=0x00007f908905b800 nid=0x4a03 in Object.wait() [0x0000000195d55000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x000000012f326858> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
    - locked <0x000000012f326858> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:189)

"Reference Handler" daemon prio=5 tid=0x00007f9089059000 nid=0x4803 in Object.wait() [0x0000000195b52000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x000000012f3d3f78> (a java.lang.ref.Reference$Lock)
    at java.lang.Object.wait(Object.java:503)
    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
    - locked <0x000000012f3d3f78> (a java.lang.ref.Reference$Lock)

"main" prio=5 tid=0x00007f908a000800 nid=0x1903 waiting on condition [0x000000010b3b1000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x000000013409ba78> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at java.util.concurrent.ExecutorCompletionService.take(ExecutorCompletionService.java:193)
    at sbt.ConcurrentRestrictions$$anon$4.take(ConcurrentRestrictions.scala:196)
    at sbt.Execute.next$1(Execute.scala:88)
    at sbt.Execute.processAll(Execute.scala:91)
    at sbt.Execute.runKeep(Execute.scala:69)
    at sbt.EvaluateTask$.liftedTree1$1(EvaluateTask.scala:183)
    at sbt.EvaluateTask$.sbt$EvaluateTask$$run$1(EvaluateTask.scala:183)
    at sbt.EvaluateTask$.runTask(EvaluateTask.scala:198)
    at sbt.Aggregation$$anonfun$3.apply(Aggregation.scala:67)
    at sbt.Aggregation$$anonfun$3.apply(Aggregation.scala:65)
    at sbt.EvaluateTask$.withStreams(EvaluateTask.scala:153)
    at sbt.Aggregation$.timedRun(Aggregation.scala:65)
    at sbt.Aggregation$.runTasks(Aggregation.scala:74)
    at sbt.Aggregation$$anonfun$applyDynamicTasks$1.apply(Aggregation.scala:119)
    at sbt.Aggregation$$anonfun$applyDynamicTasks$1.apply(Aggregation.scala:117)
    at sbt.Command$$anonfun$applyEffect$2$$anonfun$apply$3.apply(Command.scala:62)
    at sbt.Command$$anonfun$applyEffect$2$$anonfun$apply$3.apply(Command.scala:62)
    at sbt.Command$.process(Command.scala:95)
    at sbt.MainLoop$$anonfun$1$$anonfun$apply$1.apply(MainLoop.scala:87)
    at sbt.MainLoop$$anonfun$1$$anonfun$apply$1.apply(MainLoop.scala:87)
    at sbt.State$$anon$1.process(State.scala:176)
    at sbt.MainLoop$$anonfun$1.apply(MainLoop.scala:87)
    at sbt.MainLoop$$anonfun$1.apply(MainLoop.scala:87)
    at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:18)
    at sbt.MainLoop$.next(MainLoop.scala:87)
    at sbt.MainLoop$.run(MainLoop.scala:80)
    at sbt.MainLoop$$anonfun$runWithNewLog$1.apply(MainLoop.scala:69)
    at sbt.MainLoop$$anonfun$runWithNewLog$1.apply(MainLoop.scala:66)
    at sbt.Using.apply(Using.scala:25)
    at sbt.MainLoop$.runWithNewLog(MainLoop.scala:66)
    at sbt.MainLoop$.runAndClearLast(MainLoop.scala:49)
    at sbt.MainLoop$.runLoggedLoop(MainLoop.scala:33)
    at sbt.MainLoop$.runLogged(MainLoop.scala:25)
    at sbt.xMain.run(Main.scala:26)
    at xsbt.boot.Launch$$anonfun$run$1.apply(Launch.scala:57)
    at xsbt.boot.Launch$.withContextLoader(Launch.scala:77)
    at xsbt.boot.Launch$.run(Launch.scala:57)
    at xsbt.boot.Launch$$anonfun$explicit$1.apply(Launch.scala:45)
    at xsbt.boot.Launch$.launch(Launch.scala:65)
    at xsbt.boot.Launch$.apply(Launch.scala:16)
    at xsbt.boot.Boot$.runImpl(Boot.scala:32)
    at xsbt.boot.Boot$.main(Boot.scala:21)
    at xsbt.boot.Boot.main(Boot.scala)

"VM Thread" prio=5 tid=0x00007f9089058800 nid=0x4603 runnable 

"GC task thread#0 (ParallelGC)" prio=5 tid=0x00007f908901e000 nid=0x3603 runnable 

"GC task thread#1 (ParallelGC)" prio=5 tid=0x00007f908901f000 nid=0x3803 runnable 

"GC task thread#2 (ParallelGC)" prio=5 tid=0x00007f908901f800 nid=0x3a03 runnable 

"GC task thread#3 (ParallelGC)" prio=5 tid=0x00007f9089020000 nid=0x3c03 runnable 

"GC task thread#4 (ParallelGC)" prio=5 tid=0x00007f9089020800 nid=0x3e03 runnable 

"GC task thread#5 (ParallelGC)" prio=5 tid=0x00007f9089021800 nid=0x4003 runnable 

"GC task thread#6 (ParallelGC)" prio=5 tid=0x00007f9089022000 nid=0x4203 runnable 

"GC task thread#7 (ParallelGC)" prio=5 tid=0x00007f9089022800 nid=0x4403 runnable 

"VM Periodic Task Thread" prio=5 tid=0x00007f908905d000 nid=0x6603 waiting on condition 

JNI global references: 981

Heap
 PSYoungGen      total 386048K, used 45592K [0x000000016e600000, 0x0000000188800000, 0x000000018e600000)
  eden space 349184K, 8% used [0x000000016e600000,0x000000017036f230,0x0000000183b00000)
  from space 36864K, 41% used [0x0000000186400000,0x0000000187316f50,0x0000000188800000)
  to   space 39424K, 0% used [0x0000000183b00000,0x0000000183b00000,0x0000000186180000)
 ParOldGen       total 147456K, used 121091K [0x000000012e600000, 0x0000000137600000, 0x000000016e600000)
  object space 147456K, 82% used [0x000000012e600000,0x0000000135c40f78,0x0000000137600000)
 PSPermGen       total 174592K, used 108717K [0x000000010e600000, 0x0000000119080000, 0x000000012e600000)
  object space 174592K, 62% used [0x000000010e600000,0x000000011502b658,0x0000000119080000)

support dbuild (Scala community distributed build)

it would be nice to be included in the community build process since we'd get early notification of bugs and incompatibilities with forthcoming Scala and sbt versions.

on Twitter, @gkossakowski writes:

@SethTisue have you considered using bintray-sbt plugin instead of your own plugin here: https://github.com/NetLogo/Tortoise/blob/master/project/plugins.sbt#L16 … ?

@SethTisue yes, custom repositories are not very cool if we want to add a project to dbuild. The problem is artifact resolution performance

@SethTisue I'm trying to give tortoise a spin by hacking repository definitions. That's a one-off, of course.

@SethTisue The result of compiling tortoise is: https://gist.github.com/gkossakowski/9609683 … Good/bad/neutral?

consider depending on NetLogo as an "external project" rather than a "library dependency"

for now this is on hold, but once the bintray publishing is worked out, we might consider this, if we find we often need to make coordinated changes across our multiple repos (galapagos, tortoise, netlogo)

like this (this mostly works, some i18n'ed error messages aren't found, but surely it's fixable):

diff --git a/build.sbt b/build.sbt
index a6f755a..62fd632 100644
--- a/build.sbt
+++ b/build.sbt
@@ -1,4 +1,9 @@
-val root = project in file (".") configs(FastMediumSlow.configs: _*)
+lazy val root =
+  project.in(file("."))
+    .configs(FastMediumSlow.configs: _*)
+    .dependsOn(nl % "compile;test->test")
+
+lazy val nl = RootProject(uri("../nl.headless"))

 scalaVersion := "2.10.3"

@@ -14,19 +19,6 @@ crossPaths := false

 val netlogoSha = settingKey[String]("version of NetLogo we depend on")

-netlogoSha := "82d06864"
-
-libraryDependencies ++= {
-  val sha = netlogoSha.value
-  val version = s"5.1.0-SNAPSHOT-$sha"
-  Seq(
-    "org.nlogo" % "NetLogoHeadless" % version from
-      s"http://ccl.northwestern.edu/devel/NetLogoHeadless-$sha.jar",
-    "org.nlogo" % "NetLogoHeadlessTests" % version % "test" from
-      s"http://ccl.northwestern.edu/devel/NetLogoHeadlessTests-$sha.jar"
-  )
-}
-
 // NetLogoHeadlessTests depends on reflections; reflections depends on some extra jars.
 // but for some reason we need to explicitly list the transitive dependencies
 libraryDependencies ++= Seq(

see:

and this chat with M. Harrah:

support for `watch` and `follow`

on the Tortoise engine side, this will be pretty easy — subject is just a hidden global

once done, open a ticket in the Teletortoise repo for corresponding view support

engine should support `breed = ....` tests

currently:

O> crt 1 [ output-print breed = turtles ]
false

this kind of test is common in the language tests, so it accounts for a lot of currently failing tests; it's low hanging fruit for making more tests pass

`VertCylinder` is heavily incomplete

The base class Topology has several methods that it assumes will be implemented by subclasses (i.e. getPatch<Dir>, shortestX, shortestY, and, implicitly, diffuse), and they are implemented by two of the subclasses, but VertCylinder does not implement them.

To reproduce this error, simply try to evaluate new World(0, 0, 0, 0, 1, false, true, [], [], 0).topology().towards(1, 1, 2, 2). You will get the following error message:

TypeError: Object #<VertCylinder> has no method 'shortestX'

Improper handling of exceptions for flow control

In wrap for bounded topologies we are using exception recovery to detect if a turtle is can move or not. However, we're catching all exceptions. This masks other problems if there are any. The problem is that we're throwing an untyped exception and so can't restrict the catch clause. We should be throwing a custom exception and catching it with a conditional catch clause (see the second example.

Furthermore, all the places we're currently using exceptions for managing turtle death are using conditions inside of the catch. They should be conditional catches.

Fire model (Sample Models) doesn't work because of breeds issue

this:

package org.nlogo.tortoise
package dock

import org.nlogo.util.SlowTest

class TestFireModel extends DockingSuite with SlowTest {
  test("fire") { implicit fixture => import fixture._
    open("models/Sample Models/Earth Science/Fire.nlogo")
    testCommand("setup")
    for (_ <- 1 to 10)
      testCommand("go")
  }
}

fails with:

[info] - fire *** FAILED ***
[info]   java.lang.AssertionError: turtles.0.breed
[info] Expected: FIRES
[info]      got: TURTLES
[info]  ; turtles.1.breed
[info] Expected: FIRES
[info]      got: TURTLES
[info]  ; turtles.10.breed
[info] Expected: FIRES
[info]      got: TURTLES
[info]  ; turtles.100.breed
...

note that this is the turtle-based Fire in Sample Models, not the patch-based one in benchmarks

performance: `turtles-here` should be O(1)-ish normal case, not always O(n)

If we find that performance is poor on models with mobile turtles, e.g. Wolf Sheep Predation and Climate Change, an obvious culprit is turtles-here.

In JVM NetLogo, turtles register and deregister themselves as they enter and leave patches, so turtles-here is O(1)-ish (except in the pathological case where most or all of the turtles are on a single patch; I call it pathological but it's not that hard to hit, which is why there's an open issue on it at NetLogo/NetLogo#148). Currently in Tortoise, we don't have code like that, so turtles-here has to check the location of every turtle, and that's O(n).

move Tortoise code into Tortoise repo

@TheBizzle and I are working on this. our rough plan is:

  • Seth: cherry-pick any changes to core code from tortoise branch onto headless branch (#502)
  • Jason: have main repo publish test classes and files as an artifact so Tortoise can use them too (#503)
  • Seth: move the tortoise-only files and directories into the Tortoise repo, preserving the commit history
  • Seth: get Tortoise itself building and running by depending on NetLogoHeadless.jar retrieved from the CCL server by URL with SHA
  • Seth: get Tortoise tests passing by depending on NetLogoHeadlessTests.jar retrieved from the CCL server by URL with SHA
  • Seth: set up Travis build for new repo at https://travis-ci.org/NetLogo/Tortoise
  • Seth: attempt to slim down the history in the Tortoise repo (see http://stackoverflow.com/questions/359424/detach-subdirectory-into-separate-git-repository/)

turtles-here fails due to patches looking at all turtles instead of tracking them based on entry

Consider the following:

  test("turtles-here 3") { implicit fixture => import fixture._
    declare("", WorldDimensions.square(2))
    testCommand("crt 20")
    testCommand("ask turtle 0 [ ask turtles-here [ output-print self ] ]")
  }

  test("turtles-here 4") { implicit fixture => import fixture._
    declare("", WorldDimensions.square(2))
    testCommand("crt 20")
    testCommand("ask turtles [ set heading 0 fd 1 ]")
    testCommand("ask turtle 0 [ ask turtles-here [ output-print self ] ]")
  }

turtles-here 3 succeeds, but turtles-here 4 fails. The reason is that jvm netlogo keeps a cache of what turtles are on any given patch in the aforementioned patch

tortoise, however, simply scans all the known turtles for ones that match the current patch.

stop using CoffeeScript bare mode

bare mode puts everything in globals. we're trying to move away from that (it's very bad practice in JS)

I may need to add getters so that needed things remain accessible

feature: tasks

this might best be accomplished in two stages:

  1. special-case support for literal tasks being passed to primitives such as foreach, map, filter, etc.
  2. general support for tasks as values (that can be passed to run and runresult, passed to procedures, stored in variables, and so on)

we have a great many models that won't work without the first, but only a few models that require the second

but then on the other hand, just biting the bullet and doing the general version might not be that hard, given that we're compiling to JavaScript which has closures, and going straight to the general case would spare us the effort of writing special purpose code

not sure what I think.

Problem with tortoise tests using compare

Frank wrote on netlogo-devel:

When you define a new reporter and then use compare, the namespace isn't updated so Namer fails. Should we look into fixing this, or just continue to use testCommand("output-print ")?

The code sample I figured would work would look like this:

test("reporter") { implicit fixture => import fixture._
  declare("to-report foo [] 10 end")
  compare("foo")
}

But instead I have to do this:

test("reporter") { implicit fixture => import fixture._
  declare("to-report foo [] 10 end")
  testCommand("output-print foo")
}

Do we care?

Virus on a Network is pathologically slow

tried adding this to Model.scala:

    Model(
      path = "models/Sample Models/Networks/Virus on a Network.nlogo",
      repetitions = 1
    )

but even just setting up and running 1 tick takes 52 seconds (!!!)

Client-side compilation

Once the refactoring is complete and jflex is removed, compilation to js with scalajs should be possible.

inRadius inequal due to different implementations

Consider:

testCommand("crt 50 [ setxy random-xcor random-ycor ]")
testCommand("ask turtles [ output-print [ who ] of turtles in-radius 2 ]")

This returns non matching lists (in ordering) due to inRadius in JVM netlogo using the turtles via patch.turtlesHere whereas Tortoise simply looks over all agents. This issue, even if using patches and turtlesHere, due to #31

Test-running-in-browser automation with SBT

@SethTisue writes:

if I want to run a language test in a browser, I ought to be able to type a command in sbt and it would generate the appropriate web page for me (and open it in a browser for me, while it's at it)

This would be seriously nice.

`setxy` should wrap

so e.g. this currently fails:

  test("setxy wraps") { implicit fixture => import fixture._
    declare("", api.WorldDimensions.square(1))
    testCommand("crt 1 [ setxy 100 100 ]")
  }

I'm actually filing a ticket on this, instead of just throwing it in a mental bucket of things the engine doesn't do yet, because the Climate Change model is affected, because it uses setxy to position the clouds, and if the right random numbers come up, it wraps. if you run add-cloud enough times you're sure to hit it.

Sum inside a function breaks the RNG syncup

Consider the following:

    declare("""|to patch-test-fail let s sum [pycor] of neighbors end
               |to patch-test-success let s [pycor] of neighbors end""".stripMargin, api.WorldDimensions.square(1))
    testCommand("ask patches [ let s sum [pycor] of neighbors ]")
    testCommand("ask patches [ patch-test-success ]")

Replacing "patch-test-success" in the second testCommand causes failure due to RNG no longer being in sync.

engine: `turtles-on` returns malformed agentset

~/tortoise % ./tortoise.sh
Tortoise Shell 1.0
crt 10
output-print (word [turtles-here] of patch 0 0)
(10 TURTLES)
output-print (word turtles-on patch 0 0)
javax.script.ScriptException: TypeError: Cannot read property "name" from undefined in <eval> at line number 1859

needs test coverage

`ticks` causes an update

ticks (note that plural) reports the number of ticks that have passed. It does not change the world state. Hence, calling ticks doesn't affect the diffs model runs creates.

Right now, Tortoise is issuing an update on ticks (just containing the number of ticks). For some reason, this is passing the tests. I suspect that tick and ticks are being called together in the test.

feature: support for `display` command

Jason, Frank, and I have discussed strategies for doing this. The problem is that display must relinquish control of the Javascript thread to give the view a chance to repaint (remember, basic Javascript is single threaded; a website locks while js is running). It must then be able to resume execution as normal. For example:

repeat 50 [ ask turtles [ fd 1 display rt 30 ] ]

Jason suggested having the engine and model code run in a web worker. Then, display just sends out a message to the main thread containing the updates. The downside is that we wouldn't be able to directly call into the engine anymore, which is annoying for debugging and less convenient to embedders. There actually may be a performance hit in that web workers copy messages when sending them. Also, to get the web worker code actually running, we may have to do something weird like concatenating the engine, compat, and the compiled code.

improve NetLogo —> Tortoise —> Teletortoise publishing workflow

finishing up the NetLogo/Tortoise repo split:

  • Jason?: publish the Tortoise engine and Tortoise compiler as jars (one jar or two, whichever seems easiest)
  • Jason?: use the new jars from the Teletortoise repo

that's the basics, but it isn't the whole story, because it leaves us with our usual awkward, unsatisfactory workflow of manually uploading jars to the CCL server. so then we need to decide:

  • switch to git-subtree? and/or submodules? and/or sbt subprojects? and/or figure out a different development workflow involving automating things more using sbt? and/or bintray?
  • at some point we might want to split the Tortoise compiler and Tortoise engine into separate repos, instead of having them together. since our ambition is for the Tortoise engine to eventually be usable directly from JS and from alt-JS languages.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.