Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 22 additions & 20 deletions src/GalaxyCheck/Gens/Internal/GenTransformingExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using GalaxyCheck;
using GalaxyCheck.Gens.Internal.Iterations;
using GalaxyCheck.Gens.Internal.Iterations;
using GalaxyCheck.Gens.Iterations.Generic;
using GalaxyCheck.Internal;
using System;
Expand Down Expand Up @@ -27,28 +26,28 @@ public static IGen<U> TransformStream<T, U>(this IGen<T> gen, GenStreamTransform
public static IGen<U> TransformIterations<T, U>(
this IGen<T> gen,
GenIterationTransformation<T, U> transformation) =>
gen.TransformStream(stream => stream.Select(transformation.Invoke));
gen.TransformStream(stream => stream.Select(transformation.Invoke));

public static IGen<U> TransformInstances<T, U>(
this IGen<T> gen,
GenInstanceTransformation<T, U> transformation) =>
gen.TransformIterations((IGenIteration<T> iteration) =>
{
var either = iteration.ToEither<T, U>();
gen.TransformIterations((IGenIteration<T> iteration) =>
{
var either = iteration.ToEither<T, U>();

if (EitherExtension.IsLeft(either, out IGenInstance<T> instance))
{
return transformation(instance);
}
else if (EitherExtension.IsRight(either, out IGenIteration<U> iterationConverted))
{
return iterationConverted;
}
else
{
throw new Exception("Fatal: Unhandled branch");
}
});
if (EitherExtension.IsLeft(either, out IGenInstance<T> instance))
{
return transformation(instance);
}
else if (EitherExtension.IsRight(either, out IGenIteration<U> iterationConverted))
{
return iterationConverted;
}
else
{
throw new Exception("Fatal: Unhandled branch");
}
});

public static IGen<T> Repeat<T>(this IGen<T> gen) => gen.Transform(GenTransformations.Repeat<T>());
}
Expand All @@ -61,7 +60,10 @@ internal static class GenTransformations
.Repeat(() => gen.Advanced.Run(parameters))
.Tap((iteration) =>
{
parameters = iteration.NextParameters;
parameters = iteration.Match(
instance => instance.NextParameters,
error => error.ReplayParameters,
discard => discard.NextParameters);
});
});
}
Expand Down
42 changes: 18 additions & 24 deletions src/GalaxyCheck/Gens/Internal/Iterations/GenIterationFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,55 +12,49 @@ private record GenIteration<T> : IGenIteration<T>
{
public GenIteration(
GenParameters replayParameters,
GenParameters nextParameters,
IGenData<T> data)
{
ReplayParameters = replayParameters;
NextParameters = nextParameters;
Data = data;
}

public GenParameters ReplayParameters { get; init; }

public GenParameters NextParameters { get; init; }

public IGenData<T> Data { get; init; }

IGenData IGenIteration.Data => Data.Match<IGenData>(
onInstance: instanceData => GenData.InstanceData(instanceData.ExampleSpace),
onInstance: instanceData => GenData.InstanceData(instanceData.NextParameters, instanceData.ExampleSpace),
onError: errorData => GenData.ErrorData(errorData.Message),
onDiscard: discardData => GenData.DiscardData(discardData.ExampleSpace));
onDiscard: discardData => GenData.DiscardData(discardData.NextParameters, discardData.ExampleSpace));

public TResult Match<TResult>(
Func<IGenInstance<T>, TResult> onInstance,
Func<IGenError<T>, TResult> onError,
Func<IGenDiscard<T>, TResult> onDiscard) => Data.Match(
onInstance: _ => onInstance(new GenInstance<T>(ReplayParameters, NextParameters, Data)),
onError: _ => onError(new GenError<T>(ReplayParameters, NextParameters, Data)),
onDiscard: _ => onDiscard(new GenDiscard<T>(ReplayParameters, NextParameters, Data)));
onInstance: _ => onInstance(new GenInstance<T>(ReplayParameters, Data)),
onError: _ => onError(new GenError<T>(ReplayParameters, Data)),
onDiscard: _ => onDiscard(new GenDiscard<T>(ReplayParameters, Data)));

private record GenInstance<U> : GenIteration<U>, IGenInstance<U>
{
public GenInstance(
GenParameters replayParameters,
GenParameters nextParameters,
IGenData<U> data)
: base(replayParameters, nextParameters, data)
: base(replayParameters, data)
{
}

public GenParameters NextParameters => Data.Instance!.NextParameters;

public IExampleSpace<U> ExampleSpace => Data.Instance!.ExampleSpace;

IExampleSpace IGenInstanceData.ExampleSpace => ExampleSpace;
}

private record GenError<U> : GenIteration<U>, IGenError<U>
{
public GenError(
GenParameters replayParameters,
GenParameters nextParameters,
IGenData<U> data)
: base(replayParameters, nextParameters, data)
public GenError(GenParameters replayParameters, IGenData<U> data)
: base(replayParameters, data)
{
}

Expand All @@ -71,12 +65,13 @@ private record GenDiscard<U> : GenIteration<U>, IGenDiscard<U>
{
public GenDiscard(
GenParameters replayParameters,
GenParameters nextParameters,
IGenData<U> data)
: base(replayParameters, nextParameters, data)
: base(replayParameters, data)
{
}

public GenParameters NextParameters => Data.Discard!.NextParameters;

public IExampleSpace ExampleSpace => Data.Discard!.ExampleSpace;
}
}
Expand All @@ -86,21 +81,20 @@ public static IGenIteration<T> Instance<T>(
GenParameters nextParameters,
IExampleSpace<T> exampleSpace)
{
var instanceData = GenData<T>.InstanceData(exampleSpace);
return new GenIteration<T>(replayParameters, nextParameters, instanceData);
var instanceData = GenData<T>.InstanceData(nextParameters, exampleSpace);
return new GenIteration<T>(replayParameters, instanceData);
}

public static IGenIteration<T> Error<T>(
GenParameters replayParameters,
string message) => new GenIteration<T>(
replayParameters,
replayParameters,
GenData<T>.ErrorData(message));
replayParameters,
GenData<T>.ErrorData(message));

public static IGenIteration<T> Discard<T>(
GenParameters replayParameters,
GenParameters nextParameters,
IExampleSpace exampleSpace) =>
new GenIteration<T>(replayParameters, nextParameters, GenData<T>.DiscardData(exampleSpace));
new GenIteration<T>(replayParameters, GenData<T>.DiscardData(nextParameters, exampleSpace));
}
}
18 changes: 10 additions & 8 deletions src/GalaxyCheck/Gens/Iterations/GenIteration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ public interface IGenIteration
{
GenParameters ReplayParameters { get; }

GenParameters NextParameters { get; }

IGenData Data { get; }
}

Expand All @@ -29,6 +27,8 @@ T Match<T>(

public interface IGenInstanceData
{
GenParameters NextParameters { get; }

IExampleSpace ExampleSpace { get; }
}

Expand All @@ -39,20 +39,22 @@ public interface IGenErrorData

public interface IGenDiscardData
{
GenParameters NextParameters { get; }

IExampleSpace ExampleSpace { get; }
}

public record GenInstanceData(IExampleSpace ExampleSpace) : IGenInstanceData;
public record GenInstanceData(GenParameters NextParameters, IExampleSpace ExampleSpace) : IGenInstanceData;

public record GenErrorData(string Message) : IGenErrorData;

public record GenDiscardData(IExampleSpace ExampleSpace) : IGenDiscardData;
public record GenDiscardData(GenParameters NextParameters, IExampleSpace ExampleSpace) : IGenDiscardData;

public record GenData : IGenData
{
public static GenData InstanceData(IExampleSpace exampleSpace) => new GenData
public static GenData InstanceData(GenParameters nextParameters, IExampleSpace exampleSpace) => new GenData
{
Instance = new GenInstanceData(exampleSpace),
Instance = new GenInstanceData(nextParameters, exampleSpace),
Error = null,
Discard = null
};
Expand All @@ -64,11 +66,11 @@ public record GenData : IGenData
Discard = null
};

public static GenData DiscardData(IExampleSpace exampleSpace) => new GenData
public static GenData DiscardData(GenParameters nextParameters, IExampleSpace exampleSpace) => new GenData
{
Instance = null,
Error = null,
Discard = new GenDiscardData(exampleSpace)
Discard = new GenDiscardData(nextParameters, exampleSpace)
};

public IGenInstanceData? Instance { get; init; }
Expand Down
31 changes: 16 additions & 15 deletions src/GalaxyCheck/Gens/Iterations/Generic/GenIteration.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using GalaxyCheck.ExampleSpaces;
using System;
using System.Collections.Generic;
using GalaxyCheck.Gens.Parameters;

namespace GalaxyCheck.Gens.Iterations.Generic
{
Expand Down Expand Up @@ -45,23 +45,24 @@ public interface IGenInstanceData<out T> : IGenInstanceData
new IExampleSpace<T> ExampleSpace { get; }
}

public record GenInstanceData<T>(IExampleSpace<T> ExampleSpace) : IGenInstanceData<T>
public record GenInstanceData<T>(GenParameters NextParameters, IExampleSpace<T> ExampleSpace) : IGenInstanceData<T>
{
IExampleSpace IGenInstanceData.ExampleSpace => ExampleSpace;
}

public record GenErrorData(string Message) : IGenErrorData;

public record GenDiscardData(IExampleSpace ExampleSpace) : IGenDiscardData;
public record GenDiscardData(GenParameters NextParameters, IExampleSpace ExampleSpace) : IGenDiscardData;

public record GenData<T> : IGenData<T>
{
public static GenData<T> InstanceData(IExampleSpace<T> exampleSpace) => new GenData<T>
{
Instance = new GenInstanceData<T>(exampleSpace),
Error = null,
Discard = null
};
public static GenData<T> InstanceData(GenParameters nextParameters, IExampleSpace<T> exampleSpace) =>
new GenData<T>
{
Instance = new GenInstanceData<T>(nextParameters, exampleSpace),
Error = null,
Discard = null
};

public static GenData<T> ErrorData(string message) => new GenData<T>
{
Expand All @@ -70,11 +71,11 @@ public record GenData<T> : IGenData<T>
Discard = null
};

public static GenData<T> DiscardData(IExampleSpace exampleSpace) => new GenData<T>
public static GenData<T> DiscardData(GenParameters nextParameters, IExampleSpace exampleSpace) => new GenData<T>
{
Instance = null,
Error = null,
Discard = new GenDiscardData(exampleSpace)
Discard = new GenDiscardData(nextParameters, exampleSpace)
};

public IGenInstanceData<T>? Instance { get; init; }
Expand All @@ -87,9 +88,9 @@ public TResult Match<TResult>(
Func<IGenInstanceData<T>, TResult> onInstance,
Func<IGenErrorData, TResult> onError,
Func<IGenDiscardData, TResult> onDiscard) =>
Instance != null ? onInstance(Instance) :
Error != null ? onError(Error) :
Discard != null ? onDiscard(Discard) :
throw new NotSupportedException();
Instance != null ? onInstance(Instance) :
Error != null ? onError(Error) :
Discard != null ? onDiscard(Discard) :
throw new NotSupportedException();
}
}
4 changes: 2 additions & 2 deletions src/GalaxyCheck/Operators/Cast.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@ public static partial class Extensions
.Select(iteration => iteration.Data.Match(
onInstance: instance => GenIterationFactory.Instance<T>(
iteration.ReplayParameters,
iteration.NextParameters,
instance.NextParameters,
instance.ExampleSpace.Cast<T>()),
onError: error => GenIterationFactory.Error<T>(
iteration.ReplayParameters,
error.Message),
onDiscard: discard => GenIterationFactory.Discard<T>(
iteration.ReplayParameters,
iteration.NextParameters,
discard.NextParameters,
discard.ExampleSpace))));

public static IGen<T> Cast<T>(this IGen<T> gen)
Expand Down
6 changes: 3 additions & 3 deletions src/GalaxyCheck/Operators/SelectMany.cs
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ static IEnumerable<IGenIteration<TResult>> BindExampleSpace(

return GenIterationFactory.Instance(
iteration.ReplayParameters,
iteration.NextParameters,
instance.NextParameters,
jointExampleSpace);
},
onError: error => error,
Expand Down Expand Up @@ -110,14 +110,14 @@ static IEnumerable<IGenIteration<TResult>> Run(
yield return innerIteration.Match(
onInstance: innerInstance => GenIterationFactory.Instance(
iteration.ReplayParameters,
innerIteration.NextParameters,
innerInstance.NextParameters,
innerInstance.ExampleSpace),
onError: innerError => GenIterationFactory.Error<TResult>(
iteration.ReplayParameters,
innerError.Message),
onDiscard: innerDiscard => GenIterationFactory.Discard<TResult>(
iteration.ReplayParameters,
innerIteration.NextParameters,
innerDiscard.NextParameters,
innerDiscard.ExampleSpace));
}

Expand Down
5 changes: 4 additions & 1 deletion src/GalaxyCheck/Operators/Where.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,10 @@ public static IGen<T> Where<T>(this IGen<T> gen, Func<T, bool> pred)
{
var resizedIteration = GenIterationFactory.Discard<T>(
iteration.ReplayParameters,
iteration.NextParameters with { Size = iteration.NextParameters.Size.BigIncrement() },
iteration.Data.Discard!.NextParameters with
{
Size = iteration.Data.Discard!.NextParameters.Size.BigIncrement()
},
iteration.Data.Discard!.ExampleSpace);

return (iteration: resizedIteration, consecutiveDiscardCount);
Expand Down
2 changes: 1 addition & 1 deletion src/GalaxyCheck/Runners/Check/Sizing/SizingAspects.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ private static ResizeStrategy<T> SuperStrategicResize()

return nextSize;
},
onError: error => error.NextParameters.Size,
onError: error => error.ReplayParameters.Size,
onDiscard: discard => discard.NextParameters.Size);
}

Expand Down
2 changes: 1 addition & 1 deletion src/GalaxyCheck/Runners/Check/Sizing/SizingAspectsAsync.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ private static ResizeStrategyAsync<T> SuperStrategicResize()

return nextSize;
},
onError: error => error.NextParameters.Size,
onError: error => error.ReplayParameters.Size,
onDiscard: discard => discard.NextParameters.Size);
}

Expand Down