001/*
002 * Copyright © 2025 CUI-OpenSource-Software (info@cuioss.de)
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package de.cuioss.test.generator.internal.net.java.quickcheck.generator.support;
017
018import de.cuioss.test.generator.internal.net.java.quickcheck.Generator;
019
020import java.util.Objects;
021
022public class SubstringGenerator implements Generator<String> {
023
024    private final String superstring;
025    private final Generator<Integer> sizes;
026
027    public SubstringGenerator(String superstring, int minSize, int maxSize) {
028        Objects.requireNonNull(superstring, "superstring");
029        if (minSize < 0) {
030            throw new IllegalArgumentException("minSize must be >= 0");
031        }
032        if (superstring.length() < maxSize) {
033            throw new IllegalArgumentException("superstring.length() must be >= maxSize");
034        }
035        this.superstring = superstring;
036        this.sizes = new IntegerGenerator(minSize, maxSize);
037    }
038
039    @Override
040    public String next() {
041        int size = sizes.next();
042        int space = superstring.length() - size;
043        assert space >= 0;
044        Integer offset = new IntegerGenerator(0, space).next();
045        String substring = superstring.substring(offset, offset + size);
046        assert substring.length() == size;
047        return substring;
048    }
049}