Last active
December 13, 2015 18:58
-
-
Save chrissie1/4959638 to your computer and use it in GitHub Desktop.
Sorting chcolatey Pacakges On version
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
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; | |
} | |
} | |
} | |
} | |
} |
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
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