@@ -110,17 +110,15 @@ void ITestExecutor.RunTests(IEnumerable<TestCase> tests, IRunContext runContext,
110110 RunTests (
111111 runContext , frameworkHandle , logger ,
112112 ( ) => tests . GroupBy ( testCase => testCase . Source )
113- . Select ( group => new AssemblyRunInfo { AssemblyFileName = group . Key , Configuration = ConfigReader . Load ( group . Key ) , TestCases = group . ToList ( ) } )
113+ . Select ( group => new AssemblyRunInfo { AssemblyFileName = group . Key , Configuration = LoadConfiguration ( group . Key ) , TestCases = group . ToList ( ) } )
114114 . ToList ( )
115115 ) ;
116116 }
117117
118118 // Helpers
119119
120120 static bool ContainsAppX ( IEnumerable < string > sources )
121- {
122- return sources . Any ( s => string . Compare ( Path . GetExtension ( s ) , ".appx" , StringComparison . OrdinalIgnoreCase ) == 0 ) ;
123- }
121+ => sources . Any ( s => string . Compare ( Path . GetExtension ( s ) , ".appx" , StringComparison . OrdinalIgnoreCase ) == 0 ) ;
124122
125123 static ITestCase Deserialize ( LoggerHelper logger , ITestFrameworkExecutor executor , TestCase testCase )
126124 {
@@ -152,7 +150,7 @@ void DiscoverTests<TVisitor>(IEnumerable<string> sources,
152150 foreach ( var assemblyFileName in sources )
153151 {
154152 var assembly = new XunitProjectAssembly { AssemblyFilename = assemblyFileName } ;
155- var configuration = ConfigReader . Load ( assemblyFileName ) ;
153+ var configuration = LoadConfiguration ( assemblyFileName ) ;
156154 var fileName = Path . GetFileNameWithoutExtension ( assemblyFileName ) ;
157155 var shadowCopy = configuration . ShadowCopyOrDefault ;
158156
@@ -227,11 +225,31 @@ void DiscoverTests<TVisitor>(IEnumerable<string> sources,
227225 }
228226 }
229227
230- static TestProperty GetTestProperty ( )
228+ static Stream GetConfigurationStreamForAssembly ( string assemblyName )
231229 {
232- return TestProperty . Register ( "XunitTestCase" , "xUnit.net Test Case" , typeof ( string ) , typeof ( VsTestRunner ) ) ;
230+ // See if there's a directory with the assm name. this might be the case for appx
231+ if ( Directory . Exists ( assemblyName ) )
232+ {
233+ if ( File . Exists ( Path . Combine ( assemblyName , $ "{ assemblyName } .xunit.runner.json") ) )
234+ return File . OpenRead ( Path . Combine ( assemblyName , $ "{ assemblyName } .xunit.runner.json") ) ;
235+
236+ if ( File . Exists ( Path . Combine ( assemblyName , "xunit.runner.json" ) ) )
237+ return File . OpenRead ( Path . Combine ( assemblyName , "xunit.runner.json" ) ) ;
238+ }
239+
240+ // Fallback to working dir
241+ if ( File . Exists ( $ "{ assemblyName } .xunit.runner.json") )
242+ return File . OpenRead ( $ "{ assemblyName } .xunit.runner.json") ;
243+
244+ if ( File . Exists ( "xunit.runner.json" ) )
245+ return File . OpenRead ( "xunit.runner.json" ) ;
246+
247+ return null ;
233248 }
234249
250+ static TestProperty GetTestProperty ( )
251+ => TestProperty . Register ( "XunitTestCase" , "xUnit.net Test Case" , typeof ( string ) , typeof ( VsTestRunner ) ) ;
252+
235253 List < AssemblyRunInfo > GetTests ( IEnumerable < string > sources , LoggerHelper logger , IRunContext runContext )
236254 {
237255 // For store apps, the files are copied to the AppX dir, we need to load it from there
@@ -264,7 +282,7 @@ List<AssemblyRunInfo> GetTests(IEnumerable<string> sources, LoggerHelper logger,
264282 var runInfo = new AssemblyRunInfo
265283 {
266284 AssemblyFileName = source ,
267- Configuration = ConfigReader . Load ( source ) ,
285+ Configuration = LoadConfiguration ( source ) ,
268286 TestCases = testCases
269287 } ;
270288 result . Add ( runInfo ) ;
@@ -285,6 +303,16 @@ static bool IsXunitTestAssembly(string assemblyFileName)
285303 || Directory . GetFiles ( assemblyFolder , "xunit.execution.*.dll" ) . Length > 0 ;
286304 }
287305
306+ static TestAssemblyConfiguration LoadConfiguration ( string assemblyName )
307+ {
308+ #if PLATFORM_DOTNET
309+ var stream = GetConfigurationStreamForAssembly ( assemblyName ) ;
310+ return stream == null ? new TestAssemblyConfiguration ( ) : ConfigReader . Load ( stream ) ;
311+ #else
312+ return ConfigReader . Load ( assemblyName ) ;
313+ #endif
314+ }
315+
288316 void RunTests ( IRunContext runContext , IFrameworkHandle frameworkHandle , LoggerHelper logger , Func < List < AssemblyRunInfo > > testCaseAccessor )
289317 {
290318 Guard . ArgumentNotNull ( "runContext" , runContext ) ;
0 commit comments