diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2018-07-26 13:59:36 +0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2018-07-26 13:59:36 +0800 |
commit | aaae392f2534fc0c377b81f1a35a6d5b86f231f2 (patch) | |
tree | 4a7a8308a239a99e9bc7b8c69d74e9b31371bf7c | |
parent | 1e32473bdcac72fda83225c6668a25c015652488 (diff) | |
download | cask-aaae392f2534fc0c377b81f1a35a6d5b86f231f2.tar.gz cask-aaae392f2534fc0c377b81f1a35a6d5b86f231f2.tar.bz2 cask-aaae392f2534fc0c377b81f1a35a6d5b86f231f2.zip |
Add more Decorated tests
-rw-r--r-- | cask/src/cask/internal/Router.scala | 15 | ||||
-rw-r--r-- | cask/test/src/test/cask/Decorated.scala | 23 | ||||
-rw-r--r-- | cask/test/src/test/cask/ExampleTests.scala | 2 |
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" } } |