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); } } } }