/// <summary>
        /// Compares the two complete objects.
        /// </summary>
        public static void CompareComplete(CompleteWay expected, CompleteWay actual)
        {
            if (expected == null)
            { // ok, if the value is also null.
                Assert.IsNull(actual);
            }
            else
            { // check and compare the value.
                Assert.IsNotNull(actual);
                Assert.AreEqual(expected.Id, actual.Id);
                Assert.AreEqual(expected.ChangeSetId, actual.ChangeSetId);
                Assert.AreEqual(expected.TimeStamp, actual.TimeStamp);
                Assert.AreEqual(expected.User, actual.User);
                Assert.AreEqual(expected.UserId, actual.UserId);
                Assert.AreEqual(expected.Version, actual.Version);
                Assert.AreEqual(expected.Visible, actual.Visible);

                if (expected.Nodes == null)
                { // ok, if the value is also null.
                    Assert.IsNotNull(actual.Nodes);
                }
                else
                { // check and compare the nodes.
                    Assert.AreEqual(expected.Nodes.Count, actual.Nodes.Count);
                    for (int idx = 0; idx < expected.Nodes.Count; idx++)
                    {
                        ComparisonHelpers.CompareComplete(
                            expected.Nodes[idx], actual.Nodes[idx]);
                    }
                }
            }
        }
        /// <summary>
        /// Compares the two complete objects.
        /// </summary>
        public static void CompareComplete(CompleteRelation expected, CompleteRelation actual)
        {
            if (expected == null)
            { // ok, if the value is also null.
                Assert.IsNull(actual);
            }
            else
            { // check and compare the value.
                Assert.IsNotNull(actual);
                Assert.AreEqual(expected.Id, actual.Id);
                Assert.AreEqual(expected.ChangeSetId, actual.ChangeSetId);
                Assert.AreEqual(expected.TimeStamp, actual.TimeStamp);
                Assert.AreEqual(expected.User, actual.User);
                Assert.AreEqual(expected.UserId, actual.UserId);
                Assert.AreEqual(expected.Version, actual.Version);
                Assert.AreEqual(expected.Visible, actual.Visible);

                if (expected.Members == null)
                { // ok, if the value is also null.
                    Assert.IsNotNull(actual.Members);
                }
                else
                { // check and compare the nodes.
                    Assert.AreEqual(expected.Members.Count, actual.Members.Count);
                    for (int idx = 0; idx < expected.Members.Count; idx++)
                    {
                        CompleteRelationMember expectedMember = expected.Members[idx];
                        CompleteRelationMember actualMember   = actual.Members[idx];

                        Assert.AreEqual(expectedMember.Role, actualMember.Role);
                        Assert.IsNotNull(expectedMember.Member);
                        Assert.IsNotNull(actualMember.Member);
                        Assert.AreEqual(expectedMember.Member.Type, actualMember.Member.Type);

                        switch (expectedMember.Member.Type)
                        {
                        case CompleteOsmType.Node:
                            ComparisonHelpers.CompareComplete(
                                expectedMember.Member as Node,
                                actualMember.Member as Node);
                            break;

                        case CompleteOsmType.Way:
                            ComparisonHelpers.CompareComplete(
                                expectedMember.Member as CompleteWay,
                                actualMember.Member as CompleteWay);
                            break;

                        case CompleteOsmType.Relation:
                            ComparisonHelpers.CompareComplete(
                                expectedMember.Member as CompleteRelation,
                                actualMember.Member as CompleteRelation);
                            break;
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Compares two lists of complete osm objects.
        /// </summary>
        public static void CompareComplete(System.Collections.Generic.List <ICompleteOsmGeo> expectedList,
                                           System.Collections.Generic.List <ICompleteOsmGeo> actualList)
        {
            foreach (ICompleteOsmGeo actual in actualList)
            {
                foreach (ICompleteOsmGeo expected in
                         expectedList.Where((expected) => { return(expected.Id == actual.Id && expected.Type == actual.Type); }))
                {
                    switch (expected.Type)
                    {
                    case CompleteOsmType.Node:
                        ComparisonHelpers.CompareComplete(
                            expected as Node, actual as Node);
                        break;

                    case CompleteOsmType.Way:
                        ComparisonHelpers.CompareComplete(
                            expected as CompleteWay, actual as CompleteWay);
                        break;

                    case CompleteOsmType.Relation:
                        ComparisonHelpers.CompareComplete(
                            expected as CompleteRelation, actual as CompleteRelation);
                        break;
                    }
                }
            }
            foreach (ICompleteOsmGeo expected in expectedList)
            {
                foreach (ICompleteOsmGeo actual in
                         actualList.Where((actual) => { return(expected.Id == actual.Id && expected.Type == actual.Type); }))
                {
                    switch (expected.Type)
                    {
                    case CompleteOsmType.Node:
                        ComparisonHelpers.CompareComplete(
                            expected as Node, actual as Node);
                        break;

                    case CompleteOsmType.Way:
                        ComparisonHelpers.CompareComplete(
                            expected as CompleteWay, actual as CompleteWay);
                        break;

                    case CompleteOsmType.Relation:
                        ComparisonHelpers.CompareComplete(
                            expected as CompleteRelation, actual as CompleteRelation);
                        break;
                    }
                }
            }
        }