Skip to content

Commit 2f2a980

Browse files
committed
Create TokenRendererTests.cs
1 parent aca1ad7 commit 2f2a980

File tree

1 file changed

+259
-0
lines changed

1 file changed

+259
-0
lines changed
Lines changed: 259 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,259 @@
1+
using Serilog.Events;
2+
using Serilog.Parsing;
3+
using Serilog.Sinks.RichTextBoxForms.Rendering;
4+
using Serilog.Sinks.RichTextBoxForms.Themes;
5+
using System;
6+
using System.Collections.Generic;
7+
using System.Linq;
8+
using Xunit;
9+
10+
namespace Serilog.Tests.Integration
11+
{
12+
public class TokenRendererTests : RichTextBoxSinkTestBase
13+
{
14+
[Fact]
15+
public void ExceptionTokenRenderer_RendersExceptionWithStackFrames()
16+
{
17+
Exception? exception = null;
18+
try
19+
{
20+
throw new InvalidOperationException("Test exception");
21+
}
22+
catch (Exception ex)
23+
{
24+
exception = ex;
25+
}
26+
27+
var logEvent = new LogEvent(
28+
DateTimeOffset.Now,
29+
LogEventLevel.Error,
30+
exception,
31+
_parser.Parse("Error occurred"),
32+
Array.Empty<LogEventProperty>());
33+
34+
var renderer = new ExceptionTokenRenderer(_defaultTheme);
35+
renderer.Render(logEvent, _canvas);
36+
37+
var result = _richTextBox.Text;
38+
Assert.Contains("InvalidOperationException", result);
39+
Assert.Contains("Test exception", result);
40+
41+
var lines = result.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
42+
Assert.True(lines.Length > 1, $"Exception should have multiple lines including stack trace. Got: {lines.Length} lines. Text: {result}");
43+
}
44+
45+
[Fact]
46+
public void ExceptionTokenRenderer_RendersMultipleLines()
47+
{
48+
Exception? exception = null;
49+
try
50+
{
51+
throw new InvalidOperationException("Test exception");
52+
}
53+
catch (Exception ex)
54+
{
55+
exception = ex;
56+
}
57+
58+
var logEvent = new LogEvent(
59+
DateTimeOffset.Now,
60+
LogEventLevel.Error,
61+
exception,
62+
_parser.Parse("Error occurred"),
63+
Array.Empty<LogEventProperty>());
64+
65+
var renderer = new ExceptionTokenRenderer(_defaultTheme);
66+
renderer.Render(logEvent, _canvas);
67+
68+
var result = _richTextBox.Text;
69+
var lines = result.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
70+
Assert.True(lines.Length > 1, $"Exception should have multiple lines. Got: {lines.Length} lines. Text: {result}");
71+
}
72+
73+
[Fact]
74+
public void ExceptionTokenRenderer_HandlesNullException()
75+
{
76+
var logEvent = new LogEvent(
77+
DateTimeOffset.Now,
78+
LogEventLevel.Information,
79+
null,
80+
_parser.Parse("No exception"),
81+
Array.Empty<LogEventProperty>());
82+
83+
var renderer = new ExceptionTokenRenderer(_defaultTheme);
84+
renderer.Render(logEvent, _canvas);
85+
86+
var result = _richTextBox.Text;
87+
Assert.Empty(result);
88+
}
89+
90+
[Fact]
91+
public void EventPropertyTokenRenderer_RendersNonStringScalarValue()
92+
{
93+
var template = _parser.Parse("Number: {Number}");
94+
var propertyToken = template.Tokens.OfType<PropertyToken>().Single(t => t.PropertyName == "Number");
95+
var renderer = new EventPropertyTokenRenderer(_defaultTheme, propertyToken, null);
96+
97+
var logEvent = new LogEvent(
98+
DateTimeOffset.Now,
99+
LogEventLevel.Information,
100+
null,
101+
template,
102+
new[] { new LogEventProperty("Number", new ScalarValue(42)) });
103+
104+
renderer.Render(logEvent, _canvas);
105+
106+
var result = _richTextBox.Text;
107+
Assert.Contains("42", result);
108+
}
109+
110+
[Fact]
111+
public void EventPropertyTokenRenderer_RendersBooleanValue()
112+
{
113+
var template = _parser.Parse("IsValid: {IsValid}");
114+
var propertyToken = template.Tokens.OfType<PropertyToken>().Single(t => t.PropertyName == "IsValid");
115+
var renderer = new EventPropertyTokenRenderer(_defaultTheme, propertyToken, null);
116+
117+
var logEvent = new LogEvent(
118+
DateTimeOffset.Now,
119+
LogEventLevel.Information,
120+
null,
121+
template,
122+
new[] { new LogEventProperty("IsValid", new ScalarValue(true)) });
123+
124+
renderer.Render(logEvent, _canvas);
125+
126+
var result = _richTextBox.Text;
127+
Assert.Contains("True", result);
128+
}
129+
130+
[Fact]
131+
public void EventPropertyTokenRenderer_RendersStructureValue()
132+
{
133+
var template = _parser.Parse("User: {User}");
134+
var propertyToken = template.Tokens.OfType<PropertyToken>().Single(t => t.PropertyName == "User");
135+
var renderer = new EventPropertyTokenRenderer(_defaultTheme, propertyToken, null);
136+
137+
var structureValue = new StructureValue(new[]
138+
{
139+
new LogEventProperty("Id", new ScalarValue(123)),
140+
new LogEventProperty("Name", new ScalarValue("John"))
141+
}, "User");
142+
143+
var logEvent = new LogEvent(
144+
DateTimeOffset.Now,
145+
LogEventLevel.Information,
146+
null,
147+
template,
148+
new[] { new LogEventProperty("User", structureValue) });
149+
150+
renderer.Render(logEvent, _canvas);
151+
152+
var result = _richTextBox.Text;
153+
Assert.Contains("Id", result);
154+
Assert.Contains("123", result);
155+
Assert.Contains("Name", result);
156+
Assert.Contains("John", result);
157+
}
158+
159+
[Fact]
160+
public void EventPropertyTokenRenderer_RendersSequenceValue()
161+
{
162+
var template = _parser.Parse("Items: {Items}");
163+
var propertyToken = template.Tokens.OfType<PropertyToken>().Single(t => t.PropertyName == "Items");
164+
var renderer = new EventPropertyTokenRenderer(_defaultTheme, propertyToken, null);
165+
166+
var sequenceValue = new SequenceValue(new[]
167+
{
168+
new ScalarValue(1),
169+
new ScalarValue(2),
170+
new ScalarValue(3)
171+
});
172+
173+
var logEvent = new LogEvent(
174+
DateTimeOffset.Now,
175+
LogEventLevel.Information,
176+
null,
177+
template,
178+
new[] { new LogEventProperty("Items", sequenceValue) });
179+
180+
renderer.Render(logEvent, _canvas);
181+
182+
var result = _richTextBox.Text;
183+
Assert.Contains("1", result);
184+
Assert.Contains("2", result);
185+
Assert.Contains("3", result);
186+
}
187+
188+
[Fact]
189+
public void EventPropertyTokenRenderer_RendersDictionaryValue()
190+
{
191+
var template = _parser.Parse("Config: {Config}");
192+
var propertyToken = template.Tokens.OfType<PropertyToken>().Single(t => t.PropertyName == "Config");
193+
var renderer = new EventPropertyTokenRenderer(_defaultTheme, propertyToken, null);
194+
195+
var dict = new Dictionary<ScalarValue, LogEventPropertyValue>
196+
{
197+
{ new ScalarValue("key1"), new ScalarValue("value1") },
198+
{ new ScalarValue("key2"), new ScalarValue(42) }
199+
};
200+
var dictionaryValue = new DictionaryValue(dict);
201+
202+
var logEvent = new LogEvent(
203+
DateTimeOffset.Now,
204+
LogEventLevel.Information,
205+
null,
206+
template,
207+
new[] { new LogEventProperty("Config", dictionaryValue) });
208+
209+
renderer.Render(logEvent, _canvas);
210+
211+
var result = _richTextBox.Text;
212+
Assert.Contains("key1", result);
213+
Assert.Contains("value1", result);
214+
Assert.Contains("key2", result);
215+
Assert.Contains("42", result);
216+
}
217+
218+
[Fact]
219+
public void EventPropertyTokenRenderer_HandlesMissingProperty()
220+
{
221+
var template = _parser.Parse("Missing: {Missing}");
222+
var propertyToken = template.Tokens.OfType<PropertyToken>().Single(t => t.PropertyName == "Missing");
223+
var renderer = new EventPropertyTokenRenderer(_defaultTheme, propertyToken, null);
224+
225+
var logEvent = new LogEvent(
226+
DateTimeOffset.Now,
227+
LogEventLevel.Information,
228+
null,
229+
template,
230+
Array.Empty<LogEventProperty>());
231+
232+
renderer.Render(logEvent, _canvas);
233+
234+
var result = _richTextBox.Text;
235+
Assert.Empty(result);
236+
}
237+
238+
[Fact]
239+
public void EventPropertyTokenRenderer_RendersStringValue()
240+
{
241+
var template = _parser.Parse("Message: {Message}");
242+
var propertyToken = template.Tokens.OfType<PropertyToken>().Single(t => t.PropertyName == "Message");
243+
var renderer = new EventPropertyTokenRenderer(_defaultTheme, propertyToken, null);
244+
245+
var logEvent = new LogEvent(
246+
DateTimeOffset.Now,
247+
LogEventLevel.Information,
248+
null,
249+
template,
250+
new[] { new LogEventProperty("Message", new ScalarValue("Hello World")) });
251+
252+
renderer.Render(logEvent, _canvas);
253+
254+
var result = _richTextBox.Text;
255+
Assert.Contains("Hello World", result);
256+
}
257+
}
258+
}
259+

0 commit comments

Comments
 (0)