diff options
Diffstat (limited to 'src/test/scala')
20 files changed, 278 insertions, 71 deletions
diff --git a/src/test/scala/scala/async/TestLatch.scala b/src/test/scala/scala/async/TestLatch.scala index 676ea63..a119a43 100644 --- a/src/test/scala/scala/async/TestLatch.scala +++ b/src/test/scala/scala/async/TestLatch.scala @@ -1,3 +1,7 @@ +/* + * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> + */ + package scala.async import concurrent.{CanAwait, Awaitable} diff --git a/src/test/scala/scala/async/TestUtils.scala b/src/test/scala/scala/async/TestUtils.scala deleted file mode 100644 index 0ae78b8..0000000 --- a/src/test/scala/scala/async/TestUtils.scala +++ /dev/null @@ -1,58 +0,0 @@ -package scala.async - -import language.reflectiveCalls -import language.postfixOps -import language.implicitConversions - -import scala.reflect.{ClassTag, classTag} - -import scala.collection.mutable -import scala.concurrent.{Future, Awaitable, CanAwait} -import java.util.concurrent.{TimeoutException, CountDownLatch, TimeUnit} -import scala.concurrent.duration.Duration -import org.junit.runner.RunWith -import org.junit.runners.JUnit4 -import async._ -import tools.reflect.ToolBoxError - - -trait TestUtils { - - implicit class objectops(obj: Any) { - def mustBe(other: Any) = assert(obj == other, obj + " is not " + other) - - def mustEqual(other: Any) = mustBe(other) - } - - implicit class stringops(text: String) { - def mustContain(substring: String) = assert(text contains substring, text) - } - - def intercept[T <: Throwable : ClassTag](body: => Any): T = { - try { - body - throw new Exception(s"Exception of type ${classTag[T]} was not thrown") - } catch { - case t: Throwable => - if (classTag[T].runtimeClass != t.getClass) throw t - else t.asInstanceOf[T] - } - } - - def eval(code: String, compileOptions: String = ""): Any = { - val tb = mkToolbox(compileOptions) - tb.eval(tb.parse(code)) - } - - def mkToolbox(compileOptions: String = "") = { - val m = scala.reflect.runtime.currentMirror - import scala.tools.reflect.ToolBox - m.mkToolBox(options = compileOptions) - } - - def expectError(errorSnippet: String, compileOptions: String = "", baseCompileOptions: String = "-cp target/scala-2.10/classes")(code: String) { - intercept[ToolBoxError] { - eval(code, compileOptions + " " + baseCompileOptions) - }.getMessage mustContain errorSnippet - } -} diff --git a/src/test/scala/scala/async/TreeInterrogation.scala b/src/test/scala/scala/async/TreeInterrogation.scala index 9e68005..dd239a3 100644 --- a/src/test/scala/scala/async/TreeInterrogation.scala +++ b/src/test/scala/scala/async/TreeInterrogation.scala @@ -1,3 +1,7 @@ +/* + * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> + */ + package scala.async import org.junit.runner.RunWith @@ -11,7 +15,7 @@ class TreeInterrogation { def `a minimal set of vals are lifted to vars`() { val cm = reflect.runtime.currentMirror val tb = mkToolbox("-cp target/scala-2.10/classes") - val tree = mkToolbox().parse( + val tree = tb.parse( """| import _root_.scala.async.AsyncId._ | async { | val x = await(1) @@ -32,6 +36,35 @@ class TreeInterrogation { val varDefs = tree1.collect { case ValDef(mods, name, _, _) if mods.hasFlag(Flag.MUTABLE) => name } - varDefs.map(_.decoded).toSet mustBe(Set("state$async", "onCompleteHandler$async", "await$1", "await$2")) + varDefs.map(_.decoded).toSet mustBe (Set("state$async", "onCompleteHandler$async", "await$1", "await$2")) + } + + //@Test + def sandbox() { + sys.props("scala.async.debug") = true.toString + sys.props("scala.async.trace") = false.toString + + val cm = reflect.runtime.currentMirror + val tb = mkToolbox("-cp target/scala-2.10/classes") + val tree = tb.parse( + """ import _root_.scala.async.AsyncId._ + | async { + | var sum = 0 + | var i = 0 + | while (i < 5) { + | var j = 0 + | while (j < 5) { + | sum += await(i) * await(j) + | j += 1 + | } + | i += 1 + | } + | sum + | } + | """.stripMargin) + println(tree) + val tree1 = tb.typeCheck(tree.duplicate) + println(cm.universe.show(tree1)) + println(tb.eval(tree)) } } diff --git a/src/test/scala/scala/async/neg/LocalClasses0Spec.scala b/src/test/scala/scala/async/neg/LocalClasses0Spec.scala index 7932744..06a0e71 100644 --- a/src/test/scala/scala/async/neg/LocalClasses0Spec.scala +++ b/src/test/scala/scala/async/neg/LocalClasses0Spec.scala @@ -1,3 +1,7 @@ +/* + * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> + */ + package scala.async package neg diff --git a/src/test/scala/scala/async/neg/NakedAwait.scala b/src/test/scala/scala/async/neg/NakedAwait.scala index 8b85977..f4cfca2 100644 --- a/src/test/scala/scala/async/neg/NakedAwait.scala +++ b/src/test/scala/scala/async/neg/NakedAwait.scala @@ -1,3 +1,7 @@ +/* + * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> + */ + package scala.async package neg @@ -87,4 +91,67 @@ class NakedAwait { """.stripMargin } } + + @Test + def tryBody() { + expectError("await must not be used under a try/catch.") { + """ + | import _root_.scala.async.AsyncId._ + | async { try { await(false) } catch { case _ => } } + """.stripMargin + } + } + + @Test + def catchBody() { + expectError("await must not be used under a try/catch.") { + """ + | import _root_.scala.async.AsyncId._ + | async { try { () } catch { case _ => await(false) } } + """.stripMargin + } + } + + @Test + def finallyBody() { + expectError("await must not be used under a try/catch.") { + """ + | import _root_.scala.async.AsyncId._ + | async { try { () } finally { await(false) } } + """.stripMargin + } + } + + @Test + def nestedMethod() { + expectError("await must not be used under a nested method.") { + """ + | import _root_.scala.async.AsyncId._ + | async { def foo = await(false) } + """.stripMargin + } + } + + @Test + def returnIllegal() { + expectError("return is illegal") { + """ + | import _root_.scala.async.AsyncId._ + | def foo(): Any = async { return false } + | () + | + |""".stripMargin + } + } + + // TODO Anf transform if to have a simple condition. + @Test + def ifCondition() { + expectError("await must not be used under a condition.") { + """ + | import _root_.scala.async.AsyncId._ + | async { if (await(true)) () } + |""".stripMargin + } + } } diff --git a/src/test/scala/scala/async/neg/SampleNegSpec.scala b/src/test/scala/scala/async/neg/SampleNegSpec.scala index 94dbc1d..76f9c3e 100644 --- a/src/test/scala/scala/async/neg/SampleNegSpec.scala +++ b/src/test/scala/scala/async/neg/SampleNegSpec.scala @@ -1,3 +1,7 @@ +/* + * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> + */ + package scala.async package neg diff --git a/src/test/scala/scala/async/package.scala b/src/test/scala/scala/async/package.scala index 32e8be4..bc4ebac 100644 --- a/src/test/scala/scala/async/package.scala +++ b/src/test/scala/scala/async/package.scala @@ -1,5 +1,50 @@ +/* + * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> + */ + package scala -package object async extends TestUtils { +import reflect._ +import tools.reflect.ToolBoxError + +package object async { + + + implicit class objectops(obj: Any) { + def mustBe(other: Any) = assert(obj == other, obj + " is not " + other) + + def mustEqual(other: Any) = mustBe(other) + } + + implicit class stringops(text: String) { + def mustContain(substring: String) = assert(text contains substring, text) + } + + def intercept[T <: Throwable : ClassTag](body: => Any): T = { + try { + body + throw new Exception(s"Exception of type ${classTag[T]} was not thrown") + } catch { + case t: Throwable => + if (classTag[T].runtimeClass != t.getClass) throw t + else t.asInstanceOf[T] + } + } + + def eval(code: String, compileOptions: String = ""): Any = { + val tb = mkToolbox(compileOptions) + tb.eval(tb.parse(code)) + } + + def mkToolbox(compileOptions: String = "") = { + val m = scala.reflect.runtime.currentMirror + import scala.tools.reflect.ToolBox + m.mkToolBox(options = compileOptions) + } + def expectError(errorSnippet: String, compileOptions: String = "", baseCompileOptions: String = "-cp target/scala-2.10/classes")(code: String) { + intercept[ToolBoxError] { + eval(code, compileOptions + " " + baseCompileOptions) + }.getMessage mustContain errorSnippet + } } diff --git a/src/test/scala/scala/async/run/anf/AnfTransformSpec.scala b/src/test/scala/scala/async/run/anf/AnfTransformSpec.scala index 872e44d..41eeaa5 100644 --- a/src/test/scala/scala/async/run/anf/AnfTransformSpec.scala +++ b/src/test/scala/scala/async/run/anf/AnfTransformSpec.scala @@ -1,4 +1,4 @@ -/** +/* * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> */ @@ -172,4 +172,37 @@ class AnfTransformSpec { } result mustBe (103) } + + @Test + def nestedAwaitAsBareExpression() { + import ExecutionContext.Implicits.global + import _root_.scala.async.AsyncId.{async, await} + val result = async { + await(await("").isEmpty) + } + result mustBe (true) + } + + @Test + def nestedAwaitInBlock() { + import ExecutionContext.Implicits.global + import _root_.scala.async.AsyncId.{async, await} + val result = async { + () + await(await("").isEmpty) + } + result mustBe (true) + } + + @Test + def nestedAwaitInIf() { + import ExecutionContext.Implicits.global + import _root_.scala.async.AsyncId.{async, await} + val result = async { + if ("".isEmpty) + await(await("").isEmpty) + else 0 + } + result mustBe (true) + } } diff --git a/src/test/scala/scala/async/run/await0/Await0Spec.scala b/src/test/scala/scala/async/run/await0/Await0Spec.scala index 42d4ef2..111602a 100644 --- a/src/test/scala/scala/async/run/await0/Await0Spec.scala +++ b/src/test/scala/scala/async/run/await0/Await0Spec.scala @@ -1,3 +1,7 @@ +/* + * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> + */ + package scala.async package run package await0 diff --git a/src/test/scala/scala/async/run/block0/AsyncSpec.scala b/src/test/scala/scala/async/run/block0/AsyncSpec.scala index 5a7247c..5f38086 100644 --- a/src/test/scala/scala/async/run/block0/AsyncSpec.scala +++ b/src/test/scala/scala/async/run/block0/AsyncSpec.scala @@ -1,4 +1,4 @@ -/** +/* * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> */ diff --git a/src/test/scala/scala/async/run/block1/block1.scala b/src/test/scala/scala/async/run/block1/block1.scala index 0853498..bf9b56f 100644 --- a/src/test/scala/scala/async/run/block1/block1.scala +++ b/src/test/scala/scala/async/run/block1/block1.scala @@ -1,4 +1,4 @@ -/** +/* * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> */ diff --git a/src/test/scala/scala/async/run/hygiene/Hygiene.scala b/src/test/scala/scala/async/run/hygiene/Hygiene.scala index 0cc68a4..d0be2e0 100644 --- a/src/test/scala/scala/async/run/hygiene/Hygiene.scala +++ b/src/test/scala/scala/async/run/hygiene/Hygiene.scala @@ -1,4 +1,4 @@ -/** +/* * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> */ diff --git a/src/test/scala/scala/async/run/ifelse0/IfElse0.scala b/src/test/scala/scala/async/run/ifelse0/IfElse0.scala index 0363a75..0a72f1e 100644 --- a/src/test/scala/scala/async/run/ifelse0/IfElse0.scala +++ b/src/test/scala/scala/async/run/ifelse0/IfElse0.scala @@ -1,4 +1,4 @@ -/** +/* * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> */ diff --git a/src/test/scala/scala/async/run/ifelse0/WhileSpec.scala b/src/test/scala/scala/async/run/ifelse0/WhileSpec.scala new file mode 100644 index 0000000..1f1033a --- /dev/null +++ b/src/test/scala/scala/async/run/ifelse0/WhileSpec.scala @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> + */ + +package scala.async +package run +package ifelse0 + +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import org.junit.Test + +@RunWith(classOf[JUnit4]) +class WhileSpec { + + @Test + def whiling1() { + import AsyncId._ + + val result = async { + var xxx: Int = 0 + var y = 0 + while (xxx < 3) { + y = await(xxx) + xxx = xxx + 1 + } + y + } + result mustBe (2) + } + + @Test + def whiling2() { + import AsyncId._ + + val result = async { + var xxx: Int = 0 + var y = 0 + while (false) { + y = await(xxx) + xxx = xxx + 1 + } + y + } + result mustBe (0) + } + + @Test + def nestedWhile() { + import AsyncId._ + + val result = async { + var sum = 0 + var i = 0 + while (i < 5) { + var j = 0 + while (j < 5) { + sum += await(i) * await(j) + j += 1 + } + i += 1 + } + sum + } + result mustBe (100) + } +}
\ No newline at end of file diff --git a/src/test/scala/scala/async/run/ifelse1/IfElse1.scala b/src/test/scala/scala/async/run/ifelse1/IfElse1.scala index 3ca3a94..b567ee6 100644 --- a/src/test/scala/scala/async/run/ifelse1/IfElse1.scala +++ b/src/test/scala/scala/async/run/ifelse1/IfElse1.scala @@ -1,4 +1,4 @@ -/** +/* * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> */ diff --git a/src/test/scala/scala/async/run/ifelse2/ifelse2.scala b/src/test/scala/scala/async/run/ifelse2/ifelse2.scala index 84974b6..92a76e4 100644 --- a/src/test/scala/scala/async/run/ifelse2/ifelse2.scala +++ b/src/test/scala/scala/async/run/ifelse2/ifelse2.scala @@ -1,4 +1,4 @@ -/** +/* * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> */ diff --git a/src/test/scala/scala/async/run/ifelse3/IfElse3.scala b/src/test/scala/scala/async/run/ifelse3/IfElse3.scala index d475a0c..8a2ab13 100644 --- a/src/test/scala/scala/async/run/ifelse3/IfElse3.scala +++ b/src/test/scala/scala/async/run/ifelse3/IfElse3.scala @@ -1,4 +1,4 @@ -/** +/* * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> */ diff --git a/src/test/scala/scala/async/run/match0/Match0.scala b/src/test/scala/scala/async/run/match0/Match0.scala index 6a17e2b..f550a69 100644 --- a/src/test/scala/scala/async/run/match0/Match0.scala +++ b/src/test/scala/scala/async/run/match0/Match0.scala @@ -1,4 +1,4 @@ -/** +/* * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> */ diff --git a/src/test/scala/scala/async/run/noawait/NoAwaitSpec.scala b/src/test/scala/scala/async/run/noawait/NoAwaitSpec.scala index 90be946..e2c69d0 100644 --- a/src/test/scala/scala/async/run/noawait/NoAwaitSpec.scala +++ b/src/test/scala/scala/async/run/noawait/NoAwaitSpec.scala @@ -1,3 +1,7 @@ +/* + * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> + */ + package scala.async package run package noawait diff --git a/src/test/scala/scala/async/run/toughtype/ToughType.scala b/src/test/scala/scala/async/run/toughtype/ToughType.scala index f576ddc..9cfc1ca 100644 --- a/src/test/scala/scala/async/run/toughtype/ToughType.scala +++ b/src/test/scala/scala/async/run/toughtype/ToughType.scala @@ -1,4 +1,4 @@ -/** +/* * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> */ |