8
votes

Scalacheck: générer une liste correspondant à la liste des générateurs

Je veux générer une liste d'entiers correspondant à une liste de générateurs dans scalacheck . xxx

pour le GENS , Je souhaite créer un générateur listgen dont l'échantillon valide peut être Liste (2, 2000, 0, 6) . Voici ma première tentative d'utilisation des tuples. xxx

Ceci fonctionne, mais je ne veux pas utiliser des tuples depuis la liste des générateurs ( Gens ) est créé de manière dynamique et la taille de la liste n'est pas corrigée. Existe-t-il un moyen de le faire avec des listes?

Je veux utiliser le générateur de la liste ( listgen ) dans Scalacheck Forall Vérification de la propriété. < / p>

Ceci ressemble à un problème de jouet, mais c'est le mieux que je puisse faire pour créer un extrait autonome reproduisant le problème réel que je suis face.


0 commentaires

4 Réponses :


1
votes

Edit: S'il vous plaît ignorer, cela ne répond pas à la question de l'Asker

Je ne peux pas commenter les messages encore, alors je vais devoir vous aventurer ici. Je présume que la fonction "échantillon" s'applique aux générateurs

une raison pour laquelle vous ne pouvez pas faire: xxx


2 commentaires

Je ne veux pas créer des échantillons manuellement. Il sera fait par scalacheck lorsque j'utilise le générateur comme Forall (listgen) {list => }


Ah désolé pour ça, n'a pas réalisé que Scalacheck crée les échantillons



14
votes

Que diriez-vous d'utiliser la méthode ? Il transforme un itérable [gen [t]] dans un gen [c [t]] , où c peut être liste < / code>: xxx


1 commentaires

Fonctionne bien! J'ai dû expliquer explicitement l'argument implicite en raison de l'ambiguïté avec une autre méthode. Val ListGen = Gen.Suence (Gens) (Util.Buildable.Buildablise)



0
votes

Pour une réponse plus théorique: la méthode que vous souhaitez est Traverse , qui est équivalente à la séquence Composez la carte Bien que cela puisse être plus efficace. Il est de la forme générale: xxx

il se comporte comme cartographique mais vous permet de transporter une structure d'application supplémentaire pendant la traversée, le séquençant le long du chemin.


0 commentaires

3
votes

Il suffit d'utiliser gen.Unence code>, mais faites attention à ce qu'il tentera de renvoyer un java.util.arraylist [t] code> si vous ne le paramétriez pas complètement ( Bug ).

Exemple de travail complet: P>

def genIntList(): Gen[List[Int]] = {

  val gens = List(Gen.chooseNum(1, 2), Gen.chooseNum(3, 4))

  Gen.sequence[List[Int], Int](gens)
}

println(genIntList.sample.get) // prints: List(1,4)


0 commentaires