Advertisement
Guest User

Untitled

a guest
May 23rd, 2016
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.44 KB | None | 0 0
  1. package ru.spbstu
  2.  
  3. import java.lang.reflect.GenericArrayType
  4. import java.lang.reflect.ParameterizedType
  5. import java.lang.reflect.Type
  6. import java.lang.reflect.WildcardType
  7. import java.util.*
  8. import java.util.stream.Stream
  9. import kotlin.reflect.KCallable
  10. import kotlin.reflect.KClass
  11. import kotlin.reflect.KType
  12. import kotlin.reflect.defaultType
  13. import kotlin.reflect.jvm.javaType
  14. import kotlin.reflect.jvm.reflect
  15.  
  16. inline fun<T> T.trace(): T {
  17. println(this)
  18. return this
  19. }
  20.  
  21. interface Gen<T> {
  22. fun next(): T
  23. }
  24.  
  25. inline fun<T, U> Gen<T>.map(crossinline f: (T) -> U) = object: Gen<U> {
  26. override fun next() = f(this@map.next())
  27. }
  28.  
  29. inline fun<T> Gen<T>.filter(crossinline f: (T) -> Boolean) = object: Gen<T> {
  30. override fun next(): T {
  31. var nxt = this@filter.next()
  32. while(!f(nxt)) nxt = this@filter.next()
  33. return nxt
  34. }
  35. }
  36.  
  37. open class SuperTypeTag<T> {
  38. val type = (this.javaClass.genericSuperclass as ParameterizedType).actualTypeArguments.first()
  39. }
  40.  
  41. inline fun<reified T: Any> isPrimitive() = T::class.javaPrimitiveType == T::class.java
  42.  
  43. inline fun<reified T: Any> typeFor(v: T) = {
  44. val v = object:SuperTypeTag<T>(){}
  45. //(v.javaClass.genericSuperclass as ParameterizedType).actualTypeArguments.first()
  46. v.type
  47. }()
  48.  
  49. inline fun<reified T: Any> typeFor() = object:SuperTypeTag<T>(){}.type
  50. inline fun<reified T: Any> T.javaType() = typeFor<T>()
  51.  
  52. val Int.Companion.SIZE: Int
  53. get() = java.lang.Integer.SIZE
  54.  
  55. val Short.Companion.SIZE: Int
  56. get() = java.lang.Short.SIZE
  57.  
  58. object Gens{
  59. val randomGen = Random()
  60. val defaultGens = HashMap<Type, Gen<*>>()
  61. val genericGens1 = HashMap<Type, (Gen<*>) -> Gen<*>>()
  62. val genericGens2 = HashMap<Type, (Gen<*>, Gen<*>) -> Gen<*>>()
  63. val genericGens3 = HashMap<Type, (Gen<*>, Gen<*>, Gen<*>) -> Gen<*>>()
  64. val genericGens4 = HashMap<Type, (Gen<*>, Gen<*>, Gen<*>, Gen<*>) -> Gen<*>>()
  65.  
  66. fun<T> ofSequence(seq: Sequence<T>) = object: Gen<T> {
  67. val iter = seq.iterator()
  68. override fun next() = iter.next()
  69. }
  70.  
  71. fun<T> ofStream(seq: Stream<T>) = object: Gen<T> {
  72. val iter = seq.iterator()
  73. override fun next() = iter.next()
  74. }
  75.  
  76. fun<T> ofFun(f: () -> T) = object : Gen<T> {
  77. override fun next() = f()
  78. }
  79.  
  80. fun<T> constant(v: T) = object : Gen<T> {
  81. override fun next() = v
  82. }
  83.  
  84. fun anyInt() = ofFun { randomGen.nextInt() }
  85. fun anyLong() = ofFun { randomGen.nextLong() }
  86. fun anyShort() = ofFun { randomGen.nextInt().toShort() }
  87. fun anyBool() = ofFun { randomGen.nextBoolean() }
  88. fun anyDouble() = ofFun { randomGen.nextDouble() }
  89. fun anyFloat() = ofFun { randomGen.nextFloat() }
  90. fun anyChar() = anyShort().map { it.toChar() }
  91.  
  92. fun anyCommonChar() = ofFun {
  93. val common = "~!@#$%^&*()_+`1234567890-=QWERTYUIOP{}|qwertyuiop[]\\ASDFGHJKL:\"asdfghjkl;'ZXCVBNM<>?zxcvbnm,./ \t\n"
  94. common[randomGen.nextInt(common.length)]
  95. }
  96.  
  97. fun<T> priorities(vararg vs: Pair<Int, Gen<T>>) = {
  98. var partialSum = 0;
  99. val res = vs.asSequence().map { pr -> partialSum += pr.first; (partialSum to pr.second) }.toList()
  100. val resultSum = partialSum
  101. ofFun {
  102. val peeker = randomGen.nextInt(resultSum)
  103. res.find { it.first > peeker }!!.second.next()
  104. }
  105. }()
  106.  
  107. inline fun genNull(): Gen<*> = constant(null)
  108.  
  109. fun defaultForInt() = priorities(
  110. 1 to constant(0),
  111. 1 to constant(1),
  112. 1 to constant(Int.MAX_VALUE),
  113. 1 to constant(Int.MIN_VALUE),
  114. 3 to anyInt()
  115. )
  116. fun defaultForLong() = priorities(
  117. 1 to constant(0L),
  118. 1 to constant(1L),
  119. 1 to constant(Long.MAX_VALUE),
  120. 1 to constant(Long.MIN_VALUE),
  121. 3 to anyLong()
  122. )
  123. fun defaultForShort() = priorities(
  124. 1 to constant(0.toShort()),
  125. 1 to constant(1.toShort()),
  126. 1 to constant(Short.MAX_VALUE),
  127. 1 to constant(Short.MIN_VALUE),
  128. 3 to anyShort()
  129. )
  130. fun defaultForBoolean() = anyBool()
  131. fun defaultForFloat() = priorities(
  132. 1 to ofFun { 0.0f },
  133. 1 to ofFun { Float.MAX_VALUE },
  134. 1 to ofFun { Float.MIN_VALUE },
  135. 1 to ofFun { Float.NEGATIVE_INFINITY },
  136. 1 to ofFun { Float.POSITIVE_INFINITY },
  137. 1 to ofFun { Float.NaN },
  138. 1 to ofFun { Math.ulp(0.0f) },
  139. 1 to ofFun { Math.ulp(1.0f) },
  140. 1 to ofFun { -Math.ulp(0.0f) },
  141. 1 to ofFun { -Math.ulp(1.0f) },
  142. 10 to anyFloat()
  143. )
  144. fun defaultForDouble() = priorities(
  145. 1 to ofFun { 0.0 },
  146. 1 to ofFun { Double.MAX_VALUE },
  147. 1 to ofFun { Double.MIN_VALUE },
  148. 1 to ofFun { Double.NEGATIVE_INFINITY },
  149. 1 to ofFun { Double.POSITIVE_INFINITY },
  150. 1 to ofFun { Double.NaN },
  151. 1 to ofFun { Math.ulp(0.0) },
  152. 1 to ofFun { Math.ulp(1.0) },
  153. 1 to ofFun { -Math.ulp(0.0) },
  154. 1 to ofFun { -Math.ulp(1.0) },
  155. 10 to anyDouble()
  156. )
  157.  
  158. fun defaultForNumber() = priorities(
  159. 1 to defaultForInt().map { it as Number },
  160. 1 to defaultForLong().map { it as Number },
  161. 1 to defaultForShort().map { it as Number },
  162. 1 to defaultForDouble().map { it as Number },
  163. 1 to defaultForFloat().map { it as Number }
  164. )
  165.  
  166. fun anyReadableString() =
  167. priorities(
  168. 1 to constant(""),
  169. 1 to anyCommonChar().map{ it.toString() },
  170. 3 to ofFun {
  171. val len = randomGen.nextInt(20)
  172. IntRange(0, len).map { anyCommonChar().next() }.joinToString("")
  173. },
  174. 3 to ofFun {
  175. val len = randomGen.nextInt(255)
  176. IntRange(0, len).map { anyCommonChar().next() }.joinToString("")
  177. }
  178. )
  179.  
  180. fun defaultForString() = priorities(
  181. 1 to constant(""),
  182. 1 to anyCommonChar().map{ it.toString() },
  183. 3 to ofFun {
  184. val len = randomGen.nextInt(20)
  185. IntRange(0, len).map { anyCommonChar().next() }.joinToString("")
  186. },
  187. 3 to ofFun {
  188. val len = randomGen.nextInt(255)
  189. IntRange(0, len).map { anyCommonChar().next() }.joinToString("")
  190. },
  191. 1 to ofFun {
  192. val len = randomGen.nextInt(20)
  193. IntRange(0, len).map { anyChar().next() }.joinToString("")
  194. },
  195. 1 to ofFun {
  196. val len = randomGen.nextInt(255)
  197. IntRange(0, len).map { anyChar().next() }.joinToString("")
  198. }
  199. )
  200.  
  201. fun<T: Any> setDefault(k: KClass<T>, g: Gen<T>) {
  202. val java = k.java
  203. val prim = k.javaPrimitiveType
  204. val obj = k.javaObjectType
  205.  
  206. if(java == obj) {
  207. defaultGens[java] = g
  208. prim?.apply { defaultGens[this] = g }
  209. } else if (java == prim) {
  210. defaultGens[prim] = g
  211. defaultGens[obj] = g
  212. //defaultGens[obj] = priorities(1 to ofFun { g.next() as T? }, 1 to ofFun{ null as T? })
  213. } else {
  214. defaultGens[java] = g
  215. defaultGens[obj] = g
  216. prim?.apply { defaultGens[this] = g }
  217. }
  218. }
  219.  
  220. fun arrayGen(element: Class<*>, elGen: Gen<*>): Gen<*> =
  221. priorities(
  222. 1 to ofFun{ java.lang.reflect.Array.newInstance(element, 0) },
  223. 1 to ofFun {
  224. val arr = java.lang.reflect.Array.newInstance(element, 1)
  225. java.lang.reflect.Array.set(arr, 0, elGen.next())
  226. arr
  227. },
  228. 3 to ofFun {
  229. val len = randomGen.nextInt(20)
  230. val arr = java.lang.reflect.Array.newInstance(element, len)
  231. IntRange(0, len-1).forEach { java.lang.reflect.Array.set(arr, it, elGen.next()) }
  232. arr
  233. },
  234. 3 to ofFun {
  235. val len = randomGen.nextInt(255)
  236. val arr = java.lang.reflect.Array.newInstance(element, len)
  237.  
  238. IntRange(0, len-1).forEach { java.lang.reflect.Array.set(arr, it, elGen.next()) }
  239. arr
  240. }
  241. )
  242.  
  243. init {
  244. setDefault(Int::class, defaultForInt())
  245. setDefault(Short::class, defaultForShort())
  246. setDefault(Long::class, defaultForLong())
  247. setDefault(Boolean::class, defaultForBoolean())
  248. setDefault(Float::class, defaultForFloat())
  249. setDefault(Double::class, defaultForDouble())
  250. setDefault(Number::class, defaultForNumber())
  251. setDefault(Any::class, ofFun { Any() })
  252.  
  253. setDefault(String::class, defaultForString());
  254.  
  255. genericGens1[List::class.java] = {
  256. param -> priorities(
  257. 1 to ofFun { listOf<Any?>() },
  258. 1 to ofFun { listOf(param.next()) },
  259. 3 to ofFun {
  260. val len = randomGen.nextInt(20)
  261. IntRange(0, len).map { param.next() }.toList()
  262. },
  263. 3 to ofFun {
  264. val len = randomGen.nextInt(255)
  265. IntRange(0, len).map { param.next() }.toList()
  266. }
  267. )
  268. }
  269.  
  270. genericGens1[Set::class.java] = {
  271. param -> priorities(
  272. 1 to ofFun { setOf<Any?>() },
  273. 1 to ofFun { setOf(param.next()) },
  274. 3 to ofFun {
  275. val len = randomGen.nextInt(20)
  276. IntRange(0, len).map { param.next() }.toSet()
  277. },
  278. 3 to ofFun {
  279. val len = randomGen.nextInt(255)
  280. IntRange(0, len).map { param.next() }.toSet()
  281. }
  282. )
  283. }
  284.  
  285. genericGens1[Collection::class.java] = genericGens1[List::class.java]!!
  286. genericGens1[Iterable::class.java] = genericGens1[List::class.java]!!
  287.  
  288. genericGens2[Pair::class.java] = {
  289. param0, param1 -> ofFun { Pair(param0.next(), param1.next()) }
  290. }
  291.  
  292. genericGens2[Map::class.java] = {
  293. kgen, vgen -> priorities(
  294. 1 to ofFun { mapOf<Any?, Any?>() },
  295. 1 to ofFun { mapOf(kgen.next() to vgen.next()) },
  296. 3 to ofFun {
  297. val len = randomGen.nextInt(20)
  298. IntRange(0, len).map { kgen.next() to vgen.next() }.toMap()
  299. },
  300. 3 to ofFun {
  301. val len = randomGen.nextInt(255)
  302. IntRange(0, len).map { kgen.next() to vgen.next() }.toMap()
  303. }
  304. )
  305. }
  306.  
  307. genericGens2[MutableMap::class.java] = {
  308. kgen, vgen -> priorities(
  309. 1 to ofFun { mutableMapOf<Any?, Any?>() } as Gen<Nothing?>,
  310. 1 to ofFun { mutableMapOf(kgen.next() to vgen.next()) } as Gen<Nothing?>,
  311. 3 to ofFun {
  312. val len = randomGen.nextInt(20)
  313. IntRange(0, len).map { kgen.next() to vgen.next() }.toMap(java.util.LinkedHashMap<Any?, Any?>())
  314. } as Gen<Nothing?>,
  315. 3 to ofFun {
  316. val len = randomGen.nextInt(255)
  317. IntRange(0, len).map { kgen.next() to vgen.next() }.toMap(java.util.LinkedHashMap<Any?, Any?>())
  318. } as Gen<Nothing?>
  319. )
  320. }
  321. }
  322.  
  323. val Type.erased: Class<*>
  324. get() = when(this) {
  325. is Class<*> -> this
  326. is WildcardType -> upperBounds.first().erased
  327. is GenericArrayType -> java.lang.reflect.Array.newInstance(genericComponentType.erased, 0).javaClass // this is bullshit
  328. is ParameterizedType -> rawType.erased
  329. else -> TODO("Unsupported type: $this")
  330. }
  331.  
  332. fun getDefault(t: Type, isNullable: Boolean = false): Gen<*>? = {
  333. when(t){
  334. is Class<*> ->
  335. if(t.isArray) {
  336. val elem = getDefault(t.componentType)
  337. if(elem == null) null
  338. else arrayGen(t.componentType.erased, elem)
  339. } else if(isNullable) {
  340. defaultGens[t]?.run {
  341. priorities(5 to (this as Gen<Nothing?>), 1 to constant(null))
  342. }
  343. } else defaultGens[t]
  344. is WildcardType -> getDefault(t.upperBounds.first(), isNullable)
  345. is GenericArrayType -> {
  346. val elem = getDefault(t.genericComponentType)
  347. if(elem == null) null
  348. else arrayGen(t.genericComponentType.erased, elem)
  349. }
  350. is ParameterizedType -> {
  351. val size = t.actualTypeArguments.size
  352. val args = t.actualTypeArguments.map{t: Type -> getDefault(t)!!} ?: ArrayList<Gen<*>>()
  353. when(size) {
  354. 1 -> genericGens1[t.rawType]?.invoke(args[0])
  355. 2 -> genericGens2[t.rawType]?.invoke(args[0], args[1])
  356. 3 -> genericGens3[t.rawType]?.invoke(args[0], args[1], args[2])
  357. 4 -> genericGens4[t.rawType]?.invoke(args[0], args[1], args[2], args[3])
  358. else -> TODO("type $t not currently supported, sorry")
  359. }
  360. }
  361. else -> TODO("type $t not currently supported, sorry")
  362. }
  363. }()
  364.  
  365. inline fun<reified T: Any> forAll(noinline f: (T) -> Boolean) : Boolean {
  366. val gens = getDefault(typeFor<T>(), f.reflect()?.parameters?.first()?.type?.isMarkedNullable ?: false) as Gen<T>
  367.  
  368. return IntRange(0, 1000).all { iteration ->
  369. val param = gens.next()
  370. try {
  371. if(!f.invoke(param)) {
  372. println("Stopped on $param after ${iteration} iterations")
  373. false
  374. } else true
  375. } catch(ex: Exception) {
  376. println("Stopped on exception after ${iteration} iterations")
  377. ex.printStackTrace(System.out)
  378. false
  379. }
  380. }
  381. }
  382.  
  383. inline fun<reified T: Any, reified U: Any> forAll(noinline f: (T, U) -> Boolean) : Boolean {
  384. val gen0 = getDefault(typeFor<T>(), f.reflect()?.parameters?.get(0)?.type?.isMarkedNullable ?: false) as Gen<T>
  385. val gen1 = getDefault(typeFor<U>(), f.reflect()?.parameters?.get(1)?.type?.isMarkedNullable ?: false) as Gen<U>
  386.  
  387. return IntRange(0, 100000).all { iteration ->
  388. val param0 = gen0.next()
  389. val param1 = gen1.next()
  390. try {
  391. if (!f.invoke(param0, param1)) {
  392. println("Stopped on ($param0, $param1) after ${iteration} iterations")
  393. false
  394. } else true
  395. } catch(ex: Exception) {
  396. println("Stopped on exception after ${iteration} iterations")
  397. ex.printStackTrace(System.out)
  398. false
  399. }
  400. }
  401. }
  402.  
  403. }
  404.  
  405. inline fun<reified T> classFor(v: T) = T::class
  406.  
  407. fun main(args: Array<String>) {
  408. println(Gens.forAll { i: Int -> i < i + 1 })
  409. println(Gens.forAll { d: Double -> d <= 0 || d > 0 })
  410.  
  411. println(Gens.forAll { i: Int, j: Int -> i > j || i < j })
  412. println(Gens.forAll { t: Double -> t == t })
  413. println(Gens.forAll { t: Double -> t.equals(t) })
  414.  
  415. println(Gens.forAll { t: Double -> t == (t + 1) - 1 })
  416. println(Gens.forAll { t: Double, u: Double -> t / u * u == t })
  417. println(Gens.forAll { t: Int, u: Int -> t / u * u == t })
  418. println(Gens.forAll { t: Int, u: Int -> t / u == t / u })
  419. println(Gens.forAll { t: Int? -> t != null })
  420.  
  421. println(Gens.forAll { x: Any? -> x.toString().length > 0 })
  422.  
  423. println(Gens.forAll { x: Number -> x == x })
  424. println(Gens.forAll { x: List<Int> -> x.size > 0 })
  425. println(Gens.forAll { x: List<Int>? -> x?.size != 2 })
  426.  
  427. println(Gens.forAll { pr: Pair<Int, Double> -> pr.first.toDouble() != pr.second + 3 })
  428. println(Gens.forAll { pr: Pair<Int, List<Int>> -> pr.second.first() != pr.first })
  429.  
  430. println(Gens.forAll { i: Int -> i != 42 })
  431.  
  432. println(Gens.forAll { i: Int -> i != null })
  433. println(Gens.forAll { i: Int? -> i != null })
  434.  
  435. println(Gens.forAll { lst: List<Int>? -> lst?.sorted() == lst?.sorted()?.sorted() })
  436. println(Gens.forAll { lst: Collection<Int>? -> lst?.sorted() == lst?.sorted()?.sorted() })
  437.  
  438. println(Gens.forAll { s : String -> s.trim() == s.toString() })
  439.  
  440. println(Gens.forAll { m : Map<Double, String>, k : Double -> m.count { it.key == k } == 0 })
  441.  
  442. println(Gens.forAll { l: Long -> java.lang.Double.doubleToLongBits(java.lang.Double.longBitsToDouble(l)) == l })
  443. println(Gens.forAll { d: Double -> java.lang.Double.longBitsToDouble(java.lang.Double.doubleToLongBits(d)) == d })
  444.  
  445. println(Gens.forAll { i: Int -> i.toDouble().toInt() == i })
  446.  
  447. println(Gens.forAll { a: Any? -> a.toString() == a?.toString() })
  448.  
  449. println(Gens.forAll { a: List<Any> -> a.filterNotNull().toList() == a })
  450. println(Gens.forAll { a: List<Any?> -> a.filterNotNull().toList() == a })
  451.  
  452. println(Gens.forAll { a: Array<Array<String>> -> a.flatMap { it.asIterable() }.toSet().size > 3 })
  453.  
  454. println(Gens.forAll { a: Array<List<Int>> -> a.flatMap { it }.any { it < 56 || it > 100 } })
  455.  
  456. println(Gens.forAll { a: Array<String> -> a.toSet().size == a.size })
  457.  
  458. println(Gens.forAll { a: List<String> -> a.toSet().size == a.size })
  459.  
  460. println(Gens.forAll { a: String, b: String -> (a+b).length >= a.length })
  461.  
  462. println(Gens.forAll { a: List<Int>, b: List<Int> -> (a.zip(b)).reversed() == a.reversed().zip(b.reversed()) })
  463.  
  464. println(Gens.forAll { d: Double -> d == d })
  465. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement