Skip to content

Commit

Permalink
RMLNQ-28 Add compatibility code for visiting AsQueryableResultOperato…
Browse files Browse the repository at this point in the history
…r only with IQueryModelVisitor implementations that support the new reuslt operator type.
  • Loading branch information
MichaelKetting committed Jan 21, 2018
1 parent c477aea commit e3744a4
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 0 deletions.
5 changes: 5 additions & 0 deletions Core/Clauses/ResultOperatorBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
using System;
using System.Linq.Expressions;
using System.Reflection;
using Remotion.Linq.Clauses.ResultOperators;
using Remotion.Linq.Clauses.StreamedData;
using Remotion.Linq.Utilities;
using Remotion.Utilities;
Expand Down Expand Up @@ -65,6 +66,10 @@ public void Accept (IQueryModelVisitor visitor, QueryModel queryModel, int index
ArgumentUtility.CheckNotNull ("visitor", visitor);
ArgumentUtility.CheckNotNull ("queryModel", queryModel);

// RMLNQ-117: This condition can be removed once the marker interface becomes obsolete. This will also invalidate the associated tests in ResultOperatorBaseTest.
if (this is AsQueryableResultOperator && !(visitor is AsQueryableResultOperator.ISupportedByIQueryModelVistor))
return;

visitor.VisitResultOperator (this, queryModel, index);
}

Expand Down
10 changes: 10 additions & 0 deletions Core/Clauses/ResultOperators/AsQueryableResultOperator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,16 @@ namespace Remotion.Linq.Clauses.ResultOperators
/// </example>
public sealed class AsQueryableResultOperator : SequenceTypePreservingResultOperatorBase
{
/// <summary>
/// A marker interface that must be implemented by the <see cref="IQueryModelVisitor "/> if the visitor supports the <see cref="AsQueryableResultOperator"/>.
/// </summary>
/// <remarks>
/// Note that the interface will become obsolete with v3.0.0. See also RMLNQ-117.
/// </remarks>
public interface ISupportedByIQueryModelVistor
{
}

/// <summary>
/// Initializes a new instance of the <see cref="AsQueryableResultOperator"/>.
/// </summary>
Expand Down
25 changes: 25 additions & 0 deletions UnitTests/Clauses/ResultOperatorBaseTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
using System.Linq;
using System.Linq.Expressions;
using NUnit.Framework;
using Remotion.Linq.Clauses.ResultOperators;
using Remotion.Linq.Clauses.StreamedData;
using Remotion.Linq.Development.UnitTesting;
using Remotion.Linq.UnitTests.Clauses.ResultOperators;
Expand Down Expand Up @@ -50,6 +51,30 @@ public void Accept ()
visitorMock.AssertWasCalled (mock => mock.VisitResultOperator (_resultOperator, queryModel, 1));
}

[Test]
public void Accept_AsQueryableResultOperatorSupportedByVisitor_RMLNQ_117 ()
{
var queryModel = ExpressionHelper.CreateQueryModel<Cook> ();
var visitorMock = MockRepository.GenerateMock<IQueryModelVisitor, AsQueryableResultOperator.ISupportedByIQueryModelVistor> ();
var resultOperator = new AsQueryableResultOperator ();

resultOperator.Accept (visitorMock, queryModel, 1);

visitorMock.AssertWasCalled (mock => mock.VisitResultOperator (resultOperator, queryModel, 1));
}

[Test]
public void Accept_AsQueryableResultOperatorNotSupportedByVisitor_RMLNQ_117 ()
{
var queryModel = ExpressionHelper.CreateQueryModel<Cook> ();
var visitorMock = MockRepository.GenerateMock<IQueryModelVisitor> ();
var resultOperator = new AsQueryableResultOperator ();

resultOperator.Accept (visitorMock, queryModel, 1);

visitorMock.AssertWasNotCalled (mock => mock.VisitResultOperator (resultOperator, queryModel, 1));
}

[Test]
public void InvokeExecuteMethod ()
{
Expand Down

0 comments on commit e3744a4

Please sign in to comment.