/// <summary>
        /// 
        /// </summary>
        /// <param name="prevStatuses"></param>
        /// <param name="currentStatuses"></param>
        /// <returns></returns>
        public static ChangeInfo[] GetChangeInfoSetFromStatuses(IPlatformStatus[] prevStatuses, IPlatformStatus[] currentStatuses)
        {
            // WORKAROUND: ie-status.json has a duplicated id.
            var prevIdAndNames = prevStatuses.Select(x => new { x.Id, x.Name }).ToLookup(k => k.Id, v => v);
            var curIdAndNames = currentStatuses.Select(x => new { x.Id, x.Name }).ToLookup(k => k.Id, v => v);
            Func<IPlatformStatus, String> prevIdMapper = (platformStatus) => prevIdAndNames[platformStatus.Id].Count() > 1 ? platformStatus.Id + "_" + platformStatus.Name : platformStatus.Id.ToString();
            Func<IPlatformStatus, String> curIdMapper = (platformStatus) => curIdAndNames[platformStatus.Id].Count() > 1 ? platformStatus.Id + "_" + platformStatus.Name : platformStatus.Id.ToString();

            var prevStatusIds = prevStatuses.Select(prevIdMapper).ToArray();
            var prevStatusesByName = prevStatuses.ToDictionary(prevIdMapper, v => v);
            var currentStatusIds = currentStatuses.Select(curIdMapper).ToArray();
            var currentStatusesByName = currentStatuses.ToDictionary(curIdMapper, v => v);

            // Deleted or Added Id
            var deletedOrAddedIds = currentStatusIds
                                        .Except(prevStatusIds)
                                        .Concat(prevStatusIds.Except(currentStatusIds))
                                        .ToArray();
            var deletedOrAddedChanges = deletedOrAddedIds.Select(x => ChangeInfo.Create(prevStatusesByName.ContainsKey(x) ? prevStatusesByName[x] : null, currentStatusesByName.ContainsKey(x) ? currentStatusesByName[x] : null));

            // Changed Statuses
            var changedStatusNames = Enumerable.Intersect(currentStatusIds, prevStatusIds)
                                              .Where(x => !prevStatusesByName[x].CompareStatus(currentStatusesByName[x]))
                                              .ToArray();

            return changedStatusNames.Select(x => ChangeInfo.Create(prevStatusesByName[x], currentStatusesByName[x]))
                                        .Concat(deletedOrAddedChanges)
                                        .ToArray();
        }
        public override bool CompareStatus(IPlatformStatus status)
        {
            var ieStatus = status as IePlatformStatus;

            return(this.IeStatus.IePrefixed == ieStatus.IeStatus.IePrefixed &&
                   this.IeStatus.IeUnprefixed == ieStatus.IeStatus.IeUnprefixed &&
                   this.IeStatus.Text == ieStatus.IeStatus.Text &&
                   this.IeStatus.Flag == ieStatus.IeStatus.Flag &&
                   this.IeStatus.Priority == ieStatus.IeStatus.Priority);
        }
        public override bool CompareStatus(IPlatformStatus status)
        {
            var webkitStatus = status as WebKitPlatformStatus;

            if (webkitStatus == null)
            {
                return(false);
            }

            return(this.Status.Status == webkitStatus.Status.Status &&
                   this.Status.EnabledByDefault == webkitStatus.Status.EnabledByDefault
                   );
        }
        public virtual bool CompareStatus(IPlatformStatus status)
        {
            var status2 = status as MozillaPlatformStatus;

            if (status2 == null)
            {
                return(false);
            }

            return(this.Status == status2.Status &&
                   this.Version == status2.Version &&
                   this.Channel == status2.Channel
                   );
        }
        public override bool CompareStatus(IPlatformStatus status)
        {
            var chStatus = status as ChromiumPlatformStatus;

            if (chStatus == null)
            {
                return(false);
            }

            return(this.Prefixed == chStatus.Prefixed &&
                   this.Flag == chStatus.Flag &&
                   this.Status == chStatus.Status &&
                   this.Android == chStatus.Android &&
                   this.Ios == chStatus.Ios &&
                   this.Desktop == chStatus.Desktop
                   );
        }
 public static ChangeInfo Create(IPlatformStatus oldStatus, IPlatformStatus newStatus)
 {
     if (oldStatus is ChromiumPlatformStatus || newStatus is ChromiumPlatformStatus)
     {
         return new ChromiumChangeInfo(oldStatus, newStatus);
     }
     if (oldStatus is WebKitPlatformStatus || newStatus is WebKitPlatformStatus)
     {
         return new WebKitChangeInfo(oldStatus, newStatus);
     }
     if (oldStatus is MozillaPlatformStatus || newStatus is MozillaPlatformStatus)
     {
         return new MozillaChangeInfo(oldStatus, newStatus);
     }
     else
     {
         return new IeChangeInfo(oldStatus, newStatus);
     }
 }
 public ChromiumChangeInfo(IPlatformStatus oldStatus, IPlatformStatus newStatus)
     : base(oldStatus, newStatus)
 {
 }
        public override bool CompareStatus(IPlatformStatus status)
        {
            var webkitStatus = status as WebKitPlatformStatus;
            if (webkitStatus == null) return false;

            return this.Status.Status == webkitStatus.Status.Status &&
                    this.Status.EnabledByDefault == webkitStatus.Status.EnabledByDefault
                ;
        }
 public PlatformStatuses(DateTime date, IPlatformStatus[] statuses)
 {
     Date = date;
     Statuses = statuses;
 }
 public virtual bool CompareStatus(IPlatformStatus status)
 {
     return false;
 }
        public virtual bool CompareStatus(IPlatformStatus status)
        {
            var status2 = status as MozillaPlatformStatus;
            if (status2 == null) return false;

            return this.Status == status2.Status &&
                    this.Version == status2.Version &&
                    this.Channel == status2.Channel
                ;
        }
 public override bool CompareStatus(IPlatformStatus status)
 {
     var ieStatus = status as IePlatformStatus;
     return this.IeStatus.IePrefixed == ieStatus.IeStatus.IePrefixed &&
            this.IeStatus.IeUnprefixed == ieStatus.IeStatus.IeUnprefixed &&
            this.IeStatus.Text == ieStatus.IeStatus.Text &&
            this.IeStatus.Flag == ieStatus.IeStatus.Flag;
 }
        public override bool CompareStatus(IPlatformStatus status)
        {
            var chStatus = status as ChromiumPlatformStatus;
            if (chStatus == null) return false;

            return this.Prefixed == chStatus.Prefixed &&
                    this.ImplStatusChrome == chStatus.ImplStatusChrome &&
                    this.ShippedAndroidMilestone == chStatus.ShippedAndroidMilestone &&
                    this.ShippedIosMilestone == chStatus.ShippedIosMilestone &&
                    this.ShippedMilestone == chStatus.ShippedMilestone &&
                    this.ShippedOperaAndroidMilestone == chStatus.ShippedOperaAndroidMilestone &&
                    this.ShippedOperaMilestone == chStatus.ShippedOperaMilestone &&
                    this.ShippedWebViewMilestone == chStatus.ShippedWebViewMilestone
                ;
        }
 public ChangeInfo(IPlatformStatus oldStatus, IPlatformStatus newStatus)
 {
     OldStatus = oldStatus;
     NewStatus = newStatus;
 }
 public MozillaChangeInfo(IPlatformStatus oldStatus, IPlatformStatus newStatus)
     : base(oldStatus, newStatus)
 {
 }
 public virtual bool CompareStatus(IPlatformStatus status)
 {
     return(false);
 }
 public WebKitChangeInfo(IPlatformStatus oldStatus, IPlatformStatus newStatus)
     : base(oldStatus, newStatus)
 {
 }