/*******************************************************************************
 * Copyright (c) 2016 Ericsson
 *
 * All rights reserved. This program and the accompanying materials are
 * made available under the terms of the Eclipse Public License 2.0 which
 * accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/

package org.eclipse.tracecompass.analysis.timing.core.tests.segmentstore.statistics;

import java.util.Collection;
import java.util.Random;
import java.util.stream.Collectors;

import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.tracecompass.analysis.timing.core.tests.statistics.AbstractStatisticsTest;
import org.eclipse.tracecompass.segmentstore.core.BasicSegment;
import org.eclipse.tracecompass.segmentstore.core.ISegment;

/**
 * Test statistics for segment length
 *
 * @author Matthew Khouzam
 */
public class SegmentStoreStatisticsTest extends AbstractStatisticsTest<@NonNull ISegment> {

    private final Random fRandom = new Random(10);

    /**
     * Constructor
     */
    public SegmentStoreStatisticsTest() {
        super(s -> s.getLength());
    }

    @Override
    protected Collection<@NonNull ISegment> createElementsWithValues(Collection<@NonNull Long> longFixture) {
        return longFixture.stream()
                .map(l -> {
                    long nextStart = fRandom.nextInt(10000000);
                    long nextEnd = nextStart + l;
                    // Check the boundaries, it is random after all, so if
                    // there's an overflow, just take the max value as end time
                    if (nextEnd < nextStart) {
                        nextEnd = Long.MAX_VALUE;
                        nextStart = nextEnd - l;
                    }
                    return new BasicSegment(nextStart, nextEnd);
                })
                .collect(Collectors.toList());

    }

    @Override
    public void testLimitDataset2() {
        /* ISegments do not support negative values */
    }

    @Override
    public void testLargeDatasetNegative() {
        /* ISegments do not support negative values */
    }

}
