001/*
002 * Licensed to the author under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package de.cuioss.test.generator.internal.net.java.quickcheck.generator.support;
018
019import static de.cuioss.test.generator.internal.net.java.quickcheck.generator.support.SetGenerator.MAX_SIZE;
020import static java.util.Objects.requireNonNull;
021
022import java.util.HashMap;
023import java.util.Map;
024import java.util.Set;
025
026import de.cuioss.test.generator.internal.net.java.quickcheck.Generator;
027
028public class MapGenerator<K, V> implements Generator<Map<K, V>> {
029
030    private final Generator<Set<K>> keys;
031    private final Generator<V> values;
032
033    public MapGenerator(Generator<K> keys, Generator<V> values) {
034        requireNonNull(keys, "keys");
035        requireNonNull(values, "values");
036        this.keys = new SetGenerator<>(keys);
037        this.values = values;
038    }
039
040    public MapGenerator(Generator<K> keys, Generator<V> values, Generator<Integer> size) {
041        requireNonNull(keys, "keys");
042        requireNonNull(values, "values");
043        requireNonNull(size, "size");
044        this.keys = new SetGenerator<>(keys, size, MAX_SIZE);
045        this.values = values;
046    }
047
048    @Override
049    public Map<K, V> next() {
050        Map<K, V> next = new HashMap<>();
051        for (K key : keys.next())
052            next.put(key, values.next());
053        return next;
054    }
055}