191 lines
5.2 KiB
C#
Raw Normal View History

using System;
using System.IO;
using NUnit.Framework;
using System.Xml.Linq;
using ProjectConverter.Platforms;
// This file is part of the ANX.Framework created by the
// "ANX.Framework developer group" and released under the Ms-PL license.
// For details see: http://anxframework.codeplex.com/license
namespace ProjectConverter
{
public class ProjectPath
{
public string RelativeSourcePath
{
get;
private set;
}
public string FullSourcePath
{
get;
private set;
}
public string FullSourceDirectoryPath
{
get
{
return Path.GetDirectoryName(FullSourcePath);
}
}
public string RelativeDestinationPath
{
get;
private set;
}
public string FullDestinationPath
{
get;
private set;
}
public XDocument Document
{
get;
private set;
}
public XElement Root
{
get
{
return Document.Root;
}
}
public string ProjectName
{
get;
private set;
}
public ProjectPath(Converter converter, string relativeSourcePath, string basePath, string destinationPath, string targetExtension)
{
SetupPath(converter, relativeSourcePath, basePath, destinationPath, targetExtension);
LoadProjectFile();
}
public ProjectPath(Converter converter, string relativeSourcePath, string basePath, string destinationPath, string targetExtension, string documentText)
{
SetupPath(converter, relativeSourcePath, basePath, destinationPath, targetExtension);
ParseProjectFile(documentText);
}
private void SetupPath(Converter converter, string relativeSourcePath, string basePath, string destinationPath, string targetExtension)
{
RelativeSourcePath = relativeSourcePath;
FullSourcePath = Path.Combine(basePath, relativeSourcePath);
ProjectName = Path.GetFileNameWithoutExtension(FullSourcePath);
if (string.IsNullOrEmpty(destinationPath))
{
RelativeDestinationPath = BuildTargetFilepath(converter);
}
else
{
if (!Directory.Exists(destinationPath))
{
Directory.CreateDirectory(destinationPath);
}
RelativeDestinationPath = Path.Combine(destinationPath, Path.GetFileName(relativeSourcePath));
}
if (string.IsNullOrEmpty(targetExtension))
{
FullDestinationPath = Path.Combine(basePath, RelativeDestinationPath);
}
else
{
FullDestinationPath = Path.Combine(Path.GetDirectoryName(Path.Combine(basePath, RelativeDestinationPath)), Path.GetFileNameWithoutExtension(RelativeDestinationPath) + targetExtension);
}
}
#region Save
public void Save()
{
Document.Save(FullDestinationPath, SaveOptions.None);
}
#endregion
#region BuildTargetFilepath
private string BuildTargetFilepath(Converter converter)
{
string basePath = Path.GetDirectoryName(RelativeSourcePath);
string filename = Path.GetFileNameWithoutExtension(RelativeSourcePath);
if (filename.Contains("_"))
{
filename = filename.Substring(0, filename.IndexOf('_'));
}
if (!string.IsNullOrEmpty(converter.Postfix))
{
filename += "_" + converter.Postfix;
}
return Path.Combine(basePath, filename + ".csproj");
}
#endregion
#region LoadProjectFile
private void LoadProjectFile()
{
if (File.Exists(FullSourcePath))
{
string documentText = File.ReadAllText(FullSourcePath);
ParseProjectFile(documentText);
}
else
{
throw new FileNotFoundException("couldn't find project file", FullSourcePath);
}
}
#endregion
#region ParseProjectFile
private void ParseProjectFile(String documentText)
{
Document = XDocument.Parse(documentText);
}
#endregion
public override string ToString()
{
return "ProjectPath{" + RelativeSourcePath + "}";
}
private class ProjectPathTests
{
#region TestBuildTargetFilepath
[Test]
public static void TestBuildTargetFilepath()
{
string testBasePath = "C:\\code\\";
string testRelativeSourcePath = "ANX.Framework.csproj";
var projPath = new ProjectPath(new PsVitaConverter(),
testRelativeSourcePath, testBasePath, string.Empty, string.Empty);
Assert.AreEqual(projPath.RelativeDestinationPath,
"ANX.Framework_PSVita.csproj");
projPath = new ProjectPath(new LinuxConverter(),
"ANX.Framework_IOS.csproj", testBasePath, string.Empty, string.Empty);
Assert.AreEqual(projPath.RelativeDestinationPath,
"ANX.Framework_Linux.csproj");
projPath = new ProjectPath(new MetroConverter(),
"ANX.Framework_IOS_Android_WindowsXNA.csproj", testBasePath, string.Empty, string.Empty);
Assert.AreEqual(projPath.RelativeDestinationPath,
"ANX.Framework_WindowsMetro.csproj");
}
#endregion
}
}
}