Java源码示例:com.pholser.junit.quickcheck.random.SourceOfRandomness

示例1
@Override
public List<T> doShrink(SourceOfRandomness random, T larger) {
  @SuppressWarnings("unchecked")
  List<Object> asList = new ArrayList<>(larger);

  List<T> shrinks = new ArrayList<>();
  shrinks.addAll(removals(asList));

  @SuppressWarnings("unchecked")
  Shrink<Object> generator = (Shrink<Object>) componentGenerators().get(0);

  List<List<Object>> oneItemShrinks = shrinksOfOneItem(random, asList, generator);
  shrinks.addAll(oneItemShrinks.stream().map(this::convert).filter(this::inSizeRange)
      .collect(Collectors.toList()));

  return shrinks;
}
 
示例2
@Override
public InputStream generate(SourceOfRandomness random, GenerationStatus status) {
    buf = ByteBuffer.allocate(this.capacity);
    try {
        // Populate byte buffer
        populate(random);

    } catch (BufferOverflowException e) {
        // throw new AssumptionViolatedException("Generated input is too large", e);
    }

    // Return the bytes as an inputstream
    int len = buf.position();
    buf.rewind();
    byte[] bytes = new byte[len];
    buf.get(bytes);
    return new ByteArrayInputStream(bytes);
}
 
示例3
@Override
public Graph generate(SourceOfRandomness sourceOfRandomness, GenerationStatus generationStatus) {
    // Ensure that a model exists
    if (model == null) {
        throw new IllegalArgumentException("Graph generators MUST be configured with @GraphModel");
    }

    // Create graph instance
    Graph<Integer, DefaultEdge> graph = createGraph();

    // Generate nodes and edges using JGraphT generators
    getModel(model, sourceOfRandomness)
            .generateGraph(graph, createNodeFactory(), null);

    // If weighted, generate edge weights
    if (model.weighted()) {
        WeightedGraph<Integer, DefaultEdge> wgraph = (WeightedGraph<Integer, DefaultEdge>) graph;
        // Set edges
        for (DefaultEdge e : wgraph.edgeSet()) {
            wgraph.setEdgeWeight(e, sourceOfRandomness.nextFloat());
        }
    }

    // Return handle to this graph
    return graph;
}
 
示例4
@Override
public Schema generate(SourceOfRandomness random, GenerationStatus status) {
  List<Schema.Field> fields =
      IntStream.range(0, random.nextInt(0, status.size()) + 1)
          .mapToObj(
              i -> {
                // deterministically avoid collisions in record names
                branchPush(status, String.valueOf(i));
                Schema.Field field =
                    createField(i, SchemaGenerator.INSTANCE.generate(random, status));
                branchPop(status);
                return field;
              })
          .collect(Collectors.toList());

  return Schema.createRecord("record_" + branch(status), "", "example", false, fields);
}
 
示例5
@Override public RedBlackBSTNode<Integer,Integer> generate(SourceOfRandomness r, GenerationStatus status){
    Optional<Integer> treesizeOpt = status.valueOf(SUBTREE_SIZE);
    if (!treesizeOpt.isPresent()) return null;
    Integer treesize = treesizeOpt.get();
    if (treesize == 0 ){
        return null;
    }
    treesize = treesize -1;
    int leftSize = r.nextInt(0, treesize);
    int rightSize = treesize - leftSize;
    //System.out.println("leftSize: " + leftSize + ", rightSize: " + rightSize);


    RedBlackBSTNode<Integer,Integer> retNode = new RedBlackBSTNode<>(r.nextInt(), r.nextInt(), r.nextBoolean(), treesize + 1);
 //   System.out.println(retNode.key);
    retNode.left= generate(r, status.setValue(SUBTREE_SIZE, leftSize));
    retNode.right = generate(r, status.setValue(SUBTREE_SIZE, rightSize));
    return retNode;
}
 
示例6
private String generateTypeSignature(SourceOfRandomness r, boolean arraysAllowed) {
    String typeSig;
    if (r.nextBoolean()) {
        // Primitive
        typeSig = r.choose(primitiveTypes);
    } else {
        // Class type
        typeSig = "L" + generateClassName(r) + ";";
    }
    if (arraysAllowed && r.nextBoolean()) {
        // Generate array depth with geometric distribution
        int depth = geom.sampleWithMean(MEAN_ARRAY_DEPTH, r);
        for (int i = 0; i < depth; i++) {
            typeSig = "[" + typeSig;
        }
    }
    return typeSig;
}
 
示例7
private String generateExpression(SourceOfRandomness random) {
    expressionDepth++;
    // Choose between terminal or non-terminal
    String result;
    if (expressionDepth >= MAX_EXPRESSION_DEPTH || random.nextBoolean()) {
        result = random.choose(Arrays.<Function<SourceOfRandomness, String>>asList(
                this::generateLiteralNode,
                this::generateIdentNode
        )).apply(random);
    } else {
        result = random.choose(Arrays.<Function<SourceOfRandomness, String>>asList(
                this::generateBinaryNode,
                this::generateUnaryNode,
                this::generateTernaryNode,
                this::generateCallNode,
                this::generateFunctionNode,
                this::generatePropertyNode,
                this::generateIndexNode,
                this::generateArrowFunctionNode
        )).apply(random);
    }
    expressionDepth--;
    return "(" + result + ")";
}
 
示例8
@Override
public T generate(SourceOfRandomness random, GenerationStatus status) {
  int size = size(random, status);

  T items = empty();
  for (int i = 0; i < size; ++i) {
    // Object item0 = componentGenerators().get(0).generate(random, status);
    // Object item1 = componentGenerators().get(1).generate(random, status);
    // Object item2 = componentGenerators().get(2).generate(random, status);

    Object triple = componentGenerators().get(3).generate(random, status);

    items = (T) items.__insert(triple);
  }

  return items;
}
 
示例9
private String generateForNode(SourceOfRandomness random) {
    String s = "for(";
    if (random.nextBoolean()) {
        s += generateExpression(random);
    }
    s += ";";
    if (random.nextBoolean()) {
        s += generateExpression(random);
    }
    s += ";";
    if (random.nextBoolean()) {
        s += generateExpression(random);
    }
    s += ")";
    s += generateBlock(random);
    return s;
}
 
示例10
private String generateCastles(SourceOfRandomness r) {
    if (r.nextBoolean()) {
        return "-";
    }
    String castle = "";
    if (r.nextBoolean()) {
        castle += "K";
    }
    if (r.nextBoolean()) {
        castle += "Q";
    }
    if (r.nextBoolean()) {
        castle += "k";
    }
    if (r.nextBoolean()) {
        castle += "q";
    }
    if (castle.isEmpty()) {
        castle = "-";
    }
    return castle;
}
 
示例11
@Override
public List<T> doShrink(SourceOfRandomness random, T larger) {
  List<Object> asList = new ArrayList<>(larger);

  List<T> shrinks = new ArrayList<>();
  shrinks.addAll(removals(asList));

  Shrink<Object> generator = (Shrink<Object>) componentGenerators().get(0);

  List<List<Object>> oneItemShrinks = shrinksOfOneItem(random, asList, generator);
  shrinks.addAll(oneItemShrinks.stream()
      .map(this::convert)
      .filter(this::inSizeRange)
      .collect(Collectors.toList()));

  return shrinks;
}
 
示例12
@Override
public InputStream generate(SourceOfRandomness sourceOfRandomness, GenerationStatus generationStatus) {
    return new InputStream() {
       @Override
       public int read() throws IOException {
           // Keep asking for new random bytes until the
           // SourceOfRandomness runs out of parameters. This is designed
           // to work with fixed-size parameter sequences, such as when
           // fuzzing with AFL.
           try {
               byte nextByte = sourceOfRandomness.nextByte(Byte.MIN_VALUE, Byte.MAX_VALUE);
               int nextInt = nextByte & 0xFF;
               return nextInt;
           } catch (IllegalStateException e) {
               if (e.getCause() instanceof EOFException) {
                   return -1;
               } else {
                   throw e;
               }
           }
       }
   };
}
 
示例13
@Override
public Pair generate(final SourceOfRandomness random, final GenerationStatus status) {
    return Pair.of(
            componentGenerators().get(FIRST).generate(random, status),
            componentGenerators().get(SECOND).generate(random, status)
    );
}
 
示例14
@Override
public Schema generate(SourceOfRandomness random, GenerationStatus status) {
  Schema.Type type;

  if (nesting(status) >= MAX_NESTING) {
    type = random.choose(PRIMITIVE_TYPES);
  } else {
    type = random.choose(ALL_TYPES);
  }

  if (PRIMITIVE_TYPES.contains(type)) {
    return Schema.create(type);
  } else {
    nestingInc(status);

    if (type == Schema.Type.FIXED) {
      int size = random.choose(Arrays.asList(1, 5, 12));
      return Schema.createFixed("fixed_" + branch(status), "", "", size);
    } else if (type == Schema.Type.UNION) {
      // only nullable fields, everything else isn't supported in row conversion code
      return UnionSchemaGenerator.INSTANCE.generate(random, status);
    } else if (type == Schema.Type.ENUM) {
      return EnumSchemaGenerator.INSTANCE.generate(random, status);
    } else if (type == Schema.Type.RECORD) {
      return RecordSchemaGenerator.INSTANCE.generate(random, status);
    } else if (type == Schema.Type.MAP) {
      return Schema.createMap(generate(random, status));
    } else if (type == Schema.Type.ARRAY) {
      return Schema.createArray(generate(random, status));
    } else {
      throw new AssertionError("Unexpected AVRO type: " + type);
    }
  }
}
 
示例15
@Override
public ImageInputStream generate(SourceOfRandomness random, GenerationStatus status) {
    try {
        // Create an image input stream from an input stream
        return ImageIO.createImageInputStream(gen().make(InputStreamGenerator.class).generate(random, status));
    } catch (IOException e) {
        throw new RuntimeException("I/O exceptions should not occur for byte arrays");
    }
}
 
示例16
@Override
public T generate(SourceOfRandomness random, GenerationStatus status) {
  Object item0 = componentGenerators().get(0).generate(random, status);
  Object item1 = componentGenerators().get(1).generate(random, status);

  return (T) entryOf(item0, item1);
}
 
示例17
@Override
public T generate(SourceOfRandomness random, GenerationStatus status) {
  int size = size(random, status);

  T items = empty();
  for (int i = 0; i < size; ++i) {
    Object item = componentGenerators().get(0).generate(random, status);
    items = (T) items.__insert(item);
  }

  return items;
}
 
示例18
private static<E extends DefaultEdge> GraphGenerator<Integer, E, Integer>
    getModel(GraphModel model, SourceOfRandomness randomSource) {


    Random random = randomSource.toJDKRandom();

    if (model.nodes() <= 0) {
        throw new IllegalArgumentException("nodes must be > 0");
    }

    if (model.edges() > 0) {
        if (model.multiGraph() == false) {
            return new FastGnmRandomGraphGenerator<>(model.nodes(), model.edges(),
                    random, model.loops());
        } else {
            return new GnmRandomGraphGenerator<>(model.nodes(), model.edges(),
                    random, model.loops(), model.multiGraph());
        }
    }

    if (model.multiGraph()) {
        throw new IllegalArgumentException("Multi-graphs must specify edges and use GNM model");
    }

    if (model.p() < 0.0 || model.p() > 1.0) {
        throw new IllegalArgumentException("p must be in [0, 1]");
    }

    if (model.p() == 0.0) {
        return new EmptyGraphGenerator<>(model.nodes());
    } else if (model.p() == 1.0) {
        return new CompleteGraphGenerator<>(model.nodes());
    } else if (model.loops() == false && model.p() == 0.5) {
        return new BitSetBasedSimpleGraphGenerator<>(model.nodes(), random);
    } else {
        return new GnpRandomGraphGenerator<>(model.nodes(), model.p(),
                random, model.loops());
    }
}
 
示例19
@Override
public DirectedGraph generate(SourceOfRandomness sourceOfRandomness, GenerationStatus generationStatus) {
    ModelBasedGraphGenerator graphGenerator = new ModelBasedGraphGenerator();
    graphGenerator.configure(model);
    graphGenerator.setDirected(true);
    return (DirectedGraph) graphGenerator.generate(sourceOfRandomness, generationStatus);
}
 
示例20
public JavaClass generate(SourceOfRandomness r, GenerationStatus s) {
    constants = new ConstantPoolGen();

    // Generate a class with its meta-data
    String className = "example.A";
    String superName = r.nextBoolean() ? "example.B" : "java.lang.Object";
    String fileName = "A.class";
    int flags = r.nextInt(0, Short.MAX_VALUE);
    int numInterfaces = r.nextBoolean() ? 0 : geom.sampleWithMean(MEAN_INTERFACE_COUNT, r);
    String[] interfaces = new String[numInterfaces];
    for (int i = 0; i < numInterfaces; i++) {
        interfaces[i] = "example.I"+i;
    }
    ClassGen classGen = new ClassGen(className, superName, fileName, flags, interfaces, constants);

    // Validate flags
    Assume.assumeFalse(classGen.isFinal() && (classGen.isAbstract() | classGen.isInterface()));

    int numFields = geom.sampleWithMean(MEAN_FIELDS_COUNT, r);
    for (int i = 0; i < numFields; i++) {
        classGen.addField(generateField(r));
    }

    int numMethods = geom.sampleWithMean(MEAN_METHODS_COUNT, r);
    for (int i = 0; i < numMethods; i++) {
        classGen.addMethod(generateMethod(className, r));
    }

    return classGen.getJavaClass();

}
 
示例21
static SparseListModification gen(SourceOfRandomness random, int listSize) {
    int x = listSize == 0 ? random.nextInt(2, 7) : random.nextInt(8);
    switch(x) {
        case 0: return ElemUpdate  .generate(random, listSize);
        case 1: return ElemRemoval .generate(random, listSize);
        case 2: return RangeRemoval.generate(random, listSize);
        case 3: return ElemInsert  .generate(random, listSize);
        case 4: return ElemsInsert .generate(random, listSize);
        case 5: return VoidInsert  .generate(random, listSize);
        case 6: return ElemsSplice .generate(random, listSize);
        case 7: return VoidSplice  .generate(random, listSize);
        default: throw new AssertionError();
    }
}
 
示例22
private InstructionList generateCode(SourceOfRandomness r, Type[] argTypes, Type returnType) {
    InstructionList code = new InstructionList();

    while (r.nextBoolean()) {
        Instruction ins = generateInstruction(r, argTypes.length+1, code); // TODO: Allocate some locals
        if (ins instanceof BranchInstruction) {
            // Call the overloaded append()
            code.append((BranchInstruction) ins);
        } else {
            code.append(ins);
        }
    }
    return code;
}
 
示例23
InstructionHandle generateLabel(SourceOfRandomness r, InstructionList code) {
    InstructionHandle handles[] = code.getInstructionHandles();
    // If no instructions generated so far, emit a NOP to get some label
    if (handles.length == 0) {
        handles = new InstructionHandle[]{ code.append(new NOP()) };
    }
    return r.choose(handles);
}
 
示例24
@Override
public String generate(SourceOfRandomness random, GenerationStatus status) {
  StringBuilder sb = new StringBuilder(CAPACITY);
  for (int i = 0; i < CAPACITY; i++) {
    int randomIndex = random.nextInt(ALL_MY_CHARS.length());
    sb.append(ALL_MY_CHARS.charAt(randomIndex));
  }
  return sb.toString();
}
 
示例25
@Override
public String generate(SourceOfRandomness random, GenerationStatus status) {
    this.status = status;
    this.identifiers = new HashSet<>();
    this.statementDepth = 0;
    this.expressionDepth = 0;
    return generateStatement(random).toString();
}
 
示例26
private static <T> List<T> generateItems(Function<SourceOfRandomness, T> generator, SourceOfRandomness random,
                                         double mean) {
    int len = sampleGeometric(random, mean);
    List<T> items = new ArrayList<>(len);
    for (int i = 0; i < len; i++) {
        items.add(generator.apply(random));
    }
    return items;
}
 
示例27
private String generateStatement(SourceOfRandomness random) {
    statementDepth++;
    String result;
    if (statementDepth >= MAX_STATEMENT_DEPTH || random.nextBoolean()) {
        result = random.choose(Arrays.<Function<SourceOfRandomness, String>>asList(
                this::generateExpressionStatement,
                this::generateBreakNode,
                this::generateContinueNode,
                this::generateReturnNode,
                this::generateThrowNode,
                this::generateVarNode,
                this::generateEmptyNode
        )).apply(random);
    } else {
        result = random.choose(Arrays.<Function<SourceOfRandomness, String>>asList(
                this::generateIfNode,
                this::generateForNode,
                this::generateWhileNode,
                this::generateNamedFunctionNode,
                this::generateSwitchNode,
                this::generateTryNode,
                this::generateBlockStatement
        )).apply(random);
    }
    statementDepth--;
    return result;
}
 
示例28
private String generateBinaryNode(SourceOfRandomness random) {
    String token = random.choose(BINARY_TOKENS);
    String lhs = generateExpression(random);
    String rhs = generateExpression(random);

    return lhs + " " + token + " " + rhs;
}
 
示例29
private String generateCallNode(SourceOfRandomness random) {
    String func = generateExpression(random);
    String args = String.join(",", generateItems(this::generateExpression, random, 3));

    String call = func + "(" + args + ")";
    if (random.nextBoolean()) {
        return call;
    } else {
        return "new " + call;
    }
}
 
示例30
@Override
public Schema generate(SourceOfRandomness random, GenerationStatus status) {
  Map<String, Schema> schemaMap =
      IntStream.range(0, random.nextInt(0, status.size()) + 1)
          .mapToObj(
              i -> {
                // deterministically avoid collisions in record names
                branchPush(status, String.valueOf(i));
                Schema schema =
                    SchemaGenerator.INSTANCE
                        // nested unions aren't supported in AVRO
                        .filter(x -> x.getType() != Schema.Type.UNION)
                        .generate(random, status);
                branchPop(status);
                return schema;
              })
          // AVRO requires uniqueness by full name
          .collect(Collectors.toMap(Schema::getFullName, Function.identity(), (x, y) -> x));

  List<Schema> schemas = new ArrayList<>(schemaMap.values());

  if (random.nextBoolean()) {
    org.apache.avro.Schema nullSchema = org.apache.avro.Schema.create(Schema.Type.NULL);
    schemas.add(nullSchema);
    Collections.shuffle(schemas, random.toJDKRandom());
  }

  return Schema.createUnion(schemas);
}