public void SerializeIsolationSchemeTest()
        {
            var isolationScheme = new IsolationScheme("object test", 1.0, 2.0);

            // Test IsolationScheme.Validate method through ChangeProp
            isolationScheme = (IsolationScheme)isolationScheme.ChangeName("test2");

            // Test IsolationScheme object methods
            isolationScheme.Equals(null);
            isolationScheme.Equals(isolationScheme);
// ReSharper disable ReturnValueOfPureMethodIsNotUsed
            isolationScheme.Equals((object)null);
            isolationScheme.Equals((object)isolationScheme);
            isolationScheme.GetHashCode();
// ReSharper restore ReturnValueOfPureMethodIsNotUsed

            // Test IsolationWindow object methods
            var isolationWindow = new IsolationWindow(100.0, 150.0, 125.0, 1.0, 1.0);

            isolationWindow.Equals(null);
            isolationWindow.Equals(isolationWindow);
// ReSharper disable ReturnValueOfPureMethodIsNotUsed
            isolationWindow.Equals((object)null);
            isolationWindow.Equals((object)isolationWindow);
// ReSharper disable SuspiciousTypeConversion.Global
            isolationWindow.Equals(2);
// ReSharper restore SuspiciousTypeConversion.Global
            isolationWindow.GetHashCode();
            isolationWindow.GetSchema();
// ReSharper restore ReturnValueOfPureMethodIsNotUsed

            // Test round trip serialization
            AssertEx.Serialization <IsolationSchemeList>(ISOLATION_SCHEME_LIST, CheckSettingsList, false); // Not part of a Skyline document, don't check against schema

            // Valid first
            AssertEx.DeserializeNoError <IsolationScheme>(
                @"<isolation_scheme name=""Validate (1)"" precursor_filter=""1""/>");
            AssertEx.DeserializeNoError <IsolationScheme>(
                @"<isolation_scheme name=""Validate (2)"" precursor_left_filter=""0.5"" precursor_right_filter=""0.5""/>");
            AssertEx.DeserializeNoError <IsolationScheme>(
                @"<isolation_scheme name=""Validate (3)"" special_handling=""Multiplexed"" windows_per_scan=""2"">
                    <isolation_window start=""100"" end=""110""/><isolation_window start=""110"" end=""130""/></isolation_scheme>");
            AssertEx.DeserializeNoError <IsolationScheme>(
                @"<isolation_scheme name=""Validate (4)"" special_handling=""MSe""/>");

            // Missing parameters
            AssertEx.DeserializeError <IsolationScheme>(@"<isolation_scheme/>");
            // No name
            AssertEx.DeserializeError <IsolationScheme>(@"<isolation_scheme precursor_filter=""1""/>");
            // Filter and prespecified window
            AssertEx.DeserializeError <IsolationScheme>(
                @"<isolation_scheme name=""Invalid (1)"" precursor_filter=""1""><isolation_window start=""1"" end=""10""/></isolation_scheme>");
            // Filter and special handling
            //AssertEx.DeserializeError<IsolationScheme>(
            //    @"<isolation_scheme name=""Invalid (2)"" precursor_filter=""1"" special_handling=""MSe""/>");
            // Filter and windows per scan
            AssertEx.DeserializeError <IsolationScheme>(
                @"<isolation_scheme name=""Invalid (3)"" precursor_filter=""1"" windows_per_scan=""3""/>");
            // Special handling but no windows (now uses results windows)
//            AssertEx.DeserializeError<IsolationScheme>(
//                @"<isolation_scheme name=""Invalid (4)"" special_handling=""Multiplexed""/>");
            // Right filter only
            AssertEx.DeserializeError <IsolationScheme>(
                @"<isolation_scheme name=""Invalid (5)"" precursor_right_filter=""1""/>");
            // Windows per scan with no special handling
            AssertEx.DeserializeError <IsolationScheme>(
                @"<isolation_scheme name=""Invalid (6)"" windows_per_scan=""2""><isolation_window start=""1"" end=""10""/></isolation_scheme>");
            // Windows per scan with MSe
            AssertEx.DeserializeError <IsolationScheme>(
                @"<isolation_scheme name=""Invalid (7)"" windows_per_scan=""2"" special_handling=""MSe"" />");
            // Multiplexed and no windows per scan
            AssertEx.DeserializeError <IsolationScheme>(
                @"<isolation_scheme name=""Invalid (8)"" special_handling=""Multiplexed""><isolation_window start=""1"" end=""10""/></isolation_scheme>");
            // Multiplexed and invalid windows per scan
            AssertEx.DeserializeError <IsolationScheme>(
                @"<isolation_scheme name=""Invalid (9)"" windows_per_scan=""0"" special_handling=""Multiplexed""><isolation_window start=""1"" end=""10""/></isolation_scheme>");
            // Invalid special handling
            AssertEx.DeserializeError <IsolationScheme>(
                @"<isolation_scheme name=""Invalid (10)"" special_handling=""invalid option""/>");

            // Bad window: start > end
            AssertEx.DeserializeError <IsolationScheme>(
                @"<isolation_scheme name=""Invalid (10)""><isolation_window start=""10"" end=""1""/></isolation_scheme>");
            // Bad window: target not between start and end
            AssertEx.DeserializeError <IsolationScheme>(
                @"<isolation_scheme name=""Invalid (11)""><isolation_window start=""1"" end=""10"" target=""20""/></isolation_scheme>");
            // Bad window: start margin < 0
            AssertEx.DeserializeError <IsolationScheme>(
                @"<isolation_scheme name=""Invalid (12)""><isolation_window start=""1"" end=""10"" margin_left=""-1"" margin_right=""2""/></isolation_scheme>");
            // MSe with window
            AssertEx.DeserializeError <IsolationScheme>(
                @"<isolation_scheme name=""Invalid (14)"" special_handling=""MSe""><isolation_window start=""1"" end=""10""/></isolation_scheme>");
        }