public async Task <object> RunAsync(ExpectEventsScenario scenario, CancellationToken ct = default(CancellationToken)) { var checkpoint = await WriteGivens(scenario.Givens); var envelope = scenario.When is CommandEnvelope ? (CommandEnvelope)scenario.When : new CommandEnvelope() .SetCommand(scenario.When) .SetCommandId(Guid.NewGuid()) .SetCorrelationId(Guid.NewGuid()) .SetSourceId(Guid.NewGuid()); var exception = await Catch.Exception(() => _invoker.Invoke(envelope, ct)); if (exception != null) { return(scenario.ButThrewException(exception)); } var recordedEvents = await ReadThens(checkpoint); if (scenario.Givens.Length != 0 && recordedEvents.Length != 0) { recordedEvents = recordedEvents.Skip(1).ToArray(); } var config = new ComparisonConfig { MaxDifferences = int.MaxValue, MaxStructDepth = 5, MembersToIgnore = new List <string> { "MsgId" } }; var comparer = new CompareLogic(config); var expectedEvents = Array.ConvertAll(scenario.Thens, then => new ReactiveDomain.Testing.RecordedEvent(_converter(new StreamName(then.Stream)), then.Event)); var result = comparer.Compare(expectedEvents, recordedEvents); if (result.AreEqual) { return(scenario.Pass()); } return(scenario.ButRecordedOtherEvents(recordedEvents)); //, result.Differences.ToArray() }
public static void Usage() { var groupId = new GroupIdentifier(Guid.NewGuid()); var groupName = new GroupName("Elvis Fanclub"); var john = new GroupAdministratorIdentifier(Guid.NewGuid()); var jane = new GroupAdministratorIdentifier(Guid.NewGuid()); //Start a group (imagine a command) var group = Group.Start(groupId, groupName, john); PrintRecords(group); //Stop a group (imagine a command) group.Stop(jane); PrintRecords(group); //Take a snapshot of the group var source = (ISnapshotSource)group; var snapshot = source.TakeSnapshot(); //Restore another instance from the snapshot var groupFromStore = Group.Factory(); var destination = (ISnapshotSource)groupFromStore; destination.RestoreFromSnapshot(snapshot); //Here's an example of a composition root var settings = new JsonSerializerSettings(); var invoker = new CommandHandlerInvoker( new CommandHandlerModule[] { new GroupModule( new GroupRepository( null, /* todo - connection to embedded eventstore */ new EventSourceReaderConfiguration( StreamNameConversions.PassThru, () => new StreamEventsSliceTranslator( typeName => Type.GetType(typeName, true), settings), new SliceSize(100)), new EventSourceWriterConfiguration( StreamNameConversions.PassThru, new EventSourceChangesetTranslator(type => type.FullName, settings)))) }); // Somewhere in the infrastructure, probably as part of an IHandleCommand<> (see below) var command = /* typically comes from the wire, here in deserialized shape. */ new StartGroup(Guid.NewGuid(), "Fans of Elvis", Guid.NewGuid()); invoker.Invoke(new CommandEnvelope().SetCommand(command)).Wait(); //Don't block obviously, go full async. }