Esempio n. 1
0
 public void Initialize()
 {
     ReadOnlyTestContext.ClearBaselineIncludes();
     this.serviceRoot        = new Uri("http://localhost/");
     this.context            = new DataServiceContext(serviceRoot);
     this.context.EnableAtom = true;
 }
        public void AtomMaterializerLogAddedLink()
        {
            ReadOnlyTestContext.AddBaselineIncludes(typeof(Team), "Players");
            string players = FeedStart +
                             AnyEntry("p1", "<d:ID>10</d:ID>", null) +
                             AnyEntry("p2", "<d:ID>20</d:ID>", null) +
                             "</feed>";
            string xml = FeedStart +
                         AnyEntry("t1", "<d:TeamID>1</d:TeamID>", LinkFeed("Players", players)) +
                         "</feed>";

            foreach (MergeOption o in new MergeOption[] { MergeOption.AppendOnly, MergeOption.NoTracking, MergeOption.PreserveChanges })
            {
                this.context             = new DataServiceContext(serviceRoot);
                this.context.EnableAtom  = true;
                this.context.MergeOption = o;

                var q = from t in context.CreateQuery <Team>("T").Expand("Players")
                        select t;

                foreach (var item in CreateTestMaterializeAtom(xml, q))
                {
                    Assert.AreEqual(1, item.TeamID, "item.TeamID");
                    Assert.IsNotNull(item.Players, "item.Players");

                    Assert.AreEqual(2, item.Players.Count, "item.Players.Count");
                    Assert.AreEqual(10, item.Players[0].ID, "item.Players[0].ID");
                    Assert.AreEqual(20, item.Players[1].ID, "item.Players[1].ID");
                }

                if (o == MergeOption.NoTracking)
                {
                    AssertEntityCount(0, "nothing tracked for NoTracking");
                    AssertLinkCount(0, "nothing tracked for NoTracking");
                }
                else
                {
                    AssertEntityCount(3, "one team, two players");
                    AssertLinkCount(2, "team to each player");
                }
            }
        }
        public void AtomMaterializerLogTryResolve()
        {
            ReadOnlyTestContext.AddBaselineIncludes(typeof(Team), "Players");
            string players = FeedStart +
                             AnyEntry("p1", "<d:ID>10</d:ID>", null) +
                             AnyEntry("p2", "<d:ID>20</d:ID>", null) +
                             "</feed>";
            string playersTweaked = FeedStart +
                                    AnyEntry("p1", "<d:ID>100</d:ID>", null) +
                                    AnyEntry("p2", "<d:ID>200</d:ID>", null) +
                                    "</feed>";
            string xml = FeedStart +
                         AnyEntry("t1", "<d:TeamID>1</d:TeamID>", LinkFeed("Players", players)) +
                         AnyEntry("t2", "<d:TeamID>2</d:TeamID>", LinkFeed("Players", playersTweaked)) +
                         "</feed>";

            CombinatorialEngine engine = CombinatorialEngine.FromDimensions(
                new Dimension("MergeOption", Enum.GetValues(typeof(MergeOption))),
                new Dimension("ChangeBetweenReads", new bool[] { true, false }));

            using (TestUtil.RestoreStaticMembersOnDispose(typeof(Player)))
                TestUtil.RunCombinatorialEngineFail(engine, (values) =>
                {
                    Player.EqualsUsesReferences = true;

                    MergeOption option       = (MergeOption)values["MergeOption"];
                    bool changeBetweenReads  = (bool)values["ChangeBetweenReads"];
                    this.context             = new DataServiceContext(serviceRoot);
                    this.context.EnableAtom  = true;
                    this.context.MergeOption = option;

                    var q = from t in context.CreateQuery <Team>("T").Expand("Players")
                            select t;

                    bool firstTeam = true;
                    foreach (var item in CreateTestMaterializeAtom(xml, q))
                    {
                        if (firstTeam)
                        {
                            Assert.AreEqual(1, item.TeamID, "item.TeamID");
                            Assert.IsNotNull(item.Players, "item.Players");

                            Assert.AreEqual(2, item.Players.Count, "item.Players.Count");
                            Assert.AreEqual(10, item.Players[0].ID, "item.Players[0].ID");
                            Assert.AreEqual(20, item.Players[1].ID, "item.Players[1].ID");

                            if (changeBetweenReads && option != MergeOption.NoTracking)
                            {
                                context.UpdateObject(item.Players[0]);
                                context.UpdateObject(item.Players[1]);
                            }
                        }
                        else
                        {
                            Assert.AreEqual(2, item.TeamID, "item.TeamID");
                            Assert.IsNotNull(item.Players, "item.Players");

                            Assert.AreEqual(2, item.Players.Count, "item.Players.Count");

                            // The players will have changed if:
                            // - In NoTracking: always
                            // - In PreserveClient: only if unchanged
                            // - In AppendOnly: only if unchanged
                            // - In OverwriteChanged: always
                            if (option == MergeOption.NoTracking || option == MergeOption.OverwriteChanges || !changeBetweenReads)
                            {
                                Assert.AreEqual(100, item.Players[0].ID, "item.Players[0].ID");
                                Assert.AreEqual(200, item.Players[1].ID, "item.Players[1].ID");
                            }
                            else
                            {
                                Assert.AreEqual(10, item.Players[0].ID, "item.Players[0].ID");
                                Assert.AreEqual(20, item.Players[1].ID, "item.Players[1].ID");
                            }
                        }

                        firstTeam = false;
                    }

                    if (option == MergeOption.NoTracking)
                    {
                        AssertEntityCount(0, "nothing tracked for NoTracking");
                        AssertLinkCount(0, "nothing tracked for NoTracking");
                    }
                    else
                    {
                        AssertEntityCount(4, "two teams, two players");
                        AssertLinkCount(4, "each team to each player");
                    }
                });
        }
        public void AtomMaterializerForPath()
        {
            ReadOnlyTestContext.AddBaselineIncludes(typeof(Team), "HomeStadium");
            ReadOnlyTestContext.AddBaselineIncludes(typeof(Team), "Players");
            context.MergeOption = MergeOption.NoTracking;

            string stadium = AnyEntry("1", "<d:ID>1</d:ID><d:Name>Stadium 1</d:Name>", null);
            string players = FeedStart +
                             AnyEntry("p1", "<d:ID>10</d:ID>", null) +
                             AnyEntry("p2", "<d:ID>20</d:ID>", null) +
                             "</feed>";
            string playersWithContinuation = FeedStart +
                                             AnyEntry("p1", "<d:ID>10</d:ID>", null) +
                                             AnyEntry("p2", "<d:ID>20</d:ID>", null) +
                                             "<link rel='next' href='http://next/' />" +
                                             "</feed>";

            {
                Trace.WriteLine("Leaf materialization.");
                string xml = FeedStart + AnyEntry("10", "<d:TeamID>10</d:TeamID>", LinkEntry("HomeStadium", stadium) + LinkFeed("Players", players)) + "</feed>";
                var    q   = from t in context.CreateQuery <Team>("T")
                             select new
                {
                    team  = t,
                    team2 = new Team()
                    {
                        Players = t.Players
                    },
                    team3 = new Team()
                    {
                        HomeStadium = t.HomeStadium
                    }
                };
                foreach (var item in CreateTestMaterializeAtom(xml, q))
                {
                    // Because of identity resolution, all team instances are actually the same object.

                    Assert.IsNotNull(item, "item");

                    Assert.IsNotNull(item.team, "item.team");
                    Assert.IsNotNull(item.team.HomeStadium, "item.team.HomeStadium");
                    Assert.IsNotNull(item.team.Players, "item.team.Players");
                    Assert.AreEqual(10, item.team.TeamID, "item.team.TeamID");

                    Assert.AreEqual(1, item.team.HomeStadium.ID, "item.team.HomeStadium.ID");
                    Assert.AreEqual("Stadium 1", item.team.HomeStadium.Name, "item.team.HomeStadium.Name");

                    Assert.AreEqual(2, item.team.Players.Count, "item.team.Players.Count");

                    Assert.IsNotNull(item.team2, "item.team2");
                    Assert.AreEqual(item.team, item.team2, "item.team and item.team2");
                    Assert.AreEqual(item.team, item.team3, "item.team and item.team3");
                }
            }

            {
                Trace.WriteLine("Feed materialization.");
                string xml = FeedStart + AnyEntry("10", "<d:TeamID>10</d:TeamID>", LinkEntry("HomeStadium", stadium) + LinkFeed("Players", playersWithContinuation)) + "</feed>";
                var    q   = from t in context.CreateQuery <Team>("T")
                             select new
                {
                    players    = t.Players,
                    players2   = t.Players.Select(p => p),
                    players3   = t.Players.ToList(),
                    players4   = t.Players.Select(p => p).ToList(),
                    players5   = new DataServiceCollection <Player>(t.Players, TrackingMode.None),
                    players5_0 = new DataServiceCollection <Player>(t.Players),
                    players5_1 = new DataServiceCollection <Player>(t.Players, TrackingMode.AutoChangeTracking, "Players", (e) => false, (e2) => false),
                    players6   = new DataServiceCollection <Player>(t.Players.Select(p => p), TrackingMode.None),
                    players7   = new DataServiceCollection <Player>(t.Players.Select(p => p), TrackingMode.None),
                    players8   = t.Players.Select(p => p.ID),
                    players9   = t.Players.Select(p => p.ID).ToList(),
                    playersA   = new DataServiceCollection <int>(t.Players.Select(p => p.ID), TrackingMode.None),
                };
                var qor = CreateTestQueryOperationResponse(xml, q);
                foreach (var item in qor)
                {
                    Assert.IsNotNull(item, "item");

                    Assert.IsNotNull(item.players, "item.players");
                    Assert.IsNotNull(item.players2, "item.players2");
                    Assert.IsNotNull(item.players3, "item.players3");
                    Assert.IsNotNull(item.players4, "item.players4");
                    Assert.IsNotNull(item.players5, "item.players5");
                    Assert.IsNotNull(item.players5_0, "item.players5_0");
                    Assert.IsNotNull(item.players5_1, "item.players5_1");
                    Assert.IsNotNull(item.players6, "item.players6");
                    Assert.IsNotNull(item.players7, "item.players7");
                    Assert.IsNotNull(item.players8, "item.players8");
                    Assert.IsNotNull(item.players9, "item.players9");
                    Assert.IsNotNull(item.playersA, "item.playersA");

                    Player[] playerInstances = new Player[2];
                    foreach (var p in item.GetType().GetProperties())
                    {
                        var enumerable = p.GetValue(item, null) as System.Collections.IEnumerable;
                        if (enumerable == null)
                        {
                            continue;
                        }

                        Trace.WriteLine("Checking " + p.Name);

                        int count = 0;
                        foreach (object o in enumerable)
                        {
                            count++;
                            Player player = o as Player;
                            if (player != null)
                            {
                                if (playerInstances[count - 1] == null)
                                {
                                    playerInstances[count - 1] = player;
                                }
                                else
                                {
                                    Assert.AreSame(playerInstances[count - 1], player, "player from enumeration");
                                }

                                Assert.AreEqual(10 * count, player.ID, "player.ID");
                                Exception exception = TestUtil.RunCatching(() => { qor.GetContinuation(enumerable); });
                                TestUtil.AssertExceptionExpected(exception, false);
                                if (enumerable is DataServiceCollection <Player> )
                                {
                                    exception = TestUtil.RunCatching(() =>
                                    {
                                        var c = ((DataServiceCollection <Player>)enumerable).Continuation;
                                        Assert.IsNotNull(c, "All players collections should have continuation.");
                                    });
                                    TestUtil.AssertExceptionExpected(exception, false);
                                }
                            }
                            else
                            {
                                int id = (int)o;
                                Assert.AreEqual(playerInstances[count - 1].ID, id, "projected id");
                            }
                        }

                        Assert.AreEqual(2, count, "count of elements in " + p.Name);
                    }
                }
            }
        }