Men skalacheck bilan juda aniq xato bo'lib tuyulayotganini ko'rmoqdaman, shuning uchun agar u haqiqatan ham mavjud bo'lsa, odamlar uni rekursiv ma'lumotlar tuzilmalari uchun qanday ishlatishini ko'ra olmayman.
Ushbu dastur Arbitrary
qiymatini yaratishda skalacheckni o'z zimmasiga olishdan oldin StackOverflowError
bilan muvaffaqiyatsiz tugadi. Esda tutingki, Tree
turi va Tree
s uchun generator so'zma-so'z ushbu skalacheck qo'llanmasi.
package treegen
import org.scalacheck._
import Prop._
class TreeProperties extends Properties("Tree") {
trait Tree
case class Node(left: Tree, right: Tree) extends Tree
case class Leaf(x: Int) extends Tree
val ints = Gen.choose(-100, 100)
def leafs: Gen[Leaf] = for {
x <- ints
} yield Leaf(x)
def nodes: Gen[Node] = for {
left <- trees
right <- trees
} yield Node(left, right)
def trees: Gen[Tree] = Gen.oneOf(leafs, nodes)
implicit lazy val arbTree: Arbitrary[Tree] = Arbitrary(trees)
property("vacuous") = forAll { t: Tree => true }
}
object Main extends App {
(new TreeProperties).check
}
G'alati tomoni shundaki, hech narsaga ta'sir qilmasligi kerak bo'lgan o'zgarishlar dasturni ishlashi uchun o'zgartiradi. Misol uchun, agar siz trees
ta'rifini bunga o'zgartirsangiz, u hech qanday muammosiz o'tadi:
def trees: Gen[Tree] = for {
x <- Gen.oneOf(0, 1)
t <- if (x == 0) {leafs} else {nodes}
} yield t
Hatto g'alati, agar siz ikkilik daraxt strukturasini o'zgartirsangiz, qiymat Leaf
s emas, balki Node
s da saqlanadi va leafs
va nodes
ta'rifini quyidagicha o'zgartirsangiz:
def leafs: Gen[Leaf] = Gen.value(Leaf())
def nodes: Gen[Node] = for {
x <- ints // Note: be sure to ask for x first, or it'll StackOverflow later, inside scalacheck code!
left <- trees
right <- trees
} yield Node(left, right, x)
Keyin u ham yaxshi ishlaydi.
Bu yerda nima bo'lyapti? Nima uchun Arbitrary
qiymatini yaratish dastlab stekning to'lib ketishiga olib keladi? Nima uchun skalacheck generatorlari generatorlarning boshqaruv oqimiga ta'sir qilmasligi kerak bo'lgan kichik o'zgarishlarga juda sezgir bo'lib tuyuladi?
Nima uchun yuqoridagi oneOf(0, 1)
bilan ifodalaganim asl oneOf(leafs, nodes)
ga to'liq mos kelmaydi?
trees
har doim ikkala argumentni baholaydi,if
dan foydalanadigan esa buni baholamaydimi? - person pedrofurla   schedule 07.11.2013oneOf
haqiqatan ham qattiqqo‘l: scalacheck.googlecode.com/svn/artifacts/1.7/doc/api/org/ - person pedrofurla   schedule 07.11.2013