From 3636f137b0b4ee13bc94afbd09ba3c3864960599 Mon Sep 17 00:00:00 2001 From: Mike Hearn <mike@r3cev.com> Date: Wed, 17 May 2017 19:45:06 +0200 Subject: [PATCH] Minor: add a unit test for the StringToMethodParser code as used with c'tors. --- .../corda/jackson/StringToMethodCallParser.kt | 3 +- .../jackson/StringToMethodCallParserTest.kt | 33 +++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/client/jackson/src/main/kotlin/net/corda/jackson/StringToMethodCallParser.kt b/client/jackson/src/main/kotlin/net/corda/jackson/StringToMethodCallParser.kt index 225bb9ec59..45454ef1d0 100644 --- a/client/jackson/src/main/kotlin/net/corda/jackson/StringToMethodCallParser.kt +++ b/client/jackson/src/main/kotlin/net/corda/jackson/StringToMethodCallParser.kt @@ -193,8 +193,7 @@ open class StringToMethodCallParser<in T : Any> @JvmOverloads constructor( val parameterString = "{ $args }" val tree: JsonNode = om.readTree(parameterString) ?: throw UnparseableCallException(args) if (tree.size() > parameters.size) throw UnparseableCallException.TooManyParameters(methodNameHint, args) - val inOrderParams: List<Any?> = parameters.mapIndexed { _, param -> - val (argName, argType) = param + val inOrderParams: List<Any?> = parameters.mapIndexed { _, (argName, argType) -> val entry = tree[argName] ?: throw UnparseableCallException.MissingParameter(methodNameHint, argName, args) try { om.readValue(entry.traverse(om), argType) diff --git a/client/jackson/src/test/kotlin/net/corda/jackson/StringToMethodCallParserTest.kt b/client/jackson/src/test/kotlin/net/corda/jackson/StringToMethodCallParserTest.kt index 7c46e4919b..7610fbf91b 100644 --- a/client/jackson/src/test/kotlin/net/corda/jackson/StringToMethodCallParserTest.kt +++ b/client/jackson/src/test/kotlin/net/corda/jackson/StringToMethodCallParserTest.kt @@ -1,14 +1,16 @@ package net.corda.jackson import net.corda.core.crypto.SecureHash +import org.junit.Assert.assertArrayEquals import org.junit.Test +import kotlin.reflect.full.primaryConstructor import kotlin.test.assertEquals class StringToMethodCallParserTest { @Suppress("UNUSED") class Target { fun simple() = "simple" - fun string(note: String) = note + fun string(noteTextWord: String) = noteTextWord fun twoStrings(a: String, b: String) = a + b fun simpleObject(hash: SecureHash.SHA256) = hash.toString() fun complexObject(pair: Pair<Int, String>) = pair @@ -20,7 +22,7 @@ class StringToMethodCallParserTest { val randomHash = "361170110f61086f77ff2c5b7ab36513705da1a3ebabf14dbe5cc9c982c45401" val tests = mapOf( "simple" to "simple", - "string note: A test of barewords" to "A test of barewords", + "string noteTextWord: A test of barewords" to "A test of barewords", "twoStrings a: Some words, b: ' and some words, like, Kirk, would, speak'" to "Some words and some words, like, Kirk, would, speak", "simpleObject hash: $randomHash" to randomHash.toUpperCase(), "complexObject pair: { first: 12, second: Word up brother }" to Pair(12, "Word up brother"), @@ -36,4 +38,31 @@ class StringToMethodCallParserTest { assertEquals(output, parser.parse(target, input).invoke()) } } + + @Suppress("UNUSED") + class ConstructorTarget(val someWord: String, val aDifferentThing: Int) { + constructor(alternativeWord: String) : this(alternativeWord, 0) + } + + @Test + fun ctor1() { + val clazz = ConstructorTarget::class.java + val parser = StringToMethodCallParser(clazz) + val ctor = clazz.constructors.single { it.parameterCount == 2 } + val names: List<String> = parser.paramNamesFromConstructor(ctor) + assertEquals(listOf("someWord", "aDifferentThing"), names) + val args: Array<Any?> = parser.parseArguments(clazz.name, names.zip(ctor.parameterTypes), "someWord: Blah blah blah, aDifferentThing: 12") + assertArrayEquals(args, arrayOf<Any?>("Blah blah blah", 12)) + } + + @Test + fun ctor2() { + val clazz = ConstructorTarget::class.java + val parser = StringToMethodCallParser(clazz) + val ctor = clazz.constructors.single { it.parameterCount == 1 } + val names: List<String> = parser.paramNamesFromConstructor(ctor) + assertEquals(listOf("alternativeWord"), names) + val args: Array<Any?> = parser.parseArguments(clazz.name, names.zip(ctor.parameterTypes), "alternativeWord: Foo bar!") + assertArrayEquals(args, arrayOf<Any?>("Foo bar!")) + } } \ No newline at end of file