Сортируем?
вы что - действительно не видите, что ваш compare() - полная чушь?
-----
Чушь - не компаре - оно нормальное.
А вот - данные - это реальная "чушь" - они не полные.
А при неполных данных нет возможности однозначно определить -1, 0, +1.
Для полноты данных надо добавлять в ProjectReferences ссылки на ВСЕ (включая косвенно затрагиваемые) проекты от которых зависит данный. Мне это делать не хочется и потому Я сортирую то что есть и так как могу. Двойной прогон "стандартной" сортировки дает желаемый результат... хотя пузырьком прошло бы и за раз...
Вот тесты - погоняй:
using System;
using System.IO;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Data.CCScript.Comparer;
namespace Data.CCScript.Comparer.Tests
{
[TestClass]
public class Comparer_tests
{
[TestMethod]
public void Comparer_ProjectList()
{
ProjectList = new Dictionary<string, TProject>();
Assert.IsNotNull(ProjectList);
Assert.IsTrue(ProjectList.Count == 0);
FillProjectList();
Assert.IsTrue(ProjectList.Count > 0);
int dependant = 0;
foreach (var kvp in ProjectList)
{
dependant += kvp.Value.ProjectReferences.Count;
}
Assert.IsTrue(dependant == 0);
SetDependentProject();
dependant = 0;
foreach (var kvp in ProjectList)
{
dependant += kvp.Value.ProjectReferences.Count;
}
Assert.IsTrue(dependant != 0);
}
[TestMethod]
public void Comparer_ValidateComparisson()
{
ProjectList = new Dictionary<string, TProject>();
FillProjectList();
SetDependentProject();
IComparer<TProject> comparer = new TProjectOrderComparer();
TProject p1;
TProject p2;
p1 = ProjectList["GPS.Order.ColumnsDefs"];
p2 = ProjectList["GPS.Order.ColumnsDefs"];
Assert.AreEqual(0, comparer.Compare(p1, p2));
p1 = ProjectList["CareyGlass.Interfaces"];
p2 = ProjectList["GPS.Order.ColumnsDefs"];
Assert.AreEqual(1, comparer.Compare(p1, p2));
p1 = ProjectList["CareyGlass.Interfaces"];
p2 = ProjectList["GPS.Order.ColumnsDefs.Tests"];
Assert.AreEqual(1, comparer.Compare(p1, p2));
p1 = ProjectList["CareyGlass.Interfaces"];
p2 = ProjectList["GPS.Order.Factory"];
Assert.AreEqual(-1, comparer.Compare(p1, p2));
}
[TestMethod]
public void Comparer_TStore()
{
TStore store = new TStore();
ProjectList = new Dictionary<string, TProject>();
FillProjectList();
SetDependentProject();
foreach (var kvp in ProjectList)
{
store.Add(kvp.Value);
}
int n = 1;
foreach(TProject p in store)
{
p.Priority = n++;
}
if (File.Exists("Data.txt"))
File.Delete("Data.txt");
using (StreamWriter sw = new StreamWriter("Data.txt"))
{
foreach (TProject p in store)
{
sw.WriteLine("Project {0} {1} {2}", p.Priority, p.Guid, p.Name);
}
sw.Flush();
}
}
#region Support
static Dictionary<String, TProject> ProjectList = new Dictionary<string, TProject>();
static TProject GetProject(string pProjectName)
{
TProject project = ProjectList[pProjectName];
return project;
}
void SetDependentProject()
{
foreach (var kvp in ProjectList)
{
TProject project = kvp.Value;
switch (project.Name)
{
case "GPS.Order.ColumnsDefs":
break;
case "CareyGlass.Interfaces":
break;
case "GPS.Order.Factory":
project.ProjectReferences.Add(GetProject("CareyGlass.Interfaces"));
break;
case "GPS.Order.Invariant":
project.ProjectReferences.Add(GetProject("CareyGlass.Interfaces"));
project.ProjectReferences.Add(GetProject("GPS.Order.ColumnsDefs"));
project.ProjectReferences.Add(GetProject("GPS.Order.Factory"));
break;
case "GPS.Order.v06":
project.ProjectReferences.Add(GetProject("CareyGlass.Interfaces"));
project.ProjectReferences.Add(GetProject("GPS.Order.ColumnsDefs"));
project.ProjectReferences.Add(GetProject("GPS.Order.Factory"));
project.ProjectReferences.Add(GetProject("GPS.Order.Invariant"));
break;
case "CareyGlass.DefaultsStorage":
project.ProjectReferences.Add(GetProject("CareyGlass.Interfaces"));
project.ProjectReferences.Add(GetProject("GPS.Order.Factory"));
project.ProjectReferences.Add(GetProject("GPS.Order.Invariant"));
project.ProjectReferences.Add(GetProject("GPS.Order.Serializer"));
project.ProjectReferences.Add(GetProject("GPS.Order.v06"));
project.ProjectReferences.Add(GetProject("GPS.Order.v07"));
project.ProjectReferences.Add(GetProject("GPS.Order.v11"));
project.ProjectReferences.Add(GetProject("GPS.Order.ColumnsDefs"));
break;
case "GPS.Order.v06.Tests":
project.ProjectReferences.Add(GetProject("CareyGlass.Interfaces"));
project.ProjectReferences.Add(GetProject("CareyGlass.DefaultsStorage"));
project.ProjectReferences.Add(GetProject("GPS.Order.ColumnsDefs"));
project.ProjectReferences.Add(GetProject("GPS.Order.Invariant"));
project.ProjectReferences.Add(GetProject("GPS.Order.v06"));
break;
case "GPS.Order.v11.Tests":
project.ProjectReferences.Add(GetProject("CareyGlass.Interfaces"));
project.ProjectReferences.Add(GetProject("CareyGlass.DefaultsStorage"));
project.ProjectReferences.Add(GetProject("GPS.Order.ColumnsDefs"));
project.ProjectReferences.Add(GetProject("GPS.Order.Invariant"));
project.ProjectReferences.Add(GetProject("GPS.Order.v11"));
break;
case "Gps.Order.SW":
project.ProjectReferences.Add(GetProject("CareyGlass.Interfaces"));
project.ProjectReferences.Add(GetProject("GPS.Order.ColumnsDefs"));
project.ProjectReferences.Add(GetProject("GPS.Order.Factory"));
project.ProjectReferences.Add(GetProject("GPS.Order.Invariant"));
break;
case "Gps.Order.SW.Tests":
project.ProjectReferences.Add(GetProject("CareyGlass.Interfaces"));
project.ProjectReferences.Add(GetProject("CareyGlass.DefaultsStorage"));
project.ProjectReferences.Add(GetProject("GPS.Order.ColumnsDefs"));
project.ProjectReferences.Add(GetProject("GPS.Order.Invariant"));
project.ProjectReferences.Add(GetProject("Gps.Order.SW"));
break;
case "GPS.Order.v07":
project.ProjectReferences.Add(GetProject("CareyGlass.Interfaces"));
project.ProjectReferences.Add(GetProject("GPS.Order.ColumnsDefs"));
project.ProjectReferences.Add(GetProject("GPS.Order.Factory"));
project.ProjectReferences.Add(GetProject("GPS.Order.Invariant"));
break;
case "GPS.Order.Serializer":
project.ProjectReferences.Add(GetProject("CareyGlass.Interfaces"));
project.ProjectReferences.Add(GetProject("GPS.Order.ColumnsDefs"));
project.ProjectReferences.Add(GetProject("GPS.Order.Factory"));
project.ProjectReferences.Add(GetProject("GPS.Order.Invariant"));
break;
case "GPS.Order.v11":
project.ProjectReferences.Add(GetProject("CareyGlass.Interfaces"));
project.ProjectReferences.Add(GetProject("GPS.Order.ColumnsDefs"));
project.ProjectReferences.Add(GetProject("GPS.Order.Factory"));
project.ProjectReferences.Add(GetProject("GPS.Order.Invariant"));
break;
case "GPS.Order.Serializer.Tests":
project.ProjectReferences.Add(GetProject("CareyGlass.Interfaces"));
project.ProjectReferences.Add(GetProject("GPS.Order.Factory"));
project.ProjectReferences.Add(GetProject("GPS.Order.Serializer"));
project.ProjectReferences.Add(GetProject("GPS.Order.Invariant"));
project.ProjectReferences.Add(GetProject("Gps.Order.SW"));
project.ProjectReferences.Add(GetProject("GPS.Order.v06"));
project.ProjectReferences.Add(GetProject("GPS.Order.v07"));
project.ProjectReferences.Add(GetProject("GPS.Order.v11"));
break;
case "GPS.Order.ColumnsDefs.Tests":
project.ProjectReferences.Add(GetProject("GPS.Order.ColumnsDefs"));
project.ProjectReferences.Add(GetProject("GPS.Order.Invariant"));
break;
case "GPS.Order.Invariant.Tests":
project.ProjectReferences.Add(GetProject("CareyGlass.Interfaces"));
project.ProjectReferences.Add(GetProject("GPS.Order.Invariant"));
project.ProjectReferences.Add(GetProject("GPS.Order.v07"));
break;
case "GPS.Order.v07.Tests":
project.ProjectReferences.Add(GetProject("CareyGlass.Interfaces"));
project.ProjectReferences.Add(GetProject("CareyGlass.DefaultsStorage"));
project.ProjectReferences.Add(GetProject("GPS.Order.ColumnsDefs"));
project.ProjectReferences.Add(GetProject("GPS.Order.Invariant"));
project.ProjectReferences.Add(GetProject("GPS.Order.v07"));
project.ProjectReferences.Add(GetProject("GPS.Order.Factory"));
break;
}
}
}
static void FillProjectList()
{
ProjectList.Add("GPS.Order.ColumnsDefs", new TProject("GPS.Order.ColumnsDefs", "462d0d6a-6d3a-42cc-8e5f-4cadb5380f6f"));
ProjectList.Add("CareyGlass.Interfaces", new TProject("CareyGlass.Interfaces", "a0a574f4-33dc-4312-8ba7-0abd09cd7323"));
ProjectList.Add("GPS.Order.Factory", new TProject("GPS.Order.Factory", "f3cd6b63-0312-4708-9c99-18232a20d21e"));
ProjectList.Add("GPS.Order.Invariant", new TProject("GPS.Order.Invariant", "f0b39b3d-ebc0-46cb-b4b5-d60fbcaafcc0"));
ProjectList.Add("GPS.Order.v06", new TProject("GPS.Order.v06", "a11d5c1b-6bc5-4392-87d3-2596a7a780f8"));
ProjectList.Add("CareyGlass.DefaultsStorage", new TProject("CareyGlass.DefaultsStorage", "97c05e9b-0b5f-4bb0-952d-c90e4ddee9c3"));
ProjectList.Add("GPS.Order.v06.Tests", new TProject("GPS.Order.v06.Tests", "72c4aab0-c484-439b-b622-9ffac1a0f817"));
ProjectList.Add("GPS.Order.v11.Tests", new TProject("GPS.Order.v11.Tests", "2fe5d102-8f68-46f2-a435-365e9758bd9d"));
ProjectList.Add("Gps.Order.SW", new TProject("Gps.Order.SW", "146b475b-a666-4d4e-ab6e-740704978793"));
ProjectList.Add("Gps.Order.SW.Tests", new TProject("Gps.Order.SW.Tests", "5c529deb-fde0-4d0b-ad4e-db8d3cae5045"));
ProjectList.Add("GPS.Order.v07", new TProject("GPS.Order.v07", "ad138182-ff46-4a3c-9420-81a57c04fc67"));
ProjectList.Add("GPS.Order.Serializer", new TProject("GPS.Order.Serializer", "f162b1c8-5455-42bd-8170-754aaa625aa7"));
ProjectList.Add("GPS.Order.v11", new TProject("GPS.Order.v11", "4545a189-d0b4-4930-9a1e-f49819b3e0d8"));
ProjectList.Add("GPS.Order.Serializer.Tests", new TProject("GPS.Order.Serializer.Tests", "337f9247-cdc4-43a1-963d-75bd259dc12e"));
ProjectList.Add("GPS.Order.ColumnsDefs.Tests", new TProject("GPS.Order.ColumnsDefs.Tests", "2c7be719-5b63-4281-93d9-e7aec1d4a167"));
ProjectList.Add("GPS.Order.Invariant.Tests", new TProject("GPS.Order.Invariant.Tests", "2630aa24-ec74-45a3-8d6b-23b63a78a371"));
ProjectList.Add("GPS.Order.v07.Tests", new TProject("GPS.Order.v07.Tests", "3d41e3b7-8ab3-4143-b12f-6efef8663aec"));
}
#endregion
}
}