Skip to content

Instantly share code, notes, and snippets.

@chrissie1
Last active December 13, 2015 18:58
Show Gist options
  • Save chrissie1/4959638 to your computer and use it in GitHub Desktop.
Save chrissie1/4959638 to your computer and use it in GitHub Desktop.
Sorting chcolatey Pacakges On version
using System;
using System.Collections.Generic;
namespace OrderPackages
{
public class PackagesSorter:IComparer<string>
{
private static readonly char LevelSeperator = ".".ToCharArray()[0];
private const string PreRelease = "-pre";
public int Compare(string x, string y)
{
var xsplits = x.Split(LevelSeperator).GetUpperBound(0);
var ysplits = y.Split(LevelSeperator).GetUpperBound(0);
if (x.Contains(PreRelease)) x = x.Substring(0, x.Length - PreRelease.Length);
if (y.Contains(PreRelease)) y = y.Substring(0, y.Length - PreRelease.Length);
var maxsplits = ysplits > xsplits? xsplits: ysplits;
if (! String.IsNullOrEmpty(x))
{
for (var i = 1; i <= maxsplits; i++)
{
if (Int32.Parse(x.Split(LevelSeperator)[i]) >
Int32.Parse(y.Split(LevelSeperator)[i])) return 1;
if (Int32.Parse(x.Split(LevelSeperator)[i]) <
Int32.Parse(y.Split(LevelSeperator)[i])) return -1;
}
if (ysplits > xsplits) return - 1;
return ysplits < xsplits ? 1 : 0;
}
else
{
if (!String.IsNullOrEmpty(y))
{
return - 1;
}
else
{
return 0;
}
}
}
}
}
using System;
using System.Collections.Generic;
using NUnit.Framework;
namespace OrderPackages
{
public class PackagesSorterTests
{
[Test]
public void ShouldOrderPackagesWithOnly1NumberCorrectly()
{
var packages = new List<String>() {"Choco.0.1.5", "Choco.0.1.4", "Choco.0.1.6", "Choco.0.1.1"};
packages.Sort(new PackagesSorter());
Assert.AreEqual("Choco.0.1.1", packages[0]);
Assert.AreEqual("Choco.0.1.4", packages[1]);
Assert.AreEqual("Choco.0.1.5", packages[2]);
Assert.AreEqual("Choco.0.1.6", packages[3]);
}
[Test]
public void ShouldOrderPackagesWithOnlyWhereTwoPackagesHaveTheSameNumber()
{
var packages = new List<String>() { "Choco.0.1.5", "Choco.0.1.5", "Choco.0.1.6", "Choco.0.1.1" };
packages.Sort(new PackagesSorter());
Assert.AreEqual("Choco.0.1.1", packages[0]);
Assert.AreEqual("Choco.0.1.5", packages[1]);
Assert.AreEqual("Choco.0.1.5", packages[2]);
Assert.AreEqual("Choco.0.1.6", packages[3]);
}
[Test]
public void ShouldOrderPackagesWithOnly1NumberCorrectlyWhereOneIsPre()
{
var packages = new List<String>() { "Choco.0.1.5", "Choco.0.1.4-pre", "Choco.0.1.6", "Choco.0.1.1" };
packages.Sort(new PackagesSorter());
Assert.AreEqual("Choco.0.1.1", packages[0]);
Assert.AreEqual("Choco.0.1.4-pre", packages[1]);
Assert.AreEqual("Choco.0.1.5", packages[2]);
Assert.AreEqual("Choco.0.1.6", packages[3]);
}
[Test]
public void ShouldOrderPackagesWhere1EndsInDoubleDigitsNumberCorrectly()
{
var packages = new List<String>() { "Choco.0.1.5", "Choco.0.1.14", "Choco.0.1.6", "Choco.0.1.1" };
packages.Sort(new PackagesSorter());
Assert.AreEqual("Choco.0.1.1", packages[0]);
Assert.AreEqual("Choco.0.1.5", packages[1]);
Assert.AreEqual("Choco.0.1.6", packages[2]);
Assert.AreEqual("Choco.0.1.14", packages[3]);
}
[Test]
public void ShouldOrderPackagesWhereAllEndInDoubleDigitsNumberCorrectly()
{
var packages = new List<String>() { "Choco.0.1.15", "Choco.0.1.14", "Choco.0.1.26", "Choco.0.1.31" };
packages.Sort(new PackagesSorter());
Assert.AreEqual("Choco.0.1.14", packages[0]);
Assert.AreEqual("Choco.0.1.15", packages[1]);
Assert.AreEqual("Choco.0.1.26", packages[2]);
Assert.AreEqual("Choco.0.1.31", packages[3]);
}
[Test]
public void ShouldOrderPackagesWhere1HasAMiddleNumberInDoubleDigitsNumberCorrectly()
{
var packages = new List<String>() { "Choco.0.1.5", "Choco.0.11.4", "Choco.0.1.6", "Choco.0.1.1" };
packages.Sort(new PackagesSorter());
Assert.AreEqual("Choco.0.1.1", packages[0]);
Assert.AreEqual("Choco.0.1.5", packages[1]);
Assert.AreEqual("Choco.0.1.6", packages[2]);
Assert.AreEqual("Choco.0.11.4", packages[3]);
}
[Test]
public void ShouldOrderPackagesWhere1HasAFirstNumberInDoubleDigitsNumberCorrectly()
{
var packages = new List<String>() { "Choco.0.1.5", "Choco.10.1.4", "Choco.0.1.6", "Choco.0.1.1" };
packages.Sort(new PackagesSorter());
Assert.AreEqual("Choco.0.1.1", packages[0]);
Assert.AreEqual("Choco.0.1.5", packages[1]);
Assert.AreEqual("Choco.0.1.6", packages[2]);
Assert.AreEqual("Choco.10.1.4", packages[3]);
}
[Test]
public void ShouldOrderPackagesWhere1HasAllNumbersInDoubleDigitsNumberCorrectly()
{
var packages = new List<String>() { "Choco.0.1.5", "Choco.10.11.14", "Choco.0.1.6", "Choco.0.1.1" };
packages.Sort(new PackagesSorter());
Assert.AreEqual("Choco.0.1.1", packages[0]);
Assert.AreEqual("Choco.0.1.5", packages[1]);
Assert.AreEqual("Choco.0.1.6", packages[2]);
Assert.AreEqual("Choco.10.11.14", packages[3]);
}
[Test]
public void ShouldOrderPackagesWhenOneIsEmpty()
{
var packages = new List<String>() { "Choco.0.1.5", "", "Choco.0.1.6", "Choco.0.1.1" };
packages.Sort(new PackagesSorter());
Assert.AreEqual("", packages[0]);
Assert.AreEqual("Choco.0.1.1", packages[1]);
Assert.AreEqual("Choco.0.1.5", packages[2]);
Assert.AreEqual("Choco.0.1.6", packages[3]);
}
[Test]
public void ShouldOrderPackagesWhenTwoAreEmpty()
{
var packages = new List<String>() { "Choco.0.1.5", "", "", "Choco.0.1.1" };
packages.Sort(new PackagesSorter());
Assert.AreEqual("", packages[0]);
Assert.AreEqual("", packages[1]);
Assert.AreEqual("Choco.0.1.1", packages[2]);
Assert.AreEqual("Choco.0.1.5", packages[3]);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment