public void CanCompareCollections()
        {
            var ints         = new[] { 1, 2, 3 };
            var otherInts    = new[] { 4, 5, 6 };
            var longerInts   = new[] { 1, 2, 3, 4 };
            var strings      = new[] { "hello", "bonjour", "guten tag", "你好", "aloha" };
            var otherStrings = new[] { "good bye", "au revoir", "auf wiedersehen", "再見", "aloha" };

            var intComparer    = new ModelComparer <int[]>();
            var stringComparer = new ModelComparer <string[]>();

            // We have to use Assert.True/False instead of .Equal/.NotEqual or we won't actually exercise the ModelComparer's collection handling.
            // Also, we use deep copies for some comparisons to make sure the ModelComparer isn't falling back on reference equality.
            Assert.True(intComparer.Equals(ints, ints));
            Assert.True(stringComparer.Equals(strings, strings));

            Assert.True(intComparer.Equals(ints, (int[])ints.Clone()));
            Assert.True(stringComparer.Equals((string[])strings.Clone(), strings));

            Assert.False(intComparer.Equals(ints, otherInts));
            Assert.False(stringComparer.Equals(otherStrings, strings));

            Assert.False(intComparer.Equals(ints, new[] { 7 }));
            Assert.False(stringComparer.Equals(new[] { "who?" }, strings));

            // Test collections of varying lengths.
            Assert.False(intComparer.Equals(ints, longerInts));
            Assert.False(intComparer.Equals(longerInts, ints));
        }
示例#2
0
 MarketRecommendation CompareModels(IEnumerable <MarketModel> models)
 {
     SampleUtilities.DoCpuIntensiveOperation(2.0 * speedFactor, cts.Token);
     if (cts.Token.IsCancellationRequested)
     {
         return(null);
     }
     else
     {
         return(ModelComparer.Run(models.ToArray()));
     }
 }
        public void CanCompareComplexModels()
        {
            var homeAddress = new USAddress()
            {
                Street  = "308 Negra Arroyo Lane",
                City    = "Albuquerque",
                State   = "New Mexico",
                ZipCode = 87104
            };

            var alternateAddress = new USAddress()
            {
                Street  = "Los Pollos Hermanos, 123 Central Ave Southeast",
                City    = "Albuquerque",
                State   = "New Mexico",
                ZipCode = 87108
            };

            var theOneWhoKnocks = new Customer()
            {
                FirstName  = "Walter",
                LastName   = "White",
                Aliases    = new[] { "Heisenberg", "The One Who Knocks" },
                Age        = 51,
                Address    = homeAddress,
                Directions = new List <Direction?>()
                {
                    null, Direction.Left, null, Direction.Right
                },
                Occupations = new Dictionary <string, Address>()
                {
                    { "Husband and father", homeAddress },
                    { "Career criminal", alternateAddress }
                }
            };

            var walterWhite = theOneWhoKnocks.Clone();

            var gustavoFring = new Customer()
            {
                FirstName = "Gustavo",
                LastName  = "Fring",
                Age       = 49,
                Address   = alternateAddress
            };

            var comparer = new ModelComparer <Customer>();

            Assert.Equal(theOneWhoKnocks, theOneWhoKnocks, comparer);
            Assert.Equal(walterWhite, theOneWhoKnocks, comparer);
            Assert.NotEqual(gustavoFring, theOneWhoKnocks, comparer);
        }
        public void CanCompareDifferentEnumerableTypes()
        {
            var intArray = new[] { 1, 2, 3 };
            var intList  = new List <int>()
            {
                1, 2, 3
            };

            var intComparer = new ModelComparer <IEnumerable <int> >();

            // We have to use Assert.True/False instead of .Equal/.NotEqual or we won't actually exercise the ModelComparer's collection handling.
            Assert.True(intComparer.Equals(intArray, intList));
        }
        public void NullEqualsEmptyCollection()
        {
            IEnumerable <int> nullCollection = null;
            var emptyArray = new int[0];
            var emptyList  = new List <int>();

            var comparer = new ModelComparer <IEnumerable <int> >();

            Assert.True(comparer.Equals(nullCollection, emptyArray));
            Assert.True(comparer.Equals(emptyArray, nullCollection));
            Assert.True(comparer.Equals(nullCollection, emptyList));
            Assert.True(comparer.Equals(emptyList, nullCollection));
        }
示例#6
0
        private int?GetSortedIndex(IView view)
        {
            if (_views.Count == 0)
            {
                return(null);
            }

            if (ViewComparer != null)
            {
                for (var i = 0; i < _views.Count; i++)
                {
                    if (ViewComparer.Compare(view, _views[i]) < 0)
                    {
                        return(i);
                    }
                }

                return(null);
            }

            if (ViewModelComparer != null)
            {
                for (var i = 0; i < _views.Count; i++)
                {
                    if (ViewModelComparer.Compare(view.ViewModel, _views[i].ViewModel) < 0)
                    {
                        return(i);
                    }
                }

                return(null);
            }

            if (ModelComparer != null)
            {
                for (var i = 0; i < _views.Count; i++)
                {
                    if (ModelComparer.Compare(view.ViewModel?.Model, _views[i].ViewModel?.Model) < 0)
                    {
                        return(i);
                    }
                }
            }

            return(null);
        }
        public void CanCompareDtos()
        {
            var model = new Model()
            {
                Name = "Magical Trevor", Age = 11
            };
            var sameModel      = new Model(model);
            var differentModel = new Model()
            {
                Name = "Mr. Stabby", Age = 35
            };

            var comparer = new ModelComparer <Model>();

            Assert.Equal(model, model, comparer);
            Assert.Equal(model, sameModel, comparer);
            Assert.NotEqual(model, differentModel, comparer);
        }
        public void CanComparePolymorphicObjects()
        {
            var cat      = new Cat("Gizmo");
            var otherCat = new Cat("Ness");
            var dog      = new Dog("Mara");
            var otherDog = new Dog("Daisy");

            var comparer = new ModelComparer <Animal>();

            Assert.Equal(dog, dog, comparer);
            Assert.Equal(dog, new Dog(dog), comparer);
            Assert.Equal(cat, cat, comparer);
            Assert.Equal(cat, new Cat(cat), comparer);

            Assert.NotEqual(dog, otherDog, comparer);
            Assert.NotEqual(cat, otherCat, comparer);
            Assert.NotEqual(dog, cat, comparer);
        }
        public void IEquatableTakesPrecedenceOverIEnumerable()
        {
            var ints  = new BiasedList(1, 2, 3);
            var odds  = new BiasedList(1, 3, 5);
            var evens = new BiasedList(2, 4, 6);

            var comparer = new ModelComparer <BiasedList>();

            Assert.True(comparer.Equals(ints, ints));
            Assert.True(comparer.Equals(ints, new BiasedList(ints)));

            // ints and odds should compare as equal because BiasedList only looks at the first element.
            Assert.True(comparer.Equals(odds, ints));
            Assert.True(comparer.Equals(new BiasedList(odds), ints));

            Assert.False(comparer.Equals(ints, evens));
            Assert.False(comparer.Equals(ints, new BiasedList(evens)));
        }
        public void CanCompareDictionaries()
        {
            var x = new Dictionary <string, double>()
            {
                { "pi", 3.14 }, { "e", 2.718 }
            };
            var notX = new Dictionary <string, double>()
            {
                { "m", 13.3 }, { "v", 77 }
            };

            var y = new Dictionary <string, object>()
            {
                { "a", "test" }, { "b", "test2" }
            };
            var notY = new Dictionary <string, object>()
            {
                { "w", "other" }, { "u", "side" }
            };

            var doubleComparer = new ModelComparer <Dictionary <string, double> >();
            var stringComparer = new ModelComparer <Dictionary <string, object> >();

            // We have to use Assert.True/False instead of .Equal/.NotEqual or we won't actually exercise the ModelComparer's collection handling.
            // Also, we use deep copies for some comparisons to make sure the ModelComparer isn't falling back on reference equality.
            Assert.True(doubleComparer.Equals(x, x));
            Assert.True(stringComparer.Equals(y, y));

            Assert.True(doubleComparer.Equals(x, new Dictionary <string, double>(x)));
            Assert.True(stringComparer.Equals(new Dictionary <string, object>(y), y));

            Assert.False(doubleComparer.Equals(x, notX));
            Assert.False(stringComparer.Equals(notY, y));

            Assert.False(doubleComparer.Equals(x, new Dictionary <string, double>()
            {
                { "r", 12.0 }
            }));
            Assert.False(stringComparer.Equals(new Dictionary <string, object>()
            {
                { "c", "other" }
            }, y));
        }
示例#11
0
        protected override void ProcessRecord()
        {
            LogInitializer.Initialize();

            var    sf = new FileInfo(Output);
            string folderForSource = Path.Combine(sf.Directory.FullName, Path.GetFileNameWithoutExtension(sf.Name), Path.GetFileNameWithoutExtension(Source.Name));
            string folderForTarget = Path.Combine(sf.Directory.FullName, Path.GetFileNameWithoutExtension(sf.Name), Path.GetFileNameWithoutExtension(Target.Name));

            ModelComparer    comparer = new ModelComparer();
            DifferenceModels diff     = new DifferenceModels(folderForSource, folderForTarget, c => Trace.WriteLine(c));

            comparer.CompareModels(Source, Target, diff, new CompareContext()
            {
            });

            base.WriteObject(diff);

            base.ProcessRecord();
        }
        public void IntegerComparisonsUseWidestType()
        {
            byte  b = 10;
            short s = 10;
            int   i = 10;
            long  l = 10;

            var comparer = new ModelComparer <object>();

            Assert.Equal(b, s, comparer);
            Assert.Equal(b, i, comparer);
            Assert.Equal(b, l, comparer);
            Assert.Equal(s, b, comparer);
            Assert.Equal(s, i, comparer);
            Assert.Equal(s, l, comparer);
            Assert.Equal(i, b, comparer);
            Assert.Equal(i, s, comparer);
            Assert.Equal(i, l, comparer);
            Assert.Equal(l, b, comparer);
            Assert.Equal(l, s, comparer);
            Assert.Equal(l, i, comparer);
        }
示例#13
0
        private static async Task UpdateApp(DesignHub ctx, AppPackage from, ApplicationModel localAppModel)
        {
            //TODO:考虑删除本地已签出的所有变更
            //TODO:1.签出本地对应App的所有节点,包括模型根节点

            var local = new AppPackage();
            await ModelStore.LoadToAppPackage(localAppModel.Id, localAppModel.Name, local);

            var publish = new PublishPackage();
            //----比对文件夹----
            var folderComparer = new FolderComparer();
            var newFolders     = from.Folders.Except(local.Folders, folderComparer);

            foreach (var newFolder in newFolders)
            {
                newFolder.Import();
                publish.Folders.Add(newFolder);
            }
            //var removedFolders = local.Folders.Except(from.Folders, folderComparer);
            //foreach (var removedFolder in removedFolders)
            //{
            //    removedFolder.Remove();
            //    publish.Folders.Add(removedFolder);
            //}
            var otherFolders = local.Folders.Intersect(from.Folders, folderComparer);

            foreach (var folder in otherFolders)
            {
                if (folder.UpdateFrom(from.Folders.Single(t => t.TargetModelType == folder.TargetModelType && t.Id == folder.Id)))
                {
                    publish.Folders.Add(folder);
                }
            }

            //----比对模型----
            var modelComparer = new ModelComparer();
            var newModels     = from.Models.Except(local.Models, modelComparer);

            foreach (var newModel in newModels)
            {
                newModel.Import();
                publish.Models.Add(newModel);
                //导入相关代码及Assembly
                if (newModel.ModelType == ModelType.Service)
                {
                    publish.SourceCodes.Add(newModel.Id, from.SourceCodes[newModel.Id]);
                    var key = $"{from.Application.Name}.{newModel.Name}";
                    publish.ServiceAssemblies.Add(key, from.ServiceAssemblies[key]);
                }
                else if (newModel.ModelType == ModelType.View)
                {
                    publish.SourceCodes.Add(newModel.Id, from.SourceCodes[newModel.Id]);
                    var key = $"{from.Application.Name}.{newModel.Name}";
                    publish.ViewAssemblies.Add(key, from.ViewAssemblies[key]);
                }
            }
            //if (localAppModel.ID != SysGlobal.SysString) //注意:系统应用包不移除仅本地有的模型
            //{
            var removedModles = local.Models.Except(from.Models, modelComparer);

            foreach (var removedModel in removedModles)
            {
                removedModel.MarkDeleted();
                publish.Models.Add(removedModel);
                //删除模型的相关代码组件等由PublishService处理,不用再加入
            }
            //}
            var otherModels = local.Models.Intersect(from.Models, modelComparer);

            foreach (var model in otherModels)
            {
                if (model.UpdateFrom(from.Models.Single(t => t.ModelType == model.ModelType && t.Id == model.Id)))
                {
                    publish.Models.Add(model);
                }
                if (model.ModelType == ModelType.Service)
                {
                    publish.SourceCodes.Add(model.Id, from.SourceCodes[model.Id]);
                    var key = $"{from.Application.Name}.{model.Name}";
                    publish.ServiceAssemblies.Add(key, from.ServiceAssemblies[key]);
                }
                else if (model.ModelType == ModelType.View)
                {
                    publish.SourceCodes.Add(model.Id, from.SourceCodes[model.Id]);
                    var key = $"{from.Application.Name}.{model.Name}";
                    publish.ViewAssemblies.Add(key, from.ViewAssemblies[key]);
                }
            }

            //发布变更的包
            await PublishService.PublishAsync(ctx, publish, "Import");
        }