public void TestAutoPoolSpecificationUnboundConstraints()
        {
            const string             idPrefix           = "Bar";
            const bool               keepAlive          = false;
            const PoolLifetimeOption poolLifetimeOption = PoolLifetimeOption.Job;
            PoolSpecification        poolSpecification  = new PoolSpecification();

            AutoPoolSpecification autoPoolSpecification = new AutoPoolSpecification();

            //Properties should start out as their defaults
            Assert.Equal(default(string), autoPoolSpecification.AutoPoolIdPrefix);
            Assert.Equal(default(bool?), autoPoolSpecification.KeepAlive);
            Assert.Equal(default(PoolLifetimeOption), autoPoolSpecification.PoolLifetimeOption);
            Assert.Equal(default(PoolSpecification), autoPoolSpecification.PoolSpecification);

            Assert.False(((IModifiable)autoPoolSpecification).HasBeenModified);

            //Should be able to set all properties

            autoPoolSpecification.AutoPoolIdPrefix   = idPrefix;
            autoPoolSpecification.KeepAlive          = keepAlive;
            autoPoolSpecification.PoolLifetimeOption = poolLifetimeOption;
            autoPoolSpecification.PoolSpecification  = poolSpecification;

            Assert.True(((IModifiable)autoPoolSpecification).HasBeenModified);

            Protocol.Models.AutoPoolSpecification protoAutoPoolSpecification = autoPoolSpecification.GetTransportObject();
            ((IReadOnly)autoPoolSpecification).IsReadOnly = true; //Forces read-onlyness

            //After MarkReadOnly, the original object should be unsettable
            Assert.Throws <InvalidOperationException>(() => autoPoolSpecification.AutoPoolIdPrefix   = "bar");
            Assert.Throws <InvalidOperationException>(() => autoPoolSpecification.KeepAlive          = false);
            Assert.Throws <InvalidOperationException>(() => autoPoolSpecification.PoolLifetimeOption = PoolLifetimeOption.JobSchedule);
            InvalidOperationException e = Assert.Throws <InvalidOperationException>(() => autoPoolSpecification.PoolSpecification = new PoolSpecification());

            this.testOutputHelper.WriteLine(e.ToString());

            //After GetProtocolObject, the child objects should be unreadable too
            Assert.Throws <InvalidOperationException>(() => poolSpecification.TaskSlotsPerNode = 4);

            //The original data should be on the protocol specification
            Assert.Equal(idPrefix, protoAutoPoolSpecification.AutoPoolIdPrefix);
            Assert.Equal(keepAlive, protoAutoPoolSpecification.KeepAlive);
            Assert.Equal(poolLifetimeOption, UtilitiesInternal.MapEnum <Protocol.Models.PoolLifetimeOption, PoolLifetimeOption>(protoAutoPoolSpecification.PoolLifetimeOption));
        }
        public void TestAutoPoolSpecificationBoundConstraints()
        {
            Protocol.Models.AutoPoolSpecification protoAutoPoolSpecification = new Protocol.Models.AutoPoolSpecification
            {
                KeepAlive          = true,
                PoolLifetimeOption = Protocol.Models.PoolLifetimeOption.JobSchedule,
                AutoPoolIdPrefix   = "Matt",
                Pool = new Protocol.Models.PoolSpecification
                {
                    CloudServiceConfiguration = new Protocol.Models.CloudServiceConfiguration(
                        "4"),
                    ResizeTimeout = TimeSpan.FromDays(1),
                    StartTask     = new Protocol.Models.StartTask
                    {
                        CommandLine = "Bar"
                    }
                }
            };

            AutoPoolSpecification autoPoolSpecification = new AutoPoolSpecification(protoAutoPoolSpecification);

            //Assert that the wrapped properties are equal as we expect
            Assert.Equal(protoAutoPoolSpecification.AutoPoolIdPrefix, autoPoolSpecification.AutoPoolIdPrefix);
            Assert.Equal(protoAutoPoolSpecification.KeepAlive, autoPoolSpecification.KeepAlive);
            Assert.Equal(UtilitiesInternal.MapEnum <Protocol.Models.PoolLifetimeOption, PoolLifetimeOption>(protoAutoPoolSpecification.PoolLifetimeOption), autoPoolSpecification.PoolLifetimeOption);

            Assert.NotNull(autoPoolSpecification.PoolSpecification);
            Assert.NotNull(protoAutoPoolSpecification.Pool.CloudServiceConfiguration);

            Assert.Equal(protoAutoPoolSpecification.Pool.CloudServiceConfiguration.OsFamily, autoPoolSpecification.PoolSpecification.CloudServiceConfiguration.OSFamily);
            Assert.Equal(protoAutoPoolSpecification.Pool.ResizeTimeout, autoPoolSpecification.PoolSpecification.ResizeTimeout);

            Assert.NotNull(autoPoolSpecification.PoolSpecification.StartTask);
            Assert.Equal(protoAutoPoolSpecification.Pool.StartTask.CommandLine, autoPoolSpecification.PoolSpecification.StartTask.CommandLine);

            //When we change a property on the underlying object PoolSpecification, AutoPoolSpecification should notice the change
            Assert.False(((IModifiable)autoPoolSpecification).HasBeenModified);

            autoPoolSpecification.PoolSpecification.ResizeTimeout = TimeSpan.FromSeconds(122);

            Assert.True(((IModifiable)autoPoolSpecification).HasBeenModified);
        }