99
1010namespace Egil . RazorComponents . Testing
1111{
12- public sealed class TestContext : IDisposable
12+ public sealed class TestContext : TestHost
1313 {
14- private readonly ServiceCollection _serviceCollection = new ServiceCollection ( ) ;
15- private readonly Lazy < TestRenderer > _renderer ;
1614 private readonly IReadOnlyList < FragmentBase > _testData ;
17- private readonly Lazy < HtmlParser > _htmlParser ;
1815 private readonly Dictionary < string , IRenderedFragment > _renderedFragments = new Dictionary < string , IRenderedFragment > ( ) ;
1916
20- private TestRenderer Renderer => _renderer . Value ;
21- private HtmlParser HtmlParser => _htmlParser . Value ;
22-
2317 public TestContext ( IReadOnlyList < FragmentBase > testData )
2418 {
25- _renderer = new Lazy < TestRenderer > ( ( ) =>
26- {
27- var serviceProvider = _serviceCollection . BuildServiceProvider ( ) ;
28- var loggerFactory = serviceProvider . GetService < ILoggerFactory > ( ) ?? new NullLoggerFactory ( ) ;
29- return new TestRenderer ( serviceProvider , loggerFactory ) ;
30- } ) ;
31- _htmlParser = new Lazy < HtmlParser > ( ( ) =>
32- {
33- return new HtmlParser ( Renderer , new HtmlComparer ( ) ) ;
34- } ) ;
3519 _testData = testData ;
3620 }
3721
38- public void AddService < T > ( T implementation ) => AddService < T , T > ( implementation ) ;
39-
40- public void AddService < TService , TImplementation > ( TImplementation implementation ) where TImplementation : TService
41- {
42- if ( _renderer . IsValueCreated )
43- throw new InvalidOperationException ( "Cannot configure services after the host has started operation" ) ;
44-
45- _serviceCollection . AddSingleton ( typeof ( TService ) , implementation ) ;
46- }
47-
48- public void WaitForNextRender ( Action trigger )
49- {
50- if ( trigger is null ) throw new ArgumentNullException ( nameof ( trigger ) ) ;
51- var task = Renderer . NextRender ;
52- trigger ( ) ;
53- task . Wait ( millisecondsTimeout : 1000 ) ;
54-
55- if ( ! task . IsCompleted )
56- {
57- throw new TimeoutException ( "No render occurred within the timeout period." ) ;
58- }
59- }
60-
61- public RenderedComponent < TComponent > AddComponent < TComponent > ( ) where TComponent : class , IComponent
62- {
63- return AddComponent < TComponent > ( ParameterView . Empty ) ;
64- }
65-
66- public RenderedComponent < TComponent > AddComponent < TComponent > ( params ( string paramName , object valueValue ) [ ] parameters ) where TComponent : class , IComponent
67- {
68- var paramDict = parameters . ToDictionary ( x => x . paramName , x => x . valueValue ) ;
69- var parameterView = ParameterView . FromDictionary ( paramDict ) ;
70- return AddComponent < TComponent > ( parameterView ) ;
71- }
72-
73- public RenderedComponent < TComponent > AddComponent < TComponent > ( ParameterView parameters ) where TComponent : class , IComponent
74- {
75- var result = new RenderedComponent < TComponent > ( Renderer , HtmlParser ) ;
76- result . SetParametersAndRender ( parameters ) ;
77- return result ;
78- }
79-
8022 public RenderedComponent < TComponent > GetComponentUnderTest < TComponent > ( ) where TComponent : class , IComponent
8123 {
8224 var fragmentKey = nameof ( GetComponentUnderTest ) ;
@@ -88,58 +30,47 @@ public RenderedComponent<TComponent> GetComponentUnderTest<TComponent>() where T
8830 else
8931 {
9032 var componentUnderTest = _testData . OfType < ComponentUnderTest > ( ) . Single ( ) ;
91- var result = new RenderedComponent < TComponent > ( Renderer , HtmlParser ) ;
92- result . Render ( componentUnderTest . ChildContent ) ;
33+ var result = new RenderedComponent < TComponent > ( this , componentUnderTest . ChildContent ) ;
9334 _renderedFragments . Add ( fragmentKey , result ) ;
9435
9536 return result ;
9637 }
9738 }
9839
99- public RenderedFragment GetFragment ( string id )
40+ public RenderedComponent < TComponent > GetFragment < TComponent > ( string id ) where TComponent : class , IComponent
10041 {
10142 var fragmentKey = nameof ( GetFragment ) + id ;
10243 if ( _renderedFragments . TryGetValue ( fragmentKey , out var renderedFragment ) )
10344 {
104- return ( RenderedFragment ) renderedFragment ;
45+ return ( RenderedComponent < TComponent > ) renderedFragment ;
10546 }
10647 else
10748 {
10849 var fragment = _testData . OfType < Fragment > ( ) . Single ( x => x . Id . Equals ( id , StringComparison . Ordinal ) ) ;
10950
110- var result = new RenderedFragment ( Renderer , HtmlParser ) ;
111- result . Render ( fragment . ChildContent ) ;
51+ var result = new RenderedComponent < TComponent > ( this , fragment . ChildContent ) ;
11252 _renderedFragments . Add ( fragmentKey , result ) ;
11353
11454 return result ;
11555 }
11656 }
11757
118- public RenderedComponent < TComponent > GetFragment < TComponent > ( string id ) where TComponent : class , IComponent
58+ public RenderedFragment GetFragment ( string id )
11959 {
12060 var fragmentKey = nameof ( GetFragment ) + id ;
12161 if ( _renderedFragments . TryGetValue ( fragmentKey , out var renderedFragment ) )
12262 {
123- return ( RenderedComponent < TComponent > ) renderedFragment ;
63+ return ( RenderedFragment ) renderedFragment ;
12464 }
12565 else
12666 {
12767 var fragment = _testData . OfType < Fragment > ( ) . Single ( x => x . Id . Equals ( id , StringComparison . Ordinal ) ) ;
12868
129- var result = new RenderedComponent < TComponent > ( Renderer , HtmlParser ) ;
130- result . Render ( fragment . ChildContent ) ;
69+ var result = new RenderedFragment ( this , fragment . ChildContent ) ;
13170 _renderedFragments . Add ( fragmentKey , result ) ;
13271
13372 return result ;
13473 }
13574 }
136-
137- public void Dispose ( )
138- {
139- if ( _renderer . IsValueCreated )
140- _renderer . Value . Dispose ( ) ;
141- if ( _htmlParser . IsValueCreated )
142- _htmlParser . Value . Dispose ( ) ;
143- }
14475 }
14576}
0 commit comments