Browse Source

WixBinding - Unique file ids now generated when adding multiple files, added core logic to add a directory recursively to a setup package.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@1757 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Matt Ward 19 years ago
parent
commit
bdde4e7408
  1. 29
      src/AddIns/BackendBindings/WixBinding/Project/Src/IDirectoryReader.cs
  2. 13
      src/AddIns/BackendBindings/WixBinding/Project/Src/ShortFileName.cs
  3. 90
      src/AddIns/BackendBindings/WixBinding/Project/Src/WixComponentElement.cs
  4. 21
      src/AddIns/BackendBindings/WixBinding/Project/Src/WixDirectoryElement.cs
  5. 38
      src/AddIns/BackendBindings/WixBinding/Project/Src/WixDocument.cs
  6. 73
      src/AddIns/BackendBindings/WixBinding/Project/Src/WixFileElement.cs
  7. 119
      src/AddIns/BackendBindings/WixBinding/Project/Src/WixPackageFilesEditor.cs
  8. 1
      src/AddIns/BackendBindings/WixBinding/Project/WixBinding.csproj
  9. 187
      src/AddIns/BackendBindings/WixBinding/Test/DirectoryImport/AddDirectoryTestFixture.cs
  10. 103
      src/AddIns/BackendBindings/WixBinding/Test/DirectoryImport/AddSubDirectoryTestFixture.cs
  11. 119
      src/AddIns/BackendBindings/WixBinding/Test/DirectoryImport/DuplicateComponentIdTestFixture.cs
  12. 32
      src/AddIns/BackendBindings/WixBinding/Test/Document/AddRootDirectoryWithNoProductElementTestFixture.cs
  13. 109
      src/AddIns/BackendBindings/WixBinding/Test/Document/ExistingFileIdGenerationTests.cs
  14. 91
      src/AddIns/BackendBindings/WixBinding/Test/Document/ExistingShortFileNameTests.cs
  15. 8
      src/AddIns/BackendBindings/WixBinding/Test/PackageFiles/AddFilesTestFixture.cs
  16. 68
      src/AddIns/BackendBindings/WixBinding/Test/PackageFiles/ComponentDiskIdSetBeforeFilesAddedTestFixture.cs
  17. 19
      src/AddIns/BackendBindings/WixBinding/Test/PackageFiles/FileIdGenerationTests.cs
  18. 51
      src/AddIns/BackendBindings/WixBinding/Test/PackageFiles/GenerateComponentIdTests.cs
  19. 14
      src/AddIns/BackendBindings/WixBinding/Test/PackageFiles/PackageFilesTestFixtureBase.cs
  20. 9
      src/AddIns/BackendBindings/WixBinding/Test/PackageFiles/ShortFileNameGeneratorTests.cs
  21. 11
      src/AddIns/BackendBindings/WixBinding/Test/WixBinding.Tests.csproj

29
src/AddIns/BackendBindings/WixBinding/Project/Src/IDirectoryReader.cs

@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using System;
namespace ICSharpCode.WixBinding
{
/// <summary>
/// Gets the files and directories for a specified path. This is used
/// to hide the file system from the WixPackageFilesEditor class when
/// testing.
/// </summary>
public interface IDirectoryReader
{
/// <summary>
/// Gets the files in the specified path.
/// </summary>
string[] GetFiles(string path);
/// <summary>
/// Gets the directories in the specified path.
/// </summary>
string[] GetDirectories(string path);
}
}

13
src/AddIns/BackendBindings/WixBinding/Project/Src/ShortFileName.cs

@ -49,7 +49,7 @@ namespace ICSharpCode.WixBinding @@ -49,7 +49,7 @@ namespace ICSharpCode.WixBinding
/// <summary>
/// Converts a long filename to a short 8.3 filename.
/// </summary>
/// <param name="fileName">The long filename</param>
/// <param name="fileName">The long filename.</param>
/// <returns>The converted 8.3 filename. If the filename includes a
/// starting path then this is stripped from the returned value.</returns>
public static string Convert(string fileName, FileNameExists getFileNameExists)
@ -127,6 +127,16 @@ namespace ICSharpCode.WixBinding @@ -127,6 +127,16 @@ namespace ICSharpCode.WixBinding
return false;
}
/// <summary>
/// Returns whether the character is considered a valid character
/// for the starting part of the filename (i.e. not including the extension).
/// </summary>
/// <remarks>
/// We include the period character here to avoid ICE03 invalid filename
/// errors.
///
/// http://msdn.microsoft.com/library/en-us/msi/setup/ice03.asp
/// </remarks>
static bool IsValidShortFileNameChar(char ch)
{
switch (ch) {
@ -136,6 +146,7 @@ namespace ICSharpCode.WixBinding @@ -136,6 +146,7 @@ namespace ICSharpCode.WixBinding
case ';':
case '=':
case ',':
case '.':
return false;
}
return true;

90
src/AddIns/BackendBindings/WixBinding/Project/Src/WixComponentElement.cs

@ -6,6 +6,7 @@ @@ -6,6 +6,7 @@
// </file>
using System;
using System.IO;
using System.Xml;
namespace ICSharpCode.WixBinding
@ -37,6 +38,24 @@ namespace ICSharpCode.WixBinding @@ -37,6 +38,24 @@ namespace ICSharpCode.WixBinding
}
}
public string DiskId {
get {
return GetAttribute("DiskId");
}
set {
SetAttribute("DiskId", value);
}
}
/// <summary>
/// Checks whether the disk id has already been set for this component.
/// </summary>
public bool HasDiskId {
get {
return HasAttribute("DiskId");
}
}
/// <summary>
/// Generates a new guid for this component element.
/// </summary>
@ -50,8 +69,77 @@ namespace ICSharpCode.WixBinding @@ -50,8 +69,77 @@ namespace ICSharpCode.WixBinding
/// </summary>
public WixFileElement AddFile(string fileName)
{
WixFileElement fileElement = new WixFileElement((WixDocument)OwnerDocument, fileName);
WixFileElement fileElement = new WixFileElement(this, fileName);
return (WixFileElement)AppendChild(fileElement);
}
/// <summary>
/// Creates an id from the filename.
/// </summary>
/// <remarks>
/// Takes the filename, removes all periods, and
/// capitalises the first character and first extension character.
/// </remarks>
/// <param name="document">The Wix document is used to make sure the
/// id generated is unique for that document.</param>
/// <param name="fileName">The full filename including the directory to
/// use when generating the id.</param>
public static string GenerateIdFromFileName(WixDocument document, string fileName)
{
string id = GenerateIdFromFileName(fileName);
if (!document.ComponentIdExists(id)) {
return id;
}
// Add the parent folder to the id.
string parentDirectory = WixDirectoryElement.GetLastDirectoryName(Path.GetDirectoryName(fileName));
parentDirectory = FirstCharacterToUpperInvariant(parentDirectory);
id = String.Concat(parentDirectory, id);
if (!document.ComponentIdExists(id)) {
return id;
}
// Add a number to the end until we generate a unique id.
int count = 0;
string baseId = id;
do {
++count;
id = String.Concat(baseId, count);
} while (document.ComponentIdExists(id));
return id;
}
/// <summary>
/// Creates an id from the filename.
/// </summary>
/// <remarks>
/// Takes the filename, removes all periods, and
/// capitalises the first character and first extension character.
/// </remarks>
public static string GenerateIdFromFileName(string fileName)
{
string fileNameNoExtension = Path.GetFileNameWithoutExtension(fileName);
string idStart = String.Empty;
if (fileNameNoExtension.Length > 0) {
idStart = FirstCharacterToUpperInvariant(fileNameNoExtension);
}
// Remove period from extension and uppercase first extension char.
string extension = Path.GetExtension(fileName);
string idEnd = String.Empty;
if (extension.Length > 1) {
idEnd = FirstCharacterToUpperInvariant(extension.Substring(1));
}
return String.Concat(idStart, idEnd);
}
/// <summary>
/// Upper cases first character of string.
/// </summary>
static string FirstCharacterToUpperInvariant(string s)
{
return String.Concat(s.Substring(0, 1).ToUpperInvariant(), s.Substring(1));
}
}
}

21
src/AddIns/BackendBindings/WixBinding/Project/Src/WixDirectoryElement.cs

@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
namespace ICSharpCode.WixBinding
@ -29,6 +30,15 @@ namespace ICSharpCode.WixBinding @@ -29,6 +30,15 @@ namespace ICSharpCode.WixBinding
return name == DirectoryElementName;
}
/// <summary>
/// Returns the last directory specified in the path
/// </summary>
public static string GetLastDirectoryName(string path)
{
int index = path.LastIndexOf(Path.DirectorySeparatorChar);
return path.Substring(index + 1);
}
/// <summary>
/// Creates the directory element and sets its Id and SourceName.
/// </summary>
@ -108,6 +118,17 @@ namespace ICSharpCode.WixBinding @@ -108,6 +118,17 @@ namespace ICSharpCode.WixBinding
}
}
/// <summary>
/// Checks to see if a File element exists with the specified
/// short filename.
/// </summary>
public bool ShortFileNameExists(string fileName)
{
string xpath = String.Concat("w:Component/w:File[@Name='", fileName, "']");
XmlNodeList nodes = SelectNodes(xpath, new WixNamespaceManager(OwnerDocument.NameTable));
return nodes.Count > 0;
}
/// <summary>
/// Returns whether the specified name maps to a system directory.
/// </summary>

38
src/AddIns/BackendBindings/WixBinding/Project/Src/WixDocument.cs

@ -574,8 +574,16 @@ namespace ICSharpCode.WixBinding @@ -574,8 +574,16 @@ namespace ICSharpCode.WixBinding
/// </summary>
public WixDirectoryElement AddRootDirectory()
{
// Add product element if it does not exist.
XmlElement productElement = Product;
if (productElement == null) {
productElement = CreateWixElement("Product");
DocumentElement.AppendChild(productElement);
}
// Add root directory.
WixDirectoryElement rootDirectory = WixDirectoryElement.CreateRootDirectory(this);
return (WixDirectoryElement)Product.AppendChild(rootDirectory);
return (WixDirectoryElement)productElement.AppendChild(rootDirectory);
}
/// <summary>
@ -640,6 +648,24 @@ namespace ICSharpCode.WixBinding @@ -640,6 +648,24 @@ namespace ICSharpCode.WixBinding
return base.CreateElement(prefix, localName, namespaceURI);
}
/// <summary>
/// Checks to see if a File element exists with the specified id in this
/// document.
/// </summary>
public bool FileIdExists(string id)
{
return ElementIdExists(WixFileElement.FileElementName, id);
}
/// <summary>
/// Checks to see if a Component element exists with the specified id in this
/// document.
/// </summary>
public bool ComponentIdExists(string id)
{
return ElementIdExists(WixComponentElement.ComponentElementName, id);
}
/// <summary>
/// Reads the dialog id and adds it to the list of dialogs found so far.
/// </summary>
@ -761,5 +787,15 @@ namespace ICSharpCode.WixBinding @@ -761,5 +787,15 @@ namespace ICSharpCode.WixBinding
string xpath = String.Concat("//w:Dialog[@Id='", id, "']");
return (XmlElement)SelectSingleNode(xpath, namespaceManager);
}
/// <summary>
/// Checks to see if an element exists with the specified Id attribute.
/// </summary>
bool ElementIdExists(string elementName, string id)
{
string xpath = String.Concat("//w:", elementName, "[@Id='", id, "']");
XmlNodeList nodes = SelectNodes(xpath, new WixNamespaceManager(NameTable));
return nodes.Count > 0;
}
}
}

73
src/AddIns/BackendBindings/WixBinding/Project/Src/WixFileElement.cs

@ -19,6 +19,8 @@ namespace ICSharpCode.WixBinding @@ -19,6 +19,8 @@ namespace ICSharpCode.WixBinding
public class WixFileElement : XmlElement
{
public const string FileElementName = "File";
WixComponentElement parentComponent;
public WixFileElement(WixDocument document)
: base(document.WixNamespacePrefix, FileElementName, WixNamespaceManager.Namespace, document)
@ -30,6 +32,12 @@ namespace ICSharpCode.WixBinding @@ -30,6 +32,12 @@ namespace ICSharpCode.WixBinding
Init(fileName);
}
public WixFileElement(WixComponentElement component, string fileName) : this((WixDocument)component.OwnerDocument)
{
parentComponent = component;
Init(fileName);
}
/// <summary>
/// Generates an id from the filename.
/// </summary>
@ -50,6 +58,11 @@ namespace ICSharpCode.WixBinding @@ -50,6 +58,11 @@ namespace ICSharpCode.WixBinding
return id.ToString();
}
/// <summary>
/// Gets the filename where the resource being added to the setup
/// package can be found. Typically this isrelative to the Wix document the
/// File element is a part of.
/// </summary>
public string Source {
get {
return GetAttribute("Source");
@ -60,7 +73,7 @@ namespace ICSharpCode.WixBinding @@ -60,7 +73,7 @@ namespace ICSharpCode.WixBinding
}
/// <summary>
/// Gets the short name of the file.
/// Gets the short name (8.3) of the file.
/// </summary>
public string ShortName {
get {
@ -80,6 +93,9 @@ namespace ICSharpCode.WixBinding @@ -80,6 +93,9 @@ namespace ICSharpCode.WixBinding
}
}
/// <summary>
/// The is the filename that will be used when installing the file.
/// </summary>
public string LongName {
get {
return GetAttribute("LongName");
@ -154,17 +170,66 @@ namespace ICSharpCode.WixBinding @@ -154,17 +170,66 @@ namespace ICSharpCode.WixBinding
string idFileName = shortFileName;
if (shortFileName.Length > ShortFileName.MaximumFileNameLength) {
longFileName = shortFileName;
shortFileName = ShortFileName.Convert(shortFileName);
shortFileName = ShortFileName.Convert(shortFileName, ShortFileNameExists);
idFileName = longFileName;
}
ShortName = shortFileName;
Id = GenerateId(idFileName);
Id = GenerateUniqueId(Path.GetDirectoryName(fileName), idFileName);
if (longFileName != null) {
LongName = longFileName;
}
}
/// <summary>
/// Generates a unique id for the entire document that this file element
/// belongs to.
/// </summary>
/// <param name="parentDirectory">The full path of the parent directory
/// for the filename.</param>
/// <param name="fileName">The name of the file to generate a unique
/// id for. This does not include any path.</param>
string GenerateUniqueId(string parentDirectory, string fileName)
{
string id = GenerateId(fileName);
WixDocument document = (WixDocument)OwnerDocument;
if (!document.FileIdExists(id)) {
return id;
}
// Add the file's parent directory to the id.
string parentDirectoryName = WixDirectoryElement.GetLastDirectoryName(parentDirectory);
if (parentDirectoryName.Length > 0) {
id = String.Concat(parentDirectoryName, ".", id);
if (!document.FileIdExists(id)) {
return id;
}
fileName = id;
}
// Add a number to the file name until we get a unique id.
int count = 0;
string idStart = Path.GetFileNameWithoutExtension(fileName);
string extension = Path.GetExtension(fileName);
do {
++count;
id = String.Concat(idStart, count, extension);
} while (document.FileIdExists(id));
return id;
}
/// <summary>
/// Determines if the short filename already exists in the document.
/// </summary>
bool ShortFileNameExists(string fileName)
{
if (parentComponent == null) {
return false;
}
WixDirectoryElement directoryElement = parentComponent.ParentNode as WixDirectoryElement;
return directoryElement.ShortFileNameExists(fileName);
}
}
}

119
src/AddIns/BackendBindings/WixBinding/Project/Src/WixPackageFilesEditor.cs

@ -23,10 +23,27 @@ namespace ICSharpCode.WixBinding @@ -23,10 +23,27 @@ namespace ICSharpCode.WixBinding
IWixPackageFilesView view;
ITextFileReader fileReader;
IWixDocumentWriter documentWriter;
IDirectoryReader directoryReader;
WixDocument document;
WixSchemaCompletionData wixSchemaCompletionData;
bool usingRootDirectoryRef;
/// <summary>
/// Gets the files and directories in the specified path.
/// </summary>
class DefaultDirectoryReader : IDirectoryReader
{
public string[] GetFiles(string path)
{
return Directory.GetFiles(path);
}
public string[] GetDirectories(string path)
{
return Directory.GetDirectories(path);
}
}
/// <summary>
/// Creates a new instance of the WixPackageFilesEditor.
/// </summary>
@ -35,11 +52,23 @@ namespace ICSharpCode.WixBinding @@ -35,11 +52,23 @@ namespace ICSharpCode.WixBinding
/// workbench from the editor so the class can be easily tested.</param>
/// <param name="documentWriter">The file writer hides the file system and the
/// workbench from the editor.</param>
public WixPackageFilesEditor(IWixPackageFilesView view, ITextFileReader fileReader, IWixDocumentWriter documentWriter)
/// <param name="directoryReader">The directory reader hides the file system
/// from the editor.</param>
public WixPackageFilesEditor(IWixPackageFilesView view, ITextFileReader fileReader, IWixDocumentWriter documentWriter, IDirectoryReader directoryReader)
{
this.view = view;
this.fileReader = fileReader;
this.documentWriter = documentWriter;
this.directoryReader = directoryReader;
}
/// <summary>
/// Creates a new instance of the WixPackageFilesEditor which uses
/// the default directory reader which just uses the Directory class.
/// </summary>
public WixPackageFilesEditor(IWixPackageFilesView view, ITextFileReader fileReader, IWixDocumentWriter documentWriter)
: this(view, fileReader, documentWriter, new DefaultDirectoryReader())
{
}
/// <summary>
@ -130,10 +159,10 @@ namespace ICSharpCode.WixBinding @@ -130,10 +159,10 @@ namespace ICSharpCode.WixBinding
XmlElement element = null;
switch (name) {
case WixDirectoryElement.DirectoryElementName:
element = AddDirectory(parentElement as WixDirectoryElement);
element = AddDirectory(parentElement as WixDirectoryElement, "NewDirectory");
break;
case WixComponentElement.ComponentElementName:
element = AddComponent(parentElement as WixDirectoryElement);
element = AddComponent(parentElement as WixDirectoryElement, "NewComponent");
break;
default:
element = AddElement(parentElement, name);
@ -170,6 +199,26 @@ namespace ICSharpCode.WixBinding @@ -170,6 +199,26 @@ namespace ICSharpCode.WixBinding
}
}
/// <summary>
/// Adds the specified directory to the selected element. This
/// adds all the contained files and subdirectories recursively to the
/// setup package.
/// </summary>
public void AddDirectory(string directory)
{
WixDirectoryElement parentElement = (WixDirectoryElement)view.SelectedElement;
// Add directory.
string directoryName = WixDirectoryElement.GetLastDirectoryName(directory);
WixDirectoryElement directoryElement = AddDirectory(parentElement, directoryName);
AddFiles(directoryElement, directory);
// Adds directory contents recursively.
AddDirectoryContents(directoryElement, directory);
AddElementToView(directoryElement);
}
/// <summary>
/// Adds a single file to the selected component element.
/// </summary>
@ -177,12 +226,24 @@ namespace ICSharpCode.WixBinding @@ -177,12 +226,24 @@ namespace ICSharpCode.WixBinding
{
WixComponentElement componentElement = view.SelectedElement as WixComponentElement;
if (componentElement != null) {
WixFileElement fileElement = componentElement.AddFile(fileName);
WixFileElement fileElement = AddFile(componentElement, fileName);
view.AddElement(fileElement);
view.IsDirty = true;
}
}
/// <summary>
/// Adds a file to the specified component element.
/// </summary>
WixFileElement AddFile(WixComponentElement componentElement, string fileName)
{
WixFileElement fileElement = componentElement.AddFile(fileName);
if (!componentElement.HasDiskId) {
componentElement.DiskId = "1";
}
return fileElement;
}
/// <summary>
/// Updates the attribute values for the element.
/// </summary>
@ -210,7 +271,7 @@ namespace ICSharpCode.WixBinding @@ -210,7 +271,7 @@ namespace ICSharpCode.WixBinding
/// <summary>
/// Adds a new directory with a autogenerated id.
/// </summary>
WixDirectoryElement AddDirectory(WixDirectoryElementBase parentElement)
WixDirectoryElement AddDirectory(WixDirectoryElementBase parentElement, string name)
{
if (parentElement == null) {
if (usingRootDirectoryRef) {
@ -222,7 +283,9 @@ namespace ICSharpCode.WixBinding @@ -222,7 +283,9 @@ namespace ICSharpCode.WixBinding
}
}
}
return parentElement.AddDirectory("NewDirectory");
WixDirectoryElement directoryElement = parentElement.AddDirectory(name);
directoryElement.ShortName = name;
return directoryElement;
}
WixSchemaCompletionData WixSchemaCompletionData {
@ -257,11 +320,11 @@ namespace ICSharpCode.WixBinding @@ -257,11 +320,11 @@ namespace ICSharpCode.WixBinding
/// <summary>
/// Adds a new component element to the directory element.
/// </summary>
WixComponentElement AddComponent(WixDirectoryElement parentElement)
/// <param name="id">The id attribute the component element will have.</param>
WixComponentElement AddComponent(WixDirectoryElement parentElement, string id)
{
if (parentElement != null) {
WixComponentElement element = parentElement.AddComponent("NewComponent");
element.Id = "NewComponent";
WixComponentElement element = parentElement.AddComponent(id);
return element;
}
return null;
@ -298,5 +361,43 @@ namespace ICSharpCode.WixBinding @@ -298,5 +361,43 @@ namespace ICSharpCode.WixBinding
}
return FindRootDirectoryResult.NoMatch;
}
/// <summary>
/// Adds the set of files to the specified directory element. Each file
/// gets its own parent component element.
/// </summary>
void AddFiles(WixDirectoryElement directoryElement, string directory)
{
foreach (string fileName in DirectoryReader.GetFiles(directory)) {
string path = Path.Combine(directory, fileName);
string id = WixComponentElement.GenerateIdFromFileName(document, path);
WixComponentElement component = AddComponent(directoryElement, id);
AddFile(component, path);
}
}
IDirectoryReader DirectoryReader {
get {
return directoryReader;
}
}
/// <summary>
/// Adds any subdirectories and files to the directory element.
/// </summary>
/// <param name="directoryElement">The directory element to add
/// the components and subdirectories to.</param>
/// <param name="directory">The full path of the directory.</param>
void AddDirectoryContents(WixDirectoryElement directoryElement, string directory)
{
foreach (string subDirectoryName in DirectoryReader.GetDirectories(directory)) {
string subDirectory = Path.Combine(directory, subDirectoryName);
WixDirectoryElement subDirectoryElement = AddDirectory(directoryElement, subDirectoryName);
AddFiles(subDirectoryElement, subDirectory);
// Add the subdirectory contents.
AddDirectoryContents(subDirectoryElement, subDirectory);
}
}
}
}

1
src/AddIns/BackendBindings/WixBinding/Project/WixBinding.csproj

@ -137,6 +137,7 @@ @@ -137,6 +137,7 @@
<Compile Include="Src\Project\WixCompilerExtensionName.cs" />
<EmbeddedResource Include="Resources\LibraryParametersPanel.xfrm" />
<Compile Include="Src\Gui\LibraryParametersPanel.cs" />
<Compile Include="Src\IDirectoryReader.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="WixBinding.addin">

187
src/AddIns/BackendBindings/WixBinding/Test/DirectoryImport/AddDirectoryTestFixture.cs

@ -0,0 +1,187 @@ @@ -0,0 +1,187 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.WixBinding;
using NUnit.Framework;
using System;
using System.Collections;
using System.Collections.Specialized;
using System.IO;
using System.Xml;
using WixBinding.Tests.PackageFiles;
using WixBinding.Tests.Utils;
namespace WixBinding.Tests.DirectoryImport
{
/// <summary>
/// Adds several directories and its contained files to the setup package.
/// The original package has no directories, only the root directory is
/// defined.
/// </summary>
[TestFixture]
public class AddDirectoryTestFixture : PackageFilesTestFixtureBase
{
WixDirectoryElement appDirectoryElement;
WixComponentElement myAppExeFileComponentElement;
WixFileElement myAppExeFileElement;
WixDirectoryElement docsDirectoryElement;
WixDirectoryElement srcDirectoryElement;
WixDirectoryElement cssDirectoryElement;
WixFileElement readmeFileElement;
string docsDirectory = @"C:\Projects\Test\MyApp\docs";
string cssDirectory = @"C:\Projects\Test\MyApp\docs\css";
string srcDirectory = @"C:\Projects\Test\MyApp\src";
string directory = @"C:\Projects\Test\MyApp";
string myAppExeFile = "MyApp.exe";
string[] srcFiles = new string[] {"MyProj.sln", "MyProj.csproj", "Main.cs"};
string[] docFiles = new string[] {"readme.txt", "license.txt"};
[TestFixtureSetUp]
public void SetUpFixture()
{
base.InitFixture();
editor.AddDirectory(directory);
WixNamespaceManager nsManager = new WixNamespaceManager(editor.Document.NameTable);
appDirectoryElement = (WixDirectoryElement)editor.Document.RootDirectory.FirstChild;
myAppExeFileComponentElement = (WixComponentElement)appDirectoryElement.SelectSingleNode("w:Component", nsManager);
myAppExeFileElement = (WixFileElement)myAppExeFileComponentElement.LastChild;
docsDirectoryElement = (WixDirectoryElement)appDirectoryElement.SelectSingleNode("w:Directory[@Name='docs']", nsManager);
srcDirectoryElement = (WixDirectoryElement)appDirectoryElement.SelectSingleNode("w:Directory[@Name='src']", nsManager);
cssDirectoryElement = (docsDirectoryElement.GetDirectories())[0];
readmeFileElement = (WixFileElement)docsDirectoryElement.SelectSingleNode("w:Component/w:File[@Name='readme.txt']", nsManager);
}
[Test]
public void IsDirty()
{
Assert.IsTrue(view.IsDirty);
}
[Test]
public void DirectoryElementAddedToView()
{
Assert.IsInstanceOfType(typeof(WixDirectoryElement), view.ElementsAdded[0]);
}
[Test]
public void AppDirectoryName()
{
Assert.AreEqual("MyApp", appDirectoryElement.ShortName);
}
[Test]
public void AppDirectoryLongName()
{
Assert.AreEqual(String.Empty, appDirectoryElement.LongName);
}
[Test]
public void AppDirectoryId()
{
Assert.AreEqual("MyApp", appDirectoryElement.Id);
}
[Test]
public void AppDirectoryHasChildComponent()
{
Assert.IsNotNull(myAppExeFileComponentElement);
}
[Test]
public void AppExeComponentDiskId()
{
Assert.AreEqual("1", myAppExeFileComponentElement.DiskId);
}
[Test]
public void AppExeFileElementShortName()
{
Assert.AreEqual("MyApp.exe", myAppExeFileElement.ShortName);
}
[Test]
public void AppExeFileElementId()
{
Assert.AreEqual("MyApp.exe", myAppExeFileElement.Id);
}
[Test]
public void AddExeSourceFile()
{
Assert.AreEqual(@"MyApp\MyApp.exe", myAppExeFileElement.Source);
}
[Test]
public void DocDirectoryElementExists()
{
Assert.IsNotNull(docsDirectoryElement);
}
[Test]
public void SrcDirectoryElementExists()
{
Assert.IsNotNull(srcDirectoryElement);
}
[Test]
public void CssDirectoryElementExists()
{
Assert.IsNotNull(cssDirectoryElement);
}
[Test]
public void ReadmeFileElementExists()
{
Assert.IsNotNull(readmeFileElement);
}
[Test]
public void AppExeComponentId()
{
Assert.AreEqual("MyAppExe", myAppExeFileComponentElement.Id);
}
public override string[] GetFiles(string path)
{
if (path == docsDirectory) {
return docFiles;
} else if (path == srcDirectory) {
return srcFiles;
} else if (path == cssDirectory) {
return new string[0];
}
return new string[] {myAppExeFile};
}
public override string[] GetDirectories(string path)
{
if (path == directory) {
return new string[] {"docs", "src"};
} else if (path == docsDirectory) {
return new string[] {"css"};
}
return new string[0];
}
protected override string GetWixXml()
{
return "<Wix xmlns=\"http://schemas.microsoft.com/wix/2003/01/wi\">\r\n" +
"\t<Product Name=\"MySetup\" \r\n" +
"\t Manufacturer=\"\" \r\n" +
"\t Id=\"F4A71A3A-C271-4BE8-B72C-F47CC956B3AA\" \r\n" +
"\t Language=\"1033\" \r\n" +
"\t Version=\"1.0.0.0\">\r\n" +
"\t\t<Package Id=\"6B8BE64F-3768-49CA-8BC2-86A76424DFE9\"/>\r\n" +
"\t\t<Directory Id=\"TARGETDIR\" SourceName=\"SourceDir\">\r\n" +
"\t\t</Directory>\r\n" +
"\t</Product>\r\n" +
"</Wix>";
}
}
}

103
src/AddIns/BackendBindings/WixBinding/Test/DirectoryImport/AddSubDirectoryTestFixture.cs

@ -0,0 +1,103 @@ @@ -0,0 +1,103 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.WixBinding;
using NUnit.Framework;
using System;
using System.Collections;
using System.Collections.Specialized;
using System.IO;
using System.Xml;
using WixBinding.Tests.PackageFiles;
using WixBinding.Tests.Utils;
namespace WixBinding.Tests.DirectoryImport
{
/// <summary>
/// Adds a subdirectory to an existing directory in the package files editor.
/// </summary>
[TestFixture]
public class AddSubDirectoryTestFixture : PackageFilesTestFixtureBase
{
WixDirectoryElement appDirectoryElement;
WixFileElement exeFileElement;
WixFileElement readmeFileElement;
string directory = @"C:\Projects\Setup\MyApp";
string[] files = new string[] {"MyApp.exe", "readme.txt"};
[TestFixtureSetUp]
public void SetUpFixture()
{
base.InitFixture();
WixDirectoryElement programFilesFolderElement = (WixDirectoryElement)editor.Document.RootDirectory.FirstChild;
view.SelectedElement = programFilesFolderElement;
editor.AddDirectory(directory);
appDirectoryElement = (WixDirectoryElement)programFilesFolderElement.FirstChild;
exeFileElement = (WixFileElement)appDirectoryElement.SelectSingleNode("w:Component/w:File[@Name='MyApp.exe']", new WixNamespaceManager(editor.Document.NameTable));
readmeFileElement = (WixFileElement)appDirectoryElement.SelectSingleNode("w:Component/w:File[@Name='readme.txt']", new WixNamespaceManager(editor.Document.NameTable));
}
[Test]
public void IsDirty()
{
Assert.IsTrue(view.IsDirty);
}
[Test]
public void DirectoryElementAddedToView()
{
Assert.IsInstanceOfType(typeof(WixDirectoryElement), view.ElementsAdded[0]);
}
[Test]
public void AppDirectoryName()
{
Assert.AreEqual("MyApp", appDirectoryElement.ShortName);
}
[Test]
public void ExeFileElementAdded()
{
Assert.IsNotNull(exeFileElement);
}
[Test]
public void ReadmeFileElementAdded()
{
Assert.IsNotNull(readmeFileElement);
}
/// <summary>
/// Gets the MyApp directory files.
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public override string[] GetFiles(string path)
{
return files;
}
protected override string GetWixXml()
{
return "<Wix xmlns=\"http://schemas.microsoft.com/wix/2003/01/wi\">\r\n" +
"\t<Product Name=\"MySetup\" \r\n" +
"\t Manufacturer=\"\" \r\n" +
"\t Id=\"F4A71A3A-C271-4BE8-B72C-F47CC956B3AA\" \r\n" +
"\t Language=\"1033\" \r\n" +
"\t Version=\"1.0.0.0\">\r\n" +
"\t\t<Package Id=\"6B8BE64F-3768-49CA-8BC2-86A76424DFE9\"/>\r\n" +
"\t\t<Directory Id=\"TARGETDIR\" SourceName=\"SourceDir\">\r\n" +
"\t\t\t<Directory Id='ProgramFiles' SourceName='ProgramFiles'>\r\n" +
"\t\t\t</Directory>\r\n" +
"\t\t</Directory>\r\n" +
"\t</Product>\r\n" +
"</Wix>";
}
}
}

119
src/AddIns/BackendBindings/WixBinding/Test/DirectoryImport/DuplicateComponentIdTestFixture.cs

@ -0,0 +1,119 @@ @@ -0,0 +1,119 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.WixBinding;
using NUnit.Framework;
using System;
using System.Collections;
using System.Collections.Specialized;
using System.IO;
using System.Xml;
using WixBinding.Tests.PackageFiles;
using WixBinding.Tests.Utils;
namespace WixBinding.Tests.DirectoryImport
{
/// <summary>
/// Adds several directories and its contained files to the setup package.
/// The original package has several components already defined. This
/// test fixture checks that unique component ids are generated for the new
/// files.
/// </summary>
[TestFixture]
public class DuplicateComponentIdTestFixture : PackageFilesTestFixtureBase
{
WixDirectoryElement appDirectoryElement;
WixComponentElement readmeComponentElement;
WixComponentElement licenseComponentElement;
WixComponentElement exeComponentElement;
string directory = @"C:\Projects\Test\MyApp";
string[] files = new string[] {"MyApp.exe", "readme.txt", "license.txt"};
[TestFixtureSetUp]
public void SetUpFixture()
{
base.InitFixture();
editor.AddDirectory(directory);
WixNamespaceManager nsManager = new WixNamespaceManager(editor.Document.NameTable);
appDirectoryElement = (WixDirectoryElement)editor.Document.RootDirectory.SelectSingleNode("w:Directory[@Name='MyApp']", nsManager);;
XmlNode fileElement = appDirectoryElement.SelectSingleNode("w:Component/w:File[@Name='readme.txt']", nsManager);
readmeComponentElement = (WixComponentElement)fileElement.ParentNode;
fileElement = appDirectoryElement.SelectSingleNode("w:Component/w:File[@Name='license.txt']", nsManager);
licenseComponentElement = (WixComponentElement)fileElement.ParentNode;
exeComponentElement = (WixComponentElement)appDirectoryElement.SelectSingleNode("w:Component[w:File/@Name='MyApp.exe']", nsManager);
}
/// <summary>
/// Parent directory is added to component id.
/// </summary>
[Test]
public void ReadmeComponentId()
{
Assert.AreEqual("MyAppReadmeTxt", readmeComponentElement.Id);
}
[Test]
public void LicenseComponentId()
{
Assert.AreEqual("MyAppLicenseTxt1", licenseComponentElement.Id);
}
[Test]
public void AppExeComponentId()
{
Assert.AreEqual("MyAppMyAppExe2", exeComponentElement.Id);
}
public override string[] GetFiles(string path)
{
if (path == directory) {
return files;
}
return new string[0];
}
public override string[] GetDirectories(string path)
{
return new string[0];
}
protected override string GetWixXml()
{
return "<Wix xmlns=\"http://schemas.microsoft.com/wix/2003/01/wi\">\r\n" +
"\t<Product Name=\"MySetup\" \r\n" +
"\t Manufacturer=\"\" \r\n" +
"\t Id=\"F4A71A3A-C271-4BE8-B72C-F47CC956B3AA\" \r\n" +
"\t Language=\"1033\" \r\n" +
"\t Version=\"1.0.0.0\">\r\n" +
"\t\t<Package Id=\"6B8BE64F-3768-49CA-8BC2-86A76424DFE9\"/>\r\n" +
"\t\t<Directory Id=\"TARGETDIR\" SourceName=\"SourceDir\">\r\n" +
"\t\t\t<Directory Id=\"ProgramFilesFolder\" Name=\"PFiles\">\r\n" +
"\t\t\t\t<Directory Id=\"INSTALLDIR\" Name=\"OtherFolder\">\r\n" +
"\t\t\t\t\t<Component Id=\"MyAppExe\" Guid=\"999DE542-C4A9-48DA-ACF8-09949CDCD808\" DiskId=\"1\">\r\n" +
"\t\t\t\t\t</Component>\r\n" +
"\t\t\t\t\t<Component Id=\"MyAppMyAppExe\" Guid=\"111DE542-C4A9-48DA-ACF8-09949CDCD808\" DiskId=\"1\">\r\n" +
"\t\t\t\t\t</Component>\r\n" +
"\t\t\t\t\t<Component Id=\"MyAppMyAppExe1\" Guid=\"888DE542-C4A9-48DA-ACF8-09949CDCD808\" DiskId=\"1\">\r\n" +
"\t\t\t\t\t</Component>\r\n" +
"\t\t\t\t\t<Component Id=\"MyAppLicenseTxt\" Guid=\"777DE542-C4A9-48DA-ACF8-09949CDCD808\" DiskId=\"1\">\r\n" +
"\t\t\t\t\t</Component>\r\n" +
"\t\t\t\t\t<Component Id=\"LicenseTxt\" Guid=\"555DE542-C4A9-48DA-ACF8-09949CDCD808\" DiskId=\"1\">\r\n" +
"\t\t\t\t\t</Component>\r\n" +
"\t\t\t\t\t<Component Id=\"ReadmeTxt\" Guid=\"370DE542-C4A9-48DA-ACF8-09949CDCD808\" DiskId=\"1\">\r\n" +
"\t\t\t\t\t</Component>\r\n" +
"\t\t\t\t</Directory>\r\n" +
"\t\t\t</Directory>\r\n" +
"\t\t</Directory>\r\n" +
"\t</Product>\r\n" +
"</Wix>";
}
}
}

32
src/AddIns/BackendBindings/WixBinding/Test/Document/AddRootDirectoryWithNoProductElementTestFixture.cs

@ -0,0 +1,32 @@ @@ -0,0 +1,32 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using ICSharpCode.WixBinding;
using NUnit.Framework;
using System;
namespace WixBinding.Tests.Document
{
[TestFixture]
public class AddRootDirectoryWithNoProductElementTestFixture
{
[Test]
public void AddRootDirectory()
{
WixDocument doc = new WixDocument();
doc.LoadXml(GetWixXml());
WixDirectoryElement element = doc.AddRootDirectory();
Assert.IsNotNull(element);
}
string GetWixXml()
{
return "<Wix xmlns=\"http://schemas.microsoft.com/wix/2003/01/wi\">\r\n" +
"</Wix>";
}
}
}

109
src/AddIns/BackendBindings/WixBinding/Test/Document/ExistingFileIdGenerationTests.cs

@ -0,0 +1,109 @@ @@ -0,0 +1,109 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using ICSharpCode.WixBinding;
using NUnit.Framework;
using System;
using System.Xml;
namespace WixBinding.Tests.Document
{
[TestFixture]
public class ExistingFileIdGenerationTests
{
WixDocument doc;
WixComponentElement component;
[SetUp]
public void Init()
{
doc = new WixDocument();
doc.FileName = @"C:\Projects\Setup\Setup.wxs";
doc.LoadXml(GetWixXml());
component = (WixComponentElement)doc.SelectSingleNode("//w:Component", new WixNamespaceManager(doc.NameTable));
}
[Test]
public void FileIdAlreadyExists()
{
WixFileElement fileElement = new WixFileElement(doc, @"C:\Projects\Setup\doc\license.txt");
Assert.AreEqual("doc.license.txt", fileElement.Id);
}
[Test]
public void FileIdExists()
{
WixFileElement fileElement = new WixFileElement(doc, @"C:\Projects\Setup\doc\license.txt");
Assert.IsTrue(doc.FileIdExists("license.txt"));
}
[Test]
public void FileIdAlreadyExistsAndParentDirectoryUsingAltDirSeparator()
{
WixFileElement fileElement = new WixFileElement(doc, @"C:/Projects/Setup/doc/license.txt");
Assert.AreEqual("doc.license.txt", fileElement.Id);
}
[Test]
public void FileIdAlreadyExistsAndNoParentDirectory()
{
WixFileElement fileElement = new WixFileElement(doc, @"license.txt");
Assert.AreEqual("license1.txt", fileElement.Id);
}
[Test]
public void FileIdAlreadyExistsAndParentDirectoryIsRoot()
{
WixFileElement fileElement = new WixFileElement(doc, @"C:\license.txt");
Assert.AreEqual("license1.txt", fileElement.Id);
}
[Test]
public void FileIdWithNumberAlreadyExists()
{
component.AddFile(@"license.txt");
WixFileElement fileElement = new WixFileElement(doc, @"license.txt");
Assert.AreEqual("license2.txt", fileElement.Id);
}
[Test]
public void FileIdWithParentDirectoryAndNumberExists()
{
component.AddFile(@"C:/Projects/Setup/doc/license.txt");
WixFileElement fileElement = new WixFileElement(doc, @"C:/Projects/Setup/doc/license.txt");
Assert.AreEqual("doc.license1.txt", fileElement.Id);
}
string GetWixXml()
{
return "<Wix xmlns=\"http://schemas.microsoft.com/wix/2003/01/wi\">\r\n" +
"\t<Product Name=\"MySetup\" \r\n" +
"\t Manufacturer=\"\" \r\n" +
"\t Id=\"F4A71A3A-C271-4BE8-B72C-F47CC956B3AA\" \r\n" +
"\t Language=\"1033\" \r\n" +
"\t Version=\"1.0.0.0\">\r\n" +
"\t\t<Package Id=\"6B8BE64F-3768-49CA-8BC2-86A76424DFE9\"/>\r\n" +
"\t\t<Directory Id=\"TARGETDIR\" SourceName=\"SourceDir\">\r\n" +
"\t\t\t<Directory Id=\"ProgramFilesFolder\" Name=\"PFiles\">\r\n" +
"\t\t\t\t\t<Directory Id=\"INSTALLDIR\" Name=\"MyApp\">\r\n" +
"\t\t\t\t\t\t<Component Guid=\"370DE542-C4A9-48DA-ACF8-09949CDCD808\" Id=\"SharpDevelopDocFiles\" DiskId=\"1\">\r\n" +
"\t\t\t\t\t\t\t<File Source=\"doc\\AssemblyBaseAddresses.txt\" Name=\"baseaddr.txt\" Id=\"AssemblyBaseAddresses.txt\" LongName=\"AssemblyBaseAddresses.txt\" />\r\n" +
"\t\t\t\t\t\t\t<File Source=\"doc\\BuiltWithSharpDevelop.png\" Name=\"bw-sd.PNG\" Id=\"BuiltWithSharpDevelop.png\" LongName=\"BuiltWithSharpDevelop.png\" />\r\n" +
"\t\t\t\t\t\t\t<File Source=\"doc\\ChangeLog.xml\" Name=\"change.xml\" Id=\"ChangeLog.xml\" LongName=\"ChangeLog.xml\" />\r\n" +
"\t\t\t\t\t\t\t<File Source=\"doc\\copyright.txt\" Name=\"cpyright.txt\" Id=\"copyright.txt\" LongName=\"copyright.txt\" />\r\n" +
"\t\t\t\t\t\t\t<File Source=\"doc\\license.txt\" Name=\"license.txt\" Id=\"license.txt\" />\r\n" +
"\t\t\t\t\t\t\t<File Source=\"doc\\readme.rtf\" Name=\"readme.rtf\" Id=\"readme.rtf\" />\r\n" +
"\t\t\t\t\t\t\t<File Source=\"doc\\SharpDevelopInfoResources.txt\" Name=\"Resource.txt\" Id=\"SharpDevelopInfoResources.txt\" LongName=\"SharpDevelopInfoResources.txt\" />\r\n" +
"\t\t\t\t\t\t</Component>\r\n" +
"\t\t\t\t\t</Directory>\r\n" +
"\t\t\t</Directory>\r\n" +
"\t\t</Directory>\r\n" +
"\t</Product>\r\n" +
"</Wix>";
}
}
}

91
src/AddIns/BackendBindings/WixBinding/Test/Document/ExistingShortFileNameTests.cs

@ -0,0 +1,91 @@ @@ -0,0 +1,91 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using ICSharpCode.WixBinding;
using NUnit.Framework;
using System;
using System.Xml;
namespace WixBinding.Tests.Document
{
/// <summary>
/// Tests that the short filename generated takes into account existing
/// short filenames in the document. Note that only those files inside the
/// same directory are considered. It is perfectly valid to have the same
/// short filename installed to a different directory.
/// </summary>
[TestFixture]
public class ExistingShortNameTests
{
WixDocument doc;
WixComponentElement component;
WixComponentElement myAppComponent;
[SetUp]
public void Init()
{
doc = new WixDocument();
doc.FileName = @"C:\Projects\Setup\Setup.wxs";
doc.LoadXml(GetWixXml());
component = (WixComponentElement)doc.SelectSingleNode("//w:Component[@Id='SharpDevelopDocFiles']", new WixNamespaceManager(doc.NameTable));
myAppComponent = (WixComponentElement)doc.SelectSingleNode("//w:Component[@Id='SharpDevelopMyAppFiles']", new WixNamespaceManager(doc.NameTable));
}
[Test]
public void ShortNameAlreadyExists()
{
component.AddFile(@"C:\Projects\Setup\doc\changelog.xml");
WixFileElement fileElement = (WixFileElement)component.LastChild;
Assert.AreEqual("CHANGE_2.XML", fileElement.ShortName);
}
[Test]
public void ShortNameDoesNotExistInParentDirectory()
{
myAppComponent.AddFile(@"C:\Projects\Setup\doc\changelog.xml");
WixFileElement fileElement = (WixFileElement)myAppComponent.LastChild;
Assert.AreEqual("CHANGE_1.XML", fileElement.ShortName);
}
string GetWixXml()
{
return "<Wix xmlns=\"http://schemas.microsoft.com/wix/2003/01/wi\">\r\n" +
"\t<Product Name=\"MySetup\" \r\n" +
"\t Manufacturer=\"\" \r\n" +
"\t Id=\"F4A71A3A-C271-4BE8-B72C-F47CC956B3AA\" \r\n" +
"\t Language=\"1033\" \r\n" +
"\t Version=\"1.0.0.0\">\r\n" +
"\t\t<Package Id=\"6B8BE64F-3768-49CA-8BC2-86A76424DFE9\"/>\r\n" +
"\t\t<Directory Id=\"TARGETDIR\" SourceName=\"SourceDir\">\r\n" +
"\t\t\t<Directory Id=\"ProgramFilesFolder\" Name=\"PFiles\">\r\n" +
"\t\t\t\t\t\t<Component Guid=\"370DE542-C4A9-48DA-ACF8-09949CDCD808\" Id=\"SharpDevelopMyAppFiles\" DiskId=\"1\">\r\n" +
"\t\t\t\t\t\t\t<File Source=\"doc\\AssemblyBaseAddresses.txt\" Name=\"baseaddr.txt\" Id=\"AssemblyBaseAddresses.txt\" LongName=\"AssemblyBaseAddresses.txt\" />\r\n" +
"\t\t\t\t\t\t\t<File Source=\"doc\\BuiltWithSharpDevelop.png\" Name=\"bw-sd.PNG\" Id=\"BuiltWithSharpDevelop.png\" LongName=\"BuiltWithSharpDevelop.png\" />\r\n" +
"\t\t\t\t\t\t\t<File Source=\"doc\\ChangeLog.xml\" Name=\"CHANGE.XML\" Id=\"ChangeLog.xml\" LongName=\"ChangeLog.xml\" />\r\n" +
"\t\t\t\t\t\t\t<File Source=\"doc\\copyright.txt\" Name=\"cpyright.txt\" Id=\"copyright.txt\" LongName=\"copyright.txt\" />\r\n" +
"\t\t\t\t\t\t\t<File Source=\"doc\\license.txt\" Name=\"license.txt\" Id=\"license.txt\" />\r\n" +
"\t\t\t\t\t\t\t<File Source=\"doc\\readme.rtf\" Name=\"readme2.rtf\" Id=\"readme.rtf\" />\r\n" +
"\t\t\t\t\t\t\t<File Source=\"doc\\SharpDevelopInfoResources.txt\" Name=\"Resource.txt\" Id=\"SharpDevelopInfoResources.txt\" LongName=\"SharpDevelopInfoResources.txt\" />\r\n" +
"\t\t\t\t\t\t</Component>\r\n" +
"\t\t\t\t\t<Directory Id=\"INSTALLDIR\" Name=\"MyApp\">\r\n" +
"\t\t\t\t\t\t<Component Guid=\"77777777-C4A9-48DA-ACF8-09949CDCD808\" Id=\"SharpDevelopDocFiles\" DiskId=\"1\">\r\n" +
"\t\t\t\t\t\t\t<File Source=\"doc\\AssemblyBaseAddresses.txt\" Name=\"baseaddr.txt\" Id=\"AssemblyBaseAddresses2.txt\" LongName=\"AssemblyBaseAddresses.txt\" />\r\n" +
"\t\t\t\t\t\t\t<File Source=\"doc\\BuiltWithSharpDevelop.png\" Name=\"bw-sd.PNG\" Id=\"BuiltWithSharpDevelop2.png\" LongName=\"BuiltWithSharpDevelop.png\" />\r\n" +
"\t\t\t\t\t\t\t<File Source=\"doc\\ChangeLog.xml\" Name=\"CHANGE_1.XML\" Id=\"ChangeLog2.xml\" LongName=\"ChangeLog.xml\" />\r\n" +
"\t\t\t\t\t\t\t<File Source=\"doc\\copyright.txt\" Name=\"cpyright.txt\" Id=\"copyright2.txt\" LongName=\"copyright.txt\" />\r\n" +
"\t\t\t\t\t\t\t<File Source=\"doc\\license.txt\" Name=\"license.txt\" Id=\"license2.txt\" />\r\n" +
"\t\t\t\t\t\t\t<File Source=\"doc\\readme.rtf\" Name=\"readme.rtf\" Id=\"readme2.rtf\" />\r\n" +
"\t\t\t\t\t\t\t<File Source=\"doc\\SharpDevelopInfoResources.txt\" Name=\"Resource.txt\" Id=\"SharpDevelopInfoResources.txt\" LongName=\"SharpDevelopInfoResources.txt\" />\r\n" +
"\t\t\t\t\t\t</Component>\r\n" +
"\t\t\t\t\t</Directory>\r\n" +
"\t\t\t</Directory>\r\n" +
"\t\t</Directory>\r\n" +
"\t</Product>\r\n" +
"</Wix>";
}
}
}

8
src/AddIns/BackendBindings/WixBinding/Test/PackageFiles/AddFilesTestFixture.cs

@ -30,7 +30,7 @@ namespace WixBinding.Tests.PackageFiles @@ -30,7 +30,7 @@ namespace WixBinding.Tests.PackageFiles
string readmeFileName;
[SetUp]
public void SetUpFixture()
public void Init()
{
base.InitFixture();
componentElement = (XmlElement)editor.Document.RootDirectory.ChildNodes[0].ChildNodes[0].ChildNodes[0];
@ -120,6 +120,12 @@ namespace WixBinding.Tests.PackageFiles @@ -120,6 +120,12 @@ namespace WixBinding.Tests.PackageFiles
{
Assert.AreSame(view.ElementsAdded[1], readmeFileElement);
}
[Test]
public void ComponentElementDiskId()
{
Assert.AreEqual("1", componentElement.GetAttribute("DiskId"));
}
protected override string GetWixXml()
{

68
src/AddIns/BackendBindings/WixBinding/Test/PackageFiles/ComponentDiskIdSetBeforeFilesAddedTestFixture.cs

@ -0,0 +1,68 @@ @@ -0,0 +1,68 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.WixBinding;
using NUnit.Framework;
using System;
using System.Collections.Specialized;
using System.IO;
using System.Xml;
using WixBinding.Tests.Utils;
namespace WixBinding.Tests.PackageFiles
{
/// <summary>
/// Adds several files to the selected component node when the component's
/// disk id is already set. This makes sure we do not change the disk id.
/// </summary>
[TestFixture]
public class ComponentDiskIdSetBeforeFilesAddedTestFixture : PackageFilesTestFixtureBase
{
XmlElement componentElement;
[SetUp]
public void Init()
{
base.InitFixture();
componentElement = (XmlElement)editor.Document.RootDirectory.ChildNodes[0].ChildNodes[0].ChildNodes[0];
view.SelectedElement = componentElement;
editor.SelectedElementChanged();
string exeFileName = Path.Combine(project.Directory, @"bin\TestApplication.exe");
string readmeFileName = Path.Combine(project.Directory, @"docs\readme.rtf");
string[] fileNames = new string[] {exeFileName, readmeFileName};
editor.AddFiles(fileNames);
}
[Test]
public void ComponentElementDiskId()
{
Assert.AreEqual("2", componentElement.GetAttribute("DiskId"));
}
protected override string GetWixXml()
{
return "<Wix xmlns=\"http://schemas.microsoft.com/wix/2003/01/wi\">\r\n" +
"\t<Product Name=\"MySetup\" \r\n" +
"\t Manufacturer=\"\" \r\n" +
"\t Id=\"F4A71A3A-C271-4BE8-B72C-F47CC956B3AA\" \r\n" +
"\t Language=\"1033\" \r\n" +
"\t Version=\"1.0.0.0\">\r\n" +
"\t\t<Package Id=\"6B8BE64F-3768-49CA-8BC2-86A76424DFE9\"/>\r\n" +
"\t\t<Directory Id=\"TARGETDIR\" SourceName=\"SourceDir\">\r\n" +
"\t\t\t<Directory Id=\"ProgramFilesFolder\" Name=\"PFiles\">\r\n" +
"\t\t\t\t<Directory Id=\"INSTALLDIR\" Name=\"MyApp\">\r\n" +
"\t\t\t\t\t<Component Id=\"CoreComponents\" DiskId=\"2\">\r\n" +
"\t\t\t\t\t</Component>\r\n" +
"\t\t\t\t</Directory>\r\n" +
"\t\t\t</Directory>\r\n" +
"\t\t</Directory>\r\n" +
"\t</Product>\r\n" +
"</Wix>";
}
}
}

19
src/AddIns/BackendBindings/WixBinding/Test/PackageFiles/FileIdGenerationTests.cs

@ -8,12 +8,23 @@ @@ -8,12 +8,23 @@
using ICSharpCode.WixBinding;
using NUnit.Framework;
using System;
using System.Xml;
namespace WixBinding.Tests.PackageFiles
{
[TestFixture]
public class FileIdGenerationTests
{
WixDocument doc;
[TestFixtureSetUp]
public void SetupFixture()
{
doc = new WixDocument();
doc.FileName = @"C:\Projects\Setup\Setup.wxs";
doc.LoadXml("<Wix xmlns='http://schemas.microsoft.com/wix/2003/01/wi'/>");
}
[Test]
public void ShortFileName()
{
@ -27,7 +38,6 @@ namespace WixBinding.Tests.PackageFiles @@ -27,7 +38,6 @@ namespace WixBinding.Tests.PackageFiles
Assert.AreEqual(String.Empty, WixFileElement.GenerateId(null));
}
[Test]
public void TruncatedShortFileName()
{
@ -55,5 +65,12 @@ namespace WixBinding.Tests.PackageFiles @@ -55,5 +65,12 @@ namespace WixBinding.Tests.PackageFiles
string fileName = "AEèSTAP.TXT";
Assert.AreEqual("AE_STAP.TXT", WixFileElement.GenerateId(fileName));
}
[Test]
public void NewWixFileElement()
{
WixFileElement fileElement = new WixFileElement(doc, @"C:\Projects\Setup\Files\readme.txt");
Assert.AreEqual("readme.txt", fileElement.Id);
}
}
}

51
src/AddIns/BackendBindings/WixBinding/Test/PackageFiles/GenerateComponentIdTests.cs

@ -0,0 +1,51 @@ @@ -0,0 +1,51 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using ICSharpCode.WixBinding;
using NUnit.Framework;
using System;
namespace WixBinding.Tests.PackageFiles
{
[TestFixture]
public class GenerateComponentIdTests
{
[Test]
public void SimpleFileName()
{
string fileName = "myapp.exe";
Assert.AreEqual("MyappExe", WixComponentElement.GenerateIdFromFileName(fileName));
}
[Test]
public void NoExtension()
{
string fileName = "myapp";
Assert.AreEqual("Myapp", WixComponentElement.GenerateIdFromFileName(fileName));
}
[Test]
public void OnlyExtension()
{
string fileName = ".bat";
Assert.AreEqual("Bat", WixComponentElement.GenerateIdFromFileName(fileName));
}
[Test]
public void SingleCharacterFileName()
{
string fileName = "a.bat";
Assert.AreEqual("ABat", WixComponentElement.GenerateIdFromFileName(fileName));
}
[Test]
public void EmptyString()
{
Assert.AreEqual(String.Empty, WixComponentElement.GenerateIdFromFileName(String.Empty));
}
}
}

14
src/AddIns/BackendBindings/WixBinding/Test/PackageFiles/PackageFilesTestFixtureBase.cs

@ -21,7 +21,7 @@ namespace WixBinding.Tests.PackageFiles @@ -21,7 +21,7 @@ namespace WixBinding.Tests.PackageFiles
/// one setup.wxs file, creates the WixPackageEditor and calls its ShowPackageFiles
/// method.
/// </summary>
public class PackageFilesTestFixtureBase : ITextFileReader, IWixDocumentWriter
public class PackageFilesTestFixtureBase : ITextFileReader, IWixDocumentWriter, IDirectoryReader
{
protected WixPackageFilesEditor editor;
protected MockWixPackageFilesView view;
@ -35,7 +35,7 @@ namespace WixBinding.Tests.PackageFiles @@ -35,7 +35,7 @@ namespace WixBinding.Tests.PackageFiles
item.Include = "Setup.wxs";
project.Items.Add(item);
view = new MockWixPackageFilesView();
editor = new WixPackageFilesEditor(view, this, this);
editor = new WixPackageFilesEditor(view, this, this, this);
editor.ShowFiles(project);
}
@ -62,5 +62,15 @@ namespace WixBinding.Tests.PackageFiles @@ -62,5 +62,15 @@ namespace WixBinding.Tests.PackageFiles
}
return null;
}
public virtual string[] GetFiles(string path)
{
return new string[0];
}
public virtual string[] GetDirectories(string path)
{
return new string[0];
}
}
}

9
src/AddIns/BackendBindings/WixBinding/Test/PackageFiles/ShortFileNameGeneratorTests.cs

@ -90,8 +90,14 @@ namespace WixBinding.Tests.PackageFiles @@ -90,8 +90,14 @@ namespace WixBinding.Tests.PackageFiles
returnFileNameExistsCount = 99;
Assert.AreEqual("ABCD_100.TXT", ShortFileName.Convert(name, GetFileNameExists));
}
[Test]
public void PeriodsRemovedFromFileNameStart()
{
string name = "boo.exe.config";
Assert.AreEqual("BOOEXE.CON", ShortFileName.Convert(name));
}
bool GetFileNameExists(string fileName)
{
if (returnFileNameExistsCount == 0) {
@ -100,6 +106,5 @@ namespace WixBinding.Tests.PackageFiles @@ -100,6 +106,5 @@ namespace WixBinding.Tests.PackageFiles
--returnFileNameExistsCount;
return true;
}
}
}

11
src/AddIns/BackendBindings/WixBinding/Test/WixBinding.Tests.csproj

@ -19,7 +19,7 @@ @@ -19,7 +19,7 @@
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<OutputPath>..\..\..\..\..\bin\UnitTests\</OutputPath>
<Optimize>False</Optimize>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DefineConstants>DEBUG%3bTRACE</DefineConstants>
<DebugSymbols>true</DebugSymbols>
<DebugType>Full</DebugType>
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
@ -189,6 +189,14 @@ @@ -189,6 +189,14 @@
<Compile Include="Document\DirectoryNameTests.cs" />
<Compile Include="Project\GetWixCompilerExtensionsTestFixture.cs" />
<Compile Include="Project\WixCompilerExtensionNameTests.cs" />
<Compile Include="PackageFiles\ComponentDiskIdSetBeforeFilesAddedTestFixture.cs" />
<Compile Include="Document\ExistingFileIdGenerationTests.cs" />
<Compile Include="Document\ExistingShortFileNameTests.cs" />
<Compile Include="Document\AddRootDirectoryWithNoProductElementTestFixture.cs" />
<Compile Include="DirectoryImport\AddDirectoryTestFixture.cs" />
<Compile Include="DirectoryImport\AddSubDirectoryTestFixture.cs" />
<Compile Include="PackageFiles\GenerateComponentIdTests.cs" />
<Compile Include="DirectoryImport\DuplicateComponentIdTestFixture.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Project\WixBinding.csproj">
@ -246,6 +254,7 @@ @@ -246,6 +254,7 @@
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Folder Include="PropertyGrid" />
<Folder Include="DirectoryImport" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
</Project>
Loading…
Cancel
Save