/// <summary>
 /// Initializes an instance of the PSAutoscaleSettingProperty class.
 /// </summary>
 /// <param name="autoscaleSetting">The autoscale setting to use as base</param>
 public PSAutoscaleSettingProperty(AutoscaleSetting autoscaleSetting)
 {
     if (autoscaleSetting != null)
     {
         this.Enabled = autoscaleSetting.Enabled;
         this.Name = autoscaleSetting.Name;
         this.Profiles = autoscaleSetting.Profiles;
         this.TargetResourceUri = autoscaleSetting.TargetResourceUri;
     }
 }
        private PSAutoscaleSetting CreateCompleteSpec(string location, string name, List<AutoscaleProfile> profiles = null)
        {
            if (profiles == null)
            {
                profiles = new List<AutoscaleProfile>() { this.CreateAutoscaleProfile() };
            }

            var settingProperty = new AutoscaleSetting
            {
                Name = name,
                Enabled = true,
                Profiles = profiles,
                TargetResourceUri = Utilities.ResourceUri
            };

            var setting = new AutoscaleSettingResource
            {
                Location = location,
                Name = name,
                Properties = new PSAutoscaleSettingProperty(settingProperty),
                Tags = new LazyDictionary<string, string>()
            };

            return new PSAutoscaleSetting(setting);
        }
        private static AutoscaleSetting CreateAutoscaleSetting(string resourceUri, string metricName, string metricNamespace)
        {
            var capacity = new ScaleCapacity
            {
                Default = "1",
                Maximum = "100",
                Minimum = "1"
            };

            var fixedDate = new TimeWindow()
            {
                End = DateTime.Parse("2014-04-16T21:06:11.7882792Z"),
                Start = DateTime.Parse("2014-04-15T21:06:11.7882792Z"),
                TimeZone = TimeZoneInfo.Utc.Id.ToString()
            };

            var recurrence = new Recurrence()
            {
                Frequency = RecurrenceFrequency.Week,
                Schedule = new RecurrentSchedule()
                {
                    Days = new List<string> { "Monday" },
                    Hours = new List<int> { 0 },
                    Minutes = new int[] { 10 },
                    TimeZone = "UTC-11"
                }
            };

            var rules = new ScaleRule[]
            {
                new ScaleRule()
                {
                    MetricTrigger = new MetricTrigger
                    {
                        MetricName = metricName,
                        MetricNamespace = metricNamespace,
                        MetricResourceUri = resourceUri,
                        Operator = ComparisonOperationType.GreaterThan,
                        Statistic = MetricStatisticType.Average,
                        Threshold = 80.0,
                        TimeAggregation = TimeAggregationType.Maximum,
                        TimeGrain = TimeSpan.FromMinutes(1),
                        TimeWindow = TimeSpan.FromHours(1)
                    },
                    ScaleAction = new ScaleAction
                    {
                        Cooldown = TimeSpan.FromMinutes(20),
                        Direction = ScaleDirection.Increase,
                        Type = ScaleType.ExactCount,
                        Value = "10"
                    }
                }
            };

            AutoscaleSetting setting = new AutoscaleSetting
            {
                Name = "setting1",
                TargetResourceUri = resourceUri,
                Enabled = true,
                Profiles = new AutoscaleProfile[]
                {
                    new AutoscaleProfile()
                    {
                        Name = "Profile1",
                        Capacity = capacity,
                        FixedDate = fixedDate,
                        Recurrence = null,
                        Rules = rules
                    },
                    new AutoscaleProfile()
                    {
                        Name = "Profile2",
                        Capacity = capacity,
                        FixedDate = null,
                        Recurrence = recurrence,
                        Rules = rules
                    }
                }
            };

            return setting;
        }
        private static void AreEqual(AutoscaleSetting exp, AutoscaleSetting act)
        {
            if (exp != null)
            {
                Assert.Equal(exp.Enabled, act.Enabled);
                Assert.Equal(exp.Name, act.Name);
                Assert.Equal(exp.TargetResourceUri, act.TargetResourceUri);

                for (int i = 0; i < exp.Profiles.Count; i++)
                {
                    var expectedProfile = exp.Profiles[i];
                    var actualProfile = act.Profiles[i];
                    AreEqual(expectedProfile, actualProfile);
                }
            }
        }