-
Notifications
You must be signed in to change notification settings - Fork 30
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add RepositoryResolverFactory and revert behaviour change with no sea…
…rch path
- Loading branch information
Showing
4 changed files
with
99 additions
and
18 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
namespace GirLoader; | ||
|
||
public class NullRepositoryResolver : IRepositoryResolver | ||
{ | ||
public Input.Repository? ResolveRepository(string fileName) | ||
{ | ||
return null; | ||
} | ||
} |
39 changes: 39 additions & 0 deletions
39
src/Generation/GirLoader/Helper/RepositoryResolverFactory.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
using System.Reflection; | ||
|
||
namespace GirLoader; | ||
|
||
public class RepositoryResolverFactory | ||
{ | ||
private readonly string _platform; | ||
private readonly string? _platformSearchPath; | ||
private readonly Assembly _assembly; | ||
|
||
/// <summary> | ||
/// Construct a new RepositoryResolverFactory | ||
/// </summary> | ||
/// <param name="platform">The platform to resolve repositories for</param> | ||
/// <param name="platformSearchPath">Directory containing repository files for this platform. | ||
/// If null, no repositories will be resolved for this platform.</param> | ||
/// <param name="assembly">Assembly containing embedded repository files. | ||
/// These are used as a fallback if no repository file is found in the search path.</param> | ||
public RepositoryResolverFactory(string platform, string? platformSearchPath, Assembly assembly) | ||
{ | ||
_platform = platform; | ||
_platformSearchPath = platformSearchPath; | ||
_assembly = assembly; | ||
} | ||
|
||
public IRepositoryResolver Create() | ||
{ | ||
if (_platformSearchPath == null) | ||
{ | ||
return new NullRepositoryResolver(); | ||
} | ||
|
||
var directoryResolver = new DirectoryRepositoryResolver(_platformSearchPath); | ||
var embeddedResolver = new EmbeddedRepositoryResolver(_assembly, _platform); | ||
|
||
return new ChainedRepositoryResolver( | ||
new IRepositoryResolver[] { directoryResolver, embeddedResolver }); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
49 changes: 49 additions & 0 deletions
49
src/Tests/Generation/GirLoader.Tests/RepositoryResolverFactoryTests.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
using System.IO; | ||
using FluentAssertions; | ||
using Microsoft.VisualStudio.TestTools.UnitTesting; | ||
|
||
namespace GirLoader.Test; | ||
|
||
[TestClass, TestCategory("UnitTest")] | ||
public class RepositoryResolverFactoryTests | ||
{ | ||
[TestMethod] | ||
public void RepositoriesNotResolvedWithNullSearchPath() | ||
{ | ||
var assembly = typeof(RepositoryResolverFactoryTests).Assembly; | ||
var factory = new RepositoryResolverFactory("linux", null, assembly); | ||
|
||
var resolver = factory.Create(); | ||
var repository = resolver.ResolveRepository("GObject-2.0.gir"); | ||
|
||
repository.Should().BeNull(); | ||
} | ||
|
||
[TestMethod] | ||
public void RepositoriesResolvedFromSearchPath() | ||
{ | ||
using var directory = new DisposableTempDirectory(); | ||
var filePath = Path.Join(directory.Path, "NewLibrary-1.0.gir"); | ||
File.WriteAllText(filePath, InputRepositoryHelper.CreateXml("NewLibrary", "1.0")); | ||
var assembly = typeof(RepositoryResolverFactoryTests).Assembly; | ||
var factory = new RepositoryResolverFactory("linux", directory.Path, assembly); | ||
|
||
var resolver = factory.Create(); | ||
var repository = resolver.ResolveRepository("NewLibrary-1.0.gir"); | ||
|
||
repository!.Namespace!.Name.Should().Be("NewLibrary"); | ||
} | ||
|
||
[TestMethod] | ||
public void RepositoriesResolvedFromEmbeddedFilesWhenSearchPathSet() | ||
{ | ||
using var directory = new DisposableTempDirectory(); | ||
var assembly = typeof(RepositoryResolverFactoryTests).Assembly; | ||
var factory = new RepositoryResolverFactory("linux", directory.Path, assembly); | ||
|
||
var resolver = factory.Create(); | ||
var repository = resolver.ResolveRepository("GObject-2.0.gir"); | ||
|
||
repository!.Namespace!.Name.Should().Be("GObject"); | ||
} | ||
} |