blob: 241dfecbb65913c75b0b7d7fd12ac3fc130b5b2b [file] [log] [blame]
/*
* Copyright (C) 2018 Square, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.squareup.kotlinpoet.jvm
import com.google.common.truth.Truth.assertThat
import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.FileSpec
import com.squareup.kotlinpoet.FunSpec
import com.squareup.kotlinpoet.ParameterSpec
import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
import com.squareup.kotlinpoet.PropertySpec
import com.squareup.kotlinpoet.TypeSpec
import com.squareup.kotlinpoet.asClassName
import com.squareup.kotlinpoet.asTypeName
import com.squareup.kotlinpoet.assertThrows
import java.io.IOException
import kotlin.test.Test
class JvmAnnotationsTest {
@Test fun jvmField() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addType(
TypeSpec.classBuilder("Taco")
.addProperty(
PropertySpec.builder("foo", String::class)
.jvmField()
.initializer("%S", "foo")
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.String
|import kotlin.jvm.JvmField
|
|public class Taco {
| @JvmField
| public val foo: String = "foo"
|}
|""".trimMargin()
)
}
@Test fun jvmFieldConstructorParameter() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addType(
TypeSpec.classBuilder("Taco")
.primaryConstructor(
FunSpec.constructorBuilder()
.addParameter("foo", String::class)
.build()
)
.addProperty(
PropertySpec.builder("foo", String::class)
.jvmField()
.initializer("foo")
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.String
|import kotlin.jvm.JvmField
|
|public class Taco(
| @JvmField
| public val foo: String
|)
|""".trimMargin()
)
}
@Test fun jvmStaticProperty() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addType(
TypeSpec.classBuilder("Taco")
.addType(
TypeSpec.companionObjectBuilder()
.addProperty(
PropertySpec.builder("foo", String::class)
.jvmStatic()
.initializer("%S", "foo")
.build()
)
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.String
|import kotlin.jvm.JvmStatic
|
|public class Taco {
| public companion object {
| @JvmStatic
| public val foo: String = "foo"
| }
|}
|""".trimMargin()
)
}
@Test fun jvmStaticFunction() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addType(
TypeSpec.classBuilder("Taco")
.addType(
TypeSpec.companionObjectBuilder()
.addFunction(
FunSpec.builder("foo")
.jvmStatic()
.addStatement("return %S", "foo")
.returns(String::class)
.build()
)
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.String
|import kotlin.jvm.JvmStatic
|
|public class Taco {
| public companion object {
| @JvmStatic
| public fun foo(): String = "foo"
| }
|}
|""".trimMargin()
)
}
@Test fun jvmStaticGetter() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addType(
TypeSpec.classBuilder("Taco")
.addType(
TypeSpec.companionObjectBuilder()
.addProperty(
PropertySpec.builder("foo", String::class)
.getter(
FunSpec.getterBuilder()
.jvmStatic()
.addStatement("return %S", "foo")
.build()
)
.build()
)
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.String
|import kotlin.jvm.JvmStatic
|
|public class Taco {
| public companion object {
| public val foo: String
| @JvmStatic
| get() = "foo"
| }
|}
|""".trimMargin()
)
}
@Test fun jvmStaticSetter() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addType(
TypeSpec.classBuilder("Taco")
.addType(
TypeSpec.companionObjectBuilder()
.addProperty(
PropertySpec.builder("foo", String::class.asTypeName())
.mutable()
.setter(
FunSpec.setterBuilder()
.jvmStatic()
.addParameter("value", String::class)
.build()
)
.initializer("%S", "foo")
.build()
)
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.String
|import kotlin.jvm.JvmStatic
|
|public class Taco {
| public companion object {
| public var foo: String = "foo"
| @JvmStatic
| set(`value`) {
| }
| }
|}
|""".trimMargin()
)
}
@Test fun jvmStaticForbiddenOnConstructor() {
assertThrows<IllegalStateException> {
FunSpec.constructorBuilder()
.jvmStatic()
}.hasMessageThat().isEqualTo("Can't apply @JvmStatic to a constructor!")
}
@Test fun throwsFunction() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addFunction(
FunSpec.builder("foo")
.throws(IOException::class, IllegalArgumentException::class)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import java.io.IOException
|import java.lang.IllegalArgumentException
|import kotlin.Unit
|import kotlin.jvm.Throws
|
|@Throws(
| IOException::class,
| IllegalArgumentException::class
|)
|public fun foo(): Unit {
|}
|""".trimMargin()
)
}
@Test fun throwsFunctionCustomException() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addFunction(
FunSpec.builder("foo")
.throws(ClassName("com.squareup.tacos", "IllegalTacoException"))
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.Unit
|import kotlin.jvm.Throws
|
|@Throws(IllegalTacoException::class)
|public fun foo(): Unit {
|}
|""".trimMargin()
)
}
@Test fun throwsPrimaryConstructor() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addType(
TypeSpec.classBuilder("Taco")
.primaryConstructor(
FunSpec.constructorBuilder()
.throws(IOException::class)
.addParameter("foo", String::class)
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import java.io.IOException
|import kotlin.String
|import kotlin.jvm.Throws
|
|public class Taco @Throws(IOException::class) constructor(
| foo: String
|)
|""".trimMargin()
)
}
@Test fun throwsGetter() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addProperty(
PropertySpec.builder("foo", String::class)
.getter(
FunSpec.getterBuilder()
.throws(IOException::class)
.addStatement("return %S", "foo")
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import java.io.IOException
|import kotlin.String
|import kotlin.jvm.Throws
|
|public val foo: String
| @Throws(IOException::class)
| get() = "foo"
|""".trimMargin()
)
}
@Test fun throwsSetter() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addProperty(
PropertySpec.builder("foo", String::class)
.mutable()
.setter(
FunSpec.setterBuilder()
.throws(IOException::class)
.addParameter("value", String::class)
.addStatement("print(%S)", "foo")
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import java.io.IOException
|import kotlin.String
|import kotlin.jvm.Throws
|
|public var foo: String
| @Throws(IOException::class)
| set(`value`) {
| print("foo")
| }
|""".trimMargin()
)
}
@Test fun jvmOverloadsFunction() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addFunction(
FunSpec.builder("foo")
.jvmOverloads()
.addParameter("bar", Int::class)
.addParameter(
ParameterSpec.builder("baz", String::class)
.defaultValue("%S", "baz")
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.Int
|import kotlin.String
|import kotlin.Unit
|import kotlin.jvm.JvmOverloads
|
|@JvmOverloads
|public fun foo(bar: Int, baz: String = "baz"): Unit {
|}
|""".trimMargin()
)
}
@Test fun jvmOverloadsPrimaryConstructor() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addType(
TypeSpec.classBuilder("Taco")
.primaryConstructor(
FunSpec.constructorBuilder()
.jvmOverloads()
.addParameter("bar", Int::class)
.addParameter(
ParameterSpec.builder("baz", String::class)
.defaultValue("%S", "baz")
.build()
)
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.Int
|import kotlin.String
|import kotlin.jvm.JvmOverloads
|
|public class Taco @JvmOverloads constructor(
| bar: Int,
| baz: String = "baz"
|)
|""".trimMargin()
)
}
@Test fun jvmOverloadsOnGetterForbidden() {
assertThrows<IllegalStateException> {
FunSpec.getterBuilder()
.jvmOverloads()
}.hasMessageThat().isEqualTo("Can't apply @JvmOverloads to a getter!")
}
@Test fun jvmOverloadsOnSetterForbidden() {
assertThrows<IllegalStateException> {
FunSpec.setterBuilder()
.jvmOverloads()
}.hasMessageThat().isEqualTo("Can't apply @JvmOverloads to a setter!")
}
@Test fun jvmNameFile() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.jvmName("TacoUtils")
.addProperty(
PropertySpec.builder("foo", String::class)
.initializer("%S", "foo")
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|@file:JvmName("TacoUtils")
|
|package com.squareup.tacos
|
|import kotlin.String
|import kotlin.jvm.JvmName
|
|public val foo: String = "foo"
|""".trimMargin()
)
}
@Test fun jvmNameFunction() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addFunction(
FunSpec.builder("foo")
.jvmName("getFoo")
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.Unit
|import kotlin.jvm.JvmName
|
|@JvmName("getFoo")
|public fun foo(): Unit {
|}
|""".trimMargin()
)
}
@Test fun jvmNameGetter() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addProperty(
PropertySpec.builder("foo", String::class)
.getter(
FunSpec.getterBuilder()
.jvmName("foo")
.addStatement("return %S", "foo")
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.String
|import kotlin.jvm.JvmName
|
|public val foo: String
| @JvmName("foo")
| get() = "foo"
|""".trimMargin()
)
}
@Test fun jvmNameSetter() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addProperty(
PropertySpec.builder("foo", String::class.asTypeName())
.mutable()
.initializer("%S", "foo")
.setter(
FunSpec.setterBuilder()
.jvmName("foo")
.addParameter("value", String::class)
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.String
|import kotlin.jvm.JvmName
|
|public var foo: String = "foo"
| @JvmName("foo")
| set(`value`) {
| }
|""".trimMargin()
)
}
@Test fun jvmNameForbiddenOnConstructor() {
assertThrows<IllegalStateException> {
FunSpec.constructorBuilder()
.jvmName("notAConstructor")
}.hasMessageThat().isEqualTo("Can't apply @JvmName to a constructor!")
}
@Test fun jvmMultifileClass() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.jvmMultifileClass()
.addProperty(
PropertySpec.builder("foo", String::class)
.initializer("%S", "foo")
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|@file:JvmMultifileClass
|
|package com.squareup.tacos
|
|import kotlin.String
|import kotlin.jvm.JvmMultifileClass
|
|public val foo: String = "foo"
|""".trimMargin()
)
}
@Test fun jvmSuppressWildcardsClass() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addType(
TypeSpec.classBuilder("Taco")
.jvmSuppressWildcards()
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.jvm.JvmSuppressWildcards
|
|@JvmSuppressWildcards
|public class Taco
|""".trimMargin()
)
}
@Test fun jvmSuppressWildcardsFunction() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addFunction(
FunSpec.builder("foo")
.jvmSuppressWildcards(suppress = false)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.Unit
|import kotlin.jvm.JvmSuppressWildcards
|
|@JvmSuppressWildcards(suppress = false)
|public fun foo(): Unit {
|}
|""".trimMargin()
)
}
@Test fun jvmSuppressWildcardsOnConstructorForbidden() {
assertThrows<IllegalStateException> {
FunSpec.constructorBuilder()
.jvmSuppressWildcards()
}.hasMessageThat().isEqualTo("Can't apply @JvmSuppressWildcards to a constructor!")
}
@Test fun jvmSuppressWildcardsOnGetterForbidden() {
assertThrows<IllegalStateException> {
FunSpec.getterBuilder()
.jvmSuppressWildcards()
}.hasMessageThat().isEqualTo("Can't apply @JvmSuppressWildcards to a getter!")
}
@Test fun jvmSuppressWildcardsOnSetterForbidden() {
assertThrows<IllegalStateException> {
FunSpec.setterBuilder()
.jvmSuppressWildcards()
}.hasMessageThat().isEqualTo("Can't apply @JvmSuppressWildcards to a setter!")
}
@Test fun jvmSuppressWildcardsProperty() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addProperty(
PropertySpec.builder("foo", String::class)
.jvmSuppressWildcards(suppress = false)
.initializer("%S", "foo")
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.String
|import kotlin.jvm.JvmSuppressWildcards
|
|@JvmSuppressWildcards(suppress = false)
|public val foo: String = "foo"
|""".trimMargin()
)
}
@Test fun jvmSuppressWildcardsType() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addFunction(
FunSpec.builder("foo")
.addParameter(
"a",
List::class.asClassName()
.parameterizedBy(Int::class.asTypeName().jvmSuppressWildcards())
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.Int
|import kotlin.Unit
|import kotlin.collections.List
|import kotlin.jvm.JvmSuppressWildcards
|
|public fun foo(a: List<@JvmSuppressWildcards Int>): Unit {
|}
|""".trimMargin()
)
}
@Test fun jvmWildcardType() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addFunction(
FunSpec.builder("foo")
.addParameter(
"a",
List::class.asClassName()
.parameterizedBy(Int::class.asTypeName().jvmWildcard())
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.Int
|import kotlin.Unit
|import kotlin.collections.List
|import kotlin.jvm.JvmWildcard
|
|public fun foo(a: List<@JvmWildcard Int>): Unit {
|}
|""".trimMargin()
)
}
@Test fun synchronizedFunction() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addFunction(
FunSpec.builder("foo")
.synchronized()
.addStatement("return %S", "foo")
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.jvm.Synchronized
|
|@Synchronized
|public fun foo() = "foo"
|""".trimMargin()
)
}
@Test fun synchronizedGetter() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addProperty(
PropertySpec.builder("foo", String::class)
.getter(
FunSpec.getterBuilder()
.synchronized()
.addStatement("return %S", "foo")
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.String
|import kotlin.jvm.Synchronized
|
|public val foo: String
| @Synchronized
| get() = "foo"
|""".trimMargin()
)
}
@Test fun synchronizedSetter() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addProperty(
PropertySpec.builder("foo", String::class.asTypeName())
.mutable()
.initializer("%S", "foo")
.setter(
FunSpec.setterBuilder()
.synchronized()
.addParameter("value", String::class)
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.String
|import kotlin.jvm.Synchronized
|
|public var foo: String = "foo"
| @Synchronized
| set(`value`) {
| }
|""".trimMargin()
)
}
@Test fun synchronizedOnConstructorForbidden() {
assertThrows<IllegalStateException> {
FunSpec.constructorBuilder()
.synchronized()
}.hasMessageThat().isEqualTo("Can't apply @Synchronized to a constructor!")
}
@Test fun transient() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addType(
TypeSpec.classBuilder("Taco")
.addProperty(
PropertySpec.builder("foo", String::class)
.transient()
.initializer("%S", "foo")
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.String
|import kotlin.jvm.Transient
|
|public class Taco {
| @Transient
| public val foo: String = "foo"
|}
|""".trimMargin()
)
}
@Test fun transientConstructorParameter() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addType(
TypeSpec.classBuilder("Taco")
.primaryConstructor(
FunSpec.constructorBuilder()
.addParameter("foo", String::class)
.build()
)
.addProperty(
PropertySpec.builder("foo", String::class)
.transient()
.initializer("foo")
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.String
|import kotlin.jvm.Transient
|
|public class Taco(
| @Transient
| public val foo: String
|)
|""".trimMargin()
)
}
@Test fun volatile() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addType(
TypeSpec.classBuilder("Taco")
.addProperty(
PropertySpec.builder("foo", String::class)
.volatile()
.initializer("%S", "foo")
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.String
|import kotlin.jvm.Volatile
|
|public class Taco {
| @Volatile
| public val foo: String = "foo"
|}
|""".trimMargin()
)
}
@Test fun volatileConstructorParameter() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addType(
TypeSpec.classBuilder("Taco")
.primaryConstructor(
FunSpec.constructorBuilder()
.addParameter("foo", String::class)
.build()
)
.addProperty(
PropertySpec.builder("foo", String::class)
.volatile()
.initializer("foo")
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.String
|import kotlin.jvm.Volatile
|
|public class Taco(
| @Volatile
| public val foo: String
|)
|""".trimMargin()
)
}
@Test fun strictfpFunction() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addFunction(
FunSpec.builder("foo")
.strictfp()
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.Unit
|import kotlin.jvm.Strictfp
|
|@Strictfp
|public fun foo(): Unit {
|}
|""".trimMargin()
)
}
@Test fun strictfpPrimaryConstructor() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addType(
TypeSpec.classBuilder("Taco")
.primaryConstructor(
FunSpec.constructorBuilder()
.strictfp()
.addParameter("foo", String::class)
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.String
|import kotlin.jvm.Strictfp
|
|public class Taco @Strictfp constructor(
| foo: String
|)
|""".trimMargin()
)
}
@Test fun strictfpGetter() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addProperty(
PropertySpec.builder("foo", String::class)
.getter(
FunSpec.getterBuilder()
.strictfp()
.addStatement("return %S", "foo")
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.String
|import kotlin.jvm.Strictfp
|
|public val foo: String
| @Strictfp
| get() = "foo"
|""".trimMargin()
)
}
@Test fun strictfpSetter() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addProperty(
PropertySpec.builder("foo", String::class)
.mutable()
.setter(
FunSpec.setterBuilder()
.strictfp()
.addParameter("value", String::class)
.addStatement("print(%S)", "foo")
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.String
|import kotlin.jvm.Strictfp
|
|public var foo: String
| @Strictfp
| set(`value`) {
| print("foo")
| }
|""".trimMargin()
)
}
@Test fun jvmDefaultProperty() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addType(
TypeSpec.interfaceBuilder("Taco")
.addProperty(
PropertySpec.builder("foo", String::class)
.jvmDefault()
.initializer("%S", "foo")
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.String
|import kotlin.jvm.JvmDefault
|
|public interface Taco {
| @JvmDefault
| public val foo: String = "foo"
|}
|""".trimMargin()
)
}
@Test fun jvmDefaultFunction() {
val file = FileSpec.builder("com.squareup.tacos", "Taco")
.addType(
TypeSpec.interfaceBuilder("Taco")
.addFunction(
FunSpec.builder("foo")
.jvmDefault()
.returns(String::class)
.addStatement("return %S", "foo")
.build()
)
.build()
)
.build()
assertThat(file.toString()).isEqualTo(
"""
|package com.squareup.tacos
|
|import kotlin.String
|import kotlin.jvm.JvmDefault
|
|public interface Taco {
| @JvmDefault
| public fun foo(): String = "foo"
|}
|""".trimMargin()
)
}
}