/// <summary>
        /// Reconstructs a color formatting rule from the specified XML image.
        /// </summary>
        /// <param name="node">The node containing the color formatting rule XML.</param>
        /// <returns>The color formatting rule.</returns>
        private static ColorFormattingRule ReadColorFormattingRuleXml(XmlNode node)
        {
            ColorFormattingRule formattingRule = new ColorFormattingRule();

            XmlNodeList ruleNodes = XmlHelper.SelectNodes(node, "colorFormattingRule/rules/rule");

            foreach (XmlNode ruleNode in ruleNodes)
            {
                ColorRule rule = new ColorRule();

                rule.BackgroundColor = ColorInfoHelper.ReadColorInfoXml(ruleNode, "backgroundColor");
                rule.ForegroundColor = ColorInfoHelper.ReadColorInfoXml(ruleNode, "foregroundColor");
                rule.Condition       = ConditionHelper.ReadConditionXml(ruleNode, "condition");

                formattingRule.Rules.Add(rule);
            }

            return(formattingRule);
        }
        /// <summary>
        /// </summary>
        /// <param name="index"></param>
        /// <param name="cfr1"></param>
        /// <param name="cfr2"></param>
        private static void CompareColorFormattingRules(int index, ColorFormattingRule cfr1, ColorFormattingRule cfr2)
        {
            Assert.IsNotNull(cfr1, "Format Index:{0} ColorFormattingRule 1 should not be null.", index.ToString(CultureInfo.InvariantCulture));
            Assert.IsNotNull(cfr2, "Format Index:{0} ColorFormattingRule 2 should not be null.", index.ToString(CultureInfo.InvariantCulture));

            Assert.IsNotNull(cfr1.Rules, "Format Index:{0} ColorFormattingRule.Rules 1 should not be null.", index.ToString(CultureInfo.InvariantCulture));
            Assert.IsNotNull(cfr2.Rules, "Format Index:{0} ColorFormattingRule.Rules 2 should not be null.", index.ToString(CultureInfo.InvariantCulture));

            Assert.AreEqual(cfr1.Rules.Count, cfr2.Rules.Count, "Format Index:{0} ColorFormattingRule.Rules.Count is invalid.", index.ToString(CultureInfo.InvariantCulture));

            for (int ri = 0; ri < cfr1.Rules.Count; ri++)
            {
                ColorRule cr1 = cfr1.Rules[ri];
                ColorRule cr2 = cfr2.Rules[ri];

                Assert.AreEqual(cr1.BackgroundColor.A, cr2.BackgroundColor.A, "Format Index:{0} Rule Index:{1} BackgroundColor.A is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture));
                Assert.AreEqual(cr1.BackgroundColor.R, cr2.BackgroundColor.R, "Format Index:{0} Rule Index:{1} BackgroundColor.R is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture));
                Assert.AreEqual(cr1.BackgroundColor.G, cr2.BackgroundColor.G, "Format Index:{0} Rule Index:{1} BackgroundColor.G is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture));
                Assert.AreEqual(cr1.BackgroundColor.B, cr2.BackgroundColor.B, "Format Index:{0} Rule Index:{1} BackgroundColor.B is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture));

                Assert.AreEqual(cr1.ForegroundColor.A, cr2.ForegroundColor.A, "Format Index:{0} Rule Index:{1} ForegroundColor.A is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture));
                Assert.AreEqual(cr1.ForegroundColor.R, cr2.ForegroundColor.R, "Format Index:{0} Rule Index:{1} ForegroundColor.R is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture));
                Assert.AreEqual(cr1.ForegroundColor.G, cr2.ForegroundColor.G, "Format Index:{0} Rule Index:{1} ForegroundColor.G is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture));
                Assert.AreEqual(cr1.ForegroundColor.B, cr2.ForegroundColor.B, "Format Index:{0} Rule Index:{1} ForegroundColor.B is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture));

                Assert.AreEqual(cr1.Condition.ColumnName, cr2.Condition.ColumnName, "Format Index:{0} Rule Index:{1} Condition.ColumnName is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture));
                Assert.AreEqual(cr1.Condition.ColumnType.GetType( ), cr2.Condition.ColumnType.GetType( ), "Format Index:{0} Rule Index:{1} Condition.ColumnType is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture));
                Assert.AreEqual(cr1.Condition.Operator, cr2.Condition.Operator, "Format Index:{0} Rule Index:{1} Condition.Operator is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture));
                Assert.AreEqual(cr1.Condition.Arguments.Count, cr2.Condition.Arguments.Count, "Format Index:{0} Rule Index:{1} Condition.Arguments.Count is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture));

                for (int ti = 0; ti < cr1.Condition.Arguments.Count; ti++)
                {
                    TypedValue tv1 = cr1.Condition.Arguments[ti];
                    TypedValue tv2 = cr1.Condition.Arguments[ti];

                    Assert.AreEqual(tv1.Type, tv2.Type, "Format Index:{0} Rule Index:{1} Arg Index:{2} Argument.Type is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture), ti.ToString(CultureInfo.InvariantCulture));
                    Assert.AreEqual(tv1.Value, tv2.Value, "Format Index:{0} Rule Index:{1} Arg Index:{2} Argument.Value is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture), ti.ToString(CultureInfo.InvariantCulture));
                }
            }
        }