public void Process_MemberAccessOnCapturedVariable_ReturnsNull()
    {
        // Arrange
        var differentModel = new DifferentModel {
            Name = "Test"
        };
        var expression = GetTestModelExpression(m => differentModel.Name);

        // Act
        var func = CachedExpressionCompiler.Process(expression);

        // Assert
        Assert.Null(func);
    }
    public void Process_ConstLookup_WithNullModel()
    {
        // Arrange
        var differentModel = new DifferentModel();
        var expression     = GetTestModelExpression(m => differentModel);

        // Act
        var func = CachedExpressionCompiler.Process(expression);

        // Assert
        Assert.NotNull(func);
        var result = func(null);

        Assert.Same(differentModel, result);
    }
    public void Process_CapturedVariable_WithNullModel()
    {
        // Arrange
        var differentModel = new DifferentModel();
        var model          = (TestModel)null;
        var expression     = GetTestModelExpression(m => differentModel);

        // Act
        var func = CachedExpressionCompiler.Process(expression);

        // Assert
        Assert.NotNull(func);
        var result = func(model);

        Assert.Same(differentModel, result);
    }
    public void Process_ConstLookup_UsingCachedValue()
    {
        // Arrange
        var model          = new TestModel();
        var differentModel = new DifferentModel();
        var expression1    = GetTestModelExpression(m => differentModel);
        var expression2    = GetTestModelExpression(m => differentModel);

        // Act - 1
        var func1 = CachedExpressionCompiler.Process(expression1);

        // Assert - 1
        var result1 = func1(null);

        Assert.Same(differentModel, result1);

        // Act - 2
        var func2 = CachedExpressionCompiler.Process(expression2);

        // Assert - 2
        var result2 = func1(null);

        Assert.Same(differentModel, result2);
    }
    public void Process_ConstLookup_WhenCapturedLocalChanges()
    {
        // Arrange
        var model          = new TestModel();
        var differentModel = new DifferentModel();
        var expression     = GetTestModelExpression(m => differentModel);

        // Act
        var func = CachedExpressionCompiler.Process(expression);

        // Assert - 1
        var result1 = func(null);

        Assert.Same(differentModel, result1);

        // Act - 2
        differentModel = new DifferentModel();

        // Assert - 2
        var result2 = func(null);

        Assert.NotSame(differentModel, result1);
        Assert.Same(differentModel, result2);
    }