public void Format(string template, object @event) { template = template ?? @event.GetType().Name; foreach (var match in new Regex(@"\{[^\}]\}+").Matches(template).OfType <Match>()) { } var extras = new Dictionary <string, object>(); var unused = new Dictionary <string, string>(); var metaProperty = @event.GetType().GetProperty("Meta", typeof(Metadata)); if (metaProperty != null) { var metadata = (Metadata)metaProperty.GetValue(@event); if (metadata.ContainsKey(DomainEvent.MetadataKeys.AggregateRootId)) { extras.Add("Id", metadata[DomainEvent.MetadataKeys.AggregateRootId]); } } var result = template; foreach (var property in extras .Select(property => new { Name = property.Key, property.Value }) .Concat(@event.GetType() .GetProperties(BindingFlags.Instance | BindingFlags.Public) .Where(x => x.Name != "Meta") .Select(property => new { property.Name, Value = property.GetValue(@event) }))) { var placeholder = "{" + property.Name + "}"; var value = property.Value != null?property.Value.ToString() : "null"; if (result.Contains(placeholder)) { result = result.Replace(placeholder, value); } else { unused.Add(property.Name, value); } } formatter.Write(result); if (!unused.Any()) { return; } formatter.NewLine(); formatter.Indent(); foreach (KeyValuePair <string, string> pair in unused) { formatter.Write(pair.Key + ": " + pair.Value); } formatter.Unindent(); }
protected void Then(string id, params DomainEvent[] events) { if (events.Length == 0) { return; } formatter.Block("Then:"); foreach (var expected in events) { if (results == null) { results = Context.History.Where(x => !arrangedEvents.Contains(x.GetGlobalSequenceNumber())); } var actual = results.FirstOrDefault(); if (actual == null) { Assert(false, () => formatter.Write(expected, new EventFormatter(formatter)).NewLine(), () => formatter.Block("But we got nothing.")); return; } expected.Meta[DomainEvent.MetadataKeys.AggregateRootId] = id; var jActual = Context.EventSerializer.Serialize(actual); var jExpected = Context.EventSerializer.Serialize(expected); Assert( actual.GetAggregateRootId().Equals(id) && actual.GetType() == expected.GetType() && jActual.Data.SequenceEqual(jExpected.Data), () => formatter.Write(expected, new EventFormatter(formatter)).NewLine(), () => { formatter.Block("But we got this:") .Indent().Write(actual, new EventFormatter(formatter)).Unindent() .EndBlock(); if (!jActual.IsJson() || !jExpected.IsJson()) { return; } var differ = new Differ(); var diffs = differ.LineByLine( Encoding.UTF8.GetString(jActual.Data), Encoding.UTF8.GetString(jExpected.Data)); var diff = differ.PrettyLineByLine(diffs); formatter .NewLine().NewLine() .Write("Diff:").NewLine() .Write(diff).NewLine(); }); // consume events results = results.Skip(1); } }