public void Arrived(string location, int day) { var @event = new ArrivedAtLocation { Day = day, Location = location }; _events.Add(@event); }
public async Task correctly_correlates_by_stream() { var streams = new List <EventStream>(); var logger = new RecordingLogger(); using (var session = theStore.LightweightSession()) { session.Logger = logger; for (int i = 0; i < 20; i++) { var joined = new MembersJoined { Day = i, Location = Guid.NewGuid().ToString(), Members = new string[] { Guid.NewGuid().ToString() } }; var departed = new MembersDeparted { Day = i, Location = Guid.NewGuid().ToString(), Members = new[] { Guid.NewGuid().ToString() } }; var reached = new ArrivedAtLocation { Day = i, Location = Guid.NewGuid().ToString() }; session.Events.Append(Guid.NewGuid(), joined, departed, reached); } await session.SaveChangesAsync().ConfigureAwait(false); streams.AddRange(logger.LastCommit.GetStreams()); } var types = new Type[] { typeof(MembersJoined), typeof(MembersDeparted), typeof(ArrivedAtLocation) }; var settings = new DaemonSettings { LeadingEdgeBuffer = 0.Seconds() }; using (var data = new Fetcher(theStore, settings, new AsyncOptions(), Substitute.For <IDaemonLogger>(), new StubErrorHandler(), types)) { var page = await data.FetchNextPage(0).ConfigureAwait(false); foreach (var stream in page.Streams) { var existing = streams.Single(x => x.Id == stream.Id); existing.Events.Select(x => x.Id) .ShouldHaveTheSameElementsAs(stream.Events.Select(x => x.Id)); } } }
public async Task correctly_correlates_by_stream() { var streams = new List <EventStream>(); using (var session = theStore.LightweightSession()) { for (int i = 0; i < 20; i++) { var joined = new MembersJoined { Day = i, Location = Guid.NewGuid().ToString(), Members = new string[] { Guid.NewGuid().ToString() } }; var departed = new MembersDeparted { Day = i, Location = Guid.NewGuid().ToString(), Members = new[] { Guid.NewGuid().ToString() } }; var reached = new ArrivedAtLocation { Day = i, Location = Guid.NewGuid().ToString() }; session.Events.Append(Guid.NewGuid(), joined, departed, reached); } await session.SaveChangesAsync().ConfigureAwait(false); streams.AddRange(session.LastCommit.GetStreams()); } var events = theStore.Schema.Events.As <EventGraph>(); theOptions.EventTypeNames = new[] { events.EventMappingFor <MembersJoined>().EventTypeName, events.EventMappingFor <MembersDeparted>().EventTypeName, events.EventMappingFor <ArrivedAtLocation>().EventTypeName }; using (var data = new StagedEventData(theOptions, new ConnectionSource(), events, new JilSerializer())) { var page = await data.FetchNextPage(0).ConfigureAwait(false); foreach (var stream in page.Streams) { var existing = streams.Single(x => x.Id == stream.Id); existing.Events.Select(x => x.Id) .ShouldHaveTheSameElementsAs(stream.Events.Select(x => x.Id)); } } }
public async Task filters_by_event_type_name() { using (var session = theStore.OpenSession()) { for (int i = 0; i < 20; i++) { var joined = new MembersJoined { Day = i, Location = Guid.NewGuid().ToString(), Members = new string[] { Guid.NewGuid().ToString() } }; var departed = new MembersDeparted { Day = i, Location = Guid.NewGuid().ToString(), Members = new[] { Guid.NewGuid().ToString() } }; var reached = new ArrivedAtLocation { Day = i, Location = Guid.NewGuid().ToString() }; session.Events.Append(Guid.NewGuid(), joined, departed, reached); } await session.SaveChangesAsync().ConfigureAwait(false); } var events = theStore.Schema.Events.As <EventGraph>(); theOptions.EventTypeNames = new[] { events.EventMappingFor <MembersDeparted>().EventTypeName, events.EventMappingFor <ArrivedAtLocation>().EventTypeName }; using (var data = new StagedEventData(theOptions, new ConnectionSource(), events, new JilSerializer())) { var page = await data.FetchNextPage(0).ConfigureAwait(false); var all = page.Streams.SelectMany(x => x.Events).ToArray(); all.OfType <Event <MembersJoined> >().Any().ShouldBeFalse(); all.OfType <Event <MembersDeparted> >().Any().ShouldBeTrue(); all.OfType <Event <ArrivedAtLocation> >().Any().ShouldBeTrue(); } }
public async Task filters_by_event_type_name() { using (var session = theStore.OpenSession()) { for (int i = 0; i < 20; i++) { var joined = new MembersJoined { Day = i, Location = Guid.NewGuid().ToString(), Members = new string[] { Guid.NewGuid().ToString() } }; var departed = new MembersDeparted { Day = i, Location = Guid.NewGuid().ToString(), Members = new[] { Guid.NewGuid().ToString() } }; var reached = new ArrivedAtLocation { Day = i, Location = Guid.NewGuid().ToString() }; session.Events.Append(Guid.NewGuid(), joined, departed, reached); } await session.SaveChangesAsync().ConfigureAwait(false); } var settings = new DaemonSettings { LeadingEdgeBuffer = 0.Seconds() }; using (var data = new Fetcher(theStore, settings, new AsyncOptions(), Substitute.For <IDaemonLogger>(), new StubErrorHandler(), new Type[] { typeof(MembersDeparted), typeof(ArrivedAtLocation) })) { var page = await data.FetchNextPage(0).ConfigureAwait(false); var all = page.Streams.SelectMany(x => x.Events).ToArray(); all.OfType <Event <MembersJoined> >().Any().ShouldBeFalse(); all.OfType <Event <MembersDeparted> >().Any().ShouldBeTrue(); all.OfType <Event <ArrivedAtLocation> >().Any().ShouldBeTrue(); } }
public async Task filters_by_event_type_name() { using (var session = theStore.OpenSession()) { for (int i = 0; i < 20; i++) { var joined = new MembersJoined { Day = i, Location = Guid.NewGuid().ToString(), Members = new string[] { Guid.NewGuid().ToString() } }; var departed = new MembersDeparted { Day = i, Location = Guid.NewGuid().ToString(), Members = new[] { Guid.NewGuid().ToString() } }; var reached = new ArrivedAtLocation { Day = i, Location = Guid.NewGuid().ToString() }; session.Events.Append(Guid.NewGuid(), joined, departed, reached); } await session.SaveChangesAsync().ConfigureAwait(false); } var settings = new DaemonSettings { LeadingEdgeBuffer = 0.Seconds() }; using (var data = new Fetcher(theStore, settings, new AsyncOptions(), Substitute.For<IDaemonLogger>(), new StubErrorHandler(), new Type[] {typeof(MembersDeparted), typeof(ArrivedAtLocation)})) { var page = await data.FetchNextPage(0).ConfigureAwait(false); var all = page.Streams.SelectMany(x => x.Events).ToArray(); all.OfType<Event<MembersJoined>>().Any().ShouldBeFalse(); all.OfType<Event<MembersDeparted>>().Any().ShouldBeTrue(); all.OfType<Event<ArrivedAtLocation>>().Any().ShouldBeTrue(); } }
public async Task correctly_correlates_by_stream() { var streams = new List<EventStream>(); var logger = new RecordingLogger(); using (var session = theStore.LightweightSession()) { session.Logger = logger; for (int i = 0; i < 20; i++) { var joined = new MembersJoined { Day = i, Location = Guid.NewGuid().ToString(), Members = new string[] { Guid.NewGuid().ToString() } }; var departed = new MembersDeparted { Day = i, Location = Guid.NewGuid().ToString(), Members = new[] { Guid.NewGuid().ToString() } }; var reached = new ArrivedAtLocation { Day = i, Location = Guid.NewGuid().ToString() }; session.Events.Append(Guid.NewGuid(), joined, departed, reached); } await session.SaveChangesAsync().ConfigureAwait(false); streams.AddRange(logger.LastCommit.GetStreams()); } var types = new Type[] { typeof(MembersJoined), typeof(MembersDeparted), typeof(ArrivedAtLocation) }; var settings = new DaemonSettings { LeadingEdgeBuffer = 0.Seconds() }; using (var data = new Fetcher(theStore, settings, new AsyncOptions(), Substitute.For<IDaemonLogger>(), new StubErrorHandler(), types)) { var page = await data.FetchNextPage(0).ConfigureAwait(false); foreach (var stream in page.Streams) { var existing = streams.Single(x => x.Id == stream.Id); existing.Events.Select(x => x.Id) .ShouldHaveTheSameElementsAs(stream.Events.Select(x => x.Id)); } } }
public async Task capture_events() { #region sample_event-store-quickstart var store = DocumentStore.For(_ => { _.Connection(ConnectionSource.ConnectionString); _.Projections.SelfAggregate <QuestParty>(); }); var questId = Guid.NewGuid(); using (var session = store.OpenSession()) { var started = new QuestStarted { Name = "Destroy the One Ring" }; var joined1 = new MembersJoined(1, "Hobbiton", "Frodo", "Sam"); // Start a brand new stream and commit the new events as // part of a transaction session.Events.StartStream <Quest>(questId, started, joined1); // Append more events to the same stream var joined2 = new MembersJoined(3, "Buckland", "Merry", "Pippen"); var joined3 = new MembersJoined(10, "Bree", "Aragorn"); var arrived = new ArrivedAtLocation { Day = 15, Location = "Rivendell" }; session.Events.Append(questId, joined2, joined3, arrived); // Save the pending changes to db await session.SaveChangesAsync(); } #endregion #region sample_event-store-start-stream-with-explicit-type using (var session = store.OpenSession()) { var started = new QuestStarted { Name = "Destroy the One Ring" }; var joined1 = new MembersJoined(1, "Hobbiton", "Frodo", "Sam"); // Start a brand new stream and commit the new events as // part of a transaction session.Events.StartStream(typeof(Quest), questId, started, joined1); await session.SaveChangesAsync(); } #endregion #region sample_event-store-start-stream-with-no-type using (var session = store.OpenSession()) { var started = new QuestStarted { Name = "Destroy the One Ring" }; var joined1 = new MembersJoined(1, "Hobbiton", "Frodo", "Sam"); // Start a brand new stream and commit the new events as // part of a transaction // no stream type will be stored in database session.Events.StartStream(questId, started, joined1); await session.SaveChangesAsync(); } #endregion #region sample_events-fetching-stream using (var session = store.OpenSession()) { var events = await session.Events.FetchStreamAsync(questId); events.Each(evt => { Console.WriteLine($"{evt.Version}.) {evt.Data}"); }); } #endregion #region sample_events-aggregate-on-the-fly using (var session = store.OpenSession()) { // questId is the id of the stream var party = session.Events.AggregateStream <QuestParty>(questId); Console.WriteLine(party); var party_at_version_3 = await session.Events .AggregateStreamAsync <QuestParty>(questId, 3); var party_yesterday = await session.Events .AggregateStreamAsync <QuestParty>(questId, timestamp : DateTime.UtcNow.AddDays(-1)); } #endregion using (var session = store.OpenSession()) { var party = session.Load <QuestParty>(questId); Console.WriteLine(party); } }
public void capture_events() { // SAMPLE: event-store-quickstart var store = DocumentStore.For(_ => { _.Connection(ConnectionSource.ConnectionString); _.Events.InlineProjections.AggregateStreamsWith <QuestParty>(); }); var questId = Guid.NewGuid(); using (var session = store.OpenSession()) { var started = new QuestStarted { Name = "Destroy the One Ring" }; var joined1 = new MembersJoined(1, "Hobbiton", "Frodo", "Sam"); // Start a brand new stream and commit the new events as // part of a transaction session.Events.StartStream <Quest>(questId, started, joined1); session.SaveChanges(); // Append more events to the same stream var joined2 = new MembersJoined(3, "Buckland", "Merry", "Pippen"); var joined3 = new MembersJoined(10, "Bree", "Aragorn"); var arrived = new ArrivedAtLocation { Day = 15, Location = "Rivendell" }; session.Events.Append(questId, joined2, joined3, arrived); session.SaveChanges(); } // ENDSAMPLE // SAMPLE: events-fetching-stream using (var session = store.OpenSession()) { var events = session.Events.FetchStream(questId); events.Each(evt => { Console.WriteLine($"{evt.Version}.) {evt.Data}"); }); } // ENDSAMPLE // SAMPLE: events-aggregate-on-the-fly using (var session = store.OpenSession()) { // questId is the id of the stream var party = session.Events.AggregateStream <QuestParty>(questId); Console.WriteLine(party); var party_at_version_3 = session.Events .AggregateStream <QuestParty>(questId, 3); var party_yesterday = session.Events .AggregateStream <QuestParty>(questId, timestamp: DateTime.UtcNow.AddDays(-1)); } // ENDSAMPLE using (var session = store.OpenSession()) { var party = session.Load <QuestParty>(questId); Console.WriteLine(party); } }
internal void Attack() { if (Player.Health <= 0) { throw new DefeatedException(); } if (CurrentMonster == null) { throw new NotInBattleModeException(); } var attackRollPlayer = dice.Roll(); var weapon = Player.WeaponId.HasValue ? ((Weapon)unitOfWork.Items.Get(Player.WeaponId.Value)) : null; var elementAttack = weapon == null ? 0 : GetElementAttack(weapon.ElementAttacks, CurrentMonster.ElementDefenses); var weaponAttack = Player.WeaponId.HasValue ? ((Weapon)unitOfWork.Items.Get(Player.WeaponId.Value)).Attack : 0; var attackPlayer = Player.Attack + attackRollPlayer + weaponAttack + elementAttack - CurrentMonster.Defense; attackPlayer = Math.Max(0, attackPlayer); if (attackPlayer > CurrentMonster.Health) { CurrentMonster.Health = 0; } else { CurrentMonster.Health -= attackPlayer; } if (CurrentMonster.Health == 0) { var loot = GetLoot(); foreach (var item in loot) { Player.Inventory.Add(item.Id); } MonsterDefeated?.Invoke(this, new MonsterDefeatedEventArgs(CurrentMonster, loot)); CurrentMonster = encounters.Next(); if (CurrentMonster == null) { encounters = null; ArrivedAtLocation?.Invoke(this, new ArrivedAtLocationEventArgs(CurrentTown)); } else { MonsterEncountered?.Invoke(this, new MonsterEncounteredEventArgs(CurrentMonster)); } return; } else { MonsterHealthChanged?.Invoke(this, new MonsterHealthChangedEventArgs(CurrentMonster.Health)); } var attackRollMonster = dice.Roll(); var legDefencePlayer = Player.LegArmorId.HasValue ? ((LegArmor)unitOfWork.Items.Get(Player.LegArmorId.Value)).Defence : 0; var bodyDefencePlayer = Player.BodyArmorId.HasValue ? ((BodyArmor)unitOfWork.Items.Get(Player.BodyArmorId.Value)).Defence : 0; var attackMonster = CurrentMonster.Attack + attackRollMonster - Player.Defense - legDefencePlayer - bodyDefencePlayer; attackMonster = Math.Max(0, attackMonster); if (attackMonster > Player.Health) { Player.Health = 0; } else { Player.Health -= attackMonster; } if (Player.Health <= 0) { PlayerDefeated.Invoke(this, EventArgs.Empty); } else if (attackMonster != 0) { PlayerHealthChanged?.Invoke(this, new PlayerHealthChangedEventArgs(Player.Health)); } }