// Path: src/main/java/org/neo4j/neode/Range.java
// public class Range
// {
//     public static Range minMax( int min, int max )
//     {
//         return new Range( min, max );
//     }
// 
//     public static Range exactly( int count )
//     {
//         return new Range( count, count );
//     }
// 
//     private final int min;
//     private final int max;
// 
//     private Range( int min, int max )
//     {
//         if ( min < 0 )
//         {
//             throw new IllegalArgumentException( "Min must be greater or equal to 0" );
//         }
// 
//         if ( max < min )
//         {
//             throw new IllegalArgumentException( "Max must be greater or equal to min" );
//         }
// 
//         this.min = min;
//         this.max = max;
//     }
// 
//     public int min()
//     {
//         return min;
//     }
// 
//     public int max()
//     {
//         return max;
//     }
// 
//     public int difference()
//     {
//         return max - min;
//     }
// 
//     public boolean isInRange( int value )
//     {
//         return value >= min() && value <= max;
//     }
// 
//     public int getRandom( ProbabilityDistribution probabilityDistribution )
//     {
//         if ( difference() == 0 )
//         {
//             return min();
//         }
//         return probabilityDistribution.generateSingle( this );
//     }
// 
//     @Override
//     public String toString()
//     {
//         return "Range{" +
//                 "min=" + min +
//                 ", max=" + max +
//                 '}';
//     }
// 
//     @Override
//     public boolean equals( Object o )
//     {
//         if ( this == o )
//         {
//             return true;
//         }
//         if ( o == null || getClass() != o.getClass() )
//         {
//             return false;
//         }
// 
//         Range range = (Range) o;
// 
//         return max == range.max && min == range.min;
//     }
// 
//     @Override
//     public int hashCode()
//     {
//         int result = min;
//         result = 31 * result + max;
//         return result;
//     }
// }
// 
// Path: src/main/java/org/neo4j/neode/Range.java
// public static Range minMax( int min, int max )
// {
//     return new Range( min, max );
// }


import java.util.List;
import org.junit.Test;
import org.neo4j.neode.Range;
import static org.junit.Assert.assertEquals;
import static org.neo4j.neode.Range.minMax;
package org.neo4j.neode.probabilities;






public class BaseUniqueProbabilityDistributionTest
{
    @Test
    public void shouldThrowExceptionIfPossibleRangeSmallerThanMaxNumberOfResults() throws Exception
    {
        // given
        ProbabilityDistribution probabilityDistribution = new DummyProbabilityDistribution();

        try
        {
            // when
            probabilityDistribution.generateList( minMax( 0, 2 ), minMax( 1, 1 ) );
        }
        catch ( IllegalArgumentException e )
        {
            // then
            assertEquals( "(range.difference() + 1) must be greater or equal to numberOfResultsRange.max() " +
                    "[numberOfResultsRange: Range{min=0, max=2}, range: Range{min=1, max=1}]", e.getMessage() );
        }

    }

    @Test
    public void shouldAllowForZeroNumbersToBeGenerated() throws Exception
    {
        // given
        ProbabilityDistribution probabilityDistribution = new DummyProbabilityDistribution();

        // when
        List<Integer> results = probabilityDistribution.generateList( minMax( 0, 0 ), minMax( 0, 1 ) );

        // then
        assertEquals( 0, results.size() );
    }

    private class DummyProbabilityDistribution extends BaseUniqueProbabilityDistribution
    {
        @Override
// Path: src/main/java/org/neo4j/neode/Range.java
// public class Range
// {
//     public static Range minMax( int min, int max )
//     {
//         return new Range( min, max );
//     }
// 
//     public static Range exactly( int count )
//     {
//         return new Range( count, count );
//     }
// 
//     private final int min;
//     private final int max;
// 
//     private Range( int min, int max )
//     {
//         if ( min < 0 )
//         {
//             throw new IllegalArgumentException( "Min must be greater or equal to 0" );
//         }
// 
//         if ( max < min )
//         {
//             throw new IllegalArgumentException( "Max must be greater or equal to min" );
//         }
// 
//         this.min = min;
//         this.max = max;
//     }
// 
//     public int min()
//     {
//         return min;
//     }
// 
//     public int max()
//     {
//         return max;
//     }
// 
//     public int difference()
//     {
//         return max - min;
//     }
// 
//     public boolean isInRange( int value )
//     {
//         return value >= min() && value <= max;
//     }
// 
//     public int getRandom( ProbabilityDistribution probabilityDistribution )
//     {
//         if ( difference() == 0 )
//         {
//             return min();
//         }
//         return probabilityDistribution.generateSingle( this );
//     }
// 
//     @Override
//     public String toString()
//     {
//         return "Range{" +
//                 "min=" + min +
//                 ", max=" + max +
//                 '}';
//     }
// 
//     @Override
//     public boolean equals( Object o )
//     {
//         if ( this == o )
//         {
//             return true;
//         }
//         if ( o == null || getClass() != o.getClass() )
//         {
//             return false;
//         }
// 
//         Range range = (Range) o;
// 
//         return max == range.max && min == range.min;
//     }
// 
//     @Override
//     public int hashCode()
//     {
//         int result = min;
//         result = 31 * result + max;
//         return result;
//     }
// }
// 
// Path: src/main/java/org/neo4j/neode/Range.java
// public static Range minMax( int min, int max )
// {
//     return new Range( min, max );
// }


// Path: src/test/java/org/neo4j/neode/probabilities/BaseUniqueProbabilityDistributionTest.java
import java.util.List;
import org.junit.Test;
import org.neo4j.neode.Range;
import static org.junit.Assert.assertEquals;
import static org.neo4j.neode.Range.minMax;

package org.neo4j.neode.probabilities;






public class BaseUniqueProbabilityDistributionTest
{
    @Test
    public void shouldThrowExceptionIfPossibleRangeSmallerThanMaxNumberOfResults() throws Exception
    {
        // given
        ProbabilityDistribution probabilityDistribution = new DummyProbabilityDistribution();

        try
        {
            // when
            probabilityDistribution.generateList( minMax( 0, 2 ), minMax( 1, 1 ) );
        }
        catch ( IllegalArgumentException e )
        {
            // then
            assertEquals( "(range.difference() + 1) must be greater or equal to numberOfResultsRange.max() " +
                    "[numberOfResultsRange: Range{min=0, max=2}, range: Range{min=1, max=1}]", e.getMessage() );
        }

    }

    @Test
    public void shouldAllowForZeroNumbersToBeGenerated() throws Exception
    {
        // given
        ProbabilityDistribution probabilityDistribution = new DummyProbabilityDistribution();

        // when
        List<Integer> results = probabilityDistribution.generateList( minMax( 0, 0 ), minMax( 0, 1 ) );

        // then
        assertEquals( 0, results.size() );
    }

    private class DummyProbabilityDistribution extends BaseUniqueProbabilityDistribution
    {
        @Override
        protected int getNextNumber( Range minMax )