| // FILE: Property.java |
| @ValueContainer |
| public interface Property<T> { |
| void set(T v); |
| T get(); |
| } |
| |
| // FILE: JavaTaskWithField.java |
| public class JavaTaskWithField { |
| public final StringProperty input; |
| |
| public JavaTaskWithField(StringProperty input) { |
| this.input = input; |
| } |
| } |
| |
| // FILE: JavaTaskWithProperty.java |
| public class JavaTaskWithProperty { |
| private final StringProperty input; |
| |
| public JavaTaskWithProperty(StringProperty input) { |
| this.input = input; |
| } |
| |
| public StringProperty getInput() { |
| return input; |
| } |
| } |
| |
| // FILE: test.kt |
| annotation class ValueContainer |
| |
| data class StringProperty(var v: String): Property<String> { |
| override fun set(v: String) { |
| this.v = v |
| } |
| fun assign(v: String) { |
| this.v = v |
| } |
| fun assign(v: Property<String>) { |
| this.v = v.get() |
| } |
| override fun get(): String { |
| return v |
| } |
| } |
| |
| data class Task(val input: StringProperty) |
| |
| fun `should work with assignment for raw type`(): String { |
| val task = Task(StringProperty("Fail")) |
| task.input = "OK" |
| |
| return if (task.input.get() != "OK") { |
| "Fail: ${task.input.get()}" |
| } else { |
| "OK" |
| } |
| } |
| |
| fun `should work with assignment for wrapped type`(): String { |
| val task = Task(StringProperty("Fail")) |
| task.input = StringProperty("OK") |
| |
| return if (task.input.get() != "OK") { |
| "Fail: ${task.input.get()}" |
| } else { |
| "OK" |
| } |
| } |
| |
| fun `should work with assignment with apply for raw type`(): String { |
| val task = Task(StringProperty("Fail")) |
| task.apply { |
| input = "OK" |
| } |
| |
| return if (task.input.get() != "OK") { |
| "Fail: ${task.input.get()}" |
| } else { |
| "OK" |
| } |
| } |
| |
| fun `should work with assignment with apply for wrapped type`(): String { |
| val task = Task(StringProperty("Fail")) |
| task.apply { |
| input = StringProperty("OK") |
| } |
| |
| return if (task.input.get() != "OK") { |
| "Fail: ${task.input.get()}" |
| } else { |
| "OK" |
| } |
| } |
| |
| fun `should work with extension function`(): String { |
| fun StringProperty.assign(v: Int) = this.assign("OK") |
| val task = Task(StringProperty("Fail")) |
| task.input = 42 |
| |
| return if (task.input.get() != "OK") { |
| "Fail: ${task.input.get()}" |
| } else { |
| "OK" |
| } |
| } |
| |
| fun `should work with extension function for interface type`(): String { |
| fun Property<String>.assign(v: Int) = this.set("OK") |
| val task = Task(StringProperty("Fail")) |
| task.input = 42 |
| |
| return if (task.input.get() != "OK") { |
| "Fail: ${task.input.get()}" |
| } else { |
| "OK" |
| } |
| } |
| |
| fun `should work with generic extension function`(): String { |
| fun <T> Property<T>.assign(v: T) = this.set(v) |
| data class IntProperty(var v: Int): Property<Int> { |
| override fun set(v: Int) { |
| this.v = v |
| } |
| override fun get() = this.v |
| } |
| data class IntTask(val input: IntProperty) |
| val task = IntTask(IntProperty(0)) |
| task.input = 42 |
| |
| return if (task.input.get() != 42) { |
| "Fail: ${task.input.get()}" |
| } else { |
| "OK" |
| } |
| } |
| |
| fun `should work with callable receiver`(): String { |
| fun StringProperty.assign(r: StringProperty.() -> Unit) = r.invoke(this) |
| val task = Task(StringProperty("Fail")) |
| task.input = { this.set("OK") } |
| |
| return if (task.input.get() != "OK") { |
| "Fail: ${task.input.get()}" |
| } else { |
| "OK" |
| } |
| } |
| |
| fun `should work with Java classes`(): String { |
| var taskWithField = JavaTaskWithField(StringProperty("Fail")) |
| taskWithField.input = "OK" |
| if (taskWithField.input.get() != "OK") return "Fail for Java: ${taskWithField.input.get()}" |
| taskWithField = JavaTaskWithField(StringProperty("Fail")) |
| taskWithField.input = StringProperty("OK") |
| if (taskWithField.input.get() != "OK") return "Fail for Java: ${taskWithField.input.get()}" |
| |
| var taskWithProperty = JavaTaskWithProperty(StringProperty("Fail")) |
| taskWithProperty.input = "OK" |
| if (taskWithProperty.input.get() != "OK") return "Fail for Java: ${taskWithProperty.input.get()}" |
| taskWithProperty = JavaTaskWithProperty(StringProperty("Fail")) |
| taskWithProperty.input = StringProperty("OK") |
| if (taskWithProperty.input.get() != "OK") return "Fail for Java: ${taskWithProperty.input.get()}" |
| |
| return "OK" |
| } |
| |
| fun box(): String { |
| var result = `should work with assignment for raw type`() |
| if (result != "OK") return result |
| |
| result = `should work with assignment for wrapped type`() |
| if (result != "OK") return result |
| |
| result = `should work with assignment with apply for raw type`() |
| if (result != "OK") return result |
| |
| result = `should work with assignment with apply for wrapped type`() |
| if (result != "OK") return result |
| |
| result = `should work with extension function`() |
| if (result != "OK") return result |
| |
| result = `should work with extension function for interface type`() |
| if (result != "OK") return result |
| |
| result = `should work with generic extension function`() |
| if (result != "OK") return result |
| |
| result = `should work with callable receiver`() |
| if (result != "OK") return result |
| |
| result = `should work with Java classes`() |
| if (result != "OK") return result |
| |
| return "OK" |
| } |