summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-07-26 13:59:36 +0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-07-26 13:59:36 +0800
commitaaae392f2534fc0c377b81f1a35a6d5b86f231f2 (patch)
tree4a7a8308a239a99e9bc7b8c69d74e9b31371bf7c
parent1e32473bdcac72fda83225c6668a25c015652488 (diff)
downloadcask-aaae392f2534fc0c377b81f1a35a6d5b86f231f2.tar.gz
cask-aaae392f2534fc0c377b81f1a35a6d5b86f231f2.tar.bz2
cask-aaae392f2534fc0c377b81f1a35a6d5b86f231f2.zip
Add more Decorated tests
-rw-r--r--cask/src/cask/internal/Router.scala15
-rw-r--r--cask/test/src/test/cask/Decorated.scala23
-rw-r--r--cask/test/src/test/cask/ExampleTests.scala2
3 files changed, 37 insertions, 3 deletions
diff --git a/cask/src/cask/internal/Router.scala b/cask/src/cask/internal/Router.scala
index e340c61..4615bd3 100644
--- a/cask/src/cask/internal/Router.scala
+++ b/cask/src/cask/internal/Router.scala
@@ -184,6 +184,17 @@ class Router[C <: Context](val c: C) {
}
}
+
+
+ def unwrapVarargType(arg: Symbol) = {
+ val vararg = arg.typeSignature.typeSymbol == definitions.RepeatedParamClass
+ val unwrappedType =
+ if (!vararg) arg.typeSignature
+ else arg.typeSignature.asInstanceOf[TypeRef].args(0)
+
+ (vararg, unwrappedType)
+ }
+
def extractMethod(method: MethodSymbol,
curCls: c.universe.Type,
wrapOutput: (c.Tree, c.Tree) => c.Tree,
@@ -277,9 +288,11 @@ class Router[C <: Context](val c: C) {
val (readArgs, argSigs) = readArgSigs.unzip
val (argNames, argNameCasts) = flattenedArgLists.map { arg =>
+ val (vararg, unwrappedType) = unwrapVarargType(arg)
(
pq"${arg.name.toTermName}",
- q"${arg.name.toTermName}.asInstanceOf[Seq[${arg.typeSignature}]]: _*"
+ if (!vararg) q"${arg.name.toTermName}.asInstanceOf[$unwrappedType]"
+ else q"${arg.name.toTermName}.asInstanceOf[Seq[$unwrappedType]]: _*"
)
}.unzip
diff --git a/cask/test/src/test/cask/Decorated.scala b/cask/test/src/test/cask/Decorated.scala
index e20149a..3677203 100644
--- a/cask/test/src/test/cask/Decorated.scala
+++ b/cask/test/src/test/cask/Decorated.scala
@@ -3,15 +3,34 @@ import cask.model.ParamContext
object Decorated extends cask.MainRoutes{
- class myDecorator extends cask.Routes.Decorator {
+ class User{
+ override def toString = "[haoyi]"
+ }
+ class loggedIn extends cask.Routes.Decorator {
+ def getRawParams(ctx: ParamContext) = Right(Map("user" -> new User()))
+ }
+ class withExtra extends cask.Routes.Decorator {
def getRawParams(ctx: ParamContext) = Right(Map("extra" -> 31337))
}
- @myDecorator()
+ @withExtra()
@cask.get("/hello/:world")
def hello(world: String)(extra: Int) = {
world + extra
}
+ @loggedIn()
+ @cask.get("/internal/:world")
+ def internal(world: String)(user: User) = {
+ world + user
+ }
+
+ @withExtra()
+ @loggedIn()
+ @cask.get("/internal-extra/:world")
+ def internalExtra(world: String)(user: User)(extra: Int) = {
+ world + user + extra
+ }
+
initialize()
}
diff --git a/cask/test/src/test/cask/ExampleTests.scala b/cask/test/src/test/cask/ExampleTests.scala
index 50e9776..e5be3bf 100644
--- a/cask/test/src/test/cask/ExampleTests.scala
+++ b/cask/test/src/test/cask/ExampleTests.scala
@@ -88,6 +88,8 @@ object ExampleTests extends TestSuite{
}
'Decorated - test(Decorated){ host =>
requests.get(host + "/hello/woo").text() ==> "woo31337"
+ requests.get(host + "/internal/boo").text() ==> "boo[haoyi]"
+ requests.get(host + "/internal-extra/goo").text() ==> "goo[haoyi]31337"
}
}