1+ using System . Reflection ;
2+
13using ColumnizerLib ;
24
35using LogExpert . Core . Classes . Columnizer ;
@@ -20,14 +22,36 @@ public class ColumnizerPickerTest
2022 [ SetUp ]
2123 public void Setup ( )
2224 {
23- // Ensure plugin registry is initialized with default plugins
24- var pluginRegistry = PluginRegistry . PluginRegistry . Instance ;
25+ // Reset singleton for testing (same pattern as PluginRegistryTests)
26+ ResetPluginRegistrySingleton ( ) ;
27+
28+ // Initialize plugin registry with proper test directory
29+ var testDataPath = Path . Join ( Path . GetTempPath ( ) , "LogExpertTests" , Guid . NewGuid ( ) . ToString ( ) ) ;
30+ _ = Directory . CreateDirectory ( testDataPath ) ;
31+
32+ var pluginRegistry = PluginRegistry . PluginRegistry . Create ( testDataPath , 250 ) ;
2533
2634 // Verify the local file system plugin is registered
2735 var localPlugin = pluginRegistry . FindFileSystemForUri ( @"C:\test.txt" ) ;
2836 Assert . That ( localPlugin , Is . Not . Null , "Local file system plugin not registered!" ) ;
2937 }
3038
39+ [ TearDown ]
40+ public void TearDown ( )
41+ {
42+ ResetPluginRegistrySingleton ( ) ;
43+ }
44+
45+ /// <summary>
46+ /// Uses reflection to reset the singleton instance for testing.
47+ /// This ensures each test starts with a fresh PluginRegistry state.
48+ /// </summary>
49+ private static void ResetPluginRegistrySingleton ( )
50+ {
51+ var instanceField = typeof ( PluginRegistry . PluginRegistry ) . GetField ( "_instance" , BindingFlags . Static | BindingFlags . NonPublic ) ;
52+ instanceField ? . SetValue ( null , null ) ;
53+ }
54+
3155 [ TestCase ( "Square Bracket Columnizer" , "30/08/2018 08:51:42.712 [TRACE] [a] hello" , "30/08/2018 08:51:42.712 [DATAIO] [b] world" , null , null , null ) ]
3256 [ TestCase ( "Square Bracket Columnizer" , "30/08/2018 08:51:42.712 [TRACE] hello" , "30/08/2018 08:51:42.712 [DATAIO][] world" , null , null , null ) ]
3357 [ TestCase ( "Square Bracket Columnizer" , "" , "30/08/2018 08:51:42.712 [TRACE] hello" , "30/08/2018 08:51:42.712 [TRACE] hello" , "[DATAIO][b][c] world" , null ) ]
@@ -38,42 +62,49 @@ public void FindColumnizer_ReturnCorrectColumnizer (string expectedColumnizerNam
3862
3963 Mock < IAutoLogLineMemoryColumnizerCallback > autoLogLineColumnizerCallbackMock = new ( ) ;
4064
41- _ = autoLogLineColumnizerCallbackMock . Setup ( a => a . GetLogLine ( 0 ) ) . Returns ( new TestLogLine ( )
65+ // Mock GetLogLineMemory() which returns ILogLineMemory
66+ _ = autoLogLineColumnizerCallbackMock . Setup ( a => a . GetLogLineMemory ( 0 ) ) . Returns ( new TestLogLineMemory ( )
4267 {
43- FullLine = line0 ,
68+ FullLine = line0 ? . AsMemory ( ) ?? ReadOnlyMemory < char > . Empty ,
4469 LineNumber = 0
4570 } ) ;
4671
47- _ = autoLogLineColumnizerCallbackMock . Setup ( a => a . GetLogLine ( 1 ) ) . Returns ( new TestLogLine ( )
72+ _ = autoLogLineColumnizerCallbackMock . Setup ( a => a . GetLogLineMemory ( 1 ) ) . Returns ( new TestLogLineMemory ( )
4873 {
49- FullLine = line1 ,
74+ FullLine = line1 ? . AsMemory ( ) ?? ReadOnlyMemory < char > . Empty ,
5075 LineNumber = 1
5176 } ) ;
5277
53- _ = autoLogLineColumnizerCallbackMock . Setup ( a => a . GetLogLine ( 2 ) ) . Returns ( new TestLogLine ( )
78+ _ = autoLogLineColumnizerCallbackMock . Setup ( a => a . GetLogLineMemory ( 2 ) ) . Returns ( new TestLogLineMemory ( )
5479 {
55- FullLine = line2 ,
80+ FullLine = line2 ? . AsMemory ( ) ?? ReadOnlyMemory < char > . Empty ,
5681 LineNumber = 2
5782 } ) ;
5883
59- _ = autoLogLineColumnizerCallbackMock . Setup ( a => a . GetLogLine ( 3 ) ) . Returns ( new TestLogLine ( )
84+ _ = autoLogLineColumnizerCallbackMock . Setup ( a => a . GetLogLineMemory ( 3 ) ) . Returns ( new TestLogLineMemory ( )
6085 {
61- FullLine = line3 ,
86+ FullLine = line3 ? . AsMemory ( ) ?? ReadOnlyMemory < char > . Empty ,
6287 LineNumber = 3
6388 } ) ;
64- _ = autoLogLineColumnizerCallbackMock . Setup ( a => a . GetLogLine ( 4 ) ) . Returns ( new TestLogLine ( )
89+
90+ _ = autoLogLineColumnizerCallbackMock . Setup ( a => a . GetLogLineMemory ( 4 ) ) . Returns ( new TestLogLineMemory ( )
6591 {
66- FullLine = line4 ,
92+ FullLine = line4 ? . AsMemory ( ) ?? ReadOnlyMemory < char > . Empty ,
6793 LineNumber = 4
6894 } ) ;
6995
96+ // Mock for additional sampled lines that ColumnizerPicker checks
97+ _ = autoLogLineColumnizerCallbackMock . Setup ( a => a . GetLogLineMemory ( 5 ) ) . Returns ( ( ILogLineMemory ) null ) ;
98+ _ = autoLogLineColumnizerCallbackMock . Setup ( a => a . GetLogLineMemory ( 25 ) ) . Returns ( ( ILogLineMemory ) null ) ;
99+ _ = autoLogLineColumnizerCallbackMock . Setup ( a => a . GetLogLineMemory ( 100 ) ) . Returns ( ( ILogLineMemory ) null ) ;
100+ _ = autoLogLineColumnizerCallbackMock . Setup ( a => a . GetLogLineMemory ( 200 ) ) . Returns ( ( ILogLineMemory ) null ) ;
101+ _ = autoLogLineColumnizerCallbackMock . Setup ( a => a . GetLogLineMemory ( 400 ) ) . Returns ( ( ILogLineMemory ) null ) ;
102+
70103 var result = ColumnizerPicker . FindMemoryColumnizer ( path , autoLogLineColumnizerCallbackMock . Object , PluginRegistry . PluginRegistry . Instance . RegisteredColumnizers ) ;
71104
72105 Assert . That ( result . GetName ( ) , Is . EqualTo ( expectedColumnizerName ) ) ;
73106 }
74107
75- [ TestCase ( @".\TestData\JsonColumnizerTest_01.txt" , typeof ( JsonCompactColumnizer . JsonCompactColumnizer ) , ReaderType . Pipeline ) ]
76- [ TestCase ( @".\TestData\SquareBracketColumnizerTest_02.txt" , typeof ( SquareBracketColumnizer ) , ReaderType . Pipeline ) ]
77108 [ TestCase ( @".\TestData\JsonColumnizerTest_01.txt" , typeof ( JsonCompactColumnizer . JsonCompactColumnizer ) , ReaderType . System ) ]
78109 [ TestCase ( @".\TestData\SquareBracketColumnizerTest_02.txt" , typeof ( SquareBracketColumnizer ) , ReaderType . System ) ]
79110 public void FindReplacementForAutoColumnizer_ValidTextFile_ReturnCorrectColumnizer ( string fileName , Type columnizerType , ReaderType readerType )
@@ -88,7 +119,7 @@ public void FindReplacementForAutoColumnizer_ValidTextFile_ReturnCorrectColumniz
88119 _ = autoColumnizer . Setup ( a => a . GetName ( ) ) . Returns ( "Auto Columnizer" ) ;
89120
90121 // TODO: When DI container is ready, we can mock this set up.
91- PluginRegistry . PluginRegistry . Instance . RegisteredColumnizers . Add ( new JsonCompactColumnizer . JsonCompactColumnizer ( ) as ILogLineMemoryColumnizer ) ;
122+ PluginRegistry . PluginRegistry . Instance . RegisteredColumnizers . Add ( new JsonCompactColumnizer . JsonCompactColumnizer ( ) ) ;
92123 var result = ColumnizerPicker . FindReplacementForAutoMemoryColumnizer ( fileName , reader , autoColumnizer . Object , PluginRegistry . PluginRegistry . Instance . RegisteredColumnizers ) ;
93124
94125 Assert . That ( columnizerType , Is . EqualTo ( result . GetType ( ) ) ) ;
@@ -98,7 +129,7 @@ public void FindReplacementForAutoColumnizer_ValidTextFile_ReturnCorrectColumniz
98129 public void DecideColumnizerByName_WhenReaderIsNotReady_ReturnCorrectColumnizer ( string fileName , Type columnizerType )
99130 {
100131 // TODO: When DI container is ready, we can mock this set up.
101- PluginRegistry . PluginRegistry . Instance . RegisteredColumnizers . Add ( new JsonCompactColumnizer . JsonCompactColumnizer ( ) as ILogLineMemoryColumnizer ) ;
132+ PluginRegistry . PluginRegistry . Instance . RegisteredColumnizers . Add ( new JsonCompactColumnizer . JsonCompactColumnizer ( ) ) ;
102133 var result = ColumnizerPicker . DecideMemoryColumnizerByName ( fileName , PluginRegistry . PluginRegistry . Instance . RegisteredColumnizers ) ;
103134
104135 Assert . That ( columnizerType , Is . EqualTo ( result . GetType ( ) ) ) ;
@@ -109,19 +140,29 @@ public void DecideColumnizerByName_WhenReaderIsNotReady_ReturnCorrectColumnizer
109140 public void DecideColumnizerByName_ValidTextFile_ReturnCorrectColumnizer ( string columnizerName , Type columnizerType )
110141 {
111142 // TODO: When DI container is ready, we can mock this set up.
112- PluginRegistry . PluginRegistry . Instance . RegisteredColumnizers . Add ( new JsonColumnizer . JsonColumnizer ( ) as ILogLineMemoryColumnizer ) ;
143+ PluginRegistry . PluginRegistry . Instance . RegisteredColumnizers . Add ( new JsonColumnizer . JsonColumnizer ( ) ) ;
113144
114145 var result = ColumnizerPicker . DecideMemoryColumnizerByName ( columnizerName , PluginRegistry . PluginRegistry . Instance . RegisteredColumnizers ) ;
115146
116147 Assert . That ( columnizerType , Is . EqualTo ( result . GetType ( ) ) ) ;
117148 }
118149
119- private class TestLogLine : ILogLine
150+ /// <summary>
151+ /// Test helper class that implements ILogLineMemory for mocking log lines.
152+ /// </summary>
153+ private class TestLogLineMemory : ILogLineMemory
120154 {
121- public string Text => FullLine ;
122-
123- public string FullLine { get ; set ; }
155+ public ReadOnlyMemory < char > FullLine { get ; set ; }
124156
125157 public int LineNumber { get ; set ; }
158+
159+ // Explicit implementation for ILogLine.FullLine (string version)
160+ string ILogLine . FullLine => FullLine . ToString ( ) ;
161+
162+ // Explicit implementation for ITextValue.Text
163+ string ITextValue . Text => FullLine . ToString ( ) ;
164+
165+ // Explicit implementation for ITextValueMemory.Text (ReadOnlyMemory<char> version)
166+ ReadOnlyMemory < char > ITextValueMemory . Text => FullLine ;
126167 }
127168}
0 commit comments