| import kotlin.reflect.KProperty | |
| var a = 0 | |
| var b: Int | |
| get() = a | |
| set(v: Int) { | |
| a = v | |
| } | |
| class A { | |
| var c: Int | |
| get() = a | |
| set(v: Int) { | |
| a = v | |
| } | |
| } | |
| var A.d: Int | |
| get() = a | |
| set(v: Int) { | |
| a = v | |
| } | |
| var Int.e: Int | |
| get() = a | |
| set(v: Int) { | |
| a = v | |
| } | |
| object SimpleDelegate { | |
| operator fun getValue(thisRef: Any?, desc: KProperty<*>): Int { | |
| return a | |
| } | |
| operator fun setValue(thisRef: Any?, desc: KProperty<*>, value: Int) { | |
| a = value | |
| } | |
| } | |
| var f by SimpleDelegate | |
| fun box(): String { | |
| if (b++ != 0) return "fail b++: $b" | |
| if (++b != 2) return "fail ++b: $b" | |
| if (--b != 1) return "fail --b: $b" | |
| if (b-- != 1) return "fail b--: $b" | |
| b += 10 | |
| if (b != 10) return "fail b +=: $b" | |
| b *= 10 | |
| if (b != 100) return "fail b *=: $b" | |
| b /= 5 | |
| if (b != 20) return "fail b /=: $b" | |
| b -= 10 | |
| if (b != 10) return "fail b -=: $b" | |
| b %= 7 | |
| if (b != 3) return "fail b %=: $b" | |
| var q = A() | |
| a = 0 | |
| if (q.c++ != 0) return "fail q.c++: ${q.c}" | |
| if (++q.c != 2) return "fail ++q.c: ${q.c}" | |
| if (--q.c != 1) return "fail --q.c: ${q.c}" | |
| if (q.c-- != 1) return "fail q.c--: ${q.c}" | |
| q.c += 10 | |
| if (q.c != 10) return "fail q.c +=: ${q.c}" | |
| q.c *= 10 | |
| if (q.c != 100) return "fail q.c *=: ${q.c}" | |
| q.c /= 5 | |
| if (q.c != 20) return "fail q.c /=: ${q.c}" | |
| q.c -= 10 | |
| if (q.c != 10) return "fail q.c -=: ${q.c}" | |
| q.c %= 7 | |
| if (q.c != 3) return "fail q.c %=: ${q.c}" | |
| a = 0 | |
| if (q.d++ != 0) return "fail q.d++: ${q.d}" | |
| if (++q.d != 2) return "fail ++q.d: ${q.d}" | |
| if (--q.d != 1) return "fail --q.d: ${q.d}" | |
| if (q.d-- != 1) return "fail q.d--: ${q.d}" | |
| q.d += 10 | |
| if (q.d != 10) return "fail q.d +=: ${q.d}" | |
| q.d *= 10 | |
| if (q.d != 100) return "fail q.d *=: ${q.d}" | |
| q.d /= 5 | |
| if (q.d != 20) return "fail q.d /=: ${q.d}" | |
| q.d -= 10 | |
| if (q.d != 10) return "fail q.d -=: ${q.d}" | |
| q.d %= 7 | |
| if (q.d != 3) return "fail q.d %=: ${q.d}" | |
| a = 0 | |
| if (0.e++ != 0) return "fail 0.e++: ${0.e}" | |
| if (++0.e != 2) return "fail ++0.e: ${0.e}" | |
| if (--0.e != 1) return "fail --0.e: ${0.e}" | |
| if (0.e-- != 1) return "fail 0.e--: ${0.e}" | |
| 0.e += 10 | |
| if (0.e != 10) return "fail 0.e +=: ${0.e}" | |
| 0.e *= 10 | |
| if (0.e != 100) return "fail 0.e *=: ${0.e}" | |
| 0.e /= 5 | |
| if (0.e != 20) return "fail 0.e /=: ${0.e}" | |
| 0.e -= 10 | |
| if (0.e != 10) return "fail 0.e -=: ${0.e}" | |
| 0.e %= 7 | |
| if (0.e != 3) return "fail 0.e %=: ${0.e}" | |
| a = 0 | |
| if (f++ != 0) return "fail f++: $f" | |
| if (++f != 2) return "fail ++f: $f" | |
| if (--f != 1) return "fail --f: $f" | |
| if (f-- != 1) return "fail f--: $f" | |
| f += 10 | |
| if (f != 10) return "fail f +=: $f" | |
| f *= 10 | |
| if (f != 100) return "fail f *=: $f" | |
| f /= 5 | |
| if (f != 20) return "fail f /=: $f" | |
| f -= 10 | |
| if (f != 10) return "fail f -=: $f" | |
| f %= 7 | |
| if (f != 3) return "fail f %=: $f" | |
| var g by SimpleDelegate | |
| a = 0 | |
| if (g++ != 0) return "fail g++: $g" | |
| if (++g != 2) return "fail ++g: $g" | |
| if (--g != 1) return "fail --g: $g" | |
| if (g-- != 1) return "fail g--: $g" | |
| g += 10 | |
| if (g != 10) return "fail g +=: $g" | |
| g *= 10 | |
| if (g != 100) return "fail g *=: $g" | |
| g /= 5 | |
| if (g != 20) return "fail g /=: $g" | |
| g -= 10 | |
| if (g != 10) return "fail g -=: $g" | |
| g %= 7 | |
| if (g != 3) return "fail g %=: $g" | |
| return "OK" | |
| } |